Merge "Camera: Add support for stream combination query"
diff --git a/apex/Android.bp b/apex/Android.bp
index bb73ead..575603f 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -35,6 +35,6 @@
apex_key {
name: "com.android.media.key",
- public_key: "media.avbpubkey",
- private_key: "media.pem",
+ public_key: "com.android.media.avbpubkey",
+ private_key: "com.android.media.pem",
}
diff --git a/apex/media.avbpubkey b/apex/com.android.media.avbpubkey
similarity index 100%
rename from apex/media.avbpubkey
rename to apex/com.android.media.avbpubkey
Binary files differ
diff --git a/apex/media.pem b/apex/com.android.media.pem
similarity index 100%
rename from apex/media.pem
rename to apex/com.android.media.pem
diff --git a/camera/VendorTagDescriptor.cpp b/camera/VendorTagDescriptor.cpp
index 38ff37f..d713d2d 100644
--- a/camera/VendorTagDescriptor.cpp
+++ b/camera/VendorTagDescriptor.cpp
@@ -411,6 +411,11 @@
return res;
}
+const std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> &
+ VendorTagDescriptorCache::getVendorIdsAndTagDescriptors() {
+ return mVendorMap;
+}
+
int VendorTagDescriptorCache::getTagCount(metadata_vendor_id_t id) const {
int ret = 0;
auto desc = mVendorMap.find(id);
diff --git a/camera/include/camera/VendorTagDescriptor.h b/camera/include/camera/VendorTagDescriptor.h
index c718c93..6f55890 100644
--- a/camera/include/camera/VendorTagDescriptor.h
+++ b/camera/include/camera/VendorTagDescriptor.h
@@ -211,6 +211,9 @@
*/
void dump(int fd, int verbosity, int indentation) const;
+ const std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> &
+ getVendorIdsAndTagDescriptors();
+
protected:
std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> mVendorMap;
struct vendor_tag_cache_ops mVendorCacheOps;
diff --git a/camera/ndk/Android.bp b/camera/ndk/Android.bp
index e84eeef..60c9f85 100644
--- a/camera/ndk/Android.bp
+++ b/camera/ndk/Android.bp
@@ -70,3 +70,81 @@
],
version_script: "libcamera2ndk.map.txt",
}
+
+cc_library_shared {
+ name: "libcamera2ndk_vendor",
+ vendor_available: true,
+ srcs: [
+ "ndk_vendor/impl/ACameraDevice.cpp",
+ "ndk_vendor/impl/ACameraManager.cpp",
+ "ndk_vendor/impl/utils.cpp",
+ "impl/ACameraMetadata.cpp",
+ "impl/ACameraCaptureSession.cpp",
+ "NdkCameraMetadata.cpp",
+ "NdkCameraCaptureSession.cpp",
+ "NdkCameraManager.cpp",
+ "NdkCameraDevice.cpp",
+ "NdkCaptureRequest.cpp",
+ ],
+
+ export_include_dirs: ["include"],
+ export_shared_lib_headers: [
+ "libcutils",
+ ],
+ local_include_dirs: [
+ ".",
+ "include",
+ "impl",
+ ],
+ cflags: [
+ "-fvisibility=hidden",
+ "-DEXPORT=__attribute__((visibility(\"default\")))",
+ "-D__ANDROID_VNDK__",
+ ],
+
+ shared_libs: [
+ "libhwbinder",
+ "libfmq",
+ "libhidlbase",
+ "libhardware",
+ "libnativewindow",
+ "liblog",
+ "libutils",
+ "libstagefright_foundation",
+ "libcutils",
+ "libcamera_metadata",
+ "libmediandk",
+ "android.frameworks.cameraservice.device@2.0",
+ "android.frameworks.cameraservice.common@2.0",
+ "android.frameworks.cameraservice.service@2.0",
+ ],
+
+ static_libs: [
+ "android.hardware.camera.common@1.0-helper",
+ "libarect",
+ ],
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ },
+}
+
+cc_test {
+ name: "AImageReaderVendorTest",
+ vendor: true,
+ srcs: ["ndk_vendor/tests/AImageReaderVendorTest.cpp"],
+ shared_libs: [
+ "libhwbinder",
+ "libcamera2ndk_vendor",
+ "libmediandk",
+ "libnativewindow",
+ "libutils",
+ "libui",
+ "libcutils",
+ "liblog",
+ ],
+ cflags: [
+ "-D__ANDROID_VNDK__",
+ ],
+}
diff --git a/camera/ndk/NdkCameraDevice.cpp b/camera/ndk/NdkCameraDevice.cpp
index 812a312..ef05e0b 100644
--- a/camera/ndk/NdkCameraDevice.cpp
+++ b/camera/ndk/NdkCameraDevice.cpp
@@ -24,7 +24,15 @@
#include <camera/NdkCameraDevice.h>
#include "impl/ACameraCaptureSession.h"
-using namespace android;
+using namespace android::acam;
+
+bool areWindowTypesEqual(ACameraWindowType *a, ACameraWindowType *b) {
+#ifdef __ANDROID_VNDK__
+ return utils::isWindowNativeHandleEqual(a, b);
+#else
+ return a == b;
+#endif
+}
EXPORT
camera_status_t ACameraDevice_close(ACameraDevice* device) {
@@ -96,7 +104,7 @@
EXPORT
camera_status_t ACaptureSessionOutput_create(
- ANativeWindow* window, /*out*/ACaptureSessionOutput** out) {
+ ACameraWindowType* window, /*out*/ACaptureSessionOutput** out) {
ATRACE_CALL();
if (window == nullptr || out == nullptr) {
ALOGE("%s: Error: bad argument. window %p, out %p",
@@ -109,7 +117,7 @@
EXPORT
camera_status_t ACaptureSessionSharedOutput_create(
- ANativeWindow* window, /*out*/ACaptureSessionOutput** out) {
+ ACameraWindowType* window, /*out*/ACaptureSessionOutput** out) {
ATRACE_CALL();
if (window == nullptr || out == nullptr) {
ALOGE("%s: Error: bad argument. window %p, out %p",
@@ -122,7 +130,7 @@
EXPORT
camera_status_t ACaptureSessionSharedOutput_add(ACaptureSessionOutput *out,
- ANativeWindow* window) {
+ ACameraWindowType* window) {
ATRACE_CALL();
if ((window == nullptr) || (out == nullptr)) {
ALOGE("%s: Error: bad argument. window %p, out %p",
@@ -134,7 +142,7 @@
__FUNCTION__);
return ACAMERA_ERROR_INVALID_OPERATION;
}
- if (out->mWindow == window) {
+ if (areWindowTypesEqual(out->mWindow, window)) {
ALOGE("%s: Error trying to add the same window associated with the output configuration",
__FUNCTION__);
return ACAMERA_ERROR_INVALID_PARAMETER;
@@ -147,7 +155,7 @@
EXPORT
camera_status_t ACaptureSessionSharedOutput_remove(ACaptureSessionOutput *out,
- ANativeWindow* window) {
+ ACameraWindowType* window) {
ATRACE_CALL();
if ((window == nullptr) || (out == nullptr)) {
ALOGE("%s: Error: bad argument. window %p, out %p",
@@ -159,7 +167,7 @@
__FUNCTION__);
return ACAMERA_ERROR_INVALID_OPERATION;
}
- if (out->mWindow == window) {
+ if (areWindowTypesEqual(out->mWindow, window)) {
ALOGE("%s: Error trying to remove the same window associated with the output configuration",
__FUNCTION__);
return ACAMERA_ERROR_INVALID_PARAMETER;
diff --git a/camera/ndk/NdkCameraManager.cpp b/camera/ndk/NdkCameraManager.cpp
index f14a4c9..8742d9c 100644
--- a/camera/ndk/NdkCameraManager.cpp
+++ b/camera/ndk/NdkCameraManager.cpp
@@ -22,10 +22,15 @@
#include <utils/Trace.h>
#include <camera/NdkCameraManager.h>
+
+#ifdef __ANDROID_VNDK__
+#include "ndk_vendor/impl/ACameraManager.h"
+#else
#include "impl/ACameraManager.h"
+#endif
#include "impl/ACameraMetadata.h"
-using namespace android;
+using namespace android::acam;
EXPORT
ACameraManager* ACameraManager_create() {
diff --git a/camera/ndk/NdkCaptureRequest.cpp b/camera/ndk/NdkCaptureRequest.cpp
index ddb69d7..c64de3e 100644
--- a/camera/ndk/NdkCaptureRequest.cpp
+++ b/camera/ndk/NdkCaptureRequest.cpp
@@ -27,7 +27,7 @@
EXPORT
camera_status_t ACameraOutputTarget_create(
- ANativeWindow* window, ACameraOutputTarget** out) {
+ ACameraWindowType* window, ACameraOutputTarget** out) {
ATRACE_CALL();
if (window == nullptr) {
ALOGE("%s: Error: input window is null", __FUNCTION__);
diff --git a/camera/ndk/impl/ACameraCaptureSession.cpp b/camera/ndk/impl/ACameraCaptureSession.cpp
index f60e5fd..fb72bdb 100644
--- a/camera/ndk/impl/ACameraCaptureSession.cpp
+++ b/camera/ndk/impl/ACameraCaptureSession.cpp
@@ -23,7 +23,7 @@
ACameraCaptureSession::~ACameraCaptureSession() {
ALOGV("~ACameraCaptureSession: %p notify device end of life", this);
- sp<CameraDevice> dev = getDeviceSp();
+ sp<acam::CameraDevice> dev = getDeviceSp();
if (dev != nullptr && !dev->isClosed()) {
dev->lockDeviceForSessionOps();
{
@@ -48,7 +48,7 @@
mClosedByApp = true;
}
- sp<CameraDevice> dev = getDeviceSp();
+ sp<acam::CameraDevice> dev = getDeviceSp();
if (dev != nullptr) {
dev->lockDeviceForSessionOps();
}
@@ -73,7 +73,7 @@
camera_status_t
ACameraCaptureSession::stopRepeating() {
- sp<CameraDevice> dev = getDeviceSp();
+ sp<acam::CameraDevice> dev = getDeviceSp();
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -91,7 +91,7 @@
camera_status_t
ACameraCaptureSession::abortCaptures() {
- sp<CameraDevice> dev = getDeviceSp();
+ sp<acam::CameraDevice> dev = getDeviceSp();
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -112,7 +112,7 @@
/*optional*/ACameraCaptureSession_captureCallbacks* cbs,
int numRequests, ACaptureRequest** requests,
/*optional*/int* captureSequenceId) {
- sp<CameraDevice> dev = getDeviceSp();
+ sp<acam::CameraDevice> dev = getDeviceSp();
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -133,7 +133,7 @@
/*optional*/ACameraCaptureSession_captureCallbacks* cbs,
int numRequests, ACaptureRequest** requests,
/*optional*/int* captureSequenceId) {
- sp<CameraDevice> dev = getDeviceSp();
+ sp<acam::CameraDevice> dev = getDeviceSp();
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -149,7 +149,7 @@
}
camera_status_t ACameraCaptureSession::updateOutputConfiguration(ACaptureSessionOutput *output) {
- sp<CameraDevice> dev = getDeviceSp();
+ sp<acam::CameraDevice> dev = getDeviceSp();
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -168,7 +168,7 @@
ACameraDevice*
ACameraCaptureSession::getDevice() {
Mutex::Autolock _l(mSessionLock);
- sp<CameraDevice> dev = getDeviceSp();
+ sp<acam::CameraDevice> dev = getDeviceSp();
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return nullptr;
@@ -182,9 +182,9 @@
mIsClosed = true;
}
-sp<CameraDevice>
+sp<acam::CameraDevice>
ACameraCaptureSession::getDeviceSp() {
- sp<CameraDevice> device = mDevice.promote();
+ sp<acam::CameraDevice> device = mDevice.promote();
if (device == nullptr || device->isClosed()) {
ALOGW("Device is closed but session %d is not notified", mId);
return nullptr;
diff --git a/camera/ndk/impl/ACameraCaptureSession.h b/camera/ndk/impl/ACameraCaptureSession.h
index a2068e7..133c2c8 100644
--- a/camera/ndk/impl/ACameraCaptureSession.h
+++ b/camera/ndk/impl/ACameraCaptureSession.h
@@ -19,12 +19,17 @@
#include <set>
#include <hardware/camera3.h>
#include <camera/NdkCameraDevice.h>
+
+#ifdef __ANDROID_VNDK__
+#include "ndk_vendor/impl/ACameraDevice.h"
+#include "ndk_vendor/impl/ACameraCaptureSessionVendor.h"
+#else
#include "ACameraDevice.h"
using namespace android;
struct ACaptureSessionOutput {
- explicit ACaptureSessionOutput(ANativeWindow* window, bool isShared = false) :
+ explicit ACaptureSessionOutput(ACameraWindowType* window, bool isShared = false) :
mWindow(window), mIsShared(isShared) {};
bool operator == (const ACaptureSessionOutput& other) const {
@@ -40,11 +45,12 @@
return mWindow > other.mWindow;
}
- ANativeWindow* mWindow;
- std::set<ANativeWindow *> mSharedWindows;
+ ACameraWindowType* mWindow;
+ std::set<ACameraWindowType *> mSharedWindows;
bool mIsShared;
int mRotation = CAMERA3_STREAM_ROTATION_0;
};
+#endif
struct ACaptureSessionOutputContainer {
std::set<ACaptureSessionOutput> mOutputs;
@@ -60,7 +66,7 @@
int id,
const ACaptureSessionOutputContainer* outputs,
const ACameraCaptureSession_stateCallbacks* cb,
- CameraDevice* device) :
+ android::acam::CameraDevice* device) :
mId(id), mOutput(*outputs), mUserSessionCallback(*cb),
mDevice(device) {}
@@ -97,18 +103,18 @@
ACameraDevice* getDevice();
private:
- friend class CameraDevice;
+ friend class android::acam::CameraDevice;
// Close session because app close camera device, camera device got ERROR_DISCONNECTED,
// or a new session is replacing this session.
void closeByDevice();
- sp<CameraDevice> getDeviceSp();
+ sp<android::acam::CameraDevice> getDeviceSp();
const int mId;
const ACaptureSessionOutputContainer mOutput;
const ACameraCaptureSession_stateCallbacks mUserSessionCallback;
- const wp<CameraDevice> mDevice;
+ const wp<android::acam::CameraDevice> mDevice;
bool mIsClosed = false;
bool mClosedByApp = false;
Mutex mSessionLock;
diff --git a/camera/ndk/impl/ACameraDevice.cpp b/camera/ndk/impl/ACameraDevice.cpp
index ac3be25..00da54e 100644
--- a/camera/ndk/impl/ACameraDevice.cpp
+++ b/camera/ndk/impl/ACameraDevice.cpp
@@ -27,9 +27,9 @@
#include "ACaptureRequest.h"
#include "ACameraCaptureSession.h"
-using namespace android;
-
namespace android {
+namespace acam {
+
// Static member definitions
const char* CameraDevice::kContextKey = "Context";
const char* CameraDevice::kDeviceKey = "Device";
@@ -1513,5 +1513,5 @@
return ret;
}
-
+} // namespace acam
} // namespace android
diff --git a/camera/ndk/impl/ACameraDevice.h b/camera/ndk/impl/ACameraDevice.h
index 7d64081..8f56d3f 100644
--- a/camera/ndk/impl/ACameraDevice.h
+++ b/camera/ndk/impl/ACameraDevice.h
@@ -41,6 +41,7 @@
#include "ACameraMetadata.h"
namespace android {
+namespace acam {
// Wrap ACameraCaptureFailure so it can be ref-counted
struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {};
@@ -286,6 +287,7 @@
};
+} // namespace acam;
} // namespace android;
/**
@@ -295,7 +297,7 @@
struct ACameraDevice {
ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
sp<ACameraMetadata> chars) :
- mDevice(new CameraDevice(id, cb, chars, this)) {}
+ mDevice(new android::acam::CameraDevice(id, cb, chars, this)) {}
~ACameraDevice() {};
@@ -331,7 +333,7 @@
}
private:
- android::sp<android::CameraDevice> mDevice;
+ android::sp<android::acam::CameraDevice> mDevice;
};
#endif // _ACAMERA_DEVICE_H
diff --git a/camera/ndk/impl/ACameraManager.cpp b/camera/ndk/impl/ACameraManager.cpp
index ee67677..7d6ecac 100644
--- a/camera/ndk/impl/ACameraManager.cpp
+++ b/camera/ndk/impl/ACameraManager.cpp
@@ -26,9 +26,10 @@
#include <stdlib.h>
#include <camera/VendorTagDescriptor.h>
-using namespace android;
+using namespace android::acam;
namespace android {
+namespace acam {
// Static member definitions
const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
@@ -345,6 +346,7 @@
}
}
+} // namespace acam
} // namespace android
/**
diff --git a/camera/ndk/impl/ACameraManager.h b/camera/ndk/impl/ACameraManager.h
index ce65769..55bfa7e 100644
--- a/camera/ndk/impl/ACameraManager.h
+++ b/camera/ndk/impl/ACameraManager.h
@@ -35,6 +35,7 @@
#include <map>
namespace android {
+namespace acam {
/**
* Per-process singleton instance of CameraManger. Shared by all ACameraManager
@@ -172,6 +173,7 @@
~CameraManagerGlobal();
};
+} // namespace acam;
} // namespace android;
/**
@@ -180,7 +182,7 @@
*/
struct ACameraManager {
ACameraManager() :
- mGlobalManager(&(android::CameraManagerGlobal::getInstance())) {}
+ mGlobalManager(&(android::acam::CameraManagerGlobal::getInstance())) {}
~ACameraManager();
camera_status_t getCameraIdList(ACameraIdList** cameraIdList);
static void deleteCameraIdList(ACameraIdList* cameraIdList);
@@ -196,7 +198,7 @@
kCameraIdListNotInit = -1
};
android::Mutex mLock;
- android::sp<android::CameraManagerGlobal> mGlobalManager;
+ android::sp<android::acam::CameraManagerGlobal> mGlobalManager;
};
#endif //_ACAMERA_MANAGER_H
diff --git a/camera/ndk/impl/ACameraMetadata.h b/camera/ndk/impl/ACameraMetadata.h
index e76b80c..f21dbaf 100644
--- a/camera/ndk/impl/ACameraMetadata.h
+++ b/camera/ndk/impl/ACameraMetadata.h
@@ -22,7 +22,13 @@
#include <utils/Mutex.h>
#include <utils/RefBase.h>
#include <utils/Vector.h>
+
+#ifdef __ANDROID_VNDK__
+#include <CameraMetadata.h>
+using CameraMetadata = android::hardware::camera::common::V1_0::helper::CameraMetadata;
+#else
#include <camera/CameraMetadata.h>
+#endif
#include <camera/NdkCameraMetadata.h>
diff --git a/camera/ndk/impl/ACaptureRequest.h b/camera/ndk/impl/ACaptureRequest.h
index b11dafb..5c82ab7 100644
--- a/camera/ndk/impl/ACaptureRequest.h
+++ b/camera/ndk/impl/ACaptureRequest.h
@@ -21,8 +21,11 @@
using namespace android;
+#ifdef __ANDROID_VNDK__
+#include "ndk_vendor/impl/ACaptureRequestVendor.h"
+#else
struct ACameraOutputTarget {
- explicit ACameraOutputTarget(ANativeWindow* window) : mWindow(window) {};
+ explicit ACameraOutputTarget(ACameraWindowType* window) : mWindow(window) {};
bool operator == (const ACameraOutputTarget& other) const {
return mWindow == other.mWindow;
@@ -37,8 +40,9 @@
return mWindow > other.mWindow;
}
- ANativeWindow* mWindow;
+ ACameraWindowType* mWindow;
};
+#endif
struct ACameraOutputTargets {
std::set<ACameraOutputTarget> mOutputs;
diff --git a/camera/ndk/include/camera/NdkCameraCaptureSession.h b/camera/ndk/include/camera/NdkCameraCaptureSession.h
index 5e0db60..1244582 100644
--- a/camera/ndk/include/camera/NdkCameraCaptureSession.h
+++ b/camera/ndk/include/camera/NdkCameraCaptureSession.h
@@ -35,10 +35,10 @@
#include <sys/cdefs.h>
#include <stdbool.h>
-#include <android/native_window.h>
#include "NdkCameraError.h"
#include "NdkCameraMetadata.h"
#include "NdkCaptureRequest.h"
+#include "NdkCameraWindowType.h"
#ifndef _NDK_CAMERA_CAPTURE_SESSION_H
#define _NDK_CAMERA_CAPTURE_SESSION_H
@@ -246,7 +246,7 @@
*/
typedef void (*ACameraCaptureSession_captureCallback_bufferLost)(
void* context, ACameraCaptureSession* session,
- ACaptureRequest* request, ANativeWindow* window, int64_t frameNumber);
+ ACaptureRequest* request, ACameraWindowType* window, int64_t frameNumber);
typedef struct ACameraCaptureSession_captureCallbacks {
/// optional application context.
diff --git a/camera/ndk/include/camera/NdkCameraDevice.h b/camera/ndk/include/camera/NdkCameraDevice.h
index 7c13b34..4fe43d5 100644
--- a/camera/ndk/include/camera/NdkCameraDevice.h
+++ b/camera/ndk/include/camera/NdkCameraDevice.h
@@ -34,10 +34,10 @@
*/
#include <sys/cdefs.h>
-#include <android/native_window.h>
#include "NdkCameraError.h"
#include "NdkCaptureRequest.h"
#include "NdkCameraCaptureSession.h"
+#include "NdkCameraWindowType.h"
#ifndef _NDK_CAMERA_DEVICE_H
#define _NDK_CAMERA_DEVICE_H
@@ -345,7 +345,7 @@
* @see ACaptureSessionOutputContainer_add
*/
camera_status_t ACaptureSessionOutput_create(
- ANativeWindow* anw, /*out*/ACaptureSessionOutput** output) __INTRODUCED_IN(24);
+ ACameraWindowType* anw, /*out*/ACaptureSessionOutput** output) __INTRODUCED_IN(24);
/**
* Free a ACaptureSessionOutput object.
@@ -694,7 +694,7 @@
* @see ACaptureSessionOutputContainer_add
*/
camera_status_t ACaptureSessionSharedOutput_create(
- ANativeWindow* anw, /*out*/ACaptureSessionOutput** output) __INTRODUCED_IN(28);
+ ACameraWindowType* anw, /*out*/ACaptureSessionOutput** output) __INTRODUCED_IN(28);
/**
* Add a native window to shared ACaptureSessionOutput.
@@ -712,7 +712,7 @@
* ACaptureSessionOutput.</li></ul>
*/
camera_status_t ACaptureSessionSharedOutput_add(ACaptureSessionOutput *output,
- ANativeWindow *anw) __INTRODUCED_IN(28);
+ ACameraWindowType *anw) __INTRODUCED_IN(28);
/**
* Remove a native window from shared ACaptureSessionOutput.
@@ -728,7 +728,7 @@
* ACaptureSessionOutput.</li></ul>
*/
camera_status_t ACaptureSessionSharedOutput_remove(ACaptureSessionOutput *output,
- ANativeWindow* anw) __INTRODUCED_IN(28);
+ ACameraWindowType* anw) __INTRODUCED_IN(28);
/**
* Create a new camera capture session similar to {@link ACameraDevice_createCaptureSession}. This
diff --git a/camera/ndk/include/camera/NdkCameraWindowType.h b/camera/ndk/include/camera/NdkCameraWindowType.h
new file mode 100644
index 0000000..99f67e9
--- /dev/null
+++ b/camera/ndk/include/camera/NdkCameraWindowType.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _NDK_CAMERA_WINDOW_TYPE_H
+#define _NDK_CAMERA_WINDOW_TYPE_H
+
+/**
+ * @addtogroup Camera
+ * @{
+ */
+
+/**
+ * @file NdkCameraWindowType.h
+ */
+
+/*
+ * This file defines an NDK API.
+ * Do not remove methods.
+ * Do not change method signatures.
+ * Do not change the value of constants.
+ * Do not change the size of any of the classes defined in here.
+ * Do not reference types that are not part of the NDK.
+ * Do not #include files that aren't part of the NDK.
+ */
+
+/**
+ * This file defines the window type used by NDK and the VNDK variants of the
+ * camera2 NDK. This enables us to share the api definition headers and avoid
+ * code duplication (since the VNDK variant doesn't use ANativeWindow unlike the
+ * NDK variant).
+ */
+#ifdef __ANDROID_VNDK__
+#include <cutils/native_handle.h>
+typedef native_handle_t ACameraWindowType;
+#else
+#include <android/native_window.h>
+typedef ANativeWindow ACameraWindowType;
+#endif
+
+#endif //_NDK_CAMERA_WINDOW_TYPE_H
diff --git a/camera/ndk/include/camera/NdkCaptureRequest.h b/camera/ndk/include/camera/NdkCaptureRequest.h
index 5340e76..136989a 100644
--- a/camera/ndk/include/camera/NdkCaptureRequest.h
+++ b/camera/ndk/include/camera/NdkCaptureRequest.h
@@ -35,9 +35,9 @@
#include <sys/cdefs.h>
-#include <android/native_window.h>
#include "NdkCameraError.h"
#include "NdkCameraMetadata.h"
+#include "NdkCameraWindowType.h"
#ifndef _NDK_CAPTURE_REQUEST_H
#define _NDK_CAPTURE_REQUEST_H
@@ -101,7 +101,7 @@
*
* @see ACaptureRequest_addTarget
*/
-camera_status_t ACameraOutputTarget_create(ANativeWindow* window,
+camera_status_t ACameraOutputTarget_create(ACameraWindowType* window,
ACameraOutputTarget** output) __INTRODUCED_IN(24);
/**
diff --git a/camera/ndk/ndk_vendor/impl/ACameraCaptureSessionVendor.h b/camera/ndk/ndk_vendor/impl/ACameraCaptureSessionVendor.h
new file mode 100644
index 0000000..8d9e90c
--- /dev/null
+++ b/camera/ndk/ndk_vendor/impl/ACameraCaptureSessionVendor.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "utils.h"
+
+struct ACaptureSessionOutput {
+ explicit ACaptureSessionOutput(native_handle_t* window, bool isShared = false) :
+ mWindow(window), mIsShared(isShared) {};
+
+ bool operator == (const ACaptureSessionOutput& other) const {
+ return (mWindow == other.mWindow);
+ }
+
+ bool operator != (const ACaptureSessionOutput& other) const {
+ return mWindow != other.mWindow;
+ }
+
+ bool operator < (const ACaptureSessionOutput& other) const {
+ return mWindow < other.mWindow;
+ }
+
+ bool operator > (const ACaptureSessionOutput& other) const {
+ return mWindow > other.mWindow;
+ }
+
+ android::acam::utils::native_handle_ptr_wrapper mWindow;
+ std::set<android::acam::utils::native_handle_ptr_wrapper> mSharedWindows;
+ bool mIsShared;
+ int mRotation = CAMERA3_STREAM_ROTATION_0;
+};
+
+
diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp
new file mode 100644
index 0000000..b86f854
--- /dev/null
+++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp
@@ -0,0 +1,1594 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "ACameraDeviceVendor"
+
+#include <vector>
+#include <inttypes.h>
+#include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
+#include <android/frameworks/cameraservice/device/2.0/types.h>
+#include <CameraMetadata.h>
+
+#include "ndk_vendor/impl/ACameraDevice.h"
+#include "ACameraCaptureSession.h"
+#include "ACameraMetadata.h"
+#include "ACaptureRequest.h"
+#include "utils.h"
+
+using namespace android;
+
+namespace android {
+namespace acam {
+
+using HCameraMetadata = frameworks::cameraservice::device::V2_0::CameraMetadata;
+using OutputConfiguration = frameworks::cameraservice::device::V2_0::OutputConfiguration;
+using hardware::Void;
+
+// Static member definitions
+const char* CameraDevice::kContextKey = "Context";
+const char* CameraDevice::kDeviceKey = "Device";
+const char* CameraDevice::kErrorCodeKey = "ErrorCode";
+const char* CameraDevice::kCallbackFpKey = "Callback";
+const char* CameraDevice::kSessionSpKey = "SessionSp";
+const char* CameraDevice::kCaptureRequestKey = "CaptureRequest";
+const char* CameraDevice::kTimeStampKey = "TimeStamp";
+const char* CameraDevice::kCaptureResultKey = "CaptureResult";
+const char* CameraDevice::kCaptureFailureKey = "CaptureFailure";
+const char* CameraDevice::kSequenceIdKey = "SequenceId";
+const char* CameraDevice::kFrameNumberKey = "FrameNumber";
+const char* CameraDevice::kAnwKey = "Anw";
+
+/**
+ * CameraDevice Implementation
+ */
+CameraDevice::CameraDevice(
+ const char* id,
+ ACameraDevice_StateCallbacks* cb,
+ sp<ACameraMetadata> chars,
+ ACameraDevice* wrapper) :
+ mCameraId(id),
+ mAppCallbacks(*cb),
+ mChars(std::move(chars)),
+ mServiceCallback(new ServiceCallback(this)),
+ mWrapper(wrapper),
+ mInError(false),
+ mError(ACAMERA_OK),
+ mIdle(true),
+ mCurrentSession(nullptr) {
+ mClosing = false;
+ // Setup looper thread to perfrom device callbacks to app
+ mCbLooper = new ALooper;
+ mCbLooper->setName("C2N-dev-looper");
+ status_t err = mCbLooper->start(
+ /*runOnCallingThread*/false,
+ /*canCallJava*/ true,
+ PRIORITY_DEFAULT);
+ if (err != OK) {
+ ALOGE("%s: Unable to start camera device callback looper: %s (%d)",
+ __FUNCTION__, strerror(-err), err);
+ setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
+ }
+ mHandler = new CallbackHandler();
+ mCbLooper->registerHandler(mHandler);
+
+ const CameraMetadata& metadata = mChars->getInternalData();
+ camera_metadata_ro_entry entry = metadata.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT);
+ if (entry.count != 1) {
+ ALOGW("%s: bad count %zu for partial result count", __FUNCTION__, entry.count);
+ mPartialResultCount = 1;
+ } else {
+ mPartialResultCount = entry.data.i32[0];
+ }
+
+ entry = metadata.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE);
+ if (entry.count != 2) {
+ ALOGW("%s: bad count %zu for shading map size", __FUNCTION__, entry.count);
+ mShadingMapSize[0] = 0;
+ mShadingMapSize[1] = 0;
+ } else {
+ mShadingMapSize[0] = entry.data.i32[0];
+ mShadingMapSize[1] = entry.data.i32[1];
+ }
+}
+
+// Device close implementaiton
+CameraDevice::~CameraDevice() {
+ sp<ACameraCaptureSession> session = mCurrentSession.promote();
+ {
+ Mutex::Autolock _l(mDeviceLock);
+ if (!isClosed()) {
+ disconnectLocked(session);
+ }
+ mCurrentSession = nullptr;
+ if (mCbLooper != nullptr) {
+ mCbLooper->unregisterHandler(mHandler->id());
+ mCbLooper->stop();
+ }
+ }
+ mCbLooper.clear();
+ mHandler.clear();
+}
+
+void
+CameraDevice::postSessionMsgAndCleanup(sp<AMessage>& msg) {
+ msg->post();
+ msg.clear();
+ sp<AMessage> cleanupMsg = new AMessage(kWhatCleanUpSessions, mHandler);
+ cleanupMsg->post();
+}
+
+// TODO: cached created request?
+camera_status_t
+CameraDevice::createCaptureRequest(
+ ACameraDevice_request_template templateId,
+ ACaptureRequest** request) const {
+ Mutex::Autolock _l(mDeviceLock);
+ camera_status_t ret = checkCameraClosedOrErrorLocked();
+ if (ret != ACAMERA_OK) {
+ return ret;
+ }
+ if (mRemote == nullptr) {
+ return ACAMERA_ERROR_CAMERA_DISCONNECTED;
+ }
+ CameraMetadata rawRequest;
+ Status status = Status::NO_ERROR;
+ auto remoteRet = mRemote->createDefaultRequest(
+ utils::convertToHidl(templateId),
+ [&status, &rawRequest](auto s, const hidl_vec<uint8_t> &metadata) {
+ status = s;
+ if (status == Status::NO_ERROR && utils::convertFromHidlCloned(metadata, &rawRequest)) {
+ } else {
+ ALOGE("%s: Couldn't create default request", __FUNCTION__);
+ }
+ });
+ if (!remoteRet.isOk()) {
+ ALOGE("%s: Transaction error while trying to create default request %s", __FUNCTION__,
+ remoteRet.description().c_str());
+ return ACAMERA_ERROR_UNKNOWN;
+ }
+ if (status != Status::NO_ERROR) {
+ return utils::convertFromHidl(status);
+ }
+ ACaptureRequest* outReq = new ACaptureRequest();
+ outReq->settings = new ACameraMetadata(rawRequest.release(), ACameraMetadata::ACM_REQUEST);
+ outReq->targets = new ACameraOutputTargets();
+ *request = outReq;
+ return ACAMERA_OK;
+}
+
+camera_status_t
+CameraDevice::createCaptureSession(
+ const ACaptureSessionOutputContainer* outputs,
+ const ACaptureRequest* sessionParameters,
+ const ACameraCaptureSession_stateCallbacks* callbacks,
+ /*out*/ACameraCaptureSession** session) {
+ sp<ACameraCaptureSession> currentSession = mCurrentSession.promote();
+ Mutex::Autolock _l(mDeviceLock);
+ camera_status_t ret = checkCameraClosedOrErrorLocked();
+ if (ret != ACAMERA_OK) {
+ return ret;
+ }
+
+ if (currentSession != nullptr) {
+ currentSession->closeByDevice();
+ stopRepeatingLocked();
+ }
+
+ // Create new session
+ ret = configureStreamsLocked(outputs, sessionParameters);
+ if (ret != ACAMERA_OK) {
+ ALOGE("Fail to create new session. cannot configure streams");
+ return ret;
+ }
+
+ ACameraCaptureSession* newSession = new ACameraCaptureSession(
+ mNextSessionId++, outputs, callbacks, this);
+
+ // set new session as current session
+ newSession->incStrong((void *) ACameraDevice_createCaptureSession);
+ mCurrentSession = newSession;
+ mFlushing = false;
+ *session = newSession;
+ return ACAMERA_OK;
+}
+
+camera_status_t
+CameraDevice::captureLocked(
+ sp<ACameraCaptureSession> session,
+ /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
+ int numRequests, ACaptureRequest** requests,
+ /*optional*/int* captureSequenceId) {
+ return submitRequestsLocked(
+ session, cbs, numRequests, requests, captureSequenceId, /*isRepeating*/false);
+}
+
+camera_status_t
+CameraDevice::setRepeatingRequestsLocked(
+ sp<ACameraCaptureSession> session,
+ /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
+ int numRequests, ACaptureRequest** requests,
+ /*optional*/int* captureSequenceId) {
+ return submitRequestsLocked(
+ session, cbs, numRequests, requests, captureSequenceId, /*isRepeating*/true);
+}
+
+void addRequestSettingsMetadata(ACaptureRequest *aCaptureRequest,
+ sp<CaptureRequest> &req) {
+ CameraMetadata metadataCopy = aCaptureRequest->settings->getInternalData();
+ const camera_metadata_t *camera_metadata = metadataCopy.getAndLock();
+ HCameraMetadata hCameraMetadata;
+ utils::convertToHidl(camera_metadata, &hCameraMetadata);
+ metadataCopy.unlock(camera_metadata);
+ req->mPhysicalCameraSettings.resize(1);
+ req->mPhysicalCameraSettings[0].settings.metadata(std::move(hCameraMetadata));
+}
+
+camera_status_t
+CameraDevice::submitRequestsLocked(
+ sp<ACameraCaptureSession> session,
+ /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
+ int numRequests, ACaptureRequest** requests,
+ /*optional*/int* captureSequenceId,
+ bool isRepeating) {
+ camera_status_t ret = checkCameraClosedOrErrorLocked();
+ if (ret != ACAMERA_OK) {
+ ALOGE("Camera %s submit capture request failed! ret %d", getId(), ret);
+ return ret;
+ }
+
+ // Form two vectors of capture request, one for internal tracking
+ std::vector<frameworks::cameraservice::device::V2_0::CaptureRequest> requestList;
+ Vector<sp<CaptureRequest>> requestsV;
+ requestsV.setCapacity(numRequests);
+ for (int i = 0; i < numRequests; i++) {
+ sp<CaptureRequest> req;
+ ret = allocateCaptureRequest(requests[i], req);
+ // We need to call this method since after submitRequestList is called,
+ // the request metadata queue might have removed the capture request
+ // metadata. Therefore we simply add the metadata to its wrapper class,
+ // so that it can be retrived later.
+ addRequestSettingsMetadata(requests[i], req);
+ if (ret != ACAMERA_OK) {
+ ALOGE("Convert capture request to internal format failure! ret %d", ret);
+ return ret;
+ }
+ if (req->mCaptureRequest.streamAndWindowIds.size() == 0) {
+ ALOGE("Capture request without output target cannot be submitted!");
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+ requestList.push_back(utils::convertToHidl(req.get()));
+ requestsV.push_back(req);
+ }
+ if (isRepeating) {
+ ret = stopRepeatingLocked();
+ if (ret != ACAMERA_OK) {
+ ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret);
+ return ret;
+ }
+ }
+
+ SubmitInfo info;
+ Status status;
+ auto remoteRet = mRemote->submitRequestList(requestList, isRepeating,
+ [&status, &info](auto s, auto &submitInfo) {
+ status = s;
+ info = submitInfo;
+ });
+ if (!remoteRet.isOk()) {
+ ALOGE("%s: Transaction error for submitRequestList call: %s", __FUNCTION__,
+ remoteRet.description().c_str());
+ }
+ if (status != Status::NO_ERROR) {
+ return utils::convertFromHidl(status);
+ }
+ int32_t sequenceId = info.requestId;
+ int64_t lastFrameNumber = info.lastFrameNumber;
+ if (sequenceId < 0) {
+ ALOGE("Camera %s submit request remote failure: ret %d", getId(), sequenceId);
+ return ACAMERA_ERROR_UNKNOWN;
+ }
+
+ CallbackHolder cbHolder(session, requestsV, isRepeating, cbs);
+ mSequenceCallbackMap.insert(std::make_pair(sequenceId, cbHolder));
+
+ if (isRepeating) {
+ // stopRepeating above should have cleanup repeating sequence id
+ if (mRepeatingSequenceId != REQUEST_ID_NONE) {
+ setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
+ return ACAMERA_ERROR_CAMERA_DEVICE;
+ }
+ mRepeatingSequenceId = sequenceId;
+ } else {
+ mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber));
+ }
+
+ if (mIdle) {
+ sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
+ msg->setPointer(kContextKey, session->mUserSessionCallback.context);
+ msg->setObject(kSessionSpKey, session);
+ msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive);
+ postSessionMsgAndCleanup(msg);
+ }
+ mIdle = false;
+ mBusySession = session;
+
+ if (captureSequenceId) {
+ *captureSequenceId = sequenceId;
+ }
+ return ACAMERA_OK;
+}
+
+camera_status_t CameraDevice::updateOutputConfigurationLocked(ACaptureSessionOutput *output) {
+ camera_status_t ret = checkCameraClosedOrErrorLocked();
+ if (ret != ACAMERA_OK) {
+ return ret;
+ }
+
+ if (output == nullptr) {
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+
+ if (!output->mIsShared) {
+ ALOGE("Error output configuration is not shared");
+ return ACAMERA_ERROR_INVALID_OPERATION;
+ }
+
+ int32_t streamId = -1;
+ for (auto& kvPair : mConfiguredOutputs) {
+ if (utils::isWindowNativeHandleEqual(kvPair.second.first, output->mWindow)) {
+ streamId = kvPair.first;
+ break;
+ }
+ }
+ if (streamId < 0) {
+ ALOGE("Error: Invalid output configuration");
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+
+ OutputConfigurationWrapper outConfigW;
+ OutputConfiguration &outConfig = outConfigW.mOutputConfiguration;
+ outConfig.rotation = utils::convertToHidl(output->mRotation);
+ outConfig.windowGroupId = -1; // ndk doesn't support inter OutputConfiguration buffer sharing.
+ outConfig.windowHandles.resize(output->mSharedWindows.size() + 1);
+ outConfig.windowHandles[0] = output->mWindow;
+ int i = 1;
+ for (auto& anw : output->mSharedWindows) {
+ outConfig.windowHandles[i++] = anw;
+ }
+
+ auto remoteRet = mRemote->updateOutputConfiguration(streamId, outConfig);
+ if (!remoteRet.isOk()) {
+ ALOGE("%s: Transaction error in updating OutputConfiguration: %s", __FUNCTION__,
+ remoteRet.description().c_str());
+ return ACAMERA_ERROR_UNKNOWN;
+ }
+
+ switch (remoteRet) {
+ case Status::NO_ERROR:
+ break;
+ case Status::INVALID_OPERATION:
+ ALOGE("Camera device %s invalid operation", getId());
+ return ACAMERA_ERROR_INVALID_OPERATION;
+ case Status::ALREADY_EXISTS:
+ ALOGE("Camera device %s output surface already exists", getId());
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ case Status::ILLEGAL_ARGUMENT:
+ ALOGE("Camera device %s invalid input argument", getId());
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ default:
+ ALOGE("Camera device %s failed to add shared output", getId());
+ return ACAMERA_ERROR_UNKNOWN;
+ }
+
+ mConfiguredOutputs[streamId] = std::make_pair(output->mWindow, outConfigW);
+
+ return ACAMERA_OK;
+}
+
+camera_status_t
+CameraDevice::allocateCaptureRequest(
+ const ACaptureRequest* request, /*out*/sp<CaptureRequest> &outReq) {
+ sp<CaptureRequest> req(new CaptureRequest());
+ req->mCaptureRequest.physicalCameraSettings.resize(1);
+ req->mCaptureRequest.physicalCameraSettings[0].id = mCameraId;
+ // TODO: Do we really need to copy the metadata here ?
+ CameraMetadata metadataCopy = request->settings->getInternalData();
+ const camera_metadata_t *cameraMetadata = metadataCopy.getAndLock();
+ HCameraMetadata hCameraMetadata;
+ utils::convertToHidl(cameraMetadata, &hCameraMetadata);
+ metadataCopy.unlock(cameraMetadata);
+ if (request->settings != nullptr) {
+ if (hCameraMetadata.data() != nullptr &&
+ mCaptureRequestMetadataQueue != nullptr &&
+ mCaptureRequestMetadataQueue->write(
+ reinterpret_cast<const uint8_t *>(hCameraMetadata.data()),
+ hCameraMetadata.size())) {
+ // The metadata field of the union would've been destructued, so no need
+ // to re-size it.
+ req->mCaptureRequest.physicalCameraSettings[0].settings.fmqMetadataSize(
+ hCameraMetadata.size());
+ } else {
+ ALOGE("Fmq write capture result failed, falling back to hwbinder");
+ req->mCaptureRequest.physicalCameraSettings[0].settings.metadata(
+ std::move(hCameraMetadata));
+ }
+ }
+
+ std::vector<int32_t> requestStreamIdxList;
+ std::vector<int32_t> requestSurfaceIdxList;
+ for (auto outputTarget : request->targets->mOutputs) {
+ native_handle_t* anw = outputTarget.mWindow;
+ bool found = false;
+ req->mSurfaceList.push_back(anw);
+ // lookup stream/surface ID
+ for (const auto& kvPair : mConfiguredOutputs) {
+ int streamId = kvPair.first;
+ const OutputConfigurationWrapper& outConfig = kvPair.second.second;
+ const auto& windowHandles = outConfig.mOutputConfiguration.windowHandles;
+ for (int surfaceId = 0; surfaceId < (int) windowHandles.size(); surfaceId++) {
+ // If two native handles are equivalent, so are their surfaces.
+ if (utils::isWindowNativeHandleEqual(windowHandles[surfaceId].getNativeHandle(),
+ anw)) {
+ found = true;
+ requestStreamIdxList.push_back(streamId);
+ requestSurfaceIdxList.push_back(surfaceId);
+ break;
+ }
+ }
+ if (found) {
+ break;
+ }
+ }
+ if (!found) {
+ ALOGE("Unconfigured output target %p in capture request!", anw);
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+ }
+ req->mCaptureRequest.streamAndWindowIds.resize(requestStreamIdxList.size());
+ for (int i = 0; i < requestStreamIdxList.size(); i++) {
+ req->mCaptureRequest.streamAndWindowIds[i].streamId = requestStreamIdxList[i];
+ req->mCaptureRequest.streamAndWindowIds[i].windowId = requestSurfaceIdxList[i];
+ }
+ outReq = req;
+ return ACAMERA_OK;
+}
+
+ACaptureRequest*
+CameraDevice::allocateACaptureRequest(sp<CaptureRequest>& req) {
+ ACaptureRequest* pRequest = new ACaptureRequest();
+ CameraMetadata clone;
+ utils::convertFromHidlCloned(req->mPhysicalCameraSettings[0].settings.metadata(), &clone);
+ pRequest->settings = new ACameraMetadata(clone.release(), ACameraMetadata::ACM_REQUEST);
+ pRequest->targets = new ACameraOutputTargets();
+ for (size_t i = 0; i < req->mSurfaceList.size(); i++) {
+ native_handle_t* anw = req->mSurfaceList[i];
+ ACameraOutputTarget outputTarget(anw);
+ pRequest->targets->mOutputs.insert(outputTarget);
+ }
+ return pRequest;
+}
+
+void
+CameraDevice::freeACaptureRequest(ACaptureRequest* req) {
+ if (req == nullptr) {
+ return;
+ }
+ req->settings.clear();
+ delete req->targets;
+ delete req;
+}
+
+void
+CameraDevice::notifySessionEndOfLifeLocked(ACameraCaptureSession* session) {
+ if (isClosed()) {
+ // Device is closing already. do nothing
+ return;
+ }
+
+ if (mCurrentSession != session) {
+ // Session has been replaced by other seesion or device is closed
+ return;
+ }
+ mCurrentSession = nullptr;
+
+ // Should not happen
+ if (!session->mIsClosed) {
+ ALOGE("Error: unclosed session %p reaches end of life!", session);
+ setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
+ return;
+ }
+
+ // No new session, unconfigure now
+ camera_status_t ret = configureStreamsLocked(nullptr, nullptr);
+ if (ret != ACAMERA_OK) {
+ ALOGE("Unconfigure stream failed. Device might still be configured! ret %d", ret);
+ }
+}
+
+void
+CameraDevice::disconnectLocked(sp<ACameraCaptureSession>& session) {
+ if (mClosing.exchange(true)) {
+ // Already closing, just return
+ ALOGW("Camera device %s is already closing.", getId());
+ return;
+ }
+
+ if (mRemote != nullptr) {
+ auto ret = mRemote->disconnect();
+ if (!ret.isOk()) {
+ ALOGE("%s: Transaction error while disconnecting device %s", __FUNCTION__,
+ ret.description().c_str());
+ }
+ }
+ mRemote = nullptr;
+
+ if (session != nullptr) {
+ session->closeByDevice();
+ }
+}
+
+camera_status_t
+CameraDevice::stopRepeatingLocked() {
+ camera_status_t ret = checkCameraClosedOrErrorLocked();
+ if (ret != ACAMERA_OK) {
+ ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret);
+ return ret;
+ }
+ if (mRepeatingSequenceId != REQUEST_ID_NONE) {
+ int repeatingSequenceId = mRepeatingSequenceId;
+ mRepeatingSequenceId = REQUEST_ID_NONE;
+
+ int64_t lastFrameNumber;
+ Status status = Status::NO_ERROR;
+ auto remoteRet = mRemote->cancelRepeatingRequest(
+ [&status, &lastFrameNumber](Status s, auto frameNumber) {
+ status = s;
+ lastFrameNumber = frameNumber;
+ });
+ if (!remoteRet.isOk() || status != Status::NO_ERROR) {
+ ALOGE("%s: Unable to cancel active repeating request", __FUNCTION__);
+ return utils::convertFromHidl(status);
+ }
+ checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
+ }
+ return ACAMERA_OK;
+}
+
+camera_status_t
+CameraDevice::flushLocked(ACameraCaptureSession* session) {
+ camera_status_t ret = checkCameraClosedOrErrorLocked();
+ if (ret != ACAMERA_OK) {
+ ALOGE("Camera %s abort captures failed! ret %d", getId(), ret);
+ return ret;
+ }
+
+ // This should never happen because creating a new session will close
+ // previous one and thus reject any API call from previous session.
+ // But still good to check here in case something unexpected happen.
+ if (mCurrentSession != session) {
+ ALOGE("Camera %s session %p is not current active session!", getId(), session);
+ return ACAMERA_ERROR_INVALID_OPERATION;
+ }
+
+ if (mFlushing) {
+ ALOGW("Camera %s is already aborting captures", getId());
+ return ACAMERA_OK;
+ }
+
+ mFlushing = true;
+
+ // Send onActive callback to guarantee there is always active->ready transition
+ sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
+ msg->setPointer(kContextKey, session->mUserSessionCallback.context);
+ msg->setObject(kSessionSpKey, session);
+ msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive);
+ postSessionMsgAndCleanup(msg);
+
+ // If device is already idling, send callback and exit early
+ if (mIdle) {
+ sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
+ msg->setPointer(kContextKey, session->mUserSessionCallback.context);
+ msg->setObject(kSessionSpKey, session);
+ msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onReady);
+ postSessionMsgAndCleanup(msg);
+ mFlushing = false;
+ return ACAMERA_OK;
+ }
+
+ int64_t lastFrameNumber;
+ Status status;
+ auto remoteRet = mRemote->flush([&status, &lastFrameNumber](auto s, auto frameNumber) {
+ status = s;
+ lastFrameNumber = frameNumber;
+ });
+ if (!remoteRet.isOk() || status != Status::NO_ERROR) {
+ ALOGE("%s: Abort captures failed", __FUNCTION__);
+ return utils::convertFromHidl(status);
+ }
+ if (mRepeatingSequenceId != REQUEST_ID_NONE) {
+ checkRepeatingSequenceCompleteLocked(mRepeatingSequenceId, lastFrameNumber);
+ }
+ return ACAMERA_OK;
+}
+
+camera_status_t
+CameraDevice::waitUntilIdleLocked() {
+ camera_status_t ret = checkCameraClosedOrErrorLocked();
+ if (ret != ACAMERA_OK) {
+ ALOGE("Wait until camera %s idle failed! ret %d", getId(), ret);
+ return ret;
+ }
+
+ if (mRepeatingSequenceId != REQUEST_ID_NONE) {
+ ALOGE("Camera device %s won't go to idle when there is repeating request!", getId());
+ return ACAMERA_ERROR_INVALID_OPERATION;
+ }
+
+ auto remoteRet = mRemote->waitUntilIdle();
+ if (!remoteRet.isOk()) {
+ ALOGE("%s: Transaction waitUntilIdle failed", __FUNCTION__);
+ return utils::convertFromHidl(remoteRet);
+ }
+ return ACAMERA_OK;
+}
+
+camera_status_t
+CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
+ const ACaptureRequest* sessionParameters) {
+ ACaptureSessionOutputContainer emptyOutput;
+ if (outputs == nullptr) {
+ outputs = &emptyOutput;
+ }
+
+ camera_status_t ret = checkCameraClosedOrErrorLocked();
+ if (ret != ACAMERA_OK) {
+ return ret;
+ }
+
+ std::set<std::pair<native_handle_ptr_wrapper, OutputConfigurationWrapper>> outputSet;
+ for (auto outConfig : outputs->mOutputs) {
+ native_handle_t* anw = outConfig.mWindow;
+ OutputConfigurationWrapper outConfigInsertW;
+ OutputConfiguration &outConfigInsert = outConfigInsertW.mOutputConfiguration;
+ outConfigInsert.rotation = utils::convertToHidl(outConfig.mRotation);
+ outConfigInsert.windowGroupId = -1;
+ outConfigInsert.windowHandles.resize(outConfig.mSharedWindows.size() + 1);
+ outConfigInsert.windowHandles[0] = anw;
+ native_handle_ptr_wrapper wrap(anw);
+ outputSet.insert(std::make_pair(anw, outConfigInsertW));
+ }
+ std::set<std::pair<native_handle_ptr_wrapper, OutputConfigurationWrapper>> addSet = outputSet;
+ std::vector<int32_t> deleteList;
+
+ // Determine which streams need to be created, which to be deleted
+ for (auto& kvPair : mConfiguredOutputs) {
+ int32_t streamId = kvPair.first;
+ auto& outputPair = kvPair.second;
+ if (outputSet.count(outputPair)) {
+ deleteList.push_back(streamId); // Need to delete a no longer needed stream
+ } else {
+ addSet.erase(outputPair); // No need to add already existing stream
+ }
+ }
+
+ ret = stopRepeatingLocked();
+ if (ret != ACAMERA_OK) {
+ ALOGE("Camera device %s stop repeating failed, ret %d", getId(), ret);
+ return ret;
+ }
+
+ ret = waitUntilIdleLocked();
+ if (ret != ACAMERA_OK) {
+ ALOGE("Camera device %s wait until idle failed, ret %d", getId(), ret);
+ return ret;
+ }
+
+ // Send onReady to previous session
+ // CurrentSession will be updated after configureStreamLocked, so here
+ // mCurrentSession is the session to be replaced by a new session
+ if (!mIdle && mCurrentSession != nullptr) {
+ if (mBusySession != mCurrentSession) {
+ ALOGE("Current session != busy session");
+ setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
+ return ACAMERA_ERROR_CAMERA_DEVICE;
+ }
+ sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
+ msg->setPointer(kContextKey, mBusySession->mUserSessionCallback.context);
+ msg->setObject(kSessionSpKey, mBusySession);
+ msg->setPointer(kCallbackFpKey, (void*) mBusySession->mUserSessionCallback.onReady);
+ mBusySession.clear();
+ postSessionMsgAndCleanup(msg);
+ }
+ mIdle = true;
+
+ auto remoteRet = mRemote->beginConfigure();
+ if (!remoteRet.isOk()|| remoteRet != Status::NO_ERROR) {
+ ALOGE("Camera device %s begin configure failed", getId());
+ return utils::convertFromHidl(remoteRet);
+ }
+
+ // delete to-be-deleted streams
+ for (auto streamId : deleteList) {
+ remoteRet = mRemote->deleteStream(streamId);
+ if (!remoteRet.isOk() || remoteRet != Status::NO_ERROR) {
+ ALOGE("Camera device %s failed to remove stream %d", getId(), streamId);
+ return utils::convertFromHidl(remoteRet);
+ }
+ mConfiguredOutputs.erase(streamId);
+ }
+
+ // add new streams
+ for (auto outputPair : addSet) {
+ int streamId;
+ Status status;
+ auto ret = mRemote->createStream(outputPair.second,
+ [&status, &streamId](Status s, auto stream_id) {
+ status = s;
+ streamId = stream_id;
+ });
+ if (!remoteRet.isOk() || status != Status::NO_ERROR) {
+ ALOGE("Camera device %s failed to create stream", getId());
+ return utils::convertFromHidl(status);
+ }
+ mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
+ }
+
+ CameraMetadata params;
+ HCameraMetadata hidlParams;
+ if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) {
+ params.append(sessionParameters->settings->getInternalData());
+ const camera_metadata_t *params_metadata = params.getAndLock();
+ utils::convertToHidl(params_metadata, &hidlParams);
+ params.unlock(params_metadata);
+ remoteRet = mRemote->endConfigure(StreamConfigurationMode::NORMAL_MODE, hidlParams);
+ }
+ if (!remoteRet.isOk()) {
+ ALOGE("Transaction error: endConfigure failed %s", remoteRet.description().c_str());
+ }
+
+ return utils::convertFromHidl(remoteRet);
+}
+
+void
+CameraDevice::setRemoteDevice(sp<ICameraDeviceUser> remote) {
+ Mutex::Autolock _l(mDeviceLock);
+ mRemote = remote;
+}
+
+bool
+CameraDevice::setDeviceMetadataQueues() {
+ if (mRemote == nullptr) {
+ ALOGE("mRemote must not be null while trying to fetch metadata queues");
+ return false;
+ }
+ std::shared_ptr<RequestMetadataQueue> &reqQueue = mCaptureRequestMetadataQueue;
+ auto ret =
+ mRemote->getCaptureRequestMetadataQueue(
+ [&reqQueue](const auto &mqDescriptor) {
+ reqQueue = std::make_shared<RequestMetadataQueue>(mqDescriptor);
+ if (!reqQueue->isValid() || reqQueue->availableToWrite() <=0) {
+ ALOGE("Empty fmq from cameraserver");
+ reqQueue = nullptr;
+ }
+ });
+ if (!ret.isOk()) {
+ ALOGE("Transaction error trying to get capture request metadata queue");
+ return false;
+ }
+ std::shared_ptr<ResultMetadataQueue> &resQueue = mCaptureResultMetadataQueue;
+ ret =
+ mRemote->getCaptureResultMetadataQueue(
+ [&resQueue](const auto &mqDescriptor) {
+ resQueue = std::make_shared<ResultMetadataQueue>(mqDescriptor);
+ if (!resQueue->isValid() || resQueue->availableToWrite() <=0) {
+ ALOGE("Empty fmq from cameraserver");
+ }
+ });
+ if (!ret.isOk()) {
+ ALOGE("Transaction error trying to get capture result metadata queue");
+ return false;
+ }
+ return true;
+}
+
+camera_status_t
+CameraDevice::checkCameraClosedOrErrorLocked() const {
+ if (mRemote == nullptr) {
+ ALOGE("%s: camera device already closed", __FUNCTION__);
+ return ACAMERA_ERROR_CAMERA_DISCONNECTED;
+ }
+ if (mInError) {// triggered by onDeviceError
+ ALOGE("%s: camera device has encountered a serious error", __FUNCTION__);
+ return mError;
+ }
+ return ACAMERA_OK;
+}
+
+void
+CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) {
+ mInError = true;
+ mError = error;
+ return;
+}
+
+void
+CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) {
+ ALOGV("updateTracker frame %" PRId64 " isError %d", frameNumber, isError);
+ if (isError) {
+ mFutureErrorSet.insert(frameNumber);
+ } else if (frameNumber <= mCompletedFrameNumber) {
+ ALOGE("Frame number %" PRId64 " decreased! current fn %" PRId64,
+ frameNumber, mCompletedFrameNumber);
+ return;
+ } else {
+ if (frameNumber != mCompletedFrameNumber + 1) {
+ ALOGE("Frame number out of order. Expect %" PRId64 " but get %" PRId64,
+ mCompletedFrameNumber + 1, frameNumber);
+ // Do not assert as in java implementation
+ }
+ mCompletedFrameNumber = frameNumber;
+ }
+ update();
+}
+
+void
+CameraDevice::FrameNumberTracker::update() {
+ for (auto it = mFutureErrorSet.begin(); it != mFutureErrorSet.end();) {
+ int64_t errorFrameNumber = *it;
+ if (errorFrameNumber == mCompletedFrameNumber + 1) {
+ mCompletedFrameNumber++;
+ it = mFutureErrorSet.erase(it);
+ } else if (errorFrameNumber <= mCompletedFrameNumber) {
+ // This should not happen, but deal with it anyway
+ ALOGE("Completd frame number passed through current frame number!");
+ // erase the old error since it's no longer useful
+ it = mFutureErrorSet.erase(it);
+ } else {
+ // Normal requests hasn't catched up error frames, just break
+ break;
+ }
+ }
+ ALOGV("Update complete frame %" PRId64, mCompletedFrameNumber);
+}
+
+void
+CameraDevice::onCaptureErrorLocked(
+ ErrorCode errorCode,
+ const CaptureResultExtras& resultExtras) {
+ int sequenceId = resultExtras.requestId;
+ int64_t frameNumber = resultExtras.frameNumber;
+ int32_t burstId = resultExtras.burstId;
+ auto it = mSequenceCallbackMap.find(sequenceId);
+ if (it == mSequenceCallbackMap.end()) {
+ ALOGE("%s: Error: capture sequence index %d not found!",
+ __FUNCTION__, sequenceId);
+ setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
+ return;
+ }
+
+ CallbackHolder cbh = (*it).second;
+ sp<ACameraCaptureSession> session = cbh.mSession;
+ if ((size_t) burstId >= cbh.mRequests.size()) {
+ ALOGE("%s: Error: request index %d out of bound (size %zu)",
+ __FUNCTION__, burstId, cbh.mRequests.size());
+ setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
+ return;
+ }
+ sp<CaptureRequest> request = cbh.mRequests[burstId];
+
+ // Handle buffer error
+ if (errorCode == ErrorCode::CAMERA_BUFFER) {
+ int32_t streamId = resultExtras.errorStreamId;
+ ACameraCaptureSession_captureCallback_bufferLost onBufferLost =
+ cbh.mCallbacks.onCaptureBufferLost;
+ auto outputPairIt = mConfiguredOutputs.find(streamId);
+ if (outputPairIt == mConfiguredOutputs.end()) {
+ ALOGE("%s: Error: stream id %d does not exist", __FUNCTION__, streamId);
+ setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
+ return;
+ }
+
+ const auto& windowHandles = outputPairIt->second.second.mOutputConfiguration.windowHandles;
+ for (const auto& outHandle : windowHandles) {
+ for (auto streamAndWindowId : request->mCaptureRequest.streamAndWindowIds) {
+ int32_t windowId = streamAndWindowId.windowId;
+ if (utils::isWindowNativeHandleEqual(windowHandles[windowId],outHandle)) {
+ native_handle_t* anw =
+ const_cast<native_handle_t *>(windowHandles[windowId].getNativeHandle());
+ ALOGV("Camera %s Lost output buffer for ANW %p frame %" PRId64,
+ getId(), anw, frameNumber);
+
+ sp<AMessage> msg = new AMessage(kWhatCaptureBufferLost, mHandler);
+ msg->setPointer(kContextKey, cbh.mCallbacks.context);
+ msg->setObject(kSessionSpKey, session);
+ msg->setPointer(kCallbackFpKey, (void*) onBufferLost);
+ msg->setObject(kCaptureRequestKey, request);
+ msg->setPointer(kAnwKey, (void*) anw);
+ msg->setInt64(kFrameNumberKey, frameNumber);
+ postSessionMsgAndCleanup(msg);
+ }
+ }
+ }
+ } else { // Handle other capture failures
+ // Fire capture failure callback if there is one registered
+ ACameraCaptureSession_captureCallback_failed onError = cbh.mCallbacks.onCaptureFailed;
+ sp<CameraCaptureFailure> failure(new CameraCaptureFailure());
+ failure->frameNumber = frameNumber;
+ // TODO: refine this when implementing flush
+ failure->reason = CAPTURE_FAILURE_REASON_ERROR;
+ failure->sequenceId = sequenceId;
+ failure->wasImageCaptured = (errorCode == ErrorCode::CAMERA_RESULT);
+
+ sp<AMessage> msg = new AMessage(kWhatCaptureFail, mHandler);
+ msg->setPointer(kContextKey, cbh.mCallbacks.context);
+ msg->setObject(kSessionSpKey, session);
+ msg->setPointer(kCallbackFpKey, (void*) onError);
+ msg->setObject(kCaptureRequestKey, request);
+ msg->setObject(kCaptureFailureKey, failure);
+ postSessionMsgAndCleanup(msg);
+
+ // Update tracker
+ mFrameNumberTracker.updateTracker(frameNumber, /*isError*/true);
+ checkAndFireSequenceCompleteLocked();
+ }
+ return;
+}
+
+void CameraDevice::CallbackHandler::onMessageReceived(
+ const sp<AMessage> &msg) {
+ switch (msg->what()) {
+ case kWhatOnDisconnected:
+ case kWhatOnError:
+ case kWhatSessionStateCb:
+ case kWhatCaptureStart:
+ case kWhatCaptureResult:
+ case kWhatCaptureFail:
+ case kWhatCaptureSeqEnd:
+ case kWhatCaptureSeqAbort:
+ case kWhatCaptureBufferLost:
+ ALOGV("%s: Received msg %d", __FUNCTION__, msg->what());
+ break;
+ case kWhatCleanUpSessions:
+ mCachedSessions.clear();
+ return;
+ default:
+ ALOGE("%s:Error: unknown device callback %d", __FUNCTION__, msg->what());
+ return;
+ }
+ // Check the common part of all message
+ void* context;
+ bool found = msg->findPointer(kContextKey, &context);
+ if (!found) {
+ ALOGE("%s: Cannot find callback context!", __FUNCTION__);
+ return;
+ }
+ switch (msg->what()) {
+ case kWhatOnDisconnected:
+ {
+ ACameraDevice* dev;
+ found = msg->findPointer(kDeviceKey, (void**) &dev);
+ if (!found || dev == nullptr) {
+ ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
+ return;
+ }
+ ACameraDevice_StateCallback onDisconnected;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onDisconnected);
+ if (!found) {
+ ALOGE("%s: Cannot find onDisconnected!", __FUNCTION__);
+ return;
+ }
+ if (onDisconnected == nullptr) {
+ return;
+ }
+ (*onDisconnected)(context, dev);
+ break;
+ }
+ case kWhatOnError:
+ {
+ ACameraDevice* dev;
+ found = msg->findPointer(kDeviceKey, (void**) &dev);
+ if (!found || dev == nullptr) {
+ ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
+ return;
+ }
+ ACameraDevice_ErrorStateCallback onError;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onError);
+ if (!found) {
+ ALOGE("%s: Cannot find onError!", __FUNCTION__);
+ return;
+ }
+ int errorCode;
+ found = msg->findInt32(kErrorCodeKey, &errorCode);
+ if (!found) {
+ ALOGE("%s: Cannot find error code!", __FUNCTION__);
+ return;
+ }
+ if (onError == nullptr) {
+ return;
+ }
+ (*onError)(context, dev, errorCode);
+ break;
+ }
+ case kWhatSessionStateCb:
+ case kWhatCaptureStart:
+ case kWhatCaptureResult:
+ case kWhatCaptureFail:
+ case kWhatCaptureSeqEnd:
+ case kWhatCaptureSeqAbort:
+ case kWhatCaptureBufferLost:
+ {
+ sp<RefBase> obj;
+ found = msg->findObject(kSessionSpKey, &obj);
+ if (!found || obj == nullptr) {
+ ALOGE("%s: Cannot find session pointer!", __FUNCTION__);
+ return;
+ }
+ sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get()));
+ mCachedSessions.push(session);
+ sp<CaptureRequest> requestSp = nullptr;
+ switch (msg->what()) {
+ case kWhatCaptureStart:
+ case kWhatCaptureResult:
+ case kWhatCaptureFail:
+ case kWhatCaptureBufferLost:
+ found = msg->findObject(kCaptureRequestKey, &obj);
+ if (!found) {
+ ALOGE("%s: Cannot find capture request!", __FUNCTION__);
+ return;
+ }
+ requestSp = static_cast<CaptureRequest*>(obj.get());
+ break;
+ }
+
+ switch (msg->what()) {
+ case kWhatSessionStateCb:
+ {
+ ACameraCaptureSession_stateCallback onState;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onState);
+ if (!found) {
+ ALOGE("%s: Cannot find state callback!", __FUNCTION__);
+ return;
+ }
+ if (onState == nullptr) {
+ return;
+ }
+ (*onState)(context, session.get());
+ break;
+ }
+ case kWhatCaptureStart:
+ {
+ ACameraCaptureSession_captureCallback_start onStart;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onStart);
+ if (!found) {
+ ALOGE("%s: Cannot find capture start callback!", __FUNCTION__);
+ return;
+ }
+ if (onStart == nullptr) {
+ return;
+ }
+ int64_t timestamp;
+ found = msg->findInt64(kTimeStampKey, ×tamp);
+ if (!found) {
+ ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
+ return;
+ }
+ ACaptureRequest* request = allocateACaptureRequest(requestSp);
+ (*onStart)(context, session.get(), request, timestamp);
+ freeACaptureRequest(request);
+ break;
+ }
+ case kWhatCaptureResult:
+ {
+ ACameraCaptureSession_captureCallback_result onResult;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
+ if (!found) {
+ ALOGE("%s: Cannot find capture result callback!", __FUNCTION__);
+ return;
+ }
+ if (onResult == nullptr) {
+ return;
+ }
+
+ found = msg->findObject(kCaptureResultKey, &obj);
+ if (!found) {
+ ALOGE("%s: Cannot find capture result!", __FUNCTION__);
+ return;
+ }
+ sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
+ ACaptureRequest* request = allocateACaptureRequest(requestSp);
+ (*onResult)(context, session.get(), request, result.get());
+ freeACaptureRequest(request);
+ break;
+ }
+ case kWhatCaptureFail:
+ {
+ ACameraCaptureSession_captureCallback_failed onFail;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
+ if (!found) {
+ ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
+ return;
+ }
+ if (onFail == nullptr) {
+ return;
+ }
+
+ found = msg->findObject(kCaptureFailureKey, &obj);
+ if (!found) {
+ ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
+ return;
+ }
+ sp<CameraCaptureFailure> failureSp(
+ static_cast<CameraCaptureFailure*>(obj.get()));
+ ACameraCaptureFailure* failure =
+ static_cast<ACameraCaptureFailure*>(failureSp.get());
+ ACaptureRequest* request = allocateACaptureRequest(requestSp);
+ (*onFail)(context, session.get(), request, failure);
+ freeACaptureRequest(request);
+ break;
+ }
+ case kWhatCaptureSeqEnd:
+ {
+ ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onSeqEnd);
+ if (!found) {
+ ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
+ return;
+ }
+ if (onSeqEnd == nullptr) {
+ return;
+ }
+ int seqId;
+ found = msg->findInt32(kSequenceIdKey, &seqId);
+ if (!found) {
+ ALOGE("%s: Cannot find frame number!", __FUNCTION__);
+ return;
+ }
+ int64_t frameNumber;
+ found = msg->findInt64(kFrameNumberKey, &frameNumber);
+ if (!found) {
+ ALOGE("%s: Cannot find frame number!", __FUNCTION__);
+ return;
+ }
+ (*onSeqEnd)(context, session.get(), seqId, frameNumber);
+ break;
+ }
+ case kWhatCaptureSeqAbort:
+ {
+ ACameraCaptureSession_captureCallback_sequenceAbort onSeqAbort;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onSeqAbort);
+ if (!found) {
+ ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
+ return;
+ }
+ if (onSeqAbort == nullptr) {
+ return;
+ }
+ int seqId;
+ found = msg->findInt32(kSequenceIdKey, &seqId);
+ if (!found) {
+ ALOGE("%s: Cannot find frame number!", __FUNCTION__);
+ return;
+ }
+ (*onSeqAbort)(context, session.get(), seqId);
+ break;
+ }
+ case kWhatCaptureBufferLost:
+ {
+ ACameraCaptureSession_captureCallback_bufferLost onBufferLost;
+ found = msg->findPointer(kCallbackFpKey, (void**) &onBufferLost);
+ if (!found) {
+ ALOGE("%s: Cannot find buffer lost callback!", __FUNCTION__);
+ return;
+ }
+ if (onBufferLost == nullptr) {
+ return;
+ }
+
+ native_handle_t* anw;
+ found = msg->findPointer(kAnwKey, (void**) &anw);
+ if (!found) {
+ ALOGE("%s: Cannot find native_handle_t!", __FUNCTION__);
+ return;
+ }
+
+ int64_t frameNumber;
+ found = msg->findInt64(kFrameNumberKey, &frameNumber);
+ if (!found) {
+ ALOGE("%s: Cannot find frame number!", __FUNCTION__);
+ return;
+ }
+
+ ACaptureRequest* request = allocateACaptureRequest(requestSp);
+ (*onBufferLost)(context, session.get(), request, anw, frameNumber);
+ freeACaptureRequest(request);
+ break;
+ }
+ }
+ break;
+ }
+ }
+}
+
+CameraDevice::CallbackHolder::CallbackHolder(
+ sp<ACameraCaptureSession> session,
+ const Vector<sp<CaptureRequest> >& requests,
+ bool isRepeating,
+ ACameraCaptureSession_captureCallbacks* cbs) :
+ mSession(session), mRequests(requests),
+ mIsRepeating(isRepeating), mCallbacks(fillCb(cbs)) {}
+
+void
+CameraDevice::checkRepeatingSequenceCompleteLocked(
+ const int sequenceId, const int64_t lastFrameNumber) {
+ ALOGV("Repeating seqId %d lastFrameNumer %" PRId64, sequenceId, lastFrameNumber);
+ if (lastFrameNumber == NO_FRAMES_CAPTURED) {
+ if (mSequenceCallbackMap.count(sequenceId) == 0) {
+ ALOGW("No callback found for sequenceId %d", sequenceId);
+ return;
+ }
+ // remove callback holder from callback map
+ auto cbIt = mSequenceCallbackMap.find(sequenceId);
+ CallbackHolder cbh = cbIt->second;
+ mSequenceCallbackMap.erase(cbIt);
+ // send seq aborted callback
+ sp<AMessage> msg = new AMessage(kWhatCaptureSeqAbort, mHandler);
+ msg->setPointer(kContextKey, cbh.mCallbacks.context);
+ msg->setObject(kSessionSpKey, cbh.mSession);
+ msg->setPointer(kCallbackFpKey, (void*) cbh.mCallbacks.onCaptureSequenceAborted);
+ msg->setInt32(kSequenceIdKey, sequenceId);
+ postSessionMsgAndCleanup(msg);
+ } else {
+ // Use mSequenceLastFrameNumberMap to track
+ mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber));
+
+ // Last frame might have arrived. Check now
+ checkAndFireSequenceCompleteLocked();
+ }
+}
+
+void
+CameraDevice::checkAndFireSequenceCompleteLocked() {
+ int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber();
+ auto it = mSequenceLastFrameNumberMap.begin();
+ while (it != mSequenceLastFrameNumberMap.end()) {
+ int sequenceId = it->first;
+ int64_t lastFrameNumber = it->second;
+ bool seqCompleted = false;
+ bool hasCallback = true;
+
+ if (mRemote == nullptr) {
+ ALOGW("Camera %s closed while checking sequence complete", getId());
+ return;
+ }
+
+ // Check if there is callback for this sequence
+ // This should not happen because we always register callback (with nullptr inside)
+ if (mSequenceCallbackMap.count(sequenceId) == 0) {
+ ALOGW("No callback found for sequenceId %d", sequenceId);
+ hasCallback = false;
+ }
+
+ if (lastFrameNumber <= completedFrameNumber) {
+ ALOGV("seq %d reached last frame %" PRId64 ", completed %" PRId64,
+ sequenceId, lastFrameNumber, completedFrameNumber);
+ seqCompleted = true;
+ }
+
+ if (seqCompleted && hasCallback) {
+ // remove callback holder from callback map
+ auto cbIt = mSequenceCallbackMap.find(sequenceId);
+ CallbackHolder cbh = cbIt->second;
+ mSequenceCallbackMap.erase(cbIt);
+ // send seq complete callback
+ sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler);
+ msg->setPointer(kContextKey, cbh.mCallbacks.context);
+ msg->setObject(kSessionSpKey, cbh.mSession);
+ msg->setPointer(kCallbackFpKey, (void*) cbh.mCallbacks.onCaptureSequenceCompleted);
+ msg->setInt32(kSequenceIdKey, sequenceId);
+ msg->setInt64(kFrameNumberKey, lastFrameNumber);
+
+ // Clear the session sp before we send out the message
+ // This will guarantee the rare case where the message is processed
+ // before cbh goes out of scope and causing we call the session
+ // destructor while holding device lock
+ cbh.mSession.clear();
+ postSessionMsgAndCleanup(msg);
+ }
+
+ // No need to track sequence complete if there is no callback registered
+ if (seqCompleted || !hasCallback) {
+ it = mSequenceLastFrameNumberMap.erase(it);
+ } else {
+ ++it;
+ }
+ }
+}
+
+/**
+ * Camera service callback implementation
+ */
+android::hardware::Return<void>
+CameraDevice::ServiceCallback::onDeviceError(
+ ErrorCode errorCode,
+ const CaptureResultExtras& resultExtras) {
+ ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d",
+ errorCode, resultExtras.frameNumber, resultExtras.requestId, resultExtras.burstId);
+ auto ret = Void();
+ sp<CameraDevice> dev = mDevice.promote();
+ if (dev == nullptr) {
+ return ret; // device has been closed
+ }
+
+ sp<ACameraCaptureSession> session = dev->mCurrentSession.promote();
+ Mutex::Autolock _l(dev->mDeviceLock);
+ if (dev->mRemote == nullptr) {
+ return ret; // device has been closed
+ }
+ switch (errorCode) {
+ case ErrorCode::CAMERA_DISCONNECTED:
+ {
+ // Camera is disconnected, close the session and expect no more callbacks
+ if (session != nullptr) {
+ session->closeByDevice();
+ }
+ dev->mCurrentSession = nullptr;
+ sp<AMessage> msg = new AMessage(kWhatOnDisconnected, dev->mHandler);
+ msg->setPointer(kContextKey, dev->mAppCallbacks.context);
+ msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
+ msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onDisconnected);
+ msg->post();
+ break;
+ }
+ default:
+ ALOGE("Unknown error from camera device: %d", errorCode);
+ [[fallthrough]];
+ case ErrorCode::CAMERA_DEVICE:
+ case ErrorCode::CAMERA_SERVICE:
+ {
+ int32_t errorVal = ::ERROR_CAMERA_DEVICE;
+ // We keep this switch since this block might be encountered with
+ // more than just 2 states. The default fallthrough could have us
+ // handling more unmatched error cases.
+ switch (errorCode) {
+ case ErrorCode::CAMERA_DEVICE:
+ dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
+ break;
+ case ErrorCode::CAMERA_SERVICE:
+ dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
+ errorVal = ::ERROR_CAMERA_SERVICE;
+ break;
+ default:
+ dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_UNKNOWN);
+ break;
+ }
+ sp<AMessage> msg = new AMessage(kWhatOnError, dev->mHandler);
+ msg->setPointer(kContextKey, dev->mAppCallbacks.context);
+ msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
+ msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onError);
+ msg->setInt32(kErrorCodeKey, errorVal);
+ msg->post();
+ break;
+ }
+ case ErrorCode::CAMERA_REQUEST:
+ case ErrorCode::CAMERA_RESULT:
+ case ErrorCode::CAMERA_BUFFER:
+ dev->onCaptureErrorLocked(errorCode, resultExtras);
+ break;
+ }
+ return ret;
+}
+
+android::hardware::Return<void>
+CameraDevice::ServiceCallback::onDeviceIdle() {
+ ALOGV("Camera is now idle");
+ auto ret = Void();
+ sp<CameraDevice> dev = mDevice.promote();
+ if (dev == nullptr) {
+ return ret; // device has been closed
+ }
+
+ Mutex::Autolock _l(dev->mDeviceLock);
+ if (dev->isClosed() || dev->mRemote == nullptr) {
+ return ret;
+ }
+
+ if (dev->mIdle) {
+ // Already in idle state. Possibly other thread did waitUntilIdle
+ return ret;
+ }
+
+ if (dev->mCurrentSession != nullptr) {
+ ALOGE("onDeviceIdle sending state cb");
+ if (dev->mBusySession != dev->mCurrentSession) {
+ ALOGE("Current session != busy session");
+ dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
+ return ret;
+ }
+
+ sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler);
+ msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context);
+ msg->setObject(kSessionSpKey, dev->mBusySession);
+ msg->setPointer(kCallbackFpKey, (void*) dev->mBusySession->mUserSessionCallback.onReady);
+ // Make sure we clear the sp first so the session destructor can
+ // only happen on handler thread (where we don't hold device/session lock)
+ dev->mBusySession.clear();
+ dev->postSessionMsgAndCleanup(msg);
+ }
+ dev->mIdle = true;
+ dev->mFlushing = false;
+ return ret;
+}
+
+android::hardware::Return<void>
+CameraDevice::ServiceCallback::onCaptureStarted(
+ const CaptureResultExtras& resultExtras,
+ uint64_t timestamp) {
+ auto ret = Void();
+
+ sp<CameraDevice> dev = mDevice.promote();
+ if (dev == nullptr) {
+ return ret; // device has been closed
+ }
+ Mutex::Autolock _l(dev->mDeviceLock);
+ if (dev->isClosed() || dev->mRemote == nullptr) {
+ return ret;
+ }
+
+ int32_t sequenceId = resultExtras.requestId;
+ int32_t burstId = resultExtras.burstId;
+
+ auto it = dev->mSequenceCallbackMap.find(sequenceId);
+ if (it != dev->mSequenceCallbackMap.end()) {
+ CallbackHolder cbh = (*it).second;
+ ACameraCaptureSession_captureCallback_start onStart = cbh.mCallbacks.onCaptureStarted;
+ sp<ACameraCaptureSession> session = cbh.mSession;
+ if ((size_t) burstId >= cbh.mRequests.size()) {
+ ALOGE("%s: Error: request index %d out of bound (size %zu)",
+ __FUNCTION__, burstId, cbh.mRequests.size());
+ dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
+ }
+ sp<CaptureRequest> request = cbh.mRequests[burstId];
+ sp<AMessage> msg = new AMessage(kWhatCaptureStart, dev->mHandler);
+ msg->setPointer(kContextKey, cbh.mCallbacks.context);
+ msg->setObject(kSessionSpKey, session);
+ msg->setPointer(kCallbackFpKey, (void*) onStart);
+ msg->setObject(kCaptureRequestKey, request);
+ msg->setInt64(kTimeStampKey, timestamp);
+ dev->postSessionMsgAndCleanup(msg);
+ }
+ return ret;
+}
+
+android::hardware::Return<void>
+CameraDevice::ServiceCallback::onResultReceived(
+ const FmqSizeOrMetadata& resultMetadata,
+ const CaptureResultExtras& resultExtras,
+ const hidl_vec<PhysicalCaptureResultInfo>& physicalResultInfos) {
+ (void) physicalResultInfos;
+ auto ret = Void();
+
+ sp<CameraDevice> dev = mDevice.promote();
+ if (dev == nullptr) {
+ return ret; // device has been closed
+ }
+ int32_t sequenceId = resultExtras.requestId;
+ int64_t frameNumber = resultExtras.frameNumber;
+ int32_t burstId = resultExtras.burstId;
+ bool isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount);
+
+ if (!isPartialResult) {
+ ALOGV("SeqId %d frame %" PRId64 " result arrive.", sequenceId, frameNumber);
+ }
+
+ Mutex::Autolock _l(dev->mDeviceLock);
+ if (dev->mRemote == nullptr) {
+ return ret; // device has been disconnected
+ }
+
+ if (dev->isClosed()) {
+ if (!isPartialResult) {
+ dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
+ }
+ // early return to avoid callback sent to closed devices
+ return ret;
+ }
+
+ CameraMetadata metadataCopy;
+ HCameraMetadata hCameraMetadata;
+ bool converted = false;
+ if (resultMetadata.getDiscriminator() ==
+ FmqSizeOrMetadata::hidl_discriminator::fmqMetadataSize) {
+ hCameraMetadata.resize(resultMetadata.fmqMetadataSize());
+ bool read = dev->mCaptureResultMetadataQueue->read(hCameraMetadata.data(),
+ resultMetadata.fmqMetadataSize());
+ if (!read) {
+ ALOGE("%s capture request settings could't be read from fmq",
+ __FUNCTION__);
+ return ret;
+ }
+ // TODO: Do we actually need to clone here ?
+ converted = utils::convertFromHidlCloned(hCameraMetadata, &metadataCopy);
+
+ } else {
+ converted = utils::convertFromHidlCloned(resultMetadata.metadata(), &metadataCopy);
+ }
+
+ if (!converted) {
+ ALOGE("%s result metadata couldn't be converted", __FUNCTION__);
+ return ret;
+ }
+
+ metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize, /*data_count*/2);
+ metadataCopy.update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, /*data_count*/1);
+
+ auto it = dev->mSequenceCallbackMap.find(sequenceId);
+ if (it != dev->mSequenceCallbackMap.end()) {
+ CallbackHolder cbh = (*it).second;
+ ACameraCaptureSession_captureCallback_result onResult = isPartialResult ?
+ cbh.mCallbacks.onCaptureProgressed :
+ cbh.mCallbacks.onCaptureCompleted;
+ sp<ACameraCaptureSession> session = cbh.mSession;
+ if ((size_t) burstId >= cbh.mRequests.size()) {
+ ALOGE("%s: Error: request index %d out of bound (size %zu)",
+ __FUNCTION__, burstId, cbh.mRequests.size());
+ dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
+ }
+ sp<CaptureRequest> request = cbh.mRequests[burstId];
+ sp<ACameraMetadata> result(new ACameraMetadata(
+ metadataCopy.release(), ACameraMetadata::ACM_RESULT));
+
+ sp<AMessage> msg = new AMessage(kWhatCaptureResult, dev->mHandler);
+ msg->setPointer(kContextKey, cbh.mCallbacks.context);
+ msg->setObject(kSessionSpKey, session);
+ msg->setPointer(kCallbackFpKey, (void*) onResult);
+ msg->setObject(kCaptureRequestKey, request);
+ msg->setObject(kCaptureResultKey, result);
+ dev->postSessionMsgAndCleanup(msg);
+ }
+
+ if (!isPartialResult) {
+ dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
+ dev->checkAndFireSequenceCompleteLocked();
+ }
+
+ return ret;
+}
+
+android::hardware::Return<void>
+CameraDevice::ServiceCallback::onRepeatingRequestError(
+ uint64_t lastFrameNumber, int32_t stoppedSequenceId) {
+ auto ret = Void();
+
+ sp<CameraDevice> dev = mDevice.promote();
+ if (dev == nullptr) {
+ return ret; // device has been closed
+ }
+
+ Mutex::Autolock _l(dev->mDeviceLock);
+
+ int repeatingSequenceId = dev->mRepeatingSequenceId;
+ if (stoppedSequenceId == repeatingSequenceId) {
+ dev->mRepeatingSequenceId = REQUEST_ID_NONE;
+ }
+
+ dev->checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
+
+ return ret;
+}
+
+} // namespace acam
+} // namespace android
diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.h b/camera/ndk/ndk_vendor/impl/ACameraDevice.h
new file mode 100644
index 0000000..01a219f
--- /dev/null
+++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.h
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef _ACAMERA_DEVICE_H
+#define _ACAMERA_DEVICE_H
+
+#include <memory>
+#include <map>
+#include <set>
+#include <atomic>
+#include <utility>
+#include <utils/StrongPointer.h>
+#include <utils/Mutex.h>
+#include <utils/List.h>
+#include <utils/Vector.h>
+#include <android/frameworks/cameraservice/device/2.0/ICameraDeviceUser.h>
+#include <android/frameworks/cameraservice/device/2.0/ICameraDeviceCallback.h>
+#include <android/frameworks/cameraservice/device/2.0/types.h>
+#include <fmq/MessageQueue.h>
+#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/AHandler.h>
+#include <media/stagefright/foundation/AMessage.h>
+
+#include <camera/NdkCameraManager.h>
+#include <camera/NdkCameraCaptureSession.h>
+#include "ACameraMetadata.h"
+#include "utils.h"
+
+namespace android {
+namespace acam {
+
+using ICameraDeviceCallback = frameworks::cameraservice::device::V2_0::ICameraDeviceCallback;
+using ICameraDeviceUser = frameworks::cameraservice::device::V2_0::ICameraDeviceUser;
+using CaptureResultExtras = frameworks::cameraservice::device::V2_0::CaptureResultExtras;
+using PhysicalCaptureResultInfo = frameworks::cameraservice::device::V2_0::PhysicalCaptureResultInfo;
+using PhysicalCameraSettings = frameworks::cameraservice::device::V2_0::PhysicalCameraSettings;
+using SubmitInfo = frameworks::cameraservice::device::V2_0::SubmitInfo;
+using CaptureResultExtras = frameworks::cameraservice::device::V2_0::CaptureResultExtras;
+using ErrorCode = frameworks::cameraservice::device::V2_0::ErrorCode;
+using FmqSizeOrMetadata = frameworks::cameraservice::device::V2_0::FmqSizeOrMetadata;
+using StreamConfigurationMode = frameworks::cameraservice::device::V2_0::StreamConfigurationMode;
+using Status = frameworks::cameraservice::common::V2_0::Status;
+using ResultMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>;
+using RequestMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>;
+using CameraStatusAndId = frameworks::cameraservice::service::V2_0::CameraStatusAndId;
+
+using hardware::hidl_vec;
+using hardware::hidl_string;
+using utils::native_handle_ptr_wrapper;
+using utils::CaptureRequest;
+using utils::OutputConfigurationWrapper;
+
+// Wrap ACameraCaptureFailure so it can be ref-counted
+struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure { };
+
+class CameraDevice final : public RefBase {
+ public:
+ CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
+ sp<ACameraMetadata> chars,
+ ACameraDevice* wrapper);
+ ~CameraDevice();
+
+ inline const char* getId() const { return mCameraId.c_str(); }
+
+ camera_status_t createCaptureRequest(
+ ACameraDevice_request_template templateId,
+ ACaptureRequest** request) const;
+
+ camera_status_t createCaptureSession(
+ const ACaptureSessionOutputContainer* outputs,
+ const ACaptureRequest* sessionParameters,
+ const ACameraCaptureSession_stateCallbacks* callbacks,
+ /*out*/ACameraCaptureSession** session);
+
+ // Callbacks from camera service
+ class ServiceCallback : public ICameraDeviceCallback {
+ public:
+ explicit ServiceCallback(CameraDevice* device) : mDevice(device) {}
+ android::hardware::Return<void> onDeviceError(ErrorCode errorCode,
+ const CaptureResultExtras& resultExtras) override;
+ android::hardware::Return<void> onDeviceIdle() override;
+ android::hardware::Return<void> onCaptureStarted(const CaptureResultExtras& resultExtras,
+ uint64_t timestamp) override;
+ android::hardware::Return<void> onResultReceived(const FmqSizeOrMetadata& result,
+ const CaptureResultExtras& resultExtras,
+ const hidl_vec<PhysicalCaptureResultInfo>& physicalResultInfos) override;
+ android::hardware::Return<void> onRepeatingRequestError(uint64_t lastFrameNumber,
+ int32_t stoppedSequenceId) override;
+ private:
+ const wp<CameraDevice> mDevice;
+ };
+ inline sp<ICameraDeviceCallback> getServiceCallback() {
+ return mServiceCallback;
+ };
+
+ // Camera device is only functional after remote being set
+ void setRemoteDevice(sp<ICameraDeviceUser> remote);
+
+ bool setDeviceMetadataQueues();
+ inline ACameraDevice* getWrapper() const { return mWrapper; };
+
+ private:
+ friend ACameraCaptureSession;
+
+ camera_status_t checkCameraClosedOrErrorLocked() const;
+
+ // device goes into fatal error state after this
+ void setCameraDeviceErrorLocked(camera_status_t error);
+
+ void disconnectLocked(sp<ACameraCaptureSession>& session); // disconnect from camera service
+
+ camera_status_t stopRepeatingLocked();
+
+ camera_status_t flushLocked(ACameraCaptureSession*);
+
+ camera_status_t waitUntilIdleLocked();
+
+
+ camera_status_t captureLocked(sp<ACameraCaptureSession> session,
+ /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
+ int numRequests, ACaptureRequest** requests,
+ /*optional*/int* captureSequenceId);
+
+ camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session,
+ /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
+ int numRequests, ACaptureRequest** requests,
+ /*optional*/int* captureSequenceId);
+
+ camera_status_t submitRequestsLocked(
+ sp<ACameraCaptureSession> session,
+ /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
+ int numRequests, ACaptureRequest** requests,
+ /*out*/int* captureSequenceId,
+ bool isRepeating);
+
+ camera_status_t updateOutputConfigurationLocked(ACaptureSessionOutput *output);
+
+ camera_status_t allocateCaptureRequest(
+ const ACaptureRequest* request, sp<CaptureRequest>& outReq);
+
+ static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req);
+ static void freeACaptureRequest(ACaptureRequest*);
+
+ // only For session to hold device lock
+ // Always grab device lock before grabbing session lock
+ void lockDeviceForSessionOps() const { mDeviceLock.lock(); };
+ void unlockDevice() const { mDeviceLock.unlock(); };
+
+ // For capture session to notify its end of life
+ void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);
+
+ camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
+ const ACaptureRequest* sessionParameters);
+
+ // Input message will be posted and cleared after this returns
+ void postSessionMsgAndCleanup(sp<AMessage>& msg);
+
+ mutable Mutex mDeviceLock;
+ const hidl_string mCameraId; // Camera ID
+ const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
+ const sp<ACameraMetadata> mChars; // Camera characteristics
+ const sp<ServiceCallback> mServiceCallback;
+ ACameraDevice* mWrapper;
+
+ // stream id -> pair of (ACameraWindowType* from application, OutputConfiguration used for
+ // camera service)
+ std::map<int, std::pair<native_handle_ptr_wrapper, OutputConfigurationWrapper>> mConfiguredOutputs;
+
+ // TODO: maybe a bool will suffice for synchronous implementation?
+ std::atomic_bool mClosing;
+ inline bool isClosed() { return mClosing; }
+
+ bool mInError = false;
+ camera_status_t mError = ACAMERA_OK;
+ void onCaptureErrorLocked(
+ ErrorCode errorCode,
+ const CaptureResultExtras& resultExtras);
+
+ bool mIdle = true;
+ // This will avoid a busy session being deleted before it's back to idle state
+ sp<ACameraCaptureSession> mBusySession;
+
+ sp<ICameraDeviceUser> mRemote;
+
+ // Looper thread to handle callback to app
+ sp<ALooper> mCbLooper;
+ // definition of handler and message
+ enum {
+ // Device state callbacks
+ kWhatOnDisconnected, // onDisconnected
+ kWhatOnError, // onError
+ // Session state callbacks
+ kWhatSessionStateCb, // onReady, onActive
+ // Capture callbacks
+ kWhatCaptureStart, // onCaptureStarted
+ kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted
+ kWhatCaptureFail, // onCaptureFailed
+ kWhatCaptureSeqEnd, // onCaptureSequenceCompleted
+ kWhatCaptureSeqAbort, // onCaptureSequenceAborted
+ kWhatCaptureBufferLost,// onCaptureBufferLost
+ // Internal cleanup
+ kWhatCleanUpSessions // Cleanup cached sp<ACameraCaptureSession>
+ };
+ static const char* kContextKey;
+ static const char* kDeviceKey;
+ static const char* kErrorCodeKey;
+ static const char* kCallbackFpKey;
+ static const char* kSessionSpKey;
+ static const char* kCaptureRequestKey;
+ static const char* kTimeStampKey;
+ static const char* kCaptureResultKey;
+ static const char* kCaptureFailureKey;
+ static const char* kSequenceIdKey;
+ static const char* kFrameNumberKey;
+ static const char* kAnwKey;
+
+ class CallbackHandler : public AHandler {
+ public:
+ void onMessageReceived(const sp<AMessage> &msg) override;
+
+ private:
+ // This handler will cache all capture session sp until kWhatCleanUpSessions
+ // is processed. This is used to guarantee the last session reference is always
+ // being removed in callback thread without holding camera device lock
+ Vector<sp<ACameraCaptureSession>> mCachedSessions;
+ };
+ sp<CallbackHandler> mHandler;
+
+ /***********************************
+ * Capture session related members *
+ ***********************************/
+ // The current active session
+ wp<ACameraCaptureSession> mCurrentSession;
+ bool mFlushing = false;
+
+ int mNextSessionId = 0;
+ // TODO: might need another looper/handler to handle callbacks from service
+
+ static const int REQUEST_ID_NONE = -1;
+ int mRepeatingSequenceId = REQUEST_ID_NONE;
+
+ // sequence id -> last frame number map
+ std::map<int32_t, int64_t> mSequenceLastFrameNumberMap;
+
+ struct CallbackHolder {
+ CallbackHolder(sp<ACameraCaptureSession> session,
+ const Vector<sp<CaptureRequest>>& requests,
+ bool isRepeating,
+ ACameraCaptureSession_captureCallbacks* cbs);
+
+ static ACameraCaptureSession_captureCallbacks fillCb(
+ ACameraCaptureSession_captureCallbacks* cbs) {
+ if (cbs != nullptr) {
+ return *cbs;
+ }
+ return { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
+ }
+
+ sp<ACameraCaptureSession> mSession;
+ Vector<sp<CaptureRequest>> mRequests;
+ const bool mIsRepeating;
+ ACameraCaptureSession_captureCallbacks mCallbacks;
+ };
+ // sequence id -> callbacks map
+ std::map<int, CallbackHolder> mSequenceCallbackMap;
+
+ static const int64_t NO_FRAMES_CAPTURED = -1;
+ class FrameNumberTracker {
+ public:
+ // TODO: Called in onResultReceived and onCaptureErrorLocked
+ void updateTracker(int64_t frameNumber, bool isError);
+ inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; }
+ private:
+ void update();
+ void updateCompletedFrameNumber(int64_t frameNumber);
+
+ int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED;
+ List<int64_t> mSkippedFrameNumbers;
+ std::set<int64_t> mFutureErrorSet;
+ };
+ FrameNumberTracker mFrameNumberTracker;
+
+ void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber);
+ void checkAndFireSequenceCompleteLocked();
+
+ // Misc variables
+ int32_t mShadingMapSize[2]; // const after constructor
+ int32_t mPartialResultCount; // const after constructor
+ std::shared_ptr<ResultMetadataQueue> mCaptureRequestMetadataQueue = nullptr;
+ std::shared_ptr<ResultMetadataQueue> mCaptureResultMetadataQueue = nullptr;
+};
+
+} // namespace acam;
+} // namespace android;
+
+/**
+ * ACameraDevice opaque struct definition
+ * Leave outside of android namespace because it's NDK struct
+ */
+struct ACameraDevice {
+ ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
+ sp<ACameraMetadata> chars) :
+ mDevice(new android::acam::CameraDevice(id, cb, std::move(chars), this)) {}
+
+ ~ACameraDevice() {};
+
+ /*******************
+ * NDK public APIs *
+ *******************/
+ inline const char* getId() const { return mDevice->getId(); }
+
+ camera_status_t createCaptureRequest(
+ ACameraDevice_request_template templateId,
+ ACaptureRequest** request) const {
+ return mDevice->createCaptureRequest(templateId, request);
+ }
+
+ camera_status_t createCaptureSession(
+ const ACaptureSessionOutputContainer* outputs,
+ const ACaptureRequest* sessionParameters,
+ const ACameraCaptureSession_stateCallbacks* callbacks,
+ /*out*/ACameraCaptureSession** session) {
+ return mDevice->createCaptureSession(outputs, sessionParameters, callbacks, session);
+ }
+
+ /***********************
+ * Device interal APIs *
+ ***********************/
+ inline android::sp<android::acam::ICameraDeviceCallback> getServiceCallback() {
+ return mDevice->getServiceCallback();
+ };
+
+ // Camera device is only functional after remote being set
+ inline void setRemoteDevice(android::sp<android::acam::ICameraDeviceUser> remote) {
+ mDevice->setRemoteDevice(remote);
+ }
+ inline bool setDeviceMetadataQueues() {
+ return mDevice->setDeviceMetadataQueues();
+ }
+ private:
+ android::sp<android::acam::CameraDevice> mDevice;
+};
+
+#endif // _ACAMERA_DEVICE_H
diff --git a/camera/ndk/ndk_vendor/impl/ACameraManager.cpp b/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
new file mode 100644
index 0000000..f395b44
--- /dev/null
+++ b/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
@@ -0,0 +1,458 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "ACameraManagerVendor"
+
+#include <memory>
+#include "ndk_vendor/impl/ACameraManager.h"
+#include "ACameraMetadata.h"
+#include "ndk_vendor/impl/ACameraDevice.h"
+#include "utils.h"
+
+#include <utils/Vector.h>
+#include <cutils/properties.h>
+#include <stdlib.h>
+
+#include <VendorTagDescriptor.h>
+
+using namespace android::acam;
+
+namespace android {
+namespace acam {
+
+using CameraStatusAndId = frameworks::cameraservice::service::V2_0::CameraStatusAndId;
+
+// Static member definitions
+const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
+const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
+const char* CameraManagerGlobal::kContextKey = "CallbackContext";
+Mutex CameraManagerGlobal::sLock;
+CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
+
+CameraManagerGlobal&
+CameraManagerGlobal::getInstance() {
+ Mutex::Autolock _l(sLock);
+ CameraManagerGlobal* instance = sInstance;
+ if (instance == nullptr) {
+ instance = new CameraManagerGlobal();
+ sInstance = instance;
+ }
+ return *instance;
+}
+
+CameraManagerGlobal::~CameraManagerGlobal() {
+ // clear sInstance so next getInstance call knows to create a new one
+ Mutex::Autolock _sl(sLock);
+ sInstance = nullptr;
+ Mutex::Autolock _l(mLock);
+ if (mCameraService != nullptr) {
+ mCameraService->unlinkToDeath(mDeathNotifier);
+ mCameraService->removeListener(mCameraServiceListener);
+ }
+ mDeathNotifier.clear();
+ if (mCbLooper != nullptr) {
+ mCbLooper->unregisterHandler(mHandler->id());
+ mCbLooper->stop();
+ }
+ mCbLooper.clear();
+ mHandler.clear();
+ mCameraServiceListener.clear();
+ mCameraService.clear();
+}
+
+static bool isCameraServiceDisabled() {
+ char value[PROPERTY_VALUE_MAX];
+ property_get("config.disable_cameraservice", value, "0");
+ return (strncmp(value, "0", 2) != 0 && strncasecmp(value, "false", 6) != 0);
+}
+
+// TODO: Add back when vendor tags are supported for libcamera2ndk_vendor when
+// the HIDL interface supports querying by vendor id.
+
+sp<ICameraService> CameraManagerGlobal::getCameraService() {
+ Mutex::Autolock _l(mLock);
+ if (mCameraService.get() == nullptr) {
+ if (isCameraServiceDisabled()) {
+ return mCameraService;
+ }
+
+ sp<ICameraService> cameraServiceBinder;
+ do {
+ cameraServiceBinder = ICameraService::getService();
+ if (cameraServiceBinder != nullptr) {
+ break;
+ }
+ ALOGW("CameraService not published, waiting...");
+ usleep(kCameraServicePollDelay);
+ } while(true);
+ if (mDeathNotifier == nullptr) {
+ mDeathNotifier = new DeathNotifier(this);
+ }
+ cameraServiceBinder->linkToDeath(mDeathNotifier, 0);
+ mCameraService = cameraServiceBinder;
+
+ // Setup looper thread to perfrom availiability callbacks
+ if (mCbLooper == nullptr) {
+ mCbLooper = new ALooper;
+ mCbLooper->setName("C2N-mgr-looper");
+ status_t err = mCbLooper->start(
+ /*runOnCallingThread*/false,
+ /*canCallJava*/ true,
+ PRIORITY_DEFAULT);
+ if (err != OK) {
+ ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
+ __FUNCTION__, strerror(-err), err);
+ mCbLooper.clear();
+ return nullptr;
+ }
+ if (mHandler == nullptr) {
+ mHandler = new CallbackHandler();
+ }
+ mCbLooper->registerHandler(mHandler);
+ }
+
+ // register ICameraServiceListener
+ if (mCameraServiceListener == nullptr) {
+ mCameraServiceListener = new CameraServiceListener(this);
+ }
+ hidl_vec<CameraStatusAndId> cameraStatuses{};
+ Status status = Status::NO_ERROR;
+ auto remoteRet = mCameraService->addListener(mCameraServiceListener,
+ [&status, &cameraStatuses](Status s,
+ auto &retStatuses) {
+ status = s;
+ cameraStatuses = retStatuses;
+ });
+ if (!remoteRet.isOk() || status != Status::NO_ERROR) {
+ ALOGE("Failed to add listener to camera service %s", remoteRet.description().c_str());
+ }
+ for (auto& c : cameraStatuses) {
+ onStatusChangedLocked(c);
+ }
+ }
+ return mCameraService;
+}
+
+void CameraManagerGlobal::DeathNotifier::serviceDied(uint64_t cookie, const wp<IBase> &who) {
+ (void) cookie;
+ (void) who;
+ ALOGE("Camera service binderDied!");
+ sp<CameraManagerGlobal> cm = mCameraManager.promote();
+ if (cm != nullptr) {
+ AutoMutex lock(cm->mLock);
+ for (auto& pair : cm->mDeviceStatusMap) {
+ CameraStatusAndId cameraStatusAndId;
+ cameraStatusAndId.cameraId = pair.first;
+ cameraStatusAndId.deviceStatus = pair.second;
+ cm->onStatusChangedLocked(cameraStatusAndId);
+ }
+ cm->mCameraService.clear();
+ // TODO: consider adding re-connect call here?
+ }
+}
+
+void CameraManagerGlobal::registerAvailabilityCallback(
+ const ACameraManager_AvailabilityCallbacks *callback) {
+ Mutex::Autolock _l(mLock);
+ Callback cb(callback);
+ auto pair = mCallbacks.insert(cb);
+ // Send initial callbacks if callback is newly registered
+ if (pair.second) {
+ for (auto& pair : mDeviceStatusMap) {
+ const hidl_string& cameraId = pair.first;
+ CameraDeviceStatus status = pair.second;
+
+ sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
+ ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ?
+ callback->onCameraAvailable : callback->onCameraUnavailable;
+ msg->setPointer(kCallbackFpKey, (void *) cb);
+ msg->setPointer(kContextKey, callback->context);
+ msg->setString(kCameraIdKey, AString(cameraId.c_str()));
+ msg->post();
+ }
+ }
+}
+
+void CameraManagerGlobal::unregisterAvailabilityCallback(
+ const ACameraManager_AvailabilityCallbacks *callback) {
+ Mutex::Autolock _l(mLock);
+ Callback cb(callback);
+ mCallbacks.erase(cb);
+}
+
+void CameraManagerGlobal::getCameraIdList(std::vector<hidl_string>* cameraIds) {
+ // Ensure that we have initialized/refreshed the list of available devices
+ auto cs = getCameraService();
+ Mutex::Autolock _l(mLock);
+
+ for(auto& deviceStatus : mDeviceStatusMap) {
+ if (deviceStatus.second == CameraDeviceStatus::STATUS_NOT_PRESENT ||
+ deviceStatus.second == CameraDeviceStatus::STATUS_ENUMERATING) {
+ continue;
+ }
+ cameraIds->push_back(deviceStatus.first);
+ }
+}
+
+bool CameraManagerGlobal::validStatus(CameraDeviceStatus status) {
+ switch (status) {
+ case CameraDeviceStatus::STATUS_NOT_PRESENT:
+ case CameraDeviceStatus::STATUS_PRESENT:
+ case CameraDeviceStatus::STATUS_ENUMERATING:
+ case CameraDeviceStatus::STATUS_NOT_AVAILABLE:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool CameraManagerGlobal::isStatusAvailable(CameraDeviceStatus status) {
+ switch (status) {
+ case CameraDeviceStatus::STATUS_PRESENT:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void CameraManagerGlobal::CallbackHandler::onMessageReceived(
+ const sp<AMessage> &msg) {
+ switch (msg->what()) {
+ case kWhatSendSingleCallback:
+ {
+ ACameraManager_AvailabilityCallback cb;
+ void* context;
+ AString cameraId;
+ bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
+ if (!found) {
+ ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
+ return;
+ }
+ found = msg->findPointer(kContextKey, &context);
+ if (!found) {
+ ALOGE("%s: Cannot find callback context!", __FUNCTION__);
+ return;
+ }
+ found = msg->findString(kCameraIdKey, &cameraId);
+ if (!found) {
+ ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
+ return;
+ }
+ (*cb)(context, cameraId.c_str());
+ break;
+ }
+ default:
+ ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
+ break;
+ }
+}
+
+hardware::Return<void> CameraManagerGlobal::CameraServiceListener::onStatusChanged(
+ const CameraStatusAndId &statusAndId) {
+ sp<CameraManagerGlobal> cm = mCameraManager.promote();
+ if (cm != nullptr) {
+ cm->onStatusChanged(statusAndId);
+ } else {
+ ALOGE("Cannot deliver status change. Global camera manager died");
+ }
+ return Void();
+}
+
+void CameraManagerGlobal::onStatusChanged(
+ const CameraStatusAndId &statusAndId) {
+ Mutex::Autolock _l(mLock);
+ onStatusChangedLocked(statusAndId);
+}
+
+void CameraManagerGlobal::onStatusChangedLocked(
+ const CameraStatusAndId &statusAndId) {
+ hidl_string cameraId = statusAndId.cameraId;
+ CameraDeviceStatus status = statusAndId.deviceStatus;
+ if (!validStatus(status)) {
+ ALOGE("%s: Invalid status %d", __FUNCTION__, status);
+ return;
+ }
+
+ bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
+ CameraDeviceStatus oldStatus = firstStatus ?
+ status : // first status
+ mDeviceStatusMap[cameraId];
+
+ if (!firstStatus &&
+ isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
+ // No status update. No need to send callback
+ return;
+ }
+
+ // Iterate through all registered callbacks
+ mDeviceStatusMap[cameraId] = status;
+ for (auto cb : mCallbacks) {
+ sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
+ ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
+ cb.mAvailable : cb.mUnavailable;
+ msg->setPointer(kCallbackFpKey, (void *) cbFp);
+ msg->setPointer(kContextKey, cb.mContext);
+ msg->setString(kCameraIdKey, AString(cameraId.c_str()));
+ msg->post();
+ }
+ if (status == CameraDeviceStatus::STATUS_NOT_PRESENT) {
+ mDeviceStatusMap.erase(cameraId);
+ }
+}
+
+} // namespace acam
+} // namespace android
+
+/**
+ * ACameraManger Implementation
+ */
+camera_status_t
+ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
+ Mutex::Autolock _l(mLock);
+
+ std::vector<hidl_string> idList;
+ CameraManagerGlobal::getInstance().getCameraIdList(&idList);
+
+ int numCameras = idList.size();
+ ACameraIdList *out = new ACameraIdList;
+ if (!out) {
+ ALOGE("Allocate memory for ACameraIdList failed!");
+ return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
+ }
+ out->numCameras = numCameras;
+ out->cameraIds = new const char*[numCameras];
+ if (!out->cameraIds) {
+ ALOGE("Allocate memory for ACameraIdList failed!");
+ deleteCameraIdList(out);
+ return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
+ }
+ for (int i = 0; i < numCameras; i++) {
+ const char* src = idList[i].c_str();
+ size_t dstSize = strlen(src) + 1;
+ char* dst = new char[dstSize];
+ if (!dst) {
+ ALOGE("Allocate memory for ACameraIdList failed!");
+ deleteCameraIdList(out);
+ return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
+ }
+ strlcpy(dst, src, dstSize);
+ out->cameraIds[i] = dst;
+ }
+ *cameraIdList = out;
+ return ACAMERA_OK;
+}
+
+void
+ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
+ if (cameraIdList != nullptr) {
+ if (cameraIdList->cameraIds != nullptr) {
+ for (int i = 0; i < cameraIdList->numCameras; i ++) {
+ if (cameraIdList->cameraIds[i] != nullptr) {
+ delete[] cameraIdList->cameraIds[i];
+ }
+ }
+ delete[] cameraIdList->cameraIds;
+ }
+ delete cameraIdList;
+ }
+}
+
+camera_status_t ACameraManager::getCameraCharacteristics(
+ const char *cameraIdStr, sp<ACameraMetadata> *characteristics) {
+ Mutex::Autolock _l(mLock);
+
+ sp<ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+ if (cs == nullptr) {
+ ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
+ return ACAMERA_ERROR_CAMERA_DISCONNECTED;
+ }
+ CameraMetadata rawMetadata;
+ Status status = Status::NO_ERROR;
+ auto serviceRet =
+ cs->getCameraCharacteristics(cameraIdStr,
+ [&status, &rawMetadata] (auto s ,
+ const hidl_vec<uint8_t> &metadata) {
+ status = s;
+ if (status == Status::NO_ERROR) {
+ utils::convertFromHidlCloned(metadata, &rawMetadata);
+ }
+ });
+ if (!serviceRet.isOk() || status != Status::NO_ERROR) {
+ ALOGE("Get camera characteristics from camera service failed");
+ return ACAMERA_ERROR_UNKNOWN; // should not reach here
+ }
+
+ *characteristics = new ACameraMetadata(
+ rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
+ return ACAMERA_OK;
+}
+
+camera_status_t
+ACameraManager::openCamera(
+ const char* cameraId,
+ ACameraDevice_StateCallbacks* callback,
+ /*out*/ACameraDevice** outDevice) {
+ sp<ACameraMetadata> rawChars;
+ camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars);
+ Mutex::Autolock _l(mLock);
+ if (ret != ACAMERA_OK) {
+ ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
+ __FUNCTION__, cameraId, ret);
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ }
+
+ ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(rawChars));
+
+ sp<ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+ if (cs == nullptr) {
+ ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
+ delete device;
+ return ACAMERA_ERROR_CAMERA_DISCONNECTED;
+ }
+
+ sp<ICameraDeviceCallback> callbacks = device->getServiceCallback();
+ sp<ICameraDeviceUser> deviceRemote;
+
+ // No way to get package name from native.
+ // Send a zero length package name and let camera service figure it out from UID
+ Status status = Status::NO_ERROR;
+ auto serviceRet = cs->connectDevice(
+ callbacks, cameraId, [&status, &deviceRemote](auto s, auto &device) {
+ status = s;
+ deviceRemote = device;
+ });
+
+ if (!serviceRet.isOk() || status != Status::NO_ERROR) {
+ ALOGE("%s: connect camera device failed", __FUNCTION__);
+ // TODO: Convert serviceRet to camera_status_t
+ delete device;
+ return ACAMERA_ERROR_UNKNOWN;
+ }
+ if (deviceRemote == nullptr) {
+ ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
+ delete device;
+ return ACAMERA_ERROR_CAMERA_DISCONNECTED;
+ }
+ device->setRemoteDevice(deviceRemote);
+ device->setDeviceMetadataQueues();
+ *outDevice = device;
+ return ACAMERA_OK;
+}
+
+ACameraManager::~ACameraManager() {
+
+}
diff --git a/camera/ndk/ndk_vendor/impl/ACameraManager.h b/camera/ndk/ndk_vendor/impl/ACameraManager.h
new file mode 100644
index 0000000..c8d640f
--- /dev/null
+++ b/camera/ndk/ndk_vendor/impl/ACameraManager.h
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ACAMERA_MANAGER_H
+#define _ACAMERA_MANAGER_H
+
+#include <camera/NdkCameraManager.h>
+
+#include <android-base/parseint.h>
+#include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
+
+#include <CameraMetadata.h>
+#include <utils/StrongPointer.h>
+#include <utils/Mutex.h>
+
+#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/AHandler.h>
+#include <media/stagefright/foundation/AMessage.h>
+
+#include <set>
+#include <map>
+
+namespace android {
+namespace acam {
+
+using ICameraService = frameworks::cameraservice::service::V2_0::ICameraService;
+using CameraDeviceStatus = frameworks::cameraservice::service::V2_0::CameraDeviceStatus;
+using ICameraServiceListener = frameworks::cameraservice::service::V2_0::ICameraServiceListener;
+using CameraStatusAndId = frameworks::cameraservice::service::V2_0::CameraStatusAndId;
+using Status = frameworks::cameraservice::common::V2_0::Status;
+using VendorTagSection = frameworks::cameraservice::common::V2_0::VendorTagSection;
+using VendorTag = frameworks::cameraservice::common::V2_0::VendorTag;
+using IBase = android::hidl::base::V1_0::IBase;
+using android::hardware::hidl_string;
+using hardware::Void;
+
+/**
+ * Per-process singleton instance of CameraManger. Shared by all ACameraManager
+ * instances. Created when first ACameraManager is created and destroyed when
+ * all ACameraManager instances are deleted.
+ *
+ * TODO: maybe CameraManagerGlobal is better suited in libcameraclient?
+ */
+class CameraManagerGlobal final : public RefBase {
+ public:
+ static CameraManagerGlobal& getInstance();
+ sp<ICameraService> getCameraService();
+
+ void registerAvailabilityCallback(
+ const ACameraManager_AvailabilityCallbacks *callback);
+ void unregisterAvailabilityCallback(
+ const ACameraManager_AvailabilityCallbacks *callback);
+
+ /**
+ * Return camera IDs that support camera2
+ */
+ void getCameraIdList(std::vector<hidl_string> *cameraIds);
+
+ private:
+ sp<ICameraService> mCameraService;
+ const int kCameraServicePollDelay = 500000; // 0.5s
+ Mutex mLock;
+ class DeathNotifier : public android::hardware::hidl_death_recipient {
+ public:
+ explicit DeathNotifier(CameraManagerGlobal* cm) : mCameraManager(cm) {}
+ protected:
+ // IBinder::DeathRecipient implementation
+ virtual void serviceDied(uint64_t cookie, const wp<IBase> &who);
+ private:
+ const wp<CameraManagerGlobal> mCameraManager;
+ };
+ sp<DeathNotifier> mDeathNotifier;
+
+ class CameraServiceListener final : public ICameraServiceListener {
+ public:
+ explicit CameraServiceListener(CameraManagerGlobal* cm) : mCameraManager(cm) {}
+ android::hardware::Return<void> onStatusChanged(
+ const CameraStatusAndId &statusAndId) override;
+
+ private:
+ const wp<CameraManagerGlobal> mCameraManager;
+ };
+ sp<CameraServiceListener> mCameraServiceListener;
+
+ // Wrapper of ACameraManager_AvailabilityCallbacks so we can store it in std::set
+ struct Callback {
+ explicit Callback(const ACameraManager_AvailabilityCallbacks *callback) :
+ mAvailable(callback->onCameraAvailable),
+ mUnavailable(callback->onCameraUnavailable),
+ mContext(callback->context) {}
+
+ bool operator == (const Callback& other) const {
+ return (mAvailable == other.mAvailable &&
+ mUnavailable == other.mUnavailable &&
+ mContext == other.mContext);
+ }
+ bool operator != (const Callback& other) const {
+ return !(*this == other);
+ }
+ bool operator < (const Callback& other) const {
+ if (*this == other) return false;
+ if (mContext != other.mContext) return mContext < other.mContext;
+ if (mAvailable != other.mAvailable) return mAvailable < other.mAvailable;
+ return mUnavailable < other.mUnavailable;
+ }
+ bool operator > (const Callback& other) const {
+ return (*this != other && !(*this < other));
+ }
+ ACameraManager_AvailabilityCallback mAvailable;
+ ACameraManager_AvailabilityCallback mUnavailable;
+ void* mContext;
+ };
+ std::set<Callback> mCallbacks;
+
+ // definition of handler and message
+ enum {
+ kWhatSendSingleCallback
+ };
+ static const char* kCameraIdKey;
+ static const char* kCallbackFpKey;
+ static const char* kContextKey;
+ class CallbackHandler : public AHandler {
+ public:
+ CallbackHandler() {}
+ void onMessageReceived(const sp<AMessage> &msg) override;
+ };
+ sp<CallbackHandler> mHandler;
+ sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on
+
+ void onStatusChanged(const CameraStatusAndId &statusAndId);
+ void onStatusChangedLocked(const CameraStatusAndId &statusAndId);
+ // Utils for status
+ static bool validStatus(CameraDeviceStatus status);
+ static bool isStatusAvailable(CameraDeviceStatus status);
+
+ // The sort logic must match the logic in
+ // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds
+ struct CameraIdComparator {
+ bool operator()(const hidl_string& a, const hidl_string& b) const {
+ uint32_t aUint = 0, bUint = 0;
+ bool aIsUint = base::ParseUint(a.c_str(), &aUint);
+ bool bIsUint = base::ParseUint(b.c_str(), &bUint);
+
+ // Uint device IDs first
+ if (aIsUint && bIsUint) {
+ return aUint < bUint;
+ } else if (aIsUint) {
+ return true;
+ } else if (bIsUint) {
+ return false;
+ }
+ // Simple string compare if both id are not uint
+ return a < b;
+ }
+ };
+
+ // Map camera_id -> status
+ std::map<hidl_string, CameraDeviceStatus, CameraIdComparator> mDeviceStatusMap;
+
+ // For the singleton instance
+ static Mutex sLock;
+ static CameraManagerGlobal* sInstance;
+ CameraManagerGlobal() {};
+ ~CameraManagerGlobal();
+};
+
+} // namespace acam;
+} // namespace android;
+
+/**
+ * ACameraManager opaque struct definition
+ * Leave outside of android namespace because it's NDK struct
+ */
+struct ACameraManager {
+ ACameraManager() :
+ mGlobalManager(&(android::acam::CameraManagerGlobal::getInstance())) {}
+ ~ACameraManager();
+ camera_status_t getCameraIdList(ACameraIdList** cameraIdList);
+ static void deleteCameraIdList(ACameraIdList* cameraIdList);
+
+ camera_status_t getCameraCharacteristics(
+ const char* cameraId, android::sp<ACameraMetadata>* characteristics);
+
+ camera_status_t openCamera(const char* cameraId,
+ ACameraDevice_StateCallbacks* callback,
+ /*out*/ACameraDevice** device);
+
+ private:
+ enum {
+ kCameraIdListNotInit = -1
+ };
+ android::Mutex mLock;
+ android::sp<android::acam::CameraManagerGlobal> mGlobalManager;
+};
+
+#endif //_ACAMERA_MANAGER_H
diff --git a/camera/ndk/ndk_vendor/impl/ACaptureRequestVendor.h b/camera/ndk/ndk_vendor/impl/ACaptureRequestVendor.h
new file mode 100644
index 0000000..ed67615
--- /dev/null
+++ b/camera/ndk/ndk_vendor/impl/ACaptureRequestVendor.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "utils.h"
+
+struct ACameraOutputTarget {
+ explicit ACameraOutputTarget(native_handle_t* window) : mWindow(window) {};
+
+ bool operator == (const ACameraOutputTarget& other) const {
+ return mWindow == other.mWindow;
+ }
+ bool operator != (const ACameraOutputTarget& other) const {
+ return mWindow != other.mWindow;
+ }
+ bool operator < (const ACameraOutputTarget& other) const {
+ return mWindow < other.mWindow;
+ }
+ bool operator > (const ACameraOutputTarget& other) const {
+ return mWindow > other.mWindow;
+ }
+
+ android::acam::utils::native_handle_ptr_wrapper mWindow;
+};
diff --git a/camera/ndk/ndk_vendor/impl/utils.cpp b/camera/ndk/ndk_vendor/impl/utils.cpp
new file mode 100644
index 0000000..7193006
--- /dev/null
+++ b/camera/ndk/ndk_vendor/impl/utils.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "ACameraVendorUtils"
+
+#include <utils/Log.h>
+
+#include "utils.h"
+
+namespace android {
+namespace acam {
+namespace utils {
+
+// Convert CaptureRequest wrappable by sp<> to hidl CaptureRequest.
+frameworks::cameraservice::device::V2_0::CaptureRequest
+convertToHidl(const CaptureRequest *captureRequest) {
+ frameworks::cameraservice::device::V2_0::CaptureRequest hCaptureRequest;
+ hCaptureRequest.physicalCameraSettings = captureRequest->mCaptureRequest.physicalCameraSettings;
+ hCaptureRequest.streamAndWindowIds = captureRequest->mCaptureRequest.streamAndWindowIds;
+ return hCaptureRequest;
+}
+
+HRotation convertToHidl(int rotation) {
+ HRotation hRotation = HRotation::R0;
+ switch(rotation) {
+ case CAMERA3_STREAM_ROTATION_90:
+ hRotation = HRotation::R90;
+ break;
+ case CAMERA3_STREAM_ROTATION_180:
+ hRotation = HRotation::R180;
+ break;
+ case CAMERA3_STREAM_ROTATION_270:
+ hRotation = HRotation::R270;
+ break;
+ default:
+ break;
+ }
+ return hRotation;
+}
+
+bool convertFromHidlCloned(const HCameraMetadata &metadata, CameraMetadata *rawMetadata) {
+ const camera_metadata *buffer = (camera_metadata_t*)(metadata.data());
+ size_t expectedSize = metadata.size();
+ int ret = validate_camera_metadata_structure(buffer, &expectedSize);
+ if (ret == OK || ret == CAMERA_METADATA_VALIDATION_SHIFTED) {
+ *rawMetadata = buffer;
+ } else {
+ ALOGE("%s: Malformed camera metadata received from caller", __FUNCTION__);
+ return false;
+ }
+ return true;
+}
+
+// Note: existing data in dst will be gone. Caller still owns the memory of src
+void convertToHidl(const camera_metadata_t *src, HCameraMetadata* dst) {
+ if (src == nullptr) {
+ return;
+ }
+ size_t size = get_camera_metadata_size(src);
+ ALOGE("Converting metadata size: %d", (int)size);
+ dst->setToExternal((uint8_t *) src, size);
+ return;
+}
+
+TemplateId convertToHidl(ACameraDevice_request_template templateId) {
+ switch(templateId) {
+ case TEMPLATE_STILL_CAPTURE:
+ return TemplateId::STILL_CAPTURE;
+ case TEMPLATE_RECORD:
+ return TemplateId::RECORD;
+ case TEMPLATE_VIDEO_SNAPSHOT:
+ return TemplateId::VIDEO_SNAPSHOT;
+ case TEMPLATE_ZERO_SHUTTER_LAG:
+ return TemplateId::ZERO_SHUTTER_LAG;
+ case TEMPLATE_MANUAL:
+ return TemplateId::MANUAL;
+ default:
+ return TemplateId::PREVIEW;
+ }
+}
+
+camera_status_t convertFromHidl(Status status) {
+ camera_status_t ret = ACAMERA_OK;
+ switch(status) {
+ case Status::NO_ERROR:
+ break;
+ case Status::DISCONNECTED:
+ ret = ACAMERA_ERROR_CAMERA_DISCONNECTED;
+ break;
+ case Status::CAMERA_IN_USE:
+ ret = ACAMERA_ERROR_CAMERA_IN_USE;
+ break;
+ case Status::MAX_CAMERAS_IN_USE:
+ ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE;
+ break;
+ case Status::ILLEGAL_ARGUMENT:
+ ret = ACAMERA_ERROR_INVALID_PARAMETER;
+ break;
+ case Status::DEPRECATED_HAL:
+ // Should not reach here since we filtered legacy HALs earlier
+ ret = ACAMERA_ERROR_INVALID_PARAMETER;
+ break;
+ case Status::DISABLED:
+ ret = ACAMERA_ERROR_CAMERA_DISABLED;
+ break;
+ case Status::PERMISSION_DENIED:
+ ret = ACAMERA_ERROR_PERMISSION_DENIED;
+ break;
+ case Status::INVALID_OPERATION:
+ ret = ACAMERA_ERROR_INVALID_OPERATION;
+ break;
+ default:
+ ret = ACAMERA_ERROR_UNKNOWN;
+ break;
+ }
+ return ret;
+}
+
+bool isWindowNativeHandleEqual(const native_handle_t *nh1, const native_handle_t *nh2) {
+ if (nh1->numFds !=0 || nh2->numFds !=0) {
+ ALOGE("Invalid window native handles being compared");
+ return false;
+ }
+ if (nh1->version != nh2->version || nh1->numFds != nh2->numFds ||
+ nh1->numInts != nh2->numInts) {
+ return false;
+ }
+ for (int i = 0; i < nh1->numInts; i++) {
+ if(nh1->data[i] != nh2->data[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool isWindowNativeHandleLessThan(const native_handle_t *nh1, const native_handle_t *nh2) {
+ if (isWindowNativeHandleEqual(nh1, nh2)) {
+ return false;
+ }
+ if (nh1->numInts != nh2->numInts) {
+ return nh1->numInts < nh2->numInts;
+ }
+
+ for (int i = 0; i < nh1->numInts; i++) {
+ if (nh1->data[i] != nh2->data[i]) {
+ return nh1->data[i] < nh2->data[i];
+ }
+ }
+ return false;
+}
+
+bool isWindowNativeHandleGreaterThan(const native_handle_t *nh1, const native_handle_t *nh2) {
+ return !isWindowNativeHandleLessThan(nh1, nh2) && !isWindowNativeHandleEqual(nh1, nh2);
+}
+
+bool areWindowNativeHandlesEqual(hidl_vec<hidl_handle> handles1, hidl_vec<hidl_handle> handles2) {
+ if (handles1.size() != handles2.size()) {
+ return false;
+ }
+ for (int i = 0; i < handles1.size(); i++) {
+ if (!isWindowNativeHandleEqual(handles1[i], handles2[i])) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool areWindowNativeHandlesLessThan(hidl_vec<hidl_handle> handles1, hidl_vec<hidl_handle>handles2) {
+ if (handles1.size() != handles2.size()) {
+ return handles1.size() < handles2.size();
+ }
+ for (int i = 0; i < handles1.size(); i++) {
+ const native_handle_t *handle1 = handles1[i].getNativeHandle();
+ const native_handle_t *handle2 = handles2[i].getNativeHandle();
+ if (!isWindowNativeHandleEqual(handle1, handle2)) {
+ return isWindowNativeHandleLessThan(handle1, handle2);
+ }
+ }
+ return false;
+}
+
+} // namespace utils
+} // namespace acam
+} // namespace android
diff --git a/camera/ndk/ndk_vendor/impl/utils.h b/camera/ndk/ndk_vendor/impl/utils.h
new file mode 100644
index 0000000..2f1006d
--- /dev/null
+++ b/camera/ndk/ndk_vendor/impl/utils.h
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
+#include <android/frameworks/cameraservice/device/2.0/ICameraDeviceUser.h>
+#include <android/frameworks/cameraservice/device/2.0/types.h>
+#include <camera/NdkCameraDevice.h>
+#include <CameraMetadata.h>
+#include <hardware/camera3.h>
+
+#ifndef CAMERA_NDK_VENDOR_H
+#define CAMERA_NDK_VENDOR_H
+
+using android::hardware::hidl_vec;
+using android::hardware::hidl_handle;
+
+namespace android {
+namespace acam {
+namespace utils {
+
+using CameraMetadata = hardware::camera::common::V1_0::helper::CameraMetadata;
+using HCameraMetadata = frameworks::cameraservice::service::V2_0::CameraMetadata;
+using Status = frameworks::cameraservice::common::V2_0::Status;
+using TemplateId = frameworks::cameraservice::device::V2_0::TemplateId;
+using PhysicalCameraSettings = frameworks::cameraservice::device::V2_0::PhysicalCameraSettings;
+using HRotation = frameworks::cameraservice::device::V2_0::OutputConfiguration::Rotation;
+using OutputConfiguration = frameworks::cameraservice::device::V2_0::OutputConfiguration;
+
+// Utility class so that CaptureRequest can be stored by sp<>
+struct CaptureRequest : public RefBase {
+ frameworks::cameraservice::device::V2_0::CaptureRequest mCaptureRequest;
+ std::vector<native_handle_t *> mSurfaceList;
+ //Physical camera settings metadata is stored here, since the capture request
+ //might not contain it. That's since, fmq might have consumed it.
+ hidl_vec<PhysicalCameraSettings> mPhysicalCameraSettings;
+};
+
+bool areWindowNativeHandlesEqual(hidl_vec<hidl_handle> handles1, hidl_vec<hidl_handle>handles2);
+
+bool areWindowNativeHandlesLessThan(hidl_vec<hidl_handle> handles1, hidl_vec<hidl_handle>handles2);
+
+bool isWindowNativeHandleEqual(const native_handle_t *nh1, const native_handle_t *nh2);
+
+bool isWindowNativeHandleLessThan(const native_handle_t *nh1, const native_handle_t *nh2);
+
+// Convenience wrapper over isWindowNativeHandleLessThan and isWindowNativeHandleEqual
+bool isWindowNativeHandleGreaterThan(const native_handle_t *nh1, const native_handle_t *nh2);
+
+// Utility class so the native_handle_t can be compared with its contents instead
+// of just raw pointer comparisons.
+struct native_handle_ptr_wrapper {
+ native_handle_t *mWindow = nullptr;
+
+ native_handle_ptr_wrapper(native_handle_t *nh) : mWindow(nh) { }
+
+ native_handle_ptr_wrapper() = default;
+
+ operator native_handle_t *() const { return mWindow; }
+
+ bool operator ==(const native_handle_ptr_wrapper other) const {
+ return isWindowNativeHandleEqual(mWindow, other.mWindow);
+ }
+
+ bool operator != (const native_handle_ptr_wrapper& other) const {
+ return !isWindowNativeHandleEqual(mWindow, other.mWindow);
+ }
+
+ bool operator < (const native_handle_ptr_wrapper& other) const {
+ return isWindowNativeHandleLessThan(mWindow, other.mWindow);
+ }
+
+ bool operator > (const native_handle_ptr_wrapper& other) const {
+ return !isWindowNativeHandleGreaterThan(mWindow, other.mWindow);
+ }
+
+};
+
+// Wrapper around OutputConfiguration. This is needed since HIDL
+// OutputConfiguration is auto-generated and marked final. Therefore, operator
+// overloads outside the class, will not get picked by clang while trying to
+// store OutputConfiguration in maps/sets.
+struct OutputConfigurationWrapper {
+ OutputConfiguration mOutputConfiguration;
+
+ operator const OutputConfiguration &() const {
+ return mOutputConfiguration;
+ }
+
+ OutputConfigurationWrapper() = default;
+
+ OutputConfigurationWrapper(OutputConfiguration &outputConfiguration)
+ : mOutputConfiguration((outputConfiguration)) { }
+
+ bool operator ==(const OutputConfiguration &other) const {
+ const OutputConfiguration &self = mOutputConfiguration;
+ return self.rotation == other.rotation && self.windowGroupId == other.windowGroupId &&
+ self.physicalCameraId == other.physicalCameraId && self.width == other.width &&
+ self.height == other.height && self.isDeferred == other.isDeferred &&
+ areWindowNativeHandlesEqual(self.windowHandles, other.windowHandles);
+ }
+
+ bool operator < (const OutputConfiguration &other) const {
+ if (*this == other) {
+ return false;
+ }
+ const OutputConfiguration &self = mOutputConfiguration;
+ if (self.windowGroupId != other.windowGroupId) {
+ return self.windowGroupId < other.windowGroupId;
+ }
+
+ if (self.width != other.width) {
+ return self.width < other.width;
+ }
+
+ if (self.height != other.height) {
+ return self.height < other.height;
+ }
+
+ if (self.rotation != other.rotation) {
+ return static_cast<uint32_t>(self.rotation) < static_cast<uint32_t>(other.rotation);
+ }
+
+ if (self.isDeferred != other.isDeferred) {
+ return self.isDeferred < other.isDeferred;
+ }
+
+ if (self.physicalCameraId != other.physicalCameraId) {
+ return self.physicalCameraId < other.physicalCameraId;
+ }
+ return areWindowNativeHandlesLessThan(self.windowHandles, other.windowHandles);
+ }
+
+ bool operator != (const OutputConfiguration &other) const {
+ return !(*this == other);
+ }
+
+ bool operator > (const OutputConfiguration &other) const {
+ return (*this != other) && !(*this < other);
+ }
+};
+
+// Convert CaptureRequest wrappable by sp<> to hidl CaptureRequest.
+frameworks::cameraservice::device::V2_0::CaptureRequest convertToHidl(
+ const CaptureRequest *captureRequest);
+
+HRotation convertToHidl(int rotation);
+
+bool convertFromHidlCloned(const HCameraMetadata &metadata, CameraMetadata *rawMetadata);
+
+// Note: existing data in dst will be gone. Caller still owns the memory of src
+void convertToHidl(const camera_metadata_t *src, HCameraMetadata* dst);
+
+TemplateId convertToHidl(ACameraDevice_request_template templateId);
+
+camera_status_t convertFromHidl(Status status);
+
+} // namespace utils
+} // namespace acam
+} // namespace android
+
+#endif // CAMERA_NDK_VENDOR_H
diff --git a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp
new file mode 100644
index 0000000..579412e
--- /dev/null
+++ b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp
@@ -0,0 +1,559 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "AImageReaderVendorTest"
+//#define LOG_NDEBUG 0
+
+#include <stdint.h>
+#include <unistd.h>
+#include <gtest/gtest.h>
+
+#include <algorithm>
+#include <mutex>
+#include <string>
+#include <vector>
+#include <stdio.h>
+#include <stdio.h>
+#include <stdio.h>
+
+#include <android/log.h>
+#include <camera/NdkCameraError.h>
+#include <camera/NdkCameraManager.h>
+#include <camera/NdkCameraDevice.h>
+#include <camera/NdkCameraCaptureSession.h>
+#include <media/NdkImage.h>
+#include <media/NdkImageReader.h>
+#include <cutils/native_handle.h>
+
+//#define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
+//#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
+#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
+#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
+
+namespace {
+
+static constexpr int kDummyFenceFd = -1;
+static constexpr int kCaptureWaitUs = 100 * 1000;
+static constexpr int kCaptureWaitRetry = 10;
+static constexpr int kTestImageWidth = 640;
+static constexpr int kTestImageHeight = 480;
+static constexpr int kTestImageFormat = AIMAGE_FORMAT_YUV_420_888;
+
+class CameraHelper {
+ public:
+ CameraHelper(native_handle_t* imgReaderAnw) : mImgReaderAnw(imgReaderAnw) {}
+ ~CameraHelper() { closeCamera(); }
+
+ int initCamera() {
+ if (mImgReaderAnw == nullptr) {
+ ALOGE("Cannot initialize camera before image reader get initialized.");
+ return -1;
+ }
+ int ret;
+
+ mCameraManager = ACameraManager_create();
+ if (mCameraManager == nullptr) {
+ ALOGE("Failed to create ACameraManager.");
+ return -1;
+ }
+
+ ret = ACameraManager_getCameraIdList(mCameraManager, &mCameraIdList);
+ if (ret != AMEDIA_OK) {
+ ALOGE("Failed to get cameraIdList: ret=%d", ret);
+ return ret;
+ }
+ if (mCameraIdList->numCameras < 1) {
+ ALOGW("Device has no camera on board.");
+ return 0;
+ }
+
+ // We always use the first camera.
+ mCameraId = mCameraIdList->cameraIds[0];
+ if (mCameraId == nullptr) {
+ ALOGE("Failed to get cameraId.");
+ return -1;
+ }
+
+ ret = ACameraManager_openCamera(mCameraManager, mCameraId, &mDeviceCb, &mDevice);
+ if (ret != AMEDIA_OK || mDevice == nullptr) {
+ ALOGE("Failed to open camera, ret=%d, mDevice=%p.", ret, mDevice);
+ return -1;
+ }
+
+ ret = ACameraManager_getCameraCharacteristics(mCameraManager, mCameraId, &mCameraMetadata);
+ if (ret != ACAMERA_OK || mCameraMetadata == nullptr) {
+ ALOGE("Get camera %s characteristics failure. ret %d, metadata %p", mCameraId, ret,
+ mCameraMetadata);
+ return -1;
+ }
+
+ if (!isCapabilitySupported(ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE)) {
+ ALOGW("Camera does not support BACKWARD_COMPATIBLE.");
+ return 0;
+ }
+
+ // Create capture session
+ ret = ACaptureSessionOutputContainer_create(&mOutputs);
+ if (ret != AMEDIA_OK) {
+ ALOGE("ACaptureSessionOutputContainer_create failed, ret=%d", ret);
+ return ret;
+ }
+ ret = ACaptureSessionOutput_create(mImgReaderAnw, &mImgReaderOutput);
+ if (ret != AMEDIA_OK) {
+ ALOGE("ACaptureSessionOutput_create failed, ret=%d", ret);
+ return ret;
+ }
+ ret = ACaptureSessionOutputContainer_add(mOutputs, mImgReaderOutput);
+ if (ret != AMEDIA_OK) {
+ ALOGE("ACaptureSessionOutputContainer_add failed, ret=%d", ret);
+ return ret;
+ }
+ ret = ACameraDevice_createCaptureSession(mDevice, mOutputs, &mSessionCb, &mSession);
+ if (ret != AMEDIA_OK) {
+ ALOGE("ACameraDevice_createCaptureSession failed, ret=%d", ret);
+ return ret;
+ }
+
+ // Create capture request
+ ret = ACameraDevice_createCaptureRequest(mDevice, TEMPLATE_STILL_CAPTURE, &mStillRequest);
+ if (ret != AMEDIA_OK) {
+ ALOGE("ACameraDevice_createCaptureRequest failed, ret=%d", ret);
+ return ret;
+ }
+ ret = ACameraOutputTarget_create(mImgReaderAnw, &mReqImgReaderOutput);
+ if (ret != AMEDIA_OK) {
+ ALOGE("ACameraOutputTarget_create failed, ret=%d", ret);
+ return ret;
+ }
+ ret = ACaptureRequest_addTarget(mStillRequest, mReqImgReaderOutput);
+ if (ret != AMEDIA_OK) {
+ ALOGE("ACaptureRequest_addTarget failed, ret=%d", ret);
+ return ret;
+ }
+
+ mIsCameraReady = true;
+ return 0;
+ }
+
+ bool isCapabilitySupported(acamera_metadata_enum_android_request_available_capabilities_t cap) {
+ ACameraMetadata_const_entry entry;
+ ACameraMetadata_getConstEntry(
+ mCameraMetadata, ACAMERA_REQUEST_AVAILABLE_CAPABILITIES, &entry);
+ for (uint32_t i = 0; i < entry.count; i++) {
+ if (entry.data.u8[i] == cap) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool isCameraReady() { return mIsCameraReady; }
+
+ void closeCamera() {
+ // Destroy capture request
+ if (mReqImgReaderOutput) {
+ ACameraOutputTarget_free(mReqImgReaderOutput);
+ mReqImgReaderOutput = nullptr;
+ }
+ if (mStillRequest) {
+ ACaptureRequest_free(mStillRequest);
+ mStillRequest = nullptr;
+ }
+ // Destroy capture session
+ if (mSession != nullptr) {
+ ACameraCaptureSession_close(mSession);
+ mSession = nullptr;
+ }
+ if (mImgReaderOutput) {
+ ACaptureSessionOutput_free(mImgReaderOutput);
+ mImgReaderOutput = nullptr;
+ }
+ if (mOutputs) {
+ ACaptureSessionOutputContainer_free(mOutputs);
+ mOutputs = nullptr;
+ }
+ // Destroy camera device
+ if (mDevice) {
+ ACameraDevice_close(mDevice);
+ mDevice = nullptr;
+ }
+ if (mCameraMetadata) {
+ ACameraMetadata_free(mCameraMetadata);
+ mCameraMetadata = nullptr;
+ }
+ // Destroy camera manager
+ if (mCameraIdList) {
+ ACameraManager_deleteCameraIdList(mCameraIdList);
+ mCameraIdList = nullptr;
+ }
+ if (mCameraManager) {
+ ACameraManager_delete(mCameraManager);
+ mCameraManager = nullptr;
+ }
+ mIsCameraReady = false;
+ }
+
+ int takePicture() {
+ int seqId;
+ return ACameraCaptureSession_capture(mSession, &mCaptureCallbacks, 1, &mStillRequest,
+ &seqId);
+ }
+
+ bool checkCallbacks(int pictureCount) {
+ std::lock_guard<std::mutex> lock(mMutex);
+ if (mCompletedCaptureCallbackCount != pictureCount) {
+ ALOGE("Completed capture callaback count not as expected. expected %d actual %d",
+ pictureCount, mCompletedCaptureCallbackCount);
+ return false;
+ }
+ return true;
+ }
+
+ static void onDeviceDisconnected(void* /*obj*/, ACameraDevice* /*device*/) {}
+
+ static void onDeviceError(void* /*obj*/, ACameraDevice* /*device*/, int /*errorCode*/) {}
+
+ static void onSessionClosed(void* /*obj*/, ACameraCaptureSession* /*session*/) {}
+
+ static void onSessionReady(void* /*obj*/, ACameraCaptureSession* /*session*/) {}
+
+ static void onSessionActive(void* /*obj*/, ACameraCaptureSession* /*session*/) {}
+
+ private:
+ ACameraDevice_StateCallbacks mDeviceCb{this, onDeviceDisconnected,
+ onDeviceError};
+ ACameraCaptureSession_stateCallbacks mSessionCb{
+ this, onSessionClosed, onSessionReady, onSessionActive};
+
+ native_handle_t* mImgReaderAnw = nullptr; // not owned by us.
+
+ // Camera manager
+ ACameraManager* mCameraManager = nullptr;
+ ACameraIdList* mCameraIdList = nullptr;
+ // Camera device
+ ACameraMetadata* mCameraMetadata = nullptr;
+ ACameraDevice* mDevice = nullptr;
+ // Capture session
+ ACaptureSessionOutputContainer* mOutputs = nullptr;
+ ACaptureSessionOutput* mImgReaderOutput = nullptr;
+ ACameraCaptureSession* mSession = nullptr;
+ // Capture request
+ ACaptureRequest* mStillRequest = nullptr;
+ ACameraOutputTarget* mReqImgReaderOutput = nullptr;
+
+ bool mIsCameraReady = false;
+ const char* mCameraId;
+ int mCompletedCaptureCallbackCount = 0;
+ std::mutex mMutex;
+ ACameraCaptureSession_captureCallbacks mCaptureCallbacks = {
+ // TODO: Add tests for other callbacks
+ this, // context
+ nullptr, // onCaptureStarted
+ nullptr, // onCaptureProgressed
+ // onCaptureCompleted, called serially, so no lock needed.
+ [](void* ctx , ACameraCaptureSession *, ACaptureRequest *,
+ const ACameraMetadata *) {
+ CameraHelper *ch = static_cast<CameraHelper *>(ctx);
+ std::lock_guard<std::mutex> lock(ch->mMutex);
+ ch->mCompletedCaptureCallbackCount++;
+ },
+ nullptr, // onCaptureFailed
+ nullptr, // onCaptureSequenceCompleted
+ nullptr, // onCaptureSequenceAborted
+ nullptr, // onCaptureBufferLost
+ };
+
+};
+
+class ImageReaderTestCase {
+ public:
+ ImageReaderTestCase(int32_t width,
+ int32_t height,
+ int32_t format,
+ uint64_t usage,
+ int32_t maxImages,
+ bool async)
+ : mWidth(width),
+ mHeight(height),
+ mFormat(format),
+ mUsage(usage),
+ mMaxImages(maxImages),
+ mAsync(async) {}
+
+ ~ImageReaderTestCase() {
+ if (mImgReaderAnw) {
+ AImageReader_delete(mImgReader);
+ // No need to call native_handle_t_release on imageReaderAnw
+ }
+ }
+
+ int initImageReader() {
+ if (mImgReader != nullptr || mImgReaderAnw != nullptr) {
+ ALOGE("Cannot re-initalize image reader, mImgReader=%p, mImgReaderAnw=%p", mImgReader,
+ mImgReaderAnw);
+ return -1;
+ }
+
+ media_status_t ret = AImageReader_newWithUsage(
+ mWidth, mHeight, mFormat, mUsage, mMaxImages, &mImgReader);
+ if (ret != AMEDIA_OK || mImgReader == nullptr) {
+ ALOGE("Failed to create new AImageReader, ret=%d, mImgReader=%p", ret, mImgReader);
+ return -1;
+ }
+
+ ret = AImageReader_setImageListener(mImgReader, &mReaderAvailableCb);
+ if (ret != AMEDIA_OK) {
+ ALOGE("Failed to set image available listener, ret=%d.", ret);
+ return ret;
+ }
+
+ ret = AImageReader_setBufferRemovedListener(mImgReader, &mReaderDetachedCb);
+ if (ret != AMEDIA_OK) {
+ ALOGE("Failed to set buffer detaching listener, ret=%d.", ret);
+ return ret;
+ }
+
+ ret = AImageReader_getWindowNativeHandle(mImgReader, &mImgReaderAnw);
+ if (ret != AMEDIA_OK || mImgReaderAnw == nullptr) {
+ ALOGE("Failed to get native_handle_t from AImageReader, ret=%d, mImgReaderAnw=%p.", ret,
+ mImgReaderAnw);
+ return -1;
+ }
+
+ return 0;
+ }
+
+ native_handle_t* getNativeWindow() { return mImgReaderAnw; }
+
+ int getAcquiredImageCount() {
+ std::lock_guard<std::mutex> lock(mMutex);
+ return mAcquiredImageCount;
+ }
+
+ void HandleImageAvailable(AImageReader* reader) {
+ std::lock_guard<std::mutex> lock(mMutex);
+
+ AImage* outImage = nullptr;
+ media_status_t ret;
+
+ // Make sure AImage will be deleted automatically when it goes out of
+ // scope.
+ auto imageDeleter = [this](AImage* img) {
+ if (mAsync) {
+ AImage_deleteAsync(img, kDummyFenceFd);
+ } else {
+ AImage_delete(img);
+ }
+ };
+ std::unique_ptr<AImage, decltype(imageDeleter)> img(nullptr, imageDeleter);
+
+ if (mAsync) {
+ int outFenceFd = 0;
+ // Verity that outFenceFd's value will be changed by
+ // AImageReader_acquireNextImageAsync.
+ ret = AImageReader_acquireNextImageAsync(reader, &outImage, &outFenceFd);
+ if (ret != AMEDIA_OK || outImage == nullptr || outFenceFd == 0) {
+ ALOGE("Failed to acquire image, ret=%d, outIamge=%p, outFenceFd=%d.", ret, outImage,
+ outFenceFd);
+ return;
+ }
+ img.reset(outImage);
+ } else {
+ ret = AImageReader_acquireNextImage(reader, &outImage);
+ if (ret != AMEDIA_OK || outImage == nullptr) {
+ ALOGE("Failed to acquire image, ret=%d, outIamge=%p.", ret, outImage);
+ return;
+ }
+ img.reset(outImage);
+ }
+
+ AHardwareBuffer* outBuffer = nullptr;
+ ret = AImage_getHardwareBuffer(img.get(), &outBuffer);
+ if (ret != AMEDIA_OK || outBuffer == nullptr) {
+ ALOGE("Faild to get hardware buffer, ret=%d, outBuffer=%p.", ret, outBuffer);
+ return;
+ }
+
+ // No need to release AHardwareBuffer, since we don't acquire additional
+ // reference to it.
+ AHardwareBuffer_Desc outDesc;
+ AHardwareBuffer_describe(outBuffer, &outDesc);
+ int32_t imageWidth = 0;
+ int32_t imageHeight = 0;
+ int32_t bufferWidth = static_cast<int32_t>(outDesc.width);
+ int32_t bufferHeight = static_cast<int32_t>(outDesc.height);
+
+ AImage_getWidth(outImage, &imageWidth);
+ AImage_getHeight(outImage, &imageHeight);
+ if (imageWidth != mWidth || imageHeight != mHeight) {
+ ALOGE("Mismatched output image dimension: expected=%dx%d, actual=%dx%d", mWidth,
+ mHeight, imageWidth, imageHeight);
+ return;
+ }
+
+ if (mFormat == AIMAGE_FORMAT_RGBA_8888 ||
+ mFormat == AIMAGE_FORMAT_RGBX_8888 ||
+ mFormat == AIMAGE_FORMAT_RGB_888 ||
+ mFormat == AIMAGE_FORMAT_RGB_565 ||
+ mFormat == AIMAGE_FORMAT_RGBA_FP16 ||
+ mFormat == AIMAGE_FORMAT_YUV_420_888 ||
+ mFormat == AIMAGE_FORMAT_Y8) {
+ // Check output buffer dimension for certain formats. Don't do this for blob based
+ // formats.
+ if (bufferWidth != mWidth || bufferHeight != mHeight) {
+ ALOGE("Mismatched output buffer dimension: expected=%dx%d, actual=%dx%d", mWidth,
+ mHeight, bufferWidth, bufferHeight);
+ return;
+ }
+ }
+
+ if ((outDesc.usage & mUsage) != mUsage) {
+ ALOGE("Mismatched output buffer usage: actual (%" PRIu64 "), expected (%" PRIu64 ")",
+ outDesc.usage, mUsage);
+ return;
+ }
+
+ uint8_t* data = nullptr;
+ int dataLength = 0;
+ ret = AImage_getPlaneData(img.get(), 0, &data, &dataLength);
+ if (mUsage & AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN) {
+ // When we have CPU_READ_OFTEN usage bits, we can lock the image.
+ if (ret != AMEDIA_OK || data == nullptr || dataLength < 0) {
+ ALOGE("Failed to access CPU data, ret=%d, data=%p, dataLength=%d", ret, data,
+ dataLength);
+ return;
+ }
+ } else {
+ if (ret != AMEDIA_IMGREADER_CANNOT_LOCK_IMAGE || data != nullptr || dataLength != 0) {
+ ALOGE("Shouldn't be able to access CPU data, ret=%d, data=%p, dataLength=%d", ret,
+ data, dataLength);
+ return;
+ }
+ }
+ // Only increase mAcquiredImageCount if all checks pass.
+ mAcquiredImageCount++;
+ }
+
+ static void onImageAvailable(void* obj, AImageReader* reader) {
+ ImageReaderTestCase* thiz = reinterpret_cast<ImageReaderTestCase*>(obj);
+ thiz->HandleImageAvailable(reader);
+ }
+
+ static void
+ onBufferRemoved(void* /*obj*/, AImageReader* /*reader*/, AHardwareBuffer* /*buffer*/) {
+ // No-op, just to check the listener can be set properly.
+ }
+
+ private:
+ int32_t mWidth;
+ int32_t mHeight;
+ int32_t mFormat;
+ uint64_t mUsage;
+ int32_t mMaxImages;
+ bool mAsync;
+
+ std::mutex mMutex;
+ int mAcquiredImageCount{0};
+
+ AImageReader* mImgReader = nullptr;
+ native_handle_t* mImgReaderAnw = nullptr;
+
+ AImageReader_ImageListener mReaderAvailableCb{this, onImageAvailable};
+ AImageReader_BufferRemovedListener mReaderDetachedCb{this, onBufferRemoved};
+};
+
+bool takePictures(uint64_t readerUsage, int readerMaxImages, bool readerAsync, int pictureCount) {
+ int ret = 0;
+ ImageReaderTestCase testCase(
+ kTestImageWidth, kTestImageHeight, kTestImageFormat, readerUsage, readerMaxImages,
+ readerAsync);
+ ret = testCase.initImageReader();
+ if (ret < 0) {
+ ALOGE("Unable to initialize ImageReader");
+ return false;
+ }
+
+ CameraHelper cameraHelper(testCase.getNativeWindow());
+ ret = cameraHelper.initCamera();
+ if (ret < 0) {
+ ALOGE("Unable to initialize camera helper");
+ return false;
+ }
+
+ if (!cameraHelper.isCameraReady()) {
+ ALOGW("Camera is not ready after successful initialization. It's either due to camera on "
+ "board lacks BACKWARDS_COMPATIBLE capability or the device does not have camera on "
+ "board.");
+ return true;
+ }
+
+ for (int i = 0; i < pictureCount; i++) {
+ ret = cameraHelper.takePicture();
+ if (ret < 0) {
+ ALOGE("Unable to take picture");
+ return false;
+ }
+ }
+
+ // Sleep until all capture finished
+ for (int i = 0; i < kCaptureWaitRetry * pictureCount; i++) {
+ usleep(kCaptureWaitUs);
+ if (testCase.getAcquiredImageCount() == pictureCount) {
+ ALOGI("Session take ~%d ms to capture %d images", i * kCaptureWaitUs / 1000,
+ pictureCount);
+ break;
+ }
+ }
+ return testCase.getAcquiredImageCount() == pictureCount &&
+ cameraHelper.checkCallbacks(pictureCount);
+}
+
+class AImageReaderWindowHandleTest : public ::testing::Test {
+ public:
+ void SetUp() override {
+ }
+ void TearDown() override {
+
+ }
+
+};
+
+bool testTakePicturesNative() {
+ for (auto& readerUsage :
+ {AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN}) {
+ for (auto& readerMaxImages : {1, 4, 8}) {
+ for (auto& readerAsync : {true, false}) {
+ for (auto& pictureCount : {1, 4, 8}) {
+ if (!takePictures(readerUsage, readerMaxImages, readerAsync, pictureCount)) {
+ ALOGE("Test takePictures failed for test case usage=%" PRIu64 ", maxImages=%d, "
+ "async=%d, pictureCount=%d",
+ readerUsage, readerMaxImages, readerAsync, pictureCount);
+ return false;
+ }
+ }
+ }
+ }
+ }
+ return true;
+}
+
+
+TEST_F(AImageReaderWindowHandleTest, CreateWindowNativeHandle) {
+ EXPECT_TRUE(testTakePicturesNative());
+}
+
+} // namespace
diff --git a/cmds/screenrecord/screenrecord.cpp b/cmds/screenrecord/screenrecord.cpp
index 7d3fbea..7803ccc 100644
--- a/cmds/screenrecord/screenrecord.cpp
+++ b/cmds/screenrecord/screenrecord.cpp
@@ -191,7 +191,7 @@
format->setFloat("frame-rate", displayFps);
format->setInt32("i-frame-interval", 10);
- sp<ALooper> looper = new ALooper;
+ sp<android::ALooper> looper = new android::ALooper;
looper->setName("screenrecord_looper");
looper->start();
ALOGV("Creating codec");
diff --git a/cmds/stagefright/codec.cpp b/cmds/stagefright/codec.cpp
index 980d1d2..a463ec5 100644
--- a/cmds/stagefright/codec.cpp
+++ b/cmds/stagefright/codec.cpp
@@ -138,7 +138,7 @@
CHECK(!stateByTrack.isEmpty());
- int64_t startTimeUs = ALooper::GetNowUs();
+ int64_t startTimeUs = android::ALooper::GetNowUs();
int64_t startTimeRender = -1;
for (size_t i = 0; i < stateByTrack.size(); ++i) {
@@ -307,7 +307,7 @@
}
}
- int64_t elapsedTimeUs = ALooper::GetNowUs() - startTimeUs;
+ int64_t elapsedTimeUs = android::ALooper::GetNowUs() - startTimeUs;
for (size_t i = 0; i < stateByTrack.size(); ++i) {
CodecState *state = &stateByTrack.editValueAt(i);
@@ -400,7 +400,7 @@
ProcessState::self()->startThreadPool();
- sp<ALooper> looper = new ALooper;
+ sp<android::ALooper> looper = new android::ALooper;
looper->start();
sp<SurfaceComposerClient> composerClient;
diff --git a/cmds/stagefright/mediafilter.cpp b/cmds/stagefright/mediafilter.cpp
index 630de25..f0ee0e1 100644
--- a/cmds/stagefright/mediafilter.cpp
+++ b/cmds/stagefright/mediafilter.cpp
@@ -310,7 +310,7 @@
}
static int decode(
- const sp<ALooper> &looper,
+ const sp<android::ALooper> &looper,
const char *path,
const sp<Surface> &surface,
bool renderSurface,
@@ -465,7 +465,7 @@
filterState->mSignalledInputEOS = false;
filterState->mSawOutputEOS = false;
- int64_t startTimeUs = ALooper::GetNowUs();
+ int64_t startTimeUs = android::ALooper::GetNowUs();
int64_t startTimeRender = -1;
for (size_t i = 0; i < stateByTrack.size(); ++i) {
@@ -643,7 +643,7 @@
useTimestamp, &startTimeRender);
}
- int64_t elapsedTimeUs = ALooper::GetNowUs() - startTimeUs;
+ int64_t elapsedTimeUs = android::ALooper::GetNowUs() - startTimeUs;
for (size_t i = 0; i < stateByTrack.size(); ++i) {
CodecState *state = &stateByTrack.editValueAt(i);
@@ -737,7 +737,7 @@
ProcessState::self()->startThreadPool();
- android::sp<ALooper> looper = new ALooper;
+ android::sp<android::ALooper> looper = new android::ALooper;
looper->start();
android::sp<SurfaceComposerClient> composerClient;
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index 0d331df..86e9040 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -650,7 +650,7 @@
MEDIA_MIMETYPE_AUDIO_MPEG, MEDIA_MIMETYPE_AUDIO_G711_MLAW,
MEDIA_MIMETYPE_AUDIO_G711_ALAW, MEDIA_MIMETYPE_AUDIO_VORBIS,
MEDIA_MIMETYPE_VIDEO_VP8, MEDIA_MIMETYPE_VIDEO_VP9,
- MEDIA_MIMETYPE_VIDEO_DOLBY_VISION,
+ MEDIA_MIMETYPE_VIDEO_DOLBY_VISION, MEDIA_MIMETYPE_VIDEO_HEVC,
MEDIA_MIMETYPE_AUDIO_EAC3, MEDIA_MIMETYPE_AUDIO_AC4
};
@@ -716,7 +716,7 @@
gWriteMP4 = false;
gDisplayHistogram = false;
- sp<ALooper> looper;
+ sp<android::ALooper> looper;
int res;
while ((res = getopt(argc, argv, "vhaqn:lm:b:ptsrow:kN:xSTd:D:")) >= 0) {
diff --git a/drm/mediadrm/plugins/clearkey/hidl/AesCtrDecryptor.cpp b/drm/mediadrm/plugins/clearkey/hidl/AesCtrDecryptor.cpp
index 2fce0790..0ac879c 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/AesCtrDecryptor.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/AesCtrDecryptor.cpp
@@ -26,7 +26,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::SubSample;
@@ -79,7 +79,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/Android.bp b/drm/mediadrm/plugins/clearkey/hidl/Android.bp
index edf818e..b44a6c7 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/Android.bp
+++ b/drm/mediadrm/plugins/clearkey/hidl/Android.bp
@@ -15,7 +15,7 @@
//
cc_binary {
- name: "android.hardware.drm@1.1-service.clearkey",
+ name: "android.hardware.drm@1.2-service.clearkey",
vendor: true,
srcs: [
@@ -39,11 +39,12 @@
relative_install_path: "hw",
cflags: ["-Wall", "-Werror"],
- init_rc: ["android.hardware.drm@1.1-service.clearkey.rc"],
+ init_rc: ["android.hardware.drm@1.2-service.clearkey.rc"],
shared_libs: [
"android.hardware.drm@1.0",
"android.hardware.drm@1.1",
+ "android.hardware.drm@1.2",
"libbase",
"libbinder",
"libcrypto",
@@ -69,7 +70,6 @@
integer_overflow: true,
},
}
-
cc_library_static {
name: "libclearkeydevicefiles-protos",
vendor: true,
diff --git a/drm/mediadrm/plugins/clearkey/hidl/Base64.cpp b/drm/mediadrm/plugins/clearkey/hidl/Base64.cpp
index c2ed751..657a42f 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/Base64.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/Base64.cpp
@@ -21,7 +21,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
sp<Buffer> decodeBase64(const std::string &s) {
@@ -169,7 +169,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/Buffer.cpp b/drm/mediadrm/plugins/clearkey/hidl/Buffer.cpp
index e58f58a..75f8395 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/Buffer.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/Buffer.cpp
@@ -21,7 +21,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
Buffer::Buffer(size_t capacity)
@@ -47,7 +47,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/CreatePluginFactories.cpp b/drm/mediadrm/plugins/clearkey/hidl/CreatePluginFactories.cpp
index 1ba5c6a..1410d77 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/CreatePluginFactories.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/CreatePluginFactories.cpp
@@ -22,7 +22,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
extern "C" {
@@ -38,7 +38,7 @@
} // extern "C"
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/CryptoFactory.cpp b/drm/mediadrm/plugins/clearkey/hidl/CryptoFactory.cpp
index 0848cef..2a48db6 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/CryptoFactory.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/CryptoFactory.cpp
@@ -27,7 +27,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
Return<bool> CryptoFactory::isCryptoSchemeSupported(
@@ -60,7 +60,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/CryptoPlugin.cpp b/drm/mediadrm/plugins/clearkey/hidl/CryptoPlugin.cpp
index f33f94e..a488f86 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/CryptoPlugin.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/CryptoPlugin.cpp
@@ -27,7 +27,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::BufferType;
@@ -179,7 +179,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/DeviceFiles.cpp b/drm/mediadrm/plugins/clearkey/hidl/DeviceFiles.cpp
index e23502c..2415b6f 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/DeviceFiles.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/DeviceFiles.cpp
@@ -13,11 +13,11 @@
#include <openssl/sha.h>
// Protobuf generated classes.
-using android::hardware::drm::V1_1::clearkey::OfflineFile;
-using android::hardware::drm::V1_1::clearkey::HashedFile;
-using android::hardware::drm::V1_1::clearkey::License;
-using android::hardware::drm::V1_1::clearkey::License_LicenseState_ACTIVE;
-using android::hardware::drm::V1_1::clearkey::License_LicenseState_RELEASING;
+using android::hardware::drm::V1_2::clearkey::OfflineFile;
+using android::hardware::drm::V1_2::clearkey::HashedFile;
+using android::hardware::drm::V1_2::clearkey::License;
+using android::hardware::drm::V1_2::clearkey::License_LicenseState_ACTIVE;
+using android::hardware::drm::V1_2::clearkey::License_LicenseState_RELEASING;
namespace {
const char kLicenseFileNameExt[] = ".lic";
@@ -38,7 +38,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
bool DeviceFiles::StoreLicense(
@@ -158,6 +158,15 @@
return mFileHandle.FileExists(keySetId + kLicenseFileNameExt);
}
+std::vector<std::string> DeviceFiles::ListLicenses() const {
+ std::vector<std::string> licenses = mFileHandle.ListFiles();
+ for (size_t i = 0; i < licenses.size(); i++) {
+ std::string& license = licenses[i];
+ license = license.substr(0, license.size() - strlen(kLicenseFileNameExt));
+ }
+ return licenses;
+}
+
bool DeviceFiles::RetrieveHashedFile(const std::string& fileName, OfflineFile* deSerializedFile) {
if (!deSerializedFile) {
ALOGE("RetrieveHashedFile: invalid file parameter");
@@ -237,7 +246,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/DrmFactory.cpp b/drm/mediadrm/plugins/clearkey/hidl/DrmFactory.cpp
index 77557f9..9d040a8 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/DrmFactory.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/DrmFactory.cpp
@@ -30,7 +30,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::Status;
@@ -71,7 +71,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/DrmPlugin.cpp b/drm/mediadrm/plugins/clearkey/hidl/DrmPlugin.cpp
index 55cbcf9..7184b53 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/DrmPlugin.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/DrmPlugin.cpp
@@ -58,9 +58,12 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
+using ::android::hardware::drm::V1_2::KeySetId;
+using ::android::hardware::drm::V1_2::OfflineLicenseState;
+
DrmPlugin::DrmPlugin(SessionLibrary* sessionLibrary)
: mSessionLibrary(sessionLibrary),
mOpenSessionOkCount(0),
@@ -625,6 +628,51 @@
return Void();
}
+Return<void> DrmPlugin::getOfflineLicenseKeySetIds(getOfflineLicenseKeySetIds_cb _hidl_cb) {
+ std::vector<std::string> licenseNames = mFileHandle.ListLicenses();
+ std::vector<KeySetId> keySetIds;
+ for (const auto& name : licenseNames) {
+ std::vector<uint8_t> keySetId(name.begin(), name.end());
+ keySetIds.push_back(keySetId);
+ }
+ _hidl_cb(Status::OK, keySetIds);
+ return Void();
+}
+
+
+Return<Status> DrmPlugin::removeOfflineLicense(const KeySetId& keySetId) {
+ std::string licenseName(keySetId.begin(), keySetId.end());
+ if (mFileHandle.DeleteLicense(licenseName)) {
+ return Status::OK;
+ }
+ return Status::BAD_VALUE;
+}
+
+Return<void> DrmPlugin::getOfflineLicenseState(const KeySetId& keySetId,
+ getOfflineLicenseState_cb _hidl_cb) {
+ std::string licenseName(keySetId.begin(), keySetId.end());
+ DeviceFiles::LicenseState state;
+ std::string license;
+ OfflineLicenseState hLicenseState;
+ if (mFileHandle.RetrieveLicense(licenseName, &state, &license)) {
+ switch (state) {
+ case DeviceFiles::kLicenseStateActive:
+ hLicenseState = OfflineLicenseState::USABLE;
+ break;
+ case DeviceFiles::kLicenseStateReleasing:
+ hLicenseState = OfflineLicenseState::INACTIVE;
+ break;
+ case DeviceFiles::kLicenseStateUnknown:
+ hLicenseState = OfflineLicenseState::UNKNOWN;
+ break;
+ }
+ _hidl_cb(Status::OK, hLicenseState);
+ } else {
+ _hidl_cb(Status::BAD_VALUE, OfflineLicenseState::UNKNOWN);
+ }
+ return Void();
+}
+
Return<void> DrmPlugin::getSecureStops(getSecureStops_cb _hidl_cb) {
std::vector<SecureStop> stops;
for (auto itr = mSecureStops.begin(); itr != mSecureStops.end(); ++itr) {
@@ -727,7 +775,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/InitDataParser.cpp b/drm/mediadrm/plugins/clearkey/hidl/InitDataParser.cpp
index deb5d97..8ebb42b 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/InitDataParser.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/InitDataParser.cpp
@@ -31,7 +31,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
namespace {
@@ -169,7 +169,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/JsonWebKey.cpp b/drm/mediadrm/plugins/clearkey/hidl/JsonWebKey.cpp
index 1c32b1b..d93777d 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/JsonWebKey.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/JsonWebKey.cpp
@@ -36,7 +36,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
JsonWebKey::JsonWebKey() {
@@ -271,7 +271,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/MemoryFileSystem.cpp b/drm/mediadrm/plugins/clearkey/hidl/MemoryFileSystem.cpp
index 43fecbb..2dcd00f 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/MemoryFileSystem.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/MemoryFileSystem.cpp
@@ -11,7 +11,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
std::string MemoryFileSystem::GetFileName(const std::string& path) {
@@ -38,6 +38,14 @@
}
}
+std::vector<std::string> MemoryFileSystem::ListFiles() const {
+ std::vector<std::string> list;
+ for (const auto& filename : mMemoryFileSystem) {
+ list.push_back(filename.first);
+ }
+ return list;
+}
+
size_t MemoryFileSystem::Read(const std::string& path, std::string* buffer) {
std::string key = GetFileName(path);
auto result = mMemoryFileSystem.find(key);
@@ -78,7 +86,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/Session.cpp b/drm/mediadrm/plugins/clearkey/hidl/Session.cpp
index 41a8374..f4c49b9 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/Session.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/Session.cpp
@@ -28,7 +28,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::KeyValue;
@@ -90,7 +90,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/SessionLibrary.cpp b/drm/mediadrm/plugins/clearkey/hidl/SessionLibrary.cpp
index d262763..99fb30f 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/SessionLibrary.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/SessionLibrary.cpp
@@ -24,7 +24,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::hidl_string;
@@ -86,7 +86,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/android.hardware.drm@1.1-service.clearkey.rc b/drm/mediadrm/plugins/clearkey/hidl/android.hardware.drm@1.1-service.clearkey.rc
deleted file mode 100644
index ffe856a..0000000
--- a/drm/mediadrm/plugins/clearkey/hidl/android.hardware.drm@1.1-service.clearkey.rc
+++ /dev/null
@@ -1,6 +0,0 @@
-service vendor.drm-clearkey-hal-1-1 /vendor/bin/hw/android.hardware.drm@1.1-service.clearkey
- class hal
- user media
- group media mediadrm
- ioprio rt 4
- writepid /dev/cpuset/foreground/tasks
diff --git a/drm/mediadrm/plugins/clearkey/hidl/android.hardware.drm@1.2-service.clearkey.rc b/drm/mediadrm/plugins/clearkey/hidl/android.hardware.drm@1.2-service.clearkey.rc
new file mode 100644
index 0000000..ac184f7
--- /dev/null
+++ b/drm/mediadrm/plugins/clearkey/hidl/android.hardware.drm@1.2-service.clearkey.rc
@@ -0,0 +1,6 @@
+service vendor.drm-clearkey-hal-1-2 /vendor/bin/hw/android.hardware.drm@1.2-service.clearkey
+ class hal
+ user media
+ group media mediadrm
+ ioprio rt 4
+ writepid /dev/cpuset/foreground/tasks
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/AesCtrDecryptor.h b/drm/mediadrm/plugins/clearkey/hidl/include/AesCtrDecryptor.h
index 0c7ef20..721f4c0 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/AesCtrDecryptor.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/AesCtrDecryptor.h
@@ -22,7 +22,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::Status;
@@ -42,7 +42,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/Base64.h b/drm/mediadrm/plugins/clearkey/hidl/include/Base64.h
index 4a385bd..ec30cc1 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/Base64.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/Base64.h
@@ -25,7 +25,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::sp;
@@ -38,7 +38,7 @@
void encodeBase64Url(const void *data, size_t size, std::string *out);
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/Buffer.h b/drm/mediadrm/plugins/clearkey/hidl/include/Buffer.h
index 5bbb28a..c497e37 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/Buffer.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/Buffer.h
@@ -25,7 +25,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::sp;
@@ -54,7 +54,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/ClearKeyDrmProperties.h b/drm/mediadrm/plugins/clearkey/hidl/include/ClearKeyDrmProperties.h
index 3d6a4a9..f83903c 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/ClearKeyDrmProperties.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/ClearKeyDrmProperties.h
@@ -22,7 +22,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
static const std::string kVendorKey("vendor");
@@ -49,7 +49,7 @@
static const uint8_t kMetricsData[] = { 0 };
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/ClearKeyTypes.h b/drm/mediadrm/plugins/clearkey/hidl/include/ClearKeyTypes.h
index 46cb5e4..7e9b6bd 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/ClearKeyTypes.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/ClearKeyTypes.h
@@ -24,7 +24,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::KeyValue;
@@ -47,7 +47,7 @@
void operator=(const TypeName&) = delete;
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/CreatePluginFactories.h b/drm/mediadrm/plugins/clearkey/hidl/include/CreatePluginFactories.h
index 9952027..6368f3d 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/CreatePluginFactories.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/CreatePluginFactories.h
@@ -17,17 +17,17 @@
#ifndef CLEARKEY_CREATE_PLUGIN_FACTORIES_H_
#define CLEARKEY_CREATE_PLUGIN_FACTORIES_H_
-#include <android/hardware/drm/1.1/ICryptoFactory.h>
-#include <android/hardware/drm/1.1/IDrmFactory.h>
+#include <android/hardware/drm/1.2/ICryptoFactory.h>
+#include <android/hardware/drm/1.2/IDrmFactory.h>
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
-using ::android::hardware::drm::V1_1::ICryptoFactory;
-using ::android::hardware::drm::V1_1::IDrmFactory;
+using ::android::hardware::drm::V1_2::ICryptoFactory;
+using ::android::hardware::drm::V1_2::IDrmFactory;
extern "C" {
IDrmFactory* createDrmFactory();
@@ -35,7 +35,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/CryptoFactory.h b/drm/mediadrm/plugins/clearkey/hidl/include/CryptoFactory.h
index 175ab76..203bb2d 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/CryptoFactory.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/CryptoFactory.h
@@ -18,17 +18,17 @@
#define CLEARKEY_CRYPTO_FACTORY_H_
#include <android/hardware/drm/1.0/ICryptoPlugin.h>
-#include <android/hardware/drm/1.1/ICryptoFactory.h>
+#include <android/hardware/drm/1.2/ICryptoFactory.h>
#include "ClearKeyTypes.h"
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
-using ::android::hardware::drm::V1_1::ICryptoFactory;
+using ::android::hardware::drm::V1_2::ICryptoFactory;
using ::android::hardware::drm::V1_0::ICryptoPlugin;
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_string;
@@ -52,7 +52,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/CryptoPlugin.h b/drm/mediadrm/plugins/clearkey/hidl/include/CryptoPlugin.h
index 6a73806..480dc7e 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/CryptoPlugin.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/CryptoPlugin.h
@@ -32,7 +32,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::DestinationBuffer;
@@ -96,7 +96,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/DeviceFiles.h b/drm/mediadrm/plugins/clearkey/hidl/include/DeviceFiles.h
index ac13d23..554ae59 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/DeviceFiles.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/DeviceFiles.h
@@ -20,7 +20,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
class DeviceFiles {
@@ -42,6 +42,8 @@
virtual bool LicenseExists(const std::string& keySetId);
+ virtual std::vector<std::string> ListLicenses() const;
+
virtual bool DeleteLicense(const std::string& keySetId);
virtual bool DeleteAllLicenses();
@@ -61,7 +63,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/DrmFactory.h b/drm/mediadrm/plugins/clearkey/hidl/include/DrmFactory.h
index 6f58195..ff715ea 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/DrmFactory.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/DrmFactory.h
@@ -17,15 +17,15 @@
#ifndef CLEARKEY_DRM_FACTORY_H_
#define CLEARKEY_DRM_FACTORY_H_
-#include <android/hardware/drm/1.1/IDrmPlugin.h>
-#include <android/hardware/drm/1.1/IDrmFactory.h>
+#include <android/hardware/drm/1.2/IDrmPlugin.h>
+#include <android/hardware/drm/1.2/IDrmFactory.h>
#include "ClearKeyTypes.h"
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::hidl_array;
@@ -52,7 +52,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/DrmPlugin.h b/drm/mediadrm/plugins/clearkey/hidl/include/DrmPlugin.h
index 8e6092f..256c5d6 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/DrmPlugin.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/DrmPlugin.h
@@ -17,10 +17,12 @@
#ifndef CLEARKEY_DRM_PLUGIN_H_
#define CLEARKEY_DRM_PLUGIN_H_
-#include <android/hardware/drm/1.1/IDrmPlugin.h>
+#include <android/hardware/drm/1.2/IDrmPlugin.h>
-#include <stdio.h>
#include <map>
+#include <stdio.h>
+
+#include <utils/List.h>
#include "DeviceFiles.h"
#include "SessionLibrary.h"
@@ -29,7 +31,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::EventType;
@@ -42,8 +44,12 @@
using ::android::hardware::drm::V1_0::SessionId;
using ::android::hardware::drm::V1_0::Status;
using ::android::hardware::drm::V1_1::DrmMetricGroup;
-using ::android::hardware::drm::V1_1::IDrmPlugin;
+using ::android::hardware::drm::V1_1::HdcpLevel;
using ::android::hardware::drm::V1_1::KeyRequestType;
+using ::android::hardware::drm::V1_1::SecureStopRelease;
+using ::android::hardware::drm::V1_1::SecurityLevel;
+using ::android::hardware::drm::V1_2::IDrmPlugin;
+using ::android::hardware::drm::V1_2::OfflineLicenseState;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
@@ -136,6 +142,13 @@
Return<void> getMetrics(getMetrics_cb _hidl_cb) override;
+ Return<void> getOfflineLicenseKeySetIds(getOfflineLicenseKeySetIds_cb _hidl_cb) override;
+
+ Return<Status> removeOfflineLicense(const KeySetId &keySetId) override;
+
+ Return<void> getOfflineLicenseState(const KeySetId &keySetId,
+ getOfflineLicenseState_cb _hidl_cb) override;
+
Return<void> getPropertyString(
const hidl_string& name,
getPropertyString_cb _hidl_cb) override;
@@ -334,7 +347,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/InitDataParser.h b/drm/mediadrm/plugins/clearkey/hidl/include/InitDataParser.h
index 7d7abf2..889f511 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/InitDataParser.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/InitDataParser.h
@@ -24,7 +24,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::Status;
@@ -49,7 +49,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/JsonWebKey.h b/drm/mediadrm/plugins/clearkey/hidl/include/JsonWebKey.h
index 4ab034c..e57470c 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/JsonWebKey.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/JsonWebKey.h
@@ -23,7 +23,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
class JsonWebKey {
@@ -54,7 +54,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/MemoryFileSystem.h b/drm/mediadrm/plugins/clearkey/hidl/include/MemoryFileSystem.h
index 22f8779..bcd9fd6 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/MemoryFileSystem.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/MemoryFileSystem.h
@@ -13,7 +13,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
// Using android file system requires clearkey plugin to update
@@ -42,6 +42,7 @@
bool FileExists(const std::string& fileName) const;
ssize_t GetFileSize(const std::string& fileName) const;
+ std::vector<std::string> ListFiles() const;
size_t Read(const std::string& pathName, std::string* buffer);
bool RemoveAllFiles();
bool RemoveFile(const std::string& fileName);
@@ -59,7 +60,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/Session.h b/drm/mediadrm/plugins/clearkey/hidl/include/Session.h
index 1064dc7..f35560d 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/Session.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/Session.h
@@ -27,7 +27,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::Status;
@@ -64,7 +64,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/SessionLibrary.h b/drm/mediadrm/plugins/clearkey/hidl/include/SessionLibrary.h
index 326a0c1..1e567b8 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/SessionLibrary.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/SessionLibrary.h
@@ -26,7 +26,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::sp;
@@ -58,7 +58,7 @@
};
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/include/TypeConvert.h b/drm/mediadrm/plugins/clearkey/hidl/include/TypeConvert.h
index cc06329..f6d30c9 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/include/TypeConvert.h
+++ b/drm/mediadrm/plugins/clearkey/hidl/include/TypeConvert.h
@@ -24,7 +24,7 @@
namespace android {
namespace hardware {
namespace drm {
-namespace V1_1 {
+namespace V1_2 {
namespace clearkey {
using ::android::hardware::hidl_array;
@@ -69,7 +69,7 @@
}
} // namespace clearkey
-} // namespace V1_1
+} // namespace V1_2
} // namespace drm
} // namespace hardware
} // namespace android
diff --git a/drm/mediadrm/plugins/clearkey/hidl/protos/DeviceFiles.proto b/drm/mediadrm/plugins/clearkey/hidl/protos/DeviceFiles.proto
index 145ac5b..3e11f0b 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/protos/DeviceFiles.proto
+++ b/drm/mediadrm/plugins/clearkey/hidl/protos/DeviceFiles.proto
@@ -10,7 +10,7 @@
//
syntax = "proto2";
-package android.hardware.drm.V1_1.clearkey;
+package android.hardware.drm.V1_2.clearkey;
// need this if we are using libprotobuf-cpp-2.3.0-lite
option optimize_for = LITE_RUNTIME;
diff --git a/drm/mediadrm/plugins/clearkey/hidl/service.cpp b/drm/mediadrm/plugins/clearkey/hidl/service.cpp
index 6a97b72..4ca31f3 100644
--- a/drm/mediadrm/plugins/clearkey/hidl/service.cpp
+++ b/drm/mediadrm/plugins/clearkey/hidl/service.cpp
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#define LOG_TAG "android.hardware.drm@1.1-service.clearkey"
+#define LOG_TAG "android.hardware.drm@1.2-service.clearkey"
#include <CryptoFactory.h>
#include <DrmFactory.h>
@@ -26,14 +26,14 @@
using ::android::hardware::joinRpcThreadpool;
using ::android::sp;
-using android::hardware::drm::V1_1::ICryptoFactory;
-using android::hardware::drm::V1_1::IDrmFactory;
-using android::hardware::drm::V1_1::clearkey::CryptoFactory;
-using android::hardware::drm::V1_1::clearkey::DrmFactory;
+using android::hardware::drm::V1_2::ICryptoFactory;
+using android::hardware::drm::V1_2::IDrmFactory;
+using android::hardware::drm::V1_2::clearkey::CryptoFactory;
+using android::hardware::drm::V1_2::clearkey::DrmFactory;
int main(int /* argc */, char** /* argv */) {
- ALOGD("android.hardware.drm@1.1-service.clearkey starting...");
+ ALOGD("android.hardware.drm@1.2-service.clearkey starting...");
// The DRM HAL may communicate to other vendor components via
// /dev/vndbinder
diff --git a/include/media/AudioPresentationInfo.h b/include/media/AudioPresentationInfo.h
deleted file mode 100644
index e91a992..0000000
--- a/include/media/AudioPresentationInfo.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef AUDIO_PRESENTATION_INFO_H_
-#define AUDIO_PRESENTATION_INFO_H_
-
-#include <sstream>
-#include <stdint.h>
-
-#include <utils/KeyedVector.h>
-#include <utils/RefBase.h>
-#include <utils/String8.h>
-#include <utils/Vector.h>
-
-namespace android {
-
-enum mastering_indication {
- MASTERING_NOT_INDICATED,
- MASTERED_FOR_STEREO,
- MASTERED_FOR_SURROUND,
- MASTERED_FOR_3D,
- MASTERED_FOR_HEADPHONE,
-};
-
-struct AudioPresentation : public RefBase {
- int32_t mPresentationId;
- int32_t mProgramId;
- KeyedVector<String8, String8> mLabels;
- String8 mLanguage;
- int32_t mMasteringIndication;
- bool mAudioDescriptionAvailable;
- bool mSpokenSubtitlesAvailable;
- bool mDialogueEnhancementAvailable;
-
- AudioPresentation() {
- mPresentationId = -1;
- mProgramId = -1;
- mLanguage = "";
- mMasteringIndication = MASTERING_NOT_INDICATED;
- mAudioDescriptionAvailable = false;
- mSpokenSubtitlesAvailable = false;
- mDialogueEnhancementAvailable = false;
- }
-};
-
-typedef Vector<sp<AudioPresentation>> AudioPresentations;
-
-class AudioPresentationInfo : public RefBase {
- public:
- AudioPresentationInfo();
-
- ~AudioPresentationInfo();
-
- void addPresentation(sp<AudioPresentation> presentation);
-
- size_t countPresentations() const;
-
- const sp<AudioPresentation> getPresentation(size_t index) const;
-
- private:
- AudioPresentations mPresentations;
-};
-
-} // namespace android
-
-#endif // AUDIO_PRESENTATION_INFO_H_
diff --git a/media/bufferpool/2.0/AccessorImpl.cpp b/media/bufferpool/2.0/AccessorImpl.cpp
index 84fcca2..0165314 100644
--- a/media/bufferpool/2.0/AccessorImpl.cpp
+++ b/media/bufferpool/2.0/AccessorImpl.cpp
@@ -308,7 +308,11 @@
ConnectionId conId,
uint32_t msgId) {
auto it = mAcks.find(conId);
- if (it == mAcks.end() || isMessageLater(msgId, it->second)) {
+ if (it == mAcks.end()) {
+ ALOGW("ACK from inconsistent connection! %lld", (long long)conId);
+ return;
+ }
+ if (isMessageLater(msgId, it->second)) {
mAcks[conId] = msgId;
}
}
@@ -327,7 +331,6 @@
}
}
channel.postInvalidation(msgId, it->mFrom, it->mTo);
- sInvalidator->addAccessor(mId, it->mImpl);
it = mPendings.erase(it);
continue;
}
@@ -342,24 +345,24 @@
size_t left,
BufferInvalidationChannel &channel,
const std::shared_ptr<Accessor::Impl> &impl) {
- if (left == 0) {
uint32_t msgId = 0;
- if (needsAck) {
+ if (needsAck) {
+ msgId = ++mInvalidationId;
+ if (msgId == 0) {
+ // wrap happens
msgId = ++mInvalidationId;
- if (msgId == 0) {
- // wrap happens
- msgId = ++mInvalidationId;
- }
}
- ALOGV("bufferpool invalidation requested and queued");
+ }
+ ALOGV("bufferpool invalidation requested and queued");
+ if (left == 0) {
channel.postInvalidation(msgId, from, to);
- sInvalidator->addAccessor(mId, impl);
} else {
// TODO: sending hint message?
ALOGV("bufferpool invalidation requested and pending");
Pending pending(needsAck, from, to, left, impl);
mPendings.push_back(pending);
}
+ sInvalidator->addAccessor(mId, impl);
}
void Accessor::Impl::BufferPool::Invalidation::onHandleAck() {
@@ -373,6 +376,9 @@
(long long)it->first, it->second, mInvalidationId);
Return<void> transResult = observer->onMessage(it->first, mInvalidationId);
(void) transResult;
+ // N.B: ignore possibility of onMessage oneway call being
+ // lost.
+ it->second = mInvalidationId;
} else {
ALOGV("bufferpool observer died %lld", (long long)it->first);
deads.insert(it->first);
@@ -385,8 +391,10 @@
}
}
}
- // All invalidation Ids are synced.
- sInvalidator->delAccessor(mId);
+ if (mPendings.size() == 0) {
+ // All invalidation Ids are synced and no more pending invalidations.
+ sInvalidator->delAccessor(mId);
+ }
}
bool Accessor::Impl::BufferPool::handleOwnBuffer(
diff --git a/media/codec2/Android.mk b/media/codec2/Android.mk
new file mode 100644
index 0000000..82d739f
--- /dev/null
+++ b/media/codec2/Android.mk
@@ -0,0 +1,48 @@
+# =============================================================================
+# DOCUMENTATION GENERATION
+# =============================================================================
+C2_ROOT := $(call my-dir)
+
+C2_DOCS_ROOT := $(OUT_DIR)/target/common/docs/codec2
+
+C2_OUT_TEMP := $(PRODUCT_OUT)/gen/ETC/Codec2-docs_intermediates
+
+C2_DOXY := $(or $(shell command -v doxygen),\
+ $(shell command -v /Applications/Doxygen.app/Contents/Resources/doxygen))
+
+.PHONY: check-doxygen
+check-doxygen:
+ifndef C2_DOXY
+ $(error 'doxygen is not available')
+endif
+
+$(C2_OUT_TEMP)/doxy-api.config: $(C2_ROOT)/docs/doxygen.config
+ # only document include directory, no internal sections
+ sed 's/\(^INPUT *=.*\)/\1include\//; \
+ s/\(^INTERNAL_DOCS *= *\).*/\1NO/; \
+ s/\(^ENABLED_SECTIONS *=.*\)INTERNAL\(.*\).*/\1\2/; \
+ s:\(^OUTPUT_DIRECTORY *= \)out:\1'$(OUT_DIR)':;' \
+ $(C2_ROOT)/docs/doxygen.config > $@
+
+$(C2_OUT_TEMP)/doxy-internal.config: $(C2_ROOT)/docs/doxygen.config
+ sed 's:\(^OUTPUT_DIRECTORY *= \)out\(.*\)api:\1'$(OUT_DIR)'\2internal:;' \
+ $(C2_ROOT)/docs/doxygen.config > $@
+
+.PHONY: docs-api
+docs-api: $(C2_OUT_TEMP)/doxy-api.config check-doxygen
+ echo API docs are building in $(C2_DOCS_ROOT)/api
+ rm -rf $(C2_DOCS_ROOT)/api
+ mkdir -p $(C2_DOCS_ROOT)/api
+ $(C2_DOXY) $(C2_OUT_TEMP)/doxy-api.config
+
+.PHONY: docs-internal
+docs-internal: $(C2_OUT_TEMP)/doxy-internal.config check-doxygen
+ echo Internal docs are building in $(C2_DOCS_ROOT)/internal
+ rm -rf $(C2_DOCS_ROOT)/internal
+ mkdir -p $(C2_DOCS_ROOT)/internal
+ $(C2_DOXY) $(C2_OUT_TEMP)/doxy-internal.config
+
+.PHONY: docs-all
+docs-all: docs-api docs-internal
+
+include $(call all-makefiles-under,$(call my-dir))
diff --git a/media/codec2/components/aac/Android.bp b/media/codec2/components/aac/Android.bp
new file mode 100644
index 0000000..9eca585
--- /dev/null
+++ b/media/codec2/components/aac/Android.bp
@@ -0,0 +1,30 @@
+cc_library_shared {
+ name: "libcodec2_soft_aacdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: [
+ "C2SoftAacDec.cpp",
+ "DrcPresModeWrap.cpp",
+ ],
+
+ static_libs: [
+ "libFraunhoferAAC",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_aacenc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftAacEnc.cpp"],
+
+ static_libs: [
+ "libFraunhoferAAC",
+ ],
+}
diff --git a/media/codec2/components/aac/C2SoftAacDec.cpp b/media/codec2/components/aac/C2SoftAacDec.cpp
new file mode 100644
index 0000000..c7c8442
--- /dev/null
+++ b/media/codec2/components/aac/C2SoftAacDec.cpp
@@ -0,0 +1,941 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftAacDec"
+#include <log/log.h>
+
+#include <inttypes.h>
+#include <math.h>
+#include <numeric>
+
+#include <cutils/properties.h>
+#include <media/stagefright/foundation/MediaDefs.h>
+#include <media/stagefright/foundation/hexdump.h>
+#include <media/stagefright/MediaErrors.h>
+#include <utils/misc.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftAacDec.h"
+
+#define FILEREAD_MAX_LAYERS 2
+
+#define DRC_DEFAULT_MOBILE_REF_LEVEL -16.0 /* 64*-0.25dB = -16 dB below full scale for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_CUT 1.0 /* maximum compression of dynamic range for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_BOOST 1.0 /* maximum compression of dynamic range for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_HEAVY C2Config::DRC_COMPRESSION_HEAVY /* switch for heavy compression for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_EFFECT 3 /* MPEG-D DRC effect type; 3 => Limited playback range */
+#define DRC_DEFAULT_MOBILE_ENC_LEVEL (0.25) /* encoder target level; -1 => the value is unknown, otherwise dB step value (e.g. 64 for -16 dB) */
+#define MAX_CHANNEL_COUNT 8 /* maximum number of audio channels that can be decoded */
+// names of properties that can be used to override the default DRC settings
+#define PROP_DRC_OVERRIDE_REF_LEVEL "aac_drc_reference_level"
+#define PROP_DRC_OVERRIDE_CUT "aac_drc_cut"
+#define PROP_DRC_OVERRIDE_BOOST "aac_drc_boost"
+#define PROP_DRC_OVERRIDE_HEAVY "aac_drc_heavy"
+#define PROP_DRC_OVERRIDE_ENC_LEVEL "aac_drc_enc_target_level"
+#define PROP_DRC_OVERRIDE_EFFECT "ro.aac_drc_effect_type"
+
+namespace android {
+
+class C2SoftAacDec::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_AAC))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 44100))
+ .withFields({C2F(mSampleRate, value).oneOf({
+ 7350, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
+ })})
+ .withSetter(Setter<decltype(*mSampleRate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 1))
+ .withFields({C2F(mChannelCount, value).inRange(1, 8)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(8000, 960000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192))
+ .build());
+
+ addParameter(
+ DefineParam(mAacFormat, C2_NAME_STREAM_AAC_FORMAT_SETTING)
+ .withDefault(new C2StreamAacFormatInfo::input(0u, C2AacStreamFormatRaw))
+ .withFields({C2F(mAacFormat, value).oneOf({
+ C2AacStreamFormatRaw, C2AacStreamFormatAdts
+ })})
+ .withSetter(Setter<decltype(*mAacFormat)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_AAC_LC, C2Config::LEVEL_UNUSED))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ C2Config::PROFILE_AAC_LC,
+ C2Config::PROFILE_AAC_HE,
+ C2Config::PROFILE_AAC_HE_PS,
+ C2Config::PROFILE_AAC_LD,
+ C2Config::PROFILE_AAC_ELD,
+ C2Config::PROFILE_AAC_ER_SCALABLE,
+ C2Config::PROFILE_AAC_XHE}),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_UNUSED
+ })
+ })
+ .withSetter(ProfileLevelSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcCompressMode, C2_PARAMKEY_DRC_COMPRESSION_MODE)
+ .withDefault(new C2StreamDrcCompressionModeTuning::input(0u, C2Config::DRC_COMPRESSION_HEAVY))
+ .withFields({
+ C2F(mDrcCompressMode, value).oneOf({
+ C2Config::DRC_COMPRESSION_ODM_DEFAULT,
+ C2Config::DRC_COMPRESSION_NONE,
+ C2Config::DRC_COMPRESSION_LIGHT,
+ C2Config::DRC_COMPRESSION_HEAVY})
+ })
+ .withSetter(Setter<decltype(*mDrcCompressMode)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcTargetRefLevel, C2_PARAMKEY_DRC_TARGET_REFERENCE_LEVEL)
+ .withDefault(new C2StreamDrcTargetReferenceLevelTuning::input(0u, DRC_DEFAULT_MOBILE_REF_LEVEL))
+ .withFields({C2F(mDrcTargetRefLevel, value).inRange(-31.75, 0.25)})
+ .withSetter(Setter<decltype(*mDrcTargetRefLevel)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcEncTargetLevel, C2_PARAMKEY_DRC_ENCODED_TARGET_LEVEL)
+ .withDefault(new C2StreamDrcEncodedTargetLevelTuning::input(0u, DRC_DEFAULT_MOBILE_ENC_LEVEL))
+ .withFields({C2F(mDrcEncTargetLevel, value).inRange(-31.75, 0.25)})
+ .withSetter(Setter<decltype(*mDrcEncTargetLevel)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcBoostFactor, C2_PARAMKEY_DRC_BOOST_FACTOR)
+ .withDefault(new C2StreamDrcBoostFactorTuning::input(0u, DRC_DEFAULT_MOBILE_DRC_BOOST))
+ .withFields({C2F(mDrcBoostFactor, value).inRange(0, 1.)})
+ .withSetter(Setter<decltype(*mDrcBoostFactor)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcAttenuationFactor, C2_PARAMKEY_DRC_ATTENUATION_FACTOR)
+ .withDefault(new C2StreamDrcAttenuationFactorTuning::input(0u, DRC_DEFAULT_MOBILE_DRC_CUT))
+ .withFields({C2F(mDrcAttenuationFactor, value).inRange(0, 1.)})
+ .withSetter(Setter<decltype(*mDrcAttenuationFactor)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcEffectType, C2_PARAMKEY_DRC_EFFECT_TYPE)
+ .withDefault(new C2StreamDrcEffectTypeTuning::input(0u, C2Config::DRC_EFFECT_LIMITED_PLAYBACK_RANGE))
+ .withFields({
+ C2F(mDrcEffectType, value).oneOf({
+ C2Config::DRC_EFFECT_ODM_DEFAULT,
+ C2Config::DRC_EFFECT_OFF,
+ C2Config::DRC_EFFECT_NONE,
+ C2Config::DRC_EFFECT_LATE_NIGHT,
+ C2Config::DRC_EFFECT_NOISY_ENVIRONMENT,
+ C2Config::DRC_EFFECT_LIMITED_PLAYBACK_RANGE,
+ C2Config::DRC_EFFECT_LOW_PLAYBACK_LEVEL,
+ C2Config::DRC_EFFECT_DIALOG_ENHANCEMENT,
+ C2Config::DRC_EFFECT_GENERAL_COMPRESSION})
+ })
+ .withSetter(Setter<decltype(*mDrcEffectType)>::StrictValueWithNoDeps)
+ .build());
+ }
+
+ bool isAdts() const { return mAacFormat->value == C2AacStreamFormatAdts; }
+ static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::input> &me) {
+ (void)mayBlock;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+ int32_t getDrcCompressMode() const { return mDrcCompressMode->value == C2Config::DRC_COMPRESSION_HEAVY ? 1 : 0; }
+ int32_t getDrcTargetRefLevel() const { return (mDrcTargetRefLevel->value <= 0 ? -mDrcTargetRefLevel->value * 4. + 0.5 : -1); }
+ int32_t getDrcEncTargetLevel() const { return (mDrcEncTargetLevel->value <= 0 ? -mDrcEncTargetLevel->value * 4. + 0.5 : -1); }
+ int32_t getDrcBoostFactor() const { return mDrcBoostFactor->value * 127. + 0.5; }
+ int32_t getDrcAttenuationFactor() const { return mDrcAttenuationFactor->value * 127. + 0.5; }
+ int32_t getDrcEffectType() const { return mDrcEffectType->value; }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+ std::shared_ptr<C2StreamAacFormatInfo::input> mAacFormat;
+ std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
+ std::shared_ptr<C2StreamDrcCompressionModeTuning::input> mDrcCompressMode;
+ std::shared_ptr<C2StreamDrcTargetReferenceLevelTuning::input> mDrcTargetRefLevel;
+ std::shared_ptr<C2StreamDrcEncodedTargetLevelTuning::input> mDrcEncTargetLevel;
+ std::shared_ptr<C2StreamDrcBoostFactorTuning::input> mDrcBoostFactor;
+ std::shared_ptr<C2StreamDrcAttenuationFactorTuning::input> mDrcAttenuationFactor;
+ std::shared_ptr<C2StreamDrcEffectTypeTuning::input> mDrcEffectType;
+ // TODO Add : C2StreamAacSbrModeTuning
+};
+
+constexpr char COMPONENT_NAME[] = "c2.android.aac.decoder";
+
+C2SoftAacDec::C2SoftAacDec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mAACDecoder(nullptr),
+ mStreamInfo(nullptr),
+ mSignalledError(false),
+ mOutputDelayRingBuffer(nullptr) {
+}
+
+C2SoftAacDec::~C2SoftAacDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftAacDec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+c2_status_t C2SoftAacDec::onStop() {
+ drainDecoder();
+ // reset the "configured" state
+ mOutputDelayCompensated = 0;
+ mOutputDelayRingBufferWritePos = 0;
+ mOutputDelayRingBufferReadPos = 0;
+ mOutputDelayRingBufferFilled = 0;
+ mBuffersInfo.clear();
+
+ // To make the codec behave the same before and after a reset, we need to invalidate the
+ // streaminfo struct. This does that:
+ mStreamInfo->sampleRate = 0; // TODO: mStreamInfo is read only
+
+ mSignalledError = false;
+
+ return C2_OK;
+}
+
+void C2SoftAacDec::onReset() {
+ (void)onStop();
+}
+
+void C2SoftAacDec::onRelease() {
+ if (mAACDecoder) {
+ aacDecoder_Close(mAACDecoder);
+ mAACDecoder = nullptr;
+ }
+ if (mOutputDelayRingBuffer) {
+ delete[] mOutputDelayRingBuffer;
+ mOutputDelayRingBuffer = nullptr;
+ }
+}
+
+status_t C2SoftAacDec::initDecoder() {
+ ALOGV("initDecoder()");
+ status_t status = UNKNOWN_ERROR;
+ mAACDecoder = aacDecoder_Open(TT_MP4_ADIF, /* num layers */ 1);
+ if (mAACDecoder != nullptr) {
+ mStreamInfo = aacDecoder_GetStreamInfo(mAACDecoder);
+ if (mStreamInfo != nullptr) {
+ status = OK;
+ }
+ }
+
+ mOutputDelayCompensated = 0;
+ mOutputDelayRingBufferSize = 2048 * MAX_CHANNEL_COUNT * kNumDelayBlocksMax;
+ mOutputDelayRingBuffer = new short[mOutputDelayRingBufferSize];
+ mOutputDelayRingBufferWritePos = 0;
+ mOutputDelayRingBufferReadPos = 0;
+ mOutputDelayRingBufferFilled = 0;
+
+ if (mAACDecoder == nullptr) {
+ ALOGE("AAC decoder is null. TODO: Can not call aacDecoder_SetParam in the following code");
+ }
+
+ //aacDecoder_SetParam(mAACDecoder, AAC_PCM_LIMITER_ENABLE, 0);
+
+ //init DRC wrapper
+ mDrcWrap.setDecoderHandle(mAACDecoder);
+ mDrcWrap.submitStreamData(mStreamInfo);
+
+ // for streams that contain metadata, use the mobile profile DRC settings unless overridden by platform properties
+ // TODO: change the DRC settings depending on audio output device type (HDMI, loadspeaker, headphone)
+
+ // DRC_PRES_MODE_WRAP_DESIRED_TARGET
+ int32_t targetRefLevel = mIntf->getDrcTargetRefLevel();
+ ALOGV("AAC decoder using desired DRC target reference level of %d", targetRefLevel);
+ mDrcWrap.setParam(DRC_PRES_MODE_WRAP_DESIRED_TARGET, (unsigned)targetRefLevel);
+
+ // DRC_PRES_MODE_WRAP_DESIRED_ATT_FACTOR
+
+ int32_t attenuationFactor = mIntf->getDrcAttenuationFactor();
+ ALOGV("AAC decoder using desired DRC attenuation factor of %d", attenuationFactor);
+ mDrcWrap.setParam(DRC_PRES_MODE_WRAP_DESIRED_ATT_FACTOR, (unsigned)attenuationFactor);
+
+ // DRC_PRES_MODE_WRAP_DESIRED_BOOST_FACTOR
+ int32_t boostFactor = mIntf->getDrcBoostFactor();
+ ALOGV("AAC decoder using desired DRC boost factor of %d", boostFactor);
+ mDrcWrap.setParam(DRC_PRES_MODE_WRAP_DESIRED_BOOST_FACTOR, (unsigned)boostFactor);
+
+ // DRC_PRES_MODE_WRAP_DESIRED_HEAVY
+ int32_t compressMode = mIntf->getDrcCompressMode();
+ ALOGV("AAC decoder using desried DRC heavy compression switch of %d", compressMode);
+ mDrcWrap.setParam(DRC_PRES_MODE_WRAP_DESIRED_HEAVY, (unsigned)compressMode);
+
+ // DRC_PRES_MODE_WRAP_ENCODER_TARGET
+ int32_t encTargetLevel = mIntf->getDrcEncTargetLevel();
+ ALOGV("AAC decoder using encoder-side DRC reference level of %d", encTargetLevel);
+ mDrcWrap.setParam(DRC_PRES_MODE_WRAP_ENCODER_TARGET, (unsigned)encTargetLevel);
+
+ // AAC_UNIDRC_SET_EFFECT
+ int32_t effectType = mIntf->getDrcEffectType();
+ ALOGV("AAC decoder using MPEG-D DRC effect type %d", effectType);
+ aacDecoder_SetParam(mAACDecoder, AAC_UNIDRC_SET_EFFECT, effectType);
+
+ // By default, the decoder creates a 5.1 channel downmix signal.
+ // For seven and eight channel input streams, enable 6.1 and 7.1 channel output
+ aacDecoder_SetParam(mAACDecoder, AAC_PCM_MAX_OUTPUT_CHANNELS, -1);
+
+ return status;
+}
+
+bool C2SoftAacDec::outputDelayRingBufferPutSamples(INT_PCM *samples, int32_t numSamples) {
+ if (numSamples == 0) {
+ return true;
+ }
+ if (outputDelayRingBufferSpaceLeft() < numSamples) {
+ ALOGE("RING BUFFER WOULD OVERFLOW");
+ return false;
+ }
+ if (mOutputDelayRingBufferWritePos + numSamples <= mOutputDelayRingBufferSize
+ && (mOutputDelayRingBufferReadPos <= mOutputDelayRingBufferWritePos
+ || mOutputDelayRingBufferReadPos > mOutputDelayRingBufferWritePos + numSamples)) {
+ // faster memcopy loop without checks, if the preconditions allow this
+ for (int32_t i = 0; i < numSamples; i++) {
+ mOutputDelayRingBuffer[mOutputDelayRingBufferWritePos++] = samples[i];
+ }
+
+ if (mOutputDelayRingBufferWritePos >= mOutputDelayRingBufferSize) {
+ mOutputDelayRingBufferWritePos -= mOutputDelayRingBufferSize;
+ }
+ } else {
+ ALOGV("slow C2SoftAacDec::outputDelayRingBufferPutSamples()");
+
+ for (int32_t i = 0; i < numSamples; i++) {
+ mOutputDelayRingBuffer[mOutputDelayRingBufferWritePos] = samples[i];
+ mOutputDelayRingBufferWritePos++;
+ if (mOutputDelayRingBufferWritePos >= mOutputDelayRingBufferSize) {
+ mOutputDelayRingBufferWritePos -= mOutputDelayRingBufferSize;
+ }
+ }
+ }
+ mOutputDelayRingBufferFilled += numSamples;
+ return true;
+}
+
+int32_t C2SoftAacDec::outputDelayRingBufferGetSamples(INT_PCM *samples, int32_t numSamples) {
+
+ if (numSamples > mOutputDelayRingBufferFilled) {
+ ALOGE("RING BUFFER WOULD UNDERRUN");
+ return -1;
+ }
+
+ if (mOutputDelayRingBufferReadPos + numSamples <= mOutputDelayRingBufferSize
+ && (mOutputDelayRingBufferWritePos < mOutputDelayRingBufferReadPos
+ || mOutputDelayRingBufferWritePos >= mOutputDelayRingBufferReadPos + numSamples)) {
+ // faster memcopy loop without checks, if the preconditions allow this
+ if (samples != nullptr) {
+ for (int32_t i = 0; i < numSamples; i++) {
+ samples[i] = mOutputDelayRingBuffer[mOutputDelayRingBufferReadPos++];
+ }
+ } else {
+ mOutputDelayRingBufferReadPos += numSamples;
+ }
+ if (mOutputDelayRingBufferReadPos >= mOutputDelayRingBufferSize) {
+ mOutputDelayRingBufferReadPos -= mOutputDelayRingBufferSize;
+ }
+ } else {
+ ALOGV("slow C2SoftAacDec::outputDelayRingBufferGetSamples()");
+
+ for (int32_t i = 0; i < numSamples; i++) {
+ if (samples != nullptr) {
+ samples[i] = mOutputDelayRingBuffer[mOutputDelayRingBufferReadPos];
+ }
+ mOutputDelayRingBufferReadPos++;
+ if (mOutputDelayRingBufferReadPos >= mOutputDelayRingBufferSize) {
+ mOutputDelayRingBufferReadPos -= mOutputDelayRingBufferSize;
+ }
+ }
+ }
+ mOutputDelayRingBufferFilled -= numSamples;
+ return numSamples;
+}
+
+int32_t C2SoftAacDec::outputDelayRingBufferSamplesAvailable() {
+ return mOutputDelayRingBufferFilled;
+}
+
+int32_t C2SoftAacDec::outputDelayRingBufferSpaceLeft() {
+ return mOutputDelayRingBufferSize - outputDelayRingBufferSamplesAvailable();
+}
+
+void C2SoftAacDec::drainRingBuffer(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool,
+ bool eos) {
+ while (!mBuffersInfo.empty() && outputDelayRingBufferSamplesAvailable()
+ >= mStreamInfo->frameSize * mStreamInfo->numChannels) {
+ Info &outInfo = mBuffersInfo.front();
+ ALOGV("outInfo.frameIndex = %" PRIu64, outInfo.frameIndex);
+ int samplesize __unused = mStreamInfo->numChannels * sizeof(int16_t);
+
+ int available = outputDelayRingBufferSamplesAvailable();
+ int numFrames = outInfo.decodedSizes.size();
+ int numSamples = numFrames * (mStreamInfo->frameSize * mStreamInfo->numChannels);
+ if (available < numSamples) {
+ if (eos) {
+ numSamples = available;
+ } else {
+ break;
+ }
+ }
+ ALOGV("%d samples available (%d), or %d frames",
+ numSamples, available, numFrames);
+ ALOGV("getting %d from ringbuffer", numSamples);
+
+ std::shared_ptr<C2LinearBlock> block;
+ std::function<void(const std::unique_ptr<C2Work>&)> fillWork =
+ [&block, numSamples, pool, this]()
+ -> std::function<void(const std::unique_ptr<C2Work>&)> {
+ auto fillEmptyWork = [](
+ const std::unique_ptr<C2Work> &work, c2_status_t err) {
+ work->result = err;
+ C2FrameData &output = work->worklets.front()->output;
+ output.flags = work->input.flags;
+ output.buffers.clear();
+ output.ordinal = work->input.ordinal;
+
+ work->workletsProcessed = 1u;
+ };
+
+ using namespace std::placeholders;
+ if (numSamples == 0) {
+ return std::bind(fillEmptyWork, _1, C2_OK);
+ }
+
+ // TODO: error handling, proper usage, etc.
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(
+ numSamples * sizeof(int16_t), usage, &block);
+ if (err != C2_OK) {
+ ALOGD("failed to fetch a linear block (%d)", err);
+ return std::bind(fillEmptyWork, _1, C2_NO_MEMORY);
+ }
+ C2WriteView wView = block->map().get();
+ // TODO
+ INT_PCM *outBuffer = reinterpret_cast<INT_PCM *>(wView.data());
+ int32_t ns = outputDelayRingBufferGetSamples(outBuffer, numSamples);
+ if (ns != numSamples) {
+ ALOGE("not a complete frame of samples available");
+ mSignalledError = true;
+ return std::bind(fillEmptyWork, _1, C2_CORRUPTED);
+ }
+ return [buffer = createLinearBuffer(block)](
+ const std::unique_ptr<C2Work> &work) {
+ work->result = C2_OK;
+ C2FrameData &output = work->worklets.front()->output;
+ output.flags = work->input.flags;
+ output.buffers.clear();
+ output.buffers.push_back(buffer);
+ output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ };
+ }();
+
+ if (work && work->input.ordinal.frameIndex == c2_cntr64_t(outInfo.frameIndex)) {
+ fillWork(work);
+ } else {
+ finish(outInfo.frameIndex, fillWork);
+ }
+
+ ALOGV("out timestamp %" PRIu64 " / %u", outInfo.timestamp, block ? block->capacity() : 0);
+ mBuffersInfo.pop_front();
+ }
+}
+
+void C2SoftAacDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError) {
+ return;
+ }
+
+ UCHAR* inBuffer[FILEREAD_MAX_LAYERS];
+ UINT inBufferLength[FILEREAD_MAX_LAYERS] = {0};
+ UINT bytesValid[FILEREAD_MAX_LAYERS] = {0};
+
+ INT_PCM tmpOutBuffer[2048 * MAX_CHANNEL_COUNT];
+ C2ReadView view = mDummyReadView;
+ size_t offset = 0u;
+ size_t size = 0u;
+ if (!work->input.buffers.empty()) {
+ view = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ size = view.capacity();
+ }
+
+ bool eos = (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0;
+ bool codecConfig = (work->input.flags & C2FrameData::FLAG_CODEC_CONFIG) != 0;
+
+ //TODO
+#if 0
+ if (mInputBufferCount == 0 && !codecConfig) {
+ ALOGW("first buffer should have FLAG_CODEC_CONFIG set");
+ codecConfig = true;
+ }
+#endif
+ if (codecConfig && size > 0u) {
+ // const_cast because of libAACdec method signature.
+ inBuffer[0] = const_cast<UCHAR *>(view.data() + offset);
+ inBufferLength[0] = size;
+
+ AAC_DECODER_ERROR decoderErr =
+ aacDecoder_ConfigRaw(mAACDecoder,
+ inBuffer,
+ inBufferLength);
+
+ if (decoderErr != AAC_DEC_OK) {
+ ALOGE("aacDecoder_ConfigRaw decoderErr = 0x%4.4x", decoderErr);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->worklets.front()->output.buffers.clear();
+ return;
+ }
+
+ Info inInfo;
+ inInfo.frameIndex = work->input.ordinal.frameIndex.peeku();
+ inInfo.timestamp = work->input.ordinal.timestamp.peeku();
+ inInfo.bufferSize = size;
+ inInfo.decodedSizes.clear();
+ while (size > 0u) {
+ ALOGV("size = %zu", size);
+ if (mIntf->isAdts()) {
+ size_t adtsHeaderSize = 0;
+ // skip 30 bits, aac_frame_length follows.
+ // ssssssss ssssiiip ppffffPc ccohCCll llllllll lll?????
+
+ const uint8_t *adtsHeader = view.data() + offset;
+
+ bool signalError = false;
+ if (size < 7) {
+ ALOGE("Audio data too short to contain even the ADTS header. "
+ "Got %zu bytes.", size);
+ hexdump(adtsHeader, size);
+ signalError = true;
+ } else {
+ bool protectionAbsent = (adtsHeader[1] & 1);
+
+ unsigned aac_frame_length =
+ ((adtsHeader[3] & 3) << 11)
+ | (adtsHeader[4] << 3)
+ | (adtsHeader[5] >> 5);
+
+ if (size < aac_frame_length) {
+ ALOGE("Not enough audio data for the complete frame. "
+ "Got %zu bytes, frame size according to the ADTS "
+ "header is %u bytes.",
+ size, aac_frame_length);
+ hexdump(adtsHeader, size);
+ signalError = true;
+ } else {
+ adtsHeaderSize = (protectionAbsent ? 7 : 9);
+ if (aac_frame_length < adtsHeaderSize) {
+ signalError = true;
+ } else {
+ // const_cast because of libAACdec method signature.
+ inBuffer[0] = const_cast<UCHAR *>(adtsHeader + adtsHeaderSize);
+ inBufferLength[0] = aac_frame_length - adtsHeaderSize;
+
+ offset += adtsHeaderSize;
+ size -= adtsHeaderSize;
+ }
+ }
+ }
+
+ if (signalError) {
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ } else {
+ // const_cast because of libAACdec method signature.
+ inBuffer[0] = const_cast<UCHAR *>(view.data() + offset);
+ inBufferLength[0] = size;
+ }
+
+ // Fill and decode
+ bytesValid[0] = inBufferLength[0];
+
+ INT prevSampleRate = mStreamInfo->sampleRate;
+ INT prevNumChannels = mStreamInfo->numChannels;
+
+ aacDecoder_Fill(mAACDecoder,
+ inBuffer,
+ inBufferLength,
+ bytesValid);
+
+ // run DRC check
+ mDrcWrap.submitStreamData(mStreamInfo);
+ mDrcWrap.update();
+
+ UINT inBufferUsedLength = inBufferLength[0] - bytesValid[0];
+ size -= inBufferUsedLength;
+ offset += inBufferUsedLength;
+
+ AAC_DECODER_ERROR decoderErr;
+ do {
+ if (outputDelayRingBufferSpaceLeft() <
+ (mStreamInfo->frameSize * mStreamInfo->numChannels)) {
+ ALOGV("skipping decode: not enough space left in ringbuffer");
+ // discard buffer
+ size = 0;
+ break;
+ }
+
+ int numConsumed = mStreamInfo->numTotalBytes;
+ decoderErr = aacDecoder_DecodeFrame(mAACDecoder,
+ tmpOutBuffer,
+ 2048 * MAX_CHANNEL_COUNT,
+ 0 /* flags */);
+
+ numConsumed = mStreamInfo->numTotalBytes - numConsumed;
+
+ if (decoderErr == AAC_DEC_NOT_ENOUGH_BITS) {
+ break;
+ }
+ inInfo.decodedSizes.push_back(numConsumed);
+
+ if (decoderErr != AAC_DEC_OK) {
+ ALOGW("aacDecoder_DecodeFrame decoderErr = 0x%4.4x", decoderErr);
+ }
+
+ if (bytesValid[0] != 0) {
+ ALOGE("bytesValid[0] != 0 should never happen");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ size_t numOutBytes =
+ mStreamInfo->frameSize * sizeof(int16_t) * mStreamInfo->numChannels;
+
+ if (decoderErr == AAC_DEC_OK) {
+ if (!outputDelayRingBufferPutSamples(tmpOutBuffer,
+ mStreamInfo->frameSize * mStreamInfo->numChannels)) {
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ } else {
+ ALOGW("AAC decoder returned error 0x%4.4x, substituting silence", decoderErr);
+
+ memset(tmpOutBuffer, 0, numOutBytes); // TODO: check for overflow
+
+ if (!outputDelayRingBufferPutSamples(tmpOutBuffer,
+ mStreamInfo->frameSize * mStreamInfo->numChannels)) {
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ // Discard input buffer.
+ size = 0;
+
+ aacDecoder_SetParam(mAACDecoder, AAC_TPDEC_CLEAR_BUFFER, 1);
+
+ // After an error, replace bufferSize with the sum of the
+ // decodedSizes to resynchronize the in/out lists.
+ inInfo.decodedSizes.pop_back();
+ inInfo.bufferSize = std::accumulate(
+ inInfo.decodedSizes.begin(), inInfo.decodedSizes.end(), 0);
+
+ // fall through
+ }
+
+ /*
+ * AAC+/eAAC+ streams can be signalled in two ways: either explicitly
+ * or implicitly, according to MPEG4 spec. AAC+/eAAC+ is a dual
+ * rate system and the sampling rate in the final output is actually
+ * doubled compared with the core AAC decoder sampling rate.
+ *
+ * Explicit signalling is done by explicitly defining SBR audio object
+ * type in the bitstream. Implicit signalling is done by embedding
+ * SBR content in AAC extension payload specific to SBR, and hence
+ * requires an AAC decoder to perform pre-checks on actual audio frames.
+ *
+ * Thus, we could not say for sure whether a stream is
+ * AAC+/eAAC+ until the first data frame is decoded.
+ */
+ if (!mStreamInfo->sampleRate || !mStreamInfo->numChannels) {
+ // if ((mInputBufferCount > 2) && (mOutputBufferCount <= 1)) {
+ ALOGD("Invalid AAC stream");
+ // TODO: notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL);
+ // mSignalledError = true;
+ // }
+ } else if ((mStreamInfo->sampleRate != prevSampleRate) ||
+ (mStreamInfo->numChannels != prevNumChannels)) {
+ ALOGI("Reconfiguring decoder: %d->%d Hz, %d->%d channels",
+ prevSampleRate, mStreamInfo->sampleRate,
+ prevNumChannels, mStreamInfo->numChannels);
+
+ C2StreamSampleRateInfo::output sampleRateInfo(0u, mStreamInfo->sampleRate);
+ C2StreamChannelCountInfo::output channelCountInfo(0u, mStreamInfo->numChannels);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config(
+ { &sampleRateInfo, &channelCountInfo },
+ C2_MAY_BLOCK,
+ &failures);
+ if (err == OK) {
+ // TODO: this does not handle the case where the values are
+ // altered during config.
+ C2FrameData &output = work->worklets.front()->output;
+ output.configUpdate.push_back(C2Param::Copy(sampleRateInfo));
+ output.configUpdate.push_back(C2Param::Copy(channelCountInfo));
+ } else {
+ ALOGE("Config Update failed");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ ALOGV("size = %zu", size);
+ } while (decoderErr == AAC_DEC_OK);
+ }
+
+ int32_t outputDelay = mStreamInfo->outputDelay * mStreamInfo->numChannels;
+
+ mBuffersInfo.push_back(std::move(inInfo));
+ work->workletsProcessed = 0u;
+ if (!eos && mOutputDelayCompensated < outputDelay) {
+ // discard outputDelay at the beginning
+ int32_t toCompensate = outputDelay - mOutputDelayCompensated;
+ int32_t discard = outputDelayRingBufferSamplesAvailable();
+ if (discard > toCompensate) {
+ discard = toCompensate;
+ }
+ int32_t discarded = outputDelayRingBufferGetSamples(nullptr, discard);
+ mOutputDelayCompensated += discarded;
+ return;
+ }
+
+ if (eos) {
+ drainInternal(DRAIN_COMPONENT_WITH_EOS, pool, work);
+ } else {
+ drainRingBuffer(work, pool, false /* not EOS */);
+ }
+}
+
+c2_status_t C2SoftAacDec::drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work) {
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ bool eos = (drainMode == DRAIN_COMPONENT_WITH_EOS);
+
+ drainDecoder();
+ drainRingBuffer(work, pool, eos);
+
+ if (eos) {
+ auto fillEmptyWork = [](const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ };
+ while (mBuffersInfo.size() > 1u) {
+ finish(mBuffersInfo.front().frameIndex, fillEmptyWork);
+ mBuffersInfo.pop_front();
+ }
+ if (work && work->workletsProcessed == 0u) {
+ fillEmptyWork(work);
+ }
+ mBuffersInfo.clear();
+ }
+
+ return C2_OK;
+}
+
+c2_status_t C2SoftAacDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ return drainInternal(drainMode, pool, nullptr);
+}
+
+c2_status_t C2SoftAacDec::onFlush_sm() {
+ drainDecoder();
+ mBuffersInfo.clear();
+
+ int avail;
+ while ((avail = outputDelayRingBufferSamplesAvailable()) > 0) {
+ if (avail > mStreamInfo->frameSize * mStreamInfo->numChannels) {
+ avail = mStreamInfo->frameSize * mStreamInfo->numChannels;
+ }
+ int32_t ns = outputDelayRingBufferGetSamples(nullptr, avail);
+ if (ns != avail) {
+ ALOGW("not a complete frame of samples available");
+ break;
+ }
+ }
+ mOutputDelayRingBufferReadPos = mOutputDelayRingBufferWritePos;
+
+ return C2_OK;
+}
+
+void C2SoftAacDec::drainDecoder() {
+ // flush decoder until outputDelay is compensated
+ while (mOutputDelayCompensated > 0) {
+ // a buffer big enough for MAX_CHANNEL_COUNT channels of decoded HE-AAC
+ INT_PCM tmpOutBuffer[2048 * MAX_CHANNEL_COUNT];
+
+ // run DRC check
+ mDrcWrap.submitStreamData(mStreamInfo);
+ mDrcWrap.update();
+
+ AAC_DECODER_ERROR decoderErr =
+ aacDecoder_DecodeFrame(mAACDecoder,
+ tmpOutBuffer,
+ 2048 * MAX_CHANNEL_COUNT,
+ AACDEC_FLUSH);
+ if (decoderErr != AAC_DEC_OK) {
+ ALOGW("aacDecoder_DecodeFrame decoderErr = 0x%4.4x", decoderErr);
+ }
+
+ int32_t tmpOutBufferSamples = mStreamInfo->frameSize * mStreamInfo->numChannels;
+ if (tmpOutBufferSamples > mOutputDelayCompensated) {
+ tmpOutBufferSamples = mOutputDelayCompensated;
+ }
+ outputDelayRingBufferPutSamples(tmpOutBuffer, tmpOutBufferSamples);
+
+ mOutputDelayCompensated -= tmpOutBufferSamples;
+ }
+}
+
+class C2SoftAacDecFactory : public C2ComponentFactory {
+public:
+ C2SoftAacDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftAacDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftAacDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id, std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftAacDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftAacDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftAacDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftAacDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/aac/C2SoftAacDec.h b/media/codec2/components/aac/C2SoftAacDec.h
new file mode 100644
index 0000000..965c29e
--- /dev/null
+++ b/media/codec2/components/aac/C2SoftAacDec.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_AAC_DEC_H_
+#define ANDROID_C2_SOFT_AAC_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+#include "aacdecoder_lib.h"
+#include "DrcPresModeWrap.h"
+
+namespace android {
+
+struct C2SoftAacDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftAacDec(const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftAacDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ enum {
+ kNumDelayBlocksMax = 8,
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+
+ HANDLE_AACDECODER mAACDecoder;
+ CStreamInfo *mStreamInfo;
+ bool mIsFirst;
+ size_t mInputBufferCount;
+ size_t mOutputBufferCount;
+ bool mSignalledError;
+ struct Info {
+ uint64_t frameIndex;
+ size_t bufferSize;
+ uint64_t timestamp;
+ std::vector<int32_t> decodedSizes;
+ };
+ std::list<Info> mBuffersInfo;
+
+ CDrcPresModeWrapper mDrcWrap;
+
+ enum {
+ NONE,
+ AWAITING_DISABLED,
+ AWAITING_ENABLED
+ } mOutputPortSettingsChange;
+
+ void initPorts();
+ status_t initDecoder();
+ bool isConfigured() const;
+ void drainDecoder();
+
+ void drainRingBuffer(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool,
+ bool eos);
+ c2_status_t drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work);
+
+// delay compensation
+ bool mEndOfInput;
+ bool mEndOfOutput;
+ int32_t mOutputDelayCompensated;
+ int32_t mOutputDelayRingBufferSize;
+ short *mOutputDelayRingBuffer;
+ int32_t mOutputDelayRingBufferWritePos;
+ int32_t mOutputDelayRingBufferReadPos;
+ int32_t mOutputDelayRingBufferFilled;
+ bool outputDelayRingBufferPutSamples(INT_PCM *samples, int numSamples);
+ int32_t outputDelayRingBufferGetSamples(INT_PCM *samples, int numSamples);
+ int32_t outputDelayRingBufferSamplesAvailable();
+ int32_t outputDelayRingBufferSpaceLeft();
+
+ C2_DO_NOT_COPY(C2SoftAacDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_AAC_DEC_H_
diff --git a/media/codec2/components/aac/C2SoftAacEnc.cpp b/media/codec2/components/aac/C2SoftAacEnc.cpp
new file mode 100644
index 0000000..aeefbdb
--- /dev/null
+++ b/media/codec2/components/aac/C2SoftAacEnc.cpp
@@ -0,0 +1,602 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftAacEnc"
+#include <utils/Log.h>
+
+#include <inttypes.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+#include <media/stagefright/foundation/MediaDefs.h>
+#include <media/stagefright/foundation/hexdump.h>
+
+#include "C2SoftAacEnc.h"
+
+namespace android {
+
+class C2SoftAacEnc::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_AAC))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::input(0u, 44100))
+ .withFields({C2F(mSampleRate, value).oneOf({
+ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
+ })})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::input(0u, 1))
+ .withFields({C2F(mChannelCount, value).inRange(1, 6)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::output(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(8000, 960000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, 8192))
+ .calculatedAs(MaxBufSizeCalculator, mChannelCount)
+ .build());
+
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::output(0u,
+ C2Config::PROFILE_AAC_LC, C2Config::LEVEL_UNUSED))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ C2Config::PROFILE_AAC_LC,
+ C2Config::PROFILE_AAC_HE,
+ C2Config::PROFILE_AAC_HE_PS,
+ C2Config::PROFILE_AAC_LD,
+ C2Config::PROFILE_AAC_ELD}),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_UNUSED
+ })
+ })
+ .withSetter(ProfileLevelSetter)
+ .build());
+ }
+
+ uint32_t getSampleRate() const { return mSampleRate->value; }
+ uint32_t getChannelCount() const { return mChannelCount->value; }
+ uint32_t getBitrate() const { return mBitrate->value; }
+ static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::output> &me) {
+ (void)mayBlock;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+
+ static C2R MaxBufSizeCalculator(
+ bool mayBlock,
+ C2P<C2StreamMaxBufferSizeInfo::input> &me,
+ const C2P<C2StreamChannelCountInfo::input> &channelCount) {
+ (void)mayBlock;
+ me.set().value = 1024 * sizeof(short) * channelCount.v.value;
+ return C2R::Ok();
+ }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::input> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::input> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::output> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+ std::shared_ptr<C2StreamProfileLevelInfo::output> mProfileLevel;
+};
+
+constexpr char COMPONENT_NAME[] = "c2.android.aac.encoder";
+
+C2SoftAacEnc::C2SoftAacEnc(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mAACEncoder(nullptr),
+ mSBRMode(-1),
+ mSBRRatio(0),
+ mAACProfile(AOT_AAC_LC),
+ mNumBytesPerInputFrame(0u),
+ mOutBufferSize(0u),
+ mSentCodecSpecificData(false),
+ mInputSize(0),
+ mInputTimeUs(-1ll),
+ mSignalledError(false),
+ mOutIndex(0u) {
+}
+
+C2SoftAacEnc::~C2SoftAacEnc() {
+ onReset();
+}
+
+c2_status_t C2SoftAacEnc::onInit() {
+ status_t err = initEncoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+status_t C2SoftAacEnc::initEncoder() {
+ if (AACENC_OK != aacEncOpen(&mAACEncoder, 0, 0)) {
+ ALOGE("Failed to init AAC encoder");
+ return UNKNOWN_ERROR;
+ }
+ return setAudioParams();
+}
+
+c2_status_t C2SoftAacEnc::onStop() {
+ mSentCodecSpecificData = false;
+ mInputSize = 0u;
+ mInputTimeUs = -1ll;
+ mSignalledError = false;
+ return C2_OK;
+}
+
+void C2SoftAacEnc::onReset() {
+ (void)onStop();
+ aacEncClose(&mAACEncoder);
+}
+
+void C2SoftAacEnc::onRelease() {
+ // no-op
+}
+
+c2_status_t C2SoftAacEnc::onFlush_sm() {
+ mSentCodecSpecificData = false;
+ mInputSize = 0u;
+ return C2_OK;
+}
+
+static CHANNEL_MODE getChannelMode(uint32_t nChannels) {
+ CHANNEL_MODE chMode = MODE_INVALID;
+ switch (nChannels) {
+ case 1: chMode = MODE_1; break;
+ case 2: chMode = MODE_2; break;
+ case 3: chMode = MODE_1_2; break;
+ case 4: chMode = MODE_1_2_1; break;
+ case 5: chMode = MODE_1_2_2; break;
+ case 6: chMode = MODE_1_2_2_1; break;
+ default: chMode = MODE_INVALID;
+ }
+ return chMode;
+}
+
+//static AUDIO_OBJECT_TYPE getAOTFromProfile(OMX_U32 profile) {
+// if (profile == OMX_AUDIO_AACObjectLC) {
+// return AOT_AAC_LC;
+// } else if (profile == OMX_AUDIO_AACObjectHE) {
+// return AOT_SBR;
+// } else if (profile == OMX_AUDIO_AACObjectHE_PS) {
+// return AOT_PS;
+// } else if (profile == OMX_AUDIO_AACObjectLD) {
+// return AOT_ER_AAC_LD;
+// } else if (profile == OMX_AUDIO_AACObjectELD) {
+// return AOT_ER_AAC_ELD;
+// } else {
+// ALOGW("Unsupported AAC profile - defaulting to AAC-LC");
+// return AOT_AAC_LC;
+// }
+//}
+
+status_t C2SoftAacEnc::setAudioParams() {
+ // We call this whenever sample rate, number of channels, bitrate or SBR mode change
+ // in reponse to setParameter calls.
+
+ ALOGV("setAudioParams: %u Hz, %u channels, %u bps, %i sbr mode, %i sbr ratio",
+ mIntf->getSampleRate(), mIntf->getChannelCount(), mIntf->getBitrate(), mSBRMode, mSBRRatio);
+
+ if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_AOT, mAACProfile)) {
+ ALOGE("Failed to set AAC encoder parameters");
+ return UNKNOWN_ERROR;
+ }
+
+ if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_SAMPLERATE, mIntf->getSampleRate())) {
+ ALOGE("Failed to set AAC encoder parameters");
+ return UNKNOWN_ERROR;
+ }
+ if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_BITRATE, mIntf->getBitrate())) {
+ ALOGE("Failed to set AAC encoder parameters");
+ return UNKNOWN_ERROR;
+ }
+ if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_CHANNELMODE,
+ getChannelMode(mIntf->getChannelCount()))) {
+ ALOGE("Failed to set AAC encoder parameters");
+ return UNKNOWN_ERROR;
+ }
+ if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_TRANSMUX, TT_MP4_RAW)) {
+ ALOGE("Failed to set AAC encoder parameters");
+ return UNKNOWN_ERROR;
+ }
+
+ if (mSBRMode != -1 && mAACProfile == AOT_ER_AAC_ELD) {
+ if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_SBR_MODE, mSBRMode)) {
+ ALOGE("Failed to set AAC encoder parameters");
+ return UNKNOWN_ERROR;
+ }
+ }
+
+ /* SBR ratio parameter configurations:
+ 0: Default configuration wherein SBR ratio is configured depending on audio object type by
+ the FDK.
+ 1: Downsampled SBR (default for ELD)
+ 2: Dualrate SBR (default for HE-AAC)
+ */
+ if (AACENC_OK != aacEncoder_SetParam(mAACEncoder, AACENC_SBR_RATIO, mSBRRatio)) {
+ ALOGE("Failed to set AAC encoder parameters");
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+void C2SoftAacEnc::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError) {
+ return;
+ }
+ bool eos = (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0;
+
+ uint32_t sampleRate = mIntf->getSampleRate();
+ uint32_t channelCount = mIntf->getChannelCount();
+
+ if (!mSentCodecSpecificData) {
+ // The very first thing we want to output is the codec specific
+ // data.
+
+ if (AACENC_OK != aacEncEncode(mAACEncoder, nullptr, nullptr, nullptr, nullptr)) {
+ ALOGE("Unable to initialize encoder for profile / sample-rate / bit-rate / channels");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ uint32_t bitrate = mIntf->getBitrate();
+ uint32_t actualBitRate = aacEncoder_GetParam(mAACEncoder, AACENC_BITRATE);
+ if (bitrate != actualBitRate) {
+ ALOGW("Requested bitrate %u unsupported, using %u", bitrate, actualBitRate);
+ }
+
+ AACENC_InfoStruct encInfo;
+ if (AACENC_OK != aacEncInfo(mAACEncoder, &encInfo)) {
+ ALOGE("Failed to get AAC encoder info");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ std::unique_ptr<C2StreamCsdInfo::output> csd =
+ C2StreamCsdInfo::output::AllocUnique(encInfo.confSize, 0u);
+ if (!csd) {
+ ALOGE("CSD allocation failed");
+ mSignalledError = true;
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ memcpy(csd->m.value, encInfo.confBuf, encInfo.confSize);
+ ALOGV("put csd");
+#if defined(LOG_NDEBUG) && !LOG_NDEBUG
+ hexdump(csd->m.value, csd->flexCount());
+#endif
+ work->worklets.front()->output.configUpdate.push_back(std::move(csd));
+
+ mOutBufferSize = encInfo.maxOutBufBytes;
+ mNumBytesPerInputFrame = encInfo.frameLength * channelCount * sizeof(int16_t);
+ mInputTimeUs = work->input.ordinal.timestamp;
+
+ mSentCodecSpecificData = true;
+ }
+
+ uint8_t temp[1];
+ C2ReadView view = mDummyReadView;
+ const uint8_t *data = temp;
+ size_t capacity = 0u;
+ if (!work->input.buffers.empty()) {
+ view = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ data = view.data();
+ capacity = view.capacity();
+ }
+
+ size_t numFrames = (capacity + mInputSize + (eos ? mNumBytesPerInputFrame - 1 : 0))
+ / mNumBytesPerInputFrame;
+ ALOGV("capacity = %zu; mInputSize = %zu; numFrames = %zu mNumBytesPerInputFrame = %u",
+ capacity, mInputSize, numFrames, mNumBytesPerInputFrame);
+
+ std::shared_ptr<C2LinearBlock> block;
+ std::shared_ptr<C2Buffer> buffer;
+ std::unique_ptr<C2WriteView> wView;
+ uint8_t *outPtr = temp;
+ size_t outAvailable = 0u;
+ uint64_t inputIndex = work->input.ordinal.frameIndex.peeku();
+
+ AACENC_InArgs inargs;
+ AACENC_OutArgs outargs;
+ memset(&inargs, 0, sizeof(inargs));
+ memset(&outargs, 0, sizeof(outargs));
+ inargs.numInSamples = capacity / sizeof(int16_t);
+
+ void* inBuffer[] = { (unsigned char *)data };
+ INT inBufferIds[] = { IN_AUDIO_DATA };
+ INT inBufferSize[] = { (INT)capacity };
+ INT inBufferElSize[] = { sizeof(int16_t) };
+
+ AACENC_BufDesc inBufDesc;
+ inBufDesc.numBufs = sizeof(inBuffer) / sizeof(void*);
+ inBufDesc.bufs = (void**)&inBuffer;
+ inBufDesc.bufferIdentifiers = inBufferIds;
+ inBufDesc.bufSizes = inBufferSize;
+ inBufDesc.bufElSizes = inBufferElSize;
+
+ void* outBuffer[] = { outPtr };
+ INT outBufferIds[] = { OUT_BITSTREAM_DATA };
+ INT outBufferSize[] = { 0 };
+ INT outBufferElSize[] = { sizeof(UCHAR) };
+
+ AACENC_BufDesc outBufDesc;
+ outBufDesc.numBufs = sizeof(outBuffer) / sizeof(void*);
+ outBufDesc.bufs = (void**)&outBuffer;
+ outBufDesc.bufferIdentifiers = outBufferIds;
+ outBufDesc.bufSizes = outBufferSize;
+ outBufDesc.bufElSizes = outBufferElSize;
+
+ AACENC_ERROR encoderErr = AACENC_OK;
+
+ class FillWork {
+ public:
+ FillWork(uint32_t flags, C2WorkOrdinalStruct ordinal,
+ const std::shared_ptr<C2Buffer> &buffer)
+ : mFlags(flags), mOrdinal(ordinal), mBuffer(buffer) {
+ }
+ ~FillWork() = default;
+
+ void operator()(const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)mFlags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = mOrdinal;
+ work->workletsProcessed = 1u;
+ work->result = C2_OK;
+ if (mBuffer) {
+ work->worklets.front()->output.buffers.push_back(mBuffer);
+ }
+ ALOGV("timestamp = %lld, index = %lld, w/%s buffer",
+ mOrdinal.timestamp.peekll(),
+ mOrdinal.frameIndex.peekll(),
+ mBuffer ? "" : "o");
+ }
+
+ private:
+ const uint32_t mFlags;
+ const C2WorkOrdinalStruct mOrdinal;
+ const std::shared_ptr<C2Buffer> mBuffer;
+ };
+
+ C2WorkOrdinalStruct outOrdinal = work->input.ordinal;
+
+ while (encoderErr == AACENC_OK && inargs.numInSamples > 0) {
+ if (numFrames && !block) {
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ // TODO: error handling, proper usage, etc.
+ c2_status_t err = pool->fetchLinearBlock(mOutBufferSize, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock failed : err = %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+
+ wView.reset(new C2WriteView(block->map().get()));
+ outPtr = wView->data();
+ outAvailable = wView->size();
+ --numFrames;
+ }
+
+ memset(&outargs, 0, sizeof(outargs));
+
+ outBuffer[0] = outPtr;
+ outBufferSize[0] = outAvailable;
+
+ encoderErr = aacEncEncode(mAACEncoder,
+ &inBufDesc,
+ &outBufDesc,
+ &inargs,
+ &outargs);
+
+ if (encoderErr == AACENC_OK) {
+ if (buffer) {
+ outOrdinal.frameIndex = mOutIndex++;
+ outOrdinal.timestamp = mInputTimeUs;
+ cloneAndSend(
+ inputIndex,
+ work,
+ FillWork(C2FrameData::FLAG_INCOMPLETE, outOrdinal, buffer));
+ buffer.reset();
+ }
+
+ if (outargs.numOutBytes > 0) {
+ mInputSize = 0;
+ int consumed = ((capacity / sizeof(int16_t)) - inargs.numInSamples);
+ mInputTimeUs = work->input.ordinal.timestamp
+ + (consumed * 1000000ll / channelCount / sampleRate);
+ buffer = createLinearBuffer(block, 0, outargs.numOutBytes);
+#if defined(LOG_NDEBUG) && !LOG_NDEBUG
+ hexdump(outPtr, std::min(outargs.numOutBytes, 256));
+#endif
+ outPtr = temp;
+ outAvailable = 0;
+ block.reset();
+ } else {
+ mInputSize += outargs.numInSamples * sizeof(int16_t);
+ }
+
+ if (outargs.numInSamples > 0) {
+ inBuffer[0] = (int16_t *)inBuffer[0] + outargs.numInSamples;
+ inBufferSize[0] -= outargs.numInSamples * sizeof(int16_t);
+ inargs.numInSamples -= outargs.numInSamples;
+ }
+ }
+ ALOGV("encoderErr = %d mInputSize = %zu inargs.numInSamples = %d, mInputTimeUs = %lld",
+ encoderErr, mInputSize, inargs.numInSamples, mInputTimeUs.peekll());
+ }
+
+ if (eos && inBufferSize[0] > 0) {
+ if (numFrames && !block) {
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ // TODO: error handling, proper usage, etc.
+ c2_status_t err = pool->fetchLinearBlock(mOutBufferSize, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock failed : err = %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+
+ wView.reset(new C2WriteView(block->map().get()));
+ outPtr = wView->data();
+ outAvailable = wView->size();
+ --numFrames;
+ }
+
+ memset(&outargs, 0, sizeof(outargs));
+
+ outBuffer[0] = outPtr;
+ outBufferSize[0] = outAvailable;
+
+ // Flush
+ inargs.numInSamples = -1;
+
+ (void)aacEncEncode(mAACEncoder,
+ &inBufDesc,
+ &outBufDesc,
+ &inargs,
+ &outargs);
+ }
+
+ outOrdinal.frameIndex = mOutIndex++;
+ outOrdinal.timestamp = mInputTimeUs;
+ FillWork((C2FrameData::flags_t)(eos ? C2FrameData::FLAG_END_OF_STREAM : 0),
+ outOrdinal, buffer)(work);
+}
+
+c2_status_t C2SoftAacEnc::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ switch (drainMode) {
+ case DRAIN_COMPONENT_NO_EOS:
+ [[fallthrough]];
+ case NO_DRAIN:
+ // no-op
+ return C2_OK;
+ case DRAIN_CHAIN:
+ return C2_OMITTED;
+ case DRAIN_COMPONENT_WITH_EOS:
+ break;
+ default:
+ return C2_BAD_VALUE;
+ }
+
+ (void)pool;
+ mSentCodecSpecificData = false;
+ mInputSize = 0u;
+
+ // TODO: we don't have any pending work at this time to drain.
+ return C2_OK;
+}
+
+class C2SoftAacEncFactory : public C2ComponentFactory {
+public:
+ C2SoftAacEncFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftAacEnc(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftAacEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id, std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftAacEnc::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftAacEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftAacEncFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftAacEncFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/aac/C2SoftAacEnc.h b/media/codec2/components/aac/C2SoftAacEnc.h
new file mode 100644
index 0000000..82fb438
--- /dev/null
+++ b/media/codec2/components/aac/C2SoftAacEnc.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_AAC_ENC_H_
+#define ANDROID_C2_SOFT_AAC_ENC_H_
+
+#include <atomic>
+
+#include <SimpleC2Component.h>
+
+#include "aacenc_lib.h"
+
+namespace android {
+
+class C2SoftAacEnc : public SimpleC2Component {
+public:
+ class IntfImpl;
+
+ C2SoftAacEnc(const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftAacEnc();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ std::shared_ptr<IntfImpl> mIntf;
+
+ HANDLE_AACENCODER mAACEncoder;
+
+ int32_t mSBRMode;
+ int32_t mSBRRatio;
+ AUDIO_OBJECT_TYPE mAACProfile;
+ UINT mNumBytesPerInputFrame;
+ UINT mOutBufferSize;
+
+ bool mSentCodecSpecificData;
+ size_t mInputSize;
+ c2_cntr64_t mInputTimeUs;
+
+ bool mSignalledError;
+ std::atomic_uint64_t mOutIndex;
+
+ status_t initEncoder();
+
+ status_t setAudioParams();
+
+ C2_DO_NOT_COPY(C2SoftAacEnc);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_AAC_ENC_H_
diff --git a/media/codec2/components/aac/DrcPresModeWrap.cpp b/media/codec2/components/aac/DrcPresModeWrap.cpp
new file mode 100644
index 0000000..5b9aebc
--- /dev/null
+++ b/media/codec2/components/aac/DrcPresModeWrap.cpp
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "DrcPresModeWrap.h"
+
+#include <assert.h>
+
+#define LOG_TAG "C2SoftAacDrcWrapper"
+//#define LOG_NDEBUG 0
+#include <utils/Log.h>
+
+//#define DRC_PRES_MODE_WRAP_DEBUG
+
+#define GPM_ENCODER_TARGET_LEVEL 64
+#define MAX_TARGET_LEVEL 40
+
+CDrcPresModeWrapper::CDrcPresModeWrapper()
+{
+ mDataUpdate = true;
+
+ /* Data from streamInfo. */
+ /* Initialized to the same values as in the aac decoder */
+ mStreamPRL = -1;
+ mStreamDRCPresMode = -1;
+ mStreamNrAACChan = 0;
+ mStreamNrOutChan = 0;
+
+ /* Desired values (set by user). */
+ /* Initialized to the same values as in the aac decoder */
+ mDesTarget = -1;
+ mDesAttFactor = 0;
+ mDesBoostFactor = 0;
+ mDesHeavy = 0;
+
+ mEncoderTarget = -1;
+
+ /* Values from last time. */
+ /* Initialized to the same values as the desired values */
+ mLastTarget = -1;
+ mLastAttFactor = 0;
+ mLastBoostFactor = 0;
+ mLastHeavy = 0;
+}
+
+CDrcPresModeWrapper::~CDrcPresModeWrapper()
+{
+}
+
+void
+CDrcPresModeWrapper::setDecoderHandle(const HANDLE_AACDECODER handle)
+{
+ mHandleDecoder = handle;
+}
+
+void
+CDrcPresModeWrapper::submitStreamData(CStreamInfo* pStreamInfo)
+{
+ assert(pStreamInfo);
+
+ if (mStreamPRL != pStreamInfo->drcProgRefLev) {
+ mStreamPRL = pStreamInfo->drcProgRefLev;
+ mDataUpdate = true;
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ ALOGV("DRC presentation mode wrapper: drcProgRefLev is %d\n", mStreamPRL);
+#endif
+ }
+
+ if (mStreamDRCPresMode != pStreamInfo->drcPresMode) {
+ mStreamDRCPresMode = pStreamInfo->drcPresMode;
+ mDataUpdate = true;
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ ALOGV("DRC presentation mode wrapper: drcPresMode is %d\n", mStreamDRCPresMode);
+#endif
+ }
+
+ if (mStreamNrAACChan != pStreamInfo->aacNumChannels) {
+ mStreamNrAACChan = pStreamInfo->aacNumChannels;
+ mDataUpdate = true;
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ ALOGV("DRC presentation mode wrapper: aacNumChannels is %d\n", mStreamNrAACChan);
+#endif
+ }
+
+ if (mStreamNrOutChan != pStreamInfo->numChannels) {
+ mStreamNrOutChan = pStreamInfo->numChannels;
+ mDataUpdate = true;
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ ALOGV("DRC presentation mode wrapper: numChannels is %d\n", mStreamNrOutChan);
+#endif
+ }
+
+
+
+ if (mStreamNrOutChan<mStreamNrAACChan) {
+ mIsDownmix = true;
+ } else {
+ mIsDownmix = false;
+ }
+
+ if (mIsDownmix && (mStreamNrOutChan == 1)) {
+ mIsMonoDownmix = true;
+ } else {
+ mIsMonoDownmix = false;
+ }
+
+ if (mIsDownmix && mStreamNrOutChan == 2){
+ mIsStereoDownmix = true;
+ } else {
+ mIsStereoDownmix = false;
+ }
+
+}
+
+void
+CDrcPresModeWrapper::setParam(const DRC_PRES_MODE_WRAP_PARAM param, const int value)
+{
+ switch (param) {
+ case DRC_PRES_MODE_WRAP_DESIRED_TARGET:
+ mDesTarget = value;
+ break;
+ case DRC_PRES_MODE_WRAP_DESIRED_ATT_FACTOR:
+ mDesAttFactor = value;
+ break;
+ case DRC_PRES_MODE_WRAP_DESIRED_BOOST_FACTOR:
+ mDesBoostFactor = value;
+ break;
+ case DRC_PRES_MODE_WRAP_DESIRED_HEAVY:
+ mDesHeavy = value;
+ break;
+ case DRC_PRES_MODE_WRAP_ENCODER_TARGET:
+ mEncoderTarget = value;
+ break;
+ default:
+ break;
+ }
+ mDataUpdate = true;
+}
+
+void
+CDrcPresModeWrapper::update()
+{
+ // Get Data from Decoder
+ int progRefLevel = mStreamPRL;
+ int drcPresMode = mStreamDRCPresMode;
+
+ // by default, do as desired
+ int newTarget = mDesTarget;
+ int newAttFactor = mDesAttFactor;
+ int newBoostFactor = mDesBoostFactor;
+ int newHeavy = mDesHeavy;
+
+ if (mDataUpdate) {
+ // sanity check
+ if (mDesTarget < MAX_TARGET_LEVEL){
+ mDesTarget = MAX_TARGET_LEVEL; // limit target level to -10 dB or below
+ newTarget = MAX_TARGET_LEVEL;
+ }
+
+ if (mEncoderTarget != -1) {
+ if (mDesTarget<124) { // if target level > -31 dB
+ if ((mIsStereoDownmix == false) && (mIsMonoDownmix == false)) {
+ // no stereo or mono downmixing, calculated scaling of light DRC
+ /* use as little compression as possible */
+ newAttFactor = 0;
+ newBoostFactor = 0;
+ if (mDesTarget<progRefLevel) { // if target level > PRL
+ if (mEncoderTarget < mDesTarget) { // if mEncoderTarget > target level
+ // mEncoderTarget > target level > PRL
+ int calcFactor;
+ float calcFactor_norm;
+ // 0.0f < calcFactor_norm < 1.0f
+ calcFactor_norm = (float)(mDesTarget - progRefLevel) /
+ (float)(mEncoderTarget - progRefLevel);
+ calcFactor = (int)(calcFactor_norm*127.0f); // 0 <= calcFactor < 127
+ // calcFactor is the lower limit
+ newAttFactor = (calcFactor>newAttFactor) ? calcFactor : newAttFactor;
+ // new AttFactor will be always = calcFactor, as it is set to 0 before.
+ newBoostFactor = newAttFactor;
+ } else {
+ /* target level > mEncoderTarget > PRL */
+ // newTDLimiterEnable = 1;
+ // the time domain limiter must always be active in this case.
+ // It is assumed that the framework activates it by default
+ newAttFactor = 127;
+ newBoostFactor = 127;
+ }
+ } else { // target level <= PRL
+ // no restrictions required
+ // newAttFactor = newAttFactor;
+ }
+ } else { // downmixing
+ // if target level > -23 dB or mono downmix
+ if ( (mDesTarget<92) || mIsMonoDownmix ) {
+ newHeavy = 1;
+ } else {
+ // we perform a downmix, so, we need at least full light DRC
+ newAttFactor = 127;
+ }
+ }
+ } else { // target level <= -31 dB
+ // playback -31 dB: light DRC only needed if we perform downmixing
+ if (mIsDownmix) { // we do downmixing
+ newAttFactor = 127;
+ }
+ }
+ }
+ else { // handle other used encoder target levels
+
+ // Sanity check: DRC presentation mode is only specified for max. 5.1 channels
+ if (mStreamNrAACChan > 6) {
+ drcPresMode = 0;
+ }
+
+ switch (drcPresMode) {
+ case 0:
+ default: // presentation mode not indicated
+ {
+
+ if (mDesTarget<124) { // if target level > -31 dB
+ // no stereo or mono downmixing
+ if ((mIsStereoDownmix == false) && (mIsMonoDownmix == false)) {
+ if (mDesTarget<progRefLevel) { // if target level > PRL
+ // newTDLimiterEnable = 1;
+ // the time domain limiter must always be active in this case.
+ // It is assumed that the framework activates it by default
+ newAttFactor = 127; // at least, use light compression
+ } else { // target level <= PRL
+ // no restrictions required
+ // newAttFactor = newAttFactor;
+ }
+ } else { // downmixing
+ // newTDLimiterEnable = 1;
+ // the time domain limiter must always be active in this case.
+ // It is assumed that the framework activates it by default
+
+ // if target level > -23 dB or mono downmix
+ if ( (mDesTarget < 92) || mIsMonoDownmix ) {
+ newHeavy = 1;
+ } else{
+ // we perform a downmix, so, we need at least full light DRC
+ newAttFactor = 127;
+ }
+ }
+ } else { // target level <= -31 dB
+ if (mIsDownmix) { // we do downmixing.
+ // newTDLimiterEnable = 1;
+ // the time domain limiter must always be active in this case.
+ // It is assumed that the framework activates it by default
+ newAttFactor = 127;
+ }
+ }
+ }
+ break;
+
+ // Presentation mode 1 and 2 according to ETSI TS 101 154:
+ // Digital Video Broadcasting (DVB); Specification for the use of Video and Audio Coding
+ // in Broadcasting Applications based on the MPEG-2 Transport Stream,
+ // section C.5.4., "Decoding", and Table C.33
+ // ISO DRC -> newHeavy = 0 (Use light compression, MPEG-style)
+ // Compression_value -> newHeavy = 1 (Use heavy compression, DVB-style)
+ // scaling restricted -> newAttFactor = 127
+
+ case 1: // presentation mode 1, Light:-31/Heavy:-23
+ {
+ if (mDesTarget < 124) { // if target level > -31 dB
+ // playback up to -23 dB
+ newHeavy = 1;
+ } else { // target level <= -31 dB
+ // playback -31 dB
+ if (mIsDownmix) { // we do downmixing.
+ newAttFactor = 127;
+ }
+ }
+ }
+ break;
+
+ case 2: // presentation mode 2, Light:-23/Heavy:-23
+ {
+ if (mDesTarget < 124) { // if target level > -31 dB
+ // playback up to -23 dB
+ if (mIsMonoDownmix) { // if mono downmix
+ newHeavy = 1;
+ } else {
+ newHeavy = 0;
+ newAttFactor = 127;
+ }
+ } else { // target level <= -31 dB
+ // playback -31 dB
+ newHeavy = 0;
+ if (mIsDownmix) { // we do downmixing.
+ newAttFactor = 127;
+ }
+ }
+ }
+ break;
+
+ } // switch()
+ } // if (mEncoderTarget == GPM_ENCODER_TARGET_LEVEL)
+
+ // sanity again
+ if (newHeavy == 1) {
+ newBoostFactor=127; // not really needed as the same would be done by the decoder anyway
+ newAttFactor = 127;
+ }
+
+ // update the decoder
+ if (newTarget != mLastTarget) {
+ aacDecoder_SetParam(mHandleDecoder, AAC_DRC_REFERENCE_LEVEL, newTarget);
+ mLastTarget = newTarget;
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ if (newTarget != mDesTarget)
+ ALOGV("DRC presentation mode wrapper: forced target level to %d (from %d)\n", newTarget, mDesTarget);
+ else
+ ALOGV("DRC presentation mode wrapper: set target level to %d\n", newTarget);
+#endif
+ }
+
+ if (newAttFactor != mLastAttFactor) {
+ aacDecoder_SetParam(mHandleDecoder, AAC_DRC_ATTENUATION_FACTOR, newAttFactor);
+ mLastAttFactor = newAttFactor;
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ if (newAttFactor != mDesAttFactor)
+ ALOGV("DRC presentation mode wrapper: forced attenuation factor to %d (from %d)\n", newAttFactor, mDesAttFactor);
+ else
+ ALOGV("DRC presentation mode wrapper: set attenuation factor to %d\n", newAttFactor);
+#endif
+ }
+
+ if (newBoostFactor != mLastBoostFactor) {
+ aacDecoder_SetParam(mHandleDecoder, AAC_DRC_BOOST_FACTOR, newBoostFactor);
+ mLastBoostFactor = newBoostFactor;
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ if (newBoostFactor != mDesBoostFactor)
+ ALOGV("DRC presentation mode wrapper: forced boost factor to %d (from %d)\n",
+ newBoostFactor, mDesBoostFactor);
+ else
+ ALOGV("DRC presentation mode wrapper: set boost factor to %d\n", newBoostFactor);
+#endif
+ }
+
+ if (newHeavy != mLastHeavy) {
+ aacDecoder_SetParam(mHandleDecoder, AAC_DRC_HEAVY_COMPRESSION, newHeavy);
+ mLastHeavy = newHeavy;
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ if (newHeavy != mDesHeavy)
+ ALOGV("DRC presentation mode wrapper: forced heavy compression to %d (from %d)\n",
+ newHeavy, mDesHeavy);
+ else
+ ALOGV("DRC presentation mode wrapper: set heavy compression to %d\n", newHeavy);
+#endif
+ }
+
+#ifdef DRC_PRES_MODE_WRAP_DEBUG
+ ALOGV("DRC config: tgt_lev: %3d, cut: %3d, boost: %3d, heavy: %d\n", newTarget,
+ newAttFactor, newBoostFactor, newHeavy);
+#endif
+ mDataUpdate = false;
+
+ } // if (mDataUpdate)
+}
diff --git a/media/codec2/components/aac/DrcPresModeWrap.h b/media/codec2/components/aac/DrcPresModeWrap.h
new file mode 100644
index 0000000..f0b6cf2
--- /dev/null
+++ b/media/codec2/components/aac/DrcPresModeWrap.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+#include "aacdecoder_lib.h"
+
+typedef enum
+{
+ DRC_PRES_MODE_WRAP_DESIRED_TARGET = 0x0000,
+ DRC_PRES_MODE_WRAP_DESIRED_ATT_FACTOR = 0x0001,
+ DRC_PRES_MODE_WRAP_DESIRED_BOOST_FACTOR = 0x0002,
+ DRC_PRES_MODE_WRAP_DESIRED_HEAVY = 0x0003,
+ DRC_PRES_MODE_WRAP_ENCODER_TARGET = 0x0004
+} DRC_PRES_MODE_WRAP_PARAM;
+
+
+class CDrcPresModeWrapper {
+public:
+ CDrcPresModeWrapper();
+ ~CDrcPresModeWrapper();
+ void setDecoderHandle(const HANDLE_AACDECODER handle);
+ void setParam(const DRC_PRES_MODE_WRAP_PARAM param, const int value);
+ void submitStreamData(CStreamInfo*);
+ void update();
+
+protected:
+ HANDLE_AACDECODER mHandleDecoder;
+ int mDesTarget;
+ int mDesAttFactor;
+ int mDesBoostFactor;
+ int mDesHeavy;
+
+ int mEncoderTarget;
+
+ int mLastTarget;
+ int mLastAttFactor;
+ int mLastBoostFactor;
+ int mLastHeavy;
+
+ SCHAR mStreamPRL;
+ SCHAR mStreamDRCPresMode;
+ INT mStreamNrAACChan;
+ INT mStreamNrOutChan;
+
+ bool mIsDownmix;
+ bool mIsMonoDownmix;
+ bool mIsStereoDownmix;
+
+ bool mDataUpdate;
+};
diff --git a/media/codec2/components/aac/MODULE_LICENSE_APACHE2 b/media/codec2/components/aac/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/aac/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/aac/NOTICE b/media/codec2/components/aac/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/aac/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/aac/patent_disclaimer.txt b/media/codec2/components/aac/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/codec2/components/aac/patent_disclaimer.txt
@@ -0,0 +1,9 @@
+
+THIS IS NOT A GRANT OF PATENT RIGHTS.
+
+Google makes no representation or warranty that the codecs for which
+source code is made available hereunder are unencumbered by
+third-party patents. Those intending to use this source code in
+hardware or software products are advised that implementations of
+these codecs, including in open source software or shareware, may
+require patent licenses from the relevant patent holders.
diff --git a/media/codec2/components/amr_nb_wb/Android.bp b/media/codec2/components/amr_nb_wb/Android.bp
new file mode 100644
index 0000000..ce25bc9
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/Android.bp
@@ -0,0 +1,77 @@
+cc_library_shared {
+ name: "libcodec2_soft_amrnbdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftAmrDec.cpp"],
+
+ cflags: [
+ "-DAMRNB",
+ ],
+
+ static_libs: [
+ "libstagefright_amrnbdec",
+ "libstagefright_amrwbdec",
+ ],
+
+ shared_libs: [
+ "libstagefright_amrnb_common",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_amrwbdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftAmrDec.cpp"],
+
+ static_libs: [
+ "libstagefright_amrnbdec",
+ "libstagefright_amrwbdec",
+ ],
+
+ shared_libs: [
+ "libstagefright_amrnb_common",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_amrnbenc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftAmrNbEnc.cpp"],
+
+ static_libs: [
+ "libstagefright_amrnbenc",
+ ],
+
+ shared_libs: [
+ "libstagefright_amrnb_common",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_amrwbenc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftAmrWbEnc.cpp"],
+
+ static_libs: [
+ "libstagefright_amrwbenc",
+ ],
+
+ shared_libs: [
+ "libstagefright_enc_common",
+ ],
+}
diff --git a/media/codec2/components/amr_nb_wb/C2SoftAmrDec.cpp b/media/codec2/components/amr_nb_wb/C2SoftAmrDec.cpp
new file mode 100644
index 0000000..c591e21
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/C2SoftAmrDec.cpp
@@ -0,0 +1,438 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#ifdef AMRNB
+#define LOG_TAG "C2SoftAmrNbDec"
+#else
+#define LOG_TAG "C2SoftAmrWbDec"
+#endif
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftAmrDec.h"
+#include "gsmamr_dec.h"
+#include "pvamrwbdecoder.h"
+
+namespace android {
+
+#ifdef AMRNB
+ constexpr char COMPONENT_NAME[] = "c2.android.amrnb.decoder";
+#else
+ constexpr char COMPONENT_NAME[] = "c2.android.amrwb.decoder";
+#endif
+
+class C2SoftAmrDec::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+#ifdef AMRNB
+ MEDIA_MIMETYPE_AUDIO_AMR_NB
+#else
+ MEDIA_MIMETYPE_AUDIO_AMR_WB
+#endif
+ )).build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+#ifdef AMRNB
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 8000))
+ .withFields({C2F(mSampleRate, value).equalTo(8000)})
+#else
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 16000))
+ .withFields({C2F(mSampleRate, value).equalTo(16000)})
+#endif
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 1))
+ .withFields({C2F(mChannelCount, value).equalTo(1)})
+ .withSetter((Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+#ifdef AMRNB
+ .withDefault(new C2BitrateTuning::input(0u, 4750))
+ .withFields({C2F(mBitrate, value).inRange(4750, 12200)})
+#else
+ .withDefault(new C2BitrateTuning::input(0u, 6600))
+ .withFields({C2F(mBitrate, value).inRange(6600, 23850)})
+#endif
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192))
+ .build());
+ }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftAmrDec::C2SoftAmrDec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mAmrHandle(nullptr),
+ mDecoderBuf(nullptr),
+ mDecoderCookie(nullptr) {
+#ifdef AMRNB
+ mIsWide = false;
+#else
+ mIsWide = true;
+#endif
+}
+
+C2SoftAmrDec::~C2SoftAmrDec() {
+ (void)onRelease();
+}
+
+c2_status_t C2SoftAmrDec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_NO_MEMORY;
+}
+
+c2_status_t C2SoftAmrDec::onStop() {
+ if (!mIsWide) {
+ Speech_Decode_Frame_reset(mAmrHandle);
+ } else {
+ pvDecoder_AmrWb_Reset(mAmrHandle, 0 /* reset_all */);
+ }
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+
+ return C2_OK;
+}
+
+void C2SoftAmrDec::onReset() {
+ (void)onStop();
+}
+
+void C2SoftAmrDec::onRelease() {
+ if (!mIsWide) {
+ if (mAmrHandle) {
+ GSMDecodeFrameExit(&mAmrHandle);
+ }
+ mAmrHandle = nullptr;
+ } else {
+ if (mDecoderBuf) {
+ free(mDecoderBuf);
+ }
+ mDecoderBuf = nullptr;
+ mAmrHandle = nullptr;
+ mDecoderCookie = nullptr;
+ }
+}
+
+c2_status_t C2SoftAmrDec::onFlush_sm() {
+ return onStop();
+}
+
+status_t C2SoftAmrDec::initDecoder() {
+ if (!mIsWide) {
+ if (GSMInitDecode(&mAmrHandle, (int8_t *)"AMRNBDecoder"))
+ return UNKNOWN_ERROR;
+ } else {
+ uint32_t memReq = pvDecoder_AmrWbMemRequirements();
+ mDecoderBuf = malloc(memReq);
+ if (mDecoderBuf) {
+ pvDecoder_AmrWb_Init(&mAmrHandle, mDecoderBuf, &mDecoderCookie);
+ }
+ else {
+ return NO_MEMORY;
+ }
+ }
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+
+ return OK;
+}
+
+static size_t getFrameSize(bool isWide, unsigned FM) {
+ static const size_t kFrameSizeNB[16] = {
+ 12, 13, 15, 17, 19, 20, 26, 31,
+ 5, 6, 5, 5, // SID
+ 0, 0, 0, // future use
+ 0 // no data
+ };
+ static const size_t kFrameSizeWB[16] = {
+ 17, 23, 32, 36, 40, 46, 50, 58, 60,
+ 5, // SID
+ 0, 0, 0, 0, // future use
+ 0, // speech lost
+ 0 // no data
+ };
+
+ if (FM > 15 || (isWide && FM > 9 && FM < 14) || (!isWide && FM > 11 && FM < 15)) {
+ ALOGE("illegal AMR frame mode %d", FM);
+ return 0;
+ }
+ // add 1 for header byte
+ return (isWide ? kFrameSizeWB[FM] : kFrameSizeNB[FM]) + 1;
+}
+
+static status_t calculateNumFrames(const uint8 *input, size_t inSize,
+ std::vector<size_t> *frameSizeList, bool isWide) {
+ for (size_t k = 0; k < inSize;) {
+ int16_t FM = ((input[0] >> 3) & 0x0f);
+ size_t frameSize = getFrameSize(isWide, FM);
+ if (frameSize == 0) {
+ return UNKNOWN_ERROR;
+ }
+ if ((inSize - k) >= frameSize) {
+ input += frameSize;
+ k += frameSize;
+ }
+ else break;
+ frameSizeList->push_back(frameSize);
+ }
+ return OK;
+}
+
+void C2SoftAmrDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ C2ReadView rView = mDummyReadView;
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = rView.error();
+ return;
+ }
+ }
+
+ bool eos = (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0;
+ if (inSize == 0) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d", inSize,
+ (int)work->input.ordinal.timestamp.peeku(), (int)work->input.ordinal.frameIndex.peeku());
+
+ std::vector<size_t> frameSizeList;
+ if (OK != calculateNumFrames(rView.data() + inOffset, inSize, &frameSizeList,
+ mIsWide)) {
+ work->result = C2_CORRUPTED;
+ mSignalledError = true;
+ return;
+ }
+ if (frameSizeList.empty()) {
+ ALOGE("input size smaller than expected");
+ work->result = C2_CORRUPTED;
+ mSignalledError = true;
+ return;
+ }
+
+ int16_t outSamples = mIsWide ? kNumSamplesPerFrameWB : kNumSamplesPerFrameNB;
+ size_t calOutSize = outSamples * frameSizeList.size() * sizeof(int16_t);
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(calOutSize, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+
+ int16_t *output = reinterpret_cast<int16_t *>(wView.data());
+ auto it = frameSizeList.begin();
+ const uint8_t *inPtr = rView.data() + inOffset;
+ size_t inPos = 0;
+ while (inPos < inSize) {
+ if (it == frameSizeList.end()) {
+ ALOGD("unexpected trailing bytes, ignoring them");
+ break;
+ }
+ uint8_t *input = const_cast<uint8_t *>(inPtr + inPos);
+ int16_t FM = ((*input >> 3) & 0x0f);
+ if (!mIsWide) {
+ int32_t numBytesRead = AMRDecode(mAmrHandle,
+ (Frame_Type_3GPP) FM,
+ input + 1, output, MIME_IETF);
+ if (static_cast<size_t>(numBytesRead + 1) != *it) {
+ ALOGE("panic, parsed size does not match decoded size");
+ work->result = C2_CORRUPTED;
+ mSignalledError = true;
+ return;
+ }
+ } else {
+ if (FM >= 9) {
+ // Produce silence instead of comfort noise and for
+ // speech lost/no data.
+ memset(output, 0, outSamples * sizeof(int16_t));
+ } else {
+ int16_t FT;
+ RX_State_wb rx_state;
+ int16_t numRecSamples;
+
+ mime_unsorting(const_cast<uint8_t *>(&input[1]),
+ mInputSampleBuffer, &FT, &FM, 1, &rx_state);
+ pvDecoder_AmrWb(FM, mInputSampleBuffer, output, &numRecSamples,
+ mDecoderBuf, FT, mDecoderCookie);
+ if (numRecSamples != outSamples) {
+ ALOGE("Sample output per frame incorrect");
+ work->result = C2_CORRUPTED;
+ mSignalledError = true;
+ return;
+ }
+ /* Delete the 2 LSBs (14-bit output) */
+ for (int i = 0; i < numRecSamples; ++i) {
+ output[i] &= 0xfffC;
+ }
+ }
+ }
+ inPos += *it;
+ output += outSamples;
+ ++it;
+ }
+
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(createLinearBuffer(block));
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+}
+
+c2_status_t C2SoftAmrDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void)pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+ return C2_OK;
+}
+
+class C2SoftAMRDecFactory : public C2ComponentFactory {
+public:
+ C2SoftAMRDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftAmrDec(COMPONENT_NAME, id,
+ std::make_shared<C2SoftAmrDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftAmrDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftAmrDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftAMRDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftAMRDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/amr_nb_wb/C2SoftAmrDec.h b/media/codec2/components/amr_nb_wb/C2SoftAmrDec.h
new file mode 100644
index 0000000..6384450
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/C2SoftAmrDec.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_AMR_DEC_H_
+#define ANDROID_C2_SOFT_AMR_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+namespace android {
+
+struct C2SoftAmrDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftAmrDec(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftAmrDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+private:
+ enum {
+ kNumSamplesPerFrameNB = 160,
+ kNumSamplesPerFrameWB = 320,
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+ void *mAmrHandle;
+ void *mDecoderBuf;
+ int16_t *mDecoderCookie;
+
+ int16_t mInputSampleBuffer[477];
+
+ bool mIsWide;
+ bool mSignalledError;
+ bool mSignalledOutputEos;
+
+ status_t initDecoder();
+
+ C2_DO_NOT_COPY(C2SoftAmrDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_AMR_DEC_H_
diff --git a/media/codec2/components/amr_nb_wb/C2SoftAmrNbEnc.cpp b/media/codec2/components/amr_nb_wb/C2SoftAmrNbEnc.cpp
new file mode 100644
index 0000000..ca21480
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/C2SoftAmrNbEnc.cpp
@@ -0,0 +1,355 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftAmrNbEnc"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftAmrNbEnc.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.amrnb.encoder";
+
+class C2SoftAmrNbEnc::IntfImpl : public C2InterfaceHelper {
+ public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper>& helper)
+ : C2InterfaceHelper(helper) {
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(
+ new C2StreamFormatConfig::input(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(
+ new C2StreamFormatConfig::output(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_AMR_NB))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::input(0u, 1))
+ .withFields({C2F(mChannelCount, value).equalTo(1)})
+ .withSetter((Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::input(0u, 8000))
+ .withFields({C2F(mSampleRate, value).equalTo(8000)})
+ .withSetter(
+ (Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::output(0u, 4750))
+ .withFields({C2F(mBitrate, value).inRange(4750, 12200)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192))
+ .build());
+ }
+
+ uint32_t getSampleRate() const { return mSampleRate->value; }
+ uint32_t getChannelCount() const { return mChannelCount->value; }
+ uint32_t getBitrate() const { return mBitrate->value; }
+
+ private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::input> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::input> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::output> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftAmrNbEnc::C2SoftAmrNbEnc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl)
+ : SimpleC2Component(
+ std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mEncState(nullptr),
+ mSidState(nullptr) {
+}
+
+C2SoftAmrNbEnc::~C2SoftAmrNbEnc() {
+ onRelease();
+}
+
+c2_status_t C2SoftAmrNbEnc::onInit() {
+ bool dtx_enable = false;
+
+ if (AMREncodeInit(&mEncState, &mSidState, dtx_enable) != 0)
+ return C2_CORRUPTED;
+ // TODO: get mode directly from config
+ switch(mIntf->getBitrate()) {
+ case 4750: mMode = MR475;
+ break;
+ case 5150: mMode = MR515;
+ break;
+ case 5900: mMode = MR59;
+ break;
+ case 6700: mMode = MR67;
+ break;
+ case 7400: mMode = MR74;
+ break;
+ case 7950: mMode = MR795;
+ break;
+ case 10200: mMode = MR102;
+ break;
+ case 12200: mMode = MR122;
+ break;
+ default: mMode = MR795;
+ }
+ mIsFirst = true;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mAnchorTimeStamp = 0;
+ mProcessedSamples = 0;
+ mFilledLen = 0;
+
+ return C2_OK;
+}
+
+void C2SoftAmrNbEnc::onRelease() {
+ if (mEncState) {
+ AMREncodeExit(&mEncState, &mSidState);
+ mEncState = mSidState = nullptr;
+ }
+}
+
+c2_status_t C2SoftAmrNbEnc::onStop() {
+ if (AMREncodeReset(mEncState, mSidState) != 0)
+ return C2_CORRUPTED;
+ mIsFirst = true;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mAnchorTimeStamp = 0;
+ mProcessedSamples = 0;
+ mFilledLen = 0;
+
+ return C2_OK;
+}
+
+void C2SoftAmrNbEnc::onReset() {
+ (void) onStop();
+}
+
+c2_status_t C2SoftAmrNbEnc::onFlush_sm() {
+ return onStop();
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+void C2SoftAmrNbEnc::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x",
+ inSize, (int)work->input.ordinal.timestamp.peeku(),
+ (int)work->input.ordinal.frameIndex.peeku(), work->input.flags);
+
+ size_t outCapacity = kNumBytesPerInputFrame;
+ outCapacity += mFilledLen + inSize;
+ std::shared_ptr<C2LinearBlock> outputBlock;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(outCapacity, usage, &outputBlock);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = outputBlock->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ uint64_t outTimeStamp =
+ mProcessedSamples * 1000000ll / mIntf->getSampleRate();
+ size_t inPos = 0;
+ size_t outPos = 0;
+ while (inPos < inSize) {
+ const uint8_t *inPtr = rView.data() + inOffset;
+ int validSamples = mFilledLen / sizeof(int16_t);
+ if ((inPos + (kNumBytesPerInputFrame - mFilledLen)) <= inSize) {
+ memcpy(mInputFrame + validSamples, inPtr + inPos,
+ (kNumBytesPerInputFrame - mFilledLen));
+ inPos += (kNumBytesPerInputFrame - mFilledLen);
+ } else {
+ memcpy(mInputFrame + validSamples, inPtr + inPos, (inSize - inPos));
+ mFilledLen += (inSize - inPos);
+ inPos += (inSize - inPos);
+ if (eos) {
+ validSamples = mFilledLen / sizeof(int16_t);
+ memset(mInputFrame + validSamples, 0, (kNumBytesPerInputFrame - mFilledLen));
+ } else break;
+
+ }
+ Frame_Type_3GPP frameType;
+ int numEncBytes = AMREncode(mEncState, mSidState, mMode, mInputFrame,
+ wView.data() + outPos, &frameType,
+ AMR_TX_WMF);
+ if (numEncBytes < 0 || numEncBytes > ((int)outCapacity - (int)outPos)) {
+ ALOGE("encodeFrame call failed, state [%d %zu %zu]", numEncBytes, outPos, outCapacity);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ // Convert header byte from WMF to IETF format.
+ if (numEncBytes > 0)
+ wView.data()[outPos] = ((wView.data()[outPos] << 3) | 4) & 0x7c;
+ outPos += numEncBytes;
+ mProcessedSamples += kNumSamplesPerFrame;
+ mFilledLen = 0;
+ }
+ ALOGV("causal sample size %d", mFilledLen);
+ if (mIsFirst) {
+ mIsFirst = false;
+ mAnchorTimeStamp = work->input.ordinal.timestamp.peekull();
+ }
+ fillEmptyWork(work);
+ if (outPos != 0) {
+ work->worklets.front()->output.buffers.push_back(
+ createLinearBuffer(std::move(outputBlock), 0, outPos));
+ work->worklets.front()->output.ordinal.timestamp = mAnchorTimeStamp + outTimeStamp;
+
+ }
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ if (mFilledLen) ALOGV("Discarding trailing %d bytes", mFilledLen);
+ }
+}
+
+c2_status_t C2SoftAmrNbEnc::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ onFlush_sm();
+ return C2_OK;
+}
+
+class C2SoftAmrNbEncFactory : public C2ComponentFactory {
+public:
+ C2SoftAmrNbEncFactory()
+ : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {}
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftAmrNbEnc(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftAmrNbEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftAmrNbEnc::IntfImpl>(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftAmrNbEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftAmrNbEncFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftAmrNbEncFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/amr_nb_wb/C2SoftAmrNbEnc.h b/media/codec2/components/amr_nb_wb/C2SoftAmrNbEnc.h
new file mode 100644
index 0000000..6ab14db
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/C2SoftAmrNbEnc.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_AMR_NB_ENC_H_
+#define ANDROID_C2_SOFT_AMR_NB_ENC_H_
+
+#include <SimpleC2Component.h>
+
+#include "gsmamr_enc.h"
+
+namespace android {
+
+class C2SoftAmrNbEnc : public SimpleC2Component {
+ public:
+ class IntfImpl;
+ C2SoftAmrNbEnc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+ virtual ~C2SoftAmrNbEnc();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ std::shared_ptr<IntfImpl> mIntf;
+ static const int32_t kNumSamplesPerFrame = L_FRAME;
+ static const int32_t kNumBytesPerInputFrame = kNumSamplesPerFrame * sizeof(int16_t);
+
+ void *mEncState;
+ void *mSidState;
+ Mode mMode;
+ bool mIsFirst;
+ bool mSignalledError;
+ bool mSignalledOutputEos;
+ uint64_t mAnchorTimeStamp;
+ uint64_t mProcessedSamples;
+ int32_t mFilledLen;
+ int16_t mInputFrame[kNumSamplesPerFrame];
+
+ C2_DO_NOT_COPY(C2SoftAmrNbEnc);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_AMR_NB_ENC_H_
diff --git a/media/codec2/components/amr_nb_wb/C2SoftAmrWbEnc.cpp b/media/codec2/components/amr_nb_wb/C2SoftAmrWbEnc.cpp
new file mode 100644
index 0000000..be3892f
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/C2SoftAmrWbEnc.cpp
@@ -0,0 +1,430 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftAmrWbEnc"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftAmrWbEnc.h"
+#include "cmnMemory.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.amrwb.encoder";
+
+class C2SoftAmrWbEnc::IntfImpl : public C2InterfaceHelper {
+ public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper>& helper)
+ : C2InterfaceHelper(helper) {
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(
+ new C2StreamFormatConfig::input(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(
+ new C2StreamFormatConfig::output(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_AMR_WB))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::input(0u, 1))
+ .withFields({C2F(mChannelCount, value).equalTo(1)})
+ .withSetter((Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::input(0u, 16000))
+ .withFields({C2F(mSampleRate, value).equalTo(16000)})
+ .withSetter(
+ (Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::output(0u, 6600))
+ .withFields({C2F(mBitrate, value).inRange(6600, 23850)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192))
+ .build());
+ }
+
+ uint32_t getSampleRate() const { return mSampleRate->value; }
+ uint32_t getChannelCount() const { return mChannelCount->value; }
+ uint32_t getBitrate() const { return mBitrate->value; }
+
+ private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::input> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::input> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::output> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftAmrWbEnc::C2SoftAmrWbEnc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl)
+ : SimpleC2Component(
+ std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mEncoderHandle(nullptr),
+ mApiHandle(nullptr),
+ mMemOperator(nullptr) {
+}
+
+C2SoftAmrWbEnc::~C2SoftAmrWbEnc() {
+ onRelease();
+}
+
+c2_status_t C2SoftAmrWbEnc::onInit() {
+ // TODO: get mode directly from config
+ switch(mIntf->getBitrate()) {
+ case 6600: mMode = VOAMRWB_MD66;
+ break;
+ case 8850: mMode = VOAMRWB_MD885;
+ break;
+ case 12650: mMode = VOAMRWB_MD1265;
+ break;
+ case 14250: mMode = VOAMRWB_MD1425;
+ break;
+ case 15850: mMode = VOAMRWB_MD1585;
+ break;
+ case 18250: mMode = VOAMRWB_MD1825;
+ break;
+ case 19850: mMode = VOAMRWB_MD1985;
+ break;
+ case 23050: mMode = VOAMRWB_MD2305;
+ break;
+ case 23850: mMode = VOAMRWB_MD2385;
+ break;
+ default: mMode = VOAMRWB_MD2305;
+ }
+ status_t err = initEncoder();
+ mIsFirst = true;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mAnchorTimeStamp = 0;
+ mProcessedSamples = 0;
+ mFilledLen = 0;
+
+ return err == OK ? C2_OK : C2_NO_MEMORY;
+}
+
+void C2SoftAmrWbEnc::onRelease() {
+ if (mEncoderHandle) {
+ CHECK_EQ((VO_U32)VO_ERR_NONE, mApiHandle->Uninit(mEncoderHandle));
+ mEncoderHandle = nullptr;
+ }
+ if (mApiHandle) {
+ delete mApiHandle;
+ mApiHandle = nullptr;
+ }
+ if (mMemOperator) {
+ delete mMemOperator;
+ mMemOperator = nullptr;
+ }
+}
+
+c2_status_t C2SoftAmrWbEnc::onStop() {
+ for (int i = 0; i < kNumSamplesPerFrame; i++) {
+ mInputFrame[i] = 0x0008; /* EHF_MASK */
+ }
+ uint8_t outBuffer[kNumBytesPerInputFrame];
+ (void) encodeInput(outBuffer, kNumBytesPerInputFrame);
+ mIsFirst = true;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mAnchorTimeStamp = 0;
+ mProcessedSamples = 0;
+ mFilledLen = 0;
+
+ return C2_OK;
+}
+
+void C2SoftAmrWbEnc::onReset() {
+ (void) onStop();
+}
+
+c2_status_t C2SoftAmrWbEnc::onFlush_sm() {
+ return onStop();
+}
+
+status_t C2SoftAmrWbEnc::initEncoder() {
+ mApiHandle = new VO_AUDIO_CODECAPI;
+ if (!mApiHandle) return NO_MEMORY;
+
+ if (VO_ERR_NONE != voGetAMRWBEncAPI(mApiHandle)) {
+ ALOGE("Failed to get api handle");
+ return UNKNOWN_ERROR;
+ }
+
+ mMemOperator = new VO_MEM_OPERATOR;
+ if (!mMemOperator) return NO_MEMORY;
+
+ mMemOperator->Alloc = cmnMemAlloc;
+ mMemOperator->Copy = cmnMemCopy;
+ mMemOperator->Free = cmnMemFree;
+ mMemOperator->Set = cmnMemSet;
+ mMemOperator->Check = cmnMemCheck;
+
+ VO_CODEC_INIT_USERDATA userData;
+ memset(&userData, 0, sizeof(userData));
+ userData.memflag = VO_IMF_USERMEMOPERATOR;
+ userData.memData = (VO_PTR) mMemOperator;
+
+ if (VO_ERR_NONE != mApiHandle->Init(
+ &mEncoderHandle, VO_AUDIO_CodingAMRWB, &userData)) {
+ ALOGE("Failed to init AMRWB encoder");
+ return UNKNOWN_ERROR;
+ }
+
+ VOAMRWBFRAMETYPE type = VOAMRWB_RFC3267;
+ if (VO_ERR_NONE != mApiHandle->SetParam(
+ mEncoderHandle, VO_PID_AMRWB_FRAMETYPE, &type)) {
+ ALOGE("Failed to set AMRWB encoder frame type to %d", type);
+ return UNKNOWN_ERROR;
+ }
+
+ if (VO_ERR_NONE !=
+ mApiHandle->SetParam(
+ mEncoderHandle, VO_PID_AMRWB_MODE, &mMode)) {
+ ALOGE("Failed to set AMRWB encoder mode to %d", mMode);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+int C2SoftAmrWbEnc::encodeInput(uint8_t *buffer, uint32_t length) {
+ VO_CODECBUFFER inputData;
+ memset(&inputData, 0, sizeof(inputData));
+ inputData.Buffer = (unsigned char *) mInputFrame;
+ inputData.Length = kNumBytesPerInputFrame;
+
+ CHECK_EQ((VO_U32)VO_ERR_NONE,
+ mApiHandle->SetInputData(mEncoderHandle, &inputData));
+
+ VO_AUDIO_OUTPUTINFO outputInfo;
+ memset(&outputInfo, 0, sizeof(outputInfo));
+ VO_CODECBUFFER outputData;
+ memset(&outputData, 0, sizeof(outputData));
+ outputData.Buffer = buffer;
+ outputData.Length = length;
+ VO_U32 ret = mApiHandle->GetOutputData(
+ mEncoderHandle, &outputData, &outputInfo);
+ if (ret != VO_ERR_NONE && ret != VO_ERR_INPUT_BUFFER_SMALL) {
+ ALOGD("encountered error during encode call");
+ return -1;
+ }
+ return outputData.Length;
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+void C2SoftAmrWbEnc::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = rView.error();
+ return;
+ }
+ }
+ bool eos = (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0;
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x",
+ inSize, (int)work->input.ordinal.timestamp.peeku(),
+ (int)work->input.ordinal.frameIndex.peeku(), work->input.flags);
+
+ size_t outCapacity = kNumBytesPerInputFrame;
+ outCapacity += mFilledLen + inSize;
+ std::shared_ptr<C2LinearBlock> outputBlock;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(outCapacity, usage, &outputBlock);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = outputBlock->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+ uint64_t outTimeStamp =
+ mProcessedSamples * 1000000ll / mIntf->getSampleRate();
+ size_t inPos = 0;
+ size_t outPos = 0;
+ while (inPos < inSize) {
+ const uint8_t *inPtr = rView.data() + inOffset;
+ int validSamples = mFilledLen / sizeof(int16_t);
+ if ((inPos + (kNumBytesPerInputFrame - mFilledLen)) <= inSize) {
+ memcpy(mInputFrame + validSamples, inPtr + inPos,
+ (kNumBytesPerInputFrame - mFilledLen));
+ inPos += (kNumBytesPerInputFrame - mFilledLen);
+ } else {
+ memcpy(mInputFrame + validSamples, inPtr + inPos, (inSize - inPos));
+ mFilledLen += (inSize - inPos);
+ inPos += (inSize - inPos);
+ if (eos) {
+ validSamples = mFilledLen / sizeof(int16_t);
+ memset(mInputFrame + validSamples, 0, (kNumBytesPerInputFrame - mFilledLen));
+ } else break;
+ }
+ int numEncBytes = encodeInput((wView.data() + outPos), outCapacity - outPos);
+ if (numEncBytes < 0) {
+ ALOGE("encodeFrame call failed, state [%d %zu %zu]", numEncBytes, outPos, outCapacity);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ outPos += numEncBytes;
+ mProcessedSamples += kNumSamplesPerFrame;
+ mFilledLen = 0;
+ }
+ ALOGV("causal sample size %d", mFilledLen);
+ if (mIsFirst) {
+ mIsFirst = false;
+ mAnchorTimeStamp = work->input.ordinal.timestamp.peekull();
+ }
+ fillEmptyWork(work);
+ if (outPos != 0) {
+ work->worklets.front()->output.buffers.push_back(
+ createLinearBuffer(std::move(outputBlock), 0, outPos));
+ work->worklets.front()->output.ordinal.timestamp = mAnchorTimeStamp + outTimeStamp;
+ }
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ if (mFilledLen) ALOGV("Discarding trailing %d bytes", mFilledLen);
+ }
+}
+
+c2_status_t C2SoftAmrWbEnc::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ onFlush_sm();
+ return C2_OK;
+}
+
+class C2SoftAmrWbEncFactory : public C2ComponentFactory {
+public:
+ C2SoftAmrWbEncFactory()
+ : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {}
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftAmrWbEnc(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftAmrWbEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftAmrWbEnc::IntfImpl>(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftAmrWbEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftAmrWbEncFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftAmrWbEncFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/amr_nb_wb/C2SoftAmrWbEnc.h b/media/codec2/components/amr_nb_wb/C2SoftAmrWbEnc.h
new file mode 100644
index 0000000..0cc9e9f
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/C2SoftAmrWbEnc.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_AMR_WB_ENC_H_
+#define ANDROID_C2_SOFT_AMR_WB_ENC_H_
+
+#include <SimpleC2Component.h>
+
+#include "voAMRWB.h"
+
+namespace android {
+
+class C2SoftAmrWbEnc : public SimpleC2Component {
+public:
+ class IntfImpl;
+ C2SoftAmrWbEnc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+ virtual ~C2SoftAmrWbEnc();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ std::shared_ptr<IntfImpl> mIntf;
+ static const int32_t kNumSamplesPerFrame = 320;
+ static const int32_t kNumBytesPerInputFrame = kNumSamplesPerFrame * sizeof(int16_t);
+
+ void *mEncoderHandle;
+ VO_AUDIO_CODECAPI *mApiHandle;
+ VO_MEM_OPERATOR *mMemOperator;
+ VOAMRWBMODE mMode;
+ bool mIsFirst;
+ bool mSignalledError;
+ bool mSignalledOutputEos;
+ uint64_t mAnchorTimeStamp;
+ uint64_t mProcessedSamples;
+ int32_t mFilledLen;
+ int16_t mInputFrame[kNumSamplesPerFrame];
+
+ status_t initEncoder();
+ int encodeInput(uint8_t *buffer, uint32_t length);
+
+ C2_DO_NOT_COPY(C2SoftAmrWbEnc);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_AMR_WB_ENC_H_
diff --git a/media/codec2/components/amr_nb_wb/MODULE_LICENSE_APACHE2 b/media/codec2/components/amr_nb_wb/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/amr_nb_wb/NOTICE b/media/codec2/components/amr_nb_wb/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/amr_nb_wb/patent_disclaimer.txt b/media/codec2/components/amr_nb_wb/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/codec2/components/amr_nb_wb/patent_disclaimer.txt
@@ -0,0 +1,9 @@
+
+THIS IS NOT A GRANT OF PATENT RIGHTS.
+
+Google makes no representation or warranty that the codecs for which
+source code is made available hereunder are unencumbered by
+third-party patents. Those intending to use this source code in
+hardware or software products are advised that implementations of
+these codecs, including in open source software or shareware, may
+require patent licenses from the relevant patent holders.
diff --git a/media/codec2/components/avc/Android.bp b/media/codec2/components/avc/Android.bp
new file mode 100644
index 0000000..4021444
--- /dev/null
+++ b/media/codec2/components/avc/Android.bp
@@ -0,0 +1,37 @@
+cc_library_shared {
+ name: "libcodec2_soft_avcdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_signed-defaults",
+ ],
+
+ static_libs: ["libavcdec"],
+
+ srcs: ["C2SoftAvcDec.cpp"],
+
+ include_dirs: [
+ "external/libavc/decoder",
+ "external/libavc/common",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_avcenc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_signed-defaults",
+ ],
+
+ static_libs: ["libavcenc"],
+
+ srcs: ["C2SoftAvcEnc.cpp"],
+
+ include_dirs: [
+ "external/libavc/encoder",
+ "external/libavc/common",
+ ],
+
+ cflags: [
+ "-Wno-unused-variable",
+ ],
+}
diff --git a/media/codec2/components/avc/C2SoftAvcDec.cpp b/media/codec2/components/avc/C2SoftAvcDec.cpp
new file mode 100644
index 0000000..3e62744
--- /dev/null
+++ b/media/codec2/components/avc/C2SoftAvcDec.cpp
@@ -0,0 +1,978 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftAvcDec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <Codec2Mapper.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftAvcDec.h"
+#include "ih264d.h"
+
+namespace android {
+
+namespace {
+
+constexpr char COMPONENT_NAME[] = "c2.android.avc.decoder";
+
+} // namespace
+
+class C2SoftAvcDec::IntfImpl : public SimpleInterface<void>::BaseParams {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : SimpleInterface<void>::BaseParams(
+ helper,
+ COMPONENT_NAME,
+ C2Component::KIND_DECODER,
+ C2Component::DOMAIN_VIDEO,
+ MEDIA_MIMETYPE_VIDEO_AVC) {
+ noPrivateBuffers(); // TODO: account for our buffers here
+ noInputReferences();
+ noOutputReferences();
+ noInputLatency();
+ noTimeStretch();
+
+ // TODO: output latency and reordering
+
+ addParameter(
+ DefineParam(mAttrib, C2_PARAMKEY_COMPONENT_ATTRIBUTES)
+ .withConstValue(new C2ComponentAttributesSetting(C2Component::ATTRIB_IS_TEMPORAL))
+ .build());
+
+ // coded and output picture size is the same for this codec
+ addParameter(
+ DefineParam(mSize, C2_PARAMKEY_PICTURE_SIZE)
+ .withDefault(new C2StreamPictureSizeInfo::output(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 4080, 2),
+ C2F(mSize, height).inRange(2, 4080, 2),
+ })
+ .withSetter(SizeSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mMaxSize, C2_PARAMKEY_MAX_PICTURE_SIZE)
+ .withDefault(new C2StreamMaxPictureSizeTuning::output(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 4080, 2),
+ C2F(mSize, height).inRange(2, 4080, 2),
+ })
+ .withSetter(MaxPictureSizeSetter, mSize)
+ .build());
+
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_AVC_CONSTRAINED_BASELINE, C2Config::LEVEL_AVC_5_2))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ C2Config::PROFILE_AVC_CONSTRAINED_BASELINE,
+ C2Config::PROFILE_AVC_BASELINE,
+ C2Config::PROFILE_AVC_MAIN,
+ C2Config::PROFILE_AVC_CONSTRAINED_HIGH,
+ C2Config::PROFILE_AVC_PROGRESSIVE_HIGH,
+ C2Config::PROFILE_AVC_HIGH}),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_AVC_1, C2Config::LEVEL_AVC_1B, C2Config::LEVEL_AVC_1_1,
+ C2Config::LEVEL_AVC_1_2, C2Config::LEVEL_AVC_1_3,
+ C2Config::LEVEL_AVC_2, C2Config::LEVEL_AVC_2_1, C2Config::LEVEL_AVC_2_2,
+ C2Config::LEVEL_AVC_3, C2Config::LEVEL_AVC_3_1, C2Config::LEVEL_AVC_3_2,
+ C2Config::LEVEL_AVC_4, C2Config::LEVEL_AVC_4_1, C2Config::LEVEL_AVC_4_2,
+ C2Config::LEVEL_AVC_5, C2Config::LEVEL_AVC_5_1, C2Config::LEVEL_AVC_5_2
+ })
+ })
+ .withSetter(ProfileLevelSetter, mSize)
+ .build());
+
+ addParameter(
+ DefineParam(mMaxInputSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, 320 * 240 * 3 / 4))
+ .withFields({
+ C2F(mMaxInputSize, value).any(),
+ })
+ .calculatedAs(MaxInputSizeSetter, mMaxSize)
+ .build());
+
+ C2ChromaOffsetStruct locations[1] = { C2ChromaOffsetStruct::ITU_YUV_420_0() };
+ std::shared_ptr<C2StreamColorInfo::output> defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ 1u, 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ memcpy(defaultColorInfo->m.locations, locations, sizeof(locations));
+
+ defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ { C2ChromaOffsetStruct::ITU_YUV_420_0() },
+ 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ helper->addStructDescriptors<C2ChromaOffsetStruct>();
+
+ addParameter(
+ DefineParam(mColorInfo, C2_PARAMKEY_CODED_COLOR_INFO)
+ .withConstValue(defaultColorInfo)
+ .build());
+
+ addParameter(
+ DefineParam(mDefaultColorAspects, C2_PARAMKEY_DEFAULT_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsTuning::output(
+ 0u, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mDefaultColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mDefaultColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mDefaultColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mDefaultColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(DefaultColorAspectsSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mCodedColorAspects, C2_PARAMKEY_VUI_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsInfo::input(
+ 0u, C2Color::RANGE_LIMITED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mCodedColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mCodedColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mCodedColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mCodedColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(CodedColorAspectsSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mColorAspects, C2_PARAMKEY_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsInfo::output(
+ 0u, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(ColorAspectsSetter, mDefaultColorAspects, mCodedColorAspects)
+ .build());
+
+ // TODO: support more formats?
+ addParameter(
+ DefineParam(mPixelFormat, C2_PARAMKEY_PIXEL_FORMAT)
+ .withConstValue(new C2StreamPixelFormatInfo::output(
+ 0u, HAL_PIXEL_FORMAT_YCBCR_420_888))
+ .build());
+ }
+
+ static C2R SizeSetter(bool mayBlock, const C2P<C2StreamPictureSizeInfo::output> &oldMe,
+ C2P<C2VideoSizeStreamInfo::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+ me.set().width = oldMe.v.width;
+ }
+ if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
+ me.set().height = oldMe.v.height;
+ }
+ return res;
+ }
+
+ static C2R MaxPictureSizeSetter(bool mayBlock, C2P<C2StreamMaxPictureSizeTuning::output> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ // TODO: get max width/height from the size's field helpers vs. hardcoding
+ me.set().width = c2_min(c2_max(me.v.width, size.v.width), 4080u);
+ me.set().height = c2_min(c2_max(me.v.height, size.v.height), 4080u);
+ return C2R::Ok();
+ }
+
+ static C2R MaxInputSizeSetter(bool mayBlock, C2P<C2StreamMaxBufferSizeInfo::input> &me,
+ const C2P<C2StreamMaxPictureSizeTuning::output> &maxSize) {
+ (void)mayBlock;
+ // assume compression ratio of 2
+ me.set().value = (((maxSize.v.width + 15) / 16) * ((maxSize.v.height + 15) / 16) * 192);
+ return C2R::Ok();
+ }
+
+ static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::input> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ (void)size;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+
+ static C2R DefaultColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsTuning::output> &me) {
+ (void)mayBlock;
+ if (me.v.range > C2Color::RANGE_OTHER) {
+ me.set().range = C2Color::RANGE_OTHER;
+ }
+ if (me.v.primaries > C2Color::PRIMARIES_OTHER) {
+ me.set().primaries = C2Color::PRIMARIES_OTHER;
+ }
+ if (me.v.transfer > C2Color::TRANSFER_OTHER) {
+ me.set().transfer = C2Color::TRANSFER_OTHER;
+ }
+ if (me.v.matrix > C2Color::MATRIX_OTHER) {
+ me.set().matrix = C2Color::MATRIX_OTHER;
+ }
+ return C2R::Ok();
+ }
+
+ static C2R CodedColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::input> &me) {
+ (void)mayBlock;
+ if (me.v.range > C2Color::RANGE_OTHER) {
+ me.set().range = C2Color::RANGE_OTHER;
+ }
+ if (me.v.primaries > C2Color::PRIMARIES_OTHER) {
+ me.set().primaries = C2Color::PRIMARIES_OTHER;
+ }
+ if (me.v.transfer > C2Color::TRANSFER_OTHER) {
+ me.set().transfer = C2Color::TRANSFER_OTHER;
+ }
+ if (me.v.matrix > C2Color::MATRIX_OTHER) {
+ me.set().matrix = C2Color::MATRIX_OTHER;
+ }
+ return C2R::Ok();
+ }
+
+ static C2R ColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::output> &me,
+ const C2P<C2StreamColorAspectsTuning::output> &def,
+ const C2P<C2StreamColorAspectsInfo::input> &coded) {
+ (void)mayBlock;
+ // take default values for all unspecified fields, and coded values for specified ones
+ me.set().range = coded.v.range == RANGE_UNSPECIFIED ? def.v.range : coded.v.range;
+ me.set().primaries = coded.v.primaries == PRIMARIES_UNSPECIFIED
+ ? def.v.primaries : coded.v.primaries;
+ me.set().transfer = coded.v.transfer == TRANSFER_UNSPECIFIED
+ ? def.v.transfer : coded.v.transfer;
+ me.set().matrix = coded.v.matrix == MATRIX_UNSPECIFIED ? def.v.matrix : coded.v.matrix;
+ return C2R::Ok();
+ }
+
+ std::shared_ptr<C2StreamColorAspectsInfo::output> getColorAspects_l() {
+ return mColorAspects;
+ }
+
+private:
+ std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
+ std::shared_ptr<C2StreamPictureSizeInfo::output> mSize;
+ std::shared_ptr<C2StreamMaxPictureSizeTuning::output> mMaxSize;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mMaxInputSize;
+ std::shared_ptr<C2StreamColorInfo::output> mColorInfo;
+ std::shared_ptr<C2StreamColorAspectsInfo::input> mCodedColorAspects;
+ std::shared_ptr<C2StreamColorAspectsTuning::output> mDefaultColorAspects;
+ std::shared_ptr<C2StreamColorAspectsInfo::output> mColorAspects;
+ std::shared_ptr<C2StreamPixelFormatInfo::output> mPixelFormat;
+};
+
+static size_t getCpuCoreCount() {
+ long cpuCoreCount = 1;
+#if defined(_SC_NPROCESSORS_ONLN)
+ cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
+#else
+ // _SC_NPROC_ONLN must be defined...
+ cpuCoreCount = sysconf(_SC_NPROC_ONLN);
+#endif
+ CHECK(cpuCoreCount >= 1);
+ ALOGV("Number of CPU cores: %ld", cpuCoreCount);
+ return (size_t)cpuCoreCount;
+}
+
+static void *ivd_aligned_malloc(void *ctxt, WORD32 alignment, WORD32 size) {
+ (void) ctxt;
+ return memalign(alignment, size);
+}
+
+static void ivd_aligned_free(void *ctxt, void *mem) {
+ (void) ctxt;
+ free(mem);
+}
+
+C2SoftAvcDec::C2SoftAvcDec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mDecHandle(nullptr),
+ mOutBufferFlush(nullptr),
+ mIvColorFormat(IV_YUV_420P),
+ mWidth(320),
+ mHeight(240),
+ mHeaderDecoded(false) {
+ GENERATE_FILE_NAMES();
+ CREATE_DUMP_FILE(mInFile);
+}
+
+C2SoftAvcDec::~C2SoftAvcDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftAvcDec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+c2_status_t C2SoftAvcDec::onStop() {
+ if (OK != resetDecoder()) return C2_CORRUPTED;
+ resetPlugin();
+ return C2_OK;
+}
+
+void C2SoftAvcDec::onReset() {
+ (void) onStop();
+}
+
+void C2SoftAvcDec::onRelease() {
+ (void) deleteDecoder();
+ if (mOutBufferFlush) {
+ ivd_aligned_free(nullptr, mOutBufferFlush);
+ mOutBufferFlush = nullptr;
+ }
+ if (mOutBlock) {
+ mOutBlock.reset();
+ }
+}
+
+c2_status_t C2SoftAvcDec::onFlush_sm() {
+ if (OK != setFlushMode()) return C2_CORRUPTED;
+
+ uint32_t bufferSize = mStride * mHeight * 3 / 2;
+ mOutBufferFlush = (uint8_t *)ivd_aligned_malloc(nullptr, 128, bufferSize);
+ if (!mOutBufferFlush) {
+ ALOGE("could not allocate tmp output buffer (for flush) of size %u ", bufferSize);
+ return C2_NO_MEMORY;
+ }
+
+ while (true) {
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+
+ setDecodeArgs(&s_decode_ip, &s_decode_op, nullptr, nullptr, 0, 0, 0);
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ if (0 == s_decode_op.u4_output_present) {
+ resetPlugin();
+ break;
+ }
+ }
+
+ if (mOutBufferFlush) {
+ ivd_aligned_free(nullptr, mOutBufferFlush);
+ mOutBufferFlush = nullptr;
+ }
+
+ return C2_OK;
+}
+
+status_t C2SoftAvcDec::createDecoder() {
+ ivdext_create_ip_t s_create_ip;
+ ivdext_create_op_t s_create_op;
+
+ s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ivdext_create_ip_t);
+ s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE;
+ s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = 0;
+ s_create_ip.s_ivd_create_ip_t.e_output_format = mIvColorFormat;
+ s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ivd_aligned_malloc;
+ s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ivd_aligned_free;
+ s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = nullptr;
+ s_create_op.s_ivd_create_op_t.u4_size = sizeof(ivdext_create_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(nullptr,
+ &s_create_ip,
+ &s_create_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__,
+ s_create_op.s_ivd_create_op_t.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+ mDecHandle = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle;
+ mDecHandle->pv_fxns = (void *)ivdec_api_function;
+ mDecHandle->u4_size = sizeof(iv_obj_t);
+
+ return OK;
+}
+
+status_t C2SoftAvcDec::setNumCores() {
+ ivdext_ctl_set_num_cores_ip_t s_set_num_cores_ip;
+ ivdext_ctl_set_num_cores_op_t s_set_num_cores_op;
+
+ s_set_num_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t);
+ s_set_num_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_num_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES;
+ s_set_num_cores_ip.u4_num_cores = mNumCores;
+ s_set_num_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_num_cores_ip,
+ &s_set_num_cores_op);
+ if (IV_SUCCESS != status) {
+ ALOGD("error in %s: 0x%x", __func__, s_set_num_cores_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftAvcDec::setParams(size_t stride, IVD_VIDEO_DECODE_MODE_T dec_mode) {
+ ivd_ctl_set_config_ip_t s_set_dyn_params_ip;
+ ivd_ctl_set_config_op_t s_set_dyn_params_op;
+
+ s_set_dyn_params_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
+ s_set_dyn_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_dyn_params_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
+ s_set_dyn_params_ip.u4_disp_wd = (UWORD32) stride;
+ s_set_dyn_params_ip.e_frm_skip_mode = IVD_SKIP_NONE;
+ s_set_dyn_params_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
+ s_set_dyn_params_ip.e_vid_dec_mode = dec_mode;
+ s_set_dyn_params_op.u4_size = sizeof(ivd_ctl_set_config_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_dyn_params_ip,
+ &s_set_dyn_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__, s_set_dyn_params_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+void C2SoftAvcDec::getVersion() {
+ ivd_ctl_getversioninfo_ip_t s_get_versioninfo_ip;
+ ivd_ctl_getversioninfo_op_t s_get_versioninfo_op;
+ UWORD8 au1_buf[512];
+
+ s_get_versioninfo_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t);
+ s_get_versioninfo_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_get_versioninfo_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION;
+ s_get_versioninfo_ip.pv_version_buffer = au1_buf;
+ s_get_versioninfo_ip.u4_version_buffer_size = sizeof(au1_buf);
+ s_get_versioninfo_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_get_versioninfo_ip,
+ &s_get_versioninfo_op);
+ if (status != IV_SUCCESS) {
+ ALOGD("error in %s: 0x%x", __func__,
+ s_get_versioninfo_op.u4_error_code);
+ } else {
+ ALOGV("ittiam decoder version number: %s",
+ (char *) s_get_versioninfo_ip.pv_version_buffer);
+ }
+}
+
+status_t C2SoftAvcDec::initDecoder() {
+ if (OK != createDecoder()) return UNKNOWN_ERROR;
+ mNumCores = MIN(getCpuCoreCount(), MAX_NUM_CORES);
+ mStride = ALIGN64(mWidth);
+ mSignalledError = false;
+ resetPlugin();
+ (void) setNumCores();
+ if (OK != setParams(mStride, IVD_DECODE_FRAME)) return UNKNOWN_ERROR;
+ (void) getVersion();
+
+ return OK;
+}
+
+bool C2SoftAvcDec::setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
+ ivd_video_decode_op_t *ps_decode_op,
+ C2ReadView *inBuffer,
+ C2GraphicView *outBuffer,
+ size_t inOffset,
+ size_t inSize,
+ uint32_t tsMarker) {
+ uint32_t displayStride = mStride;
+ uint32_t displayHeight = mHeight;
+ size_t lumaSize = displayStride * displayHeight;
+ size_t chromaSize = lumaSize >> 2;
+
+ ps_decode_ip->u4_size = sizeof(ivd_video_decode_ip_t);
+ ps_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
+ if (inBuffer) {
+ ps_decode_ip->u4_ts = tsMarker;
+ ps_decode_ip->pv_stream_buffer = const_cast<uint8_t *>(inBuffer->data() + inOffset);
+ ps_decode_ip->u4_num_Bytes = inSize;
+ } else {
+ ps_decode_ip->u4_ts = 0;
+ ps_decode_ip->pv_stream_buffer = nullptr;
+ ps_decode_ip->u4_num_Bytes = 0;
+ }
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[0] = lumaSize;
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[1] = chromaSize;
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[2] = chromaSize;
+ if (outBuffer) {
+ if (outBuffer->width() < displayStride || outBuffer->height() < displayHeight) {
+ ALOGE("Output buffer too small: provided (%dx%d) required (%ux%u)",
+ outBuffer->width(), outBuffer->height(), displayStride, displayHeight);
+ return false;
+ }
+ ps_decode_ip->s_out_buffer.pu1_bufs[0] = outBuffer->data()[C2PlanarLayout::PLANE_Y];
+ ps_decode_ip->s_out_buffer.pu1_bufs[1] = outBuffer->data()[C2PlanarLayout::PLANE_U];
+ ps_decode_ip->s_out_buffer.pu1_bufs[2] = outBuffer->data()[C2PlanarLayout::PLANE_V];
+ } else {
+ ps_decode_ip->s_out_buffer.pu1_bufs[0] = mOutBufferFlush;
+ ps_decode_ip->s_out_buffer.pu1_bufs[1] = mOutBufferFlush + lumaSize;
+ ps_decode_ip->s_out_buffer.pu1_bufs[2] = mOutBufferFlush + lumaSize + chromaSize;
+ }
+ ps_decode_ip->s_out_buffer.u4_num_bufs = 3;
+ ps_decode_op->u4_size = sizeof(ivd_video_decode_op_t);
+
+ return true;
+}
+
+bool C2SoftAvcDec::getVuiParams() {
+ ivdext_ctl_get_vui_params_ip_t s_get_vui_params_ip;
+ ivdext_ctl_get_vui_params_op_t s_get_vui_params_op;
+
+ s_get_vui_params_ip.u4_size = sizeof(ivdext_ctl_get_vui_params_ip_t);
+ s_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_get_vui_params_ip.e_sub_cmd =
+ (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_VUI_PARAMS;
+ s_get_vui_params_op.u4_size = sizeof(ivdext_ctl_get_vui_params_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_get_vui_params_ip,
+ &s_get_vui_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGD("error in %s: 0x%x", __func__, s_get_vui_params_op.u4_error_code);
+ return false;
+ }
+
+ VuiColorAspects vuiColorAspects;
+ vuiColorAspects.primaries = s_get_vui_params_op.u1_colour_primaries;
+ vuiColorAspects.transfer = s_get_vui_params_op.u1_tfr_chars;
+ vuiColorAspects.coeffs = s_get_vui_params_op.u1_matrix_coeffs;
+ vuiColorAspects.fullRange = s_get_vui_params_op.u1_video_full_range_flag;
+
+ // convert vui aspects to C2 values if changed
+ if (!(vuiColorAspects == mBitstreamColorAspects)) {
+ mBitstreamColorAspects = vuiColorAspects;
+ ColorAspects sfAspects;
+ C2StreamColorAspectsInfo::input codedAspects = { 0u };
+ ColorUtils::convertIsoColorAspectsToCodecAspects(
+ vuiColorAspects.primaries, vuiColorAspects.transfer, vuiColorAspects.coeffs,
+ vuiColorAspects.fullRange, sfAspects);
+ if (!C2Mapper::map(sfAspects.mPrimaries, &codedAspects.primaries)) {
+ codedAspects.primaries = C2Color::PRIMARIES_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mRange, &codedAspects.range)) {
+ codedAspects.range = C2Color::RANGE_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mMatrixCoeffs, &codedAspects.matrix)) {
+ codedAspects.matrix = C2Color::MATRIX_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mTransfer, &codedAspects.transfer)) {
+ codedAspects.transfer = C2Color::TRANSFER_UNSPECIFIED;
+ }
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ (void)mIntf->config({&codedAspects}, C2_MAY_BLOCK, &failures);
+ }
+ return true;
+}
+
+status_t C2SoftAvcDec::setFlushMode() {
+ ivd_ctl_flush_ip_t s_set_flush_ip;
+ ivd_ctl_flush_op_t s_set_flush_op;
+
+ s_set_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t);
+ s_set_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH;
+ s_set_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_flush_ip,
+ &s_set_flush_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__, s_set_flush_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftAvcDec::resetDecoder() {
+ ivd_ctl_reset_ip_t s_reset_ip;
+ ivd_ctl_reset_op_t s_reset_op;
+
+ s_reset_ip.u4_size = sizeof(ivd_ctl_reset_ip_t);
+ s_reset_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_reset_ip.e_sub_cmd = IVD_CMD_CTL_RESET;
+ s_reset_op.u4_size = sizeof(ivd_ctl_reset_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_reset_ip,
+ &s_reset_op);
+ if (IV_SUCCESS != status) {
+ ALOGE("error in %s: 0x%x", __func__, s_reset_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+ mStride = 0;
+ (void) setNumCores();
+ mSignalledError = false;
+ mHeaderDecoded = false;
+
+ return OK;
+}
+
+void C2SoftAvcDec::resetPlugin() {
+ mSignalledOutputEos = false;
+ gettimeofday(&mTimeStart, nullptr);
+ gettimeofday(&mTimeEnd, nullptr);
+}
+
+status_t C2SoftAvcDec::deleteDecoder() {
+ if (mDecHandle) {
+ ivdext_delete_ip_t s_delete_ip;
+ ivdext_delete_op_t s_delete_op;
+
+ s_delete_ip.s_ivd_delete_ip_t.u4_size = sizeof(ivdext_delete_ip_t);
+ s_delete_ip.s_ivd_delete_ip_t.e_cmd = IVD_CMD_DELETE;
+ s_delete_op.s_ivd_delete_op_t.u4_size = sizeof(ivdext_delete_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_delete_ip,
+ &s_delete_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__,
+ s_delete_op.s_ivd_delete_op_t.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+ mDecHandle = nullptr;
+ }
+
+ return OK;
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+void C2SoftAvcDec::finishWork(uint64_t index, const std::unique_ptr<C2Work> &work) {
+ std::shared_ptr<C2Buffer> buffer = createGraphicBuffer(std::move(mOutBlock),
+ C2Rect(mWidth, mHeight));
+ mOutBlock = nullptr;
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ buffer->setInfo(mIntf->getColorAspects_l());
+ }
+
+ auto fillWork = [buffer](const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)0;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(buffer);
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ };
+ if (work && c2_cntr64_t(index) == work->input.ordinal.frameIndex) {
+ fillWork(work);
+ } else {
+ finish(index, fillWork);
+ }
+}
+
+c2_status_t C2SoftAvcDec::ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool) {
+ if (!mDecHandle) {
+ ALOGE("not supposed to be here, invalid decoder context");
+ return C2_CORRUPTED;
+ }
+ if (mStride != ALIGN64(mWidth)) {
+ mStride = ALIGN64(mWidth);
+ if (OK != setParams(mStride, IVD_DECODE_FRAME)) return C2_CORRUPTED;
+ }
+ if (mOutBlock &&
+ (mOutBlock->width() != mStride || mOutBlock->height() != mHeight)) {
+ mOutBlock.reset();
+ }
+ if (!mOutBlock) {
+ uint32_t format = HAL_PIXEL_FORMAT_YV12;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchGraphicBlock(mStride, mHeight, format, usage, &mOutBlock);
+ if (err != C2_OK) {
+ ALOGE("fetchGraphicBlock for Output failed with status %d", err);
+ return err;
+ }
+ ALOGV("provided (%dx%d) required (%dx%d)",
+ mOutBlock->width(), mOutBlock->height(), mStride, mHeight);
+ }
+
+ return C2_OK;
+}
+
+// TODO: can overall error checking be improved?
+// TODO: allow configuration of color format and usage for graphic buffers instead
+// of hard coding them to HAL_PIXEL_FORMAT_YV12
+// TODO: pass coloraspects information to surface
+// TODO: test support for dynamic change in resolution
+// TODO: verify if the decoder sent back all frames
+void C2SoftAvcDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 0u;
+ work->worklets.front()->output.flags = work->input.flags;
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ uint32_t workIndex = work->input.ordinal.frameIndex.peeku() & 0xFFFFFFFF;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = rView.error();
+ return;
+ }
+ }
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ bool hasPicture = false;
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x",
+ inSize, (int)work->input.ordinal.timestamp.peeku(),
+ (int)work->input.ordinal.frameIndex.peeku(), work->input.flags);
+ size_t inPos = 0;
+ while (inPos < inSize) {
+ if (C2_OK != ensureDecoderState(pool)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+ {
+ C2GraphicView wView = mOutBlock->map().get();
+ if (wView.error()) {
+ ALOGE("graphic view map failed %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+ if (!setDecodeArgs(&s_decode_ip, &s_decode_op, &rView, &wView,
+ inOffset + inPos, inSize - inPos, workIndex)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ if (false == mHeaderDecoded) {
+ /* Decode header and get dimensions */
+ setParams(mStride, IVD_DECODE_HEADER);
+ }
+
+ WORD32 delay;
+ GETTIME(&mTimeStart, nullptr);
+ TIME_DIFF(mTimeEnd, mTimeStart, delay);
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ WORD32 decodeTime;
+ GETTIME(&mTimeEnd, nullptr);
+ TIME_DIFF(mTimeStart, mTimeEnd, decodeTime);
+ ALOGV("decodeTime=%6d delay=%6d numBytes=%6d", decodeTime, delay,
+ s_decode_op.u4_num_bytes_consumed);
+ }
+ if (IVD_MEM_ALLOC_FAILED == (s_decode_op.u4_error_code & 0xFF)) {
+ ALOGE("allocation failure in decoder");
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ } else if (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_decode_op.u4_error_code & 0xFF)) {
+ ALOGE("unsupported resolution : %dx%d", mWidth, mHeight);
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ } else if (IVD_RES_CHANGED == (s_decode_op.u4_error_code & 0xFF)) {
+ ALOGV("resolution changed");
+ drainInternal(DRAIN_COMPONENT_NO_EOS, pool, work);
+ resetDecoder();
+ resetPlugin();
+ work->workletsProcessed = 0u;
+
+ /* Decode header and get new dimensions */
+ setParams(mStride, IVD_DECODE_HEADER);
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ }
+ if (0 < s_decode_op.u4_pic_wd && 0 < s_decode_op.u4_pic_ht) {
+ if (mHeaderDecoded == false) {
+ mHeaderDecoded = true;
+ setParams(ALIGN64(s_decode_op.u4_pic_wd), IVD_DECODE_FRAME);
+ }
+ if (s_decode_op.u4_pic_wd != mWidth || s_decode_op.u4_pic_ht != mHeight) {
+ mWidth = s_decode_op.u4_pic_wd;
+ mHeight = s_decode_op.u4_pic_ht;
+ CHECK_EQ(0u, s_decode_op.u4_output_present);
+
+ C2VideoSizeStreamInfo::output size(0u, mWidth, mHeight);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config({&size}, C2_MAY_BLOCK, &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(size));
+ } else {
+ ALOGE("Cannot set width and height");
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ continue;
+ }
+ }
+ (void)getVuiParams();
+ hasPicture |= (1 == s_decode_op.u4_frame_decoded_flag);
+ if (s_decode_op.u4_output_present) {
+ finishWork(s_decode_op.u4_ts, work);
+ }
+ if (0 == s_decode_op.u4_num_bytes_consumed) {
+ ALOGD("Bytes consumed is zero. Ignoring remaining bytes");
+ break;
+ }
+ inPos += s_decode_op.u4_num_bytes_consumed;
+ if (hasPicture && (inSize - inPos)) {
+ ALOGD("decoded frame in current access nal, ignoring further trailing bytes %d",
+ (int)inSize - (int)inPos);
+ break;
+ }
+ }
+ if (eos) {
+ drainInternal(DRAIN_COMPONENT_WITH_EOS, pool, work);
+ mSignalledOutputEos = true;
+ } else if (!hasPicture) {
+ fillEmptyWork(work);
+ }
+}
+
+c2_status_t C2SoftAvcDec::drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work) {
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ if (OK != setFlushMode()) return C2_CORRUPTED;
+ while (true) {
+ if (C2_OK != ensureDecoderState(pool)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return C2_CORRUPTED;
+ }
+ C2GraphicView wView = mOutBlock->map().get();
+ if (wView.error()) {
+ ALOGE("graphic view map failed %d", wView.error());
+ return C2_CORRUPTED;
+ }
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+ if (!setDecodeArgs(&s_decode_ip, &s_decode_op, nullptr, &wView, 0, 0, 0)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ return C2_CORRUPTED;
+ }
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ if (s_decode_op.u4_output_present) {
+ finishWork(s_decode_op.u4_ts, work);
+ } else {
+ fillEmptyWork(work);
+ break;
+ }
+ }
+
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ return drainInternal(drainMode, pool, nullptr);
+}
+
+class C2SoftAvcDecFactory : public C2ComponentFactory {
+public:
+ C2SoftAvcDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftAvcDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftAvcDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftAvcDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftAvcDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftAvcDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftAvcDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/avc/C2SoftAvcDec.h b/media/codec2/components/avc/C2SoftAvcDec.h
new file mode 100644
index 0000000..2127a93
--- /dev/null
+++ b/media/codec2/components/avc/C2SoftAvcDec.h
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_AVC_DEC_H_
+#define ANDROID_C2_SOFT_AVC_DEC_H_
+
+#include <sys/time.h>
+
+#include <media/stagefright/foundation/ColorUtils.h>
+
+#include <SimpleC2Component.h>
+
+#include "ih264_typedefs.h"
+#include "iv.h"
+#include "ivd.h"
+
+namespace android {
+
+#define ivdec_api_function ih264d_api_function
+#define ivdext_create_ip_t ih264d_create_ip_t
+#define ivdext_create_op_t ih264d_create_op_t
+#define ivdext_delete_ip_t ih264d_delete_ip_t
+#define ivdext_delete_op_t ih264d_delete_op_t
+#define ivdext_ctl_set_num_cores_ip_t ih264d_ctl_set_num_cores_ip_t
+#define ivdext_ctl_set_num_cores_op_t ih264d_ctl_set_num_cores_op_t
+#define ivdext_ctl_get_vui_params_ip_t ih264d_ctl_get_vui_params_ip_t
+#define ivdext_ctl_get_vui_params_op_t ih264d_ctl_get_vui_params_op_t
+#define ALIGN64(x) ((((x) + 63) >> 6) << 6)
+#define MAX_NUM_CORES 4
+#define IVDEXT_CMD_CTL_SET_NUM_CORES \
+ (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_SET_NUM_CORES
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define GETTIME(a, b) gettimeofday(a, b);
+#define TIME_DIFF(start, end, diff) \
+ diff = (((end).tv_sec - (start).tv_sec) * 1000000) + \
+ ((end).tv_usec - (start).tv_usec);
+
+#ifdef FILE_DUMP_ENABLE
+ #define INPUT_DUMP_PATH "/sdcard/clips/avcd_input"
+ #define INPUT_DUMP_EXT "h264"
+ #define GENERATE_FILE_NAMES() { \
+ GETTIME(&mTimeStart, NULL); \
+ strcpy(mInFile, ""); \
+ sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH, \
+ mTimeStart.tv_sec, mTimeStart.tv_usec, \
+ INPUT_DUMP_EXT); \
+ }
+ #define CREATE_DUMP_FILE(m_filename) { \
+ FILE *fp = fopen(m_filename, "wb"); \
+ if (fp != NULL) { \
+ fclose(fp); \
+ } else { \
+ ALOGD("Could not open file %s", m_filename); \
+ } \
+ }
+ #define DUMP_TO_FILE(m_filename, m_buf, m_size, m_offset)\
+ { \
+ FILE *fp = fopen(m_filename, "ab"); \
+ if (fp != NULL && m_buf != NULL && m_offset == 0) { \
+ int i; \
+ i = fwrite(m_buf, 1, m_size, fp); \
+ ALOGD("fwrite ret %d to write %d", i, m_size); \
+ if (i != (int) m_size) { \
+ ALOGD("Error in fwrite, returned %d", i); \
+ perror("Error in write to file"); \
+ } \
+ } else if (fp == NULL) { \
+ ALOGD("Could not write to file %s", m_filename);\
+ } \
+ if (fp) { \
+ fclose(fp); \
+ } \
+ }
+#else /* FILE_DUMP_ENABLE */
+ #define INPUT_DUMP_PATH
+ #define INPUT_DUMP_EXT
+ #define OUTPUT_DUMP_PATH
+ #define OUTPUT_DUMP_EXT
+ #define GENERATE_FILE_NAMES()
+ #define CREATE_DUMP_FILE(m_filename)
+ #define DUMP_TO_FILE(m_filename, m_buf, m_size, m_offset)
+#endif /* FILE_DUMP_ENABLE */
+
+
+class C2SoftAvcDec : public SimpleC2Component {
+public:
+ class IntfImpl;
+ C2SoftAvcDec(const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftAvcDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ status_t createDecoder();
+ status_t setNumCores();
+ status_t setParams(size_t stride, IVD_VIDEO_DECODE_MODE_T dec_mode);
+ void getVersion();
+ status_t initDecoder();
+ bool setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
+ ivd_video_decode_op_t *ps_decode_op,
+ C2ReadView *inBuffer,
+ C2GraphicView *outBuffer,
+ size_t inOffset,
+ size_t inSize,
+ uint32_t tsMarker);
+ bool getVuiParams();
+ c2_status_t ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool);
+ void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work);
+ status_t setFlushMode();
+ c2_status_t drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work);
+ status_t resetDecoder();
+ void resetPlugin();
+ status_t deleteDecoder();
+
+ std::shared_ptr<IntfImpl> mIntf;
+
+ // TODO:This is not the right place for this enum. These should
+ // be part of c2-vndk so that they can be accessed by all video plugins
+ // until then, make them feel at home
+ enum {
+ kNotSupported,
+ kPreferBitstream,
+ kPreferContainer,
+ };
+
+ iv_obj_t *mDecHandle;
+ std::shared_ptr<C2GraphicBlock> mOutBlock;
+ uint8_t *mOutBufferFlush;
+
+ size_t mNumCores;
+ IV_COLOR_FORMAT_T mIvColorFormat;
+
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint32_t mStride;
+ bool mSignalledOutputEos;
+ bool mSignalledError;
+ bool mHeaderDecoded;
+ // Color aspects. These are ISO values and are meant to detect changes in aspects to avoid
+ // converting them to C2 values for each frame
+ struct VuiColorAspects {
+ uint8_t primaries;
+ uint8_t transfer;
+ uint8_t coeffs;
+ uint8_t fullRange;
+
+ // default color aspects
+ VuiColorAspects()
+ : primaries(2), transfer(2), coeffs(2), fullRange(0) { }
+
+ bool operator==(const VuiColorAspects &o) {
+ return primaries == o.primaries && transfer == o.transfer && coeffs == o.coeffs
+ && fullRange == o.fullRange;
+ }
+ } mBitstreamColorAspects;
+
+ // profile
+ struct timeval mTimeStart;
+ struct timeval mTimeEnd;
+#ifdef FILE_DUMP_ENABLE
+ char mInFile[200];
+#endif /* FILE_DUMP_ENABLE */
+
+ C2_DO_NOT_COPY(C2SoftAvcDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_AVC_DEC_H_
diff --git a/media/codec2/components/avc/C2SoftAvcEnc.cpp b/media/codec2/components/avc/C2SoftAvcEnc.cpp
new file mode 100644
index 0000000..ee5cf27
--- /dev/null
+++ b/media/codec2/components/avc/C2SoftAvcEnc.cpp
@@ -0,0 +1,1559 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftAvcEnc"
+#include <log/log.h>
+#include <utils/misc.h>
+
+#include <media/hardware/VideoAPI.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MediaErrors.h>
+#include <media/stagefright/MetaData.h>
+#include <media/stagefright/foundation/AUtils.h>
+
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <Codec2BufferUtils.h>
+#include <SimpleC2Interface.h>
+#include <util/C2InterfaceHelper.h>
+
+#include "C2SoftAvcEnc.h"
+#include "ih264e.h"
+#include "ih264e_error.h"
+
+namespace android {
+
+class C2SoftAvcEnc::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatVideo))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_VIDEO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_VIDEO_AVC))
+ .build());
+
+ addParameter(
+ DefineParam(mUsage, C2_NAME_INPUT_STREAM_USAGE_SETTING)
+ .withConstValue(new C2StreamUsageTuning::input(
+ 0u, (uint64_t)C2MemoryUsage::CPU_READ))
+ .build());
+
+ addParameter(
+ DefineParam(mSize, C2_NAME_STREAM_VIDEO_SIZE_SETTING)
+ .withDefault(new C2VideoSizeStreamTuning::input(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 2560, 2),
+ C2F(mSize, height).inRange(2, 2560, 2),
+ })
+ .withSetter(SizeSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mFrameRate, C2_NAME_STREAM_FRAME_RATE_SETTING)
+ .withDefault(new C2StreamFrameRateInfo::output(0u, 30.))
+ // TODO: More restriction?
+ .withFields({C2F(mFrameRate, value).greaterThan(0.)})
+ .withSetter(Setter<decltype(*mFrameRate)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::output(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(4096, 12000000)})
+ .withSetter(BitrateSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mIntraRefresh, C2_PARAMKEY_INTRA_REFRESH)
+ .withDefault(new C2StreamIntraRefreshTuning::output(
+ 0u, C2Config::INTRA_REFRESH_DISABLED, 0.))
+ .withFields({
+ C2F(mIntraRefresh, mode).oneOf({
+ C2Config::INTRA_REFRESH_DISABLED, C2Config::INTRA_REFRESH_ARBITRARY }),
+ C2F(mIntraRefresh, period).any()
+ })
+ .withSetter(IntraRefreshSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::output(
+ 0u, PROFILE_AVC_CONSTRAINED_BASELINE, LEVEL_AVC_4_1))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ PROFILE_AVC_BASELINE,
+ PROFILE_AVC_CONSTRAINED_BASELINE,
+ PROFILE_AVC_MAIN,
+ }),
+ C2F(mProfileLevel, level).oneOf({
+ LEVEL_AVC_1,
+ LEVEL_AVC_1B,
+ LEVEL_AVC_1_1,
+ LEVEL_AVC_1_2,
+ LEVEL_AVC_1_3,
+ LEVEL_AVC_2,
+ LEVEL_AVC_2_1,
+ LEVEL_AVC_2_2,
+ LEVEL_AVC_3,
+ LEVEL_AVC_3_1,
+ LEVEL_AVC_3_2,
+ LEVEL_AVC_4,
+ LEVEL_AVC_4_1,
+ LEVEL_AVC_4_2,
+ LEVEL_AVC_5,
+ }),
+ })
+ .withSetter(ProfileLevelSetter, mSize, mFrameRate, mBitrate)
+ .build());
+
+ addParameter(
+ DefineParam(mRequestSync, C2_PARAMKEY_REQUEST_SYNC_FRAME)
+ .withDefault(new C2StreamRequestSyncFrameTuning::output(0u, C2_FALSE))
+ .withFields({C2F(mRequestSync, value).oneOf({ C2_FALSE, C2_TRUE }) })
+ .withSetter(Setter<decltype(*mRequestSync)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mSyncFramePeriod, C2_PARAMKEY_SYNC_FRAME_INTERVAL)
+ .withDefault(new C2StreamSyncFrameIntervalTuning::output(0u, 1000000))
+ .withFields({C2F(mSyncFramePeriod, value).any()})
+ .withSetter(Setter<decltype(*mSyncFramePeriod)>::StrictValueWithNoDeps)
+ .build());
+ }
+
+ static C2R BitrateSetter(bool mayBlock, C2P<C2StreamBitrateInfo::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (me.v.value <= 4096) {
+ me.set().value = 4096;
+ }
+ return res;
+ }
+
+ static C2R SizeSetter(bool mayBlock, const C2P<C2StreamPictureSizeInfo::input> &oldMe,
+ C2P<C2StreamPictureSizeInfo::input> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+ me.set().width = oldMe.v.width;
+ }
+ if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
+ me.set().height = oldMe.v.height;
+ }
+ return res;
+ }
+
+ static C2R ProfileLevelSetter(
+ bool mayBlock,
+ C2P<C2StreamProfileLevelInfo::output> &me,
+ const C2P<C2VideoSizeStreamTuning::input> &size,
+ const C2P<C2StreamFrameRateInfo::output> &frameRate,
+ const C2P<C2BitrateTuning::output> &bitrate) {
+ (void)mayBlock;
+ if (!me.F(me.v.profile).supportsAtAll(me.v.profile)) {
+ me.set().profile = PROFILE_AVC_CONSTRAINED_BASELINE;
+ }
+
+ struct LevelLimits {
+ C2Config::level_t level;
+ float mbsPerSec;
+ uint64_t mbs;
+ uint32_t bitrate;
+ };
+ constexpr LevelLimits kLimits[] = {
+ { LEVEL_AVC_1, 1485, 99, 64000 },
+ // Decoder does not properly handle level 1b.
+ // { LEVEL_AVC_1B, 1485, 99, 128000 },
+ { LEVEL_AVC_1_1, 3000, 396, 192000 },
+ { LEVEL_AVC_1_2, 6000, 396, 384000 },
+ { LEVEL_AVC_1_3, 11880, 396, 768000 },
+ { LEVEL_AVC_2, 11880, 396, 2000000 },
+ { LEVEL_AVC_2_1, 19800, 792, 4000000 },
+ { LEVEL_AVC_2_2, 20250, 1620, 4000000 },
+ { LEVEL_AVC_3, 40500, 1620, 10000000 },
+ { LEVEL_AVC_3_1, 108000, 3600, 14000000 },
+ { LEVEL_AVC_3_2, 216000, 5120, 20000000 },
+ { LEVEL_AVC_4, 245760, 8192, 20000000 },
+ { LEVEL_AVC_4_1, 245760, 8192, 50000000 },
+ { LEVEL_AVC_4_2, 522240, 8704, 50000000 },
+ { LEVEL_AVC_5, 589824, 22080, 135000000 },
+ };
+
+ uint64_t mbs = uint64_t((size.v.width + 15) / 16) * ((size.v.height + 15) / 16);
+ float mbsPerSec = float(mbs) / frameRate.v.value;
+
+ // Check if the supplied level meets the MB / bitrate requirements. If
+ // not, update the level with the lowest level meeting the requirements.
+
+ bool found = false;
+ // By default needsUpdate = false in case the supplied level does meet
+ // the requirements. For Level 1b, we want to update the level anyway,
+ // so we set it to true in that case.
+ bool needsUpdate = (me.v.level == LEVEL_AVC_1B);
+ for (const LevelLimits &limit : kLimits) {
+ if (mbs <= limit.mbs && mbsPerSec <= limit.mbsPerSec &&
+ bitrate.v.value <= limit.bitrate) {
+ // This is the lowest level that meets the requirements, and if
+ // we haven't seen the supplied level yet, that means we don't
+ // need the update.
+ if (needsUpdate) {
+ ALOGD("Given level %x does not cover current configuration: "
+ "adjusting to %x", me.v.level, limit.level);
+ me.set().level = limit.level;
+ }
+ found = true;
+ break;
+ }
+ if (me.v.level == limit.level) {
+ // We break out of the loop when the lowest feasible level is
+ // found. The fact that we're here means that our level doesn't
+ // meet the requirement and needs to be updated.
+ needsUpdate = true;
+ }
+ }
+ if (!found) {
+ // We set to the highest supported level.
+ me.set().level = LEVEL_AVC_5;
+ }
+
+ return C2R::Ok();
+ }
+
+ static C2R IntraRefreshSetter(bool mayBlock, C2P<C2StreamIntraRefreshTuning::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (me.v.period < 1) {
+ me.set().mode = C2Config::INTRA_REFRESH_DISABLED;
+ me.set().period = 0;
+ } else {
+ // only support arbitrary mode (cyclic in our case)
+ me.set().mode = C2Config::INTRA_REFRESH_ARBITRARY;
+ }
+ return res;
+ }
+
+ IV_PROFILE_T getProfile_l() const {
+ switch (mProfileLevel->profile) {
+ case PROFILE_AVC_CONSTRAINED_BASELINE: [[fallthrough]];
+ case PROFILE_AVC_BASELINE: return IV_PROFILE_BASE;
+ case PROFILE_AVC_MAIN: return IV_PROFILE_MAIN;
+ default:
+ ALOGD("Unrecognized profile: %x", mProfileLevel->profile);
+ return IV_PROFILE_DEFAULT;
+ }
+ }
+
+ UWORD32 getLevel_l() const {
+ struct Level {
+ C2Config::level_t c2Level;
+ UWORD32 avcLevel;
+ };
+ constexpr Level levels[] = {
+ { LEVEL_AVC_1, 10 },
+ { LEVEL_AVC_1B, 9 },
+ { LEVEL_AVC_1_1, 11 },
+ { LEVEL_AVC_1_2, 12 },
+ { LEVEL_AVC_1_3, 13 },
+ { LEVEL_AVC_2, 20 },
+ { LEVEL_AVC_2_1, 21 },
+ { LEVEL_AVC_2_2, 22 },
+ { LEVEL_AVC_3, 30 },
+ { LEVEL_AVC_3_1, 31 },
+ { LEVEL_AVC_3_2, 32 },
+ { LEVEL_AVC_4, 40 },
+ { LEVEL_AVC_4_1, 41 },
+ { LEVEL_AVC_4_2, 42 },
+ { LEVEL_AVC_5, 50 },
+ };
+ for (const Level &level : levels) {
+ if (mProfileLevel->level == level.c2Level) {
+ return level.avcLevel;
+ }
+ }
+ ALOGD("Unrecognized level: %x", mProfileLevel->level);
+ return 41;
+ }
+ uint32_t getSyncFramePeriod_l() const {
+ if (mSyncFramePeriod->value < 0 || mSyncFramePeriod->value == INT64_MAX) {
+ return 0;
+ }
+ double period = mSyncFramePeriod->value / 1e6 * mFrameRate->value;
+ return (uint32_t)c2_max(c2_min(period + 0.5, double(UINT32_MAX)), 1.);
+ }
+
+ // unsafe getters
+ std::shared_ptr<C2StreamPictureSizeInfo::input> getSize_l() const { return mSize; }
+ std::shared_ptr<C2StreamIntraRefreshTuning::output> getIntraRefresh_l() const { return mIntraRefresh; }
+ std::shared_ptr<C2StreamFrameRateInfo::output> getFrameRate_l() const { return mFrameRate; }
+ std::shared_ptr<C2StreamBitrateInfo::output> getBitrate_l() const { return mBitrate; }
+ std::shared_ptr<C2StreamRequestSyncFrameTuning::output> getRequestSync_l() const { return mRequestSync; }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamUsageTuning::input> mUsage;
+ std::shared_ptr<C2VideoSizeStreamTuning::input> mSize;
+ std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
+ std::shared_ptr<C2StreamRequestSyncFrameTuning::output> mRequestSync;
+ std::shared_ptr<C2StreamIntraRefreshTuning::output> mIntraRefresh;
+ std::shared_ptr<C2BitrateTuning::output> mBitrate;
+ std::shared_ptr<C2StreamProfileLevelInfo::output> mProfileLevel;
+ std::shared_ptr<C2StreamSyncFrameIntervalTuning::output> mSyncFramePeriod;
+};
+
+#define ive_api_function ih264e_api_function
+
+constexpr char COMPONENT_NAME[] = "c2.android.avc.encoder";
+
+namespace {
+
+// From external/libavc/encoder/ih264e_bitstream.h
+constexpr uint32_t MIN_STREAM_SIZE = 0x800;
+
+static size_t GetCPUCoreCount() {
+ long cpuCoreCount = 1;
+#if defined(_SC_NPROCESSORS_ONLN)
+ cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
+#else
+ // _SC_NPROC_ONLN must be defined...
+ cpuCoreCount = sysconf(_SC_NPROC_ONLN);
+#endif
+ CHECK(cpuCoreCount >= 1);
+ ALOGV("Number of CPU cores: %ld", cpuCoreCount);
+ return (size_t)cpuCoreCount;
+}
+
+} // namespace
+
+C2SoftAvcEnc::C2SoftAvcEnc(
+ const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mIvVideoColorFormat(IV_YUV_420P),
+ mAVCEncProfile(IV_PROFILE_BASE),
+ mAVCEncLevel(41),
+ mStarted(false),
+ mSawInputEOS(false),
+ mSawOutputEOS(false),
+ mSignalledError(false),
+ mCodecCtx(nullptr),
+ // TODO: output buffer size
+ mOutBufferSize(524288) {
+
+ // If dump is enabled, then open create an empty file
+ GENERATE_FILE_NAMES();
+ CREATE_DUMP_FILE(mInFile);
+ CREATE_DUMP_FILE(mOutFile);
+
+ initEncParams();
+}
+
+C2SoftAvcEnc::~C2SoftAvcEnc() {
+ releaseEncoder();
+}
+
+c2_status_t C2SoftAvcEnc::onInit() {
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::onStop() {
+ return C2_OK;
+}
+
+void C2SoftAvcEnc::onReset() {
+ // TODO: use IVE_CMD_CTL_RESET?
+ releaseEncoder();
+ initEncParams();
+}
+
+void C2SoftAvcEnc::onRelease() {
+ releaseEncoder();
+}
+
+c2_status_t C2SoftAvcEnc::onFlush_sm() {
+ // TODO: use IVE_CMD_CTL_FLUSH?
+ return C2_OK;
+}
+
+void C2SoftAvcEnc::initEncParams() {
+ mCodecCtx = nullptr;
+ mMemRecords = nullptr;
+ mNumMemRecords = DEFAULT_MEM_REC_CNT;
+ mHeaderGenerated = 0;
+ mNumCores = GetCPUCoreCount();
+ mArch = DEFAULT_ARCH;
+ mSliceMode = DEFAULT_SLICE_MODE;
+ mSliceParam = DEFAULT_SLICE_PARAM;
+ mHalfPelEnable = DEFAULT_HPEL;
+ mIInterval = DEFAULT_I_INTERVAL;
+ mIDRInterval = DEFAULT_IDR_INTERVAL;
+ mDisableDeblkLevel = DEFAULT_DISABLE_DEBLK_LEVEL;
+ mEnableFastSad = DEFAULT_ENABLE_FAST_SAD;
+ mEnableAltRef = DEFAULT_ENABLE_ALT_REF;
+ mEncSpeed = DEFAULT_ENC_SPEED;
+ mIntra4x4 = DEFAULT_INTRA4x4;
+ mConstrainedIntraFlag = DEFAULT_CONSTRAINED_INTRA;
+ mPSNREnable = DEFAULT_PSNR_ENABLE;
+ mReconEnable = DEFAULT_RECON_ENABLE;
+ mEntropyMode = DEFAULT_ENTROPY_MODE;
+ mBframes = DEFAULT_B_FRAMES;
+
+ gettimeofday(&mTimeStart, nullptr);
+ gettimeofday(&mTimeEnd, nullptr);
+}
+
+c2_status_t C2SoftAvcEnc::setDimensions() {
+ ive_ctl_set_dimensions_ip_t s_dimensions_ip;
+ ive_ctl_set_dimensions_op_t s_dimensions_op;
+ IV_STATUS_T status;
+
+ s_dimensions_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_dimensions_ip.e_sub_cmd = IVE_CMD_CTL_SET_DIMENSIONS;
+ s_dimensions_ip.u4_ht = mSize->height;
+ s_dimensions_ip.u4_wd = mSize->width;
+
+ s_dimensions_ip.u4_timestamp_high = -1;
+ s_dimensions_ip.u4_timestamp_low = -1;
+
+ s_dimensions_ip.u4_size = sizeof(ive_ctl_set_dimensions_ip_t);
+ s_dimensions_op.u4_size = sizeof(ive_ctl_set_dimensions_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_dimensions_ip, &s_dimensions_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set frame dimensions = 0x%x\n",
+ s_dimensions_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setNumCores() {
+ IV_STATUS_T status;
+ ive_ctl_set_num_cores_ip_t s_num_cores_ip;
+ ive_ctl_set_num_cores_op_t s_num_cores_op;
+ s_num_cores_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_num_cores_ip.e_sub_cmd = IVE_CMD_CTL_SET_NUM_CORES;
+ s_num_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_CORES);
+ s_num_cores_ip.u4_timestamp_high = -1;
+ s_num_cores_ip.u4_timestamp_low = -1;
+ s_num_cores_ip.u4_size = sizeof(ive_ctl_set_num_cores_ip_t);
+
+ s_num_cores_op.u4_size = sizeof(ive_ctl_set_num_cores_op_t);
+
+ status = ive_api_function(
+ mCodecCtx, (void *) &s_num_cores_ip, (void *) &s_num_cores_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set processor params = 0x%x\n",
+ s_num_cores_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setFrameRate() {
+ ive_ctl_set_frame_rate_ip_t s_frame_rate_ip;
+ ive_ctl_set_frame_rate_op_t s_frame_rate_op;
+ IV_STATUS_T status;
+
+ s_frame_rate_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_frame_rate_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMERATE;
+
+ s_frame_rate_ip.u4_src_frame_rate = mFrameRate->value + 0.5;
+ s_frame_rate_ip.u4_tgt_frame_rate = mFrameRate->value + 0.5;
+
+ s_frame_rate_ip.u4_timestamp_high = -1;
+ s_frame_rate_ip.u4_timestamp_low = -1;
+
+ s_frame_rate_ip.u4_size = sizeof(ive_ctl_set_frame_rate_ip_t);
+ s_frame_rate_op.u4_size = sizeof(ive_ctl_set_frame_rate_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_frame_rate_ip, &s_frame_rate_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set frame rate = 0x%x\n",
+ s_frame_rate_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setIpeParams() {
+ ive_ctl_set_ipe_params_ip_t s_ipe_params_ip;
+ ive_ctl_set_ipe_params_op_t s_ipe_params_op;
+ IV_STATUS_T status;
+
+ s_ipe_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_ipe_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_IPE_PARAMS;
+
+ s_ipe_params_ip.u4_enable_intra_4x4 = mIntra4x4;
+ s_ipe_params_ip.u4_enc_speed_preset = mEncSpeed;
+ s_ipe_params_ip.u4_constrained_intra_pred = mConstrainedIntraFlag;
+
+ s_ipe_params_ip.u4_timestamp_high = -1;
+ s_ipe_params_ip.u4_timestamp_low = -1;
+
+ s_ipe_params_ip.u4_size = sizeof(ive_ctl_set_ipe_params_ip_t);
+ s_ipe_params_op.u4_size = sizeof(ive_ctl_set_ipe_params_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_ipe_params_ip, &s_ipe_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set ipe params = 0x%x\n",
+ s_ipe_params_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setBitRate() {
+ ive_ctl_set_bitrate_ip_t s_bitrate_ip;
+ ive_ctl_set_bitrate_op_t s_bitrate_op;
+ IV_STATUS_T status;
+
+ s_bitrate_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_bitrate_ip.e_sub_cmd = IVE_CMD_CTL_SET_BITRATE;
+
+ s_bitrate_ip.u4_target_bitrate = mBitrate->value;
+
+ s_bitrate_ip.u4_timestamp_high = -1;
+ s_bitrate_ip.u4_timestamp_low = -1;
+
+ s_bitrate_ip.u4_size = sizeof(ive_ctl_set_bitrate_ip_t);
+ s_bitrate_op.u4_size = sizeof(ive_ctl_set_bitrate_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_bitrate_ip, &s_bitrate_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set bit rate = 0x%x\n", s_bitrate_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setFrameType(IV_PICTURE_CODING_TYPE_T e_frame_type) {
+ ive_ctl_set_frame_type_ip_t s_frame_type_ip;
+ ive_ctl_set_frame_type_op_t s_frame_type_op;
+ IV_STATUS_T status;
+ s_frame_type_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_frame_type_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMETYPE;
+
+ s_frame_type_ip.e_frame_type = e_frame_type;
+
+ s_frame_type_ip.u4_timestamp_high = -1;
+ s_frame_type_ip.u4_timestamp_low = -1;
+
+ s_frame_type_ip.u4_size = sizeof(ive_ctl_set_frame_type_ip_t);
+ s_frame_type_op.u4_size = sizeof(ive_ctl_set_frame_type_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_frame_type_ip, &s_frame_type_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set frame type = 0x%x\n",
+ s_frame_type_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setQp() {
+ ive_ctl_set_qp_ip_t s_qp_ip;
+ ive_ctl_set_qp_op_t s_qp_op;
+ IV_STATUS_T status;
+
+ s_qp_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_qp_ip.e_sub_cmd = IVE_CMD_CTL_SET_QP;
+
+ s_qp_ip.u4_i_qp = DEFAULT_I_QP;
+ s_qp_ip.u4_i_qp_max = DEFAULT_QP_MAX;
+ s_qp_ip.u4_i_qp_min = DEFAULT_QP_MIN;
+
+ s_qp_ip.u4_p_qp = DEFAULT_P_QP;
+ s_qp_ip.u4_p_qp_max = DEFAULT_QP_MAX;
+ s_qp_ip.u4_p_qp_min = DEFAULT_QP_MIN;
+
+ s_qp_ip.u4_b_qp = DEFAULT_P_QP;
+ s_qp_ip.u4_b_qp_max = DEFAULT_QP_MAX;
+ s_qp_ip.u4_b_qp_min = DEFAULT_QP_MIN;
+
+ s_qp_ip.u4_timestamp_high = -1;
+ s_qp_ip.u4_timestamp_low = -1;
+
+ s_qp_ip.u4_size = sizeof(ive_ctl_set_qp_ip_t);
+ s_qp_op.u4_size = sizeof(ive_ctl_set_qp_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_qp_ip, &s_qp_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set qp 0x%x\n", s_qp_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setEncMode(IVE_ENC_MODE_T e_enc_mode) {
+ IV_STATUS_T status;
+ ive_ctl_set_enc_mode_ip_t s_enc_mode_ip;
+ ive_ctl_set_enc_mode_op_t s_enc_mode_op;
+
+ s_enc_mode_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_enc_mode_ip.e_sub_cmd = IVE_CMD_CTL_SET_ENC_MODE;
+
+ s_enc_mode_ip.e_enc_mode = e_enc_mode;
+
+ s_enc_mode_ip.u4_timestamp_high = -1;
+ s_enc_mode_ip.u4_timestamp_low = -1;
+
+ s_enc_mode_ip.u4_size = sizeof(ive_ctl_set_enc_mode_ip_t);
+ s_enc_mode_op.u4_size = sizeof(ive_ctl_set_enc_mode_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_enc_mode_ip, &s_enc_mode_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set in header encode mode = 0x%x\n",
+ s_enc_mode_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setVbvParams() {
+ ive_ctl_set_vbv_params_ip_t s_vbv_ip;
+ ive_ctl_set_vbv_params_op_t s_vbv_op;
+ IV_STATUS_T status;
+
+ s_vbv_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_vbv_ip.e_sub_cmd = IVE_CMD_CTL_SET_VBV_PARAMS;
+
+ s_vbv_ip.u4_vbv_buf_size = 0;
+ s_vbv_ip.u4_vbv_buffer_delay = 1000;
+
+ s_vbv_ip.u4_timestamp_high = -1;
+ s_vbv_ip.u4_timestamp_low = -1;
+
+ s_vbv_ip.u4_size = sizeof(ive_ctl_set_vbv_params_ip_t);
+ s_vbv_op.u4_size = sizeof(ive_ctl_set_vbv_params_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_vbv_ip, &s_vbv_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set VBV params = 0x%x\n", s_vbv_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setAirParams() {
+ ive_ctl_set_air_params_ip_t s_air_ip;
+ ive_ctl_set_air_params_op_t s_air_op;
+ IV_STATUS_T status;
+
+ s_air_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_air_ip.e_sub_cmd = IVE_CMD_CTL_SET_AIR_PARAMS;
+
+ s_air_ip.e_air_mode =
+ (mIntraRefresh->mode == C2Config::INTRA_REFRESH_DISABLED || mIntraRefresh->period < 1)
+ ? IVE_AIR_MODE_NONE : IVE_AIR_MODE_CYCLIC;
+ s_air_ip.u4_air_refresh_period = mIntraRefresh->period;
+
+ s_air_ip.u4_timestamp_high = -1;
+ s_air_ip.u4_timestamp_low = -1;
+
+ s_air_ip.u4_size = sizeof(ive_ctl_set_air_params_ip_t);
+ s_air_op.u4_size = sizeof(ive_ctl_set_air_params_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_air_ip, &s_air_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set air params = 0x%x\n", s_air_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setMeParams() {
+ IV_STATUS_T status;
+ ive_ctl_set_me_params_ip_t s_me_params_ip;
+ ive_ctl_set_me_params_op_t s_me_params_op;
+
+ s_me_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_me_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_ME_PARAMS;
+
+ s_me_params_ip.u4_enable_fast_sad = mEnableFastSad;
+ s_me_params_ip.u4_enable_alt_ref = mEnableAltRef;
+
+ s_me_params_ip.u4_enable_hpel = mHalfPelEnable;
+ s_me_params_ip.u4_enable_qpel = DEFAULT_QPEL;
+ s_me_params_ip.u4_me_speed_preset = DEFAULT_ME_SPEED;
+ s_me_params_ip.u4_srch_rng_x = DEFAULT_SRCH_RNG_X;
+ s_me_params_ip.u4_srch_rng_y = DEFAULT_SRCH_RNG_Y;
+
+ s_me_params_ip.u4_timestamp_high = -1;
+ s_me_params_ip.u4_timestamp_low = -1;
+
+ s_me_params_ip.u4_size = sizeof(ive_ctl_set_me_params_ip_t);
+ s_me_params_op.u4_size = sizeof(ive_ctl_set_me_params_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_me_params_ip, &s_me_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set me params = 0x%x\n", s_me_params_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setGopParams() {
+ IV_STATUS_T status;
+ ive_ctl_set_gop_params_ip_t s_gop_params_ip;
+ ive_ctl_set_gop_params_op_t s_gop_params_op;
+
+ s_gop_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_gop_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_GOP_PARAMS;
+
+ s_gop_params_ip.u4_i_frm_interval = mIInterval;
+ s_gop_params_ip.u4_idr_frm_interval = mIDRInterval;
+
+ s_gop_params_ip.u4_timestamp_high = -1;
+ s_gop_params_ip.u4_timestamp_low = -1;
+
+ s_gop_params_ip.u4_size = sizeof(ive_ctl_set_gop_params_ip_t);
+ s_gop_params_op.u4_size = sizeof(ive_ctl_set_gop_params_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_gop_params_ip, &s_gop_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set GOP params = 0x%x\n",
+ s_gop_params_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setProfileParams() {
+ IntfImpl::Lock lock = mIntf->lock();
+
+ IV_STATUS_T status;
+ ive_ctl_set_profile_params_ip_t s_profile_params_ip;
+ ive_ctl_set_profile_params_op_t s_profile_params_op;
+
+ s_profile_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_profile_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_PROFILE_PARAMS;
+
+ s_profile_params_ip.e_profile = mIntf->getProfile_l();
+ s_profile_params_ip.u4_entropy_coding_mode = mEntropyMode;
+ s_profile_params_ip.u4_timestamp_high = -1;
+ s_profile_params_ip.u4_timestamp_low = -1;
+
+ s_profile_params_ip.u4_size = sizeof(ive_ctl_set_profile_params_ip_t);
+ s_profile_params_op.u4_size = sizeof(ive_ctl_set_profile_params_op_t);
+ lock.unlock();
+
+ status = ive_api_function(mCodecCtx, &s_profile_params_ip, &s_profile_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to set profile params = 0x%x\n",
+ s_profile_params_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setDeblockParams() {
+ IV_STATUS_T status;
+ ive_ctl_set_deblock_params_ip_t s_deblock_params_ip;
+ ive_ctl_set_deblock_params_op_t s_deblock_params_op;
+
+ s_deblock_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_deblock_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_DEBLOCK_PARAMS;
+
+ s_deblock_params_ip.u4_disable_deblock_level = mDisableDeblkLevel;
+
+ s_deblock_params_ip.u4_timestamp_high = -1;
+ s_deblock_params_ip.u4_timestamp_low = -1;
+
+ s_deblock_params_ip.u4_size = sizeof(ive_ctl_set_deblock_params_ip_t);
+ s_deblock_params_op.u4_size = sizeof(ive_ctl_set_deblock_params_op_t);
+
+ status = ive_api_function(mCodecCtx, &s_deblock_params_ip, &s_deblock_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to enable/disable deblock params = 0x%x\n",
+ s_deblock_params_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+void C2SoftAvcEnc::logVersion() {
+ ive_ctl_getversioninfo_ip_t s_ctl_ip;
+ ive_ctl_getversioninfo_op_t s_ctl_op;
+ UWORD8 au1_buf[512];
+ IV_STATUS_T status;
+
+ s_ctl_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_ctl_ip.e_sub_cmd = IVE_CMD_CTL_GETVERSION;
+ s_ctl_ip.u4_size = sizeof(ive_ctl_getversioninfo_ip_t);
+ s_ctl_op.u4_size = sizeof(ive_ctl_getversioninfo_op_t);
+ s_ctl_ip.pu1_version = au1_buf;
+ s_ctl_ip.u4_version_bufsize = sizeof(au1_buf);
+
+ status = ive_api_function(mCodecCtx, (void *) &s_ctl_ip, (void *) &s_ctl_op);
+
+ if (status != IV_SUCCESS) {
+ ALOGE("Error in getting version: 0x%x", s_ctl_op.u4_error_code);
+ } else {
+ ALOGV("Ittiam encoder version: %s", (char *)s_ctl_ip.pu1_version);
+ }
+ return;
+}
+
+c2_status_t C2SoftAvcEnc::initEncoder() {
+ IV_STATUS_T status;
+ WORD32 level;
+
+ CHECK(!mStarted);
+
+ c2_status_t errType = C2_OK;
+
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ mSize = mIntf->getSize_l();
+ mBitrate = mIntf->getBitrate_l();
+ mFrameRate = mIntf->getFrameRate_l();
+ mIntraRefresh = mIntf->getIntraRefresh_l();
+ mAVCEncLevel = mIntf->getLevel_l();
+ mIInterval = mIntf->getSyncFramePeriod_l();
+ mIDRInterval = mIntf->getSyncFramePeriod_l();
+ }
+ uint32_t width = mSize->width;
+ uint32_t height = mSize->height;
+
+ mStride = width;
+
+ // TODO
+ mIvVideoColorFormat = IV_YUV_420P;
+
+ ALOGD("Params width %d height %d level %d colorFormat %d", width,
+ height, mAVCEncLevel, mIvVideoColorFormat);
+
+ /* Getting Number of MemRecords */
+ {
+ iv_num_mem_rec_ip_t s_num_mem_rec_ip;
+ iv_num_mem_rec_op_t s_num_mem_rec_op;
+
+ s_num_mem_rec_ip.u4_size = sizeof(iv_num_mem_rec_ip_t);
+ s_num_mem_rec_op.u4_size = sizeof(iv_num_mem_rec_op_t);
+
+ s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC;
+
+ status = ive_api_function(nullptr, &s_num_mem_rec_ip, &s_num_mem_rec_op);
+
+ if (status != IV_SUCCESS) {
+ ALOGE("Get number of memory records failed = 0x%x\n",
+ s_num_mem_rec_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+
+ mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec;
+ }
+
+ /* Allocate array to hold memory records */
+ if (mNumMemRecords > SIZE_MAX / sizeof(iv_mem_rec_t)) {
+ ALOGE("requested memory size is too big.");
+ return C2_CORRUPTED;
+ }
+ mMemRecords = (iv_mem_rec_t *)malloc(mNumMemRecords * sizeof(iv_mem_rec_t));
+ if (nullptr == mMemRecords) {
+ ALOGE("Unable to allocate memory for hold memory records: Size %zu",
+ mNumMemRecords * sizeof(iv_mem_rec_t));
+ mSignalledError = true;
+ return C2_CORRUPTED;
+ }
+
+ {
+ iv_mem_rec_t *ps_mem_rec;
+ ps_mem_rec = mMemRecords;
+ for (size_t i = 0; i < mNumMemRecords; i++) {
+ ps_mem_rec->u4_size = sizeof(iv_mem_rec_t);
+ ps_mem_rec->pv_base = nullptr;
+ ps_mem_rec->u4_mem_size = 0;
+ ps_mem_rec->u4_mem_alignment = 0;
+ ps_mem_rec->e_mem_type = IV_NA_MEM_TYPE;
+
+ ps_mem_rec++;
+ }
+ }
+
+ /* Getting MemRecords Attributes */
+ {
+ iv_fill_mem_rec_ip_t s_fill_mem_rec_ip;
+ iv_fill_mem_rec_op_t s_fill_mem_rec_op;
+
+ s_fill_mem_rec_ip.u4_size = sizeof(iv_fill_mem_rec_ip_t);
+ s_fill_mem_rec_op.u4_size = sizeof(iv_fill_mem_rec_op_t);
+
+ s_fill_mem_rec_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
+ s_fill_mem_rec_ip.ps_mem_rec = mMemRecords;
+ s_fill_mem_rec_ip.u4_num_mem_rec = mNumMemRecords;
+ s_fill_mem_rec_ip.u4_max_wd = width;
+ s_fill_mem_rec_ip.u4_max_ht = height;
+ s_fill_mem_rec_ip.u4_max_level = mAVCEncLevel;
+ s_fill_mem_rec_ip.e_color_format = DEFAULT_INP_COLOR_FORMAT;
+ s_fill_mem_rec_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
+ s_fill_mem_rec_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
+ s_fill_mem_rec_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
+ s_fill_mem_rec_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
+
+ status = ive_api_function(nullptr, &s_fill_mem_rec_ip, &s_fill_mem_rec_op);
+
+ if (status != IV_SUCCESS) {
+ ALOGE("Fill memory records failed = 0x%x\n",
+ s_fill_mem_rec_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ }
+
+ /* Allocating Memory for Mem Records */
+ {
+ WORD32 total_size;
+ iv_mem_rec_t *ps_mem_rec;
+ total_size = 0;
+ ps_mem_rec = mMemRecords;
+
+ for (size_t i = 0; i < mNumMemRecords; i++) {
+ ps_mem_rec->pv_base = ive_aligned_malloc(
+ ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size);
+ if (ps_mem_rec->pv_base == nullptr) {
+ ALOGE("Allocation failure for mem record id %zu size %u\n", i,
+ ps_mem_rec->u4_mem_size);
+ return C2_CORRUPTED;
+
+ }
+ total_size += ps_mem_rec->u4_mem_size;
+
+ ps_mem_rec++;
+ }
+ }
+
+ /* Codec Instance Creation */
+ {
+ ive_init_ip_t s_init_ip;
+ ive_init_op_t s_init_op;
+
+ mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base;
+ mCodecCtx->u4_size = sizeof(iv_obj_t);
+ mCodecCtx->pv_fxns = (void *)ive_api_function;
+
+ s_init_ip.u4_size = sizeof(ive_init_ip_t);
+ s_init_op.u4_size = sizeof(ive_init_op_t);
+
+ s_init_ip.e_cmd = IV_CMD_INIT;
+ s_init_ip.u4_num_mem_rec = mNumMemRecords;
+ s_init_ip.ps_mem_rec = mMemRecords;
+ s_init_ip.u4_max_wd = width;
+ s_init_ip.u4_max_ht = height;
+ s_init_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
+ s_init_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
+ s_init_ip.u4_max_level = mAVCEncLevel;
+ s_init_ip.e_inp_color_fmt = mIvVideoColorFormat;
+
+ if (mReconEnable || mPSNREnable) {
+ s_init_ip.u4_enable_recon = 1;
+ } else {
+ s_init_ip.u4_enable_recon = 0;
+ }
+ s_init_ip.e_recon_color_fmt = DEFAULT_RECON_COLOR_FORMAT;
+ s_init_ip.e_rc_mode = DEFAULT_RC_MODE;
+ s_init_ip.u4_max_framerate = DEFAULT_MAX_FRAMERATE;
+ s_init_ip.u4_max_bitrate = DEFAULT_MAX_BITRATE;
+ s_init_ip.u4_num_bframes = mBframes;
+ s_init_ip.e_content_type = IV_PROGRESSIVE;
+ s_init_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
+ s_init_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
+ s_init_ip.e_slice_mode = mSliceMode;
+ s_init_ip.u4_slice_param = mSliceParam;
+ s_init_ip.e_arch = mArch;
+ s_init_ip.e_soc = DEFAULT_SOC;
+
+ status = ive_api_function(mCodecCtx, &s_init_ip, &s_init_op);
+
+ if (status != IV_SUCCESS) {
+ ALOGE("Init encoder failed = 0x%x\n", s_init_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+ }
+
+ /* Get Codec Version */
+ logVersion();
+
+ /* set processor details */
+ setNumCores();
+
+ /* Video control Set Frame dimensions */
+ setDimensions();
+
+ /* Video control Set Frame rates */
+ setFrameRate();
+
+ /* Video control Set IPE Params */
+ setIpeParams();
+
+ /* Video control Set Bitrate */
+ setBitRate();
+
+ /* Video control Set QP */
+ setQp();
+
+ /* Video control Set AIR params */
+ setAirParams();
+
+ /* Video control Set VBV params */
+ setVbvParams();
+
+ /* Video control Set Motion estimation params */
+ setMeParams();
+
+ /* Video control Set GOP params */
+ setGopParams();
+
+ /* Video control Set Deblock params */
+ setDeblockParams();
+
+ /* Video control Set Profile params */
+ setProfileParams();
+
+ /* Video control Set in Encode header mode */
+ setEncMode(IVE_ENC_MODE_HEADER);
+
+ ALOGV("init_codec successfull");
+
+ mSpsPpsHeaderReceived = false;
+ mStarted = true;
+
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::releaseEncoder() {
+ IV_STATUS_T status = IV_SUCCESS;
+ iv_retrieve_mem_rec_ip_t s_retrieve_mem_ip;
+ iv_retrieve_mem_rec_op_t s_retrieve_mem_op;
+ iv_mem_rec_t *ps_mem_rec;
+
+ if (!mStarted) {
+ return C2_OK;
+ }
+
+ s_retrieve_mem_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t);
+ s_retrieve_mem_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t);
+ s_retrieve_mem_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC;
+ s_retrieve_mem_ip.ps_mem_rec = mMemRecords;
+
+ status = ive_api_function(mCodecCtx, &s_retrieve_mem_ip, &s_retrieve_mem_op);
+
+ if (status != IV_SUCCESS) {
+ ALOGE("Unable to retrieve memory records = 0x%x\n",
+ s_retrieve_mem_op.u4_error_code);
+ return C2_CORRUPTED;
+ }
+
+ /* Free memory records */
+ ps_mem_rec = mMemRecords;
+ for (size_t i = 0; i < s_retrieve_mem_op.u4_num_mem_rec_filled; i++) {
+ if (ps_mem_rec) ive_aligned_free(ps_mem_rec->pv_base);
+ else {
+ ALOGE("memory record is null.");
+ return C2_CORRUPTED;
+ }
+ ps_mem_rec++;
+ }
+
+ if (mMemRecords) free(mMemRecords);
+
+ // clear other pointers into the space being free()d
+ mCodecCtx = nullptr;
+
+ mStarted = false;
+
+ return C2_OK;
+}
+
+c2_status_t C2SoftAvcEnc::setEncodeArgs(
+ ive_video_encode_ip_t *ps_encode_ip,
+ ive_video_encode_op_t *ps_encode_op,
+ const C2GraphicView *const input,
+ uint8_t *base,
+ uint32_t capacity,
+ uint64_t timestamp) {
+ iv_raw_buf_t *ps_inp_raw_buf;
+
+ ps_inp_raw_buf = &ps_encode_ip->s_inp_buf;
+ ps_encode_ip->s_out_buf.pv_buf = base;
+ ps_encode_ip->s_out_buf.u4_bytes = 0;
+ ps_encode_ip->s_out_buf.u4_bufsize = capacity;
+ ps_encode_ip->u4_size = sizeof(ive_video_encode_ip_t);
+ ps_encode_op->u4_size = sizeof(ive_video_encode_op_t);
+
+ ps_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE;
+ ps_encode_ip->pv_bufs = nullptr;
+ ps_encode_ip->pv_mb_info = nullptr;
+ ps_encode_ip->pv_pic_info = nullptr;
+ ps_encode_ip->u4_mb_info_type = 0;
+ ps_encode_ip->u4_pic_info_type = 0;
+ ps_encode_ip->u4_is_last = 0;
+ ps_encode_ip->u4_timestamp_high = timestamp >> 32;
+ ps_encode_ip->u4_timestamp_low = timestamp & 0xFFFFFFFF;
+ ps_encode_op->s_out_buf.pv_buf = nullptr;
+
+ /* Initialize color formats */
+ memset(ps_inp_raw_buf, 0, sizeof(iv_raw_buf_t));
+ ps_inp_raw_buf->u4_size = sizeof(iv_raw_buf_t);
+ ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat;
+ if (input == nullptr) {
+ if (mSawInputEOS){
+ ps_encode_ip->u4_is_last = 1;
+ }
+ return C2_OK;
+ }
+
+ if (input->width() < mSize->width ||
+ input->height() < mSize->height) {
+ /* Expect width height to be configured */
+ ALOGW("unexpected Capacity Aspect %d(%d) x %d(%d)", input->width(),
+ mSize->width, input->height(), mSize->height);
+ return C2_BAD_VALUE;
+ }
+ ALOGV("width = %d, height = %d", input->width(), input->height());
+ const C2PlanarLayout &layout = input->layout();
+ uint8_t *yPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_Y]);
+ uint8_t *uPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_U]);
+ uint8_t *vPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_V]);
+ int32_t yStride = layout.planes[C2PlanarLayout::PLANE_Y].rowInc;
+ int32_t uStride = layout.planes[C2PlanarLayout::PLANE_U].rowInc;
+ int32_t vStride = layout.planes[C2PlanarLayout::PLANE_V].rowInc;
+
+ uint32_t width = mSize->width;
+ uint32_t height = mSize->height;
+ // width and height are always even (as block size is 16x16)
+ CHECK_EQ((width & 1u), 0u);
+ CHECK_EQ((height & 1u), 0u);
+ size_t yPlaneSize = width * height;
+
+ switch (layout.type) {
+ case C2PlanarLayout::TYPE_RGB:
+ [[fallthrough]];
+ case C2PlanarLayout::TYPE_RGBA: {
+ ALOGV("yPlaneSize = %zu", yPlaneSize);
+ MemoryBlock conversionBuffer = mConversionBuffers.fetch(yPlaneSize * 3 / 2);
+ mConversionBuffersInUse.emplace(conversionBuffer.data(), conversionBuffer);
+ yPlane = conversionBuffer.data();
+ uPlane = yPlane + yPlaneSize;
+ vPlane = uPlane + yPlaneSize / 4;
+ yStride = width;
+ uStride = vStride = yStride / 2;
+ ConvertRGBToPlanarYUV(yPlane, yStride, height, conversionBuffer.size(), *input);
+ break;
+ }
+ case C2PlanarLayout::TYPE_YUV: {
+ if (!IsYUV420(*input)) {
+ ALOGE("input is not YUV420");
+ return C2_BAD_VALUE;
+ }
+
+ if (layout.planes[layout.PLANE_Y].colInc == 1
+ && layout.planes[layout.PLANE_U].colInc == 1
+ && layout.planes[layout.PLANE_V].colInc == 1
+ && uStride == vStride
+ && yStride == 2 * vStride) {
+ // I420 compatible - already set up above
+ break;
+ }
+
+ // copy to I420
+ yStride = width;
+ uStride = vStride = yStride / 2;
+ MemoryBlock conversionBuffer = mConversionBuffers.fetch(yPlaneSize * 3 / 2);
+ mConversionBuffersInUse.emplace(conversionBuffer.data(), conversionBuffer);
+ MediaImage2 img = CreateYUV420PlanarMediaImage2(width, height, yStride, height);
+ status_t err = ImageCopy(conversionBuffer.data(), &img, *input);
+ if (err != OK) {
+ ALOGE("Buffer conversion failed: %d", err);
+ return C2_BAD_VALUE;
+ }
+ yPlane = conversionBuffer.data();
+ uPlane = yPlane + yPlaneSize;
+ vPlane = uPlane + yPlaneSize / 4;
+ break;
+
+ }
+
+ case C2PlanarLayout::TYPE_YUVA:
+ ALOGE("YUVA plane type is not supported");
+ return C2_BAD_VALUE;
+
+ default:
+ ALOGE("Unrecognized plane type: %d", layout.type);
+ return C2_BAD_VALUE;
+ }
+
+ switch (mIvVideoColorFormat) {
+ case IV_YUV_420P:
+ {
+ // input buffer is supposed to be const but Ittiam API wants bare pointer.
+ ps_inp_raw_buf->apv_bufs[0] = yPlane;
+ ps_inp_raw_buf->apv_bufs[1] = uPlane;
+ ps_inp_raw_buf->apv_bufs[2] = vPlane;
+
+ ps_inp_raw_buf->au4_wd[0] = input->width();
+ ps_inp_raw_buf->au4_wd[1] = input->width() / 2;
+ ps_inp_raw_buf->au4_wd[2] = input->width() / 2;
+
+ ps_inp_raw_buf->au4_ht[0] = input->height();
+ ps_inp_raw_buf->au4_ht[1] = input->height() / 2;
+ ps_inp_raw_buf->au4_ht[2] = input->height() / 2;
+
+ ps_inp_raw_buf->au4_strd[0] = yStride;
+ ps_inp_raw_buf->au4_strd[1] = uStride;
+ ps_inp_raw_buf->au4_strd[2] = vStride;
+ break;
+ }
+
+ case IV_YUV_422ILE:
+ {
+ // TODO
+ // ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
+ // ps_inp_raw_buf->au4_wd[0] = mWidth * 2;
+ // ps_inp_raw_buf->au4_ht[0] = mHeight;
+ // ps_inp_raw_buf->au4_strd[0] = mStride * 2;
+ break;
+ }
+
+ case IV_YUV_420SP_UV:
+ case IV_YUV_420SP_VU:
+ default:
+ {
+ ps_inp_raw_buf->apv_bufs[0] = yPlane;
+ ps_inp_raw_buf->apv_bufs[1] = uPlane;
+
+ ps_inp_raw_buf->au4_wd[0] = input->width();
+ ps_inp_raw_buf->au4_wd[1] = input->width();
+
+ ps_inp_raw_buf->au4_ht[0] = input->height();
+ ps_inp_raw_buf->au4_ht[1] = input->height() / 2;
+
+ ps_inp_raw_buf->au4_strd[0] = yStride;
+ ps_inp_raw_buf->au4_strd[1] = uStride;
+ break;
+ }
+ }
+ return C2_OK;
+}
+
+void C2SoftAvcEnc::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ IV_STATUS_T status;
+ WORD32 timeDelay, timeTaken;
+ uint64_t timestamp = work->input.ordinal.timestamp.peekull();
+
+ // Initialize encoder if not already initialized
+ if (mCodecCtx == nullptr) {
+ if (C2_OK != initEncoder()) {
+ ALOGE("Failed to initialize encoder");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ if (mSignalledError) {
+ return;
+ }
+
+ // while (!mSawOutputEOS && !outQueue.empty()) {
+ c2_status_t error;
+ ive_video_encode_ip_t s_encode_ip;
+ ive_video_encode_op_t s_encode_op;
+
+ if (!mSpsPpsHeaderReceived) {
+ constexpr uint32_t kHeaderLength = MIN_STREAM_SIZE;
+ uint8_t header[kHeaderLength];
+ error = setEncodeArgs(
+ &s_encode_ip, &s_encode_op, nullptr, header, kHeaderLength, timestamp);
+ if (error != C2_OK) {
+ ALOGE("setEncodeArgs failed: %d", error);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op);
+
+ if (IV_SUCCESS != status) {
+ ALOGE("Encode header failed = 0x%x\n",
+ s_encode_op.u4_error_code);
+ return;
+ } else {
+ ALOGV("Bytes Generated in header %d\n",
+ s_encode_op.s_out_buf.u4_bytes);
+ }
+
+ mSpsPpsHeaderReceived = true;
+
+ std::unique_ptr<C2StreamCsdInfo::output> csd =
+ C2StreamCsdInfo::output::AllocUnique(s_encode_op.s_out_buf.u4_bytes, 0u);
+ if (!csd) {
+ ALOGE("CSD allocation failed");
+ mSignalledError = true;
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ memcpy(csd->m.value, header, s_encode_op.s_out_buf.u4_bytes);
+ work->worklets.front()->output.configUpdate.push_back(std::move(csd));
+
+ DUMP_TO_FILE(
+ mOutFile, csd->m.value, csd->flexCount());
+ }
+
+ // handle dynamic config parameters
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ std::shared_ptr<C2StreamIntraRefreshTuning::output> intraRefresh = mIntf->getIntraRefresh_l();
+ std::shared_ptr<C2StreamBitrateInfo::output> bitrate = mIntf->getBitrate_l();
+ std::shared_ptr<C2StreamRequestSyncFrameTuning::output> requestSync = mIntf->getRequestSync_l();
+ lock.unlock();
+
+ if (bitrate != mBitrate) {
+ mBitrate = bitrate;
+ setBitRate();
+ }
+
+ if (intraRefresh != mIntraRefresh) {
+ mIntraRefresh = intraRefresh;
+ setAirParams();
+ }
+
+ if (requestSync != mRequestSync) {
+ // we can handle IDR immediately
+ if (requestSync->value) {
+ // unset request
+ C2StreamRequestSyncFrameTuning::output clearSync(0u, C2_FALSE);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ mIntf->config({ &clearSync }, C2_MAY_BLOCK, &failures);
+ ALOGV("Got sync request");
+ setFrameType(IV_IDR_FRAME);
+ }
+ mRequestSync = requestSync;
+ }
+ }
+
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ mSawInputEOS = true;
+ }
+
+ /* In normal mode, store inputBufferInfo and this will be returned
+ when encoder consumes this input */
+ // if (!mInputDataIsMeta && (inputBufferInfo != NULL)) {
+ // for (size_t i = 0; i < MAX_INPUT_BUFFER_HEADERS; i++) {
+ // if (NULL == mInputBufferInfo[i]) {
+ // mInputBufferInfo[i] = inputBufferInfo;
+ // break;
+ // }
+ // }
+ // }
+ std::shared_ptr<const C2GraphicView> view;
+ std::shared_ptr<C2Buffer> inputBuffer;
+ if (!work->input.buffers.empty()) {
+ inputBuffer = work->input.buffers[0];
+ view = std::make_shared<const C2GraphicView>(
+ inputBuffer->data().graphicBlocks().front().map().get());
+ if (view->error() != C2_OK) {
+ ALOGE("graphic view map err = %d", view->error());
+ return;
+ }
+ }
+
+ std::shared_ptr<C2LinearBlock> block;
+
+ do {
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ // TODO: error handling, proper usage, etc.
+ c2_status_t err = pool->fetchLinearBlock(mOutBufferSize, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetch linear block err = %d", err);
+ work->result = err;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error() != C2_OK) {
+ ALOGE("write view map err = %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+
+ error = setEncodeArgs(
+ &s_encode_ip, &s_encode_op, view.get(), wView.base(), wView.capacity(), timestamp);
+ if (error != C2_OK) {
+ ALOGE("setEncodeArgs failed : %d", error);
+ mSignalledError = true;
+ work->result = error;
+ return;
+ }
+
+ // DUMP_TO_FILE(
+ // mInFile, s_encode_ip.s_inp_buf.apv_bufs[0],
+ // (mHeight * mStride * 3 / 2));
+
+ GETTIME(&mTimeStart, nullptr);
+ /* Compute time elapsed between end of previous decode()
+ * to start of current decode() */
+ TIME_DIFF(mTimeEnd, mTimeStart, timeDelay);
+ status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op);
+
+ if (IV_SUCCESS != status) {
+ if ((s_encode_op.u4_error_code & 0xFF) == IH264E_BITSTREAM_BUFFER_OVERFLOW) {
+ // TODO: use IVE_CMD_CTL_GETBUFINFO for proper max input size?
+ mOutBufferSize *= 2;
+ continue;
+ }
+ ALOGE("Encode Frame failed = 0x%x\n",
+ s_encode_op.u4_error_code);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ } while (IV_SUCCESS != status);
+
+ // Hold input buffer reference
+ if (inputBuffer) {
+ mBuffers[s_encode_ip.s_inp_buf.apv_bufs[0]] = inputBuffer;
+ }
+
+ GETTIME(&mTimeEnd, nullptr);
+ /* Compute time taken for decode() */
+ TIME_DIFF(mTimeStart, mTimeEnd, timeTaken);
+
+ ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay,
+ s_encode_op.s_out_buf.u4_bytes);
+
+ void *freed = s_encode_op.s_inp_buf.apv_bufs[0];
+ /* If encoder frees up an input buffer, mark it as free */
+ if (freed != nullptr) {
+ if (mBuffers.count(freed) == 0u) {
+ ALOGD("buffer not tracked");
+ } else {
+ // Release input buffer reference
+ mBuffers.erase(freed);
+ mConversionBuffersInUse.erase(freed);
+ }
+ }
+
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->worklets.front()->output.ordinal.timestamp =
+ ((uint64_t)s_encode_op.u4_timestamp_high << 32) | s_encode_op.u4_timestamp_low;
+ work->worklets.front()->output.buffers.clear();
+
+ if (s_encode_op.s_out_buf.u4_bytes) {
+ std::shared_ptr<C2Buffer> buffer =
+ createLinearBuffer(block, 0, s_encode_op.s_out_buf.u4_bytes);
+ if (IV_IDR_FRAME == s_encode_op.u4_encoded_frame_type) {
+ ALOGV("IDR frame produced");
+ buffer->setInfo(std::make_shared<C2StreamPictureTypeMaskInfo::output>(
+ 0u /* stream id */, C2PictureTypeKeyFrame));
+ }
+ work->worklets.front()->output.buffers.push_back(buffer);
+ }
+
+ if (s_encode_op.u4_is_last) {
+ // outputBufferHeader->nFlags |= OMX_BUFFERFLAG_EOS;
+ mSawOutputEOS = true;
+ } else {
+ // outputBufferHeader->nFlags &= ~OMX_BUFFERFLAG_EOS;
+ }
+}
+
+c2_status_t C2SoftAvcEnc::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // TODO: use IVE_CMD_CTL_FLUSH?
+ (void)drainMode;
+ (void)pool;
+ return C2_OK;
+}
+
+
+class C2SoftAvcEncFactory : public C2ComponentFactory {
+public:
+ C2SoftAvcEncFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftAvcEnc(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftAvcEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftAvcEnc::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftAvcEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftAvcEncFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftAvcEncFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/avc/C2SoftAvcEnc.h b/media/codec2/components/avc/C2SoftAvcEnc.h
new file mode 100644
index 0000000..aa3ca61
--- /dev/null
+++ b/media/codec2/components/avc/C2SoftAvcEnc.h
@@ -0,0 +1,296 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_AVC_ENC_H__
+#define ANDROID_C2_SOFT_AVC_ENC_H__
+
+#include <map>
+
+#include <utils/Vector.h>
+
+#include <SimpleC2Component.h>
+
+#include "ih264_typedefs.h"
+#include "iv2.h"
+#include "ive2.h"
+
+namespace android {
+
+#define CODEC_MAX_CORES 4
+#define LEN_STATUS_BUFFER (10 * 1024)
+#define MAX_VBV_BUFF_SIZE (120 * 16384)
+#define MAX_NUM_IO_BUFS 3
+
+#define DEFAULT_MAX_REF_FRM 2
+#define DEFAULT_MAX_REORDER_FRM 0
+#define DEFAULT_QP_MIN 10
+#define DEFAULT_QP_MAX 40
+#define DEFAULT_MAX_BITRATE 20000000
+#define DEFAULT_MAX_SRCH_RANGE_X 256
+#define DEFAULT_MAX_SRCH_RANGE_Y 256
+#define DEFAULT_MAX_FRAMERATE 120000
+#define DEFAULT_NUM_CORES 1
+#define DEFAULT_NUM_CORES_PRE_ENC 0
+#define DEFAULT_FPS 30
+#define DEFAULT_ENC_SPEED IVE_NORMAL
+
+#define DEFAULT_MEM_REC_CNT 0
+#define DEFAULT_RECON_ENABLE 0
+#define DEFAULT_CHKSUM_ENABLE 0
+#define DEFAULT_START_FRM 0
+#define DEFAULT_NUM_FRMS 0xFFFFFFFF
+#define DEFAULT_INP_COLOR_FORMAT IV_YUV_420SP_VU
+#define DEFAULT_RECON_COLOR_FORMAT IV_YUV_420P
+#define DEFAULT_LOOPBACK 0
+#define DEFAULT_SRC_FRAME_RATE 30
+#define DEFAULT_TGT_FRAME_RATE 30
+#define DEFAULT_MAX_WD 1920
+#define DEFAULT_MAX_HT 1920
+#define DEFAULT_MAX_LEVEL 41
+#define DEFAULT_STRIDE 0
+#define DEFAULT_WD 1280
+#define DEFAULT_HT 720
+#define DEFAULT_PSNR_ENABLE 0
+#define DEFAULT_ME_SPEED 100
+#define DEFAULT_ENABLE_FAST_SAD 0
+#define DEFAULT_ENABLE_ALT_REF 0
+#define DEFAULT_RC_MODE IVE_RC_STORAGE
+#define DEFAULT_BITRATE 6000000
+#define DEFAULT_I_QP 22
+#define DEFAULT_I_QP_MAX DEFAULT_QP_MAX
+#define DEFAULT_I_QP_MIN DEFAULT_QP_MIN
+#define DEFAULT_P_QP 28
+#define DEFAULT_P_QP_MAX DEFAULT_QP_MAX
+#define DEFAULT_P_QP_MIN DEFAULT_QP_MIN
+#define DEFAULT_B_QP 22
+#define DEFAULT_B_QP_MAX DEFAULT_QP_MAX
+#define DEFAULT_B_QP_MIN DEFAULT_QP_MIN
+#define DEFAULT_AIR IVE_AIR_MODE_NONE
+#define DEFAULT_AIR_REFRESH_PERIOD 30
+#define DEFAULT_SRCH_RNG_X 64
+#define DEFAULT_SRCH_RNG_Y 48
+#define DEFAULT_I_INTERVAL 30
+#define DEFAULT_IDR_INTERVAL 1000
+#define DEFAULT_B_FRAMES 0
+#define DEFAULT_DISABLE_DEBLK_LEVEL 0
+#define DEFAULT_HPEL 1
+#define DEFAULT_QPEL 1
+#define DEFAULT_I4 1
+#define DEFAULT_EPROFILE IV_PROFILE_BASE
+#define DEFAULT_ENTROPY_MODE 0
+#define DEFAULT_SLICE_MODE IVE_SLICE_MODE_NONE
+#define DEFAULT_SLICE_PARAM 256
+#define DEFAULT_ARCH ARCH_ARM_A9Q
+#define DEFAULT_SOC SOC_GENERIC
+#define DEFAULT_INTRA4x4 0
+#define STRLENGTH 500
+#define DEFAULT_CONSTRAINED_INTRA 0
+
+#define MIN(a, b) ((a) < (b))? (a) : (b)
+#define MAX(a, b) ((a) > (b))? (a) : (b)
+#define ALIGN16(x) ((((x) + 15) >> 4) << 4)
+#define ALIGN128(x) ((((x) + 127) >> 7) << 7)
+#define ALIGN4096(x) ((((x) + 4095) >> 12) << 12)
+
+/** Used to remove warnings about unused parameters */
+#define UNUSED(x) ((void)(x))
+
+/** Get time */
+#define GETTIME(a, b) gettimeofday(a, b);
+
+/** Compute difference between start and end */
+#define TIME_DIFF(start, end, diff) \
+ diff = (((end).tv_sec - (start).tv_sec) * 1000000) + \
+ ((end).tv_usec - (start).tv_usec);
+
+#define ive_aligned_malloc(alignment, size) memalign(alignment, size)
+#define ive_aligned_free(buf) free(buf)
+
+struct C2SoftAvcEnc : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftAvcEnc(const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl);
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+protected:
+ virtual ~C2SoftAvcEnc();
+
+private:
+ // OMX input buffer's timestamp and flags
+ typedef struct {
+ int64_t mTimeUs;
+ int32_t mFlags;
+ } InputBufferInfo;
+
+ std::shared_ptr<IntfImpl> mIntf;
+
+ int32_t mStride;
+
+ struct timeval mTimeStart; // Time at the start of decode()
+ struct timeval mTimeEnd; // Time at the end of decode()
+
+#ifdef FILE_DUMP_ENABLE
+ char mInFile[200];
+ char mOutFile[200];
+#endif /* FILE_DUMP_ENABLE */
+
+ IV_COLOR_FORMAT_T mIvVideoColorFormat;
+
+ IV_PROFILE_T mAVCEncProfile __unused;
+ WORD32 mAVCEncLevel;
+ bool mStarted;
+ bool mSpsPpsHeaderReceived;
+
+ bool mSawInputEOS;
+ bool mSawOutputEOS;
+ bool mSignalledError;
+ bool mIntra4x4;
+ bool mEnableFastSad;
+ bool mEnableAltRef;
+ bool mReconEnable;
+ bool mPSNREnable;
+ bool mEntropyMode;
+ bool mConstrainedIntraFlag;
+ IVE_SPEED_CONFIG mEncSpeed;
+
+ iv_obj_t *mCodecCtx; // Codec context
+ iv_mem_rec_t *mMemRecords; // Memory records requested by the codec
+ size_t mNumMemRecords; // Number of memory records requested by codec
+ size_t mNumCores; // Number of cores used by the codec
+
+ // configurations used by component in process
+ // (TODO: keep this in intf but make them internal only)
+ std::shared_ptr<C2StreamPictureSizeInfo::input> mSize;
+ std::shared_ptr<C2StreamIntraRefreshTuning::output> mIntraRefresh;
+ std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
+ std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
+ std::shared_ptr<C2StreamRequestSyncFrameTuning::output> mRequestSync;
+
+ uint32_t mOutBufferSize;
+ UWORD32 mHeaderGenerated;
+ UWORD32 mBframes;
+ IV_ARCH_T mArch;
+ IVE_SLICE_MODE_T mSliceMode;
+ UWORD32 mSliceParam;
+ bool mHalfPelEnable;
+ UWORD32 mIInterval;
+ UWORD32 mIDRInterval;
+ UWORD32 mDisableDeblkLevel;
+ std::map<const void *, std::shared_ptr<C2Buffer>> mBuffers;
+ MemoryBlockPool mConversionBuffers;
+ std::map<const void *, MemoryBlock> mConversionBuffersInUse;
+
+ void initEncParams();
+ c2_status_t initEncoder();
+ c2_status_t releaseEncoder();
+
+ c2_status_t setFrameType(IV_PICTURE_CODING_TYPE_T e_frame_type);
+ c2_status_t setQp();
+ c2_status_t setEncMode(IVE_ENC_MODE_T e_enc_mode);
+ c2_status_t setDimensions();
+ c2_status_t setNumCores();
+ c2_status_t setFrameRate();
+ c2_status_t setIpeParams();
+ c2_status_t setBitRate();
+ c2_status_t setAirParams();
+ c2_status_t setMeParams();
+ c2_status_t setGopParams();
+ c2_status_t setProfileParams();
+ c2_status_t setDeblockParams();
+ c2_status_t setVbvParams();
+ void logVersion();
+ c2_status_t setEncodeArgs(
+ ive_video_encode_ip_t *ps_encode_ip,
+ ive_video_encode_op_t *ps_encode_op,
+ const C2GraphicView *const input,
+ uint8_t *base,
+ uint32_t capacity,
+ uint64_t timestamp);
+
+ C2_DO_NOT_COPY(C2SoftAvcEnc);
+};
+
+#ifdef FILE_DUMP_ENABLE
+
+#define INPUT_DUMP_PATH "/sdcard/media/avce_input"
+#define INPUT_DUMP_EXT "yuv"
+#define OUTPUT_DUMP_PATH "/sdcard/media/avce_output"
+#define OUTPUT_DUMP_EXT "h264"
+
+#define GENERATE_FILE_NAMES() { \
+ GETTIME(&mTimeStart, NULL); \
+ strcpy(mInFile, ""); \
+ sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH, \
+ mTimeStart.tv_sec, mTimeStart.tv_usec, \
+ INPUT_DUMP_EXT); \
+ strcpy(mOutFile, ""); \
+ sprintf(mOutFile, "%s_%ld.%ld.%s", OUTPUT_DUMP_PATH,\
+ mTimeStart.tv_sec, mTimeStart.tv_usec, \
+ OUTPUT_DUMP_EXT); \
+}
+
+#define CREATE_DUMP_FILE(m_filename) { \
+ FILE *fp = fopen(m_filename, "wb"); \
+ if (fp != NULL) { \
+ ALOGD("Opened file %s", m_filename); \
+ fclose(fp); \
+ } else { \
+ ALOGD("Could not open file %s", m_filename); \
+ } \
+}
+#define DUMP_TO_FILE(m_filename, m_buf, m_size) \
+{ \
+ FILE *fp = fopen(m_filename, "ab"); \
+ if (fp != NULL && m_buf != NULL) { \
+ int i; \
+ i = fwrite(m_buf, 1, m_size, fp); \
+ ALOGD("fwrite ret %d to write %d", i, m_size); \
+ if (i != (int)m_size) { \
+ ALOGD("Error in fwrite, returned %d", i); \
+ perror("Error in write to file"); \
+ } \
+ fclose(fp); \
+ } else { \
+ ALOGD("Could not write to file %s", m_filename);\
+ if (fp != NULL) \
+ fclose(fp); \
+ } \
+}
+#else /* FILE_DUMP_ENABLE */
+#define INPUT_DUMP_PATH
+#define INPUT_DUMP_EXT
+#define OUTPUT_DUMP_PATH
+#define OUTPUT_DUMP_EXT
+#define GENERATE_FILE_NAMES()
+#define CREATE_DUMP_FILE(m_filename)
+#define DUMP_TO_FILE(m_filename, m_buf, m_size)
+#endif /* FILE_DUMP_ENABLE */
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_AVC_ENC_H__
diff --git a/media/codec2/components/base/Android.bp b/media/codec2/components/base/Android.bp
new file mode 100644
index 0000000..06bb81a
--- /dev/null
+++ b/media/codec2/components/base/Android.bp
@@ -0,0 +1,141 @@
+// DO NOT DEPEND ON THIS DIRECTLY
+// use libcodec2_soft-defaults instead
+cc_library_shared {
+ name: "libcodec2_soft_common",
+ defaults: ["libcodec2-impl-defaults"],
+ vendor_available: true,
+
+ srcs: [
+ "SimpleC2Component.cpp",
+ "SimpleC2Interface.cpp",
+ ],
+
+ export_include_dirs: [
+ "include",
+ ],
+
+ export_shared_lib_headers: [
+ "libsfplugin_ccodec_utils",
+ ],
+
+ shared_libs: [
+ "libcutils", // for properties
+ "liblog", // for ALOG
+ "libsfplugin_ccodec_utils", // for ImageCopy
+ "libstagefright_foundation", // for Mutexed
+ ],
+
+ sanitize: {
+ misc_undefined: [
+ "unsigned-integer-overflow",
+ "signed-integer-overflow",
+ ],
+ cfi: true,
+ diag: {
+ cfi: true,
+ },
+ },
+
+ ldflags: ["-Wl,-Bsymbolic"],
+}
+
+// public dependency for software codec implementation
+// to be used by code under media/codecs/* only as its stability is not guaranteed
+cc_defaults {
+ name: "libcodec2_soft-defaults",
+ defaults: ["libcodec2-impl-defaults"],
+ vendor_available: true,
+
+ export_shared_lib_headers: [
+ "libsfplugin_ccodec_utils",
+ ],
+
+ shared_libs: [
+ "libcodec2_soft_common",
+ "libcutils", // for properties
+ "liblog", // for ALOG
+ "libsfplugin_ccodec_utils", // for ImageCopy
+ "libstagefright_foundation", // for ColorUtils and MIME
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+ ldflags: ["-Wl,-Bsymbolic"],
+}
+
+// public dependency for software codec implementation
+// to be used by code under media/codecs/* only
+cc_defaults {
+ name: "libcodec2_soft_sanitize_all-defaults",
+
+ sanitize: {
+ misc_undefined: [
+ "unsigned-integer-overflow",
+ "signed-integer-overflow",
+ ],
+ cfi: true,
+ diag: {
+ cfi: true,
+ },
+ },
+}
+
+// public dependency for software codec implementation
+// to be used by code under media/codecs/* only
+cc_defaults {
+ name: "libcodec2_soft_sanitize_signed-defaults",
+
+ sanitize: {
+ misc_undefined: [
+ "signed-integer-overflow",
+ ],
+ cfi: true,
+ diag: {
+ cfi: true,
+ },
+ },
+}
+
+// TEMP: used by cheets2 project - remove when no longer used
+cc_library_shared {
+ name: "libcodec2_simple_component",
+ vendor_available: true,
+
+ srcs: [
+ "SimpleC2Interface.cpp",
+ ],
+
+ local_include_dirs: [
+ "include",
+ ],
+
+ export_include_dirs: [
+ "include",
+ ],
+
+ shared_libs: [
+ "libcodec2",
+ "libcodec2_vndk",
+ "libcutils",
+ "liblog",
+ "libstagefright_foundation",
+ "libutils",
+ ],
+
+ sanitize: {
+ misc_undefined: [
+ "unsigned-integer-overflow",
+ "signed-integer-overflow",
+ ],
+ cfi: true,
+ diag: {
+ cfi: true,
+ },
+ },
+
+ ldflags: ["-Wl,-Bsymbolic"],
+}
+
diff --git a/media/codec2/components/base/SimpleC2Component.cpp b/media/codec2/components/base/SimpleC2Component.cpp
new file mode 100644
index 0000000..7990ee5
--- /dev/null
+++ b/media/codec2/components/base/SimpleC2Component.cpp
@@ -0,0 +1,562 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "SimpleC2Component"
+#include <log/log.h>
+
+#include <cutils/properties.h>
+#include <media/stagefright/foundation/AMessage.h>
+
+#include <inttypes.h>
+
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <SimpleC2Component.h>
+
+namespace android {
+
+std::unique_ptr<C2Work> SimpleC2Component::WorkQueue::pop_front() {
+ std::unique_ptr<C2Work> work = std::move(mQueue.front().work);
+ mQueue.pop_front();
+ return work;
+}
+
+void SimpleC2Component::WorkQueue::push_back(std::unique_ptr<C2Work> work) {
+ mQueue.push_back({ std::move(work), NO_DRAIN });
+}
+
+bool SimpleC2Component::WorkQueue::empty() const {
+ return mQueue.empty();
+}
+
+void SimpleC2Component::WorkQueue::clear() {
+ mQueue.clear();
+}
+
+uint32_t SimpleC2Component::WorkQueue::drainMode() const {
+ return mQueue.front().drainMode;
+}
+
+void SimpleC2Component::WorkQueue::markDrain(uint32_t drainMode) {
+ mQueue.push_back({ nullptr, drainMode });
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+SimpleC2Component::WorkHandler::WorkHandler() : mRunning(false) {}
+
+void SimpleC2Component::WorkHandler::setComponent(
+ const std::shared_ptr<SimpleC2Component> &thiz) {
+ mThiz = thiz;
+}
+
+static void Reply(const sp<AMessage> &msg, int32_t *err = nullptr) {
+ sp<AReplyToken> replyId;
+ CHECK(msg->senderAwaitsResponse(&replyId));
+ sp<AMessage> reply = new AMessage;
+ if (err) {
+ reply->setInt32("err", *err);
+ }
+ reply->postReply(replyId);
+}
+
+void SimpleC2Component::WorkHandler::onMessageReceived(const sp<AMessage> &msg) {
+ std::shared_ptr<SimpleC2Component> thiz = mThiz.lock();
+ if (!thiz) {
+ ALOGD("component not yet set; msg = %s", msg->debugString().c_str());
+ sp<AReplyToken> replyId;
+ if (msg->senderAwaitsResponse(&replyId)) {
+ sp<AMessage> reply = new AMessage;
+ reply->setInt32("err", C2_CORRUPTED);
+ reply->postReply(replyId);
+ }
+ return;
+ }
+
+ switch (msg->what()) {
+ case kWhatProcess: {
+ if (mRunning) {
+ if (thiz->processQueue()) {
+ (new AMessage(kWhatProcess, this))->post();
+ }
+ } else {
+ ALOGV("Ignore process message as we're not running");
+ }
+ break;
+ }
+ case kWhatInit: {
+ int32_t err = thiz->onInit();
+ Reply(msg, &err);
+ [[fallthrough]];
+ }
+ case kWhatStart: {
+ mRunning = true;
+ break;
+ }
+ case kWhatStop: {
+ int32_t err = thiz->onStop();
+ Reply(msg, &err);
+ break;
+ }
+ case kWhatReset: {
+ thiz->onReset();
+ mRunning = false;
+ Reply(msg);
+ break;
+ }
+ case kWhatRelease: {
+ thiz->onRelease();
+ mRunning = false;
+ Reply(msg);
+ break;
+ }
+ default: {
+ ALOGD("Unrecognized msg: %d", msg->what());
+ break;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace {
+
+struct DummyReadView : public C2ReadView {
+ DummyReadView() : C2ReadView(C2_NO_INIT) {}
+};
+
+} // namespace
+
+SimpleC2Component::SimpleC2Component(
+ const std::shared_ptr<C2ComponentInterface> &intf)
+ : mDummyReadView(DummyReadView()),
+ mIntf(intf),
+ mLooper(new ALooper),
+ mHandler(new WorkHandler) {
+ mLooper->setName(intf->getName().c_str());
+ (void)mLooper->registerHandler(mHandler);
+ mLooper->start(false, false, ANDROID_PRIORITY_VIDEO);
+}
+
+SimpleC2Component::~SimpleC2Component() {
+ mLooper->unregisterHandler(mHandler->id());
+ (void)mLooper->stop();
+}
+
+c2_status_t SimpleC2Component::setListener_vb(
+ const std::shared_ptr<C2Component::Listener> &listener, c2_blocking_t mayBlock) {
+ mHandler->setComponent(shared_from_this());
+
+ Mutexed<ExecState>::Locked state(mExecState);
+ if (state->mState == RUNNING) {
+ if (listener) {
+ return C2_BAD_STATE;
+ } else if (!mayBlock) {
+ return C2_BLOCKING;
+ }
+ }
+ state->mListener = listener;
+ // TODO: wait for listener change to have taken place before returning
+ // (e.g. if there is an ongoing listener callback)
+ return C2_OK;
+}
+
+c2_status_t SimpleC2Component::queue_nb(std::list<std::unique_ptr<C2Work>> * const items) {
+ {
+ Mutexed<ExecState>::Locked state(mExecState);
+ if (state->mState != RUNNING) {
+ return C2_BAD_STATE;
+ }
+ }
+ bool queueWasEmpty = false;
+ {
+ Mutexed<WorkQueue>::Locked queue(mWorkQueue);
+ queueWasEmpty = queue->empty();
+ while (!items->empty()) {
+ queue->push_back(std::move(items->front()));
+ items->pop_front();
+ }
+ }
+ if (queueWasEmpty) {
+ (new AMessage(WorkHandler::kWhatProcess, mHandler))->post();
+ }
+ return C2_OK;
+}
+
+c2_status_t SimpleC2Component::announce_nb(const std::vector<C2WorkOutline> &items) {
+ (void)items;
+ return C2_OMITTED;
+}
+
+c2_status_t SimpleC2Component::flush_sm(
+ flush_mode_t flushMode, std::list<std::unique_ptr<C2Work>>* const flushedWork) {
+ (void)flushMode;
+ {
+ Mutexed<ExecState>::Locked state(mExecState);
+ if (state->mState != RUNNING) {
+ return C2_BAD_STATE;
+ }
+ }
+ {
+ Mutexed<WorkQueue>::Locked queue(mWorkQueue);
+ queue->incGeneration();
+ // TODO: queue->splicedBy(flushedWork, flushedWork->end());
+ while (!queue->empty()) {
+ std::unique_ptr<C2Work> work = queue->pop_front();
+ if (work) {
+ flushedWork->push_back(std::move(work));
+ }
+ }
+ }
+ {
+ Mutexed<PendingWork>::Locked pending(mPendingWork);
+ while (!pending->empty()) {
+ flushedWork->push_back(std::move(pending->begin()->second));
+ pending->erase(pending->begin());
+ }
+ }
+
+ return C2_OK;
+}
+
+c2_status_t SimpleC2Component::drain_nb(drain_mode_t drainMode) {
+ if (drainMode == DRAIN_CHAIN) {
+ return C2_OMITTED;
+ }
+ {
+ Mutexed<ExecState>::Locked state(mExecState);
+ if (state->mState != RUNNING) {
+ return C2_BAD_STATE;
+ }
+ }
+ bool queueWasEmpty = false;
+ {
+ Mutexed<WorkQueue>::Locked queue(mWorkQueue);
+ queueWasEmpty = queue->empty();
+ queue->markDrain(drainMode);
+ }
+ if (queueWasEmpty) {
+ (new AMessage(WorkHandler::kWhatProcess, mHandler))->post();
+ }
+
+ return C2_OK;
+}
+
+c2_status_t SimpleC2Component::start() {
+ Mutexed<ExecState>::Locked state(mExecState);
+ if (state->mState == RUNNING) {
+ return C2_BAD_STATE;
+ }
+ bool needsInit = (state->mState == UNINITIALIZED);
+ state.unlock();
+ if (needsInit) {
+ sp<AMessage> reply;
+ (new AMessage(WorkHandler::kWhatInit, mHandler))->postAndAwaitResponse(&reply);
+ int32_t err;
+ CHECK(reply->findInt32("err", &err));
+ if (err != C2_OK) {
+ return (c2_status_t)err;
+ }
+ } else {
+ (new AMessage(WorkHandler::kWhatStart, mHandler))->post();
+ }
+ state.lock();
+ state->mState = RUNNING;
+ return C2_OK;
+}
+
+c2_status_t SimpleC2Component::stop() {
+ ALOGV("stop");
+ {
+ Mutexed<ExecState>::Locked state(mExecState);
+ if (state->mState != RUNNING) {
+ return C2_BAD_STATE;
+ }
+ state->mState = STOPPED;
+ }
+ {
+ Mutexed<WorkQueue>::Locked queue(mWorkQueue);
+ queue->clear();
+ }
+ {
+ Mutexed<PendingWork>::Locked pending(mPendingWork);
+ pending->clear();
+ }
+ sp<AMessage> reply;
+ (new AMessage(WorkHandler::kWhatStop, mHandler))->postAndAwaitResponse(&reply);
+ int32_t err;
+ CHECK(reply->findInt32("err", &err));
+ if (err != C2_OK) {
+ return (c2_status_t)err;
+ }
+ return C2_OK;
+}
+
+c2_status_t SimpleC2Component::reset() {
+ ALOGV("reset");
+ {
+ Mutexed<ExecState>::Locked state(mExecState);
+ state->mState = UNINITIALIZED;
+ }
+ {
+ Mutexed<WorkQueue>::Locked queue(mWorkQueue);
+ queue->clear();
+ }
+ {
+ Mutexed<PendingWork>::Locked pending(mPendingWork);
+ pending->clear();
+ }
+ sp<AMessage> reply;
+ (new AMessage(WorkHandler::kWhatReset, mHandler))->postAndAwaitResponse(&reply);
+ return C2_OK;
+}
+
+c2_status_t SimpleC2Component::release() {
+ ALOGV("release");
+ sp<AMessage> reply;
+ (new AMessage(WorkHandler::kWhatRelease, mHandler))->postAndAwaitResponse(&reply);
+ return C2_OK;
+}
+
+std::shared_ptr<C2ComponentInterface> SimpleC2Component::intf() {
+ return mIntf;
+}
+
+namespace {
+
+std::list<std::unique_ptr<C2Work>> vec(std::unique_ptr<C2Work> &work) {
+ std::list<std::unique_ptr<C2Work>> ret;
+ ret.push_back(std::move(work));
+ return ret;
+}
+
+} // namespace
+
+void SimpleC2Component::finish(
+ uint64_t frameIndex, std::function<void(const std::unique_ptr<C2Work> &)> fillWork) {
+ std::unique_ptr<C2Work> work;
+ {
+ Mutexed<PendingWork>::Locked pending(mPendingWork);
+ if (pending->count(frameIndex) == 0) {
+ ALOGW("unknown frame index: %" PRIu64, frameIndex);
+ return;
+ }
+ work = std::move(pending->at(frameIndex));
+ pending->erase(frameIndex);
+ }
+ if (work) {
+ fillWork(work);
+ std::shared_ptr<C2Component::Listener> listener = mExecState.lock()->mListener;
+ listener->onWorkDone_nb(shared_from_this(), vec(work));
+ ALOGV("returning pending work");
+ }
+}
+
+void SimpleC2Component::cloneAndSend(
+ uint64_t frameIndex,
+ const std::unique_ptr<C2Work> ¤tWork,
+ std::function<void(const std::unique_ptr<C2Work> &)> fillWork) {
+ std::unique_ptr<C2Work> work(new C2Work);
+ if (currentWork->input.ordinal.frameIndex == frameIndex) {
+ work->input.flags = currentWork->input.flags;
+ work->input.ordinal = currentWork->input.ordinal;
+ } else {
+ Mutexed<PendingWork>::Locked pending(mPendingWork);
+ if (pending->count(frameIndex) == 0) {
+ ALOGW("unknown frame index: %" PRIu64, frameIndex);
+ return;
+ }
+ work->input.flags = pending->at(frameIndex)->input.flags;
+ work->input.ordinal = pending->at(frameIndex)->input.ordinal;
+ }
+ work->worklets.emplace_back(new C2Worklet);
+ if (work) {
+ fillWork(work);
+ std::shared_ptr<C2Component::Listener> listener = mExecState.lock()->mListener;
+ listener->onWorkDone_nb(shared_from_this(), vec(work));
+ ALOGV("cloned and sending work");
+ }
+}
+
+bool SimpleC2Component::processQueue() {
+ std::unique_ptr<C2Work> work;
+ uint64_t generation;
+ int32_t drainMode;
+ bool isFlushPending = false;
+ bool hasQueuedWork = false;
+ {
+ Mutexed<WorkQueue>::Locked queue(mWorkQueue);
+ if (queue->empty()) {
+ return false;
+ }
+
+ generation = queue->generation();
+ drainMode = queue->drainMode();
+ isFlushPending = queue->popPendingFlush();
+ work = queue->pop_front();
+ hasQueuedWork = !queue->empty();
+ }
+ if (isFlushPending) {
+ ALOGV("processing pending flush");
+ c2_status_t err = onFlush_sm();
+ if (err != C2_OK) {
+ ALOGD("flush err: %d", err);
+ // TODO: error
+ }
+ }
+
+ if (!mOutputBlockPool) {
+ c2_status_t err = [this] {
+ // TODO: don't use query_vb
+ C2StreamFormatConfig::output outputFormat(0u);
+ std::vector<std::unique_ptr<C2Param>> params;
+ c2_status_t err = intf()->query_vb(
+ { &outputFormat },
+ { C2PortBlockPoolsTuning::output::PARAM_TYPE },
+ C2_DONT_BLOCK,
+ ¶ms);
+ if (err != C2_OK && err != C2_BAD_INDEX) {
+ ALOGD("query err = %d", err);
+ return err;
+ }
+ C2BlockPool::local_id_t poolId =
+ outputFormat.value == C2FormatVideo
+ ? C2BlockPool::BASIC_GRAPHIC
+ : C2BlockPool::BASIC_LINEAR;
+ if (params.size()) {
+ C2PortBlockPoolsTuning::output *outputPools =
+ C2PortBlockPoolsTuning::output::From(params[0].get());
+ if (outputPools && outputPools->flexCount() >= 1) {
+ poolId = outputPools->m.values[0];
+ }
+ }
+
+ err = GetCodec2BlockPool(poolId, shared_from_this(), &mOutputBlockPool);
+ ALOGD("Using output block pool with poolID %llu => got %llu - %d",
+ (unsigned long long)poolId,
+ (unsigned long long)(
+ mOutputBlockPool ? mOutputBlockPool->getLocalId() : 111000111),
+ err);
+ return err;
+ }();
+ if (err != C2_OK) {
+ Mutexed<ExecState>::Locked state(mExecState);
+ std::shared_ptr<C2Component::Listener> listener = state->mListener;
+ state.unlock();
+ listener->onError_nb(shared_from_this(), err);
+ return hasQueuedWork;
+ }
+ }
+
+ if (!work) {
+ c2_status_t err = drain(drainMode, mOutputBlockPool);
+ if (err != C2_OK) {
+ Mutexed<ExecState>::Locked state(mExecState);
+ std::shared_ptr<C2Component::Listener> listener = state->mListener;
+ state.unlock();
+ listener->onError_nb(shared_from_this(), err);
+ }
+ return hasQueuedWork;
+ }
+
+ {
+ std::vector<C2Param *> updates;
+ for (const std::unique_ptr<C2Param> ¶m: work->input.configUpdate) {
+ if (param) {
+ updates.emplace_back(param.get());
+ }
+ }
+ if (!updates.empty()) {
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = intf()->config_vb(updates, C2_MAY_BLOCK, &failures);
+ ALOGD("applied %zu configUpdates => %s (%d)", updates.size(), asString(err), err);
+ }
+ }
+
+ ALOGV("start processing frame #%" PRIu64, work->input.ordinal.frameIndex.peeku());
+ process(work, mOutputBlockPool);
+ ALOGV("processed frame #%" PRIu64, work->input.ordinal.frameIndex.peeku());
+ {
+ Mutexed<WorkQueue>::Locked queue(mWorkQueue);
+ if (queue->generation() != generation) {
+ ALOGD("work form old generation: was %" PRIu64 " now %" PRIu64,
+ queue->generation(), generation);
+ work->result = C2_NOT_FOUND;
+ queue.unlock();
+ {
+ Mutexed<ExecState>::Locked state(mExecState);
+ std::shared_ptr<C2Component::Listener> listener = state->mListener;
+ state.unlock();
+ listener->onWorkDone_nb(shared_from_this(), vec(work));
+ }
+ queue.lock();
+ return hasQueuedWork;
+ }
+ }
+ if (work->workletsProcessed != 0u) {
+ Mutexed<ExecState>::Locked state(mExecState);
+ ALOGV("returning this work");
+ std::shared_ptr<C2Component::Listener> listener = state->mListener;
+ state.unlock();
+ listener->onWorkDone_nb(shared_from_this(), vec(work));
+ } else {
+ ALOGV("queue pending work");
+ work->input.buffers.clear();
+ std::unique_ptr<C2Work> unexpected;
+ {
+ Mutexed<PendingWork>::Locked pending(mPendingWork);
+ uint64_t frameIndex = work->input.ordinal.frameIndex.peeku();
+ if (pending->count(frameIndex) != 0) {
+ unexpected = std::move(pending->at(frameIndex));
+ pending->erase(frameIndex);
+ }
+ (void)pending->insert({ frameIndex, std::move(work) });
+ }
+ if (unexpected) {
+ ALOGD("unexpected pending work");
+ unexpected->result = C2_CORRUPTED;
+ Mutexed<ExecState>::Locked state(mExecState);
+ std::shared_ptr<C2Component::Listener> listener = state->mListener;
+ state.unlock();
+ listener->onWorkDone_nb(shared_from_this(), vec(unexpected));
+ }
+ }
+ return hasQueuedWork;
+}
+
+std::shared_ptr<C2Buffer> SimpleC2Component::createLinearBuffer(
+ const std::shared_ptr<C2LinearBlock> &block) {
+ return createLinearBuffer(block, block->offset(), block->size());
+}
+
+std::shared_ptr<C2Buffer> SimpleC2Component::createLinearBuffer(
+ const std::shared_ptr<C2LinearBlock> &block, size_t offset, size_t size) {
+ return C2Buffer::CreateLinearBuffer(block->share(offset, size, ::C2Fence()));
+}
+
+std::shared_ptr<C2Buffer> SimpleC2Component::createGraphicBuffer(
+ const std::shared_ptr<C2GraphicBlock> &block) {
+ return createGraphicBuffer(block, C2Rect(block->width(), block->height()));
+}
+
+std::shared_ptr<C2Buffer> SimpleC2Component::createGraphicBuffer(
+ const std::shared_ptr<C2GraphicBlock> &block, const C2Rect &crop) {
+ return C2Buffer::CreateGraphicBuffer(block->share(crop, ::C2Fence()));
+}
+
+} // namespace android
diff --git a/media/codec2/components/base/SimpleC2Interface.cpp b/media/codec2/components/base/SimpleC2Interface.cpp
new file mode 100644
index 0000000..c849a4e
--- /dev/null
+++ b/media/codec2/components/base/SimpleC2Interface.cpp
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "SimpleC2Interface"
+#include <utils/Log.h>
+
+// use MediaDefs here vs. MediaCodecConstants as this is not MediaCodec specific/dependent
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <SimpleC2Interface.h>
+
+namespace android {
+
+/* SimpleInterface */
+
+SimpleInterface<void>::BaseParams::BaseParams(
+ const std::shared_ptr<C2ReflectorHelper> &reflector,
+ C2String name,
+ C2Component::kind_t kind,
+ C2Component::domain_t domain,
+ C2String mediaType,
+ std::vector<C2String> aliases)
+ : C2InterfaceHelper(reflector) {
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mName, C2_PARAMKEY_COMPONENT_NAME)
+ .withConstValue(AllocSharedString<C2ComponentNameSetting>(name.c_str()))
+ .build());
+
+ if (aliases.size()) {
+ C2String joined;
+ for (const C2String &alias : aliases) {
+ if (joined.length()) {
+ joined += ",";
+ }
+ joined += alias;
+ }
+ addParameter(
+ DefineParam(mAliases, C2_PARAMKEY_COMPONENT_ALIASES)
+ .withConstValue(AllocSharedString<C2ComponentAliasesSetting>(joined.c_str()))
+ .build());
+ }
+
+ addParameter(
+ DefineParam(mKind, C2_PARAMKEY_COMPONENT_KIND)
+ .withConstValue(new C2ComponentKindSetting(kind))
+ .build());
+
+ addParameter(
+ DefineParam(mDomain, C2_PARAMKEY_COMPONENT_DOMAIN)
+ .withConstValue(new C2ComponentDomainSetting(domain))
+ .build());
+
+ // simple interfaces have single streams
+ addParameter(
+ DefineParam(mInputStreamCount, C2_PARAMKEY_INPUT_STREAM_COUNT)
+ .withConstValue(new C2PortStreamCountTuning::input(1))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputStreamCount, C2_PARAMKEY_OUTPUT_STREAM_COUNT)
+ .withConstValue(new C2PortStreamCountTuning::output(1))
+ .build());
+
+ // set up buffer formats and allocators
+
+ // default to linear buffers and no media type
+ C2BufferData::type_t rawBufferType = C2BufferData::LINEAR;
+ C2String rawMediaType;
+ C2Allocator::id_t rawAllocator = C2AllocatorStore::DEFAULT_LINEAR;
+ C2BlockPool::local_id_t rawPoolId = C2BlockPool::BASIC_LINEAR;
+ C2BufferData::type_t codedBufferType = C2BufferData::LINEAR;
+ C2Allocator::id_t codedAllocator = C2AllocatorStore::DEFAULT_LINEAR;
+ C2BlockPool::local_id_t codedPoolId = C2BlockPool::BASIC_LINEAR;
+
+ switch (domain) {
+ case C2Component::DOMAIN_IMAGE:
+ case C2Component::DOMAIN_VIDEO:
+ // TODO: should we define raw image? The only difference is timestamp handling
+ rawBufferType = C2BufferData::GRAPHIC;
+ rawMediaType = MEDIA_MIMETYPE_VIDEO_RAW;
+ rawAllocator = C2AllocatorStore::DEFAULT_GRAPHIC;
+ rawPoolId = C2BlockPool::BASIC_GRAPHIC;
+ break;
+ case C2Component::DOMAIN_AUDIO:
+ rawBufferType = C2BufferData::LINEAR;
+ rawMediaType = MEDIA_MIMETYPE_AUDIO_RAW;
+ rawAllocator = C2AllocatorStore::DEFAULT_LINEAR;
+ rawPoolId = C2BlockPool::BASIC_LINEAR;
+ break;
+ default:
+ break;
+ }
+ bool isEncoder = kind == C2Component::KIND_ENCODER;
+
+ // handle raw decoders
+ if (mediaType == rawMediaType) {
+ codedBufferType = rawBufferType;
+ codedAllocator = rawAllocator;
+ codedPoolId = rawPoolId;
+ }
+
+ addParameter(
+ DefineParam(mInputFormat, C2_PARAMKEY_INPUT_STREAM_BUFFER_TYPE)
+ .withConstValue(new C2StreamBufferTypeSetting::input(
+ 0u, isEncoder ? rawBufferType : codedBufferType))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_PARAMKEY_INPUT_MEDIA_TYPE)
+ .withConstValue(AllocSharedString<C2PortMediaTypeSetting::input>(
+ isEncoder ? rawMediaType : mediaType))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_PARAMKEY_OUTPUT_STREAM_BUFFER_TYPE)
+ .withConstValue(new C2StreamBufferTypeSetting::output(
+ 0u, isEncoder ? codedBufferType : rawBufferType))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_PARAMKEY_OUTPUT_MEDIA_TYPE)
+ .withConstValue(AllocSharedString<C2PortMediaTypeSetting::output>(
+ isEncoder ? mediaType : rawMediaType))
+ .build());
+
+ C2Allocator::id_t inputAllocators[1] = { isEncoder ? rawAllocator : codedAllocator };
+ C2Allocator::id_t outputAllocators[1] = { isEncoder ? codedAllocator : rawAllocator };
+ C2BlockPool::local_id_t outputPoolIds[1] = { isEncoder ? codedPoolId : rawPoolId };
+
+ addParameter(
+ DefineParam(mInputAllocators, C2_PARAMKEY_INPUT_ALLOCATORS)
+ .withDefault(C2PortAllocatorsTuning::input::AllocShared(inputAllocators))
+ .withFields({ C2F(mInputAllocators, m.values[0]).any(),
+ C2F(mInputAllocators, m.values).inRange(0, 1) })
+ .withSetter(Setter<C2PortAllocatorsTuning::input>::NonStrictValuesWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mOutputAllocators, C2_PARAMKEY_OUTPUT_ALLOCATORS)
+ .withDefault(C2PortAllocatorsTuning::output::AllocShared(outputAllocators))
+ .withFields({ C2F(mOutputAllocators, m.values[0]).any(),
+ C2F(mOutputAllocators, m.values).inRange(0, 1) })
+ .withSetter(Setter<C2PortAllocatorsTuning::output>::NonStrictValuesWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mOutputPoolIds, C2_PARAMKEY_OUTPUT_BLOCK_POOLS)
+ .withDefault(C2PortBlockPoolsTuning::output::AllocShared(outputPoolIds))
+ .withFields({ C2F(mOutputPoolIds, m.values[0]).any(),
+ C2F(mOutputPoolIds, m.values).inRange(0, 1) })
+ .withSetter(Setter<C2PortBlockPoolsTuning::output>::NonStrictValuesWithNoDeps)
+ .build());
+
+ // add stateless params
+ addParameter(
+ DefineParam(mSubscribedParamIndices, C2_PARAMKEY_SUBSCRIBED_PARAM_INDICES)
+ .withDefault(C2SubscribedParamIndicesTuning::AllocShared(0u))
+ .withFields({ C2F(mSubscribedParamIndices, m.values[0]).any(),
+ C2F(mSubscribedParamIndices, m.values).any() })
+ .withSetter(Setter<C2SubscribedParamIndicesTuning>::NonStrictValuesWithNoDeps)
+ .build());
+
+ /* TODO
+
+ addParameter(
+ DefineParam(mCurrentWorkOrdinal, C2_PARAMKEY_CURRENT_WORK)
+ .withDefault(new C2CurrentWorkTuning())
+ .withFields({ C2F(mCurrentWorkOrdinal, m.timeStamp).any(),
+ C2F(mCurrentWorkOrdinal, m.frameIndex).any(),
+ C2F(mCurrentWorkOrdinal, m.customOrdinal).any() })
+ .withSetter(Setter<C2CurrentWorkTuning>::NonStrictValuesWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mLastInputQueuedWorkOrdinal, C2_PARAMKEY_LAST_INPUT_QUEUED)
+ .withDefault(new C2LastWorkQueuedTuning::input())
+ .withFields({ C2F(mLastInputQueuedWorkOrdinal, m.timeStamp).any(),
+ C2F(mLastInputQueuedWorkOrdinal, m.frameIndex).any(),
+ C2F(mLastInputQueuedWorkOrdinal, m.customOrdinal).any() })
+ .withSetter(Setter<C2LastWorkQueuedTuning::input>::NonStrictValuesWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mLastOutputQueuedWorkOrdinal, C2_PARAMKEY_LAST_OUTPUT_QUEUED)
+ .withDefault(new C2LastWorkQueuedTuning::output())
+ .withFields({ C2F(mLastOutputQueuedWorkOrdinal, m.timeStamp).any(),
+ C2F(mLastOutputQueuedWorkOrdinal, m.frameIndex).any(),
+ C2F(mLastOutputQueuedWorkOrdinal, m.customOrdinal).any() })
+ .withSetter(Setter<C2LastWorkQueuedTuning::output>::NonStrictValuesWithNoDeps)
+ .build());
+
+ std::shared_ptr<C2OutOfMemoryTuning> mOutOfMemory;
+
+ std::shared_ptr<C2PortConfigCounterTuning::input> mInputConfigCounter;
+ std::shared_ptr<C2PortConfigCounterTuning::output> mOutputConfigCounter;
+ std::shared_ptr<C2ConfigCounterTuning> mDirectConfigCounter;
+
+ */
+}
+
+void SimpleInterface<void>::BaseParams::noInputLatency() {
+ addParameter(
+ DefineParam(mRequestedInputDelay, C2_PARAMKEY_INPUT_DELAY_REQUEST)
+ .withConstValue(new C2PortRequestedDelayTuning::input(0u))
+ .build());
+
+ addParameter(
+ DefineParam(mActualInputDelay, C2_PARAMKEY_INPUT_DELAY)
+ .withConstValue(new C2PortActualDelayTuning::input(0u))
+ .build());
+}
+
+void SimpleInterface<void>::BaseParams::noOutputLatency() {
+ addParameter(
+ DefineParam(mRequestedOutputDelay, C2_PARAMKEY_OUTPUT_DELAY_REQUEST)
+ .withConstValue(new C2PortRequestedDelayTuning::output(0u))
+ .build());
+
+ addParameter(
+ DefineParam(mActualOutputDelay, C2_PARAMKEY_OUTPUT_DELAY)
+ .withConstValue(new C2PortActualDelayTuning::output(0u))
+ .build());
+}
+
+void SimpleInterface<void>::BaseParams::noPipelineLatency() {
+ addParameter(
+ DefineParam(mRequestedPipelineDelay, C2_PARAMKEY_PIPELINE_DELAY_REQUEST)
+ .withConstValue(new C2RequestedPipelineDelayTuning(0u))
+ .build());
+
+ addParameter(
+ DefineParam(mActualPipelineDelay, C2_PARAMKEY_PIPELINE_DELAY)
+ .withConstValue(new C2ActualPipelineDelayTuning(0u))
+ .build());
+}
+
+void SimpleInterface<void>::BaseParams::noPrivateBuffers() {
+ addParameter(
+ DefineParam(mPrivateAllocators, C2_PARAMKEY_PRIVATE_ALLOCATORS)
+ .withConstValue(C2PrivateAllocatorsTuning::AllocShared(0u))
+ .build());
+
+ addParameter(
+ DefineParam(mMaxPrivateBufferCount, C2_PARAMKEY_MAX_PRIVATE_BUFFER_COUNT)
+ .withConstValue(C2MaxPrivateBufferCountTuning::AllocShared(0u))
+ .build());
+
+ addParameter(
+ DefineParam(mPrivatePoolIds, C2_PARAMKEY_PRIVATE_BLOCK_POOLS)
+ .withConstValue(C2PrivateBlockPoolsTuning::AllocShared(0u))
+ .build());
+}
+
+void SimpleInterface<void>::BaseParams::noInputReferences() {
+ addParameter(
+ DefineParam(mMaxInputReferenceAge, C2_PARAMKEY_INPUT_MAX_REFERENCE_AGE)
+ .withConstValue(new C2StreamMaxReferenceAgeTuning::input(0u))
+ .build());
+
+ addParameter(
+ DefineParam(mMaxInputReferenceCount, C2_PARAMKEY_INPUT_MAX_REFERENCE_COUNT)
+ .withConstValue(new C2StreamMaxReferenceCountTuning::input(0u))
+ .build());
+}
+
+void SimpleInterface<void>::BaseParams::noOutputReferences() {
+ addParameter(
+ DefineParam(mMaxOutputReferenceAge, C2_PARAMKEY_OUTPUT_MAX_REFERENCE_AGE)
+ .withConstValue(new C2StreamMaxReferenceAgeTuning::output(0u))
+ .build());
+
+ addParameter(
+ DefineParam(mMaxOutputReferenceCount, C2_PARAMKEY_OUTPUT_MAX_REFERENCE_COUNT)
+ .withConstValue(new C2StreamMaxReferenceCountTuning::output(0u))
+ .build());
+}
+
+void SimpleInterface<void>::BaseParams::noTimeStretch() {
+ addParameter(
+ DefineParam(mTimeStretch, C2_PARAMKEY_TIME_STRETCH)
+ .withConstValue(new C2ComponentTimeStretchTuning(1.f))
+ .build());
+}
+
+/*
+ Clients need to handle the following base params due to custom dependency.
+
+ std::shared_ptr<C2ApiLevelSetting> mApiLevel;
+ std::shared_ptr<C2ApiFeaturesSetting> mApiFeatures;
+ std::shared_ptr<C2ComponentAttributesSetting> mAttrib;
+
+ std::shared_ptr<C2PortSuggestedBufferCountTuning::input> mSuggestedInputBufferCount;
+ std::shared_ptr<C2PortSuggestedBufferCountTuning::output> mSuggestedOutputBufferCount;
+
+ std::shared_ptr<C2TrippedTuning> mTripped;
+
+*/
+
+} // namespace android
diff --git a/media/codec2/components/base/include/SimpleC2Component.h b/media/codec2/components/base/include/SimpleC2Component.h
new file mode 100644
index 0000000..b3a98f4
--- /dev/null
+++ b/media/codec2/components/base/include/SimpleC2Component.h
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SIMPLE_C2_COMPONENT_H_
+#define SIMPLE_C2_COMPONENT_H_
+
+#include <list>
+#include <unordered_map>
+
+#include <C2Component.h>
+
+#include <media/stagefright/foundation/AHandler.h>
+#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/Mutexed.h>
+
+namespace android {
+
+class SimpleC2Component
+ : public C2Component, public std::enable_shared_from_this<SimpleC2Component> {
+public:
+ explicit SimpleC2Component(
+ const std::shared_ptr<C2ComponentInterface> &intf);
+ virtual ~SimpleC2Component();
+
+ // C2Component
+ // From C2Component
+ virtual c2_status_t setListener_vb(
+ const std::shared_ptr<Listener> &listener, c2_blocking_t mayBlock) override;
+ virtual c2_status_t queue_nb(std::list<std::unique_ptr<C2Work>>* const items) override;
+ virtual c2_status_t announce_nb(const std::vector<C2WorkOutline> &items) override;
+ virtual c2_status_t flush_sm(
+ flush_mode_t mode, std::list<std::unique_ptr<C2Work>>* const flushedWork) override;
+ virtual c2_status_t drain_nb(drain_mode_t mode) override;
+ virtual c2_status_t start() override;
+ virtual c2_status_t stop() override;
+ virtual c2_status_t reset() override;
+ virtual c2_status_t release() override;
+ virtual std::shared_ptr<C2ComponentInterface> intf() override;
+
+ // for handler
+ bool processQueue();
+
+protected:
+ /**
+ * Initialize internal states of the component according to the config set
+ * in the interface.
+ *
+ * This method is called during start(), but only at the first invocation or
+ * after reset().
+ */
+ virtual c2_status_t onInit() = 0;
+
+ /**
+ * Stop the component.
+ */
+ virtual c2_status_t onStop() = 0;
+
+ /**
+ * Reset the component.
+ */
+ virtual void onReset() = 0;
+
+ /**
+ * Release the component.
+ */
+ virtual void onRelease() = 0;
+
+ /**
+ * Flush the component.
+ */
+ virtual c2_status_t onFlush_sm() = 0;
+
+ /**
+ * Process the given work and finish pending work using finish().
+ *
+ * \param[in,out] work the work to process
+ * \param[in] pool the pool to use for allocating output blocks.
+ */
+ virtual void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) = 0;
+
+ /**
+ * Drain the component and finish pending work using finish().
+ *
+ * \param[in] drainMode mode of drain.
+ * \param[in] pool the pool to use for allocating output blocks.
+ *
+ * \retval C2_OK The component has drained all pending output
+ * work.
+ * \retval C2_OMITTED Unsupported mode (e.g. DRAIN_CHAIN)
+ */
+ virtual c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) = 0;
+
+ // for derived classes
+ /**
+ * Finish pending work.
+ *
+ * This method will retrieve the pending work according to |frameIndex| and
+ * feed the work into |fillWork| function. |fillWork| must be
+ * "non-blocking". Once |fillWork| returns the filled work will be returned
+ * to the client.
+ *
+ * \param[in] frameIndex the index of the pending work
+ * \param[in] fillWork the function to fill the retrieved work.
+ */
+ void finish(uint64_t frameIndex, std::function<void(const std::unique_ptr<C2Work> &)> fillWork);
+
+ /**
+ * Clone pending or current work and send the work back to client.
+ *
+ * This method will retrieve and clone the pending or current work according
+ * to |frameIndex| and feed the work into |fillWork| function. |fillWork|
+ * must be "non-blocking". Once |fillWork| returns the filled work will be
+ * returned to the client.
+ *
+ * \param[in] frameIndex the index of the work
+ * \param[in] currentWork the current work under processing
+ * \param[in] fillWork the function to fill the retrieved work.
+ */
+ void cloneAndSend(
+ uint64_t frameIndex,
+ const std::unique_ptr<C2Work> ¤tWork,
+ std::function<void(const std::unique_ptr<C2Work> &)> fillWork);
+
+
+ std::shared_ptr<C2Buffer> createLinearBuffer(
+ const std::shared_ptr<C2LinearBlock> &block);
+
+ std::shared_ptr<C2Buffer> createLinearBuffer(
+ const std::shared_ptr<C2LinearBlock> &block, size_t offset, size_t size);
+
+ std::shared_ptr<C2Buffer> createGraphicBuffer(
+ const std::shared_ptr<C2GraphicBlock> &block);
+
+ std::shared_ptr<C2Buffer> createGraphicBuffer(
+ const std::shared_ptr<C2GraphicBlock> &block,
+ const C2Rect &crop);
+
+ static constexpr uint32_t NO_DRAIN = ~0u;
+
+ C2ReadView mDummyReadView;
+
+private:
+ const std::shared_ptr<C2ComponentInterface> mIntf;
+
+ class WorkHandler : public AHandler {
+ public:
+ enum {
+ kWhatProcess,
+ kWhatInit,
+ kWhatStart,
+ kWhatStop,
+ kWhatReset,
+ kWhatRelease,
+ };
+
+ WorkHandler();
+ ~WorkHandler() override = default;
+
+ void setComponent(const std::shared_ptr<SimpleC2Component> &thiz);
+
+ protected:
+ void onMessageReceived(const sp<AMessage> &msg) override;
+
+ private:
+ std::weak_ptr<SimpleC2Component> mThiz;
+ bool mRunning;
+ };
+
+ enum {
+ UNINITIALIZED,
+ STOPPED,
+ RUNNING,
+ };
+
+ struct ExecState {
+ ExecState() : mState(UNINITIALIZED) {}
+
+ int mState;
+ std::shared_ptr<C2Component::Listener> mListener;
+ };
+ Mutexed<ExecState> mExecState;
+
+ sp<ALooper> mLooper;
+ sp<WorkHandler> mHandler;
+
+ class WorkQueue {
+ public:
+ inline WorkQueue() : mFlush(false), mGeneration(0ul) {}
+
+ inline uint64_t generation() const { return mGeneration; }
+ inline void incGeneration() { ++mGeneration; mFlush = true; }
+
+ std::unique_ptr<C2Work> pop_front();
+ void push_back(std::unique_ptr<C2Work> work);
+ bool empty() const;
+ uint32_t drainMode() const;
+ void markDrain(uint32_t drainMode);
+ inline bool popPendingFlush() {
+ bool flush = mFlush;
+ mFlush = false;
+ return flush;
+ }
+ void clear();
+
+ private:
+ struct Entry {
+ std::unique_ptr<C2Work> work;
+ uint32_t drainMode;
+ };
+
+ bool mFlush;
+ uint64_t mGeneration;
+ std::list<Entry> mQueue;
+ };
+ Mutexed<WorkQueue> mWorkQueue;
+
+ typedef std::unordered_map<uint64_t, std::unique_ptr<C2Work>> PendingWork;
+ Mutexed<PendingWork> mPendingWork;
+
+ std::shared_ptr<C2BlockPool> mOutputBlockPool;
+
+ SimpleC2Component() = delete;
+};
+
+} // namespace android
+
+#endif // SIMPLE_C2_COMPONENT_H_
diff --git a/media/codec2/components/base/include/SimpleC2Interface.h b/media/codec2/components/base/include/SimpleC2Interface.h
new file mode 100644
index 0000000..2051d3d
--- /dev/null
+++ b/media/codec2/components/base/include/SimpleC2Interface.h
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_SIMPLE_C2_INTERFACE_H_
+#define ANDROID_SIMPLE_C2_INTERFACE_H_
+
+#include <C2Component.h>
+#include <C2Config.h>
+#include <util/C2InterfaceHelper.h>
+
+namespace android {
+
+/**
+ * Wrap a common interface object (such as Codec2Client::Interface, or C2InterfaceHelper into
+ * a C2ComponentInterface.
+ *
+ * \param T common interface type
+ */
+template <typename T>
+class SimpleC2Interface : public C2ComponentInterface {
+public:
+ SimpleC2Interface(const char *name, c2_node_id_t id, const std::shared_ptr<T> &impl)
+ : mName(name),
+ mId(id),
+ mImpl(impl) {
+ }
+
+ ~SimpleC2Interface() override = default;
+
+ // From C2ComponentInterface
+ C2String getName() const override { return mName; }
+ c2_node_id_t getId() const override { return mId; }
+ c2_status_t query_vb(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const override {
+ return mImpl->query(stackParams, heapParamIndices, mayBlock, heapParams);
+ }
+ c2_status_t config_vb(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) override {
+ return mImpl->config(params, mayBlock, failures);
+ }
+ c2_status_t createTunnel_sm(c2_node_id_t) override { return C2_OMITTED; }
+ c2_status_t releaseTunnel_sm(c2_node_id_t) override { return C2_OMITTED; }
+ c2_status_t querySupportedParams_nb(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) const override {
+ return mImpl->querySupportedParams(params);
+ }
+ c2_status_t querySupportedValues_vb(
+ std::vector<C2FieldSupportedValuesQuery> &fields,
+ c2_blocking_t mayBlock) const override {
+ return mImpl->querySupportedValues(fields, mayBlock);
+ }
+
+private:
+ C2String mName;
+ const c2_node_id_t mId;
+ const std::shared_ptr<T> mImpl;
+};
+
+/**
+ * Utility classes for common interfaces.
+ */
+template<>
+class SimpleC2Interface<void> {
+public:
+ /**
+ * Base Codec 2.0 parameters required for all components.
+ */
+ struct BaseParams : C2InterfaceHelper {
+ explicit BaseParams(
+ const std::shared_ptr<C2ReflectorHelper> &helper,
+ C2String name,
+ C2Component::kind_t kind,
+ C2Component::domain_t domain,
+ C2String mediaType,
+ std::vector<C2String> aliases = std::vector<C2String>());
+
+ /// Marks that this component has no input latency. Otherwise, component must
+ /// add support for C2PortRequestedDelayTuning::input and C2PortActualDelayTuning::input.
+ void noInputLatency();
+
+ /// Marks that this component has no output latency. Otherwise, component must
+ /// add support for C2PortRequestedDelayTuning::output and C2PortActualDelayTuning::output.
+ void noOutputLatency();
+
+ /// Marks that this component has no pipeline latency. Otherwise, component must
+ /// add support for C2RequestedPipelineDelayTuning and C2ActualPipelineDelayTuning.
+ void noPipelineLatency();
+
+ /// Marks that this component has no need for private buffers. Otherwise, component must
+ /// add support for C2MaxPrivateBufferCountTuning, C2PrivateAllocatorsTuning and
+ /// C2PrivateBlockPoolsTuning.
+ void noPrivateBuffers();
+
+ /// Marks that this component holds no references to input buffers. Otherwise, component
+ /// must add support for C2StreamMaxReferenceAgeTuning::input and
+ /// C2StreamMaxReferenceCountTuning::input.
+ void noInputReferences();
+
+ /// Marks that this component holds no references to output buffers. Otherwise, component
+ /// must add support for C2StreamMaxReferenceAgeTuning::output and
+ /// C2StreamMaxReferenceCountTuning::output.
+ void noOutputReferences();
+
+ /// Marks that this component does not stretch time. Otherwise, component
+ /// must add support for C2ComponentTimeStretchTuning.
+ void noTimeStretch();
+
+ std::shared_ptr<C2ApiLevelSetting> mApiLevel;
+ std::shared_ptr<C2ApiFeaturesSetting> mApiFeatures;
+
+ std::shared_ptr<C2PlatformLevelSetting> mPlatformLevel;
+ std::shared_ptr<C2PlatformFeaturesSetting> mPlatformFeatures;
+
+ std::shared_ptr<C2ComponentNameSetting> mName;
+ std::shared_ptr<C2ComponentAliasesSetting> mAliases;
+ std::shared_ptr<C2ComponentKindSetting> mKind;
+ std::shared_ptr<C2ComponentDomainSetting> mDomain;
+ std::shared_ptr<C2ComponentAttributesSetting> mAttrib;
+ std::shared_ptr<C2ComponentTimeStretchTuning> mTimeStretch;
+
+ std::shared_ptr<C2PortMediaTypeSetting::input> mInputMediaType;
+ std::shared_ptr<C2PortMediaTypeSetting::output> mOutputMediaType;
+ std::shared_ptr<C2StreamBufferTypeSetting::input> mInputFormat;
+ std::shared_ptr<C2StreamBufferTypeSetting::output> mOutputFormat;
+
+ std::shared_ptr<C2PortRequestedDelayTuning::input> mRequestedInputDelay;
+ std::shared_ptr<C2PortRequestedDelayTuning::output> mRequestedOutputDelay;
+ std::shared_ptr<C2RequestedPipelineDelayTuning> mRequestedPipelineDelay;
+
+ std::shared_ptr<C2PortActualDelayTuning::input> mActualInputDelay;
+ std::shared_ptr<C2PortActualDelayTuning::output> mActualOutputDelay;
+ std::shared_ptr<C2ActualPipelineDelayTuning> mActualPipelineDelay;
+
+ std::shared_ptr<C2StreamMaxReferenceAgeTuning::input> mMaxInputReferenceAge;
+ std::shared_ptr<C2StreamMaxReferenceCountTuning::input> mMaxInputReferenceCount;
+ std::shared_ptr<C2StreamMaxReferenceAgeTuning::output> mMaxOutputReferenceAge;
+ std::shared_ptr<C2StreamMaxReferenceCountTuning::output> mMaxOutputReferenceCount;
+ std::shared_ptr<C2MaxPrivateBufferCountTuning> mMaxPrivateBufferCount;
+
+ std::shared_ptr<C2PortStreamCountTuning::input> mInputStreamCount;
+ std::shared_ptr<C2PortStreamCountTuning::output> mOutputStreamCount;
+
+ std::shared_ptr<C2SubscribedParamIndicesTuning> mSubscribedParamIndices;
+ std::shared_ptr<C2PortSuggestedBufferCountTuning::input> mSuggestedInputBufferCount;
+ std::shared_ptr<C2PortSuggestedBufferCountTuning::output> mSuggestedOutputBufferCount;
+
+ std::shared_ptr<C2CurrentWorkTuning> mCurrentWorkOrdinal;
+ std::shared_ptr<C2LastWorkQueuedTuning::input> mLastInputQueuedWorkOrdinal;
+ std::shared_ptr<C2LastWorkQueuedTuning::output> mLastOutputQueuedWorkOrdinal;
+
+ std::shared_ptr<C2PortAllocatorsTuning::input> mInputAllocators;
+ std::shared_ptr<C2PortAllocatorsTuning::output> mOutputAllocators;
+ std::shared_ptr<C2PrivateAllocatorsTuning> mPrivateAllocators;
+ std::shared_ptr<C2PortBlockPoolsTuning::output> mOutputPoolIds;
+ std::shared_ptr<C2PrivateBlockPoolsTuning> mPrivatePoolIds;
+
+ std::shared_ptr<C2TrippedTuning> mTripped;
+ std::shared_ptr<C2OutOfMemoryTuning> mOutOfMemory;
+
+ std::shared_ptr<C2PortConfigCounterTuning::input> mInputConfigCounter;
+ std::shared_ptr<C2PortConfigCounterTuning::output> mOutputConfigCounter;
+ std::shared_ptr<C2ConfigCounterTuning> mDirectConfigCounter;
+ };
+};
+
+template<typename T>
+using SimpleInterface = SimpleC2Interface<T>;
+
+template<typename T, typename ...Args>
+std::shared_ptr<T> AllocSharedString(const Args(&... args), const char *str) {
+ size_t len = strlen(str) + 1;
+ std::shared_ptr<T> ret = T::AllocShared(len, args...);
+ strcpy(ret->m.value, str);
+ return ret;
+}
+
+template<typename T, typename ...Args>
+std::shared_ptr<T> AllocSharedString(const Args(&... args), const std::string &str) {
+ std::shared_ptr<T> ret = T::AllocShared(str.length() + 1, args...);
+ strcpy(ret->m.value, str.c_str());
+ return ret;
+}
+
+template <typename T>
+struct Setter {
+ typedef typename std::remove_reference<T>::type type;
+
+ static C2R NonStrictValueWithNoDeps(
+ bool mayBlock, C2InterfaceHelper::C2P<type> &me) {
+ (void)mayBlock;
+ return me.F(me.v.value).validatePossible(me.v.value);
+ }
+
+ static C2R NonStrictValuesWithNoDeps(
+ bool mayBlock, C2InterfaceHelper::C2P<type> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ for (size_t ix = 0; ix < me.v.flexCount(); ++ix) {
+ res.plus(me.F(me.v.m.values[ix]).validatePossible(me.v.m.values[ix]));
+ }
+ return res;
+ }
+
+ static C2R StrictValueWithNoDeps(
+ bool mayBlock,
+ const C2InterfaceHelper::C2P<type> &old,
+ C2InterfaceHelper::C2P<type> &me) {
+ (void)mayBlock;
+ if (!me.F(me.v.value).supportsNow(me.v.value)) {
+ me.set().value = old.v.value;
+ }
+ return me.F(me.v.value).validatePossible(me.v.value);
+ }
+};
+
+} // namespace android
+
+#endif // ANDROID_SIMPLE_C2_INTERFACE_H_
diff --git a/media/codec2/components/cmds/Android.bp b/media/codec2/components/cmds/Android.bp
new file mode 100644
index 0000000..994dfee
--- /dev/null
+++ b/media/codec2/components/cmds/Android.bp
@@ -0,0 +1,40 @@
+cc_binary {
+ name: "codec2play",
+ defaults: ["libcodec2-impl-defaults"],
+
+ srcs: [
+ "codec2.cpp",
+ ],
+
+ include_dirs: [
+ ],
+
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libcutils",
+ "libgui",
+ "liblog",
+ "libmediaextractor",
+ "libstagefright",
+ "libstagefright_foundation",
+ "libui",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+
+ sanitize: {
+ cfi: true,
+ misc_undefined: [
+ "unsigned-integer-overflow",
+ "signed-integer-overflow",
+ ],
+ diag: {
+ cfi: true,
+ },
+ },
+}
diff --git a/media/codec2/components/cmds/codec2.cpp b/media/codec2/components/cmds/codec2.cpp
new file mode 100644
index 0000000..f2cf545
--- /dev/null
+++ b/media/codec2/components/cmds/codec2.cpp
@@ -0,0 +1,483 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <inttypes.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <thread>
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "codec2"
+#include <log/log.h>
+
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+#include <media/DataSource.h>
+#include <media/ICrypto.h>
+#include <media/IMediaHTTPService.h>
+#include <media/MediaSource.h>
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/foundation/AUtils.h>
+#include <media/stagefright/DataSourceFactory.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MediaErrors.h>
+#include <media/stagefright/MediaExtractorFactory.h>
+#include <media/stagefright/MetaData.h>
+#include <media/stagefright/Utils.h>
+
+#include <gui/GLConsumer.h>
+#include <gui/IProducerListener.h>
+#include <gui/Surface.h>
+#include <gui/SurfaceComposerClient.h>
+
+#include <C2AllocatorGralloc.h>
+#include <C2Buffer.h>
+#include <C2BufferPriv.h>
+#include <C2Component.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <C2Work.h>
+
+using namespace android;
+using namespace std::chrono_literals;
+
+namespace {
+
+class LinearBuffer : public C2Buffer {
+public:
+ explicit LinearBuffer(const std::shared_ptr<C2LinearBlock> &block)
+ : C2Buffer({ block->share(block->offset(), block->size(), ::C2Fence()) }) {}
+};
+
+class Listener;
+
+class SimplePlayer {
+public:
+ SimplePlayer();
+ ~SimplePlayer();
+
+ void onWorkDone(std::weak_ptr<C2Component> component,
+ std::list<std::unique_ptr<C2Work>> workItems);
+ void onTripped(std::weak_ptr<C2Component> component,
+ std::vector<std::shared_ptr<C2SettingResult>> settingResult);
+ void onError(std::weak_ptr<C2Component> component, uint32_t errorCode);
+
+ void play(const sp<IMediaSource> &source);
+
+private:
+ typedef std::unique_lock<std::mutex> ULock;
+
+ std::shared_ptr<Listener> mListener;
+ std::shared_ptr<C2Component> mComponent;
+
+ sp<IProducerListener> mProducerListener;
+
+ std::atomic_int mLinearPoolId;
+
+ std::shared_ptr<C2Allocator> mAllocIon;
+ std::shared_ptr<C2BlockPool> mLinearPool;
+
+ std::mutex mQueueLock;
+ std::condition_variable mQueueCondition;
+ std::list<std::unique_ptr<C2Work>> mWorkQueue;
+
+ std::mutex mProcessedLock;
+ std::condition_variable mProcessedCondition;
+ std::list<std::unique_ptr<C2Work>> mProcessedWork;
+
+ sp<Surface> mSurface;
+ sp<SurfaceComposerClient> mComposerClient;
+ sp<SurfaceControl> mControl;
+};
+
+class Listener : public C2Component::Listener {
+public:
+ explicit Listener(SimplePlayer *thiz) : mThis(thiz) {}
+ virtual ~Listener() = default;
+
+ virtual void onWorkDone_nb(std::weak_ptr<C2Component> component,
+ std::list<std::unique_ptr<C2Work>> workItems) override {
+ mThis->onWorkDone(component, std::move(workItems));
+ }
+
+ virtual void onTripped_nb(std::weak_ptr<C2Component> component,
+ std::vector<std::shared_ptr<C2SettingResult>> settingResult) override {
+ mThis->onTripped(component, settingResult);
+ }
+
+ virtual void onError_nb(std::weak_ptr<C2Component> component,
+ uint32_t errorCode) override {
+ mThis->onError(component, errorCode);
+ }
+
+private:
+ SimplePlayer * const mThis;
+};
+
+
+SimplePlayer::SimplePlayer()
+ : mListener(new Listener(this)),
+ mProducerListener(new DummyProducerListener),
+ mLinearPoolId(C2BlockPool::PLATFORM_START),
+ mComposerClient(new SurfaceComposerClient) {
+ CHECK_EQ(mComposerClient->initCheck(), (status_t)OK);
+
+ std::shared_ptr<C2AllocatorStore> store = GetCodec2PlatformAllocatorStore();
+ CHECK_EQ(store->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR, &mAllocIon), C2_OK);
+ mLinearPool = std::make_shared<C2PooledBlockPool>(mAllocIon, mLinearPoolId++);
+
+ mControl = mComposerClient->createSurface(
+ String8("A Surface"),
+ 1280,
+ 800,
+ HAL_PIXEL_FORMAT_YV12);
+ //PIXEL_FORMAT_RGB_565);
+
+ CHECK(mControl != nullptr);
+ CHECK(mControl->isValid());
+
+ SurfaceComposerClient::Transaction{}
+ .setLayer(mControl, INT_MAX)
+ .show(mControl)
+ .apply();
+
+ mSurface = mControl->getSurface();
+ CHECK(mSurface != nullptr);
+ mSurface->connect(NATIVE_WINDOW_API_CPU, mProducerListener);
+}
+
+SimplePlayer::~SimplePlayer() {
+ mComposerClient->dispose();
+}
+
+void SimplePlayer::onWorkDone(
+ std::weak_ptr<C2Component> component, std::list<std::unique_ptr<C2Work>> workItems) {
+ ALOGV("SimplePlayer::onWorkDone");
+ (void) component;
+ ULock l(mProcessedLock);
+ for (auto & item : workItems) {
+ mProcessedWork.push_back(std::move(item));
+ }
+ mProcessedCondition.notify_all();
+}
+
+void SimplePlayer::onTripped(
+ std::weak_ptr<C2Component> component,
+ std::vector<std::shared_ptr<C2SettingResult>> settingResult) {
+ (void) component;
+ (void) settingResult;
+ // TODO
+}
+
+void SimplePlayer::onError(std::weak_ptr<C2Component> component, uint32_t errorCode) {
+ (void) component;
+ (void) errorCode;
+ // TODO
+}
+
+void SimplePlayer::play(const sp<IMediaSource> &source) {
+ ALOGV("SimplePlayer::play");
+ sp<AMessage> format;
+ (void) convertMetaDataToMessage(source->getFormat(), &format);
+
+ sp<ABuffer> csd0, csd1;
+ format->findBuffer("csd-0", &csd0);
+ format->findBuffer("csd-1", &csd1);
+
+ status_t err = source->start();
+
+ if (err != OK) {
+ fprintf(stderr, "source returned error %d (0x%08x)\n", err, err);
+ return;
+ }
+
+ std::shared_ptr<C2ComponentStore> store = GetCodec2PlatformComponentStore();
+ std::shared_ptr<C2Component> component;
+ (void)store->createComponent("c2.android.avc.decoder", &component);
+
+ (void)component->setListener_vb(mListener, C2_DONT_BLOCK);
+ std::unique_ptr<C2PortBlockPoolsTuning::output> pools =
+ C2PortBlockPoolsTuning::output::AllocUnique({ (uint64_t)C2BlockPool::BASIC_GRAPHIC });
+ std::vector<std::unique_ptr<C2SettingResult>> result;
+ (void)component->intf()->config_vb({pools.get()}, C2_DONT_BLOCK, &result);
+ component->start();
+
+ for (int i = 0; i < 8; ++i) {
+ mWorkQueue.emplace_back(new C2Work);
+ }
+
+ std::atomic_bool running(true);
+ std::thread surfaceThread([this, &running]() {
+ const sp<IGraphicBufferProducer> &igbp = mSurface->getIGraphicBufferProducer();
+ while (running) {
+ std::unique_ptr<C2Work> work;
+ {
+ ULock l(mProcessedLock);
+ if (mProcessedWork.empty()) {
+ mProcessedCondition.wait_for(l, 100ms);
+ if (mProcessedWork.empty()) {
+ continue;
+ }
+ }
+ work.swap(mProcessedWork.front());
+ mProcessedWork.pop_front();
+ }
+ int slot;
+ sp<Fence> fence;
+ ALOGV("Render: Frame #%lld", work->worklets.front()->output.ordinal.frameIndex.peekll());
+ const std::shared_ptr<C2Buffer> &output = work->worklets.front()->output.buffers[0];
+ if (output) {
+ const C2ConstGraphicBlock block = output->data().graphicBlocks().front();
+ native_handle_t *grallocHandle = UnwrapNativeCodec2GrallocHandle(block.handle());
+ sp<GraphicBuffer> buffer(new GraphicBuffer(
+ grallocHandle,
+ GraphicBuffer::CLONE_HANDLE,
+ block.width(),
+ block.height(),
+ HAL_PIXEL_FORMAT_YV12,
+ 1,
+ (uint64_t)GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
+ block.width()));
+ native_handle_delete(grallocHandle);
+
+ status_t err = igbp->attachBuffer(&slot, buffer);
+
+ IGraphicBufferProducer::QueueBufferInput qbi(
+ (work->worklets.front()->output.ordinal.timestamp * 1000ll).peekll(),
+ false,
+ HAL_DATASPACE_UNKNOWN,
+ Rect(block.width(), block.height()),
+ NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW,
+ 0,
+ Fence::NO_FENCE,
+ 0);
+ IGraphicBufferProducer::QueueBufferOutput qbo;
+ err = igbp->queueBuffer(slot, qbi, &qbo);
+ }
+
+ work->input.buffers.clear();
+ work->worklets.clear();
+
+ ULock l(mQueueLock);
+ mWorkQueue.push_back(std::move(work));
+ mQueueCondition.notify_all();
+ }
+ ALOGV("render loop finished");
+ });
+
+ long numFrames = 0;
+ mLinearPool.reset(new C2PooledBlockPool(mAllocIon, mLinearPoolId++));
+
+ for (;;) {
+ size_t size = 0u;
+ void *data = nullptr;
+ int64_t timestamp = 0u;
+ MediaBufferBase *buffer = nullptr;
+ sp<ABuffer> csd;
+ if (csd0 != nullptr) {
+ csd = csd0;
+ csd0 = nullptr;
+ } else if (csd1 != nullptr) {
+ csd = csd1;
+ csd1 = nullptr;
+ } else {
+ status_t err = source->read(&buffer);
+ if (err != OK) {
+ CHECK(buffer == nullptr);
+
+ if (err == INFO_FORMAT_CHANGED) {
+ continue;
+ }
+
+ break;
+ }
+ MetaDataBase &meta = buffer->meta_data();
+ CHECK(meta.findInt64(kKeyTime, ×tamp));
+
+ size = buffer->size();
+ data = buffer->data();
+ }
+
+ if (csd != nullptr) {
+ size = csd->size();
+ data = csd->data();
+ }
+
+ // Prepare C2Work
+
+ std::unique_ptr<C2Work> work;
+ while (!work) {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ mQueueCondition.wait_for(l, 100ms);
+ }
+ }
+ work->input.flags = (C2FrameData::flags_t)0;
+ work->input.ordinal.timestamp = timestamp;
+ work->input.ordinal.frameIndex = numFrames;
+
+ std::shared_ptr<C2LinearBlock> block;
+ mLinearPool->fetchLinearBlock(
+ size,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &block);
+ C2WriteView view = block->map().get();
+ if (view.error() != C2_OK) {
+ fprintf(stderr, "C2LinearBlock::map() failed : %d", view.error());
+ break;
+ }
+ memcpy(view.base(), data, size);
+
+ work->input.buffers.clear();
+ work->input.buffers.emplace_back(new LinearBuffer(block));
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+
+ ALOGV("Frame #%ld size = %zu", numFrames, size);
+ // DO THE DECODING
+ component->queue_nb(&items);
+
+ if (buffer) {
+ buffer->release();
+ buffer = nullptr;
+ }
+
+ ++numFrames;
+ }
+ ALOGV("main loop finished");
+ source->stop();
+ running.store(false);
+ surfaceThread.join();
+
+ component->release();
+ printf("\n");
+}
+
+} // namespace
+
+static void usage(const char *me) {
+ fprintf(stderr, "usage: %s [options] [input_filename]\n", me);
+ fprintf(stderr, " -h(elp)\n");
+}
+
+int main(int argc, char **argv) {
+ android::ProcessState::self()->startThreadPool();
+
+ int res;
+ while ((res = getopt(argc, argv, "h")) >= 0) {
+ switch (res) {
+ case 'h':
+ default:
+ {
+ usage(argv[0]);
+ exit(1);
+ break;
+ }
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (argc < 1) {
+ fprintf(stderr, "No input file specified\n");
+ return 1;
+ }
+
+ status_t err = OK;
+ SimplePlayer player;
+
+ for (int k = 0; k < argc && err == OK; ++k) {
+ const char *filename = argv[k];
+
+ sp<DataSource> dataSource =
+ DataSourceFactory::CreateFromURI(nullptr /* httpService */, filename);
+
+ if (strncasecmp(filename, "sine:", 5) && dataSource == nullptr) {
+ fprintf(stderr, "Unable to create data source.\n");
+ return 1;
+ }
+
+ Vector<sp<IMediaSource> > mediaSources;
+ sp<IMediaSource> mediaSource;
+
+ sp<IMediaExtractor> extractor = MediaExtractorFactory::Create(dataSource);
+
+ if (extractor == nullptr) {
+ fprintf(stderr, "could not create extractor.\n");
+ return -1;
+ }
+
+ sp<MetaData> meta = extractor->getMetaData();
+
+ if (meta != nullptr) {
+ const char *mime;
+ if (!meta->findCString(kKeyMIMEType, &mime)) {
+ fprintf(stderr, "extractor did not provide MIME type.\n");
+ return -1;
+ }
+ }
+
+ size_t numTracks = extractor->countTracks();
+
+ size_t i;
+ for (i = 0; i < numTracks; ++i) {
+ meta = extractor->getTrackMetaData(i, 0);
+
+ if (meta == nullptr) {
+ break;
+ }
+ const char *mime;
+ meta->findCString(kKeyMIMEType, &mime);
+
+ // TODO: allowing AVC only for the time being
+ if (!strncasecmp(mime, "video/avc", 9)) {
+ break;
+ }
+
+ meta = nullptr;
+ }
+
+ if (meta == nullptr) {
+ fprintf(stderr, "No AVC track found.\n");
+ return -1;
+ }
+
+ mediaSource = extractor->getTrack(i);
+ if (mediaSource == nullptr) {
+ fprintf(stderr, "skip NULL track %zu, total tracks %zu.\n", i, numTracks);
+ return -1;
+ }
+
+ player.play(mediaSource);
+ }
+
+ return 0;
+}
diff --git a/media/codec2/components/flac/Android.bp b/media/codec2/components/flac/Android.bp
new file mode 100644
index 0000000..d485964
--- /dev/null
+++ b/media/codec2/components/flac/Android.bp
@@ -0,0 +1,27 @@
+cc_library_shared {
+ name: "libcodec2_soft_flacdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ header_libs: ["libFLAC-headers"],
+
+ srcs: ["C2SoftFlacDec.cpp"],
+
+ shared_libs: [
+ "libstagefright_flacdec",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_flacenc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftFlacEnc.cpp"],
+
+ static_libs: ["libFLAC"],
+}
diff --git a/media/codec2/components/flac/C2SoftFlacDec.cpp b/media/codec2/components/flac/C2SoftFlacDec.cpp
new file mode 100644
index 0000000..f1e2f51
--- /dev/null
+++ b/media/codec2/components/flac/C2SoftFlacDec.cpp
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftFlacDec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftFlacDec.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.flac.decoder";
+
+class C2SoftFlacDec::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_FLAC))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 44100))
+ .withFields({C2F(mSampleRate, value).inRange(1, 655350)})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 1))
+ .withFields({C2F(mChannelCount, value).inRange(1, 8)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 768000))
+ .withFields({C2F(mBitrate, value).inRange(1, 21000000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 32768))
+ .build());
+ }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftFlacDec::C2SoftFlacDec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mFLACDecoder(nullptr) {
+}
+
+C2SoftFlacDec::~C2SoftFlacDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftFlacDec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_NO_MEMORY;
+}
+
+c2_status_t C2SoftFlacDec::onStop() {
+ if (mFLACDecoder) mFLACDecoder->flush();
+ memset(&mStreamInfo, 0, sizeof(mStreamInfo));
+ mHasStreamInfo = false;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ return C2_OK;
+}
+
+void C2SoftFlacDec::onReset() {
+ mInputBufferCount = 0;
+ (void)onStop();
+}
+
+void C2SoftFlacDec::onRelease() {
+ mInputBufferCount = 0;
+ if (mFLACDecoder) delete mFLACDecoder;
+ mFLACDecoder = nullptr;
+}
+
+c2_status_t C2SoftFlacDec::onFlush_sm() {
+ return onStop();
+}
+
+status_t C2SoftFlacDec::initDecoder() {
+ if (mFLACDecoder) {
+ delete mFLACDecoder;
+ }
+ mFLACDecoder = FLACDecoder::Create();
+ if (!mFLACDecoder) {
+ ALOGE("initDecoder: failed to create FLACDecoder");
+ mSignalledError = true;
+ return NO_MEMORY;
+ }
+
+ memset(&mStreamInfo, 0, sizeof(mStreamInfo));
+ mHasStreamInfo = false;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mInputBufferCount = 0;
+
+ return OK;
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+// (TODO) add multiframe support, in plugin and FLACDecoder.cpp
+void C2SoftFlacDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ C2ReadView rView = mDummyReadView;
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ bool eos = (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0;
+ bool codecConfig = (work->input.flags & C2FrameData::FLAG_CODEC_CONFIG) != 0;
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d", inSize,
+ (int)work->input.ordinal.timestamp.peeku(), (int)work->input.ordinal.frameIndex.peeku());
+
+ if (inSize == 0) {
+ fillEmptyWork(work);
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+
+ if (mInputBufferCount == 0 && !codecConfig) {
+ ALOGV("First frame has to include configuration, forcing config");
+ codecConfig = true;
+ }
+
+ uint8_t *input = const_cast<uint8_t *>(rView.data() + inOffset);
+ if (codecConfig) {
+ status_t decoderErr = mFLACDecoder->parseMetadata(input, inSize);
+ if (decoderErr != OK && decoderErr != WOULD_BLOCK) {
+ ALOGE("process: FLACDecoder parseMetaData returns error %d", decoderErr);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ mInputBufferCount++;
+ fillEmptyWork(work);
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+
+ if (decoderErr == WOULD_BLOCK) {
+ ALOGV("process: parseMetadata is Blocking, Continue %d", decoderErr);
+ } else {
+ mStreamInfo = mFLACDecoder->getStreamInfo();
+ if (mStreamInfo.sample_rate && mStreamInfo.max_blocksize &&
+ mStreamInfo.channels) {
+ mHasStreamInfo = true;
+ C2StreamSampleRateInfo::output sampleRateInfo(
+ 0u, mStreamInfo.sample_rate);
+ C2StreamChannelCountInfo::output channelCountInfo(
+ 0u, mStreamInfo.channels);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err =
+ mIntf->config({&sampleRateInfo, &channelCountInfo},
+ C2_MAY_BLOCK, &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(sampleRateInfo));
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(channelCountInfo));
+ } else {
+ ALOGE("Config Update failed");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ ALOGD("process: decoder configuration : %d Hz, %d channels, %d samples,"
+ " %d block size", mStreamInfo.sample_rate, mStreamInfo.channels,
+ (int)mStreamInfo.total_samples, mStreamInfo.max_blocksize);
+ }
+ return;
+ }
+
+ size_t outSize;
+ if (mHasStreamInfo)
+ outSize = mStreamInfo.max_blocksize * mStreamInfo.channels * sizeof(short);
+ else
+ outSize = kMaxBlockSize * FLACDecoder::kMaxChannels * sizeof(short);
+
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(outSize, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ short *output = reinterpret_cast<short *>(wView.data());
+ status_t decoderErr = mFLACDecoder->decodeOneFrame(
+ input, inSize, output, &outSize);
+ if (decoderErr != OK) {
+ ALOGE("process: FLACDecoder decodeOneFrame returns error %d", decoderErr);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ mInputBufferCount++;
+ ALOGV("out buffer attr. size %zu", outSize);
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(createLinearBuffer(block, 0, outSize));
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+}
+
+c2_status_t C2SoftFlacDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ if (mFLACDecoder) mFLACDecoder->flush();
+
+ return C2_OK;
+}
+
+class C2SoftFlacDecFactory : public C2ComponentFactory {
+public:
+ C2SoftFlacDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftFlacDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftFlacDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftFlacDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftFlacDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftFlacDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftFlacDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/flac/C2SoftFlacDec.h b/media/codec2/components/flac/C2SoftFlacDec.h
new file mode 100644
index 0000000..b491bfd
--- /dev/null
+++ b/media/codec2/components/flac/C2SoftFlacDec.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_FLAC_DEC_H_
+#define ANDROID_C2_SOFT_FLAC_DEC_H_
+
+#include <SimpleC2Component.h>
+
+#include "FLACDecoder.h"
+
+namespace android {
+
+struct C2SoftFlacDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftFlacDec(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftFlacDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ enum {
+ kMaxBlockSize = 4096
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+ FLACDecoder *mFLACDecoder;
+ FLAC__StreamMetadata_StreamInfo mStreamInfo;
+ bool mSignalledError;
+ bool mSignalledOutputEos;
+ bool mHasStreamInfo;
+ size_t mInputBufferCount;
+
+ status_t initDecoder();
+
+ C2_DO_NOT_COPY(C2SoftFlacDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_FLAC_DEC_H_
diff --git a/media/codec2/components/flac/C2SoftFlacEnc.cpp b/media/codec2/components/flac/C2SoftFlacEnc.cpp
new file mode 100644
index 0000000..e4192c7
--- /dev/null
+++ b/media/codec2/components/flac/C2SoftFlacEnc.cpp
@@ -0,0 +1,460 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftFlacEnc"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftFlacEnc.h"
+
+namespace android {
+
+class C2SoftFlacEnc::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+ setDerivedInstance(this);
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatAudio))
+ .build());
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatCompressed))
+ .build());
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_FLAC))
+ .build());
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::input(0u, 44100))
+ .withFields({C2F(mSampleRate, value).inRange(1, 655350)})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::input(0u, 1))
+ .withFields({C2F(mChannelCount, value).inRange(1, 2)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::output(0u, 768000))
+ .withFields({C2F(mBitrate, value).inRange(1, 21000000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 4608))
+ .build());
+ }
+
+ uint32_t getSampleRate() const { return mSampleRate->value; }
+ uint32_t getChannelCount() const { return mChannelCount->value; }
+ uint32_t getBitrate() const { return mBitrate->value; }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::input> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::input> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::output> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+constexpr char COMPONENT_NAME[] = "c2.android.flac.encoder";
+
+C2SoftFlacEnc::C2SoftFlacEnc(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mFlacStreamEncoder(nullptr),
+ mInputBufferPcm32(nullptr) {
+}
+
+C2SoftFlacEnc::~C2SoftFlacEnc() {
+ onRelease();
+}
+
+c2_status_t C2SoftFlacEnc::onInit() {
+ mFlacStreamEncoder = FLAC__stream_encoder_new();
+ if (!mFlacStreamEncoder) return C2_CORRUPTED;
+
+ mInputBufferPcm32 = (FLAC__int32*) malloc(
+ kInBlockSize * kMaxNumChannels * sizeof(FLAC__int32));
+ if (!mInputBufferPcm32) return C2_NO_MEMORY;
+
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mCompressionLevel = FLAC_COMPRESSION_LEVEL_DEFAULT;
+ mIsFirstFrame = true;
+ mAnchorTimeStamp = 0ull;
+ mProcessedSamples = 0u;
+ mEncoderWriteData = false;
+ mEncoderReturnedNbBytes = 0;
+ mHeaderOffset = 0;
+ mWroteHeader = false;
+
+ status_t err = configureEncoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+void C2SoftFlacEnc::onRelease() {
+ if (mFlacStreamEncoder) {
+ FLAC__stream_encoder_delete(mFlacStreamEncoder);
+ mFlacStreamEncoder = nullptr;
+ }
+
+ if (mInputBufferPcm32) {
+ free(mInputBufferPcm32);
+ mInputBufferPcm32 = nullptr;
+ }
+}
+
+void C2SoftFlacEnc::onReset() {
+ mCompressionLevel = FLAC_COMPRESSION_LEVEL_DEFAULT;
+ (void) onStop();
+}
+
+c2_status_t C2SoftFlacEnc::onStop() {
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mIsFirstFrame = true;
+ mAnchorTimeStamp = 0ull;
+ mProcessedSamples = 0u;
+ mEncoderWriteData = false;
+ mEncoderReturnedNbBytes = 0;
+ mHeaderOffset = 0;
+ mWroteHeader = false;
+
+ c2_status_t status = drain(DRAIN_COMPONENT_NO_EOS, nullptr);
+ if (C2_OK != status) return status;
+
+ status_t err = configureEncoder();
+ if (err != OK) mSignalledError = true;
+ return C2_OK;
+}
+
+c2_status_t C2SoftFlacEnc::onFlush_sm() {
+ return onStop();
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+}
+
+void C2SoftFlacEnc::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ C2ReadView rView = mDummyReadView;
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x",
+ inSize, (int)work->input.ordinal.timestamp.peeku(),
+ (int)work->input.ordinal.frameIndex.peeku(), work->input.flags);
+ if (mIsFirstFrame && inSize) {
+ mAnchorTimeStamp = work->input.ordinal.timestamp.peekull();
+ mIsFirstFrame = false;
+ }
+
+ if (!mWroteHeader) {
+ std::unique_ptr<C2StreamCsdInfo::output> csd =
+ C2StreamCsdInfo::output::AllocUnique(mHeaderOffset, 0u);
+ if (!csd) {
+ ALOGE("CSD allocation failed");
+ mSignalledError = true;
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ memcpy(csd->m.value, mHeader, mHeaderOffset);
+ ALOGV("put csd, %d bytes", mHeaderOffset);
+
+ work->worklets.front()->output.configUpdate.push_back(std::move(csd));
+ mWroteHeader = true;
+ }
+
+ uint32_t sampleRate = mIntf->getSampleRate();
+ uint32_t channelCount = mIntf->getChannelCount();
+ uint64_t outTimeStamp = mProcessedSamples * 1000000ll / sampleRate;
+
+ size_t outCapacity = inSize;
+ outCapacity += mBlockSize * channelCount * sizeof(int16_t);
+
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(outCapacity, usage, &mOutputBlock);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = mOutputBlock->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ mEncoderWriteData = true;
+ mEncoderReturnedNbBytes = 0;
+ size_t inPos = 0;
+ while (inPos < inSize) {
+ const uint8_t *inPtr = rView.data() + inOffset;
+ size_t processSize = MIN(kInBlockSize * channelCount * sizeof(int16_t), (inSize - inPos));
+ const unsigned nbInputFrames = processSize / (channelCount * sizeof(int16_t));
+ const unsigned nbInputSamples = processSize / sizeof(int16_t);
+ const int16_t *pcm16 = reinterpret_cast<const int16_t *>(inPtr + inPos);
+ ALOGV("about to encode %zu bytes", processSize);
+
+ for (unsigned i = 0; i < nbInputSamples; i++) {
+ mInputBufferPcm32[i] = (FLAC__int32) pcm16[i];
+ }
+
+ FLAC__bool ok = FLAC__stream_encoder_process_interleaved(
+ mFlacStreamEncoder, mInputBufferPcm32, nbInputFrames);
+ if (!ok) {
+ ALOGE("error encountered during encoding");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ mOutputBlock.reset();
+ return;
+ }
+ inPos += processSize;
+ }
+ if (eos && (C2_OK != drain(DRAIN_COMPONENT_WITH_EOS, pool))) {
+ ALOGE("error encountered during encoding");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ mOutputBlock.reset();
+ return;
+ }
+ fillEmptyWork(work);
+ if (mEncoderReturnedNbBytes != 0) {
+ std::shared_ptr<C2Buffer> buffer = createLinearBuffer(std::move(mOutputBlock), 0, mEncoderReturnedNbBytes);
+ work->worklets.front()->output.buffers.push_back(buffer);
+ work->worklets.front()->output.ordinal.timestamp = mAnchorTimeStamp + outTimeStamp;
+ } else {
+ ALOGV("encoder process_interleaved returned without data to write");
+ }
+ mOutputBlock = nullptr;
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ mEncoderWriteData = false;
+ mEncoderReturnedNbBytes = 0;
+}
+
+FLAC__StreamEncoderWriteStatus C2SoftFlacEnc::onEncodedFlacAvailable(
+ const FLAC__byte buffer[], size_t bytes, unsigned samples,
+ unsigned current_frame) {
+ (void) current_frame;
+ ALOGV("%s (bytes=%zu, samples=%u, curr_frame=%u)", __func__, bytes, samples,
+ current_frame);
+
+ if (samples == 0) {
+ ALOGI("saving %zu bytes of header", bytes);
+ memcpy(mHeader + mHeaderOffset, buffer, bytes);
+ mHeaderOffset += bytes;// will contain header size when finished receiving header
+ return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
+ }
+
+ if ((samples == 0) || !mEncoderWriteData) {
+ // called by the encoder because there's header data to save, but it's not the role
+ // of this component (unless WRITE_FLAC_HEADER_IN_FIRST_BUFFER is defined)
+ ALOGV("ignoring %zu bytes of header data (samples=%d)", bytes, samples);
+ return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
+ }
+
+ // write encoded data
+ C2WriteView wView = mOutputBlock->map().get();
+ uint8_t* outData = wView.data();
+ ALOGV("writing %zu bytes of encoded data on output", bytes);
+ // increment mProcessedSamples to maintain audio synchronization during
+ // play back
+ mProcessedSamples += samples;
+ if (bytes + mEncoderReturnedNbBytes > mOutputBlock->capacity()) {
+ ALOGE("not enough space left to write encoded data, dropping %zu bytes", bytes);
+ // a fatal error would stop the encoding
+ return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
+ }
+ memcpy(outData + mEncoderReturnedNbBytes, buffer, bytes);
+ mEncoderReturnedNbBytes += bytes;
+ return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
+}
+
+
+status_t C2SoftFlacEnc::configureEncoder() {
+ ALOGV("%s numChannel=%d, sampleRate=%d", __func__, mIntf->getChannelCount(), mIntf->getSampleRate());
+
+ if (mSignalledError || !mFlacStreamEncoder) {
+ ALOGE("can't configure encoder: no encoder or invalid state");
+ return UNKNOWN_ERROR;
+ }
+
+ FLAC__bool ok = true;
+ ok = ok && FLAC__stream_encoder_set_channels(mFlacStreamEncoder, mIntf->getChannelCount());
+ ok = ok && FLAC__stream_encoder_set_sample_rate(mFlacStreamEncoder, mIntf->getSampleRate());
+ ok = ok && FLAC__stream_encoder_set_bits_per_sample(mFlacStreamEncoder, 16);
+ ok = ok && FLAC__stream_encoder_set_compression_level(mFlacStreamEncoder, mCompressionLevel);
+ ok = ok && FLAC__stream_encoder_set_verify(mFlacStreamEncoder, false);
+ if (!ok) {
+ ALOGE("unknown error when configuring encoder");
+ return UNKNOWN_ERROR;
+ }
+
+ ok &= FLAC__STREAM_ENCODER_INIT_STATUS_OK ==
+ FLAC__stream_encoder_init_stream(mFlacStreamEncoder,
+ flacEncoderWriteCallback /*write_callback*/,
+ nullptr /*seek_callback*/,
+ nullptr /*tell_callback*/,
+ nullptr /*metadata_callback*/,
+ (void *) this /*client_data*/);
+
+ if (!ok) {
+ ALOGE("unknown error when configuring encoder");
+ return UNKNOWN_ERROR;
+ }
+
+ mBlockSize = FLAC__stream_encoder_get_blocksize(mFlacStreamEncoder);
+
+ ALOGV("encoder successfully configured");
+ return OK;
+}
+
+FLAC__StreamEncoderWriteStatus C2SoftFlacEnc::flacEncoderWriteCallback(
+ const FLAC__StreamEncoder *,
+ const FLAC__byte buffer[],
+ size_t bytes,
+ unsigned samples,
+ unsigned current_frame,
+ void *client_data) {
+ return ((C2SoftFlacEnc*) client_data)->onEncodedFlacAvailable(
+ buffer, bytes, samples, current_frame);
+}
+
+c2_status_t C2SoftFlacEnc::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ switch (drainMode) {
+ case NO_DRAIN:
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ case DRAIN_CHAIN:
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ case DRAIN_COMPONENT_WITH_EOS:
+ // TODO: This flag is not being sent back to the client
+ // because there are no items in PendingWork queue as all the
+ // inputs are being sent back with emptywork or valid encoded data
+ // mSignalledOutputEos = true;
+ case DRAIN_COMPONENT_NO_EOS:
+ break;
+ default:
+ return C2_BAD_VALUE;
+ }
+ FLAC__bool ok = FLAC__stream_encoder_finish(mFlacStreamEncoder);
+ if (!ok) return C2_CORRUPTED;
+ mIsFirstFrame = true;
+ mAnchorTimeStamp = 0ull;
+ mProcessedSamples = 0u;
+
+ return C2_OK;
+}
+
+class C2SoftFlacEncFactory : public C2ComponentFactory {
+public:
+ C2SoftFlacEncFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftFlacEnc(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftFlacEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftFlacEnc::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftFlacEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftFlacEncFactory() override = default;
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftFlacEncFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/flac/C2SoftFlacEnc.h b/media/codec2/components/flac/C2SoftFlacEnc.h
new file mode 100644
index 0000000..cdf305e
--- /dev/null
+++ b/media/codec2/components/flac/C2SoftFlacEnc.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_FLAC_ENC_H_
+#define ANDROID_C2_SOFT_FLAC_ENC_H_
+
+#include <SimpleC2Component.h>
+
+#include "FLAC/stream_encoder.h"
+
+#define FLAC_COMPRESSION_LEVEL_MIN 0
+#define FLAC_COMPRESSION_LEVEL_DEFAULT 5
+#define FLAC_COMPRESSION_LEVEL_MAX 8
+
+#define FLAC_HEADER_SIZE 128
+
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+
+namespace android {
+
+class C2SoftFlacEnc : public SimpleC2Component {
+public:
+ class IntfImpl;
+
+ C2SoftFlacEnc(const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftFlacEnc();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ status_t configureEncoder();
+ static FLAC__StreamEncoderWriteStatus flacEncoderWriteCallback(
+ const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[],
+ size_t bytes, unsigned samples, unsigned current_frame,
+ void *client_data);
+ FLAC__StreamEncoderWriteStatus onEncodedFlacAvailable(
+ const FLAC__byte buffer[], size_t bytes, unsigned samples,
+ unsigned current_frame);
+
+ std::shared_ptr<IntfImpl> mIntf;
+ const unsigned int kInBlockSize = 1152;
+ const unsigned int kMaxNumChannels = 2;
+ FLAC__StreamEncoder* mFlacStreamEncoder;
+ FLAC__int32* mInputBufferPcm32;
+ std::shared_ptr<C2LinearBlock> mOutputBlock;
+ bool mSignalledError;
+ bool mSignalledOutputEos;
+ uint32_t mCompressionLevel;
+ uint32_t mBlockSize;
+ bool mIsFirstFrame;
+ uint64_t mAnchorTimeStamp;
+ uint64_t mProcessedSamples;
+ // should the data received by the callback be written to the output port
+ bool mEncoderWriteData;
+ size_t mEncoderReturnedNbBytes;
+ unsigned mHeaderOffset;
+ bool mWroteHeader;
+ char mHeader[FLAC_HEADER_SIZE];
+
+ C2_DO_NOT_COPY(C2SoftFlacEnc);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_FLAC_ENC_H_
diff --git a/media/codec2/components/flac/MODULE_LICENSE_APACHE2 b/media/codec2/components/flac/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/flac/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/flac/NOTICE b/media/codec2/components/flac/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/flac/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/g711/Android.bp b/media/codec2/components/g711/Android.bp
new file mode 100644
index 0000000..3ede68c
--- /dev/null
+++ b/media/codec2/components/g711/Android.bp
@@ -0,0 +1,23 @@
+cc_library_shared {
+ name: "libcodec2_soft_g711alawdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftG711Dec.cpp"],
+
+ cflags: [
+ "-DALAW",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_g711mlawdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftG711Dec.cpp"],
+}
diff --git a/media/codec2/components/g711/C2SoftG711Dec.cpp b/media/codec2/components/g711/C2SoftG711Dec.cpp
new file mode 100644
index 0000000..1c71d45
--- /dev/null
+++ b/media/codec2/components/g711/C2SoftG711Dec.cpp
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftG711Dec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftG711Dec.h"
+
+namespace android {
+
+#ifdef ALAW
+constexpr char COMPONENT_NAME[] = "c2.android.g711.alaw.decoder";
+#else
+constexpr char COMPONENT_NAME[] = "c2.android.g711.mlaw.decoder";
+#endif
+
+class C2SoftG711Dec::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+#ifdef ALAW
+ MEDIA_MIMETYPE_AUDIO_G711_ALAW
+#else
+ MEDIA_MIMETYPE_AUDIO_G711_MLAW
+#endif
+ )).build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 8000))
+ .withFields({C2F(mSampleRate, value).inRange(8000, 48000)})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 1))
+ .withFields({C2F(mChannelCount, value).equalTo(1)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 64000))
+ .withFields({C2F(mBitrate, value).equalTo(64000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192))
+ .build());
+ }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftG711Dec::C2SoftG711Dec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl) {
+}
+
+C2SoftG711Dec::~C2SoftG711Dec() {
+ onRelease();
+}
+
+c2_status_t C2SoftG711Dec::onInit() {
+ mSignalledOutputEos = false;
+ return C2_OK;
+}
+
+c2_status_t C2SoftG711Dec::onStop() {
+ mSignalledOutputEos = false;
+ return C2_OK;
+}
+
+void C2SoftG711Dec::onReset() {
+ (void)onStop();
+}
+
+void C2SoftG711Dec::onRelease() {
+}
+
+c2_status_t C2SoftG711Dec::onFlush_sm() {
+ return onStop();
+}
+
+void C2SoftG711Dec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ C2ReadView rView = mDummyReadView;
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ bool eos = (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0;
+ int outSize = inSize * sizeof(int16_t);
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d", inSize,
+ (int)work->input.ordinal.timestamp.peeku(), (int)work->input.ordinal.frameIndex.peeku());
+
+ if (inSize == 0) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+
+ uint8_t *inputptr = const_cast<uint8_t *>(rView.data() + inOffset);
+
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(outSize, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ int16_t *outputptr = reinterpret_cast<int16_t *>(wView.data());
+
+#ifdef ALAW
+ DecodeALaw(outputptr, inputptr, inSize);
+#else
+ DecodeMLaw(outputptr, inputptr, inSize);
+#endif
+
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(createLinearBuffer(block));
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+}
+
+c2_status_t C2SoftG711Dec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+#ifdef ALAW
+void C2SoftG711Dec::DecodeALaw(
+ int16_t *out, const uint8_t *in, size_t inSize) {
+ while (inSize > 0) {
+ inSize--;
+ int32_t x = *in++;
+
+ int32_t ix = x ^ 0x55;
+ ix &= 0x7f;
+
+ int32_t iexp = ix >> 4;
+ int32_t mant = ix & 0x0f;
+
+ if (iexp > 0) {
+ mant += 16;
+ }
+
+ mant = (mant << 4) + 8;
+
+ if (iexp > 1) {
+ mant = mant << (iexp - 1);
+ }
+
+ *out++ = (x > 127) ? mant : -mant;
+ }
+}
+#else
+void C2SoftG711Dec::DecodeMLaw(
+ int16_t *out, const uint8_t *in, size_t inSize) {
+ while (inSize > 0) {
+ inSize--;
+ int32_t x = *in++;
+
+ int32_t mantissa = ~x;
+ int32_t exponent = (mantissa >> 4) & 7;
+ int32_t segment = exponent + 1;
+ mantissa &= 0x0f;
+
+ int32_t step = 4 << segment;
+
+ int32_t abs = (0x80l << exponent) + step * mantissa + step / 2 - 4 * 33;
+
+ *out++ = (x < 0x80) ? -abs : abs;
+ }
+}
+#endif
+
+class C2SoftG711DecFactory : public C2ComponentFactory {
+public:
+ C2SoftG711DecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftG711Dec(COMPONENT_NAME, id,
+ std::make_shared<C2SoftG711Dec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id, std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftG711Dec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftG711Dec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftG711DecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftG711DecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/g711/C2SoftG711Dec.h b/media/codec2/components/g711/C2SoftG711Dec.h
new file mode 100644
index 0000000..23e8ffc
--- /dev/null
+++ b/media/codec2/components/g711/C2SoftG711Dec.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_G711_DEC_H_
+#define ANDROID_C2_SOFT_G711_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+namespace android {
+
+struct C2SoftG711Dec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftG711Dec(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftG711Dec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+private:
+ std::shared_ptr<IntfImpl> mIntf;
+ bool mSignalledOutputEos;
+
+#ifdef ALAW
+ void DecodeALaw(int16_t *out, const uint8_t *in, size_t inSize);
+#else
+ void DecodeMLaw(int16_t *out, const uint8_t *in, size_t inSize);
+#endif
+
+ C2_DO_NOT_COPY(C2SoftG711Dec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_G711_DEC_H_
diff --git a/media/codec2/components/g711/MODULE_LICENSE_APACHE2 b/media/codec2/components/g711/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/g711/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/g711/NOTICE b/media/codec2/components/g711/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/g711/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/gsm/Android.bp b/media/codec2/components/gsm/Android.bp
new file mode 100644
index 0000000..9330c01
--- /dev/null
+++ b/media/codec2/components/gsm/Android.bp
@@ -0,0 +1,11 @@
+cc_library_shared {
+ name: "libcodec2_soft_gsmdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftGsmDec.cpp"],
+
+ static_libs: ["libgsm"],
+}
diff --git a/media/codec2/components/gsm/C2SoftGsmDec.cpp b/media/codec2/components/gsm/C2SoftGsmDec.cpp
new file mode 100644
index 0000000..7101c79
--- /dev/null
+++ b/media/codec2/components/gsm/C2SoftGsmDec.cpp
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftGsmDec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftGsmDec.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.gsm.decoder";
+
+class C2SoftGsmDec::IntfImpl : public C2InterfaceHelper {
+ public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper>& helper)
+ : C2InterfaceHelper(helper) {
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_MSGSM))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 8000))
+ .withFields({C2F(mSampleRate, value).equalTo(8000)})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 1))
+ .withFields({C2F(mChannelCount, value).equalTo(1)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 13200))
+ .withFields({C2F(mBitrate, value).equalTo(13200)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 1024 / MSGSM_IN_FRM_SZ * MSGSM_IN_FRM_SZ))
+ .build());
+ }
+
+ private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftGsmDec::C2SoftGsmDec(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl)
+ : SimpleC2Component(
+ std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mGsm(nullptr) {
+}
+
+C2SoftGsmDec::~C2SoftGsmDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftGsmDec::onInit() {
+ if (!mGsm) mGsm = gsm_create();
+ if (!mGsm) return C2_NO_MEMORY;
+ int msopt = 1;
+ (void)gsm_option(mGsm, GSM_OPT_WAV49, &msopt);
+ mSignalledError = false;
+ mSignalledEos = false;
+ return C2_OK;
+}
+
+c2_status_t C2SoftGsmDec::onStop() {
+ if (mGsm) {
+ gsm_destroy(mGsm);
+ mGsm = nullptr;
+ }
+ if (!mGsm) mGsm = gsm_create();
+ if (!mGsm) return C2_NO_MEMORY;
+ int msopt = 1;
+ (void)gsm_option(mGsm, GSM_OPT_WAV49, &msopt);
+ mSignalledError = false;
+ mSignalledEos = false;
+ return C2_OK;
+}
+
+void C2SoftGsmDec::onReset() {
+ (void)onStop();
+}
+
+void C2SoftGsmDec::onRelease() {
+ if (mGsm) {
+ gsm_destroy(mGsm);
+ mGsm = nullptr;
+ }
+}
+
+c2_status_t C2SoftGsmDec::onFlush_sm() {
+ return onStop();
+}
+
+static size_t decodeGSM(gsm handle, int16_t *out, size_t outCapacity,
+ uint8_t *in, size_t inSize) {
+ size_t outSize = 0;
+
+ if (inSize % MSGSM_IN_FRM_SZ == 0
+ && (inSize / MSGSM_IN_FRM_SZ * MSGSM_OUT_FRM_SZ * sizeof(*out)
+ <= outCapacity)) {
+ while (inSize > 0) {
+ gsm_decode(handle, in, out);
+ in += FRGSM_IN_FRM_SZ;
+ inSize -= FRGSM_IN_FRM_SZ;
+ out += FRGSM_OUT_FRM_SZ;
+ outSize += FRGSM_OUT_FRM_SZ;
+
+ gsm_decode(handle, in, out);
+ in += FRGSM_IN_FRM_SZ_MINUS_1;
+ inSize -= FRGSM_IN_FRM_SZ_MINUS_1;
+ out += FRGSM_OUT_FRM_SZ;
+ outSize += FRGSM_OUT_FRM_SZ;
+ }
+ }
+
+ return outSize * sizeof(int16_t);
+}
+
+void C2SoftGsmDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ C2ReadView rView = mDummyReadView;
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = rView.error();
+ return;
+ }
+ }
+
+ if (inSize == 0) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ if (eos) {
+ mSignalledEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d", inSize,
+ (int)work->input.ordinal.timestamp.peeku(), (int)work->input.ordinal.frameIndex.peeku());
+
+ size_t outCapacity = (inSize / MSGSM_IN_FRM_SZ ) * MSGSM_OUT_FRM_SZ * sizeof(int16_t);
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(outCapacity, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+
+ int16_t *output = reinterpret_cast<int16_t *>(wView.data());
+ uint8_t *input = const_cast<uint8_t *>(rView.data() + inOffset);
+ size_t outSize = decodeGSM(mGsm, output, outCapacity, input, inSize);
+ if (!outSize) {
+ ALOGE("encountered improper insize or outsize");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ ALOGV("out buffer attr. size %zu", outSize);
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(createLinearBuffer(block, 0, outSize));
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ if (eos) {
+ mSignalledEos = true;
+ ALOGV("signalled EOS");
+ }
+}
+
+c2_status_t C2SoftGsmDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+class C2SoftGSMDecFactory : public C2ComponentFactory {
+public:
+ C2SoftGSMDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftGsmDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftGsmDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftGsmDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftGsmDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftGSMDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftGSMDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/gsm/C2SoftGsmDec.h b/media/codec2/components/gsm/C2SoftGsmDec.h
new file mode 100644
index 0000000..2b209fe
--- /dev/null
+++ b/media/codec2/components/gsm/C2SoftGsmDec.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_GSM_DEC_H_
+#define ANDROID_C2_SOFT_GSM_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+extern "C" {
+ #include "gsm.h"
+}
+
+namespace android {
+
+#define FRGSM_IN_FRM_SZ 33
+#define FRGSM_IN_FRM_SZ_MINUS_1 32
+#define FRGSM_OUT_FRM_SZ 160
+#define MSGSM_IN_FRM_SZ (FRGSM_IN_FRM_SZ + FRGSM_IN_FRM_SZ_MINUS_1)
+#define MSGSM_OUT_FRM_SZ (FRGSM_OUT_FRM_SZ * 2)
+
+struct C2SoftGsmDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftGsmDec(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftGsmDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ private:
+ std::shared_ptr<IntfImpl> mIntf;
+ gsm mGsm;
+ bool mSignalledError;
+ bool mSignalledEos;
+
+ C2_DO_NOT_COPY(C2SoftGsmDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_GSM_DEC_H_
diff --git a/media/codec2/components/gsm/MODULE_LICENSE_APACHE2 b/media/codec2/components/gsm/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/gsm/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/gsm/NOTICE b/media/codec2/components/gsm/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/gsm/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/hevc/Android.bp b/media/codec2/components/hevc/Android.bp
new file mode 100644
index 0000000..2a045e1
--- /dev/null
+++ b/media/codec2/components/hevc/Android.bp
@@ -0,0 +1,16 @@
+cc_library_shared {
+ name: "libcodec2_soft_hevcdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_signed-defaults",
+ ],
+
+ srcs: ["C2SoftHevcDec.cpp"],
+
+ static_libs: ["libhevcdec"],
+
+ include_dirs: [
+ "external/libhevc/decoder",
+ "external/libhevc/common",
+ ],
+}
diff --git a/media/codec2/components/hevc/C2SoftHevcDec.cpp b/media/codec2/components/hevc/C2SoftHevcDec.cpp
new file mode 100644
index 0000000..99892ce
--- /dev/null
+++ b/media/codec2/components/hevc/C2SoftHevcDec.cpp
@@ -0,0 +1,976 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftHevcDec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <Codec2Mapper.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftHevcDec.h"
+#include "ihevcd_cxa.h"
+
+namespace android {
+
+namespace {
+
+constexpr char COMPONENT_NAME[] = "c2.android.hevc.decoder";
+
+} // namespace
+
+class C2SoftHevcDec::IntfImpl : public SimpleInterface<void>::BaseParams {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : SimpleInterface<void>::BaseParams(
+ helper,
+ COMPONENT_NAME,
+ C2Component::KIND_DECODER,
+ C2Component::DOMAIN_VIDEO,
+ MEDIA_MIMETYPE_VIDEO_HEVC) {
+ noPrivateBuffers(); // TODO: account for our buffers here
+ noInputReferences();
+ noOutputReferences();
+ noInputLatency();
+ noTimeStretch();
+
+ // TODO: output latency and reordering
+
+ addParameter(
+ DefineParam(mAttrib, C2_PARAMKEY_COMPONENT_ATTRIBUTES)
+ .withConstValue(new C2ComponentAttributesSetting(C2Component::ATTRIB_IS_TEMPORAL))
+ .build());
+
+ addParameter(
+ DefineParam(mSize, C2_PARAMKEY_PICTURE_SIZE)
+ .withDefault(new C2StreamPictureSizeInfo::output(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 4096, 2),
+ C2F(mSize, height).inRange(2, 4096, 2),
+ })
+ .withSetter(SizeSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_HEVC_MAIN, C2Config::LEVEL_HEVC_MAIN_5_1))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ C2Config::PROFILE_HEVC_MAIN,
+ C2Config::PROFILE_HEVC_MAIN_STILL}),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_HEVC_MAIN_1,
+ C2Config::LEVEL_HEVC_MAIN_2, C2Config::LEVEL_HEVC_MAIN_2_1,
+ C2Config::LEVEL_HEVC_MAIN_3, C2Config::LEVEL_HEVC_MAIN_3_1,
+ C2Config::LEVEL_HEVC_MAIN_4, C2Config::LEVEL_HEVC_MAIN_4_1,
+ C2Config::LEVEL_HEVC_MAIN_5, C2Config::LEVEL_HEVC_MAIN_5_1,
+ C2Config::LEVEL_HEVC_MAIN_5_2, C2Config::LEVEL_HEVC_HIGH_4,
+ C2Config::LEVEL_HEVC_HIGH_4_1, C2Config::LEVEL_HEVC_HIGH_5,
+ C2Config::LEVEL_HEVC_HIGH_5_1, C2Config::LEVEL_HEVC_HIGH_5_2
+ })
+ })
+ .withSetter(ProfileLevelSetter, mSize)
+ .build());
+
+ addParameter(
+ DefineParam(mMaxSize, C2_PARAMKEY_MAX_PICTURE_SIZE)
+ .withDefault(new C2StreamMaxPictureSizeTuning::output(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 4096, 2),
+ C2F(mSize, height).inRange(2, 4096, 2),
+ })
+ .withSetter(MaxPictureSizeSetter, mSize)
+ .build());
+
+ addParameter(
+ DefineParam(mMaxInputSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, 320 * 240 * 3 / 4))
+ .withFields({
+ C2F(mMaxInputSize, value).any(),
+ })
+ .calculatedAs(MaxInputSizeSetter, mMaxSize)
+ .build());
+
+ C2ChromaOffsetStruct locations[1] = { C2ChromaOffsetStruct::ITU_YUV_420_0() };
+ std::shared_ptr<C2StreamColorInfo::output> defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ 1u, 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ memcpy(defaultColorInfo->m.locations, locations, sizeof(locations));
+
+ defaultColorInfo = C2StreamColorInfo::output::AllocShared(
+ {C2ChromaOffsetStruct::ITU_YUV_420_0()}, 0u, 8u /* bitDepth */,
+ C2Color::YUV_420);
+ helper->addStructDescriptors<C2ChromaOffsetStruct>();
+
+ addParameter(
+ DefineParam(mColorInfo, C2_PARAMKEY_CODED_COLOR_INFO)
+ .withConstValue(defaultColorInfo)
+ .build());
+
+ addParameter(
+ DefineParam(mDefaultColorAspects, C2_PARAMKEY_DEFAULT_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsTuning::output(
+ 0u, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mDefaultColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mDefaultColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mDefaultColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mDefaultColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(DefaultColorAspectsSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mCodedColorAspects, C2_PARAMKEY_VUI_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsInfo::input(
+ 0u, C2Color::RANGE_LIMITED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mCodedColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mCodedColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mCodedColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mCodedColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(CodedColorAspectsSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mColorAspects, C2_PARAMKEY_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsInfo::output(
+ 0u, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(ColorAspectsSetter, mDefaultColorAspects, mCodedColorAspects)
+ .build());
+
+ // TODO: support more formats?
+ addParameter(
+ DefineParam(mPixelFormat, C2_PARAMKEY_PIXEL_FORMAT)
+ .withConstValue(new C2StreamPixelFormatInfo::output(
+ 0u, HAL_PIXEL_FORMAT_YCBCR_420_888))
+ .build());
+ }
+
+ static C2R SizeSetter(bool mayBlock, const C2P<C2StreamPictureSizeInfo::output> &oldMe,
+ C2P<C2VideoSizeStreamInfo::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+ me.set().width = oldMe.v.width;
+ }
+ if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
+ me.set().height = oldMe.v.height;
+ }
+ return res;
+ }
+
+ static C2R MaxPictureSizeSetter(bool mayBlock, C2P<C2StreamMaxPictureSizeTuning::output> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ // TODO: get max width/height from the size's field helpers vs. hardcoding
+ me.set().width = c2_min(c2_max(me.v.width, size.v.width), 4096u);
+ me.set().height = c2_min(c2_max(me.v.height, size.v.height), 4096u);
+ return C2R::Ok();
+ }
+
+ static C2R MaxInputSizeSetter(bool mayBlock, C2P<C2StreamMaxBufferSizeInfo::input> &me,
+ const C2P<C2StreamMaxPictureSizeTuning::output> &maxSize) {
+ (void)mayBlock;
+ // assume compression ratio of 2
+ me.set().value = (((maxSize.v.width + 63) / 64) * ((maxSize.v.height + 63) / 64) * 3072);
+ return C2R::Ok();
+ }
+
+ static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::input> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ (void)size;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+
+ static C2R DefaultColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsTuning::output> &me) {
+ (void)mayBlock;
+ if (me.v.range > C2Color::RANGE_OTHER) {
+ me.set().range = C2Color::RANGE_OTHER;
+ }
+ if (me.v.primaries > C2Color::PRIMARIES_OTHER) {
+ me.set().primaries = C2Color::PRIMARIES_OTHER;
+ }
+ if (me.v.transfer > C2Color::TRANSFER_OTHER) {
+ me.set().transfer = C2Color::TRANSFER_OTHER;
+ }
+ if (me.v.matrix > C2Color::MATRIX_OTHER) {
+ me.set().matrix = C2Color::MATRIX_OTHER;
+ }
+ return C2R::Ok();
+ }
+
+ static C2R CodedColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::input> &me) {
+ (void)mayBlock;
+ if (me.v.range > C2Color::RANGE_OTHER) {
+ me.set().range = C2Color::RANGE_OTHER;
+ }
+ if (me.v.primaries > C2Color::PRIMARIES_OTHER) {
+ me.set().primaries = C2Color::PRIMARIES_OTHER;
+ }
+ if (me.v.transfer > C2Color::TRANSFER_OTHER) {
+ me.set().transfer = C2Color::TRANSFER_OTHER;
+ }
+ if (me.v.matrix > C2Color::MATRIX_OTHER) {
+ me.set().matrix = C2Color::MATRIX_OTHER;
+ }
+ return C2R::Ok();
+ }
+
+ static C2R ColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::output> &me,
+ const C2P<C2StreamColorAspectsTuning::output> &def,
+ const C2P<C2StreamColorAspectsInfo::input> &coded) {
+ (void)mayBlock;
+ // take default values for all unspecified fields, and coded values for specified ones
+ me.set().range = coded.v.range == RANGE_UNSPECIFIED ? def.v.range : coded.v.range;
+ me.set().primaries = coded.v.primaries == PRIMARIES_UNSPECIFIED
+ ? def.v.primaries : coded.v.primaries;
+ me.set().transfer = coded.v.transfer == TRANSFER_UNSPECIFIED
+ ? def.v.transfer : coded.v.transfer;
+ me.set().matrix = coded.v.matrix == MATRIX_UNSPECIFIED ? def.v.matrix : coded.v.matrix;
+ return C2R::Ok();
+ }
+
+ std::shared_ptr<C2StreamColorAspectsInfo::output> getColorAspects_l() {
+ return mColorAspects;
+ }
+
+private:
+ std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
+ std::shared_ptr<C2StreamPictureSizeInfo::output> mSize;
+ std::shared_ptr<C2StreamMaxPictureSizeTuning::output> mMaxSize;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mMaxInputSize;
+ std::shared_ptr<C2StreamColorInfo::output> mColorInfo;
+ std::shared_ptr<C2StreamColorAspectsInfo::input> mCodedColorAspects;
+ std::shared_ptr<C2StreamColorAspectsTuning::output> mDefaultColorAspects;
+ std::shared_ptr<C2StreamColorAspectsInfo::output> mColorAspects;
+ std::shared_ptr<C2StreamPixelFormatInfo::output> mPixelFormat;
+};
+
+static size_t getCpuCoreCount() {
+ long cpuCoreCount = 1;
+#if defined(_SC_NPROCESSORS_ONLN)
+ cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
+#else
+ // _SC_NPROC_ONLN must be defined...
+ cpuCoreCount = sysconf(_SC_NPROC_ONLN);
+#endif
+ CHECK(cpuCoreCount >= 1);
+ ALOGV("Number of CPU cores: %ld", cpuCoreCount);
+ return (size_t)cpuCoreCount;
+}
+
+static void *ivd_aligned_malloc(void *ctxt, WORD32 alignment, WORD32 size) {
+ (void) ctxt;
+ return memalign(alignment, size);
+}
+
+static void ivd_aligned_free(void *ctxt, void *mem) {
+ (void) ctxt;
+ free(mem);
+}
+
+C2SoftHevcDec::C2SoftHevcDec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mDecHandle(nullptr),
+ mOutBufferFlush(nullptr),
+ mIvColorformat(IV_YUV_420P),
+ mWidth(320),
+ mHeight(240),
+ mHeaderDecoded(false) {
+}
+
+C2SoftHevcDec::~C2SoftHevcDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftHevcDec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+c2_status_t C2SoftHevcDec::onStop() {
+ if (OK != resetDecoder()) return C2_CORRUPTED;
+ resetPlugin();
+ return C2_OK;
+}
+
+void C2SoftHevcDec::onReset() {
+ (void) onStop();
+}
+
+void C2SoftHevcDec::onRelease() {
+ (void) deleteDecoder();
+ if (mOutBufferFlush) {
+ ivd_aligned_free(nullptr, mOutBufferFlush);
+ mOutBufferFlush = nullptr;
+ }
+ if (mOutBlock) {
+ mOutBlock.reset();
+ }
+}
+
+c2_status_t C2SoftHevcDec::onFlush_sm() {
+ if (OK != setFlushMode()) return C2_CORRUPTED;
+
+ uint32_t displayStride = mStride;
+ uint32_t displayHeight = mHeight;
+ uint32_t bufferSize = displayStride * displayHeight * 3 / 2;
+ mOutBufferFlush = (uint8_t *)ivd_aligned_malloc(nullptr, 128, bufferSize);
+ if (!mOutBufferFlush) {
+ ALOGE("could not allocate tmp output buffer (for flush) of size %u ", bufferSize);
+ return C2_NO_MEMORY;
+ }
+
+ while (true) {
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+
+ setDecodeArgs(&s_decode_ip, &s_decode_op, nullptr, nullptr, 0, 0, 0);
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ if (0 == s_decode_op.u4_output_present) {
+ resetPlugin();
+ break;
+ }
+ }
+
+ if (mOutBufferFlush) {
+ ivd_aligned_free(nullptr, mOutBufferFlush);
+ mOutBufferFlush = nullptr;
+ }
+
+ return C2_OK;
+}
+
+status_t C2SoftHevcDec::createDecoder() {
+ ivdext_create_ip_t s_create_ip;
+ ivdext_create_op_t s_create_op;
+
+ s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ivdext_create_ip_t);
+ s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE;
+ s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = 0;
+ s_create_ip.s_ivd_create_ip_t.e_output_format = mIvColorformat;
+ s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ivd_aligned_malloc;
+ s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ivd_aligned_free;
+ s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = nullptr;
+ s_create_op.s_ivd_create_op_t.u4_size = sizeof(ivdext_create_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_create_ip,
+ &s_create_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__,
+ s_create_op.s_ivd_create_op_t.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+ mDecHandle = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle;
+ mDecHandle->pv_fxns = (void *)ivdec_api_function;
+ mDecHandle->u4_size = sizeof(iv_obj_t);
+
+ return OK;
+}
+
+status_t C2SoftHevcDec::setNumCores() {
+ ivdext_ctl_set_num_cores_ip_t s_set_num_cores_ip;
+ ivdext_ctl_set_num_cores_op_t s_set_num_cores_op;
+
+ s_set_num_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t);
+ s_set_num_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_num_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES;
+ s_set_num_cores_ip.u4_num_cores = mNumCores;
+ s_set_num_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_num_cores_ip,
+ &s_set_num_cores_op);
+ if (IV_SUCCESS != status) {
+ ALOGD("error in %s: 0x%x", __func__, s_set_num_cores_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftHevcDec::setParams(size_t stride, IVD_VIDEO_DECODE_MODE_T dec_mode) {
+ ivd_ctl_set_config_ip_t s_set_dyn_params_ip;
+ ivd_ctl_set_config_op_t s_set_dyn_params_op;
+
+ s_set_dyn_params_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
+ s_set_dyn_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_dyn_params_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
+ s_set_dyn_params_ip.u4_disp_wd = (UWORD32) stride;
+ s_set_dyn_params_ip.e_frm_skip_mode = IVD_SKIP_NONE;
+ s_set_dyn_params_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
+ s_set_dyn_params_ip.e_vid_dec_mode = dec_mode;
+ s_set_dyn_params_op.u4_size = sizeof(ivd_ctl_set_config_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_dyn_params_ip,
+ &s_set_dyn_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__, s_set_dyn_params_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftHevcDec::getVersion() {
+ ivd_ctl_getversioninfo_ip_t s_get_versioninfo_ip;
+ ivd_ctl_getversioninfo_op_t s_get_versioninfo_op;
+ UWORD8 au1_buf[512];
+
+ s_get_versioninfo_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t);
+ s_get_versioninfo_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_get_versioninfo_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION;
+ s_get_versioninfo_ip.pv_version_buffer = au1_buf;
+ s_get_versioninfo_ip.u4_version_buffer_size = sizeof(au1_buf);
+ s_get_versioninfo_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_get_versioninfo_ip,
+ &s_get_versioninfo_op);
+ if (status != IV_SUCCESS) {
+ ALOGD("error in %s: 0x%x", __func__,
+ s_get_versioninfo_op.u4_error_code);
+ } else {
+ ALOGV("ittiam decoder version number: %s",
+ (char *) s_get_versioninfo_ip.pv_version_buffer);
+ }
+
+ return OK;
+}
+
+status_t C2SoftHevcDec::initDecoder() {
+ if (OK != createDecoder()) return UNKNOWN_ERROR;
+ mNumCores = MIN(getCpuCoreCount(), MAX_NUM_CORES);
+ mStride = ALIGN64(mWidth);
+ mSignalledError = false;
+ resetPlugin();
+ (void) setNumCores();
+ if (OK != setParams(mStride, IVD_DECODE_FRAME)) return UNKNOWN_ERROR;
+ (void) getVersion();
+
+ return OK;
+}
+
+bool C2SoftHevcDec::setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
+ ivd_video_decode_op_t *ps_decode_op,
+ C2ReadView *inBuffer,
+ C2GraphicView *outBuffer,
+ size_t inOffset,
+ size_t inSize,
+ uint32_t tsMarker) {
+ uint32_t displayStride = mStride;
+ uint32_t displayHeight = mHeight;
+ size_t lumaSize = displayStride * displayHeight;
+ size_t chromaSize = lumaSize >> 2;
+
+ ps_decode_ip->u4_size = sizeof(ivd_video_decode_ip_t);
+ ps_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
+ if (inBuffer) {
+ ps_decode_ip->u4_ts = tsMarker;
+ ps_decode_ip->pv_stream_buffer = const_cast<uint8_t *>(inBuffer->data() + inOffset);
+ ps_decode_ip->u4_num_Bytes = inSize;
+ } else {
+ ps_decode_ip->u4_ts = 0;
+ ps_decode_ip->pv_stream_buffer = nullptr;
+ ps_decode_ip->u4_num_Bytes = 0;
+ }
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[0] = lumaSize;
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[1] = chromaSize;
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[2] = chromaSize;
+ if (outBuffer) {
+ if (outBuffer->width() < displayStride || outBuffer->height() < displayHeight) {
+ ALOGE("Output buffer too small: provided (%dx%d) required (%ux%u)",
+ outBuffer->width(), outBuffer->height(), displayStride, displayHeight);
+ return false;
+ }
+ ps_decode_ip->s_out_buffer.pu1_bufs[0] = outBuffer->data()[C2PlanarLayout::PLANE_Y];
+ ps_decode_ip->s_out_buffer.pu1_bufs[1] = outBuffer->data()[C2PlanarLayout::PLANE_U];
+ ps_decode_ip->s_out_buffer.pu1_bufs[2] = outBuffer->data()[C2PlanarLayout::PLANE_V];
+ } else {
+ ps_decode_ip->s_out_buffer.pu1_bufs[0] = mOutBufferFlush;
+ ps_decode_ip->s_out_buffer.pu1_bufs[1] = mOutBufferFlush + lumaSize;
+ ps_decode_ip->s_out_buffer.pu1_bufs[2] = mOutBufferFlush + lumaSize + chromaSize;
+ }
+ ps_decode_ip->s_out_buffer.u4_num_bufs = 3;
+ ps_decode_op->u4_size = sizeof(ivd_video_decode_op_t);
+ ps_decode_op->u4_output_present = 0;
+
+ return true;
+}
+
+bool C2SoftHevcDec::getVuiParams() {
+ ivdext_ctl_get_vui_params_ip_t s_get_vui_params_ip;
+ ivdext_ctl_get_vui_params_op_t s_get_vui_params_op;
+
+ s_get_vui_params_ip.u4_size = sizeof(ivdext_ctl_get_vui_params_ip_t);
+ s_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_get_vui_params_ip.e_sub_cmd =
+ (IVD_CONTROL_API_COMMAND_TYPE_T) IHEVCD_CXA_CMD_CTL_GET_VUI_PARAMS;
+ s_get_vui_params_op.u4_size = sizeof(ivdext_ctl_get_vui_params_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_get_vui_params_ip,
+ &s_get_vui_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGD("error in %s: 0x%x", __func__, s_get_vui_params_op.u4_error_code);
+ return false;
+ }
+
+ VuiColorAspects vuiColorAspects;
+ vuiColorAspects.primaries = s_get_vui_params_op.u1_colour_primaries;
+ vuiColorAspects.transfer = s_get_vui_params_op.u1_transfer_characteristics;
+ vuiColorAspects.coeffs = s_get_vui_params_op.u1_matrix_coefficients;
+ vuiColorAspects.fullRange = s_get_vui_params_op.u1_video_full_range_flag;
+
+ // convert vui aspects to C2 values if changed
+ if (!(vuiColorAspects == mBitstreamColorAspects)) {
+ mBitstreamColorAspects = vuiColorAspects;
+ ColorAspects sfAspects;
+ C2StreamColorAspectsInfo::input codedAspects = { 0u };
+ ColorUtils::convertIsoColorAspectsToCodecAspects(
+ vuiColorAspects.primaries, vuiColorAspects.transfer, vuiColorAspects.coeffs,
+ vuiColorAspects.fullRange, sfAspects);
+ if (!C2Mapper::map(sfAspects.mPrimaries, &codedAspects.primaries)) {
+ codedAspects.primaries = C2Color::PRIMARIES_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mRange, &codedAspects.range)) {
+ codedAspects.range = C2Color::RANGE_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mMatrixCoeffs, &codedAspects.matrix)) {
+ codedAspects.matrix = C2Color::MATRIX_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mTransfer, &codedAspects.transfer)) {
+ codedAspects.transfer = C2Color::TRANSFER_UNSPECIFIED;
+ }
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ (void)mIntf->config({&codedAspects}, C2_MAY_BLOCK, &failures);
+ }
+ return true;
+}
+
+status_t C2SoftHevcDec::setFlushMode() {
+ ivd_ctl_flush_ip_t s_set_flush_ip;
+ ivd_ctl_flush_op_t s_set_flush_op;
+
+ s_set_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t);
+ s_set_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH;
+ s_set_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_flush_ip,
+ &s_set_flush_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__, s_set_flush_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftHevcDec::resetDecoder() {
+ ivd_ctl_reset_ip_t s_reset_ip;
+ ivd_ctl_reset_op_t s_reset_op;
+
+ s_reset_ip.u4_size = sizeof(ivd_ctl_reset_ip_t);
+ s_reset_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_reset_ip.e_sub_cmd = IVD_CMD_CTL_RESET;
+ s_reset_op.u4_size = sizeof(ivd_ctl_reset_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_reset_ip,
+ &s_reset_op);
+ if (IV_SUCCESS != status) {
+ ALOGE("error in %s: 0x%x", __func__, s_reset_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+ mStride = 0;
+ (void) setNumCores();
+ mSignalledError = false;
+ mHeaderDecoded = false;
+ return OK;
+}
+
+void C2SoftHevcDec::resetPlugin() {
+ mSignalledOutputEos = false;
+ gettimeofday(&mTimeStart, nullptr);
+ gettimeofday(&mTimeEnd, nullptr);
+}
+
+status_t C2SoftHevcDec::deleteDecoder() {
+ if (mDecHandle) {
+ ivdext_delete_ip_t s_delete_ip;
+ ivdext_delete_op_t s_delete_op;
+
+ s_delete_ip.s_ivd_delete_ip_t.u4_size = sizeof(ivdext_delete_ip_t);
+ s_delete_ip.s_ivd_delete_ip_t.e_cmd = IVD_CMD_DELETE;
+ s_delete_op.s_ivd_delete_op_t.u4_size = sizeof(ivdext_delete_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_delete_ip,
+ &s_delete_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__,
+ s_delete_op.s_ivd_delete_op_t.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+ mDecHandle = nullptr;
+ }
+
+ return OK;
+}
+
+void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+void C2SoftHevcDec::finishWork(uint64_t index, const std::unique_ptr<C2Work> &work) {
+ std::shared_ptr<C2Buffer> buffer = createGraphicBuffer(std::move(mOutBlock),
+ C2Rect(mWidth, mHeight));
+ mOutBlock = nullptr;
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ buffer->setInfo(mIntf->getColorAspects_l());
+ }
+
+ auto fillWork = [buffer](const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)0;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(buffer);
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ };
+ if (work && c2_cntr64_t(index) == work->input.ordinal.frameIndex) {
+ fillWork(work);
+ } else {
+ finish(index, fillWork);
+ }
+}
+
+c2_status_t C2SoftHevcDec::ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool) {
+ if (!mDecHandle) {
+ ALOGE("not supposed to be here, invalid decoder context");
+ return C2_CORRUPTED;
+ }
+ if (mStride != ALIGN64(mWidth)) {
+ mStride = ALIGN64(mWidth);
+ if (OK != setParams(mStride, IVD_DECODE_FRAME)) return C2_CORRUPTED;
+ }
+ if (mOutBlock &&
+ (mOutBlock->width() != mStride || mOutBlock->height() != mHeight)) {
+ mOutBlock.reset();
+ }
+ if (!mOutBlock) {
+ uint32_t format = HAL_PIXEL_FORMAT_YV12;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchGraphicBlock(mStride, mHeight, format, usage, &mOutBlock);
+ if (err != C2_OK) {
+ ALOGE("fetchGraphicBlock for Output failed with status %d", err);
+ return err;
+ }
+ ALOGV("provided (%dx%d) required (%dx%d)",
+ mOutBlock->width(), mOutBlock->height(), mStride, mHeight);
+ }
+
+ return C2_OK;
+}
+
+// TODO: can overall error checking be improved?
+// TODO: allow configuration of color format and usage for graphic buffers instead
+// of hard coding them to HAL_PIXEL_FORMAT_YV12
+// TODO: pass coloraspects information to surface
+// TODO: test support for dynamic change in resolution
+// TODO: verify if the decoder sent back all frames
+void C2SoftHevcDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 0u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ uint32_t workIndex = work->input.ordinal.frameIndex.peeku() & 0xFFFFFFFF;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = rView.error();
+ return;
+ }
+ }
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ bool hasPicture = false;
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x",
+ inSize, (int)work->input.ordinal.timestamp.peeku(),
+ (int)work->input.ordinal.frameIndex.peeku(), work->input.flags);
+ size_t inPos = 0;
+ while (inPos < inSize) {
+ if (C2_OK != ensureDecoderState(pool)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ C2GraphicView wView = mOutBlock->map().get();
+ if (wView.error()) {
+ ALOGE("graphic view map failed %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+ if (!setDecodeArgs(&s_decode_ip, &s_decode_op, &rView, &wView,
+ inOffset + inPos, inSize - inPos, workIndex)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ if (false == mHeaderDecoded) {
+ /* Decode header and get dimensions */
+ setParams(mStride, IVD_DECODE_HEADER);
+ }
+ WORD32 delay;
+ GETTIME(&mTimeStart, nullptr);
+ TIME_DIFF(mTimeEnd, mTimeStart, delay);
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ WORD32 decodeTime;
+ GETTIME(&mTimeEnd, nullptr);
+ TIME_DIFF(mTimeStart, mTimeEnd, decodeTime);
+ ALOGV("decodeTime=%6d delay=%6d numBytes=%6d", decodeTime, delay,
+ s_decode_op.u4_num_bytes_consumed);
+ if (IVD_MEM_ALLOC_FAILED == (s_decode_op.u4_error_code & 0xFF)) {
+ ALOGE("allocation failure in decoder");
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ } else if (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_decode_op.u4_error_code & 0xFF)) {
+ ALOGE("unsupported resolution : %dx%d", mWidth, mHeight);
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ } else if (IVD_RES_CHANGED == (s_decode_op.u4_error_code & 0xFF)) {
+ ALOGV("resolution changed");
+ drainInternal(DRAIN_COMPONENT_NO_EOS, pool, work);
+ resetDecoder();
+ resetPlugin();
+ work->workletsProcessed = 0u;
+
+ /* Decode header and get new dimensions */
+ setParams(mStride, IVD_DECODE_HEADER);
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ }
+ if (0 < s_decode_op.u4_pic_wd && 0 < s_decode_op.u4_pic_ht) {
+ if (mHeaderDecoded == false) {
+ mHeaderDecoded = true;
+ setParams(ALIGN64(s_decode_op.u4_pic_wd), IVD_DECODE_FRAME);
+ }
+ if (s_decode_op.u4_pic_wd != mWidth || s_decode_op.u4_pic_ht != mHeight) {
+ mWidth = s_decode_op.u4_pic_wd;
+ mHeight = s_decode_op.u4_pic_ht;
+ CHECK_EQ(0u, s_decode_op.u4_output_present);
+
+ C2VideoSizeStreamInfo::output size(0u, mWidth, mHeight);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err =
+ mIntf->config({&size}, C2_MAY_BLOCK, &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(size));
+ } else {
+ ALOGE("Cannot set width and height");
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ continue;
+ }
+ }
+ (void) getVuiParams();
+ hasPicture |= (1 == s_decode_op.u4_frame_decoded_flag);
+ if (s_decode_op.u4_output_present) {
+ finishWork(s_decode_op.u4_ts, work);
+ }
+ if (0 == s_decode_op.u4_num_bytes_consumed) {
+ ALOGD("Bytes consumed is zero. Ignoring remaining bytes");
+ break;
+ }
+ inPos += s_decode_op.u4_num_bytes_consumed;
+ if (hasPicture && (inSize - inPos)) {
+ ALOGD("decoded frame in current access nal, ignoring further trailing bytes %d",
+ (int)inSize - (int)inPos);
+ break;
+ }
+ }
+
+ if (eos) {
+ drainInternal(DRAIN_COMPONENT_WITH_EOS, pool, work);
+ mSignalledOutputEos = true;
+ } else if (!hasPicture) {
+ fillEmptyWork(work);
+ }
+}
+
+c2_status_t C2SoftHevcDec::drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work) {
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ if (OK != setFlushMode()) return C2_CORRUPTED;
+ while (true) {
+ if (C2_OK != ensureDecoderState(pool)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return C2_CORRUPTED;
+ }
+ C2GraphicView wView = mOutBlock->map().get();
+ if (wView.error()) {
+ ALOGE("graphic view map failed %d", wView.error());
+ return C2_CORRUPTED;
+ }
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+ if (!setDecodeArgs(&s_decode_ip, &s_decode_op, nullptr, &wView, 0, 0, 0)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ return C2_CORRUPTED;
+ }
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ if (s_decode_op.u4_output_present) {
+ finishWork(s_decode_op.u4_ts, work);
+ } else {
+ fillEmptyWork(work);
+ break;
+ }
+ }
+
+ return C2_OK;
+}
+
+c2_status_t C2SoftHevcDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ return drainInternal(drainMode, pool, nullptr);
+}
+
+class C2SoftHevcDecFactory : public C2ComponentFactory {
+public:
+ C2SoftHevcDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftHevcDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftHevcDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftHevcDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftHevcDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftHevcDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftHevcDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/hevc/C2SoftHevcDec.h b/media/codec2/components/hevc/C2SoftHevcDec.h
new file mode 100644
index 0000000..75111fc
--- /dev/null
+++ b/media/codec2/components/hevc/C2SoftHevcDec.h
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_HEVC_DEC_H_
+#define ANDROID_C2_SOFT_HEVC_DEC_H_
+
+#include <media/stagefright/foundation/ColorUtils.h>
+
+#include <SimpleC2Component.h>
+
+#include "ihevc_typedefs.h"
+#include "iv.h"
+#include "ivd.h"
+
+namespace android {
+
+#define ivdec_api_function ihevcd_cxa_api_function
+#define ivdext_create_ip_t ihevcd_cxa_create_ip_t
+#define ivdext_create_op_t ihevcd_cxa_create_op_t
+#define ivdext_delete_ip_t ihevcd_cxa_delete_ip_t
+#define ivdext_delete_op_t ihevcd_cxa_delete_op_t
+#define ivdext_ctl_set_num_cores_ip_t ihevcd_cxa_ctl_set_num_cores_ip_t
+#define ivdext_ctl_set_num_cores_op_t ihevcd_cxa_ctl_set_num_cores_op_t
+#define ivdext_ctl_get_vui_params_ip_t ihevcd_cxa_ctl_get_vui_params_ip_t
+#define ivdext_ctl_get_vui_params_op_t ihevcd_cxa_ctl_get_vui_params_op_t
+#define ALIGN64(x) ((((x) + 63) >> 6) << 6)
+#define MAX_NUM_CORES 4
+#define IVDEXT_CMD_CTL_SET_NUM_CORES \
+ (IVD_CONTROL_API_COMMAND_TYPE_T)IHEVCD_CXA_CMD_CTL_SET_NUM_CORES
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define GETTIME(a, b) gettimeofday(a, b);
+#define TIME_DIFF(start, end, diff) \
+ diff = (((end).tv_sec - (start).tv_sec) * 1000000) + \
+ ((end).tv_usec - (start).tv_usec);
+
+
+struct C2SoftHevcDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftHevcDec(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+ virtual ~C2SoftHevcDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ private:
+ status_t createDecoder();
+ status_t setNumCores();
+ status_t setParams(size_t stride, IVD_VIDEO_DECODE_MODE_T dec_mode);
+ status_t getVersion();
+ status_t initDecoder();
+ bool setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
+ ivd_video_decode_op_t *ps_decode_op,
+ C2ReadView *inBuffer,
+ C2GraphicView *outBuffer,
+ size_t inOffset,
+ size_t inSize,
+ uint32_t tsMarker);
+ bool getVuiParams();
+ // TODO:This is not the right place for colorAspects functions. These should
+ // be part of c2-vndk so that they can be accessed by all video plugins
+ // until then, make them feel at home
+ bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b);
+ void updateFinalColorAspects(
+ const ColorAspects &otherAspects, const ColorAspects &preferredAspects);
+ status_t handleColorAspectsChange();
+ c2_status_t ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool);
+ void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work);
+ status_t setFlushMode();
+ c2_status_t drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work);
+ status_t resetDecoder();
+ void resetPlugin();
+ status_t deleteDecoder();
+
+ // TODO:This is not the right place for this enum. These should
+ // be part of c2-vndk so that they can be accessed by all video plugins
+ // until then, make them feel at home
+ enum {
+ kNotSupported,
+ kPreferBitstream,
+ kPreferContainer,
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+ iv_obj_t *mDecHandle;
+ std::shared_ptr<C2GraphicBlock> mOutBlock;
+ uint8_t *mOutBufferFlush;
+
+ size_t mNumCores;
+ IV_COLOR_FORMAT_T mIvColorformat;
+
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint32_t mStride;
+ bool mSignalledOutputEos;
+ bool mSignalledError;
+ bool mHeaderDecoded;
+
+ // Color aspects. These are ISO values and are meant to detect changes in aspects to avoid
+ // converting them to C2 values for each frame
+ struct VuiColorAspects {
+ uint8_t primaries;
+ uint8_t transfer;
+ uint8_t coeffs;
+ uint8_t fullRange;
+
+ // default color aspects
+ VuiColorAspects()
+ : primaries(2), transfer(2), coeffs(2), fullRange(0) { }
+
+ bool operator==(const VuiColorAspects &o) {
+ return primaries == o.primaries && transfer == o.transfer && coeffs == o.coeffs
+ && fullRange == o.fullRange;
+ }
+ } mBitstreamColorAspects;
+
+ // profile
+ struct timeval mTimeStart;
+ struct timeval mTimeEnd;
+
+ C2_DO_NOT_COPY(C2SoftHevcDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_HEVC_DEC_H_
diff --git a/media/codec2/components/mp3/Android.bp b/media/codec2/components/mp3/Android.bp
new file mode 100644
index 0000000..66665ed
--- /dev/null
+++ b/media/codec2/components/mp3/Android.bp
@@ -0,0 +1,11 @@
+cc_library_shared {
+ name: "libcodec2_soft_mp3dec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftMp3Dec.cpp"],
+
+ static_libs: ["libstagefright_mp3dec"],
+}
diff --git a/media/codec2/components/mp3/C2SoftMp3Dec.cpp b/media/codec2/components/mp3/C2SoftMp3Dec.cpp
new file mode 100644
index 0000000..c8b8397
--- /dev/null
+++ b/media/codec2/components/mp3/C2SoftMp3Dec.cpp
@@ -0,0 +1,558 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftMp3Dec"
+#include <log/log.h>
+
+#include <numeric>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftMp3Dec.h"
+#include "pvmp3decoder_api.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.mp3.decoder";
+
+class C2SoftMP3::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_MPEG))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 44100))
+ .withFields({C2F(mSampleRate, value).oneOf({8000, 11025, 12000, 16000,
+ 22050, 24000, 32000, 44100, 48000})})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 2))
+ .withFields({C2F(mChannelCount, value).inRange(1, 2)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(8000, 320000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192))
+ .build());
+ }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftMP3::C2SoftMP3(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mConfig(nullptr),
+ mDecoderBuf(nullptr) {
+}
+
+C2SoftMP3::~C2SoftMP3() {
+ onRelease();
+}
+
+c2_status_t C2SoftMP3::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_NO_MEMORY;
+}
+
+c2_status_t C2SoftMP3::onStop() {
+ // Make sure that the next buffer output does not still
+ // depend on fragments from the last one decoded.
+ pvmp3_InitDecoder(mConfig, mDecoderBuf);
+ mSignalledError = false;
+ mIsFirst = true;
+ mSignalledOutputEos = false;
+ mAnchorTimeStamp = 0;
+ mProcessedSamples = 0;
+
+ return C2_OK;
+}
+
+void C2SoftMP3::onReset() {
+ (void)onStop();
+}
+
+void C2SoftMP3::onRelease() {
+ mGaplessBytes = false;
+ if (mDecoderBuf) {
+ free(mDecoderBuf);
+ mDecoderBuf = nullptr;
+ }
+
+ if (mConfig) {
+ delete mConfig;
+ mConfig = nullptr;
+ }
+}
+
+status_t C2SoftMP3::initDecoder() {
+ mConfig = new tPVMP3DecoderExternal{};
+ if (!mConfig) return NO_MEMORY;
+ mConfig->equalizerType = flat;
+ mConfig->crcEnabled = false;
+
+ size_t memRequirements = pvmp3_decoderMemRequirements();
+ mDecoderBuf = malloc(memRequirements);
+ if (!mDecoderBuf) return NO_MEMORY;
+
+ pvmp3_InitDecoder(mConfig, mDecoderBuf);
+
+ mIsFirst = true;
+ mGaplessBytes = false;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mAnchorTimeStamp = 0;
+ mProcessedSamples = 0;
+
+ return OK;
+}
+
+/* The below code is borrowed from ./test/mp3reader.cpp */
+static bool parseMp3Header(uint32_t header, size_t *frame_size,
+ uint32_t *out_sampling_rate = nullptr,
+ uint32_t *out_channels = nullptr,
+ uint32_t *out_bitrate = nullptr,
+ uint32_t *out_num_samples = nullptr) {
+ *frame_size = 0;
+ if (out_sampling_rate) *out_sampling_rate = 0;
+ if (out_channels) *out_channels = 0;
+ if (out_bitrate) *out_bitrate = 0;
+ if (out_num_samples) *out_num_samples = 1152;
+
+ if ((header & 0xffe00000) != 0xffe00000) return false;
+
+ unsigned version = (header >> 19) & 3;
+ if (version == 0x01) return false;
+
+ unsigned layer = (header >> 17) & 3;
+ if (layer == 0x00) return false;
+
+ unsigned bitrate_index = (header >> 12) & 0x0f;
+ if (bitrate_index == 0 || bitrate_index == 0x0f) return false;
+
+ unsigned sampling_rate_index = (header >> 10) & 3;
+ if (sampling_rate_index == 3) return false;
+
+ static const int kSamplingRateV1[] = { 44100, 48000, 32000 };
+ int sampling_rate = kSamplingRateV1[sampling_rate_index];
+ if (version == 2 /* V2 */) {
+ sampling_rate /= 2;
+ } else if (version == 0 /* V2.5 */) {
+ sampling_rate /= 4;
+ }
+
+ unsigned padding = (header >> 9) & 1;
+
+ if (layer == 3) { // layer I
+ static const int kBitrateV1[] =
+ {
+ 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448
+ };
+ static const int kBitrateV2[] =
+ {
+ 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256
+ };
+
+ int bitrate = (version == 3 /* V1 */) ? kBitrateV1[bitrate_index - 1] :
+ kBitrateV2[bitrate_index - 1];
+
+ if (out_bitrate) {
+ *out_bitrate = bitrate;
+ }
+ *frame_size = (12000 * bitrate / sampling_rate + padding) * 4;
+ if (out_num_samples) {
+ *out_num_samples = 384;
+ }
+ } else { // layer II or III
+ static const int kBitrateV1L2[] =
+ {
+ 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384
+ };
+
+ static const int kBitrateV1L3[] =
+ {
+ 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
+ };
+
+ static const int kBitrateV2[] =
+ {
+ 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160
+ };
+
+ int bitrate;
+ if (version == 3 /* V1 */) {
+ bitrate = (layer == 2 /* L2 */) ? kBitrateV1L2[bitrate_index - 1] :
+ kBitrateV1L3[bitrate_index - 1];
+
+ if (out_num_samples) {
+ *out_num_samples = 1152;
+ }
+ } else { // V2 (or 2.5)
+ bitrate = kBitrateV2[bitrate_index - 1];
+ if (out_num_samples) {
+ *out_num_samples = (layer == 1 /* L3 */) ? 576 : 1152;
+ }
+ }
+
+ if (out_bitrate) {
+ *out_bitrate = bitrate;
+ }
+
+ if (version == 3 /* V1 */) {
+ *frame_size = 144000 * bitrate / sampling_rate + padding;
+ } else { // V2 or V2.5
+ size_t tmp = (layer == 1 /* L3 */) ? 72000 : 144000;
+ *frame_size = tmp * bitrate / sampling_rate + padding;
+ }
+ }
+
+ if (out_sampling_rate) {
+ *out_sampling_rate = sampling_rate;
+ }
+
+ if (out_channels) {
+ int channel_mode = (header >> 6) & 3;
+
+ *out_channels = (channel_mode == 3) ? 1 : 2;
+ }
+
+ return true;
+}
+
+static uint32_t U32_AT(const uint8_t *ptr) {
+ return ptr[0] << 24 | ptr[1] << 16 | ptr[2] << 8 | ptr[3];
+}
+
+static status_t calculateOutSize(uint8 *header, size_t inSize,
+ std::vector<size_t> *decodedSizes) {
+ uint32_t channels;
+ uint32_t numSamples;
+ size_t frameSize;
+ size_t totalInSize = 0;
+
+ while (totalInSize + 4 < inSize) {
+ if (!parseMp3Header(U32_AT(header + totalInSize), &frameSize,
+ nullptr, &channels, nullptr, &numSamples)) {
+ ALOGE("Error in parse mp3 header during outSize estimation");
+ return UNKNOWN_ERROR;
+ }
+ totalInSize += frameSize;
+ decodedSizes->push_back(numSamples * channels * sizeof(int16_t));
+ }
+
+ if (decodedSizes->empty()) return UNKNOWN_ERROR;
+
+ return OK;
+}
+
+c2_status_t C2SoftMP3::onFlush_sm() {
+ return onStop();
+}
+
+c2_status_t C2SoftMP3::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+// TODO: Can overall error checking be improved? As in the check for validity of
+// work, pool ptr, work->input.buffers.size() == 1, ...
+// TODO: Blind removal of 529 samples from the output may not work. Because
+// mpeg layer 1 frame size is 384 samples per frame. This should introduce
+// negative values and can cause SEG faults. Soft omx mp3 plugin can have
+// this problem (CHECK!)
+void C2SoftMP3::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ size_t inSize = 0u;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = rView.error();
+ return;
+ }
+ }
+
+ if (inSize == 0 && (!mGaplessBytes || !eos)) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ return;
+ }
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d", inSize,
+ (int)work->input.ordinal.timestamp.peeku(), (int)work->input.ordinal.frameIndex.peeku());
+
+ int32_t numChannels = mConfig->num_channels;
+ size_t calOutSize;
+ std::vector<size_t> decodedSizes;
+ if (inSize && OK != calculateOutSize(const_cast<uint8 *>(rView.data()),
+ inSize, &decodedSizes)) {
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ calOutSize = std::accumulate(decodedSizes.begin(), decodedSizes.end(), 0);
+ if (eos) {
+ calOutSize += kPVMP3DecoderDelay * numChannels * sizeof(int16_t);
+ }
+
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(calOutSize, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+
+ int outSize = 0;
+ int outOffset = 0;
+ auto it = decodedSizes.begin();
+ size_t inPos = 0;
+ int32_t samplingRate = mConfig->samplingRate;
+ while (inPos < inSize) {
+ if (it == decodedSizes.end()) {
+ ALOGE("unexpected trailing bytes, ignoring them");
+ break;
+ }
+
+ mConfig->pInputBuffer = const_cast<uint8 *>(rView.data() + inPos);
+ mConfig->inputBufferCurrentLength = (inSize - inPos);
+ mConfig->inputBufferMaxLength = 0;
+ mConfig->inputBufferUsedLength = 0;
+ mConfig->outputFrameSize = (calOutSize - outSize);
+ mConfig->pOutputBuffer = reinterpret_cast<int16_t *> (wView.data() + outSize);
+
+ ERROR_CODE decoderErr;
+ if ((decoderErr = pvmp3_framedecoder(mConfig, mDecoderBuf))
+ != NO_DECODING_ERROR) {
+ ALOGE("mp3 decoder returned error %d", decoderErr);
+ if (decoderErr != NO_ENOUGH_MAIN_DATA_ERROR
+ && decoderErr != SIDE_INFO_ERROR) {
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ // This is recoverable, just ignore the current frame and
+ // play silence instead.
+ ALOGV("ignoring error and sending silence");
+ if (mConfig->outputFrameSize == 0) {
+ mConfig->outputFrameSize = *it / sizeof(int16_t);
+ }
+ memset(mConfig->pOutputBuffer, 0, mConfig->outputFrameSize * sizeof(int16_t));
+ } else if (mConfig->samplingRate != samplingRate
+ || mConfig->num_channels != numChannels) {
+ ALOGI("Reconfiguring decoder: %d->%d Hz, %d->%d channels",
+ samplingRate, mConfig->samplingRate,
+ numChannels, mConfig->num_channels);
+ samplingRate = mConfig->samplingRate;
+ numChannels = mConfig->num_channels;
+
+ C2StreamSampleRateInfo::output sampleRateInfo(0u, samplingRate);
+ C2StreamChannelCountInfo::output channelCountInfo(0u, numChannels);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config(
+ { &sampleRateInfo, &channelCountInfo },
+ C2_MAY_BLOCK,
+ &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(C2Param::Copy(sampleRateInfo));
+ work->worklets.front()->output.configUpdate.push_back(C2Param::Copy(channelCountInfo));
+ } else {
+ ALOGE("Config Update failed");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ if (*it != mConfig->outputFrameSize * sizeof(int16_t)) {
+ ALOGE("panic, parsed size does not match decoded size");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ outSize += mConfig->outputFrameSize * sizeof(int16_t);
+ inPos += mConfig->inputBufferUsedLength;
+ it++;
+ }
+ if (mIsFirst) {
+ mIsFirst = false;
+ mGaplessBytes = true;
+ // The decoder delay is 529 samples, so trim that many samples off
+ // the start of the first output buffer. This essentially makes this
+ // decoder have zero delay, which the rest of the pipeline assumes.
+ outOffset = kPVMP3DecoderDelay * numChannels * sizeof(int16_t);
+ mAnchorTimeStamp = work->input.ordinal.timestamp.peekull();
+ }
+ if (eos) {
+ if (calOutSize >=
+ outSize + kPVMP3DecoderDelay * numChannels * sizeof(int16_t)) {
+ if (!memset(reinterpret_cast<int16_t*>(wView.data() + outSize), 0,
+ kPVMP3DecoderDelay * numChannels * sizeof(int16_t))) {
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ ALOGV("Adding 529 samples at end");
+ mGaplessBytes = false;
+ outSize += kPVMP3DecoderDelay * numChannels * sizeof(int16_t);
+ }
+ }
+
+ uint64_t outTimeStamp = mProcessedSamples * 1000000ll / samplingRate;
+ mProcessedSamples += ((outSize - outOffset) / (numChannels * sizeof(int16_t)));
+ ALOGV("out buffer attr. offset %d size %d timestamp %u", outOffset, outSize - outOffset,
+ (uint32_t)(mAnchorTimeStamp + outTimeStamp));
+ decodedSizes.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(
+ createLinearBuffer(block, outOffset, outSize - outOffset));
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->worklets.front()->output.ordinal.timestamp = mAnchorTimeStamp + outTimeStamp;
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+}
+
+class C2SoftMp3DecFactory : public C2ComponentFactory {
+public:
+ C2SoftMp3DecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftMP3(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftMP3::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftMP3::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftMP3::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftMp3DecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftMp3DecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
+
diff --git a/media/codec2/components/mp3/C2SoftMp3Dec.h b/media/codec2/components/mp3/C2SoftMp3Dec.h
new file mode 100644
index 0000000..402bdc4
--- /dev/null
+++ b/media/codec2/components/mp3/C2SoftMp3Dec.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_MP3_DEC_H_
+#define ANDROID_C2_SOFT_MP3_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+struct tPVMP3DecoderExternal;
+
+bool parseMp3Header(uint32_t header, size_t *frame_size,
+ uint32_t *out_sampling_rate = nullptr,
+ uint32_t *out_channels = nullptr,
+ uint32_t *out_bitrate = nullptr,
+ uint32_t *out_num_samples = nullptr);
+
+namespace android {
+
+struct C2SoftMP3 : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftMP3(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftMP3();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ enum {
+ kPVMP3DecoderDelay = 529 // samples
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+ tPVMP3DecoderExternal *mConfig;
+ void *mDecoderBuf;
+
+ bool mIsFirst;
+ bool mSignalledError;
+ bool mSignalledOutputEos;
+ bool mGaplessBytes;
+ uint64_t mAnchorTimeStamp;
+ uint64_t mProcessedSamples;
+
+ status_t initDecoder();
+
+ C2_DO_NOT_COPY(C2SoftMP3);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_MP3_DEC_H_
diff --git a/media/codec2/components/mp3/MODULE_LICENSE_APACHE2 b/media/codec2/components/mp3/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/mp3/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/mp3/NOTICE b/media/codec2/components/mp3/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/mp3/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/mp3/patent_disclaimer.txt b/media/codec2/components/mp3/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/codec2/components/mp3/patent_disclaimer.txt
@@ -0,0 +1,9 @@
+
+THIS IS NOT A GRANT OF PATENT RIGHTS.
+
+Google makes no representation or warranty that the codecs for which
+source code is made available hereunder are unencumbered by
+third-party patents. Those intending to use this source code in
+hardware or software products are advised that implementations of
+these codecs, including in open source software or shareware, may
+require patent licenses from the relevant patent holders.
diff --git a/media/codec2/components/mpeg2/Android.bp b/media/codec2/components/mpeg2/Android.bp
new file mode 100644
index 0000000..841f0a9
--- /dev/null
+++ b/media/codec2/components/mpeg2/Android.bp
@@ -0,0 +1,16 @@
+cc_library_shared {
+ name: "libcodec2_soft_mpeg2dec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_signed-defaults",
+ ],
+
+ srcs: ["C2SoftMpeg2Dec.cpp"],
+
+ static_libs: ["libmpeg2dec"],
+
+ include_dirs: [
+ "external/libmpeg2/decoder",
+ "external/libmpeg2/common",
+ ],
+}
diff --git a/media/codec2/components/mpeg2/C2SoftMpeg2Dec.cpp b/media/codec2/components/mpeg2/C2SoftMpeg2Dec.cpp
new file mode 100644
index 0000000..da32ec0
--- /dev/null
+++ b/media/codec2/components/mpeg2/C2SoftMpeg2Dec.cpp
@@ -0,0 +1,1069 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftMpeg2Dec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <Codec2Mapper.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftMpeg2Dec.h"
+#include "impeg2d.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.mpeg2.decoder";
+
+class C2SoftMpeg2Dec::IntfImpl : public SimpleInterface<void>::BaseParams {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : SimpleInterface<void>::BaseParams(
+ helper,
+ COMPONENT_NAME,
+ C2Component::KIND_DECODER,
+ C2Component::DOMAIN_VIDEO,
+ MEDIA_MIMETYPE_VIDEO_MPEG2) {
+ noPrivateBuffers(); // TODO: account for our buffers here
+ noInputReferences();
+ noOutputReferences();
+ noInputLatency();
+ noTimeStretch();
+
+ // TODO: output latency and reordering
+
+ addParameter(
+ DefineParam(mAttrib, C2_PARAMKEY_COMPONENT_ATTRIBUTES)
+ .withConstValue(new C2ComponentAttributesSetting(C2Component::ATTRIB_IS_TEMPORAL))
+ .build());
+
+ addParameter(
+ DefineParam(mSize, C2_PARAMKEY_PICTURE_SIZE)
+ .withDefault(new C2StreamPictureSizeInfo::output(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(16, 1920, 4),
+ C2F(mSize, height).inRange(16, 1088, 4),
+ })
+ .withSetter(SizeSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_MP2V_SIMPLE, C2Config::LEVEL_MP2V_HIGH))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ C2Config::PROFILE_MP2V_SIMPLE,
+ C2Config::PROFILE_MP2V_MAIN}),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_MP2V_LOW,
+ C2Config::LEVEL_MP2V_MAIN,
+ C2Config::LEVEL_MP2V_HIGH_1440,
+ C2Config::LEVEL_MP2V_HIGH})
+ })
+ .withSetter(ProfileLevelSetter, mSize)
+ .build());
+
+ addParameter(
+ DefineParam(mMaxSize, C2_PARAMKEY_MAX_PICTURE_SIZE)
+ .withDefault(new C2StreamMaxPictureSizeTuning::output(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 1920, 2),
+ C2F(mSize, height).inRange(2, 1088, 2),
+ })
+ .withSetter(MaxPictureSizeSetter, mSize)
+ .build());
+
+ addParameter(
+ DefineParam(mMaxInputSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, 320 * 240 * 3 / 2))
+ .withFields({
+ C2F(mMaxInputSize, value).any(),
+ })
+ .calculatedAs(MaxInputSizeSetter, mMaxSize)
+ .build());
+
+ C2ChromaOffsetStruct locations[1] = { C2ChromaOffsetStruct::ITU_YUV_420_0() };
+ std::shared_ptr<C2StreamColorInfo::output> defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ 1u, 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ memcpy(defaultColorInfo->m.locations, locations, sizeof(locations));
+
+ defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ { C2ChromaOffsetStruct::ITU_YUV_420_0() },
+ 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ helper->addStructDescriptors<C2ChromaOffsetStruct>();
+
+ addParameter(
+ DefineParam(mColorInfo, C2_PARAMKEY_CODED_COLOR_INFO)
+ .withConstValue(defaultColorInfo)
+ .build());
+
+ addParameter(
+ DefineParam(mDefaultColorAspects, C2_PARAMKEY_DEFAULT_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsTuning::output(
+ 0u, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mDefaultColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mDefaultColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mDefaultColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mDefaultColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(DefaultColorAspectsSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mCodedColorAspects, C2_PARAMKEY_VUI_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsInfo::input(
+ 0u, C2Color::RANGE_LIMITED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mCodedColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mCodedColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mCodedColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mCodedColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(CodedColorAspectsSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mColorAspects, C2_PARAMKEY_COLOR_ASPECTS)
+ .withDefault(new C2StreamColorAspectsInfo::output(
+ 0u, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED,
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED))
+ .withFields({
+ C2F(mColorAspects, range).inRange(
+ C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER),
+ C2F(mColorAspects, primaries).inRange(
+ C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER),
+ C2F(mColorAspects, transfer).inRange(
+ C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER),
+ C2F(mColorAspects, matrix).inRange(
+ C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER)
+ })
+ .withSetter(ColorAspectsSetter, mDefaultColorAspects, mCodedColorAspects)
+ .build());
+
+ // TODO: support more formats?
+ addParameter(
+ DefineParam(mPixelFormat, C2_PARAMKEY_PIXEL_FORMAT)
+ .withConstValue(new C2StreamPixelFormatInfo::output(
+ 0u, HAL_PIXEL_FORMAT_YCBCR_420_888))
+ .build());
+ }
+
+ static C2R SizeSetter(bool mayBlock, const C2P<C2StreamPictureSizeInfo::output> &oldMe,
+ C2P<C2VideoSizeStreamInfo::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+ me.set().width = oldMe.v.width;
+ }
+ if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
+ me.set().height = oldMe.v.height;
+ }
+ return res;
+ }
+
+ static C2R MaxPictureSizeSetter(bool mayBlock, C2P<C2StreamMaxPictureSizeTuning::output> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ // TODO: get max width/height from the size's field helpers vs. hardcoding
+ me.set().width = c2_min(c2_max(me.v.width, size.v.width), 1920u);
+ me.set().height = c2_min(c2_max(me.v.height, size.v.height), 1088u);
+ return C2R::Ok();
+ }
+
+ static C2R MaxInputSizeSetter(bool mayBlock, C2P<C2StreamMaxBufferSizeInfo::input> &me,
+ const C2P<C2StreamMaxPictureSizeTuning::output> &maxSize) {
+ (void)mayBlock;
+ // assume compression ratio of 1
+ me.set().value = (((maxSize.v.width + 15) / 16) * ((maxSize.v.height + 15) / 16) * 384);
+ return C2R::Ok();
+ }
+
+ static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::input> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ (void)size;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+
+ static C2R DefaultColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsTuning::output> &me) {
+ (void)mayBlock;
+ if (me.v.range > C2Color::RANGE_OTHER) {
+ me.set().range = C2Color::RANGE_OTHER;
+ }
+ if (me.v.primaries > C2Color::PRIMARIES_OTHER) {
+ me.set().primaries = C2Color::PRIMARIES_OTHER;
+ }
+ if (me.v.transfer > C2Color::TRANSFER_OTHER) {
+ me.set().transfer = C2Color::TRANSFER_OTHER;
+ }
+ if (me.v.matrix > C2Color::MATRIX_OTHER) {
+ me.set().matrix = C2Color::MATRIX_OTHER;
+ }
+ return C2R::Ok();
+ }
+
+ static C2R CodedColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::input> &me) {
+ (void)mayBlock;
+ if (me.v.range > C2Color::RANGE_OTHER) {
+ me.set().range = C2Color::RANGE_OTHER;
+ }
+ if (me.v.primaries > C2Color::PRIMARIES_OTHER) {
+ me.set().primaries = C2Color::PRIMARIES_OTHER;
+ }
+ if (me.v.transfer > C2Color::TRANSFER_OTHER) {
+ me.set().transfer = C2Color::TRANSFER_OTHER;
+ }
+ if (me.v.matrix > C2Color::MATRIX_OTHER) {
+ me.set().matrix = C2Color::MATRIX_OTHER;
+ }
+ return C2R::Ok();
+ }
+
+ static C2R ColorAspectsSetter(bool mayBlock, C2P<C2StreamColorAspectsInfo::output> &me,
+ const C2P<C2StreamColorAspectsTuning::output> &def,
+ const C2P<C2StreamColorAspectsInfo::input> &coded) {
+ (void)mayBlock;
+ // take default values for all unspecified fields, and coded values for specified ones
+ me.set().range = coded.v.range == RANGE_UNSPECIFIED ? def.v.range : coded.v.range;
+ me.set().primaries = coded.v.primaries == PRIMARIES_UNSPECIFIED
+ ? def.v.primaries : coded.v.primaries;
+ me.set().transfer = coded.v.transfer == TRANSFER_UNSPECIFIED
+ ? def.v.transfer : coded.v.transfer;
+ me.set().matrix = coded.v.matrix == MATRIX_UNSPECIFIED ? def.v.matrix : coded.v.matrix;
+ return C2R::Ok();
+ }
+
+ std::shared_ptr<C2StreamColorAspectsInfo::output> getColorAspects_l() {
+ return mColorAspects;
+ }
+
+private:
+ std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
+ std::shared_ptr<C2StreamPictureSizeInfo::output> mSize;
+ std::shared_ptr<C2StreamMaxPictureSizeTuning::output> mMaxSize;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mMaxInputSize;
+ std::shared_ptr<C2StreamColorInfo::output> mColorInfo;
+ std::shared_ptr<C2StreamColorAspectsInfo::input> mCodedColorAspects;
+ std::shared_ptr<C2StreamColorAspectsTuning::output> mDefaultColorAspects;
+ std::shared_ptr<C2StreamColorAspectsInfo::output> mColorAspects;
+ std::shared_ptr<C2StreamPixelFormatInfo::output> mPixelFormat;
+};
+
+static size_t getCpuCoreCount() {
+ long cpuCoreCount = 1;
+#if defined(_SC_NPROCESSORS_ONLN)
+ cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
+#else
+ // _SC_NPROC_ONLN must be defined...
+ cpuCoreCount = sysconf(_SC_NPROC_ONLN);
+#endif
+ CHECK(cpuCoreCount >= 1);
+ ALOGV("Number of CPU cores: %ld", cpuCoreCount);
+ return (size_t)cpuCoreCount;
+}
+
+static void *ivd_aligned_malloc(WORD32 alignment, WORD32 size) {
+ return memalign(alignment, size);
+}
+
+static void ivd_aligned_free(void *mem) {
+ free(mem);
+}
+
+C2SoftMpeg2Dec::C2SoftMpeg2Dec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mDecHandle(nullptr),
+ mMemRecords(nullptr),
+ mOutBufferDrain(nullptr),
+ mIvColorformat(IV_YUV_420P),
+ mWidth(320),
+ mHeight(240) {
+ // If input dump is enabled, then open create an empty file
+ GENERATE_FILE_NAMES();
+ CREATE_DUMP_FILE(mInFile);
+}
+
+C2SoftMpeg2Dec::~C2SoftMpeg2Dec() {
+ onRelease();
+}
+
+c2_status_t C2SoftMpeg2Dec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+c2_status_t C2SoftMpeg2Dec::onStop() {
+ if (OK != resetDecoder()) return C2_CORRUPTED;
+ resetPlugin();
+ return C2_OK;
+}
+
+void C2SoftMpeg2Dec::onReset() {
+ (void) onStop();
+}
+
+void C2SoftMpeg2Dec::onRelease() {
+ (void) deleteDecoder();
+ if (mOutBufferDrain) {
+ ivd_aligned_free(mOutBufferDrain);
+ mOutBufferDrain = nullptr;
+ }
+ if (mOutBlock) {
+ mOutBlock.reset();
+ }
+ if (mMemRecords) {
+ ivd_aligned_free(mMemRecords);
+ mMemRecords = nullptr;
+ }
+}
+
+c2_status_t C2SoftMpeg2Dec::onFlush_sm() {
+ if (OK != setFlushMode()) return C2_CORRUPTED;
+
+ uint32_t displayStride = mStride;
+ uint32_t displayHeight = mHeight;
+ uint32_t bufferSize = displayStride * displayHeight * 3 / 2;
+ mOutBufferDrain = (uint8_t *)ivd_aligned_malloc(128, bufferSize);
+ if (!mOutBufferDrain) {
+ ALOGE("could not allocate tmp output buffer (for flush) of size %u ", bufferSize);
+ return C2_NO_MEMORY;
+ }
+
+ while (true) {
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+
+ setDecodeArgs(&s_decode_ip, &s_decode_op, nullptr, nullptr, 0, 0, 0);
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ if (0 == s_decode_op.u4_output_present) {
+ resetPlugin();
+ break;
+ }
+ }
+
+ if (mOutBufferDrain) {
+ ivd_aligned_free(mOutBufferDrain);
+ mOutBufferDrain = nullptr;
+ }
+
+ return C2_OK;
+}
+
+status_t C2SoftMpeg2Dec::getNumMemRecords() {
+ iv_num_mem_rec_ip_t s_num_mem_rec_ip;
+ iv_num_mem_rec_op_t s_num_mem_rec_op;
+
+ s_num_mem_rec_ip.u4_size = sizeof(s_num_mem_rec_ip);
+ s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC;
+ s_num_mem_rec_op.u4_size = sizeof(s_num_mem_rec_op);
+
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_num_mem_rec_ip,
+ &s_num_mem_rec_op);
+ if (IV_SUCCESS != status) {
+ ALOGE("Error in getting mem records: 0x%x", s_num_mem_rec_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+ mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec;
+
+ return OK;
+}
+
+status_t C2SoftMpeg2Dec::fillMemRecords() {
+ iv_mem_rec_t *ps_mem_rec = (iv_mem_rec_t *) ivd_aligned_malloc(
+ 128, mNumMemRecords * sizeof(iv_mem_rec_t));
+ if (!ps_mem_rec) {
+ ALOGE("Allocation failure");
+ return NO_MEMORY;
+ }
+ memset(ps_mem_rec, 0, mNumMemRecords * sizeof(iv_mem_rec_t));
+ for (size_t i = 0; i < mNumMemRecords; i++)
+ ps_mem_rec[i].u4_size = sizeof(iv_mem_rec_t);
+ mMemRecords = ps_mem_rec;
+
+ ivdext_fill_mem_rec_ip_t s_fill_mem_ip;
+ ivdext_fill_mem_rec_op_t s_fill_mem_op;
+
+ s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_size = sizeof(ivdext_fill_mem_rec_ip_t);
+ s_fill_mem_ip.u4_share_disp_buf = 0;
+ s_fill_mem_ip.e_output_format = mIvColorformat;
+ s_fill_mem_ip.u4_deinterlace = 1;
+ s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
+ s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location = mMemRecords;
+ s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd = mWidth;
+ s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht = mHeight;
+ s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_size = sizeof(ivdext_fill_mem_rec_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_fill_mem_ip,
+ &s_fill_mem_op);
+ if (IV_SUCCESS != status) {
+ ALOGE("Error in filling mem records: 0x%x",
+ s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ CHECK_EQ(mNumMemRecords, s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled);
+ for (size_t i = 0; i < mNumMemRecords; i++, ps_mem_rec++) {
+ ps_mem_rec->pv_base = ivd_aligned_malloc(
+ ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size);
+ if (!ps_mem_rec->pv_base) {
+ ALOGE("Allocation failure for memory record #%zu of size %u",
+ i, ps_mem_rec->u4_mem_size);
+ return NO_MEMORY;
+ }
+ }
+
+ return OK;
+}
+
+status_t C2SoftMpeg2Dec::createDecoder() {
+ ivdext_init_ip_t s_init_ip;
+ ivdext_init_op_t s_init_op;
+
+ s_init_ip.s_ivd_init_ip_t.u4_size = sizeof(ivdext_init_ip_t);
+ s_init_ip.s_ivd_init_ip_t.e_cmd = (IVD_API_COMMAND_TYPE_T)IV_CMD_INIT;
+ s_init_ip.s_ivd_init_ip_t.pv_mem_rec_location = mMemRecords;
+ s_init_ip.s_ivd_init_ip_t.u4_frm_max_wd = mWidth;
+ s_init_ip.s_ivd_init_ip_t.u4_frm_max_ht = mHeight;
+ s_init_ip.u4_share_disp_buf = 0;
+ s_init_ip.u4_deinterlace = 1;
+ s_init_ip.s_ivd_init_ip_t.u4_num_mem_rec = mNumMemRecords;
+ s_init_ip.s_ivd_init_ip_t.e_output_format = mIvColorformat;
+ s_init_op.s_ivd_init_op_t.u4_size = sizeof(ivdext_init_op_t);
+
+ mDecHandle = (iv_obj_t *)mMemRecords[0].pv_base;
+ mDecHandle->pv_fxns = (void *)ivdec_api_function;
+ mDecHandle->u4_size = sizeof(iv_obj_t);
+
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_init_ip,
+ &s_init_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__,
+ s_init_op.s_ivd_init_op_t.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftMpeg2Dec::setNumCores() {
+ ivdext_ctl_set_num_cores_ip_t s_set_num_cores_ip;
+ ivdext_ctl_set_num_cores_op_t s_set_num_cores_op;
+
+ s_set_num_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t);
+ s_set_num_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_num_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES;
+ s_set_num_cores_ip.u4_num_cores = mNumCores;
+ s_set_num_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_num_cores_ip,
+ &s_set_num_cores_op);
+ if (status != IV_SUCCESS) {
+ ALOGD("error in %s: 0x%x", __func__, s_set_num_cores_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftMpeg2Dec::setParams(size_t stride) {
+ ivd_ctl_set_config_ip_t s_set_dyn_params_ip;
+ ivd_ctl_set_config_op_t s_set_dyn_params_op;
+
+ s_set_dyn_params_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
+ s_set_dyn_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_dyn_params_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
+ s_set_dyn_params_ip.u4_disp_wd = (UWORD32) stride;
+ s_set_dyn_params_ip.e_frm_skip_mode = IVD_SKIP_NONE;
+ s_set_dyn_params_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
+ s_set_dyn_params_ip.e_vid_dec_mode = IVD_DECODE_FRAME;
+ s_set_dyn_params_op.u4_size = sizeof(ivd_ctl_set_config_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_dyn_params_ip,
+ &s_set_dyn_params_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__, s_set_dyn_params_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftMpeg2Dec::getVersion() {
+ ivd_ctl_getversioninfo_ip_t s_get_versioninfo_ip;
+ ivd_ctl_getversioninfo_op_t s_get_versioninfo_op;
+ UWORD8 au1_buf[512];
+
+ s_get_versioninfo_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t);
+ s_get_versioninfo_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_get_versioninfo_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION;
+ s_get_versioninfo_ip.pv_version_buffer = au1_buf;
+ s_get_versioninfo_ip.u4_version_buffer_size = sizeof(au1_buf);
+ s_get_versioninfo_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_get_versioninfo_ip,
+ &s_get_versioninfo_op);
+ if (status != IV_SUCCESS) {
+ ALOGD("error in %s: 0x%x", __func__,
+ s_get_versioninfo_op.u4_error_code);
+ } else {
+ ALOGV("ittiam decoder version number: %s",
+ (char *) s_get_versioninfo_ip.pv_version_buffer);
+ }
+
+ return OK;
+}
+
+status_t C2SoftMpeg2Dec::initDecoder() {
+ status_t ret = getNumMemRecords();
+ if (OK != ret) return ret;
+
+ ret = fillMemRecords();
+ if (OK != ret) return ret;
+
+ if (OK != createDecoder()) return UNKNOWN_ERROR;
+
+ mNumCores = MIN(getCpuCoreCount(), MAX_NUM_CORES);
+ mStride = ALIGN64(mWidth);
+ mSignalledError = false;
+ resetPlugin();
+ (void) setNumCores();
+ if (OK != setParams(mStride)) return UNKNOWN_ERROR;
+ (void) getVersion();
+
+ return OK;
+}
+
+bool C2SoftMpeg2Dec::setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
+ ivd_video_decode_op_t *ps_decode_op,
+ C2ReadView *inBuffer,
+ C2GraphicView *outBuffer,
+ size_t inOffset,
+ size_t inSize,
+ uint32_t tsMarker) {
+ uint32_t displayStride = mStride;
+ uint32_t displayHeight = mHeight;
+ size_t lumaSize = displayStride * displayHeight;
+ size_t chromaSize = lumaSize >> 2;
+
+ ps_decode_ip->u4_size = sizeof(ivd_video_decode_ip_t);
+ ps_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
+ if (inBuffer) {
+ ps_decode_ip->u4_ts = tsMarker;
+ ps_decode_ip->pv_stream_buffer = const_cast<uint8_t *>(inBuffer->data() + inOffset);
+ ps_decode_ip->u4_num_Bytes = inSize;
+ } else {
+ ps_decode_ip->u4_ts = 0;
+ ps_decode_ip->pv_stream_buffer = nullptr;
+ ps_decode_ip->u4_num_Bytes = 0;
+ }
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[0] = lumaSize;
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[1] = chromaSize;
+ ps_decode_ip->s_out_buffer.u4_min_out_buf_size[2] = chromaSize;
+ if (outBuffer) {
+ if (outBuffer->width() < displayStride || outBuffer->height() < displayHeight) {
+ ALOGE("Output buffer too small: provided (%dx%d) required (%ux%u)",
+ outBuffer->width(), outBuffer->height(), displayStride, displayHeight);
+ return false;
+ }
+ ps_decode_ip->s_out_buffer.pu1_bufs[0] = outBuffer->data()[C2PlanarLayout::PLANE_Y];
+ ps_decode_ip->s_out_buffer.pu1_bufs[1] = outBuffer->data()[C2PlanarLayout::PLANE_U];
+ ps_decode_ip->s_out_buffer.pu1_bufs[2] = outBuffer->data()[C2PlanarLayout::PLANE_V];
+ } else {
+ ps_decode_ip->s_out_buffer.pu1_bufs[0] = mOutBufferDrain;
+ ps_decode_ip->s_out_buffer.pu1_bufs[1] = mOutBufferDrain + lumaSize;
+ ps_decode_ip->s_out_buffer.pu1_bufs[2] = mOutBufferDrain + lumaSize + chromaSize;
+ }
+ ps_decode_ip->s_out_buffer.u4_num_bufs = 3;
+ ps_decode_op->u4_size = sizeof(ivd_video_decode_op_t);
+
+ return true;
+}
+
+
+bool C2SoftMpeg2Dec::getSeqInfo() {
+ ivdext_ctl_get_seq_info_ip_t s_ctl_get_seq_info_ip;
+ ivdext_ctl_get_seq_info_op_t s_ctl_get_seq_info_op;
+
+ s_ctl_get_seq_info_ip.u4_size = sizeof(ivdext_ctl_get_seq_info_ip_t);
+ s_ctl_get_seq_info_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_ctl_get_seq_info_ip.e_sub_cmd =
+ (IVD_CONTROL_API_COMMAND_TYPE_T)IMPEG2D_CMD_CTL_GET_SEQ_INFO;
+ s_ctl_get_seq_info_op.u4_size = sizeof(ivdext_ctl_get_seq_info_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_ctl_get_seq_info_ip,
+ &s_ctl_get_seq_info_op);
+ if (status != IV_SUCCESS) {
+ ALOGW("Error in getting Sequence info: 0x%x", s_ctl_get_seq_info_op.u4_error_code);
+ return false;
+ }
+
+ VuiColorAspects vuiColorAspects;
+ vuiColorAspects.primaries = s_ctl_get_seq_info_op.u1_colour_primaries;
+ vuiColorAspects.transfer = s_ctl_get_seq_info_op.u1_transfer_characteristics;
+ vuiColorAspects.coeffs = s_ctl_get_seq_info_op.u1_matrix_coefficients;
+ vuiColorAspects.fullRange = false; // mpeg2 video has limited range.
+
+ // convert vui aspects to C2 values if changed
+ if (!(vuiColorAspects == mBitstreamColorAspects)) {
+ mBitstreamColorAspects = vuiColorAspects;
+ ColorAspects sfAspects;
+ C2StreamColorAspectsInfo::input codedAspects = { 0u };
+ ColorUtils::convertIsoColorAspectsToCodecAspects(
+ vuiColorAspects.primaries, vuiColorAspects.transfer, vuiColorAspects.coeffs,
+ vuiColorAspects.fullRange, sfAspects);
+ if (!C2Mapper::map(sfAspects.mPrimaries, &codedAspects.primaries)) {
+ codedAspects.primaries = C2Color::PRIMARIES_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mRange, &codedAspects.range)) {
+ codedAspects.range = C2Color::RANGE_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mMatrixCoeffs, &codedAspects.matrix)) {
+ codedAspects.matrix = C2Color::MATRIX_UNSPECIFIED;
+ }
+ if (!C2Mapper::map(sfAspects.mTransfer, &codedAspects.transfer)) {
+ codedAspects.transfer = C2Color::TRANSFER_UNSPECIFIED;
+ }
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ (void)mIntf->config({&codedAspects}, C2_MAY_BLOCK, &failures);
+ }
+ return true;
+}
+
+status_t C2SoftMpeg2Dec::setFlushMode() {
+ ivd_ctl_flush_ip_t s_set_flush_ip;
+ ivd_ctl_flush_op_t s_set_flush_op;
+
+ s_set_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t);
+ s_set_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_set_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH;
+ s_set_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_set_flush_ip,
+ &s_set_flush_op);
+ if (status != IV_SUCCESS) {
+ ALOGE("error in %s: 0x%x", __func__, s_set_flush_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftMpeg2Dec::resetDecoder() {
+ ivd_ctl_reset_ip_t s_reset_ip;
+ ivd_ctl_reset_op_t s_reset_op;
+
+ s_reset_ip.u4_size = sizeof(ivd_ctl_reset_ip_t);
+ s_reset_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_reset_ip.e_sub_cmd = IVD_CMD_CTL_RESET;
+ s_reset_op.u4_size = sizeof(ivd_ctl_reset_op_t);
+ IV_API_CALL_STATUS_T status = ivdec_api_function(mDecHandle,
+ &s_reset_ip,
+ &s_reset_op);
+ if (IV_SUCCESS != status) {
+ ALOGE("error in %s: 0x%x", __func__, s_reset_op.u4_error_code);
+ return UNKNOWN_ERROR;
+ }
+ (void) setNumCores();
+ mStride = 0;
+ mSignalledError = false;
+
+ return OK;
+}
+
+void C2SoftMpeg2Dec::resetPlugin() {
+ mSignalledOutputEos = false;
+ gettimeofday(&mTimeStart, nullptr);
+ gettimeofday(&mTimeEnd, nullptr);
+}
+
+status_t C2SoftMpeg2Dec::deleteDecoder() {
+ if (mMemRecords) {
+ iv_mem_rec_t *ps_mem_rec = mMemRecords;
+
+ for (size_t i = 0; i < mNumMemRecords; i++, ps_mem_rec++) {
+ if (ps_mem_rec->pv_base) {
+ ivd_aligned_free(ps_mem_rec->pv_base);
+ }
+ }
+ ivd_aligned_free(mMemRecords);
+ mMemRecords = nullptr;
+ }
+ mDecHandle = nullptr;
+
+ return OK;
+}
+
+status_t C2SoftMpeg2Dec::reInitDecoder() {
+ deleteDecoder();
+
+ status_t ret = initDecoder();
+ if (OK != ret) {
+ ALOGE("Failed to initialize decoder");
+ deleteDecoder();
+ return ret;
+ }
+ return OK;
+}
+
+void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+void C2SoftMpeg2Dec::finishWork(uint64_t index, const std::unique_ptr<C2Work> &work) {
+ std::shared_ptr<C2Buffer> buffer = createGraphicBuffer(std::move(mOutBlock),
+ C2Rect(mWidth, mHeight));
+ mOutBlock = nullptr;
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ buffer->setInfo(mIntf->getColorAspects_l());
+ }
+
+ auto fillWork = [buffer](const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)0;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(buffer);
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ };
+ if (work && c2_cntr64_t(index) == work->input.ordinal.frameIndex) {
+ fillWork(work);
+ } else {
+ finish(index, fillWork);
+ }
+}
+
+c2_status_t C2SoftMpeg2Dec::ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool) {
+ if (!mDecHandle) {
+ ALOGE("not supposed to be here, invalid decoder context");
+ return C2_CORRUPTED;
+ }
+ if (mStride != ALIGN64(mWidth)) {
+ mStride = ALIGN64(mWidth);
+ if (OK != setParams(mStride)) return C2_CORRUPTED;
+ }
+ if (mOutBlock &&
+ (mOutBlock->width() != mStride || mOutBlock->height() != mHeight)) {
+ mOutBlock.reset();
+ }
+ if (!mOutBlock) {
+ uint32_t format = HAL_PIXEL_FORMAT_YV12;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchGraphicBlock(mStride, mHeight, format, usage, &mOutBlock);
+ if (err != C2_OK) {
+ ALOGE("fetchGraphicBlock for Output failed with status %d", err);
+ return err;
+ }
+ ALOGV("provided (%dx%d) required (%dx%d)",
+ mOutBlock->width(), mOutBlock->height(), mStride, mHeight);
+ }
+
+ return C2_OK;
+}
+
+// TODO: can overall error checking be improved?
+// TODO: allow configuration of color format and usage for graphic buffers instead
+// of hard coding them to HAL_PIXEL_FORMAT_YV12
+// TODO: pass coloraspects information to surface
+// TODO: test support for dynamic change in resolution
+// TODO: verify if the decoder sent back all frames
+void C2SoftMpeg2Dec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 0u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ uint32_t workIndex = work->input.ordinal.frameIndex.peeku() & 0xFFFFFFFF;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ bool hasPicture = false;
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x",
+ inSize, (int)work->input.ordinal.timestamp.peeku(),
+ (int)work->input.ordinal.frameIndex.peeku(), work->input.flags);
+ size_t inPos = 0;
+ while (inPos < inSize) {
+ if (C2_OK != ensureDecoderState(pool)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ C2GraphicView wView = mOutBlock->map().get();
+ if (wView.error()) {
+ ALOGE("graphic view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+ if (!setDecodeArgs(&s_decode_ip, &s_decode_op, &rView, &wView,
+ inOffset + inPos, inSize - inPos, workIndex)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ // If input dump is enabled, then write to file
+ DUMP_TO_FILE(mInFile, s_decode_ip.pv_stream_buffer, s_decode_ip.u4_num_Bytes);
+ WORD32 delay;
+ GETTIME(&mTimeStart, nullptr);
+ TIME_DIFF(mTimeEnd, mTimeStart, delay);
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ WORD32 decodeTime;
+ GETTIME(&mTimeEnd, nullptr);
+ TIME_DIFF(mTimeStart, mTimeEnd, decodeTime);
+ ALOGV("decodeTime=%6d delay=%6d numBytes=%6d ", decodeTime, delay,
+ s_decode_op.u4_num_bytes_consumed);
+ if (IMPEG2D_UNSUPPORTED_DIMENSIONS == s_decode_op.u4_error_code) {
+ ALOGV("unsupported resolution : %dx%d", s_decode_op.u4_pic_wd, s_decode_op.u4_pic_ht);
+ drainInternal(DRAIN_COMPONENT_NO_EOS, pool, work);
+ resetPlugin();
+ work->workletsProcessed = 0u;
+ mWidth = s_decode_op.u4_pic_wd;
+ mHeight = s_decode_op.u4_pic_ht;
+
+ ALOGI("Configuring decoder: mWidth %d , mHeight %d ",
+ mWidth, mHeight);
+ C2VideoSizeStreamInfo::output size(0u, mWidth, mHeight);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err =
+ mIntf->config({&size}, C2_MAY_BLOCK, &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(size));
+ } else {
+ ALOGE("Cannot set width and height");
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ if (OK != reInitDecoder()) {
+ ALOGE("Failed to reinitialize decoder");
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ continue;
+ } else if (IVD_RES_CHANGED == (s_decode_op.u4_error_code & 0xFF)) {
+ ALOGV("resolution changed");
+ drainInternal(DRAIN_COMPONENT_NO_EOS, pool, work);
+ resetDecoder();
+ resetPlugin();
+ work->workletsProcessed = 0u;
+ continue;
+ }
+ if (0 < s_decode_op.u4_pic_wd && 0 < s_decode_op.u4_pic_ht) {
+ if (s_decode_op.u4_pic_wd != mWidth || s_decode_op.u4_pic_ht != mHeight) {
+ mWidth = s_decode_op.u4_pic_wd;
+ mHeight = s_decode_op.u4_pic_ht;
+ CHECK_EQ(0u, s_decode_op.u4_output_present);
+
+ ALOGI("Configuring decoder out: mWidth %d , mHeight %d ",
+ mWidth, mHeight);
+ C2VideoSizeStreamInfo::output size(0u, mWidth, mHeight);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err =
+ mIntf->config({&size}, C2_MAY_BLOCK, &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(size));
+ } else {
+ ALOGE("Cannot set width and height");
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ }
+
+ (void) getSeqInfo();
+ hasPicture |= (1 == s_decode_op.u4_frame_decoded_flag);
+ if (s_decode_op.u4_output_present) {
+ finishWork(s_decode_op.u4_ts, work);
+ }
+
+ inPos += s_decode_op.u4_num_bytes_consumed;
+ if (hasPicture && (inSize - inPos) != 0) {
+ ALOGD("decoded frame in current access nal, ignoring further trailing bytes %d",
+ (int)inSize - (int)inPos);
+ break;
+ }
+ }
+
+ if (eos) {
+ drainInternal(DRAIN_COMPONENT_WITH_EOS, pool, work);
+ mSignalledOutputEos = true;
+ } else if (!hasPicture) {
+ fillEmptyWork(work);
+ }
+}
+
+c2_status_t C2SoftMpeg2Dec::drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work) {
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ if (OK != setFlushMode()) return C2_CORRUPTED;
+ while (true) {
+ if (C2_OK != ensureDecoderState(pool)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return C2_CORRUPTED;
+ }
+ C2GraphicView wView = mOutBlock->map().get();
+ if (wView.error()) {
+ ALOGE("graphic view map failed %d", wView.error());
+ return C2_CORRUPTED;
+ }
+ ivd_video_decode_ip_t s_decode_ip;
+ ivd_video_decode_op_t s_decode_op;
+ if (!setDecodeArgs(&s_decode_ip, &s_decode_op, nullptr, &wView, 0, 0, 0)) {
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ return C2_CORRUPTED;
+ }
+ (void) ivdec_api_function(mDecHandle, &s_decode_ip, &s_decode_op);
+ if (s_decode_op.u4_output_present) {
+ finishWork(s_decode_op.u4_ts, work);
+ } else {
+ fillEmptyWork(work);
+ break;
+ }
+ }
+
+ return C2_OK;
+}
+
+c2_status_t C2SoftMpeg2Dec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ return drainInternal(drainMode, pool, nullptr);
+}
+
+class C2SoftMpeg2DecFactory : public C2ComponentFactory {
+public:
+ C2SoftMpeg2DecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftMpeg2Dec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftMpeg2Dec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftMpeg2Dec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftMpeg2Dec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftMpeg2DecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftMpeg2DecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/mpeg2/C2SoftMpeg2Dec.h b/media/codec2/components/mpeg2/C2SoftMpeg2Dec.h
new file mode 100644
index 0000000..9999872
--- /dev/null
+++ b/media/codec2/components/mpeg2/C2SoftMpeg2Dec.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_MPEG2_DEC_H_
+#define ANDROID_C2_SOFT_MPEG2_DEC_H_
+
+#include <SimpleC2Component.h>
+
+#include <media/stagefright/foundation/ColorUtils.h>
+
+#include "iv_datatypedef.h"
+#include "iv.h"
+#include "ivd.h"
+
+namespace android {
+
+#define ivdec_api_function impeg2d_api_function
+#define ivdext_init_ip_t impeg2d_init_ip_t
+#define ivdext_init_op_t impeg2d_init_op_t
+#define ivdext_fill_mem_rec_ip_t impeg2d_fill_mem_rec_ip_t
+#define ivdext_fill_mem_rec_op_t impeg2d_fill_mem_rec_op_t
+#define ivdext_ctl_set_num_cores_ip_t impeg2d_ctl_set_num_cores_ip_t
+#define ivdext_ctl_set_num_cores_op_t impeg2d_ctl_set_num_cores_op_t
+#define ivdext_ctl_get_seq_info_ip_t impeg2d_ctl_get_seq_info_ip_t
+#define ivdext_ctl_get_seq_info_op_t impeg2d_ctl_get_seq_info_op_t
+#define ALIGN64(x) ((((x) + 63) >> 6) << 6)
+#define MAX_NUM_CORES 4
+#define IVDEXT_CMD_CTL_SET_NUM_CORES \
+ (IVD_CONTROL_API_COMMAND_TYPE_T)IMPEG2D_CMD_CTL_SET_NUM_CORES
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define GETTIME(a, b) gettimeofday(a, b);
+#define TIME_DIFF(start, end, diff) \
+ diff = (((end).tv_sec - (start).tv_sec) * 1000000) + \
+ ((end).tv_usec - (start).tv_usec);
+
+#ifdef FILE_DUMP_ENABLE
+ #define INPUT_DUMP_PATH "/sdcard/clips/mpeg2d_input"
+ #define INPUT_DUMP_EXT "m2v"
+ #define GENERATE_FILE_NAMES() { \
+ GETTIME(&mTimeStart, NULL); \
+ strcpy(mInFile, ""); \
+ sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH, \
+ mTimeStart.tv_sec, mTimeStart.tv_usec, \
+ INPUT_DUMP_EXT); \
+ }
+ #define CREATE_DUMP_FILE(m_filename) { \
+ FILE *fp = fopen(m_filename, "wb"); \
+ if (fp != NULL) { \
+ fclose(fp); \
+ } else { \
+ ALOGD("Could not open file %s", m_filename); \
+ } \
+ }
+ #define DUMP_TO_FILE(m_filename, m_buf, m_size) \
+ { \
+ FILE *fp = fopen(m_filename, "ab"); \
+ if (fp != NULL && m_buf != NULL) { \
+ uint32_t i; \
+ i = fwrite(m_buf, 1, m_size, fp); \
+ ALOGD("fwrite ret %d to write %d", i, m_size); \
+ if (i != (uint32_t)m_size) { \
+ ALOGD("Error in fwrite, returned %d", i); \
+ perror("Error in write to file"); \
+ } \
+ fclose(fp); \
+ } else { \
+ ALOGD("Could not write to file %s", m_filename);\
+ } \
+ }
+#else /* FILE_DUMP_ENABLE */
+ #define INPUT_DUMP_PATH
+ #define INPUT_DUMP_EXT
+ #define OUTPUT_DUMP_PATH
+ #define OUTPUT_DUMP_EXT
+ #define GENERATE_FILE_NAMES()
+ #define CREATE_DUMP_FILE(m_filename)
+ #define DUMP_TO_FILE(m_filename, m_buf, m_size)
+#endif /* FILE_DUMP_ENABLE */
+
+struct C2SoftMpeg2Dec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftMpeg2Dec(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+ virtual ~C2SoftMpeg2Dec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ private:
+ status_t getNumMemRecords();
+ status_t fillMemRecords();
+ status_t createDecoder();
+ status_t setNumCores();
+ status_t setParams(size_t stride);
+ status_t getVersion();
+ status_t initDecoder();
+ bool setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
+ ivd_video_decode_op_t *ps_decode_op,
+ C2ReadView *inBuffer,
+ C2GraphicView *outBuffer,
+ size_t inOffset,
+ size_t inSize,
+ uint32_t tsMarker);
+ bool getSeqInfo();
+ c2_status_t ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool);
+ void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work);
+ status_t setFlushMode();
+ c2_status_t drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work);
+ status_t resetDecoder();
+ void resetPlugin();
+ status_t deleteDecoder();
+ status_t reInitDecoder();
+
+ // TODO:This is not the right place for this enum. These should
+ // be part of c2-vndk so that they can be accessed by all video plugins
+ // until then, make them feel at home
+ enum {
+ kNotSupported,
+ kPreferBitstream,
+ kPreferContainer,
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+ iv_obj_t *mDecHandle;
+ iv_mem_rec_t *mMemRecords;
+ size_t mNumMemRecords;
+ std::shared_ptr<C2GraphicBlock> mOutBlock;
+ uint8_t *mOutBufferDrain;
+
+ size_t mNumCores;
+ IV_COLOR_FORMAT_T mIvColorformat;
+
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint32_t mStride;
+ bool mSignalledOutputEos;
+ bool mSignalledError;
+
+ // Color aspects. These are ISO values and are meant to detect changes in aspects to avoid
+ // converting them to C2 values for each frame
+ struct VuiColorAspects {
+ uint8_t primaries;
+ uint8_t transfer;
+ uint8_t coeffs;
+ uint8_t fullRange;
+
+ // default color aspects
+ VuiColorAspects()
+ : primaries(2), transfer(2), coeffs(2), fullRange(0) { }
+
+ bool operator==(const VuiColorAspects &o) {
+ return primaries == o.primaries && transfer == o.transfer && coeffs == o.coeffs
+ && fullRange == o.fullRange;
+ }
+ } mBitstreamColorAspects;
+
+ // profile
+ struct timeval mTimeStart;
+ struct timeval mTimeEnd;
+#ifdef FILE_DUMP_ENABLE
+ char mInFile[200];
+#endif /* FILE_DUMP_ENABLE */
+
+ C2_DO_NOT_COPY(C2SoftMpeg2Dec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_MPEG2_DEC_H_
diff --git a/media/codec2/components/mpeg4_h263/Android.bp b/media/codec2/components/mpeg4_h263/Android.bp
new file mode 100644
index 0000000..41e4f44
--- /dev/null
+++ b/media/codec2/components/mpeg4_h263/Android.bp
@@ -0,0 +1,66 @@
+cc_library_shared {
+ name: "libcodec2_soft_mpeg4dec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_signed-defaults",
+ ],
+
+ srcs: ["C2SoftMpeg4Dec.cpp"],
+
+ static_libs: ["libstagefright_m4vh263dec"],
+
+ cflags: [
+ "-DOSCL_IMPORT_REF=",
+ "-DMPEG4",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_h263dec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_signed-defaults",
+ ],
+
+ srcs: ["C2SoftMpeg4Dec.cpp"],
+
+ static_libs: ["libstagefright_m4vh263dec"],
+
+ cflags: [
+ "-DOSCL_IMPORT_REF=",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_mpeg4enc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_signed-defaults",
+ ],
+
+
+ srcs: ["C2SoftMpeg4Enc.cpp"],
+
+ static_libs: ["libstagefright_m4vh263enc"],
+
+ cflags: [
+ "-DMPEG4",
+ "-DOSCL_IMPORT_REF=",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_h263enc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_signed-defaults",
+ ],
+
+ srcs: ["C2SoftMpeg4Enc.cpp"],
+
+ static_libs: [ "libstagefright_m4vh263enc" ],
+
+ cflags: [
+ "-DOSCL_IMPORT_REF=",
+ ],
+}
diff --git a/media/codec2/components/mpeg4_h263/C2SoftMpeg4Dec.cpp b/media/codec2/components/mpeg4_h263/C2SoftMpeg4Dec.cpp
new file mode 100644
index 0000000..901f5ed
--- /dev/null
+++ b/media/codec2/components/mpeg4_h263/C2SoftMpeg4Dec.cpp
@@ -0,0 +1,746 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#ifdef MPEG4
+ #define LOG_TAG "C2SoftMpeg4Dec"
+#else
+ #define LOG_TAG "C2SoftH263Dec"
+#endif
+#include <log/log.h>
+
+#include <media/stagefright/foundation/AUtils.h>
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftMpeg4Dec.h"
+#include "mp4dec_api.h"
+
+namespace android {
+
+#ifdef MPEG4
+constexpr char COMPONENT_NAME[] = "c2.android.mpeg4.decoder";
+#else
+constexpr char COMPONENT_NAME[] = "c2.android.h263.decoder";
+#endif
+
+class C2SoftMpeg4Dec::IntfImpl : public SimpleInterface<void>::BaseParams {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : SimpleInterface<void>::BaseParams(
+ helper,
+ COMPONENT_NAME,
+ C2Component::KIND_DECODER,
+ C2Component::DOMAIN_VIDEO,
+#ifdef MPEG4
+ MEDIA_MIMETYPE_VIDEO_MPEG4
+#else
+ MEDIA_MIMETYPE_VIDEO_H263
+#endif
+ ) {
+ noPrivateBuffers(); // TODO: account for our buffers here
+ noInputReferences();
+ noOutputReferences();
+ noInputLatency();
+ noTimeStretch();
+
+ // TODO: output latency and reordering
+
+ addParameter(
+ DefineParam(mAttrib, C2_PARAMKEY_COMPONENT_ATTRIBUTES)
+ .withConstValue(new C2ComponentAttributesSetting(C2Component::ATTRIB_IS_TEMPORAL))
+ .build());
+
+ addParameter(
+ DefineParam(mSize, C2_PARAMKEY_PICTURE_SIZE)
+ .withDefault(new C2StreamPictureSizeInfo::output(0u, 176, 144))
+ .withFields({
+#ifdef MPEG4
+ C2F(mSize, width).inRange(2, 1920, 2),
+ C2F(mSize, height).inRange(2, 1088, 2),
+#else
+ C2F(mSize, width).inRange(2, 352, 2),
+ C2F(mSize, height).inRange(2, 288, 2),
+#endif
+ })
+ .withSetter(SizeSetter)
+ .build());
+
+#ifdef MPEG4
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_MP4V_SIMPLE, C2Config::LEVEL_MP4V_3))
+ .withFields({
+ C2F(mProfileLevel, profile).equalTo(
+ C2Config::PROFILE_MP4V_SIMPLE),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_MP4V_0,
+ C2Config::LEVEL_MP4V_0B,
+ C2Config::LEVEL_MP4V_1,
+ C2Config::LEVEL_MP4V_2,
+ C2Config::LEVEL_MP4V_3,
+ C2Config::LEVEL_MP4V_3B,
+ C2Config::LEVEL_MP4V_4,
+ C2Config::LEVEL_MP4V_4A,
+ C2Config::LEVEL_MP4V_5,
+ C2Config::LEVEL_MP4V_6})
+ })
+ .withSetter(ProfileLevelSetter, mSize)
+ .build());
+#else
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_H263_BASELINE, C2Config::LEVEL_H263_30))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ C2Config::PROFILE_H263_BASELINE,
+ C2Config::PROFILE_H263_ISWV2}),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_H263_10,
+ C2Config::LEVEL_H263_20,
+ C2Config::LEVEL_H263_30,
+ C2Config::LEVEL_H263_40,
+ C2Config::LEVEL_H263_45})
+ })
+ .withSetter(ProfileLevelSetter, mSize)
+ .build());
+#endif
+
+ addParameter(
+ DefineParam(mMaxSize, C2_PARAMKEY_MAX_PICTURE_SIZE)
+#ifdef MPEG4
+ .withDefault(new C2StreamMaxPictureSizeTuning::output(0u, 1920, 1088))
+#else
+ .withDefault(new C2StreamMaxPictureSizeTuning::output(0u, 352, 288))
+#endif
+ .withFields({
+#ifdef MPEG4
+ C2F(mSize, width).inRange(2, 1920, 2),
+ C2F(mSize, height).inRange(2, 1088, 2),
+#else
+ C2F(mSize, width).inRange(2, 352, 2),
+ C2F(mSize, height).inRange(2, 288, 2),
+#endif
+ })
+ .withSetter(MaxPictureSizeSetter, mSize)
+ .build());
+
+ addParameter(
+ DefineParam(mMaxInputSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+#ifdef MPEG4
+ .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, 1920 * 1088 * 3 / 2))
+#else
+ .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, 352 * 288 * 3 / 2))
+#endif
+ .withFields({
+ C2F(mMaxInputSize, value).any(),
+ })
+ .calculatedAs(MaxInputSizeSetter, mMaxSize)
+ .build());
+
+ C2ChromaOffsetStruct locations[1] = { C2ChromaOffsetStruct::ITU_YUV_420_0() };
+ std::shared_ptr<C2StreamColorInfo::output> defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ 1u, 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ memcpy(defaultColorInfo->m.locations, locations, sizeof(locations));
+
+ defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ { C2ChromaOffsetStruct::ITU_YUV_420_0() },
+ 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ helper->addStructDescriptors<C2ChromaOffsetStruct>();
+
+ addParameter(
+ DefineParam(mColorInfo, C2_PARAMKEY_CODED_COLOR_INFO)
+ .withConstValue(defaultColorInfo)
+ .build());
+
+ // TODO: support more formats?
+ addParameter(
+ DefineParam(mPixelFormat, C2_PARAMKEY_PIXEL_FORMAT)
+ .withConstValue(new C2StreamPixelFormatInfo::output(
+ 0u, HAL_PIXEL_FORMAT_YCBCR_420_888))
+ .build());
+ }
+
+ static C2R SizeSetter(bool mayBlock, const C2P<C2StreamPictureSizeInfo::output> &oldMe,
+ C2P<C2VideoSizeStreamInfo::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+ me.set().width = oldMe.v.width;
+ }
+ if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
+ me.set().height = oldMe.v.height;
+ }
+ return res;
+ }
+
+ static C2R MaxPictureSizeSetter(bool mayBlock, C2P<C2StreamMaxPictureSizeTuning::output> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ // TODO: get max width/height from the size's field helpers vs. hardcoding
+#ifdef MPEG4
+ me.set().width = c2_min(c2_max(me.v.width, size.v.width), 1920u);
+ me.set().height = c2_min(c2_max(me.v.height, size.v.height), 1088u);
+#else
+ me.set().width = c2_min(c2_max(me.v.width, size.v.width), 352u);
+ me.set().height = c2_min(c2_max(me.v.height, size.v.height), 288u);
+#endif
+ return C2R::Ok();
+ }
+
+ static C2R MaxInputSizeSetter(bool mayBlock, C2P<C2StreamMaxBufferSizeInfo::input> &me,
+ const C2P<C2StreamMaxPictureSizeTuning::output> &maxSize) {
+ (void)mayBlock;
+ // assume compression ratio of 1
+ me.set().value = (((maxSize.v.width + 15) / 16) * ((maxSize.v.height + 15) / 16) * 384);
+ return C2R::Ok();
+ }
+
+ static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::input> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ (void)size;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+
+ uint32_t getMaxWidth() const { return mMaxSize->width; }
+ uint32_t getMaxHeight() const { return mMaxSize->height; }
+
+private:
+ std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
+ std::shared_ptr<C2StreamPictureSizeInfo::output> mSize;
+ std::shared_ptr<C2StreamMaxPictureSizeTuning::output> mMaxSize;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mMaxInputSize;
+ std::shared_ptr<C2StreamColorInfo::output> mColorInfo;
+ std::shared_ptr<C2StreamPixelFormatInfo::output> mPixelFormat;
+};
+
+C2SoftMpeg4Dec::C2SoftMpeg4Dec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mDecHandle(nullptr),
+ mOutputBuffer{},
+ mInitialized(false) {
+}
+
+C2SoftMpeg4Dec::~C2SoftMpeg4Dec() {
+ onRelease();
+}
+
+c2_status_t C2SoftMpeg4Dec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+c2_status_t C2SoftMpeg4Dec::onStop() {
+ if (mInitialized) {
+ if (mDecHandle) {
+ PVCleanUpVideoDecoder(mDecHandle);
+ }
+ mInitialized = false;
+ }
+ for (int32_t i = 0; i < kNumOutputBuffers; ++i) {
+ if (mOutputBuffer[i]) {
+ free(mOutputBuffer[i]);
+ mOutputBuffer[i] = nullptr;
+ }
+ }
+ mNumSamplesOutput = 0;
+ mFramesConfigured = false;
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+
+ return C2_OK;
+}
+
+void C2SoftMpeg4Dec::onReset() {
+ (void)onStop();
+ (void)onInit();
+}
+
+void C2SoftMpeg4Dec::onRelease() {
+ if (mInitialized) {
+ if (mDecHandle) {
+ PVCleanUpVideoDecoder(mDecHandle);
+ delete mDecHandle;
+ mDecHandle = nullptr;
+ }
+ mInitialized = false;
+ }
+ if (mOutBlock) {
+ mOutBlock.reset();
+ }
+ for (int32_t i = 0; i < kNumOutputBuffers; ++i) {
+ if (mOutputBuffer[i]) {
+ free(mOutputBuffer[i]);
+ mOutputBuffer[i] = nullptr;
+ }
+ }
+}
+
+c2_status_t C2SoftMpeg4Dec::onFlush_sm() {
+ if (mInitialized) {
+ if (PV_TRUE != PVResetVideoDecoder(mDecHandle)) {
+ return C2_CORRUPTED;
+ }
+ }
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+ return C2_OK;
+}
+
+status_t C2SoftMpeg4Dec::initDecoder() {
+#ifdef MPEG4
+ mIsMpeg4 = true;
+#else
+ mIsMpeg4 = false;
+#endif
+ if (!mDecHandle) {
+ mDecHandle = new tagvideoDecControls;
+ }
+ if (!mDecHandle) {
+ ALOGE("mDecHandle is null");
+ return NO_MEMORY;
+ }
+ memset(mDecHandle, 0, sizeof(tagvideoDecControls));
+
+ /* TODO: bring these values to 352 and 288. It cannot be done as of now
+ * because, h263 doesn't seem to allow port reconfiguration. In OMX, the
+ * problem of larger width and height than default width and height is
+ * overcome by adaptivePlayBack() api call. This call gets width and height
+ * information from extractor. Such a thing is not possible here.
+ * So we are configuring to larger values.*/
+ mWidth = 1408;
+ mHeight = 1152;
+ mNumSamplesOutput = 0;
+ mInitialized = false;
+ mFramesConfigured = false;
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+
+ return OK;
+}
+
+void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+void C2SoftMpeg4Dec::finishWork(uint64_t index, const std::unique_ptr<C2Work> &work) {
+ std::shared_ptr<C2Buffer> buffer = createGraphicBuffer(std::move(mOutBlock),
+ C2Rect(mWidth, mHeight));
+ mOutBlock = nullptr;
+ auto fillWork = [buffer, index](const std::unique_ptr<C2Work> &work) {
+ uint32_t flags = 0;
+ if ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) &&
+ (c2_cntr64_t(index) == work->input.ordinal.frameIndex)) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(buffer);
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ };
+ if (work && c2_cntr64_t(index) == work->input.ordinal.frameIndex) {
+ fillWork(work);
+ } else {
+ finish(index, fillWork);
+ }
+}
+
+c2_status_t C2SoftMpeg4Dec::ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool) {
+ if (!mDecHandle) {
+ ALOGE("not supposed to be here, invalid decoder context");
+ return C2_CORRUPTED;
+ }
+
+ mOutputBufferSize = align(mIntf->getMaxWidth(), 16) * align(mIntf->getMaxHeight(), 16) * 3 / 2;
+ for (int32_t i = 0; i < kNumOutputBuffers; ++i) {
+ if (!mOutputBuffer[i]) {
+ mOutputBuffer[i] = (uint8_t *)malloc(mOutputBufferSize);
+ if (!mOutputBuffer[i]) {
+ return C2_NO_MEMORY;
+ }
+ }
+ }
+ if (mOutBlock &&
+ (mOutBlock->width() != align(mWidth, 16) || mOutBlock->height() != mHeight)) {
+ mOutBlock.reset();
+ }
+ if (!mOutBlock) {
+ uint32_t format = HAL_PIXEL_FORMAT_YV12;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchGraphicBlock(align(mWidth, 16), mHeight, format, usage, &mOutBlock);
+ if (err != C2_OK) {
+ ALOGE("fetchGraphicBlock for Output failed with status %d", err);
+ return err;
+ }
+ ALOGV("provided (%dx%d) required (%dx%d)",
+ mOutBlock->width(), mOutBlock->height(), mWidth, mHeight);
+ }
+ return C2_OK;
+}
+
+bool C2SoftMpeg4Dec::handleResChange(const std::unique_ptr<C2Work> &work) {
+ uint32_t disp_width, disp_height;
+ PVGetVideoDimensions(mDecHandle, (int32 *)&disp_width, (int32 *)&disp_height);
+
+ uint32_t buf_width, buf_height;
+ PVGetBufferDimensions(mDecHandle, (int32 *)&buf_width, (int32 *)&buf_height);
+
+ CHECK_LE(disp_width, buf_width);
+ CHECK_LE(disp_height, buf_height);
+
+ ALOGV("display size (%dx%d), buffer size (%dx%d)",
+ disp_width, disp_height, buf_width, buf_height);
+
+ bool resChanged = false;
+ if (disp_width != mWidth || disp_height != mHeight) {
+ mWidth = disp_width;
+ mHeight = disp_height;
+ resChanged = true;
+ for (int32_t i = 0; i < kNumOutputBuffers; ++i) {
+ if (mOutputBuffer[i]) {
+ free(mOutputBuffer[i]);
+ mOutputBuffer[i] = nullptr;
+ }
+ }
+
+ if (!mIsMpeg4) {
+ PVCleanUpVideoDecoder(mDecHandle);
+
+ uint8_t *vol_data[1]{};
+ int32_t vol_size = 0;
+
+ if (!PVInitVideoDecoder(
+ mDecHandle, vol_data, &vol_size, 1, mIntf->getMaxWidth(), mIntf->getMaxHeight(), H263_MODE)) {
+ ALOGE("Error in PVInitVideoDecoder H263_MODE while resChanged was set to true");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return true;
+ }
+ }
+ mFramesConfigured = false;
+ }
+ return resChanged;
+}
+
+/* TODO: can remove temporary copy after library supports writing to display
+ * buffer Y, U and V plane pointers using stride info. */
+static void copyOutputBufferToYV12Frame(uint8_t *dst, uint8_t *src, size_t dstYStride,
+ size_t srcYStride, uint32_t width, uint32_t height) {
+ size_t dstUVStride = align(dstYStride / 2, 16);
+ size_t srcUVStride = srcYStride / 2;
+ uint8_t *srcStart = src;
+ uint8_t *dstStart = dst;
+ size_t vStride = align(height, 16);
+ for (size_t i = 0; i < height; ++i) {
+ memcpy(dst, src, width);
+ src += srcYStride;
+ dst += dstYStride;
+ }
+ /* U buffer */
+ src = srcStart + vStride * srcYStride;
+ dst = dstStart + (dstYStride * height) + (dstUVStride * height / 2);
+ for (size_t i = 0; i < height / 2; ++i) {
+ memcpy(dst, src, width / 2);
+ src += srcUVStride;
+ dst += dstUVStride;
+ }
+ /* V buffer */
+ src = srcStart + vStride * srcYStride * 5 / 4;
+ dst = dstStart + (dstYStride * height);
+ for (size_t i = 0; i < height / 2; ++i) {
+ memcpy(dst, src, width / 2);
+ src += srcUVStride;
+ dst += dstUVStride;
+ }
+}
+
+void C2SoftMpeg4Dec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ uint32_t workIndex = work->input.ordinal.frameIndex.peeku() & 0xFFFFFFFF;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x",
+ inSize, (int)work->input.ordinal.timestamp.peeku(),
+ (int)work->input.ordinal.frameIndex.peeku(), work->input.flags);
+
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ if (inSize == 0) {
+ fillEmptyWork(work);
+ if (eos) {
+ mSignalledOutputEos = true;
+ }
+ return;
+ }
+
+ uint8_t *bitstream = const_cast<uint8_t *>(rView.data() + inOffset);
+ uint32_t *start_code = (uint32_t *)bitstream;
+ bool volHeader = *start_code == 0xB0010000;
+ if (volHeader) {
+ PVCleanUpVideoDecoder(mDecHandle);
+ mInitialized = false;
+ }
+
+ if (!mInitialized) {
+ uint8_t *vol_data[1]{};
+ int32_t vol_size = 0;
+
+ bool codecConfig = (work->input.flags & C2FrameData::FLAG_CODEC_CONFIG) != 0;
+ if (codecConfig || volHeader) {
+ vol_data[0] = bitstream;
+ vol_size = inSize;
+ }
+ MP4DecodingMode mode = (mIsMpeg4) ? MPEG4_MODE : H263_MODE;
+ if (!PVInitVideoDecoder(
+ mDecHandle, vol_data, &vol_size, 1,
+ mIntf->getMaxWidth(), mIntf->getMaxHeight(), mode)) {
+ ALOGE("PVInitVideoDecoder failed. Unsupported content?");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ mInitialized = true;
+ MP4DecodingMode actualMode = PVGetDecBitstreamMode(mDecHandle);
+ if (mode != actualMode) {
+ ALOGE("Decoded mode not same as actual mode of the decoder");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ PVSetPostProcType(mDecHandle, 0);
+ if (handleResChange(work)) {
+ ALOGI("Setting width and height");
+ C2VideoSizeStreamInfo::output size(0u, mWidth, mHeight);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config({&size}, C2_MAY_BLOCK, &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(size));
+ } else {
+ ALOGE("Config update size failed");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ if (codecConfig) {
+ fillEmptyWork(work);
+ return;
+ }
+ }
+
+ size_t inPos = 0;
+ while (inPos < inSize) {
+ c2_status_t err = ensureDecoderState(pool);
+ if (C2_OK != err) {
+ mSignalledError = true;
+ work->result = err;
+ return;
+ }
+ C2GraphicView wView = mOutBlock->map().get();
+ if (wView.error()) {
+ ALOGE("graphic view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ uint32_t yFrameSize = sizeof(uint8) * mDecHandle->size;
+ if (mOutputBufferSize < yFrameSize * 3 / 2){
+ ALOGE("Too small output buffer: %zu bytes", mOutputBufferSize);
+ mSignalledError = true;
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+
+ if (!mFramesConfigured) {
+ PVSetReferenceYUV(mDecHandle,mOutputBuffer[1]);
+ mFramesConfigured = true;
+ }
+
+ // Need to check if header contains new info, e.g., width/height, etc.
+ VopHeaderInfo header_info;
+ uint32_t useExtTimestamp = (inPos == 0);
+ int32_t tmpInSize = (int32_t)inSize;
+ uint8_t *bitstreamTmp = bitstream;
+ uint32_t timestamp = workIndex;
+ if (PVDecodeVopHeader(
+ mDecHandle, &bitstreamTmp, ×tamp, &tmpInSize,
+ &header_info, &useExtTimestamp,
+ mOutputBuffer[mNumSamplesOutput & 1]) != PV_TRUE) {
+ ALOGE("failed to decode vop header.");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ // H263 doesn't have VOL header, the frame size information is in short header, i.e. the
+ // decoder may detect size change after PVDecodeVopHeader.
+ bool resChange = handleResChange(work);
+ if (mIsMpeg4 && resChange) {
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ } else if (resChange) {
+ ALOGI("Setting width and height");
+ C2VideoSizeStreamInfo::output size(0u, mWidth, mHeight);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config({&size}, C2_MAY_BLOCK, &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(C2Param::Copy(size));
+ } else {
+ ALOGE("Config update size failed");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ continue;
+ }
+
+ if (PVDecodeVopBody(mDecHandle, &tmpInSize) != PV_TRUE) {
+ ALOGE("failed to decode video frame.");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ if (handleResChange(work)) {
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ uint8_t *outputBufferY = wView.data()[C2PlanarLayout::PLANE_Y];
+ (void)copyOutputBufferToYV12Frame(outputBufferY, mOutputBuffer[mNumSamplesOutput & 1],
+ wView.width(), align(mWidth, 16), mWidth, mHeight);
+
+ inPos += inSize - (size_t)tmpInSize;
+ finishWork(workIndex, work);
+ ++mNumSamplesOutput;
+ if (inSize - inPos != 0) {
+ ALOGD("decoded frame, ignoring further trailing bytes %d",
+ (int)inSize - (int)inPos);
+ break;
+ }
+ }
+}
+
+c2_status_t C2SoftMpeg4Dec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void)pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+ return C2_OK;
+}
+
+class C2SoftMpeg4DecFactory : public C2ComponentFactory {
+public:
+ C2SoftMpeg4DecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftMpeg4Dec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftMpeg4Dec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftMpeg4Dec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftMpeg4Dec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftMpeg4DecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftMpeg4DecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/mpeg4_h263/C2SoftMpeg4Dec.h b/media/codec2/components/mpeg4_h263/C2SoftMpeg4Dec.h
new file mode 100644
index 0000000..716a095
--- /dev/null
+++ b/media/codec2/components/mpeg4_h263/C2SoftMpeg4Dec.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2_SOFT_MPEG4_DEC_H_
+#define C2_SOFT_MPEG4_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+struct tagvideoDecControls;
+
+namespace android {
+
+struct C2SoftMpeg4Dec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftMpeg4Dec(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+ virtual ~C2SoftMpeg4Dec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ private:
+ enum {
+ kNumOutputBuffers = 2,
+ };
+
+ status_t initDecoder();
+ c2_status_t ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool);
+ void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work);
+ bool handleResChange(const std::unique_ptr<C2Work> &work);
+
+ std::shared_ptr<IntfImpl> mIntf;
+ tagvideoDecControls *mDecHandle;
+ std::shared_ptr<C2GraphicBlock> mOutBlock;
+ uint8_t *mOutputBuffer[kNumOutputBuffers];
+ size_t mOutputBufferSize;
+
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint32_t mNumSamplesOutput;
+
+ bool mIsMpeg4;
+ bool mInitialized;
+ bool mFramesConfigured;
+ bool mSignalledOutputEos;
+ bool mSignalledError;
+
+ C2_DO_NOT_COPY(C2SoftMpeg4Dec);
+};
+
+} // namespace android
+
+#endif // C2_SOFT_MPEG4_DEC_H_
diff --git a/media/codec2/components/mpeg4_h263/C2SoftMpeg4Enc.cpp b/media/codec2/components/mpeg4_h263/C2SoftMpeg4Enc.cpp
new file mode 100644
index 0000000..c8796f3
--- /dev/null
+++ b/media/codec2/components/mpeg4_h263/C2SoftMpeg4Enc.cpp
@@ -0,0 +1,671 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#ifdef MPEG4
+ #define LOG_TAG "C2SoftMpeg4Enc"
+#else
+ #define LOG_TAG "C2SoftH263Enc"
+#endif
+#include <log/log.h>
+
+#include <inttypes.h>
+
+#include <media/hardware/VideoAPI.h>
+#include <media/stagefright/foundation/AUtils.h>
+#include <media/stagefright/MediaDefs.h>
+#include <utils/misc.h>
+
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+#include <util/C2InterfaceHelper.h>
+
+#include "C2SoftMpeg4Enc.h"
+#include "mp4enc_api.h"
+
+namespace android {
+
+#ifdef MPEG4
+constexpr char COMPONENT_NAME[] = "c2.android.mpeg4.encoder";
+#else
+constexpr char COMPONENT_NAME[] = "c2.android.h263.encoder";
+#endif
+
+class C2SoftMpeg4Enc::IntfImpl : public C2InterfaceHelper {
+ public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper>& helper)
+ : C2InterfaceHelper(helper) {
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(
+ new C2StreamFormatConfig::input(0u, C2FormatVideo))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(
+ new C2StreamFormatConfig::output(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_VIDEO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+#ifdef MPEG4
+ MEDIA_MIMETYPE_VIDEO_MPEG4
+#else
+ MEDIA_MIMETYPE_VIDEO_H263
+#endif
+ ))
+ .build());
+
+ addParameter(DefineParam(mUsage, C2_NAME_INPUT_STREAM_USAGE_SETTING)
+ .withConstValue(new C2StreamUsageTuning::input(
+ 0u, (uint64_t)C2MemoryUsage::CPU_READ))
+ .build());
+
+ addParameter(
+ DefineParam(mSize, C2_NAME_STREAM_VIDEO_SIZE_SETTING)
+ .withDefault(new C2VideoSizeStreamTuning::input(0u, 176, 144))
+ .withFields({
+#ifdef MPEG4
+ C2F(mSize, width).inRange(16, 176, 16),
+ C2F(mSize, height).inRange(16, 144, 16),
+#else
+ C2F(mSize, width).oneOf({176, 352}),
+ C2F(mSize, height).oneOf({144, 288}),
+#endif
+ })
+ .withSetter(SizeSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mFrameRate, C2_NAME_STREAM_FRAME_RATE_SETTING)
+ .withDefault(new C2StreamFrameRateInfo::output(0u, 17.))
+ // TODO: More restriction?
+ .withFields({C2F(mFrameRate, value).greaterThan(0.)})
+ .withSetter(
+ Setter<decltype(*mFrameRate)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::output(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(4096, 12000000)})
+ .withSetter(BitrateSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mSyncFramePeriod, C2_PARAMKEY_SYNC_FRAME_INTERVAL)
+ .withDefault(new C2StreamSyncFrameIntervalTuning::output(0u, 1000000))
+ .withFields({C2F(mSyncFramePeriod, value).any()})
+ .withSetter(Setter<decltype(*mSyncFramePeriod)>::StrictValueWithNoDeps)
+ .build());
+
+#ifdef MPEG4
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::output(
+ 0u, PROFILE_MP4V_SIMPLE, LEVEL_MP4V_2))
+ .withFields({
+ C2F(mProfileLevel, profile).equalTo(
+ PROFILE_MP4V_SIMPLE),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_MP4V_0,
+ C2Config::LEVEL_MP4V_0B,
+ C2Config::LEVEL_MP4V_1,
+ C2Config::LEVEL_MP4V_2})
+ })
+ .withSetter(ProfileLevelSetter)
+ .build());
+#else
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::output(
+ 0u, PROFILE_H263_BASELINE, LEVEL_H263_45))
+ .withFields({
+ C2F(mProfileLevel, profile).equalTo(
+ PROFILE_H263_BASELINE),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_H263_10,
+ C2Config::LEVEL_H263_20,
+ C2Config::LEVEL_H263_30,
+ C2Config::LEVEL_H263_40,
+ C2Config::LEVEL_H263_45})
+ })
+ .withSetter(ProfileLevelSetter)
+ .build());
+#endif
+ }
+
+ static C2R BitrateSetter(bool mayBlock, C2P<C2StreamBitrateInfo::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (me.v.value <= 4096) {
+ me.set().value = 4096;
+ }
+ return res;
+ }
+
+ static C2R SizeSetter(bool mayBlock, const C2P<C2StreamPictureSizeInfo::input> &oldMe,
+ C2P<C2StreamPictureSizeInfo::input> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+ me.set().width = oldMe.v.width;
+ }
+ if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
+ me.set().height = oldMe.v.height;
+ }
+ return res;
+ }
+
+ static C2R ProfileLevelSetter(
+ bool mayBlock,
+ C2P<C2StreamProfileLevelInfo::output> &me) {
+ (void)mayBlock;
+ if (!me.F(me.v.profile).supportsAtAll(me.v.profile)) {
+#ifdef MPEG4
+ me.set().profile = PROFILE_MP4V_SIMPLE;
+#else
+ me.set().profile = PROFILE_H263_BASELINE;
+#endif
+ }
+ if (!me.F(me.v.level).supportsAtAll(me.v.level)) {
+#ifdef MPEG4
+ me.set().level = LEVEL_MP4V_2;
+#else
+ me.set().level = LEVEL_H263_45;
+#endif
+ }
+ return C2R::Ok();
+ }
+
+ // unsafe getters
+ std::shared_ptr<C2StreamPictureSizeInfo::input> getSize_l() const { return mSize; }
+ std::shared_ptr<C2StreamFrameRateInfo::output> getFrameRate_l() const { return mFrameRate; }
+ std::shared_ptr<C2StreamBitrateInfo::output> getBitrate_l() const { return mBitrate; }
+ uint32_t getSyncFramePeriod() const {
+ if (mSyncFramePeriod->value < 0 || mSyncFramePeriod->value == INT64_MAX) {
+ return 0;
+ }
+ double period = mSyncFramePeriod->value / 1e6 * mFrameRate->value;
+ return (uint32_t)c2_max(c2_min(period + 0.5, double(UINT32_MAX)), 1.);
+ }
+
+ private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamUsageTuning::input> mUsage;
+ std::shared_ptr<C2VideoSizeStreamTuning::input> mSize;
+ std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
+ std::shared_ptr<C2BitrateTuning::output> mBitrate;
+ std::shared_ptr<C2StreamProfileLevelInfo::output> mProfileLevel;
+ std::shared_ptr<C2StreamSyncFrameIntervalTuning::output> mSyncFramePeriod;
+};
+
+C2SoftMpeg4Enc::C2SoftMpeg4Enc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl)
+ : SimpleC2Component(
+ std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mHandle(nullptr),
+ mEncParams(nullptr),
+ mStarted(false),
+ mOutBufferSize(524288) {
+}
+
+C2SoftMpeg4Enc::~C2SoftMpeg4Enc() {
+ onRelease();
+}
+
+c2_status_t C2SoftMpeg4Enc::onInit() {
+#ifdef MPEG4
+ mEncodeMode = COMBINE_MODE_WITH_ERR_RES;
+#else
+ mEncodeMode = H263_MODE;
+#endif
+ if (!mHandle) {
+ mHandle = new tagvideoEncControls;
+ }
+
+ if (!mEncParams) {
+ mEncParams = new tagvideoEncOptions;
+ }
+
+ if (!(mEncParams && mHandle)) return C2_NO_MEMORY;
+
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+
+ return initEncoder();
+}
+
+c2_status_t C2SoftMpeg4Enc::onStop() {
+ if (!mStarted) {
+ return C2_OK;
+ }
+ if (mHandle) {
+ (void)PVCleanUpVideoEncoder(mHandle);
+ }
+ mStarted = false;
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+ return C2_OK;
+}
+
+void C2SoftMpeg4Enc::onReset() {
+ onStop();
+ initEncoder();
+}
+
+void C2SoftMpeg4Enc::onRelease() {
+ onStop();
+ if (mEncParams) {
+ delete mEncParams;
+ mEncParams = nullptr;
+ }
+ if (mHandle) {
+ delete mHandle;
+ mHandle = nullptr;
+ }
+}
+
+c2_status_t C2SoftMpeg4Enc::onFlush_sm() {
+ return C2_OK;
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+c2_status_t C2SoftMpeg4Enc::initEncParams() {
+ if (mHandle) {
+ memset(mHandle, 0, sizeof(tagvideoEncControls));
+ } else return C2_CORRUPTED;
+ if (mEncParams) {
+ memset(mEncParams, 0, sizeof(tagvideoEncOptions));
+ } else return C2_CORRUPTED;
+
+ if (!PVGetDefaultEncOption(mEncParams, 0)) {
+ ALOGE("Failed to get default encoding parameters");
+ return C2_CORRUPTED;
+ }
+
+ if (mFrameRate->value == 0) {
+ ALOGE("Framerate should not be 0");
+ return C2_BAD_VALUE;
+ }
+
+ mEncParams->encMode = mEncodeMode;
+ mEncParams->encWidth[0] = mSize->width;
+ mEncParams->encHeight[0] = mSize->height;
+ mEncParams->encFrameRate[0] = mFrameRate->value + 0.5;
+ mEncParams->rcType = VBR_1;
+ mEncParams->vbvDelay = 5.0f;
+ mEncParams->profile_level = CORE_PROFILE_LEVEL2;
+ mEncParams->packetSize = 32;
+ mEncParams->rvlcEnable = PV_OFF;
+ mEncParams->numLayers = 1;
+ mEncParams->timeIncRes = 1000;
+ mEncParams->tickPerSrc = mEncParams->timeIncRes / (mFrameRate->value + 0.5);
+ mEncParams->bitRate[0] = mBitrate->value;
+ mEncParams->iQuant[0] = 15;
+ mEncParams->pQuant[0] = 12;
+ mEncParams->quantType[0] = 0;
+ mEncParams->noFrameSkipped = PV_OFF;
+
+ // PV's MPEG4 encoder requires the video dimension of multiple
+ if (mSize->width % 16 != 0 || mSize->height % 16 != 0) {
+ ALOGE("Video frame size %dx%d must be a multiple of 16",
+ mSize->width, mSize->height);
+ return C2_BAD_VALUE;
+ }
+
+ // Set IDR frame refresh interval
+ mEncParams->intraPeriod = mIntf->getSyncFramePeriod();
+ mEncParams->numIntraMB = 0;
+ mEncParams->sceneDetect = PV_ON;
+ mEncParams->searchRange = 16;
+ mEncParams->mv8x8Enable = PV_OFF;
+ mEncParams->gobHeaderInterval = 0;
+ mEncParams->useACPred = PV_ON;
+ mEncParams->intraDCVlcTh = 0;
+
+ return C2_OK;
+}
+
+c2_status_t C2SoftMpeg4Enc::initEncoder() {
+ if (mStarted) {
+ return C2_OK;
+ }
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ mSize = mIntf->getSize_l();
+ mBitrate = mIntf->getBitrate_l();
+ mFrameRate = mIntf->getFrameRate_l();
+ }
+ c2_status_t err = initEncParams();
+ if (C2_OK != err) {
+ ALOGE("Failed to initialized encoder params");
+ mSignalledError = true;
+ return err;
+ }
+ if (!PVInitVideoEncoder(mHandle, mEncParams)) {
+ ALOGE("Failed to initialize the encoder");
+ mSignalledError = true;
+ return C2_CORRUPTED;
+ }
+
+ // 1st buffer for codec specific data
+ mNumInputFrames = -1;
+ mStarted = true;
+ return C2_OK;
+}
+
+void C2SoftMpeg4Enc::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ // Initialize encoder if not already initialized
+ if (!mStarted && C2_OK != initEncoder()) {
+ ALOGE("Failed to initialize encoder");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(mOutBufferSize, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+
+ uint8_t *outPtr = (uint8_t *)wView.data();
+ if (mNumInputFrames < 0) {
+ // The very first thing we want to output is the codec specific data.
+ int32_t outputSize = mOutBufferSize;
+ if (!PVGetVolHeader(mHandle, outPtr, &outputSize, 0)) {
+ ALOGE("Failed to get VOL header");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ } else {
+ ALOGV("Bytes Generated in header %d\n", outputSize);
+ }
+
+ ++mNumInputFrames;
+ std::unique_ptr<C2StreamCsdInfo::output> csd =
+ C2StreamCsdInfo::output::AllocUnique(outputSize, 0u);
+ if (!csd) {
+ ALOGE("CSD allocation failed");
+ mSignalledError = true;
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ memcpy(csd->m.value, outPtr, outputSize);
+ work->worklets.front()->output.configUpdate.push_back(std::move(csd));
+ }
+
+ std::shared_ptr<const C2GraphicView> rView;
+ std::shared_ptr<C2Buffer> inputBuffer;
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ if (!work->input.buffers.empty()) {
+ inputBuffer = work->input.buffers[0];
+ rView = std::make_shared<const C2GraphicView>(
+ inputBuffer->data().graphicBlocks().front().map().get());
+ if (rView->error() != C2_OK) {
+ ALOGE("graphic view map err = %d", rView->error());
+ work->result = rView->error();
+ return;
+ }
+ } else {
+ fillEmptyWork(work);
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+
+ uint64_t inputTimeStamp = work->input.ordinal.timestamp.peekull();
+ const C2ConstGraphicBlock inBuffer = inputBuffer->data().graphicBlocks().front();
+ if (inBuffer.width() < mSize->width ||
+ inBuffer.height() < mSize->height) {
+ /* Expect width height to be configured */
+ ALOGW("unexpected Capacity Aspect %d(%d) x %d(%d)", inBuffer.width(),
+ mSize->width, inBuffer.height(), mSize->height);
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ const C2PlanarLayout &layout = rView->layout();
+ uint8_t *yPlane = const_cast<uint8_t *>(rView->data()[C2PlanarLayout::PLANE_Y]);
+ uint8_t *uPlane = const_cast<uint8_t *>(rView->data()[C2PlanarLayout::PLANE_U]);
+ uint8_t *vPlane = const_cast<uint8_t *>(rView->data()[C2PlanarLayout::PLANE_V]);
+ int32_t yStride = layout.planes[C2PlanarLayout::PLANE_Y].rowInc;
+ int32_t uStride = layout.planes[C2PlanarLayout::PLANE_U].rowInc;
+ int32_t vStride = layout.planes[C2PlanarLayout::PLANE_V].rowInc;
+ uint32_t width = mSize->width;
+ uint32_t height = mSize->height;
+ // width and height are always even (as block size is 16x16)
+ CHECK_EQ((width & 1u), 0u);
+ CHECK_EQ((height & 1u), 0u);
+ size_t yPlaneSize = width * height;
+ switch (layout.type) {
+ case C2PlanarLayout::TYPE_RGB:
+ [[fallthrough]];
+ case C2PlanarLayout::TYPE_RGBA: {
+ MemoryBlock conversionBuffer = mConversionBuffers.fetch(yPlaneSize * 3 / 2);
+ mConversionBuffersInUse.emplace(conversionBuffer.data(), conversionBuffer);
+ yPlane = conversionBuffer.data();
+ uPlane = yPlane + yPlaneSize;
+ vPlane = uPlane + yPlaneSize / 4;
+ yStride = width;
+ uStride = vStride = width / 2;
+ ConvertRGBToPlanarYUV(yPlane, yStride, height, conversionBuffer.size(), *rView.get());
+ break;
+ }
+ case C2PlanarLayout::TYPE_YUV: {
+ if (!IsYUV420(*rView)) {
+ ALOGE("input is not YUV420");
+ work->result = C2_BAD_VALUE;
+ break;
+ }
+
+ if (layout.planes[layout.PLANE_Y].colInc == 1
+ && layout.planes[layout.PLANE_U].colInc == 1
+ && layout.planes[layout.PLANE_V].colInc == 1
+ && uStride == vStride
+ && yStride == 2 * vStride) {
+ // I420 compatible - planes are already set up above
+ break;
+ }
+
+ // copy to I420
+ MemoryBlock conversionBuffer = mConversionBuffers.fetch(yPlaneSize * 3 / 2);
+ mConversionBuffersInUse.emplace(conversionBuffer.data(), conversionBuffer);
+ MediaImage2 img = CreateYUV420PlanarMediaImage2(width, height, width, height);
+ status_t err = ImageCopy(conversionBuffer.data(), &img, *rView);
+ if (err != OK) {
+ ALOGE("Buffer conversion failed: %d", err);
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+ yPlane = conversionBuffer.data();
+ uPlane = yPlane + yPlaneSize;
+ vPlane = uPlane + yPlaneSize / 4;
+ yStride = width;
+ uStride = vStride = width / 2;
+ break;
+ }
+
+ case C2PlanarLayout::TYPE_YUVA:
+ ALOGE("YUVA plane type is not supported");
+ work->result = C2_BAD_VALUE;
+ return;
+
+ default:
+ ALOGE("Unrecognized plane type: %d", layout.type);
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ CHECK(NULL != yPlane);
+ /* Encode frames */
+ VideoEncFrameIO vin, vout;
+ memset(&vin, 0, sizeof(vin));
+ memset(&vout, 0, sizeof(vout));
+ vin.yChan = yPlane;
+ vin.uChan = uPlane;
+ vin.vChan = vPlane;
+ vin.timestamp = (inputTimeStamp + 500) / 1000; // in ms
+ vin.height = align(height, 16);
+ vin.pitch = align(width, 16);
+
+ uint32_t modTimeMs = 0;
+ int32_t nLayer = 0;
+ MP4HintTrack hintTrack;
+ int32_t outputSize = mOutBufferSize;
+ if (!PVEncodeVideoFrame(mHandle, &vin, &vout, &modTimeMs, outPtr, &outputSize, &nLayer) ||
+ !PVGetHintTrack(mHandle, &hintTrack)) {
+ ALOGE("Failed to encode frame or get hint track at frame %" PRId64, mNumInputFrames);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ ALOGV("outputSize filled : %d", outputSize);
+ ++mNumInputFrames;
+ CHECK(NULL == PVGetOverrunBuffer(mHandle));
+
+ fillEmptyWork(work);
+ if (outputSize) {
+ std::shared_ptr<C2Buffer> buffer = createLinearBuffer(block, 0, outputSize);
+ work->worklets.front()->output.ordinal.timestamp = inputTimeStamp;
+ if (hintTrack.CodeType == 0) {
+ buffer->setInfo(std::make_shared<C2StreamPictureTypeMaskInfo::output>(
+ 0u /* stream id */, C2PictureTypeKeyFrame));
+ }
+ work->worklets.front()->output.buffers.push_back(buffer);
+ }
+ if (eos) {
+ mSignalledOutputEos = true;
+ }
+
+ mConversionBuffersInUse.erase(yPlane);
+}
+
+c2_status_t C2SoftMpeg4Enc::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void)pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+class C2SoftMpeg4EncFactory : public C2ComponentFactory {
+public:
+ C2SoftMpeg4EncFactory()
+ : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {}
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftMpeg4Enc(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftMpeg4Enc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftMpeg4Enc::IntfImpl>(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftMpeg4Enc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftMpeg4EncFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftMpeg4EncFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/mpeg4_h263/C2SoftMpeg4Enc.h b/media/codec2/components/mpeg4_h263/C2SoftMpeg4Enc.h
new file mode 100644
index 0000000..43461fc
--- /dev/null
+++ b/media/codec2/components/mpeg4_h263/C2SoftMpeg4Enc.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2_SOFT_MPEG4_ENC_H__
+#define C2_SOFT_MPEG4_ENC_H__
+
+#include <map>
+
+#include <Codec2BufferUtils.h>
+#include <SimpleC2Component.h>
+
+#include "mp4enc_api.h"
+
+namespace android {
+
+struct C2SoftMpeg4Enc : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftMpeg4Enc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+protected:
+
+ virtual ~C2SoftMpeg4Enc();
+
+private:
+ std::shared_ptr<IntfImpl> mIntf;
+
+ tagvideoEncControls *mHandle;
+ tagvideoEncOptions *mEncParams;
+
+ bool mStarted;
+ bool mSignalledOutputEos;
+ bool mSignalledError;
+
+ uint32_t mOutBufferSize;
+ // configurations used by component in process
+ // (TODO: keep this in intf but make them internal only)
+ std::shared_ptr<C2StreamPictureSizeInfo::input> mSize;
+ std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
+ std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
+
+ int64_t mNumInputFrames;
+ MP4EncodingMode mEncodeMode;
+
+ MemoryBlockPool mConversionBuffers;
+ std::map<void *, MemoryBlock> mConversionBuffersInUse;
+
+ c2_status_t initEncParams();
+ c2_status_t initEncoder();
+
+ C2_DO_NOT_COPY(C2SoftMpeg4Enc);
+};
+
+} // namespace android
+
+#endif // C2_SOFT_MPEG4_ENC_H__
diff --git a/media/codec2/components/mpeg4_h263/MODULE_LICENSE_APACHE2 b/media/codec2/components/mpeg4_h263/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/mpeg4_h263/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/mpeg4_h263/NOTICE b/media/codec2/components/mpeg4_h263/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/mpeg4_h263/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/mpeg4_h263/patent_disclaimer.txt b/media/codec2/components/mpeg4_h263/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/codec2/components/mpeg4_h263/patent_disclaimer.txt
@@ -0,0 +1,9 @@
+
+THIS IS NOT A GRANT OF PATENT RIGHTS.
+
+Google makes no representation or warranty that the codecs for which
+source code is made available hereunder are unencumbered by
+third-party patents. Those intending to use this source code in
+hardware or software products are advised that implementations of
+these codecs, including in open source software or shareware, may
+require patent licenses from the relevant patent holders.
diff --git a/media/codec2/components/opus/Android.bp b/media/codec2/components/opus/Android.bp
new file mode 100644
index 0000000..240cdb9
--- /dev/null
+++ b/media/codec2/components/opus/Android.bp
@@ -0,0 +1,11 @@
+cc_library_shared {
+ name: "libcodec2_soft_opusdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftOpusDec.cpp"],
+
+ shared_libs: ["libopus"],
+}
diff --git a/media/codec2/components/opus/C2SoftOpusDec.cpp b/media/codec2/components/opus/C2SoftOpusDec.cpp
new file mode 100644
index 0000000..2439c3c
--- /dev/null
+++ b/media/codec2/components/opus/C2SoftOpusDec.cpp
@@ -0,0 +1,544 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftOpusDec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftOpusDec.h"
+
+extern "C" {
+ #include <opus.h>
+ #include <opus_multistream.h>
+}
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.opus.decoder";
+
+class C2SoftOpusDec::IntfImpl : public C2InterfaceHelper {
+ public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper>& helper)
+ : C2InterfaceHelper(helper) {
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_OPUS))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 48000))
+ .withFields({C2F(mSampleRate, value).equalTo(48000)})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 1))
+ .withFields({C2F(mChannelCount, value).inRange(1, 8)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 6000))
+ .withFields({C2F(mBitrate, value).inRange(6000, 510000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 960 * 6))
+ .build());
+ }
+
+ private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftOpusDec::C2SoftOpusDec(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl)
+ : SimpleC2Component(
+ std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mDecoder(nullptr) {
+}
+
+C2SoftOpusDec::~C2SoftOpusDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftOpusDec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_NO_MEMORY;
+}
+
+c2_status_t C2SoftOpusDec::onStop() {
+ if (mDecoder) {
+ opus_multistream_decoder_destroy(mDecoder);
+ mDecoder = nullptr;
+ }
+ memset(&mHeader, 0, sizeof(mHeader));
+ mCodecDelay = 0;
+ mSeekPreRoll = 0;
+ mSamplesToDiscard = 0;
+ mInputBufferCount = 0;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+
+ return C2_OK;
+}
+
+void C2SoftOpusDec::onReset() {
+ (void)onStop();
+}
+
+void C2SoftOpusDec::onRelease() {
+ if (mDecoder) {
+ opus_multistream_decoder_destroy(mDecoder);
+ mDecoder = nullptr;
+ }
+}
+
+status_t C2SoftOpusDec::initDecoder() {
+ memset(&mHeader, 0, sizeof(mHeader));
+ mCodecDelay = 0;
+ mSeekPreRoll = 0;
+ mSamplesToDiscard = 0;
+ mInputBufferCount = 0;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+
+ return OK;
+}
+
+c2_status_t C2SoftOpusDec::onFlush_sm() {
+ if (mDecoder) {
+ opus_multistream_decoder_ctl(mDecoder, OPUS_RESET_STATE);
+ mSamplesToDiscard = mSeekPreRoll;
+ mSignalledOutputEos = false;
+ }
+ return C2_OK;
+}
+
+c2_status_t C2SoftOpusDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+static uint16_t ReadLE16(const uint8_t *data, size_t data_size,
+ uint32_t read_offset) {
+ if (read_offset + 1 > data_size)
+ return 0;
+ uint16_t val;
+ val = data[read_offset];
+ val |= data[read_offset + 1] << 8;
+ return val;
+}
+
+static const int kRate = 48000;
+
+// Opus uses Vorbis channel mapping, and Vorbis channel mapping specifies
+// mappings for up to 8 channels. This information is part of the Vorbis I
+// Specification:
+// http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html
+static const int kMaxChannels = 8;
+
+// Maximum packet size used in Xiph's opusdec.
+static const int kMaxOpusOutputPacketSizeSamples = 960 * 6;
+
+// Default audio output channel layout. Used to initialize |stream_map| in
+// OpusHeader, and passed to opus_multistream_decoder_create() when the header
+// does not contain mapping information. The values are valid only for mono and
+// stereo output: Opus streams with more than 2 channels require a stream map.
+static const int kMaxChannelsWithDefaultLayout = 2;
+static const uint8_t kDefaultOpusChannelLayout[kMaxChannelsWithDefaultLayout] = { 0, 1 };
+
+// Parses Opus Header. Header spec: http://wiki.xiph.org/OggOpus#ID_Header
+static bool ParseOpusHeader(const uint8_t *data, size_t data_size,
+ OpusHeader* header) {
+ // Size of the Opus header excluding optional mapping information.
+ const size_t kOpusHeaderSize = 19;
+
+ // Offset to the channel count byte in the Opus header.
+ const size_t kOpusHeaderChannelsOffset = 9;
+
+ // Offset to the pre-skip value in the Opus header.
+ const size_t kOpusHeaderSkipSamplesOffset = 10;
+
+ // Offset to the gain value in the Opus header.
+ const size_t kOpusHeaderGainOffset = 16;
+
+ // Offset to the channel mapping byte in the Opus header.
+ const size_t kOpusHeaderChannelMappingOffset = 18;
+
+ // Opus Header contains a stream map. The mapping values are in the header
+ // beyond the always present |kOpusHeaderSize| bytes of data. The mapping
+ // data contains stream count, coupling information, and per channel mapping
+ // values:
+ // - Byte 0: Number of streams.
+ // - Byte 1: Number coupled.
+ // - Byte 2: Starting at byte 2 are |header->channels| uint8 mapping
+ // values.
+ const size_t kOpusHeaderNumStreamsOffset = kOpusHeaderSize;
+ const size_t kOpusHeaderNumCoupledOffset = kOpusHeaderNumStreamsOffset + 1;
+ const size_t kOpusHeaderStreamMapOffset = kOpusHeaderNumStreamsOffset + 2;
+
+ if (data_size < kOpusHeaderSize) {
+ ALOGE("Header size is too small.");
+ return false;
+ }
+ header->channels = *(data + kOpusHeaderChannelsOffset);
+ if (header->channels <= 0 || header->channels > kMaxChannels) {
+ ALOGE("Invalid Header, wrong channel count: %d", header->channels);
+ return false;
+ }
+
+ header->skip_samples = ReadLE16(data,
+ data_size,
+ kOpusHeaderSkipSamplesOffset);
+
+ header->gain_db = static_cast<int16_t>(ReadLE16(data,
+ data_size,
+ kOpusHeaderGainOffset));
+
+ header->channel_mapping = *(data + kOpusHeaderChannelMappingOffset);
+ if (!header->channel_mapping) {
+ if (header->channels > kMaxChannelsWithDefaultLayout) {
+ ALOGE("Invalid Header, missing stream map.");
+ return false;
+ }
+ header->num_streams = 1;
+ header->num_coupled = header->channels > 1;
+ header->stream_map[0] = 0;
+ header->stream_map[1] = 1;
+ return true;
+ }
+ if (data_size < kOpusHeaderStreamMapOffset + header->channels) {
+ ALOGE("Invalid stream map; insufficient data for current channel "
+ "count: %d", header->channels);
+ return false;
+ }
+ header->num_streams = *(data + kOpusHeaderNumStreamsOffset);
+ header->num_coupled = *(data + kOpusHeaderNumCoupledOffset);
+ if (header->num_streams + header->num_coupled != header->channels) {
+ ALOGE("Inconsistent channel mapping.");
+ return false;
+ }
+ for (int i = 0; i < header->channels; ++i)
+ header->stream_map[i] = *(data + kOpusHeaderStreamMapOffset + i);
+ return true;
+}
+
+// Convert nanoseconds to number of samples.
+static uint64_t ns_to_samples(uint64_t ns, int rate) {
+ return static_cast<double>(ns) * rate / 1000000000;
+}
+
+void C2SoftOpusDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ if (inSize == 0) {
+ fillEmptyWork(work);
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d", inSize,
+ (int)work->input.ordinal.timestamp.peeku(), (int)work->input.ordinal.frameIndex.peeku());
+ const uint8_t *data = rView.data() + inOffset;
+ if (mInputBufferCount < 3) {
+ if (mInputBufferCount == 0) {
+ if (!ParseOpusHeader(data, inSize, &mHeader)) {
+ ALOGE("Encountered error while Parsing Opus Header.");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ uint8_t channel_mapping[kMaxChannels] = {0};
+ if (mHeader.channels <= kMaxChannelsWithDefaultLayout) {
+ memcpy(&channel_mapping,
+ kDefaultOpusChannelLayout,
+ kMaxChannelsWithDefaultLayout);
+ } else {
+ memcpy(&channel_mapping,
+ mHeader.stream_map,
+ mHeader.channels);
+ }
+ int status = OPUS_INVALID_STATE;
+ mDecoder = opus_multistream_decoder_create(kRate,
+ mHeader.channels,
+ mHeader.num_streams,
+ mHeader.num_coupled,
+ channel_mapping,
+ &status);
+ if (!mDecoder || status != OPUS_OK) {
+ ALOGE("opus_multistream_decoder_create failed status = %s",
+ opus_strerror(status));
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ status = opus_multistream_decoder_ctl(mDecoder,
+ OPUS_SET_GAIN(mHeader.gain_db));
+ if (status != OPUS_OK) {
+ ALOGE("Failed to set OPUS header gain; status = %s",
+ opus_strerror(status));
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ } else {
+ if (inSize < 8) {
+ ALOGE("Input sample size is too small.");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ int64_t samples = ns_to_samples( *(reinterpret_cast<int64_t*>
+ (const_cast<uint8_t *> (data))), kRate);
+ if (mInputBufferCount == 1) {
+ mCodecDelay = samples;
+ mSamplesToDiscard = mCodecDelay;
+ }
+ else {
+ mSeekPreRoll = samples;
+
+ ALOGI("Configuring decoder: %d Hz, %d channels",
+ kRate, mHeader.channels);
+ C2StreamSampleRateInfo::output sampleRateInfo(0u, kRate);
+ C2StreamChannelCountInfo::output channelCountInfo(0u, mHeader.channels);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config(
+ { &sampleRateInfo, &channelCountInfo },
+ C2_MAY_BLOCK,
+ &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(C2Param::Copy(sampleRateInfo));
+ work->worklets.front()->output.configUpdate.push_back(C2Param::Copy(channelCountInfo));
+ } else {
+ ALOGE("Config Update failed");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ }
+
+ ++mInputBufferCount;
+ fillEmptyWork(work);
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+
+ // Ignore CSD re-submissions.
+ if ((work->input.flags & C2FrameData::FLAG_CODEC_CONFIG)) {
+ fillEmptyWork(work);
+ return;
+ }
+
+ // When seeking to zero, |mCodecDelay| samples has to be discarded
+ // instead of |mSeekPreRoll| samples (as we would when seeking to any
+ // other timestamp).
+ if (work->input.ordinal.timestamp.peeku() == 0) mSamplesToDiscard = mCodecDelay;
+
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(
+ kMaxNumSamplesPerBuffer * kMaxChannels * sizeof(int16_t),
+ usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ int numSamples = opus_multistream_decode(mDecoder,
+ data,
+ inSize,
+ reinterpret_cast<int16_t *> (wView.data()),
+ kMaxOpusOutputPacketSizeSamples,
+ 0);
+ if (numSamples < 0) {
+ ALOGE("opus_multistream_decode returned numSamples %d", numSamples);
+ numSamples = 0;
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ int outOffset = 0;
+ if (mSamplesToDiscard > 0) {
+ if (mSamplesToDiscard > numSamples) {
+ mSamplesToDiscard -= numSamples;
+ numSamples = 0;
+ } else {
+ numSamples -= mSamplesToDiscard;
+ outOffset = mSamplesToDiscard * sizeof(int16_t) * mHeader.channels;
+ mSamplesToDiscard = 0;
+ }
+ }
+
+ if (numSamples) {
+ int outSize = numSamples * sizeof(int16_t) * mHeader.channels;
+ ALOGV("out buffer attr. offset %d size %d ", outOffset, outSize);
+
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(createLinearBuffer(block, outOffset, outSize));
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ } else {
+ fillEmptyWork(work);
+ block.reset();
+ }
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+}
+
+class C2SoftOpusDecFactory : public C2ComponentFactory {
+public:
+ C2SoftOpusDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftOpusDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftOpusDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftOpusDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftOpusDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftOpusDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftOpusDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/opus/C2SoftOpusDec.h b/media/codec2/components/opus/C2SoftOpusDec.h
new file mode 100644
index 0000000..92b7426
--- /dev/null
+++ b/media/codec2/components/opus/C2SoftOpusDec.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_OPUS_DEC_H_
+#define ANDROID_C2_SOFT_OPUS_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+struct OpusMSDecoder;
+
+namespace android {
+
+struct OpusHeader {
+ int channels;
+ int skip_samples;
+ int channel_mapping;
+ int num_streams;
+ int num_coupled;
+ int16_t gain_db;
+ uint8_t stream_map[8];
+};
+
+struct C2SoftOpusDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftOpusDec(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftOpusDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+private:
+ enum {
+ kMaxNumSamplesPerBuffer = 960 * 6
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+ OpusMSDecoder *mDecoder;
+ OpusHeader mHeader;
+
+ int64_t mCodecDelay;
+ int64_t mSeekPreRoll;
+ int64_t mSamplesToDiscard;
+ size_t mInputBufferCount;
+ bool mSignalledError;
+ bool mSignalledOutputEos;
+
+ status_t initDecoder();
+
+ C2_DO_NOT_COPY(C2SoftOpusDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_OPUS_DEC_H_
diff --git a/media/codec2/components/raw/Android.bp b/media/codec2/components/raw/Android.bp
new file mode 100644
index 0000000..dc944da
--- /dev/null
+++ b/media/codec2/components/raw/Android.bp
@@ -0,0 +1,9 @@
+cc_library_shared {
+ name: "libcodec2_soft_rawdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftRawDec.cpp"],
+}
diff --git a/media/codec2/components/raw/C2SoftRawDec.cpp b/media/codec2/components/raw/C2SoftRawDec.cpp
new file mode 100644
index 0000000..8d2a652
--- /dev/null
+++ b/media/codec2/components/raw/C2SoftRawDec.cpp
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftRawDec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftRawDec.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.raw.decoder";
+
+class C2SoftRawDec::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 44100))
+ .withFields({C2F(mSampleRate, value).inRange(8000, 192000)})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 2))
+ .withFields({C2F(mChannelCount, value).inRange(1, 8)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(1, 10000000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 64 * 1024))
+ .build());
+ }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftRawDec::C2SoftRawDec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl) {
+}
+
+C2SoftRawDec::~C2SoftRawDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftRawDec::onInit() {
+ mSignalledEos = false;
+ return C2_OK;
+}
+
+c2_status_t C2SoftRawDec::onStop() {
+ mSignalledEos = false;
+ return C2_OK;
+}
+
+void C2SoftRawDec::onReset() {
+ (void)onStop();
+}
+
+void C2SoftRawDec::onRelease() {
+}
+
+c2_status_t C2SoftRawDec::onFlush_sm() {
+ return onStop();
+}
+
+void C2SoftRawDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void)pool;
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+
+ if (mSignalledEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ ALOGV("in buffer attr. timestamp %d frameindex %d",
+ (int)work->input.ordinal.timestamp.peeku(), (int)work->input.ordinal.frameIndex.peeku());
+
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ if (!work->input.buffers.empty()) {
+ work->worklets.front()->output.buffers.push_back(work->input.buffers[0]);
+ }
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ mSignalledEos = true;
+ ALOGV("signalled EOS");
+ }
+}
+
+c2_status_t C2SoftRawDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+class C2SoftRawDecFactory : public C2ComponentFactory {
+public:
+ C2SoftRawDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftRawDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftRawDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftRawDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftRawDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftRawDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftRawDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/raw/C2SoftRawDec.h b/media/codec2/components/raw/C2SoftRawDec.h
new file mode 100644
index 0000000..7dfdec5
--- /dev/null
+++ b/media/codec2/components/raw/C2SoftRawDec.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_RAW_DEC_H_
+#define ANDROID_C2_SOFT_RAW_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+namespace android {
+
+struct C2SoftRawDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftRawDec(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+ virtual ~C2SoftRawDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+private:
+ std::shared_ptr<IntfImpl> mIntf;
+ bool mSignalledEos;
+
+ C2_DO_NOT_COPY(C2SoftRawDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_RAW_DEC_H_
diff --git a/media/codec2/components/raw/MODULE_LICENSE_APACHE2 b/media/codec2/components/raw/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/raw/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/raw/NOTICE b/media/codec2/components/raw/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/raw/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/vorbis/Android.bp b/media/codec2/components/vorbis/Android.bp
new file mode 100644
index 0000000..a5f485d
--- /dev/null
+++ b/media/codec2/components/vorbis/Android.bp
@@ -0,0 +1,11 @@
+cc_library_shared {
+ name: "libcodec2_soft_vorbisdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftVorbisDec.cpp"],
+
+ shared_libs: ["libvorbisidec"],
+}
diff --git a/media/codec2/components/vorbis/C2SoftVorbisDec.cpp b/media/codec2/components/vorbis/C2SoftVorbisDec.cpp
new file mode 100644
index 0000000..280ae36
--- /dev/null
+++ b/media/codec2/components/vorbis/C2SoftVorbisDec.cpp
@@ -0,0 +1,493 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftVorbisDec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftVorbisDec.h"
+
+extern "C" {
+ #include <Tremolo/codec_internal.h>
+
+ int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb);
+ int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb);
+ int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb);
+}
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.vorbis.decoder";
+
+class C2SoftVorbisDec::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_VORBIS))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 48000))
+ .withFields({C2F(mSampleRate, value).inRange(8000, 96000)})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 1))
+ .withFields({C2F(mChannelCount, value).inRange(1, 8)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(32000, 500000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192 * 2 * sizeof(int16_t)))
+ .build());
+ }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+};
+
+C2SoftVorbisDec::C2SoftVorbisDec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mState(nullptr),
+ mVi(nullptr) {
+}
+
+C2SoftVorbisDec::~C2SoftVorbisDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftVorbisDec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_NO_MEMORY;
+}
+
+c2_status_t C2SoftVorbisDec::onStop() {
+ if (mState) {
+ vorbis_dsp_clear(mState);
+ delete mState;
+ mState = nullptr;
+ }
+
+ if (mVi) {
+ vorbis_info_clear(mVi);
+ delete mVi;
+ mVi = nullptr;
+ }
+ mNumFramesLeftOnPage = -1;
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+
+ return (initDecoder() == OK ? C2_OK : C2_CORRUPTED);
+}
+
+void C2SoftVorbisDec::onReset() {
+ (void)onStop();
+}
+
+void C2SoftVorbisDec::onRelease() {
+ if (mState) {
+ vorbis_dsp_clear(mState);
+ delete mState;
+ mState = nullptr;
+ }
+
+ if (mVi) {
+ vorbis_info_clear(mVi);
+ delete mVi;
+ mVi = nullptr;
+ }
+}
+
+status_t C2SoftVorbisDec::initDecoder() {
+ mVi = new vorbis_info{};
+ if (!mVi) return NO_MEMORY;
+ vorbis_info_clear(mVi);
+
+ mState = new vorbis_dsp_state{};
+ if (!mState) return NO_MEMORY;
+ vorbis_dsp_clear(mState);
+
+ mNumFramesLeftOnPage = -1;
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ mInfoUnpacked = false;
+ mBooksUnpacked = false;
+ return OK;
+}
+
+c2_status_t C2SoftVorbisDec::onFlush_sm() {
+ mNumFramesLeftOnPage = -1;
+ mSignalledOutputEos = false;
+ if (mState) vorbis_dsp_restart(mState);
+
+ return C2_OK;
+}
+
+c2_status_t C2SoftVorbisDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void) pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+static void makeBitReader(
+ const void *data, size_t size,
+ ogg_buffer *buf, ogg_reference *ref, oggpack_buffer *bits) {
+ buf->data = (uint8_t *)data;
+ buf->size = size;
+ buf->refcount = 1;
+ buf->ptr.owner = nullptr;
+
+ ref->buffer = buf;
+ ref->begin = 0;
+ ref->length = size;
+ ref->next = nullptr;
+
+ oggpack_readinit(bits, ref);
+}
+
+// (CHECK!) multiframe is tricky. decode call doesnt return the number of bytes
+// consumed by the component. Also it is unclear why numPageFrames is being
+// tagged at the end of input buffers for new pages. Refer lines 297-300 in
+// SimpleDecodingSource.cpp
+void C2SoftVorbisDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = rView.error();
+ return;
+ }
+ }
+
+ if (inSize == 0) {
+ fillEmptyWork(work);
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d", inSize,
+ (int)work->input.ordinal.timestamp.peeku(), (int)work->input.ordinal.frameIndex.peeku());
+ const uint8_t *data = rView.data() + inOffset;
+ int32_t numChannels = mVi->channels;
+ int32_t samplingRate = mVi->rate;
+ if (inSize > 7 && !memcmp(&data[1], "vorbis", 6)) {
+ if ((data[0] != 1) && (data[0] != 5)) {
+ ALOGE("unexpected type received %d", data[0]);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ ogg_buffer buf;
+ ogg_reference ref;
+ oggpack_buffer bits;
+
+ // skip 7 <type + "vorbis"> bytes
+ makeBitReader((const uint8_t *)data + 7, inSize - 7, &buf, &ref, &bits);
+ if (data[0] == 1) {
+ vorbis_info_init(mVi);
+ if (0 != _vorbis_unpack_info(mVi, &bits)) {
+ ALOGE("Encountered error while unpacking info");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ if (mVi->rate != samplingRate ||
+ mVi->channels != numChannels) {
+ ALOGV("vorbis: rate/channels changed: %ld/%d", mVi->rate, mVi->channels);
+ samplingRate = mVi->rate;
+ numChannels = mVi->channels;
+
+ C2StreamSampleRateInfo::output sampleRateInfo(0u, samplingRate);
+ C2StreamChannelCountInfo::output channelCountInfo(0u, numChannels);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config(
+ { &sampleRateInfo, &channelCountInfo },
+ C2_MAY_BLOCK,
+ &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(C2Param::Copy(sampleRateInfo));
+ work->worklets.front()->output.configUpdate.push_back(C2Param::Copy(channelCountInfo));
+ } else {
+ ALOGE("Config Update failed");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ mInfoUnpacked = true;
+ } else {
+ if (!mInfoUnpacked) {
+ ALOGE("Data with type:5 sent before sending type:1");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ if (0 != _vorbis_unpack_books(mVi, &bits)) {
+ ALOGE("Encountered error while unpacking books");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ if (0 != vorbis_dsp_init(mState, mVi)) {
+ ALOGE("Encountered error while dsp init");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ mBooksUnpacked = true;
+ }
+ fillEmptyWork(work);
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ return;
+ }
+
+ if (!mInfoUnpacked || !mBooksUnpacked) {
+ ALOGE("Missing CODEC_CONFIG data mInfoUnpacked: %d mBooksUnpack %d", mInfoUnpacked, mBooksUnpacked);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ int32_t numPageFrames = 0;
+ if (inSize < sizeof(numPageFrames)) {
+ ALOGE("input header has size %zu, expected %zu", inSize, sizeof(numPageFrames));
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ memcpy(&numPageFrames, data + inSize - sizeof(numPageFrames), sizeof(numPageFrames));
+ inSize -= sizeof(numPageFrames);
+ if (numPageFrames >= 0) {
+ mNumFramesLeftOnPage = numPageFrames;
+ }
+
+ ogg_buffer buf;
+ buf.data = const_cast<unsigned char*>(data);
+ buf.size = inSize;
+ buf.refcount = 1;
+ buf.ptr.owner = nullptr;
+
+ ogg_reference ref;
+ ref.buffer = &buf;
+ ref.begin = 0;
+ ref.length = buf.size;
+ ref.next = nullptr;
+
+ ogg_packet pack;
+ pack.packet = &ref;
+ pack.bytes = ref.length;
+ pack.b_o_s = 0;
+ pack.e_o_s = 0;
+ pack.granulepos = 0;
+ pack.packetno = 0;
+
+ size_t maxSamplesInBuffer = kMaxNumSamplesPerChannel * mVi->channels;
+ size_t outCapacity = maxSamplesInBuffer * sizeof(int16_t);
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(outCapacity, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = wView.error();
+ return;
+ }
+
+ int numFrames = 0;
+ int ret = vorbis_dsp_synthesis(mState, &pack, 1);
+ if (0 != ret) {
+ ALOGE("vorbis_dsp_synthesis returned %d", ret);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ } else {
+ numFrames = vorbis_dsp_pcmout(
+ mState, reinterpret_cast<int16_t *> (wView.data()),
+ kMaxNumSamplesPerChannel);
+ if (numFrames < 0) {
+ ALOGD("vorbis_dsp_pcmout returned %d", numFrames);
+ numFrames = 0;
+ }
+ }
+
+ if (mNumFramesLeftOnPage >= 0) {
+ if (numFrames > mNumFramesLeftOnPage) {
+ ALOGV("discarding %d frames at end of page", numFrames - mNumFramesLeftOnPage);
+ numFrames = mNumFramesLeftOnPage;
+ }
+ mNumFramesLeftOnPage -= numFrames;
+ }
+
+ if (numFrames) {
+ int outSize = numFrames * sizeof(int16_t) * mVi->channels;
+
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(createLinearBuffer(block, 0, outSize));
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ } else {
+ fillEmptyWork(work);
+ block.reset();
+ }
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+}
+
+class C2SoftVorbisDecFactory : public C2ComponentFactory {
+public:
+ C2SoftVorbisDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftVorbisDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftVorbisDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftVorbisDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftVorbisDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftVorbisDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftVorbisDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/vorbis/C2SoftVorbisDec.h b/media/codec2/components/vorbis/C2SoftVorbisDec.h
new file mode 100644
index 0000000..3bf7326
--- /dev/null
+++ b/media/codec2/components/vorbis/C2SoftVorbisDec.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_VORBIS_DEC_H_
+#define ANDROID_C2_SOFT_VORBIS_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+struct vorbis_dsp_state;
+struct vorbis_info;
+
+namespace android {
+
+struct C2SoftVorbisDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftVorbisDec(const char *name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl);
+ virtual ~C2SoftVorbisDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+ private:
+ enum {
+ kMaxNumSamplesPerChannel = 8192,
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+ vorbis_dsp_state *mState;
+ vorbis_info *mVi;
+
+ int32_t mNumFramesLeftOnPage;
+ bool mSignalledError;
+ bool mSignalledOutputEos;
+ bool mInfoUnpacked;
+ bool mBooksUnpacked;
+ status_t initDecoder();
+
+ C2_DO_NOT_COPY(C2SoftVorbisDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_VORBIS_DEC_H_
+
diff --git a/media/codec2/components/vorbis/MODULE_LICENSE_APACHE2 b/media/codec2/components/vorbis/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/vorbis/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/vorbis/NOTICE b/media/codec2/components/vorbis/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/media/codec2/components/vorbis/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/vpx/Android.bp b/media/codec2/components/vpx/Android.bp
new file mode 100644
index 0000000..abfd379
--- /dev/null
+++ b/media/codec2/components/vpx/Android.bp
@@ -0,0 +1,60 @@
+cc_library_shared {
+ name: "libcodec2_soft_vp9dec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftVpxDec.cpp"],
+
+ static_libs: ["libvpx"],
+
+ cflags: [
+ "-DVP9",
+ ],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_vp8dec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftVpxDec.cpp"],
+
+ static_libs: ["libvpx"],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_vp9enc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: [
+ "C2SoftVp9Enc.cpp",
+ "C2SoftVpxEnc.cpp",
+ ],
+
+ static_libs: ["libvpx"],
+
+ cflags: ["-DVP9"],
+}
+
+cc_library_shared {
+ name: "libcodec2_soft_vp8enc",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: [
+ "C2SoftVp8Enc.cpp",
+ "C2SoftVpxEnc.cpp",
+ ],
+
+ static_libs: ["libvpx"],
+}
+
diff --git a/media/codec2/components/vpx/C2SoftVp8Enc.cpp b/media/codec2/components/vpx/C2SoftVp8Enc.cpp
new file mode 100644
index 0000000..0ae717a
--- /dev/null
+++ b/media/codec2/components/vpx/C2SoftVp8Enc.cpp
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftVp8Enc"
+#include <utils/Log.h>
+#include <utils/misc.h>
+
+#include "C2SoftVp8Enc.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.vp8.encoder";
+
+C2SoftVp8Enc::C2SoftVp8Enc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl)
+ : C2SoftVpxEnc(name, id, intfImpl), mDCTPartitions(0), mProfile(1) {}
+
+void C2SoftVp8Enc::setCodecSpecificInterface() {
+ mCodecInterface = vpx_codec_vp8_cx();
+}
+
+void C2SoftVp8Enc::setCodecSpecificConfiguration() {
+ switch (mProfile) {
+ case 1:
+ mCodecConfiguration->g_profile = 0;
+ break;
+
+ case 2:
+ mCodecConfiguration->g_profile = 1;
+ break;
+
+ case 4:
+ mCodecConfiguration->g_profile = 2;
+ break;
+
+ case 8:
+ mCodecConfiguration->g_profile = 3;
+ break;
+
+ default:
+ mCodecConfiguration->g_profile = 0;
+ }
+}
+
+vpx_codec_err_t C2SoftVp8Enc::setCodecSpecificControls() {
+ vpx_codec_err_t codec_return = vpx_codec_control(mCodecContext,
+ VP8E_SET_TOKEN_PARTITIONS,
+ mDCTPartitions);
+ if (codec_return != VPX_CODEC_OK) {
+ ALOGE("Error setting dct partitions for vpx encoder.");
+ }
+ return codec_return;
+}
+
+class C2SoftVp8EncFactory : public C2ComponentFactory {
+public:
+ C2SoftVp8EncFactory()
+ : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {}
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftVp8Enc(COMPONENT_NAME, id,
+ std::make_shared<C2SoftVpxEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftVpxEnc::IntfImpl>(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftVpxEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftVp8EncFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftVp8EncFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/vpx/C2SoftVp8Enc.h b/media/codec2/components/vpx/C2SoftVp8Enc.h
new file mode 100644
index 0000000..ed6f356
--- /dev/null
+++ b/media/codec2/components/vpx/C2SoftVp8Enc.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_VP8_ENC_H__
+#define ANDROID_C2_SOFT_VP8_ENC_H__
+
+#include "C2SoftVpxEnc.h"
+
+namespace android {
+
+// Exposes vp8 encoder as a c2 Component
+//
+// In addition to the base class settings, Only following encoder settings are
+// available:
+// - token partitioning
+struct C2SoftVp8Enc : public C2SoftVpxEnc {
+ C2SoftVp8Enc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+
+ protected:
+ // Populates |mCodecInterface| with codec specific settings.
+ virtual void setCodecSpecificInterface();
+
+ // Sets codec specific configuration.
+ virtual void setCodecSpecificConfiguration();
+
+ // Initializes codec specific encoder settings.
+ virtual vpx_codec_err_t setCodecSpecificControls();
+
+ private:
+ // Max value supported for DCT partitions
+ static const uint32_t kMaxDCTPartitions = 3;
+
+ // vp8 specific configuration parameter
+ // that enables token partitioning of
+ // the stream into substreams
+ int32_t mDCTPartitions;
+
+ // C2 Profile parameter
+ int32_t mProfile;
+
+ C2_DO_NOT_COPY(C2SoftVp8Enc);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_VP8_ENC_H__
diff --git a/media/codec2/components/vpx/C2SoftVp9Enc.cpp b/media/codec2/components/vpx/C2SoftVp9Enc.cpp
new file mode 100644
index 0000000..b26170f
--- /dev/null
+++ b/media/codec2/components/vpx/C2SoftVp9Enc.cpp
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftVp9Enc"
+#include <utils/Log.h>
+#include <utils/misc.h>
+
+#include "C2SoftVp9Enc.h"
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.vp9.encoder";
+
+C2SoftVp9Enc::C2SoftVp9Enc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl)
+ : C2SoftVpxEnc(name, id, intfImpl),
+ mProfile(1),
+ mLevel(0),
+ mTileColumns(0),
+ mFrameParallelDecoding(false) {
+}
+
+void C2SoftVp9Enc::setCodecSpecificInterface() {
+ mCodecInterface = vpx_codec_vp9_cx();
+}
+
+void C2SoftVp9Enc::setCodecSpecificConfiguration() {
+ switch (mProfile) {
+ case 1:
+ mCodecConfiguration->g_profile = 0;
+ break;
+
+ case 2:
+ mCodecConfiguration->g_profile = 1;
+ break;
+
+ case 4:
+ mCodecConfiguration->g_profile = 2;
+ break;
+
+ case 8:
+ mCodecConfiguration->g_profile = 3;
+ break;
+
+ default:
+ mCodecConfiguration->g_profile = 0;
+ }
+}
+
+vpx_codec_err_t C2SoftVp9Enc::setCodecSpecificControls() {
+ vpx_codec_err_t codecReturn = vpx_codec_control(
+ mCodecContext, VP9E_SET_TILE_COLUMNS, mTileColumns);
+ if (codecReturn != VPX_CODEC_OK) {
+ ALOGE("Error setting VP9E_SET_TILE_COLUMNS to %d. vpx_codec_control() "
+ "returned %d", mTileColumns, codecReturn);
+ return codecReturn;
+ }
+ codecReturn = vpx_codec_control(
+ mCodecContext, VP9E_SET_FRAME_PARALLEL_DECODING,
+ mFrameParallelDecoding);
+ if (codecReturn != VPX_CODEC_OK) {
+ ALOGE("Error setting VP9E_SET_FRAME_PARALLEL_DECODING to %d."
+ "vpx_codec_control() returned %d", mFrameParallelDecoding,
+ codecReturn);
+ return codecReturn;
+ }
+ codecReturn = vpx_codec_control(mCodecContext, VP9E_SET_ROW_MT, 1);
+ if (codecReturn != VPX_CODEC_OK) {
+ ALOGE("Error setting VP9E_SET_ROW_MT to 1. vpx_codec_control() "
+ "returned %d", codecReturn);
+ return codecReturn;
+ }
+
+ // For VP9, we always set CPU_USED to 8 (because the realtime default is 0
+ // which is too slow).
+ codecReturn = vpx_codec_control(mCodecContext, VP8E_SET_CPUUSED, 8);
+ if (codecReturn != VPX_CODEC_OK) {
+ ALOGE("Error setting VP8E_SET_CPUUSED to 8. vpx_codec_control() "
+ "returned %d", codecReturn);
+ return codecReturn;
+ }
+ return codecReturn;
+}
+
+class C2SoftVp9EncFactory : public C2ComponentFactory {
+public:
+ C2SoftVp9EncFactory()
+ : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {}
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftVp9Enc(COMPONENT_NAME, id,
+ std::make_shared<C2SoftVpxEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftVpxEnc::IntfImpl>(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftVpxEnc::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftVp9EncFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftVp9EncFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/vpx/C2SoftVp9Enc.h b/media/codec2/components/vpx/C2SoftVp9Enc.h
new file mode 100644
index 0000000..77ef8fd
--- /dev/null
+++ b/media/codec2/components/vpx/C2SoftVp9Enc.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_VP9_ENC_H__
+#define ANDROID_C2_SOFT_VP9_ENC_H__
+
+#include "C2SoftVpxEnc.h"
+
+namespace android {
+
+// Exposes vp9 encoder as a c2 Component
+//
+// In addition to the base class settings, Only following encoder settings are
+// available:
+// - tile rows
+// - tile columns
+// - frame parallel mode
+struct C2SoftVp9Enc : public C2SoftVpxEnc {
+ C2SoftVp9Enc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+
+ protected:
+ // Populates |mCodecInterface| with codec specific settings.
+ virtual void setCodecSpecificInterface();
+
+ // Sets codec specific configuration.
+ virtual void setCodecSpecificConfiguration();
+
+ // Initializes codec specific encoder settings.
+ virtual vpx_codec_err_t setCodecSpecificControls();
+
+ private:
+ // C2 Profile & Level parameter
+ int32_t mProfile;
+ int32_t mLevel __unused;
+
+ int32_t mTileColumns;
+
+ bool mFrameParallelDecoding;
+
+ C2_DO_NOT_COPY(C2SoftVp9Enc);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_VP9_ENC_H__
diff --git a/media/codec2/components/vpx/C2SoftVpxDec.cpp b/media/codec2/components/vpx/C2SoftVpxDec.cpp
new file mode 100644
index 0000000..01de681
--- /dev/null
+++ b/media/codec2/components/vpx/C2SoftVpxDec.cpp
@@ -0,0 +1,640 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftVpxDec"
+#include <log/log.h>
+
+#include <media/stagefright/foundation/AUtils.h>
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftVpxDec.h"
+
+namespace android {
+
+#ifdef VP9
+constexpr char COMPONENT_NAME[] = "c2.android.vp9.decoder";
+#else
+constexpr char COMPONENT_NAME[] = "c2.android.vp8.decoder";
+#endif
+
+class C2SoftVpxDec::IntfImpl : public SimpleInterface<void>::BaseParams {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : SimpleInterface<void>::BaseParams(
+ helper,
+ COMPONENT_NAME,
+ C2Component::KIND_DECODER,
+ C2Component::DOMAIN_VIDEO,
+#ifdef VP9
+ MEDIA_MIMETYPE_VIDEO_VP9
+#else
+ MEDIA_MIMETYPE_VIDEO_VP8
+#endif
+ ) {
+ noPrivateBuffers(); // TODO: account for our buffers here
+ noInputReferences();
+ noOutputReferences();
+ noInputLatency();
+ noTimeStretch();
+
+ // TODO: output latency and reordering
+
+ addParameter(
+ DefineParam(mAttrib, C2_PARAMKEY_COMPONENT_ATTRIBUTES)
+ .withConstValue(new C2ComponentAttributesSetting(C2Component::ATTRIB_IS_TEMPORAL))
+ .build());
+
+ addParameter(
+ DefineParam(mSize, C2_PARAMKEY_PICTURE_SIZE)
+ .withDefault(new C2StreamPictureSizeInfo::output(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 2048, 2),
+ C2F(mSize, height).inRange(2, 2048, 2),
+ })
+ .withSetter(SizeSetter)
+ .build());
+
+#ifdef VP9
+ // TODO: Add C2Config::PROFILE_VP9_2HDR ??
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_VP9_0, C2Config::LEVEL_VP9_5))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ C2Config::PROFILE_VP9_0,
+ C2Config::PROFILE_VP9_2}),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_VP9_1,
+ C2Config::LEVEL_VP9_1_1,
+ C2Config::LEVEL_VP9_2,
+ C2Config::LEVEL_VP9_2_1,
+ C2Config::LEVEL_VP9_3,
+ C2Config::LEVEL_VP9_3_1,
+ C2Config::LEVEL_VP9_4,
+ C2Config::LEVEL_VP9_4_1,
+ C2Config::LEVEL_VP9_5,
+ })
+ })
+ .withSetter(ProfileLevelSetter, mSize)
+ .build());
+
+#if 0
+ // sample BT.2020 static info
+ mHdrStaticInfo = std::make_shared<C2StreamHdrStaticInfo::output>();
+ mHdrStaticInfo->mastering = {
+ .red = { .x = 0.708, .y = 0.292 },
+ .green = { .x = 0.170, .y = 0.797 },
+ .blue = { .x = 0.131, .y = 0.046 },
+ .white = { .x = 0.3127, .y = 0.3290 },
+ .maxLuminance = 1000,
+ .minLuminance = 0.1,
+ };
+ mHdrStaticInfo->maxCll = 1000;
+ mHdrStaticInfo->maxFall = 120;
+
+ mHdrStaticInfo->maxLuminance = 0; // disable static info
+
+ helper->addStructDescriptors<C2MasteringDisplayColorVolumeStruct, C2ColorXyStruct>();
+ addParameter(
+ DefineParam(mHdrStaticInfo, C2_PARAMKEY_HDR_STATIC_INFO)
+ .withDefault(mHdrStaticInfo)
+ .withFields({
+ C2F(mHdrStaticInfo, mastering.red.x).inRange(0, 1),
+ // TODO
+ })
+ .withSetter(HdrStaticInfoSetter)
+ .build());
+#endif
+#else
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withConstValue(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_UNUSED, C2Config::LEVEL_UNUSED))
+ .build());
+#endif
+
+ addParameter(
+ DefineParam(mMaxSize, C2_PARAMKEY_MAX_PICTURE_SIZE)
+ .withDefault(new C2StreamMaxPictureSizeTuning::output(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 2048, 2),
+ C2F(mSize, height).inRange(2, 2048, 2),
+ })
+ .withSetter(MaxPictureSizeSetter, mSize)
+ .build());
+
+ addParameter(
+ DefineParam(mMaxInputSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, 320 * 240 * 3 / 4))
+ .withFields({
+ C2F(mMaxInputSize, value).any(),
+ })
+ .calculatedAs(MaxInputSizeSetter, mMaxSize)
+ .build());
+
+ C2ChromaOffsetStruct locations[1] = { C2ChromaOffsetStruct::ITU_YUV_420_0() };
+ std::shared_ptr<C2StreamColorInfo::output> defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ 1u, 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ memcpy(defaultColorInfo->m.locations, locations, sizeof(locations));
+
+ defaultColorInfo =
+ C2StreamColorInfo::output::AllocShared(
+ { C2ChromaOffsetStruct::ITU_YUV_420_0() },
+ 0u, 8u /* bitDepth */, C2Color::YUV_420);
+ helper->addStructDescriptors<C2ChromaOffsetStruct>();
+
+ addParameter(
+ DefineParam(mColorInfo, C2_PARAMKEY_CODED_COLOR_INFO)
+ .withConstValue(defaultColorInfo)
+ .build());
+
+ // TODO: support more formats?
+ addParameter(
+ DefineParam(mPixelFormat, C2_PARAMKEY_PIXEL_FORMAT)
+ .withConstValue(new C2StreamPixelFormatInfo::output(
+ 0u, HAL_PIXEL_FORMAT_YCBCR_420_888))
+ .build());
+ }
+
+ static C2R SizeSetter(bool mayBlock, const C2P<C2StreamPictureSizeInfo::output> &oldMe,
+ C2P<C2VideoSizeStreamInfo::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+ me.set().width = oldMe.v.width;
+ }
+ if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
+ me.set().height = oldMe.v.height;
+ }
+ return res;
+ }
+
+ static C2R MaxPictureSizeSetter(bool mayBlock, C2P<C2StreamMaxPictureSizeTuning::output> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ // TODO: get max width/height from the size's field helpers vs. hardcoding
+ me.set().width = c2_min(c2_max(me.v.width, size.v.width), 2048u);
+ me.set().height = c2_min(c2_max(me.v.height, size.v.height), 2048u);
+ return C2R::Ok();
+ }
+
+ static C2R MaxInputSizeSetter(bool mayBlock, C2P<C2StreamMaxBufferSizeInfo::input> &me,
+ const C2P<C2StreamMaxPictureSizeTuning::output> &maxSize) {
+ (void)mayBlock;
+ // assume compression ratio of 2
+ me.set().value = (((maxSize.v.width + 63) / 64) * ((maxSize.v.height + 63) / 64) * 3072);
+ return C2R::Ok();
+ }
+
+
+ static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::input> &me,
+ const C2P<C2StreamPictureSizeInfo::output> &size) {
+ (void)mayBlock;
+ (void)size;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+
+private:
+ std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
+ std::shared_ptr<C2StreamPictureSizeInfo::output> mSize;
+ std::shared_ptr<C2StreamMaxPictureSizeTuning::output> mMaxSize;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mMaxInputSize;
+ std::shared_ptr<C2StreamColorInfo::output> mColorInfo;
+ std::shared_ptr<C2StreamPixelFormatInfo::output> mPixelFormat;
+#ifdef VP9
+#if 0
+ std::shared_ptr<C2StreamHdrStaticInfo::output> mHdrStaticInfo;
+#endif
+#endif
+};
+
+C2SoftVpxDec::C2SoftVpxDec(
+ const char *name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mCodecCtx(nullptr) {
+}
+
+C2SoftVpxDec::~C2SoftVpxDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftVpxDec::onInit() {
+ status_t err = initDecoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+c2_status_t C2SoftVpxDec::onStop() {
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+
+ return C2_OK;
+}
+
+void C2SoftVpxDec::onReset() {
+ (void)onStop();
+ c2_status_t err = onFlush_sm();
+ if (err != C2_OK)
+ {
+ ALOGW("Failed to flush decoder. Try to hard reset decoder");
+ destroyDecoder();
+ (void)initDecoder();
+ }
+}
+
+void C2SoftVpxDec::onRelease() {
+ destroyDecoder();
+}
+
+c2_status_t C2SoftVpxDec::onFlush_sm() {
+ if (mFrameParallelMode) {
+ // Flush decoder by passing nullptr data ptr and 0 size.
+ // Ideally, this should never fail.
+ if (vpx_codec_decode(mCodecCtx, nullptr, 0, nullptr, 0)) {
+ ALOGE("Failed to flush on2 decoder.");
+ return C2_CORRUPTED;
+ }
+ }
+
+ // Drop all the decoded frames in decoder.
+ vpx_codec_iter_t iter = nullptr;
+ while (vpx_codec_get_frame(mCodecCtx, &iter)) {
+ }
+
+ mSignalledError = false;
+ mSignalledOutputEos = false;
+ return C2_OK;
+}
+
+static int GetCPUCoreCount() {
+ int cpuCoreCount = 1;
+#if defined(_SC_NPROCESSORS_ONLN)
+ cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
+#else
+ // _SC_NPROC_ONLN must be defined...
+ cpuCoreCount = sysconf(_SC_NPROC_ONLN);
+#endif
+ CHECK(cpuCoreCount >= 1);
+ ALOGV("Number of CPU cores: %d", cpuCoreCount);
+ return cpuCoreCount;
+}
+
+status_t C2SoftVpxDec::initDecoder() {
+#ifdef VP9
+ mMode = MODE_VP9;
+#else
+ mMode = MODE_VP8;
+#endif
+
+ mWidth = 320;
+ mHeight = 240;
+ mFrameParallelMode = false;
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+
+ if (!mCodecCtx) {
+ mCodecCtx = new vpx_codec_ctx_t;
+ }
+ if (!mCodecCtx) {
+ ALOGE("mCodecCtx is null");
+ return NO_MEMORY;
+ }
+
+ vpx_codec_dec_cfg_t cfg;
+ memset(&cfg, 0, sizeof(vpx_codec_dec_cfg_t));
+ cfg.threads = GetCPUCoreCount();
+
+ vpx_codec_flags_t flags;
+ memset(&flags, 0, sizeof(vpx_codec_flags_t));
+ if (mFrameParallelMode) flags |= VPX_CODEC_USE_FRAME_THREADING;
+
+ vpx_codec_err_t vpx_err;
+ if ((vpx_err = vpx_codec_dec_init(
+ mCodecCtx, mMode == MODE_VP8 ? &vpx_codec_vp8_dx_algo : &vpx_codec_vp9_dx_algo,
+ &cfg, flags))) {
+ ALOGE("on2 decoder failed to initialize. (%d)", vpx_err);
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2SoftVpxDec::destroyDecoder() {
+ if (mCodecCtx) {
+ vpx_codec_destroy(mCodecCtx);
+ delete mCodecCtx;
+ mCodecCtx = nullptr;
+ }
+
+ return OK;
+}
+
+void fillEmptyWork(const std::unique_ptr<C2Work> &work) {
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+void C2SoftVpxDec::finishWork(uint64_t index, const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2GraphicBlock> &block) {
+ std::shared_ptr<C2Buffer> buffer = createGraphicBuffer(block,
+ C2Rect(mWidth, mHeight));
+ auto fillWork = [buffer, index](const std::unique_ptr<C2Work> &work) {
+ uint32_t flags = 0;
+ if ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) &&
+ (c2_cntr64_t(index) == work->input.ordinal.frameIndex)) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(buffer);
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ };
+ if (work && c2_cntr64_t(index) == work->input.ordinal.frameIndex) {
+ fillWork(work);
+ } else {
+ finish(index, fillWork);
+ }
+}
+
+void C2SoftVpxDec::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 0u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ size_t inOffset = 0u;
+ size_t inSize = 0u;
+ C2ReadView rView = mDummyReadView;
+ if (!work->input.buffers.empty()) {
+ rView = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ inSize = rView.capacity();
+ if (inSize && rView.error()) {
+ ALOGE("read view map failed %d", rView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+
+ bool codecConfig = ((work->input.flags & C2FrameData::FLAG_CODEC_CONFIG) !=0);
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+
+ ALOGV("in buffer attr. size %zu timestamp %d frameindex %d, flags %x",
+ inSize, (int)work->input.ordinal.timestamp.peeku(),
+ (int)work->input.ordinal.frameIndex.peeku(), work->input.flags);
+
+ // Software VP9 Decoder does not need the Codec Specific Data (CSD)
+ // (specified in http://www.webmproject.org/vp9/profiles/). Ignore it if
+ // it was passed.
+ if (codecConfig) {
+ // Ignore CSD buffer for VP9.
+ if (mMode == MODE_VP9) {
+ fillEmptyWork(work);
+ return;
+ } else {
+ // Tolerate the CSD buffer for VP8. This is a workaround
+ // for b/28689536. continue
+ ALOGW("WARNING: Got CSD buffer for VP8. Continue");
+ }
+ }
+
+ int64_t frameIndex = work->input.ordinal.frameIndex.peekll();
+
+ if (inSize) {
+ uint8_t *bitstream = const_cast<uint8_t *>(rView.data() + inOffset);
+ vpx_codec_err_t err = vpx_codec_decode(
+ mCodecCtx, bitstream, inSize, &frameIndex, 0);
+ if (err != VPX_CODEC_OK) {
+ ALOGE("on2 decoder failed to decode frame. err: %d", err);
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+
+ (void)outputBuffer(pool, work);
+
+ if (eos) {
+ drainInternal(DRAIN_COMPONENT_WITH_EOS, pool, work);
+ mSignalledOutputEos = true;
+ } else if (!inSize) {
+ fillEmptyWork(work);
+ }
+}
+
+static void copyOutputBufferToYV12Frame(uint8_t *dst,
+ const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV,
+ size_t srcYStride, size_t srcUStride, size_t srcVStride,
+ uint32_t width, uint32_t height, int32_t bpp) {
+ size_t dstYStride = align(width, 16) * bpp ;
+ size_t dstUVStride = align(dstYStride / 2, 16);
+ uint8_t *dstStart = dst;
+
+ for (size_t i = 0; i < height; ++i) {
+ memcpy(dst, srcY, width * bpp);
+ srcY += srcYStride;
+ dst += dstYStride;
+ }
+
+ dst = dstStart + dstYStride * height;
+ for (size_t i = 0; i < height / 2; ++i) {
+ memcpy(dst, srcV, width / 2 * bpp);
+ srcV += srcVStride;
+ dst += dstUVStride;
+ }
+
+ dst = dstStart + (dstYStride * height) + (dstUVStride * height / 2);
+ for (size_t i = 0; i < height / 2; ++i) {
+ memcpy(dst, srcU, width / 2 * bpp);
+ srcU += srcUStride;
+ dst += dstUVStride;
+ }
+}
+
+bool C2SoftVpxDec::outputBuffer(
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work)
+{
+ if (!(work && pool)) return false;
+
+ vpx_codec_iter_t iter = nullptr;
+ vpx_image_t *img = vpx_codec_get_frame(mCodecCtx, &iter);
+
+ if (!img) return false;
+
+ if (img->d_w != mWidth || img->d_h != mHeight) {
+ mWidth = img->d_w;
+ mHeight = img->d_h;
+
+ C2VideoSizeStreamInfo::output size(0u, mWidth, mHeight);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config({&size}, C2_MAY_BLOCK, &failures);
+ if (err == C2_OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(size));
+ } else {
+ ALOGE("Config update size failed");
+ mSignalledError = true;
+ work->workletsProcessed = 1u;
+ work->result = C2_CORRUPTED;
+ return false;
+ }
+
+ }
+ CHECK(img->fmt == VPX_IMG_FMT_I420 || img->fmt == VPX_IMG_FMT_I42016);
+ int32_t bpp = 1;
+ if (img->fmt == VPX_IMG_FMT_I42016) {
+ bpp = 2;
+ }
+
+ std::shared_ptr<C2GraphicBlock> block;
+ uint32_t format = HAL_PIXEL_FORMAT_YV12;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchGraphicBlock(align(mWidth, 16) * bpp, mHeight, format, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchGraphicBlock for Output failed with status %d", err);
+ work->result = err;
+ return false;
+ }
+
+ C2GraphicView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("graphic view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return false;
+ }
+
+ ALOGV("provided (%dx%d) required (%dx%d), out frameindex %d",
+ block->width(), block->height(), mWidth, mHeight, (int)*(int64_t *)img->user_priv);
+
+ uint8_t *dst = const_cast<uint8_t *>(wView.data()[C2PlanarLayout::PLANE_Y]);
+ size_t srcYStride = img->stride[VPX_PLANE_Y];
+ size_t srcUStride = img->stride[VPX_PLANE_U];
+ size_t srcVStride = img->stride[VPX_PLANE_V];
+ const uint8_t *srcY = (const uint8_t *)img->planes[VPX_PLANE_Y];
+ const uint8_t *srcU = (const uint8_t *)img->planes[VPX_PLANE_U];
+ const uint8_t *srcV = (const uint8_t *)img->planes[VPX_PLANE_V];
+ copyOutputBufferToYV12Frame(dst, srcY, srcU, srcV,
+ srcYStride, srcUStride, srcVStride, mWidth, mHeight, bpp);
+
+ finishWork(*(int64_t *)img->user_priv, work, std::move(block));
+ return true;
+}
+
+c2_status_t C2SoftVpxDec::drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work) {
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ while ((outputBuffer(pool, work))) {
+ }
+
+ if (drainMode == DRAIN_COMPONENT_WITH_EOS &&
+ work && work->workletsProcessed == 0u) {
+ fillEmptyWork(work);
+ }
+
+ return C2_OK;
+}
+c2_status_t C2SoftVpxDec::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ return drainInternal(drainMode, pool, nullptr);
+}
+
+class C2SoftVpxFactory : public C2ComponentFactory {
+public:
+ C2SoftVpxFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftVpxDec(COMPONENT_NAME, id,
+ std::make_shared<C2SoftVpxDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftVpxDec::IntfImpl>(
+ COMPONENT_NAME, id,
+ std::make_shared<C2SoftVpxDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftVpxFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftVpxFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/vpx/C2SoftVpxDec.h b/media/codec2/components/vpx/C2SoftVpxDec.h
new file mode 100644
index 0000000..60c8484
--- /dev/null
+++ b/media/codec2/components/vpx/C2SoftVpxDec.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_VPX_DEC_H_
+#define ANDROID_C2_SOFT_VPX_DEC_H_
+
+#include <SimpleC2Component.h>
+
+
+#include "vpx/vpx_decoder.h"
+#include "vpx/vp8dx.h"
+
+namespace android {
+
+struct C2SoftVpxDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftVpxDec(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+ virtual ~C2SoftVpxDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ private:
+ enum {
+ MODE_VP8,
+ MODE_VP9,
+ } mMode;
+
+ std::shared_ptr<IntfImpl> mIntf;
+ vpx_codec_ctx_t *mCodecCtx;
+ bool mFrameParallelMode; // Frame parallel is only supported by VP9 decoder.
+
+ uint32_t mWidth;
+ uint32_t mHeight;
+ bool mSignalledOutputEos;
+ bool mSignalledError;
+
+ status_t initDecoder();
+ status_t destroyDecoder();
+ void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2GraphicBlock> &block);
+ bool outputBuffer(
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work);
+ c2_status_t drainInternal(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool,
+ const std::unique_ptr<C2Work> &work);
+
+ C2_DO_NOT_COPY(C2SoftVpxDec);
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_VPX_DEC_H_
diff --git a/media/codec2/components/vpx/C2SoftVpxEnc.cpp b/media/codec2/components/vpx/C2SoftVpxEnc.cpp
new file mode 100644
index 0000000..155a84f
--- /dev/null
+++ b/media/codec2/components/vpx/C2SoftVpxEnc.cpp
@@ -0,0 +1,670 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftVpxEnc"
+#include <log/log.h>
+#include <utils/misc.h>
+
+#include <media/hardware/VideoAPI.h>
+
+#include <Codec2BufferUtils.h>
+#include <C2Debug.h>
+#include "C2SoftVpxEnc.h"
+
+#ifndef INT32_MAX
+#define INT32_MAX 2147483647
+#endif
+
+namespace android {
+
+#if 0
+static size_t getCpuCoreCount() {
+ long cpuCoreCount = 1;
+#if defined(_SC_NPROCESSORS_ONLN)
+ cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
+#else
+ // _SC_NPROC_ONLN must be defined...
+ cpuCoreCount = sysconf(_SC_NPROC_ONLN);
+#endif
+ CHECK(cpuCoreCount >= 1);
+ ALOGV("Number of CPU cores: %ld", cpuCoreCount);
+ return (size_t)cpuCoreCount;
+}
+#endif
+
+C2SoftVpxEnc::C2SoftVpxEnc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl)
+ : SimpleC2Component(
+ std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mCodecContext(nullptr),
+ mCodecConfiguration(nullptr),
+ mCodecInterface(nullptr),
+ mStrideAlign(2),
+ mColorFormat(VPX_IMG_FMT_I420),
+ mBitrateControlMode(VPX_VBR),
+ mErrorResilience(false),
+ mMinQuantizer(0),
+ mMaxQuantizer(0),
+ mTemporalLayers(0),
+ mTemporalPatternType(VPXTemporalLayerPatternNone),
+ mTemporalPatternLength(0),
+ mTemporalPatternIdx(0),
+ mLastTimestamp(0x7FFFFFFFFFFFFFFFull),
+ mSignalledOutputEos(false),
+ mSignalledError(false) {
+ memset(mTemporalLayerBitrateRatio, 0, sizeof(mTemporalLayerBitrateRatio));
+ mTemporalLayerBitrateRatio[0] = 100;
+}
+
+C2SoftVpxEnc::~C2SoftVpxEnc() {
+ onRelease();
+}
+
+c2_status_t C2SoftVpxEnc::onInit() {
+ status_t err = initEncoder();
+ return err == OK ? C2_OK : C2_CORRUPTED;
+}
+
+void C2SoftVpxEnc::onRelease() {
+ if (mCodecContext) {
+ vpx_codec_destroy(mCodecContext);
+ delete mCodecContext;
+ mCodecContext = nullptr;
+ }
+
+ if (mCodecConfiguration) {
+ delete mCodecConfiguration;
+ mCodecConfiguration = nullptr;
+ }
+
+ // this one is not allocated by us
+ mCodecInterface = nullptr;
+}
+
+c2_status_t C2SoftVpxEnc::onStop() {
+ onRelease();
+ mLastTimestamp = 0x7FFFFFFFFFFFFFFFLL;
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+ return C2_OK;
+}
+
+void C2SoftVpxEnc::onReset() {
+ (void)onStop();
+}
+
+c2_status_t C2SoftVpxEnc::onFlush_sm() {
+ return onStop();
+}
+
+status_t C2SoftVpxEnc::initEncoder() {
+ vpx_codec_err_t codec_return;
+ status_t result = UNKNOWN_ERROR;
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ mSize = mIntf->getSize_l();
+ mBitrate = mIntf->getBitrate_l();
+ mBitrateMode = mIntf->getBitrateMode_l();
+ mFrameRate = mIntf->getFrameRate_l();
+ mIntraRefresh = mIntf->getIntraRefresh_l();
+ mRequestSync = mIntf->getRequestSync_l();
+ mTemporalLayers = mIntf->getTemporalLayers_l()->m.layerCount;
+ }
+
+ switch (mBitrateMode->value) {
+ case C2Config::BITRATE_VARIABLE:
+ mBitrateControlMode = VPX_VBR;
+ break;
+ case C2Config::BITRATE_CONST:
+ default:
+ mBitrateControlMode = VPX_CBR;
+ break;
+ break;
+ }
+
+ setCodecSpecificInterface();
+ if (!mCodecInterface) goto CleanUp;
+
+ ALOGD("VPx: initEncoder. BRMode: %u. TSLayers: %zu. KF: %u. QP: %u - %u",
+ (uint32_t)mBitrateControlMode, mTemporalLayers, mIntf->getSyncFramePeriod(),
+ mMinQuantizer, mMaxQuantizer);
+
+ mCodecConfiguration = new vpx_codec_enc_cfg_t;
+ if (!mCodecConfiguration) goto CleanUp;
+ codec_return = vpx_codec_enc_config_default(mCodecInterface,
+ mCodecConfiguration,
+ 0);
+ if (codec_return != VPX_CODEC_OK) {
+ ALOGE("Error populating default configuration for vpx encoder.");
+ goto CleanUp;
+ }
+
+ mCodecConfiguration->g_w = mSize->width;
+ mCodecConfiguration->g_h = mSize->height;
+ //mCodecConfiguration->g_threads = getCpuCoreCount();
+ mCodecConfiguration->g_threads = 0;
+ mCodecConfiguration->g_error_resilient = mErrorResilience;
+
+ // timebase unit is microsecond
+ // g_timebase is in seconds (i.e. 1/1000000 seconds)
+ mCodecConfiguration->g_timebase.num = 1;
+ mCodecConfiguration->g_timebase.den = 1000000;
+ // rc_target_bitrate is in kbps, mBitrate in bps
+ mCodecConfiguration->rc_target_bitrate = (mBitrate->value + 500) / 1000;
+ mCodecConfiguration->rc_end_usage = mBitrateControlMode;
+ // Disable frame drop - not allowed in MediaCodec now.
+ mCodecConfiguration->rc_dropframe_thresh = 0;
+ // Disable lagged encoding.
+ mCodecConfiguration->g_lag_in_frames = 0;
+ if (mBitrateControlMode == VPX_CBR) {
+ // Disable spatial resizing.
+ mCodecConfiguration->rc_resize_allowed = 0;
+ // Single-pass mode.
+ mCodecConfiguration->g_pass = VPX_RC_ONE_PASS;
+ // Maximum amount of bits that can be subtracted from the target
+ // bitrate - expressed as percentage of the target bitrate.
+ mCodecConfiguration->rc_undershoot_pct = 100;
+ // Maximum amount of bits that can be added to the target
+ // bitrate - expressed as percentage of the target bitrate.
+ mCodecConfiguration->rc_overshoot_pct = 15;
+ // Initial value of the buffer level in ms.
+ mCodecConfiguration->rc_buf_initial_sz = 500;
+ // Amount of data that the encoder should try to maintain in ms.
+ mCodecConfiguration->rc_buf_optimal_sz = 600;
+ // The amount of data that may be buffered by the decoding
+ // application in ms.
+ mCodecConfiguration->rc_buf_sz = 1000;
+ // Enable error resilience - needed for packet loss.
+ mCodecConfiguration->g_error_resilient = 1;
+ // Maximum key frame interval - for CBR boost to 3000
+ mCodecConfiguration->kf_max_dist = 3000;
+ // Encoder determines optimal key frame placement automatically.
+ mCodecConfiguration->kf_mode = VPX_KF_AUTO;
+ }
+
+ // Frames temporal pattern - for now WebRTC like pattern is only supported.
+ switch (mTemporalLayers) {
+ case 0:
+ mTemporalPatternLength = 0;
+ break;
+ case 1:
+ mCodecConfiguration->ts_number_layers = 1;
+ mCodecConfiguration->ts_rate_decimator[0] = 1;
+ mCodecConfiguration->ts_periodicity = 1;
+ mCodecConfiguration->ts_layer_id[0] = 0;
+ mTemporalPattern[0] = kTemporalUpdateLastRefAll;
+ mTemporalPatternLength = 1;
+ break;
+ case 2:
+ mCodecConfiguration->ts_number_layers = 2;
+ mCodecConfiguration->ts_rate_decimator[0] = 2;
+ mCodecConfiguration->ts_rate_decimator[1] = 1;
+ mCodecConfiguration->ts_periodicity = 2;
+ mCodecConfiguration->ts_layer_id[0] = 0;
+ mCodecConfiguration->ts_layer_id[1] = 1;
+ mTemporalPattern[0] = kTemporalUpdateLastAndGoldenRefAltRef;
+ mTemporalPattern[1] = kTemporalUpdateGoldenWithoutDependencyRefAltRef;
+ mTemporalPattern[2] = kTemporalUpdateLastRefAltRef;
+ mTemporalPattern[3] = kTemporalUpdateGoldenRefAltRef;
+ mTemporalPattern[4] = kTemporalUpdateLastRefAltRef;
+ mTemporalPattern[5] = kTemporalUpdateGoldenRefAltRef;
+ mTemporalPattern[6] = kTemporalUpdateLastRefAltRef;
+ mTemporalPattern[7] = kTemporalUpdateNone;
+ mTemporalPatternLength = 8;
+ break;
+ case 3:
+ mCodecConfiguration->ts_number_layers = 3;
+ mCodecConfiguration->ts_rate_decimator[0] = 4;
+ mCodecConfiguration->ts_rate_decimator[1] = 2;
+ mCodecConfiguration->ts_rate_decimator[2] = 1;
+ mCodecConfiguration->ts_periodicity = 4;
+ mCodecConfiguration->ts_layer_id[0] = 0;
+ mCodecConfiguration->ts_layer_id[1] = 2;
+ mCodecConfiguration->ts_layer_id[2] = 1;
+ mCodecConfiguration->ts_layer_id[3] = 2;
+ mTemporalPattern[0] = kTemporalUpdateLastAndGoldenRefAltRef;
+ mTemporalPattern[1] = kTemporalUpdateNoneNoRefGoldenRefAltRef;
+ mTemporalPattern[2] = kTemporalUpdateGoldenWithoutDependencyRefAltRef;
+ mTemporalPattern[3] = kTemporalUpdateNone;
+ mTemporalPattern[4] = kTemporalUpdateLastRefAltRef;
+ mTemporalPattern[5] = kTemporalUpdateNone;
+ mTemporalPattern[6] = kTemporalUpdateGoldenRefAltRef;
+ mTemporalPattern[7] = kTemporalUpdateNone;
+ mTemporalPatternLength = 8;
+ break;
+ default:
+ ALOGE("Wrong number of temporal layers %zu", mTemporalLayers);
+ goto CleanUp;
+ }
+ // Set bitrate values for each layer
+ for (size_t i = 0; i < mCodecConfiguration->ts_number_layers; i++) {
+ mCodecConfiguration->ts_target_bitrate[i] =
+ mCodecConfiguration->rc_target_bitrate *
+ mTemporalLayerBitrateRatio[i] / 100;
+ }
+ if (mIntf->getSyncFramePeriod() >= 0) {
+ mCodecConfiguration->kf_max_dist = mIntf->getSyncFramePeriod();
+ mCodecConfiguration->kf_min_dist = mIntf->getSyncFramePeriod();
+ mCodecConfiguration->kf_mode = VPX_KF_AUTO;
+ }
+ if (mMinQuantizer > 0) {
+ mCodecConfiguration->rc_min_quantizer = mMinQuantizer;
+ }
+ if (mMaxQuantizer > 0) {
+ mCodecConfiguration->rc_max_quantizer = mMaxQuantizer;
+ }
+ setCodecSpecificConfiguration();
+ mCodecContext = new vpx_codec_ctx_t;
+ if (!mCodecContext) goto CleanUp;
+ codec_return = vpx_codec_enc_init(mCodecContext,
+ mCodecInterface,
+ mCodecConfiguration,
+ 0); // flags
+ if (codec_return != VPX_CODEC_OK) {
+ ALOGE("Error initializing vpx encoder");
+ goto CleanUp;
+ }
+
+ // Extra CBR settings
+ if (mBitrateControlMode == VPX_CBR) {
+ codec_return = vpx_codec_control(mCodecContext,
+ VP8E_SET_STATIC_THRESHOLD,
+ 1);
+ if (codec_return == VPX_CODEC_OK) {
+ uint32_t rc_max_intra_target =
+ (uint32_t)(mCodecConfiguration->rc_buf_optimal_sz * mFrameRate->value / 20 + 0.5);
+ // Don't go below 3 times per frame bandwidth.
+ if (rc_max_intra_target < 300) {
+ rc_max_intra_target = 300;
+ }
+ codec_return = vpx_codec_control(mCodecContext,
+ VP8E_SET_MAX_INTRA_BITRATE_PCT,
+ rc_max_intra_target);
+ }
+ if (codec_return == VPX_CODEC_OK) {
+ codec_return = vpx_codec_control(mCodecContext,
+ VP8E_SET_CPUUSED,
+ -8);
+ }
+ if (codec_return != VPX_CODEC_OK) {
+ ALOGE("Error setting cbr parameters for vpx encoder.");
+ goto CleanUp;
+ }
+ }
+
+ codec_return = setCodecSpecificControls();
+ if (codec_return != VPX_CODEC_OK) goto CleanUp;
+
+ {
+ uint32_t width = mSize->width;
+ uint32_t height = mSize->height;
+ if (((uint64_t)width * height) >
+ ((uint64_t)INT32_MAX / 3)) {
+ ALOGE("b/25812794, Buffer size is too big, width=%u, height=%u.", width, height);
+ } else {
+ uint32_t stride = (width + mStrideAlign - 1) & ~(mStrideAlign - 1);
+ uint32_t vstride = (height + mStrideAlign - 1) & ~(mStrideAlign - 1);
+ mConversionBuffer = MemoryBlock::Allocate(stride * vstride * 3 / 2);
+ if (!mConversionBuffer.size()) {
+ ALOGE("Allocating conversion buffer failed.");
+ } else {
+ mNumInputFrames = -1;
+ return OK;
+ }
+ }
+ }
+
+CleanUp:
+ onRelease();
+ return result;
+}
+
+vpx_enc_frame_flags_t C2SoftVpxEnc::getEncodeFlags() {
+ vpx_enc_frame_flags_t flags = 0;
+ if (mTemporalPatternLength > 0) {
+ int patternIdx = mTemporalPatternIdx % mTemporalPatternLength;
+ mTemporalPatternIdx++;
+ switch (mTemporalPattern[patternIdx]) {
+ case kTemporalUpdateLast:
+ flags |= VP8_EFLAG_NO_UPD_GF;
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_REF_GF;
+ flags |= VP8_EFLAG_NO_REF_ARF;
+ break;
+ case kTemporalUpdateGoldenWithoutDependency:
+ flags |= VP8_EFLAG_NO_REF_GF;
+ [[fallthrough]];
+ case kTemporalUpdateGolden:
+ flags |= VP8_EFLAG_NO_REF_ARF;
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_UPD_LAST;
+ break;
+ case kTemporalUpdateAltrefWithoutDependency:
+ flags |= VP8_EFLAG_NO_REF_ARF;
+ flags |= VP8_EFLAG_NO_REF_GF;
+ [[fallthrough]];
+ case kTemporalUpdateAltref:
+ flags |= VP8_EFLAG_NO_UPD_GF;
+ flags |= VP8_EFLAG_NO_UPD_LAST;
+ break;
+ case kTemporalUpdateNoneNoRefAltref:
+ flags |= VP8_EFLAG_NO_REF_ARF;
+ [[fallthrough]];
+ case kTemporalUpdateNone:
+ flags |= VP8_EFLAG_NO_UPD_GF;
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_UPD_LAST;
+ flags |= VP8_EFLAG_NO_UPD_ENTROPY;
+ break;
+ case kTemporalUpdateNoneNoRefGoldenRefAltRef:
+ flags |= VP8_EFLAG_NO_REF_GF;
+ flags |= VP8_EFLAG_NO_UPD_GF;
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_UPD_LAST;
+ flags |= VP8_EFLAG_NO_UPD_ENTROPY;
+ break;
+ case kTemporalUpdateGoldenWithoutDependencyRefAltRef:
+ flags |= VP8_EFLAG_NO_REF_GF;
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_UPD_LAST;
+ break;
+ case kTemporalUpdateLastRefAltRef:
+ flags |= VP8_EFLAG_NO_UPD_GF;
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_REF_GF;
+ break;
+ case kTemporalUpdateGoldenRefAltRef:
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_UPD_LAST;
+ break;
+ case kTemporalUpdateLastAndGoldenRefAltRef:
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_REF_GF;
+ break;
+ case kTemporalUpdateLastRefAll:
+ flags |= VP8_EFLAG_NO_UPD_ARF;
+ flags |= VP8_EFLAG_NO_UPD_GF;
+ break;
+ }
+ }
+ return flags;
+}
+
+// TODO: add support for YUV input color formats
+// TODO: add support for SVC, ARF. SVC and ARF returns multiple frames
+// (hierarchical / noshow) in one call. These frames should be combined in to
+// a single buffer and sent back to the client
+void C2SoftVpxEnc::process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+ // Initialize encoder if not already
+ if (!mCodecContext && OK != initEncoder()) {
+ ALOGE("Failed to initialize encoder");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ std::shared_ptr<const C2GraphicView> rView;
+ std::shared_ptr<C2Buffer> inputBuffer;
+ if (!work->input.buffers.empty()) {
+ inputBuffer = work->input.buffers[0];
+ rView = std::make_shared<const C2GraphicView>(
+ inputBuffer->data().graphicBlocks().front().map().get());
+ if (rView->error() != C2_OK) {
+ ALOGE("graphic view map err = %d", rView->error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ } else {
+ ALOGV("Empty input Buffer");
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ return;
+ }
+
+ const C2ConstGraphicBlock inBuffer =
+ inputBuffer->data().graphicBlocks().front();
+ if (inBuffer.width() != mSize->width ||
+ inBuffer.height() != mSize->height) {
+ ALOGE("unexpected Input buffer attributes %d(%d) x %d(%d)",
+ inBuffer.width(), mSize->width, inBuffer.height(),
+ mSize->height);
+ mSignalledError = true;
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+ bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
+ vpx_image_t raw_frame;
+ const C2PlanarLayout &layout = rView->layout();
+ uint32_t width = rView->width();
+ uint32_t height = rView->height();
+ if (width > 0x8000 || height > 0x8000) {
+ ALOGE("Image too big: %u x %u", width, height);
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+ uint32_t stride = (width + mStrideAlign - 1) & ~(mStrideAlign - 1);
+ uint32_t vstride = (height + mStrideAlign - 1) & ~(mStrideAlign - 1);
+ switch (layout.type) {
+ case C2PlanarLayout::TYPE_RGB:
+ case C2PlanarLayout::TYPE_RGBA: {
+ ConvertRGBToPlanarYUV(mConversionBuffer.data(), stride, vstride,
+ mConversionBuffer.size(), *rView.get());
+ vpx_img_wrap(&raw_frame, VPX_IMG_FMT_I420, width, height,
+ mStrideAlign, mConversionBuffer.data());
+ break;
+ }
+ case C2PlanarLayout::TYPE_YUV: {
+ if (!IsYUV420(*rView)) {
+ ALOGE("input is not YUV420");
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ if (layout.planes[layout.PLANE_Y].colInc == 1
+ && layout.planes[layout.PLANE_U].colInc == 1
+ && layout.planes[layout.PLANE_V].colInc == 1) {
+ // I420 compatible - though with custom offset and stride
+ vpx_img_wrap(&raw_frame, VPX_IMG_FMT_I420, width, height,
+ mStrideAlign, (uint8_t*)rView->data()[0]);
+ raw_frame.planes[1] = (uint8_t*)rView->data()[1];
+ raw_frame.planes[2] = (uint8_t*)rView->data()[2];
+ raw_frame.stride[0] = layout.planes[layout.PLANE_Y].rowInc;
+ raw_frame.stride[1] = layout.planes[layout.PLANE_U].rowInc;
+ raw_frame.stride[2] = layout.planes[layout.PLANE_V].rowInc;
+ } else {
+ // copy to I420
+ MediaImage2 img = CreateYUV420PlanarMediaImage2(width, height, stride, vstride);
+ if (mConversionBuffer.size() >= stride * vstride * 3 / 2) {
+ status_t err = ImageCopy(mConversionBuffer.data(), &img, *rView);
+ if (err != OK) {
+ ALOGE("Buffer conversion failed: %d", err);
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+ vpx_img_wrap(&raw_frame, VPX_IMG_FMT_I420, stride, vstride,
+ mStrideAlign, (uint8_t*)rView->data()[0]);
+ vpx_img_set_rect(&raw_frame, 0, 0, width, height);
+ } else {
+ ALOGE("Conversion buffer is too small: %u x %u for %zu",
+ stride, vstride, mConversionBuffer.size());
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+ }
+ break;
+ }
+ default:
+ ALOGE("Unrecognized plane type: %d", layout.type);
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+
+ vpx_enc_frame_flags_t flags = getEncodeFlags();
+ // handle dynamic config parameters
+ {
+ IntfImpl::Lock lock = mIntf->lock();
+ std::shared_ptr<C2StreamIntraRefreshTuning::output> intraRefresh = mIntf->getIntraRefresh_l();
+ std::shared_ptr<C2StreamBitrateInfo::output> bitrate = mIntf->getBitrate_l();
+ std::shared_ptr<C2StreamRequestSyncFrameTuning::output> requestSync = mIntf->getRequestSync_l();
+ lock.unlock();
+
+ if (intraRefresh != mIntraRefresh) {
+ mIntraRefresh = intraRefresh;
+ ALOGV("Got mIntraRefresh request");
+ }
+
+ if (requestSync != mRequestSync) {
+ // we can handle IDR immediately
+ if (requestSync->value) {
+ // unset request
+ C2StreamRequestSyncFrameTuning::output clearSync(0u, C2_FALSE);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ mIntf->config({ &clearSync }, C2_MAY_BLOCK, &failures);
+ ALOGV("Got sync request");
+ flags |= VPX_EFLAG_FORCE_KF;
+ }
+ mRequestSync = requestSync;
+ }
+
+ if (bitrate != mBitrate) {
+ mBitrate = bitrate;
+ mCodecConfiguration->rc_target_bitrate =
+ (mBitrate->value + 500) / 1000;
+ vpx_codec_err_t res = vpx_codec_enc_config_set(mCodecContext,
+ mCodecConfiguration);
+ if (res != VPX_CODEC_OK) {
+ ALOGE("vpx encoder failed to update bitrate: %s",
+ vpx_codec_err_to_string(res));
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ }
+
+ uint64_t inputTimeStamp = work->input.ordinal.timestamp.peekull();
+ uint32_t frameDuration;
+ if (inputTimeStamp > mLastTimestamp) {
+ frameDuration = (uint32_t)(inputTimeStamp - mLastTimestamp);
+ } else {
+ // Use default of 30 fps in case of 0 frame rate.
+ float frameRate = mFrameRate->value;
+ if (frameRate < 0.001) {
+ frameRate = 30;
+ }
+ frameDuration = (uint32_t)(1000000 / frameRate + 0.5);
+ }
+ mLastTimestamp = inputTimeStamp;
+
+ vpx_codec_err_t codec_return = vpx_codec_encode(mCodecContext, &raw_frame,
+ inputTimeStamp,
+ frameDuration, flags,
+ VPX_DL_REALTIME);
+ if (codec_return != VPX_CODEC_OK) {
+ ALOGE("vpx encoder failed to encode frame");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ bool populated = false;
+ vpx_codec_iter_t encoded_packet_iterator = nullptr;
+ const vpx_codec_cx_pkt_t* encoded_packet;
+ while ((encoded_packet = vpx_codec_get_cx_data(
+ mCodecContext, &encoded_packet_iterator))) {
+ if (encoded_packet->kind == VPX_CODEC_CX_FRAME_PKT) {
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ c2_status_t err = pool->fetchLinearBlock(encoded_packet->data.frame.sz, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock for Output failed with status %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ if (wView.error()) {
+ ALOGE("write view map failed %d", wView.error());
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ memcpy(wView.data(), encoded_packet->data.frame.buf, encoded_packet->data.frame.sz);
+ ++mNumInputFrames;
+
+ ALOGD("bytes generated %zu", encoded_packet->data.frame.sz);
+ uint32_t flags = 0;
+ if (eos) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ std::shared_ptr<C2Buffer> buffer = createLinearBuffer(block);
+ if (encoded_packet->data.frame.flags & VPX_FRAME_IS_KEY) {
+ buffer->setInfo(std::make_shared<C2StreamPictureTypeMaskInfo::output>(
+ 0u /* stream id */, C2PictureTypeKeyFrame));
+ }
+ work->worklets.front()->output.buffers.push_back(buffer);
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->worklets.front()->output.ordinal.timestamp = encoded_packet->data.frame.pts;
+ work->workletsProcessed = 1u;
+ populated = true;
+ if (eos) {
+ mSignalledOutputEos = true;
+ ALOGV("signalled EOS");
+ }
+ }
+ }
+ if (!populated) {
+ work->workletsProcessed = 0u;
+ }
+}
+
+c2_status_t C2SoftVpxEnc::drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) {
+ (void)pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+} // namespace android
diff --git a/media/codec2/components/vpx/C2SoftVpxEnc.h b/media/codec2/components/vpx/C2SoftVpxEnc.h
new file mode 100644
index 0000000..87ed1a9
--- /dev/null
+++ b/media/codec2/components/vpx/C2SoftVpxEnc.h
@@ -0,0 +1,437 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_VPX_ENC_H__
+#define ANDROID_C2_SOFT_VPX_ENC_H__
+
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <C2PlatformSupport.h>
+#include <Codec2BufferUtils.h>
+#include <SimpleC2Component.h>
+#include <SimpleC2Interface.h>
+#include <util/C2InterfaceHelper.h>
+
+#include "vpx/vpx_encoder.h"
+#include "vpx/vpx_codec.h"
+#include "vpx/vpx_image.h"
+#include "vpx/vp8cx.h"
+
+namespace android {
+
+// TODO: These defs taken from deprecated OMX_VideoExt.h. Move these definitions
+// to a new header file and include it.
+
+/** Maximum number of temporal layers */
+#define MAXTEMPORALLAYERS 3
+
+/** temporal layer patterns */
+typedef enum TemporalPatternType {
+ VPXTemporalLayerPatternNone = 0,
+ VPXTemporalLayerPatternWebRTC = 1,
+ VPXTemporalLayerPatternMax = 0x7FFFFFFF
+} TemporalPatternType;
+
+// Base class for a VPX Encoder Component
+//
+// Only following encoder settings are available (codec specific settings might
+// be available in the sub-classes):
+// - video resolution
+// - target bitrate
+// - rate control (constant / variable)
+// - frame rate
+// - error resilience
+// - reconstruction & loop filters (g_profile)
+//
+// Only following color formats are recognized
+// - C2PlanarLayout::TYPE_RGB
+// - C2PlanarLayout::TYPE_RGBA
+//
+// Following settings are not configurable by the client
+// - encoding deadline is realtime
+// - multithreaded encoding utilizes a number of threads equal
+// to online cpu's available
+// - the algorithm interface for encoder is decided by the sub-class in use
+// - fractional bits of frame rate is discarded
+// - timestamps are in microseconds, therefore encoder timebase is fixed
+// to 1/1000000
+
+struct C2SoftVpxEnc : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftVpxEnc(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+
+ // From SimpleC2Component
+ c2_status_t onInit() override final;
+ c2_status_t onStop() override final;
+ void onReset() override final;
+ void onRelease() override final;
+ c2_status_t onFlush_sm() override final;
+
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override final;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override final;
+
+ protected:
+ std::shared_ptr<IntfImpl> mIntf;
+ virtual ~C2SoftVpxEnc();
+
+ // Initializes vpx encoder with available settings.
+ status_t initEncoder();
+
+ // Populates mCodecInterface with codec specific settings.
+ virtual void setCodecSpecificInterface() = 0;
+
+ // Sets codec specific configuration.
+ virtual void setCodecSpecificConfiguration() = 0;
+
+ // Sets codec specific encoder controls.
+ virtual vpx_codec_err_t setCodecSpecificControls() = 0;
+
+ // Get current encode flags.
+ virtual vpx_enc_frame_flags_t getEncodeFlags();
+
+ enum TemporalReferences {
+ // For 1 layer case: reference all (last, golden, and alt ref), but only
+ // update last.
+ kTemporalUpdateLastRefAll = 12,
+ // First base layer frame for 3 temporal layers, which updates last and
+ // golden with alt ref dependency.
+ kTemporalUpdateLastAndGoldenRefAltRef = 11,
+ // First enhancement layer with alt ref dependency.
+ kTemporalUpdateGoldenRefAltRef = 10,
+ // First enhancement layer with alt ref dependency.
+ kTemporalUpdateGoldenWithoutDependencyRefAltRef = 9,
+ // Base layer with alt ref dependency.
+ kTemporalUpdateLastRefAltRef = 8,
+ // Highest enhacement layer without dependency on golden with alt ref
+ // dependency.
+ kTemporalUpdateNoneNoRefGoldenRefAltRef = 7,
+ // Second layer and last frame in cycle, for 2 layers.
+ kTemporalUpdateNoneNoRefAltref = 6,
+ // Highest enhancement layer.
+ kTemporalUpdateNone = 5,
+ // Second enhancement layer.
+ kTemporalUpdateAltref = 4,
+ // Second enhancement layer without dependency on previous frames in
+ // the second enhancement layer.
+ kTemporalUpdateAltrefWithoutDependency = 3,
+ // First enhancement layer.
+ kTemporalUpdateGolden = 2,
+ // First enhancement layer without dependency on previous frames in
+ // the first enhancement layer.
+ kTemporalUpdateGoldenWithoutDependency = 1,
+ // Base layer.
+ kTemporalUpdateLast = 0,
+ };
+ enum {
+ kMaxTemporalPattern = 8
+ };
+
+ // vpx specific opaque data structure that
+ // stores encoder state
+ vpx_codec_ctx_t* mCodecContext;
+
+ // vpx specific data structure that
+ // stores encoder configuration
+ vpx_codec_enc_cfg_t* mCodecConfiguration;
+
+ // vpx specific read-only data structure
+ // that specifies algorithm interface (e.g. vp8)
+ vpx_codec_iface_t* mCodecInterface;
+
+ // align stride to the power of 2
+ int32_t mStrideAlign;
+
+ // Color format for the input port
+ vpx_img_fmt_t mColorFormat;
+
+ // Bitrate control mode, either constant or variable
+ vpx_rc_mode mBitrateControlMode;
+
+ // Parameter that denotes whether error resilience
+ // is enabled in encoder
+ bool mErrorResilience;
+
+ // Minimum (best quality) quantizer
+ uint32_t mMinQuantizer;
+
+ // Maximum (worst quality) quantizer
+ uint32_t mMaxQuantizer;
+
+ // Number of coding temporal layers to be used.
+ size_t mTemporalLayers;
+
+ // Temporal layer bitrare ratio in percentage
+ uint32_t mTemporalLayerBitrateRatio[MAXTEMPORALLAYERS];
+
+ // Temporal pattern type
+ TemporalPatternType mTemporalPatternType;
+
+ // Temporal pattern length
+ size_t mTemporalPatternLength;
+
+ // Temporal pattern current index
+ size_t mTemporalPatternIdx;
+
+ // Frame type temporal pattern
+ TemporalReferences mTemporalPattern[kMaxTemporalPattern];
+
+ // Last input buffer timestamp
+ uint64_t mLastTimestamp;
+
+ // Number of input frames
+ int64_t mNumInputFrames;
+
+ // Conversion buffer is needed to input to
+ // yuv420 planar format.
+ MemoryBlock mConversionBuffer;
+
+ // Signalled EOS
+ bool mSignalledOutputEos;
+
+ // Signalled Error
+ bool mSignalledError;
+
+ // configurations used by component in process
+ // (TODO: keep this in intf but make them internal only)
+ std::shared_ptr<C2StreamPictureSizeInfo::input> mSize;
+ std::shared_ptr<C2StreamIntraRefreshTuning::output> mIntraRefresh;
+ std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
+ std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
+ std::shared_ptr<C2StreamBitrateModeTuning::output> mBitrateMode;
+ std::shared_ptr<C2StreamRequestSyncFrameTuning::output> mRequestSync;
+
+ C2_DO_NOT_COPY(C2SoftVpxEnc);
+};
+
+class C2SoftVpxEnc::IntfImpl : public C2InterfaceHelper {
+ public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper>& helper)
+ : C2InterfaceHelper(helper) {
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(
+ new C2StreamFormatConfig::input(0u, C2FormatVideo))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(
+ new C2StreamFormatConfig::output(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_VIDEO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+#ifdef VP9
+ MEDIA_MIMETYPE_VIDEO_VP9
+#else
+ MEDIA_MIMETYPE_VIDEO_VP8
+#endif
+ ))
+ .build());
+
+ addParameter(DefineParam(mUsage, C2_NAME_INPUT_STREAM_USAGE_SETTING)
+ .withConstValue(new C2StreamUsageTuning::input(
+ 0u, (uint64_t)C2MemoryUsage::CPU_READ))
+ .build());
+
+ addParameter(
+ DefineParam(mSize, C2_NAME_STREAM_VIDEO_SIZE_SETTING)
+ .withDefault(new C2VideoSizeStreamTuning::input(0u, 320, 240))
+ .withFields({
+ C2F(mSize, width).inRange(2, 2048, 2),
+ C2F(mSize, height).inRange(2, 2048, 2),
+ })
+ .withSetter(SizeSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrateMode, C2_PARAMKEY_BITRATE_MODE)
+ .withDefault(new C2StreamBitrateModeTuning::output(
+ 0u, C2Config::BITRATE_CONST))
+ .withFields({
+ C2F(mBitrateMode, value).oneOf({
+ C2Config::BITRATE_CONST, C2Config::BITRATE_VARIABLE })
+ })
+ .withSetter(
+ Setter<decltype(*mBitrateMode)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mFrameRate, C2_NAME_STREAM_FRAME_RATE_SETTING)
+ .withDefault(new C2StreamFrameRateInfo::output(0u, 30.))
+ // TODO: More restriction?
+ .withFields({C2F(mFrameRate, value).greaterThan(0.)})
+ .withSetter(
+ Setter<decltype(*mFrameRate)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mLayering, C2_PARAMKEY_TEMPORAL_LAYERING)
+ .withDefault(C2StreamTemporalLayeringTuning::output::AllocShared(0u, 0, 0, 0))
+ .withFields({
+ C2F(mLayering, m.layerCount).inRange(0, 4),
+ C2F(mLayering, m.bLayerCount).inRange(0, 0),
+ C2F(mLayering, m.bitrateRatios).inRange(0., 1.)
+ })
+ .withSetter(LayeringSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mSyncFramePeriod, C2_PARAMKEY_SYNC_FRAME_INTERVAL)
+ .withDefault(new C2StreamSyncFrameIntervalTuning::output(0u, 1000000))
+ .withFields({C2F(mSyncFramePeriod, value).any()})
+ .withSetter(Setter<decltype(*mSyncFramePeriod)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::output(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(4096, 40000000)})
+ .withSetter(BitrateSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mIntraRefresh, C2_PARAMKEY_INTRA_REFRESH)
+ .withConstValue(new C2StreamIntraRefreshTuning::output(
+ 0u, C2Config::INTRA_REFRESH_DISABLED, 0.))
+ .build());
+
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::output(
+ 0u, PROFILE_VP9_0, LEVEL_VP9_4_1))
+ .withFields({
+ C2F(mProfileLevel, profile).equalTo(
+ PROFILE_VP9_0
+ ),
+ C2F(mProfileLevel, level).equalTo(
+ LEVEL_VP9_4_1),
+ })
+ .withSetter(ProfileLevelSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mRequestSync, C2_PARAMKEY_REQUEST_SYNC_FRAME)
+ .withDefault(new C2StreamRequestSyncFrameTuning::output(0u, C2_FALSE))
+ .withFields({C2F(mRequestSync, value).oneOf({ C2_FALSE, C2_TRUE }) })
+ .withSetter(Setter<decltype(*mRequestSync)>::NonStrictValueWithNoDeps)
+ .build());
+ }
+
+ static C2R BitrateSetter(bool mayBlock, C2P<C2StreamBitrateInfo::output> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (me.v.value <= 4096) {
+ me.set().value = 4096;
+ }
+ return res;
+ }
+
+ static C2R SizeSetter(bool mayBlock, const C2P<C2StreamPictureSizeInfo::input> &oldMe,
+ C2P<C2StreamPictureSizeInfo::input> &me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
+ me.set().width = oldMe.v.width;
+ }
+ if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
+ res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
+ me.set().height = oldMe.v.height;
+ }
+ return res;
+ }
+
+ static C2R ProfileLevelSetter(
+ bool mayBlock,
+ C2P<C2StreamProfileLevelInfo::output> &me) {
+ (void)mayBlock;
+ if (!me.F(me.v.profile).supportsAtAll(me.v.profile)) {
+ me.set().profile = PROFILE_VP9_0;
+ }
+ if (!me.F(me.v.level).supportsAtAll(me.v.level)) {
+ me.set().level = LEVEL_VP9_4_1;
+ }
+ return C2R::Ok();
+ }
+
+ static C2R LayeringSetter(bool mayBlock, C2P<C2StreamTemporalLayeringTuning::output>& me) {
+ (void)mayBlock;
+ C2R res = C2R::Ok();
+ if (me.v.m.layerCount > 4) {
+ me.set().m.layerCount = 4;
+ }
+ me.set().m.bLayerCount = 0;
+ // ensure ratios are monotonic and clamped between 0 and 1
+ for (size_t ix = 0; ix < me.v.flexCount(); ++ix) {
+ me.set().m.bitrateRatios[ix] = c2_clamp(
+ ix > 0 ? me.v.m.bitrateRatios[ix - 1] : 0, me.v.m.bitrateRatios[ix], 1.);
+ }
+ ALOGI("setting temporal layering %u + %u", me.v.m.layerCount, me.v.m.bLayerCount);
+ return res;
+ }
+
+ // unsafe getters
+ std::shared_ptr<C2StreamPictureSizeInfo::input> getSize_l() const { return mSize; }
+ std::shared_ptr<C2StreamIntraRefreshTuning::output> getIntraRefresh_l() const { return mIntraRefresh; }
+ std::shared_ptr<C2StreamFrameRateInfo::output> getFrameRate_l() const { return mFrameRate; }
+ std::shared_ptr<C2StreamBitrateInfo::output> getBitrate_l() const { return mBitrate; }
+ std::shared_ptr<C2StreamBitrateModeTuning::output> getBitrateMode_l() const { return mBitrateMode; }
+ std::shared_ptr<C2StreamRequestSyncFrameTuning::output> getRequestSync_l() const { return mRequestSync; }
+ std::shared_ptr<C2StreamTemporalLayeringTuning::output> getTemporalLayers_l() const { return mLayering; }
+ uint32_t getSyncFramePeriod() const {
+ if (mSyncFramePeriod->value < 0 || mSyncFramePeriod->value == INT64_MAX) {
+ return 0;
+ }
+ double period = mSyncFramePeriod->value / 1e6 * mFrameRate->value;
+ return (uint32_t)c2_max(c2_min(period + 0.5, double(UINT32_MAX)), 1.);
+ }
+
+ private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamUsageTuning::input> mUsage;
+ std::shared_ptr<C2VideoSizeStreamTuning::input> mSize;
+ std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
+ std::shared_ptr<C2StreamTemporalLayeringTuning::output> mLayering;
+ std::shared_ptr<C2StreamIntraRefreshTuning::output> mIntraRefresh;
+ std::shared_ptr<C2StreamRequestSyncFrameTuning::output> mRequestSync;
+ std::shared_ptr<C2StreamSyncFrameIntervalTuning::output> mSyncFramePeriod;
+ std::shared_ptr<C2BitrateTuning::output> mBitrate;
+ std::shared_ptr<C2StreamBitrateModeTuning::output> mBitrateMode;
+ std::shared_ptr<C2StreamProfileLevelInfo::output> mProfileLevel;
+};
+
+} // namespace android
+
+#endif // ANDROID_C2_SOFT_VPX_ENC_H__
diff --git a/media/codec2/components/vpx/MODULE_LICENSE_APACHE2 b/media/codec2/components/vpx/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/media/codec2/components/vpx/MODULE_LICENSE_APACHE2
diff --git a/media/codec2/components/vpx/NOTICE b/media/codec2/components/vpx/NOTICE
new file mode 100644
index 0000000..faed58a
--- /dev/null
+++ b/media/codec2/components/vpx/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2013, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You 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.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/media/codec2/components/xaac/Android.bp b/media/codec2/components/xaac/Android.bp
new file mode 100644
index 0000000..7795cc1
--- /dev/null
+++ b/media/codec2/components/xaac/Android.bp
@@ -0,0 +1,11 @@
+cc_library_shared {
+ name: "libcodec2_soft_xaacdec",
+ defaults: [
+ "libcodec2_soft-defaults",
+ "libcodec2_soft_sanitize_all-defaults",
+ ],
+
+ srcs: ["C2SoftXaacDec.cpp"],
+
+ static_libs: ["libxaacdec"],
+}
diff --git a/media/codec2/components/xaac/C2SoftXaacDec.cpp b/media/codec2/components/xaac/C2SoftXaacDec.cpp
new file mode 100644
index 0000000..1c0e70b
--- /dev/null
+++ b/media/codec2/components/xaac/C2SoftXaacDec.cpp
@@ -0,0 +1,1583 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftXaacDec"
+#include <log/log.h>
+
+#include <inttypes.h>
+
+#include <cutils/properties.h>
+#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/MediaDefs.h>
+#include <media/stagefright/foundation/hexdump.h>
+
+#include <C2PlatformSupport.h>
+#include <SimpleC2Interface.h>
+
+#include "C2SoftXaacDec.h"
+
+#define DRC_DEFAULT_MOBILE_REF_LEVEL -16.0 /* 64*-0.25dB = -16 dB below full scale for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_CUT 1.0 /* maximum compression of dynamic range for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_BOOST 1.0 /* maximum compression of dynamic range for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_HEAVY C2Config::DRC_COMPRESSION_HEAVY /* switch for heavy compression for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_EFFECT 3 /* MPEG-D DRC effect type; 3 => Limited playback range */
+#define DRC_DEFAULT_MOBILE_ENC_LEVEL (0.25) /* encoder target level; -1 => the value is unknown, otherwise dB step value (e.g. 64 for -16 dB) */
+#define MAX_CHANNEL_COUNT 8 /* maximum number of audio channels that can be decoded */
+// names of properties that can be used to override the default DRC settings
+#define PROP_DRC_OVERRIDE_REF_LEVEL "aac_drc_reference_level"
+#define PROP_DRC_OVERRIDE_CUT "aac_drc_cut"
+#define PROP_DRC_OVERRIDE_BOOST "aac_drc_boost"
+#define PROP_DRC_OVERRIDE_HEAVY "aac_drc_heavy"
+#define PROP_DRC_OVERRIDE_ENC_LEVEL "aac_drc_enc_target_level"
+#define PROP_DRC_OVERRIDE_EFFECT_TYPE "ro.aac_drc_effect_type"
+
+#define RETURN_IF_FATAL(retval, str) \
+ if (retval & IA_FATAL_ERROR) { \
+ ALOGE("Error in %s: Returned: %d", str, retval); \
+ return retval; \
+ } else if (retval != IA_NO_ERROR) { \
+ ALOGW("Warning in %s: Returned: %d", str, retval); \
+ }
+
+
+namespace android {
+
+constexpr char COMPONENT_NAME[] = "c2.android.xaac.decoder";
+
+class C2SoftXaacDec::IntfImpl : public C2InterfaceHelper {
+public:
+ explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatCompressed))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
+ .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatAudio))
+ .build());
+
+ addParameter(
+ DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
+ MEDIA_MIMETYPE_AUDIO_AAC))
+ .build());
+
+ addParameter(
+ DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
+ .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
+ MEDIA_MIMETYPE_AUDIO_RAW))
+ .build());
+
+ addParameter(
+ DefineParam(mSampleRate, C2_NAME_STREAM_SAMPLE_RATE_SETTING)
+ .withDefault(new C2StreamSampleRateInfo::output(0u, 44100))
+ .withFields({C2F(mSampleRate, value).oneOf({
+ 7350, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
+ })})
+ .withSetter((Setter<decltype(*mSampleRate)>::StrictValueWithNoDeps))
+ .build());
+
+ addParameter(
+ DefineParam(mChannelCount, C2_NAME_STREAM_CHANNEL_COUNT_SETTING)
+ .withDefault(new C2StreamChannelCountInfo::output(0u, 1))
+ .withFields({C2F(mChannelCount, value).inRange(1, 8)})
+ .withSetter(Setter<decltype(*mChannelCount)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
+ .withDefault(new C2BitrateTuning::input(0u, 64000))
+ .withFields({C2F(mBitrate, value).inRange(8000, 960000)})
+ .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mInputMaxBufSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE)
+ .withConstValue(new C2StreamMaxBufferSizeInfo::input(0u, 8192))
+ .build());
+
+ addParameter(
+ DefineParam(mAacFormat, C2_NAME_STREAM_AAC_FORMAT_SETTING)
+ .withDefault(new C2StreamAacFormatInfo::input(0u, C2AacStreamFormatRaw))
+ .withFields({C2F(mAacFormat, value).oneOf({
+ C2AacStreamFormatRaw, C2AacStreamFormatAdts
+ })})
+ .withSetter(Setter<decltype(*mAacFormat)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mProfileLevel, C2_PARAMKEY_PROFILE_LEVEL)
+ .withDefault(new C2StreamProfileLevelInfo::input(0u,
+ C2Config::PROFILE_AAC_LC, C2Config::LEVEL_UNUSED))
+ .withFields({
+ C2F(mProfileLevel, profile).oneOf({
+ C2Config::PROFILE_AAC_LC,
+ C2Config::PROFILE_AAC_HE,
+ C2Config::PROFILE_AAC_HE_PS,
+ C2Config::PROFILE_AAC_LD,
+ C2Config::PROFILE_AAC_ELD,
+ C2Config::PROFILE_AAC_XHE}),
+ C2F(mProfileLevel, level).oneOf({
+ C2Config::LEVEL_UNUSED
+ })
+ })
+ .withSetter(ProfileLevelSetter)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcCompressMode, C2_PARAMKEY_DRC_COMPRESSION_MODE)
+ .withDefault(new C2StreamDrcCompressionModeTuning::input(0u, C2Config::DRC_COMPRESSION_HEAVY))
+ .withFields({
+ C2F(mDrcCompressMode, value).oneOf({
+ C2Config::DRC_COMPRESSION_ODM_DEFAULT,
+ C2Config::DRC_COMPRESSION_NONE,
+ C2Config::DRC_COMPRESSION_LIGHT,
+ C2Config::DRC_COMPRESSION_HEAVY})
+ })
+ .withSetter(Setter<decltype(*mDrcCompressMode)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcTargetRefLevel, C2_PARAMKEY_DRC_TARGET_REFERENCE_LEVEL)
+ .withDefault(new C2StreamDrcTargetReferenceLevelTuning::input(0u, DRC_DEFAULT_MOBILE_REF_LEVEL))
+ .withFields({C2F(mDrcTargetRefLevel, value).inRange(-31.75, 0.25)})
+ .withSetter(Setter<decltype(*mDrcTargetRefLevel)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcEncTargetLevel, C2_PARAMKEY_DRC_ENCODED_TARGET_LEVEL)
+ .withDefault(new C2StreamDrcEncodedTargetLevelTuning::input(0u, DRC_DEFAULT_MOBILE_ENC_LEVEL))
+ .withFields({C2F(mDrcEncTargetLevel, value).inRange(-31.75, 0.25)})
+ .withSetter(Setter<decltype(*mDrcEncTargetLevel)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcBoostFactor, C2_PARAMKEY_DRC_BOOST_FACTOR)
+ .withDefault(new C2StreamDrcBoostFactorTuning::input(0u, DRC_DEFAULT_MOBILE_DRC_BOOST))
+ .withFields({C2F(mDrcBoostFactor, value).inRange(0, 1.)})
+ .withSetter(Setter<decltype(*mDrcBoostFactor)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcAttenuationFactor, C2_PARAMKEY_DRC_ATTENUATION_FACTOR)
+ .withDefault(new C2StreamDrcAttenuationFactorTuning::input(0u, DRC_DEFAULT_MOBILE_DRC_CUT))
+ .withFields({C2F(mDrcAttenuationFactor, value).inRange(0, 1.)})
+ .withSetter(Setter<decltype(*mDrcAttenuationFactor)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
+ DefineParam(mDrcEffectType, C2_PARAMKEY_DRC_EFFECT_TYPE)
+ .withDefault(new C2StreamDrcEffectTypeTuning::input(0u, C2Config::DRC_EFFECT_LIMITED_PLAYBACK_RANGE))
+ .withFields({
+ C2F(mDrcEffectType, value).oneOf({
+ C2Config::DRC_EFFECT_ODM_DEFAULT,
+ C2Config::DRC_EFFECT_OFF,
+ C2Config::DRC_EFFECT_NONE,
+ C2Config::DRC_EFFECT_LATE_NIGHT,
+ C2Config::DRC_EFFECT_NOISY_ENVIRONMENT,
+ C2Config::DRC_EFFECT_LIMITED_PLAYBACK_RANGE,
+ C2Config::DRC_EFFECT_LOW_PLAYBACK_LEVEL,
+ C2Config::DRC_EFFECT_DIALOG_ENHANCEMENT,
+ C2Config::DRC_EFFECT_GENERAL_COMPRESSION})
+ })
+ .withSetter(Setter<decltype(*mDrcEffectType)>::StrictValueWithNoDeps)
+ .build());
+ }
+
+ bool isAdts() const { return mAacFormat->value == C2AacStreamFormatAdts; }
+ uint32_t getBitrate() const { return mBitrate->value; }
+ static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::input> &me) {
+ (void)mayBlock;
+ (void)me; // TODO: validate
+ return C2R::Ok();
+ }
+ int32_t getDrcCompressMode() const { return mDrcCompressMode->value == C2Config::DRC_COMPRESSION_HEAVY ? 1 : 0; }
+ int32_t getDrcTargetRefLevel() const { return (mDrcTargetRefLevel->value <= 0 ? -mDrcTargetRefLevel->value * 4. + 0.5 : -1); }
+ int32_t getDrcEncTargetLevel() const { return (mDrcEncTargetLevel->value <= 0 ? -mDrcEncTargetLevel->value * 4. + 0.5 : -1); }
+ int32_t getDrcBoostFactor() const { return mDrcBoostFactor->value * 127. + 0.5; }
+ int32_t getDrcAttenuationFactor() const { return mDrcAttenuationFactor->value * 127. + 0.5; }
+ int32_t getDrcEffectType() const { return mDrcEffectType->value; }
+
+private:
+ std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
+ std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
+ std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
+ std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
+ std::shared_ptr<C2StreamSampleRateInfo::output> mSampleRate;
+ std::shared_ptr<C2StreamChannelCountInfo::output> mChannelCount;
+ std::shared_ptr<C2BitrateTuning::input> mBitrate;
+ std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
+ std::shared_ptr<C2StreamAacFormatInfo::input> mAacFormat;
+ std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
+ std::shared_ptr<C2StreamDrcCompressionModeTuning::input> mDrcCompressMode;
+ std::shared_ptr<C2StreamDrcTargetReferenceLevelTuning::input> mDrcTargetRefLevel;
+ std::shared_ptr<C2StreamDrcEncodedTargetLevelTuning::input> mDrcEncTargetLevel;
+ std::shared_ptr<C2StreamDrcBoostFactorTuning::input> mDrcBoostFactor;
+ std::shared_ptr<C2StreamDrcAttenuationFactorTuning::input> mDrcAttenuationFactor;
+ std::shared_ptr<C2StreamDrcEffectTypeTuning::input> mDrcEffectType;
+ // TODO Add : C2StreamAacSbrModeTuning
+};
+
+C2SoftXaacDec::C2SoftXaacDec(
+ const char* name,
+ c2_node_id_t id,
+ const std::shared_ptr<IntfImpl> &intfImpl)
+ : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
+ mIntf(intfImpl),
+ mXheaacCodecHandle(nullptr),
+ mMpegDDrcHandle(nullptr),
+ mOutputDrainBuffer(nullptr) {
+}
+
+C2SoftXaacDec::~C2SoftXaacDec() {
+ onRelease();
+}
+
+c2_status_t C2SoftXaacDec::onInit() {
+ mOutputFrameLength = 1024;
+ mInputBuffer = nullptr;
+ mOutputBuffer = nullptr;
+ mSampFreq = 0;
+ mNumChannels = 0;
+ mPcmWdSz = 0;
+ mChannelMask = 0;
+ mNumOutBytes = 0;
+ mCurFrameIndex = 0;
+ mCurTimestamp = 0;
+ mIsCodecInitialized = false;
+ mIsCodecConfigFlushRequired = false;
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+ mOutputDrainBufferWritePos = 0;
+ mDRCFlag = 0;
+ mMpegDDRCPresent = 0;
+ mMemoryVec.clear();
+ mDrcMemoryVec.clear();
+
+ IA_ERRORCODE err = initDecoder();
+ return err == IA_NO_ERROR ? C2_OK : C2_CORRUPTED;
+
+}
+
+c2_status_t C2SoftXaacDec::onStop() {
+ mOutputFrameLength = 1024;
+ drainDecoder();
+ // reset the "configured" state
+ mSampFreq = 0;
+ mNumChannels = 0;
+ mPcmWdSz = 0;
+ mChannelMask = 0;
+ mNumOutBytes = 0;
+ mCurFrameIndex = 0;
+ mCurTimestamp = 0;
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+ mOutputDrainBufferWritePos = 0;
+ mDRCFlag = 0;
+ mMpegDDRCPresent = 0;
+
+ return C2_OK;
+}
+
+void C2SoftXaacDec::onReset() {
+ (void)onStop();
+}
+
+void C2SoftXaacDec::onRelease() {
+ IA_ERRORCODE errCode = deInitXAACDecoder();
+ if (IA_NO_ERROR != errCode) ALOGE("deInitXAACDecoder() failed %d", errCode);
+
+ errCode = deInitMPEGDDDrc();
+ if (IA_NO_ERROR != errCode) ALOGE("deInitMPEGDDDrc() failed %d", errCode);
+
+ if (mOutputDrainBuffer) {
+ delete[] mOutputDrainBuffer;
+ mOutputDrainBuffer = nullptr;
+ }
+}
+
+IA_ERRORCODE C2SoftXaacDec::initDecoder() {
+ ALOGV("initDecoder()");
+ IA_ERRORCODE err_code = IA_NO_ERROR;
+
+ err_code = initXAACDecoder();
+ if (err_code != IA_NO_ERROR) {
+ ALOGE("initXAACDecoder Failed");
+ /* Call deInit to free any allocated memory */
+ deInitXAACDecoder();
+ return IA_FATAL_ERROR;
+ }
+
+ if (!mOutputDrainBuffer) {
+ mOutputDrainBuffer = new (std::nothrow) char[kOutputDrainBufferSize];
+ if (!mOutputDrainBuffer) return IA_FATAL_ERROR;
+ }
+
+ err_code = initXAACDrc();
+ RETURN_IF_FATAL(err_code, "initXAACDrc");
+
+
+ return IA_NO_ERROR;
+}
+
+static void fillEmptyWork(const std::unique_ptr<C2Work>& work) {
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+}
+
+void C2SoftXaacDec::finishWork(const std::unique_ptr<C2Work>& work,
+ const std::shared_ptr<C2BlockPool>& pool) {
+ ALOGV("mCurFrameIndex = %" PRIu64, mCurFrameIndex);
+
+ std::shared_ptr<C2LinearBlock> block;
+ C2MemoryUsage usage = {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE};
+ // TODO: error handling, proper usage, etc.
+ c2_status_t err =
+ pool->fetchLinearBlock(mOutputDrainBufferWritePos, usage, &block);
+ if (err != C2_OK) {
+ ALOGE("fetchLinearBlock failed : err = %d", err);
+ work->result = C2_NO_MEMORY;
+ return;
+ }
+ C2WriteView wView = block->map().get();
+ int16_t* outBuffer = reinterpret_cast<int16_t*>(wView.data());
+ memcpy(outBuffer, mOutputDrainBuffer, mOutputDrainBufferWritePos);
+ mOutputDrainBufferWritePos = 0;
+
+ auto fillWork = [buffer = createLinearBuffer(block)](
+ const std::unique_ptr<C2Work>& work) {
+ uint32_t flags = 0;
+ if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ ALOGV("signalling eos");
+ }
+ work->worklets.front()->output.flags = (C2FrameData::flags_t)flags;
+ work->worklets.front()->output.buffers.clear();
+ work->worklets.front()->output.buffers.push_back(buffer);
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->workletsProcessed = 1u;
+ };
+ if (work && work->input.ordinal.frameIndex == c2_cntr64_t(mCurFrameIndex)) {
+ fillWork(work);
+ } else {
+ finish(mCurFrameIndex, fillWork);
+ }
+
+ ALOGV("out timestamp %" PRIu64 " / %u", mCurTimestamp, block->capacity());
+}
+
+void C2SoftXaacDec::process(const std::unique_ptr<C2Work>& work,
+ const std::shared_ptr<C2BlockPool>& pool) {
+ // Initialize output work
+ work->result = C2_OK;
+ work->workletsProcessed = 1u;
+ work->worklets.front()->output.configUpdate.clear();
+ work->worklets.front()->output.flags = work->input.flags;
+
+ if (mSignalledError || mSignalledOutputEos) {
+ work->result = C2_BAD_VALUE;
+ return;
+ }
+ uint8_t* inBuffer = nullptr;
+ uint32_t inBufferLength = 0;
+ C2ReadView view = mDummyReadView;
+ size_t offset = 0u;
+ size_t size = 0u;
+ if (!work->input.buffers.empty()) {
+ view = work->input.buffers[0]->data().linearBlocks().front().map().get();
+ size = view.capacity();
+ }
+ if (size && view.error()) {
+ ALOGE("read view map failed %d", view.error());
+ work->result = view.error();
+ return;
+ }
+
+ bool eos = (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0;
+ bool codecConfig =
+ (work->input.flags & C2FrameData::FLAG_CODEC_CONFIG) != 0;
+ if (codecConfig) {
+ if (size == 0u) {
+ ALOGE("empty codec config");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ // const_cast because of libAACdec method signature.
+ inBuffer = const_cast<uint8_t*>(view.data() + offset);
+ inBufferLength = size;
+
+ /* GA header configuration sent to Decoder! */
+ IA_ERRORCODE err_code = configXAACDecoder(inBuffer, inBufferLength);
+ if (IA_NO_ERROR != err_code) {
+ ALOGE("configXAACDecoder err_code = %d", err_code);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ work->worklets.front()->output.flags = work->input.flags;
+ work->worklets.front()->output.ordinal = work->input.ordinal;
+ work->worklets.front()->output.buffers.clear();
+ return;
+ }
+
+ mCurFrameIndex = work->input.ordinal.frameIndex.peeku();
+ mCurTimestamp = work->input.ordinal.timestamp.peeku();
+ mOutputDrainBufferWritePos = 0;
+ char* tempOutputDrainBuffer = mOutputDrainBuffer;
+ while (size > 0u) {
+ if ((kOutputDrainBufferSize * sizeof(int16_t) -
+ mOutputDrainBufferWritePos) <
+ (mOutputFrameLength * sizeof(int16_t) * mNumChannels)) {
+ ALOGV("skipping decode: not enough space left in DrainBuffer");
+ break;
+ }
+
+ ALOGV("inAttribute size = %zu", size);
+ if (mIntf->isAdts()) {
+ ALOGV("ADTS");
+ size_t adtsHeaderSize = 0;
+ // skip 30 bits, aac_frame_length follows.
+ // ssssssss ssssiiip ppffffPc ccohCCll llllllll lll?????
+
+ const uint8_t* adtsHeader = view.data() + offset;
+ bool signalError = false;
+ if (size < 7) {
+ ALOGE("Audio data too short to contain even the ADTS header. "
+ "Got %zu bytes.", size);
+ hexdump(adtsHeader, size);
+ signalError = true;
+ } else {
+ bool protectionAbsent = (adtsHeader[1] & 1);
+ unsigned aac_frame_length = ((adtsHeader[3] & 3) << 11) |
+ (adtsHeader[4] << 3) |
+ (adtsHeader[5] >> 5);
+
+ if (size < aac_frame_length) {
+ ALOGE("Not enough audio data for the complete frame. "
+ "Got %zu bytes, frame size according to the ADTS "
+ "header is %u bytes.", size, aac_frame_length);
+ hexdump(adtsHeader, size);
+ signalError = true;
+ } else {
+ adtsHeaderSize = (protectionAbsent ? 7 : 9);
+ if (aac_frame_length < adtsHeaderSize) {
+ signalError = true;
+ } else {
+ // const_cast because of libAACdec method signature.
+ inBuffer =
+ const_cast<uint8_t*>(adtsHeader + adtsHeaderSize);
+ inBufferLength = aac_frame_length - adtsHeaderSize;
+
+ offset += adtsHeaderSize;
+ size -= adtsHeaderSize;
+ }
+ }
+ }
+
+ if (signalError) {
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ } else {
+ ALOGV("Non ADTS");
+ // const_cast because of libAACdec method signature.
+ inBuffer = const_cast<uint8_t*>(view.data() + offset);
+ inBufferLength = size;
+ }
+
+ signed int prevSampleRate = mSampFreq;
+ signed int prevNumChannels = mNumChannels;
+
+ /* XAAC decoder expects first frame to be fed via configXAACDecoder API
+ * which should initialize the codec. Once this state is reached, call the
+ * decodeXAACStream API with same frame to decode! */
+ if (!mIsCodecInitialized) {
+ IA_ERRORCODE err_code = configXAACDecoder(inBuffer, inBufferLength);
+ if (IA_NO_ERROR != err_code) {
+ ALOGE("configXAACDecoder Failed 2 err_code = %d", err_code);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ if ((mSampFreq != prevSampleRate) ||
+ (mNumChannels != prevNumChannels)) {
+ ALOGI("Reconfiguring decoder: %d->%d Hz, %d->%d channels",
+ prevSampleRate, mSampFreq, prevNumChannels, mNumChannels);
+
+ C2StreamSampleRateInfo::output sampleRateInfo(0u, mSampFreq);
+ C2StreamChannelCountInfo::output channelCountInfo(0u, mNumChannels);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mIntf->config(
+ { &sampleRateInfo, &channelCountInfo },
+ C2_MAY_BLOCK,
+ &failures);
+ if (err == OK) {
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(sampleRateInfo));
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(channelCountInfo));
+ } else {
+ ALOGE("Config Update failed");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ }
+ }
+
+ signed int bytesConsumed = 0;
+ IA_ERRORCODE errorCode = IA_NO_ERROR;
+ if (mIsCodecInitialized) {
+ mIsCodecConfigFlushRequired = true;
+ errorCode = decodeXAACStream(inBuffer, inBufferLength,
+ &bytesConsumed, &mNumOutBytes);
+ } else if (!mIsCodecConfigFlushRequired) {
+ ALOGW("Assumption that first frame after header initializes decoder Failed!");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ size -= bytesConsumed;
+ offset += bytesConsumed;
+
+ if (inBufferLength != (uint32_t)bytesConsumed)
+ ALOGW("All data not consumed");
+
+ /* In case of error, decoder would have given out empty buffer */
+ if ((IA_NO_ERROR != errorCode) && (0 == mNumOutBytes) && mIsCodecInitialized)
+ mNumOutBytes = mOutputFrameLength * (mPcmWdSz / 8) * mNumChannels;
+
+ if (!bytesConsumed) {
+ ALOGW("bytesConsumed = 0 should never happen");
+ }
+
+ if ((uint32_t)mNumOutBytes >
+ mOutputFrameLength * sizeof(int16_t) * mNumChannels) {
+ ALOGE("mNumOutBytes > mOutputFrameLength * sizeof(int16_t) * mNumChannels, should never happen");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+
+ if (IA_NO_ERROR != errorCode) {
+ // TODO: check for overflow, ASAN
+ memset(mOutputBuffer, 0, mNumOutBytes);
+
+ // Discard input buffer.
+ size = 0;
+
+ // fall through
+ }
+ memcpy(tempOutputDrainBuffer, mOutputBuffer, mNumOutBytes);
+ tempOutputDrainBuffer += mNumOutBytes;
+ mOutputDrainBufferWritePos += mNumOutBytes;
+ }
+
+ if (mOutputDrainBufferWritePos) {
+ finishWork(work, pool);
+ } else {
+ fillEmptyWork(work);
+ }
+ if (eos) mSignalledOutputEos = true;
+}
+
+c2_status_t C2SoftXaacDec::drain(uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool>& pool) {
+ (void)pool;
+ if (drainMode == NO_DRAIN) {
+ ALOGW("drain with NO_DRAIN: no-op");
+ return C2_OK;
+ }
+ if (drainMode == DRAIN_CHAIN) {
+ ALOGW("DRAIN_CHAIN not supported");
+ return C2_OMITTED;
+ }
+
+ return C2_OK;
+}
+
+IA_ERRORCODE C2SoftXaacDec::configflushDecode() {
+ IA_ERRORCODE err_code;
+ uint32_t ui_init_done;
+ uint32_t inBufferLength = 8203;
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INIT,
+ IA_CMD_TYPE_FLUSH_MEM,
+ nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_FLUSH_MEM");
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_INPUT_BYTES,
+ 0,
+ &inBufferLength);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_INPUT_BYTES");
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INIT,
+ IA_CMD_TYPE_FLUSH_MEM,
+ nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_FLUSH_MEM");
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_DONE_QUERY,
+ &ui_init_done);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_DONE_QUERY");
+
+ if (ui_init_done) {
+ err_code = getXAACStreamInfo();
+ RETURN_IF_FATAL(err_code, "getXAACStreamInfo");
+ ALOGV("Found Codec with below config---\nsampFreq %d\nnumChannels %d\npcmWdSz %d\nchannelMask %d\noutputFrameLength %d",
+ mSampFreq, mNumChannels, mPcmWdSz, mChannelMask, mOutputFrameLength);
+ mIsCodecInitialized = true;
+ }
+ return IA_NO_ERROR;
+}
+
+c2_status_t C2SoftXaacDec::onFlush_sm() {
+ if (mIsCodecInitialized) {
+ IA_ERRORCODE err_code = configflushDecode();
+ if (err_code != IA_NO_ERROR) {
+ ALOGE("Error in configflushDecode: Error %d", err_code);
+ }
+ }
+ drainDecoder();
+ mSignalledOutputEos = false;
+ mSignalledError = false;
+
+ return C2_OK;
+}
+
+IA_ERRORCODE C2SoftXaacDec::drainDecoder() {
+ /* Output delay compensation logic should sit here. */
+ /* Nothing to be done as XAAC decoder does not introduce output buffer delay */
+
+ return 0;
+}
+
+IA_ERRORCODE C2SoftXaacDec::initXAACDecoder() {
+ /* First part */
+ /* Error Handler Init */
+ /* Get Library Name, Library Version and API Version */
+ /* Initialize API structure + Default config set */
+ /* Set config params from user */
+ /* Initialize memory tables */
+ /* Get memory information and allocate memory */
+
+ mInputBufferSize = 0;
+ mInputBuffer = nullptr;
+ mOutputBuffer = nullptr;
+ /* Process struct initing end */
+
+ /* ******************************************************************/
+ /* Initialize API structure and set config params to default */
+ /* ******************************************************************/
+ /* API size */
+ uint32_t pui_api_size;
+ /* Get the API size */
+ IA_ERRORCODE err_code = ixheaacd_dec_api(nullptr,
+ IA_API_CMD_GET_API_SIZE,
+ 0,
+ &pui_api_size);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_API_SIZE");
+
+ /* Allocate memory for API */
+ mXheaacCodecHandle = memalign(4, pui_api_size);
+ if (!mXheaacCodecHandle) {
+ ALOGE("malloc for pui_api_size + 4 >> %d Failed", pui_api_size + 4);
+ return IA_FATAL_ERROR;
+ }
+ mMemoryVec.push(mXheaacCodecHandle);
+
+ /* Set the config params to default values */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS,
+ nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS");
+
+ /* Get the API size */
+ err_code = ia_drc_dec_api(nullptr, IA_API_CMD_GET_API_SIZE, 0, &pui_api_size);
+
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_API_SIZE");
+
+ /* Allocate memory for API */
+ mMpegDDrcHandle = memalign(4, pui_api_size);
+ if (!mMpegDDrcHandle) {
+ ALOGE("malloc for pui_api_size + 4 >> %d Failed", pui_api_size + 4);
+ return IA_FATAL_ERROR;
+ }
+ mMemoryVec.push(mMpegDDrcHandle);
+
+ /* Set the config params to default values */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS, nullptr);
+
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS");
+
+ /* ******************************************************************/
+ /* Set config parameters */
+ /* ******************************************************************/
+ uint32_t ui_mp4_flag = 1;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISMP4,
+ &ui_mp4_flag);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISMP4");
+
+ /* ******************************************************************/
+ /* Initialize Memory info tables */
+ /* ******************************************************************/
+ uint32_t ui_proc_mem_tabs_size;
+ pVOID pv_alloc_ptr;
+ /* Get memory info tables size */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_MEMTABS_SIZE,
+ 0,
+ &ui_proc_mem_tabs_size);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_MEMTABS_SIZE");
+
+ pv_alloc_ptr = memalign(4, ui_proc_mem_tabs_size);
+ if (!pv_alloc_ptr) {
+ ALOGE("Malloc for size (ui_proc_mem_tabs_size + 4) = %d failed!", ui_proc_mem_tabs_size + 4);
+ return IA_FATAL_ERROR;
+ }
+ mMemoryVec.push(pv_alloc_ptr);
+
+ /* Set pointer for process memory tables */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_MEMTABS_PTR,
+ 0,
+ pv_alloc_ptr);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_MEMTABS_PTR");
+
+ /* initialize the API, post config, fill memory tables */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS,
+ nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS");
+
+ /* ******************************************************************/
+ /* Allocate Memory with info from library */
+ /* ******************************************************************/
+ /* There are four different types of memories, that needs to be allocated */
+ /* persistent,scratch,input and output */
+ for (int i = 0; i < 4; i++) {
+ int ui_size = 0, ui_alignment = 0, ui_type = 0;
+
+ /* Get memory size */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_MEM_INFO_SIZE,
+ i,
+ &ui_size);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_MEM_INFO_SIZE");
+
+ /* Get memory alignment */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_MEM_INFO_ALIGNMENT,
+ i,
+ &ui_alignment);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_MEM_INFO_ALIGNMENT");
+
+ /* Get memory type */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_MEM_INFO_TYPE,
+ i,
+ &ui_type);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_MEM_INFO_TYPE");
+
+ pv_alloc_ptr = memalign(ui_alignment, ui_size);
+ if (!pv_alloc_ptr) {
+ ALOGE("Malloc for size (ui_size + ui_alignment) = %d failed!",
+ ui_size + ui_alignment);
+ return IA_FATAL_ERROR;
+ }
+ mMemoryVec.push(pv_alloc_ptr);
+
+ /* Set the buffer pointer */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_MEM_PTR,
+ i,
+ pv_alloc_ptr);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_MEM_PTR");
+ if (ui_type == IA_MEMTYPE_INPUT) {
+ mInputBuffer = (pWORD8)pv_alloc_ptr;
+ mInputBufferSize = ui_size;
+ }
+ if (ui_type == IA_MEMTYPE_OUTPUT)
+ mOutputBuffer = (pWORD8)pv_alloc_ptr;
+ }
+ /* End first part */
+
+ return IA_NO_ERROR;
+}
+
+status_t C2SoftXaacDec::initXAACDrc() {
+ IA_ERRORCODE err_code = IA_NO_ERROR;
+ unsigned int ui_drc_val;
+ // DRC_PRES_MODE_WRAP_DESIRED_TARGET
+ int32_t targetRefLevel = mIntf->getDrcTargetRefLevel();
+ ALOGV("AAC decoder using desired DRC target reference level of %d", targetRefLevel);
+ ui_drc_val = (unsigned int)targetRefLevel;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL,
+ &ui_drc_val);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL");
+
+ /* Use ui_drc_val from PROP_DRC_OVERRIDE_REF_LEVEL or DRC_DEFAULT_MOBILE_REF_LEVEL
+ * for IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS too */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS, &ui_drc_val);
+
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS");
+
+ int32_t attenuationFactor = mIntf->getDrcAttenuationFactor();
+ ALOGV("AAC decoder using desired DRC attenuation factor of %d", attenuationFactor);
+ ui_drc_val = (unsigned int)attenuationFactor;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT,
+ &ui_drc_val);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT");
+
+ // DRC_PRES_MODE_WRAP_DESIRED_BOOST_FACTOR
+ int32_t boostFactor = mIntf->getDrcBoostFactor();
+ ALOGV("AAC decoder using desired DRC boost factor of %d", boostFactor);
+ ui_drc_val = (unsigned int)boostFactor;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST,
+ &ui_drc_val);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST");
+
+ // DRC_PRES_MODE_WRAP_DESIRED_HEAVY
+ int32_t compressMode = mIntf->getDrcCompressMode();
+ ALOGV("AAC decoder using desried DRC heavy compression switch of %d", compressMode);
+ ui_drc_val = (unsigned int)compressMode;
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP,
+ &ui_drc_val);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP");
+
+ // AAC_UNIDRC_SET_EFFECT
+ int32_t effectType = mIntf->getDrcEffectType();
+ ALOGV("AAC decoder using MPEG-D DRC effect type %d", effectType);
+ ui_drc_val = (unsigned int)effectType;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE, &ui_drc_val);
+
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE");
+
+ return IA_NO_ERROR;
+}
+
+IA_ERRORCODE C2SoftXaacDec::deInitXAACDecoder() {
+ ALOGV("deInitXAACDecoder");
+
+ /* Error code */
+ IA_ERRORCODE err_code = IA_NO_ERROR;
+
+ if (mXheaacCodecHandle) {
+ /* Tell that the input is over in this buffer */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INPUT_OVER,
+ 0,
+ nullptr);
+ }
+
+ /* Irrespective of error returned in IA_API_CMD_INPUT_OVER, free allocated memory */
+ for (void* buf : mMemoryVec) {
+ if (buf) free(buf);
+ }
+ mMemoryVec.clear();
+ mXheaacCodecHandle = nullptr;
+
+ return err_code;
+}
+
+IA_ERRORCODE C2SoftXaacDec::deInitMPEGDDDrc() {
+ ALOGV("deInitMPEGDDDrc");
+
+ for (void* buf : mDrcMemoryVec) {
+ if (buf) free(buf);
+ }
+ mDrcMemoryVec.clear();
+ return IA_NO_ERROR;
+}
+
+IA_ERRORCODE C2SoftXaacDec::configXAACDecoder(uint8_t* inBuffer, uint32_t inBufferLength) {
+ if (mInputBufferSize < inBufferLength) {
+ ALOGE("Cannot config AAC, input buffer size %d < inBufferLength %d", mInputBufferSize, inBufferLength);
+ return false;
+ }
+ /* Copy the buffer passed by Android plugin to codec input buffer */
+ memcpy(mInputBuffer, inBuffer, inBufferLength);
+
+ /* Set number of bytes to be processed */
+ IA_ERRORCODE err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_INPUT_BYTES,
+ 0,
+ &inBufferLength);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_INPUT_BYTES");
+
+ if (mIsCodecConfigFlushRequired) {
+ /* If codec is already initialized, then GA header is passed again */
+ /* Need to call the Flush API instead of INIT_PROCESS */
+ mIsCodecInitialized = false; /* Codec needs to be Reinitialized after flush */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INIT,
+ IA_CMD_TYPE_GA_HDR,
+ nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_GA_HDR");
+ } else {
+ /* Initialize the process */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_PROCESS,
+ nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_PROCESS");
+ }
+
+ uint32_t ui_init_done;
+ /* Checking for end of initialization */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_DONE_QUERY,
+ &ui_init_done);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_DONE_QUERY");
+
+ /* How much buffer is used in input buffers */
+ int32_t i_bytes_consumed;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_CURIDX_INPUT_BUF,
+ 0,
+ &i_bytes_consumed);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_CURIDX_INPUT_BUF");
+
+ if (ui_init_done) {
+ err_code = getXAACStreamInfo();
+ RETURN_IF_FATAL(err_code, "getXAACStreamInfo");
+ ALOGI("Found Codec with below config---\nsampFreq %d\nnumChannels %d\npcmWdSz %d\nchannelMask %d\noutputFrameLength %d",
+ mSampFreq, mNumChannels, mPcmWdSz, mChannelMask, mOutputFrameLength);
+ mIsCodecInitialized = true;
+
+ err_code = configMPEGDDrc();
+ RETURN_IF_FATAL(err_code, "configMPEGDDrc");
+ }
+
+ return IA_NO_ERROR;
+}
+IA_ERRORCODE C2SoftXaacDec::initMPEGDDDrc() {
+ IA_ERRORCODE err_code = IA_NO_ERROR;
+
+ for (int i = 0; i < (WORD32)2; i++) {
+ WORD32 ui_size, ui_alignment, ui_type;
+ pVOID pv_alloc_ptr;
+
+ /* Get memory size */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_GET_MEM_INFO_SIZE, i, &ui_size);
+
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_MEM_INFO_SIZE");
+
+ /* Get memory alignment */
+ err_code =
+ ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_GET_MEM_INFO_ALIGNMENT, i, &ui_alignment);
+
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_MEM_INFO_ALIGNMENT");
+
+ /* Get memory type */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_GET_MEM_INFO_TYPE, i, &ui_type);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_MEM_INFO_TYPE");
+
+ pv_alloc_ptr = memalign(4, ui_size);
+ if (pv_alloc_ptr == nullptr) {
+ ALOGE(" Cannot create requested memory %d", ui_size);
+ return IA_FATAL_ERROR;
+ }
+ mDrcMemoryVec.push(pv_alloc_ptr);
+
+ /* Set the buffer pointer */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_MEM_PTR, i, pv_alloc_ptr);
+
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_MEM_PTR");
+ }
+
+ WORD32 ui_size;
+ ui_size = 8192 * 2;
+
+ mDrcInBuf = (int8_t*)memalign(4, ui_size);
+ if (mDrcInBuf == nullptr) {
+ ALOGE(" Cannot create requested memory %d", ui_size);
+ return IA_FATAL_ERROR;
+ }
+ mDrcMemoryVec.push(mDrcInBuf);
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_MEM_PTR, 2, mDrcInBuf);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_MEM_PTR");
+
+ mDrcOutBuf = (int8_t*)memalign(4, ui_size);
+ if (mDrcOutBuf == nullptr) {
+ ALOGE(" Cannot create requested memory %d", ui_size);
+ return IA_FATAL_ERROR;
+ }
+ mDrcMemoryVec.push(mDrcOutBuf);
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_MEM_PTR, 3, mDrcOutBuf);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_MEM_PTR");
+
+ return IA_NO_ERROR;
+}
+int C2SoftXaacDec::configMPEGDDrc() {
+ IA_ERRORCODE err_code = IA_NO_ERROR;
+ int i_effect_type;
+ int i_loud_norm;
+ int i_target_loudness;
+ unsigned int i_sbr_mode;
+
+ /* Sampling Frequency */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ, &mSampFreq);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ");
+ /* Total Number of Channels */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS, &mNumChannels);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS");
+
+ /* PCM word size */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ, &mPcmWdSz);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ");
+
+ /*Set Effect Type*/
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE, &i_effect_type);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE, &i_effect_type);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE");
+
+ /*Set target loudness */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS,
+ &i_target_loudness);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS, &i_target_loudness);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS");
+
+ /*Set loud_norm_flag*/
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM, &i_loud_norm);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_DRC_LOUD_NORM, &i_loud_norm);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_DRC_LOUD_NORM");
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE, &i_sbr_mode);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS, nullptr);
+
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS");
+
+ /* Free any memory that is allocated for MPEG D Drc so far */
+ deInitMPEGDDDrc();
+
+ err_code = initMPEGDDDrc();
+ if (err_code != IA_NO_ERROR) {
+ ALOGE("initMPEGDDDrc failed with error %d", err_code);
+ deInitMPEGDDDrc();
+ return err_code;
+ }
+
+ /* DRC buffers
+ buf[0] - contains extension element pay load loudness related
+ buf[1] - contains extension element pay load*/
+ {
+ VOID* p_array[2][16];
+ WORD32 ii;
+ WORD32 buf_sizes[2][16];
+ WORD32 num_elements;
+ WORD32 num_config_ext;
+ WORD32 bit_str_fmt = 1;
+
+ WORD32 uo_num_chan;
+
+ memset(buf_sizes, 0, 32 * sizeof(WORD32));
+
+ err_code =
+ ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_BUF_SIZES, &buf_sizes[0][0]);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_BUF_SIZES");
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR, &p_array);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR");
+
+ err_code =
+ ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT, IA_CMD_TYPE_INIT_SET_BUFF_PTR, nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_SET_BUFF_PTR");
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_NUM_ELE, &num_elements);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_NUM_ELE");
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_NUM_CONFIG_EXT, &num_config_ext);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_NUM_CONFIG_EXT");
+
+ for (ii = 0; ii < num_config_ext; ii++) {
+ /*copy loudness bitstream*/
+ if (buf_sizes[0][ii] > 0) {
+ memcpy(mDrcInBuf, p_array[0][ii], buf_sizes[0][ii]);
+
+ /*Set bitstream_split_format */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT");
+
+ /* Set number of bytes to be processed */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_INPUT_BYTES_IL_BS, 0,
+ &buf_sizes[0][ii]);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_INPUT_BYTES_IL_BS");
+
+ /* Execute process */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF, nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF");
+
+ mDRCFlag = 1;
+ }
+ }
+
+ for (ii = 0; ii < num_elements; ii++) {
+ /*copy config bitstream*/
+ if (buf_sizes[1][ii] > 0) {
+ memcpy(mDrcInBuf, p_array[1][ii], buf_sizes[1][ii]);
+ /* Set number of bytes to be processed */
+
+ /*Set bitstream_split_format */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_INPUT_BYTES_IC_BS, 0,
+ &buf_sizes[1][ii]);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_INPUT_BYTES_IC_BS");
+
+ /* Execute process */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF, nullptr);
+
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF");
+
+ mDRCFlag = 1;
+ }
+ }
+
+ if (mDRCFlag == 1) {
+ mMpegDDRCPresent = 1;
+ } else {
+ mMpegDDRCPresent = 0;
+ }
+
+ /*Read interface buffer config file bitstream*/
+ if (mMpegDDRCPresent == 1) {
+ WORD32 interface_is_present = 1;
+
+ if (i_sbr_mode != 0) {
+ if (i_sbr_mode == 1) {
+ mOutputFrameLength = 2048;
+ } else if (i_sbr_mode == 3) {
+ mOutputFrameLength = 4096;
+ } else {
+ mOutputFrameLength = 1024;
+ }
+ } else {
+ mOutputFrameLength = 4096;
+ }
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE, (WORD32 *)&mOutputFrameLength);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE");
+
+ err_code =
+ ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT, &interface_is_present);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT");
+
+ /* Execute process */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF, nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_PROCESS, nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_INIT_PROCESS");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS, &uo_num_chan);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS");
+ }
+ }
+
+ return err_code;
+}
+
+IA_ERRORCODE C2SoftXaacDec::decodeXAACStream(uint8_t* inBuffer,
+ uint32_t inBufferLength,
+ int32_t* bytesConsumed,
+ int32_t* outBytes) {
+ if (mInputBufferSize < inBufferLength) {
+ ALOGE("Cannot config AAC, input buffer size %d < inBufferLength %d", mInputBufferSize, inBufferLength);
+ return -1;
+ }
+ /* Copy the buffer passed by Android plugin to codec input buffer */
+ memcpy(mInputBuffer, inBuffer, inBufferLength);
+
+ /* Set number of bytes to be processed */
+ IA_ERRORCODE err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_SET_INPUT_BYTES,
+ 0,
+ &inBufferLength);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_INPUT_BYTES");
+
+ /* Execute process */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_EXECUTE,
+ IA_CMD_TYPE_DO_EXECUTE,
+ nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_DO_EXECUTE");
+
+ /* Checking for end of processing */
+ uint32_t ui_exec_done;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_EXECUTE,
+ IA_CMD_TYPE_DONE_QUERY,
+ &ui_exec_done);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_DONE_QUERY");
+
+ if (ui_exec_done != 1) {
+ VOID* p_array; // ITTIAM:buffer to handle gain payload
+ WORD32 buf_size = 0; // ITTIAM:gain payload length
+ WORD32 bit_str_fmt = 1;
+ WORD32 gain_stream_flag = 1;
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_LEN, &buf_size);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_LEN");
+
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF, &p_array);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF");
+
+ if (buf_size > 0) {
+ /*Set bitstream_split_format */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT");
+
+ memcpy(mDrcInBuf, p_array, buf_size);
+ /* Set number of bytes to be processed */
+ err_code =
+ ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_INPUT_BYTES_BS, 0, &buf_size);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG, &gain_stream_flag);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT");
+
+ /* Execute process */
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
+ IA_CMD_TYPE_INIT_CPY_BSF_BUFF, nullptr);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT");
+
+ mMpegDDRCPresent = 1;
+ }
+ }
+
+ /* How much buffer is used in input buffers */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_CURIDX_INPUT_BUF,
+ 0,
+ bytesConsumed);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_CURIDX_INPUT_BUF");
+
+ /* Get the output bytes */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_OUTPUT_BYTES,
+ 0,
+ outBytes);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_GET_OUTPUT_BYTES");
+
+ if (mMpegDDRCPresent == 1) {
+ memcpy(mDrcInBuf, mOutputBuffer, *outBytes);
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_INPUT_BYTES, 0, outBytes);
+ RETURN_IF_FATAL(err_code, "IA_API_CMD_SET_INPUT_BYTES");
+
+ err_code =
+ ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_EXECUTE, IA_CMD_TYPE_DO_EXECUTE, nullptr);
+ RETURN_IF_FATAL(err_code, "IA_CMD_TYPE_DO_EXECUTE");
+
+ memcpy(mOutputBuffer, mDrcOutBuf, *outBytes);
+ }
+ return IA_NO_ERROR;
+}
+
+IA_ERRORCODE C2SoftXaacDec::getXAACStreamInfo() {
+ IA_ERRORCODE err_code = IA_NO_ERROR;
+
+ /* Sampling frequency */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ,
+ &mSampFreq);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ");
+
+ /* Total Number of Channels */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS,
+ &mNumChannels);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS");
+ if (mNumChannels > MAX_CHANNEL_COUNT) {
+ ALOGE(" No of channels are more than max channels\n");
+ return IA_FATAL_ERROR;
+ }
+
+ /* PCM word size */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ,
+ &mPcmWdSz);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ");
+ if ((mPcmWdSz / 8) != 2) {
+ ALOGE(" No of channels are more than max channels\n");
+ return IA_FATAL_ERROR;
+ }
+
+ /* channel mask to tell the arrangement of channels in bit stream */
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK,
+ &mChannelMask);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK");
+
+ /* Channel mode to tell MONO/STEREO/DUAL-MONO/NONE_OF_THESE */
+ uint32_t ui_channel_mode;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE,
+ &ui_channel_mode);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE");
+ if (ui_channel_mode == 0)
+ ALOGV("Channel Mode: MONO_OR_PS\n");
+ else if (ui_channel_mode == 1)
+ ALOGV("Channel Mode: STEREO\n");
+ else if (ui_channel_mode == 2)
+ ALOGV("Channel Mode: DUAL-MONO\n");
+ else
+ ALOGV("Channel Mode: NONE_OF_THESE or MULTICHANNEL\n");
+
+ /* Channel mode to tell SBR PRESENT/NOT_PRESENT */
+ uint32_t ui_sbr_mode;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle,
+ IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE,
+ &ui_sbr_mode);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE");
+ if (ui_sbr_mode == 0)
+ ALOGV("SBR Mode: NOT_PRESENT\n");
+ else if (ui_sbr_mode == 1)
+ ALOGV("SBR Mode: PRESENT\n");
+ else
+ ALOGV("SBR Mode: ILLEGAL\n");
+
+ /* mOutputFrameLength = 1024 * (1 + SBR_MODE) for AAC */
+ /* For USAC it could be 1024 * 3 , support to query */
+ /* not yet added in codec */
+ mOutputFrameLength = 1024 * (1 + ui_sbr_mode);
+ ALOGI("mOutputFrameLength %d ui_sbr_mode %d", mOutputFrameLength, ui_sbr_mode);
+
+ return IA_NO_ERROR;
+}
+
+IA_ERRORCODE C2SoftXaacDec::setXAACDRCInfo(int32_t drcCut, int32_t drcBoost,
+ int32_t drcRefLevel,
+ int32_t drcHeavyCompression,
+ int32_t drEffectType) {
+ IA_ERRORCODE err_code = IA_NO_ERROR;
+
+ int32_t ui_drc_enable = 1;
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_ENABLE,
+ &ui_drc_enable);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_ENABLE");
+ if (drcCut != -1) {
+ err_code =
+ ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT, &drcCut);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT");
+ }
+
+ if (drcBoost != -1) {
+ err_code = ixheaacd_dec_api(
+ mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST, &drcBoost);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST");
+ }
+
+ if (drcRefLevel != -1) {
+ err_code = ixheaacd_dec_api(
+ mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL, &drcRefLevel);
+ RETURN_IF_FATAL(err_code,
+ "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL");
+ }
+
+ if (drcRefLevel != -1) {
+ err_code = ixheaacd_dec_api(
+ mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS, &drcRefLevel);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS");
+ }
+
+ if (drcHeavyCompression != -1) {
+ err_code =
+ ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP,
+ &drcHeavyCompression);
+ RETURN_IF_FATAL(err_code,
+ "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP");
+ }
+
+ err_code =
+ ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE, &drEffectType);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE");
+
+ int32_t i_effect_type, i_target_loudness, i_loud_norm;
+ /*Set Effect Type*/
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE,
+ &i_effect_type);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE");
+
+ err_code =
+ ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE, &i_effect_type);
+
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE");
+
+ /*Set target loudness */
+ err_code = ixheaacd_dec_api(
+ mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS, &i_target_loudness);
+ RETURN_IF_FATAL(err_code,
+ "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS,
+ &i_target_loudness);
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS");
+
+ /*Set loud_norm_flag*/
+ err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
+ IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM,
+ &i_loud_norm);
+ RETURN_IF_FATAL(err_code, "IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM");
+
+ err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
+ IA_DRC_DEC_CONFIG_DRC_LOUD_NORM, &i_loud_norm);
+
+ RETURN_IF_FATAL(err_code, "IA_DRC_DEC_CONFIG_DRC_LOUD_NORM");
+
+ return IA_NO_ERROR;
+}
+
+class C2SoftXaacDecFactory : public C2ComponentFactory {
+public:
+ C2SoftXaacDecFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
+ GetCodec2PlatformComponentStore()->getParamReflector())) {
+ }
+
+ virtual c2_status_t createComponent(
+ c2_node_id_t id,
+ std::shared_ptr<C2Component>* const component,
+ std::function<void(C2Component*)> deleter) override {
+ *component = std::shared_ptr<C2Component>(
+ new C2SoftXaacDec(COMPONENT_NAME,
+ id,
+ std::make_shared<C2SoftXaacDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual c2_status_t createInterface(
+ c2_node_id_t id,
+ std::shared_ptr<C2ComponentInterface>* const interface,
+ std::function<void(C2ComponentInterface*)> deleter) override {
+ *interface = std::shared_ptr<C2ComponentInterface>(
+ new SimpleInterface<C2SoftXaacDec::IntfImpl>(
+ COMPONENT_NAME, id, std::make_shared<C2SoftXaacDec::IntfImpl>(mHelper)),
+ deleter);
+ return C2_OK;
+ }
+
+ virtual ~C2SoftXaacDecFactory() override = default;
+
+private:
+ std::shared_ptr<C2ReflectorHelper> mHelper;
+};
+
+} // namespace android
+
+extern "C" ::C2ComponentFactory* CreateCodec2Factory() {
+ ALOGV("in %s", __func__);
+ return new ::android::C2SoftXaacDecFactory();
+}
+
+extern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
+ ALOGV("in %s", __func__);
+ delete factory;
+}
diff --git a/media/codec2/components/xaac/C2SoftXaacDec.h b/media/codec2/components/xaac/C2SoftXaacDec.h
new file mode 100644
index 0000000..5c8567f
--- /dev/null
+++ b/media/codec2/components/xaac/C2SoftXaacDec.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2_SOFT_XAAC_DEC_H_
+#define ANDROID_C2_SOFT_XAAC_DEC_H_
+#include <utils/Vector.h>
+#include <SimpleC2Component.h>
+
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_error_handler.h"
+#include "ixheaacd_apicmd_standards.h"
+#include "ixheaacd_memory_standards.h"
+#include "ixheaacd_aac_config.h"
+
+#include "impd_apicmd_standards.h"
+#include "impd_drc_config_params.h"
+
+#define MAX_CHANNEL_COUNT 8 /* maximum number of audio channels that can be decoded */
+#define MAX_NUM_BLOCKS 8 /* maximum number of audio blocks that can be decoded */
+
+extern "C" IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_module_obj,
+ WORD32 i_cmd, WORD32 i_idx, pVOID pv_value);
+extern "C" IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_module_obj,
+ WORD32 i_cmd, WORD32 i_idx, pVOID pv_value);
+extern "C" IA_ERRORCODE ixheaacd_get_config_param(pVOID p_ia_process_api_obj,
+ pWORD32 pi_samp_freq,
+ pWORD32 pi_num_chan,
+ pWORD32 pi_pcm_wd_sz,
+ pWORD32 pi_channel_mask);
+
+namespace android {
+
+struct C2SoftXaacDec : public SimpleC2Component {
+ class IntfImpl;
+
+ C2SoftXaacDec(const char* name, c2_node_id_t id,
+ const std::shared_ptr<IntfImpl>& intfImpl);
+ virtual ~C2SoftXaacDec();
+
+ // From SimpleC2Component
+ c2_status_t onInit() override;
+ c2_status_t onStop() override;
+ void onReset() override;
+ void onRelease() override;
+ c2_status_t onFlush_sm() override;
+ void process(
+ const std::unique_ptr<C2Work> &work,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+ c2_status_t drain(
+ uint32_t drainMode,
+ const std::shared_ptr<C2BlockPool> &pool) override;
+
+private:
+ enum {
+ kOutputDrainBufferSize = 2048 * MAX_CHANNEL_COUNT * MAX_NUM_BLOCKS,
+ };
+
+ std::shared_ptr<IntfImpl> mIntf;
+ void* mXheaacCodecHandle;
+ void* mMpegDDrcHandle;
+ uint32_t mInputBufferSize;
+ uint32_t mOutputFrameLength;
+ int8_t* mInputBuffer;
+ int8_t* mOutputBuffer;
+ int32_t mSampFreq;
+ int32_t mNumChannels;
+ int32_t mPcmWdSz;
+ int32_t mChannelMask;
+ int32_t mNumOutBytes;
+ uint64_t mCurFrameIndex;
+ uint64_t mCurTimestamp;
+ bool mIsCodecInitialized;
+ bool mIsCodecConfigFlushRequired;
+ int8_t* mDrcInBuf;
+ int8_t* mDrcOutBuf;
+ int32_t mMpegDDRCPresent;
+ int32_t mDRCFlag;
+
+ Vector<void*> mMemoryVec;
+ Vector<void*> mDrcMemoryVec;
+
+ size_t mInputBufferCount __unused;
+ size_t mOutputBufferCount __unused;
+ bool mSignalledOutputEos;
+ bool mSignalledError;
+ char* mOutputDrainBuffer;
+ uint32_t mOutputDrainBufferWritePos;
+
+ IA_ERRORCODE initDecoder();
+ IA_ERRORCODE setDrcParameter();
+ IA_ERRORCODE configflushDecode();
+ IA_ERRORCODE drainDecoder();
+ void finishWork(const std::unique_ptr<C2Work>& work,
+ const std::shared_ptr<C2BlockPool>& pool);
+
+ IA_ERRORCODE initXAACDrc();
+ IA_ERRORCODE initXAACDecoder();
+ IA_ERRORCODE deInitXAACDecoder();
+ IA_ERRORCODE initMPEGDDDrc();
+ IA_ERRORCODE deInitMPEGDDDrc();
+ IA_ERRORCODE configXAACDecoder(uint8_t* inBuffer, uint32_t inBufferLength);
+ int configMPEGDDrc();
+ IA_ERRORCODE decodeXAACStream(uint8_t* inBuffer,
+ uint32_t inBufferLength,
+ int32_t* bytesConsumed,
+ int32_t* outBytes);
+ IA_ERRORCODE getXAACStreamInfo();
+ IA_ERRORCODE setXAACDRCInfo(int32_t drcCut, int32_t drcBoost,
+ int32_t drcRefLevel, int32_t drcHeavyCompression,
+ int32_t drEffectType);
+
+ C2_DO_NOT_COPY(C2SoftXaacDec);
+};
+
+} // namespace android
+
+#endif // C2_SOFT_XAAC_H_
diff --git a/media/codec2/core/Android.bp b/media/codec2/core/Android.bp
new file mode 100644
index 0000000..b723755
--- /dev/null
+++ b/media/codec2/core/Android.bp
@@ -0,0 +1,45 @@
+cc_library_headers {
+ name: "libcodec2_headers",
+ vendor_available: true,
+ export_include_dirs: ["include"],
+}
+
+cc_library_shared {
+ name: "libcodec2",
+ vendor_available: true,
+
+ srcs: ["C2.cpp"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+ header_libs: [
+ "libcodec2_headers",
+ "libhardware_headers",
+ "libutils_headers",
+ "media_plugin_headers",
+ ],
+
+ export_header_lib_headers: [
+ "libcodec2_headers",
+ "libhardware_headers",
+ "libutils_headers",
+ "media_plugin_headers",
+ ],
+
+ sanitize: {
+ misc_undefined: [
+ "unsigned-integer-overflow",
+ "signed-integer-overflow",
+ ],
+ cfi: false, // true,
+ diag: {
+ cfi: false, // true,
+ },
+ },
+
+ ldflags: ["-Wl,-Bsymbolic"],
+}
+
diff --git a/media/codec2/core/C2.cpp b/media/codec2/core/C2.cpp
new file mode 100644
index 0000000..359d4e5
--- /dev/null
+++ b/media/codec2/core/C2.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <C2.h>
+#include <C2Buffer.h>
+#include <C2Component.h>
+#include <C2Config.h>
+#include <C2Param.h>
+#include <C2ParamDef.h>
+#include <C2Work.h>
+
+/**
+ * There is nothing here yet. This library is built to see what symbols and methods get
+ * defined as part of the API include files.
+ *
+ * Going forward, the Codec2 library will contain utility methods that are useful for
+ * Codec2 clients.
+ */
+
+
diff --git a/media/codec2/core/include/C2.h b/media/codec2/core/include/C2.h
new file mode 100644
index 0000000..ef3466d
--- /dev/null
+++ b/media/codec2/core/include/C2.h
@@ -0,0 +1,552 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2_H_
+#define C2_H_
+
+#include <errno.h>
+
+#include <string>
+
+/** nanoseconds with arbitrary origin. */
+typedef int64_t c2_nsecs_t;
+
+/** \mainpage Codec2
+ *
+ * Codec2 is a generic frame-based data processing API.
+ *
+ * The media subsystem accesses components via the \ref API.
+ */
+
+/** \ingroup API
+ *
+ * The Codec2 API defines the operation of data processing components and their interaction with
+ * the rest of the system.
+ *
+ * Coding Conventions
+ *
+ * Mitigating Binary Compatibility.
+ *
+ * While full binary compatibility is not a goal of the API (due to our use of STL), we try to
+ * mitigate binary breaks by adhering to the following conventions:
+ *
+ * - at most one vtable with placeholder virtual methods
+ * - all optional/placeholder virtual methods returning a c2_status_t, with C2_OMITTED not requiring
+ * any update to input/output arguments.
+ * - limiting symbol export of inline methods
+ * - use of pimpl (or shared-pimpl)
+ *
+ * Naming
+ *
+ * - all classes and types prefix with C2
+ * - classes for internal use prefix with _C2
+ * - enum values in global namespace prefix with C2_ all caps
+ * - enum values inside classes have no C2_ prefix as class already has it
+ * - supporting two kinds of enum naming: all-caps and kCamelCase
+ * \todo revisit kCamelCase for param-type
+ *
+ * Aspects
+ *
+ * Aspects define certain common behavior across a group of objects.
+ * - classes whose name matches _C2.*Aspect
+ * - only protected constructors
+ * - no desctructor and copiable
+ * - all methods are inline or static (this is opposite of the interface paradigm where all methods
+ * are virtual, which would not work due to the at most one vtable rule.)
+ * - only private variables (this prevents subclasses interfering with the aspects.)
+ */
+
+/// \defgroup types Common Types
+/// @{
+
+/**
+ * C2String: basic string implementation
+ */
+typedef std::string C2String;
+
+/**
+ * C2StringLiteral: basic string literal implementation.
+ * \note these are never owned by any object, and can only refer to C string literals.
+ */
+typedef const char *C2StringLiteral;
+
+/**
+ * c2_status_t: status codes used.
+ */
+enum c2_status_t : int32_t {
+/*
+ * Use POSIX errno constants.
+ */
+ C2_OK = 0, ///< operation completed successfully
+
+ // bad input
+ C2_BAD_VALUE = EINVAL, ///< argument has invalid value (user error)
+ C2_BAD_INDEX = ENXIO, ///< argument uses invalid index (user error)
+ C2_CANNOT_DO = ENOTSUP, ///< argument/index is valid but not possible
+
+ // bad sequencing of events
+ C2_DUPLICATE = EEXIST, ///< object already exists
+ C2_NOT_FOUND = ENOENT, ///< object not found
+ C2_BAD_STATE = EPERM, ///< operation is not permitted in the current state
+ C2_BLOCKING = EWOULDBLOCK, ///< operation would block but blocking is not permitted
+ C2_CANCELED = EINTR, ///< operation interrupted/canceled
+
+ // bad environment
+ C2_NO_MEMORY = ENOMEM, ///< not enough memory to complete operation
+ C2_REFUSED = EACCES, ///< missing permission to complete operation
+
+ C2_TIMED_OUT = ETIMEDOUT, ///< operation did not complete within timeout
+
+ // bad versioning
+ C2_OMITTED = ENOSYS, ///< operation is not implemented/supported (optional only)
+
+ // unknown fatal
+ C2_CORRUPTED = EFAULT, ///< some unexpected error prevented the operation
+ C2_NO_INIT = ENODEV, ///< status has not been initialized
+};
+
+/**
+ * Type that describes the desired blocking behavior for variable blocking calls. Blocking in this
+ * API is used in a somewhat modified meaning such that operations that merely update variables
+ * protected by mutexes are still considered "non-blocking" (always used in quotes).
+ */
+enum c2_blocking_t : int32_t {
+ /**
+ * The operation SHALL be "non-blocking". This means that it shall not perform any file
+ * operations, or call/wait on other processes. It may use a protected region as long as the
+ * mutex is never used to protect code that is otherwise "may block".
+ */
+ C2_DONT_BLOCK = false,
+ /**
+ * The operation MAY be temporarily blocking.
+ */
+ C2_MAY_BLOCK = true,
+};
+
+/// @}
+
+/// \defgroup utils Utilities
+/// @{
+
+#define C2_DO_NOT_COPY(type) \
+ type& operator=(const type &) = delete; \
+ type(const type &) = delete; \
+
+#define C2_DEFAULT_MOVE(type) \
+ type& operator=(type &&) = default; \
+ type(type &&) = default; \
+
+#define C2_ALLOW_OVERFLOW __attribute__((no_sanitize("integer")))
+#define C2_CONST __attribute__((const))
+#define C2_HIDE __attribute__((visibility("hidden")))
+#define C2_INLINE inline C2_HIDE
+#define C2_INTERNAL __attribute__((internal_linkage))
+#define C2_PACK __attribute__((aligned(4)))
+#define C2_PURE __attribute__((pure))
+
+#define DEFINE_OTHER_COMPARISON_OPERATORS(type) \
+ inline bool operator!=(const type &other) const { return !(*this == other); } \
+ inline bool operator<=(const type &other) const { return (*this == other) || (*this < other); } \
+ inline bool operator>=(const type &other) const { return !(*this < other); } \
+ inline bool operator>(const type &other) const { return !(*this < other) && !(*this == other); }
+
+#define DEFINE_FIELD_BASED_COMPARISON_OPERATORS(type, field) \
+ inline bool operator<(const type &other) const { return field < other.field; } \
+ inline bool operator==(const type &other) const { return field == other.field; } \
+ DEFINE_OTHER_COMPARISON_OPERATORS(type)
+
+#define DEFINE_FIELD_AND_MASK_BASED_COMPARISON_OPERATORS(type, field, mask) \
+ inline bool operator<(const type &other) const { \
+ return (field & mask) < (other.field & (mask)); \
+ } \
+ inline bool operator==(const type &other) const { \
+ return (field & mask) == (other.field & (mask)); \
+ } \
+ DEFINE_OTHER_COMPARISON_OPERATORS(type)
+
+#define DEFINE_ENUM_OPERATORS(etype) \
+ inline constexpr etype operator|(etype a, etype b) { return (etype)(std::underlying_type<etype>::type(a) | std::underlying_type<etype>::type(b)); } \
+ inline constexpr etype &operator|=(etype &a, etype b) { a = (etype)(std::underlying_type<etype>::type(a) | std::underlying_type<etype>::type(b)); return a; } \
+ inline constexpr etype operator&(etype a, etype b) { return (etype)(std::underlying_type<etype>::type(a) & std::underlying_type<etype>::type(b)); } \
+ inline constexpr etype &operator&=(etype &a, etype b) { a = (etype)(std::underlying_type<etype>::type(a) & std::underlying_type<etype>::type(b)); return a; } \
+ inline constexpr etype operator^(etype a, etype b) { return (etype)(std::underlying_type<etype>::type(a) ^ std::underlying_type<etype>::type(b)); } \
+ inline constexpr etype &operator^=(etype &a, etype b) { a = (etype)(std::underlying_type<etype>::type(a) ^ std::underlying_type<etype>::type(b)); return a; } \
+ inline constexpr etype operator~(etype a) { return (etype)(~std::underlying_type<etype>::type(a)); }
+
+template<typename T, typename B>
+class C2_HIDE c2_cntr_t;
+
+/// \cond INTERNAL
+
+/// \defgroup utils_internal
+/// @{
+
+template<typename T>
+struct C2_HIDE _c2_cntr_compat_helper {
+ template<typename U, typename E=typename std::enable_if<std::is_integral<U>::value>::type>
+ C2_ALLOW_OVERFLOW
+ inline static constexpr T get(const U &value) {
+ return T(value);
+ }
+
+ template<typename U, typename E=typename std::enable_if<(sizeof(U) >= sizeof(T))>::type>
+ C2_ALLOW_OVERFLOW
+ inline static constexpr T get(const c2_cntr_t<U, void> &value) {
+ return T(value.mValue);
+ }
+};
+
+/// @}
+
+/// \endcond
+
+/**
+ * Integral counter type.
+ *
+ * This is basically an unsigned integral type that is NEVER checked for overflow/underflow - and
+ * comparison operators are redefined.
+ *
+ * \note Comparison of counter types is not fully transitive, e.g.
+ * it could be that a > b > c but a !> c.
+ * std::less<>, greater<>, less_equal<> and greater_equal<> specializations yield total ordering,
+ * but may not match semantic ordering of the values.
+ *
+ * Technically: counter types represent integer values: A * 2^N + value, where A can be arbitrary.
+ * This makes addition, subtraction, multiplication (as well as bitwise operations) well defined.
+ * However, division is in general not well defined, as the result may depend on A. This is also
+ * true for logical operators and boolean conversion.
+ *
+ * Even though well defined, bitwise operators are not implemented for counter types as they are not
+ * meaningful.
+ */
+template<typename T, typename B=typename std::enable_if<std::is_integral<T>::value && std::is_unsigned<T>::value>::type>
+class C2_HIDE c2_cntr_t {
+ using compat = _c2_cntr_compat_helper<T>;
+
+ T mValue;
+ constexpr static T HALF_RANGE = T(~0) ^ (T(~0) >> 1);
+
+ template<typename U>
+ friend struct _c2_cntr_compat_helper;
+public:
+
+ /**
+ * Default constructor. Initialized counter to 0.
+ */
+ inline constexpr c2_cntr_t() : mValue(T(0)) {}
+
+ /**
+ * Construct from a compatible type.
+ */
+ template<typename U>
+ inline constexpr c2_cntr_t(const U &value) : mValue(compat::get(value)) {}
+
+ /**
+ * Peek as underlying signed type.
+ */
+ C2_ALLOW_OVERFLOW
+ inline constexpr typename std::make_signed<T>::type peek() const {
+ return static_cast<typename std::make_signed<T>::type>(mValue);
+ }
+
+ /**
+ * Peek as underlying unsigned type.
+ */
+ inline constexpr T peeku() const {
+ return mValue;
+ }
+
+ /**
+ * Peek as long long - e.g. for printing.
+ */
+ C2_ALLOW_OVERFLOW
+ inline constexpr long long peekll() const {
+ return (long long)mValue;
+ }
+
+ /**
+ * Peek as unsigned long long - e.g. for printing.
+ */
+ C2_ALLOW_OVERFLOW
+ inline constexpr unsigned long long peekull() const {
+ return (unsigned long long)mValue;
+ }
+
+ /**
+ * Convert to a smaller counter type. This is always safe.
+ */
+ template<typename U, typename E=typename std::enable_if<(sizeof(U) < sizeof(T))>::type>
+ inline constexpr operator c2_cntr_t<U>() {
+ return c2_cntr_t<U>(mValue);
+ }
+
+ /**
+ * Arithmetic operators
+ */
+
+#define DEFINE_C2_CNTR_BINARY_OP(attrib, op, op_assign) \
+ template<typename U> \
+ attrib inline c2_cntr_t<T>& operator op_assign(const U &value) { \
+ mValue op_assign compat::get(value); \
+ return *this; \
+ } \
+ \
+ template<typename U, typename E=decltype(compat::get(U(0)))> \
+ attrib inline constexpr c2_cntr_t<T> operator op(const U &value) const { \
+ return c2_cntr_t<T>(mValue op compat::get(value)); \
+ } \
+ \
+ template<typename U, typename E=typename std::enable_if<(sizeof(U) < sizeof(T))>::type> \
+ attrib inline constexpr c2_cntr_t<U> operator op(const c2_cntr_t<U> &value) const { \
+ return c2_cntr_t<U>(U(mValue) op value.peeku()); \
+ }
+
+#define DEFINE_C2_CNTR_UNARY_OP(attrib, op) \
+ attrib inline constexpr c2_cntr_t<T> operator op() const { \
+ return c2_cntr_t<T>(op mValue); \
+ }
+
+#define DEFINE_C2_CNTR_CREMENT_OP(attrib, op) \
+ attrib inline c2_cntr_t<T> &operator op() { \
+ op mValue; \
+ return *this; \
+ } \
+ attrib inline c2_cntr_t<T> operator op(int) { \
+ return c2_cntr_t<T, void>(mValue op); \
+ }
+
+ DEFINE_C2_CNTR_BINARY_OP(C2_ALLOW_OVERFLOW, +, +=)
+ DEFINE_C2_CNTR_BINARY_OP(C2_ALLOW_OVERFLOW, -, -=)
+ DEFINE_C2_CNTR_BINARY_OP(C2_ALLOW_OVERFLOW, *, *=)
+
+ DEFINE_C2_CNTR_UNARY_OP(C2_ALLOW_OVERFLOW, -)
+ DEFINE_C2_CNTR_UNARY_OP(C2_ALLOW_OVERFLOW, +)
+
+ DEFINE_C2_CNTR_CREMENT_OP(C2_ALLOW_OVERFLOW, ++)
+ DEFINE_C2_CNTR_CREMENT_OP(C2_ALLOW_OVERFLOW, --)
+
+ template<typename U, typename E=typename std::enable_if<std::is_unsigned<U>::value>::type>
+ C2_ALLOW_OVERFLOW
+ inline constexpr c2_cntr_t<T> operator<<(const U &value) const {
+ return c2_cntr_t<T>(mValue << value);
+ }
+
+ template<typename U, typename E=typename std::enable_if<std::is_unsigned<U>::value>::type>
+ C2_ALLOW_OVERFLOW
+ inline c2_cntr_t<T> &operator<<=(const U &value) {
+ mValue <<= value;
+ return *this;
+ }
+
+ /**
+ * Comparison operators
+ */
+ C2_ALLOW_OVERFLOW
+ inline constexpr bool operator<=(const c2_cntr_t<T> &other) const {
+ return T(other.mValue - mValue) < HALF_RANGE;
+ }
+
+ C2_ALLOW_OVERFLOW
+ inline constexpr bool operator>=(const c2_cntr_t<T> &other) const {
+ return T(mValue - other.mValue) < HALF_RANGE;
+ }
+
+ inline constexpr bool operator==(const c2_cntr_t<T> &other) const {
+ return mValue == other.mValue;
+ }
+
+ inline constexpr bool operator!=(const c2_cntr_t<T> &other) const {
+ return !(*this == other);
+ }
+
+ inline constexpr bool operator<(const c2_cntr_t<T> &other) const {
+ return *this <= other && *this != other;
+ }
+
+ inline constexpr bool operator>(const c2_cntr_t<T> &other) const {
+ return *this >= other && *this != other;
+ }
+};
+
+template<typename U, typename T, typename E=typename std::enable_if<std::is_integral<U>::value>::type>
+inline constexpr c2_cntr_t<T> operator+(const U &a, const c2_cntr_t<T> &b) {
+ return b + a;
+}
+
+template<typename U, typename T, typename E=typename std::enable_if<std::is_integral<U>::value>::type>
+inline constexpr c2_cntr_t<T> operator-(const U &a, const c2_cntr_t<T> &b) {
+ return c2_cntr_t<T>(a) - b;
+}
+
+template<typename U, typename T, typename E=typename std::enable_if<std::is_integral<U>::value>::type>
+inline constexpr c2_cntr_t<T> operator*(const U &a, const c2_cntr_t<T> &b) {
+ return b * a;
+}
+
+typedef c2_cntr_t<uint32_t> c2_cntr32_t; /** 32-bit counter type */
+typedef c2_cntr_t<uint64_t> c2_cntr64_t; /** 64-bit counter type */
+
+/// \cond INTERNAL
+
+/// \defgroup utils_internal
+/// @{
+
+template<typename... T> struct c2_types;
+
+/** specialization for a single type */
+template<typename T>
+struct c2_types<T> {
+ typedef typename std::decay<T>::type wide_type;
+ typedef wide_type narrow_type;
+ typedef wide_type min_type; // type for min(T...)
+};
+
+/** specialization for two types */
+template<typename T, typename U>
+struct c2_types<T, U> {
+ static_assert(std::is_floating_point<T>::value == std::is_floating_point<U>::value,
+ "mixing floating point and non-floating point types is disallowed");
+ static_assert(std::is_signed<T>::value == std::is_signed<U>::value,
+ "mixing signed and unsigned types is disallowed");
+
+ typedef typename std::decay<
+ decltype(true ? std::declval<T>() : std::declval<U>())>::type wide_type;
+ typedef typename std::decay<
+ typename std::conditional<sizeof(T) < sizeof(U), T, U>::type>::type narrow_type;
+ typedef typename std::conditional<
+ std::is_signed<T>::value, wide_type, narrow_type>::type min_type;
+};
+
+/// @}
+
+/// \endcond
+
+/**
+ * Type support utility class. Only supports similar classes, such as:
+ * - all floating point
+ * - all unsigned/all signed
+ * - all pointer
+ */
+template<typename T, typename U, typename... V>
+struct c2_types<T, U, V...> {
+ /** Common type that accommodates all template parameter types. */
+ typedef typename c2_types<typename c2_types<T, U>::wide_type, V...>::wide_type wide_type;
+ /** Narrowest type of the template parameter types. */
+ typedef typename c2_types<typename c2_types<T, U>::narrow_type, V...>::narrow_type narrow_type;
+ /** Type that accommodates the minimum value for any input for the template parameter types. */
+ typedef typename c2_types<typename c2_types<T, U>::min_type, V...>::min_type min_type;
+};
+
+/**
+ * \ingroup utils_internal
+ * specialization for two values */
+template<typename T, typename U>
+inline constexpr typename c2_types<T, U>::wide_type c2_max(const T a, const U b) {
+ typedef typename c2_types<T, U>::wide_type wide_type;
+ return ({ wide_type a_(a), b_(b); a_ > b_ ? a_ : b_; });
+}
+
+/**
+ * Finds the maximum value of a list of "similarly typed" values.
+ *
+ * This is an extension to std::max where the types do not have to be identical, and the smallest
+ * resulting type is used that accommodates the argument types.
+ *
+ * \note Value types must be similar, e.g. all floating point, all pointers, all signed, or all
+ * unsigned.
+ *
+ * @return the largest of the input arguments.
+ */
+template<typename T, typename U, typename... V>
+constexpr typename c2_types<T, U, V...>::wide_type c2_max(const T a, const U b, const V ... c) {
+ typedef typename c2_types<T, U, V...>::wide_type wide_type;
+ return ({ wide_type a_(a), b_(c2_max(b, c...)); a_ > b_ ? a_ : b_; });
+}
+
+/**
+ * \ingroup utils_internal
+ * specialization for two values */
+template<typename T, typename U>
+inline constexpr typename c2_types<T, U>::min_type c2_min(const T a, const U b) {
+ typedef typename c2_types<T, U>::wide_type wide_type;
+ return ({
+ wide_type a_(a), b_(b);
+ static_cast<typename c2_types<T, U>::min_type>(a_ < b_ ? a_ : b_);
+ });
+}
+
+/**
+ * Finds the minimum value of a list of "similarly typed" values.
+ *
+ * This is an extension to std::min where the types do not have to be identical, and the smallest
+ * resulting type is used that accommodates the argument types.
+ *
+ * \note Value types must be similar, e.g. all floating point, all pointers, all signed, or all
+ * unsigned.
+ *
+ * @return the smallest of the input arguments.
+ */
+template<typename T, typename U, typename... V>
+constexpr typename c2_types<T, U, V...>::min_type c2_min(const T a, const U b, const V ... c) {
+ typedef typename c2_types<U, V...>::min_type rest_type;
+ typedef typename c2_types<T, rest_type>::wide_type wide_type;
+ return ({
+ wide_type a_(a), b_(c2_min(b, c...));
+ static_cast<typename c2_types<T, rest_type>::min_type>(a_ < b_ ? a_ : b_);
+ });
+}
+
+/**
+ * \ingroup utils_internal
+ */
+template<typename T, typename U, typename V>
+inline constexpr typename c2_types<T, V>::wide_type c2_clamp(const T a, const U b, const V c) {
+ typedef typename c2_types<T, U, V>::wide_type wide_type;
+ return ({
+ wide_type a_(a), b_(b), c_(c);
+ static_cast<typename c2_types<T, V>::wide_type>(b_ < a_ ? a_ : b_ > c_ ? c_ : b_);
+ });
+}
+
+/// @}
+
+#include <functional>
+template<typename T>
+struct std::less<::c2_cntr_t<T>> {
+ constexpr bool operator()(const ::c2_cntr_t<T> &lh, const ::c2_cntr_t<T> &rh) const {
+ return lh.peeku() < rh.peeku();
+ }
+};
+template<typename T>
+struct std::less_equal<::c2_cntr_t<T>> {
+ constexpr bool operator()(const ::c2_cntr_t<T> &lh, const ::c2_cntr_t<T> &rh) const {
+ return lh.peeku() <= rh.peeku();
+ }
+};
+template<typename T>
+struct std::greater<::c2_cntr_t<T>> {
+ constexpr bool operator()(const ::c2_cntr_t<T> &lh, const ::c2_cntr_t<T> &rh) const {
+ return lh.peeku() > rh.peeku();
+ }
+};
+template<typename T>
+struct std::greater_equal<::c2_cntr_t<T>> {
+ constexpr bool operator()(const ::c2_cntr_t<T> &lh, const ::c2_cntr_t<T> &rh) const {
+ return lh.peeku() >= rh.peeku();
+ }
+};
+
+#endif // C2_H_
diff --git a/media/codec2/core/include/C2Buffer.h b/media/codec2/core/include/C2Buffer.h
new file mode 100644
index 0000000..2997f6e
--- /dev/null
+++ b/media/codec2/core/include/C2Buffer.h
@@ -0,0 +1,2305 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2BUFFER_H_
+#define C2BUFFER_H_
+
+#include <C2.h>
+#include <C2BufferBase.h>
+#include <C2Param.h> // for C2Info
+
+#include <memory>
+#include <vector>
+
+#ifdef __ANDROID__
+#include <android-C2Buffer.h>
+#else
+
+typedef void* C2Handle;
+
+#endif
+
+/// \defgroup buffer Buffers
+/// @{
+
+/// \defgroup buffer_sync Synchronization
+/// @{
+
+/**
+ * Synchronization is accomplished using event and fence objects.
+ *
+ * These are cross-process extensions of promise/future infrastructure.
+ * Events are analogous to std::promise<void>, whereas fences are to std::shared_future<void>.
+ *
+ * Fences and events are shareable/copyable.
+ *
+ * Fences are used in two scenarios, and all copied instances refer to the same event.
+ * \todo do events need to be copyable or should they be unique?
+ *
+ * acquire sync fence object: signaled when it is safe for the component or client to access
+ * (the contents of) an object.
+ *
+ * release sync fence object: \todo
+ *
+ * Fences can be backed by hardware. Hardware fences are guaranteed to signal NO MATTER WHAT within
+ * a short (platform specific) amount of time; this guarantee is usually less than 15 msecs.
+ */
+
+/**
+ * Fence object used by components and the framework.
+ *
+ * Implements the waiting for an event, analogous to a 'future'.
+ *
+ * To be implemented by vendors if using HW fences.
+ */
+class C2Fence {
+public:
+ /**
+ * Waits for a fence to be signaled with a timeout.
+ *
+ * \todo a mechanism to cancel a wait - for now the only way to do this is to abandon the
+ * event, but fences are shared so canceling a wait will cancel all waits.
+ *
+ * \param timeoutNs the maximum time to wait in nsecs
+ *
+ * \retval C2_OK the fence has been signaled
+ * \retval C2_TIMED_OUT the fence has not been signaled within the timeout
+ * \retval C2_BAD_STATE the fence has been abandoned without being signaled (it will never
+ * be signaled)
+ * \retval C2_REFUSED no permission to wait for the fence (unexpected - system)
+ * \retval C2_CORRUPTED some unknown error prevented waiting for the fence (unexpected)
+ */
+ c2_status_t wait(c2_nsecs_t timeoutNs);
+
+ /**
+ * Used to check if this fence is valid (if there is a chance for it to be signaled.)
+ * A fence becomes invalid if the controling event is destroyed without it signaling the fence.
+ *
+ * \return whether this fence is valid
+ */
+ bool valid() const;
+
+ /**
+ * Used to check if this fence has been signaled (is ready).
+ *
+ * \return whether this fence has been signaled
+ */
+ bool ready() const;
+
+ /**
+ * Returns a file descriptor that can be used to wait for this fence in a select system call.
+ * \note The returned file descriptor, if valid, must be closed by the caller.
+ *
+ * This can be used in e.g. poll() system calls. This file becomes readable (POLLIN) when the
+ * fence is signaled, and bad (POLLERR) if the fence is abandoned.
+ *
+ * \return a file descriptor representing this fence (with ownership), or -1 if the fence
+ * has already been signaled (\todo or abandoned).
+ *
+ * \todo this must be compatible with fences used by gralloc
+ */
+ int fd() const;
+
+ /**
+ * Returns whether this fence is a hardware-backed fence.
+ * \return whether this is a hardware fence
+ */
+ bool isHW() const;
+
+ /**
+ * Null-fence. A fence that has fired.
+ */
+ constexpr C2Fence() : mImpl(nullptr) { }
+
+private:
+ class Impl;
+ std::shared_ptr<Impl> mImpl;
+ C2Fence(std::shared_ptr<Impl> impl);
+ friend struct _C2FenceFactory;
+};
+
+/**
+ * Event object used by components and the framework.
+ *
+ * Implements the signaling of an event, analogous to a 'promise'.
+ *
+ * Hardware backed events do not go through this object, and must be exposed directly as fences
+ * by vendors.
+ */
+class C2Event {
+public:
+ /**
+ * Returns a fence for this event.
+ */
+ C2Fence fence() const;
+
+ /**
+ * Signals (all) associated fence(s).
+ * This has no effect no effect if the event was already signaled or abandoned.
+ *
+ * \retval C2_OK the fence(s) were successfully signaled
+ * \retval C2_BAD_STATE the fence(s) have already been abandoned or merged (caller error)
+ * \retval C2_DUPLICATE the fence(s) have already been signaled (caller error)
+ * \retval C2_REFUSED no permission to signal the fence (unexpected - system)
+ * \retval C2_CORRUPTED some unknown error prevented signaling the fence(s) (unexpected)
+ */
+ c2_status_t fire();
+
+ /**
+ * Trigger this event from the merging of the supplied fences. This means that it will be
+ * abandoned if any of these fences have been abandoned, and it will be fired if all of these
+ * fences have been signaled.
+ *
+ * \retval C2_OK the merging was successfully done
+ * \retval C2_NO_MEMORY not enough memory to perform the merging
+ * \retval C2_DUPLICATE the fence have already been merged (caller error)
+ * \retval C2_BAD_STATE the fence have already been signaled or abandoned (caller error)
+ * \retval C2_REFUSED no permission to merge the fence (unexpected - system)
+ * \retval C2_CORRUPTED some unknown error prevented merging the fence(s) (unexpected)
+ */
+ c2_status_t merge(std::vector<C2Fence> fences);
+
+ /**
+ * Abandons the event and any associated fence(s).
+ * \note Call this to explicitly abandon an event before it is destructed to avoid a warning.
+ *
+ * This has no effect no effect if the event was already signaled or abandoned.
+ *
+ * \retval C2_OK the fence(s) were successfully signaled
+ * \retval C2_BAD_STATE the fence(s) have already been signaled or merged (caller error)
+ * \retval C2_DUPLICATE the fence(s) have already been abandoned (caller error)
+ * \retval C2_REFUSED no permission to abandon the fence (unexpected - system)
+ * \retval C2_CORRUPTED some unknown error prevented signaling the fence(s) (unexpected)
+ */
+ c2_status_t abandon();
+
+private:
+ class Impl;
+ std::shared_ptr<Impl> mImpl;
+};
+
+/// \addtogroup buf_internal Internal
+/// @{
+
+/**
+ * Interface for objects that encapsulate an updatable status value.
+ */
+struct _C2InnateStatus {
+ inline c2_status_t status() const { return mStatus; }
+
+protected:
+ _C2InnateStatus(c2_status_t status) : mStatus(status) { }
+
+ c2_status_t mStatus; // this status is updatable by the object
+};
+
+/// @}
+
+/**
+ * This is a utility template for objects protected by an acquire fence, so that errors during
+ * acquiring the object are propagated to the object itself.
+ */
+template<typename T>
+class C2Acquirable : public C2Fence {
+public:
+ /**
+ * Acquires the object protected by an acquire fence. Any errors during the mapping will be
+ * passed to the object.
+ *
+ * \return acquired object potentially invalidated if waiting for the fence failed.
+ */
+ T get() {
+ // TODO:
+ // wait();
+ return mT;
+ }
+
+protected:
+ C2Acquirable(c2_status_t error, C2Fence fence, T t) : C2Fence(fence), mInitialError(error), mT(t) { }
+
+private:
+ c2_status_t mInitialError;
+ T mT; // TODO: move instead of copy
+};
+
+/// @}
+
+/// \defgroup linear Linear Data Blocks
+/// @{
+
+/**************************************************************************************************
+ LINEAR ASPECTS, BLOCKS AND VIEWS
+**************************************************************************************************/
+
+/**
+ * Basic segment math support.
+ */
+struct C2Segment {
+ uint32_t offset;
+ uint32_t size;
+
+ inline constexpr C2Segment(uint32_t offset_, uint32_t size_)
+ : offset(offset_),
+ size(size_) {
+ }
+
+ inline constexpr bool isEmpty() const {
+ return size == 0;
+ }
+
+ inline constexpr bool isValid() const {
+ return offset <= ~size;
+ }
+
+ inline constexpr operator bool() const {
+ return isValid() && !isEmpty();
+ }
+
+ inline constexpr bool operator!() const {
+ return !bool(*this);
+ }
+
+ C2_ALLOW_OVERFLOW
+ inline constexpr bool contains(const C2Segment &other) const {
+ if (!isValid() || !other.isValid()) {
+ return false;
+ } else {
+ return offset <= other.offset
+ && offset + size >= other.offset + other.size;
+ }
+ }
+
+ inline constexpr bool operator==(const C2Segment &other) const {
+ if (!isValid()) {
+ return !other.isValid();
+ } else {
+ return offset == other.offset && size == other.size;
+ }
+ }
+
+ inline constexpr bool operator!=(const C2Segment &other) const {
+ return !operator==(other);
+ }
+
+ inline constexpr bool operator>=(const C2Segment &other) const {
+ return contains(other);
+ }
+
+ inline constexpr bool operator>(const C2Segment &other) const {
+ return contains(other) && !operator==(other);
+ }
+
+ inline constexpr bool operator<=(const C2Segment &other) const {
+ return other.contains(*this);
+ }
+
+ inline constexpr bool operator<(const C2Segment &other) const {
+ return other.contains(*this) && !operator==(other);
+ }
+
+ C2_ALLOW_OVERFLOW
+ inline constexpr uint32_t end() const {
+ return offset + size;
+ }
+
+ C2_ALLOW_OVERFLOW
+ inline constexpr C2Segment intersect(const C2Segment &other) const {
+ return C2Segment(c2_max(offset, other.offset),
+ c2_min(end(), other.end()) - c2_max(offset, other.offset));
+ }
+
+ /** clamps end to offset if it overflows */
+ inline constexpr C2Segment normalize() const {
+ return C2Segment(offset, c2_max(offset, end()) - offset);
+ }
+
+ /** clamps end to max if it overflows */
+ inline constexpr C2Segment saturate() const {
+ return C2Segment(offset, c2_min(size, ~offset));
+ }
+
+};
+
+/**
+ * Common aspect for all objects that have a linear capacity.
+ */
+class _C2LinearCapacityAspect {
+/// \name Linear capacity interface
+/// @{
+public:
+ inline constexpr uint32_t capacity() const { return mCapacity; }
+
+ inline constexpr operator C2Segment() const {
+ return C2Segment(0, mCapacity);
+ }
+
+protected:
+
+#if UINTPTR_MAX == 0xffffffff
+ static_assert(sizeof(size_t) == sizeof(uint32_t), "size_t is too big");
+#else
+ static_assert(sizeof(size_t) > sizeof(uint32_t), "size_t is too small");
+ // explicitly disable construction from size_t
+ inline explicit _C2LinearCapacityAspect(size_t capacity) = delete;
+#endif
+
+ inline explicit constexpr _C2LinearCapacityAspect(uint32_t capacity)
+ : mCapacity(capacity) { }
+
+ inline explicit constexpr _C2LinearCapacityAspect(const _C2LinearCapacityAspect *parent)
+ : mCapacity(parent == nullptr ? 0 : parent->capacity()) { }
+
+private:
+ uint32_t mCapacity;
+/// @}
+};
+
+/**
+ * Aspect for objects that have a linear range inside a linear capacity.
+ *
+ * This class is copiable.
+ */
+class _C2LinearRangeAspect : public _C2LinearCapacityAspect {
+/// \name Linear range interface
+/// @{
+public:
+ inline constexpr uint32_t offset() const { return mOffset; }
+ inline constexpr uint32_t endOffset() const { return mOffset + mSize; }
+ inline constexpr uint32_t size() const { return mSize; }
+
+ inline constexpr operator C2Segment() const {
+ return C2Segment(mOffset, mSize);
+ }
+
+private:
+ // subrange of capacity [0, capacity] & [size, size + offset]
+ inline constexpr _C2LinearRangeAspect(uint32_t capacity_, size_t offset, size_t size)
+ : _C2LinearCapacityAspect(capacity_),
+ mOffset(c2_min(offset, capacity())),
+ mSize(c2_min(size, capacity() - mOffset)) {
+ }
+
+protected:
+ // copy constructor (no error check)
+ inline constexpr _C2LinearRangeAspect(const _C2LinearRangeAspect &other)
+ : _C2LinearCapacityAspect(other.capacity()),
+ mOffset(other.offset()),
+ mSize(other.size()) {
+ }
+
+ // parent capacity range [0, capacity]
+ inline constexpr explicit _C2LinearRangeAspect(const _C2LinearCapacityAspect *parent)
+ : _C2LinearCapacityAspect(parent),
+ mOffset(0),
+ mSize(capacity()) {
+ }
+
+ // subrange of parent capacity [0, capacity] & [size, size + offset]
+ inline constexpr _C2LinearRangeAspect(const _C2LinearCapacityAspect *parent, size_t offset, size_t size)
+ : _C2LinearCapacityAspect(parent),
+ mOffset(c2_min(offset, capacity())),
+ mSize(c2_min(size, capacity() - mOffset)) {
+ }
+
+ // subsection of the parent's and [offset, offset + size] ranges
+ inline constexpr _C2LinearRangeAspect(const _C2LinearRangeAspect *parent, size_t offset, size_t size)
+ : _C2LinearCapacityAspect(parent),
+ mOffset(c2_min(c2_max(offset, parent == nullptr ? 0 : parent->offset()), capacity())),
+ mSize(std::min(c2_min(size, parent == nullptr ? 0 : parent->size()), capacity() - mOffset)) {
+ }
+
+public:
+ inline constexpr _C2LinearRangeAspect childRange(size_t offset, size_t size) const {
+ return _C2LinearRangeAspect(
+ mSize,
+ c2_min(c2_max(offset, mOffset), capacity()) - mOffset,
+ c2_min(c2_min(size, mSize), capacity() - c2_min(c2_max(offset, mOffset), capacity())));
+ }
+
+ friend class _C2EditableLinearRangeAspect;
+ // invariants 0 <= mOffset <= mOffset + mSize <= capacity()
+ uint32_t mOffset;
+ uint32_t mSize;
+/// @}
+};
+
+/**
+ * Utility class for safe range calculations using size_t-s.
+ */
+class C2LinearRange : public _C2LinearRangeAspect {
+public:
+ inline constexpr C2LinearRange(const _C2LinearCapacityAspect &parent, size_t offset, size_t size)
+ : _C2LinearRangeAspect(&parent, offset, size) { }
+
+ inline constexpr C2LinearRange(const _C2LinearRangeAspect &parent, size_t offset, size_t size)
+ : _C2LinearRangeAspect(&parent, offset, size) { }
+
+ inline constexpr C2LinearRange intersect(size_t offset, size_t size) const {
+ return C2LinearRange(*this, offset, size);
+ }
+};
+
+/**
+ * Utility class for simple and safe capacity and range construction.
+ */
+class C2LinearCapacity : public _C2LinearCapacityAspect {
+public:
+ inline constexpr explicit C2LinearCapacity(size_t capacity)
+ : _C2LinearCapacityAspect(c2_min(capacity, std::numeric_limits<uint32_t>::max())) { }
+
+ inline constexpr C2LinearRange range(size_t offset, size_t size) const {
+ return C2LinearRange(*this, offset, size);
+ }
+};
+
+/**
+ * Aspect for objects that have an editable linear range.
+ *
+ * This class is copiable.
+ */
+class _C2EditableLinearRangeAspect : public _C2LinearRangeAspect {
+ using _C2LinearRangeAspect::_C2LinearRangeAspect;
+
+public:
+/// \name Editable linear range interface
+/// @{
+
+ /**
+ * Sets the offset to |offset|, while trying to keep the end of the buffer unchanged (e.g.
+ * size will grow if offset is decreased, and may shrink if offset is increased.) Returns
+ * true if successful, which is equivalent to if 0 <= |offset| <= capacity().
+ *
+ * Note: setting offset and size will yield different result depending on the order of the
+ * operations. Always set offset first to ensure proper size.
+ */
+ inline bool setOffset(uint32_t offset) {
+ if (offset > capacity()) {
+ return false;
+ }
+
+ if (offset > mOffset + mSize) {
+ mSize = 0;
+ } else {
+ mSize = mOffset + mSize - offset;
+ }
+ mOffset = offset;
+ return true;
+ }
+
+ /**
+ * Sets the size to |size|. Returns true if successful, which is equivalent to
+ * if 0 <= |size| <= capacity() - offset().
+ *
+ * Note: setting offset and size will yield different result depending on the order of the
+ * operations. Always set offset first to ensure proper size.
+ */
+ inline bool setSize(uint32_t size) {
+ if (size > capacity() - mOffset) {
+ return false;
+ } else {
+ mSize = size;
+ return true;
+ }
+ }
+
+ /**
+ * Sets the offset to |offset| with best effort. Same as setOffset() except that offset will
+ * be clamped to the buffer capacity.
+ *
+ * Note: setting offset and size (even using best effort) will yield different result depending
+ * on the order of the operations. Always set offset first to ensure proper size.
+ */
+ inline void setOffset_be(uint32_t offset) {
+ (void)setOffset(c2_min(offset, capacity()));
+ }
+
+ /**
+ * Sets the size to |size| with best effort. Same as setSize() except that the selected region
+ * will be clamped to the buffer capacity (e.g. size is clamped to [0, capacity() - offset()]).
+ *
+ * Note: setting offset and size (even using best effort) will yield different result depending
+ * on the order of the operations. Always set offset first to ensure proper size.
+ */
+ inline void setSize_be(uint32_t size) {
+ mSize = c2_min(size, capacity() - mOffset);
+ }
+/// @}
+};
+
+/**************************************************************************************************
+ ALLOCATIONS
+**************************************************************************************************/
+
+/// \ingroup allocator Allocation and memory placement
+/// @{
+
+class C2LinearAllocation;
+class C2GraphicAllocation;
+
+/**
+ * Allocators are used by the framework to allocate memory (allocations) for buffers. They can
+ * support either 1D or 2D allocations.
+ *
+ * \note In theory they could support both, but in practice, we will use only one or the other.
+ *
+ * Never constructed on stack.
+ *
+ * Allocators are provided by vendors.
+ */
+class C2Allocator {
+public:
+ /**
+ * Allocator ID type.
+ */
+ typedef uint32_t id_t;
+ enum : id_t {
+ BAD_ID = 0xBADD, // invalid allocator ID
+ };
+
+ /**
+ * Allocation types. This is a bitmask and is used in C2Allocator::Info
+ * to list the supported allocation types of an allocator.
+ */
+ enum type_t : uint32_t {
+ LINEAR = 1 << 0, //
+ GRAPHIC = 1 << 1,
+ };
+
+ /**
+ * Information about an allocator.
+ *
+ * Allocators don't have a query API so all queriable information is stored here.
+ */
+ struct Traits {
+ C2String name; ///< allocator name
+ id_t id; ///< allocator ID
+ type_t supportedTypes; ///< supported allocation types
+ C2MemoryUsage minimumUsage; ///< usage that is minimally required for allocations
+ C2MemoryUsage maximumUsage; ///< usage that is maximally allowed for allocations
+ };
+
+ /**
+ * Returns the unique name of this allocator.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return the name of this allocator.
+ * \retval an empty string if there was not enough memory to allocate the actual name.
+ */
+ virtual C2String getName() const = 0;
+
+ /**
+ * Returns a unique ID for this allocator. This ID is used to get this allocator from the
+ * allocator store, and to identify this allocator across all processes.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return a unique ID for this allocator.
+ */
+ virtual id_t getId() const = 0;
+
+ /**
+ * Returns the allocator traits.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * Allocators don't have a full-fledged query API, only this method.
+ *
+ * \return allocator information
+ */
+ virtual std::shared_ptr<const Traits> getTraits() const = 0;
+
+ /**
+ * Allocates a 1D allocation of given |capacity| and |usage|. If successful, the allocation is
+ * stored in |allocation|. Otherwise, |allocation| is set to 'nullptr'.
+ *
+ * \param capacity the size of requested allocation (the allocation could be slightly
+ * larger, e.g. to account for any system-required alignment)
+ * \param usage the memory usage info for the requested allocation. \note that the
+ * returned allocation may be later used/mapped with different usage.
+ * The allocator should layout the buffer to be optimized for this usage,
+ * but must support any usage. One exception: protected buffers can
+ * only be used in a protected scenario.
+ * \param allocation pointer to where the allocation shall be stored on success. nullptr
+ * will be stored here on failure
+ *
+ * \retval C2_OK the allocation was successful
+ * \retval C2_NO_MEMORY not enough memory to complete the allocation
+ * \retval C2_TIMED_OUT the allocation timed out
+ * \retval C2_REFUSED no permission to complete the allocation
+ * \retval C2_BAD_VALUE capacity or usage are not supported (invalid) (caller error)
+ * \retval C2_OMITTED this allocator does not support 1D allocations
+ * \retval C2_CORRUPTED some unknown, unrecoverable error occured during allocation (unexpected)
+ */
+ virtual c2_status_t newLinearAllocation(
+ uint32_t capacity __unused, C2MemoryUsage usage __unused,
+ std::shared_ptr<C2LinearAllocation> *allocation /* nonnull */) {
+ *allocation = nullptr;
+ return C2_OMITTED;
+ }
+
+ /**
+ * (Re)creates a 1D allocation from a native |handle|. If successful, the allocation is stored
+ * in |allocation|. Otherwise, |allocation| is set to 'nullptr'.
+ *
+ * \param handle the handle for the existing allocation. On success, the allocation will
+ * take ownership of |handle|.
+ * \param allocation pointer to where the allocation shall be stored on success. nullptr
+ * will be stored here on failure
+ *
+ * \retval C2_OK the allocation was recreated successfully
+ * \retval C2_NO_MEMORY not enough memory to recreate the allocation
+ * \retval C2_TIMED_OUT the recreation timed out (unexpected)
+ * \retval C2_REFUSED no permission to recreate the allocation
+ * \retval C2_BAD_VALUE invalid handle (caller error)
+ * \retval C2_OMITTED this allocator does not support 1D allocations
+ * \retval C2_CORRUPTED some unknown, unrecoverable error occured during allocation (unexpected)
+ */
+ virtual c2_status_t priorLinearAllocation(
+ const C2Handle *handle __unused,
+ std::shared_ptr<C2LinearAllocation> *allocation /* nonnull */) {
+ *allocation = nullptr;
+ return C2_OMITTED;
+ }
+
+ /**
+ * Allocates a 2D allocation of given |width|, |height|, |format| and |usage|. If successful,
+ * the allocation is stored in |allocation|. Otherwise, |allocation| is set to 'nullptr'.
+ *
+ * \param width the width of requested allocation (the allocation could be slightly
+ * larger, e.g. to account for any system-required alignment)
+ * \param height the height of requested allocation (the allocation could be slightly
+ * larger, e.g. to account for any system-required alignment)
+ * \param format the pixel format of requested allocation. This could be a vendor
+ * specific format.
+ * \param usage the memory usage info for the requested allocation. \note that the
+ * returned allocation may be later used/mapped with different usage.
+ * The allocator should layout the buffer to be optimized for this usage,
+ * but must support any usage. One exception: protected buffers can
+ * only be used in a protected scenario.
+ * \param allocation pointer to where the allocation shall be stored on success. nullptr
+ * will be stored here on failure
+ *
+ * \retval C2_OK the allocation was successful
+ * \retval C2_NO_MEMORY not enough memory to complete the allocation
+ * \retval C2_TIMED_OUT the allocation timed out
+ * \retval C2_REFUSED no permission to complete the allocation
+ * \retval C2_BAD_VALUE width, height, format or usage are not supported (invalid) (caller error)
+ * \retval C2_OMITTED this allocator does not support 2D allocations
+ * \retval C2_CORRUPTED some unknown, unrecoverable error occured during allocation (unexpected)
+ */
+ virtual c2_status_t newGraphicAllocation(
+ uint32_t width __unused, uint32_t height __unused, uint32_t format __unused,
+ C2MemoryUsage usage __unused,
+ std::shared_ptr<C2GraphicAllocation> *allocation /* nonnull */) {
+ *allocation = nullptr;
+ return C2_OMITTED;
+ }
+
+ /**
+ * (Re)creates a 2D allocation from a native handle. If successful, the allocation is stored
+ * in |allocation|. Otherwise, |allocation| is set to 'nullptr'.
+ *
+ * \param handle the handle for the existing allocation. On success, the allocation will
+ * take ownership of |handle|.
+ * \param allocation pointer to where the allocation shall be stored on success. nullptr
+ * will be stored here on failure
+ *
+ * \retval C2_OK the allocation was recreated successfully
+ * \retval C2_NO_MEMORY not enough memory to recreate the allocation
+ * \retval C2_TIMED_OUT the recreation timed out (unexpected)
+ * \retval C2_REFUSED no permission to recreate the allocation
+ * \retval C2_BAD_VALUE invalid handle (caller error)
+ * \retval C2_OMITTED this allocator does not support 2D allocations
+ * \retval C2_CORRUPTED some unknown, unrecoverable error occured during recreation (unexpected)
+ */
+ virtual c2_status_t priorGraphicAllocation(
+ const C2Handle *handle __unused,
+ std::shared_ptr<C2GraphicAllocation> *allocation /* nonnull */) {
+ *allocation = nullptr;
+ return C2_OMITTED;
+ }
+
+ virtual ~C2Allocator() = default;
+protected:
+ C2Allocator() = default;
+};
+
+/**
+ * \ingroup linear allocator
+ * 1D allocation interface.
+ */
+class C2LinearAllocation : public _C2LinearCapacityAspect {
+public:
+ /**
+ * Maps a portion of an allocation starting from |offset| with |size| into local process memory.
+ * Stores the starting address into |addr|, or NULL if the operation was unsuccessful.
+ * |fence| will contain an acquire sync fence object. If it is already
+ * safe to access the buffer contents, then it will contain an empty (already fired) fence.
+ *
+ * \param offset starting position of the portion to be mapped (this does not have to
+ * be page aligned)
+ * \param size size of the portion to be mapped (this does not have to be page
+ * aligned)
+ * \param usage the desired usage. \todo this must be kSoftwareRead and/or
+ * kSoftwareWrite.
+ * \param fence a pointer to a fence object if an async mapping is requested. If
+ * not-null, and acquire fence will be stored here on success, or empty
+ * fence on failure. If null, the mapping will be synchronous.
+ * \param addr a pointer to where the starting address of the mapped portion will be
+ * stored. On failure, nullptr will be stored here.
+ *
+ * \todo Only one portion can be mapped at the same time - this is true for gralloc, but there
+ * is no need for this for 1D buffers.
+ * \todo Do we need to support sync operation as we could just wait for the fence?
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_REFUSED no permission to map the portion
+ * \retval C2_TIMED_OUT the operation timed out
+ * \retval C2_DUPLICATE if the allocation is already mapped.
+ * \retval C2_NO_MEMORY not enough memory to complete the operation
+ * \retval C2_BAD_VALUE the parameters (offset/size) are invalid or outside the allocation, or
+ * the usage flags are invalid (caller error)
+ * \retval C2_CORRUPTED some unknown error prevented the operation from completing (unexpected)
+ */
+ virtual c2_status_t map(
+ size_t offset, size_t size, C2MemoryUsage usage, C2Fence *fence /* nullable */,
+ void **addr /* nonnull */) = 0;
+
+ /**
+ * Unmaps a portion of an allocation at |addr| with |size|. These must be parameters previously
+ * passed to and returned by |map|; otherwise, this operation is a no-op.
+ *
+ * \param addr starting address of the mapped region
+ * \param size size of the mapped region
+ * \param fence a pointer to a fence object if an async unmapping is requested. If
+ * not-null, a release fence will be stored here on success, or empty fence
+ * on failure. This fence signals when the original allocation contains
+ * all changes that happened to the mapped region. If null, the unmapping
+ * will be synchronous.
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_TIMED_OUT the operation timed out
+ * \retval C2_NOT_FOUND if the allocation was not mapped previously.
+ * \retval C2_BAD_VALUE the parameters (addr/size) do not correspond to previously mapped
+ * regions (caller error)
+ * \retval C2_CORRUPTED some unknown error prevented the operation from completing (unexpected)
+ * \retval C2_REFUSED no permission to unmap the portion (unexpected - system)
+ */
+ virtual c2_status_t unmap(void *addr, size_t size, C2Fence *fence /* nullable */) = 0;
+
+ /**
+ * Returns the allocator ID for this allocation. This is useful to put the handle into context.
+ */
+ virtual C2Allocator::id_t getAllocatorId() const = 0;
+
+ /**
+ * Returns a pointer to the allocation handle.
+ */
+ virtual const C2Handle *handle() const = 0;
+
+ /**
+ * Returns true if this is the same allocation as |other|.
+ */
+ virtual bool equals(const std::shared_ptr<C2LinearAllocation> &other) const = 0;
+
+protected:
+ // \todo should we limit allocation directly?
+ C2LinearAllocation(size_t capacity) : _C2LinearCapacityAspect(c2_min(capacity, UINT32_MAX)) {}
+ virtual ~C2LinearAllocation() = default;
+};
+
+class C2CircularBlock;
+class C2LinearBlock;
+class C2GraphicBlock;
+
+/**
+ * Block pools are used by components to obtain output buffers in an efficient way. They can
+ * support either linear (1D), circular (1D) or graphic (2D) blocks.
+ *
+ * Block pools decouple the recycling of memory/allocations from the components. They are meant to
+ * be an opaque service (there are no public APIs other than obtaining blocks) provided by the
+ * platform. Block pools are also meant to decouple allocations from memory used by buffers. This
+ * is accomplished by allowing pools to allot multiple memory 'blocks' on a single allocation. As
+ * their name suggest, block pools maintain a pool of memory blocks. When a component asks for
+ * a memory block, pools will try to return a free memory block already in the pool. If no such
+ * block exists, they will allocate memory using the backing allocator and allot a block on that
+ * allocation. When blocks are no longer used in the system, they are recycled back to the block
+ * pool and are available as free blocks.
+ *
+ * Never constructed on stack.
+ */
+class C2BlockPool {
+public:
+ /**
+ * Block pool ID type.
+ */
+ typedef uint64_t local_id_t;
+
+ enum : local_id_t {
+ BASIC_LINEAR = 0, ///< ID of basic (unoptimized) block pool for fetching 1D blocks
+ BASIC_GRAPHIC = 1, ///< ID of basic (unoptimized) block pool for fetching 2D blocks
+ PLATFORM_START = 0x10,
+ };
+
+ /**
+ * Returns the ID for this block pool. This ID is used to get this block pool from the platform.
+ * It is only valid in the current process.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return a local ID for this block pool.
+ */
+ virtual local_id_t getLocalId() const = 0;
+
+ /**
+ * Returns the ID of the backing allocator of this block pool.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return the ID of the backing allocator of this block pool.
+ */
+ virtual C2Allocator::id_t getAllocatorId() const = 0;
+
+ /**
+ * Obtains a linear writeable block of given |capacity| and |usage|. If successful, the
+ * block is stored in |block|. Otherwise, |block| is set to 'nullptr'.
+ *
+ * \param capacity the size of requested block.
+ * \param usage the memory usage info for the requested block. Returned blocks will be
+ * optimized for this usage, but may be used with any usage. One exception:
+ * protected blocks/buffers can only be used in a protected scenario.
+ * \param block pointer to where the obtained block shall be stored on success. nullptr will
+ * be stored here on failure
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_NO_MEMORY not enough memory to complete any required allocation
+ * \retval C2_TIMED_OUT the operation timed out
+ * \retval C2_REFUSED no permission to complete any required allocation
+ * \retval C2_BAD_VALUE capacity or usage are not supported (invalid) (caller error)
+ * \retval C2_OMITTED this pool does not support linear blocks
+ * \retval C2_CORRUPTED some unknown, unrecoverable error occured during operation (unexpected)
+ */
+ virtual c2_status_t fetchLinearBlock(
+ uint32_t capacity __unused, C2MemoryUsage usage __unused,
+ std::shared_ptr<C2LinearBlock> *block /* nonnull */) {
+ *block = nullptr;
+ return C2_OMITTED;
+ }
+
+ /**
+ * Obtains a circular writeable block of given |capacity| and |usage|. If successful, the
+ * block is stored in |block|. Otherwise, |block| is set to 'nullptr'.
+ *
+ * \param capacity the size of requested circular block. (note: the size of the obtained
+ * block could be slightly larger, e.g. to accommodate any system-required
+ * alignment)
+ * \param usage the memory usage info for the requested block. Returned blocks will be
+ * optimized for this usage, but may be used with any usage. One exception:
+ * protected blocks/buffers can only be used in a protected scenario.
+ * \param block pointer to where the obtained block shall be stored on success. nullptr
+ * will be stored here on failure
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_NO_MEMORY not enough memory to complete any required allocation
+ * \retval C2_TIMED_OUT the operation timed out
+ * \retval C2_REFUSED no permission to complete any required allocation
+ * \retval C2_BAD_VALUE capacity or usage are not supported (invalid) (caller error)
+ * \retval C2_OMITTED this pool does not support circular blocks
+ * \retval C2_CORRUPTED some unknown, unrecoverable error occured during operation (unexpected)
+ */
+ virtual c2_status_t fetchCircularBlock(
+ uint32_t capacity __unused, C2MemoryUsage usage __unused,
+ std::shared_ptr<C2CircularBlock> *block /* nonnull */) {
+ *block = nullptr;
+ return C2_OMITTED;
+ }
+
+ /**
+ * Obtains a 2D graphic block of given |width|, |height|, |format| and |usage|. If successful,
+ * the block is stored in |block|. Otherwise, |block| is set to 'nullptr'.
+ *
+ * \param width the width of requested block (the obtained block could be slightly larger, e.g.
+ * to accommodate any system-required alignment)
+ * \param height the height of requested block (the obtained block could be slightly larger,
+ * e.g. to accommodate any system-required alignment)
+ * \param format the pixel format of requested block. This could be a vendor specific format.
+ * \param usage the memory usage info for the requested block. Returned blocks will be
+ * optimized for this usage, but may be used with any usage. One exception:
+ * protected blocks/buffers can only be used in a protected scenario.
+ * \param block pointer to where the obtained block shall be stored on success. nullptr
+ * will be stored here on failure
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_NO_MEMORY not enough memory to complete any required allocation
+ * \retval C2_TIMED_OUT the operation timed out
+ * \retval C2_REFUSED no permission to complete any required allocation
+ * \retval C2_BAD_VALUE width, height, format or usage are not supported (invalid) (caller
+ * error)
+ * \retval C2_OMITTED this pool does not support 2D blocks
+ * \retval C2_CORRUPTED some unknown, unrecoverable error occured during operation (unexpected)
+ */
+ virtual c2_status_t fetchGraphicBlock(
+ uint32_t width __unused, uint32_t height __unused, uint32_t format __unused,
+ C2MemoryUsage usage __unused,
+ std::shared_ptr<C2GraphicBlock> *block /* nonnull */) {
+ *block = nullptr;
+ return C2_OMITTED;
+ }
+
+ virtual ~C2BlockPool() = default;
+protected:
+ C2BlockPool() = default;
+};
+
+/// @}
+
+// ================================================================================================
+// BLOCKS
+// ================================================================================================
+
+/**
+ * Blocks are sections of allocations. They can be either 1D or 2D.
+ */
+
+class C2LinearAllocation;
+
+/**
+ * A 1D block.
+ *
+ * \note capacity() is not meaningful for users of blocks; instead size() is the capacity of the
+ * usable portion. Use and offset() and size() if accessing the block directly through its handle
+ * to represent the allotted range of the underlying allocation to this block.
+ */
+class C2Block1D : public _C2LinearRangeAspect {
+public:
+ /**
+ * Returns the underlying handle for this allocation.
+ *
+ * \note that the block and its block pool has shared ownership of the handle
+ * and if all references to the block are released, the underlying block
+ * allocation may get reused even if a client keeps a clone of this handle.
+ */
+ const C2Handle *handle() const;
+
+ /**
+ * Returns the allocator's ID that created the underlying allocation for this block. This
+ * provides the context for understanding the handle.
+ */
+ C2Allocator::id_t getAllocatorId() const;
+
+protected:
+ class Impl;
+ /** construct a block. */
+ C2Block1D(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range);
+
+ friend struct _C2BlockFactory;
+ std::shared_ptr<Impl> mImpl;
+};
+
+/**
+ * Read view provides read-only access for a linear memory segment.
+ *
+ * This class is copiable.
+ */
+class C2ReadView : public _C2LinearCapacityAspect {
+public:
+ /**
+ * \return pointer to the start of the block or nullptr on error.
+ * This pointer is only valid during the lifetime of this view or until it is released.
+ */
+ const uint8_t *data() const;
+
+ /**
+ * Returns a portion of this view.
+ *
+ * \param offset the start offset of the portion. \note This is clamped to the capacity of this
+ * view.
+ * \param size the size of the portion. \note This is clamped to the remaining data from offset.
+ *
+ * \return a read view containing a portion of this view
+ */
+ C2ReadView subView(size_t offset, size_t size) const;
+
+ /**
+ * \return error during the creation/mapping of this view.
+ */
+ c2_status_t error() const;
+
+ /**
+ * Releases this view. This sets error to C2_NO_INIT.
+ */
+ //void release();
+
+protected:
+ class Impl;
+ C2ReadView(std::shared_ptr<Impl> impl, uint32_t offset, uint32_t size);
+ explicit C2ReadView(c2_status_t error);
+
+private:
+ friend struct _C2BlockFactory;
+ std::shared_ptr<Impl> mImpl;
+ uint32_t mOffset; /**< offset into the linear block backing this read view */
+};
+
+/**
+ * Write view provides read/write access for a linear memory segment.
+ *
+ * This class is copiable. \todo movable only?
+ */
+class C2WriteView : public _C2EditableLinearRangeAspect {
+public:
+ /**
+ * Start of the block.
+ *
+ * \return pointer to the start of the block or nullptr on error.
+ * This pointer is only valid during the lifetime of this view or until it is released.
+ */
+ uint8_t *base();
+
+ /**
+ * \return pointer to the block at the current offset or nullptr on error.
+ * This pointer is only valid during the lifetime of this view or until it is released.
+ */
+ uint8_t *data();
+
+ /**
+ * \return error during the creation/mapping of this view.
+ */
+ c2_status_t error() const;
+
+ /**
+ * Releases this view. This sets error to C2_NO_INIT.
+ */
+ //void release();
+
+protected:
+ class Impl;
+ C2WriteView(std::shared_ptr<Impl> impl);
+ explicit C2WriteView(c2_status_t error);
+
+private:
+ friend struct _C2BlockFactory;
+ std::shared_ptr<Impl> mImpl;
+};
+
+/**
+ * A constant (read-only) linear block (portion of an allocation) with an acquire fence.
+ * Blocks are unmapped when created, and can be mapped into a read view on demand.
+ *
+ * This class is copiable and contains a reference to the allocation that it is based on.
+ */
+class C2ConstLinearBlock : public C2Block1D {
+public:
+ /**
+ * Maps this block into memory and returns a read view for it.
+ *
+ * \return a read view for this block.
+ */
+ C2Acquirable<C2ReadView> map() const;
+
+ /**
+ * Returns a portion of this block.
+ *
+ * \param offset the start offset of the portion. \note This is clamped to the capacity of this
+ * block.
+ * \param size the size of the portion. \note This is clamped to the remaining data from offset.
+ *
+ * \return a constant linear block containing a portion of this block
+ */
+ C2ConstLinearBlock subBlock(size_t offset, size_t size) const;
+
+ /**
+ * Returns the acquire fence for this block.
+ *
+ * \return a fence that must be waited on before reading the block.
+ */
+ C2Fence fence() const { return mFence; }
+
+protected:
+ C2ConstLinearBlock(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range, C2Fence mFence);
+
+private:
+ friend struct _C2BlockFactory;
+ C2Fence mFence;
+};
+
+/**
+ * Linear block is a writeable 1D block. Once written, it can be shared in whole or in parts with
+ * consumers/readers as read-only const linear block(s).
+ */
+class C2LinearBlock : public C2Block1D {
+public:
+ /**
+ * Maps this block into memory and returns a write view for it.
+ *
+ * \return a write view for this block.
+ */
+ C2Acquirable<C2WriteView> map();
+
+ /**
+ * Creates a read-only const linear block for a portion of this block; optionally protected
+ * by an acquire fence. There are two ways to use this:
+ *
+ * 1) share ready block after writing data into the block. In this case no fence shall be
+ * supplied, and the block shall not be modified after calling this method.
+ * 2) share block metadata before actually (finishing) writing the data into the block. In
+ * this case a fence must be supplied that will be triggered when the data is written.
+ * The block shall be modified only until firing the event for the fence.
+ */
+ C2ConstLinearBlock share(size_t offset, size_t size, C2Fence fence);
+
+protected:
+ C2LinearBlock(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range);
+
+ friend struct _C2BlockFactory;
+};
+
+/// @}
+
+/**************************************************************************************************
+ CIRCULAR BLOCKS AND VIEWS
+**************************************************************************************************/
+
+/// \defgroup circular Circular buffer support
+/// @{
+
+/**
+ * Circular blocks can be used to share data between a writer and a reader (and/or other consumers)-
+ * in a memory-efficient way by reusing a section of memory. Circular blocks are a bit more complex
+ * than single reader/single writer schemes to facilitate block-based consuming of data.
+ *
+ * They can operate in two modes:
+ *
+ * 1) one writer that creates blocks to be consumed (this model can be used by components)
+ *
+ * 2) one writer that writes continuously, and one reader that can creates blocks to be consumed
+ * by further recipients (this model is used by the framework, and cannot be used by components.)
+ *
+ * Circular blocks have four segments with running pointers:
+ * - reserved: data reserved and available for the writer
+ * - committed: data committed by the writer and available to the reader (if present)
+ * - used: data used by consumers (if present)
+ * - available: unused data available to be reserved
+ */
+class C2CircularBlock : public C2Block1D {
+ // TODO: add methods
+
+private:
+ size_t mReserved __unused; // end of reserved section
+ size_t mCommitted __unused; // end of committed section
+ size_t mUsed __unused; // end of used section
+ size_t mFree __unused; // end of free section
+};
+
+class _C2CircularBlockSegment : public _C2LinearCapacityAspect {
+public:
+ /**
+ * Returns the available size for this segment.
+ *
+ * \return currently available size for this segment
+ */
+ size_t available() const;
+
+ /**
+ * Reserve some space for this segment from its current start.
+ *
+ * \param size desired space in bytes
+ * \param fence a pointer to an acquire fence. If non-null, the reservation is asynchronous and
+ * a fence will be stored here that will be signaled when the reservation is
+ * complete. If null, the reservation is synchronous.
+ *
+ * \retval C2_OK the space was successfully reserved
+ * \retval C2_NO_MEMORY the space requested cannot be reserved
+ * \retval C2_TIMED_OUT the reservation timed out \todo when?
+ * \retval C2_CORRUPTED some unknown error prevented reserving space. (unexpected)
+ */
+ c2_status_t reserve(size_t size, C2Fence *fence /* nullable */);
+
+ /**
+ * Abandons a portion of this segment. This will move to the beginning of this segment.
+ *
+ * \note This methods is only allowed if this segment is producing blocks.
+ *
+ * \param size number of bytes to abandon
+ *
+ * \retval C2_OK the data was successfully abandoned
+ * \retval C2_TIMED_OUT the operation timed out (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented abandoning the data (unexpected)
+ */
+ c2_status_t abandon(size_t size);
+
+ /**
+ * Share a portion as block(s) with consumers (these are moved to the used section).
+ *
+ * \note This methods is only allowed if this segment is producing blocks.
+ * \note Share does not move the beginning of the segment. (\todo add abandon/offset?)
+ *
+ * \param size number of bytes to share
+ * \param fence fence to be used for the section
+ * \param blocks vector where the blocks of the section are appended to
+ *
+ * \retval C2_OK the portion was successfully shared
+ * \retval C2_NO_MEMORY not enough memory to share the portion
+ * \retval C2_TIMED_OUT the operation timed out (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented sharing the data (unexpected)
+ */
+ c2_status_t share(size_t size, C2Fence fence, std::vector<C2ConstLinearBlock> &blocks);
+
+ /**
+ * Returns the beginning offset of this segment from the start of this circular block.
+ *
+ * @return beginning offset
+ */
+ size_t begin();
+
+ /**
+ * Returns the end offset of this segment from the start of this circular block.
+ *
+ * @return end offset
+ */
+ size_t end();
+};
+
+/**
+ * A circular write-view is a dynamic mapped view for a segment of a circular block. Care must be
+ * taken when using this view so that only the section owned by the segment is modified.
+ */
+class C2CircularWriteView : public _C2LinearCapacityAspect {
+public:
+ /**
+ * Start of the circular block.
+ * \note the segment does not own this pointer.
+ *
+ * \return pointer to the start of the circular block or nullptr on error.
+ */
+ uint8_t *base();
+
+ /**
+ * \return error during the creation/mapping of this view.
+ */
+ c2_status_t error() const;
+};
+
+/**
+ * The writer of a circular buffer.
+ *
+ * Can commit data to a reader (not supported for components) OR share data blocks directly with a
+ * consumer.
+ *
+ * If a component supports outputting data into circular buffers, it must allocate a circular
+ * block and use a circular writer.
+ */
+class C2CircularWriter : public _C2CircularBlockSegment {
+public:
+ /**
+ * Commits a portion of this segment to the next segment. This moves the beginning of the
+ * segment.
+ *
+ * \param size number of bytes to commit to the next segment
+ * \param fence fence used for the commit (the fence must signal before the data is committed)
+ */
+ c2_status_t commit(size_t size, C2Fence fence);
+
+ /**
+ * Maps this block into memory and returns a write view for it.
+ *
+ * \return a write view for this block.
+ */
+ C2Acquirable<C2CircularWriteView> map();
+};
+
+/// @}
+
+/// \defgroup graphic Graphic Data Blocks
+/// @{
+
+/**
+ * C2Rect: rectangle type with non-negative coordinates.
+ *
+ * \note This struct has public fields without getters/setters. All methods are inline.
+ */
+struct C2Rect {
+// public:
+ uint32_t width;
+ uint32_t height;
+ uint32_t left;
+ uint32_t top;
+
+ constexpr inline C2Rect()
+ : C2Rect(0, 0, 0, 0) { }
+
+ constexpr inline C2Rect(uint32_t width_, uint32_t height_)
+ : C2Rect(width_, height_, 0, 0) { }
+
+ constexpr C2Rect inline at(uint32_t left_, uint32_t top_) const {
+ return C2Rect(width, height, left_, top_);
+ }
+
+ // utility methods
+
+ inline constexpr bool isEmpty() const {
+ return width == 0 || height == 0;
+ }
+
+ inline constexpr bool isValid() const {
+ return left <= ~width && top <= ~height;
+ }
+
+ inline constexpr operator bool() const {
+ return isValid() && !isEmpty();
+ }
+
+ inline constexpr bool operator!() const {
+ return !bool(*this);
+ }
+
+ C2_ALLOW_OVERFLOW
+ inline constexpr bool contains(const C2Rect &other) const {
+ if (!isValid() || !other.isValid()) {
+ return false;
+ } else {
+ return left <= other.left && top <= other.top
+ && left + width >= other.left + other.width
+ && top + height >= other.top + other.height;
+ }
+ }
+
+ inline constexpr bool operator==(const C2Rect &other) const {
+ if (!isValid()) {
+ return !other.isValid();
+ } else {
+ return left == other.left && top == other.top
+ && width == other.width && height == other.height;
+ }
+ }
+
+ inline constexpr bool operator!=(const C2Rect &other) const {
+ return !operator==(other);
+ }
+
+ inline constexpr bool operator>=(const C2Rect &other) const {
+ return contains(other);
+ }
+
+ inline constexpr bool operator>(const C2Rect &other) const {
+ return contains(other) && !operator==(other);
+ }
+
+ inline constexpr bool operator<=(const C2Rect &other) const {
+ return other.contains(*this);
+ }
+
+ inline constexpr bool operator<(const C2Rect &other) const {
+ return other.contains(*this) && !operator==(other);
+ }
+
+ C2_ALLOW_OVERFLOW
+ inline constexpr uint32_t right() const {
+ return left + width;
+ }
+
+ C2_ALLOW_OVERFLOW
+ inline constexpr uint32_t bottom() const {
+ return top + height;
+ }
+
+ C2_ALLOW_OVERFLOW
+ inline constexpr C2Rect intersect(const C2Rect &other) const {
+ return C2Rect(c2_min(right(), other.right()) - c2_max(left, other.left),
+ c2_min(bottom(), other.bottom()) - c2_max(top, other.top),
+ c2_max(left, other.left),
+ c2_max(top, other.top));
+ }
+
+ /** clamps right and bottom to top, left if they overflow */
+ inline constexpr C2Rect normalize() const {
+ return C2Rect(c2_max(left, right()) - left, c2_max(top, bottom()) - top, left, top);
+ }
+
+private:
+ /// note: potentially unusual argument order
+ constexpr inline C2Rect(uint32_t width_, uint32_t height_, uint32_t left_, uint32_t top_)
+ : width(width_),
+ height(height_),
+ left(left_),
+ top(top_) { }
+};
+
+/**
+ * Interface for objects that have a width and height (planar capacity).
+ */
+class _C2PlanarCapacityAspect {
+/// \name Planar capacity interface
+/// @{
+public:
+ inline constexpr uint32_t width() const { return _mWidth; }
+ inline constexpr uint32_t height() const { return _mHeight; }
+
+ inline constexpr operator C2Rect() const {
+ return C2Rect(_mWidth, _mHeight);
+ }
+
+protected:
+ inline constexpr _C2PlanarCapacityAspect(uint32_t width, uint32_t height)
+ : _mWidth(width), _mHeight(height) { }
+
+ inline explicit constexpr _C2PlanarCapacityAspect(const _C2PlanarCapacityAspect *parent)
+ : _mWidth(parent == nullptr ? 0 : parent->width()),
+ _mHeight(parent == nullptr ? 0 : parent->height()) { }
+
+private:
+ uint32_t _mWidth;
+ uint32_t _mHeight;
+/// @}
+};
+
+/**
+ * C2PlaneInfo: information on the layout of a singe flexible plane.
+ *
+ * Public fields without getters/setters.
+ */
+struct C2PlaneInfo {
+//public:
+ enum channel_t : uint32_t {
+ CHANNEL_Y, ///< luma
+ CHANNEL_R, ///< red
+ CHANNEL_G, ///< green
+ CHANNEL_B, ///< blue
+ CHANNEL_A, ///< alpha
+ CHANNEL_CR, ///< Cr
+ CHANNEL_CB, ///< Cb
+ } channel;
+
+ int32_t colInc; ///< column increment in bytes. may be negative
+ int32_t rowInc; ///< row increment in bytes. may be negative
+
+ uint32_t colSampling; ///< subsampling compared to width (must be a power of 2)
+ uint32_t rowSampling; ///< subsampling compared to height (must be a power of 2)
+
+ uint32_t allocatedDepth; ///< size of each sample (must be a multiple of 8)
+ uint32_t bitDepth; ///< significant bits per sample
+ /**
+ * the right shift of the significant bits in the sample. E.g. if a 10-bit significant
+ * value is laid out in a 16-bit allocation aligned to LSB (values 0-1023), rightShift
+ * would be 0 as the 16-bit value read from the sample does not need to be right shifted
+ * and can be used as is (after applying a 10-bit mask of 0x3FF).
+ *
+ * +--------+--------+
+ * | VV|VVVVVVVV|
+ * +--------+--------+
+ * 15 8 7 0
+ *
+ * If the value is laid out aligned to MSB, rightShift would be 6, as the value read
+ * from the allocated sample must be right-shifted by 6 to get the actual sample value.
+ *
+ * +--------+--------+
+ * |VVVVVVVV|VV |
+ * +--------+--------+
+ * 15 8 7 0
+ */
+ uint32_t rightShift;
+
+ enum endianness_t : uint32_t {
+ NATIVE,
+ LITTLE_END, // LITTLE_ENDIAN is reserved macro
+ BIG_END, // BIG_ENDIAN is a reserved macro
+ } endianness; ///< endianness of the samples
+
+ /**
+ * The following two fields define the relation between multiple planes. If multiple planes are
+ * interleaved, they share a root plane (whichever plane's start address is the lowest), and
+ * |offset| is the offset of this plane inside the root plane (in bytes). |rootIx| is the index
+ * of the root plane. If a plane is independent, rootIx is its index and offset is 0.
+ */
+ uint32_t rootIx; ///< index of the root plane
+ uint32_t offset; ///< offset of this plane inside of the root plane
+
+ inline constexpr ssize_t minOffset(uint32_t width, uint32_t height) const {
+ ssize_t offs = 0;
+ if (width > 0 && colInc < 0) {
+ offs += colInc * (ssize_t)(width - 1);
+ }
+ if (height > 0 && rowInc < 0) {
+ offs += rowInc * (ssize_t)(height - 1);
+ }
+ return offs;
+ }
+
+ inline constexpr ssize_t maxOffset(uint32_t width, uint32_t height) const {
+ ssize_t offs = (allocatedDepth + 7) >> 3;
+ if (width > 0 && colInc > 0) {
+ offs += colInc * (ssize_t)(width - 1);
+ }
+ if (height > 0 && rowInc > 0) {
+ offs += rowInc * (ssize_t)(height - 1);
+ }
+ return offs;
+ }
+} C2_PACK;
+
+struct C2PlanarLayout {
+//public:
+ enum type_t : uint32_t {
+ TYPE_UNKNOWN = 0,
+ TYPE_YUV = 0x100, ///< YUV image with 3 planes
+ TYPE_YUVA, ///< YUVA image with 4 planes
+ TYPE_RGB, ///< RGB image with 3 planes
+ TYPE_RGBA, ///< RBGA image with 4 planes
+ };
+
+ type_t type; // image type
+ uint32_t numPlanes; // number of component planes
+ uint32_t rootPlanes; // number of layout planes (root planes)
+
+ enum plane_index_t : uint32_t {
+ PLANE_Y = 0,
+ PLANE_U = 1,
+ PLANE_V = 2,
+ PLANE_R = 0,
+ PLANE_G = 1,
+ PLANE_B = 2,
+ PLANE_A = 3,
+ MAX_NUM_PLANES = 4,
+ };
+
+ C2PlaneInfo planes[MAX_NUM_PLANES];
+};
+
+/**
+ * Aspect for objects that have a planar section (crop rectangle).
+ *
+ * This class is copiable.
+ */
+class _C2PlanarSectionAspect : public _C2PlanarCapacityAspect {
+/// \name Planar section interface
+/// @{
+private:
+ inline constexpr _C2PlanarSectionAspect(uint32_t width, uint32_t height, const C2Rect &crop)
+ : _C2PlanarCapacityAspect(width, height),
+ mCrop(C2Rect(std::min(width - std::min(crop.left, width), crop.width),
+ std::min(height - std::min(crop.top, height), crop.height)).at(
+ std::min(crop.left, width),
+ std::min(crop.height, height))) {
+ }
+
+public:
+ // crop can be an empty rect, does not have to line up with subsampling
+ // NOTE: we do not support floating-point crop
+ inline constexpr C2Rect crop() const { return mCrop; }
+
+ /**
+ * Returns a child planar section for |crop|, where the capacity represents this section.
+ */
+ inline constexpr _C2PlanarSectionAspect childSection(const C2Rect &crop) const {
+ return _C2PlanarSectionAspect(
+ mCrop.width, mCrop.height,
+ // crop and translate |crop| rect
+ C2Rect(c2_min(mCrop.right() - c2_clamp(mCrop.left, crop.left, mCrop.right()),
+ crop.width),
+ c2_min(mCrop.bottom() - c2_clamp(mCrop.top, crop.top, mCrop.bottom()),
+ crop.height))
+ .at(c2_clamp(mCrop.left, crop.left, mCrop.right()) - mCrop.left,
+ c2_clamp(mCrop.top, crop.top, mCrop.bottom()) - mCrop.top));
+ }
+
+protected:
+ inline constexpr _C2PlanarSectionAspect(const _C2PlanarCapacityAspect *parent)
+ : _C2PlanarCapacityAspect(parent), mCrop(width(), height()) {}
+
+ inline constexpr _C2PlanarSectionAspect(const _C2PlanarCapacityAspect *parent, const C2Rect &crop)
+ : _C2PlanarCapacityAspect(parent),
+ mCrop(parent == nullptr ? C2Rect() : ((C2Rect)*parent).intersect(crop).normalize()) { }
+
+ inline constexpr _C2PlanarSectionAspect(const _C2PlanarSectionAspect *parent, const C2Rect &crop)
+ : _C2PlanarCapacityAspect(parent),
+ mCrop(parent == nullptr ? C2Rect() : parent->crop().intersect(crop).normalize()) { }
+
+private:
+ friend class _C2EditablePlanarSectionAspect;
+ C2Rect mCrop;
+/// @}
+};
+
+/**
+ * Aspect for objects that have an editable planar section (crop rectangle).
+ *
+ * This class is copiable.
+ */
+class _C2EditablePlanarSectionAspect : public _C2PlanarSectionAspect {
+/// \name Planar section interface
+/// @{
+ using _C2PlanarSectionAspect::_C2PlanarSectionAspect;
+
+public:
+ // crop can be an empty rect, does not have to line up with subsampling
+ // NOTE: we do not support floating-point crop
+ inline constexpr C2Rect crop() const { return mCrop; }
+
+ /**
+ * Sets crop to crop intersected with [(0,0) .. (width, height)]
+ */
+ inline void setCrop_be(const C2Rect &crop) {
+ mCrop.left = std::min(width(), crop.left);
+ mCrop.top = std::min(height(), crop.top);
+ // It's guaranteed that mCrop.left <= width() && mCrop.top <= height()
+ mCrop.width = std::min(width() - mCrop.left, crop.width);
+ mCrop.height = std::min(height() - mCrop.top, crop.height);
+ }
+
+ /**
+ * If crop is within the dimensions of this object, it sets crop to it.
+ *
+ * \return true iff crop is within the dimensions of this object
+ */
+ inline bool setCrop(const C2Rect &crop) {
+ if (width() < crop.width || height() < crop.height
+ || width() - crop.width < crop.left || height() - crop.height < crop.top) {
+ return false;
+ }
+ mCrop = crop;
+ return true;
+ }
+/// @}
+};
+
+/**
+ * Utility class for safe range calculations using size_t-s.
+ */
+class C2PlanarSection : public _C2PlanarSectionAspect {
+public:
+ inline constexpr C2PlanarSection(const _C2PlanarCapacityAspect &parent, const C2Rect &crop)
+ : _C2PlanarSectionAspect(&parent, crop) { }
+
+ inline constexpr C2PlanarSection(const _C2PlanarSectionAspect &parent, const C2Rect &crop)
+ : _C2PlanarSectionAspect(&parent, crop) { }
+
+ inline constexpr C2PlanarSection intersect(const C2Rect &crop) const {
+ return C2PlanarSection(*this, crop);
+ }
+};
+
+/**
+ * Utility class for simple and safe planar capacity and section construction.
+ */
+class C2PlanarCapacity : public _C2PlanarCapacityAspect {
+public:
+ inline constexpr explicit C2PlanarCapacity(size_t width, size_t height)
+ : _C2PlanarCapacityAspect(c2_min(width, std::numeric_limits<uint32_t>::max()),
+ c2_min(height, std::numeric_limits<uint32_t>::max())) { }
+
+ inline constexpr C2PlanarSection section(const C2Rect &crop) const {
+ return C2PlanarSection(*this, crop);
+ }
+};
+
+
+/**
+ * \ingroup graphic allocator
+ * 2D allocation interface.
+ */
+class C2GraphicAllocation : public _C2PlanarCapacityAspect {
+public:
+ /**
+ * Maps a rectangular section (as defined by |rect|) of a 2D allocation into local process
+ * memory for flexible access. On success, it fills out |layout| with the plane specifications
+ * and fills the |addr| array with pointers to the first byte of the top-left pixel of each
+ * plane used. Otherwise, it leaves |layout| and |addr| untouched. |fence| will contain
+ * an acquire sync fence object. If it is already safe to access the
+ * buffer contents, then it will be an empty (already fired) fence.
+ *
+ * Safe regions for the pointer addresses returned can be gotten via C2LayoutInfo.minOffset()/
+ * maxOffset().
+ *
+ * \param rect section to be mapped (this does not have to be aligned)
+ * \param usage the desired usage. \todo this must be kSoftwareRead and/or
+ * kSoftwareWrite.
+ * \param fence a pointer to a fence object if an async mapping is requested. If
+ * not-null, and acquire fence will be stored here on success, or empty
+ * fence on failure. If null, the mapping will be synchronous.
+ * \param layout a pointer to where the mapped planes' descriptors will be
+ * stored. On failure, nullptr will be stored here.
+ * \param addr pointer to an array with at least C2PlanarLayout::MAX_NUM_PLANES
+ * elements. Only layout.numPlanes elements will be modified on success.
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_REFUSED no permission to map the section
+ * \retval C2_DUPLICATE there is already a mapped region and this allocation cannot support
+ * multi-mapping (caller error)
+ * \retval C2_TIMED_OUT the operation timed out
+ * \retval C2_NO_MEMORY not enough memory to complete the operation
+ * \retval C2_BAD_VALUE the parameters (rect) are invalid or outside the allocation, or the
+ * usage flags are invalid (caller error)
+ * \retval C2_CORRUPTED some unknown error prevented the operation from completing (unexpected)
+
+ */
+ virtual c2_status_t map(
+ C2Rect rect, C2MemoryUsage usage, C2Fence *fence,
+ C2PlanarLayout *layout /* nonnull */, uint8_t **addr /* nonnull */) = 0;
+
+ /**
+ * Unmaps a section of an allocation at |addr| with |rect|. These must be parameters previously
+ * passed to and returned by |map|; otherwise, this operation is a no-op.
+ *
+ * \param addr pointer to an array with at least C2PlanarLayout::MAX_NUM_PLANES
+ * elements containing the starting addresses of the mapped layers
+ * \param rect boundaries of the mapped section
+ * \param fence a pointer to a fence object if an async unmapping is requested. If
+ * not-null, a release fence will be stored here on success, or empty fence
+ * on failure. This fence signals when the original allocation contains
+ * all changes that happened to the mapped section. If null, the unmapping
+ * will be synchronous.
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_TIMED_OUT the operation timed out
+ * \retval C2_NOT_FOUND there is no such mapped region (caller error)
+ * \retval C2_CORRUPTED some unknown error prevented the operation from completing (unexpected)
+ * \retval C2_REFUSED no permission to unmap the section (unexpected - system)
+ */
+ virtual c2_status_t unmap(
+ uint8_t **addr /* nonnull */, C2Rect rect, C2Fence *fence /* nullable */) = 0;
+
+ /**
+ * Returns the allocator ID for this allocation. This is useful to put the handle into context.
+ */
+ virtual C2Allocator::id_t getAllocatorId() const = 0;
+
+ /**
+ * Returns a pointer to the allocation handle.
+ */
+ virtual const C2Handle *handle() const = 0;
+
+ /**
+ * Returns true if this is the same allocation as |other|.
+ */
+ virtual bool equals(const std::shared_ptr<const C2GraphicAllocation> &other) const = 0;
+
+protected:
+ using _C2PlanarCapacityAspect::_C2PlanarCapacityAspect;
+ virtual ~C2GraphicAllocation() = default;
+};
+
+class C2GraphicAllocation;
+
+/**
+ * A 2D block.
+ *
+ * \note width()/height() is not meaningful for users of blocks; instead, crop().width() and
+ * crop().height() is the capacity of the usable portion. Use and crop() if accessing the block
+ * directly through its handle to represent the allotted region of the underlying allocation to this
+ * block.
+ */
+class C2Block2D : public _C2PlanarSectionAspect {
+public:
+ /**
+ * Returns the underlying handle for this allocation.
+ *
+ * \note that the block and its block pool has shared ownership of the handle
+ * and if all references to the block are released, the underlying block
+ * allocation may get reused even if a client keeps a clone of this handle.
+ */
+ const C2Handle *handle() const;
+
+ /**
+ * Returns the allocator's ID that created the underlying allocation for this block. This
+ * provides the context for understanding the handle.
+ */
+ C2Allocator::id_t getAllocatorId() const;
+
+protected:
+ class Impl;
+ C2Block2D(std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion);
+
+ friend struct _C2BlockFactory;
+ std::shared_ptr<Impl> mImpl;
+};
+
+/**
+ * Graphic view provides read or read-write access for a graphic block.
+ *
+ * This class is copiable.
+ *
+ * \note Due to the subsampling of graphic buffers, a read view must still contain a crop rectangle
+ * to ensure subsampling is followed. This results in nearly identical interface between read and
+ * write views, so C2GraphicView can encompass both of them.
+ */
+class C2GraphicView : public _C2EditablePlanarSectionAspect {
+public:
+ /**
+ * \return array of pointers (of layout().numPlanes elements) to the start of the planes or
+ * nullptr on error. Regardless of crop rect, they always point to the top-left corner of each
+ * plane. Access outside of the crop rect results in an undefined behavior.
+ */
+ const uint8_t *const *data() const;
+
+ /**
+ * \return array of pointers (of layout().numPlanes elements) to the start of the planes or
+ * nullptr on error. Regardless of crop rect, they always point to the top-left corner of each
+ * plane. Access outside of the crop rect results in an undefined behavior.
+ */
+ uint8_t *const *data();
+
+ /**
+ * \return layout of the graphic block to interpret the returned data.
+ */
+ const C2PlanarLayout layout() const;
+
+ /**
+ * Returns a section of this view.
+ *
+ * \param rect the dimension of the section. \note This is clamped to the crop of this view.
+ *
+ * \return a read view containing the requested section of this view
+ */
+ const C2GraphicView subView(const C2Rect &rect) const;
+ C2GraphicView subView(const C2Rect &rect);
+
+ /**
+ * \return error during the creation/mapping of this view.
+ */
+ c2_status_t error() const;
+
+protected:
+ class Impl;
+ C2GraphicView(std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion);
+ explicit C2GraphicView(c2_status_t error);
+
+private:
+ friend struct _C2BlockFactory;
+ std::shared_ptr<Impl> mImpl;
+};
+
+/**
+ * A constant (read-only) graphic block (portion of an allocation) with an acquire fence.
+ * Blocks are unmapped when created, and can be mapped into a read view on demand.
+ *
+ * This class is copiable and contains a reference to the allocation that it is based on.
+ */
+class C2ConstGraphicBlock : public C2Block2D {
+public:
+ /**
+ * Maps this block into memory and returns a read view for it.
+ *
+ * \return a read view for this block.
+ */
+ C2Acquirable<const C2GraphicView> map() const;
+
+ /**
+ * Returns a section of this block.
+ *
+ * \param rect the coordinates of the section. \note This is clamped to the crop rectangle of
+ * this block.
+ *
+ * \return a constant graphic block containing a portion of this block
+ */
+ C2ConstGraphicBlock subBlock(const C2Rect &rect) const;
+
+ /**
+ * Returns the acquire fence for this block.
+ *
+ * \return a fence that must be waited on before reading the block.
+ */
+ C2Fence fence() const { return mFence; }
+
+protected:
+ C2ConstGraphicBlock(
+ std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion, C2Fence fence);
+
+private:
+ friend struct _C2BlockFactory;
+ C2Fence mFence;
+};
+
+/**
+ * Graphic block is a writeable 2D block. Once written, it can be shared in whole or in part with
+ * consumers/readers as read-only const graphic block.
+ */
+class C2GraphicBlock : public C2Block2D {
+public:
+ /**
+ * Maps this block into memory and returns a write view for it.
+ *
+ * \return a write view for this block.
+ */
+ C2Acquirable<C2GraphicView> map();
+
+ /**
+ * Creates a read-only const linear block for a portion of this block; optionally protected
+ * by an acquire fence. There are two ways to use this:
+ *
+ * 1) share ready block after writing data into the block. In this case no fence shall be
+ * supplied, and the block shall not be modified after calling this method.
+ * 2) share block metadata before actually (finishing) writing the data into the block. In
+ * this case a fence must be supplied that will be triggered when the data is written.
+ * The block shall be modified only until firing the event for the fence.
+ */
+ C2ConstGraphicBlock share(const C2Rect &crop, C2Fence fence);
+
+protected:
+ C2GraphicBlock(std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion);
+
+ friend struct _C2BlockFactory;
+};
+
+/// @}
+
+/// \defgroup buffer_onj Buffer objects
+/// @{
+
+// ================================================================================================
+// BUFFERS
+// ================================================================================================
+
+/// \todo: Do we still need this?
+///
+// There are 2 kinds of buffers: linear or graphic. Linear buffers can contain a single block, or
+// a list of blocks (LINEAR_CHUNKS). Support for list of blocks is optional, and can allow consuming
+// data from circular buffers or scattered data sources without extra memcpy. Currently, list of
+// graphic blocks is not supported.
+
+class C2LinearBuffer; // read-write buffer
+class C2GraphicBuffer; // read-write buffer
+class C2LinearChunksBuffer;
+
+/**
+ * C2BufferData: the main, non-meta data of a buffer. A buffer can contain either linear blocks
+ * or graphic blocks, and can contain either a single block or multiple blocks. This is determined
+ * by its type.
+ */
+class C2BufferData {
+public:
+ /**
+ * The type of buffer data.
+ */
+ enum type_t : uint32_t {
+ INVALID, ///< invalid buffer type. Do not use.
+ LINEAR, ///< the buffer contains a single linear block
+ LINEAR_CHUNKS, ///< the buffer contains one or more linear blocks
+ GRAPHIC, ///< the buffer contains a single graphic block
+ GRAPHIC_CHUNKS, ///< the buffer contains one of more graphic blocks
+ };
+ typedef type_t Type; // deprecated
+
+ /**
+ * Gets the type of this buffer (data).
+ * \return the type of this buffer data.
+ */
+ type_t type() const;
+
+ /**
+ * Gets the linear blocks of this buffer.
+ * \return a constant list of const linear blocks of this buffer.
+ * \retval empty list if this buffer does not contain linear block(s).
+ */
+ const std::vector<C2ConstLinearBlock> linearBlocks() const;
+
+ /**
+ * Gets the graphic blocks of this buffer.
+ * \return a constant list of const graphic blocks of this buffer.
+ * \retval empty list if this buffer does not contain graphic block(s).
+ */
+ const std::vector<C2ConstGraphicBlock> graphicBlocks() const;
+
+private:
+ class Impl;
+ std::shared_ptr<Impl> mImpl;
+
+protected:
+ // no public constructor
+ explicit C2BufferData(const std::vector<C2ConstLinearBlock> &blocks);
+ explicit C2BufferData(const std::vector<C2ConstGraphicBlock> &blocks);
+};
+
+/**
+ * C2Buffer: buffer base class. These are always used as shared_ptrs. Though the underlying buffer
+ * objects (native buffers, ion buffers, or dmabufs) are reference-counted by the system,
+ * C2Buffers hold only a single reference.
+ *
+ * These objects cannot be used on the stack.
+ */
+class C2Buffer {
+public:
+ /**
+ * Gets the buffer's data.
+ *
+ * \return the buffer's data.
+ */
+ const C2BufferData data() const;
+
+ /**
+ * These will still work if used in onDeathNotify.
+ */
+#if 0
+ inline std::shared_ptr<C2LinearBuffer> asLinearBuffer() const {
+ return mType == LINEAR ? std::shared_ptr::reinterpret_cast<C2LinearBuffer>(this) : nullptr;
+ }
+
+ inline std::shared_ptr<C2GraphicBuffer> asGraphicBuffer() const {
+ return mType == GRAPHIC ? std::shared_ptr::reinterpret_cast<C2GraphicBuffer>(this) : nullptr;
+ }
+
+ inline std::shared_ptr<C2CircularBuffer> asCircularBuffer() const {
+ return mType == CIRCULAR ? std::shared_ptr::reinterpret_cast<C2CircularBuffer>(this) : nullptr;
+ }
+#endif
+
+ ///@name Pre-destroy notification handling
+ ///@{
+
+ /**
+ * Register for notification just prior to the destruction of this object.
+ */
+ typedef void (*OnDestroyNotify) (const C2Buffer *buf, void *arg);
+
+ /**
+ * Registers for a pre-destroy notification. This is called just prior to the destruction of
+ * this buffer (when this buffer is no longer valid.)
+ *
+ * \param onDestroyNotify the notification callback
+ * \param arg an arbitrary parameter passed to the callback
+ *
+ * \retval C2_OK the registration was successful.
+ * \retval C2_DUPLICATE a notification was already registered for this callback and argument
+ * \retval C2_NO_MEMORY not enough memory to register for this callback
+ * \retval C2_CORRUPTED an unknown error prevented the registration (unexpected)
+ */
+ c2_status_t registerOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg = nullptr);
+
+ /**
+ * Unregisters a previously registered pre-destroy notification.
+ *
+ * \param onDestroyNotify the notification callback
+ * \param arg an arbitrary parameter passed to the callback
+ *
+ * \retval C2_OK the unregistration was successful.
+ * \retval C2_NOT_FOUND the notification was not found
+ * \retval C2_CORRUPTED an unknown error prevented the registration (unexpected)
+ */
+ c2_status_t unregisterOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg = nullptr);
+
+ ///@}
+
+ virtual ~C2Buffer() = default;
+
+ ///@name Buffer-specific arbitrary metadata handling
+ ///@{
+
+ /**
+ * Gets the list of metadata associated with this buffer.
+ *
+ * \return a constant list of info objects associated with this buffer.
+ */
+ const std::vector<std::shared_ptr<const C2Info>> info() const;
+
+ /**
+ * Attaches (or updates) an (existing) metadata for this buffer.
+ * If the metadata is stream specific, the stream information will be reset.
+ *
+ * \param info Metadata to update
+ *
+ * \retval C2_OK the metadata was successfully attached/updated.
+ * \retval C2_NO_MEMORY not enough memory to attach the metadata (this return value is not
+ * used if the same kind of metadata is already attached to the buffer).
+ */
+ c2_status_t setInfo(const std::shared_ptr<C2Info> &info);
+
+ /**
+ * Checks if there is a certain type of metadata attached to this buffer.
+ *
+ * \param index the parameter type of the metadata
+ *
+ * \return true iff there is a metadata with the parameter type attached to this buffer.
+ */
+ bool hasInfo(C2Param::Type index) const;
+
+ /**
+ * Checks if there is a certain type of metadata attached to this buffer, and returns a
+ * shared pointer to it if there is. Returns an empty shared pointer object (nullptr) if there
+ * is not.
+ *
+ * \param index the parameter type of the metadata
+ *
+ * \return shared pointer to the metadata.
+ */
+ std::shared_ptr<const C2Info> getInfo(C2Param::Type index) const;
+
+ /**
+ * Removes a metadata from the buffer.
+ */
+ std::shared_ptr<C2Info> removeInfo(C2Param::Type index);
+ ///@}
+
+ /**
+ * Creates a buffer containing a single linear block.
+ *
+ * \param block the content of the buffer.
+ *
+ * \return shared pointer to the created buffer.
+ */
+ static std::shared_ptr<C2Buffer> CreateLinearBuffer(const C2ConstLinearBlock &block);
+
+ /**
+ * Creates a buffer containing a single graphic block.
+ *
+ * \param block the content of the buffer.
+ *
+ * \return shared pointer to the created buffer.
+ */
+ static std::shared_ptr<C2Buffer> CreateGraphicBuffer(const C2ConstGraphicBlock &block);
+
+
+
+protected:
+ // no public constructor
+ explicit C2Buffer(const std::vector<C2ConstLinearBlock> &blocks);
+ explicit C2Buffer(const std::vector<C2ConstGraphicBlock> &blocks);
+
+private:
+ class Impl;
+ std::shared_ptr<Impl> mImpl;
+// Type _mType;
+};
+
+/**
+ * An extension of C2Info objects that can contain arbitrary buffer data.
+ *
+ * \note This object is not describable and contains opaque data.
+ */
+class C2InfoBuffer {
+public:
+ /**
+ * Gets the index of this info object.
+ *
+ * \return the parameter index.
+ */
+ const C2Param::Index index() const;
+
+ /**
+ * Gets the buffer's data.
+ *
+ * \return the buffer's data.
+ */
+ const C2BufferData data() const;
+};
+
+/// @}
+
+/// \cond INTERNAL
+
+/// \todo These are no longer used
+
+/// \addtogroup linear
+/// @{
+
+/** \deprecated */
+class C2LinearBuffer
+ : public C2Buffer, public _C2LinearRangeAspect,
+ public std::enable_shared_from_this<C2LinearBuffer> {
+public:
+ /** \todo what is this? */
+ const C2Handle *handle() const;
+
+protected:
+ inline C2LinearBuffer(const C2ConstLinearBlock &block);
+
+private:
+ class Impl;
+ Impl *mImpl;
+};
+
+class C2ReadCursor;
+
+class C2WriteCursor {
+public:
+ uint32_t remaining() const; // remaining data to be read
+ void commit(); // commits the current position. discard data before current position
+ void reset() const; // resets position to the last committed position
+ // slices off at most |size| bytes, and moves cursor ahead by the number of bytes
+ // sliced off.
+ C2ReadCursor slice(uint32_t size) const;
+ // slices off at most |size| bytes, and moves cursor ahead by the number of bytes
+ // sliced off.
+ C2WriteCursor reserve(uint32_t size);
+ // bool read(T&);
+ // bool write(T&);
+ C2Fence waitForSpace(uint32_t size);
+};
+
+/// @}
+
+/// \addtogroup graphic
+/// @{
+
+struct C2ColorSpace {
+//public:
+ enum Standard {
+ BT601,
+ BT709,
+ BT2020,
+ // TODO
+ };
+
+ enum Range {
+ LIMITED,
+ FULL,
+ // TODO
+ };
+
+ enum TransferFunction {
+ BT709Transfer,
+ BT2020Transfer,
+ HybridLogGamma2,
+ HybridLogGamma4,
+ // TODO
+ };
+};
+
+/** \deprecated */
+class C2GraphicBuffer : public C2Buffer {
+public:
+ // constant attributes
+ inline uint32_t width() const { return mWidth; }
+ inline uint32_t height() const { return mHeight; }
+ inline uint32_t format() const { return mFormat; }
+ inline const C2MemoryUsage usage() const { return mUsage; }
+
+ // modifiable attributes
+
+
+ virtual const C2ColorSpace colorSpace() const = 0;
+ // best effort
+ virtual void setColorSpace_be(const C2ColorSpace &colorSpace) = 0;
+ virtual bool setColorSpace(const C2ColorSpace &colorSpace) = 0;
+
+ const C2Handle *handle() const;
+
+protected:
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint32_t mFormat;
+ C2MemoryUsage mUsage;
+
+ class Impl;
+ Impl *mImpl;
+};
+
+/// @}
+
+/// \endcond
+
+/// @}
+
+#endif // C2BUFFER_H_
diff --git a/media/codec2/core/include/C2BufferBase.h b/media/codec2/core/include/C2BufferBase.h
new file mode 100644
index 0000000..2bd48f0
--- /dev/null
+++ b/media/codec2/core/include/C2BufferBase.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2BUFFER_BASE_H_
+#define C2BUFFER_BASE_H_
+
+/// \defgroup allocator Allocation and memory placement
+/// @{
+
+/**
+ * Buffer/memory usage bits. These shall be used by the allocators to select optimal memory type/
+ * pool and buffer layout. Usage bits are conceptually separated into read and write usage, while
+ * the buffer use life-cycle is separated into producers (writers) and consumers (readers).
+ * These two concepts are related but not equivalent: consumers may only read buffers and only
+ * producers may write to buffers; note, however, that buffer producers may also want or need to
+ * read the buffers.
+ *
+ * Read and write buffer usage bits shall be or-ed to arrive at the full buffer usage. Admittedly,
+ * this does not account for the amount of reading and writing (e.g. a buffer may have one or more
+ * readers); however, the proper information necessary to properly weigh the various usages would be
+ * the amount of data read/written for each usage type. This would result in an integer array of
+ * size 64 (or the number of distinct usages) for memory usage, and likely such detailed information
+ * would not always be available.
+ *
+ * That platform-agnostic Codec 2.0 API only defines the bare minimum usages. Platforms shall define
+ * usage bits that are appropriate for the platform.
+ */
+struct C2MemoryUsage {
+// public:
+ /**
+ * Buffer read usage.
+ */
+ enum read_t : uint64_t {
+ /** Buffer is read by the CPU. */
+ CPU_READ = 1 << 0,
+ /**
+ * Buffer shall only be read by trusted hardware. The definition of trusted hardware is
+ * platform specific, but this flag is reserved to prevent mapping this block into CPU
+ * readable memory resulting in bus fault. This flag can be used when buffer access must be
+ * protected.
+ */
+ READ_PROTECTED = 1 << 1,
+ };
+
+ /**
+ * Buffer write usage.
+ */
+ enum write_t : uint64_t {
+ /** Buffer is writted to by the CPU. */
+ CPU_WRITE = 1 << 2,
+ /**
+ * Buffer shall only be written to by trusted hardware. The definition of trusted hardware
+ * is platform specific, but this flag is reserved to prevent mapping this block into CPU
+ * writable memory resulting in bus fault. This flag can be used when buffer integrity must
+ * be protected.
+ */
+ WRITE_PROTECTED = 1 << 3,
+ };
+
+ enum : uint64_t {
+ /**
+ * Buffer usage bits reserved for the platform. We don't separately reserve read and
+ * write usages as platforms may have asymmetric distribution between them.
+ */
+ PLATFORM_MASK = ~(CPU_READ | CPU_WRITE | READ_PROTECTED | WRITE_PROTECTED),
+ };
+
+ /** Create a usage from separate consumer and producer usage mask. \deprecated */
+ inline C2MemoryUsage(uint64_t consumer, uint64_t producer)
+ : expected(consumer | producer) { }
+
+ inline explicit C2MemoryUsage(uint64_t expected_)
+ : expected(expected_) { }
+
+ uint64_t expected; // expected buffer usage
+};
+
+/// @}
+
+#endif // C2BUFFER_BASE_H_
+
diff --git a/media/codec2/core/include/C2Component.h b/media/codec2/core/include/C2Component.h
new file mode 100644
index 0000000..8810725
--- /dev/null
+++ b/media/codec2/core/include/C2Component.h
@@ -0,0 +1,975 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2COMPONENT_H_
+
+#define C2COMPONENT_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <list>
+#include <memory>
+#include <vector>
+#include <functional>
+
+#include <C2Enum.h>
+#include <C2Param.h>
+#include <C2Work.h>
+
+/// \defgroup components Components
+/// @{
+
+struct C2FieldSupportedValuesQuery {
+ enum type_t : uint32_t {
+ POSSIBLE, ///< query all possible values regardless of other settings
+ CURRENT, ///< query currently possible values given dependent settings
+ };
+
+private:
+ C2ParamField _mField;
+ type_t _mType;
+public:
+ c2_status_t status;
+ C2FieldSupportedValues values;
+
+ C2FieldSupportedValuesQuery(const C2ParamField &field_, type_t type_)
+ : _mField(field_), _mType(type_), status(C2_NO_INIT) { }
+
+ static C2FieldSupportedValuesQuery
+ Current(const C2ParamField &field_) {
+ return C2FieldSupportedValuesQuery(field_, CURRENT);
+ }
+
+ static C2FieldSupportedValuesQuery
+ Possible(const C2ParamField &field_) {
+ return C2FieldSupportedValuesQuery(field_, POSSIBLE);
+ }
+
+ inline C2ParamField field() const { return _mField; };
+
+ inline type_t type() const { return _mType; }
+};
+
+/**
+ * Component interface object. This object contains all of the configuration of a potential or
+ * actual component. It can be created and used independently of an actual C2Component instance to
+ * query support and parameters for various component settings and configurations for a potential
+ * component. Actual components also expose this interface.
+ */
+
+class C2ComponentInterface {
+public:
+ // ALWAYS AVAILABLE METHODS
+ // =============================================================================================
+
+ /**
+ * Returns the name of this component or component interface object.
+ * This is a unique name for this component or component interface 'class'; however, multiple
+ * instances of this component SHALL have the same name.
+ *
+ * When attached to a component, this method MUST be supported in any component state.
+ * This call does not change the state nor the internal configuration of the component.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return the name of this component or component interface object.
+ * \retval an empty string if there was not enough memory to allocate the actual name.
+ */
+ virtual C2String getName() const = 0;
+
+ /**
+ * Returns a unique ID for this component or interface object.
+ * This ID is used as work targets, unique work IDs, and when configuring tunneling.
+ *
+ * When attached to a component, this method MUST be supported in any component state.
+ * This call does not change the state nor the internal configuration of the component.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return a unique node ID for this component or component interface instance.
+ */
+ virtual c2_node_id_t getId() const = 0;
+
+ /**
+ * Queries a set of parameters from the component or interface object.
+ * Querying is performed at best effort: the component SHALL query all supported parameters and
+ * skip unsupported ones, heap allocated parameters that could not be allocated or parameters
+ * that could not be queried without blocking. Any errors are communicated in the return value.
+ * Additionally, preallocated (e.g. stack) parameters that could not be queried are invalidated.
+ * Invalid or blocking parameters to be allocated on the heap are omitted from the result.
+ *
+ * \note Parameter values do not depend on the order of query.
+ *
+ * \todo This method cannot be used to query info-buffers. Is that a problem?
+ *
+ * When attached to a component, this method MUST be supported in any component state except
+ * released.
+ * This call does not change the state nor the internal configuration of the component.
+ *
+ * This method has a variable blocking behavior based on state.
+ * In the stopped state this method MUST be "non-blocking" and return within 1ms.
+ * In the running states this method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * \param[in,out] stackParams a list of params queried. These are initialized specific to each
+ * setting; e.g. size and index are set and rest of the members are
+ * cleared.
+ * \note Flexible settings that are of incorrect size will be
+ * invalidated.
+ * \param[in] heapParamIndices a vector of param indices for params to be queried and returned
+ * on the heap. These parameters will be returned in heapParams.
+ * Unsupported param indices will be ignored.
+ * \param[in] mayBlock if true (C2_MAY_BLOCK), implementation may momentarily block.
+ * Otherwise (C2_DONT_BLOCK), it must be "non-blocking".
+ * \param[out] heapParams a list of params where to which the supported heap parameters
+ * will be appended in the order they appear in heapParamIndices.
+ *
+ * \retval C2_OK all parameters could be queried
+ * \retval C2_BAD_INDEX all supported parameters could be queried, but some parameters were not
+ * supported
+ * \retval C2_BAD_STATE when called in the released component state (user error)
+ * (this error code is only allowed for interfaces connected to components)
+ * \retval C2_NO_MEMORY could not allocate memory for a supported parameter
+ * \retval C2_BLOCKING the operation must block to complete but mayBlock is false
+ * (this error code is only allowed for interfaces connected to components)
+ * \retval C2_TIMED_OUT could not query the parameters within the time limit (unexpected)
+ * (this error code is only allowed for interfaces connected to components
+ * in the running state)
+ * \retval C2_CORRUPTED some unknown error prevented the querying of the parameters
+ * (unexpected)
+ * (this error code is only allowed for interfaces connected to components)
+ */
+ virtual c2_status_t query_vb(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const = 0;
+
+ /**
+ * Sets a set of parameters for the component or interface object.
+ *
+ * Tuning is performed at best effort: the component SHALL process the configuration updates in
+ * the order they appear in |params|. If any parameter update fails, the component shall
+ * communicate the failure in the return value and in |failures|, and still process the
+ * remaining parameters. Unsupported parameters are skipped, though they are communicated in
+ * ther return value. Most parameters are updated at best effort - such that even if client
+ * specifies an unsupported value for a field, the closest supported value is used. On the
+ * other hand, strict parameters only accept specific values for their fields, and if the client
+ * specifies an unsupported value, the parameter setting shall fail for that field.
+ * If the client tries to change the value of a field that requires momentary blocking without
+ * setting |mayBlock| to C2_MAY_BLOCK, that parameter shall also be skipped and a specific
+ * return value shall be used. Final values for all parameters set are propagated back to the
+ * caller in |params|.
+ *
+ * \note Parameter tuning DOES depend on the order of the tuning parameters. E.g. some parameter
+ * update may allow some subsequent values for further parameter updates.
+ *
+ * When attached to a component, this method MUST be supported in any component state except
+ * released.
+ *
+ * This method has a variable blocking behavior based on state.
+ * In the stopped state this method MUST be "non-blocking" and return within 1ms.
+ * In the running states this method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * \param[in,out] params a list of parameter updates. These will be updated to the actual
+ * parameter values after the updates (this is because tuning is performed
+ * at best effort).
+ * \todo params that could not be updated are not marked here, so are
+ * confusing - are they "existing" values or intended to be configured
+ * values?
+ * \param[in] mayBlock if true (C2_MAY_BLOCK), implementation may momentarily block.
+ * Otherwise (C2_DONT_BLOCK), it must be "non-blocking".
+ * \param[out] failures a list of parameter failures and optional guidance
+ *
+ * \retval C2_OK all parameters could be updated successfully
+ * \retval C2_BAD_INDEX all supported parameters could be updated successfully, but some
+ * parameters were not supported
+ * \retval C2_BAD_VALUE some supported parameters could not be updated successfully because
+ * they contained unsupported values. These are returned in |failures|.
+ * \retval C2_BAD_STATE when called in the released component state (user error)
+ * (this error code is only allowed for interfaces connected to components)
+ * \retval C2_NO_MEMORY some supported parameters could not be updated successfully because
+ * they contained unsupported values, but could not allocate a failure
+ * object for them.
+ * \retval C2_TIMED_OUT could not set the parameters within the time limit (unexpected)
+ * (this error code is only allowed for interfaces connected to components
+ * in the running state)
+ * \retval C2_BLOCKING the operation must block to complete but mayBlock is false
+ * (this error code is only allowed for interfaces connected to components)
+ * \retval C2_CORRUPTED some unknown error prevented the update of the parameters
+ * (unexpected)
+ * (this error code is only allowed for interfaces connected to components)
+ */
+ virtual c2_status_t config_vb(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) = 0;
+
+ // TUNNELING
+ // =============================================================================================
+
+ /**
+ * Creates a tunnel from this component to the target component.
+ *
+ * If the component is successfully created, subsequent work items queued may include a
+ * tunneled path between these components.
+ *
+ * When attached to a component, this method MUST be supported in any component state except
+ * released.
+ *
+ * This method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * \retval C2_OK the tunnel was successfully created
+ * \retval C2_BAD_INDEX the target component does not exist
+ * \retval C2_DUPLICATE the tunnel already exists
+ * \retval C2_OMITTED tunneling is not supported by this component
+ * \retval C2_CANNOT_DO the specific tunnel is not supported
+ * \retval C2_BAD_STATE when called in the released component state (user error)
+ * (this error code is only allowed for interfaces connected to components)
+ *
+ * \retval C2_TIMED_OUT could not create the tunnel within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the creation of the tunnel (unexpected)
+ * (this error code is only allowed for interfaces connected to components)
+ */
+ virtual c2_status_t createTunnel_sm(c2_node_id_t targetComponent) = 0;
+
+ /**
+ * Releases a tunnel from this component to the target component.
+ *
+ * The release of a tunnel is delayed while there are pending work items for the tunnel.
+ * After releasing a tunnel, subsequent work items queued MUST NOT include a tunneled
+ * path between these components.
+ *
+ * When attached to a component, this method MUST be supported in any component state except
+ * released.
+ *
+ * This method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * \retval C2_OK the tunnel was marked for release successfully
+ * \retval C2_BAD_INDEX the target component does not exist
+ * \retval C2_NOT_FOUND the tunnel does not exist
+ * \retval C2_OMITTED tunneling is not supported by this component
+ * \retval C2_BAD_STATE when called in the released component state (user error)
+ * (this error code is only allowed for interfaces connected to components)
+ *
+ * \retval C2_TIMED_OUT could not mark the tunnel for release within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the release of the tunnel (unexpected)
+ * (this error code is only allowed for interfaces connected to components)
+ */
+ virtual c2_status_t releaseTunnel_sm(c2_node_id_t targetComponent) = 0;
+
+ // REFLECTION MECHANISM (USED FOR EXTENSION)
+ // =============================================================================================
+
+ /**
+ * Returns the set of supported parameters.
+ *
+ * When attached to a component, this method MUST be supported in any component state except
+ * released.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \param[out] params a vector of supported parameters will be appended to this vector.
+ *
+ * \retval C2_OK the operation completed successfully.
+ * \retval C2_BAD_STATE when called in the released component state (user error)
+ * (this error code is only allowed for interfaces connected to components)
+ * \retval C2_NO_MEMORY not enough memory to complete this method.
+ */
+ virtual c2_status_t querySupportedParams_nb(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) const = 0;
+
+ /**
+ * Retrieves the supported values for the queried fields.
+ *
+ * Client SHALL set the parameter-field specifier and the type of supported values query (e.g.
+ * currently supported values, or potential supported values) in fields.
+ * Upon return the component SHALL fill in the supported values for the fields listed as well
+ * as a status for each field. Component shall process all fields queried even if some queries
+ * fail.
+ *
+ * When attached to a component, this method MUST be supported in any component state except
+ * released.
+ *
+ * This method has a variable blocking behavior based on state.
+ * In the stopped state this method MUST be "non-blocking" and return within 1ms.
+ * In the running states this method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * \param[in out] fields a vector of fields descriptor structures.
+ * \param[in] mayBlock if true (C2_MAY_BLOCK), implementation may momentarily block.
+ * Otherwise (C2_DONT_BLOCK), it must be "non-blocking".
+ *
+ * \retval C2_OK the operation completed successfully.
+ * \retval C2_BAD_STATE when called in the released component state (user error)
+ * (this error code is only allowed for interfaces connected to components)
+ * \retval C2_BAD_INDEX at least one field was not recognized as a component field
+ * \retval C2_TIMED_OUT could not query supported values within the time limit (unexpected)
+ * (this error code is only allowed for interfaces connected to components
+ * in the running state)
+ * \retval C2_BLOCKING the operation must block to complete but mayBlock is false
+ * (this error code is only allowed for interfaces connected to components)
+ * \retval C2_CORRUPTED some unknown error prevented the operation from completing (unexpected)
+ * (this error code is only allowed for interfaces connected to components)
+ */
+ virtual c2_status_t querySupportedValues_vb(
+ std::vector<C2FieldSupportedValuesQuery> &fields, c2_blocking_t mayBlock) const = 0;
+
+ virtual ~C2ComponentInterface() = default;
+};
+
+class C2Component {
+public:
+ class Listener {
+ public:
+ virtual void onWorkDone_nb(std::weak_ptr<C2Component> component,
+ std::list<std::unique_ptr<C2Work>> workItems) = 0;
+
+ virtual void onTripped_nb(std::weak_ptr<C2Component> component,
+ std::vector<std::shared_ptr<C2SettingResult>> settingResult) = 0;
+
+ virtual void onError_nb(std::weak_ptr<C2Component> component,
+ uint32_t errorCode) = 0;
+
+ // virtual void onTunnelReleased(<from>, <to>) = 0;
+
+ // virtual void onComponentReleased(<id>) = 0;
+
+ virtual ~Listener() = default;
+ };
+
+ /**
+ * Sets the listener for this component
+ *
+ * This method MUST be supported in all states except released.
+ * The listener can only be set to non-null value in stopped state (that does not include
+ * tripped or error). It can be set to nullptr in both stopped and running states.
+ * Components only use the listener in running state.
+ *
+ * If listener is nullptr, the component SHALL guarantee that no more listener callbacks are
+ * done to the original listener once this method returns. (Any pending listener callbacks will
+ * need to be completed during this call - hence this call may be temporarily blocking.)
+ *
+ * This method has a variable blocking behavior based on state.
+ * In the stopped state this method MUST be "non-blocking" and return within 1ms.
+ * In the running states this method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * Component SHALL handle listener notifications from the same thread (the thread used is
+ * at the component's discretion.)
+ *
+ * \note This could also be accomplished by passing a weak_ptr to a component-specific listener
+ * here and requiring the client to always promote the weak_ptr before any callback. This would
+ * put the burden on the client to clear the listener - wait for its deletion - at which point
+ * it is guaranteed that no more listener callbacks will occur.
+ *
+ * \param[in] listener the component listener object
+ * \param[in] mayBlock if true (C2_MAY_BLOCK), implementation may momentarily block.
+ * Otherwise (C2_DONT_BLOCK), it must be "non-blocking".
+ *
+ * \retval C2_BAD_STATE attempting to change the listener in the running state to a non-null
+ * value (user error), or called in the released state
+ * \retval C2_BLOCKING the operation must block to complete but mayBlock is false
+ * \retval C2_OK listener was updated successfully.
+ */
+ virtual c2_status_t setListener_vb(
+ const std::shared_ptr<Listener> &listener, c2_blocking_t mayBlock) = 0;
+
+ /// component domain (e.g. audio or video)
+ enum domain_t : uint32_t;
+
+ /// component kind (e.g. encoder, decoder or filter)
+ enum kind_t : uint32_t;
+
+ /// component rank. This number is used to determine component ordering (the lower the sooner)
+ /// in the component list.
+ typedef uint32_t rank_t;
+
+ /// component attributes
+ enum attrib_t : uint64_t;
+
+ /**
+ * Information about a component.
+ */
+ struct Traits {
+ // public:
+ C2String name; ///< name of the component
+ domain_t domain; ///< component domain
+ kind_t kind; ///< component kind
+ rank_t rank; ///< component rank
+ C2String mediaType; ///< media type supported by the component
+
+ /**
+ * name alias(es) for backward compatibility.
+ * \note Multiple components can have the same alias as long as their media-type differs.
+ */
+ std::vector<C2StringLiteral> aliases; ///< name aliases for backward compatibility
+ };
+
+ // METHODS AVAILABLE WHEN RUNNING
+ // =============================================================================================
+
+ /**
+ * Queues up work for the component.
+ *
+ * This method MUST be supported in running (including tripped and error) states.
+ *
+ * This method MUST be "non-blocking" and return within 1 ms
+ *
+ * It is acceptable for this method to return OK and return an error value using the
+ * onWorkDone() callback.
+ *
+ * \retval C2_OK the work was successfully queued
+ * \retval C2_BAD_INDEX some component(s) in the work do(es) not exist
+ * \retval C2_CANNOT_DO the components are not tunneled
+ * \retval C2_BAD_STATE when called in the stopped or released state (user error)
+ *
+ * \retval C2_NO_MEMORY not enough memory to queue the work
+ * \retval C2_CORRUPTED some unknown error prevented queuing the work (unexpected)
+ */
+ virtual c2_status_t queue_nb(std::list<std::unique_ptr<C2Work>>* const items) = 0;
+
+ /**
+ * Announces a work to be queued later for the component. This reserves a slot for the queue
+ * to ensure correct work ordering even if the work is queued later.
+ *
+ * This method MUST be supported in running (including tripped and error) states.
+ *
+ * This method MUST be "non-blocking" and return within 1 ms
+ *
+ * \retval C2_OK the work announcement has been successfully recorded
+ * \retval C2_BAD_INDEX some component(s) in the work outline do(es) not exist
+ * \retval C2_CANNOT_DO the componentes are not tunneled
+ * \retval C2_BAD_STATE when called in the stopped or released state (user error)
+ *
+ * \retval C2_NO_MEMORY not enough memory to record the work announcement
+ * \retval C2_CORRUPTED some unknown error prevented recording the announcement (unexpected)
+ *
+ * \todo Can this be rolled into queue_nb?
+ * \todo Expose next work item for each component to detect stalls
+ */
+ virtual c2_status_t announce_nb(const std::vector<C2WorkOutline> &items) = 0;
+
+ enum flush_mode_t : uint32_t {
+ /// flush work from this component only
+ FLUSH_COMPONENT,
+
+ /// flush work from this component and all components connected downstream from it via
+ /// tunneling
+ FLUSH_CHAIN = (1 << 16),
+ };
+
+ /**
+ * Discards and abandons any pending work for the component, and optionally any component
+ * downstream.
+ *
+ * \todo define this: we could flush all work before last item queued for component across all
+ * components linked to this; flush only work items that are queued to this
+ * component
+ * \todo return work # of last flushed item; or all flushed (but not returned items)
+ * \todo we could make flush take a work item and flush all work before/after that item to allow
+ * TBD (slicing/seek?)
+ * \todo we could simply take a list of numbers and flush those... this is bad for decoders
+ * also, what would happen to fine grade references?
+ *
+ * This method MUST be supported in running (including tripped and error) states.
+ *
+ * This method may be momentarily blocking, but must return within 5ms.
+ *
+ * Work that could be immediately abandoned/discarded SHALL be returned in |flushedWork|; this
+ * can be done in an arbitrary order.
+ *
+ * Work that could not be abandoned or discarded immediately SHALL be marked to be
+ * discarded at the earliest opportunity, and SHALL be returned via the onWorkDone() callback.
+ * This shall be completed within 500ms.
+ *
+ * \param mode flush mode
+ *
+ * \retval C2_OK the component has been successfully flushed
+ * \retval C2_BAD_STATE when called in the stopped or released state (user error)
+ * \retval C2_TIMED_OUT the flush could not be completed within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented flushing from completion (unexpected)
+ */
+ virtual c2_status_t flush_sm(flush_mode_t mode, std::list<std::unique_ptr<C2Work>>* const flushedWork) = 0;
+
+ enum drain_mode_t : uint32_t {
+ /// drain component only and add an "end-of-stream" marker. Component shall process all
+ /// queued work and complete the current stream. If new input is received, it shall start
+ /// a new stream. \todo define what a stream is.
+ DRAIN_COMPONENT_WITH_EOS,
+ /// drain component without setting "end-of-stream" marker. Component shall process all
+ /// queued work but shall expect more work items for the same stream.
+ DRAIN_COMPONENT_NO_EOS = (1 << 0),
+
+ /// marks the last work item with a persistent "end-of-stream" marker that will drain
+ /// downstream components
+ /// \todo this may confuse work-ordering downstream
+ DRAIN_CHAIN = (1 << 16),
+
+ /**
+ * \todo define this; we could place EOS to all upstream components, just this component, or
+ * all upstream and downstream component.
+ * \todo should EOS carry over to downstream components?
+ */
+ };
+
+ /**
+ * Drains the component, and optionally downstream components. This is a signalling method;
+ * as such it does not wait for any work completion.
+ *
+ * Marks last work item as "drain-till-here", so component is notified not to wait for further
+ * work before it processes work already queued. This method can also used to set the
+ * end-of-stream flag after work has been queued. Client can continue to queue further work
+ * immediately after this method returns.
+ *
+ * This method MUST be supported in running (including tripped) states.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * Work that is completed SHALL be returned via the onWorkDone() callback.
+ *
+ * \param mode drain mode
+ *
+ * \retval C2_OK the drain request has been successfully recorded
+ * \retval C2_BAD_STATE when called in the stopped or released state (user error)
+ * \retval C2_BAD_VALUE the drain mode is not supported by the component
+ * \todo define supported modes discovery
+ * \retval C2_TIMED_OUT the flush could not be completed within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented flushing from completion (unexpected)
+ */
+ virtual c2_status_t drain_nb(drain_mode_t mode) = 0;
+
+ // STATE CHANGE METHODS
+ // =============================================================================================
+
+ /**
+ * Starts the component.
+ *
+ * This method MUST be supported in stopped state, as well as during the tripped state.
+ *
+ * If the return value is C2_OK, the component shall be in the running state.
+ * If the return value is C2_BAD_STATE or C2_DUPLICATE, no state change is expected as a
+ * response to this call.
+ * Otherwise, the component shall be in the stopped state.
+ *
+ * \note If a component is in the tripped state and start() is called while the component
+ * configuration still results in a trip, start shall succeed and a new onTripped callback
+ * should be used to communicate the configuration conflict that results in the new trip.
+ *
+ * \todo This method MUST return within 500ms. Seems this should be able to return quickly, as
+ * there are no immediate guarantees. Though there are guarantees for responsiveness immediately
+ * after start returns.
+ *
+ * \retval C2_OK the component has started (or resumed) successfully
+ * \retval C2_DUPLICATE when called during another start call from another thread
+ * \retval C2_BAD_STATE when called in any state other than the stopped state or tripped state,
+ * including when called during another state change call from another
+ * thread (user error)
+ * \retval C2_NO_MEMORY not enough memory to start the component
+ * \retval C2_TIMED_OUT the component could not be started within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented starting the component (unexpected)
+ */
+ virtual c2_status_t start() = 0;
+
+ /**
+ * Stops the component.
+ *
+ * This method MUST be supported in running (including tripped) state.
+ *
+ * This method MUST return withing 500ms.
+ *
+ * Upon this call, all pending work SHALL be abandoned and all buffer references SHALL be
+ * released.
+ * If the return value is C2_BAD_STATE or C2_DUPLICATE, no state change is expected as a
+ * response to this call.
+ * For all other return values, the component shall be in the stopped state.
+ *
+ * \todo should this return completed work, since client will just free it? Perhaps just to
+ * verify accounting.
+ *
+ * This does not alter any settings and tunings that may have resulted in a tripped state.
+ * (Is this material given the definition? Perhaps in case we want to start again.)
+ *
+ * \retval C2_OK the component has started successfully
+ * \retval C2_DUPLICATE when called during another stop call from another thread
+ * \retval C2_BAD_STATE when called in any state other than the running state, including when
+ * called during another state change call from another thread (user error)
+ * \retval C2_TIMED_OUT the component could not be stopped within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented stopping the component (unexpected)
+ */
+ virtual c2_status_t stop() = 0;
+
+ /**
+ * Resets the component.
+ *
+ * This method MUST be supported in all (including tripped) states other than released.
+ *
+ * This method MUST be supported during any other blocking call.
+ *
+ * This method MUST return withing 500ms.
+ *
+ * After this call returns all work SHALL be abandoned, all buffer references SHALL be released.
+ * If the return value is C2_BAD_STATE or C2_DUPLICATE, no state change is expected as a
+ * response to this call.
+ * For all other return values, the component shall be in the stopped state.
+ *
+ * \todo should this return completed work, since client will just free it? Also, if it unblocks
+ * a stop, where should completed work be returned?
+ *
+ * This brings settings back to their default - "guaranteeing" no tripped space.
+ *
+ * \todo reclaim support - it seems that since ownership is passed, this will allow reclaiming
+ * stuff.
+ *
+ * \retval C2_OK the component has been reset
+ * \retval C2_DUPLICATE when called during another reset call from another thread
+ * \retval C2_BAD_STATE when called in the released state
+ * \retval C2_TIMED_OUT the component could not be reset within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented resetting the component (unexpected)
+ */
+ virtual c2_status_t reset() = 0;
+
+ /**
+ * Releases the component.
+ *
+ * This method MUST be supported in stopped state.
+ *
+ * This method MUST return withing 500ms. Upon return all references shall be abandoned.
+ *
+ * \retval C2_OK the component has been released
+ * \retval C2_DUPLICATE the component is already released
+ * \retval C2_BAD_STATE the component is running
+ * \retval C2_TIMED_OUT the component could not be released within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented releasing the component (unexpected)
+ */
+ virtual c2_status_t release() = 0;
+
+ /**
+ * Returns the interface for this component.
+ *
+ * \return the component interface
+ */
+ virtual std::shared_ptr<C2ComponentInterface> intf() = 0;
+
+ virtual ~C2Component() = default;
+};
+
+C2ENUM(C2Component::kind_t, uint32_t,
+ KIND_OTHER,
+ KIND_DECODER,
+ KIND_ENCODER
+);
+
+C2ENUM(C2Component::domain_t, uint32_t,
+ DOMAIN_OTHER,
+ DOMAIN_VIDEO,
+ DOMAIN_AUDIO,
+ DOMAIN_IMAGE
+);
+
+class C2FrameInfoParser {
+public:
+ /**
+ * \return the content type supported by this info parser.
+ *
+ * \todo this may be redundant
+ */
+ virtual C2StringLiteral getType() const = 0;
+
+ /**
+ * \return a vector of supported parameter indices parsed by this info parser.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \todo sticky vs. non-sticky params? this may be communicated by param-reflector.
+ */
+ virtual const std::vector<C2Param::Index> getParsedParams() const = 0;
+
+ /**
+ * Resets this info parser. This brings this parser to its initial state after creation.
+ *
+ * This method SHALL return within 5ms.
+ *
+ * \retval C2_OK the info parser was reset
+ * \retval C2_TIMED_OUT could not reset the parser within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the resetting of the parser (unexpected)
+ */
+ virtual c2_status_t reset() { return C2_OK; }
+
+ virtual c2_status_t parseFrame(C2FrameData &frame);
+
+ virtual ~C2FrameInfoParser() = default;
+};
+
+class C2AllocatorStore {
+public:
+ typedef C2Allocator::id_t id_t;
+
+ enum : C2Allocator::id_t {
+ DEFAULT_LINEAR, ///< basic linear allocator type
+ DEFAULT_GRAPHIC, ///< basic graphic allocator type
+ PLATFORM_START = 0x10,
+ VENDOR_START = 0x100,
+ BAD_ID = C2Allocator::BAD_ID, ///< DO NOT USE
+ };
+
+ /**
+ * Returns the unique name of this allocator store.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return the name of this allocator store.
+ * \retval an empty string if there was not enough memory to allocate the actual name.
+ */
+ virtual C2String getName() const = 0;
+
+ /**
+ * Returns the set of allocators supported by this allocator store.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \retval vector of allocator information (as shared pointers)
+ * \retval an empty vector if there was not enough memory to allocate the whole vector.
+ */
+ virtual std::vector<std::shared_ptr<const C2Allocator::Traits>> listAllocators_nb() const = 0;
+
+ /**
+ * Retrieves/creates a shared allocator object.
+ *
+ * This method MUST be return within 5ms.
+ *
+ * The allocator is created on first use, and the same allocator is returned on subsequent
+ * concurrent uses in the same process. The allocator is freed when it is no longer referenced.
+ *
+ * \param id the ID of the allocator to create. This is defined by the store, but
+ * the ID of the default linear and graphic allocators is formalized.
+ * \param allocator shared pointer where the created allocator is stored. Cleared on failure
+ * and updated on success.
+ *
+ * \retval C2_OK the allocator was created successfully
+ * \retval C2_TIMED_OUT could not create the allocator within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the creation of the allocator (unexpected)
+ *
+ * \retval C2_NOT_FOUND no such allocator
+ * \retval C2_NO_MEMORY not enough memory to create the allocator
+ */
+ virtual c2_status_t fetchAllocator(id_t id, std::shared_ptr<C2Allocator>* const allocator) = 0;
+
+ virtual ~C2AllocatorStore() = default;
+};
+
+class C2ComponentStore {
+public:
+ /**
+ * Returns the name of this component or component interface object.
+ * This is a unique name for this component or component interface 'class'; however, multiple
+ * instances of this component SHALL have the same name.
+ *
+ * This method MUST be supported in any state. This call does not change the state nor the
+ * internal states of the component.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return the name of this component or component interface object.
+ * \retval an empty string if there was not enough memory to allocate the actual name.
+ */
+ virtual C2String getName() const = 0;
+
+ /**
+ * Creates a component.
+ *
+ * This method SHALL return within 100ms.
+ *
+ * \param name name of the component to create
+ * \param component shared pointer where the created component is stored. Cleared on
+ * failure and updated on success.
+ *
+ * \retval C2_OK the component was created successfully
+ * \retval C2_TIMED_OUT could not create the component within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the creation of the component (unexpected)
+ *
+ * \retval C2_NOT_FOUND no such component
+ * \retval C2_NO_MEMORY not enough memory to create the component
+ */
+ virtual c2_status_t createComponent(
+ C2String name, std::shared_ptr<C2Component>* const component) = 0;
+
+ /**
+ * Creates a component interface.
+ *
+ * This method SHALL return within 100ms.
+ *
+ * \param name name of the component interface to create
+ * \param interface shared pointer where the created interface is stored
+ *
+ * \retval C2_OK the component interface was created successfully
+ * \retval C2_TIMED_OUT could not create the component interface within the time limit
+ * (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the creation of the component interface
+ * (unexpected)
+ *
+ * \retval C2_NOT_FOUND no such component interface
+ * \retval C2_NO_MEMORY not enough memory to create the component interface
+ *
+ * \todo Do we need an interface, or could this just be a component that is never started?
+ */
+ virtual c2_status_t createInterface(
+ C2String name, std::shared_ptr<C2ComponentInterface>* const interface) = 0;
+
+ /**
+ * Returns the list of components supported by this component store.
+ *
+ * This method MUST return within 500ms.
+ *
+ * \retval vector of component information.
+ */
+ virtual std::vector<std::shared_ptr<const C2Component::Traits>> listComponents() = 0;
+
+ // -------------------------------------- UTILITY METHODS --------------------------------------
+
+ // on-demand buffer layout conversion (swizzling)
+ //
+ virtual c2_status_t copyBuffer(
+ std::shared_ptr<C2GraphicBuffer> src, std::shared_ptr<C2GraphicBuffer> dst) = 0;
+
+ // -------------------------------------- CONFIGURATION API -----------------------------------
+ // e.g. for global settings (system-wide stride, etc.)
+
+ /**
+ * Queries a set of system-wide parameters.
+ * Querying is performed at best effort: the store SHALL query all supported parameters and
+ * skip unsupported ones, or heap allocated parameters that could not be allocated. Any errors
+ * are communicated in the return value. Additionally, preallocated (e.g. stack) parameters that
+ * could not be queried are invalidated. Parameters to be allocated on the heap are omitted from
+ * the result.
+ *
+ * \note Parameter values do not depend on the order of query.
+ *
+ * This method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * \param stackParams a list of params queried. These are initialized specific to each
+ * setting; e.g. size and index are set and rest of the members are
+ * cleared.
+ * NOTE: Flexible settings that are of incorrect size will be invalidated.
+ * \param heapParamIndices a vector of param indices for params to be queried and returned on the
+ * heap. These parameters will be returned in heapParams. Unsupported param
+ * indices will be ignored.
+ * \param heapParams a list of params where to which the supported heap parameters will be
+ * appended in the order they appear in heapParamIndices.
+ *
+ * \retval C2_OK all parameters could be queried
+ * \retval C2_BAD_INDEX all supported parameters could be queried, but some parameters were not
+ * supported
+ * \retval C2_NO_MEMORY could not allocate memory for a supported parameter
+ * \retval C2_CORRUPTED some unknown error prevented the querying of the parameters
+ * (unexpected)
+ */
+ virtual c2_status_t query_sm(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const = 0;
+
+ /**
+ * Sets a set of system-wide parameters.
+ *
+ * \note There are no settable system-wide parameters defined thus far, but may be added in the
+ * future.
+ *
+ * Tuning is performed at best effort: the store SHALL update all supported configuration at
+ * best effort (unless configured otherwise) and skip unsupported ones. Any errors are
+ * communicated in the return value and in |failures|.
+ *
+ * \note Parameter tuning DOES depend on the order of the tuning parameters. E.g. some parameter
+ * update may allow some subsequent parameter update.
+ *
+ * This method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * \param params a list of parameter updates. These will be updated to the actual
+ * parameter values after the updates (this is because tuning is performed
+ * at best effort).
+ * \todo params that could not be updated are not marked here, so are
+ * confusing - are they "existing" values or intended to be configured
+ * values?
+ * \param failures a list of parameter failures
+ *
+ * \retval C2_OK all parameters could be updated successfully
+ * \retval C2_BAD_INDEX all supported parameters could be updated successfully, but some
+ * parameters were not supported
+ * \retval C2_BAD_VALUE some supported parameters could not be updated successfully because
+ * they contained unsupported values. These are returned in |failures|.
+ * \retval C2_NO_MEMORY some supported parameters could not be updated successfully because
+ * they contained unsupported values, but could not allocate a failure
+ * object for them.
+ * \retval C2_CORRUPTED some unknown error prevented the update of the parameters
+ * (unexpected)
+ */
+ virtual c2_status_t config_sm(
+ const std::vector<C2Param*> ¶ms,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) = 0;
+
+ // REFLECTION MECHANISM (USED FOR EXTENSION)
+ // =============================================================================================
+
+ /**
+ * Returns the parameter reflector.
+ *
+ * This is used to describe parameter fields. This is shared for all components created by
+ * this component store.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \return a shared parameter reflector object.
+ */
+ virtual std::shared_ptr<C2ParamReflector> getParamReflector() const = 0;
+
+ /**
+ * Returns the set of supported parameters.
+ *
+ * This method MUST be "non-blocking" and return within 1ms.
+ *
+ * \param[out] params a vector of supported parameters will be appended to this vector.
+ *
+ * \retval C2_OK the operation completed successfully.
+ * \retval C2_NO_MEMORY not enough memory to complete this method.
+ */
+ virtual c2_status_t querySupportedParams_nb(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) const = 0;
+
+ /**
+ * Retrieves the supported values for the queried fields.
+ *
+ * Client SHALL set the parameter-field specifier and the type of supported values query (e.g.
+ * currently supported values, or potential supported values) in fields.
+ * Upon return the store SHALL fill in the supported values for the fields listed as well
+ * as a status for each field. Store shall process all fields queried even if some queries
+ * fail.
+ *
+ * This method may be momentarily blocking, but MUST return within 5ms.
+ *
+ * \param[in out] fields a vector of fields descriptor structures.
+ *
+ * \retval C2_OK the operation completed successfully.
+ * \retval C2_BAD_INDEX at least one field was not recognized as a component store field
+ */
+ virtual c2_status_t querySupportedValues_sm(
+ std::vector<C2FieldSupportedValuesQuery> &fields) const = 0;
+
+ virtual ~C2ComponentStore() = default;
+};
+
+// ================================================================================================
+
+/// @}
+
+#endif // C2COMPONENT_H_
diff --git a/media/codec2/core/include/C2Config.h b/media/codec2/core/include/C2Config.h
new file mode 100644
index 0000000..799ade4
--- /dev/null
+++ b/media/codec2/core/include/C2Config.h
@@ -0,0 +1,2179 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2CONFIG_H_
+#define C2CONFIG_H_
+
+#include <C2.h>
+#include <C2Component.h>
+#include <C2Enum.h>
+#include <C2ParamDef.h>
+
+/// \defgroup config Component configuration
+/// @{
+
+/**
+ * Enumerated boolean.
+ */
+C2ENUM(c2_bool_t, uint32_t,
+ C2_FALSE, ///< true
+ C2_TRUE, ///< false
+)
+
+typedef C2SimpleValueStruct<c2_bool_t> C2BoolValue;
+
+typedef C2SimpleValueStruct<C2EasyEnum<c2_bool_t>> C2EasyBoolValue;
+
+/**
+ * Enumerated set tri-state.
+ *
+ * Used for optional configurations to distinguish between values set by the client,
+ * default values set by the component, or unset values.
+ */
+C2ENUM(c2_set_t, uint32_t,
+ C2_UNSET, // parameter is unset and has no value
+ C2_SET, // parameter is/has been set by the client
+ C2_DEFAULT, // parameter has not been set by the client, but is set by the component
+)
+
+/** Enumerations used by configuration parameters */
+struct C2Config {
+ enum aac_packaging_t : uint32_t; ///< AAC packaging (RAW vs ADTS)
+ enum aac_sbr_mode_t : uint32_t; ///< AAC SBR mode
+ enum api_feature_t : uint64_t; ///< API features
+ enum api_level_t : uint32_t; ///< API level
+ enum bitrate_mode_t : uint32_t; ///< bitrate control mode
+ enum drc_compression_mode_t : int32_t; ///< DRC compression mode
+ enum drc_effect_type_t : int32_t; ///< DRC effect type
+ enum intra_refresh_mode_t : uint32_t; ///< intra refresh modes
+ enum level_t : uint32_t; ///< coding level
+ enum ordinal_key_t : uint32_t; ///< work ordering keys
+ enum pcm_encoding_t : uint32_t; ///< PCM encoding
+ enum picture_type_t : uint32_t; ///< picture types
+ enum platform_feature_t : uint64_t; ///< platform features
+ enum platform_level_t : uint32_t; ///< platform level
+ enum prepend_header_mode_t : uint32_t; ///< prepend header operational modes
+ enum profile_t : uint32_t; ///< coding profile
+ enum scaling_method_t : uint32_t; ///< scaling methods
+ enum scan_order_t : uint32_t; ///< scan orders
+ enum secure_mode_t : uint32_t; ///< secure/protected modes
+ enum supplemental_info_t : uint32_t; ///< supplemental information types
+ enum tiling_mode_t : uint32_t; ///< tiling modes
+};
+
+namespace {
+
+enum C2ParamIndexKind : C2Param::type_index_t {
+ C2_PARAM_INDEX_INVALID = 0x0, ///< do not use
+ C2_PARAM_INDEX_STRUCT_START = 0x1, ///< struct only indices
+ C2_PARAM_INDEX_PARAM_START = 0x800, ///< regular parameters
+ C2_PARAM_INDEX_CODER_PARAM_START = 0x1000, ///< en/transcoder parameters
+ C2_PARAM_INDEX_PICTURE_PARAM_START = 0x1800, ///< image/video parameters
+ C2_PARAM_INDEX_VIDEO_PARAM_START = 0x2000, ///< video parameters
+ C2_PARAM_INDEX_IMAGE_PARAM_START = 0x2800, ///< image parameters
+ C2_PARAM_INDEX_AUDIO_PARAM_START = 0x3000, ///< image parameters
+ C2_PARAM_INDEX_PLATFORM_START = 0x4000, ///< platform-defined parameters
+
+ /* =================================== structure indices =================================== */
+
+ kParamIndexColorXy = C2_PARAM_INDEX_STRUCT_START,
+ kParamIndexMasteringDisplayColorVolume,
+ kParamIndexChromaOffset,
+ kParamIndexGopLayer,
+
+ /* =================================== parameter indices =================================== */
+
+ kParamIndexApiLevel = C2_PARAM_INDEX_PARAM_START,
+ kParamIndexApiFeatures,
+
+ /* ------------------------------------ all components ------------------------------------ */
+
+ /* generic component characteristics */
+ kParamIndexName,
+ kParamIndexAliases,
+ kParamIndexKind,
+ kParamIndexDomain,
+ kParamIndexAttributes,
+ kParamIndexTimeStretch,
+
+ /* coding characteristics */
+ kParamIndexProfileLevel,
+ kParamIndexInitData,
+ kParamIndexSupplementalData,
+ kParamIndexSubscribedSupplementalData,
+
+ /* pipeline characteristics */
+ kParamIndexMediaType,
+ kParamIndexDelayRequest,
+ kParamIndexDelay,
+ kParamIndexMaxReferenceAge,
+ kParamIndexMaxReferenceCount,
+ kParamIndexReorderBufferDepth,
+ kParamIndexReorderKey,
+ kParamIndexStreamCount,
+ kParamIndexSubscribedParamIndices,
+ kParamIndexSuggestedBufferCount,
+ kParamIndexBatchSize,
+ kParamIndexCurrentWork,
+ kParamIndexLastWorkQueued,
+
+ /* memory allocation */
+ kParamIndexAllocators,
+ kParamIndexBlockPools,
+ kParamIndexBufferType,
+ kParamIndexUsage,
+ kParamIndexOutOfMemory,
+ kParamIndexMaxBufferSize,
+
+ /* misc. state */
+ kParamIndexTripped,
+ kParamIndexConfigCounter,
+
+ /* resources */
+ kParamIndexResourcesNeeded,
+ kParamIndexResourcesReserved,
+ kParamIndexOperatingRate,
+ kParamIndexRealTimePriority,
+
+ /* protected content */
+ kParamIndexSecureMode,
+
+ /* ------------------------------------ (trans/en)coders ------------------------------------ */
+
+ kParamIndexBitrate = C2_PARAM_INDEX_CODER_PARAM_START,
+ kParamIndexBitrateMode,
+ kParamIndexQuality,
+ kParamIndexComplexity,
+ kParamIndexPrependHeaderMode,
+
+ /* --------------------------------- image/video components --------------------------------- */
+
+ kParamIndexPictureSize = C2_PARAM_INDEX_PICTURE_PARAM_START,
+ kParamIndexCropRect,
+ kParamIndexPixelFormat,
+ kParamIndexRotation,
+ kParamIndexPixelAspectRatio,
+ kParamIndexScaledPictureSize,
+ kParamIndexScaledCropRect,
+ kParamIndexScalingMethod,
+ kParamIndexColorInfo,
+ kParamIndexColorAspects,
+ kParamIndexHdrStaticMetadata,
+ kParamIndexDefaultColorAspects,
+
+ kParamIndexBlockSize,
+ kParamIndexBlockCount,
+ kParamIndexBlockRate,
+
+ kParamIndexPictureTypeMask,
+ kParamIndexPictureType,
+
+ /* ------------------------------------ video components ------------------------------------ */
+
+ kParamIndexFrameRate = C2_PARAM_INDEX_VIDEO_PARAM_START,
+ kParamIndexMaxBitrate,
+ kParamIndexMaxFrameRate,
+ kParamIndexMaxPictureSize,
+ kParamIndexGop,
+ kParamIndexSyncFrameInterval,
+ kParamIndexRequestSyncFrame,
+ kParamIndexTemporalLayering,
+ kParamIndexLayerIndex,
+ kParamIndexLayerCount,
+ kParamIndexIntraRefresh,
+
+ /* ------------------------------------ image components ------------------------------------ */
+
+ kParamIndexTileLayout = C2_PARAM_INDEX_IMAGE_PARAM_START,
+ kParamIndexTileHandling,
+
+ /* ------------------------------------ audio components ------------------------------------ */
+
+ kParamIndexSampleRate = C2_PARAM_INDEX_AUDIO_PARAM_START,
+ kParamIndexChannelCount,
+ kParamIndexPcmEncoding,
+ kParamIndexAacPackaging,
+ kParamIndexMaxChannelCount,
+ kParamIndexAacSbrMode, // aac encode, enum
+ kParamIndexDrcEncodedTargetLevel, // drc, float (dBFS)
+ kParamIndexDrcTargetReferenceLevel, // drc, float (dBFS)
+ kParamIndexDrcCompression, // drc, enum
+ kParamIndexDrcBoostFactor, // drc, float (0-1)
+ kParamIndexDrcAttenuationFactor, // drc, float (0-1)
+ kParamIndexDrcEffectType, // drc, enum
+
+ /* ============================== platform-defined parameters ============================== */
+
+ kParamIndexPlatformLevel = C2_PARAM_INDEX_PLATFORM_START, // all, u32
+ kParamIndexPlatformFeatures, // all, u64 mask
+ kParamIndexStoreIonUsage, // store, struct
+ kParamIndexAspectsToDataSpace, // store, struct
+ kParamIndexFlexiblePixelFormatDescriptor, // store, struct
+ kParamIndexFlexiblePixelFormatDescriptors, // store, struct[]
+ kParamIndexDataSpaceToAspects, // store, struct
+ kParamIndexDataSpace, // u32
+ kParamIndexSurfaceScaling, // u32
+
+ // input surface
+ kParamIndexInputSurfaceEos, // input-surface, eos
+ kParamIndexTimedControl, // struct
+ kParamIndexStartAt, // input-surface, struct
+ kParamIndexSuspendAt, // input-surface, struct
+ kParamIndexResumeAt, // input-surface, struct
+ kParamIndexStopAt, // input-surface, struct
+ kParamIndexTimeOffset, // input-surface, struct
+ kParamIndexMinFrameRate, // input-surface, float
+ kParamIndexTimestampGapAdjustment, // input-surface, struct
+
+ kParamIndexSurfaceAllocator, // u32
+
+ // deprecated indices due to renaming
+ kParamIndexAacStreamFormat = kParamIndexAacPackaging,
+ kParamIndexCsd = kParamIndexInitData,
+ kParamIndexMaxVideoSizeHint = kParamIndexMaxPictureSize,
+ kParamIndexMime = kParamIndexMediaType,
+ kParamIndexRequestedInfos = kParamIndexSubscribedParamIndices,
+
+
+ // deprecated indices due to removal
+ kParamIndexSupportedParams = 0xDEAD0000,
+ kParamIndexReadOnlyParams,
+ kParamIndexTemporal,
+};
+
+}
+
+/**
+ * Codec 2.0 parameter types follow the following naming convention:
+ *
+ * C2<group><domain><index><type>
+ *
+ * E.g. C2StreamPictureSizeInfo: group="" domain="Stream" index="PictureSize" type="Info".
+ * Group is somewhat arbitrary, but denotes kind of objects the parameter is defined.
+ * At this point we use Component and Store to distinguish basic component/store parameters.
+ *
+ * Parameter keys are named C2_PARAMKEY_[<group>_]<domain>_<index> as type is not expected
+ * to distinguish parameters. E.g. a component could change the type of the parameter and it
+ * is not expected users would need to change the key.
+ */
+
+/* ----------------------------------------- API level ----------------------------------------- */
+
+enum C2Config::api_level_t : uint32_t {
+ API_L0_1 = 0, ///< support for API level 0.1
+};
+
+// read-only
+typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::api_level_t>, kParamIndexApiLevel>
+ C2ApiLevelSetting;
+constexpr char C2_PARAMKEY_API_LEVEL[] = "api.level";
+
+enum C2Config::api_feature_t : uint64_t {
+ API_REFLECTION = (1U << 0), ///< ability to list supported parameters
+ API_VALUES = (1U << 1), ///< ability to list supported values for each parameter
+ API_CURRENT_VALUES = (1U << 2), ///< ability to list currently supported values for each parameter
+ API_DEPENDENCY = (1U << 3), ///< have a defined parameter dependency
+
+ API_STREAMS = (1ULL << 32), ///< supporting variable number of streams
+
+ API_TUNNELING = (1ULL << 48), ///< tunneling API
+};
+
+// read-only
+typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::api_feature_t>, kParamIndexApiFeatures>
+ C2ApiFeaturesSetting;
+constexpr char C2_PARAMKEY_API_FEATURES[] = "api.features";
+
+/* ----------------------------- generic component characteristics ----------------------------- */
+
+/**
+ * The name of the component.
+ *
+ * This must contain only alphanumeric characters or dot '.', hyphen '-', plus '+', or
+ * underline '_'. The name of each component must be unique.
+ *
+ * For Android: Component names must start with 'c2.' followed by the company name or abbreviation
+ * and another dot, e.g. 'c2.android.'. Use of lowercase is preferred but not required.
+ */
+// read-only
+typedef C2GlobalParam<C2Setting, C2StringValue, kParamIndexName> C2ComponentNameSetting;
+constexpr char C2_PARAMKEY_COMPONENT_NAME[] = "component.name";
+
+/**
+ * Alternate names (aliases) of the component.
+ *
+ * This is a comma ',' separated list of alternate component names. Unlike component names that
+ * must be unique, multiple components can have the same alias.
+ */
+// read-only
+typedef C2GlobalParam<C2Setting, C2StringValue, kParamIndexAliases> C2ComponentAliasesSetting;
+constexpr char C2_PARAMKEY_COMPONENT_ALIASES[] = "component.aliases";
+
+/**
+ * Component kind.
+ */
+// read-only
+typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::kind_t>, kParamIndexKind>
+ C2ComponentKindSetting;
+constexpr char C2_PARAMKEY_COMPONENT_KIND[] = "component.kind";
+
+/**
+ * Component domain.
+ */
+// read-only
+typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::domain_t>, kParamIndexDomain>
+ C2ComponentDomainSetting;
+typedef C2ComponentDomainSetting C2ComponentDomainInfo; // deprecated
+typedef C2Component::domain_t C2DomainKind; // deprecated
+constexpr char C2_PARAMKEY_COMPONENT_DOMAIN[] = "component.domain";
+
+constexpr C2Component::domain_t C2DomainAudio = C2Component::DOMAIN_AUDIO; // deprecated
+constexpr C2Component::domain_t C2DomainOther = C2Component::DOMAIN_OTHER; // deprecate
+constexpr C2Component::domain_t C2DomainVideo = C2Component::DOMAIN_VIDEO; // deprecate
+
+/**
+ * Component attributes.
+ *
+ * These are a set of flags provided by the component characterizing its processing algorithm.
+ */
+C2ENUM(C2Component::attrib_t, uint64_t,
+ ATTRIB_IS_TEMPORAL = 1u << 0, ///< component input ordering matters for processing
+)
+
+// read-only
+typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::attrib_t>, kParamIndexAttributes>
+ C2ComponentAttributesSetting;
+constexpr char C2_PARAMKEY_COMPONENT_ATTRIBUTES[] = "component.attributes";
+
+// deprecated
+typedef C2ComponentAttributesSetting C2ComponentTemporalInfo;
+
+/**
+ * Time stretching.
+ *
+ * This is the ratio between the rate of the input timestamp, and the rate of the output timestamp.
+ * E.g. if this is 4.0, for every 1 seconds of input timestamp difference, the output shall differ
+ * by 4 seconds.
+ */
+typedef C2GlobalParam<C2Tuning, C2FloatValue, kParamIndexTimeStretch> C2ComponentTimeStretchTuning;
+constexpr char C2_PARAMKEY_TIME_STRETCH[] = "algo.time-stretch";
+
+/* ----------------------------------- coding characteristics ----------------------------------- */
+
+/**
+ * Profile and level.
+ *
+ * Profile determines the tools used by the component.
+ * Level determines the level of resources used by the component.
+ */
+
+namespace {
+
+enum : uint32_t {
+ _C2_PL_MP2V_BASE = 0x1000,
+ _C2_PL_AAC_BASE = 0x2000,
+ _C2_PL_H263_BASE = 0x3000,
+ _C2_PL_MP4V_BASE = 0x4000,
+ _C2_PL_AVC_BASE = 0x5000,
+ _C2_PL_HEVC_BASE = 0x6000,
+ _C2_PL_VP9_BASE = 0x7000,
+ _C2_PL_DV_BASE = 0x8000,
+
+ C2_PROFILE_LEVEL_VENDOR_START = 0x70000000,
+};
+
+}
+
+enum C2Config::profile_t : uint32_t {
+ PROFILE_UNUSED = 0, ///< profile is not used by this media type
+
+ // AAC (MPEG-2 Part 7 and MPEG-4 Part 3) profiles
+ PROFILE_AAC_LC = _C2_PL_AAC_BASE, ///< AAC Low-Complexity
+ PROFILE_AAC_MAIN, ///< AAC Main
+ PROFILE_AAC_SSR, ///< AAC Scalable Sampling Rate
+ PROFILE_AAC_LTP, ///< AAC Long Term Prediction
+ PROFILE_AAC_HE, ///< AAC High-Efficiency
+ PROFILE_AAC_SCALABLE, ///< AAC Scalable
+ PROFILE_AAC_ER_LC, ///< AAC Error Resilient Low-Complexity
+ PROFILE_AAC_ER_SCALABLE, ///< AAC Error Resilient Scalable
+ PROFILE_AAC_LD, ///< AAC Low Delay
+ PROFILE_AAC_HE_PS, ///< AAC High-Efficiency Parametric Stereo
+ PROFILE_AAC_ELD, ///< AAC Enhanced Low Delay
+ PROFILE_AAC_XHE, ///< AAC Extended High-Efficiency
+
+ // MPEG-2 Video profiles
+ PROFILE_MP2V_SIMPLE = _C2_PL_MP2V_BASE, ///< MPEG-2 Video (H.262) Simple
+ PROFILE_MP2V_MAIN, ///< MPEG-2 Video (H.262) Main
+ PROFILE_MP2V_SNR_SCALABLE, ///< MPEG-2 Video (H.262) SNR Scalable
+ PROFILE_MP2V_SPATIALLY_SCALABLE, ///< MPEG-2 Video (H.262) Spatially Scalable
+ PROFILE_MP2V_HIGH, ///< MPEG-2 Video (H.262) High
+ PROFILE_MP2V_422, ///< MPEG-2 Video (H.262) 4:2:2
+ PROFILE_MP2V_MULTIVIEW, ///< MPEG-2 Video (H.262) Multi-view
+
+ // H.263 profiles
+ PROFILE_H263_BASELINE = _C2_PL_H263_BASE, ///< H.263 Baseline (Profile 0)
+ PROFILE_H263_H320, ///< H.263 H.320 Coding Efficiency Version 2 Backward-Compatibility (Profile 1)
+ PROFILE_H263_V1BC, ///< H.263 Version 1 Backward-Compatibility (Profile 2)
+ PROFILE_H263_ISWV2, ///< H.263 Version 2 Interactive and Streaming Wireless (Profile 3)
+ PROFILE_H263_ISWV3, ///< H.263 Version 3 Interactive and Streaming Wireless (Profile 4)
+ PROFILE_H263_HIGH_COMPRESSION, ///< H.263 Conversational High Compression (Profile 5)
+ PROFILE_H263_INTERNET, ///< H.263 Conversational Internet (Profile 6)
+ PROFILE_H263_INTERLACE, ///< H.263 Conversational Interlace (Profile 7)
+ PROFILE_H263_HIGH_LATENCY, ///< H.263 High Latency (Profile 8)
+
+ // MPEG-4 Part 2 (Video) Natural Visual Profiles
+ PROFILE_MP4V_SIMPLE, ///< MPEG-4 Video Simple
+ PROFILE_MP4V_SIMPLE_SCALABLE, ///< MPEG-4 Video Simple Scalable
+ PROFILE_MP4V_CORE, ///< MPEG-4 Video Core
+ PROFILE_MP4V_MAIN, ///< MPEG-4 Video Main
+ PROFILE_MP4V_NBIT, ///< MPEG-4 Video N-Bit
+ PROFILE_MP4V_ARTS, ///< MPEG-4 Video Advanced Realtime Simple
+ PROFILE_MP4V_CORE_SCALABLE, ///< MPEG-4 Video Core Scalable
+ PROFILE_MP4V_ACE, ///< MPEG-4 Video Advanced Coding Efficiency
+ PROFILE_MP4V_ADVANCED_CORE, ///< MPEG-4 Video Advanced Core
+ PROFILE_MP4V_SIMPLE_STUDIO, ///< MPEG-4 Video Simple Studio
+ PROFILE_MP4V_CORE_STUDIO, ///< MPEG-4 Video Core Studio
+ PROFILE_MP4V_ADVANCED_SIMPLE, ///< MPEG-4 Video Advanced Simple
+ PROFILE_MP4V_FGS, ///< MPEG-4 Video Fine Granularity Scalable
+
+ // AVC / MPEG-4 Part 10 (H.264) profiles
+ PROFILE_AVC_BASELINE = _C2_PL_AVC_BASE, ///< AVC (H.264) Baseline
+ PROFILE_AVC_CONSTRAINED_BASELINE, ///< AVC (H.264) Constrained Baseline
+ PROFILE_AVC_MAIN, ///< AVC (H.264) Main
+ PROFILE_AVC_EXTENDED, ///< AVC (H.264) Extended
+ PROFILE_AVC_HIGH, ///< AVC (H.264) High
+ PROFILE_AVC_PROGRESSIVE_HIGH, ///< AVC (H.264) Progressive High
+ PROFILE_AVC_CONSTRAINED_HIGH, ///< AVC (H.264) Constrained High
+ PROFILE_AVC_HIGH_10, ///< AVC (H.264) High 10
+ PROFILE_AVC_PROGRESSIVE_HIGH_10, ///< AVC (H.264) Progressive High 10
+ PROFILE_AVC_HIGH_422, ///< AVC (H.264) High 4:2:2
+ PROFILE_AVC_HIGH_444_PREDICTIVE, ///< AVC (H.264) High 4:4:4 Predictive
+ PROFILE_AVC_HIGH_10_INTRA, ///< AVC (H.264) High 10 Intra
+ PROFILE_AVC_HIGH_422_INTRA, ///< AVC (H.264) High 4:2:2 Intra
+ PROFILE_AVC_HIGH_444_INTRA, ///< AVC (H.264) High 4:4:4 Intra
+ PROFILE_AVC_CAVLC_444_INTRA, ///< AVC (H.264) CAVLC 4:4:4 Intra
+ PROFILE_AVC_SCALABLE_BASELINE = _C2_PL_AVC_BASE + 0x100, ///< AVC (H.264) Scalable Baseline
+ PROFILE_AVC_SCALABLE_CONSTRAINED_BASELINE, ///< AVC (H.264) Scalable Constrained Baseline
+ PROFILE_AVC_SCALABLE_HIGH, ///< AVC (H.264) Scalable High
+ PROFILE_AVC_SCALABLE_CONSTRAINED_HIGH, ///< AVC (H.264) Scalable Constrained High
+ PROFILE_AVC_SCALABLE_HIGH_INTRA, ///< AVC (H.264) Scalable High Intra
+ PROFILE_AVC_MULTIVIEW_HIGH = _C2_PL_AVC_BASE + 0x200, ///< AVC (H.264) Multiview High
+ PROFILE_AVC_STEREO_HIGH, ///< AVC (H.264) Stereo High
+ PROFILE_AVC_MFC_HIGH, ///< AVC (H.264) MFC High
+ PROFILE_AVC_MULTIVIEW_DEPTH_HIGH = _C2_PL_AVC_BASE + 0x300, ///< AVC (H.264) Multiview Depth High
+ PROFILE_AVC_MFC_DEPTH_HIGH, ///< AVC (H.264) MFC Depth High
+ PROFILE_AVC_ENHANCED_MULTIVIEW_DEPTH_HIGH = _C2_PL_AVC_BASE + 0x400, ///< AVC (H.264) Enhanced Multiview Depth High
+
+ // HEVC profiles
+ PROFILE_HEVC_MAIN = _C2_PL_HEVC_BASE, ///< HEVC (H.265) Main
+ PROFILE_HEVC_MAIN_10, ///< HEVC (H.265) Main 10
+ PROFILE_HEVC_MAIN_STILL, ///< HEVC (H.265) Main Still Picture
+ PROFILE_HEVC_MONO = _C2_PL_HEVC_BASE + 0x100, ///< HEVC (H.265) Monochrome
+ PROFILE_HEVC_MONO_12, ///< HEVC (H.265) Monochrome 12
+ PROFILE_HEVC_MONO_16, ///< HEVC (H.265) Monochrome 16
+ PROFILE_HEVC_MAIN_12, ///< HEVC (H.265) Main 12
+ PROFILE_HEVC_MAIN_422_10, ///< HEVC (H.265) Main 4:2:2 10
+ PROFILE_HEVC_MAIN_422_12, ///< HEVC (H.265) Main 4:2:2 12
+ PROFILE_HEVC_MAIN_444, ///< HEVC (H.265) Main 4:4:4
+ PROFILE_HEVC_MAIN_444_10, ///< HEVC (H.265) Main 4:4:4 10
+ PROFILE_HEVC_MAIN_444_12, ///< HEVC (H.265) Main 4:4:4 12
+ PROFILE_HEVC_MAIN_INTRA, ///< HEVC (H.265) Main Intra
+ PROFILE_HEVC_MAIN_10_INTRA, ///< HEVC (H.265) Main 10 Intra
+ PROFILE_HEVC_MAIN_12_INTRA, ///< HEVC (H.265) Main 12 Intra
+ PROFILE_HEVC_MAIN_422_10_INTRA, ///< HEVC (H.265) Main 4:2:2 10 Intra
+ PROFILE_HEVC_MAIN_422_12_INTRA, ///< HEVC (H.265) Main 4:2:2 12 Intra
+ PROFILE_HEVC_MAIN_444_INTRA, ///< HEVC (H.265) Main 4:4:4 Intra
+ PROFILE_HEVC_MAIN_444_10_INTRA, ///< HEVC (H.265) Main 4:4:4 10 Intra
+ PROFILE_HEVC_MAIN_444_12_INTRA, ///< HEVC (H.265) Main 4:4:4 12 Intra
+ PROFILE_HEVC_MAIN_444_16_INTRA, ///< HEVC (H.265) Main 4:4:4 16 Intra
+ PROFILE_HEVC_MAIN_444_STILL, ///< HEVC (H.265) Main 4:4:4 Still Picture
+ PROFILE_HEVC_MAIN_444_16_STILL, ///< HEVC (H.265) Main 4:4:4 16 Still Picture
+ PROFILE_HEVC_HIGH_444 = _C2_PL_HEVC_BASE + 0x200, ///< HEVC (H.265) High Throughput 4:4:4
+ PROFILE_HEVC_HIGH_444_10, ///< HEVC (H.265) High Throughput 4:4:4 10
+ PROFILE_HEVC_HIGH_444_14, ///< HEVC (H.265) High Throughput 4:4:4 14
+ PROFILE_HEVC_HIGH_444_16_INTRA, ///< HEVC (H.265) High Throughput 4:4:4 16 Intra
+ PROFILE_HEVC_SX_MAIN = _C2_PL_HEVC_BASE + 0x300, ///< HEVC (H.265) Screen-Extended Main
+ PROFILE_HEVC_SX_MAIN_10, ///< HEVC (H.265) Screen-Extended Main 10
+ PROFILE_HEVC_SX_MAIN_444, ///< HEVC (H.265) Screen-Extended Main 4:4:4
+ PROFILE_HEVC_SX_MAIN_444_10, ///< HEVC (H.265) Screen-Extended Main 4:4:4 10
+ PROFILE_HEVC_SX_HIGH_444, ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4
+ PROFILE_HEVC_SX_HIGH_444_10, ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4 10
+ PROFILE_HEVC_SX_HIGH_444_14, ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4 14
+ PROFILE_HEVC_MULTIVIEW_MAIN = _C2_PL_HEVC_BASE + 0x400, ///< HEVC (H.265) Multiview Main
+ PROFILE_HEVC_SCALABLE_MAIN = _C2_PL_HEVC_BASE + 0x500, ///< HEVC (H.265) Scalable Main
+ PROFILE_HEVC_SCALABLE_MAIN_10, ///< HEVC (H.265) Scalable Main 10
+ PROFILE_HEVC_SCALABLE_MONO = _C2_PL_HEVC_BASE + 0x600, ///< HEVC (H.265) Scalable Monochrome
+ PROFILE_HEVC_SCALABLE_MONO_12, ///< HEVC (H.265) Scalable Monochrome 12
+ PROFILE_HEVC_SCALABLE_MONO_16, ///< HEVC (H.265) Scalable Monochrome 16
+ PROFILE_HEVC_SCALABLE_MAIN_444, ///< HEVC (H.265) Scalable Main 4:4:4
+ PROFILE_HEVC_3D_MAIN = _C2_PL_HEVC_BASE + 0x700, ///< HEVC (H.265) 3D Main
+
+ // VP9 profiles
+ PROFILE_VP9_0 = _C2_PL_VP9_BASE, ///< VP9 Profile 0 (4:2:0)
+ PROFILE_VP9_1, ///< VP9 Profile 1 (4:2:2 or 4:4:4)
+ PROFILE_VP9_2, ///< VP9 Profile 2 (4:2:0, 10 or 12 bit)
+ PROFILE_VP9_3, ///< VP9 Profile 3 (4:2:2 or 4:4:4, 10 or 12 bit)
+
+ // Dolby Vision profiles
+ PROFILE_DV_AV_PER = _C2_PL_DV_BASE + 0, ///< Dolby Vision dvav.per profile (deprecated)
+ PROFILE_DV_AV_PEN, ///< Dolby Vision dvav.pen profile (deprecated)
+ PROFILE_DV_HE_DER, ///< Dolby Vision dvhe.der profile (deprecated)
+ PROFILE_DV_HE_DEN, ///< Dolby Vision dvhe.den profile (deprecated)
+ PROFILE_DV_HE_04 = _C2_PL_DV_BASE + 4, ///< Dolby Vision dvhe.04 profile
+ PROFILE_DV_HE_05 = _C2_PL_DV_BASE + 5, ///< Dolby Vision dvhe.05 profile
+ PROFILE_DV_HE_DTH, ///< Dolby Vision dvhe.dth profile (deprecated)
+ PROFILE_DV_HE_07 = _C2_PL_DV_BASE + 7, ///< Dolby Vision dvhe.07 profile
+ PROFILE_DV_HE_08 = _C2_PL_DV_BASE + 8, ///< Dolby Vision dvhe.08 profile
+ PROFILE_DV_AV_09 = _C2_PL_DV_BASE + 9, ///< Dolby Vision dvav.09 profile
+};
+
+enum C2Config::level_t : uint32_t {
+ LEVEL_UNUSED = 0, ///< level is not used by this media type
+
+ // MPEG-2 Video levels
+ LEVEL_MP2V_LOW = _C2_PL_MP2V_BASE, ///< MPEG-2 Video (H.262) Low Level
+ LEVEL_MP2V_MAIN, ///< MPEG-2 Video (H.262) Main Level
+ LEVEL_MP2V_HIGH_1440, ///< MPEG-2 Video (H.262) High 1440 Level
+ LEVEL_MP2V_HIGH, ///< MPEG-2 Video (H.262) High Level
+ LEVEL_MP2V_HIGHP, ///< MPEG-2 Video (H.262) HighP Level
+
+ // H.263 levels
+ LEVEL_H263_10 = _C2_PL_H263_BASE, ///< H.263 Level 10
+ LEVEL_H263_20, ///< H.263 Level 20
+ LEVEL_H263_30, ///< H.263 Level 30
+ LEVEL_H263_40, ///< H.263 Level 40
+ LEVEL_H263_45, ///< H.263 Level 45
+ LEVEL_H263_50, ///< H.263 Level 50
+ LEVEL_H263_60, ///< H.263 Level 60
+ LEVEL_H263_70, ///< H.263 Level 70
+
+ // MPEG-4 Part 2 (Video) levels
+ LEVEL_MP4V_0 = _C2_PL_MP4V_BASE, ///< MPEG-4 Video Level 0
+ LEVEL_MP4V_0B, ///< MPEG-4 Video Level 0b
+ LEVEL_MP4V_1, ///< MPEG-4 Video Level 1
+ LEVEL_MP4V_2, ///< MPEG-4 Video Level 2
+ LEVEL_MP4V_3, ///< MPEG-4 Video Level 3
+ LEVEL_MP4V_3B, ///< MPEG-4 Video Level 3b
+ LEVEL_MP4V_4, ///< MPEG-4 Video Level 4
+ LEVEL_MP4V_4A, ///< MPEG-4 Video Level 4a
+ LEVEL_MP4V_5, ///< MPEG-4 Video Level 5
+ LEVEL_MP4V_6, ///< MPEG-4 Video Level 6
+
+ // AVC / MPEG-4 Part 10 (H.264) levels
+ LEVEL_AVC_1 = _C2_PL_AVC_BASE, ///< AVC (H.264) Level 1
+ LEVEL_AVC_1B, ///< AVC (H.264) Level 1b
+ LEVEL_AVC_1_1, ///< AVC (H.264) Level 1.1
+ LEVEL_AVC_1_2, ///< AVC (H.264) Level 1.2
+ LEVEL_AVC_1_3, ///< AVC (H.264) Level 1.3
+ LEVEL_AVC_2, ///< AVC (H.264) Level 2
+ LEVEL_AVC_2_1, ///< AVC (H.264) Level 2.1
+ LEVEL_AVC_2_2, ///< AVC (H.264) Level 2.2
+ LEVEL_AVC_3, ///< AVC (H.264) Level 3
+ LEVEL_AVC_3_1, ///< AVC (H.264) Level 3.1
+ LEVEL_AVC_3_2, ///< AVC (H.264) Level 3.2
+ LEVEL_AVC_4, ///< AVC (H.264) Level 4
+ LEVEL_AVC_4_1, ///< AVC (H.264) Level 4.1
+ LEVEL_AVC_4_2, ///< AVC (H.264) Level 4.2
+ LEVEL_AVC_5, ///< AVC (H.264) Level 5
+ LEVEL_AVC_5_1, ///< AVC (H.264) Level 5.1
+ LEVEL_AVC_5_2, ///< AVC (H.264) Level 5.2
+
+ // HEVC (H.265) tiers and levels
+ LEVEL_HEVC_MAIN_1 = _C2_PL_HEVC_BASE, ///< HEVC (H.265) Main Tier Level 1
+ LEVEL_HEVC_MAIN_2, ///< HEVC (H.265) Main Tier Level 2
+ LEVEL_HEVC_MAIN_2_1, ///< HEVC (H.265) Main Tier Level 2.1
+ LEVEL_HEVC_MAIN_3, ///< HEVC (H.265) Main Tier Level 3
+ LEVEL_HEVC_MAIN_3_1, ///< HEVC (H.265) Main Tier Level 3.1
+ LEVEL_HEVC_MAIN_4, ///< HEVC (H.265) Main Tier Level 4
+ LEVEL_HEVC_MAIN_4_1, ///< HEVC (H.265) Main Tier Level 4.1
+ LEVEL_HEVC_MAIN_5, ///< HEVC (H.265) Main Tier Level 5
+ LEVEL_HEVC_MAIN_5_1, ///< HEVC (H.265) Main Tier Level 5.1
+ LEVEL_HEVC_MAIN_5_2, ///< HEVC (H.265) Main Tier Level 5.2
+ LEVEL_HEVC_MAIN_6, ///< HEVC (H.265) Main Tier Level 6
+ LEVEL_HEVC_MAIN_6_1, ///< HEVC (H.265) Main Tier Level 6.1
+ LEVEL_HEVC_MAIN_6_2, ///< HEVC (H.265) Main Tier Level 6.2
+
+ LEVEL_HEVC_HIGH_4 = _C2_PL_HEVC_BASE + 0x100, ///< HEVC (H.265) High Tier Level 4
+ LEVEL_HEVC_HIGH_4_1, ///< HEVC (H.265) High Tier Level 4.1
+ LEVEL_HEVC_HIGH_5, ///< HEVC (H.265) High Tier Level 5
+ LEVEL_HEVC_HIGH_5_1, ///< HEVC (H.265) High Tier Level 5.1
+ LEVEL_HEVC_HIGH_5_2, ///< HEVC (H.265) High Tier Level 5.2
+ LEVEL_HEVC_HIGH_6, ///< HEVC (H.265) High Tier Level 6
+ LEVEL_HEVC_HIGH_6_1, ///< HEVC (H.265) High Tier Level 6.1
+ LEVEL_HEVC_HIGH_6_2, ///< HEVC (H.265) High Tier Level 6.2
+
+ // VP9 levels
+ LEVEL_VP9_1 = _C2_PL_VP9_BASE, ///< VP9 Level 1
+ LEVEL_VP9_1_1, ///< VP9 Level 1.1
+ LEVEL_VP9_2, ///< VP9 Level 2
+ LEVEL_VP9_2_1, ///< VP9 Level 2.1
+ LEVEL_VP9_3, ///< VP9 Level 3
+ LEVEL_VP9_3_1, ///< VP9 Level 3.1
+ LEVEL_VP9_4, ///< VP9 Level 4
+ LEVEL_VP9_4_1, ///< VP9 Level 4.1
+ LEVEL_VP9_5, ///< VP9 Level 5
+ LEVEL_VP9_5_1, ///< VP9 Level 5.1
+ LEVEL_VP9_5_2, ///< VP9 Level 5.2
+ LEVEL_VP9_6, ///< VP9 Level 6
+ LEVEL_VP9_6_1, ///< VP9 Level 6.1
+ LEVEL_VP9_6_2, ///< VP9 Level 6.2
+
+ // Dolby Vision level
+ LEVEL_DV_MAIN_HD_24 = _C2_PL_DV_BASE, ///< Dolby Vision main tier hd24
+ LEVEL_DV_MAIN_HD_30, ///< Dolby Vision main tier hd30
+ LEVEL_DV_MAIN_FHD_24, ///< Dolby Vision main tier fhd24
+ LEVEL_DV_MAIN_FHD_30, ///< Dolby Vision main tier fhd30
+ LEVEL_DV_MAIN_FHD_60, ///< Dolby Vision main tier fhd60
+ LEVEL_DV_MAIN_UHD_24, ///< Dolby Vision main tier uhd24
+ LEVEL_DV_MAIN_UHD_30, ///< Dolby Vision main tier uhd30
+ LEVEL_DV_MAIN_UHD_48, ///< Dolby Vision main tier uhd48
+ LEVEL_DV_MAIN_UHD_60, ///< Dolby Vision main tier uhd60
+
+ LEVEL_DV_HIGH_HD_24 = _C2_PL_DV_BASE + 0x100, ///< Dolby Vision high tier hd24
+ LEVEL_DV_HIGH_HD_30, ///< Dolby Vision high tier hd30
+ LEVEL_DV_HIGH_FHD_24, ///< Dolby Vision high tier fhd24
+ LEVEL_DV_HIGH_FHD_30, ///< Dolby Vision high tier fhd30
+ LEVEL_DV_HIGH_FHD_60, ///< Dolby Vision high tier fhd60
+ LEVEL_DV_HIGH_UHD_24, ///< Dolby Vision high tier uhd24
+ LEVEL_DV_HIGH_UHD_30, ///< Dolby Vision high tier uhd30
+ LEVEL_DV_HIGH_UHD_48, ///< Dolby Vision high tier uhd48
+ LEVEL_DV_HIGH_UHD_60, ///< Dolby Vision high tier uhd60
+};
+
+struct C2ProfileLevelStruct {
+ C2Config::profile_t profile; ///< coding profile
+ C2Config::level_t level; ///< coding level
+
+ C2ProfileLevelStruct(
+ C2Config::profile_t profile_ = C2Config::PROFILE_UNUSED,
+ C2Config::level_t level_ = C2Config::LEVEL_UNUSED)
+ : profile(profile_), level(level_) { }
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(ProfileLevel)
+ C2FIELD(profile, "profile")
+ C2FIELD(level, "level")
+};
+
+// TODO: may need to make this explicit (have .set member)
+typedef C2StreamParam<C2Info, C2ProfileLevelStruct, kParamIndexProfileLevel>
+ C2StreamProfileLevelInfo;
+constexpr char C2_PARAMKEY_PROFILE_LEVEL[] = "coded.pl";
+#define C2_PARAMKEY_STREAM_PROFILE_LEVEL C2_PARAMKEY_PROFILE_LEVEL
+
+/**
+ * Codec-specific initialization data.
+ *
+ * This is initialization data for the codec.
+ *
+ * For AVC/HEVC, these are the concatenated SPS/PPS/VPS NALs.
+ *
+ * TODO: define for other codecs.
+ */
+typedef C2StreamParam<C2Info, C2BlobValue, kParamIndexInitData> C2StreamInitDataInfo;
+typedef C2StreamInitDataInfo C2StreamCsdInfo; // deprecated
+constexpr char C2_PARAMKEY_INIT_DATA[] = "coded.init-data";
+#define C2_PARAMKEY_STREAM_INIT_DATA C2_PARAMKEY_INIT_DATA
+
+/**
+ * Supplemental Data.
+ *
+ * This is coding-specific supplemental informational data, e.g. SEI for AVC/HEVC.
+ * This structure is not a configuration so it does not have a parameter key.
+ * This structure shall be returned in the configuration update, and can be repeated as needed
+ * in the same update.
+ */
+C2ENUM(C2Config::supplemental_info_t, uint32_t,
+ INFO_NONE = 0,
+
+ INFO_PREFIX_SEI_UNIT = 0x10000, ///< prefix SEI payload types add this flag
+ INFO_SUFFIX_SEI_UNIT = 0x20000, ///< suffix SEI payload types add this flag
+
+ INFO_SEI_USER_DATA = INFO_PREFIX_SEI_UNIT | 4, ///< closed-captioning data (ITU-T T35)
+ INFO_SEI_MDCV = INFO_PREFIX_SEI_UNIT | 137, ///< mastering display color volume
+ INFO_SET_USER_DATA_SFX = INFO_SUFFIX_SEI_UNIT | 4, ///< closed-captioning data (ITU-T T35)
+
+ INFO_VENDOR_START = 0x70000000
+)
+
+struct C2SupplementalDataStruct {
+ C2SupplementalDataStruct()
+ : type_(INFO_NONE) { }
+
+ C2SupplementalDataStruct(
+ size_t flexCount, C2Config::supplemental_info_t type, std::vector<uint8_t> data_)
+ : type_(type) {
+ memcpy(data, &data_[0], c2_min(data_.size(), flexCount));
+ }
+
+ C2Config::supplemental_info_t type_;
+ uint8_t data[];
+
+ DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(SupplementalData, data)
+ C2FIELD(type_, "type")
+ C2FIELD(data, "data")
+};
+typedef C2StreamParam<C2Info, C2SupplementalDataStruct, kParamIndexSupplementalData>
+ C2StreamSupplementalDataInfo;
+
+/**
+ * Supplemental Data Subscription
+ */
+typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2Config::supplemental_info_t>,
+ kParamIndexSubscribedSupplementalData>
+ C2StreamSubscribedSupplementalDataTuning;
+constexpr char C2_PARAMKEY_SUBSCRIBED_SUPPLEMENTAL_DATA[] = "output.subscribed-supplemental";
+
+/* ---------------------------------- pipeline characteristics ---------------------------------- */
+
+/**
+ * Media-type.
+ *
+ * This is defined for both port and stream, but stream media type may be a subtype of the
+ * port media type.
+ */
+typedef C2PortParam<C2Setting, C2StringValue, kParamIndexMediaType> C2PortMediaTypeSetting;
+typedef C2PortMediaTypeSetting C2PortMimeConfig; // deprecated
+constexpr char C2_PARAMKEY_INPUT_MEDIA_TYPE[] = "input.media-type";
+constexpr char C2_PARAMKEY_OUTPUT_MEDIA_TYPE[] = "output.media-type";
+#define C2_NAME_INPUT_PORT_MIME_SETTING C2_PARAMKEY_INPUT_MEDIA_TYPE
+#define C2_NAME_OUTPUT_PORT_MIME_SETTING C2_PARAMKEY_OUTPUT_MEDIA_TYPE
+
+typedef C2StreamParam<C2Setting, C2StringValue, kParamIndexMediaType> C2StreamMediaTypeSetting;
+
+/**
+ * Pipeline delays.
+ *
+ * Input delay is the number of additional input frames requested by the component to process
+ * an input frame.
+ *
+ * Output delay is the number of additional output frames that need to be generated before an
+ * output can be released by the component.
+ *
+ * Pipeline delay is the number of additional frames that are processed at one time by the
+ * component.
+ *
+ * As these may vary from frame to frame, the number is the maximum required value. E.g. if
+ * input delay is 0, the component is expected to consume each frame queued even if no further
+ * frames are queued. Similarly, if input delay is 1, as long as there are always exactly 2
+ * outstanding input frames queued to the component, it shall produce output.
+ */
+
+typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexDelayRequest> C2PortRequestedDelayTuning;
+typedef C2PortRequestedDelayTuning C2PortRequestedLatencyTuning; // deprecated
+constexpr char C2_PARAMKEY_INPUT_DELAY_REQUEST[] = "input.delay.requested";
+constexpr char C2_PARAMKEY_OUTPUT_DELAY_REQUEST[] = "output.delay.requested";
+
+typedef C2GlobalParam<C2Tuning, C2Uint32Value, kParamIndexDelayRequest>
+ C2RequestedPipelineDelayTuning;
+typedef C2RequestedPipelineDelayTuning C2ComponentRequestedLatencyTuning; // deprecated
+constexpr char C2_PARAMKEY_PIPELINE_DELAY_REQUEST[] = "pipeline-delay.requested";
+
+// read-only
+typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexDelay> C2PortActualDelayTuning;
+typedef C2PortActualDelayTuning C2PortLatencyInfo; // deprecated
+constexpr char C2_PARAMKEY_INPUT_DELAY[] = "input.delay.actual";
+constexpr char C2_PARAMKEY_OUTPUT_DELAY[] = "output.delay.actual";
+
+// read-only
+typedef C2GlobalParam<C2Tuning, C2Uint32Value, kParamIndexDelay> C2ActualPipelineDelayTuning;
+typedef C2ActualPipelineDelayTuning C2ComponentLatencyInfo; // deprecated
+constexpr char C2_PARAMKEY_PIPELINE_DELAY[] = "algo.delay.actual";
+
+/**
+ * Reference characteristics.
+ *
+ * The component may hold onto input and output buffers even after completing the corresponding
+ * work item.
+ *
+ * Max reference age is the longest number of additional frame processing that a component may
+ * hold onto a buffer for. Max reference count is the number of buffers that a component may
+ * hold onto at the same time at the worst case. These numbers assume single frame per buffers.
+ *
+ * Use max-uint32 if there is no limit for the max age or count.
+ */
+typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexMaxReferenceAge>
+ C2StreamMaxReferenceAgeTuning;
+constexpr char C2_PARAMKEY_INPUT_MAX_REFERENCE_AGE[] = "input.reference.max-age";
+constexpr char C2_PARAMKEY_OUTPUT_MAX_REFERENCE_AGE[] = "output.reference.max-age";
+
+typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexMaxReferenceCount>
+ C2StreamMaxReferenceCountTuning;
+constexpr char C2_PARAMKEY_INPUT_MAX_REFERENCE_COUNT[] = "input.reference.max-count";
+constexpr char C2_PARAMKEY_OUTPUT_MAX_REFERENCE_COUNT[] = "output.reference.max-count";
+
+/**
+ * Output reordering.
+ *
+ * The size of the window to use for output buffer reordering. 0 is interpreted as 1.
+ */
+// output only
+typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexReorderBufferDepth>
+ C2PortReorderBufferDepthTuning;
+constexpr char C2_PARAMKEY_OUTPUT_REORDER_DEPTH[] = "output.reorder.depth";
+
+C2ENUM(C2Config::ordinal_key_t, uint32_t,
+ ORDINAL,
+ TIMESTAMP,
+ CUSTOM)
+
+// read-only, output only
+typedef C2PortParam<C2Setting, C2SimpleValueStruct<C2Config::ordinal_key_t>, kParamIndexReorderKey>
+ C2PortReorderKeySetting;
+constexpr char C2_PARAMKEY_OUTPUT_REORDER_KEY[] = "output.reorder.key";
+
+/**
+ * Stream count.
+ */
+// private
+typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexStreamCount> C2PortStreamCountTuning;
+typedef C2PortStreamCountTuning C2PortStreamCountConfig; // deprecated
+constexpr char C2_PARAMKEY_INPUT_STREAM_COUNT[] = "input.stream-count";
+constexpr char C2_PARAMKEY_OUTPUT_STREAM_COUNT[] = "output.stream-count";
+
+/**
+ * Config update subscription.
+ */
+// private
+typedef C2GlobalParam<C2Tuning, C2Uint32Array, kParamIndexSubscribedParamIndices>
+ C2SubscribedParamIndicesTuning;
+constexpr char C2_PARAMKEY_SUBSCRIBED_PARAM_INDICES[] = "output.subscribed-indices";
+
+/**
+ * Suggested buffer (C2Frame) count. This is a suggestion by the component for the number of
+ * input and output frames allocated for the component's use in the buffer pools.
+ *
+ * Component shall set the acceptable range of buffers allocated for it. E.g. client shall
+ * allocate at least the minimum required value.
+ */
+// read-only
+typedef C2PortParam<C2Tuning, C2Uint64Array, kParamIndexSuggestedBufferCount>
+ C2PortSuggestedBufferCountTuning;
+constexpr char C2_PARAMKEY_INPUT_SUGGESTED_BUFFER_COUNT[] = "input.buffers.pool-size";
+constexpr char C2_PARAMKEY_OUTPUT_SUGGESTED_BUFFER_COUNT[] = "output.buffers.pool-size";
+
+/**
+ * Input/output batching.
+ *
+ * For input, component requests that client batches work in batches of specified size. For output,
+ * client requests that the component batches work completion in given batch size.
+ * Value 0 means don't care.
+ */
+typedef C2PortParam<C2Tuning, C2Uint64Array, kParamIndexBatchSize> C2PortBatchSizeTuning;
+constexpr char C2_PARAMKEY_INPUT_BATCH_SIZE[] = "input.buffers.batch-size";
+constexpr char C2_PARAMKEY_OUTPUT_BATCH_SIZE[] = "output.buffers.batch-size";
+
+/**
+ * Current & last work ordinals.
+ *
+ * input port: last work queued to component.
+ * output port: last work completed by component.
+ * global: current work.
+ */
+typedef C2PortParam<C2Tuning, C2WorkOrdinalStruct, kParamIndexLastWorkQueued> C2LastWorkQueuedTuning;
+typedef C2GlobalParam<C2Tuning, C2WorkOrdinalStruct, kParamIndexCurrentWork> C2CurrentWorkTuning;
+
+
+/* ------------------------------------- memory allocation ------------------------------------- */
+
+/**
+ * Allocators to use.
+ *
+ * These are requested by the component.
+ *
+ * If none specified, client will use the default allocator ID based on the component domain and
+ * kind.
+ */
+typedef C2PortParam<C2Tuning, C2SimpleArrayStruct<C2Allocator::id_t>, kParamIndexAllocators>
+ C2PortAllocatorsTuning;
+constexpr char C2_PARAMKEY_INPUT_ALLOCATORS[] = "input.buffers.allocator-ids";
+constexpr char C2_PARAMKEY_OUTPUT_ALLOCATORS[] = "output.buffers.allocator-ids";
+
+typedef C2GlobalParam<C2Tuning, C2SimpleArrayStruct<C2Allocator::id_t>, kParamIndexAllocators>
+ C2PrivateAllocatorsTuning;
+constexpr char C2_PARAMKEY_PRIVATE_ALLOCATORS[] = "algo.buffers.allocator-ids";
+
+/**
+ * Allocator to use for outputting to surface.
+ *
+ * Components can optionally request allocator type for outputting to surface.
+ *
+ * If none specified, client will use the default BufferQueue-backed allocator ID for outputting to
+ * surface.
+ */
+typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexSurfaceAllocator>
+ C2PortSurfaceAllocatorTuning;
+constexpr char C2_PARAMKEY_OUTPUT_SURFACE_ALLOCATOR[] = "output.buffers.surface-allocator-id";
+
+/**
+ * Block pools to use.
+ *
+ * These are allocated by the client for the component using the allocator IDs specified by the
+ * component. This is not used for the input port.
+ */
+typedef C2PortParam<C2Tuning, C2SimpleArrayStruct<C2BlockPool::local_id_t>, kParamIndexBlockPools>
+ C2PortBlockPoolsTuning;
+constexpr char C2_PARAMKEY_OUTPUT_BLOCK_POOLS[] = "output.buffers.pool-ids";
+
+typedef C2GlobalParam<C2Tuning, C2SimpleArrayStruct<C2BlockPool::local_id_t>, kParamIndexBlockPools>
+ C2PrivateBlockPoolsTuning;
+constexpr char C2_PARAMKEY_PRIVATE_BLOCK_POOLS[] = "algo.buffers.pool-ids";
+
+/**
+ * The max number of private allocations at any one time by the component.
+ * (This is an array with a corresponding value for each private allocator)
+ */
+typedef C2GlobalParam<C2Tuning, C2Uint32Array, kParamIndexMaxReferenceCount>
+ C2MaxPrivateBufferCountTuning;
+constexpr char C2_PARAMKEY_MAX_PRIVATE_BUFFER_COUNT[] = "algo.buffers.max-count";
+
+/**
+ * Buffer type
+ *
+ * This is provided by the component for the client to allocate the proper buffer type for the
+ * input port, and can be provided by the client to control the buffer type for the output.
+ */
+// private
+typedef C2StreamParam<C2Setting, C2SimpleValueStruct<C2EasyEnum<C2BufferData::type_t>>,
+ kParamIndexBufferType>
+ C2StreamBufferTypeSetting;
+
+constexpr C2BufferData::type_t C2FormatAudio = C2BufferData::LINEAR; // deprecated
+constexpr C2BufferData::type_t C2FormatCompressed = C2BufferData::LINEAR; // deprecated
+constexpr C2BufferData::type_t C2FormatVideo = C2BufferData::GRAPHIC; // deprecated
+typedef C2BufferData::type_t C2FormatKind; // deprecated
+
+typedef C2StreamBufferTypeSetting C2StreamFormatConfig; // deprecated
+constexpr char C2_PARAMKEY_INPUT_STREAM_BUFFER_TYPE[] = "input.buffers.type";
+constexpr char C2_PARAMKEY_OUTPUT_STREAM_BUFFER_TYPE[] = "output.buffers.type";
+
+// deprecated
+#define C2_NAME_INPUT_STREAM_FORMAT_SETTING C2_PARAMKEY_INPUT_STREAM_BUFFER_TYPE
+#define C2_NAME_OUTPUT_STREAM_FORMAT_SETTING C2_PARAMKEY_OUTPUT_STREAM_BUFFER_TYPE
+
+/**
+ * Memory usage.
+ *
+ * Suggested by component for input and negotiated between client and component for output.
+ */
+typedef C2StreamParam<C2Tuning, C2Uint64Value, kParamIndexUsage> C2StreamUsageTuning;
+constexpr char C2_PARAMKEY_INPUT_STREAM_USAGE[] = "input.buffers.usage";
+constexpr char C2_PARAMKEY_OUTPUT_STREAM_USAGE[] = "output.buffers.usage";
+// deprecated
+#define C2_NAME_INPUT_STREAM_USAGE_SETTING C2_PARAMKEY_INPUT_STREAM_USAGE
+
+/**
+ * Picture (video or image frame) size.
+ */
+struct C2PictureSizeStruct {
+ inline C2PictureSizeStruct()
+ : width(0), height(0) { }
+
+ inline C2PictureSizeStruct(uint32_t width_, uint32_t height_)
+ : width(width_), height(height_) { }
+
+ uint32_t width; ///< video width
+ uint32_t height; ///< video height
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(PictureSize)
+ C2FIELD(width, "width")
+ C2FIELD(height, "height")
+};
+
+/**
+ * Out of memory signaling
+ *
+ * This is a configuration for the client to mark that it cannot allocate necessary private and/
+ * or output buffers to continue operation, and to signal the failing configuration.
+ */
+struct C2OutOfMemoryStruct {
+ C2BlockPool::local_id_t pool; ///< pool ID that failed the allocation
+ uint64_t usage; ///< memory usage used
+ C2PictureSizeStruct planar; ///< buffer dimensions to be allocated if 2D
+ uint32_t format; ///< pixel format to be used if 2D
+ uint32_t capacity; ///< buffer capacity to be allocated if 1D
+ c2_bool_t outOfMemory; ///< true if component is out of memory
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(OutOfMemory)
+ C2FIELD(pool, "pool")
+ C2FIELD(usage, "usage")
+ C2FIELD(planar, "planar")
+ C2FIELD(format, "format")
+ C2FIELD(capacity, "capacity")
+ C2FIELD(outOfMemory, "out-of-memory")
+};
+
+typedef C2GlobalParam<C2Tuning, C2OutOfMemoryStruct, kParamIndexOutOfMemory> C2OutOfMemoryTuning;
+constexpr char C2_PARAMKEY_OUT_OF_MEMORY[] = "algo.oom";
+
+/**
+ * Max buffer size
+ *
+ * This is a hint provided by the component for the maximum buffer size expected on a stream for the
+ * current configuration on its input and output streams. This is communicated to clients so they
+ * can preallocate input buffers, or configure downstream components that require a maximum size on
+ * their buffers.
+ *
+ * Read-only. Required to be provided by components on all compressed streams.
+ */
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexMaxBufferSize> C2StreamMaxBufferSizeInfo;
+constexpr char C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE[] = "input.buffers.max-size";
+constexpr char C2_PARAMKEY_OUTPUT_MAX_BUFFER_SIZE[] = "output.buffers.max-size";
+
+#define C2_NAME_STREAM_MAX_BUFFER_SIZE_SETTING C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE
+
+/* ---------------------------------------- misc. state ---------------------------------------- */
+
+/**
+ * Tripped state,
+ *
+ * This state exists to be able to provide reasoning for a tripped state during normal
+ * interface operations, as well as to allow client to trip the component on demand.
+ */
+typedef C2GlobalParam<C2Tuning, C2BoolValue, kParamIndexTripped>
+ C2TrippedTuning;
+constexpr char C2_PARAMKEY_TRIPPED[] = "algo.tripped";
+
+/**
+ * Configuration counters.
+ *
+ * Configurations are tracked using three counters. The input counter is incremented exactly
+ * once with each work accepted by the component. The output counter is incremented exactly
+ * once with each work completed by the component (in the order of work completion). The
+ * global counter is incremented exactly once during to each config() call. These counters
+ * shall be read-only.
+ *
+ * TODO: these should be counters.
+ */
+typedef C2PortParam<C2Tuning, C2Uint64Value, kParamIndexConfigCounter> C2PortConfigCounterTuning;
+typedef C2GlobalParam<C2Tuning, C2Uint64Value, kParamIndexConfigCounter> C2ConfigCounterTuning;
+constexpr char C2_PARAMKEY_INPUT_COUNTER[] = "input.buffers.counter";
+constexpr char C2_PARAMKEY_OUTPUT_COUNTER[] = "output.buffers.counter";
+constexpr char C2_PARAMKEY_CONFIG_COUNTER[] = "algo.config.counter";
+
+/* ----------------------------------------- resources ----------------------------------------- */
+
+/**
+ * Resources needed and resources reserved for current configuration.
+ *
+ * Resources are tracked as a vector of positive numbers. Available resources are defined by
+ * the vendor.
+ *
+ * By default, no resources are reserved for a component. If resource reservation is successful,
+ * the component shall be able to use those resources exclusively. If however, the component is
+ * not using all of the reserved resources, those may be shared with other components.
+ *
+ * TODO: define some of the resources.
+ */
+typedef C2GlobalParam<C2Tuning, C2Uint64Array, kParamIndexResourcesNeeded> C2ResourcesNeededTuning;
+typedef C2GlobalParam<C2Tuning, C2Uint64Array, kParamIndexResourcesReserved>
+ C2ResourcesReservedTuning;
+constexpr char C2_PARAMKEY_RESOURCES_NEEDED[] = "resources.needed";
+constexpr char C2_PARAMKEY_RESOURCES_RESERVED[] = "resources.reserved";
+
+/**
+ * Operating rate.
+ *
+ * Operating rate is the expected rate of work through the component. Negative values is
+ * invalid.
+ *
+ * TODO: this could distinguish set value
+ */
+typedef C2GlobalParam<C2Tuning, C2FloatValue, kParamIndexOperatingRate> C2OperatingRateTuning;
+constexpr char C2_PARAMKEY_OPERATING_RATE[] = "algo.rate";
+
+/**
+ * Realtime / operating point.
+ *
+ * Priority value defines the operating point for the component. Operating points are defined by
+ * the vendor. Priority value of 0 means that the client requires operation at the given operating
+ * rate. Priority values -1 and below define operating points in decreasing performance. In this
+ * case client expects best effort without exceeding the specific operating point. This allows
+ * client to run components deeper in the background by using larger priority values. In these
+ * cases operating rate is a hint for the maximum rate that the client anticipates.
+ *
+ * Operating rate and priority are used in tandem. E.g. if there are components that run at a
+ * higher operating point (priority) it will make more resources available for components at
+ * a lower operating point, so operating rate can be used to gate those components.
+ *
+ * Positive priority values are not defined at the moment and shall be treated equivalent to 0.
+ */
+typedef C2GlobalParam<C2Tuning, C2Int32Value, kParamIndexRealTimePriority>
+ C2RealTimePriorityTuning;
+constexpr char C2_PARAMKEY_PRIORITY[] = "algo.priority";
+
+/* ------------------------------------- protected content ------------------------------------- */
+
+/**
+ * Secure mode.
+ */
+C2ENUM(C2Config::secure_mode_t, uint32_t,
+ SM_UNPROTECTED, ///< no content protection
+ SM_READ_PROTECTED, ///< input and output buffers shall be protected from reading
+)
+
+typedef C2GlobalParam<C2Tuning, C2SimpleValueStruct<C2Config::secure_mode_t>, kParamIndexSecureMode>
+ C2SecureModeTuning;
+constexpr char C2_PARAMKEY_SECURE_MODE[] = "algo.secure-mode";
+
+/* ===================================== ENCODER COMPONENTS ===================================== */
+
+/**
+ * Bitrate
+ */
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexBitrate> C2StreamBitrateInfo;
+typedef C2StreamBitrateInfo C2BitrateTuning; // deprecated
+constexpr char C2_PARAMKEY_BITRATE[] = "coded.bitrate";
+#define C2_NAME_STREAM_BITRATE_SETTING C2_PARAMKEY_BITRATE
+
+/**
+ * Bitrate mode.
+ *
+ * TODO: refine this with bitrate ranges and suggested window
+ */
+C2ENUM(C2Config::bitrate_mode_t, uint32_t,
+ BITRATE_CONST_SKIP_ALLOWED = 0, ///< constant bitrate, frame skipping allowed
+ BITRATE_CONST = 1, ///< constant bitrate, keep all frames
+ BITRATE_VARIABLE_SKIP_ALLOWED = 2, ///< bitrate can vary, frame skipping allowed
+ BITRATE_VARIABLE = 3, ///< bitrate can vary, keep all frames
+ BITRATE_IGNORE = 7, ///< bitrate can be exceeded at will to achieve
+ ///< quality or other settings
+
+ // bitrate modes are composed of the following flags
+ BITRATE_FLAG_KEEP_ALL_FRAMES = 1,
+ BITRATE_FLAG_CAN_VARY = 2,
+ BITRATE_FLAG_CAN_EXCEED = 4,
+)
+
+typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2Config::bitrate_mode_t>,
+ kParamIndexBitrateMode>
+ C2StreamBitrateModeTuning;
+constexpr char C2_PARAMKEY_BITRATE_MODE[] = "algo.bitrate-mode";
+
+/**
+ * Quality.
+ *
+ * This is defined by each component, the higher the better the output quality at the expense of
+ * less compression efficiency. This setting is defined for the output streams in case the
+ * component can support varying quality on each stream, or as an output port tuning in case the
+ * quality is global to all streams.
+ */
+typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexQuality> C2StreamQualityTuning;
+typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexQuality> C2QualityTuning;
+constexpr char C2_PARAMKEY_QUALITY[] = "algo.quality";
+
+/**
+ * Complexity.
+ *
+ * This is defined by each component, this higher the value, the more resources the component
+ * will use to produce better quality at the same compression efficiency or better compression
+ * efficiency at the same quality. This setting is defined for the output streams in case the
+ * component can support varying complexity on each stream, or as an output port tuning in case the
+ * quality is global to all streams
+ */
+typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexComplexity> C2StreamComplexityTuning;
+typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexComplexity> C2ComplexityTuning;
+constexpr char C2_PARAMKEY_COMPLEXITY[] = "algo.complexity";
+
+/**
+ * Header (init-data) handling around sync frames.
+ */
+C2ENUM(C2Config::prepend_header_mode_t, uint32_t,
+ /**
+ * don't prepend header. Signal header only through C2StreamInitDataInfo.
+ */
+ PREPEND_HEADER_TO_NONE,
+
+ /**
+ * prepend header before the first output frame and thereafter before the next sync frame
+ * if it changes.
+ */
+ PREPEND_HEADER_ON_CHANGE,
+
+ /**
+ * prepend header before every sync frame.
+ */
+ PREPEND_HEADER_TO_ALL_SYNC,
+)
+
+typedef C2GlobalParam<C2Setting, C2BoolValue, kParamIndexPrependHeaderMode>
+ C2PrependHeaderModeSetting;
+constexpr char C2_PARAMKEY_PREPEND_HEADER_MODE[] = "output.buffers.prepend-header";
+
+/* =================================== IMAGE/VIDEO COMPONENTS =================================== */
+
+/*
+ * Order of transformation is:
+ *
+ * crop => (scaling => scaled-crop) => sample-aspect-ratio => flip => rotation
+ */
+
+/**
+ * Picture (image- and video frame) size.
+ *
+ * This is used for the output of the video decoder, and the input of the video encoder.
+ */
+typedef C2PictureSizeStruct C2VideoSizeStruct; // deprecated
+
+typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexPictureSize> C2StreamPictureSizeInfo;
+constexpr char C2_PARAMKEY_PICTURE_SIZE[] = "raw.size";
+#define C2_PARAMKEY_STREAM_PICTURE_SIZE C2_PARAMKEY_PICTURE_SIZE
+#define C2_NAME_STREAM_VIDEO_SIZE_INFO C2_PARAMKEY_PICTURE_SIZE
+typedef C2StreamPictureSizeInfo C2VideoSizeStreamInfo; // deprecated
+typedef C2StreamPictureSizeInfo C2VideoSizeStreamTuning; // deprecated
+#define C2_NAME_STREAM_VIDEO_SIZE_SETTING C2_PARAMKEY_PICTURE_SIZE
+
+/**
+ * Crop rectangle.
+ */
+struct C2RectStruct : C2Rect {
+ C2RectStruct() = default;
+ C2RectStruct(const C2Rect &rect) : C2Rect(rect) { }
+
+ bool operator==(const C2RectStruct &) = delete;
+ bool operator!=(const C2RectStruct &) = delete;
+
+ DEFINE_AND_DESCRIBE_BASE_C2STRUCT(Rect)
+ C2FIELD(width, "width")
+ C2FIELD(height, "height")
+ C2FIELD(left, "left")
+ C2FIELD(top, "top")
+};
+
+typedef C2StreamParam<C2Info, C2RectStruct, kParamIndexCropRect> C2StreamCropRectInfo;
+constexpr char C2_PARAMKEY_CROP_RECT[] = "raw.crop";
+constexpr char C2_PARAMKEY_CODED_CROP_RECT[] = "coded.crop";
+
+/**
+ * Pixel format.
+ */
+// TODO: define some
+
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexPixelFormat> C2StreamPixelFormatInfo;
+constexpr char C2_PARAMKEY_PIXEL_FORMAT[] = "raw.pixel-format";
+
+/**
+ * Extended rotation information also incorporating a flip.
+ *
+ * Rotation is counter clock-wise.
+ */
+struct C2RotationStruct {
+ C2RotationStruct(int32_t rotation = 0)
+ : flip(0), value(rotation) { }
+
+ int32_t flip; ///< horizontal flip (left-right flip applied prior to rotation)
+ int32_t value; ///< rotation in degrees counter clockwise
+
+ DEFINE_AND_DESCRIBE_BASE_C2STRUCT(Rotation)
+ C2FIELD(flip, "flip")
+ C2FIELD(value, "value")
+};
+
+typedef C2StreamParam<C2Info, C2RotationStruct, kParamIndexRotation> C2StreamRotationInfo;
+constexpr char C2_PARAMKEY_ROTATION[] = "raw.rotation";
+constexpr char C2_PARAMKEY_VUI_ROTATION[] = "coded.vui.rotation";
+
+/**
+ * Pixel (sample) aspect ratio.
+ */
+typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexPixelAspectRatio>
+ C2StreamPixelAspectRatioInfo;
+constexpr char C2_PARAMKEY_PIXEL_ASPECT_RATIO[] = "raw.sar";
+constexpr char C2_PARAMKEY_VUI_PIXEL_ASPECT_RATIO[] = "coded.vui.sar";
+
+/**
+ * In-line scaling.
+ *
+ * Components can optionally support scaling of raw image/video frames. Or scaling only a
+ * portion of raw image/video frames (scaled-crop).
+ */
+
+C2ENUM(C2Config::scaling_method_t, uint32_t,
+ SCALING_ARBITRARY, ///< arbitrary, unspecified
+)
+
+typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2Config::scaling_method_t>,
+ kParamIndexScalingMethod>
+ C2StreamScalingMethodTuning;
+constexpr char C2_PARAMKEY_SCALING_MODE[] = "raw.scaling-method";
+#define C2_PARAMKEY_STREAM_SCALING_MODE C2_PARAMKEY_SCALING_MODE
+
+typedef C2StreamParam<C2Tuning, C2PictureSizeStruct, kParamIndexScaledPictureSize>
+ C2StreamScaledPictureSizeTuning;
+constexpr char C2_PARAMKEY_SCALED_PICTURE_SIZE[] = "raw.scaled-size";
+#define C2_PARAMKEY_STREAM_SCALED_PICTURE_SIZE C2_PARAMKEY_SCALED_PICTURE_SIZE
+
+typedef C2StreamParam<C2Tuning, C2RectStruct, kParamIndexScaledCropRect>
+ C2StreamScaledCropRectTuning;
+constexpr char C2_PARAMKEY_SCALED_CROP_RECT[] = "raw.scaled-crop";
+
+/* ------------------------------------- color information ------------------------------------- */
+
+/**
+ * Color Info
+ *
+ * Chroma location can vary for top and bottom fields, so use an array, that can have 0 to 2
+ * values. Empty array is used for non YUV formats.
+ */
+
+struct C2Color {
+ enum matrix_t : uint32_t; ///< matrix coefficient (YUV <=> RGB)
+ enum plane_layout_t : uint32_t; ///< plane layout for flexible formats
+ enum primaries_t : uint32_t; ///< color primaries and white point
+ enum range_t : uint32_t; ///< range of color component values
+ enum subsampling_t : uint32_t; ///< chroma subsampling
+ enum transfer_t : uint32_t; ///< transfer function
+};
+
+/// Chroma subsampling
+C2ENUM(C2Color::subsampling_t, uint32_t,
+ MONOCHROME, ///< there are no Cr nor Cb planes
+ MONOCHROME_ALPHA, ///< there are no Cr nor Cb planes, but there is an alpha plane
+ RGB, ///< RGB
+ RGBA, ///< RGBA
+ YUV_420, ///< Cr and Cb planes are subsampled by 2 both horizontally and vertically
+ YUV_422, ///< Cr and Cb planes are subsampled horizontally
+ YUV_444, ///< Cr and Cb planes are not subsampled
+ YUVA_444, ///< Cr and Cb planes are not subsampled, there is an alpha plane
+)
+
+struct C2ChromaOffsetStruct {
+ // chroma offsets defined by ITU
+ constexpr static C2ChromaOffsetStruct ITU_YUV_444() { return { 0.0f, 0.0f }; }
+ constexpr static C2ChromaOffsetStruct ITU_YUV_422() { return { 0.0f, 0.0f }; }
+ constexpr static C2ChromaOffsetStruct ITU_YUV_420_0() { return { 0.0f, 0.5f }; }
+ constexpr static C2ChromaOffsetStruct ITU_YUV_420_1() { return { 0.5f, 0.5f }; }
+ constexpr static C2ChromaOffsetStruct ITU_YUV_420_2() { return { 0.0f, 0.0f }; }
+ constexpr static C2ChromaOffsetStruct ITU_YUV_420_3() { return { 0.5f, 0.0f }; }
+ constexpr static C2ChromaOffsetStruct ITU_YUV_420_4() { return { 0.0f, 1.0f }; }
+ constexpr static C2ChromaOffsetStruct ITU_YUV_420_5() { return { 0.5f, 1.0f }; }
+
+ float x; ///< x offset in pixels (towards right)
+ float y; ///< y offset in pixels (towards down)
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(ChromaOffset)
+ C2FIELD(x, "x")
+ C2FIELD(y, "y")
+};
+
+struct C2ColorInfoStruct {
+ C2ColorInfoStruct()
+ : bitDepth(8), subsampling(C2Color::YUV_420) { }
+
+ uint32_t bitDepth;
+ C2Color::subsampling_t subsampling;
+ C2ChromaOffsetStruct locations[]; // max 2 elements
+
+ C2ColorInfoStruct(
+ size_t /* flexCount */, uint32_t bitDepth_, C2Color::subsampling_t subsampling_)
+ : bitDepth(bitDepth_), subsampling(subsampling_) { }
+
+ C2ColorInfoStruct(
+ size_t flexCount, uint32_t bitDepth_, C2Color::subsampling_t subsampling_,
+ std::initializer_list<C2ChromaOffsetStruct> locations_)
+ : bitDepth(bitDepth_), subsampling(subsampling_) {
+ size_t ix = 0;
+ for (const C2ChromaOffsetStruct &location : locations_) {
+ if (ix == flexCount) {
+ break;
+ }
+ locations[ix] = location;
+ ++ix;
+ }
+ }
+
+ DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(ColorInfo, locations)
+ C2FIELD(bitDepth, "bit-depth")
+ C2FIELD(subsampling, "subsampling")
+ C2FIELD(locations, "locations")
+};
+
+typedef C2StreamParam<C2Info, C2ColorInfoStruct, kParamIndexColorInfo> C2StreamColorInfo;
+constexpr char C2_PARAMKEY_COLOR_INFO[] = "raw.color-format";
+constexpr char C2_PARAMKEY_CODED_COLOR_INFO[] = "coded.color-format";
+
+/**
+ * Color Aspects
+ */
+
+/* The meaning of the following enumerators is as described in ITU-T H.273. */
+
+/// Range
+C2ENUM(C2Color::range_t, uint32_t,
+ RANGE_UNSPECIFIED, ///< range is unspecified
+ RANGE_FULL, ///< full range
+ RANGE_LIMITED, ///< limited range
+
+ RANGE_VENDOR_START = 0x80, ///< vendor-specific range values start here
+ RANGE_OTHER = 0XFF ///< max value, reserved for undefined values
+)
+
+/// Color primaries
+C2ENUM(C2Color::primaries_t, uint32_t,
+ PRIMARIES_UNSPECIFIED, ///< primaries are unspecified
+ PRIMARIES_BT709, ///< Rec.ITU-R BT.709-6 or equivalent
+ PRIMARIES_BT470_M, ///< Rec.ITU-R BT.470-6 System M or equivalent
+ PRIMARIES_BT601_625, ///< Rec.ITU-R BT.601-6 625 or equivalent
+ PRIMARIES_BT601_525, ///< Rec.ITU-R BT.601-6 525 or equivalent
+ PRIMARIES_GENERIC_FILM, ///< Generic Film
+ PRIMARIES_BT2020, ///< Rec.ITU-R BT.2020 or equivalent
+ PRIMARIES_RP431, ///< SMPTE RP 431-2 or equivalent
+ PRIMARIES_EG432, ///< SMPTE EG 432-1 or equivalent
+ PRIMARIES_EBU3213, ///< EBU Tech.3213-E or equivalent
+ ///
+ PRIMARIES_VENDOR_START = 0x80, ///< vendor-specific primaries values start here
+ PRIMARIES_OTHER = 0xff ///< max value, reserved for undefined values
+)
+
+/// Transfer function
+C2ENUM(C2Color::transfer_t, uint32_t,
+ TRANSFER_UNSPECIFIED, ///< transfer is unspecified
+ TRANSFER_LINEAR, ///< Linear transfer characteristics
+ TRANSFER_SRGB, ///< sRGB or equivalent
+ TRANSFER_170M, ///< SMPTE 170M or equivalent (e.g. BT.601/709/2020)
+ TRANSFER_GAMMA22, ///< Assumed display gamma 2.2
+ TRANSFER_GAMMA28, ///< Assumed display gamma 2.8
+ TRANSFER_ST2084, ///< SMPTE ST 2084 for 10/12/14/16 bit systems
+ TRANSFER_HLG, ///< ARIB STD-B67 hybrid-log-gamma
+
+ TRANSFER_240M = 0x40, ///< SMPTE 240M or equivalent
+ TRANSFER_XVYCC, ///< IEC 61966-2-4 or equivalent
+ TRANSFER_BT1361, ///< Rec.ITU-R BT.1361 extended gamut
+ TRANSFER_ST428, ///< SMPTE ST 428-1 or equivalent
+ ///
+ TRANSFER_VENDOR_START = 0x80, ///< vendor-specific transfer values start here
+ TRANSFER_OTHER = 0xff ///< max value, reserved for undefined values
+)
+
+/// Matrix coefficient
+C2ENUM(C2Color::matrix_t, uint32_t,
+ MATRIX_UNSPECIFIED, ///< matrix coefficients are unspecified
+ MATRIX_BT709, ///< Rec.ITU-R BT.709-5 or equivalent
+ MATRIX_FCC47_73_682, ///< FCC Title 47 CFR 73.682 or equivalent (KR=0.30, KB=0.11)
+ MATRIX_BT601, ///< Rec.ITU-R BT.470, BT.601-6 625 or equivalent
+ MATRIX_240M, ///< SMPTE 240M or equivalent
+ MATRIX_BT2020, ///< Rec.ITU-R BT.2020 non-constant luminance
+ MATRIX_BT2020_CONSTANT, ///< Rec.ITU-R BT.2020 constant luminance
+ MATRIX_VENDOR_START = 0x80, ///< vendor-specific matrix coefficient values start here
+ MATRIX_OTHER = 0xff, ///< max value, reserved for undefined values
+
+ MATRIX_SMPTE240M = MATRIX_240M, // deprecated
+ MATRIX_BT2020CONSTANT = MATRIX_BT2020_CONSTANT, // deprecated
+)
+
+constexpr C2Color::matrix_t MATRIX_BT470_6M = MATRIX_FCC47_73_682; // deprecated
+constexpr C2Color::matrix_t MATRIX_BT709_5 = MATRIX_BT709; // deprecated
+constexpr C2Color::matrix_t MATRIX_BT601_6 = MATRIX_BT601; // deprecated
+
+struct C2ColorAspectsStruct {
+ C2Color::range_t range;
+ C2Color::primaries_t primaries;
+ C2Color::transfer_t transfer;
+ C2Color::matrix_t matrix;
+
+ C2ColorAspectsStruct()
+ : range(C2Color::RANGE_UNSPECIFIED),
+ primaries(C2Color::PRIMARIES_UNSPECIFIED),
+ transfer(C2Color::TRANSFER_UNSPECIFIED),
+ matrix(C2Color::MATRIX_UNSPECIFIED) { }
+
+ C2ColorAspectsStruct(C2Color::range_t range_, C2Color::primaries_t primaries_,
+ C2Color::transfer_t transfer_, C2Color::matrix_t matrix_)
+ : range(range_), primaries(primaries_), transfer(transfer_), matrix(matrix_) {}
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(ColorAspects)
+ C2FIELD(range, "range")
+ C2FIELD(primaries, "primaries")
+ C2FIELD(transfer, "transfer")
+ C2FIELD(matrix, "matrix")
+};
+
+typedef C2StreamParam<C2Info, C2ColorAspectsStruct, kParamIndexColorAspects>
+ C2StreamColorAspectsInfo;
+constexpr char C2_PARAMKEY_COLOR_ASPECTS[] = "raw.color";
+constexpr char C2_PARAMKEY_VUI_COLOR_ASPECTS[] = "coded.vui.color";
+
+/**
+ * Default color aspects to use. These come from the container or client and shall be handled
+ * according to the coding standard.
+ */
+typedef C2StreamParam<C2Tuning, C2ColorAspectsStruct, kParamIndexDefaultColorAspects>
+ C2StreamColorAspectsTuning;
+constexpr char C2_PARAMKEY_DEFAULT_COLOR_ASPECTS[] = "default.color";
+
+/**
+ * HDR Static Metadata Info.
+ */
+struct C2ColorXyStruct {
+ float x; ///< x color coordinate in xyY space [0-1]
+ float y; ///< y color coordinate in xyY space [0-1]
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(ColorXy)
+ C2FIELD(x, "x")
+ C2FIELD(y, "y")
+};
+
+struct C2MasteringDisplayColorVolumeStruct {
+ C2ColorXyStruct red; ///< coordinates of red display primary
+ C2ColorXyStruct green; ///< coordinates of green display primary
+ C2ColorXyStruct blue; ///< coordinates of blue display primary
+ C2ColorXyStruct white; ///< coordinates of white point
+
+ float maxLuminance; ///< max display mastering luminance in cd/m^2
+ float minLuminance; ///< min display mastering luminance in cd/m^2
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(MasteringDisplayColorVolume)
+ C2FIELD(red, "red")
+ C2FIELD(green, "green")
+ C2FIELD(blue, "blue")
+ C2FIELD(white, "white")
+
+ C2FIELD(maxLuminance, "max-luminance")
+ C2FIELD(minLuminance, "min-luminance")
+};
+
+struct C2HdrStaticMetadataStruct {
+ C2MasteringDisplayColorVolumeStruct mastering;
+
+ // content descriptors
+ float maxCll; ///< max content light level (pixel luminance) in cd/m^2
+ float maxFall; ///< max frame average light level (frame luminance) in cd/m^2
+
+ DEFINE_AND_DESCRIBE_BASE_C2STRUCT(HdrStaticMetadata)
+ C2FIELD(mastering, "mastering")
+ C2FIELD(maxCll, "max-cll")
+ C2FIELD(maxFall, "max-fall")
+};
+typedef C2StreamParam<C2Info, C2HdrStaticMetadataStruct, kParamIndexHdrStaticMetadata>
+ C2StreamHdrStaticInfo;
+constexpr char C2_PARAMKEY_HDR_STATIC_INFO[] = "raw.hdr-static-info";
+
+/* ------------------------------------ block-based coding ----------------------------------- */
+
+/**
+ * Block-size, block count and block rate. Used to determine or communicate profile-level
+ * requirements.
+ */
+typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexBlockSize> C2StreamBlockSizeInfo;
+constexpr char C2_PARAMKEY_BLOCK_SIZE[] = "coded.block-size";
+
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexBlockCount> C2StreamBlockCountInfo;
+constexpr char C2_PARAMKEY_BLOCK_COUNT[] = "coded.block-count";
+
+typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexBlockRate> C2StreamBlockRateInfo;
+constexpr char C2_PARAMKEY_BLOCK_RATE[] = "coded.block-rate";
+
+/* ====================================== VIDEO COMPONENTS ====================================== */
+
+/**
+ * Frame rate (coded and port for raw data)
+ *
+ * Coded frame rates are what is represented in the compressed bitstream and should correspond to
+ * the timestamp.
+ *
+ * Frame rates on raw ports should still correspond to the timestamps.
+ *
+ * For slow motion or timelapse recording, the timestamp shall be adjusted prior to feeding an
+ * encoder, and the time stretch parameter should be used to signal the relationship between
+ * timestamp and real-world time.
+ */
+typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexFrameRate> C2StreamFrameRateInfo;
+constexpr char C2_PARAMKEY_FRAME_RATE[] = "coded.frame-rate";
+#define C2_NAME_STREAM_FRAME_RATE_SETTING C2_PARAMKEY_FRAME_RATE
+
+typedef C2PortParam<C2Info, C2FloatValue, kParamIndexFrameRate> C2PortFrameRateInfo;
+constexpr char C2_PARAMKEY_INPUT_FRAME_RATE[] = "input.frame-rate";
+constexpr char C2_PARAMKEY_OUTPUT_FRAME_RATE[] = "output.frame-rate";
+
+/**
+ * Time stretch. Ratio between real-world time and timestamp. E.g. time stretch of 4.0 means that
+ * timestamp grows 1/4 the speed of real-world time (e.g. 4x slo-mo input). This can be used to
+ * optimize encoding.
+ */
+typedef C2PortParam<C2Info, C2FloatValue, kParamIndexTimeStretch> C2PortTimeStretchInfo;
+constexpr char C2_PARAMKEY_INPUT_TIME_STRETCH[] = "input.time-stretch";
+constexpr char C2_PARAMKEY_OUTPUT_TIME_STRETCH[] = "output.time-stretch";
+
+/**
+ * Max video frame size.
+ */
+typedef C2StreamParam<C2Tuning, C2PictureSizeStruct, kParamIndexMaxPictureSize>
+ C2StreamMaxPictureSizeTuning;
+typedef C2StreamMaxPictureSizeTuning C2MaxVideoSizeHintPortSetting;
+constexpr char C2_PARAMKEY_MAX_PICTURE_SIZE[] = "raw.max-size";
+
+/**
+ * Picture type mask.
+ */
+C2ENUM(C2Config::picture_type_t, uint32_t,
+ SYNC_FRAME = (1 << 0), ///< sync frame, e.g. IDR
+ I_FRAME = (1 << 1), ///< intra frame that is completely encoded
+ P_FRAME = (1 << 2), ///< inter predicted frame from previous frames
+ B_FRAME = (1 << 3), ///< backward predicted (out-of-order) frame
+)
+
+typedef C2Config::picture_type_t C2PictureTypeMask; // deprecated
+constexpr C2Config::picture_type_t C2PictureTypeKeyFrame = C2Config::SYNC_FRAME; // deprecated
+
+/**
+ * Allowed picture types.
+ */
+typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2EasyEnum<C2Config::picture_type_t>>,
+ kParamIndexPictureTypeMask>
+ C2StreamPictureTypeMaskTuning;
+constexpr char C2_PARAMKEY_PICTURE_TYPE_MASK[] = "coding.picture-type-mask";
+
+/**
+ * Resulting picture type
+ */
+typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2EasyEnum<C2Config::picture_type_t>>,
+ kParamIndexPictureType>
+ C2StreamPictureTypeInfo;
+typedef C2StreamPictureTypeInfo C2StreamPictureTypeMaskInfo;
+constexpr char C2_PARAMKEY_PICTURE_TYPE[] = "coded.picture-type";
+
+/**
+ * GOP specification.
+ *
+ * GOP is specified in layers between sync frames, by specifying the number of specific type of
+ * frames between the previous type (starting with sync frames for the first layer):
+ *
+ * E.g.
+ * - 4 I frames between each sync frame
+ * - 2 P frames between each I frame
+ * - 1 B frame between each P frame
+ *
+ * [ { I, 4 }, { P, 2 }, { B, 1 } ] ==> (Sync)BPBPB IBPBPB IBPBPB IBPBPB IBPBPB (Sync)BPBPB
+ *
+ * For infinite GOP, I layer can be omitted (as the first frame is always a sync frame.):
+ *
+ * [ { P, MAX_UINT } ] ==> (Sync)PPPPPPPPPPPPPPPPPP...
+ *
+ * Sync frames can also be requested on demand, and as a time-based interval. For time-based
+ * interval, if there hasn't been a sync frame in at least the given time, the next I frame shall
+ * be encoded as a sync frame. For sync request, the next I frame shall be encoded as a sync frame.
+ *
+ * Temporal layering will determine GOP structure other than the I frame count between sync
+ * frames.
+ */
+struct C2GopLayerStruct {
+ C2GopLayerStruct(C2Config::picture_type_t type, uint32_t count_)
+ : type_(type), count(count_) { }
+
+ C2Config::picture_type_t type_;
+ uint32_t count;
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(GopLayer)
+ C2FIELD(type_, "type")
+ C2FIELD(count, "count")
+};
+
+typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2GopLayerStruct>, kParamIndexGop>
+ C2StreamGopTuning;
+constexpr char C2_PARAMKEY_GOP[] = "coding.gop";
+
+/**
+ * Sync frame can be requested on demand by the client.
+ *
+ * If true, the next I frame shall be encoded as a sync frame. This config can be passed
+ * synchronously with the work, or directly to the component - leading to different result.
+ * If it is passed with work, it shall take effect when that work item is being processed (so
+ * the first I frame at or after that work item shall be a sync frame).
+ */
+typedef C2StreamParam<C2Tuning, C2EasyBoolValue, kParamIndexRequestSyncFrame>
+ C2StreamRequestSyncFrameTuning;
+constexpr char C2_PARAMKEY_REQUEST_SYNC_FRAME[] = "coding.request-sync-frame";
+
+/**
+ * Sync frame interval in time domain (timestamp).
+ *
+ * If there hasn't been a sync frame in at least this value, the next intra frame shall be encoded
+ * as a sync frame. The value of MAX_I64 or a negative value means no sync frames after the first
+ * frame. A value of 0 means all sync frames.
+ */
+typedef C2StreamParam<C2Tuning, C2Int64Value, kParamIndexSyncFrameInterval>
+ C2StreamSyncFrameIntervalTuning;
+constexpr char C2_PARAMKEY_SYNC_FRAME_INTERVAL[] = "coding.sync-frame-interval";
+// deprecated
+#define C2_PARAMKEY_SYNC_FRAME_PERIOD C2_PARAMKEY_SYNC_FRAME_INTERVAL
+
+/**
+ * Temporal layering
+ *
+ * Layer index is a value between 0 and layer count - 1. Layers with higher index have higher
+ * frequency:
+ * 0
+ * 1 1
+ * 2 2 2 2
+ */
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexLayerIndex> C2StreamLayerIndexInfo;
+constexpr char C2_PARAMKEY_LAYER_INDEX[] = "coded.layer-index";
+
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexLayerCount> C2StreamLayerCountInfo;
+constexpr char C2_PARAMKEY_LAYER_COUNT[] = "coded.layer-count";
+
+struct C2TemporalLayeringStruct {
+ C2TemporalLayeringStruct()
+ : layerCount(0), bLayerCount(0) { }
+
+ C2TemporalLayeringStruct(size_t /* flexCount */, uint32_t layerCount_, uint32_t bLayerCount_)
+ : layerCount(layerCount_), bLayerCount(c2_min(layerCount_, bLayerCount_)) { }
+
+ C2TemporalLayeringStruct(size_t flexCount, uint32_t layerCount_, uint32_t bLayerCount_,
+ std::initializer_list<float> ratios)
+ : layerCount(layerCount_), bLayerCount(c2_min(layerCount_, bLayerCount_)) {
+ size_t ix = 0;
+ for (float ratio : ratios) {
+ if (ix == flexCount) {
+ break;
+ }
+ bitrateRatios[ix++] = ratio;
+ }
+ }
+
+ uint32_t layerCount; ///< total number of layers (0 means no temporal layering)
+ uint32_t bLayerCount; ///< total number of bidirectional layers (<= num layers)
+ /**
+ * Bitrate budgets for each layer and the layers below, given as a ratio of the total
+ * stream bitrate. This can be omitted or partially specififed by the client while configuring,
+ * in which case the component shall fill in appropriate values for the missing layers.
+ * This must be provided by the component when queried for at least layer count - 1 (as the
+ * last layer's budget is always 1.0).
+ */
+ float bitrateRatios[]; ///< 1.0-based
+
+ DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TemporalLayering, bitrateRatios)
+ C2FIELD(layerCount, "layer-count")
+ C2FIELD(bLayerCount, "b-layer-count")
+ C2FIELD(bitrateRatios, "bitrate-ratios")
+};
+
+typedef C2StreamParam<C2Tuning, C2TemporalLayeringStruct, kParamIndexTemporalLayering>
+ C2StreamTemporalLayeringTuning;
+constexpr char C2_PARAMKEY_TEMPORAL_LAYERING[] = "coding.temporal-layering";
+
+/**
+ * Intra-refresh.
+ */
+
+C2ENUM(C2Config::intra_refresh_mode_t, uint32_t,
+ INTRA_REFRESH_DISABLED, ///< no intra refresh
+ INTRA_REFRESH_ARBITRARY, ///< arbitrary, unspecified
+)
+
+struct C2IntraRefreshStruct {
+ C2IntraRefreshStruct()
+ : mode(C2Config::INTRA_REFRESH_DISABLED), period(0.) { }
+
+ C2IntraRefreshStruct(C2Config::intra_refresh_mode_t mode_, float period_)
+ : mode(mode_), period(period_) { }
+
+ C2Config::intra_refresh_mode_t mode; ///< refresh mode
+ float period; ///< intra refresh period in frames (must be >= 1), 0 means disabled
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(IntraRefresh)
+ C2FIELD(mode, "mode")
+ C2FIELD(period, "period")
+};
+
+typedef C2StreamParam<C2Tuning, C2IntraRefreshStruct, kParamIndexIntraRefresh>
+ C2StreamIntraRefreshTuning;
+constexpr char C2_PARAMKEY_INTRA_REFRESH[] = "coding.intra-refresh";
+
+/* ====================================== IMAGE COMPONENTS ====================================== */
+
+/**
+ * Tile layout.
+ *
+ * This described how the image is decomposed into tiles.
+ */
+C2ENUM(C2Config::scan_order_t, uint32_t,
+ SCAN_LEFT_TO_RIGHT_THEN_DOWN
+)
+
+struct C2TileLayoutStruct {
+ C2PictureSizeStruct tile; ///< tile size
+ uint32_t columnCount; ///< number of tiles horizontally
+ uint32_t rowCount; ///< number of tiles vertically
+ C2Config::scan_order_t order; ///< tile order
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(TileLayout)
+ C2FIELD(tile, "tile")
+ C2FIELD(columnCount, "columns")
+ C2FIELD(rowCount, "rows")
+ C2FIELD(order, "order")
+};
+
+typedef C2StreamParam<C2Info, C2TileLayoutStruct, kParamIndexTileLayout> C2StreamTileLayoutInfo;
+constexpr char C2_PARAMKEY_TILE_LAYOUT[] = "coded.tile-layout";
+
+/**
+ * Tile handling.
+ *
+ * Whether to concatenate tiles or output them each.
+ */
+C2ENUM(C2Config::tiling_mode_t, uint32_t,
+ TILING_SEPARATE, ///< output each tile in a separate onWorkDone
+ TILING_CONCATENATE ///< output one work completion per frame (concatenate tiles)
+)
+
+typedef C2StreamParam<C2Tuning, C2TileLayoutStruct, kParamIndexTileHandling>
+ C2StreamTileHandlingTuning;
+constexpr char C2_PARAMKEY_TILE_HANDLING[] = "coding.tile-handling";
+
+/* ====================================== AUDIO COMPONENTS ====================================== */
+
+/**
+ * Sample rate
+ */
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexSampleRate> C2StreamSampleRateInfo;
+constexpr char C2_PARAMKEY_SAMPLE_RATE[] = "raw.sample-rate";
+constexpr char C2_PARAMKEY_CODED_SAMPLE_RATE[] = "coded.sample-rate";
+// deprecated
+#define C2_NAME_STREAM_SAMPLE_RATE_SETTING C2_PARAMKEY_SAMPLE_RATE
+
+/**
+ * Channel count.
+ */
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexChannelCount> C2StreamChannelCountInfo;
+constexpr char C2_PARAMKEY_CHANNEL_COUNT[] = "raw.channel-count";
+constexpr char C2_PARAMKEY_CODED_CHANNEL_COUNT[] = "coded.channel-count";
+// deprecated
+#define C2_NAME_STREAM_CHANNEL_COUNT_SETTING C2_PARAMKEY_CHANNEL_COUNT
+
+/**
+ * Max channel count. Used to limit the number of coded or decoded channels.
+ */
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexMaxChannelCount> C2StreamMaxChannelCountInfo;
+constexpr char C2_PARAMKEY_MAX_CHANNEL_COUNT[] = "raw.max-channel-count";
+constexpr char C2_PARAMKEY_MAX_CODED_CHANNEL_COUNT[] = "coded.max-channel-count";
+
+/**
+ * Audio sample format (PCM encoding)
+ */
+C2ENUM(C2Config::pcm_encoding_t, uint32_t,
+ PCM_16,
+ PCM_8,
+ PCM_FLOAT
+)
+
+typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::pcm_encoding_t>, kParamIndexPcmEncoding>
+ C2StreamPcmEncodingInfo;
+constexpr char C2_PARAMKEY_PCM_ENCODING[] = "raw.pcm-encoding";
+constexpr char C2_PARAMKEY_CODED_PCM_ENCODING[] = "coded.pcm-encoding";
+
+/**
+ * AAC SBR Mode. Used during encoding.
+ */
+C2ENUM(C2Config::aac_sbr_mode_t, uint32_t,
+ AAC_SBR_OFF,
+ AAC_SBR_SINGLE_RATE,
+ AAC_SBR_DUAL_RATE,
+ AAC_SBR_AUTO ///< let the codec decide
+)
+
+typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::aac_sbr_mode_t>, kParamIndexAacSbrMode>
+ C2StreamAacSbrModeTuning;
+constexpr char C2_PARAMKEY_AAC_SBR_MODE[] = "coding.aac-sbr-mode";
+
+/**
+ * DRC Compression. Used during decoding.
+ */
+C2ENUM(C2Config::drc_compression_mode_t, int32_t,
+ DRC_COMPRESSION_ODM_DEFAULT, ///< odm's default
+ DRC_COMPRESSION_NONE,
+ DRC_COMPRESSION_LIGHT,
+ DRC_COMPRESSION_HEAVY ///<
+)
+
+typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::drc_compression_mode_t>,
+ kParamIndexDrcCompression>
+ C2StreamDrcCompressionModeTuning;
+constexpr char C2_PARAMKEY_DRC_COMPRESSION_MODE[] = "coding.drc.compression-mode";
+
+/**
+ * DRC target reference level in dBFS. Used during decoding.
+ */
+typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcTargetReferenceLevel>
+ C2StreamDrcTargetReferenceLevelTuning;
+constexpr char C2_PARAMKEY_DRC_TARGET_REFERENCE_LEVEL[] = "coding.drc.reference-level";
+
+/**
+ * DRC target reference level in dBFS. Used during decoding.
+ */
+typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcEncodedTargetLevel>
+ C2StreamDrcEncodedTargetLevelTuning;
+constexpr char C2_PARAMKEY_DRC_ENCODED_TARGET_LEVEL[] = "coding.drc.encoded-level";
+
+/**
+ * DRC target reference level in dBFS. Used during decoding.
+ */
+typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcBoostFactor>
+ C2StreamDrcBoostFactorTuning;
+constexpr char C2_PARAMKEY_DRC_BOOST_FACTOR[] = "coding.drc.boost-factor";
+
+/**
+ * DRC target reference level in dBFS. Used during decoding.
+ */
+typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcAttenuationFactor>
+ C2StreamDrcAttenuationFactorTuning;
+constexpr char C2_PARAMKEY_DRC_ATTENUATION_FACTOR[] = "coding.drc.attenuation-factor";
+
+/**
+ * DRC Effect Type (see ISO 23003-4) Uniform Dynamic Range Control. Used during decoding.
+ */
+C2ENUM(C2Config::drc_effect_type_t, int32_t,
+ DRC_EFFECT_ODM_DEFAULT = -2, ///< odm's default
+ DRC_EFFECT_OFF = -1, ///< no DRC
+ DRC_EFFECT_NONE = 0, ///< no DRC except to prevent clipping
+ DRC_EFFECT_LATE_NIGHT,
+ DRC_EFFECT_NOISY_ENVIRONMENT,
+ DRC_EFFECT_LIMITED_PLAYBACK_RANGE,
+ DRC_EFFECT_LOW_PLAYBACK_LEVEL,
+ DRC_EFFECT_DIALOG_ENHANCEMENT,
+ DRC_EFFECT_GENERAL_COMPRESSION
+)
+
+typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::drc_effect_type_t>,
+ kParamIndexDrcEffectType>
+ C2StreamDrcEffectTypeTuning;
+constexpr char C2_PARAMKEY_DRC_EFFECT_TYPE[] = "coding.drc.effect-type";
+
+/* --------------------------------------- AAC components --------------------------------------- */
+
+/**
+ * AAC stream format
+ */
+C2ENUM(C2Config::aac_packaging_t, uint32_t,
+ AAC_PACKAGING_RAW,
+ AAC_PACKAGING_ADTS
+)
+
+typedef C2Config::aac_packaging_t C2AacStreamFormatKind; // deprecated
+// deprecated
+constexpr C2Config::aac_packaging_t C2AacStreamFormatRaw = C2Config::AAC_PACKAGING_RAW;
+constexpr C2Config::aac_packaging_t C2AacStreamFormatAdts = C2Config::AAC_PACKAGING_ADTS;
+
+typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2EasyEnum<C2Config::aac_packaging_t>>,
+ kParamIndexAacPackaging> C2StreamAacPackagingInfo;
+typedef C2StreamAacPackagingInfo C2StreamAacFormatInfo;
+constexpr char C2_PARAMKEY_AAC_PACKAGING[] = "coded.aac-packaging";
+#define C2_NAME_STREAM_AAC_FORMAT_SETTING C2_PARAMKEY_AAC_PACKAGING
+
+/* ================================ PLATFORM-DEFINED PARAMETERS ================================ */
+
+/**
+ * Platform level and features.
+ */
+enum C2Config::platform_level_t : uint32_t {
+ PLATFORM_P, ///< support for Android 9.0 feature set
+};
+
+// read-only
+typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::platform_level_t>,
+ kParamIndexPlatformLevel>
+ C2PlatformLevelSetting;
+constexpr char C2_PARAMKEY_PLATFORM_LEVEL[] = "api.platform-level";
+
+enum C2Config::platform_feature_t : uint64_t {
+ // no platform-specific features have been defined
+};
+
+// read-only
+typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::platform_feature_t>,
+ kParamIndexPlatformFeatures>
+ C2PlatformFeaturesSetting;
+constexpr char C2_PARAMKEY_PLATFORM_FEATURES[] = "api.platform-features";
+
+/**
+ * This structure describes the preferred ion allocation parameters for a given memory usage.
+ */
+struct C2StoreIonUsageStruct {
+ inline C2StoreIonUsageStruct() {
+ memset(this, 0, sizeof(*this));
+ }
+
+ inline C2StoreIonUsageStruct(uint64_t usage_, uint32_t capacity_)
+ : usage(usage_), capacity(capacity_), heapMask(0), allocFlags(0), minAlignment(0) { }
+
+ uint64_t usage; ///< C2MemoryUsage
+ uint32_t capacity; ///< capacity
+ int32_t heapMask; ///< ion heapMask
+ int32_t allocFlags; ///< ion allocation flags
+ uint32_t minAlignment; ///< minimum alignment
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(StoreIonUsage)
+ C2FIELD(usage, "usage")
+ C2FIELD(capacity, "capacity")
+ C2FIELD(heapMask, "heap-mask")
+ C2FIELD(allocFlags, "alloc-flags")
+ C2FIELD(minAlignment, "min-alignment")
+};
+
+// store, private
+typedef C2GlobalParam<C2Info, C2StoreIonUsageStruct, kParamIndexStoreIonUsage>
+ C2StoreIonUsageInfo;
+
+/**
+ * Flexible pixel format descriptors
+ */
+struct C2FlexiblePixelFormatDescriptorStruct {
+ uint32_t pixelFormat;
+ uint32_t bitDepth;
+ C2Color::subsampling_t subsampling;
+ C2Color::plane_layout_t layout;
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(FlexiblePixelFormatDescriptor)
+ C2FIELD(pixelFormat, "pixel-format")
+ C2FIELD(bitDepth, "bit-depth")
+ C2FIELD(subsampling, "subsampling")
+ C2FIELD(layout, "layout")
+};
+
+/**
+ * Plane layout of flexible pixel formats.
+ *
+ * bpp: bytes per color component, e.g. 1 for 8-bit formats, and 2 for 10-16-bit formats.
+ */
+C2ENUM(C2Color::plane_layout_t, uint32_t,
+ /** Unknown layout */
+ UNKNOWN_LAYOUT,
+
+ /** Planar layout with rows of each plane packed (colInc = bpp) */
+ PLANAR_PACKED,
+
+ /** Semiplanar layout with rows of each plane packed (colInc_Y/A = bpp (planar),
+ * colInc_Cb/Cr = 2*bpp (interleaved). Used only for YUV(A) formats. */
+ SEMIPLANAR_PACKED,
+
+ /** Interleaved packed. colInc = N*bpp (N are the number of color components) */
+ INTERLEAVED_PACKED,
+
+ /** Interleaved aligned. colInc = smallest power of 2 >= N*bpp (N are the number of color
+ * components) */
+ INTERLEAVED_ALIGNED
+)
+
+typedef C2GlobalParam<C2Info, C2SimpleArrayStruct<C2FlexiblePixelFormatDescriptorStruct>,
+ kParamIndexFlexiblePixelFormatDescriptors>
+ C2StoreFlexiblePixelFormatDescriptorsInfo;
+
+/**
+ * This structure describes the android dataspace for a raw video/image frame.
+ */
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexDataSpace> C2StreamDataSpaceInfo;
+constexpr char C2_PARAMKEY_DATA_SPACE[] = "raw.data-space";
+
+/**
+ * This structure describes the android surface scaling mode for a raw video/image frame.
+ */
+typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexSurfaceScaling> C2StreamSurfaceScalingInfo;
+constexpr char C2_PARAMKEY_SURFACE_SCALING_MODE[] = "raw.surface-scaling";
+
+/* ======================================= INPUT SURFACE ======================================= */
+
+/**
+ * Input surface EOS
+ */
+typedef C2GlobalParam<C2Tuning, C2EasyBoolValue, kParamIndexInputSurfaceEos>
+ C2InputSurfaceEosTuning;
+constexpr char C2_PARAMKEY_INPUT_SURFACE_EOS[] = "input-surface.eos";
+#define C2_NAME_INPUT_SURFACE_EOS_TUNING C2_PARAMKEY_INPUT_SURFACE_EOS
+
+/**
+ * Start/suspend/resume/stop controls and timestamps for input surface.
+ *
+ * TODO: make these counters
+ */
+
+struct C2TimedControlStruct {
+ c2_bool_t enabled; ///< control is enabled
+ int64_t timestamp; ///< if enabled, time the control should take effect
+
+ C2TimedControlStruct()
+ : enabled(C2_FALSE), timestamp(0) { }
+
+ /* implicit */ C2TimedControlStruct(uint64_t timestamp_)
+ : enabled(C2_TRUE), timestamp(timestamp_) { }
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(TimedControl)
+ C2FIELD(enabled, "enabled")
+ C2FIELD(timestamp, "timestamp")
+};
+
+typedef C2PortParam<C2Tuning, C2TimedControlStruct, kParamIndexStartAt>
+ C2PortStartTimestampTuning;
+constexpr char C2_PARAMKEY_INPUT_SURFACE_START_AT[] = "input-surface.start";
+typedef C2PortParam<C2Tuning, C2TimedControlStruct, kParamIndexSuspendAt>
+ C2PortSuspendTimestampTuning;
+constexpr char C2_PARAMKEY_INPUT_SURFACE_SUSPEND_AT[] = "input-surface.suspend";
+typedef C2PortParam<C2Tuning, C2TimedControlStruct, kParamIndexResumeAt>
+ C2PortResumeTimestampTuning;
+constexpr char C2_PARAMKEY_INPUT_SURFACE_RESUME_AT[] = "input-surface.resume";
+typedef C2PortParam<C2Tuning, C2TimedControlStruct, kParamIndexStopAt>
+ C2PortStopTimestampTuning;
+constexpr char C2_PARAMKEY_INPUT_SURFACE_STOP_AT[] = "input-surface.stop";
+
+/**
+ * Time offset for input surface. Input timestamp to codec is surface buffer timestamp plus this
+ * time offset.
+ */
+typedef C2GlobalParam<C2Tuning, C2Int64Value, kParamIndexTimeOffset> C2ComponentTimeOffsetTuning;
+constexpr char C2_PARAMKEY_INPUT_SURFACE_TIME_OFFSET[] = "input-surface.time-offset";
+
+/**
+ * Minimum fps for input surface.
+ *
+ * Repeat frame to meet this.
+ */
+typedef C2PortParam<C2Tuning, C2FloatValue, kParamIndexMinFrameRate> C2PortMinFrameRateTuning;
+constexpr char C2_PARAMKEY_INPUT_SURFACE_MIN_FRAME_RATE[] = "input-surface.min-frame-rate";
+
+/**
+ * Timestamp adjustment (override) for input surface buffers. These control the input timestamp
+ * fed to the codec, but do not impact the output timestamp.
+ */
+struct C2TimestampGapAdjustmentStruct {
+ /// control modes
+ enum mode_t : uint32_t;
+
+ inline C2TimestampGapAdjustmentStruct();
+
+ inline C2TimestampGapAdjustmentStruct(mode_t mode_, uint64_t value_)
+ : mode(mode_), value(value_) { }
+
+ mode_t mode; ///< control mode
+ uint64_t value; ///< control value for gap between two timestamp
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(TimestampGapAdjustment)
+ C2FIELD(mode, "mode")
+ C2FIELD(value, "value")
+};
+
+C2ENUM(C2TimestampGapAdjustmentStruct::mode_t, uint32_t,
+ NONE,
+ MIN_GAP,
+ FIXED_GAP,
+);
+
+inline C2TimestampGapAdjustmentStruct::C2TimestampGapAdjustmentStruct()
+ : mode(C2TimestampGapAdjustmentStruct::NONE), value(0) { }
+
+typedef C2PortParam<C2Tuning, C2TimestampGapAdjustmentStruct> C2PortTimestampGapTuning;
+constexpr char C2_PARAMKEY_INPUT_SURFACE_TIMESTAMP_ADJUSTMENT[] = "input-surface.timestamp-adjustment";
+
+/// @}
+
+#endif // C2CONFIG_H_
diff --git a/media/codec2/core/include/C2Enum.h b/media/codec2/core/include/C2Enum.h
new file mode 100644
index 0000000..b0fad8f
--- /dev/null
+++ b/media/codec2/core/include/C2Enum.h
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2ENUM_H_
+#define C2ENUM_H_
+
+#include <C2Param.h>
+#include <_C2MacroUtils.h>
+
+#include <utility>
+#include <vector>
+
+/** \file
+ * Tools for easier enum support.
+ */
+
+/// \cond INTERNAL
+
+/* ---------------------------- UTILITIES FOR ENUMERATION REFLECTION ---------------------------- */
+
+/**
+ * Utility class that allows ignoring enum value assignment (e.g. both '(_C2EnumConst)kValue = x'
+ * and '(_C2EnumConst)kValue' will eval to kValue.
+ */
+template<typename T>
+class _C2EnumConst {
+public:
+ // implicit conversion from T
+ inline _C2EnumConst(T value) : _mValue(value) {}
+ // implicit conversion to T
+ inline operator T() { return _mValue; }
+ // implicit conversion to C2Value::Primitive
+ inline operator C2Value::Primitive() { return (T)_mValue; }
+ // ignore assignment and return T here to avoid implicit conversion to T later
+ inline T &operator =(T value __unused) { return _mValue; }
+private:
+ T _mValue;
+};
+
+/// mapper to get name of enum
+/// \note this will contain any initialization, which we will remove when converting to lower-case
+#define _C2_GET_ENUM_NAME(x, y) #x
+/// mapper to get value of enum
+#define _C2_GET_ENUM_VALUE(x, type) (_C2EnumConst<type>)x
+
+/// \endcond
+
+class _C2EnumUtils {
+ static C2String camelCaseToDashed(C2String name);
+
+ static std::vector<C2String> sanitizeEnumValueNames(
+ const std::vector<C2StringLiteral> names,
+ C2StringLiteral _prefix = nullptr);
+
+ friend class C2UtilTest_EnumUtilsTest_Test;
+
+public:
+ // this may not be used...
+ static C2_HIDE std::vector<C2String> parseEnumValuesFromString(C2StringLiteral value);
+
+ template<typename T>
+ static C2_HIDE C2FieldDescriptor::NamedValuesType sanitizeEnumValues(
+ std::vector<T> values,
+ std::vector<C2StringLiteral> names,
+ C2StringLiteral prefix = nullptr) {
+ C2FieldDescriptor::NamedValuesType namedValues;
+ std::vector<C2String> sanitizedNames = sanitizeEnumValueNames(names, prefix);
+ for (size_t i = 0; i < values.size() && i < sanitizedNames.size(); ++i) {
+ namedValues.emplace_back(sanitizedNames[i], values[i]);
+ }
+ return namedValues;
+ }
+
+ template<typename E>
+ static C2_HIDE C2FieldDescriptor::NamedValuesType customEnumValues(
+ std::vector<std::pair<C2StringLiteral, E>> items) {
+ C2FieldDescriptor::NamedValuesType namedValues;
+ for (auto &item : items) {
+ namedValues.emplace_back(item.first, item.second);
+ }
+ return namedValues;
+ }
+};
+
+#define DEFINE_C2_ENUM_VALUE_AUTO_HELPER(name, type, prefix, ...) \
+ _DEFINE_C2_ENUM_VALUE_AUTO_HELPER(__C2_GENERATE_GLOBAL_VARS__, name, type, prefix, \
+ ##__VA_ARGS__)
+#define _DEFINE_C2_ENUM_VALUE_AUTO_HELPER(enabled, name, type, prefix, ...) \
+ __DEFINE_C2_ENUM_VALUE_AUTO_HELPER(enabled, name, type, prefix, ##__VA_ARGS__)
+#define __DEFINE_C2_ENUM_VALUE_AUTO_HELPER(enabled, name, type, prefix, ...) \
+ ___DEFINE_C2_ENUM_VALUE_AUTO_HELPER##enabled(name, type, prefix, ##__VA_ARGS__)
+#define ___DEFINE_C2_ENUM_VALUE_AUTO_HELPER(name, type, prefix, ...) \
+template<> \
+C2FieldDescriptor::NamedValuesType C2FieldDescriptor::namedValuesFor(const name &r __unused) { \
+ return _C2EnumUtils::sanitizeEnumValues( \
+ std::vector<C2Value::Primitive> { _C2_MAP(_C2_GET_ENUM_VALUE, type, __VA_ARGS__) }, \
+ { _C2_MAP(_C2_GET_ENUM_NAME, type, __VA_ARGS__) }, \
+ prefix); \
+}
+#define ___DEFINE_C2_ENUM_VALUE_AUTO_HELPER__C2_GENERATE_GLOBAL_VARS__(name, type, prefix, ...)
+
+#define DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(name, names) \
+ _DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(__C2_GENERATE_GLOBAL_VARS__, name, names)
+#define _DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(enabled, name, names) \
+ __DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(enabled, name, names)
+#define __DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(enabled, name, names) \
+ ___DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER##enabled(name, names)
+#define ___DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(name, names) \
+template<> \
+C2FieldDescriptor::NamedValuesType C2FieldDescriptor::namedValuesFor(const name &r __unused) { \
+ return _C2EnumUtils::customEnumValues( \
+ std::vector<std::pair<C2StringLiteral, name>> names); \
+}
+#define ___DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER__C2_GENERATE_GLOBAL_VARS__(name, names)
+
+/**
+ * Defines an enum type with the default named value mapper. The default mapper
+ * finds and removes the longest common prefix across all of the enum value names, and
+ * replaces camel-case separators with dashes ('-').
+ *
+ * This macro must be used in the global scope and namespace.
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ * C2ENUM(c2_enum_t, uint32_t,
+ * C2_VALUE1,
+ * C2_VALUE2 = 5,
+ * C2_VALUE3 = C2_VALUE1 + 1)
+ * // named values are: C2_VALUE1 => "1", C2_VALUE2 => "2", ...
+ * // longest common prefix is "C2_VALUE"
+ * ~~~~~~~~~~~~~
+ *
+ * \param name name of the enum type (This can be an inner class enum.)
+ * \param type underlying type
+ */
+#define C2ENUM(name, type, ...) \
+enum name : type { __VA_ARGS__ }; \
+DEFINE_C2_ENUM_VALUE_AUTO_HELPER(name, type, nullptr, __VA_ARGS__)
+
+/**
+ * Defines an enum type with the default named value mapper but custom prefix. The default
+ * mapper removes the prefix from all of the enum value names (if present), and
+ * inserts dashes at camel-case separators (lowHigh becomes low-high) and also replaces
+ * non-leading underscores with dashes ('-').
+ *
+ * This macro must be used in the global scope and namespace.
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ * C2ENUM_CUSTOM_PREFIX(c2_enum_t, uint32_t, "C2_",
+ * C2_VALUE1,
+ * C2_VALUE2 = 5,
+ * C2_VALUE3 = C2_VALUE1 + 1)
+ * // named values are: C2_VALUE1 => "VALUE1", C2_VALUE2 => "VALUE2", ...
+ * ~~~~~~~~~~~~~
+ *
+ * \param name name of the enum type (This can be an inner class enum.)
+ * \param type underlying type
+ * \param prefix prefix to remove
+ */
+#define C2ENUM_CUSTOM_PREFIX(name, type, prefix, ...) \
+enum name : type { __VA_ARGS__ }; \
+DEFINE_C2_ENUM_VALUE_AUTO_HELPER(name, type, prefix, __VA_ARGS__)
+
+/**
+ * Defines an enum type with custom names.
+ *
+ * This macro must be used in the global scope and namespace.
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ * C2ENUM_CUSTOM_NAMES(SomeStruct::c2_enum_t, uint32_t, ({
+ * { "One", SomeStruct::C2_VALUE1 },
+ * { "Two", SomeStruct::C2_VALUE2 },
+ * { "Three", SomeStruct::C2_VALUE3 } }),
+ * C2_VALUE1,
+ * C2_VALUE2 = 5,
+ * C2_VALUE3 = C2_VALUE1 + 1)
+ *
+ * // named values are: C2_VALUE1 => "One", C2_VALUE2 => "Two", ...
+ * ~~~~~~~~~~~~~
+ */
+#define C2ENUM_CUSTOM_NAMES(name, type, names, ...) \
+enum name : type { __VA_ARGS__ }; \
+DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(name, names)
+
+/**
+ * Make enums usable as their integral types.
+ *
+ * Note: this makes them not usable in printf()
+ */
+template<class E>
+struct C2EasyEnum {
+ using U = typename std::underlying_type<E>::type;
+ E value;
+ // define conversion functions
+ inline constexpr operator E() const { return value; }
+ inline constexpr C2EasyEnum(E value_) : value(value_) { }
+ inline constexpr C2EasyEnum(U value_) : value(E(value_)) { }
+ inline constexpr C2EasyEnum() = default;
+};
+
+// make C2EasyEnum behave like a regular enum
+
+namespace std {
+ template<typename E>
+ struct underlying_type<C2EasyEnum<E>> {
+ typedef typename underlying_type<E>::type type;
+ };
+
+ template<typename E>
+ struct is_enum<C2EasyEnum<E>> {
+ constexpr static bool value = true;
+ };
+}
+
+#endif // C2ENUM_H_
+
diff --git a/media/codec2/core/include/C2Param.h b/media/codec2/core/include/C2Param.h
new file mode 100644
index 0000000..40be3b3
--- /dev/null
+++ b/media/codec2/core/include/C2Param.h
@@ -0,0 +1,1673 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2PARAM_H_
+#define C2PARAM_H_
+
+#include <C2.h>
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <algorithm>
+#include <string>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+/// \addtogroup Parameters
+/// @{
+
+/// \defgroup internal Internal helpers.
+
+/*!
+ * \file
+ * PARAMETERS: SETTINGs, TUNINGs, and INFOs
+ * ===
+ *
+ * These represent miscellaneous control and metadata information and are likely copied into
+ * kernel space. Therefore, these are C-like structures designed to carry just a small amount of
+ * information. We are using C++ to be able to add constructors, as well as non-virtual and class
+ * methods.
+ *
+ * ==Specification details:
+ *
+ * Restrictions:
+ * - must be POD struct, e.g. no vtable (no virtual destructor)
+ * - must have the same size in 64-bit and 32-bit mode (no size_t)
+ * - as such, no pointer members
+ * - some common member field names are reserved as they are defined as methods for all
+ * parameters:
+ * they are: size, type, kind, index and stream
+ *
+ * Behavior:
+ * - Params can be global (not related to input or output), related to input or output,
+ * or related to an input/output stream.
+ * - All params are queried/set using a unique param index, which incorporates a potential stream
+ * index and/or port.
+ * - Querying (supported) params MUST never fail.
+ * - All params MUST have default values.
+ * - If some fields have "unsupported" or "invalid" values during setting, this SHOULD be
+ * communicated to the app.
+ * a) Ideally, this should be avoided. When setting parameters, in general, component should do
+ * "best effort" to apply all settings. It should change "invalid/unsupported" values to the
+ * nearest supported values.
+ * - This is communicated to the client by changing the source values in tune()/
+ * configure().
+ * b) If falling back to a supported value is absolutely impossible, the component SHALL return
+ * an error for the specific setting, but should continue to apply other settings.
+ * TODO: this currently may result in unintended results.
+ *
+ * **NOTE:** unlike OMX, params are not versioned. Instead, a new struct with new param index
+ * SHALL be added as new versions are required.
+ *
+ * The proper subtype (Setting, Info or Param) is incorporated into the class type. Define structs
+ * to define multiple subtyped versions of related parameters.
+ *
+ * ==Implementation details:
+ *
+ * - Use macros to define parameters
+ * - All parameters must have a default constructor
+ * - This is only used for instantiating the class in source (e.g. will not be used
+ * when building a parameter by the framework from key/value pairs.)
+ */
+
+/// \ingroup internal
+
+/**
+ * Parameter base class.
+ */
+struct C2Param {
+ // param index encompasses the following:
+ //
+ // - kind (setting, tuning, info, struct)
+ // - scope
+ // - direction (global, input, output)
+ // - stream flag
+ // - stream ID (usually 0)
+ // - and the parameter's type (core index)
+ // - flexible parameter flag
+ // - vendor extension flag
+ // - type index (this includes the vendor extension flag)
+ //
+ // layout:
+ //
+ // kind : <------- scope -------> : <----- core index ----->
+ // +------+-----+---+------+--------+----|------+--------------+
+ // | kind | dir | - |stream|streamID|flex|vendor| type index |
+ // +------+-----+---+------+--------+----+------+--------------+
+ // bit: 31..30 29.28 25 24 .. 17 16 15 14 .. 0
+ //
+public:
+ /**
+ * C2Param kinds, usable as bitmaps.
+ */
+ enum kind_t : uint32_t {
+ NONE = 0,
+ STRUCT = (1 << 0),
+ INFO = (1 << 1),
+ SETTING = (1 << 2),
+ TUNING = (1 << 3) | SETTING, // tunings are settings
+ };
+
+ /**
+ * The parameter type index specifies the underlying parameter type of a parameter as
+ * an integer value.
+ *
+ * Parameter types are divided into two groups: platform types and vendor types.
+ *
+ * Platform types are defined by the platform and are common for all implementations.
+ *
+ * Vendor types are defined by each vendors, so they may differ between implementations.
+ * It is recommended that vendor types be the same for all implementations by a specific
+ * vendor.
+ */
+ typedef uint32_t type_index_t;
+ enum : uint32_t {
+ TYPE_INDEX_VENDOR_START = 0x00008000, ///< vendor indices SHALL start after this
+ };
+
+ /**
+ * Core index is the underlying parameter type for a parameter. It is used to describe the
+ * layout of the parameter structure regardless of the component or parameter kind/scope.
+ *
+ * It is used to identify and distinguish global parameters, and also parameters on a given
+ * port or stream. They must be unique for the set of global parameters, as well as for the
+ * set of parameters on each port or each stream, but the same core index can be used for
+ * parameters on different streams or ports, as well as for global parameters and port/stream
+ * parameters.
+ *
+ * Multiple parameter types can share the same layout.
+ *
+ * \note The layout for all parameters with the same core index across all components must
+ * be identical.
+ */
+ struct CoreIndex {
+ //public:
+ enum : uint32_t {
+ IS_FLEX_FLAG = 0x00010000,
+ };
+
+ protected:
+ enum : uint32_t {
+ KIND_MASK = 0xC0000000,
+ KIND_STRUCT = 0x00000000,
+ KIND_TUNING = 0x40000000,
+ KIND_SETTING = 0x80000000,
+ KIND_INFO = 0xC0000000,
+
+ DIR_MASK = 0x30000000,
+ DIR_GLOBAL = 0x20000000,
+ DIR_UNDEFINED = DIR_MASK, // MUST have all bits set
+ DIR_INPUT = 0x00000000,
+ DIR_OUTPUT = 0x10000000,
+
+ IS_STREAM_FLAG = 0x02000000,
+ STREAM_ID_MASK = 0x01FE0000,
+ STREAM_ID_SHIFT = 17,
+ MAX_STREAM_ID = STREAM_ID_MASK >> STREAM_ID_SHIFT,
+ STREAM_MASK = IS_STREAM_FLAG | STREAM_ID_MASK,
+
+ IS_VENDOR_FLAG = 0x00008000,
+ TYPE_INDEX_MASK = 0x0000FFFF,
+ CORE_MASK = TYPE_INDEX_MASK | IS_FLEX_FLAG,
+ };
+
+ public:
+ /// constructor/conversion from uint32_t
+ inline CoreIndex(uint32_t index) : mIndex(index) { }
+
+ // no conversion from uint64_t
+ inline CoreIndex(uint64_t index) = delete;
+
+ /// returns true iff this is a vendor extension parameter
+ inline bool isVendor() const { return mIndex & IS_VENDOR_FLAG; }
+
+ /// returns true iff this is a flexible parameter (with variable size)
+ inline bool isFlexible() const { return mIndex & IS_FLEX_FLAG; }
+
+ /// returns the core index
+ /// This is the combination of the parameter type index and the flexible flag.
+ inline uint32_t coreIndex() const { return mIndex & CORE_MASK; }
+
+ /// returns the parameter type index
+ inline type_index_t typeIndex() const { return mIndex & TYPE_INDEX_MASK; }
+
+ DEFINE_FIELD_AND_MASK_BASED_COMPARISON_OPERATORS(CoreIndex, mIndex, CORE_MASK)
+
+ protected:
+ uint32_t mIndex;
+ };
+
+ /**
+ * Type encompasses the parameter's kind (tuning, setting, info), its scope (whether the
+ * parameter is global, input or output, and whether it is for a stream) and the its base
+ * index (which also determines its layout).
+ */
+ struct Type : public CoreIndex {
+ //public:
+ /// returns true iff this is a global parameter (not for input nor output)
+ inline bool isGlobal() const { return (mIndex & DIR_MASK) == DIR_GLOBAL; }
+ /// returns true iff this is an input or input stream parameter
+ inline bool forInput() const { return (mIndex & DIR_MASK) == DIR_INPUT; }
+ /// returns true iff this is an output or output stream parameter
+ inline bool forOutput() const { return (mIndex & DIR_MASK) == DIR_OUTPUT; }
+
+ /// returns true iff this is a stream parameter
+ inline bool forStream() const { return mIndex & IS_STREAM_FLAG; }
+ /// returns true iff this is a port (input or output) parameter
+ inline bool forPort() const { return !forStream() && !isGlobal(); }
+
+ /// returns the parameter type: the parameter index without the stream ID
+ inline uint32_t type() const { return mIndex & (~STREAM_ID_MASK); }
+
+ /// return the kind (struct, info, setting or tuning) of this param
+ inline kind_t kind() const {
+ switch (mIndex & KIND_MASK) {
+ case KIND_STRUCT: return STRUCT;
+ case KIND_INFO: return INFO;
+ case KIND_SETTING: return SETTING;
+ case KIND_TUNING: return TUNING;
+ default: return NONE; // should not happen
+ }
+ }
+
+ /// constructor/conversion from uint32_t
+ inline Type(uint32_t index) : CoreIndex(index) { }
+
+ // no conversion from uint64_t
+ inline Type(uint64_t index) = delete;
+
+ DEFINE_FIELD_AND_MASK_BASED_COMPARISON_OPERATORS(Type, mIndex, ~STREAM_ID_MASK)
+
+ private:
+ friend struct C2Param; // for setPort()
+ friend struct C2Tuning; // for KIND_TUNING
+ friend struct C2Setting; // for KIND_SETTING
+ friend struct C2Info; // for KIND_INFO
+ // for DIR_GLOBAL
+ template<typename T, typename S, int I, class F> friend struct C2GlobalParam;
+ template<typename T, typename S, int I, class F> friend struct C2PortParam; // for kDir*
+ template<typename T, typename S, int I, class F> friend struct C2StreamParam; // for kDir*
+ friend struct _C2ParamInspector; // for testing
+
+ /**
+ * Sets the port/stream direction.
+ * @return true on success, false if could not set direction (e.g. it is global param).
+ */
+ inline bool setPort(bool output) {
+ if (isGlobal()) {
+ return false;
+ } else {
+ mIndex = (mIndex & ~DIR_MASK) | (output ? DIR_OUTPUT : DIR_INPUT);
+ return true;
+ }
+ }
+ };
+
+ /**
+ * index encompasses all remaining information: basically the stream ID.
+ */
+ struct Index : public Type {
+ /// returns the index as uint32_t
+ inline operator uint32_t() const { return mIndex; }
+
+ /// constructor/conversion from uint32_t
+ inline Index(uint32_t index) : Type(index) { }
+
+ /// copy constructor
+ inline Index(const Index &index) = default;
+
+ // no conversion from uint64_t
+ inline Index(uint64_t index) = delete;
+
+ /// returns the stream ID or ~0 if not a stream
+ inline unsigned stream() const {
+ return forStream() ? rawStream() : ~0U;
+ }
+
+ /// Returns an index with stream field set to given stream.
+ inline Index withStream(unsigned stream) const {
+ Index ix = mIndex;
+ (void)ix.setStream(stream);
+ return ix;
+ }
+
+ /// sets the port (direction). Returns true iff successful.
+ inline Index withPort(bool output) const {
+ Index ix = mIndex;
+ (void)ix.setPort(output);
+ return ix;
+ }
+
+ DEFINE_FIELD_BASED_COMPARISON_OPERATORS(Index, mIndex)
+
+ private:
+ friend struct C2Param; // for setStream, MakeStreamId, isValid
+ friend struct _C2ParamInspector; // for testing
+
+ /**
+ * @return true if the type is valid, e.g. direction is not undefined AND
+ * stream is 0 if not a stream param.
+ */
+ inline bool isValid() const {
+ // there is no Type::isValid (even though some of this check could be
+ // performed on types) as this is only used on index...
+ return (forStream() ? rawStream() < MAX_STREAM_ID : rawStream() == 0)
+ && (mIndex & DIR_MASK) != DIR_UNDEFINED;
+ }
+
+ /// returns the raw stream ID field
+ inline unsigned rawStream() const {
+ return (mIndex & STREAM_ID_MASK) >> STREAM_ID_SHIFT;
+ }
+
+ /// returns the streamId bitfield for a given |stream|. If stream is invalid,
+ /// returns an invalid bitfield.
+ inline static uint32_t MakeStreamId(unsigned stream) {
+ // saturate stream ID (max value is invalid)
+ if (stream > MAX_STREAM_ID) {
+ stream = MAX_STREAM_ID;
+ }
+ return (stream << STREAM_ID_SHIFT) & STREAM_ID_MASK;
+ }
+
+ inline bool convertToStream(bool output, unsigned stream) {
+ mIndex = (mIndex & ~DIR_MASK) | IS_STREAM_FLAG;
+ (void)setPort(output);
+ return setStream(stream);
+ }
+
+ inline void convertToPort(bool output) {
+ mIndex = (mIndex & ~(DIR_MASK | IS_STREAM_FLAG));
+ (void)setPort(output);
+ }
+
+ inline void convertToGlobal() {
+ mIndex = (mIndex & ~(DIR_MASK | IS_STREAM_FLAG)) | DIR_GLOBAL;
+ }
+
+ /**
+ * Sets the stream index.
+ * \return true on success, false if could not set index (e.g. not a stream param).
+ */
+ inline bool setStream(unsigned stream) {
+ if (forStream()) {
+ mIndex = (mIndex & ~STREAM_ID_MASK) | MakeStreamId(stream);
+ return this->stream() < MAX_STREAM_ID;
+ }
+ return false;
+ }
+ };
+
+public:
+ // public getters for Index methods
+
+ /// returns true iff this is a vendor extension parameter
+ inline bool isVendor() const { return _mIndex.isVendor(); }
+ /// returns true iff this is a flexible parameter
+ inline bool isFlexible() const { return _mIndex.isFlexible(); }
+ /// returns true iff this is a global parameter (not for input nor output)
+ inline bool isGlobal() const { return _mIndex.isGlobal(); }
+ /// returns true iff this is an input or input stream parameter
+ inline bool forInput() const { return _mIndex.forInput(); }
+ /// returns true iff this is an output or output stream parameter
+ inline bool forOutput() const { return _mIndex.forOutput(); }
+
+ /// returns true iff this is a stream parameter
+ inline bool forStream() const { return _mIndex.forStream(); }
+ /// returns true iff this is a port (input or output) parameter
+ inline bool forPort() const { return _mIndex.forPort(); }
+
+ /// returns the stream ID or ~0 if not a stream
+ inline unsigned stream() const { return _mIndex.stream(); }
+
+ /// returns the parameter type: the parameter index without the stream ID
+ inline Type type() const { return _mIndex.type(); }
+
+ /// returns the index of this parameter
+ /// \todo: should we restrict this to C2ParamField?
+ inline uint32_t index() const { return (uint32_t)_mIndex; }
+
+ /// returns the core index of this parameter
+ inline CoreIndex coreIndex() const { return _mIndex.coreIndex(); }
+
+ /// returns the kind of this parameter
+ inline kind_t kind() const { return _mIndex.kind(); }
+
+ /// returns the size of the parameter or 0 if the parameter is invalid
+ inline size_t size() const { return _mSize; }
+
+ /// returns true iff the parameter is valid
+ inline operator bool() const { return _mIndex.isValid() && _mSize > 0; }
+
+ /// returns true iff the parameter is invalid
+ inline bool operator!() const { return !operator bool(); }
+
+ // equality is done by memcmp (use equals() to prevent any overread)
+ inline bool operator==(const C2Param &o) const {
+ return equals(o) && memcmp(this, &o, _mSize) == 0;
+ }
+ inline bool operator!=(const C2Param &o) const { return !operator==(o); }
+
+ /// safe(r) type cast from pointer and size
+ inline static C2Param* From(void *addr, size_t len) {
+ // _mSize must fit into size, but really C2Param must also to be a valid param
+ if (len < sizeof(C2Param)) {
+ return nullptr;
+ }
+ // _mSize must match length
+ C2Param *param = (C2Param*)addr;
+ if (param->_mSize != len) {
+ return nullptr;
+ }
+ return param;
+ }
+
+ /// Returns managed clone of |orig| at heap.
+ inline static std::unique_ptr<C2Param> Copy(const C2Param &orig) {
+ if (orig.size() == 0) {
+ return nullptr;
+ }
+ void *mem = ::operator new (orig.size());
+ C2Param *param = new (mem) C2Param(orig.size(), orig._mIndex);
+ param->updateFrom(orig);
+ return std::unique_ptr<C2Param>(param);
+ }
+
+ /// Returns managed clone of |orig| as a stream parameter at heap.
+ inline static std::unique_ptr<C2Param> CopyAsStream(
+ const C2Param &orig, bool output, unsigned stream) {
+ std::unique_ptr<C2Param> copy = Copy(orig);
+ if (copy) {
+ copy->_mIndex.convertToStream(output, stream);
+ }
+ return copy;
+ }
+
+ /// Returns managed clone of |orig| as a port parameter at heap.
+ inline static std::unique_ptr<C2Param> CopyAsPort(const C2Param &orig, bool output) {
+ std::unique_ptr<C2Param> copy = Copy(orig);
+ if (copy) {
+ copy->_mIndex.convertToPort(output);
+ }
+ return copy;
+ }
+
+ /// Returns managed clone of |orig| as a global parameter at heap.
+ inline static std::unique_ptr<C2Param> CopyAsGlobal(const C2Param &orig) {
+ std::unique_ptr<C2Param> copy = Copy(orig);
+ if (copy) {
+ copy->_mIndex.convertToGlobal();
+ }
+ return copy;
+ }
+
+#if 0
+ template<typename P, class=decltype(C2Param(P()))>
+ P *As() { return P::From(this); }
+ template<typename P>
+ const P *As() const { return const_cast<const P*>(P::From(const_cast<C2Param*>(this))); }
+#endif
+
+protected:
+ /// sets the stream field. Returns true iff successful.
+ inline bool setStream(unsigned stream) {
+ return _mIndex.setStream(stream);
+ }
+
+ /// sets the port (direction). Returns true iff successful.
+ inline bool setPort(bool output) {
+ return _mIndex.setPort(output);
+ }
+
+public:
+ /// invalidate this parameter. There is no recovery from this call; e.g. parameter
+ /// cannot be 'corrected' to be valid.
+ inline void invalidate() { _mSize = 0; }
+
+ // if other is the same kind of (valid) param as this, copy it into this and return true.
+ // otherwise, do not copy anything, and return false.
+ inline bool updateFrom(const C2Param &other) {
+ if (other._mSize <= _mSize && other._mIndex == _mIndex && _mSize > 0) {
+ memcpy(this, &other, other._mSize);
+ return true;
+ }
+ return false;
+ }
+
+protected:
+ // returns |o| if it is a null ptr, or if can suitably be a param of given |type| (e.g. has
+ // same type (ignoring stream ID), and size). Otherwise, returns null. If |checkDir| is false,
+ // allow undefined or different direction (e.g. as constructed from C2PortParam() vs.
+ // C2PortParam::input), but still require equivalent type (stream, port or global); otherwise,
+ // return null.
+ inline static const C2Param* IfSuitable(
+ const C2Param* o, size_t size, Type type, size_t flexSize = 0, bool checkDir = true) {
+ if (o == nullptr || o->_mSize < size || (flexSize && ((o->_mSize - size) % flexSize))) {
+ return nullptr;
+ } else if (checkDir) {
+ return o->_mIndex.type() == type.mIndex ? o : nullptr;
+ } else if (o->_mIndex.isGlobal()) {
+ return nullptr;
+ } else {
+ return ((o->_mIndex.type() ^ type.mIndex) & ~Type::DIR_MASK) ? nullptr : o;
+ }
+ }
+
+ /// base constructor
+ inline C2Param(uint32_t paramSize, Index paramIndex)
+ : _mSize(paramSize),
+ _mIndex(paramIndex) {
+ if (paramSize > sizeof(C2Param)) {
+ memset(this + 1, 0, paramSize - sizeof(C2Param));
+ }
+ }
+
+ /// base constructor with stream set
+ inline C2Param(uint32_t paramSize, Index paramIndex, unsigned stream)
+ : _mSize(paramSize),
+ _mIndex(paramIndex | Index::MakeStreamId(stream)) {
+ if (paramSize > sizeof(C2Param)) {
+ memset(this + 1, 0, paramSize - sizeof(C2Param));
+ }
+ if (!forStream()) {
+ invalidate();
+ }
+ }
+
+private:
+ friend struct _C2ParamInspector; // for testing
+
+ /// returns true iff |o| has the same size and index as this. This performs the
+ /// basic check for equality.
+ inline bool equals(const C2Param &o) const {
+ return _mSize == o._mSize && _mIndex == o._mIndex;
+ }
+
+ uint32_t _mSize;
+ Index _mIndex;
+};
+
+/// \ingroup internal
+/// allow C2Params access to private methods, e.g. constructors
+#define C2PARAM_MAKE_FRIENDS \
+ template<typename U, typename S, int I, class F> friend struct C2GlobalParam; \
+ template<typename U, typename S, int I, class F> friend struct C2PortParam; \
+ template<typename U, typename S, int I, class F> friend struct C2StreamParam; \
+
+/**
+ * Setting base structure for component method signatures. Wrap constructors.
+ */
+struct C2Setting : public C2Param {
+protected:
+ template<typename ...Args>
+ inline C2Setting(const Args(&... args)) : C2Param(args...) { }
+public: // TODO
+ enum : uint32_t { PARAM_KIND = Type::KIND_SETTING };
+};
+
+/**
+ * Tuning base structure for component method signatures. Wrap constructors.
+ */
+struct C2Tuning : public C2Setting {
+protected:
+ template<typename ...Args>
+ inline C2Tuning(const Args(&... args)) : C2Setting(args...) { }
+public: // TODO
+ enum : uint32_t { PARAM_KIND = Type::KIND_TUNING };
+};
+
+/**
+ * Info base structure for component method signatures. Wrap constructors.
+ */
+struct C2Info : public C2Param {
+protected:
+ template<typename ...Args>
+ inline C2Info(const Args(&... args)) : C2Param(args...) { }
+public: // TODO
+ enum : uint32_t { PARAM_KIND = Type::KIND_INFO };
+};
+
+/**
+ * Structure uniquely specifying a field in an arbitrary structure.
+ *
+ * \note This structure is used differently in C2FieldDescriptor to
+ * identify array fields, such that _mSize is the size of each element. This is
+ * because the field descriptor contains the array-length, and we want to keep
+ * a relevant element size for variable length arrays.
+ */
+struct _C2FieldId {
+//public:
+ /**
+ * Constructor used for C2FieldDescriptor that removes the array extent.
+ *
+ * \param[in] offset pointer to the field in an object at address 0.
+ */
+ template<typename T, class B=typename std::remove_extent<T>::type>
+ inline _C2FieldId(T* offset)
+ : // offset is from "0" so will fit on 32-bits
+ _mOffset((uint32_t)(uintptr_t)(offset)),
+ _mSize(sizeof(B)) { }
+
+ /**
+ * Direct constructor from offset and size.
+ *
+ * \param[in] offset offset of the field.
+ * \param[in] size size of the field.
+ */
+ inline _C2FieldId(size_t offset, size_t size)
+ : _mOffset(offset), _mSize(size) {}
+
+ /**
+ * Constructor used to identify a field in an object.
+ *
+ * \param U[type] pointer to the object that contains this field. This is needed in case the
+ * field is in an (inherited) base class, in which case T will be that base class.
+ * \param pm[im] member pointer to the field
+ */
+ template<typename R, typename T, typename U, typename B=typename std::remove_extent<R>::type>
+ inline _C2FieldId(U *, R T::* pm)
+ : _mOffset((uint32_t)(uintptr_t)(&(((U*)256)->*pm)) - 256u),
+ _mSize(sizeof(B)) { }
+
+ /**
+ * Constructor used to identify a field in an object.
+ *
+ * \param pm[im] member pointer to the field
+ */
+ template<typename R, typename T, typename B=typename std::remove_extent<R>::type>
+ inline _C2FieldId(R T::* pm)
+ : _mOffset((uint32_t)(uintptr_t)(&(((T*)0)->*pm))),
+ _mSize(sizeof(B)) { }
+
+ inline bool operator==(const _C2FieldId &other) const {
+ return _mOffset == other._mOffset && _mSize == other._mSize;
+ }
+
+ inline bool operator<(const _C2FieldId &other) const {
+ return _mOffset < other._mOffset ||
+ // NOTE: order parent structure before sub field
+ (_mOffset == other._mOffset && _mSize > other._mSize);
+ }
+
+ DEFINE_OTHER_COMPARISON_OPERATORS(_C2FieldId)
+
+#if 0
+ inline uint32_t offset() const { return _mOffset; }
+ inline uint32_t size() const { return _mSize; }
+#endif
+
+#if defined(FRIEND_TEST)
+ friend void PrintTo(const _C2FieldId &d, ::std::ostream*);
+#endif
+
+private:
+ friend struct _C2ParamInspector;
+ friend struct C2FieldDescriptor;
+
+ uint32_t _mOffset; // offset of field
+ uint32_t _mSize; // size of field
+};
+
+/**
+ * Structure uniquely specifying a 'field' in a configuration. The field
+ * can be a field of a configuration, a subfield of a field of a configuration,
+ * and even the whole configuration. Moreover, if the field can point to an
+ * element in a array field, or to the entire array field.
+ *
+ * This structure is used for querying supported values for a field, as well
+ * as communicating configuration failures and conflicts when trying to change
+ * a configuration for a component/interface or a store.
+ */
+struct C2ParamField {
+//public:
+ /**
+ * Create a field identifier using a configuration parameter (variable),
+ * and a pointer to member.
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ *
+ * struct C2SomeParam {
+ * uint32_t mField;
+ * uint32_t mArray[2];
+ * C2OtherStruct mStruct;
+ * uint32_t mFlexArray[];
+ * } *mParam;
+ *
+ * C2ParamField(mParam, &mParam->mField);
+ * C2ParamField(mParam, &mParam->mArray);
+ * C2ParamField(mParam, &mParam->mArray[0]);
+ * C2ParamField(mParam, &mParam->mStruct.mSubField);
+ * C2ParamField(mParam, &mParam->mFlexArray);
+ * C2ParamField(mParam, &mParam->mFlexArray[2]);
+ *
+ * ~~~~~~~~~~~~~
+ *
+ * \todo fix what this is for T[] (for now size becomes T[1])
+ *
+ * \note this does not work for 64-bit members as it triggers a
+ * 'taking address of packed member' warning.
+ *
+ * \param param pointer to parameter
+ * \param offset member pointer
+ */
+ template<typename S, typename T>
+ inline C2ParamField(S* param, T* offset)
+ : _mIndex(param->index()),
+ _mFieldId((T*)((uintptr_t)offset - (uintptr_t)param)) {}
+
+ template<typename S, typename T>
+ inline static C2ParamField Make(S& param, T& offset) {
+ return C2ParamField(param.index(), (uintptr_t)&offset - (uintptr_t)¶m, sizeof(T));
+ }
+
+ /**
+ * Create a field identifier using a configuration parameter (variable),
+ * and a member pointer. This method cannot be used to refer to an
+ * array element or a subfield.
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ *
+ * C2SomeParam mParam;
+ * C2ParamField(&mParam, &C2SomeParam::mMemberField);
+ *
+ * ~~~~~~~~~~~~~
+ *
+ * \param p pointer to parameter
+ * \param T member pointer to the field member
+ */
+ template<typename R, typename T, typename U>
+ inline C2ParamField(U *p, R T::* pm) : _mIndex(p->index()), _mFieldId(p, pm) { }
+
+ /**
+ * Create a field identifier to a configuration parameter (variable).
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ *
+ * C2SomeParam mParam;
+ * C2ParamField(&mParam);
+ *
+ * ~~~~~~~~~~~~~
+ *
+ * \param param pointer to parameter
+ */
+ template<typename S>
+ inline C2ParamField(S* param)
+ : _mIndex(param->index()), _mFieldId(0u, param->size()) { }
+
+ /** Copy constructor. */
+ inline C2ParamField(const C2ParamField &other) = default;
+
+ /**
+ * Equality operator.
+ */
+ inline bool operator==(const C2ParamField &other) const {
+ return _mIndex == other._mIndex && _mFieldId == other._mFieldId;
+ }
+
+ /**
+ * Ordering operator.
+ */
+ inline bool operator<(const C2ParamField &other) const {
+ return _mIndex < other._mIndex ||
+ (_mIndex == other._mIndex && _mFieldId < other._mFieldId);
+ }
+
+ DEFINE_OTHER_COMPARISON_OPERATORS(C2ParamField)
+
+protected:
+ inline C2ParamField(C2Param::Index index, uint32_t offset, uint32_t size)
+ : _mIndex(index), _mFieldId(offset, size) {}
+
+private:
+ friend struct _C2ParamInspector;
+
+ C2Param::Index _mIndex; ///< parameter index
+ _C2FieldId _mFieldId; ///< field identifier
+};
+
+/**
+ * A shared (union) representation of numeric values
+ */
+class C2Value {
+public:
+ /// A union of supported primitive types.
+ union Primitive {
+ // first member is always zero initialized so it must be the largest
+ uint64_t u64; ///< uint64_t value
+ int64_t i64; ///< int64_t value
+ c2_cntr64_t c64; ///< c2_cntr64_t value
+ uint32_t u32; ///< uint32_t value
+ int32_t i32; ///< int32_t value
+ c2_cntr32_t c32; ///< c2_cntr32_t value
+ float fp; ///< float value
+
+ // constructors - implicit
+ Primitive(uint64_t value) : u64(value) { }
+ Primitive(int64_t value) : i64(value) { }
+ Primitive(c2_cntr64_t value) : c64(value) { }
+ Primitive(uint32_t value) : u32(value) { }
+ Primitive(int32_t value) : i32(value) { }
+ Primitive(c2_cntr32_t value) : c32(value) { }
+ Primitive(uint8_t value) : u32(value) { }
+ Primitive(char value) : i32(value) { }
+ Primitive(float value) : fp(value) { }
+
+ // allow construction from enum type
+ template<typename E, typename = typename std::enable_if<std::is_enum<E>::value>::type>
+ Primitive(E value)
+ : Primitive(static_cast<typename std::underlying_type<E>::type>(value)) { }
+
+ Primitive() : u64(0) { }
+
+ /** gets value out of the union */
+ template<typename T> const T &ref() const;
+
+ // verify that we can assume standard aliasing
+ static_assert(sizeof(u64) == sizeof(i64), "");
+ static_assert(sizeof(u64) == sizeof(c64), "");
+ static_assert(sizeof(u32) == sizeof(i32), "");
+ static_assert(sizeof(u32) == sizeof(c32), "");
+ };
+ // verify that we can assume standard aliasing
+ static_assert(offsetof(Primitive, u64) == offsetof(Primitive, i64), "");
+ static_assert(offsetof(Primitive, u64) == offsetof(Primitive, c64), "");
+ static_assert(offsetof(Primitive, u32) == offsetof(Primitive, i32), "");
+ static_assert(offsetof(Primitive, u32) == offsetof(Primitive, c32), "");
+
+ enum type_t : uint32_t {
+ NO_INIT,
+ INT32,
+ UINT32,
+ CNTR32,
+ INT64,
+ UINT64,
+ CNTR64,
+ FLOAT,
+ };
+
+ template<typename T, bool = std::is_enum<T>::value>
+ inline static constexpr type_t TypeFor() {
+ using U = typename std::underlying_type<T>::type;
+ return TypeFor<U>();
+ }
+
+ // deprectated
+ template<typename T, bool B = std::is_enum<T>::value>
+ inline static constexpr type_t typeFor() {
+ return TypeFor<T, B>();
+ }
+
+ // constructors - implicit
+ template<typename T>
+ C2Value(T value) : _mType(typeFor<T>()), _mValue(value) { }
+
+ C2Value() : _mType(NO_INIT) { }
+
+ inline type_t type() const { return _mType; }
+
+ template<typename T>
+ inline bool get(T *value) const {
+ if (_mType == typeFor<T>()) {
+ *value = _mValue.ref<T>();
+ return true;
+ }
+ return false;
+ }
+
+ /// returns the address of the value
+ void *get() const {
+ return _mType == NO_INIT ? nullptr : (void*)&_mValue;
+ }
+
+ /// returns the size of the contained value
+ size_t inline sizeOf() const {
+ return SizeFor(_mType);
+ }
+
+ static size_t SizeFor(type_t type) {
+ switch (type) {
+ case INT32:
+ case UINT32:
+ case CNTR32: return sizeof(_mValue.i32);
+ case INT64:
+ case UINT64:
+ case CNTR64: return sizeof(_mValue.i64);
+ case FLOAT: return sizeof(_mValue.fp);
+ default: return 0;
+ }
+ }
+
+private:
+ type_t _mType;
+ Primitive _mValue;
+};
+
+template<> inline const int32_t &C2Value::Primitive::ref<int32_t>() const { return i32; }
+template<> inline const int64_t &C2Value::Primitive::ref<int64_t>() const { return i64; }
+template<> inline const uint32_t &C2Value::Primitive::ref<uint32_t>() const { return u32; }
+template<> inline const uint64_t &C2Value::Primitive::ref<uint64_t>() const { return u64; }
+template<> inline const c2_cntr32_t &C2Value::Primitive::ref<c2_cntr32_t>() const { return c32; }
+template<> inline const c2_cntr64_t &C2Value::Primitive::ref<c2_cntr64_t>() const { return c64; }
+template<> inline const float &C2Value::Primitive::ref<float>() const { return fp; }
+
+// provide types for enums and uint8_t, char even though we don't provide reading as them
+template<> constexpr C2Value::type_t C2Value::TypeFor<char, false>() { return INT32; }
+template<> constexpr C2Value::type_t C2Value::TypeFor<int32_t, false>() { return INT32; }
+template<> constexpr C2Value::type_t C2Value::TypeFor<int64_t, false>() { return INT64; }
+template<> constexpr C2Value::type_t C2Value::TypeFor<uint8_t, false>() { return UINT32; }
+template<> constexpr C2Value::type_t C2Value::TypeFor<uint32_t, false>() { return UINT32; }
+template<> constexpr C2Value::type_t C2Value::TypeFor<uint64_t, false>() { return UINT64; }
+template<> constexpr C2Value::type_t C2Value::TypeFor<c2_cntr32_t, false>() { return CNTR32; }
+template<> constexpr C2Value::type_t C2Value::TypeFor<c2_cntr64_t, false>() { return CNTR64; }
+template<> constexpr C2Value::type_t C2Value::TypeFor<float, false>() { return FLOAT; }
+
+// forward declare easy enum template
+template<typename E> struct C2EasyEnum;
+
+/**
+ * field descriptor. A field is uniquely defined by an index into a parameter.
+ * (Note: Stream-id is not captured as a field.)
+ *
+ * Ordering of fields is by offset. In case of structures, it is depth first,
+ * with a structure taking an index just before and in addition to its members.
+ */
+struct C2FieldDescriptor {
+//public:
+ /** field types and flags
+ * \note: only 32-bit and 64-bit fields are supported (e.g. no boolean, as that
+ * is represented using INT32).
+ */
+ enum type_t : uint32_t {
+ // primitive types
+ INT32 = C2Value::INT32, ///< 32-bit signed integer
+ UINT32 = C2Value::UINT32, ///< 32-bit unsigned integer
+ CNTR32 = C2Value::CNTR32, ///< 32-bit counter
+ INT64 = C2Value::INT64, ///< 64-bit signed integer
+ UINT64 = C2Value::UINT64, ///< 64-bit signed integer
+ CNTR64 = C2Value::CNTR64, ///< 64-bit counter
+ FLOAT = C2Value::FLOAT, ///< 32-bit floating point
+
+ // array types
+ STRING = 0x100, ///< fixed-size string (POD)
+ BLOB, ///< blob. Blobs have no sub-elements and can be thought of as byte arrays;
+ ///< however, bytes cannot be individually addressed by clients.
+
+ // complex types
+ STRUCT_FLAG = 0x20000, ///< structs. Marked with this flag in addition to their coreIndex.
+ };
+
+ typedef std::pair<C2String, C2Value::Primitive> NamedValueType;
+ typedef std::vector<NamedValueType> NamedValuesType;
+ //typedef std::pair<std::vector<C2String>, std::vector<C2Value::Primitive>> NamedValuesType;
+
+ /**
+ * Template specialization that returns the named values for a type.
+ *
+ * \todo hide from client.
+ *
+ * \return a vector of name-value pairs.
+ */
+ template<typename B>
+ static NamedValuesType namedValuesFor(const B &);
+
+ /** specialization for easy enums */
+ template<typename E>
+ inline static NamedValuesType namedValuesFor(const C2EasyEnum<E> &) {
+ return namedValuesFor(*(E*)nullptr);
+ }
+
+private:
+ template<typename B, bool enabled=std::is_arithmetic<B>::value || std::is_enum<B>::value>
+ struct C2_HIDE _NamedValuesGetter;
+
+public:
+ inline C2FieldDescriptor(uint32_t type, uint32_t extent, C2String name, size_t offset, size_t size)
+ : _mType((type_t)type), _mExtent(extent), _mName(name), _mFieldId(offset, size) { }
+
+ inline C2FieldDescriptor(const C2FieldDescriptor &) = default;
+
+ template<typename T, class B=typename std::remove_extent<T>::type>
+ inline C2FieldDescriptor(const T* offset, const char *name)
+ : _mType(this->GetType((B*)nullptr)),
+ _mExtent(std::is_array<T>::value ? std::extent<T>::value : 1),
+ _mName(name),
+ _mNamedValues(_NamedValuesGetter<B>::getNamedValues()),
+ _mFieldId(offset) {}
+
+/*
+ template<typename T, typename B=typename std::remove_extent<T>::type>
+ inline C2FieldDescriptor<T, B, false>(T* offset, const char *name)
+ : _mType(this->GetType((B*)nullptr)),
+ _mExtent(std::is_array<T>::value ? std::extent<T>::value : 1),
+ _mName(name),
+ _mFieldId(offset) {}
+*/
+
+ /// \deprecated
+ template<typename T, typename S, class B=typename std::remove_extent<T>::type>
+ inline C2FieldDescriptor(S*, T S::* field, const char *name)
+ : _mType(this->GetType((B*)nullptr)),
+ _mExtent(std::is_array<T>::value ? std::extent<T>::value : 1),
+ _mName(name),
+ _mFieldId(&(((S*)0)->*field)) {}
+
+ /// returns the type of this field
+ inline type_t type() const { return _mType; }
+ /// returns the length of the field in case it is an array. Returns 0 for
+ /// T[] arrays, returns 1 for T[1] arrays as well as if the field is not an array.
+ inline size_t extent() const { return _mExtent; }
+ /// returns the name of the field
+ inline C2String name() const { return _mName; }
+
+ const NamedValuesType &namedValues() const { return _mNamedValues; }
+
+#if defined(FRIEND_TEST)
+ friend void PrintTo(const C2FieldDescriptor &, ::std::ostream*);
+ friend bool operator==(const C2FieldDescriptor &, const C2FieldDescriptor &);
+ FRIEND_TEST(C2ParamTest_ParamFieldList, VerifyStruct);
+#endif
+
+private:
+ /**
+ * Construct an offseted field descriptor.
+ */
+ inline C2FieldDescriptor(const C2FieldDescriptor &desc, size_t offset)
+ : _mType(desc._mType), _mExtent(desc._mExtent),
+ _mName(desc._mName), _mNamedValues(desc._mNamedValues),
+ _mFieldId(desc._mFieldId._mOffset + offset, desc._mFieldId._mSize) { }
+
+ type_t _mType;
+ uint32_t _mExtent; // the last member can be arbitrary length if it is T[] array,
+ // extending to the end of the parameter (this is marked with
+ // 0). T[0]-s are not fields.
+ C2String _mName;
+ NamedValuesType _mNamedValues;
+
+ _C2FieldId _mFieldId; // field identifier (offset and size)
+
+ // NOTE: We do not capture default value(s) here as that may depend on the component.
+ // NOTE: We also do not capture bestEffort, as 1) this should be true for most fields,
+ // 2) this is at parameter granularity.
+
+ // type resolution
+ inline static type_t GetType(int32_t*) { return INT32; }
+ inline static type_t GetType(uint32_t*) { return UINT32; }
+ inline static type_t GetType(c2_cntr32_t*) { return CNTR32; }
+ inline static type_t GetType(int64_t*) { return INT64; }
+ inline static type_t GetType(uint64_t*) { return UINT64; }
+ inline static type_t GetType(c2_cntr64_t*) { return CNTR64; }
+ inline static type_t GetType(float*) { return FLOAT; }
+ inline static type_t GetType(char*) { return STRING; }
+ inline static type_t GetType(uint8_t*) { return BLOB; }
+
+ template<typename T,
+ class=typename std::enable_if<std::is_enum<T>::value>::type>
+ inline static type_t GetType(T*) {
+ typename std::underlying_type<T>::type underlying(0);
+ return GetType(&underlying);
+ }
+
+ // verify C2Struct by having a FieldList() and a CORE_INDEX.
+ template<typename T,
+ class=decltype(T::CORE_INDEX + 1), class=decltype(T::FieldList())>
+ inline static type_t GetType(T*) {
+ static_assert(!std::is_base_of<C2Param, T>::value, "cannot use C2Params as fields");
+ return (type_t)(T::CORE_INDEX | STRUCT_FLAG);
+ }
+
+ friend struct _C2ParamInspector;
+};
+
+// no named values for compound types
+template<typename B>
+struct C2FieldDescriptor::_NamedValuesGetter<B, false> {
+ inline static C2FieldDescriptor::NamedValuesType getNamedValues() {
+ return NamedValuesType();
+ }
+};
+
+template<typename B>
+struct C2FieldDescriptor::_NamedValuesGetter<B, true> {
+ inline static C2FieldDescriptor::NamedValuesType getNamedValues() {
+ return C2FieldDescriptor::namedValuesFor(*(B*)nullptr);
+ }
+};
+
+#define DEFINE_NO_NAMED_VALUES_FOR(type) \
+template<> inline C2FieldDescriptor::NamedValuesType C2FieldDescriptor::namedValuesFor(const type &) { \
+ return NamedValuesType(); \
+}
+
+// We cannot subtype constructor for enumerated types so insted define no named values for
+// non-enumerated integral types.
+DEFINE_NO_NAMED_VALUES_FOR(int32_t)
+DEFINE_NO_NAMED_VALUES_FOR(uint32_t)
+DEFINE_NO_NAMED_VALUES_FOR(c2_cntr32_t)
+DEFINE_NO_NAMED_VALUES_FOR(int64_t)
+DEFINE_NO_NAMED_VALUES_FOR(uint64_t)
+DEFINE_NO_NAMED_VALUES_FOR(c2_cntr64_t)
+DEFINE_NO_NAMED_VALUES_FOR(uint8_t)
+DEFINE_NO_NAMED_VALUES_FOR(char)
+DEFINE_NO_NAMED_VALUES_FOR(float)
+
+/**
+ * Describes the fields of a structure.
+ */
+struct C2StructDescriptor {
+public:
+ /// Returns the core index of the struct
+ inline C2Param::CoreIndex coreIndex() const { return _mType.coreIndex(); }
+
+ // Returns the number of fields in this struct (not counting any recursive fields).
+ // Must be at least 1 for valid structs.
+ inline size_t numFields() const { return _mFields.size(); }
+
+ // Returns the list of direct fields (not counting any recursive fields).
+ typedef std::vector<C2FieldDescriptor>::const_iterator field_iterator;
+ inline field_iterator cbegin() const { return _mFields.cbegin(); }
+ inline field_iterator cend() const { return _mFields.cend(); }
+
+ // only supplying const iterator - but these names are needed for range based loops
+ inline field_iterator begin() const { return _mFields.cbegin(); }
+ inline field_iterator end() const { return _mFields.cend(); }
+
+ template<typename T>
+ inline C2StructDescriptor(T*)
+ : C2StructDescriptor(T::CORE_INDEX, T::FieldList()) { }
+
+ inline C2StructDescriptor(
+ C2Param::CoreIndex type,
+ const std::vector<C2FieldDescriptor> &fields)
+ : _mType(type), _mFields(fields) { }
+
+private:
+ friend struct _C2ParamInspector;
+
+ inline C2StructDescriptor(
+ C2Param::CoreIndex type,
+ std::vector<C2FieldDescriptor> &&fields)
+ : _mType(type), _mFields(std::move(fields)) { }
+
+ const C2Param::CoreIndex _mType;
+ const std::vector<C2FieldDescriptor> _mFields;
+};
+
+/**
+ * Describes parameters for a component.
+ */
+struct C2ParamDescriptor {
+public:
+ /**
+ * Returns whether setting this param is required to configure this component.
+ * This can only be true for builtin params for platform-defined components (e.g. video and
+ * audio encoders/decoders, video/audio filters).
+ * For vendor-defined components, it can be true even for vendor-defined params,
+ * but it is not recommended, in case the component becomes platform-defined.
+ */
+ inline bool isRequired() const { return _mAttrib & IS_REQUIRED; }
+
+ /**
+ * Returns whether this parameter is persistent. This is always true for C2Tuning and C2Setting,
+ * but may be false for C2Info. If true, this parameter persists across frames and applies to
+ * the current and subsequent frames. If false, this C2Info parameter only applies to the
+ * current frame and is not assumed to have the same value (or even be present) on subsequent
+ * frames, unless it is specified for those frames.
+ */
+ inline bool isPersistent() const { return _mAttrib & IS_PERSISTENT; }
+
+ inline bool isStrict() const { return _mAttrib & IS_STRICT; }
+
+ inline bool isReadOnly() const { return _mAttrib & IS_READ_ONLY; }
+
+ inline bool isVisible() const { return !(_mAttrib & IS_HIDDEN); }
+
+ inline bool isPublic() const { return !(_mAttrib & IS_INTERNAL); }
+
+ /// Returns the name of this param.
+ /// This defaults to the underlying C2Struct's name, but could be altered for a component.
+ inline C2String name() const { return _mName; }
+
+ /// Returns the parameter index
+ inline C2Param::Index index() const { return _mIndex; }
+
+ /// Returns the indices of parameters that this parameter has a dependency on
+ inline const std::vector<C2Param::Index> &dependencies() const { return _mDependencies; }
+
+ /// \deprecated
+ template<typename T>
+ inline C2ParamDescriptor(bool isRequired, C2StringLiteral name, const T*)
+ : _mIndex(T::PARAM_TYPE),
+ _mAttrib(IS_PERSISTENT | (isRequired ? IS_REQUIRED : 0)),
+ _mName(name) { }
+
+ /// \deprecated
+ inline C2ParamDescriptor(
+ bool isRequired, C2StringLiteral name, C2Param::Index index)
+ : _mIndex(index),
+ _mAttrib(IS_PERSISTENT | (isRequired ? IS_REQUIRED : 0)),
+ _mName(name) { }
+
+ enum attrib_t : uint32_t {
+ // flags that default on
+ IS_REQUIRED = 1u << 0, ///< parameter is required to be specified
+ IS_PERSISTENT = 1u << 1, ///< parameter retains its value
+ // flags that default off
+ IS_STRICT = 1u << 2, ///< parameter is strict
+ IS_READ_ONLY = 1u << 3, ///< parameter is publicly read-only
+ IS_HIDDEN = 1u << 4, ///< parameter shall not be visible to clients
+ IS_INTERNAL = 1u << 5, ///< parameter shall not be used by framework (other than testing)
+ IS_CONST = 1u << 6 | IS_READ_ONLY, ///< parameter is publicly const (hence read-only)
+ };
+
+ inline C2ParamDescriptor(
+ C2Param::Index index, attrib_t attrib, C2StringLiteral name)
+ : _mIndex(index),
+ _mAttrib(attrib),
+ _mName(name) { }
+
+ inline C2ParamDescriptor(
+ C2Param::Index index, attrib_t attrib, C2String &&name,
+ std::vector<C2Param::Index> &&dependencies)
+ : _mIndex(index),
+ _mAttrib(attrib),
+ _mName(name),
+ _mDependencies(std::move(dependencies)) { }
+
+private:
+ const C2Param::Index _mIndex;
+ const uint32_t _mAttrib;
+ const C2String _mName;
+ std::vector<C2Param::Index> _mDependencies;
+
+ friend struct _C2ParamInspector;
+};
+
+DEFINE_ENUM_OPERATORS(::C2ParamDescriptor::attrib_t)
+
+
+/// \ingroup internal
+/// Define a structure without CORE_INDEX.
+/// \note _FIELD_LIST is used only during declaration so that C2Struct declarations can end with
+/// a simple list of C2FIELD-s and closing bracket. Mark it unused as it is not used in templated
+/// structs.
+#define DEFINE_BASE_C2STRUCT(name) \
+private: \
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST __unused; /**< structure fields */ \
+public: \
+ typedef C2##name##Struct _type; /**< type name shorthand */ \
+ static const std::vector<C2FieldDescriptor> FieldList(); /**< structure fields factory */
+
+/// Define a structure with matching CORE_INDEX.
+#define DEFINE_C2STRUCT(name) \
+public: \
+ enum : uint32_t { CORE_INDEX = kParamIndex##name }; \
+ DEFINE_BASE_C2STRUCT(name)
+
+/// Define a flexible structure without CORE_INDEX.
+#define DEFINE_BASE_FLEX_C2STRUCT(name, flexMember) \
+public: \
+ FLEX(C2##name##Struct, flexMember) \
+ DEFINE_BASE_C2STRUCT(name)
+
+/// Define a flexible structure with matching CORE_INDEX.
+#define DEFINE_FLEX_C2STRUCT(name, flexMember) \
+public: \
+ FLEX(C2##name##Struct, flexMember) \
+ enum : uint32_t { CORE_INDEX = kParamIndex##name | C2Param::CoreIndex::IS_FLEX_FLAG }; \
+ DEFINE_BASE_C2STRUCT(name)
+
+/// \ingroup internal
+/// Describe a structure of a templated structure.
+// Use list... as the argument gets resubsitituted and it contains commas. Alternative would be
+// to wrap list in an expression, e.g. ({ std::vector<C2FieldDescriptor> list; })) which converts
+// it from an initializer list to a vector.
+#define DESCRIBE_TEMPLATED_C2STRUCT(strukt, list...) \
+ _DESCRIBE_TEMPLATABLE_C2STRUCT(template<>, strukt, __C2_GENERATE_GLOBAL_VARS__, list)
+
+/// \deprecated
+/// Describe the fields of a structure using an initializer list.
+#define DESCRIBE_C2STRUCT(name, list...) \
+ _DESCRIBE_TEMPLATABLE_C2STRUCT(, C2##name##Struct, __C2_GENERATE_GLOBAL_VARS__, list)
+
+/// \ingroup internal
+/// Macro layer to get value of enabled that is passed in as a macro variable
+#define _DESCRIBE_TEMPLATABLE_C2STRUCT(template, strukt, enabled, list...) \
+ __DESCRIBE_TEMPLATABLE_C2STRUCT(template, strukt, enabled, list)
+
+/// \ingroup internal
+/// Macro layer to resolve to the specific macro based on macro variable
+#define __DESCRIBE_TEMPLATABLE_C2STRUCT(template, strukt, enabled, list...) \
+ ___DESCRIBE_TEMPLATABLE_C2STRUCT##enabled(template, strukt, list)
+
+#define ___DESCRIBE_TEMPLATABLE_C2STRUCT(template, strukt, list...) \
+ template \
+ const std::vector<C2FieldDescriptor> strukt::FieldList() { return list; }
+
+#define ___DESCRIBE_TEMPLATABLE_C2STRUCT__C2_GENERATE_GLOBAL_VARS__(template, strukt, list...)
+
+/**
+ * Describe a field of a structure.
+ * These must be in order.
+ *
+ * There are two ways to use this macro:
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ * struct C2VideoWidthStruct {
+ * int32_t width;
+ * C2VideoWidthStruct() {} // optional default constructor
+ * C2VideoWidthStruct(int32_t _width) : width(_width) {}
+ *
+ * DEFINE_AND_DESCRIBE_C2STRUCT(VideoWidth)
+ * C2FIELD(width, "width")
+ * };
+ * ~~~~~~~~~~~~~
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ * struct C2VideoWidthStruct {
+ * int32_t width;
+ * C2VideoWidthStruct() = default; // optional default constructor
+ * C2VideoWidthStruct(int32_t _width) : width(_width) {}
+ *
+ * DEFINE_C2STRUCT(VideoWidth)
+ * } C2_PACK;
+ *
+ * DESCRIBE_C2STRUCT(VideoWidth, {
+ * C2FIELD(width, "width")
+ * })
+ * ~~~~~~~~~~~~~
+ *
+ * For flexible structures (those ending in T[]), use the flexible macros:
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ * struct C2VideoFlexWidthsStruct {
+ * int32_t widths[];
+ * C2VideoFlexWidthsStruct(); // must have a default constructor
+ *
+ * private:
+ * // may have private constructors taking number of widths as the first argument
+ * // This is used by the C2Param factory methods, e.g.
+ * // C2VideoFlexWidthsGlobalParam::AllocUnique(size_t, int32_t);
+ * C2VideoFlexWidthsStruct(size_t flexCount, int32_t value) {
+ * for (size_t i = 0; i < flexCount; ++i) {
+ * widths[i] = value;
+ * }
+ * }
+ *
+ * // If the last argument is T[N] or std::initializer_list<T>, the flexCount will
+ * // be automatically calculated and passed by the C2Param factory methods, e.g.
+ * // int widths[] = { 1, 2, 3 };
+ * // C2VideoFlexWidthsGlobalParam::AllocUnique(widths);
+ * template<unsigned N>
+ * C2VideoFlexWidthsStruct(size_t flexCount, const int32_t(&init)[N]) {
+ * for (size_t i = 0; i < flexCount; ++i) {
+ * widths[i] = init[i];
+ * }
+ * }
+ *
+ * DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(VideoFlexWidths, widths)
+ * C2FIELD(widths, "widths")
+ * };
+ * ~~~~~~~~~~~~~
+ *
+ * ~~~~~~~~~~~~~ (.cpp)
+ * struct C2VideoFlexWidthsStruct {
+ * int32_t mWidths[];
+ * C2VideoFlexWidthsStruct(); // must have a default constructor
+ *
+ * DEFINE_FLEX_C2STRUCT(VideoFlexWidths, mWidths)
+ * } C2_PACK;
+ *
+ * DESCRIBE_C2STRUCT(VideoFlexWidths, {
+ * C2FIELD(mWidths, "widths")
+ * })
+ * ~~~~~~~~~~~~~
+ *
+ */
+#define DESCRIBE_C2FIELD(member, name) \
+ C2FieldDescriptor(&((_type*)(nullptr))->member, name),
+
+#define C2FIELD(member, name) _C2FIELD(member, name, __C2_GENERATE_GLOBAL_VARS__)
+/// \if 0
+#define _C2FIELD(member, name, enabled) __C2FIELD(member, name, enabled)
+#define __C2FIELD(member, name, enabled) DESCRIBE_C2FIELD##enabled(member, name)
+#define DESCRIBE_C2FIELD__C2_GENERATE_GLOBAL_VARS__(member, name)
+/// \endif
+
+/// Define a structure with matching CORE_INDEX and start describing its fields.
+/// This must be at the end of the structure definition.
+#define DEFINE_AND_DESCRIBE_C2STRUCT(name) \
+ _DEFINE_AND_DESCRIBE_C2STRUCT(name, DEFINE_C2STRUCT, __C2_GENERATE_GLOBAL_VARS__)
+
+/// Define a base structure (with no CORE_INDEX) and start describing its fields.
+/// This must be at the end of the structure definition.
+#define DEFINE_AND_DESCRIBE_BASE_C2STRUCT(name) \
+ _DEFINE_AND_DESCRIBE_C2STRUCT(name, DEFINE_BASE_C2STRUCT, __C2_GENERATE_GLOBAL_VARS__)
+
+/// Define a flexible structure with matching CORE_INDEX and start describing its fields.
+/// This must be at the end of the structure definition.
+#define DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(name, flexMember) \
+ _DEFINE_AND_DESCRIBE_FLEX_C2STRUCT( \
+ name, flexMember, DEFINE_FLEX_C2STRUCT, __C2_GENERATE_GLOBAL_VARS__)
+
+/// Define a flexible base structure (with no CORE_INDEX) and start describing its fields.
+/// This must be at the end of the structure definition.
+#define DEFINE_AND_DESCRIBE_BASE_FLEX_C2STRUCT(name, flexMember) \
+ _DEFINE_AND_DESCRIBE_FLEX_C2STRUCT( \
+ name, flexMember, DEFINE_BASE_FLEX_C2STRUCT, __C2_GENERATE_GLOBAL_VARS__)
+
+/// \if 0
+/*
+ Alternate declaration of field definitions in case no field list is to be generated.
+ The specific macro is chosed based on the value of __C2_GENERATE_GLOBAL_VARS__ (whether it is
+ defined (to be empty) or not. This requires two level of macro substitution.
+ TRICKY: use namespace declaration to handle closing bracket that is normally after
+ these macros.
+*/
+
+#define _DEFINE_AND_DESCRIBE_C2STRUCT(name, defineMacro, enabled) \
+ __DEFINE_AND_DESCRIBE_C2STRUCT(name, defineMacro, enabled)
+#define __DEFINE_AND_DESCRIBE_C2STRUCT(name, defineMacro, enabled) \
+ ___DEFINE_AND_DESCRIBE_C2STRUCT##enabled(name, defineMacro)
+#define ___DEFINE_AND_DESCRIBE_C2STRUCT__C2_GENERATE_GLOBAL_VARS__(name, defineMacro) \
+ defineMacro(name) } C2_PACK; namespace {
+#define ___DEFINE_AND_DESCRIBE_C2STRUCT(name, defineMacro) \
+ defineMacro(name) } C2_PACK; \
+ const std::vector<C2FieldDescriptor> C2##name##Struct::FieldList() { return _FIELD_LIST; } \
+ const std::vector<C2FieldDescriptor> C2##name##Struct::_FIELD_LIST = {
+
+#define _DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(name, flexMember, defineMacro, enabled) \
+ __DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(name, flexMember, defineMacro, enabled)
+#define __DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(name, flexMember, defineMacro, enabled) \
+ ___DEFINE_AND_DESCRIBE_FLEX_C2STRUCT##enabled(name, flexMember, defineMacro)
+#define ___DEFINE_AND_DESCRIBE_FLEX_C2STRUCT__C2_GENERATE_GLOBAL_VARS__(name, flexMember, defineMacro) \
+ defineMacro(name, flexMember) } C2_PACK; namespace {
+#define ___DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(name, flexMember, defineMacro) \
+ defineMacro(name, flexMember) } C2_PACK; \
+ const std::vector<C2FieldDescriptor> C2##name##Struct::FieldList() { return _FIELD_LIST; } \
+ const std::vector<C2FieldDescriptor> C2##name##Struct::_FIELD_LIST = {
+/// \endif
+
+
+/**
+ * Parameter reflector class.
+ *
+ * This class centralizes the description of parameter structures. This can be shared
+ * by multiple components as describing a parameter does not imply support of that
+ * parameter. However, each supported parameter and any dependent structures within
+ * must be described by the parameter reflector provided by a component.
+ */
+class C2ParamReflector {
+public:
+ /**
+ * Describes a parameter structure.
+ *
+ * \param[in] coreIndex the core index of the parameter structure containing at least the
+ * core index
+ *
+ * \return the description of the parameter structure
+ * \retval nullptr if the parameter is not supported by this reflector
+ *
+ * This methods shall not block and return immediately.
+ *
+ * \note this class does not take a set of indices because we would then prefer
+ * to also return any dependent structures, and we don't want this logic to be
+ * repeated in each reflector. Alternately, this could just return a map of all
+ * descriptions, but we want to conserve memory if client only wants the description
+ * of a few indices.
+ */
+ virtual std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex coreIndex) const = 0;
+
+protected:
+ virtual ~C2ParamReflector() = default;
+};
+
+/**
+ * Generic supported values for a field.
+ *
+ * This can be either a range or a set of values. The range can be a simple range, an arithmetic,
+ * geometric or multiply-accumulate series with a clear minimum and maximum value. Values can
+ * be discrete values, or can optionally represent flags to be or-ed.
+ *
+ * \note Do not use flags to represent bitfields. Use individual values or separate fields instead.
+ */
+struct C2FieldSupportedValues {
+//public:
+ enum type_t {
+ EMPTY, ///< no supported values
+ RANGE, ///< a numeric range that can be continuous or discrete
+ VALUES, ///< a list of values
+ FLAGS ///< a list of flags that can be OR-ed
+ };
+
+ type_t type; /** Type of values for this field. */
+
+ typedef C2Value::Primitive Primitive;
+
+ /**
+ * Range specifier for supported value. Used if type is RANGE.
+ *
+ * If step is 0 and num and denom are both 1, the supported values are any value, for which
+ * min <= value <= max.
+ *
+ * Otherwise, the range represents a geometric/arithmetic/multiply-accumulate series, where
+ * successive supported values can be derived from previous values (starting at min), using the
+ * following formula:
+ * v[0] = min
+ * v[i] = v[i-1] * num / denom + step for i >= 1, while min < v[i] <= max.
+ */
+ struct {
+ /** Lower end of the range (inclusive). */
+ Primitive min;
+ /** Upper end of the range (inclusive if permitted by series). */
+ Primitive max;
+ /** Step between supported values. */
+ Primitive step;
+ /** Numerator of a geometric series. */
+ Primitive num;
+ /** Denominator of a geometric series. */
+ Primitive denom;
+ } range;
+
+ /**
+ * List of values. Used if type is VALUES or FLAGS.
+ *
+ * If type is VALUES, this is the list of supported values in decreasing preference.
+ *
+ * If type is FLAGS, this vector contains { min-mask, flag1, flag2... }. Basically, the first
+ * value is the required set of flags to be set, and the rest of the values are flags that can
+ * be set independently. FLAGS is only supported for integral types. Supported flags should
+ * not overlap, as it can make validation non-deterministic. The standard validation method
+ * is that starting from the original value, if each flag is removed when fully present (the
+ * min-mask must be fully present), we shall arrive at 0.
+ */
+ std::vector<Primitive> values;
+
+ C2FieldSupportedValues()
+ : type(EMPTY) {
+ }
+
+ template<typename T>
+ C2FieldSupportedValues(T min, T max, T step = T(std::is_floating_point<T>::value ? 0 : 1))
+ : type(RANGE),
+ range{min, max, step, (T)1, (T)1} { }
+
+ template<typename T>
+ C2FieldSupportedValues(T min, T max, T num, T den) :
+ type(RANGE),
+ range{min, max, (T)0, num, den} { }
+
+ template<typename T>
+ C2FieldSupportedValues(T min, T max, T step, T num, T den)
+ : type(RANGE),
+ range{min, max, step, num, den} { }
+
+ /// \deprecated
+ template<typename T>
+ C2FieldSupportedValues(bool flags, std::initializer_list<T> list)
+ : type(flags ? FLAGS : VALUES),
+ range{(T)0, (T)0, (T)0, (T)0, (T)0} {
+ for (T value : list) {
+ values.emplace_back(value);
+ }
+ }
+
+ /// \deprecated
+ template<typename T>
+ C2FieldSupportedValues(bool flags, const std::vector<T>& list)
+ : type(flags ? FLAGS : VALUES),
+ range{(T)0, (T)0, (T)0, (T)0, (T)0} {
+ for(T value : list) {
+ values.emplace_back(value);
+ }
+ }
+
+ /// \internal
+ /// \todo: create separate values vs. flags initializer as for flags we want
+ /// to list both allowed and required flags
+ template<typename T, typename E=decltype(C2FieldDescriptor::namedValuesFor(*(T*)0))>
+ C2FieldSupportedValues(bool flags, const T*)
+ : type(flags ? FLAGS : VALUES),
+ range{(T)0, (T)0, (T)0, (T)0, (T)0} {
+ C2FieldDescriptor::NamedValuesType named = C2FieldDescriptor::namedValuesFor(*(T*)0);
+ if (flags) {
+ values.emplace_back(0); // min-mask defaults to 0
+ }
+ for (const C2FieldDescriptor::NamedValueType &item : named){
+ values.emplace_back(item.second);
+ }
+ }
+};
+
+/**
+ * Supported values for a specific field.
+ *
+ * This is a pair of the field specifier together with an optional supported values object.
+ * This structure is used when reporting parameter configuration failures and conflicts.
+ */
+struct C2ParamFieldValues {
+ C2ParamField paramOrField; ///< the field or parameter
+ /// optional supported values for the field if paramOrField specifies an actual field that is
+ /// numeric (non struct, blob or string). Supported values for arrays (including string and
+ /// blobs) describe the supported values for each element (character for string, and bytes for
+ /// blobs). It is optional for read-only strings and blobs.
+ std::unique_ptr<C2FieldSupportedValues> values;
+
+ // This struct is meant to be move constructed.
+ C2_DEFAULT_MOVE(C2ParamFieldValues);
+
+ // Copy constructor/assignment is also provided as this object may get copied.
+ C2ParamFieldValues(const C2ParamFieldValues &other)
+ : paramOrField(other.paramOrField),
+ values(other.values ? std::make_unique<C2FieldSupportedValues>(*other.values) : nullptr) { }
+
+ C2ParamFieldValues& operator=(const C2ParamFieldValues &other) {
+ paramOrField = other.paramOrField;
+ values = other.values ? std::make_unique<C2FieldSupportedValues>(*other.values) : nullptr;
+ return *this;
+ }
+
+
+ /**
+ * Construct with no values.
+ */
+ C2ParamFieldValues(const C2ParamField ¶mOrField_)
+ : paramOrField(paramOrField_) { }
+
+ /**
+ * Construct with values.
+ */
+ C2ParamFieldValues(const C2ParamField ¶mOrField_, const C2FieldSupportedValues &values_)
+ : paramOrField(paramOrField_),
+ values(std::make_unique<C2FieldSupportedValues>(values_)) { }
+
+ /**
+ * Construct from fields.
+ */
+ C2ParamFieldValues(const C2ParamField ¶mOrField_, std::unique_ptr<C2FieldSupportedValues> &&values_)
+ : paramOrField(paramOrField_),
+ values(std::move(values_)) { }
+};
+
+/// @}
+
+// include debug header for C2Params.h if C2Debug.h was already included
+#ifdef C2UTILS_DEBUG_H_
+#include <util/C2Debug-param.h>
+#endif
+
+#endif // C2PARAM_H_
diff --git a/media/codec2/core/include/C2ParamDef.h b/media/codec2/core/include/C2ParamDef.h
new file mode 100644
index 0000000..0a33283
--- /dev/null
+++ b/media/codec2/core/include/C2ParamDef.h
@@ -0,0 +1,931 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** \file
+ * Templates used to declare parameters.
+ */
+#ifndef C2PARAM_DEF_H_
+#define C2PARAM_DEF_H_
+
+#include <type_traits>
+
+#include <C2Param.h>
+
+/// \addtogroup Parameters
+/// @{
+
+/* ======================== UTILITY TEMPLATES FOR PARAMETER DEFINITIONS ======================== */
+
+/// \addtogroup internal
+/// @{
+
+/// Helper class that checks if a type has equality and inequality operators.
+struct C2_HIDE _C2Comparable_impl
+{
+ template<typename S, typename=decltype(S() == S())>
+ static std::true_type TestEqual(int);
+ template<typename>
+ static std::false_type TestEqual(...);
+
+ template<typename S, typename=decltype(S() != S())>
+ static std::true_type TestNotEqual(int);
+ template<typename>
+ static std::false_type TestNotEqual(...);
+};
+
+/**
+ * Helper template that returns if a type has equality and inequality operators.
+ *
+ * Use as _C2Comparable<typename S>::value.
+ */
+template<typename S>
+struct C2_HIDE _C2Comparable
+ : public std::integral_constant<bool, decltype(_C2Comparable_impl::TestEqual<S>(0))::value
+ || decltype(_C2Comparable_impl::TestNotEqual<S>(0))::value> {
+};
+
+/// Helper class that checks if a type has a CORE_INDEX constant.
+struct C2_HIDE _C2CoreIndexHelper_impl
+{
+ template<typename S, int=S::CORE_INDEX>
+ static std::true_type TestCoreIndex(int);
+ template<typename>
+ static std::false_type TestCoreIndex(...);
+};
+
+/// Macro that defines and thus overrides a type's CORE_INDEX for a setting
+#define _C2_CORE_INDEX_OVERRIDE(coreIndex) \
+public: \
+ enum : uint32_t { CORE_INDEX = coreIndex };
+
+
+/// Helper template that adds a CORE_INDEX to a type if it does not have one (for testing)
+template<typename S, int CoreIndex>
+struct C2_HIDE _C2AddCoreIndex : public S {
+ _C2_CORE_INDEX_OVERRIDE(CoreIndex)
+};
+
+/**
+ * \brief Helper class to check struct requirements for parameters.
+ *
+ * Features:
+ * - verify default constructor, no virtual methods, and no equality operators.
+ * - expose PARAM_TYPE, and non-flex FLEX_SIZE.
+ */
+template<typename S, int CoreIndex, unsigned TypeFlags>
+struct C2_HIDE _C2StructCheck {
+ static_assert(
+ std::is_default_constructible<S>::value, "C2 structure must have default constructor");
+ static_assert(!std::is_polymorphic<S>::value, "C2 structure must not have virtual methods");
+ static_assert(!_C2Comparable<S>::value, "C2 structure must not have operator== or !=");
+
+public:
+ enum : uint32_t {
+ PARAM_TYPE = CoreIndex | TypeFlags
+ };
+
+protected:
+ enum : uint32_t {
+ FLEX_SIZE = 0,
+ };
+};
+
+/// Helper class that checks if a type has an integer FLEX_SIZE member.
+struct C2_HIDE _C2Flexible_impl {
+ /// specialization for types that have a FLEX_SIZE member
+ template<typename S, unsigned=S::FLEX_SIZE>
+ static std::true_type TestFlexSize(int);
+ template<typename>
+ static std::false_type TestFlexSize(...);
+};
+
+/// Helper template that returns if a type has an integer FLEX_SIZE member.
+template<typename S>
+struct C2_HIDE _C2Flexible
+ : public std::integral_constant<bool, decltype(_C2Flexible_impl::TestFlexSize<S>(0))::value> {
+};
+
+/// Macro to test if a type is flexible (has a FLEX_SIZE member).
+#define IF_FLEXIBLE(S) ENABLE_IF(_C2Flexible<S>::value)
+/// Shorthand for std::enable_if
+#define ENABLE_IF(cond) typename std::enable_if<cond>::type
+
+template<typename T, typename V=void>
+struct C2_HIDE _c2_enable_if_type {
+ typedef V type;
+};
+
+/// Helper template that exposes the flexible subtype of a struct.
+template<typename S, typename E=void>
+struct C2_HIDE _C2FlexHelper {
+ typedef void FlexType;
+ enum : uint32_t { FLEX_SIZE = 0 };
+};
+
+/// Specialization for flexible types. This only works if _FlexMemberType is public.
+template<typename S>
+struct C2_HIDE _C2FlexHelper<S,
+ typename _c2_enable_if_type<typename S::_FlexMemberType>::type> {
+ typedef typename _C2FlexHelper<typename S::_FlexMemberType>::FlexType FlexType;
+ enum : uint32_t { FLEX_SIZE = _C2FlexHelper<typename S::_FlexMemberType>::FLEX_SIZE };
+};
+
+/// Specialization for flex arrays.
+template<typename S>
+struct C2_HIDE _C2FlexHelper<S[],
+ typename std::enable_if<std::is_void<typename _C2FlexHelper<S>::FlexType>::value>::type> {
+ typedef S FlexType;
+ enum : uint32_t { FLEX_SIZE = sizeof(S) };
+};
+
+/**
+ * \brief Helper class to check flexible struct requirements and add common operations.
+ *
+ * Features:
+ * - expose CORE_INDEX and FieldList (this is normally inherited from the struct, but flexible
+ * structs cannot be base classes and thus inherited from)
+ * - disable copy assignment and construction (TODO: this is already done in the FLEX macro for the
+ * flexible struct, so may not be needed here)
+ */
+template<typename S, int ParamIndex, unsigned TypeFlags>
+struct C2_HIDE _C2FlexStructCheck :
+// add flexible flag as _C2StructCheck defines PARAM_TYPE
+ public _C2StructCheck<S, ParamIndex | C2Param::CoreIndex::IS_FLEX_FLAG, TypeFlags> {
+public:
+ enum : uint32_t {
+ /// \hideinitializer
+ CORE_INDEX = ParamIndex | C2Param::CoreIndex::IS_FLEX_FLAG, ///< flexible struct core-index
+ };
+
+ inline static const std::vector<C2FieldDescriptor> FieldList() { return S::FieldList(); }
+
+ // default constructor needed because of the disabled copy constructor
+ inline _C2FlexStructCheck() = default;
+
+protected:
+ // cannot copy flexible params
+ _C2FlexStructCheck(const _C2FlexStructCheck<S, ParamIndex, TypeFlags> &) = delete;
+ _C2FlexStructCheck& operator= (const _C2FlexStructCheck<S, ParamIndex, TypeFlags> &) = delete;
+
+ // constants used for helper methods
+ enum : uint32_t {
+ /// \hideinitializer
+ FLEX_SIZE = _C2FlexHelper<S>::FLEX_SIZE, ///< size of flexible type
+ /// \hideinitializer
+ MAX_SIZE = (uint32_t)std::min((size_t)UINT32_MAX, SIZE_MAX), // TODO: is this always u32 max?
+ /// \hideinitializer
+ BASE_SIZE = sizeof(S) + sizeof(C2Param), ///< size of the base param
+ };
+
+ /// returns the allocated size of this param with flexCount, or 0 if it would overflow.
+ inline static size_t CalcSize(size_t flexCount, size_t size = BASE_SIZE) {
+ if (flexCount <= (MAX_SIZE - size) / S::FLEX_SIZE) {
+ return size + S::FLEX_SIZE * flexCount;
+ }
+ return 0;
+ }
+
+ /// dynamic new operator usable for params of type S
+ inline void* operator new(size_t size, size_t flexCount) noexcept {
+ // TODO: assert(size == BASE_SIZE);
+ size = CalcSize(flexCount, size);
+ if (size > 0) {
+ return ::operator new(size);
+ }
+ return nullptr;
+ }
+};
+
+/// Define From() cast operators for params.
+#define DEFINE_CAST_OPERATORS(_Type) \
+ inline static _Type* From(C2Param *other) { \
+ return (_Type*)C2Param::IfSuitable( \
+ other, sizeof(_Type), _Type::PARAM_TYPE, _Type::FLEX_SIZE, \
+ (_Type::PARAM_TYPE & T::Index::DIR_UNDEFINED) != T::Index::DIR_UNDEFINED); \
+ } \
+ inline static const _Type* From(const C2Param *other) { \
+ return const_cast<const _Type*>(From(const_cast<C2Param *>(other))); \
+ } \
+ inline static _Type* From(std::nullptr_t) { return nullptr; } \
+
+/**
+ * Define flexible allocators (AllocShared or AllocUnique) for flexible params.
+ * - P::AllocXyz(flexCount, args...): allocate for given flex-count. This maps to
+ * T(flexCount, args...)\
+ *
+ * Clang does not support args... followed by templated param as args... eats it. Hence,
+ * provide specializations where the initializer replaces the flexCount.
+ *
+ * Specializations that deduce flexCount:
+ * - P::AllocXyz(T[], args...): allocate for size of (and with) init array.
+ * - P::AllocXyz(std::initializer_list<T>, args...): allocate for size of (and with) initializer
+ * list.
+ * - P::AllocXyz(std::vector<T>, args...): allocate for size of (and with) init vector.
+ * These specializations map to T(flexCount = size-of-init, args..., init)
+ */
+#define DEFINE_FLEXIBLE_ALLOC(_Type, S, ptr, Ptr) \
+ template<typename ...Args> \
+ inline static std::ptr##_ptr<_Type> Alloc##Ptr(size_t flexCount, const Args(&... args)) { \
+ return std::ptr##_ptr<_Type>(new(flexCount) _Type(flexCount, args...)); \
+ } \
+ template<typename ...Args, typename U=typename S::FlexType> \
+ inline static std::ptr##_ptr<_Type> Alloc##Ptr( \
+ const std::initializer_list<U> &init, const Args(&... args)) { \
+ return std::ptr##_ptr<_Type>(new(init.size()) _Type(init.size(), args..., init)); \
+ } \
+ template<typename ...Args, typename U=typename S::FlexType> \
+ inline static std::ptr##_ptr<_Type> Alloc##Ptr( \
+ const std::vector<U> &init, const Args(&... args)) { \
+ return std::ptr##_ptr<_Type>(new(init.size()) _Type(init.size(), args..., init)); \
+ } \
+ template<typename ...Args, typename U=typename S::FlexType, unsigned N> \
+ inline static std::ptr##_ptr<_Type> Alloc##Ptr(const U(&init)[N], const Args(&... args)) { \
+ return std::ptr##_ptr<_Type>(new(N) _Type(N, args..., init)); \
+ } \
+
+/**
+ * Define flexible methods AllocShared, AllocUnique and flexCount.
+ */
+#define DEFINE_FLEXIBLE_METHODS(_Type, S) \
+ DEFINE_FLEXIBLE_ALLOC(_Type, S, shared, Shared) \
+ DEFINE_FLEXIBLE_ALLOC(_Type, S, unique, Unique) \
+ inline size_t flexCount() const { \
+ static_assert(sizeof(_Type) == _Type::BASE_SIZE, "incorrect BASE_SIZE"); \
+ size_t sz = this->size(); \
+ if (sz >= sizeof(_Type)) { \
+ return (sz - sizeof(_Type)) / _Type::FLEX_SIZE; \
+ } \
+ return 0; \
+ } \
+
+/// Mark flexible member variable and make structure flexible.
+#define FLEX(cls, m) \
+ C2_DO_NOT_COPY(cls) \
+private: \
+ C2PARAM_MAKE_FRIENDS \
+ /** \if 0 */ \
+ template<typename, typename> friend struct _C2FlexHelper; \
+public: \
+ typedef decltype(m) _FlexMemberType; \
+ /* default constructor with flexCount */ \
+ inline cls(size_t) : cls() {} \
+ /* constexpr static _FlexMemberType cls::* flexMember = &cls::m; */ \
+ typedef typename _C2FlexHelper<_FlexMemberType>::FlexType FlexType; \
+ static_assert(\
+ !std::is_void<FlexType>::value, \
+ "member is not flexible, or a flexible array of a flexible type"); \
+ enum : uint32_t { FLEX_SIZE = _C2FlexHelper<_FlexMemberType>::FLEX_SIZE }; \
+ /** \endif */ \
+
+/// @}
+
+/**
+ * Global-parameter template.
+ *
+ * Base template to define a global setting/tuning or info based on a structure and
+ * an optional ParamIndex. Global parameters are not tied to a port (input or output).
+ *
+ * Parameters wrap structures by prepending a (parameter) header. The fields of the wrapped
+ * structure can be accessed directly, and constructors and potential public methods are also
+ * wrapped.
+ *
+ * \tparam T param type C2Setting, C2Tuning or C2Info
+ * \tparam S wrapped structure
+ * \tparam ParamIndex optional parameter index override. Must be specified for base/reused
+ * structures.
+ */
+template<typename T, typename S, int ParamIndex=S::CORE_INDEX, class Flex=void>
+struct C2_HIDE C2GlobalParam : public T, public S,
+ public _C2StructCheck<S, ParamIndex, T::PARAM_KIND | T::Type::DIR_GLOBAL> {
+ _C2_CORE_INDEX_OVERRIDE(ParamIndex)
+private:
+ typedef C2GlobalParam<T, S, ParamIndex> _Type;
+
+public:
+ /// Wrapper around base structure's constructor.
+ template<typename ...Args>
+ inline C2GlobalParam(const Args(&... args)) : T(sizeof(_Type), _Type::PARAM_TYPE), S(args...) { }
+
+ DEFINE_CAST_OPERATORS(_Type)
+};
+
+/**
+ * Global-parameter template for flexible structures.
+ *
+ * Base template to define a global setting/tuning or info based on a flexible structure and
+ * an optional ParamIndex. Global parameters are not tied to a port (input or output).
+ *
+ * \tparam T param type C2Setting, C2Tuning or C2Info
+ * \tparam S wrapped flexible structure
+ * \tparam ParamIndex optional parameter index override. Must be specified for base/reused
+ * structures.
+ *
+ * Parameters wrap structures by prepending a (parameter) header. The fields and methods of flexible
+ * structures can be accessed via the m member variable; however, the constructors of the structure
+ * are wrapped directly. (This is because flexible types cannot be subclassed.)
+ */
+template<typename T, typename S, int ParamIndex>
+struct C2_HIDE C2GlobalParam<T, S, ParamIndex, IF_FLEXIBLE(S)>
+ : public T, public _C2FlexStructCheck<S, ParamIndex, T::PARAM_KIND | T::Type::DIR_GLOBAL> {
+private:
+ typedef C2GlobalParam<T, S, ParamIndex> _Type;
+
+ /// Wrapper around base structure's constructor.
+ template<typename ...Args>
+ inline C2GlobalParam(size_t flexCount, const Args(&... args))
+ : T(_Type::CalcSize(flexCount), _Type::PARAM_TYPE), m(flexCount, args...) { }
+
+public:
+ S m; ///< wrapped flexible structure
+
+ DEFINE_FLEXIBLE_METHODS(_Type, S)
+ DEFINE_CAST_OPERATORS(_Type)
+};
+
+/**
+ * Port-parameter template.
+ *
+ * Base template to define a port setting/tuning or info based on a structure and
+ * an optional ParamIndex. Port parameters are tied to a port (input or output), but not to a
+ * specific stream.
+ *
+ * \tparam T param type C2Setting, C2Tuning or C2Info
+ * \tparam S wrapped structure
+ * \tparam ParamIndex optional parameter index override. Must be specified for base/reused
+ * structures.
+ *
+ * Parameters wrap structures by prepending a (parameter) header. The fields of the wrapped
+ * structure can be accessed directly, and constructors and potential public methods are also
+ * wrapped.
+ *
+ * There are 3 flavors of port parameters: unspecified, input and output. Parameters with
+ * unspecified port expose a setPort method, and add an initial port parameter to the constructor.
+ */
+template<typename T, typename S, int ParamIndex=S::CORE_INDEX, class Flex=void>
+struct C2_HIDE C2PortParam : public T, public S,
+ private _C2StructCheck<S, ParamIndex, T::PARAM_KIND | T::Index::DIR_UNDEFINED> {
+ _C2_CORE_INDEX_OVERRIDE(ParamIndex)
+private:
+ typedef C2PortParam<T, S, ParamIndex> _Type;
+
+public:
+ /// Default constructor.
+ inline C2PortParam() : T(sizeof(_Type), _Type::PARAM_TYPE) { }
+ template<typename ...Args>
+ /// Wrapper around base structure's constructor while specifying port/direction.
+ inline C2PortParam(bool _output, const Args(&... args))
+ : T(sizeof(_Type), _output ? output::PARAM_TYPE : input::PARAM_TYPE), S(args...) { }
+ /// Set port/direction.
+ inline void setPort(bool output) { C2Param::setPort(output); }
+
+ DEFINE_CAST_OPERATORS(_Type)
+
+ /// Specialization for an input port parameter.
+ struct input : public T, public S,
+ public _C2StructCheck<S, ParamIndex, T::PARAM_KIND | T::Index::DIR_INPUT> {
+ _C2_CORE_INDEX_OVERRIDE(ParamIndex)
+ /// Wrapper around base structure's constructor.
+ template<typename ...Args>
+ inline input(const Args(&... args)) : T(sizeof(_Type), input::PARAM_TYPE), S(args...) { }
+
+ DEFINE_CAST_OPERATORS(input)
+
+ };
+
+ /// Specialization for an output port parameter.
+ struct output : public T, public S,
+ public _C2StructCheck<S, ParamIndex, T::PARAM_KIND | T::Index::DIR_OUTPUT> {
+ _C2_CORE_INDEX_OVERRIDE(ParamIndex)
+ /// Wrapper around base structure's constructor.
+ template<typename ...Args>
+ inline output(const Args(&... args)) : T(sizeof(_Type), output::PARAM_TYPE), S(args...) { }
+
+ DEFINE_CAST_OPERATORS(output)
+ };
+};
+
+/**
+ * Port-parameter template for flexible structures.
+ *
+ * Base template to define a port setting/tuning or info based on a flexible structure and
+ * an optional ParamIndex. Port parameters are tied to a port (input or output), but not to a
+ * specific stream.
+ *
+ * \tparam T param type C2Setting, C2Tuning or C2Info
+ * \tparam S wrapped flexible structure
+ * \tparam ParamIndex optional parameter index override. Must be specified for base/reused
+ * structures.
+ *
+ * Parameters wrap structures by prepending a (parameter) header. The fields and methods of flexible
+ * structures can be accessed via the m member variable; however, the constructors of the structure
+ * are wrapped directly. (This is because flexible types cannot be subclassed.)
+ *
+ * There are 3 flavors of port parameters: unspecified, input and output. Parameters with
+ * unspecified port expose a setPort method, and add an initial port parameter to the constructor.
+ */
+template<typename T, typename S, int ParamIndex>
+struct C2_HIDE C2PortParam<T, S, ParamIndex, IF_FLEXIBLE(S)>
+ : public T, public _C2FlexStructCheck<S, ParamIndex, T::PARAM_KIND | T::Type::DIR_UNDEFINED> {
+private:
+ typedef C2PortParam<T, S, ParamIndex> _Type;
+
+ /// Default constructor for basic allocation: new(flexCount) P.
+ inline C2PortParam(size_t flexCount) : T(_Type::CalcSize(flexCount), _Type::PARAM_TYPE) { }
+ template<typename ...Args>
+ /// Wrapper around base structure's constructor while also specifying port/direction.
+ inline C2PortParam(size_t flexCount, bool _output, const Args(&... args))
+ : T(_Type::CalcSize(flexCount), _output ? output::PARAM_TYPE : input::PARAM_TYPE),
+ m(flexCount, args...) { }
+
+public:
+ /// Set port/direction.
+ inline void setPort(bool output) { C2Param::setPort(output); }
+
+ S m; ///< wrapped flexible structure
+
+ DEFINE_FLEXIBLE_METHODS(_Type, S)
+ DEFINE_CAST_OPERATORS(_Type)
+
+ /// Specialization for an input port parameter.
+ struct input : public T,
+ public _C2FlexStructCheck<S, ParamIndex, T::PARAM_KIND | T::Index::DIR_INPUT> {
+ private:
+ /// Wrapper around base structure's constructor while also specifying port/direction.
+ template<typename ...Args>
+ inline input(size_t flexCount, const Args(&... args))
+ : T(_Type::CalcSize(flexCount), input::PARAM_TYPE), m(flexCount, args...) { }
+
+ public:
+ S m; ///< wrapped flexible structure
+
+ DEFINE_FLEXIBLE_METHODS(input, S)
+ DEFINE_CAST_OPERATORS(input)
+ };
+
+ /// Specialization for an output port parameter.
+ struct output : public T,
+ public _C2FlexStructCheck<S, ParamIndex, T::PARAM_KIND | T::Index::DIR_OUTPUT> {
+ private:
+ /// Wrapper around base structure's constructor while also specifying port/direction.
+ template<typename ...Args>
+ inline output(size_t flexCount, const Args(&... args))
+ : T(_Type::CalcSize(flexCount), output::PARAM_TYPE), m(flexCount, args...) { }
+
+ public:
+ S m; ///< wrapped flexible structure
+
+ DEFINE_FLEXIBLE_METHODS(output, S)
+ DEFINE_CAST_OPERATORS(output)
+ };
+};
+
+/**
+ * Stream-parameter template.
+ *
+ * Base template to define a stream setting/tuning or info based on a structure and
+ * an optional ParamIndex. Stream parameters are tied to a specific stream on a port (input or
+ * output).
+ *
+ * \tparam T param type C2Setting, C2Tuning or C2Info
+ * \tparam S wrapped structure
+ * \tparam ParamIndex optional paramter index override. Must be specified for base/reused
+ * structures.
+ *
+ * Parameters wrap structures by prepending a (parameter) header. The fields of the wrapped
+ * structure can be accessed directly, and constructors and potential public methods are also
+ * wrapped.
+ *
+ * There are 3 flavors of stream parameters: unspecified port, input and output. All of these expose
+ * a setStream method and an extra initial streamID parameter for the constructor. Moreover,
+ * parameters with unspecified port expose a setPort method, and add an additional initial port
+ * parameter to the constructor.
+ */
+template<typename T, typename S, int ParamIndex=S::CORE_INDEX, class Flex=void>
+struct C2_HIDE C2StreamParam : public T, public S,
+ private _C2StructCheck<S, ParamIndex,
+ T::PARAM_KIND | T::Index::IS_STREAM_FLAG | T::Index::DIR_UNDEFINED> {
+ _C2_CORE_INDEX_OVERRIDE(ParamIndex)
+private:
+ typedef C2StreamParam<T, S, ParamIndex> _Type;
+
+public:
+ /// Default constructor. Port/direction and stream-ID is undefined.
+ inline C2StreamParam() : T(sizeof(_Type), _Type::PARAM_TYPE) { }
+ /// Wrapper around base structure's constructor while also specifying port/direction and
+ /// stream-ID.
+ template<typename ...Args>
+ inline C2StreamParam(bool _output, unsigned stream, const Args(&... args))
+ : T(sizeof(_Type), _output ? output::PARAM_TYPE : input::PARAM_TYPE, stream),
+ S(args...) { }
+ /// Set port/direction.
+ inline void setPort(bool output) { C2Param::setPort(output); }
+ /// Set stream-id. \retval true if the stream-id was successfully set.
+ inline bool setStream(unsigned stream) { return C2Param::setStream(stream); }
+
+ DEFINE_CAST_OPERATORS(_Type)
+
+ /// Specialization for an input stream parameter.
+ struct input : public T, public S,
+ public _C2StructCheck<S, ParamIndex,
+ T::PARAM_KIND | T::Index::IS_STREAM_FLAG | T::Type::DIR_INPUT> {
+ _C2_CORE_INDEX_OVERRIDE(ParamIndex)
+
+ /// Default constructor. Stream-ID is undefined.
+ inline input() : T(sizeof(_Type), input::PARAM_TYPE) { }
+ /// Wrapper around base structure's constructor while also specifying stream-ID.
+ template<typename ...Args>
+ inline input(unsigned stream, const Args(&... args))
+ : T(sizeof(_Type), input::PARAM_TYPE, stream), S(args...) { }
+ /// Set stream-id. \retval true if the stream-id was successfully set.
+ inline bool setStream(unsigned stream) { return C2Param::setStream(stream); }
+
+ DEFINE_CAST_OPERATORS(input)
+ };
+
+ /// Specialization for an output stream parameter.
+ struct output : public T, public S,
+ public _C2StructCheck<S, ParamIndex,
+ T::PARAM_KIND | T::Index::IS_STREAM_FLAG | T::Type::DIR_OUTPUT> {
+ _C2_CORE_INDEX_OVERRIDE(ParamIndex)
+
+ /// Default constructor. Stream-ID is undefined.
+ inline output() : T(sizeof(_Type), output::PARAM_TYPE) { }
+ /// Wrapper around base structure's constructor while also specifying stream-ID.
+ template<typename ...Args>
+ inline output(unsigned stream, const Args(&... args))
+ : T(sizeof(_Type), output::PARAM_TYPE, stream), S(args...) { }
+ /// Set stream-id. \retval true if the stream-id was successfully set.
+ inline bool setStream(unsigned stream) { return C2Param::setStream(stream); }
+
+ DEFINE_CAST_OPERATORS(output)
+ };
+};
+
+/**
+ * Stream-parameter template for flexible structures.
+ *
+ * Base template to define a stream setting/tuning or info based on a flexible structure and
+ * an optional ParamIndex. Stream parameters are tied to a specific stream on a port (input or
+ * output).
+ *
+ * \tparam T param type C2Setting, C2Tuning or C2Info
+ * \tparam S wrapped flexible structure
+ * \tparam ParamIndex optional parameter index override. Must be specified for base/reused
+ * structures.
+ *
+ * Parameters wrap structures by prepending a (parameter) header. The fields and methods of flexible
+ * structures can be accessed via the m member variable; however, the constructors of the structure
+ * are wrapped directly. (This is because flexible types cannot be subclassed.)
+ *
+ * There are 3 flavors of stream parameters: unspecified port, input and output. All of these expose
+ * a setStream method and an extra initial streamID parameter for the constructor. Moreover,
+ * parameters with unspecified port expose a setPort method, and add an additional initial port
+ * parameter to the constructor.
+ */
+template<typename T, typename S, int ParamIndex>
+struct C2_HIDE C2StreamParam<T, S, ParamIndex, IF_FLEXIBLE(S)>
+ : public T,
+ public _C2FlexStructCheck<S, ParamIndex,
+ T::PARAM_KIND | T::Index::IS_STREAM_FLAG | T::Index::DIR_UNDEFINED> {
+private:
+ typedef C2StreamParam<T, S, ParamIndex> _Type;
+ /// Default constructor. Port/direction and stream-ID is undefined.
+ inline C2StreamParam(size_t flexCount) : T(_Type::CalcSize(flexCount), _Type::PARAM_TYPE, 0u) { }
+ /// Wrapper around base structure's constructor while also specifying port/direction and
+ /// stream-ID.
+ template<typename ...Args>
+ inline C2StreamParam(size_t flexCount, bool _output, unsigned stream, const Args(&... args))
+ : T(_Type::CalcSize(flexCount), _output ? output::PARAM_TYPE : input::PARAM_TYPE, stream),
+ m(flexCount, args...) { }
+
+public:
+ S m; ///< wrapped flexible structure
+
+ /// Set port/direction.
+ inline void setPort(bool output) { C2Param::setPort(output); }
+ /// Set stream-id. \retval true if the stream-id was successfully set.
+ inline bool setStream(unsigned stream) { return C2Param::setStream(stream); }
+
+ DEFINE_FLEXIBLE_METHODS(_Type, S)
+ DEFINE_CAST_OPERATORS(_Type)
+
+ /// Specialization for an input stream parameter.
+ struct input : public T,
+ public _C2FlexStructCheck<S, ParamIndex,
+ T::PARAM_KIND | T::Index::IS_STREAM_FLAG | T::Type::DIR_INPUT> {
+ private:
+ /// Default constructor. Stream-ID is undefined.
+ inline input(size_t flexCount) : T(_Type::CalcSize(flexCount), input::PARAM_TYPE) { }
+ /// Wrapper around base structure's constructor while also specifying stream-ID.
+ template<typename ...Args>
+ inline input(size_t flexCount, unsigned stream, const Args(&... args))
+ : T(_Type::CalcSize(flexCount), input::PARAM_TYPE, stream), m(flexCount, args...) { }
+
+ public:
+ S m; ///< wrapped flexible structure
+
+ /// Set stream-id. \retval true if the stream-id was successfully set.
+ inline bool setStream(unsigned stream) { return C2Param::setStream(stream); }
+
+ DEFINE_FLEXIBLE_METHODS(input, S)
+ DEFINE_CAST_OPERATORS(input)
+ };
+
+ /// Specialization for an output stream parameter.
+ struct output : public T,
+ public _C2FlexStructCheck<S, ParamIndex,
+ T::PARAM_KIND | T::Index::IS_STREAM_FLAG | T::Type::DIR_OUTPUT> {
+ private:
+ /// Default constructor. Stream-ID is undefined.
+ inline output(size_t flexCount) : T(_Type::CalcSize(flexCount), output::PARAM_TYPE) { }
+ /// Wrapper around base structure's constructor while also specifying stream-ID.
+ template<typename ...Args>
+ inline output(size_t flexCount, unsigned stream, const Args(&... args))
+ : T(_Type::CalcSize(flexCount), output::PARAM_TYPE, stream), m(flexCount, args...) { }
+
+ public:
+ S m; ///< wrapped flexible structure
+
+ /// Set stream-id. \retval true if the stream-id was successfully set.
+ inline bool setStream(unsigned stream) { return C2Param::setStream(stream); }
+
+ DEFINE_FLEXIBLE_METHODS(output, S)
+ DEFINE_CAST_OPERATORS(output)
+ };
+};
+
+/* ======================== SIMPLE VALUE PARAMETERS ======================== */
+
+/**
+ * \ingroup internal
+ * A structure template encapsulating a single element with default constructors and no core-index.
+ */
+template<typename T>
+struct C2SimpleValueStruct {
+ T value; ///< simple value of the structure
+ // Default constructor.
+ inline C2SimpleValueStruct() = default;
+ // Constructor with an initial value.
+ inline C2SimpleValueStruct(T value) : value(value) {}
+ DEFINE_BASE_C2STRUCT(SimpleValue)
+};
+
+// TODO: move this and next to some generic place
+/**
+ * Interface to a block of (mapped) memory containing an array of some type (T).
+ */
+template<typename T>
+struct C2MemoryBlock {
+ /// \returns the number of elements in this block.
+ virtual size_t size() const = 0;
+ /// \returns a const pointer to the start of this block. Care must be taken to not read outside
+ /// the block.
+ virtual const T *data() const = 0; // TODO: should this be friend access only in some C2Memory module?
+ /// \returns a pointer to the start of this block. Care must be taken to not read or write
+ /// outside the block.
+ inline T *data() { return const_cast<T*>(const_cast<const C2MemoryBlock*>(this)->data()); }
+
+protected:
+ // TODO: for now it should never be deleted as C2MemoryBlock
+ virtual ~C2MemoryBlock() = default;
+};
+
+/**
+ * Interface to a block of memory containing a constant (constexpr) array of some type (T).
+ */
+template<typename T>
+struct C2ConstMemoryBlock : public C2MemoryBlock<T> {
+ virtual const T * data() const { return _mData; }
+ virtual size_t size() const { return _mSize; }
+
+ /// Constructor.
+ template<unsigned N>
+ inline constexpr C2ConstMemoryBlock(const T(&init)[N]) : _mData(init), _mSize(N) {}
+
+private:
+ const T *_mData;
+ const size_t _mSize;
+};
+
+/// \addtogroup internal
+/// @{
+
+/// Helper class to initialize flexible arrays with various initalizers.
+struct _C2ValueArrayHelper {
+ // char[]-s are used as null terminated strings, so the last element is never inited.
+
+ /// Initialize a flexible array using a constexpr memory block.
+ template<typename T>
+ static void init(T(&array)[], size_t arrayLen, const C2MemoryBlock<T> &block) {
+ // reserve last element for terminal 0 for strings
+ if (arrayLen && std::is_same<T, char>::value) {
+ --arrayLen;
+ }
+ if (block.data()) {
+ memcpy(array, block.data(), std::min(arrayLen, block.size()) * sizeof(T));
+ }
+ }
+
+ /// Initialize a flexible array using an initializer list.
+ template<typename T>
+ static void init(T(&array)[], size_t arrayLen, const std::initializer_list<T> &init) {
+ size_t ix = 0;
+ // reserve last element for terminal 0 for strings
+ if (arrayLen && std::is_same<T, char>::value) {
+ --arrayLen;
+ }
+ for (const T &item : init) {
+ if (ix == arrayLen) {
+ break;
+ }
+ array[ix++] = item;
+ }
+ }
+
+ /// Initialize a flexible array using a vector.
+ template<typename T>
+ static void init(T(&array)[], size_t arrayLen, const std::vector<T> &init) {
+ size_t ix = 0;
+ // reserve last element for terminal 0 for strings
+ if (arrayLen && std::is_same<T, char>::value) {
+ --arrayLen;
+ }
+ for (const T &item : init) {
+ if (ix == arrayLen) {
+ break;
+ }
+ array[ix++] = item;
+ }
+ }
+
+ /// Initialize a flexible array using another flexible array.
+ template<typename T, unsigned N>
+ static void init(T(&array)[], size_t arrayLen, const T(&str)[N]) {
+ // reserve last element for terminal 0 for strings
+ if (arrayLen && std::is_same<T, char>::value) {
+ --arrayLen;
+ }
+ if (arrayLen) {
+ memcpy(array, str, std::min(arrayLen, (size_t)N) * sizeof(T));
+ }
+ }
+};
+
+/**
+ * Specialization for a flexible blob and string arrays. A structure template encapsulating a single
+ * flexible array member with default flexible constructors and no core-index. This type cannot be
+ * constructed on its own as it's size is 0.
+ *
+ * \internal This is different from C2SimpleArrayStruct<T[]> simply because its member has the name
+ * as value to reflect this is a single value.
+ */
+template<typename T>
+struct C2SimpleValueStruct<T[]> {
+ static_assert(std::is_same<T, char>::value || std::is_same<T, uint8_t>::value,
+ "C2SimpleValueStruct<T[]> is only for BLOB or STRING");
+ T value[];
+
+ inline C2SimpleValueStruct() = default;
+ DEFINE_BASE_C2STRUCT(SimpleValue)
+ FLEX(C2SimpleValueStruct, value)
+
+private:
+ inline C2SimpleValueStruct(size_t flexCount, const C2MemoryBlock<T> &block) {
+ _C2ValueArrayHelper::init(value, flexCount, block);
+ }
+
+ inline C2SimpleValueStruct(size_t flexCount, const std::initializer_list<T> &init) {
+ _C2ValueArrayHelper::init(value, flexCount, init);
+ }
+
+ inline C2SimpleValueStruct(size_t flexCount, const std::vector<T> &init) {
+ _C2ValueArrayHelper::init(value, flexCount, init);
+ }
+
+ template<unsigned N>
+ inline C2SimpleValueStruct(size_t flexCount, const T(&init)[N]) {
+ _C2ValueArrayHelper::init(value, flexCount, init);
+ }
+};
+
+/// @}
+
+/**
+ * A structure template encapsulating a single flexible array element of a specific type (T) with
+ * default constructors and no core-index. This type cannot be constructed on its own as it's size
+ * is 0. Instead, it is meant to be used as a parameter, e.g.
+ *
+ * typedef C2StreamParam<C2Info, C2SimpleArrayStruct<C2MyFancyStruct>,
+ * kParamIndexMyFancyArrayStreamParam> C2MyFancyArrayStreamInfo;
+ */
+template<typename T>
+struct C2SimpleArrayStruct {
+ static_assert(!std::is_same<T, char>::value && !std::is_same<T, uint8_t>::value,
+ "use C2SimpleValueStruct<T[]> is for BLOB or STRING");
+
+ T values[]; ///< array member
+ /// Default constructor
+ inline C2SimpleArrayStruct() = default;
+ DEFINE_BASE_FLEX_C2STRUCT(SimpleArray, values)
+ //FLEX(C2SimpleArrayStruct, values)
+
+private:
+ /// Construct from a C2MemoryBlock.
+ /// Used only by the flexible parameter allocators (AllocUnique & AllocShared).
+ inline C2SimpleArrayStruct(size_t flexCount, const C2MemoryBlock<T> &block) {
+ _C2ValueArrayHelper::init(values, flexCount, block);
+ }
+
+ /// Construct from an initializer list.
+ /// Used only by the flexible parameter allocators (AllocUnique & AllocShared).
+ inline C2SimpleArrayStruct(size_t flexCount, const std::initializer_list<T> &init) {
+ _C2ValueArrayHelper::init(values, flexCount, init);
+ }
+
+ /// Construct from an vector.
+ /// Used only by the flexible parameter allocators (AllocUnique & AllocShared).
+ inline C2SimpleArrayStruct(size_t flexCount, const std::vector<T> &init) {
+ _C2ValueArrayHelper::init(values, flexCount, init);
+ }
+
+ /// Construct from another flexible array.
+ /// Used only by the flexible parameter allocators (AllocUnique & AllocShared).
+ template<unsigned N>
+ inline C2SimpleArrayStruct(size_t flexCount, const T(&init)[N]) {
+ _C2ValueArrayHelper::init(values, flexCount, init);
+ }
+};
+
+/**
+ * \addtogroup simplevalue Simple value and array structures.
+ * @{
+ *
+ * Simple value structures.
+ *
+ * Structures containing a single simple value. These can be reused to easily define simple
+ * parameters of various types:
+ *
+ * typedef C2PortParam<C2Tuning, C2Int32Value, kParamIndexMyIntegerPortParam>
+ * C2MyIntegerPortParamTuning;
+ *
+ * They contain a single member (value or values) that is described as "value" or "values".
+ *
+ * These structures don't define a core index, and as such, they cannot be used in structure
+ * declarations. Use type[] instead, such as int32_t field[].
+ */
+/// A 32-bit signed integer parameter in value, described as "value"
+typedef C2SimpleValueStruct<int32_t> C2Int32Value;
+/// A 32-bit signed integer array parameter in values, described as "values"
+typedef C2SimpleArrayStruct<int32_t> C2Int32Array;
+/// A 32-bit unsigned integer parameter in value, described as "value"
+typedef C2SimpleValueStruct<uint32_t> C2Uint32Value;
+/// A 32-bit unsigned integer array parameter in values, described as "values"
+typedef C2SimpleArrayStruct<uint32_t> C2Uint32Array;
+/// A 64-bit signed integer parameter in value, described as "value"
+typedef C2SimpleValueStruct<int64_t> C2Int64Value;
+/// A 64-bit signed integer array parameter in values, described as "values"
+typedef C2SimpleArrayStruct<int64_t> C2Int64Array;
+/// A 64-bit unsigned integer parameter in value, described as "value"
+typedef C2SimpleValueStruct<uint64_t> C2Uint64Value;
+/// A 64-bit unsigned integer array parameter in values, described as "values"
+typedef C2SimpleArrayStruct<uint64_t> C2Uint64Array;
+/// A float parameter in value, described as "value"
+typedef C2SimpleValueStruct<float> C2FloatValue;
+/// A float array parameter in values, described as "values"
+typedef C2SimpleArrayStruct<float> C2FloatArray;
+/// A blob flexible parameter in value, described as "value"
+typedef C2SimpleValueStruct<uint8_t[]> C2BlobValue;
+/// A string flexible parameter in value, described as "value"
+typedef C2SimpleValueStruct<char[]> C2StringValue;
+
+template<typename T>
+const std::vector<C2FieldDescriptor> C2SimpleValueStruct<T>::FieldList() {
+ return { DESCRIBE_C2FIELD(value, "value") };
+}
+template<typename T>
+const std::vector<C2FieldDescriptor> C2SimpleValueStruct<T[]>::FieldList() {
+ return { DESCRIBE_C2FIELD(value, "value") };
+}
+template<typename T>
+const std::vector<C2FieldDescriptor> C2SimpleArrayStruct<T>::FieldList() {
+ return { DESCRIBE_C2FIELD(values, "values") };
+}
+
+/// @}
+
+/// @}
+
+#endif // C2PARAM_DEF_H_
diff --git a/media/codec2/core/include/C2Work.h b/media/codec2/core/include/C2Work.h
new file mode 100644
index 0000000..6923f3e
--- /dev/null
+++ b/media/codec2/core/include/C2Work.h
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2WORK_H_
+
+#define C2WORK_H_
+
+#include <C2Buffer.h>
+#include <C2Param.h>
+
+#include <memory>
+#include <list>
+#include <vector>
+
+#include <stdint.h>
+#include <stdbool.h>
+
+/// \defgroup work Work and data processing
+/// @{
+
+/**
+ * Information describing the reason a parameter settings may fail, or
+ * may be overriden.
+ */
+struct C2SettingResult {
+ enum Failure : uint32_t {
+ /* parameter failures below */
+ BAD_TYPE, ///< parameter is not supported
+ BAD_PORT, ///< parameter is not supported on the specific port
+ BAD_INDEX, ///< parameter is not supported on the specific stream
+ READ_ONLY, ///< parameter is read-only and cannot be set
+ MISMATCH, ///< parameter mismatches input data
+
+ /* field failures below */
+ BAD_VALUE, ///< strict parameter does not accept value for the field at all
+ CONFLICT, ///< strict parameter field value is in conflict with an/other setting(s)
+
+ /// parameter field is out of range due to other settings (this failure mode
+ /// can only be used for strict calculated parameters)
+ UNSUPPORTED,
+
+ /// field does not access the requested parameter value at all. It has been corrected to
+ /// the closest supported value. This failure mode is provided to give guidance as to what
+ /// are the currently supported values for this field (which may be a subset of the at-all-
+ /// potential values)
+ INFO_BAD_VALUE,
+
+ /// requested parameter value is in conflict with an/other setting(s)
+ /// and has been corrected to the closest supported value. This failure
+ /// mode is given to provide guidance as to what are the currently supported values as well
+ /// as to optionally provide suggestion to the client as to how to enable the requested
+ /// parameter value.
+ INFO_CONFLICT,
+ };
+
+ Failure failure; ///< failure code
+
+ /// Failing (or corrected) field or parameterand optionally, currently supported values for the
+ /// field. Values must only be set for field failures other than BAD_VALUE, and only if they are
+ /// different from the globally supported values (e.g. due to restrictions by another param or
+ /// input data).
+ C2ParamFieldValues field;
+
+ /// Conflicting parameters or fields with optional suggestions with (optional) suggested values
+ /// for any conflicting fields to avoid the conflict. Must only be set for CONFLICT, UNSUPPORTED
+ /// and INFO_CONFLICT failure codes.
+ std::vector<C2ParamFieldValues> conflicts;
+};
+
+// ================================================================================================
+// WORK
+// ================================================================================================
+
+/** Unique ID for a processing node. */
+typedef uint32_t c2_node_id_t;
+
+enum {
+ kParamIndexWorkOrdinal,
+};
+
+/**
+ * Information for ordering work items on a component port.
+ */
+struct C2WorkOrdinalStruct {
+//public:
+ c2_cntr64_t timestamp; /** frame timestamp in microseconds */
+ c2_cntr64_t frameIndex; /** submission ordinal on the initial component */
+ c2_cntr64_t customOrdinal; /** can be given by the component, e.g. decode order */
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(WorkOrdinal)
+ C2FIELD(timestamp, "timestamp")
+ C2FIELD(frameIndex, "frame-index")
+ C2FIELD(customOrdinal, "custom-ordinal")
+};
+
+/**
+ * This structure represents a Codec 2.0 frame with its metadata.
+ *
+ * A frame basically consists of an ordered sets of buffers, configuration changes and info buffers
+ * along with some non-configuration metadata.
+ */
+struct C2FrameData {
+//public:
+ enum flags_t : uint32_t {
+ /**
+ * For input frames: no output frame shall be generated when processing this frame, but
+ * metadata shall still be processed.
+ * For output frames: this frame shall be discarded and but metadata is still valid.
+ */
+ FLAG_DROP_FRAME = (1 << 0),
+ /**
+ * This frame is the last frame of the current stream. Further frames are part of a new
+ * stream.
+ */
+ FLAG_END_OF_STREAM = (1 << 1),
+ /**
+ * This frame shall be discarded with its metadata.
+ * This flag is only set by components - e.g. as a response to the flush command.
+ */
+ FLAG_DISCARD_FRAME = (1 << 2),
+ /**
+ * This frame is not the last frame produced for the input.
+ *
+ * This flag is normally set by the component - e.g. when an input frame results in multiple
+ * output frames, this flag is set on all but the last output frame.
+ *
+ * Also, when components are chained, this flag should be propagated down the
+ * work chain. That is, if set on an earlier frame of a work-chain, it should be propagated
+ * to all later frames in that chain. Additionally, components down the chain could set
+ * this flag even if not set earlier, e.g. if multiple output frame is generated at that
+ * component for the input frame.
+ */
+ FLAG_INCOMPLETE = (1 << 3),
+ /**
+ * This frame contains only codec-specific configuration data, and no actual access unit.
+ *
+ * \deprecated pass codec configuration with using the \todo codec-specific configuration
+ * info together with the access unit.
+ */
+ FLAG_CODEC_CONFIG = (1u << 31),
+ };
+
+ /**
+ * Frame flags */
+ flags_t flags;
+ C2WorkOrdinalStruct ordinal;
+ std::vector<std::shared_ptr<C2Buffer>> buffers;
+ //< for initial work item, these may also come from the parser - if provided
+ //< for output buffers, these are the responses to requestedInfos
+ std::vector<std::unique_ptr<C2Param>> configUpdate;
+ std::vector<std::shared_ptr<C2InfoBuffer>> infoBuffers;
+};
+
+struct C2Worklet {
+//public:
+ // IN
+ c2_node_id_t component;
+
+ /** Configuration changes to be applied before processing this worklet. */
+ std::vector<std::unique_ptr<C2Tuning>> tunings;
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+
+ // OUT
+ C2FrameData output;
+};
+
+/**
+ * Information about partial work-chains not part of the current work items.
+ *
+ * To be defined later.
+ */
+struct C2WorkChainInfo;
+
+/**
+ * This structure holds information about all a single work item.
+ *
+ * This structure shall be passed by the client to the component for the first worklet. As such,
+ * worklets must not be empty. The ownership of this object is passed.
+ */
+struct C2Work {
+//public:
+ /// additional work chain info not part of this work
+ std::shared_ptr<C2WorkChainInfo> chainInfo;
+
+ /// The input data to be processed as part of this work/work-chain. This is provided by the
+ /// client with ownership. When the work is returned (via onWorkDone), the input buffer-pack's
+ /// buffer vector shall contain nullptrs.
+ C2FrameData input;
+
+ /// The chain of components, tunings (including output buffer pool IDs) and info requests that the
+ /// data must pass through. If this has more than a single element, the tunnels between successive
+ /// components of the worklet chain must have been (successfully) pre-registered at the time that
+ /// the work is submitted. Allocating the output buffers in the worklets is the responsibility of
+ /// each component. Upon work submission, each output buffer-pack shall be an appropriately sized
+ /// vector containing nullptrs. When the work is completed/returned to the client, output buffers
+ /// pointers from all but the final worklet shall be nullptrs.
+ std::list<std::unique_ptr<C2Worklet>> worklets;
+
+ /// Number of worklets successfully processed in this chain. This shall be initialized to 0 by the
+ /// client when the work is submitted. It shall contain the number of worklets that were
+ /// successfully processed when the work is returned to the client. If this is less then the number
+ /// of worklets, result must not be success. It must be in the range of [0, worklets.size()].
+ uint32_t workletsProcessed;
+
+ /// The final outcome of the work (corresponding to the current workletsProcessed). If 0 when
+ /// work is returned, it is assumed that all worklets have been processed.
+ c2_status_t result;
+};
+
+/**
+ * Information about a future work to be submitted to the component. The information is used to
+ * reserve the work for work ordering purposes.
+ */
+struct C2WorkOutline {
+//public:
+ C2WorkOrdinalStruct ordinal;
+ std::vector<c2_node_id_t> chain;
+};
+
+/// @}
+
+#endif // C2WORK_H_
diff --git a/media/codec2/core/include/_C2MacroUtils.h b/media/codec2/core/include/_C2MacroUtils.h
new file mode 100644
index 0000000..04e9ba5
--- /dev/null
+++ b/media/codec2/core/include/_C2MacroUtils.h
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_MACRO_UTILS_H_
+#define C2UTILS_MACRO_UTILS_H_
+
+/** \file
+ * Macro utilities for the utils library used by Codec2 implementations.
+ */
+
+/// \if 0
+
+/* --------------------------------- VARIABLE ARGUMENT COUNTING --------------------------------- */
+
+// remove empty arguments - _C2_ARG() expands to '', while _C2_ARG(x) expands to ', x'
+// _C2_ARGn(...) does the same for n arguments
+#define _C2_ARG(...) , ##__VA_ARGS__
+#define _C2_ARG2(_1, _2) _C2_ARG(_1) _C2_ARG(_2)
+#define _C2_ARG4(_1, _2, _3, _4) _C2_ARG2(_1, _2) _C2_ARG2(_3, _4)
+#define _C2_ARG8(_1, _2, _3, _4, _5, _6, _7, _8) _C2_ARG4(_1, _2, _3, _4) _C2_ARG4(_5, _6, _7, _8)
+#define _C2_ARG16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ _C2_ARG8(_1, _2, _3, _4, _5, _6, _7, _8) _C2_ARG8(_9, _10, _11, _12, _13, _14, _15, _16)
+
+// return the 65th argument
+#define _C2_ARGC_3(_, _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, ...) _64
+
+/// \endif
+
+/**
+ * Returns the number of arguments.
+ */
+// We do this by prepending 1 and appending 65 designed values such that the 65th element
+// will be the number of arguments.
+#define _C2_ARGC(...) _C2_ARGC_1(0, ##__VA_ARGS__, \
+ 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, \
+ 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, \
+ 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+
+/// \if 0
+
+// step 1. remove empty arguments - this is needed to allow trailing comma in enum definitions
+// (NOTE: we don't know which argument will have this trailing comma so we have to try all)
+#define _C2_ARGC_1(_, _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, ...) \
+ _C2_ARGC_2(_ _C2_ARG(_0) \
+ _C2_ARG16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ _C2_ARG16(_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ _C2_ARG16(_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ _C2_ARG16(_49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64), \
+ ##__VA_ARGS__)
+
+// step 2. this is needed as removed arguments cannot be passed directly as empty into a macro
+#define _C2_ARGC_2(...) _C2_ARGC_3(__VA_ARGS__)
+
+/// \endif
+
+/* -------------------------------- VARIABLE ARGUMENT CONVERSION -------------------------------- */
+
+/// \if 0
+
+// macros that convert _1, _2, _3, ... to fn(_1, arg), fn(_2, arg), fn(_3, arg), ...
+#define _C2_MAP_64(fn, arg, head, ...) fn(head, arg), _C2_MAP_63(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_63(fn, arg, head, ...) fn(head, arg), _C2_MAP_62(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_62(fn, arg, head, ...) fn(head, arg), _C2_MAP_61(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_61(fn, arg, head, ...) fn(head, arg), _C2_MAP_60(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_60(fn, arg, head, ...) fn(head, arg), _C2_MAP_59(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_59(fn, arg, head, ...) fn(head, arg), _C2_MAP_58(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_58(fn, arg, head, ...) fn(head, arg), _C2_MAP_57(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_57(fn, arg, head, ...) fn(head, arg), _C2_MAP_56(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_56(fn, arg, head, ...) fn(head, arg), _C2_MAP_55(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_55(fn, arg, head, ...) fn(head, arg), _C2_MAP_54(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_54(fn, arg, head, ...) fn(head, arg), _C2_MAP_53(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_53(fn, arg, head, ...) fn(head, arg), _C2_MAP_52(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_52(fn, arg, head, ...) fn(head, arg), _C2_MAP_51(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_51(fn, arg, head, ...) fn(head, arg), _C2_MAP_50(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_50(fn, arg, head, ...) fn(head, arg), _C2_MAP_49(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_49(fn, arg, head, ...) fn(head, arg), _C2_MAP_48(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_48(fn, arg, head, ...) fn(head, arg), _C2_MAP_47(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_47(fn, arg, head, ...) fn(head, arg), _C2_MAP_46(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_46(fn, arg, head, ...) fn(head, arg), _C2_MAP_45(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_45(fn, arg, head, ...) fn(head, arg), _C2_MAP_44(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_44(fn, arg, head, ...) fn(head, arg), _C2_MAP_43(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_43(fn, arg, head, ...) fn(head, arg), _C2_MAP_42(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_42(fn, arg, head, ...) fn(head, arg), _C2_MAP_41(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_41(fn, arg, head, ...) fn(head, arg), _C2_MAP_40(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_40(fn, arg, head, ...) fn(head, arg), _C2_MAP_39(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_39(fn, arg, head, ...) fn(head, arg), _C2_MAP_38(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_38(fn, arg, head, ...) fn(head, arg), _C2_MAP_37(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_37(fn, arg, head, ...) fn(head, arg), _C2_MAP_36(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_36(fn, arg, head, ...) fn(head, arg), _C2_MAP_35(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_35(fn, arg, head, ...) fn(head, arg), _C2_MAP_34(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_34(fn, arg, head, ...) fn(head, arg), _C2_MAP_33(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_33(fn, arg, head, ...) fn(head, arg), _C2_MAP_32(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_32(fn, arg, head, ...) fn(head, arg), _C2_MAP_31(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_31(fn, arg, head, ...) fn(head, arg), _C2_MAP_30(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_30(fn, arg, head, ...) fn(head, arg), _C2_MAP_29(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_29(fn, arg, head, ...) fn(head, arg), _C2_MAP_28(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_28(fn, arg, head, ...) fn(head, arg), _C2_MAP_27(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_27(fn, arg, head, ...) fn(head, arg), _C2_MAP_26(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_26(fn, arg, head, ...) fn(head, arg), _C2_MAP_25(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_25(fn, arg, head, ...) fn(head, arg), _C2_MAP_24(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_24(fn, arg, head, ...) fn(head, arg), _C2_MAP_23(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_23(fn, arg, head, ...) fn(head, arg), _C2_MAP_22(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_22(fn, arg, head, ...) fn(head, arg), _C2_MAP_21(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_21(fn, arg, head, ...) fn(head, arg), _C2_MAP_20(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_20(fn, arg, head, ...) fn(head, arg), _C2_MAP_19(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_19(fn, arg, head, ...) fn(head, arg), _C2_MAP_18(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_18(fn, arg, head, ...) fn(head, arg), _C2_MAP_17(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_17(fn, arg, head, ...) fn(head, arg), _C2_MAP_16(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_16(fn, arg, head, ...) fn(head, arg), _C2_MAP_15(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_15(fn, arg, head, ...) fn(head, arg), _C2_MAP_14(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_14(fn, arg, head, ...) fn(head, arg), _C2_MAP_13(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_13(fn, arg, head, ...) fn(head, arg), _C2_MAP_12(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_12(fn, arg, head, ...) fn(head, arg), _C2_MAP_11(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_11(fn, arg, head, ...) fn(head, arg), _C2_MAP_10(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_10(fn, arg, head, ...) fn(head, arg), _C2_MAP_9(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_9(fn, arg, head, ...) fn(head, arg), _C2_MAP_8(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_8(fn, arg, head, ...) fn(head, arg), _C2_MAP_7(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_7(fn, arg, head, ...) fn(head, arg), _C2_MAP_6(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_6(fn, arg, head, ...) fn(head, arg), _C2_MAP_5(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_5(fn, arg, head, ...) fn(head, arg), _C2_MAP_4(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_4(fn, arg, head, ...) fn(head, arg), _C2_MAP_3(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_3(fn, arg, head, ...) fn(head, arg), _C2_MAP_2(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_2(fn, arg, head, ...) fn(head, arg), _C2_MAP_1(fn, arg, ##__VA_ARGS__)
+#define _C2_MAP_1(fn, arg, head, ...) fn(head, arg)
+
+/// \endif
+
+/**
+ * Maps each argument using another macro x -> fn(x, arg)
+ */
+// use wrapper to call the proper mapper based on the number of arguments
+#define _C2_MAP(fn, arg, ...) _C2_MAP__(_C2_ARGC(__VA_ARGS__), fn, arg, ##__VA_ARGS__)
+
+/// \if 0
+
+// evaluate _n so it becomes a number
+#define _C2_MAP__(_n, fn, arg, ...) _C2_MAP_(_n, fn, arg, __VA_ARGS__)
+// call the proper mapper
+#define _C2_MAP_(_n, fn, arg, ...) _C2_MAP_##_n (fn, arg, __VA_ARGS__)
+
+/// \endif
+
+#endif // C2UTILS_MACRO_UTILS_H_
diff --git a/media/codec2/core/include/android-C2Buffer.h b/media/codec2/core/include/android-C2Buffer.h
new file mode 100644
index 0000000..26beab7
--- /dev/null
+++ b/media/codec2/core/include/android-C2Buffer.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_C2BUFFER_H_
+#define ANDROID_C2BUFFER_H_
+
+#include <cutils/native_handle.h>
+#include <hardware/gralloc.h>
+
+/* Use android native handle for C2Handle */
+typedef ::native_handle_t C2Handle;
+
+namespace android {
+
+/**
+ * Android platform buffer/memory usage bits.
+ */
+struct C2AndroidMemoryUsage : public C2MemoryUsage {
+ inline C2AndroidMemoryUsage(const C2MemoryUsage &usage) : C2MemoryUsage(usage) { }
+
+// public:
+ /**
+ * Reuse gralloc flags where possible, as Codec 2.0 API only uses bits 0 and 1.
+ */
+ enum consumer_t : uint64_t {
+ RENDERSCRIPT_READ = GRALLOC_USAGE_RENDERSCRIPT,
+ HW_TEXTURE_READ = GRALLOC_USAGE_HW_TEXTURE,
+ HW_COMPOSER_READ = GRALLOC_USAGE_HW_COMPOSER,
+ // gralloc does not define a video decoder read usage flag, so use encoder for
+ // now
+ HW_CODEC_READ = GRALLOC_USAGE_HW_VIDEO_ENCODER,
+ READ_PROTECTED = GRALLOC_USAGE_PROTECTED,
+ };
+
+ enum producer_t : uint64_t {
+ RENDERSCRIPT_WRITE = GRALLOC_USAGE_RENDERSCRIPT,
+ HW_TEXTURE_WRITE = GRALLOC_USAGE_HW_RENDER,
+ HW_COMPOSER_WRITE = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER,
+ HW_CODEC_WRITE = GRALLOC_USAGE_HW_VIDEO_ENCODER,
+ // gralloc does not define a write protected usage flag, so use read protected
+ // now
+ WRITE_PROTECTED = GRALLOC_USAGE_PROTECTED,
+ };
+
+ /**
+ * Convert from gralloc usage.
+ */
+ static C2MemoryUsage FromGrallocUsage(uint64_t usage);
+
+ /**
+ * Convert to gralloc usage.
+ */
+ uint64_t asGrallocUsage() const;
+};
+
+} // namespace android
+
+#endif // ANDROID_C2BUFFER_H_
diff --git a/media/codec2/core/include/media/stagefright/codec2/1.0/InputSurface.h b/media/codec2/core/include/media/stagefright/codec2/1.0/InputSurface.h
new file mode 100644
index 0000000..b011a06
--- /dev/null
+++ b/media/codec2/core/include/media/stagefright/codec2/1.0/InputSurface.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_MEDIA_C2_V1_0_INPUT_SURFACE_H
+#define ANDROID_HARDWARE_MEDIA_C2_V1_0_INPUT_SURFACE_H
+
+#include <memory>
+
+#include <C2Component.h>
+#include <media/stagefright/bqhelper/WGraphicBufferProducer.h>
+#include <media/stagefright/codec2/1.0/InputSurfaceConnection.h>
+
+namespace android {
+
+class GraphicBufferSource;
+
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::sp;
+
+typedef ::android::hardware::graphics::bufferqueue::V1_0::IGraphicBufferProducer
+ HGraphicBufferProducer;
+typedef ::android::IGraphicBufferProducer BGraphicBufferProducer;
+
+// TODO: ::android::TWGraphicBufferProducer<IInputSurface>
+typedef ::android::TWGraphicBufferProducer<HGraphicBufferProducer> InputSurfaceBase;
+
+class InputSurface : public InputSurfaceBase {
+public:
+ virtual ~InputSurface() = default;
+
+ // Methods from IInputSurface
+ sp<InputSurfaceConnection> connectToComponent(
+ const std::shared_ptr<::C2Component> &comp);
+ // TODO: intf()
+
+ static sp<InputSurface> Create();
+
+private:
+ InputSurface(
+ const sp<BGraphicBufferProducer> &base,
+ const sp<::android::GraphicBufferSource> &source);
+
+ sp<::android::GraphicBufferSource> mSource;
+};
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_MEDIA_C2_V1_0_INPUT_SURFACE_H
diff --git a/media/codec2/core/include/media/stagefright/codec2/1.0/InputSurfaceConnection.h b/media/codec2/core/include/media/stagefright/codec2/1.0/InputSurfaceConnection.h
new file mode 100644
index 0000000..b24a416
--- /dev/null
+++ b/media/codec2/core/include/media/stagefright/codec2/1.0/InputSurfaceConnection.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_MEDIA_C2_V1_0_INPUT_SURFACE_CONNECTION_H
+#define ANDROID_HARDWARE_MEDIA_C2_V1_0_INPUT_SURFACE_CONNECTION_H
+
+#include <memory>
+
+#include <C2Component.h>
+#include <media/stagefright/bqhelper/GraphicBufferSource.h>
+#include <media/stagefright/bqhelper/WGraphicBufferProducer.h>
+#include <media/stagefright/codec2/1.0/InputSurfaceConnection.h>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace implementation {
+
+// TODO: inherit from IInputSurfaceConnection
+class InputSurfaceConnection : public RefBase {
+public:
+ virtual ~InputSurfaceConnection();
+
+ // From IInputSurfaceConnection
+ void disconnect();
+
+private:
+ friend class InputSurface;
+
+ // For InputSurface
+ InputSurfaceConnection(
+ const sp<GraphicBufferSource> &source, const std::shared_ptr<C2Component> &comp);
+ bool init();
+
+ InputSurfaceConnection() = delete;
+
+ class Impl;
+
+ sp<GraphicBufferSource> mSource;
+ sp<Impl> mImpl;
+
+ DISALLOW_EVIL_CONSTRUCTORS(InputSurfaceConnection);
+};
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_MEDIA_C2_V1_0_INPUT_SURFACE_CONNECTION_H
diff --git a/media/codec2/docs/doxyfilter.sh b/media/codec2/docs/doxyfilter.sh
new file mode 100755
index 0000000..d813153
--- /dev/null
+++ b/media/codec2/docs/doxyfilter.sh
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+import re, sys
+
+global in_comment, current, indent, hold
+in_comment, current, indent, hold = False, None, '', []
+
+class ChangeCStyleCommentsToDoxy:
+ def dump_hold():
+ global hold
+ for h in hold:
+ print(h, end='')
+ hold[:] = []
+
+ def doxy_hold():
+ global current, hold
+ if current == '//':
+ for h in hold:
+ print(re.sub(r'^( *//(?!/))', r'\1/', h), end='')
+ else:
+ first = True
+ for h in hold:
+ if first:
+ h = re.sub(r'^( */[*](?![*]))', r'\1*', h)
+ first = False
+ print(h, end='')
+ hold[:] = []
+
+ def process_comment(t, ind, line):
+ global current, indent, hold
+ if t != current or ind not in (indent, indent + ' '):
+ dump_hold()
+ current, indent = t, ind
+ hold.append(line)
+
+ def process_line(ind, line):
+ global current, indent
+ if ind in (indent, ''):
+ doxy_hold()
+ else:
+ dump_hold()
+ current, indent = None, None
+ print(line, end='')
+
+ def process(self, input, path):
+ for line in input:
+ ind = re.match(r'^( *)', line).group(1)
+ if in_comment:
+ # TODO: this is not quite right, but good enough
+ m = re.match(r'^ *[*]/', line)
+ if m:
+ process_comment('/*', ind, line)
+ in_comment = False
+ else:
+ process_comment('/*', ind, line)
+ continue
+ m = re.match(r'^ *//', line)
+ if m:
+ # one-line comment
+ process_comment('//', ind, line)
+ continue
+ m = re.match(r'^ */[*]', line)
+ if m:
+ # multi-line comment
+ process_comment('/*', ind, line)
+ # TODO: this is not quite right, but good enough
+ in_comment = not re.match(r'^ *[*]/', line)
+ continue
+ process_line(ind, line)
+
+class AutoGroup:
+ def process(self, input, path):
+ if '/codec2/include/' in path:
+ group = 'API Codec2 API'
+ elif False:
+ return
+ elif '/codec2/vndk/' in path:
+ group = 'VNDK Platform provided glue'
+ elif '/codec2/tests/' in path:
+ group = 'Tests Unit tests'
+ else:
+ group = 'Random Misc. sandbox'
+
+ print('#undef __APPLE__')
+
+ for line in input:
+ if re.match(r'^namespace android {', line):
+ print(line, end='')
+ print()
+ print(r'/// \addtogroup {}'.format(group))
+ print(r'/// @{')
+ continue
+ elif re.match(r'^} +// +namespace', line):
+ print(r'/// @}')
+ print()
+ print(line, end='')
+
+P = AutoGroup()
+for path in sys.argv[1:]:
+ with open(path, 'rt') as input:
+ P.process(input, path)
diff --git a/media/codec2/docs/doxygen.config b/media/codec2/docs/doxygen.config
new file mode 100644
index 0000000..5c3bea3
--- /dev/null
+++ b/media/codec2/docs/doxygen.config
@@ -0,0 +1,2446 @@
+# Doxyfile 1.8.11
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = Codec2
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = out/target/common/docs/codec2/api
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = YES
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH = frameworks/av/media/libstagefright/codec2
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = YES
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = YES
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = YES
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = YES
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS = INTERNAL
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = frameworks/av/media/libstagefright/codec2/
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
+# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
+
+FILE_PATTERNS = C2*.c \
+ C2*.cpp \
+ C2*.h
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = ._*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER = frameworks/av/media/libstagefright/codec2/docs/doxyfilter.sh
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = YES
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = YES
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS = -std=c++14
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = YES
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH = /Volumes/A/aosp/prebuilts/clang/darwin-x86/host/3.6/lib/clang/3.6/include \
+ /Volumes/A/aosp/external/libcxx/include \
+ /Volumes/A/aosp/bionic/libc/include \
+ /Volumes/A/aosp/bionic/libc/kernel/uapi \
+ /Volumes/A/aosp/bionic/libc/kernel/uapi/asm-arm64 \
+ /Volumes/A/aosp/external/gtest
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = __APPLE__= \
+ __ANDROID__=1 \
+ ANDROID:=1 \
+ __unused=
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED = DEFINE_FLEXIBLE_METHODS \
+ DEFINE_CAST_OPERATORS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/media/codec2/faultinjection/Android.bp b/media/codec2/faultinjection/Android.bp
new file mode 100644
index 0000000..ade638f
--- /dev/null
+++ b/media/codec2/faultinjection/Android.bp
@@ -0,0 +1,32 @@
+cc_library_shared {
+ name: "libcodec2_component_wrapper",
+ vendor_available: true,
+
+ srcs: [
+ "C2ComponentWrapper.cpp",
+ "SimpleMethodState.cpp",
+ ],
+
+ shared_libs: [
+ "libcodec2",
+ "libcodec2_vndk",
+ "libcutils",
+ "liblog",
+ "libstagefright_foundation",
+ "libutils",
+ ],
+
+ sanitize: {
+ misc_undefined: [
+ "unsigned-integer-overflow",
+ "signed-integer-overflow",
+ ],
+ cfi: true,
+ diag: {
+ cfi: true,
+ },
+ },
+
+ ldflags: ["-Wl,-Bsymbolic"],
+}
+
diff --git a/media/codec2/faultinjection/C2ComponentWrapper.cpp b/media/codec2/faultinjection/C2ComponentWrapper.cpp
new file mode 100644
index 0000000..c45f8bf
--- /dev/null
+++ b/media/codec2/faultinjection/C2ComponentWrapper.cpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_NDEBUG 0
+#define LOG_TAG "C2ComponentWrapper"
+
+#include <chrono>
+#include <functional>
+#include <thread>
+
+#include <C2ComponentWrapper.h>
+#include <C2Config.h>
+#include <C2PlatformSupport.h>
+
+namespace android {
+
+namespace {
+
+using namespace std::chrono_literals;
+
+c2_status_t WrapSimpleMethod(
+ std::function<c2_status_t(void)> op, const SimpleMethodState &state) {
+ c2_status_t result = C2_OK;
+ switch (state.getMode()) {
+ case SimpleMethodState::EXECUTE:
+ result = op();
+ break;
+ case SimpleMethodState::NO_OP:
+ break;
+ case SimpleMethodState::HANG:
+ while (true) {
+ std::this_thread::sleep_for(1s);
+ }
+ break;
+ }
+ (void)state.overrideResult(&result);
+ return result;
+}
+
+} // namespace
+
+C2ComponentWrapper::Injecter::Injecter(C2ComponentWrapper *thiz) : mThiz(thiz) {}
+
+SimpleMethodState::Injecter C2ComponentWrapper::Injecter::start() {
+ return SimpleMethodState::Injecter(&mThiz->mStartState);
+}
+
+C2ComponentWrapper::Listener::Listener(
+ const std::shared_ptr<C2Component::Listener> &listener) : mListener(listener) {}
+
+void C2ComponentWrapper::Listener::onWorkDone_nb(std::weak_ptr<C2Component> component,
+ std::list<std::unique_ptr<C2Work>> workItems) {
+ mListener->onWorkDone_nb(component, std::move(workItems));
+}
+
+void C2ComponentWrapper::Listener::onTripped_nb(std::weak_ptr<C2Component> component,
+ std::vector<std::shared_ptr<C2SettingResult>> settingResult) {
+ mListener->onTripped_nb(component,settingResult);
+}
+
+void C2ComponentWrapper::Listener::onError_nb(
+ std::weak_ptr<C2Component> component, uint32_t errorCode) {
+ mListener->onError_nb(component, errorCode);
+}
+
+C2ComponentWrapper::C2ComponentWrapper(
+ const std::shared_ptr<C2Component> &comp) : mComp(comp) {}
+
+c2_status_t C2ComponentWrapper::setListener_vb(
+ const std::shared_ptr<C2Component::Listener> &listener, c2_blocking_t mayBlock) {
+ mListener = std::make_shared<Listener>(listener);
+ return mComp->setListener_vb(mListener, mayBlock);
+}
+
+c2_status_t C2ComponentWrapper::queue_nb(std::list<std::unique_ptr<C2Work>>* const items) {
+ return mComp->queue_nb(items);
+}
+
+c2_status_t C2ComponentWrapper::announce_nb(const std::vector<C2WorkOutline> &items) {
+ return mComp->announce_nb(items);
+}
+
+c2_status_t C2ComponentWrapper::flush_sm(
+ C2Component::flush_mode_t mode, std::list<std::unique_ptr<C2Work>>* const flushedWork) {
+ return mComp->flush_sm(mode, flushedWork);
+}
+
+c2_status_t C2ComponentWrapper::drain_nb(C2Component::drain_mode_t mode) {
+ return mComp->drain_nb(mode);
+}
+
+c2_status_t C2ComponentWrapper::start() {
+ return WrapSimpleMethod([this] { return mComp->start(); }, mStartState);
+}
+
+c2_status_t C2ComponentWrapper::stop() {
+ return mComp->stop();
+}
+
+c2_status_t C2ComponentWrapper::reset() {
+ return mComp->reset();
+}
+
+c2_status_t C2ComponentWrapper::release() {
+ return mComp->release();
+}
+
+std::shared_ptr<C2ComponentInterface> C2ComponentWrapper::intf(){
+ return mComp->intf();
+}
+
+C2ComponentWrapper::Injecter C2ComponentWrapper::inject() {
+ return Injecter(this);
+}
+
+} // namespace android
diff --git a/media/codec2/faultinjection/C2ComponentWrapper.h b/media/codec2/faultinjection/C2ComponentWrapper.h
new file mode 100644
index 0000000..737350d
--- /dev/null
+++ b/media/codec2/faultinjection/C2ComponentWrapper.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2_COMPONENT_WRAPPER_H_
+#define C2_COMPONENT_WRAPPER_H_
+
+#include <C2Component.h>
+
+#include "SimpleMethodState.h"
+
+namespace android {
+
+/**
+ * Creates a Wrapper around the class C2Component and its methods. The wrapper is used to
+ * simulate errors in the android media components by fault injection technique.
+ * This is done to check how the framework handles the error situation.
+ */
+class C2ComponentWrapper
+ : public C2Component, public std::enable_shared_from_this<C2ComponentWrapper> {
+public:
+ class Injecter {
+ public:
+ explicit Injecter(C2ComponentWrapper *thiz);
+
+ SimpleMethodState::Injecter start();
+ private:
+ C2ComponentWrapper *const mThiz;
+ };
+
+ /**
+ * A wrapper around the listener class inside C2Component class.
+ */
+ class Listener : public C2Component::Listener {
+ public:
+ explicit Listener(const std::shared_ptr<C2Component::Listener> &listener);
+ virtual ~Listener() = default;
+
+ void onWorkDone_nb(std::weak_ptr<C2Component> component,
+ std::list<std::unique_ptr<C2Work>> workItems) override;
+ void onTripped_nb(std::weak_ptr<C2Component> component,
+ std::vector<std::shared_ptr<C2SettingResult>> settingResult) override;
+ void onError_nb(std::weak_ptr<C2Component> component, uint32_t errorCode) override;
+
+ private:
+ std::shared_ptr<C2Component::Listener> mListener;
+ };
+
+ explicit C2ComponentWrapper(const std::shared_ptr<C2Component> &comp);
+ virtual ~C2ComponentWrapper() = default;
+
+ virtual c2_status_t setListener_vb(
+ const std::shared_ptr<C2Component::Listener> &listener,
+ c2_blocking_t mayBlock) override;
+ virtual c2_status_t queue_nb(std::list<std::unique_ptr<C2Work>>* const items) override;
+ virtual c2_status_t announce_nb(const std::vector<C2WorkOutline> &items) override;
+ virtual c2_status_t flush_sm(
+ flush_mode_t mode, std::list<std::unique_ptr<C2Work>>* const flushedWork) override;
+ virtual c2_status_t drain_nb(drain_mode_t mode) override;
+ virtual c2_status_t start() override;
+ virtual c2_status_t stop() override;
+ virtual c2_status_t reset() override;
+ virtual c2_status_t release() override;
+ virtual std::shared_ptr<C2ComponentInterface> intf() override;
+
+ Injecter inject();
+
+private:
+ std::shared_ptr<Listener> mListener;
+ std::shared_ptr<C2Component> mComp;
+
+ SimpleMethodState mStartState;
+};
+
+} // namespace android
+
+#endif // C2_COMPONENT_WRAPPER_H_
diff --git a/media/codec2/faultinjection/SimpleMethodState.cpp b/media/codec2/faultinjection/SimpleMethodState.cpp
new file mode 100644
index 0000000..179d64e
--- /dev/null
+++ b/media/codec2/faultinjection/SimpleMethodState.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_NDEBUG 0
+#define LOG_TAG "SimpleMethodState"
+#include <log/log.h>
+
+#include "SimpleMethodState.h"
+
+namespace android {
+
+SimpleMethodState::Injecter::Injecter(SimpleMethodState *thiz) : mThiz(thiz) {}
+
+void SimpleMethodState::Injecter::hang() {
+ mThiz->mMode = HANG;
+}
+
+void SimpleMethodState::Injecter::fail(c2_status_t err, bool execute) {
+ mThiz->mMode = execute ? EXECUTE : NO_OP;
+ mThiz->mOverride = true;
+ mThiz->mResultOverride = err;
+}
+
+SimpleMethodState::SimpleMethodState()
+ : mMode(EXECUTE), mOverride(false), mResultOverride(C2_OK) {}
+
+SimpleMethodState::Mode SimpleMethodState::getMode() const {
+ return mMode;
+}
+
+bool SimpleMethodState::overrideResult(c2_status_t *result) const {
+ if (!mOverride) {
+ return false;
+ }
+ *result = mResultOverride;
+ return true;
+}
+
+} // namespace android
diff --git a/media/codec2/faultinjection/SimpleMethodState.h b/media/codec2/faultinjection/SimpleMethodState.h
new file mode 100644
index 0000000..dc0459d
--- /dev/null
+++ b/media/codec2/faultinjection/SimpleMethodState.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SIMPLE_METHOD_STATE_H_
+#define SIMPLE_METHOD_STATE_H_
+
+#include <C2.h>
+
+namespace android {
+
+/**
+ * State for a simple method which returns c2_status_t and takes no parameters.
+ */
+class SimpleMethodState {
+public:
+ enum Mode {
+ // Execute the normal operation
+ EXECUTE,
+ // Don't do anything
+ NO_OP,
+ // Hang; never return
+ HANG,
+ };
+
+ /**
+ * Injecter class that modifies the internal states of this class.
+ */
+ class Injecter {
+ public:
+ explicit Injecter(SimpleMethodState *thiz);
+
+ /**
+ * Hang the operation.
+ */
+ void hang();
+
+ /**
+ * Fail the operation with given params.
+ *
+ * \param err error code to replace the actual return value
+ * \param execute whether the wrapper should execute the operation
+ */
+ void fail(c2_status_t err, bool execute = false);
+
+ private:
+ SimpleMethodState *const mThiz;
+ };
+
+ SimpleMethodState();
+
+ /**
+ * Get execution mode.
+ */
+ Mode getMode() const;
+
+ /**
+ * Override result from running the operation if configured so.
+ */
+ bool overrideResult(c2_status_t *result) const;
+
+private:
+ Mode mMode;
+ bool mOverride;
+ c2_status_t mResultOverride;
+};
+
+} // namespace android
+
+#endif // SIMPLE_METHOD_STATE_H_
diff --git a/media/codec2/hidl/1.0/utils/Android.bp b/media/codec2/hidl/1.0/utils/Android.bp
new file mode 100644
index 0000000..455de50
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/Android.bp
@@ -0,0 +1,67 @@
+// DO NOT DEPEND ON THIS DIRECTLY
+// use libcodec2-hidl-defaults instead
+cc_library {
+ name: "libcodec2_hidl@1.0",
+ vendor_available: true,
+
+ defaults: ["hidl_defaults"],
+
+ srcs: [
+ "Component.cpp",
+ "ComponentStore.cpp",
+ "Configurable.cpp",
+ "InputSurface.cpp",
+ "InputSurfaceConnection.cpp",
+ "types.cpp",
+ ],
+
+ header_libs: [
+ "libsystem_headers",
+ "libcodec2_internal", // private
+ ],
+
+ shared_libs: [
+ "android.hardware.graphics.bufferqueue@1.0",
+ "android.hardware.graphics.common@1.0",
+ "android.hardware.media@1.0",
+ "android.hardware.media.bufferpool@1.0",
+ "android.hardware.media.c2@1.0",
+ "android.hardware.media.omx@1.0",
+ "libbase",
+ "libcodec2",
+ "libcodec2_vndk",
+ "libcutils",
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libstagefright_bufferpool@1.0",
+ "libstagefright_bufferqueue_helper",
+ "libui",
+ "libutils",
+ ],
+
+ export_include_dirs: [
+ "include",
+ ],
+
+ export_shared_lib_headers: [
+ "android.hardware.media.c2@1.0",
+ "libcodec2",
+ "libhidlbase",
+ "libstagefright_bufferpool@1.0",
+ "libstagefright_bufferqueue_helper",
+ "libui",
+ ],
+}
+
+// public dependency for Codec 2.0 HAL service implementations
+cc_defaults {
+ name: "libcodec2-hidl-defaults",
+ defaults: ["libcodec2-impl-defaults"],
+
+ shared_libs: [
+ "android.hardware.media.c2@1.0",
+ "libcodec2_hidl@1.0",
+ ],
+}
diff --git a/media/codec2/hidl/1.0/utils/Component.cpp b/media/codec2/hidl/1.0/utils/Component.cpp
new file mode 100644
index 0000000..aa4c6b2
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/Component.cpp
@@ -0,0 +1,1060 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2-Component"
+#include <android-base/logging.h>
+
+#include <C2PlatformSupport.h>
+#include <codec2/hidl/1.0/Component.h>
+#include <codec2/hidl/1.0/ComponentStore.h>
+#include <codec2/hidl/1.0/types.h>
+
+#include <hidl/HidlBinderSupport.h>
+#include <utils/Timers.h>
+
+#include <C2BqBufferPriv.h>
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+
+#include <chrono>
+#include <thread>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using namespace ::android;
+
+namespace /* unnamed */ {
+
+// Implementation of ConfigurableC2Intf based on C2ComponentInterface
+struct CompIntf : public ConfigurableC2Intf {
+ CompIntf(const std::shared_ptr<C2ComponentInterface>& intf) :
+ ConfigurableC2Intf(intf->getName()),
+ mIntf(intf) {
+ }
+
+ virtual c2_status_t config(
+ const std::vector<C2Param*>& params,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures
+ ) override {
+ ALOGV("config");
+ return mIntf->config_vb(params, mayBlock, failures);
+ }
+
+ virtual c2_status_t query(
+ const std::vector<C2Param::Index>& indices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const params
+ ) const override {
+ ALOGV("query");
+ return mIntf->query_vb({}, indices, mayBlock, params);
+ }
+
+ virtual c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params
+ ) const override {
+ ALOGV("querySupportedParams");
+ return mIntf->querySupportedParams_nb(params);
+ }
+
+ virtual c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const override {
+ ALOGV("querySupportedValues");
+ return mIntf->querySupportedValues_vb(fields, mayBlock);
+ }
+
+protected:
+ std::shared_ptr<C2ComponentInterface> mIntf;
+};
+
+} // unnamed namespace
+
+// InputBufferManager
+// ==================
+//
+// InputBufferManager presents a way to track and untrack input buffers in this
+// (codec) process and send a notification to a listener, possibly in a
+// different process, when a tracked buffer no longer has any references in this
+// process. (In fact, this class would work for listeners in the same process
+// too, but the optimization discussed below will not be beneficial.)
+//
+// InputBufferManager holds a collection of records representing tracked buffers
+// and their callback listeners. Conceptually, one record is a triple (listener,
+// frameIndex, bufferIndex) where
+//
+// - (frameIndex, bufferIndex) is a pair of indices used to identify the buffer.
+// - listener is of type IComponentListener. Its onFramesRendered() function
+// will be called after the associated buffer dies. The argument of
+// onFramesRendered() is a list of RenderedFrame objects, each of which has
+// the following members:
+//
+// uint64_t bufferQueueId
+// int32_t slotId
+// int64_t timestampNs
+//
+// When a tracked buffer associated to the triple (listener, frameIndex,
+// bufferIndex) goes out of scope, listener->onFramesRendered() will be called
+// with a RenderedFrame object whose members are set as follows:
+//
+// bufferQueueId = frameIndex
+// slotId = ~bufferIndex
+// timestampNs = systemTime() at the time of notification
+//
+// The reason for the bitwise negation of bufferIndex is that onFramesRendered()
+// may be used for a different purpose when slotId is non-negative (which is a
+// more general use case).
+//
+// IPC Optimization
+// ----------------
+//
+// Since onFramesRendered() generally is an IPC call, InputBufferManager tries
+// not to call it too often. There is a mechanism to guarantee that any two
+// calls to the same listener are at least kNotificationPeriodNs nanoseconds
+// apart.
+//
+struct InputBufferManager {
+ // The minimum time period between IPC calls to notify the client about the
+ // destruction of input buffers.
+ static constexpr nsecs_t kNotificationPeriodNs = 1000000;
+
+ // Track all buffers in a C2FrameData object.
+ //
+ // input (C2FrameData) has the following two members that are of interest:
+ //
+ // C2WorkOrdinal ordinal
+ // vector<shared_ptr<C2Buffer>> buffers
+ //
+ // Calling registerFrameData(listener, input) will register multiple
+ // triples (, frameIndex, bufferIndex) where frameIndex is equal to
+ // input.ordinal.frameIndex and bufferIndex runs through the indices of
+ // input.buffers such that input.buffers[bufferIndex] is not null.
+ //
+ // This should be called from queue().
+ static void registerFrameData(
+ const sp<IComponentListener>& listener,
+ const C2FrameData& input);
+
+ // Untrack all buffers in a C2FrameData object.
+ //
+ // Calling unregisterFrameData(listener, input) will unregister and remove
+ // pending notifications for all triples (l, fi, bufferIndex) such that
+ // l = listener and fi = input.ordinal.frameIndex.
+ //
+ // This should be called from onWorkDone() and flush().
+ static void unregisterFrameData(
+ const wp<IComponentListener>& listener,
+ const C2FrameData& input);
+
+ // Untrack all buffers associated to a given listener.
+ //
+ // Calling unregisterFrameData(listener) will unregister and remove
+ // pending notifications for all triples (l, frameIndex, bufferIndex) such
+ // that l = listener.
+ //
+ // This should be called when the component cleans up all input buffers,
+ // i.e., when reset(), release(), stop() or ~Component() is called.
+ static void unregisterFrameData(
+ const wp<IComponentListener>& listener);
+
+private:
+ void _registerFrameData(
+ const sp<IComponentListener>& listener,
+ const C2FrameData& input);
+ void _unregisterFrameData(
+ const wp<IComponentListener>& listener,
+ const C2FrameData& input);
+ void _unregisterFrameData(
+ const wp<IComponentListener>& listener);
+
+ // The callback function tied to C2Buffer objects.
+ //
+ // Note: This function assumes that sInstance is the only instance of this
+ // class.
+ static void onBufferDestroyed(const C2Buffer* buf, void* arg);
+ void _onBufferDestroyed(const C2Buffer* buf, void* arg);
+
+ // Comparison operator for weak pointers.
+ struct CompareWeakComponentListener {
+ constexpr bool operator()(
+ const wp<IComponentListener>& x,
+ const wp<IComponentListener>& y) const {
+ return x.get_refs() < y.get_refs();
+ }
+ };
+
+ // Persistent data to be passed as "arg" in onBufferDestroyed().
+ // This is essentially the triple (listener, frameIndex, bufferIndex) plus a
+ // weak pointer to the C2Buffer object.
+ //
+ // Note that the "key" is bufferIndex according to operator<(). This is
+ // designed to work with TrackedBuffersMap defined below.
+ struct TrackedBuffer {
+ wp<IComponentListener> listener;
+ uint64_t frameIndex;
+ size_t bufferIndex;
+ std::weak_ptr<C2Buffer> buffer;
+ TrackedBuffer(const wp<IComponentListener>& listener,
+ uint64_t frameIndex,
+ size_t bufferIndex,
+ const std::shared_ptr<C2Buffer>& buffer)
+ : listener(listener),
+ frameIndex(frameIndex),
+ bufferIndex(bufferIndex),
+ buffer(buffer) {}
+ TrackedBuffer(const TrackedBuffer&) = default;
+ bool operator<(const TrackedBuffer& other) const {
+ return bufferIndex < other.bufferIndex;
+ }
+ };
+
+ // Map: listener -> frameIndex -> set<TrackedBuffer>.
+ // Essentially, this is used to store triples (listener, frameIndex,
+ // bufferIndex) that's searchable by listener and (listener, frameIndex).
+ // However, the value of the innermost map is TrackedBuffer, which also
+ // contains an extra copy of listener and frameIndex. This is needed
+ // because onBufferDestroyed() needs to know listener and frameIndex too.
+ typedef std::map<wp<IComponentListener>,
+ std::map<uint64_t,
+ std::set<TrackedBuffer>>,
+ CompareWeakComponentListener> TrackedBuffersMap;
+
+ // Storage for pending (unsent) death notifications for one listener.
+ // Each pair in member named "indices" are (frameIndex, bufferIndex) from
+ // the (listener, frameIndex, bufferIndex) triple.
+ struct DeathNotifications {
+
+ // The number of pending notifications for this listener.
+ // count may be 0, in which case the DeathNotifications object will
+ // remain valid for only a small period (kNotificationPeriodNs
+ // nanoseconds).
+ size_t count;
+
+ // The timestamp of the most recent callback on this listener. This is
+ // used to guarantee that callbacks do not occur too frequently, and
+ // also to trigger expiration of a DeathNotifications object that has
+ // count = 0.
+ nsecs_t lastSentNs;
+
+ // Map: frameIndex -> vector of bufferIndices
+ // This is essentially a collection of (framdeIndex, bufferIndex).
+ std::map<uint64_t, std::vector<size_t>> indices;
+
+ DeathNotifications()
+ : count(0),
+ lastSentNs(systemTime() - kNotificationPeriodNs),
+ indices() {}
+ };
+
+ // Mutex for the management of all input buffers.
+ std::mutex mMutex;
+
+ // Tracked input buffers.
+ TrackedBuffersMap mTrackedBuffersMap;
+
+ // Death notifications to be sent.
+ //
+ // A DeathNotifications object is associated to each listener. An entry in
+ // this map will be removed if its associated DeathNotifications has count =
+ // 0 and lastSentNs < systemTime() - kNotificationPeriodNs.
+ std::map<wp<IComponentListener>, DeathNotifications> mDeathNotifications;
+
+ // Condition variable signaled when an entry is added to mDeathNotifications.
+ std::condition_variable mOnBufferDestroyed;
+
+ // Notify the clients about buffer destructions.
+ // Return false if all destructions have been notified.
+ // Return true and set timeToRetry to the duration to wait for before
+ // retrying if some destructions have not been notified.
+ bool processNotifications(nsecs_t* timeToRetryNs);
+
+ // Main function for the input buffer manager thread.
+ void main();
+
+ // The thread that manages notifications.
+ //
+ // Note: This variable is declared last so its initialization will happen
+ // after all other member variables have been initialized.
+ std::thread mMainThread;
+
+ // Private constructor.
+ InputBufferManager();
+
+ // The only instance of this class.
+ static InputBufferManager& getInstance();
+
+};
+
+// ComponentInterface
+ComponentInterface::ComponentInterface(
+ const std::shared_ptr<C2ComponentInterface>& intf,
+ const sp<ComponentStore>& store) :
+ Configurable(new CachedConfigurable(std::make_unique<CompIntf>(intf))),
+ mInterface(intf) {
+ mInit = init(store.get());
+}
+
+c2_status_t ComponentInterface::status() const {
+ return mInit;
+}
+
+// ComponentListener wrapper
+struct Component::Listener : public C2Component::Listener {
+
+ Listener(const sp<Component>& component) :
+ mComponent(component),
+ mListener(component->mListener) {
+ }
+
+ virtual void onError_nb(
+ std::weak_ptr<C2Component> /* c2component */,
+ uint32_t errorCode) override {
+ ALOGV("onError");
+ sp<IComponentListener> listener = mListener.promote();
+ if (listener) {
+ Return<void> transStatus = listener->onError(Status::OK, errorCode);
+ if (!transStatus.isOk()) {
+ ALOGE("onError -- transaction failed.");
+ }
+ }
+ }
+
+ virtual void onTripped_nb(
+ std::weak_ptr<C2Component> /* c2component */,
+ std::vector<std::shared_ptr<C2SettingResult>> c2settingResult
+ ) override {
+ ALOGV("onTripped");
+ sp<IComponentListener> listener = mListener.promote();
+ if (listener) {
+ hidl_vec<SettingResult> settingResults(c2settingResult.size());
+ size_t ix = 0;
+ for (const std::shared_ptr<C2SettingResult> &c2result :
+ c2settingResult) {
+ if (c2result) {
+ if (objcpy(&settingResults[ix++], *c2result) !=
+ Status::OK) {
+ break;
+ }
+ }
+ }
+ settingResults.resize(ix);
+ Return<void> transStatus = listener->onTripped(settingResults);
+ if (!transStatus.isOk()) {
+ ALOGE("onTripped -- transaction failed.");
+ }
+ }
+ }
+
+ virtual void onWorkDone_nb(
+ std::weak_ptr<C2Component> /* c2component */,
+ std::list<std::unique_ptr<C2Work>> c2workItems) override {
+ ALOGV("onWorkDone");
+ for (const std::unique_ptr<C2Work>& work : c2workItems) {
+ if (work) {
+ if (work->worklets.empty()
+ || !work->worklets.back()
+ || (work->worklets.back()->output.flags &
+ C2FrameData::FLAG_INCOMPLETE) == 0) {
+ InputBufferManager::
+ unregisterFrameData(mListener, work->input);
+ }
+ }
+ }
+
+ sp<IComponentListener> listener = mListener.promote();
+ if (listener) {
+ WorkBundle workBundle;
+
+ sp<Component> strongComponent = mComponent.promote();
+ if (objcpy(&workBundle, c2workItems, strongComponent ?
+ &strongComponent->mBufferPoolSender : nullptr)
+ != Status::OK) {
+ ALOGE("onWorkDone() received corrupted work items.");
+ return;
+ }
+ Return<void> transStatus = listener->onWorkDone(workBundle);
+ if (!transStatus.isOk()) {
+ ALOGE("onWorkDone -- transaction failed.");
+ return;
+ }
+ yieldBufferQueueBlocks(c2workItems, true);
+ }
+ }
+
+protected:
+ wp<Component> mComponent;
+ wp<IComponentListener> mListener;
+};
+
+// Component
+Component::Component(
+ const std::shared_ptr<C2Component>& component,
+ const sp<IComponentListener>& listener,
+ const sp<ComponentStore>& store,
+ const sp<::android::hardware::media::bufferpool::V1_0::
+ IClientManager>& clientPoolManager) :
+ Configurable(new CachedConfigurable(
+ std::make_unique<CompIntf>(component->intf()))),
+ mComponent(component),
+ mInterface(component->intf()),
+ mListener(listener),
+ mStore(store),
+ mBufferPoolSender(clientPoolManager) {
+ // Retrieve supported parameters from store
+ // TODO: We could cache this per component/interface type
+ mInit = init(store.get());
+}
+
+c2_status_t Component::status() const {
+ return mInit;
+}
+
+// Methods from ::android::hardware::media::c2::V1_0::IComponent
+Return<Status> Component::queue(const WorkBundle& workBundle) {
+ ALOGV("queue -- converting input");
+ std::list<std::unique_ptr<C2Work>> c2works;
+
+ if (objcpy(&c2works, workBundle) != C2_OK) {
+ ALOGV("queue -- corrupted");
+ return Status::CORRUPTED;
+ }
+
+ // Register input buffers.
+ for (const std::unique_ptr<C2Work>& work : c2works) {
+ if (work) {
+ InputBufferManager::
+ registerFrameData(mListener, work->input);
+ }
+ }
+
+ ALOGV("queue -- calling");
+ return static_cast<Status>(mComponent->queue_nb(&c2works));
+}
+
+Return<void> Component::flush(flush_cb _hidl_cb) {
+ std::list<std::unique_ptr<C2Work>> c2flushedWorks;
+ ALOGV("flush -- calling");
+ c2_status_t c2res = mComponent->flush_sm(
+ C2Component::FLUSH_COMPONENT,
+ &c2flushedWorks);
+
+ // Unregister input buffers.
+ for (const std::unique_ptr<C2Work>& work : c2flushedWorks) {
+ if (work) {
+ if (work->worklets.empty()
+ || !work->worklets.back()
+ || (work->worklets.back()->output.flags &
+ C2FrameData::FLAG_INCOMPLETE) == 0) {
+ InputBufferManager::
+ unregisterFrameData(mListener, work->input);
+ }
+ }
+ }
+
+ WorkBundle flushedWorkBundle;
+ Status res = static_cast<Status>(c2res);
+ if (c2res == C2_OK) {
+ ALOGV("flush -- converting output");
+ res = objcpy(&flushedWorkBundle, c2flushedWorks, &mBufferPoolSender);
+ }
+ _hidl_cb(res, flushedWorkBundle);
+ yieldBufferQueueBlocks(c2flushedWorks, true);
+ return Void();
+}
+
+Return<Status> Component::drain(bool withEos) {
+ ALOGV("drain");
+ return static_cast<Status>(mComponent->drain_nb(withEos ?
+ C2Component::DRAIN_COMPONENT_WITH_EOS :
+ C2Component::DRAIN_COMPONENT_NO_EOS));
+}
+
+Return<Status> Component::setOutputSurface(
+ uint64_t blockPoolId,
+ const sp<HGraphicBufferProducer>& surface) {
+ std::shared_ptr<C2BlockPool> pool;
+ GetCodec2BlockPool(blockPoolId, mComponent, &pool);
+ if (pool && pool->getAllocatorId() == C2PlatformAllocatorStore::BUFFERQUEUE) {
+ std::shared_ptr<C2BufferQueueBlockPool> bqPool =
+ std::static_pointer_cast<C2BufferQueueBlockPool>(pool);
+ C2BufferQueueBlockPool::OnRenderCallback cb =
+ [this](uint64_t producer, int32_t slot, int64_t nsecs) {
+ // TODO: batch this
+ hidl_vec<IComponentListener::RenderedFrame> rendered;
+ rendered.resize(1);
+ rendered[0] = { producer, slot, nsecs };
+ (void)mListener->onFramesRendered(rendered).isOk();
+ };
+ if (bqPool) {
+ bqPool->setRenderCallback(cb);
+ bqPool->configureProducer(surface);
+ }
+ }
+ return Status::OK;
+}
+
+Return<Status> Component::connectToOmxInputSurface(
+ const sp<HGraphicBufferProducer>& producer,
+ const sp<::android::hardware::media::omx::V1_0::
+ IGraphicBufferSource>& source) {
+ // TODO implement
+ (void)producer;
+ (void)source;
+ return Status::OMITTED;
+}
+
+Return<Status> Component::disconnectFromInputSurface() {
+ // TODO implement
+ return Status::OK;
+}
+
+namespace /* unnamed */ {
+
+struct BlockPoolIntf : public ConfigurableC2Intf {
+ BlockPoolIntf(const std::shared_ptr<C2BlockPool>& pool) :
+ ConfigurableC2Intf("C2BlockPool:" +
+ (pool ? std::to_string(pool->getLocalId()) :
+ "null")),
+ mPool(pool) {
+ }
+
+ virtual c2_status_t config(
+ const std::vector<C2Param*>& params,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures
+ ) override {
+ (void)params;
+ (void)mayBlock;
+ (void)failures;
+ return C2_OK;
+ }
+
+ virtual c2_status_t query(
+ const std::vector<C2Param::Index>& indices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const params
+ ) const override {
+ (void)indices;
+ (void)mayBlock;
+ (void)params;
+ return C2_OK;
+ }
+
+ virtual c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params
+ ) const override {
+ (void)params;
+ return C2_OK;
+ }
+
+ virtual c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const override {
+ (void)fields;
+ (void)mayBlock;
+ return C2_OK;
+ }
+
+protected:
+ std::shared_ptr<C2BlockPool> mPool;
+};
+
+} // unnamed namespace
+
+Return<void> Component::createBlockPool(
+ uint32_t allocatorId,
+ createBlockPool_cb _hidl_cb) {
+ std::shared_ptr<C2BlockPool> blockPool;
+ c2_status_t status = CreateCodec2BlockPool(
+ static_cast<C2PlatformAllocatorStore::id_t>(allocatorId),
+ mComponent,
+ &blockPool);
+ if (status != C2_OK) {
+ blockPool = nullptr;
+ }
+ if (blockPool) {
+ mBlockPoolsMutex.lock();
+ mBlockPools.emplace(blockPool->getLocalId(), blockPool);
+ mBlockPoolsMutex.unlock();
+ } else if (status == C2_OK) {
+ status = C2_CORRUPTED;
+ }
+
+ _hidl_cb(static_cast<Status>(status),
+ blockPool ? blockPool->getLocalId() : 0,
+ new CachedConfigurable(
+ std::make_unique<BlockPoolIntf>(blockPool)));
+ return Void();
+}
+
+Return<Status> Component::destroyBlockPool(uint64_t blockPoolId) {
+ std::lock_guard<std::mutex> lock(mBlockPoolsMutex);
+ return mBlockPools.erase(blockPoolId) == 1 ?
+ Status::OK : Status::CORRUPTED;
+}
+
+Return<Status> Component::start() {
+ ALOGV("start");
+ return static_cast<Status>(mComponent->start());
+}
+
+Return<Status> Component::stop() {
+ ALOGV("stop");
+ InputBufferManager::unregisterFrameData(mListener);
+ return static_cast<Status>(mComponent->stop());
+}
+
+Return<Status> Component::reset() {
+ ALOGV("reset");
+ Status status = static_cast<Status>(mComponent->reset());
+ {
+ std::lock_guard<std::mutex> lock(mBlockPoolsMutex);
+ mBlockPools.clear();
+ }
+ InputBufferManager::unregisterFrameData(mListener);
+ return status;
+}
+
+Return<Status> Component::release() {
+ ALOGV("release");
+ Status status = static_cast<Status>(mComponent->release());
+ {
+ std::lock_guard<std::mutex> lock(mBlockPoolsMutex);
+ mBlockPools.clear();
+ }
+ InputBufferManager::unregisterFrameData(mListener);
+ return status;
+}
+
+void Component::setLocalId(const Component::LocalId& localId) {
+ mLocalId = localId;
+}
+
+void Component::initListener(const sp<Component>& self) {
+ std::shared_ptr<C2Component::Listener> c2listener =
+ std::make_shared<Listener>(self);
+ c2_status_t res = mComponent->setListener_vb(c2listener, C2_DONT_BLOCK);
+ if (res != C2_OK) {
+ mInit = res;
+ }
+}
+
+Component::~Component() {
+ InputBufferManager::unregisterFrameData(mListener);
+ mStore->reportComponentDeath(mLocalId);
+}
+
+Component::InterfaceKey::InterfaceKey(const sp<IComponent>& component) {
+ isRemote = component->isRemote();
+ if (isRemote) {
+ remote = ::android::hardware::toBinder(component);
+ } else {
+ local = component;
+ }
+}
+
+// InputBufferManager implementation
+
+constexpr nsecs_t InputBufferManager::kNotificationPeriodNs;
+
+void InputBufferManager::registerFrameData(
+ const sp<IComponentListener>& listener,
+ const C2FrameData& input) {
+ getInstance()._registerFrameData(listener, input);
+}
+
+void InputBufferManager::unregisterFrameData(
+ const wp<IComponentListener>& listener,
+ const C2FrameData& input) {
+ getInstance()._unregisterFrameData(listener, input);
+}
+
+void InputBufferManager::unregisterFrameData(
+ const wp<IComponentListener>& listener) {
+ getInstance()._unregisterFrameData(listener);
+}
+
+void InputBufferManager::_registerFrameData(
+ const sp<IComponentListener>& listener,
+ const C2FrameData& input) {
+ uint64_t frameIndex = input.ordinal.frameIndex.peeku();
+ ALOGV("InputBufferManager::_registerFrameData called "
+ "(listener @ %p, frameIndex = %llu)",
+ listener.get(),
+ static_cast<long long unsigned>(frameIndex));
+ std::lock_guard<std::mutex> lock(mMutex);
+
+ std::set<TrackedBuffer> &bufferIds =
+ mTrackedBuffersMap[listener][frameIndex];
+
+ for (size_t i = 0; i < input.buffers.size(); ++i) {
+ if (!input.buffers[i]) {
+ ALOGV("InputBufferManager::_registerFrameData: "
+ "Input buffer at index %zu is null", i);
+ continue;
+ }
+ const TrackedBuffer &bufferId =
+ *bufferIds.emplace(listener, frameIndex, i, input.buffers[i]).
+ first;
+
+ c2_status_t status = input.buffers[i]->registerOnDestroyNotify(
+ onBufferDestroyed,
+ const_cast<void*>(reinterpret_cast<const void*>(&bufferId)));
+ if (status != C2_OK) {
+ ALOGD("InputBufferManager: registerOnDestroyNotify failed "
+ "(listener @ %p, frameIndex = %llu, bufferIndex = %zu) "
+ "=> %s (%d)",
+ listener.get(),
+ static_cast<unsigned long long>(frameIndex),
+ i,
+ asString(status), static_cast<int>(status));
+ }
+ }
+
+ mDeathNotifications.emplace(listener, DeathNotifications());
+}
+
+// Remove a pair (listener, frameIndex) from mTrackedBuffersMap and
+// mDeathNotifications. This implies all bufferIndices are removed.
+//
+// This is called from onWorkDone() and flush().
+void InputBufferManager::_unregisterFrameData(
+ const wp<IComponentListener>& listener,
+ const C2FrameData& input) {
+ uint64_t frameIndex = input.ordinal.frameIndex.peeku();
+ ALOGV("InputBufferManager::_unregisterFrameData called "
+ "(listener @ %p, frameIndex = %llu)",
+ listener.unsafe_get(),
+ static_cast<long long unsigned>(frameIndex));
+ std::lock_guard<std::mutex> lock(mMutex);
+
+ auto findListener = mTrackedBuffersMap.find(listener);
+ if (findListener != mTrackedBuffersMap.end()) {
+ std::map<uint64_t, std::set<TrackedBuffer>> &frameIndex2BufferIds
+ = findListener->second;
+ auto findFrameIndex = frameIndex2BufferIds.find(frameIndex);
+ if (findFrameIndex != frameIndex2BufferIds.end()) {
+ std::set<TrackedBuffer> &bufferIds = findFrameIndex->second;
+ for (const TrackedBuffer& bufferId : bufferIds) {
+ std::shared_ptr<C2Buffer> buffer = bufferId.buffer.lock();
+ if (buffer) {
+ c2_status_t status = buffer->unregisterOnDestroyNotify(
+ onBufferDestroyed,
+ const_cast<void*>(
+ reinterpret_cast<const void*>(&bufferId)));
+ if (status != C2_OK) {
+ ALOGD("InputBufferManager: "
+ "unregisterOnDestroyNotify failed "
+ "(listener @ %p, "
+ "frameIndex = %llu, "
+ "bufferIndex = %zu) "
+ "=> %s (%d)",
+ bufferId.listener.unsafe_get(),
+ static_cast<unsigned long long>(
+ bufferId.frameIndex),
+ bufferId.bufferIndex,
+ asString(status), static_cast<int>(status));
+ }
+ }
+ }
+
+ frameIndex2BufferIds.erase(findFrameIndex);
+ if (frameIndex2BufferIds.empty()) {
+ mTrackedBuffersMap.erase(findListener);
+ }
+ }
+ }
+
+ auto findListenerD = mDeathNotifications.find(listener);
+ if (findListenerD != mDeathNotifications.end()) {
+ DeathNotifications &deathNotifications = findListenerD->second;
+ auto findFrameIndex = deathNotifications.indices.find(frameIndex);
+ if (findFrameIndex != deathNotifications.indices.end()) {
+ std::vector<size_t> &bufferIndices = findFrameIndex->second;
+ deathNotifications.count -= bufferIndices.size();
+ deathNotifications.indices.erase(findFrameIndex);
+ }
+ }
+}
+
+// Remove listener from mTrackedBuffersMap and mDeathNotifications. This implies
+// all frameIndices and bufferIndices are removed.
+//
+// This is called when the component cleans up all input buffers, i.e., when
+// reset(), release(), stop() or ~Component() is called.
+void InputBufferManager::_unregisterFrameData(
+ const wp<IComponentListener>& listener) {
+ ALOGV("InputBufferManager::_unregisterFrameData called (listener @ %p)",
+ listener.unsafe_get());
+ std::lock_guard<std::mutex> lock(mMutex);
+
+ auto findListener = mTrackedBuffersMap.find(listener);
+ if (findListener != mTrackedBuffersMap.end()) {
+ std::map<uint64_t, std::set<TrackedBuffer>> &frameIndex2BufferIds =
+ findListener->second;
+ for (auto findFrameIndex = frameIndex2BufferIds.begin();
+ findFrameIndex != frameIndex2BufferIds.end();
+ ++findFrameIndex) {
+ std::set<TrackedBuffer> &bufferIds = findFrameIndex->second;
+ for (const TrackedBuffer& bufferId : bufferIds) {
+ std::shared_ptr<C2Buffer> buffer = bufferId.buffer.lock();
+ if (buffer) {
+ c2_status_t status = buffer->unregisterOnDestroyNotify(
+ onBufferDestroyed,
+ const_cast<void*>(
+ reinterpret_cast<const void*>(&bufferId)));
+ if (status != C2_OK) {
+ ALOGD("InputBufferManager: "
+ "unregisterOnDestroyNotify failed "
+ "(listener @ %p, "
+ "frameIndex = %llu, "
+ "bufferIndex = %zu) "
+ "=> %s (%d)",
+ bufferId.listener.unsafe_get(),
+ static_cast<unsigned long long>(bufferId.frameIndex),
+ bufferId.bufferIndex,
+ asString(status), static_cast<int>(status));
+ }
+ }
+ }
+ }
+ mTrackedBuffersMap.erase(findListener);
+ }
+
+ mDeathNotifications.erase(listener);
+}
+
+// Move a buffer from mTrackedBuffersMap to mDeathNotifications.
+// This is called when a registered C2Buffer object is destroyed.
+void InputBufferManager::onBufferDestroyed(const C2Buffer* buf, void* arg) {
+ getInstance()._onBufferDestroyed(buf, arg);
+}
+
+void InputBufferManager::_onBufferDestroyed(const C2Buffer* buf, void* arg) {
+ if (!buf || !arg) {
+ ALOGW("InputBufferManager::_onBufferDestroyed called "
+ "with null argument(s) (buf @ %p, arg @ %p)",
+ buf, arg);
+ return;
+ }
+ TrackedBuffer id(*reinterpret_cast<TrackedBuffer*>(arg));
+ ALOGV("InputBufferManager::_onBufferDestroyed called "
+ "(listener @ %p, frameIndex = %llu, bufferIndex = %zu)",
+ id.listener.unsafe_get(),
+ static_cast<unsigned long long>(id.frameIndex),
+ id.bufferIndex);
+
+ std::lock_guard<std::mutex> lock(mMutex);
+
+ auto findListener = mTrackedBuffersMap.find(id.listener);
+ if (findListener == mTrackedBuffersMap.end()) {
+ ALOGD("InputBufferManager::_onBufferDestroyed received "
+ "invalid listener "
+ "(listener @ %p, frameIndex = %llu, bufferIndex = %zu)",
+ id.listener.unsafe_get(),
+ static_cast<unsigned long long>(id.frameIndex),
+ id.bufferIndex);
+ return;
+ }
+
+ std::map<uint64_t, std::set<TrackedBuffer>> &frameIndex2BufferIds
+ = findListener->second;
+ auto findFrameIndex = frameIndex2BufferIds.find(id.frameIndex);
+ if (findFrameIndex == frameIndex2BufferIds.end()) {
+ ALOGD("InputBufferManager::_onBufferDestroyed received "
+ "invalid frame index "
+ "(listener @ %p, frameIndex = %llu, bufferIndex = %zu)",
+ id.listener.unsafe_get(),
+ static_cast<unsigned long long>(id.frameIndex),
+ id.bufferIndex);
+ return;
+ }
+
+ std::set<TrackedBuffer> &bufferIds = findFrameIndex->second;
+ auto findBufferId = bufferIds.find(id);
+ if (findBufferId == bufferIds.end()) {
+ ALOGD("InputBufferManager::_onBufferDestroyed received "
+ "invalid buffer index: "
+ "(listener @ %p, frameIndex = %llu, bufferIndex = %zu)",
+ id.listener.unsafe_get(),
+ static_cast<unsigned long long>(id.frameIndex),
+ id.bufferIndex);
+ }
+
+ bufferIds.erase(findBufferId);
+ if (bufferIds.empty()) {
+ frameIndex2BufferIds.erase(findFrameIndex);
+ if (frameIndex2BufferIds.empty()) {
+ mTrackedBuffersMap.erase(findListener);
+ }
+ }
+
+ DeathNotifications &deathNotifications = mDeathNotifications[id.listener];
+ deathNotifications.indices[id.frameIndex].emplace_back(id.bufferIndex);
+ ++deathNotifications.count;
+ mOnBufferDestroyed.notify_one();
+}
+
+// Notify the clients about buffer destructions.
+// Return false if all destructions have been notified.
+// Return true and set timeToRetry to the time point to wait for before
+// retrying if some destructions have not been notified.
+bool InputBufferManager::processNotifications(nsecs_t* timeToRetryNs) {
+
+ struct Notification {
+ sp<IComponentListener> listener;
+ hidl_vec<IComponentListener::RenderedFrame> renderedFrames;
+ Notification(const sp<IComponentListener>& l, size_t s)
+ : listener(l), renderedFrames(s) {}
+ };
+ std::list<Notification> notifications;
+
+ bool retry = false;
+ {
+ std::lock_guard<std::mutex> lock(mMutex);
+ *timeToRetryNs = kNotificationPeriodNs;
+ nsecs_t timeNowNs = systemTime();
+ for (auto it = mDeathNotifications.begin();
+ it != mDeathNotifications.end(); ) {
+ sp<IComponentListener> listener = it->first.promote();
+ if (!listener) {
+ ++it;
+ continue;
+ }
+ DeathNotifications &deathNotifications = it->second;
+
+ nsecs_t timeSinceLastNotifiedNs =
+ timeNowNs - deathNotifications.lastSentNs;
+ // If not enough time has passed since the last callback, leave the
+ // notifications for this listener untouched for now and retry
+ // later.
+ if (timeSinceLastNotifiedNs < kNotificationPeriodNs) {
+ retry = true;
+ *timeToRetryNs = std::min(*timeToRetryNs,
+ kNotificationPeriodNs - timeSinceLastNotifiedNs);
+ ALOGV("InputBufferManager: Notifications for "
+ "listener @ %p will be postponed.",
+ listener.get());
+ ++it;
+ continue;
+ }
+
+ // If enough time has passed since the last notification to this
+ // listener but there are currently no pending notifications, the
+ // listener can be removed from mDeathNotifications---there is no
+ // need to keep track of the last notification time anymore.
+ if (deathNotifications.count == 0) {
+ it = mDeathNotifications.erase(it);
+ continue;
+ }
+
+ // Create the argument for the callback.
+ notifications.emplace_back(listener, deathNotifications.count);
+ hidl_vec<IComponentListener::RenderedFrame>& renderedFrames =
+ notifications.back().renderedFrames;
+ size_t i = 0;
+ for (std::pair<const uint64_t, std::vector<size_t>>& p :
+ deathNotifications.indices) {
+ uint64_t frameIndex = p.first;
+ const std::vector<size_t> &bufferIndices = p.second;
+ for (const size_t& bufferIndex : bufferIndices) {
+ IComponentListener::RenderedFrame &renderedFrame
+ = renderedFrames[i++];
+ renderedFrame.slotId = ~bufferIndex;
+ renderedFrame.bufferQueueId = frameIndex;
+ renderedFrame.timestampNs = timeNowNs;
+ ALOGV("InputBufferManager: "
+ "Sending death notification (listener @ %p, "
+ "frameIndex = %llu, bufferIndex = %zu)",
+ listener.get(),
+ static_cast<long long unsigned>(frameIndex),
+ bufferIndex);
+ }
+ }
+
+ // Clear deathNotifications for this listener and set retry to true
+ // so processNotifications will be called again. This will
+ // guarantee that a listener with no pending notifications will
+ // eventually be removed from mDeathNotifications after
+ // kNotificationPeriodNs nanoseconds has passed.
+ retry = true;
+ deathNotifications.indices.clear();
+ deathNotifications.count = 0;
+ deathNotifications.lastSentNs = timeNowNs;
+ ++it;
+ }
+ }
+
+ // Call onFramesRendered outside the lock to avoid deadlock.
+ for (const Notification& notification : notifications) {
+ if (!notification.listener->onFramesRendered(
+ notification.renderedFrames).isOk()) {
+ // This may trigger if the client has died.
+ ALOGD("InputBufferManager: onFramesRendered transaction failed "
+ "(listener @ %p)",
+ notification.listener.get());
+ }
+ }
+ if (retry) {
+ ALOGV("InputBufferManager: Pending death notifications"
+ "will be sent in %lldns.",
+ static_cast<long long>(*timeToRetryNs));
+ }
+ return retry;
+}
+
+void InputBufferManager::main() {
+ ALOGV("InputBufferManager: Starting main thread");
+ nsecs_t timeToRetryNs;
+ while (true) {
+ std::unique_lock<std::mutex> lock(mMutex);
+ while (mDeathNotifications.empty()) {
+ ALOGV("InputBufferManager: Waiting for buffer deaths");
+ mOnBufferDestroyed.wait(lock);
+ }
+ lock.unlock();
+ ALOGV("InputBufferManager: Sending buffer death notifications");
+ while (processNotifications(&timeToRetryNs)) {
+ std::this_thread::sleep_for(
+ std::chrono::nanoseconds(timeToRetryNs));
+ ALOGV("InputBufferManager: Sending pending death notifications");
+ }
+ ALOGV("InputBufferManager: No pending death notifications");
+ }
+}
+
+InputBufferManager::InputBufferManager()
+ : mMainThread(&InputBufferManager::main, this) {
+}
+
+InputBufferManager& InputBufferManager::getInstance() {
+ static InputBufferManager instance{};
+ return instance;
+}
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
diff --git a/media/codec2/hidl/1.0/utils/ComponentStore.cpp b/media/codec2/hidl/1.0/utils/ComponentStore.cpp
new file mode 100644
index 0000000..1d1bbe0
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/ComponentStore.cpp
@@ -0,0 +1,437 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2-ComponentStore"
+#include <log/log.h>
+
+#include <codec2/hidl/1.0/ComponentStore.h>
+#include <codec2/hidl/1.0/InputSurface.h>
+#include <codec2/hidl/1.0/Component.h>
+#include <codec2/hidl/1.0/ConfigurableC2Intf.h>
+#include <codec2/hidl/1.0/types.h>
+
+#include <media/stagefright/bqhelper/WGraphicBufferProducer.h>
+#include <media/stagefright/bqhelper/GraphicBufferSource.h>
+
+#include <C2PlatformSupport.h>
+#include <util/C2InterfaceHelper.h>
+
+#include <utils/Errors.h>
+
+#include <android-base/file.h>
+
+#ifdef LOG
+#undef LOG
+#endif
+
+#ifdef PLOG
+#undef PLOG
+#endif
+
+#include <android-base/logging.h>
+
+#include <ostream>
+#include <sstream>
+#include <iomanip>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using namespace ::android;
+using ::android::GraphicBufferSource;
+using namespace ::android::hardware::media::bufferpool::V1_0::implementation;
+
+namespace /* unnamed */ {
+
+struct StoreIntf : public ConfigurableC2Intf {
+ StoreIntf(const std::shared_ptr<C2ComponentStore>& store) :
+ ConfigurableC2Intf(store ? store->getName() : ""),
+ mStore(store) {
+ }
+
+ c2_status_t config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>> *const failures
+ ) override {
+ // Assume all params are blocking
+ // TODO: Filter for supported params
+ if (mayBlock == C2_DONT_BLOCK && params.size() != 0) {
+ return C2_BLOCKING;
+ }
+ return mStore->config_sm(params, failures);
+ }
+
+ c2_status_t query(
+ const std::vector<C2Param::Index> &indices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>> *const params) const override {
+ // Assume all params are blocking
+ // TODO: Filter for supported params
+ if (mayBlock == C2_DONT_BLOCK && indices.size() != 0) {
+ return C2_BLOCKING;
+ }
+ return mStore->query_sm({}, indices, params);
+ }
+
+ c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> *const params
+ ) const override {
+ return mStore->querySupportedParams_nb(params);
+ }
+
+ c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery> &fields,
+ c2_blocking_t mayBlock) const override {
+ // Assume all params are blocking
+ // TODO: Filter for supported params
+ if (mayBlock == C2_DONT_BLOCK && fields.size() != 0) {
+ return C2_BLOCKING;
+ }
+ return mStore->querySupportedValues_sm(fields);
+ }
+
+protected:
+ std::shared_ptr<C2ComponentStore> mStore;
+};
+
+} // unnamed namespace
+
+ComponentStore::ComponentStore(const std::shared_ptr<C2ComponentStore>& store) :
+ Configurable(new CachedConfigurable(std::make_unique<StoreIntf>(store))),
+ mStore(store) {
+
+ std::shared_ptr<C2ComponentStore> platformStore = android::GetCodec2PlatformComponentStore();
+ SetPreferredCodec2ComponentStore(store);
+
+ // Retrieve struct descriptors
+ mParamReflector = mStore->getParamReflector();
+
+ // Retrieve supported parameters from store
+ mInit = init(this);
+}
+
+c2_status_t ComponentStore::validateSupportedParams(
+ const std::vector<std::shared_ptr<C2ParamDescriptor>>& params) {
+ c2_status_t res = C2_OK;
+
+ for (const std::shared_ptr<C2ParamDescriptor> &desc : params) {
+ if (!desc) {
+ // All descriptors should be valid
+ res = res ? res : C2_BAD_VALUE;
+ continue;
+ }
+ C2Param::CoreIndex coreIndex = desc->index().coreIndex();
+ std::lock_guard<std::mutex> lock(mStructDescriptorsMutex);
+ auto it = mStructDescriptors.find(coreIndex);
+ if (it == mStructDescriptors.end()) {
+ std::shared_ptr<C2StructDescriptor> structDesc =
+ mParamReflector->describe(coreIndex);
+ if (!structDesc) {
+ // All supported params must be described
+ res = C2_BAD_INDEX;
+ }
+ mStructDescriptors.insert({ coreIndex, structDesc });
+ }
+ }
+ return res;
+}
+
+// Methods from ::android::hardware::media::c2::V1_0::IComponentStore
+Return<void> ComponentStore::createComponent(
+ const hidl_string& name,
+ const sp<IComponentListener>& listener,
+ const sp<IClientManager>& pool,
+ createComponent_cb _hidl_cb) {
+
+ sp<Component> component;
+ std::shared_ptr<C2Component> c2component;
+ Status status = static_cast<Status>(
+ mStore->createComponent(name, &c2component));
+
+ if (status == Status::OK) {
+ onInterfaceLoaded(c2component->intf());
+ component = new Component(c2component, listener, this, pool);
+ if (!component) {
+ status = Status::CORRUPTED;
+ } else if (component->status() != C2_OK) {
+ status = static_cast<Status>(component->status());
+ } else {
+ component->initListener(component);
+ if (component->status() != C2_OK) {
+ status = static_cast<Status>(component->status());
+ } else {
+ std::lock_guard<std::mutex> lock(mComponentRosterMutex);
+ component->setLocalId(
+ mComponentRoster.emplace(
+ Component::InterfaceKey(component),
+ c2component)
+ .first);
+ }
+ }
+ }
+ _hidl_cb(status, component);
+ return Void();
+}
+
+Return<void> ComponentStore::createInterface(
+ const hidl_string& name,
+ createInterface_cb _hidl_cb) {
+ std::shared_ptr<C2ComponentInterface> c2interface;
+ c2_status_t res = mStore->createInterface(name, &c2interface);
+ sp<IComponentInterface> interface;
+ if (res == C2_OK) {
+ onInterfaceLoaded(c2interface);
+ interface = new ComponentInterface(c2interface, this);
+ }
+ _hidl_cb((Status)res, interface);
+ return Void();
+}
+
+Return<void> ComponentStore::listComponents(listComponents_cb _hidl_cb) {
+ std::vector<std::shared_ptr<const C2Component::Traits>> c2traits =
+ mStore->listComponents();
+ hidl_vec<IComponentStore::ComponentTraits> traits(c2traits.size());
+ size_t ix = 0;
+ for (const std::shared_ptr<const C2Component::Traits> &c2trait : c2traits) {
+ if (c2trait) {
+ objcpy(&traits[ix++], *c2trait);
+ }
+ }
+ traits.resize(ix);
+ _hidl_cb(traits);
+ return Void();
+}
+
+Return<sp<IInputSurface>> ComponentStore::createInputSurface() {
+ sp<GraphicBufferSource> source = new GraphicBufferSource();
+ if (source->initCheck() != OK) {
+ return nullptr;
+ }
+ typedef ::android::hardware::graphics::bufferqueue::V1_0::
+ IGraphicBufferProducer HGbp;
+ typedef ::android::TWGraphicBufferProducer<HGbp> B2HGbp;
+ return new InputSurface(
+ this,
+ std::make_shared<C2ReflectorHelper>(),
+ new B2HGbp(source->getIGraphicBufferProducer()),
+ source);
+}
+
+void ComponentStore::onInterfaceLoaded(const std::shared_ptr<C2ComponentInterface> &intf) {
+ // invalidate unsupported struct descriptors if a new interface is loaded as it may have
+ // exposed new descriptors
+ std::lock_guard<std::mutex> lock(mStructDescriptorsMutex);
+ if (!mLoadedInterfaces.count(intf->getName())) {
+ mUnsupportedStructDescriptors.clear();
+ mLoadedInterfaces.emplace(intf->getName());
+ }
+}
+
+Return<void> ComponentStore::getStructDescriptors(
+ const hidl_vec<uint32_t>& indices,
+ getStructDescriptors_cb _hidl_cb) {
+ hidl_vec<StructDescriptor> descriptors(indices.size());
+ size_t dstIx = 0;
+ Status res = Status::OK;
+ for (size_t srcIx = 0; srcIx < indices.size(); ++srcIx) {
+ std::lock_guard<std::mutex> lock(mStructDescriptorsMutex);
+ const C2Param::CoreIndex coreIndex = C2Param::CoreIndex(indices[srcIx]).coreIndex();
+ const auto item = mStructDescriptors.find(coreIndex);
+ if (item == mStructDescriptors.end()) {
+ // not in the cache, and not known to be unsupported, query local reflector
+ if (!mUnsupportedStructDescriptors.count(coreIndex)) {
+ std::shared_ptr<C2StructDescriptor> structDesc =
+ mParamReflector->describe(coreIndex);
+ if (!structDesc) {
+ mUnsupportedStructDescriptors.emplace(coreIndex);
+ } else {
+ mStructDescriptors.insert({ coreIndex, structDesc });
+ objcpy(&descriptors[dstIx++], *structDesc);
+ continue;
+ }
+ }
+ res = Status::NOT_FOUND;
+ } else if (item->second) {
+ objcpy(&descriptors[dstIx++], *item->second);
+ } else {
+ res = Status::NO_MEMORY;
+ }
+ }
+ descriptors.resize(dstIx);
+ _hidl_cb(res, descriptors);
+ return Void();
+}
+
+Return<sp<IClientManager>> ComponentStore::getPoolClientManager() {
+ return ClientManager::getInstance();
+}
+
+Return<Status> ComponentStore::copyBuffer(const Buffer& src, const Buffer& dst) {
+ // TODO implement
+ (void)src;
+ (void)dst;
+ return Status::OMITTED;
+}
+
+void ComponentStore::reportComponentDeath(
+ const Component::LocalId& componentLocalId) {
+ std::lock_guard<std::mutex> lock(mComponentRosterMutex);
+ mComponentRoster.erase(componentLocalId);
+}
+
+std::shared_ptr<C2Component> ComponentStore::findC2Component(
+ const sp<IComponent>& component) const {
+ std::lock_guard<std::mutex> lock(mComponentRosterMutex);
+ Component::LocalId it = mComponentRoster.find(
+ Component::InterfaceKey(component));
+ if (it == mComponentRoster.end()) {
+ return std::shared_ptr<C2Component>();
+ }
+ return it->second.lock();
+}
+
+// Debug dump
+
+namespace /* unnamed */ {
+
+// Dump component traits
+std::ostream& dump(
+ std::ostream& out,
+ const std::shared_ptr<const C2Component::Traits>& comp) {
+
+ constexpr const char indent[] = " ";
+
+ out << indent << "name: " << comp->name << std::endl;
+ out << indent << "domain: " << comp->domain << std::endl;
+ out << indent << "kind: " << comp->kind << std::endl;
+ out << indent << "rank: " << comp->rank << std::endl;
+ out << indent << "mediaType: " << comp->mediaType << std::endl;
+ out << indent << "aliases:";
+ for (const auto& alias : comp->aliases) {
+ out << ' ' << alias;
+ }
+ out << std::endl;
+
+ return out;
+}
+
+// Dump component
+std::ostream& dump(
+ std::ostream& out,
+ const std::shared_ptr<C2Component>& comp) {
+
+ constexpr const char indent[] = " ";
+
+ std::shared_ptr<C2ComponentInterface> intf = comp->intf();
+ if (!intf) {
+ out << indent << "Unknown -- null interface" << std::endl;
+ return out;
+ }
+ out << indent << "name: " << intf->getName() << std::endl;
+ out << indent << "id: " << intf->getId() << std::endl;
+ return out;
+}
+
+} // unnamed namespace
+
+Return<void> ComponentStore::debug(
+ const hidl_handle& handle,
+ const hidl_vec<hidl_string>& /* args */) {
+ LOG(INFO) << "debug -- dumping...";
+ const native_handle_t *h = handle.getNativeHandle();
+ if (!h || h->numFds != 1) {
+ LOG(ERROR) << "debug -- dumping failed -- "
+ "invalid file descriptor to dump to";
+ return Void();
+ }
+ std::ostringstream out;
+
+ { // Populate "out".
+
+ constexpr const char indent[] = " ";
+
+ // Show name.
+ out << "Beginning of dump -- C2ComponentStore: "
+ << mStore->getName() << std::endl << std::endl;
+
+ // Retrieve the list of supported components.
+ std::vector<std::shared_ptr<const C2Component::Traits>> traitsList =
+ mStore->listComponents();
+
+ // Dump the traits of supported components.
+ out << indent << "Supported components:" << std::endl << std::endl;
+ if (traitsList.size() == 0) {
+ out << indent << indent << "NONE" << std::endl << std::endl;
+ } else {
+ for (const auto& traits : traitsList) {
+ dump(out, traits) << std::endl;
+ }
+ }
+
+ // Retrieve the list of active components.
+ std::list<std::shared_ptr<C2Component>> activeComps;
+ {
+ std::lock_guard<std::mutex> lock(mComponentRosterMutex);
+ auto i = mComponentRoster.begin();
+ while (i != mComponentRoster.end()) {
+ std::shared_ptr<C2Component> c2comp = i->second.lock();
+ if (!c2comp) {
+ auto j = i;
+ ++i;
+ mComponentRoster.erase(j);
+ } else {
+ ++i;
+ activeComps.emplace_back(c2comp);
+ }
+ }
+ }
+
+ // Dump active components.
+ out << indent << "Active components:" << std::endl << std::endl;
+ if (activeComps.size() == 0) {
+ out << indent << indent << "NONE" << std::endl << std::endl;
+ } else {
+ for (const std::shared_ptr<C2Component>& c2comp : activeComps) {
+ dump(out, c2comp) << std::endl;
+ }
+ }
+
+ out << "End of dump -- C2ComponentStore: "
+ << mStore->getName() << std::endl;
+ }
+
+ if (!android::base::WriteStringToFd(out.str(), h->data[0])) {
+ PLOG(WARNING) << "debug -- dumping failed -- write()";
+ } else {
+ LOG(INFO) << "debug -- dumping succeeded";
+ }
+ return Void();
+}
+
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
diff --git a/media/codec2/hidl/1.0/utils/Configurable.cpp b/media/codec2/hidl/1.0/utils/Configurable.cpp
new file mode 100644
index 0000000..d023ba8
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/Configurable.cpp
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2-Configurable"
+#include <log/log.h>
+
+#include <codec2/hidl/1.0/Configurable.h>
+#include <codec2/hidl/1.0/ComponentStore.h>
+#include <codec2/hidl/1.0/types.h>
+#include <C2ParamInternal.h>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using namespace ::android;
+
+CachedConfigurable::CachedConfigurable(
+ std::unique_ptr<ConfigurableC2Intf>&& intf) :
+ mIntf(std::move(intf)) {
+}
+
+c2_status_t CachedConfigurable::init(ComponentStore* store) {
+ // Retrieve supported parameters from store
+ c2_status_t init = mIntf->querySupportedParams(&mSupportedParams);
+ c2_status_t validate = store->validateSupportedParams(mSupportedParams);
+ return init == C2_OK ? C2_OK : validate;
+}
+
+// Methods from ::android::hardware::media::c2::V1_0::IConfigurable follow.
+Return<void> CachedConfigurable::getName(getName_cb _hidl_cb) {
+ _hidl_cb(mIntf->getName());
+ return Void();
+}
+
+Return<void> CachedConfigurable::query(
+ const hidl_vec<uint32_t>& indices,
+ bool mayBlock,
+ query_cb _hidl_cb) {
+ typedef C2Param::Index Index;
+ std::vector<Index> c2heapParamIndices(
+ (Index*)indices.data(),
+ (Index*)indices.data() + indices.size());
+ std::vector<std::unique_ptr<C2Param>> c2heapParams;
+ c2_status_t c2res = mIntf->query(
+ c2heapParamIndices,
+ mayBlock ? C2_MAY_BLOCK : C2_DONT_BLOCK,
+ &c2heapParams);
+
+ hidl_vec<uint8_t> params;
+ createParamsBlob(¶ms, c2heapParams);
+ _hidl_cb(static_cast<Status>(c2res), params);
+
+ return Void();
+}
+
+Return<void> CachedConfigurable::config(
+ const hidl_vec<uint8_t>& inParams,
+ bool mayBlock,
+ config_cb _hidl_cb) {
+ // inParams is not writable, so create a copy as config modifies the parameters
+ hidl_vec<uint8_t> inParamsCopy = inParams;
+ std::vector<C2Param*> c2params;
+ if (parseParamsBlob(&c2params, inParamsCopy) != C2_OK) {
+ _hidl_cb(Status::CORRUPTED,
+ hidl_vec<SettingResult>(),
+ hidl_vec<uint8_t>());
+ return Void();
+ }
+ // TODO: check if blob was invalid
+ std::vector<std::unique_ptr<C2SettingResult>> c2failures;
+ c2_status_t c2res = mIntf->config(
+ c2params,
+ mayBlock ? C2_MAY_BLOCK : C2_DONT_BLOCK,
+ &c2failures);
+ hidl_vec<SettingResult> failures(c2failures.size());
+ {
+ size_t ix = 0;
+ for (const std::unique_ptr<C2SettingResult>& c2result : c2failures) {
+ if (c2result) {
+ objcpy(&failures[ix++], *c2result);
+ }
+ }
+ failures.resize(ix);
+ }
+ hidl_vec<uint8_t> outParams;
+ createParamsBlob(&outParams, c2params);
+ _hidl_cb((Status)c2res, failures, outParams);
+ return Void();
+}
+
+Return<void> CachedConfigurable::querySupportedParams(
+ uint32_t start,
+ uint32_t count,
+ querySupportedParams_cb _hidl_cb) {
+ C2LinearRange request = C2LinearCapacity(mSupportedParams.size()).range(
+ start, count);
+ hidl_vec<ParamDescriptor> params(request.size());
+ Status res = Status::OK;
+ size_t dstIx = 0;
+ for (size_t srcIx = request.offset(); srcIx < request.endOffset(); ++srcIx) {
+ if (mSupportedParams[srcIx]) {
+ objcpy(¶ms[dstIx++], *mSupportedParams[srcIx]);
+ } else {
+ res = Status::BAD_INDEX;
+ }
+ }
+ params.resize(dstIx);
+ _hidl_cb(res, params);
+ return Void();
+}
+
+Return<void> CachedConfigurable::querySupportedValues(
+ const hidl_vec<FieldSupportedValuesQuery>& inFields,
+ bool mayBlock,
+ querySupportedValues_cb _hidl_cb) {
+ std::vector<C2FieldSupportedValuesQuery> c2fields;
+ {
+ // C2FieldSupportedValuesQuery objects are restricted in that some
+ // members are const.
+ // C2ParamField - required for its constructor - has no constructors
+ // from fields. Use C2ParamInspector.
+ for (const FieldSupportedValuesQuery &query : inFields) {
+ c2fields.emplace_back(_C2ParamInspector::CreateParamField(
+ query.field.index,
+ query.field.fieldId.offset,
+ query.field.fieldId.size),
+ query.type == FieldSupportedValuesQuery::Type::POSSIBLE ?
+ C2FieldSupportedValuesQuery::POSSIBLE :
+ C2FieldSupportedValuesQuery::CURRENT);
+ }
+ }
+ c2_status_t c2res = mIntf->querySupportedValues(
+ c2fields,
+ mayBlock ? C2_MAY_BLOCK : C2_DONT_BLOCK);
+ hidl_vec<FieldSupportedValuesQueryResult> outFields(inFields.size());
+ {
+ size_t ix = 0;
+ for (const C2FieldSupportedValuesQuery &result : c2fields) {
+ objcpy(&outFields[ix++], result);
+ }
+ }
+ _hidl_cb((Status)c2res, outFields);
+ return Void();
+}
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
diff --git a/media/codec2/hidl/1.0/utils/InputSurface.cpp b/media/codec2/hidl/1.0/utils/InputSurface.cpp
new file mode 100644
index 0000000..b669460
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/InputSurface.cpp
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2-InputSurface"
+#include <log/log.h>
+
+#include <codec2/hidl/1.0/InputSurface.h>
+#include <codec2/hidl/1.0/InputSurfaceConnection.h>
+
+#include <util/C2InterfaceHelper.h>
+#include <C2Component.h>
+#include <C2Config.h>
+
+#include <memory>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using namespace ::android;
+
+class InputSurface::ConfigurableImpl : public C2InterfaceHelper {
+public:
+ explicit ConfigurableImpl(
+ const std::shared_ptr<C2ReflectorHelper> &helper)
+ : C2InterfaceHelper(helper) {
+
+ setDerivedInstance(this);
+
+ addParameter(
+ DefineParam(mEos, C2_NAME_INPUT_SURFACE_EOS_TUNING)
+ .withDefault(new C2InputSurfaceEosTuning(false))
+ .withFields({C2F(mEos, value).oneOf({true, false})})
+ .withSetter(EosSetter)
+ .build());
+ }
+
+ static C2R EosSetter(bool mayBlock, C2P<C2InputSurfaceEosTuning> &me) {
+ (void)mayBlock;
+ return me.F(me.v.value).validatePossible(me.v.value);
+ }
+
+ bool eos() const { return mEos->value; }
+
+private:
+ std::shared_ptr<C2InputSurfaceEosTuning> mEos;
+};
+
+namespace {
+
+class ConfigurableWrapper : public ConfigurableC2Intf {
+public:
+ ConfigurableWrapper(
+ const std::shared_ptr<InputSurface::ConfigurableImpl> &impl,
+ const sp<GraphicBufferSource> &source)
+ : ConfigurableC2Intf("input-surface"),
+ mImpl(impl),
+ mSource(source) {
+ }
+
+ ~ConfigurableWrapper() override = default;
+
+ c2_status_t query(
+ const std::vector<C2Param::Index> &indices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const params) const override {
+ return mImpl->query({}, indices, mayBlock, params);
+ }
+
+ c2_status_t config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) override {
+ c2_status_t err = mImpl->config(params, mayBlock, failures);
+ if (mImpl->eos()) {
+ sp<GraphicBufferSource> source = mSource.promote();
+ if (source == nullptr || source->signalEndOfInputStream() != OK) {
+ // TODO: put something in |failures|
+ err = C2_BAD_VALUE;
+ }
+ // TODO: reset eos?
+ }
+ return err;
+ }
+
+ c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params) const override {
+ return mImpl->querySupportedParams(params);
+ }
+
+ c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const override {
+ return mImpl->querySupportedValues(fields, mayBlock);
+ }
+
+private:
+ const std::shared_ptr<InputSurface::ConfigurableImpl> mImpl;
+ wp<GraphicBufferSource> mSource;
+};
+
+} // namespace
+
+
+Return<void> InputSurface::connectToComponent(
+ const sp<IComponent>& component,
+ connectToComponent_cb _hidl_cb) {
+ Status status;
+ sp<InputSurfaceConnection> conn;
+ if (!component) {
+ status = Status::BAD_VALUE;
+ } else {
+ std::shared_ptr<C2Component> comp = mStore->findC2Component(component);
+ if (!comp) {
+ conn = new InputSurfaceConnection(mSource, component);
+ } else {
+ conn = new InputSurfaceConnection(mSource, comp);
+ }
+ if (!conn->init()) {
+ conn = nullptr;
+ status = Status::BAD_VALUE;
+ } else {
+ status = Status::OK;
+ }
+ }
+ _hidl_cb(status, conn);
+ return Void();
+}
+
+Return<sp<IConfigurable>> InputSurface::getConfigurable() {
+ return mConfigurable;
+}
+
+// Derived methods from IGraphicBufferProducer
+
+Return<void> InputSurface::requestBuffer(
+ int32_t slot,
+ requestBuffer_cb _hidl_cb) {
+ return mBase->requestBuffer(slot, _hidl_cb);
+}
+
+Return<int32_t> InputSurface::setMaxDequeuedBufferCount(
+ int32_t maxDequeuedBuffers) {
+ return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
+}
+
+Return<int32_t> InputSurface::setAsyncMode(
+ bool async) {
+ return mBase->setAsyncMode(async);
+}
+
+Return<void> InputSurface::dequeueBuffer(
+ uint32_t width,
+ uint32_t height,
+ PixelFormat format,
+ uint32_t usage,
+ bool getFrameTimestamps,
+ dequeueBuffer_cb _hidl_cb) {
+ return mBase->dequeueBuffer(
+ width, height, format, usage, getFrameTimestamps, _hidl_cb);
+}
+
+Return<int32_t> InputSurface::detachBuffer(
+ int32_t slot) {
+ return mBase->detachBuffer(slot);
+}
+
+Return<void> InputSurface::detachNextBuffer(
+ detachNextBuffer_cb _hidl_cb) {
+ return mBase->detachNextBuffer(_hidl_cb);
+}
+
+Return<void> InputSurface::attachBuffer(
+ const AnwBuffer& buffer,
+ attachBuffer_cb _hidl_cb) {
+ return mBase->attachBuffer(buffer, _hidl_cb);
+}
+
+Return<void> InputSurface::queueBuffer(
+ int32_t slot,
+ const QueueBufferInput& input,
+ queueBuffer_cb _hidl_cb) {
+ return mBase->queueBuffer(slot, input, _hidl_cb);
+}
+
+Return<int32_t> InputSurface::cancelBuffer(
+ int32_t slot,
+ const hidl_handle& fence) {
+ return mBase->cancelBuffer(slot, fence);
+}
+
+Return<void> InputSurface::query(
+ int32_t what,
+ query_cb _hidl_cb) {
+ return mBase->query(what, _hidl_cb);
+}
+
+Return<void> InputSurface::connect(
+ const sp<HProducerListener>& listener,
+ int32_t api,
+ bool producerControlledByApp,
+ connect_cb _hidl_cb) {
+ return mBase->connect(listener, api, producerControlledByApp, _hidl_cb);
+}
+
+Return<int32_t> InputSurface::disconnect(
+ int32_t api,
+ DisconnectMode mode) {
+ return mBase->disconnect(api, mode);
+}
+
+Return<int32_t> InputSurface::setSidebandStream(
+ const hidl_handle& stream) {
+ return mBase->setSidebandStream(stream);
+}
+
+Return<void> InputSurface::allocateBuffers(
+ uint32_t width,
+ uint32_t height,
+ PixelFormat format,
+ uint32_t usage) {
+ return mBase->allocateBuffers(width, height, format, usage);
+}
+
+Return<int32_t> InputSurface::allowAllocation(
+ bool allow) {
+ return mBase->allowAllocation(allow);
+}
+
+Return<int32_t> InputSurface::setGenerationNumber(
+ uint32_t generationNumber) {
+ return mBase->setGenerationNumber(generationNumber);
+}
+
+Return<void> InputSurface::getConsumerName(
+ getConsumerName_cb _hidl_cb) {
+ return mBase->getConsumerName(_hidl_cb);
+}
+
+Return<int32_t> InputSurface::setSharedBufferMode(
+ bool sharedBufferMode) {
+ return mBase->setSharedBufferMode(sharedBufferMode);
+}
+
+Return<int32_t> InputSurface::setAutoRefresh(
+ bool autoRefresh) {
+ return mBase->setAutoRefresh(autoRefresh);
+}
+
+Return<int32_t> InputSurface::setDequeueTimeout(
+ int64_t timeoutNs) {
+ return mBase->setDequeueTimeout(timeoutNs);
+}
+
+Return<void> InputSurface::getLastQueuedBuffer(
+ getLastQueuedBuffer_cb _hidl_cb) {
+ return mBase->getLastQueuedBuffer(_hidl_cb);
+}
+
+Return<void> InputSurface::getFrameTimestamps(
+ getFrameTimestamps_cb _hidl_cb) {
+ return mBase->getFrameTimestamps(_hidl_cb);
+}
+
+Return<void> InputSurface::getUniqueId(
+ getUniqueId_cb _hidl_cb) {
+ return mBase->getUniqueId(_hidl_cb);
+}
+
+// Constructor is exclusive to ComponentStore.
+InputSurface::InputSurface(
+ const sp<ComponentStore>& store,
+ const std::shared_ptr<C2ReflectorHelper>& reflector,
+ const sp<HGraphicBufferProducer>& base,
+ const sp<GraphicBufferSource>& source) :
+ mStore(store),
+ mBase(base),
+ mSource(source),
+ mHelper(std::make_shared<ConfigurableImpl>(reflector)),
+ mConfigurable(new CachedConfigurable(
+ std::make_unique<ConfigurableWrapper>(mHelper, source))) {
+
+ mConfigurable->init(store.get());
+}
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
diff --git a/media/codec2/hidl/1.0/utils/InputSurfaceConnection.cpp b/media/codec2/hidl/1.0/utils/InputSurfaceConnection.cpp
new file mode 100644
index 0000000..ba7c2d6
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/InputSurfaceConnection.cpp
@@ -0,0 +1,439 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2-InputSurfaceConnection"
+#include <log/log.h>
+
+#include <codec2/hidl/1.0/InputSurfaceConnection.h>
+
+#include <memory>
+#include <list>
+#include <mutex>
+#include <atomic>
+
+#include <hidl/HidlSupport.h>
+#include <media/stagefright/bqhelper/ComponentWrapper.h>
+#include <system/graphics.h>
+#include <ui/GraphicBuffer.h>
+#include <utils/Errors.h>
+
+#include <C2.h>
+#include <C2AllocatorGralloc.h>
+#include <C2BlockInternal.h>
+#include <C2Buffer.h>
+#include <C2Component.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <C2Work.h>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+constexpr int32_t kBufferCount = 16;
+
+using namespace ::android;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+
+namespace /* unnamed */ {
+
+class Buffer2D : public C2Buffer {
+public:
+ explicit Buffer2D(C2ConstGraphicBlock block) : C2Buffer({ block }) {
+ }
+};
+
+} // unnamed namespace
+
+struct InputSurfaceConnection::Impl : public ComponentWrapper {
+ Impl(const sp<GraphicBufferSource>& source,
+ const std::shared_ptr<C2Component>& comp) :
+ mSource(source), mComp(comp), mRemoteComp(),
+ mFrameIndex(0) {
+ std::shared_ptr<C2ComponentInterface> intf = comp->intf();
+ mCompName = intf ? intf->getName() : "";
+ }
+
+ Impl(const sp<GraphicBufferSource>& source,
+ const sp<IComponent>& comp) :
+ mSource(source), mComp(), mRemoteComp(comp),
+ mFrameIndex(0) {
+ Return<void> transStatus = comp->getName(
+ [this](const hidl_string& name) {
+ mCompName = name.c_str();
+ });
+ if (!transStatus.isOk()) {
+ ALOGD("getName -- Cannot obtain remote component name.");
+ }
+ }
+
+ virtual ~Impl() = default;
+
+ bool init() {
+ sp<GraphicBufferSource> source = mSource.promote();
+ if (source == nullptr) {
+ return false;
+ }
+ status_t err = source->initCheck();
+ if (err != OK) {
+ ALOGD("Impl::init -- GBS init failed: %d", err);
+ return false;
+ }
+
+ // TODO: read settings properly from the interface
+ C2VideoSizeStreamTuning::input inputSize;
+ C2StreamUsageTuning::input usage;
+ c2_status_t c2Status = compQuery({ &inputSize, &usage },
+ {},
+ C2_MAY_BLOCK,
+ nullptr);
+ if (c2Status != C2_OK) {
+ ALOGD("Impl::init -- cannot query information from "
+ "the component interface: %s.", asString(c2Status));
+ return false;
+ }
+
+ // TODO: proper color aspect & dataspace
+ android_dataspace dataSpace = HAL_DATASPACE_BT709;
+
+ // TODO: use the usage read from intf
+ // uint32_t grallocUsage =
+ // C2AndroidMemoryUsage(C2MemoryUsage(usage.value)).
+ // asGrallocUsage();
+
+ uint32_t grallocUsage =
+ mCompName.compare(0, 11, "c2.android.") == 0 ?
+ GRALLOC_USAGE_SW_READ_OFTEN :
+ GRALLOC_USAGE_HW_VIDEO_ENCODER;
+
+ err = source->configure(
+ this, dataSpace, kBufferCount,
+ inputSize.width, inputSize.height,
+ grallocUsage);
+ if (err != OK) {
+ ALOGD("Impl::init -- GBS configure failed: %d", err);
+ return false;
+ }
+ for (int32_t i = 0; i < kBufferCount; ++i) {
+ if (!source->onInputBufferAdded(i).isOk()) {
+ ALOGD("Impl::init: populating GBS slots failed");
+ return false;
+ }
+ }
+ if (!source->start().isOk()) {
+ ALOGD("Impl::init -- GBS start failed");
+ return false;
+ }
+ mAllocatorMutex.lock();
+ c2_status_t c2err = GetCodec2PlatformAllocatorStore()->fetchAllocator(
+ C2AllocatorStore::PLATFORM_START + 1, // GRALLOC
+ &mAllocator);
+ mAllocatorMutex.unlock();
+ if (c2err != OK) {
+ ALOGD("Impl::init -- failed to fetch gralloc allocator: %d", c2err);
+ return false;
+ }
+ return true;
+ }
+
+ // From ComponentWrapper
+ virtual status_t submitBuffer(
+ int32_t bufferId,
+ const sp<GraphicBuffer>& buffer,
+ int64_t timestamp,
+ int fenceFd) override {
+ ALOGV("Impl::submitBuffer -- bufferId = %d", bufferId);
+ // TODO: Use fd to construct fence
+ (void)fenceFd;
+
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ C2Handle* handle = WrapNativeCodec2GrallocHandle(
+ native_handle_clone(buffer->handle),
+ buffer->width, buffer->height,
+ buffer->format, buffer->usage, buffer->stride);
+ mAllocatorMutex.lock();
+ c2_status_t err = mAllocator->priorGraphicAllocation(handle, &alloc);
+ mAllocatorMutex.unlock();
+ if (err != OK) {
+ return UNKNOWN_ERROR;
+ }
+ std::shared_ptr<C2GraphicBlock> block =
+ _C2BlockFactory::CreateGraphicBlock(alloc);
+
+ std::unique_ptr<C2Work> work(new C2Work);
+ work->input.flags = (C2FrameData::flags_t)0;
+ work->input.ordinal.timestamp = timestamp;
+ work->input.ordinal.frameIndex = mFrameIndex.fetch_add(
+ 1, std::memory_order_relaxed);
+ work->input.buffers.clear();
+ std::shared_ptr<C2Buffer> c2Buffer(
+ // TODO: fence
+ new Buffer2D(block->share(
+ C2Rect(block->width(), block->height()), ::C2Fence())),
+ [bufferId, src = mSource](C2Buffer* ptr) {
+ delete ptr;
+ sp<GraphicBufferSource> source = src.promote();
+ if (source != nullptr) {
+ // TODO: fence
+ (void)source->onInputBufferEmptied(bufferId, -1);
+ }
+ });
+ work->input.buffers.push_back(c2Buffer);
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+
+ err = compQueue(&items);
+ return (err == C2_OK) ? OK : UNKNOWN_ERROR;
+ }
+
+ virtual status_t submitEos(int32_t /* bufferId */) override {
+ ALOGV("Impl::submitEos");
+
+ std::unique_ptr<C2Work> work(new C2Work);
+ work->input.flags = (C2FrameData::flags_t)0;
+ work->input.ordinal.frameIndex = mFrameIndex.fetch_add(
+ 1, std::memory_order_relaxed);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+
+ c2_status_t err = compQueue(&items);
+ return (err == C2_OK) ? OK : UNKNOWN_ERROR;
+ }
+
+ void dispatchDataSpaceChanged(
+ int32_t dataSpace, int32_t aspects, int32_t pixelFormat) override {
+ // TODO
+ (void)dataSpace;
+ (void)aspects;
+ (void)pixelFormat;
+ }
+
+private:
+ c2_status_t compQuery(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) {
+ std::shared_ptr<C2Component> comp = mComp.lock();
+ if (comp) {
+ std::shared_ptr<C2ComponentInterface> intf = comp->intf();
+ if (intf) {
+ return intf->query_vb(stackParams,
+ heapParamIndices,
+ mayBlock,
+ heapParams);
+ } else {
+ ALOGD("compQuery -- component does not have an interface.");
+ return C2_BAD_STATE;
+ }
+ }
+ if (!mRemoteComp) {
+ ALOGD("compQuery -- component no longer exists.");
+ return C2_BAD_STATE;
+ }
+
+ hidl_vec<ParamIndex> indices(
+ stackParams.size() + heapParamIndices.size());
+ size_t numIndices = 0;
+ for (C2Param* const& stackParam : stackParams) {
+ if (!stackParam) {
+ ALOGD("compQuery -- null stack param encountered.");
+ continue;
+ }
+ indices[numIndices++] = static_cast<ParamIndex>(stackParam->index());
+ }
+ size_t numStackIndices = numIndices;
+ for (const C2Param::Index& index : heapParamIndices) {
+ indices[numIndices++] =
+ static_cast<ParamIndex>(static_cast<uint32_t>(index));
+ }
+ indices.resize(numIndices);
+ if (heapParams) {
+ heapParams->reserve(heapParams->size() + numIndices);
+ }
+ c2_status_t status;
+ Return<void> transStatus = mRemoteComp->query(
+ indices,
+ mayBlock == C2_MAY_BLOCK,
+ [&status, &numStackIndices, &stackParams, heapParams](
+ Status s, const Params& p) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK && status != C2_BAD_INDEX) {
+ ALOGD("compQuery -- call failed: %s.", asString(status));
+ return;
+ }
+ std::vector<C2Param*> paramPointers;
+ c2_status_t parseStatus = parseParamsBlob(¶mPointers, p);
+ if (parseStatus != C2_OK) {
+ ALOGD("compQuery -- error while parsing params: %s.",
+ asString(parseStatus));
+ status = parseStatus;
+ return;
+ }
+ size_t i = 0;
+ for (auto it = paramPointers.begin();
+ it != paramPointers.end(); ) {
+ C2Param* paramPointer = *it;
+ if (numStackIndices > 0) {
+ --numStackIndices;
+ if (!paramPointer) {
+ ALOGD("compQuery -- null stack param.");
+ ++it;
+ continue;
+ }
+ for (; i < stackParams.size() &&
+ !stackParams[i]; ) {
+ ++i;
+ }
+ CHECK(i < stackParams.size());
+ if (stackParams[i]->index() !=
+ paramPointer->index()) {
+ ALOGD("compQuery -- param skipped. index = %d",
+ static_cast<int>(
+ stackParams[i]->index()));
+ stackParams[i++]->invalidate();
+ continue;
+ }
+ if (!stackParams[i++]->updateFrom(*paramPointer)) {
+ ALOGD("compQuery -- param update failed: "
+ "index = %d.",
+ static_cast<int>(paramPointer->index()));
+ }
+ } else {
+ if (!paramPointer) {
+ ALOGD("compQuery -- null heap param.");
+ ++it;
+ continue;
+ }
+ if (!heapParams) {
+ ALOGD("compQuery -- too many stack params.");
+ break;
+ }
+ heapParams->emplace_back(C2Param::Copy(*paramPointer));
+ }
+ ++it;
+ }
+ });
+ if (!transStatus.isOk()) {
+ ALOGD("compQuery -- transaction failed.");
+ return C2_CORRUPTED;
+ }
+ return status;
+ }
+
+ c2_status_t compQueue(std::list<std::unique_ptr<C2Work>>* const items) {
+ std::shared_ptr<C2Component> comp = mComp.lock();
+ if (comp) {
+ return comp->queue_nb(items);
+ }
+
+ WorkBundle workBundle;
+ Status hidlStatus = objcpy(&workBundle, *items, nullptr);
+ if (hidlStatus != Status::OK) {
+ ALOGD("compQueue -- bad input.");
+ return C2_CORRUPTED;
+ }
+ Return<Status> transStatus = mRemoteComp->queue(workBundle);
+ if (!transStatus.isOk()) {
+ ALOGD("compQueue -- transaction failed.");
+ return C2_CORRUPTED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGV("compQueue -- call failed: %s.", asString(status));
+ }
+ return status;
+ }
+
+ wp<GraphicBufferSource> mSource;
+ std::weak_ptr<C2Component> mComp;
+ sp<IComponent> mRemoteComp;
+ std::string mCompName;
+
+ // Needed for ComponentWrapper implementation
+ std::mutex mAllocatorMutex;
+ std::shared_ptr<C2Allocator> mAllocator;
+ std::atomic_uint64_t mFrameIndex;
+};
+
+InputSurfaceConnection::InputSurfaceConnection(
+ const sp<GraphicBufferSource>& source,
+ const std::shared_ptr<C2Component>& comp) :
+ mSource(source),
+ mImpl(new Impl(source, comp)) {
+}
+
+InputSurfaceConnection::InputSurfaceConnection(
+ const sp<GraphicBufferSource>& source,
+ const sp<IComponent>& comp) :
+ mSource(source),
+ mImpl(new Impl(source, comp)) {
+}
+
+InputSurfaceConnection::~InputSurfaceConnection() {
+ if (mSource) {
+ (void)mSource->stop();
+ (void)mSource->release();
+ mSource.clear();
+ }
+ mImpl.clear();
+}
+
+bool InputSurfaceConnection::init() {
+ mMutex.lock();
+ sp<Impl> impl = mImpl;
+ mMutex.unlock();
+
+ if (!impl) {
+ return false;
+ }
+ return impl->init();
+}
+
+Return<Status> InputSurfaceConnection::disconnect() {
+ ALOGV("disconnect");
+ mMutex.lock();
+ if (mSource) {
+ (void)mSource->stop();
+ (void)mSource->release();
+ mSource.clear();
+ }
+ mImpl.clear();
+ mMutex.unlock();
+ ALOGV("disconnected");
+ return Status::OK;
+}
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
diff --git a/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/Component.h b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/Component.h
new file mode 100644
index 0000000..36dec1c
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/Component.h
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_HIDL_V1_0_UTILS_COMPONENT_H
+#define CODEC2_HIDL_V1_0_UTILS_COMPONENT_H
+
+#include <codec2/hidl/1.0/Configurable.h>
+#include <codec2/hidl/1.0/types.h>
+
+#include <android/hardware/media/bufferpool/1.0/IClientManager.h>
+#include <android/hardware/media/c2/1.0/IComponentListener.h>
+#include <android/hardware/media/c2/1.0/IComponentStore.h>
+#include <android/hardware/media/c2/1.0/IComponent.h>
+#include <hidl/Status.h>
+#include <hwbinder/IBinder.h>
+
+#include <C2Component.h>
+#include <C2Buffer.h>
+#include <C2.h>
+
+#include <list>
+#include <map>
+#include <memory>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::hardware::IBinder;
+using ::android::sp;
+using ::android::wp;
+
+struct ComponentStore;
+
+struct ComponentInterface : public Configurable<IComponentInterface> {
+ ComponentInterface(
+ const std::shared_ptr<C2ComponentInterface>& interface,
+ const sp<ComponentStore>& store);
+ c2_status_t status() const;
+
+protected:
+ c2_status_t mInit;
+ std::shared_ptr<C2ComponentInterface> mInterface;
+ sp<ComponentStore> mStore;
+};
+
+struct Component : public Configurable<IComponent> {
+ Component(
+ const std::shared_ptr<C2Component>&,
+ const sp<IComponentListener>& listener,
+ const sp<ComponentStore>& store,
+ const sp<::android::hardware::media::bufferpool::V1_0::
+ IClientManager>& clientPoolManager);
+ c2_status_t status() const;
+
+ typedef ::android::hardware::graphics::bufferqueue::V1_0::
+ IGraphicBufferProducer HGraphicBufferProducer;
+
+ // Methods from IComponent follow.
+ virtual Return<Status> queue(const WorkBundle& workBundle) override;
+ virtual Return<void> flush(flush_cb _hidl_cb) override;
+ virtual Return<Status> drain(bool withEos) override;
+ virtual Return<Status> setOutputSurface(
+ uint64_t blockPoolId,
+ const sp<HGraphicBufferProducer>& surface) override;
+ virtual Return<Status> connectToOmxInputSurface(
+ const sp<HGraphicBufferProducer>& producer,
+ const sp<::android::hardware::media::omx::V1_0::
+ IGraphicBufferSource>& source) override;
+ virtual Return<Status> disconnectFromInputSurface() override;
+ virtual Return<void> createBlockPool(
+ uint32_t allocatorId,
+ createBlockPool_cb _hidl_cb) override;
+ virtual Return<Status> destroyBlockPool(uint64_t blockPoolId) override;
+ virtual Return<Status> start() override;
+ virtual Return<Status> stop() override;
+ virtual Return<Status> reset() override;
+ virtual Return<Status> release() override;
+
+protected:
+ c2_status_t mInit;
+ std::shared_ptr<C2Component> mComponent;
+ std::shared_ptr<C2ComponentInterface> mInterface;
+ sp<IComponentListener> mListener;
+ sp<ComponentStore> mStore;
+ ::android::hardware::media::c2::V1_0::utils::DefaultBufferPoolSender
+ mBufferPoolSender;
+
+ std::mutex mBlockPoolsMutex;
+ // This map keeps C2BlockPool objects that are created by createBlockPool()
+ // alive. These C2BlockPool objects can be deleted by calling
+ // destroyBlockPool(), reset() or release(), or by destroying the component.
+ std::map<uint64_t, std::shared_ptr<C2BlockPool>> mBlockPools;
+
+ // This struct is a comparable wrapper for IComponent.
+ //
+ // An IComponent object is either local or remote. If it is local, we can
+ // use the underlying pointer as a key. If it is remote, we have to use the
+ // underlying pointer of the associated binder object as a key.
+ //
+ // See interfacesEqual() for more detail.
+ struct InterfaceKey {
+ // An InterfaceKey is constructed from IComponent.
+ InterfaceKey(const sp<IComponent>& component);
+ // operator< is defined here to control the default definition of
+ // std::less<InterfaceKey>, which will be used in type Roster defined
+ // below.
+ bool operator<(const InterfaceKey& other) const {
+ return isRemote ?
+ (other.isRemote ?
+ // remote & remote
+ std::less<IBinder*>()(
+ remote.unsafe_get(),
+ other.remote.unsafe_get()) :
+ // remote & local
+ false) :
+ (other.isRemote ?
+ // local & remote
+ true :
+ // local & local
+ std::less<IComponent*>()(
+ local.unsafe_get(),
+ other.local.unsafe_get()));
+ }
+ private:
+ bool isRemote;
+ wp<IBinder> remote;
+ wp<IComponent> local;
+ };
+
+ typedef std::map<InterfaceKey, std::weak_ptr<C2Component>> Roster;
+ typedef Roster::const_iterator LocalId;
+ LocalId mLocalId;
+ void setLocalId(const LocalId& localId);
+
+ void initListener(const sp<Component>& self);
+
+ virtual ~Component() override;
+
+ friend struct ComponentStore;
+
+ struct Listener;
+};
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // CODEC2_HIDL_V1_0_UTILS_COMPONENT_H
diff --git a/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/ComponentStore.h b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/ComponentStore.h
new file mode 100644
index 0000000..5821e8a
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/ComponentStore.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_HIDL_V1_0_UTILS_COMPONENTSTORE_H
+#define CODEC2_HIDL_V1_0_UTILS_COMPONENTSTORE_H
+
+#include <codec2/hidl/1.0/Component.h>
+#include <codec2/hidl/1.0/Configurable.h>
+#include <android/hardware/media/c2/1.0/IComponentStore.h>
+#include <android/hardware/media/bufferpool/1.0/IClientManager.h>
+#include <hidl/Status.h>
+
+#include <C2Component.h>
+#include <C2Param.h>
+#include <C2.h>
+
+#include <map>
+#include <memory>
+#include <mutex>
+#include <set>
+#include <vector>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using ::android::hardware::media::bufferpool::V1_0::IClientManager;
+
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_handle;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+using ::android::wp;
+
+struct ComponentStore : public Configurable<IComponentStore> {
+ ComponentStore(const std::shared_ptr<C2ComponentStore>& store);
+ virtual ~ComponentStore() = default;
+
+ c2_status_t status() const {
+ return mInit;
+ }
+
+ c2_status_t validateSupportedParams(
+ const std::vector<std::shared_ptr<C2ParamDescriptor>>& params);
+
+ // Methods from ::android::hardware::media::c2::V1_0::IComponentStore
+ Return<void> createComponent(
+ const hidl_string& name,
+ const sp<IComponentListener>& listener,
+ const sp<IClientManager>& pool,
+ createComponent_cb _hidl_cb) override;
+ Return<void> createInterface(
+ const hidl_string& name,
+ createInterface_cb _hidl_cb) override;
+ Return<void> listComponents(listComponents_cb _hidl_cb) override;
+ Return<sp<IInputSurface>> createInputSurface() override;
+ Return<void> getStructDescriptors(
+ const hidl_vec<uint32_t>& indices,
+ getStructDescriptors_cb _hidl_cb) override;
+ Return<sp<IClientManager>> getPoolClientManager() override;
+ Return<Status> copyBuffer(
+ const Buffer& src,
+ const Buffer& dst) override;
+
+ // Debug dump
+ Return<void> debug(
+ const hidl_handle& handle,
+ const hidl_vec<hidl_string>& args) override;
+
+protected:
+ // does bookkeeping for an interface that has been loaded
+ void onInterfaceLoaded(const std::shared_ptr<C2ComponentInterface> &intf);
+
+ c2_status_t mInit;
+ std::shared_ptr<C2ComponentStore> mStore;
+ std::shared_ptr<C2ParamReflector> mParamReflector;
+
+ std::map<C2Param::CoreIndex, std::shared_ptr<C2StructDescriptor>> mStructDescriptors;
+ std::set<C2Param::CoreIndex> mUnsupportedStructDescriptors;
+ std::set<C2String> mLoadedInterfaces;
+ mutable std::mutex mStructDescriptorsMutex;
+
+ // Component lifetime management
+ Component::Roster mComponentRoster;
+ mutable std::mutex mComponentRosterMutex;
+ void reportComponentDeath(const Component::LocalId& componentLocalId);
+
+ friend Component;
+
+ // C2Component lookup
+ std::shared_ptr<C2Component> findC2Component(
+ const sp<IComponent>& component) const;
+
+ friend struct InputSurface;
+};
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // CODEC2_HIDL_V1_0_UTILS_COMPONENTSTORE_H
diff --git a/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/Configurable.h b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/Configurable.h
new file mode 100644
index 0000000..2e33a6f
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/Configurable.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_HIDL_V1_0_UTILS_CONFIGURABLE_H
+#define CODEC2_HIDL_V1_0_UTILS_CONFIGURABLE_H
+
+#include <codec2/hidl/1.0/ConfigurableC2Intf.h>
+
+#include <C2Component.h>
+#include <C2Param.h>
+#include <C2.h>
+
+#include <android/hardware/media/c2/1.0/IConfigurable.h>
+#include <hidl/Status.h>
+
+#include <memory>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+struct ComponentStore;
+
+/**
+ * Implementation of the IConfigurable interface that supports caching of
+ * supported parameters from a supplied ComponentStore.
+ *
+ * This is mainly the same for all of the configurable C2 interfaces though
+ * there are slight differences in the blocking behavior. This is handled in the
+ * ConfigurableC2Intf implementations.
+ */
+struct CachedConfigurable : public IConfigurable {
+ CachedConfigurable(std::unique_ptr<ConfigurableC2Intf>&& intf);
+
+ c2_status_t init(ComponentStore* store);
+
+ // Methods from ::android::hardware::media::c2::V1_0::IConfigurable
+
+ virtual Return<void> getName(getName_cb _hidl_cb) override;
+
+ virtual Return<void> query(
+ const hidl_vec<uint32_t>& indices,
+ bool mayBlock,
+ query_cb _hidl_cb) override;
+
+ virtual Return<void> config(
+ const hidl_vec<uint8_t>& inParams,
+ bool mayBlock,
+ config_cb _hidl_cb) override;
+
+ virtual Return<void> querySupportedParams(
+ uint32_t start,
+ uint32_t count,
+ querySupportedParams_cb _hidl_cb) override;
+
+ virtual Return<void> querySupportedValues(
+ const hidl_vec<FieldSupportedValuesQuery>& inFields,
+ bool mayBlock,
+ querySupportedValues_cb _hidl_cb) override;
+
+protected:
+ // Common Codec2.0 interface wrapper
+ std::unique_ptr<ConfigurableC2Intf> mIntf;
+
+ // Cached supported params
+ std::vector<std::shared_ptr<C2ParamDescriptor>> mSupportedParams;
+};
+
+/**
+ * Template that implements the `IConfigurable` interface for an inherited
+ * interface. Classes that implement a child interface `I` of `IConfigurable`
+ * can derive from `Configurable<I>`.
+ */
+template <typename I>
+struct Configurable : public I {
+ Configurable(const sp<CachedConfigurable>& intf): mIntf(intf) {
+ }
+
+ c2_status_t init(ComponentStore* store) {
+ return mIntf->init(store);
+ }
+
+ // Methods from ::android::hardware::media::c2::V1_0::IConfigurable
+
+ using getName_cb = typename I::getName_cb;
+ virtual Return<void> getName(getName_cb _hidl_cb) override {
+ return mIntf->getName(_hidl_cb);
+ }
+
+ using query_cb = typename I::query_cb;
+ virtual Return<void> query(
+ const hidl_vec<uint32_t>& indices,
+ bool mayBlock,
+ query_cb _hidl_cb) override {
+ return mIntf->query(indices, mayBlock, _hidl_cb);
+ }
+
+ using config_cb = typename I::config_cb;
+ virtual Return<void> config(
+ const hidl_vec<uint8_t>& inParams,
+ bool mayBlock,
+ config_cb _hidl_cb) override {
+ return mIntf->config(inParams, mayBlock, _hidl_cb);
+ }
+
+ using querySupportedParams_cb = typename I::querySupportedParams_cb;
+ virtual Return<void> querySupportedParams(
+ uint32_t start,
+ uint32_t count,
+ querySupportedParams_cb _hidl_cb) override {
+ return mIntf->querySupportedParams(start, count, _hidl_cb);
+ }
+
+ using querySupportedValues_cb = typename I::querySupportedValues_cb;
+ virtual Return<void> querySupportedValues(
+ const hidl_vec<FieldSupportedValuesQuery>& inFields,
+ bool mayBlock,
+ querySupportedValues_cb _hidl_cb) override {
+ return mIntf->querySupportedValues(inFields, mayBlock, _hidl_cb);
+ }
+
+protected:
+ sp<CachedConfigurable> mIntf;
+};
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // CODEC2_HIDL_V1_0_UTILS_CONFIGURABLE_H
diff --git a/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/ConfigurableC2Intf.h b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/ConfigurableC2Intf.h
new file mode 100644
index 0000000..b8801bb
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/ConfigurableC2Intf.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_HIDL_V1_0_UTILS_CONFIGURABLEC2INTF_H
+#define CODEC2_HIDL_V1_0_UTILS_CONFIGURABLEC2INTF_H
+
+#include <C2Work.h>
+#include <C2Component.h>
+#include <C2Param.h>
+#include <C2.h>
+
+#include <hidl/HidlSupport.h>
+#include <utils/StrongPointer.h>
+#include <vector>
+#include <memory>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using ::android::sp;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+
+/**
+ * Common Codec 2.0 interface wrapper.
+ */
+struct ConfigurableC2Intf {
+ C2String getName() const { return mName; }
+ /** C2ComponentInterface::query_vb sans stack params */
+ virtual c2_status_t query(
+ const std::vector<C2Param::Index> &indices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const params) const = 0;
+ /** C2ComponentInterface::config_vb */
+ virtual c2_status_t config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) = 0;
+ /** C2ComponentInterface::querySupportedParams_nb */
+ virtual c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params) const = 0;
+ /** C2ComponentInterface::querySupportedParams_nb */
+ virtual c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields, c2_blocking_t mayBlock) const = 0;
+
+ virtual ~ConfigurableC2Intf() = default;
+
+ ConfigurableC2Intf(const C2String& name) : mName(name) {}
+
+protected:
+ C2String mName; /* cache component name */
+};
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // CODEC2_HIDL_V1_0_UTILS_CONFIGURABLEC2INTF_H
diff --git a/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/InputSurface.h b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/InputSurface.h
new file mode 100644
index 0000000..cef258e
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/InputSurface.h
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_HIDL_V1_0_UTILS_INPUTSURFACE_H
+#define CODEC2_HIDL_V1_0_UTILS_INPUTSURFACE_H
+
+#include <codec2/hidl/1.0/ComponentStore.h>
+
+#include <android/hardware/media/c2/1.0/IInputSurface.h>
+#include <android/hardware/media/c2/1.0/IComponent.h>
+
+#include <android/hardware/graphics/bufferqueue/1.0/IGraphicBufferProducer.h>
+#include <android/hardware/graphics/bufferqueue/1.0/IProducerListener.h>
+#include <android/hardware/graphics/common/1.0/types.h>
+#include <android/hardware/media/1.0/types.h>
+
+#include <gui/IGraphicBufferProducer.h>
+#include <media/stagefright/bqhelper/GraphicBufferSource.h>
+
+#include <hidl/HidlSupport.h>
+#include <hidl/Status.h>
+
+class C2ReflectorHelper;
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using ::android::hardware::hidl_handle;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+using ::android::hardware::graphics::common::V1_0::PixelFormat;
+using ::android::hardware::media::V1_0::AnwBuffer;
+
+struct InputSurface : public IInputSurface {
+
+ typedef ::android::hidl::base::V1_0::IBase IBase;
+
+ typedef ::android::hardware::graphics::bufferqueue::V1_0::
+ IProducerListener HProducerListener;
+
+ typedef ::android::
+ IGraphicBufferProducer BGraphicBufferProducer;
+
+ typedef ::android::hardware::graphics::bufferqueue::V1_0::
+ IGraphicBufferProducer HGraphicBufferProducer;
+
+ typedef ::android::
+ GraphicBufferSource GraphicBufferSource;
+
+// Type disambiguation
+
+ typedef ::android::hardware::media::c2::V1_0::Status Status;
+
+// New methods from IInputSurface
+
+ virtual Return<void> connectToComponent(
+ const sp<IComponent>& component,
+ connectToComponent_cb _hidl_cb) override;
+
+ virtual Return<sp<IConfigurable>> getConfigurable() override;
+
+// Methods derived from IGraphicBufferProducer
+
+ virtual Return<void> requestBuffer(
+ int32_t slot,
+ requestBuffer_cb _hidl_cb) override;
+
+ virtual Return<int32_t> setMaxDequeuedBufferCount(
+ int32_t maxDequeuedBuffers) override;
+
+ virtual Return<int32_t> setAsyncMode(
+ bool async) override;
+
+ virtual Return<void> dequeueBuffer(
+ uint32_t width,
+ uint32_t height,
+ PixelFormat format,
+ uint32_t usage,
+ bool getFrameTimestamps,
+ dequeueBuffer_cb _hidl_cb) override;
+
+ virtual Return<int32_t> detachBuffer(
+ int32_t slot) override;
+
+ virtual Return<void> detachNextBuffer(
+ detachNextBuffer_cb _hidl_cb) override;
+
+ virtual Return<void> attachBuffer(
+ const AnwBuffer& buffer,
+ attachBuffer_cb _hidl_cb) override;
+
+ virtual Return<void> queueBuffer(
+ int32_t slot,
+ const QueueBufferInput& input,
+ queueBuffer_cb _hidl_cb) override;
+
+ virtual Return<int32_t> cancelBuffer(
+ int32_t slot,
+ const hidl_handle& fence) override;
+
+ virtual Return<void> query(
+ int32_t what,
+ query_cb _hidl_cb) override;
+
+ virtual Return<void> connect(
+ const sp<HProducerListener>& listener,
+ int32_t api,
+ bool producerControlledByApp,
+ connect_cb _hidl_cb) override;
+
+ virtual Return<int32_t> disconnect(
+ int32_t api,
+ DisconnectMode mode) override;
+
+ virtual Return<int32_t> setSidebandStream(
+ const hidl_handle& stream) override;
+
+ virtual Return<void> allocateBuffers(
+ uint32_t width,
+ uint32_t height,
+ PixelFormat format,
+ uint32_t usage) override;
+
+ virtual Return<int32_t> allowAllocation(
+ bool allow) override;
+
+ virtual Return<int32_t> setGenerationNumber(
+ uint32_t generationNumber) override;
+
+ virtual Return<void> getConsumerName(
+ getConsumerName_cb _hidl_cb) override;
+
+ virtual Return<int32_t> setSharedBufferMode(
+ bool sharedBufferMode) override;
+
+ virtual Return<int32_t> setAutoRefresh(
+ bool autoRefresh) override;
+
+ virtual Return<int32_t> setDequeueTimeout(
+ int64_t timeoutNs) override;
+
+ virtual Return<void> getLastQueuedBuffer(
+ getLastQueuedBuffer_cb _hidl_cb) override;
+
+ virtual Return<void> getFrameTimestamps(
+ getFrameTimestamps_cb _hidl_cb) override;
+
+ virtual Return<void> getUniqueId(
+ getUniqueId_cb _hidl_cb) override;
+
+ class ConfigurableImpl;
+
+protected:
+ sp<ComponentStore> mStore;
+ sp<HGraphicBufferProducer> mBase;
+ sp<GraphicBufferSource> mSource;
+ std::shared_ptr<ConfigurableImpl> mHelper;
+ sp<CachedConfigurable> mConfigurable;
+
+ InputSurface(
+ const sp<ComponentStore>& store,
+ const std::shared_ptr<C2ReflectorHelper>& reflector,
+ const sp<HGraphicBufferProducer>& base,
+ const sp<GraphicBufferSource>& source);
+
+ virtual ~InputSurface() override = default;
+
+ friend struct ComponentStore;
+};
+
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // CODEC2_HIDL_V1_0_UTILS_INPUTSURFACE_H
diff --git a/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/InputSurfaceConnection.h b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/InputSurfaceConnection.h
new file mode 100644
index 0000000..904fa9e
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/InputSurfaceConnection.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_HIDL_V1_0_UTILS_INPUTSURFACECONNECTION_H
+#define CODEC2_HIDL_V1_0_UTILS_INPUTSURFACECONNECTION_H
+
+#include <codec2/hidl/1.0/Component.h>
+
+#include <android/hardware/media/c2/1.0/IComponent.h>
+#include <android/hardware/media/c2/1.0/IInputSurfaceConnection.h>
+
+#include <media/stagefright/bqhelper/GraphicBufferSource.h>
+
+#include <hidl/HidlSupport.h>
+#include <hidl/Status.h>
+
+#include <C2Component.h>
+
+#include <memory>
+#include <mutex>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+using ::android::GraphicBufferSource;
+
+struct InputSurfaceConnection : public IInputSurfaceConnection {
+
+ virtual Return<Status> disconnect() override;
+
+protected:
+
+ InputSurfaceConnection(
+ const sp<GraphicBufferSource>& source,
+ const std::shared_ptr<C2Component>& component);
+
+ InputSurfaceConnection(
+ const sp<GraphicBufferSource>& source,
+ const sp<IComponent>& component);
+
+ bool init();
+
+ friend struct InputSurface;
+
+ InputSurfaceConnection() = delete;
+ InputSurfaceConnection(const InputSurfaceConnection&) = delete;
+ void operator=(const InputSurfaceConnection&) = delete;
+
+ struct Impl;
+
+ std::mutex mMutex;
+ sp<GraphicBufferSource> mSource;
+ sp<Impl> mImpl;
+
+ virtual ~InputSurfaceConnection() override;
+};
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // CODEC2_HIDL_V1_0_UTILS_INPUTSURFACECONNECTION_H
diff --git a/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/types.h b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/types.h
new file mode 100644
index 0000000..58f5c96
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/include/codec2/hidl/1.0/types.h
@@ -0,0 +1,368 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_HIDL_V1_0_UTILS_TYPES_H
+#define CODEC2_HIDL_V1_0_UTILS_TYPES_H
+
+#include <chrono>
+
+#include <bufferpool/ClientManager.h>
+#include <android/hardware/media/bufferpool/1.0/IClientManager.h>
+#include <android/hardware/media/bufferpool/1.0/types.h>
+#include <android/hardware/media/c2/1.0/IComponentStore.h>
+#include <android/hardware/media/c2/1.0/types.h>
+#include <gui/IGraphicBufferProducer.h>
+
+#include <C2Component.h>
+#include <C2Param.h>
+#include <C2ParamDef.h>
+#include <C2Work.h>
+
+using namespace std::chrono_literals;
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using ::android::hardware::hidl_bitfield;
+using ::android::hardware::hidl_handle;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::status_t;
+using ::android::sp;
+using ::android::hardware::media::bufferpool::V1_0::implementation::
+ ConnectionId;
+using ::android::IGraphicBufferProducer;
+
+// Types of metadata for Blocks.
+struct C2Hidl_Range {
+ uint32_t offset;
+ uint32_t length; // Do not use "size" because the name collides with C2Info::size().
+};
+typedef C2GlobalParam<C2Info, C2Hidl_Range, 0> C2Hidl_RangeInfo;
+
+struct C2Hidl_Rect {
+ uint32_t left;
+ uint32_t top;
+ uint32_t width;
+ uint32_t height;
+};
+typedef C2GlobalParam<C2Info, C2Hidl_Rect, 1> C2Hidl_RectInfo;
+
+// C2SettingResult -> SettingResult
+Status objcpy(
+ SettingResult* d,
+ const C2SettingResult& s);
+
+// SettingResult -> std::unique_ptr<C2SettingResult>
+c2_status_t objcpy(
+ std::unique_ptr<C2SettingResult>* d,
+ const SettingResult& s);
+
+// C2ParamDescriptor -> ParamDescriptor
+Status objcpy(
+ ParamDescriptor* d,
+ const C2ParamDescriptor& s);
+
+// ParamDescriptor -> std::shared_ptr<C2ParamDescriptor>
+c2_status_t objcpy(
+ std::shared_ptr<C2ParamDescriptor>* d,
+ const ParamDescriptor& s);
+
+// C2FieldSupportedValuesQuery -> FieldSupportedValuesQuery
+Status objcpy(
+ FieldSupportedValuesQuery* d,
+ const C2FieldSupportedValuesQuery& s);
+
+// FieldSupportedValuesQuery -> C2FieldSupportedValuesQuery
+c2_status_t objcpy(
+ C2FieldSupportedValuesQuery* d,
+ const FieldSupportedValuesQuery& s);
+
+// C2FieldSupportedValuesQuery -> FieldSupportedValuesQueryResult
+Status objcpy(
+ FieldSupportedValuesQueryResult* d,
+ const C2FieldSupportedValuesQuery& s);
+
+// FieldSupportedValuesQuery, FieldSupportedValuesQueryResult -> C2FieldSupportedValuesQuery
+c2_status_t objcpy(
+ C2FieldSupportedValuesQuery* d,
+ const FieldSupportedValuesQuery& sq,
+ const FieldSupportedValuesQueryResult& sr);
+
+// C2Component::Traits -> ComponentTraits
+Status objcpy(
+ IComponentStore::ComponentTraits* d,
+ const C2Component::Traits& s);
+
+// ComponentTraits -> C2Component::Traits, std::unique_ptr<std::vector<std::string>>
+// Note: The output d is only valid as long as aliasesBuffer remains alive.
+c2_status_t objcpy(
+ C2Component::Traits* d,
+ std::unique_ptr<std::vector<std::string>>* aliasesBuffer,
+ const IComponentStore::ComponentTraits& s);
+
+// C2StructDescriptor -> StructDescriptor
+Status objcpy(
+ StructDescriptor* d,
+ const C2StructDescriptor& s);
+
+// StructDescriptor -> C2StructDescriptor
+c2_status_t objcpy(
+ std::unique_ptr<C2StructDescriptor>* d,
+ const StructDescriptor& s);
+
+// Abstract class to be used in
+// objcpy(std::list<std::unique_ptr<C2Work>> -> WorkBundle).
+struct BufferPoolSender {
+ typedef ::android::hardware::media::bufferpool::V1_0::
+ ResultStatus ResultStatus;
+ typedef ::android::hardware::media::bufferpool::V1_0::
+ BufferStatusMessage BufferStatusMessage;
+ typedef ::android::hardware::media::bufferpool::
+ BufferPoolData BufferPoolData;
+
+ /**
+ * Send bpData and return BufferStatusMessage that can be supplied to
+ * IClientManager::receive() in the receiving process.
+ *
+ * This function will be called from within the function
+ * objcpy(std::list<std::unique_ptr<C2Work>> -> WorkBundle).
+ *
+ * \param[in] bpData BufferPoolData identifying the buffer to send.
+ * \param[out] bpMessage BufferStatusMessage of the transaction. Information
+ * inside \p bpMessage should be passed to the receiving process by some
+ * other means so it can call receive() properly.
+ * \return ResultStatus value that determines the success of the operation.
+ * (See the possible values of ResultStatus in
+ * hardware/interfaces/media/bufferpool/1.0/types.hal.)
+ */
+ virtual ResultStatus send(
+ const std::shared_ptr<BufferPoolData>& bpData,
+ BufferStatusMessage* bpMessage) = 0;
+
+ virtual ~BufferPoolSender() = default;
+};
+
+// Default implementation of BufferPoolSender.
+//
+// To use DefaultBufferPoolSender, the IClientManager instance of the receiving
+// process must be set before send() can operate. DefaultBufferPoolSender will
+// hold a strong reference to the IClientManager instance and use it to call
+// IClientManager::registerSender() to establish the bufferpool connection when
+// send() is called.
+struct DefaultBufferPoolSender : BufferPoolSender {
+ typedef ::android::hardware::media::bufferpool::V1_0::implementation::
+ ClientManager ClientManager;
+ typedef ::android::hardware::media::bufferpool::V1_0::
+ IClientManager IClientManager;
+
+ // Set the IClientManager instance of the receiving process and the refresh
+ // interval for the connection. The default interval is 4.5 seconds, which
+ // is slightly shorter than the amount of time the bufferpool will keep an
+ // inactive connection for.
+ DefaultBufferPoolSender(
+ const sp<IClientManager>& receiverManager = nullptr,
+ std::chrono::steady_clock::duration refreshInterval = 4500ms);
+
+ // Set the IClientManager instance of the receiving process and the refresh
+ // interval for the connection. The default interval is 4.5 seconds, which
+ // is slightly shorter than the amount of time the bufferpool will keep an
+ // inactive connection for.
+ void setReceiver(
+ const sp<IClientManager>& receiverManager,
+ std::chrono::steady_clock::duration refreshInterval = 4500ms);
+
+ // Implementation of BufferPoolSender::send(). send() will establish a
+ // bufferpool connection if needed, then send the bufferpool data over to
+ // the receiving process.
+ virtual ResultStatus send(
+ const std::shared_ptr<BufferPoolData>& bpData,
+ BufferStatusMessage* bpMessage) override;
+
+private:
+ std::mutex mMutex;
+ sp<ClientManager> mSenderManager;
+ sp<IClientManager> mReceiverManager;
+ int64_t mReceiverConnectionId;
+ int64_t mSourceConnectionId;
+ std::chrono::steady_clock::time_point mLastSent;
+ std::chrono::steady_clock::duration mRefreshInterval;
+};
+
+// std::list<std::unique_ptr<C2Work>> -> WorkBundle
+// Note: If bufferpool will be used, bpSender must not be null.
+Status objcpy(
+ WorkBundle* d,
+ const std::list<std::unique_ptr<C2Work>>& s,
+ BufferPoolSender* bpSender = nullptr);
+
+// WorkBundle -> std::list<std::unique_ptr<C2Work>>
+c2_status_t objcpy(
+ std::list<std::unique_ptr<C2Work>>* d,
+ const WorkBundle& s);
+
+/**
+ * Parses a params blob and returns C2Param pointers to its params.
+ * \param[out] params target vector of C2Param pointers
+ * \param[in] blob parameter blob to parse
+ * \retval C2_OK if the full blob was parsed
+ * \retval C2_BAD_VALUE otherwise
+ */
+c2_status_t parseParamsBlob(
+ std::vector<C2Param*> *params,
+ const hidl_vec<uint8_t> &blob);
+
+/**
+ * Concatenates a list of C2Params into a params blob.
+ * \param[out] blob target blob
+ * \param[in] params parameters to concatenate
+ * \retval C2_OK if the blob was successfully created
+ * \retval C2_BAD_VALUE if the blob was not successful (this only happens if the parameters were
+ * not const)
+ */
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<C2Param*> ¶ms);
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<std::unique_ptr<C2Param>> ¶ms);
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<std::shared_ptr<const C2Info>> ¶ms);
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<std::unique_ptr<C2Tuning>> ¶ms);
+
+/**
+ * Parses a params blob and create a vector of C2Params whose members are copies
+ * of the params in the blob.
+ * \param[out] params the resulting vector
+ * \param[in] blob parameter blob to parse
+ * \retval C2_OK if the full blob was parsed and params was constructed
+ * \retval C2_BAD_VALUE otherwise
+ */
+c2_status_t copyParamsFromBlob(
+ std::vector<std::unique_ptr<C2Param>>* params,
+ Params blob);
+
+/**
+ * Parses a params blob and applies updates to params
+ * \param[in,out] params params to be updated
+ * \param[in] blob parameter blob containing updates
+ * \retval C2_OK if the full blob was parsed and params was updated
+ * \retval C2_BAD_VALUE otherwise
+ */
+c2_status_t updateParamsFromBlob(
+ const std::vector<C2Param*>& params,
+ const Params& blob);
+
+/**
+ * Converts a BufferPool status value to c2_status_t.
+ * \param BufferPool status
+ * \return Corresponding c2_status_t
+ */
+c2_status_t toC2Status(::android::hardware::media::bufferpool::V1_0::
+ ResultStatus rs);
+
+// BufferQueue-Based Block Operations
+// ==================================
+
+// Create a GraphicBuffer object from a graphic block and attach it to an
+// IGraphicBufferProducer.
+status_t attachToBufferQueue(const C2ConstGraphicBlock& block,
+ const sp<IGraphicBufferProducer>& igbp,
+ uint32_t generation,
+ int32_t* bqSlot);
+
+// Return false if block does not come from a bufferqueue-based blockpool.
+// Otherwise, extract generation, bqId and bqSlot and return true.
+bool getBufferQueueAssignment(const C2ConstGraphicBlock& block,
+ uint32_t* generation,
+ uint64_t* bqId,
+ int32_t* bqSlot);
+
+// Disassociate the given block with its designated bufferqueue so that
+// cancelBuffer() will not be called when the block is destroyed. If the block
+// does not have a designated bufferqueue, the function returns false.
+// Otherwise, it returns true.
+//
+// Note: This function should be called after attachBuffer() or queueBuffer() is
+// called manually.
+bool yieldBufferQueueBlock(const C2ConstGraphicBlock& block);
+
+// Call yieldBufferQueueBlock() on blocks in the given workList. processInput
+// determines whether input blocks are yielded. processOutput works similarly on
+// output blocks. (The default value of processInput is false while the default
+// value of processOutput is true. This implies that in most cases, only output
+// buffers contain bufferqueue-based blocks.)
+//
+// Note: This function should be called after WorkBundle has been successfully
+// sent over the Treble boundary to another process.
+void yieldBufferQueueBlocks(const std::list<std::unique_ptr<C2Work>>& workList,
+ bool processInput = false,
+ bool processOutput = true);
+
+// Assign the given block to a bufferqueue so that when the block is destroyed,
+// cancelBuffer() will be called.
+//
+// If the block does not come from a bufferqueue-based blockpool, this function
+// returns false.
+//
+// If the block already has a bufferqueue assignment that matches the given one,
+// the function returns true.
+//
+// If the block already has a bufferqueue assignment that does not match the
+// given one, the block will be reassigned to the given bufferqueue. This
+// will call attachBuffer() on the given igbp. The function then returns true on
+// success or false on any failure during the operation.
+//
+// Note: This function should be called after detachBuffer() or dequeueBuffer()
+// is called manually.
+bool holdBufferQueueBlock(const C2ConstGraphicBlock& block,
+ const sp<IGraphicBufferProducer>& igbp,
+ uint64_t bqId,
+ uint32_t generation);
+
+// Call holdBufferQueueBlock() on input or output blocks in the given workList.
+// Since the bufferqueue assignment for input and output buffers can be
+// different, this function takes forInput to determine whether the given
+// bufferqueue is for input buffers or output buffers. (The default value of
+// forInput is false.)
+//
+// In the (rare) case that both input and output buffers are bufferqueue-based,
+// this function must be called twice, once for the input buffers and once for
+// the output buffers.
+//
+// Note: This function should be called after WorkBundle has been received from
+// another process.
+void holdBufferQueueBlocks(const std::list<std::unique_ptr<C2Work>>& workList,
+ const sp<IGraphicBufferProducer>& igbp,
+ uint64_t bqId,
+ uint32_t generation,
+ bool forInput = false);
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+#endif // CODEC2_HIDL_V1_0_UTILS_TYPES_H
diff --git a/media/codec2/hidl/1.0/utils/types.cpp b/media/codec2/hidl/1.0/utils/types.cpp
new file mode 100644
index 0000000..5827504
--- /dev/null
+++ b/media/codec2/hidl/1.0/utils/types.cpp
@@ -0,0 +1,1803 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2-types"
+#include <log/log.h>
+
+#include <codec2/hidl/1.0/types.h>
+
+#include <media/stagefright/bqhelper/WGraphicBufferProducer.h>
+
+#include <C2AllocatorIon.h>
+#include <C2AllocatorGralloc.h>
+#include <C2BlockInternal.h>
+#include <C2Buffer.h>
+#include <C2Component.h>
+#include <C2Param.h>
+#include <C2ParamInternal.h>
+#include <C2PlatformSupport.h>
+#include <C2Work.h>
+#include <util/C2ParamUtils.h>
+
+#include <algorithm>
+#include <functional>
+#include <unordered_map>
+
+#include <media/stagefright/foundation/AUtils.h>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+namespace utils {
+
+using namespace ::android;
+using ::android::hardware::Return;
+using ::android::hardware::media::bufferpool::BufferPoolData;
+using ::android::hardware::media::bufferpool::V1_0::BufferStatusMessage;
+using ::android::hardware::media::bufferpool::V1_0::ResultStatus;
+using ::android::hardware::media::bufferpool::V1_0::implementation::
+ ClientManager;
+using ::android::hardware::media::bufferpool::V1_0::implementation::
+ TransactionId;
+using ::android::TWGraphicBufferProducer;
+
+namespace /* unnamed */ {
+
+template <typename Common, typename DstVector, typename SrcVector>
+void copyVector(DstVector* d, const SrcVector& s) {
+ static_assert(sizeof(Common) == sizeof(decltype((*d)[0])),
+ "DstVector's component size does not match Common");
+ static_assert(sizeof(Common) == sizeof(decltype(s[0])),
+ "SrcVector's component size does not match Common");
+ d->resize(s.size());
+ std::copy(
+ reinterpret_cast<const Common*>(&s[0]),
+ reinterpret_cast<const Common*>(&s[0] + s.size()),
+ reinterpret_cast<Common*>(&(*d)[0]));
+}
+
+// C2ParamField -> ParamField
+void objcpy(ParamField *d, const C2ParamField &s) {
+ d->index = static_cast<ParamIndex>(_C2ParamInspector::GetIndex(s));
+ d->fieldId.offset = static_cast<uint32_t>(_C2ParamInspector::GetOffset(s));
+ d->fieldId.size = static_cast<uint32_t>(_C2ParamInspector::GetSize(s));
+}
+
+struct C2ParamFieldBuilder : public C2ParamField {
+ C2ParamFieldBuilder() : C2ParamField(
+ static_cast<C2Param::Index>(static_cast<uint32_t>(0)), 0, 0) {
+ }
+ // ParamField -> C2ParamField
+ C2ParamFieldBuilder(const ParamField& s) : C2ParamField(
+ static_cast<C2Param::Index>(static_cast<uint32_t>(s.index)),
+ static_cast<uint32_t>(s.fieldId.offset),
+ static_cast<uint32_t>(s.fieldId.size)) {
+ }
+};
+
+// C2WorkOrdinalStruct -> WorkOrdinal
+void objcpy(WorkOrdinal *d, const C2WorkOrdinalStruct &s) {
+ d->frameIndex = static_cast<uint64_t>(s.frameIndex.peeku());
+ d->timestampUs = static_cast<uint64_t>(s.timestamp.peeku());
+ d->customOrdinal = static_cast<uint64_t>(s.customOrdinal.peeku());
+}
+
+// WorkOrdinal -> C2WorkOrdinalStruct
+void objcpy(C2WorkOrdinalStruct *d, const WorkOrdinal &s) {
+ d->frameIndex = c2_cntr64_t(s.frameIndex);
+ d->timestamp = c2_cntr64_t(s.timestampUs);
+ d->customOrdinal = c2_cntr64_t(s.customOrdinal);
+}
+
+// C2FieldSupportedValues::range's type -> FieldSupportedValues::Range
+void objcpy(
+ FieldSupportedValues::Range* d,
+ const decltype(C2FieldSupportedValues::range)& s) {
+ d->min = static_cast<PrimitiveValue>(s.min.u64);
+ d->max = static_cast<PrimitiveValue>(s.max.u64);
+ d->step = static_cast<PrimitiveValue>(s.step.u64);
+ d->num = static_cast<PrimitiveValue>(s.num.u64);
+ d->denom = static_cast<PrimitiveValue>(s.denom.u64);
+}
+
+// C2FieldSupportedValues -> FieldSupportedValues
+Status objcpy(FieldSupportedValues *d, const C2FieldSupportedValues &s) {
+ d->typeOther = static_cast<int32_t>(s.type);
+ switch (s.type) {
+ case C2FieldSupportedValues::EMPTY:
+ d->type = FieldSupportedValues::Type::EMPTY;
+ d->values.resize(0);
+ return Status::OK;
+ case C2FieldSupportedValues::RANGE:
+ d->type = FieldSupportedValues::Type::RANGE;
+ objcpy(&d->range, s.range);
+ d->values.resize(0);
+ return Status::OK;
+ default:
+ switch (s.type) {
+ case C2FieldSupportedValues::VALUES:
+ d->type = FieldSupportedValues::Type::VALUES;
+ break;
+ case C2FieldSupportedValues::FLAGS:
+ d->type = FieldSupportedValues::Type::FLAGS;
+ break;
+ default:
+ d->type = FieldSupportedValues::Type::OTHER;
+ // Copy all fields in this case
+ objcpy(&d->range, s.range);
+ }
+ d->values.resize(s.values.size());
+ copyVector<uint64_t>(&d->values, s.values);
+ return Status::OK;
+ }
+}
+
+// FieldSupportedValues::Range -> C2FieldSupportedValues::range's type
+void objcpy(
+ decltype(C2FieldSupportedValues::range)* d,
+ const FieldSupportedValues::Range& s) {
+ d->min.u64 = static_cast<uint64_t>(s.min);
+ d->max.u64 = static_cast<uint64_t>(s.max);
+ d->step.u64 = static_cast<uint64_t>(s.step);
+ d->num.u64 = static_cast<uint64_t>(s.num);
+ d->denom.u64 = static_cast<uint64_t>(s.denom);
+}
+
+// FieldSupportedValues -> C2FieldSupportedValues
+c2_status_t objcpy(C2FieldSupportedValues *d, const FieldSupportedValues &s) {
+ switch (s.type) {
+ case FieldSupportedValues::Type::EMPTY:
+ d->type = C2FieldSupportedValues::EMPTY;
+ return C2_OK;
+ case FieldSupportedValues::Type::RANGE:
+ d->type = C2FieldSupportedValues::RANGE;
+ objcpy(&d->range, s.range);
+ d->values.resize(0);
+ return C2_OK;
+ default:
+ switch (s.type) {
+ case FieldSupportedValues::Type::VALUES:
+ d->type = C2FieldSupportedValues::VALUES;
+ break;
+ case FieldSupportedValues::Type::FLAGS:
+ d->type = C2FieldSupportedValues::FLAGS;
+ break;
+ default:
+ d->type = static_cast<C2FieldSupportedValues::type_t>(s.typeOther);
+ // Copy all fields in this case
+ objcpy(&d->range, s.range);
+ }
+ copyVector<uint64_t>(&d->values, s.values);
+ return C2_OK;
+ }
+}
+
+} // unnamed namespace
+
+// C2FieldSupportedValuesQuery -> FieldSupportedValuesQuery
+Status objcpy(
+ FieldSupportedValuesQuery* d,
+ const C2FieldSupportedValuesQuery& s) {
+ objcpy(&d->field, s.field());
+ switch (s.type()) {
+ case C2FieldSupportedValuesQuery::POSSIBLE:
+ d->type = FieldSupportedValuesQuery::Type::POSSIBLE;
+ break;
+ case C2FieldSupportedValuesQuery::CURRENT:
+ d->type = FieldSupportedValuesQuery::Type::CURRENT;
+ break;
+ default:
+ ALOGE("Unknown type of C2FieldSupportedValuesQuery: %u",
+ static_cast<unsigned>(s.type()));
+ return Status::BAD_VALUE;
+ }
+ return Status::OK;
+}
+
+// FieldSupportedValuesQuery -> C2FieldSupportedValuesQuery
+c2_status_t objcpy(
+ C2FieldSupportedValuesQuery* d,
+ const FieldSupportedValuesQuery& s) {
+ C2FieldSupportedValuesQuery::type_t dType;
+ switch (s.type) {
+ case FieldSupportedValuesQuery::Type::POSSIBLE:
+ dType = C2FieldSupportedValuesQuery::POSSIBLE;
+ break;
+ case FieldSupportedValuesQuery::Type::CURRENT:
+ dType = C2FieldSupportedValuesQuery::CURRENT;
+ break;
+ default:
+ ALOGE("Unknown type of FieldSupportedValuesQuery: %u",
+ static_cast<unsigned>(s.type));
+ return C2_BAD_VALUE;
+ }
+ *d = C2FieldSupportedValuesQuery(C2ParamFieldBuilder(s.field), dType);
+ return C2_OK;
+}
+
+// C2FieldSupportedValuesQuery -> FieldSupportedValuesQueryResult
+Status objcpy(
+ FieldSupportedValuesQueryResult* d,
+ const C2FieldSupportedValuesQuery& s) {
+ d->status = static_cast<Status>(s.status);
+ return objcpy(&d->values, s.values);
+}
+
+// FieldSupportedValuesQuery, FieldSupportedValuesQueryResult ->
+// C2FieldSupportedValuesQuery
+c2_status_t objcpy(
+ C2FieldSupportedValuesQuery* d,
+ const FieldSupportedValuesQuery& sq,
+ const FieldSupportedValuesQueryResult& sr) {
+ c2_status_t status = objcpy(d, sq);
+ if (status != C2_OK) {
+ return status;
+ }
+ d->status = static_cast<c2_status_t>(sr.status);
+ return objcpy(&d->values, sr.values);
+}
+
+// C2Component::Traits -> IComponentStore::ComponentTraits
+Status objcpy(
+ IComponentStore::ComponentTraits *d,
+ const C2Component::Traits &s) {
+ d->name = s.name;
+
+ switch (s.domain) {
+ case C2Component::DOMAIN_VIDEO:
+ d->domain = IComponentStore::ComponentTraits::Domain::VIDEO;
+ break;
+ case C2Component::DOMAIN_AUDIO:
+ d->domain = IComponentStore::ComponentTraits::Domain::AUDIO;
+ break;
+ default:
+ d->domain = IComponentStore::ComponentTraits::Domain::OTHER;
+ }
+ d->domainOther = static_cast<uint32_t>(s.domain);
+
+ switch (s.kind) {
+ case C2Component::KIND_DECODER:
+ d->kind = IComponentStore::ComponentTraits::Kind::DECODER;
+ break;
+ case C2Component::KIND_ENCODER:
+ d->kind = IComponentStore::ComponentTraits::Kind::ENCODER;
+ break;
+ default:
+ d->kind = IComponentStore::ComponentTraits::Kind::OTHER;
+ }
+ d->kindOther = static_cast<uint32_t>(s.kind);
+
+ d->rank = static_cast<uint32_t>(s.rank);
+
+ d->mediaType = s.mediaType;
+
+ d->aliases.resize(s.aliases.size());
+ for (size_t ix = s.aliases.size(); ix > 0; ) {
+ --ix;
+ d->aliases[ix] = s.aliases[ix];
+ }
+ return Status::OK;
+}
+
+// ComponentTraits -> C2Component::Traits, std::unique_ptr<std::vector<std::string>>
+c2_status_t objcpy(
+ C2Component::Traits* d,
+ std::unique_ptr<std::vector<std::string>>* aliasesBuffer,
+ const IComponentStore::ComponentTraits& s) {
+ d->name = s.name.c_str();
+
+ switch (s.domain) {
+ case IComponentStore::ComponentTraits::Domain::VIDEO:
+ d->domain = C2Component::DOMAIN_VIDEO;
+ break;
+ case IComponentStore::ComponentTraits::Domain::AUDIO:
+ d->domain = C2Component::DOMAIN_AUDIO;
+ break;
+ default:
+ d->domain = static_cast<C2Component::domain_t>(s.domainOther);
+ }
+
+ switch (s.kind) {
+ case IComponentStore::ComponentTraits::Kind::DECODER:
+ d->kind = C2Component::KIND_DECODER;
+ break;
+ case IComponentStore::ComponentTraits::Kind::ENCODER:
+ d->kind = C2Component::KIND_ENCODER;
+ break;
+ default:
+ d->kind = static_cast<C2Component::kind_t>(s.kindOther);
+ }
+
+ d->rank = static_cast<C2Component::rank_t>(s.rank);
+ d->mediaType = s.mediaType.c_str();
+
+ // aliasesBuffer must not be resized after this.
+ *aliasesBuffer = std::make_unique<std::vector<std::string>>(
+ s.aliases.size());
+ (*aliasesBuffer)->resize(s.aliases.size());
+ std::vector<C2StringLiteral> dAliases(s.aliases.size());
+ for (size_t i = 0; i < s.aliases.size(); ++i) {
+ (**aliasesBuffer)[i] = s.aliases[i].c_str();
+ d->aliases[i] = (**aliasesBuffer)[i].c_str();
+ }
+ return C2_OK;
+}
+
+namespace /* unnamed */ {
+
+// C2ParamFieldValues -> ParamFieldValues
+Status objcpy(ParamFieldValues *d, const C2ParamFieldValues &s) {
+ objcpy(&d->paramOrField, s.paramOrField);
+ if (s.values) {
+ d->values.resize(1);
+ return objcpy(&d->values[0], *s.values);
+ }
+ d->values.resize(0);
+ return Status::OK;
+}
+
+// ParamFieldValues -> C2ParamFieldValues
+c2_status_t objcpy(C2ParamFieldValues *d, const ParamFieldValues &s) {
+ d->paramOrField = C2ParamFieldBuilder(s.paramOrField);
+ if (s.values.size() == 1) {
+ d->values = std::make_unique<C2FieldSupportedValues>();
+ return objcpy(d->values.get(), s.values[0]);
+ } else if (s.values.size() == 0) {
+ d->values.reset();
+ return C2_OK;
+ }
+ ALOGE("Multiple FieldSupportedValues objects. "
+ "(Only one is allowed.)");
+ return C2_BAD_VALUE;
+}
+
+} // unnamed namespace
+
+// C2SettingResult -> SettingResult
+Status objcpy(SettingResult *d, const C2SettingResult &s) {
+ d->failureOther = static_cast<uint32_t>(s.failure);
+ switch (s.failure) {
+ case C2SettingResult::READ_ONLY:
+ d->failure = SettingResult::Failure::READ_ONLY;
+ break;
+ case C2SettingResult::MISMATCH:
+ d->failure = SettingResult::Failure::MISMATCH;
+ break;
+ case C2SettingResult::BAD_VALUE:
+ d->failure = SettingResult::Failure::BAD_VALUE;
+ break;
+ case C2SettingResult::BAD_TYPE:
+ d->failure = SettingResult::Failure::BAD_TYPE;
+ break;
+ case C2SettingResult::BAD_PORT:
+ d->failure = SettingResult::Failure::BAD_PORT;
+ break;
+ case C2SettingResult::BAD_INDEX:
+ d->failure = SettingResult::Failure::BAD_INDEX;
+ break;
+ case C2SettingResult::CONFLICT:
+ d->failure = SettingResult::Failure::CONFLICT;
+ break;
+ case C2SettingResult::UNSUPPORTED:
+ d->failure = SettingResult::Failure::UNSUPPORTED;
+ break;
+ case C2SettingResult::INFO_CONFLICT:
+ d->failure = SettingResult::Failure::INFO_CONFLICT;
+ break;
+ default:
+ d->failure = SettingResult::Failure::OTHER;
+ }
+ Status status = objcpy(&d->field, s.field);
+ if (status != Status::OK) {
+ return status;
+ }
+ d->conflicts.resize(s.conflicts.size());
+ size_t i = 0;
+ for (const C2ParamFieldValues& sConflict : s.conflicts) {
+ ParamFieldValues &dConflict = d->conflicts[i++];
+ status = objcpy(&dConflict, sConflict);
+ if (status != Status::OK) {
+ return status;
+ }
+ }
+ return Status::OK;
+}
+
+// SettingResult -> std::unique_ptr<C2SettingResult>
+c2_status_t objcpy(std::unique_ptr<C2SettingResult> *d, const SettingResult &s) {
+ *d = std::unique_ptr<C2SettingResult>(new C2SettingResult {
+ .field = C2ParamFieldValues(C2ParamFieldBuilder()) });
+ if (!*d) {
+ return C2_NO_MEMORY;
+ }
+
+ // failure
+ switch (s.failure) {
+ case SettingResult::Failure::READ_ONLY:
+ (*d)->failure = C2SettingResult::READ_ONLY;
+ break;
+ case SettingResult::Failure::MISMATCH:
+ (*d)->failure = C2SettingResult::MISMATCH;
+ break;
+ case SettingResult::Failure::BAD_VALUE:
+ (*d)->failure = C2SettingResult::BAD_VALUE;
+ break;
+ case SettingResult::Failure::BAD_TYPE:
+ (*d)->failure = C2SettingResult::BAD_TYPE;
+ break;
+ case SettingResult::Failure::BAD_PORT:
+ (*d)->failure = C2SettingResult::BAD_PORT;
+ break;
+ case SettingResult::Failure::BAD_INDEX:
+ (*d)->failure = C2SettingResult::BAD_INDEX;
+ break;
+ case SettingResult::Failure::CONFLICT:
+ (*d)->failure = C2SettingResult::CONFLICT;
+ break;
+ case SettingResult::Failure::UNSUPPORTED:
+ (*d)->failure = C2SettingResult::UNSUPPORTED;
+ break;
+ case SettingResult::Failure::INFO_CONFLICT:
+ (*d)->failure = C2SettingResult::INFO_CONFLICT;
+ break;
+ default:
+ (*d)->failure = static_cast<C2SettingResult::Failure>(s.failureOther);
+ }
+
+ // field
+ c2_status_t status = objcpy(&(*d)->field, s.field);
+ if (status != C2_OK) {
+ return status;
+ }
+
+ // conflicts
+ (*d)->conflicts.clear();
+ (*d)->conflicts.reserve(s.conflicts.size());
+ for (const ParamFieldValues& sConflict : s.conflicts) {
+ (*d)->conflicts.emplace_back(
+ C2ParamFieldValues{ C2ParamFieldBuilder(), nullptr });
+ status = objcpy(&(*d)->conflicts.back(), sConflict);
+ if (status != C2_OK) {
+ return status;
+ }
+ }
+ return C2_OK;
+}
+
+// C2ParamDescriptor -> ParamDescriptor
+Status objcpy(ParamDescriptor *d, const C2ParamDescriptor &s) {
+ d->index = static_cast<ParamIndex>(s.index());
+ d->attrib = static_cast<hidl_bitfield<ParamDescriptor::Attrib>>(
+ _C2ParamInspector::GetAttrib(s));
+ d->name = s.name();
+ copyVector<uint32_t>(&d->dependencies, s.dependencies());
+ return Status::OK;
+}
+
+// ParamDescriptor -> C2ParamDescriptor
+c2_status_t objcpy(std::shared_ptr<C2ParamDescriptor> *d, const ParamDescriptor &s) {
+ std::vector<C2Param::Index> dDependencies;
+ dDependencies.reserve(s.dependencies.size());
+ for (const ParamIndex& sDependency : s.dependencies) {
+ dDependencies.emplace_back(static_cast<uint32_t>(sDependency));
+ }
+ *d = std::make_shared<C2ParamDescriptor>(
+ C2Param::Index(static_cast<uint32_t>(s.index)),
+ static_cast<C2ParamDescriptor::attrib_t>(s.attrib),
+ C2String(s.name.c_str()),
+ std::move(dDependencies));
+ return C2_OK;
+}
+
+// C2StructDescriptor -> StructDescriptor
+Status objcpy(StructDescriptor *d, const C2StructDescriptor &s) {
+ d->type = static_cast<ParamIndex>(s.coreIndex().coreIndex());
+ d->fields.resize(s.numFields());
+ size_t i = 0;
+ for (const auto& sField : s) {
+ FieldDescriptor& dField = d->fields[i++];
+ dField.fieldId.offset = static_cast<uint32_t>(
+ _C2ParamInspector::GetOffset(sField));
+ dField.fieldId.size = static_cast<uint32_t>(
+ _C2ParamInspector::GetSize(sField));
+ dField.type = static_cast<hidl_bitfield<FieldDescriptor::Type>>(
+ sField.type());
+ dField.length = static_cast<uint32_t>(sField.extent());
+ dField.name = static_cast<hidl_string>(sField.name());
+ const auto& sNamedValues = sField.namedValues();
+ dField.namedValues.resize(sNamedValues.size());
+ size_t j = 0;
+ for (const auto& sNamedValue : sNamedValues) {
+ FieldDescriptor::NamedValue& dNamedValue = dField.namedValues[j++];
+ dNamedValue.name = static_cast<hidl_string>(sNamedValue.first);
+ dNamedValue.value = static_cast<PrimitiveValue>(
+ sNamedValue.second.u64);
+ }
+ }
+ return Status::OK;
+}
+
+// StructDescriptor -> C2StructDescriptor
+c2_status_t objcpy(std::unique_ptr<C2StructDescriptor> *d, const StructDescriptor &s) {
+ C2Param::CoreIndex dIndex = C2Param::CoreIndex(static_cast<uint32_t>(s.type));
+ std::vector<C2FieldDescriptor> dFields;
+ dFields.reserve(s.fields.size());
+ for (const auto &sField : s.fields) {
+ C2FieldDescriptor dField = {
+ static_cast<uint32_t>(sField.type),
+ sField.length,
+ sField.name,
+ sField.fieldId.offset,
+ sField.fieldId.size };
+ C2FieldDescriptor::NamedValuesType namedValues;
+ namedValues.reserve(sField.namedValues.size());
+ for (const auto& sNamedValue : sField.namedValues) {
+ namedValues.emplace_back(
+ sNamedValue.name,
+ C2Value::Primitive(static_cast<uint64_t>(sNamedValue.value)));
+ }
+ _C2ParamInspector::AddNamedValues(dField, std::move(namedValues));
+ dFields.emplace_back(dField);
+ }
+ *d = std::make_unique<C2StructDescriptor>(
+ _C2ParamInspector::CreateStructDescriptor(dIndex, std::move(dFields)));
+ return C2_OK;
+}
+
+namespace /* unnamed */ {
+
+// Find or add a hidl BaseBlock object from a given C2Handle* to a list and an
+// associated map.
+// Note: The handle is not cloned.
+Status _addBaseBlock(
+ uint32_t* index,
+ const C2Handle* handle,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ if (!handle) {
+ ALOGE("addBaseBlock called on a null C2Handle.");
+ return Status::BAD_VALUE;
+ }
+ auto it = baseBlockIndices->find(handle);
+ if (it != baseBlockIndices->end()) {
+ *index = it->second;
+ } else {
+ *index = baseBlocks->size();
+ baseBlockIndices->emplace(handle, *index);
+ baseBlocks->emplace_back();
+
+ BaseBlock &dBaseBlock = baseBlocks->back();
+ dBaseBlock.type = BaseBlock::Type::NATIVE;
+ // This does not clone the handle.
+ dBaseBlock.nativeBlock =
+ reinterpret_cast<const native_handle_t*>(handle);
+
+ }
+ return Status::OK;
+}
+
+// Find or add a hidl BaseBlock object from a given BufferPoolData to a list and
+// an associated map.
+Status _addBaseBlock(
+ uint32_t* index,
+ const std::shared_ptr<BufferPoolData> bpData,
+ BufferPoolSender* bufferPoolSender,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ if (!bpData) {
+ ALOGE("addBaseBlock called on a null BufferPoolData.");
+ return Status::BAD_VALUE;
+ }
+ auto it = baseBlockIndices->find(bpData.get());
+ if (it != baseBlockIndices->end()) {
+ *index = it->second;
+ } else {
+ *index = baseBlocks->size();
+ baseBlockIndices->emplace(bpData.get(), *index);
+ baseBlocks->emplace_back();
+
+ BaseBlock &dBaseBlock = baseBlocks->back();
+ dBaseBlock.type = BaseBlock::Type::POOLED;
+
+ if (bufferPoolSender) {
+ ResultStatus bpStatus = bufferPoolSender->send(
+ bpData,
+ &dBaseBlock.pooledBlock);
+
+ if (bpStatus != ResultStatus::OK) {
+ ALOGE("Failed to send buffer with BufferPool. Error: %d.",
+ static_cast<int>(bpStatus));
+ return Status::BAD_VALUE;
+ }
+ }
+ }
+ return Status::OK;
+}
+
+Status addBaseBlock(
+ uint32_t* index,
+ const C2Handle* handle,
+ const std::shared_ptr<const _C2BlockPoolData>& blockPoolData,
+ BufferPoolSender* bufferPoolSender,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ if (!blockPoolData) {
+ // No BufferPoolData ==> NATIVE block.
+ return _addBaseBlock(
+ index, handle,
+ baseBlocks, baseBlockIndices);
+ }
+ switch (blockPoolData->getType()) {
+ case _C2BlockPoolData::TYPE_BUFFERPOOL: {
+ // BufferPoolData
+ std::shared_ptr<BufferPoolData> bpData;
+ if (!_C2BlockFactory::GetBufferPoolData(blockPoolData, &bpData)
+ || !bpData) {
+ ALOGE("BufferPoolData unavailable in a block.");
+ return Status::BAD_VALUE;
+ }
+ return _addBaseBlock(
+ index, bpData,
+ bufferPoolSender, baseBlocks, baseBlockIndices);
+ }
+ case _C2BlockPoolData::TYPE_BUFFERQUEUE:
+ // Do the same thing as a NATIVE block.
+ return _addBaseBlock(
+ index, handle,
+ baseBlocks, baseBlockIndices);
+ default:
+ ALOGE("Unknown C2BlockPoolData type.");
+ return Status::BAD_VALUE;
+ }
+}
+
+// C2Fence -> hidl_handle
+// Note: File descriptors are not duplicated. The original file descriptor must
+// not be closed before the transaction is complete.
+Status objcpy(hidl_handle* d, const C2Fence& s) {
+ (void)s; // TODO: implement s.fd()
+ int fenceFd = -1;
+ d->setTo(nullptr);
+ if (fenceFd >= 0) {
+ native_handle_t *handle = native_handle_create(1, 0);
+ if (!handle) {
+ return Status::NO_MEMORY;
+ }
+ handle->data[0] = fenceFd;
+ d->setTo(handle, true /* owns */);
+ }
+ return Status::OK;
+}
+
+// C2ConstLinearBlock -> Block
+// Note: Native handles are not duplicated. The original handles must not be
+// closed before the transaction is complete.
+Status objcpy(Block* d, const C2ConstLinearBlock& s,
+ BufferPoolSender* bufferPoolSender,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ std::shared_ptr<const _C2BlockPoolData> bpData =
+ _C2BlockFactory::GetLinearBlockPoolData(s);
+ Status status = addBaseBlock(&d->index, s.handle(), bpData,
+ bufferPoolSender, baseBlocks, baseBlockIndices);
+ if (status != Status::OK) {
+ return status;
+ }
+
+ // Create the metadata.
+ C2Hidl_RangeInfo dRangeInfo;
+ dRangeInfo.offset = static_cast<uint32_t>(s.offset());
+ dRangeInfo.length = static_cast<uint32_t>(s.size());
+ status = createParamsBlob(&d->meta,
+ std::vector<C2Param*>{ &dRangeInfo });
+ if (status != Status::OK) {
+ return Status::BAD_VALUE;
+ }
+
+ // Copy the fence
+ return objcpy(&d->fence, s.fence());
+}
+
+// C2ConstGraphicBlock -> Block
+// Note: Native handles are not duplicated. The original handles must not be
+// closed before the transaction is complete.
+Status objcpy(Block* d, const C2ConstGraphicBlock& s,
+ BufferPoolSender* bufferPoolSender,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ std::shared_ptr<const _C2BlockPoolData> bpData =
+ _C2BlockFactory::GetGraphicBlockPoolData(s);
+ Status status = addBaseBlock(&d->index, s.handle(), bpData,
+ bufferPoolSender, baseBlocks, baseBlockIndices);
+
+ // Create the metadata.
+ C2Hidl_RectInfo dRectInfo;
+ C2Rect sRect = s.crop();
+ dRectInfo.left = static_cast<uint32_t>(sRect.left);
+ dRectInfo.top = static_cast<uint32_t>(sRect.top);
+ dRectInfo.width = static_cast<uint32_t>(sRect.width);
+ dRectInfo.height = static_cast<uint32_t>(sRect.height);
+ status = createParamsBlob(&d->meta,
+ std::vector<C2Param*>{ &dRectInfo });
+ if (status != Status::OK) {
+ return Status::BAD_VALUE;
+ }
+
+ // Copy the fence
+ return objcpy(&d->fence, s.fence());
+}
+
+// C2BufferData -> Buffer
+// This function only fills in d->blocks.
+Status objcpy(Buffer* d, const C2BufferData& s,
+ BufferPoolSender* bufferPoolSender,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ Status status;
+ d->blocks.resize(
+ s.linearBlocks().size() +
+ s.graphicBlocks().size());
+ size_t i = 0;
+ for (const C2ConstLinearBlock& linearBlock : s.linearBlocks()) {
+ Block& dBlock = d->blocks[i++];
+ status = objcpy(
+ &dBlock, linearBlock,
+ bufferPoolSender, baseBlocks, baseBlockIndices);
+ if (status != Status::OK) {
+ return status;
+ }
+ }
+ for (const C2ConstGraphicBlock& graphicBlock : s.graphicBlocks()) {
+ Block& dBlock = d->blocks[i++];
+ status = objcpy(
+ &dBlock, graphicBlock,
+ bufferPoolSender, baseBlocks, baseBlockIndices);
+ if (status != Status::OK) {
+ return status;
+ }
+ }
+ return Status::OK;
+}
+
+// C2Buffer -> Buffer
+Status objcpy(Buffer* d, const C2Buffer& s,
+ BufferPoolSender* bufferPoolSender,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ Status status = createParamsBlob(&d->info, s.info());
+ if (status != Status::OK) {
+ return status;
+ }
+ return objcpy(d, s.data(), bufferPoolSender, baseBlocks, baseBlockIndices);
+}
+
+// C2InfoBuffer -> InfoBuffer
+Status objcpy(InfoBuffer* d, const C2InfoBuffer& s,
+ BufferPoolSender* bufferPoolSender,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ // TODO: C2InfoBuffer is not implemented.
+ (void)d;
+ (void)s;
+ (void)bufferPoolSender;
+ (void)baseBlocks;
+ (void)baseBlockIndices;
+ return Status::OK;
+ /*
+ // Stub implementation that may work in the future.
+ d->index = static_cast<uint32_t>(s.index());
+ d->buffer.info.resize(0);
+ return objcpy(&d->buffer, s.data(), baseBlocks, baseBlockIndices);
+ */
+}
+
+// C2FrameData -> FrameData
+Status objcpy(FrameData* d, const C2FrameData& s,
+ BufferPoolSender* bufferPoolSender,
+ std::list<BaseBlock>* baseBlocks,
+ std::map<const void*, uint32_t>* baseBlockIndices) {
+ d->flags = static_cast<hidl_bitfield<FrameData::Flags>>(s.flags);
+ objcpy(&d->ordinal, s.ordinal);
+
+ Status status;
+ d->buffers.resize(s.buffers.size());
+ size_t i = 0;
+ for (const std::shared_ptr<C2Buffer>& sBuffer : s.buffers) {
+ Buffer& dBuffer = d->buffers[i++];
+ if (!sBuffer) {
+ // A null (pointer to) C2Buffer corresponds to a Buffer with empty
+ // info and blocks.
+ dBuffer.info.resize(0);
+ dBuffer.blocks.resize(0);
+ continue;
+ }
+ status = objcpy(
+ &dBuffer, *sBuffer,
+ bufferPoolSender, baseBlocks, baseBlockIndices);
+ if (status != Status::OK) {
+ return status;
+ }
+ }
+
+ status = createParamsBlob(&d->configUpdate, s.configUpdate);
+ if (status != Status::OK) {
+ return status;
+ }
+
+ d->infoBuffers.resize(s.infoBuffers.size());
+ i = 0;
+ for (const std::shared_ptr<C2InfoBuffer>& sInfoBuffer : s.infoBuffers) {
+ InfoBuffer& dInfoBuffer = d->infoBuffers[i++];
+ if (!sInfoBuffer) {
+ ALOGE("Null C2InfoBuffer");
+ return Status::BAD_VALUE;
+ }
+ status = objcpy(&dInfoBuffer, *sInfoBuffer,
+ bufferPoolSender, baseBlocks, baseBlockIndices);
+ if (status != Status::OK) {
+ return status;
+ }
+ }
+
+ return status;
+}
+
+} // unnamed namespace
+
+// DefaultBufferPoolSender's implementation
+
+DefaultBufferPoolSender::DefaultBufferPoolSender(
+ const sp<IClientManager>& receiverManager,
+ std::chrono::steady_clock::duration refreshInterval)
+ : mReceiverManager(receiverManager),
+ mSourceConnectionId(0),
+ mLastSent(std::chrono::steady_clock::now()),
+ mRefreshInterval(refreshInterval) {
+}
+
+void DefaultBufferPoolSender::setReceiver(
+ const sp<IClientManager>& receiverManager,
+ std::chrono::steady_clock::duration refreshInterval) {
+ std::lock_guard<std::mutex> lock(mMutex);
+ if (mReceiverManager != receiverManager) {
+ mReceiverManager = receiverManager;
+ }
+ mRefreshInterval = refreshInterval;
+}
+
+ResultStatus DefaultBufferPoolSender::send(
+ const std::shared_ptr<BufferPoolData>& bpData,
+ BufferStatusMessage* bpMessage) {
+ if (!mReceiverManager) {
+ ALOGE("No access to receiver's BufferPool.");
+ return ResultStatus::NOT_FOUND;
+ }
+ ResultStatus rs;
+ std::lock_guard<std::mutex> lock(mMutex);
+ if (!mSenderManager) {
+ mSenderManager = ClientManager::getInstance();
+ if (!mSenderManager) {
+ ALOGE("Failed to retrieve local BufferPool ClientManager.");
+ return ResultStatus::CRITICAL_ERROR;
+ }
+ }
+ int64_t connectionId = bpData->mConnectionId;
+ std::chrono::steady_clock::time_point now =
+ std::chrono::steady_clock::now();
+ std::chrono::steady_clock::duration interval = now - mLastSent;
+ if (mSourceConnectionId == 0 ||
+ mSourceConnectionId != connectionId ||
+ interval > mRefreshInterval) {
+ // Initialize the bufferpool connection.
+ mSourceConnectionId = connectionId;
+ if (mSourceConnectionId == 0) {
+ return ResultStatus::CRITICAL_ERROR;
+ }
+
+ int64_t receiverConnectionId;
+ rs = mSenderManager->registerSender(mReceiverManager,
+ connectionId,
+ &receiverConnectionId);
+ if ((rs != ResultStatus::OK) && (rs != ResultStatus::ALREADY_EXISTS)) {
+ ALOGW("registerSender -- returned error: %d.",
+ static_cast<int>(rs));
+ return rs;
+ } else {
+ ALOGV("registerSender -- succeeded.");
+ mReceiverConnectionId = receiverConnectionId;
+ }
+ }
+
+ uint64_t transactionId;
+ int64_t timestampUs;
+ rs = mSenderManager->postSend(
+ mReceiverConnectionId, bpData, &transactionId, ×tampUs);
+ if (rs != ResultStatus::OK) {
+ ALOGE("ClientManager::postSend -- returned error: %d.",
+ static_cast<int>(rs));
+ return rs;
+ }
+ if (!bpMessage) {
+ ALOGE("Null output parameter for BufferStatusMessage.");
+ return ResultStatus::CRITICAL_ERROR;
+ }
+ bpMessage->connectionId = mReceiverConnectionId;
+ bpMessage->bufferId = bpData->mId;
+ bpMessage->transactionId = transactionId;
+ bpMessage->timestampUs = timestampUs;
+ mLastSent = now;
+ return rs;
+}
+
+// std::list<std::unique_ptr<C2Work>> -> WorkBundle
+Status objcpy(
+ WorkBundle* d,
+ const std::list<std::unique_ptr<C2Work>>& s,
+ BufferPoolSender* bufferPoolSender) {
+ Status status = Status::OK;
+
+ // baseBlocks holds a list of BaseBlock objects that Blocks can refer to.
+ std::list<BaseBlock> baseBlocks;
+
+ // baseBlockIndices maps a raw pointer to native_handle_t or BufferPoolData
+ // inside baseBlocks to the corresponding index into baseBlocks. The keys
+ // (pointers) are used to identify blocks that have the same "base block" in
+ // s, a list of C2Work objects. Because baseBlocks will be copied into a
+ // hidl_vec eventually, the values of baseBlockIndices are zero-based
+ // integer indices instead of list iterators.
+ //
+ // Note that the pointers can be raw because baseBlockIndices has a shorter
+ // lifespan than all of base blocks.
+ std::map<const void*, uint32_t> baseBlockIndices;
+
+ d->works.resize(s.size());
+ size_t i = 0;
+ for (const std::unique_ptr<C2Work>& sWork : s) {
+ Work &dWork = d->works[i++];
+ if (!sWork) {
+ ALOGW("Null C2Work encountered.");
+ continue;
+ }
+ status = objcpy(&dWork.input, sWork->input,
+ bufferPoolSender, &baseBlocks, &baseBlockIndices);
+ if (status != Status::OK) {
+ return status;
+ }
+ if (sWork->worklets.size() == 0) {
+ ALOGW("Work with no worklets.");
+ } else {
+ if (sWork->worklets.size() > 1) {
+ ALOGW("Work with multiple worklets. "
+ "Only the first worklet will be marshalled.");
+ }
+ if (!sWork->worklets.front()) {
+ ALOGE("Null worklet encountered.");
+ return Status::BAD_VALUE;
+ }
+
+ // Parcel the first worklet.
+ const C2Worklet &sWorklet = *sWork->worklets.front();
+ Worklet &dWorklet = dWork.worklet;
+
+ dWorklet.tunings.resize(sWorklet.tunings.size());
+ size_t j = 0;
+ for (const std::unique_ptr<C2Tuning>& sTuning : sWorklet.tunings) {
+ status = createParamsBlob(
+ &dWorklet.tunings[j++],
+ std::vector<C2Param*>
+ { reinterpret_cast<C2Param*>(sTuning.get()) });
+ if (status != Status::OK) {
+ return status;
+ }
+ }
+
+ dWorklet.failures.resize(sWorklet.failures.size());
+ j = 0;
+ for (const std::unique_ptr<C2SettingResult>& sFailure :
+ sWorklet.failures) {
+ if (!sFailure) {
+ ALOGE("Null C2SettingResult");
+ return Status::BAD_VALUE;
+ }
+ status = objcpy(&dWorklet.failures[j++], *sFailure);
+ if (status != Status::OK) {
+ return status;
+ }
+ }
+
+ status = objcpy(&dWorklet.output, sWorklet.output,
+ bufferPoolSender, &baseBlocks, &baseBlockIndices);
+ if (status != Status::OK) {
+ return status;
+ }
+ }
+ dWork.workletProcessed = sWork->workletsProcessed > 0;
+ dWork.result = static_cast<Status>(sWork->result);
+ }
+
+ // Copy std::list<BaseBlock> to hidl_vec<BaseBlock>.
+ {
+ d->baseBlocks.resize(baseBlocks.size());
+ size_t i = 0;
+ for (const BaseBlock& baseBlock : baseBlocks) {
+ d->baseBlocks[i++] = baseBlock;
+ }
+ }
+
+ return Status::OK;
+}
+
+namespace /* unnamed */ {
+
+struct C2BaseBlock {
+ enum type_t {
+ LINEAR,
+ GRAPHIC,
+ };
+ type_t type;
+ std::shared_ptr<C2LinearBlock> linear;
+ std::shared_ptr<C2GraphicBlock> graphic;
+};
+
+// hidl_handle -> C2Fence
+// Note: File descriptors are not duplicated. The original file descriptor must
+// not be closed before the transaction is complete.
+c2_status_t objcpy(C2Fence* d, const hidl_handle& s) {
+ // TODO: Implement.
+ (void)s;
+ *d = C2Fence();
+ return C2_OK;
+}
+
+// C2LinearBlock, vector<C2Param*>, C2Fence -> C2Buffer
+c2_status_t createLinearBuffer(
+ std::shared_ptr<C2Buffer>* buffer,
+ const std::shared_ptr<C2LinearBlock>& block,
+ const std::vector<C2Param*>& meta,
+ const C2Fence& fence) {
+ // Check the block meta. It should have exactly 1 C2Info:
+ // C2Hidl_RangeInfo.
+ if ((meta.size() != 1) || !meta[0]) {
+ ALOGE("Invalid block metadata for ion block.");
+ return C2_BAD_VALUE;
+ }
+ if (meta[0]->size() != sizeof(C2Hidl_RangeInfo)) {
+ ALOGE("Invalid block metadata for ion block: range.");
+ return C2_BAD_VALUE;
+ }
+ C2Hidl_RangeInfo *rangeInfo =
+ reinterpret_cast<C2Hidl_RangeInfo*>(meta[0]);
+
+ // Create C2Buffer from C2LinearBlock.
+ *buffer = C2Buffer::CreateLinearBuffer(block->share(
+ rangeInfo->offset, rangeInfo->length,
+ fence));
+ if (!(*buffer)) {
+ ALOGE("Cannot create a linear buffer.");
+ return C2_BAD_VALUE;
+ }
+ return C2_OK;
+}
+
+// C2GraphicBlock, vector<C2Param*>, C2Fence -> C2Buffer
+c2_status_t createGraphicBuffer(
+ std::shared_ptr<C2Buffer>* buffer,
+ const std::shared_ptr<C2GraphicBlock>& block,
+ const std::vector<C2Param*>& meta,
+ const C2Fence& fence) {
+ // Check the block meta. It should have exactly 1 C2Info:
+ // C2Hidl_RectInfo.
+ if ((meta.size() != 1) || !meta[0]) {
+ ALOGE("Invalid block metadata for graphic block.");
+ return C2_BAD_VALUE;
+ }
+ if (meta[0]->size() != sizeof(C2Hidl_RectInfo)) {
+ ALOGE("Invalid block metadata for graphic block: crop rect.");
+ return C2_BAD_VALUE;
+ }
+ C2Hidl_RectInfo *rectInfo =
+ reinterpret_cast<C2Hidl_RectInfo*>(meta[0]);
+
+ // Create C2Buffer from C2GraphicBlock.
+ *buffer = C2Buffer::CreateGraphicBuffer(block->share(
+ C2Rect(rectInfo->width, rectInfo->height).
+ at(rectInfo->left, rectInfo->top),
+ fence));
+ if (!(*buffer)) {
+ ALOGE("Cannot create a graphic buffer.");
+ return C2_BAD_VALUE;
+ }
+ return C2_OK;
+}
+
+// Buffer -> C2Buffer
+// Note: The native handles will be cloned.
+c2_status_t objcpy(std::shared_ptr<C2Buffer>* d, const Buffer& s,
+ const std::vector<C2BaseBlock>& baseBlocks) {
+ c2_status_t status;
+ *d = nullptr;
+
+ // Currently, a non-null C2Buffer must contain exactly 1 block.
+ if (s.blocks.size() == 0) {
+ return C2_OK;
+ } else if (s.blocks.size() != 1) {
+ ALOGE("Currently, a C2Buffer must contain exactly 1 block.");
+ return C2_BAD_VALUE;
+ }
+
+ const Block &sBlock = s.blocks[0];
+ if (sBlock.index >= baseBlocks.size()) {
+ ALOGE("Index into baseBlocks is out of range.");
+ return C2_BAD_VALUE;
+ }
+ const C2BaseBlock &baseBlock = baseBlocks[sBlock.index];
+
+ // Parse meta.
+ std::vector<C2Param*> sBlockMeta;
+ status = parseParamsBlob(&sBlockMeta, sBlock.meta);
+ if (status != C2_OK) {
+ ALOGE("Invalid block params blob.");
+ return C2_BAD_VALUE;
+ }
+
+ // Copy fence.
+ C2Fence dFence;
+ status = objcpy(&dFence, sBlock.fence);
+
+ // Construct a block.
+ switch (baseBlock.type) {
+ case C2BaseBlock::LINEAR:
+ status = createLinearBuffer(d, baseBlock.linear, sBlockMeta, dFence);
+ break;
+ case C2BaseBlock::GRAPHIC:
+ status = createGraphicBuffer(d, baseBlock.graphic, sBlockMeta, dFence);
+ break;
+ default:
+ ALOGE("Invalid BaseBlock type.");
+ return C2_BAD_VALUE;
+ }
+ if (status != C2_OK) {
+ return status;
+ }
+
+ // Parse info
+ std::vector<C2Param*> params;
+ status = parseParamsBlob(¶ms, s.info);
+ if (status != C2_OK) {
+ ALOGE("Invalid buffer params blob.");
+ return status;
+ }
+ for (C2Param* param : params) {
+ if (param == nullptr) {
+ ALOGE("Null buffer param encountered.");
+ return C2_BAD_VALUE;
+ }
+ std::shared_ptr<C2Param> c2param(
+ C2Param::Copy(*param).release());
+ if (!c2param) {
+ ALOGE("Invalid buffer param inside a blob.");
+ return C2_BAD_VALUE;
+ }
+ status = (*d)->setInfo(std::static_pointer_cast<C2Info>(c2param));
+ if (status != C2_OK) {
+ ALOGE("C2Buffer::setInfo failed().");
+ return C2_BAD_VALUE;
+ }
+ }
+
+ return C2_OK;
+}
+
+// FrameData -> C2FrameData
+c2_status_t objcpy(C2FrameData* d, const FrameData& s,
+ const std::vector<C2BaseBlock>& baseBlocks) {
+ c2_status_t status;
+ d->flags = static_cast<C2FrameData::flags_t>(s.flags);
+ objcpy(&d->ordinal, s.ordinal);
+ d->buffers.clear();
+ d->buffers.reserve(s.buffers.size());
+ for (const Buffer& sBuffer : s.buffers) {
+ std::shared_ptr<C2Buffer> dBuffer;
+ status = objcpy(&dBuffer, sBuffer, baseBlocks);
+ if (status != C2_OK) {
+ return status;
+ }
+ d->buffers.emplace_back(dBuffer);
+ }
+
+ std::vector<C2Param*> params;
+ status = parseParamsBlob(¶ms, s.configUpdate);
+ if (status != C2_OK) {
+ ALOGE("Failed to parse frame data params.");
+ return status;
+ }
+ d->configUpdate.clear();
+ for (C2Param* param : params) {
+ d->configUpdate.emplace_back(C2Param::Copy(*param));
+ if (!d->configUpdate.back()) {
+ ALOGE("Unexpected error while parsing frame data params.");
+ return C2_BAD_VALUE;
+ }
+ }
+
+ // TODO: Implement this once C2InfoBuffer has constructors.
+ d->infoBuffers.clear();
+ return C2_OK;
+}
+
+// BaseBlock -> C2BaseBlock
+c2_status_t objcpy(C2BaseBlock* d, const BaseBlock& s) {
+ switch (s.type) {
+ case BaseBlock::Type::NATIVE: {
+ native_handle_t* sHandle =
+ native_handle_clone(s.nativeBlock);
+ if (sHandle == nullptr) {
+ ALOGE("Null native handle in a block.");
+ return C2_BAD_VALUE;
+ }
+ const C2Handle *sC2Handle =
+ reinterpret_cast<const C2Handle*>(sHandle);
+
+ d->linear = _C2BlockFactory::CreateLinearBlock(sC2Handle);
+ if (d->linear) {
+ d->type = C2BaseBlock::LINEAR;
+ return C2_OK;
+ }
+
+ d->graphic = _C2BlockFactory::CreateGraphicBlock(sC2Handle);
+ if (d->graphic) {
+ d->type = C2BaseBlock::GRAPHIC;
+ return C2_OK;
+ }
+
+ ALOGE("Unknown handle type in native BaseBlock.");
+ if (sHandle) {
+ native_handle_close(sHandle);
+ native_handle_delete(sHandle);
+ }
+ return C2_BAD_VALUE;
+ }
+ case BaseBlock::Type::POOLED: {
+ const BufferStatusMessage &bpMessage =
+ s.pooledBlock;
+ sp<ClientManager> bp = ClientManager::getInstance();
+ std::shared_ptr<BufferPoolData> bpData;
+ native_handle_t *cHandle;
+ ResultStatus bpStatus = bp->receive(
+ bpMessage.connectionId,
+ bpMessage.transactionId,
+ bpMessage.bufferId,
+ bpMessage.timestampUs,
+ &cHandle,
+ &bpData);
+ if (bpStatus != ResultStatus::OK) {
+ ALOGE("Failed to receive buffer from bufferpool -- "
+ "resultStatus = %d",
+ static_cast<int>(bpStatus));
+ return toC2Status(bpStatus);
+ } else if (!bpData) {
+ ALOGE("No data in bufferpool transaction.");
+ return C2_BAD_VALUE;
+ }
+
+ d->linear = _C2BlockFactory::CreateLinearBlock(cHandle, bpData);
+ if (d->linear) {
+ d->type = C2BaseBlock::LINEAR;
+ return C2_OK;
+ }
+
+ d->graphic = _C2BlockFactory::CreateGraphicBlock(cHandle, bpData);
+ if (d->graphic) {
+ d->type = C2BaseBlock::GRAPHIC;
+ return C2_OK;
+ }
+
+ ALOGE("Unknown handle type in pooled BaseBlock.");
+ return C2_BAD_VALUE;
+ }
+ default:
+ ALOGE("Corrupted BaseBlock type: %d", static_cast<int>(s.type));
+ return C2_BAD_VALUE;
+ }
+}
+
+} // unnamed namespace
+
+// WorkBundle -> std::list<std::unique_ptr<C2Work>>
+c2_status_t objcpy(std::list<std::unique_ptr<C2Work>>* d, const WorkBundle& s) {
+ c2_status_t status;
+
+ // Convert BaseBlocks to C2BaseBlocks.
+ std::vector<C2BaseBlock> dBaseBlocks(s.baseBlocks.size());
+ for (size_t i = 0; i < s.baseBlocks.size(); ++i) {
+ status = objcpy(&dBaseBlocks[i], s.baseBlocks[i]);
+ if (status != C2_OK) {
+ return status;
+ }
+ }
+
+ d->clear();
+ for (const Work& sWork : s.works) {
+ d->emplace_back(std::make_unique<C2Work>());
+ C2Work& dWork = *d->back();
+
+ // input
+ status = objcpy(&dWork.input, sWork.input, dBaseBlocks);
+ if (status != C2_OK) {
+ ALOGE("Error constructing C2Work's input.");
+ return C2_BAD_VALUE;
+ }
+
+ // worklet(s)
+ dWork.worklets.clear();
+ // TODO: Currently, tunneling is not supported.
+ if (sWork.workletProcessed) {
+ dWork.workletsProcessed = 1;
+
+ const Worklet &sWorklet = sWork.worklet;
+ std::unique_ptr<C2Worklet> dWorklet = std::make_unique<C2Worklet>();
+
+ // tunings
+ dWorklet->tunings.clear();
+ dWorklet->tunings.reserve(sWorklet.tunings.size());
+ for (const Params& sTuning : sWorklet.tunings) {
+ std::vector<C2Param*> dParams;
+ status = parseParamsBlob(&dParams, sTuning);
+ if (status != C2_OK) {
+ ALOGE("Failed to parse C2Tuning in C2Worklet.");
+ return C2_BAD_VALUE;
+ }
+ for (C2Param* param : dParams) {
+ std::unique_ptr<C2Param> dParam = C2Param::Copy(*param);
+ if (!dParam) {
+ ALOGE("Null C2Tuning encountered while "
+ "parsing C2Worklet.");
+ return C2_BAD_VALUE;
+ }
+ dWorklet->tunings.emplace_back(
+ std::unique_ptr<C2Tuning>(
+ reinterpret_cast<C2Tuning*>(
+ dParam.release())));
+ }
+ }
+ // failures
+ dWorklet->failures.clear();
+ dWorklet->failures.reserve(sWorklet.failures.size());
+ for (const SettingResult& sFailure : sWorklet.failures) {
+ std::unique_ptr<C2SettingResult> dFailure;
+ status = objcpy(&dFailure, sFailure);
+ if (status != C2_OK) {
+ ALOGE("Failed to create C2SettingResult in C2Worklet.");
+ return C2_BAD_VALUE;
+ }
+ dWorklet->failures.emplace_back(std::move(dFailure));
+ }
+ // output
+ status = objcpy(&dWorklet->output, sWorklet.output, dBaseBlocks);
+ if (status != C2_OK) {
+ ALOGE("Failed to create output C2FrameData.");
+ return C2_BAD_VALUE;
+ }
+ dWork.worklets.emplace_back(std::move(dWorklet));
+ } else {
+ dWork.worklets.emplace_back(std::make_unique<C2Worklet>());
+ dWork.workletsProcessed = 0;
+ }
+
+ // result
+ dWork.result = static_cast<c2_status_t>(sWork.result);
+ }
+
+ return C2_OK;
+}
+
+constexpr size_t PARAMS_ALIGNMENT = 8; // 64-bit alignment
+static_assert(PARAMS_ALIGNMENT % alignof(C2Param) == 0, "C2Param alignment mismatch");
+static_assert(PARAMS_ALIGNMENT % alignof(C2Info) == 0, "C2Param alignment mismatch");
+static_assert(PARAMS_ALIGNMENT % alignof(C2Tuning) == 0, "C2Param alignment mismatch");
+
+// Params -> std::vector<C2Param*>
+c2_status_t parseParamsBlob(std::vector<C2Param*> *params, const hidl_vec<uint8_t> &blob) {
+ // assuming blob is const here
+ size_t size = blob.size();
+ size_t ix = 0;
+ const uint8_t *data = blob.data();
+ C2Param *p = nullptr;
+
+ do {
+ p = C2ParamUtils::ParseFirst(data + ix, size - ix);
+ if (p) {
+ params->emplace_back(p);
+ ix += p->size();
+ ix = align(ix, PARAMS_ALIGNMENT);
+ }
+ } while (p);
+
+ return ix == size ? C2_OK : C2_BAD_VALUE;
+}
+
+namespace /* unnamed */ {
+
+/**
+ * Concatenates a list of C2Params into a params blob.
+ * \param[out] blob target blob
+ * \param[in] params parameters to concatenate
+ * \retval C2_OK if the blob was successfully created
+ * \retval C2_BAD_VALUE if the blob was not successful (this only happens if the parameters were
+ * not const)
+ */
+template<typename T>
+Status _createParamsBlob(hidl_vec<uint8_t> *blob, const T ¶ms) {
+ // assuming the parameter values are const
+ size_t size = 0;
+ for (const auto &p : params) {
+ if (!p) {
+ continue;
+ }
+ size += p->size();
+ size = align(size, PARAMS_ALIGNMENT);
+ }
+ blob->resize(size);
+ size_t ix = 0;
+ for (const auto &p : params) {
+ if (!p) {
+ continue;
+ }
+ // NEVER overwrite even if param values (e.g. size) changed
+ size_t paramSize = std::min(p->size(), size - ix);
+ std::copy(
+ reinterpret_cast<const uint8_t*>(&*p),
+ reinterpret_cast<const uint8_t*>(&*p) + paramSize,
+ &(*blob)[ix]);
+ ix += paramSize;
+ ix = align(ix, PARAMS_ALIGNMENT);
+ }
+ blob->resize(ix);
+ return ix == size ? Status::OK : Status::CORRUPTED;
+}
+
+} // unnamed namespace
+
+// std::vector<const C2Param*> -> Params
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<const C2Param*> ¶ms) {
+ return _createParamsBlob(blob, params);
+}
+
+// std::vector<C2Param*> -> Params
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<C2Param*> ¶ms) {
+ return _createParamsBlob(blob, params);
+}
+
+// std::vector<std::unique_ptr<C2Param>> -> Params
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<std::unique_ptr<C2Param>> ¶ms) {
+ return _createParamsBlob(blob, params);
+}
+
+// std::vector<std::unique_ptr<C2Tuning>> -> Params
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<std::unique_ptr<C2Tuning>> ¶ms) {
+ return _createParamsBlob(blob, params);
+}
+
+// std::vector<std::shared_ptr<const C2Info>> -> Params
+Status createParamsBlob(
+ hidl_vec<uint8_t> *blob,
+ const std::vector<std::shared_ptr<const C2Info>> ¶ms) {
+ return _createParamsBlob(blob, params);
+}
+
+// Params -> std::vector<std::unique_ptr<C2Param>>
+c2_status_t copyParamsFromBlob(
+ std::vector<std::unique_ptr<C2Param>>* params,
+ Params blob) {
+ std::vector<C2Param*> paramPointers;
+ c2_status_t status = parseParamsBlob(¶mPointers, blob);
+ if (status != C2_OK) {
+ ALOGE("copyParamsFromBlob -- blob parsing failed.");
+ return status;
+ }
+ params->resize(paramPointers.size());
+ size_t i = 0;
+ for (C2Param* const& paramPointer : paramPointers) {
+ if (!paramPointer) {
+ ALOGE("copyParamsFromBlob -- corrupted params blob.");
+ return C2_BAD_VALUE;
+ }
+ (*params)[i++] = C2Param::Copy(*paramPointer);
+ }
+ return C2_OK;
+}
+
+// Params -> update std::vector<std::unique_ptr<C2Param>>
+c2_status_t updateParamsFromBlob(
+ const std::vector<C2Param*>& params,
+ const Params& blob) {
+ std::unordered_map<uint32_t, C2Param*> index2param;
+ for (C2Param* const& param : params) {
+ if (!param) {
+ ALOGE("updateParamsFromBlob -- corrupted input params.");
+ return C2_BAD_VALUE;
+ }
+ if (index2param.find(param->index()) == index2param.end()) {
+ index2param.emplace(param->index(), param);
+ }
+ }
+
+ std::vector<C2Param*> paramPointers;
+ c2_status_t status = parseParamsBlob(¶mPointers, blob);
+ if (status != C2_OK) {
+ ALOGE("updateParamsFromBlob -- blob parsing failed.");
+ return status;
+ }
+
+ for (C2Param* const& paramPointer : paramPointers) {
+ if (!paramPointer) {
+ ALOGE("updateParamsFromBlob -- corrupted param in blob.");
+ return C2_BAD_VALUE;
+ }
+ decltype(index2param)::iterator i = index2param.find(
+ paramPointer->index());
+ if (i == index2param.end()) {
+ ALOGW("updateParamsFromBlob -- unseen param index.");
+ continue;
+ }
+ if (!i->second->updateFrom(*paramPointer)) {
+ ALOGE("updateParamsFromBlob -- mismatching sizes: "
+ "%u vs %u (index = %u).",
+ static_cast<unsigned>(params.size()),
+ static_cast<unsigned>(paramPointer->size()),
+ static_cast<unsigned>(i->first));
+ return C2_BAD_VALUE;
+ }
+ }
+ return C2_OK;
+}
+
+// Convert BufferPool ResultStatus to c2_status_t.
+c2_status_t toC2Status(ResultStatus rs) {
+ switch (rs) {
+ case ResultStatus::OK:
+ return C2_OK;
+ case ResultStatus::NO_MEMORY:
+ return C2_NO_MEMORY;
+ case ResultStatus::ALREADY_EXISTS:
+ return C2_DUPLICATE;
+ case ResultStatus::NOT_FOUND:
+ return C2_NOT_FOUND;
+ case ResultStatus::CRITICAL_ERROR:
+ return C2_CORRUPTED;
+ default:
+ ALOGW("Unrecognized BufferPool ResultStatus: %d", static_cast<int>(rs));
+ return C2_CORRUPTED;
+ }
+}
+
+namespace /* unnamed */ {
+
+// Create a GraphicBuffer object from a graphic block.
+sp<GraphicBuffer> createGraphicBuffer(const C2ConstGraphicBlock& block) {
+ uint32_t width;
+ uint32_t height;
+ uint32_t format;
+ uint64_t usage;
+ uint32_t stride;
+ uint32_t generation;
+ uint64_t bqId;
+ int32_t bqSlot;
+ _UnwrapNativeCodec2GrallocMetadata(
+ block.handle(), &width, &height, &format, &usage,
+ &stride, &generation, &bqId, reinterpret_cast<uint32_t*>(&bqSlot));
+ native_handle_t *grallocHandle =
+ UnwrapNativeCodec2GrallocHandle(block.handle());
+ sp<GraphicBuffer> graphicBuffer =
+ new GraphicBuffer(grallocHandle,
+ GraphicBuffer::CLONE_HANDLE,
+ width, height, format,
+ 1, usage, stride);
+ native_handle_delete(grallocHandle);
+ return graphicBuffer;
+}
+
+template <typename BlockProcessor>
+void forEachBlock(C2FrameData& frameData,
+ BlockProcessor process) {
+ for (const std::shared_ptr<C2Buffer>& buffer : frameData.buffers) {
+ if (buffer) {
+ for (const C2ConstGraphicBlock& block :
+ buffer->data().graphicBlocks()) {
+ process(block);
+ }
+ }
+ }
+}
+
+template <typename BlockProcessor>
+void forEachBlock(const std::list<std::unique_ptr<C2Work>>& workList,
+ BlockProcessor process,
+ bool processInput, bool processOutput) {
+ for (const std::unique_ptr<C2Work>& work : workList) {
+ if (!work) {
+ continue;
+ }
+ if (processInput) {
+ forEachBlock(work->input, process);
+ }
+ if (processOutput) {
+ for (const std::unique_ptr<C2Worklet>& worklet : work->worklets) {
+ if (worklet) {
+ forEachBlock(worklet->output,
+ process);
+ }
+ }
+ }
+ }
+}
+
+sp<HGraphicBufferProducer> getHgbp(const sp<IGraphicBufferProducer>& igbp) {
+ sp<HGraphicBufferProducer> hgbp = igbp->getHalInterface();
+ return hgbp ? hgbp :
+ new TWGraphicBufferProducer<HGraphicBufferProducer>(igbp);
+}
+
+} // unnamed namespace
+
+status_t attachToBufferQueue(const C2ConstGraphicBlock& block,
+ const sp<IGraphicBufferProducer>& igbp,
+ uint32_t generation,
+ int32_t* bqSlot) {
+ if (!igbp) {
+ ALOGW("attachToBufferQueue -- null producer.");
+ return NO_INIT;
+ }
+
+ sp<GraphicBuffer> graphicBuffer = createGraphicBuffer(block);
+ graphicBuffer->setGenerationNumber(generation);
+
+ ALOGV("attachToBufferQueue -- attaching buffer: "
+ "block dimension %ux%u, "
+ "graphicBuffer dimension %ux%u, "
+ "format %#x, usage %#llx, stride %u, generation %u.",
+ static_cast<unsigned>(block.width()),
+ static_cast<unsigned>(block.height()),
+ static_cast<unsigned>(graphicBuffer->getWidth()),
+ static_cast<unsigned>(graphicBuffer->getHeight()),
+ static_cast<unsigned>(graphicBuffer->getPixelFormat()),
+ static_cast<unsigned long long>(graphicBuffer->getUsage()),
+ static_cast<unsigned>(graphicBuffer->getStride()),
+ static_cast<unsigned>(graphicBuffer->getGenerationNumber()));
+
+ status_t result = igbp->attachBuffer(bqSlot, graphicBuffer);
+ if (result != OK) {
+ ALOGW("attachToBufferQueue -- attachBuffer failed. Error code = %d",
+ static_cast<int>(result));
+ return false;
+ }
+ ALOGV("attachToBufferQueue -- attachBuffer returned slot %d",
+ static_cast<int>(*bqSlot));
+ return true;
+}
+
+bool getBufferQueueAssignment(const C2ConstGraphicBlock& block,
+ uint32_t* generation,
+ uint64_t* bqId,
+ int32_t* bqSlot) {
+ return _C2BlockFactory::GetBufferQueueData(
+ _C2BlockFactory::GetGraphicBlockPoolData(block),
+ generation, bqId, bqSlot);
+}
+
+bool yieldBufferQueueBlock(const C2ConstGraphicBlock& block) {
+ std::shared_ptr<_C2BlockPoolData> data =
+ _C2BlockFactory::GetGraphicBlockPoolData(block);
+ if (data && _C2BlockFactory::GetBufferQueueData(data)) {
+ _C2BlockFactory::YieldBlockToBufferQueue(data);
+ return true;
+ }
+ return false;
+}
+
+void yieldBufferQueueBlocks(
+ const std::list<std::unique_ptr<C2Work>>& workList,
+ bool processInput, bool processOutput) {
+ forEachBlock(workList, yieldBufferQueueBlock, processInput, processOutput);
+}
+
+bool holdBufferQueueBlock(const C2ConstGraphicBlock& block,
+ const sp<IGraphicBufferProducer>& igbp,
+ uint64_t bqId,
+ uint32_t generation) {
+ std::shared_ptr<_C2BlockPoolData> data =
+ _C2BlockFactory::GetGraphicBlockPoolData(block);
+ if (!data) {
+ return false;
+ }
+
+ uint32_t oldGeneration;
+ uint64_t oldId;
+ int32_t oldSlot;
+ // If the block is not bufferqueue-based, do nothing.
+ if (!_C2BlockFactory::GetBufferQueueData(
+ data, &oldGeneration, &oldId, &oldSlot) ||
+ (oldId == 0)) {
+ return false;
+ }
+
+ // If the block's bqId is the same as the desired bqId, just hold.
+ if ((oldId == bqId) && (oldGeneration == generation)) {
+ ALOGV("holdBufferQueueBlock -- import without attaching: "
+ "bqId %llu, bqSlot %d, generation %u.",
+ static_cast<long long unsigned>(oldId),
+ static_cast<int>(oldSlot),
+ static_cast<unsigned>(generation));
+ _C2BlockFactory::HoldBlockFromBufferQueue(data, getHgbp(igbp));
+ return true;
+ }
+
+ // Otherwise, attach to the given igbp, which must not be null.
+ if (!igbp) {
+ return false;
+ }
+
+ int32_t bqSlot;
+ status_t result = attachToBufferQueue(block, igbp, generation, &bqSlot);
+
+ if (result != OK) {
+ ALOGE("holdBufferQueueBlock -- fail to attach: "
+ "target bqId %llu, generation %u.",
+ static_cast<long long unsigned>(bqId),
+ static_cast<unsigned>(generation));
+
+ return false;
+ }
+
+ ALOGV("holdBufferQueueBlock -- attached: "
+ "bqId %llu, bqSlot %d, generation %u.",
+ static_cast<long long unsigned>(bqId),
+ static_cast<int>(bqSlot),
+ static_cast<unsigned>(generation));
+ _C2BlockFactory::AssignBlockToBufferQueue(
+ data, getHgbp(igbp), bqId, bqSlot, true);
+ return true;
+}
+
+void holdBufferQueueBlocks(const std::list<std::unique_ptr<C2Work>>& workList,
+ const sp<IGraphicBufferProducer>& igbp,
+ uint64_t bqId,
+ uint32_t generation,
+ bool forInput) {
+ forEachBlock(workList,
+ std::bind(holdBufferQueueBlock,
+ std::placeholders::_1, igbp, bqId, generation),
+ forInput, !forInput);
+}
+
+} // namespace utils
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
diff --git a/media/codec2/hidl/1.0/vts/audio/Android.bp b/media/codec2/hidl/1.0/vts/audio/Android.bp
new file mode 100644
index 0000000..687754b
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/audio/Android.bp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+cc_test {
+ name: "VtsHidlC2V1_0TargetAudioDecTest",
+ defaults: ["VtsMediaC2V1_0Defaults"],
+ srcs: [
+ "VtsHidlC2V1_0TargetAudioDecTest.cpp",
+ //"media_audio_hidl_test_common.cpp"
+ ],
+}
+
+cc_test {
+ name: "VtsHidlC2V1_0TargetAudioEncTest",
+ defaults: ["VtsMediaC2V1_0Defaults"],
+ srcs: [
+ "VtsHidlC2V1_0TargetAudioEncTest.cpp",
+ //"media_audio_hidl_test_common.cpp"
+ ],
+}
diff --git a/media/codec2/hidl/1.0/vts/audio/VtsHidlC2V1_0TargetAudioDecTest.cpp b/media/codec2/hidl/1.0/vts/audio/VtsHidlC2V1_0TargetAudioDecTest.cpp
new file mode 100644
index 0000000..6fd9200
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/audio/VtsHidlC2V1_0TargetAudioDecTest.cpp
@@ -0,0 +1,907 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// #define LOG_NDEBUG 0
+#define LOG_TAG "codec2_hidl_hal_audio_dec_test"
+
+#include <android-base/logging.h>
+#include <gtest/gtest.h>
+#include <algorithm>
+#include <stdio.h>
+#include <fstream>
+
+#include <codec2/hidl/client.h>
+#include <C2AllocatorIon.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2Buffer.h>
+#include <C2BufferPriv.h>
+
+using android::C2AllocatorIon;
+
+#include <VtsHalHidlTargetTestBase.h>
+#include "media_c2_audio_hidl_test_common.h"
+#include "media_c2_hidl_test_common.h"
+
+struct FrameInfo {
+ int bytesCount;
+ uint32_t flags;
+ int64_t timestamp;
+};
+
+class LinearBuffer : public C2Buffer {
+ public:
+ explicit LinearBuffer(const std::shared_ptr<C2LinearBlock>& block)
+ : C2Buffer(
+ {block->share(block->offset(), block->size(), ::C2Fence())}) {}
+};
+
+static ComponentTestEnvironment* gEnv = nullptr;
+
+namespace {
+
+class Codec2AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
+ private:
+ typedef ::testing::VtsHalHidlTargetTestBase Super;
+
+ public:
+ ::std::string getTestCaseInfo() const override {
+ return ::std::string() +
+ "Component: " + gEnv->getComponent().c_str() + " | " +
+ "Instance: " + gEnv->getInstance().c_str() + " | " +
+ "Res: " + gEnv->getRes().c_str();
+ }
+
+ // google.codec2 Audio test setup
+ virtual void SetUp() override {
+ Super::SetUp();
+ mDisableTest = false;
+ ALOGV("Codec2AudioDecHidlTest SetUp");
+ mClient = android::Codec2Client::CreateFromService(
+ gEnv->getInstance().c_str());
+ ASSERT_NE(mClient, nullptr);
+ mListener.reset(new CodecListener(
+ [this](std::list<std::unique_ptr<C2Work>>& workItems) {
+ handleWorkDone(workItems);
+ }));
+ ASSERT_NE(mListener, nullptr);
+ for (int i = 0; i < MAX_INPUT_BUFFERS; ++i) {
+ mWorkQueue.emplace_back(new C2Work);
+ }
+ mClient->createComponent(gEnv->getComponent().c_str(), mListener,
+ &mComponent);
+ ASSERT_NE(mComponent, nullptr);
+
+ std::shared_ptr<C2AllocatorStore> store =
+ android::GetCodec2PlatformAllocatorStore();
+ CHECK_EQ(store->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR,
+ &mLinearAllocator),
+ C2_OK);
+ mLinearPool = std::make_shared<C2PooledBlockPool>(mLinearAllocator,
+ mBlockPoolId++);
+ ASSERT_NE(mLinearPool, nullptr);
+
+ mCompName = unknown_comp;
+ struct StringToName {
+ const char* Name;
+ standardComp CompName;
+ };
+ const StringToName kStringToName[] = {
+ {"xaac", xaac},
+ {"mp3", mp3},
+ {"amrnb", amrnb},
+ {"amrwb", amrwb},
+ {"aac", aac},
+ {"vorbis", vorbis},
+ {"opus", opus},
+ {"pcm", pcm},
+ {"g711.alaw", g711alaw},
+ {"g711.mlaw", g711mlaw},
+ {"gsm", gsm},
+ {"raw", raw},
+ {"flac", flac},
+ };
+ const size_t kNumStringToName =
+ sizeof(kStringToName) / sizeof(kStringToName[0]);
+
+ std::string substring;
+ std::string comp;
+ substring = std::string(gEnv->getComponent());
+ /* TODO: better approach to find the component */
+ /* "c2.android." => 11th position */
+ size_t pos = 11;
+ size_t len = substring.find(".decoder", pos);
+ comp = substring.substr(pos, len - pos);
+
+ for (size_t i = 0; i < kNumStringToName; ++i) {
+ if (!strcasecmp(comp.c_str(), kStringToName[i].Name)) {
+ mCompName = kStringToName[i].CompName;
+ break;
+ }
+ }
+ mEos = false;
+ mFramesReceived = 0;
+ mTimestampUs = 0u;
+ mTimestampDevTest = false;
+ if (mCompName == unknown_comp) mDisableTest = true;
+ if (mDisableTest) std::cout << "[ WARN ] Test Disabled \n";
+ }
+
+ virtual void TearDown() override {
+ if (mComponent != nullptr) {
+ if (::testing::Test::HasFatalFailure()) return;
+ mComponent->release();
+ mComponent = nullptr;
+ }
+ Super::TearDown();
+ }
+
+ struct outputMetaData {
+ uint64_t timestampUs;
+ uint32_t rangeLength;
+ };
+ // callback function to process onWorkDone received by Listener
+ void handleWorkDone(std::list<std::unique_ptr<C2Work>>& workItems) {
+ for (std::unique_ptr<C2Work>& work : workItems) {
+ // handle configuration changes in work done
+ if (!work->worklets.empty() &&
+ (work->worklets.front()->output.configUpdate.size() != 0)) {
+ ALOGV("Config Update");
+ std::vector<std::unique_ptr<C2Param>> updates =
+ std::move(work->worklets.front()->output.configUpdate);
+ std::vector<C2Param*> configParam;
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ for (size_t i = 0; i < updates.size(); ++i) {
+ C2Param* param = updates[i].get();
+ if ((param->index() == C2StreamSampleRateInfo::output::PARAM_TYPE) ||
+ (param->index() == C2StreamChannelCountInfo::output::PARAM_TYPE)) {
+ configParam.push_back(param);
+ }
+ }
+ mComponent->config(configParam, C2_DONT_BLOCK, &failures);
+ ASSERT_EQ(failures.size(), 0u);
+ }
+ mFramesReceived++;
+ mEos = (work->worklets.front()->output.flags &
+ C2FrameData::FLAG_END_OF_STREAM) != 0;
+ auto frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ work->input.ordinal.frameIndex.peeku());
+ ALOGV("WorkDone: frameID received %d",
+ (int)work->worklets.front()->output.ordinal.frameIndex.peeku());
+
+ // For decoder components current timestamp always exceeds
+ // previous timestamp
+ bool codecConfig = ((work->worklets.front()->output.flags &
+ C2FrameData::FLAG_CODEC_CONFIG) != 0);
+ if (!codecConfig &&
+ !work->worklets.front()->output.buffers.empty()) {
+ EXPECT_GE(work->worklets.front()->output.ordinal.timestamp.peeku(),
+ mTimestampUs);
+ mTimestampUs =
+ work->worklets.front()->output.ordinal.timestamp.peeku();
+ uint32_t rangeLength =
+ work->worklets.front()->output.buffers[0]->data()
+ .linearBlocks().front().map().get().capacity();
+ //List of timestamp values and output size to calculate timestamp
+ if (mTimestampDevTest) {
+ outputMetaData meta = {mTimestampUs, rangeLength};
+ oBufferMetaData.push_back(meta);
+ }
+ }
+
+ work->input.buffers.clear();
+ work->worklets.clear();
+ {
+ typedef std::unique_lock<std::mutex> ULock;
+ ULock l(mQueueLock);
+ mWorkQueue.push_back(std::move(work));
+ if (!mFlushedIndices.empty()) {
+ mFlushedIndices.erase(frameIndexIt);
+ }
+ mQueueCondition.notify_all();
+ }
+ }
+ }
+
+ enum standardComp {
+ xaac,
+ mp3,
+ amrnb,
+ amrwb,
+ aac,
+ vorbis,
+ opus,
+ pcm,
+ g711alaw,
+ g711mlaw,
+ gsm,
+ raw,
+ flac,
+ unknown_comp,
+ };
+
+ bool mEos;
+ bool mDisableTest;
+ bool mTimestampDevTest;
+ standardComp mCompName;
+ uint64_t mTimestampUs;
+ uint32_t mFramesReceived;
+ std::list<uint64_t> mFlushedIndices;
+ std::list<uint64_t> mTimestampUslist;
+ ::android::List<outputMetaData> oBufferMetaData;
+
+ C2BlockPool::local_id_t mBlockPoolId;
+ std::shared_ptr<C2BlockPool> mLinearPool;
+ std::shared_ptr<C2Allocator> mLinearAllocator;
+
+ std::mutex mQueueLock;
+ std::condition_variable mQueueCondition;
+ std::list<std::unique_ptr<C2Work>> mWorkQueue;
+
+ std::shared_ptr<android::Codec2Client> mClient;
+ std::shared_ptr<android::Codec2Client::Listener> mListener;
+ std::shared_ptr<android::Codec2Client::Component> mComponent;
+
+ protected:
+ static void description(const std::string& description) {
+ RecordProperty("description", description);
+ }
+};
+
+void validateComponent(
+ const std::shared_ptr<android::Codec2Client::Component>& component,
+ Codec2AudioDecHidlTest::standardComp compName, bool& disableTest) {
+ // Validate its a C2 Component
+ if (component->getName().find("c2") == std::string::npos) {
+ ALOGE("Not a c2 component");
+ disableTest = true;
+ return;
+ }
+
+ // Validate its not an encoder and the component to be tested is audio
+ if (component->getName().find("encoder") != std::string::npos) {
+ ALOGE("Expected Decoder, given Encoder");
+ disableTest = true;
+ return;
+ }
+ std::vector<std::unique_ptr<C2Param>> queried;
+ c2_status_t c2err =
+ component->query({}, {C2PortMediaTypeSetting::input::PARAM_TYPE},
+ C2_DONT_BLOCK, &queried);
+ if (c2err != C2_OK && queried.size() == 0) {
+ ALOGE("Query media type failed => %d", c2err);
+ } else {
+ std::string inputDomain =
+ ((C2StreamMediaTypeSetting::input*)queried[0].get())->m.value;
+ if (inputDomain.find("audio/") == std::string::npos) {
+ ALOGE("Expected Audio Component");
+ disableTest = true;
+ return;
+ }
+ }
+
+ // Validates component name
+ if (compName == Codec2AudioDecHidlTest::unknown_comp) {
+ ALOGE("Component InValid");
+ disableTest = true;
+ return;
+ }
+ ALOGV("Component Valid");
+}
+
+// Set Default config param.
+void setupConfigParam(
+ const std::shared_ptr<android::Codec2Client::Component>& component,
+ int32_t* bitStreamInfo) {
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ C2StreamSampleRateInfo::output sampleRateInfo(0u, bitStreamInfo[0]);
+ C2StreamChannelCountInfo::output channelCountInfo(0u, bitStreamInfo[1]);
+
+ std::vector<C2Param*> configParam{&sampleRateInfo, &channelCountInfo};
+ c2_status_t status =
+ component->config(configParam, C2_DONT_BLOCK, &failures);
+ ASSERT_EQ(failures.size(), 0u);
+ ASSERT_EQ(status, C2_OK);
+}
+
+// In decoder components, often the input parameters get updated upon
+// parsing the header of elementary stream. Client needs to collect this
+// information and reconfigure
+void getInputChannelInfo(
+ const std::shared_ptr<android::Codec2Client::Component>& component,
+ Codec2AudioDecHidlTest::standardComp compName, int32_t* bitStreamInfo) {
+ // query nSampleRate and nChannels
+ std::initializer_list<C2Param::Index> indices{
+ C2StreamSampleRateInfo::output::PARAM_TYPE,
+ C2StreamChannelCountInfo::output::PARAM_TYPE,
+ };
+ std::vector<std::unique_ptr<C2Param>> inParams;
+ c2_status_t status =
+ component->query({}, indices, C2_DONT_BLOCK, &inParams);
+ if (status != C2_OK && inParams.size() == 0) {
+ ALOGE("Query media type failed => %d", status);
+ ASSERT_TRUE(false);
+ } else {
+ size_t offset = sizeof(C2Param);
+ for (size_t i = 0; i < inParams.size(); ++i) {
+ C2Param* param = inParams[i].get();
+ bitStreamInfo[i] = *(int32_t*)((uint8_t*)param + offset);
+ }
+ switch (compName) {
+ case Codec2AudioDecHidlTest::amrnb: {
+ ASSERT_EQ(bitStreamInfo[0], 8000);
+ ASSERT_EQ(bitStreamInfo[1], 1);
+ break;
+ }
+ case Codec2AudioDecHidlTest::amrwb: {
+ ASSERT_EQ(bitStreamInfo[0], 16000);
+ ASSERT_EQ(bitStreamInfo[1], 1);
+ break;
+ }
+ case Codec2AudioDecHidlTest::gsm: {
+ ASSERT_EQ(bitStreamInfo[0], 8000);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+// LookUpTable of clips and metadata for component testing
+void GetURLForComponent(Codec2AudioDecHidlTest::standardComp comp, char* mURL,
+ char* info) {
+ struct CompToURL {
+ Codec2AudioDecHidlTest::standardComp comp;
+ const char* mURL;
+ const char* info;
+ };
+ static const CompToURL kCompToURL[] = {
+ {Codec2AudioDecHidlTest::standardComp::xaac,
+ "bbb_aac_stereo_128kbps_48000hz.aac",
+ "bbb_aac_stereo_128kbps_48000hz.info"},
+ {Codec2AudioDecHidlTest::standardComp::mp3,
+ "bbb_mp3_stereo_192kbps_48000hz.mp3",
+ "bbb_mp3_stereo_192kbps_48000hz.info"},
+ {Codec2AudioDecHidlTest::standardComp::aac,
+ "bbb_aac_stereo_128kbps_48000hz.aac",
+ "bbb_aac_stereo_128kbps_48000hz.info"},
+ {Codec2AudioDecHidlTest::standardComp::amrnb,
+ "sine_amrnb_1ch_12kbps_8000hz.amrnb",
+ "sine_amrnb_1ch_12kbps_8000hz.info"},
+ {Codec2AudioDecHidlTest::standardComp::amrwb,
+ "bbb_amrwb_1ch_14kbps_16000hz.amrwb",
+ "bbb_amrwb_1ch_14kbps_16000hz.info"},
+ {Codec2AudioDecHidlTest::standardComp::vorbis,
+ "bbb_vorbis_stereo_128kbps_48000hz.vorbis",
+ "bbb_vorbis_stereo_128kbps_48000hz.info"},
+ {Codec2AudioDecHidlTest::standardComp::opus,
+ "bbb_opus_stereo_128kbps_48000hz.opus",
+ "bbb_opus_stereo_128kbps_48000hz.info"},
+ {Codec2AudioDecHidlTest::standardComp::g711alaw,
+ "bbb_g711alaw_1ch_8khz.raw",
+ "bbb_g711alaw_1ch_8khz.info"},
+ {Codec2AudioDecHidlTest::standardComp::g711mlaw,
+ "bbb_g711mulaw_1ch_8khz.raw",
+ "bbb_g711mulaw_1ch_8khz.info"},
+ {Codec2AudioDecHidlTest::standardComp::gsm,
+ "bbb_gsm_1ch_8khz_13kbps.raw",
+ "bbb_gsm_1ch_8khz_13kbps.info"},
+ {Codec2AudioDecHidlTest::standardComp::raw,
+ "bbb_raw_1ch_8khz_s32le.raw",
+ "bbb_raw_1ch_8khz_s32le.info"},
+ {Codec2AudioDecHidlTest::standardComp::flac,
+ "bbb_flac_stereo_680kbps_48000hz.flac",
+ "bbb_flac_stereo_680kbps_48000hz.info"},
+ };
+
+ for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) {
+ if (kCompToURL[i].comp == comp) {
+ strcat(mURL, kCompToURL[i].mURL);
+ strcat(info, kCompToURL[i].info);
+ return;
+ }
+ }
+}
+
+void decodeNFrames(const std::shared_ptr<android::Codec2Client::Component> &component,
+ std::mutex &queueLock, std::condition_variable &queueCondition,
+ std::list<std::unique_ptr<C2Work>> &workQueue,
+ std::list<uint64_t> &flushedIndices,
+ std::shared_ptr<C2BlockPool> &linearPool,
+ std::ifstream& eleStream,
+ android::Vector<FrameInfo>* Info,
+ int offset, int range, bool signalEOS = true) {
+ typedef std::unique_lock<std::mutex> ULock;
+ int frameID = offset;
+ int maxRetry = 0;
+ while (1) {
+ if (frameID == (int)Info->size() || frameID == (offset + range)) break;
+ uint32_t flags = 0;
+ std::unique_ptr<C2Work> work;
+ // Prepare C2Work
+ while (!work && (maxRetry < MAX_RETRY)) {
+ ULock l(queueLock);
+ if (!workQueue.empty()) {
+ work.swap(workQueue.front());
+ workQueue.pop_front();
+ } else {
+ queueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+ if (!work && (maxRetry >= MAX_RETRY)) {
+ ASSERT_TRUE(false) << "Wait for generating C2Work exceeded timeout";
+ }
+ int64_t timestamp = (*Info)[frameID].timestamp;
+ if ((*Info)[frameID].flags) flags = 1u << ((*Info)[frameID].flags - 1);
+ if (signalEOS && ((frameID == (int)Info->size() - 1) ||
+ (frameID == (offset + range - 1))))
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+
+ work->input.flags = (C2FrameData::flags_t)flags;
+ work->input.ordinal.timestamp = timestamp;
+ work->input.ordinal.frameIndex = frameID;
+ {
+ ULock l(queueLock);
+ flushedIndices.emplace_back(frameID);
+ }
+ int size = (*Info)[frameID].bytesCount;
+ char* data = (char*)malloc(size);
+
+ eleStream.read(data, size);
+ ASSERT_EQ(eleStream.gcount(), size);
+
+ std::shared_ptr<C2LinearBlock> block;
+ ASSERT_EQ(C2_OK,
+ linearPool->fetchLinearBlock(
+ size, {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE},
+ &block));
+ ASSERT_TRUE(block);
+
+ // Write View
+ C2WriteView view = block->map().get();
+ if (view.error() != C2_OK) {
+ fprintf(stderr, "C2LinearBlock::map() failed : %d", view.error());
+ break;
+ }
+ ASSERT_EQ((size_t)size, view.capacity());
+ ASSERT_EQ(0u, view.offset());
+ ASSERT_EQ((size_t)size, view.size());
+
+ memcpy(view.base(), data, size);
+
+ work->input.buffers.clear();
+ work->input.buffers.emplace_back(new LinearBuffer(block));
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+ free(data);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+
+ // DO THE DECODING
+ ASSERT_EQ(component->queue(&items), C2_OK);
+ ALOGV("Frame #%d size = %d queued", frameID, size);
+ frameID++;
+ maxRetry = 0;
+ }
+}
+
+void waitOnInputConsumption(std::mutex& queueLock,
+ std::condition_variable& queueCondition,
+ std::list<std::unique_ptr<C2Work>>& workQueue,
+ size_t bufferCount = MAX_INPUT_BUFFERS) {
+ typedef std::unique_lock<std::mutex> ULock;
+ uint32_t queueSize;
+ uint32_t maxRetry = 0;
+ {
+ ULock l(queueLock);
+ queueSize = workQueue.size();
+ }
+ while ((maxRetry < MAX_RETRY) && (queueSize < bufferCount)) {
+ ULock l(queueLock);
+ if (queueSize != workQueue.size()) {
+ queueSize = workQueue.size();
+ maxRetry = 0;
+ } else {
+ queueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+}
+
+TEST_F(Codec2AudioDecHidlTest, validateCompName) {
+ if (mDisableTest) return;
+ ALOGV("Checks if the given component is a valid audio component");
+ validateComponent(mComponent, mCompName, mDisableTest);
+ ASSERT_EQ(mDisableTest, false);
+}
+
+TEST_F(Codec2AudioDecHidlTest, configComp) {
+ description("Tests component specific configuration");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ int32_t bitStreamInfo[2] = {0};
+ ASSERT_NO_FATAL_FAILURE(
+ getInputChannelInfo(mComponent, mCompName, bitStreamInfo));
+ setupConfigParam(mComponent, bitStreamInfo);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2AudioDecHidlTest, DecodeTest) {
+ description("Decodes input file");
+ if (mDisableTest) return;
+
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ mTimestampDevTest = true;
+ char mURL[512], info[512];
+ std::ifstream eleStream, eleInfo;
+
+ strcpy(mURL, gEnv->getRes().c_str());
+ strcpy(info, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL, info);
+
+ eleInfo.open(info);
+ ASSERT_EQ(eleInfo.is_open(), true);
+ android::Vector<FrameInfo> Info;
+ int bytesCount = 0;
+ uint32_t flags = 0;
+ uint32_t timestamp = 0;
+ while (1) {
+ if (!(eleInfo >> bytesCount)) break;
+ eleInfo >> flags;
+ eleInfo >> timestamp;
+ bool codecConfig =
+ ((1 << (flags - 1)) & C2FrameData::FLAG_CODEC_CONFIG) != 0;
+ if (mTimestampDevTest && !codecConfig)
+ mTimestampUslist.push_back(timestamp);
+ Info.push_back({bytesCount, flags, timestamp});
+ }
+ eleInfo.close();
+ int32_t bitStreamInfo[2] = {0};
+ if (mCompName == raw) {
+ bitStreamInfo[0] = 8000;
+ bitStreamInfo[1] = 1;
+ } else {
+ ASSERT_NO_FATAL_FAILURE(
+ getInputChannelInfo(mComponent, mCompName, bitStreamInfo));
+ }
+ setupConfigParam(mComponent, bitStreamInfo);
+ ALOGV("mURL : %s", mURL);
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ ASSERT_NO_FATAL_FAILURE(decodeNFrames(
+ mComponent, mQueueLock, mQueueCondition, mWorkQueue, mFlushedIndices,
+ mLinearPool, eleStream, &Info, 0, (int)Info.size()));
+ // blocking call to ensures application to Wait till all the inputs are
+ // consumed
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+ eleStream.close();
+ if (mFramesReceived != Info.size()) {
+ ALOGE("Input buffer count and Output buffer count mismatch");
+ ALOGE("framesReceived : %d inputFrames : %zu", mFramesReceived,
+ Info.size());
+ ASSERT_TRUE(false);
+ }
+ ASSERT_EQ(mEos, true);
+ if (mTimestampDevTest) {
+ uint64_t expTs;
+ uint32_t samplesReceived = 0;
+ // Update SampleRate and ChannelCount
+ ASSERT_NO_FATAL_FAILURE(
+ getInputChannelInfo(mComponent, mCompName, bitStreamInfo));
+ int nSampleRate = bitStreamInfo[0];
+ int nChannels = bitStreamInfo[1];
+ std::list<uint64_t>::iterator itIn = mTimestampUslist.begin();
+ android::List<outputMetaData>::iterator itOut = oBufferMetaData.begin();
+ EXPECT_EQ(*itIn, itOut->timestampUs);
+ expTs = *itIn;
+ while (itOut != oBufferMetaData.end()) {
+ EXPECT_EQ(expTs, itOut->timestampUs);
+ if (expTs != itOut->timestampUs) break;
+ // buffer samples = ((total bytes) / (ac * (bits per sample / 8))
+ samplesReceived += ((itOut->rangeLength) / (nChannels * 2));
+ expTs = samplesReceived * 1000000ll / nSampleRate;
+ itOut++;
+ }
+ itIn = mTimestampUslist.end();
+ --itIn;
+ EXPECT_GT(expTs, *itIn);
+ oBufferMetaData.clear();
+ mTimestampUslist.clear();
+ }
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+// thumbnail test
+TEST_F(Codec2AudioDecHidlTest, ThumbnailTest) {
+ description("Test Request for thumbnail");
+ if (mDisableTest) return;
+
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ char mURL[512], info[512];
+ std::ifstream eleStream, eleInfo;
+
+ strcpy(mURL, gEnv->getRes().c_str());
+ strcpy(info, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL, info);
+
+ eleInfo.open(info);
+ ASSERT_EQ(eleInfo.is_open(), true);
+ android::Vector<FrameInfo> Info;
+ int bytesCount = 0;
+ uint32_t flags = 0;
+ uint32_t timestamp = 0;
+ while (1) {
+ if (!(eleInfo >> bytesCount)) break;
+ eleInfo >> flags;
+ eleInfo >> timestamp;
+ Info.push_back({bytesCount, flags, timestamp});
+ }
+ eleInfo.close();
+ int32_t bitStreamInfo[2] = {0};
+ if (mCompName == raw) {
+ bitStreamInfo[0] = 8000;
+ bitStreamInfo[1] = 1;
+ } else {
+ ASSERT_NO_FATAL_FAILURE(
+ getInputChannelInfo(mComponent, mCompName, bitStreamInfo));
+ }
+ setupConfigParam(mComponent, bitStreamInfo);
+ ALOGV("mURL : %s", mURL);
+
+ // request EOS for thumbnail
+ // signal EOS flag with last frame
+ size_t i = -1;
+ do {
+ i++;
+ flags = 0;
+ if (Info[i].flags) flags = 1u << (Info[i].flags - 1);
+
+ } while (!(flags & SYNC_FRAME));
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ ASSERT_NO_FATAL_FAILURE(decodeNFrames(
+ mComponent, mQueueLock, mQueueCondition, mWorkQueue, mFlushedIndices,
+ mLinearPool, eleStream, &Info, 0, i + 1));
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+ eleStream.close();
+ EXPECT_GE(mFramesReceived, 1U);
+ ASSERT_EQ(mEos, true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2AudioDecHidlTest, EOSTest) {
+ description("Test empty input buffer with EOS flag");
+ if (mDisableTest) return;
+ typedef std::unique_lock<std::mutex> ULock;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ std::unique_ptr<C2Work> work;
+ // Prepare C2Work
+ {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ ASSERT_TRUE(false) << "mWorkQueue Empty at the start of test";
+ }
+ }
+ ASSERT_NE(work, nullptr);
+
+ work->input.flags = (C2FrameData::flags_t)C2FrameData::FLAG_END_OF_STREAM;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+
+ {
+ typedef std::unique_lock<std::mutex> ULock;
+ ULock l(mQueueLock);
+ if (mWorkQueue.size() != MAX_INPUT_BUFFERS) {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ }
+ }
+ ASSERT_EQ(mEos, true);
+ ASSERT_EQ(mWorkQueue.size(), (size_t)MAX_INPUT_BUFFERS);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2AudioDecHidlTest, EmptyBufferTest) {
+ description("Tests empty input buffer");
+ if (mDisableTest) return;
+ typedef std::unique_lock<std::mutex> ULock;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ std::unique_ptr<C2Work> work;
+ // Prepare C2Work
+ {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ ASSERT_TRUE(false) << "mWorkQueue Empty at the start of test";
+ }
+ }
+ ASSERT_NE(work, nullptr);
+
+ work->input.flags = (C2FrameData::flags_t)0;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+
+ {
+ typedef std::unique_lock<std::mutex> ULock;
+ ULock l(mQueueLock);
+ if (mWorkQueue.size() != MAX_INPUT_BUFFERS) {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ }
+ }
+ ASSERT_EQ(mWorkQueue.size(), (size_t)MAX_INPUT_BUFFERS);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2AudioDecHidlTest, FlushTest) {
+ description("Tests Flush calls");
+ if (mDisableTest) return;
+ typedef std::unique_lock<std::mutex> ULock;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ char mURL[512], info[512];
+ std::ifstream eleStream, eleInfo;
+
+ strcpy(mURL, gEnv->getRes().c_str());
+ strcpy(info, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL, info);
+
+ eleInfo.open(info);
+ ASSERT_EQ(eleInfo.is_open(), true);
+ android::Vector<FrameInfo> Info;
+ int bytesCount = 0;
+ uint32_t flags = 0;
+ uint32_t timestamp = 0;
+ mFlushedIndices.clear();
+ while (1) {
+ if (!(eleInfo >> bytesCount)) break;
+ eleInfo >> flags;
+ eleInfo >> timestamp;
+ Info.push_back({bytesCount, flags, timestamp});
+ }
+ eleInfo.close();
+ int32_t bitStreamInfo[2] = {0};
+ if (mCompName == raw) {
+ bitStreamInfo[0] = 8000;
+ bitStreamInfo[1] = 1;
+ } else {
+ ASSERT_NO_FATAL_FAILURE(
+ getInputChannelInfo(mComponent, mCompName, bitStreamInfo));
+ }
+ setupConfigParam(mComponent, bitStreamInfo);
+ ALOGV("mURL : %s", mURL);
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ // Decode 128 frames and flush. here 128 is chosen to ensure there is a key
+ // frame after this so that the below section can be covered for all
+ // components
+ uint32_t numFramesFlushed = 128;
+ ASSERT_NO_FATAL_FAILURE(decodeNFrames(
+ mComponent, mQueueLock, mQueueCondition, mWorkQueue, mFlushedIndices,
+ mLinearPool, eleStream, &Info, 0, numFramesFlushed, false));
+ // flush
+ std::list<std::unique_ptr<C2Work>> flushedWork;
+ c2_status_t err =
+ mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
+ (size_t)MAX_INPUT_BUFFERS - flushedWork.size()));
+ uint64_t frameIndex;
+ {
+ //Update mFlushedIndices based on the index received from flush()
+ ULock l(mQueueLock);
+ for (std::unique_ptr<C2Work>& work : flushedWork) {
+ ASSERT_NE(work, nullptr);
+ frameIndex = work->input.ordinal.frameIndex.peeku();
+ std::list<uint64_t>::iterator frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ frameIndex);
+ if (!mFlushedIndices.empty() &&
+ (frameIndexIt != mFlushedIndices.end())) {
+ mFlushedIndices.erase(frameIndexIt);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ mWorkQueue.push_back(std::move(work));
+ }
+ }
+ }
+ // Seek to next key frame and start decoding till the end
+ mFlushedIndices.clear();
+ int index = numFramesFlushed;
+ bool keyFrame = false;
+ flags = 0;
+ while (index < (int)Info.size()) {
+ if (Info[index].flags) flags = 1u << (Info[index].flags - 1);
+ if ((flags & SYNC_FRAME) == SYNC_FRAME) {
+ keyFrame = true;
+ break;
+ }
+ flags = 0;
+ eleStream.ignore(Info[index].bytesCount);
+ index++;
+ }
+ if (keyFrame) {
+ ASSERT_NO_FATAL_FAILURE(
+ decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mLinearPool, eleStream, &Info, index,
+ (int)Info.size() - index));
+ }
+ eleStream.close();
+ err =
+ mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
+ (size_t)MAX_INPUT_BUFFERS - flushedWork.size()));
+ {
+ //Update mFlushedIndices based on the index received from flush()
+ ULock l(mQueueLock);
+ for (std::unique_ptr<C2Work>& work : flushedWork) {
+ ASSERT_NE(work, nullptr);
+ frameIndex = work->input.ordinal.frameIndex.peeku();
+ std::list<uint64_t>::iterator frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ frameIndex);
+ if (!mFlushedIndices.empty() &&
+ (frameIndexIt != mFlushedIndices.end())) {
+ mFlushedIndices.erase(frameIndexIt);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ mWorkQueue.push_back(std::move(work));
+ }
+ }
+ }
+ ASSERT_EQ(mFlushedIndices.empty(), true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+} // anonymous namespace
+
+int main(int argc, char** argv) {
+ gEnv = new ComponentTestEnvironment();
+ ::testing::AddGlobalTestEnvironment(gEnv);
+ ::testing::InitGoogleTest(&argc, argv);
+ gEnv->init(&argc, argv);
+ int status = gEnv->initFromOptions(argc, argv);
+ if (status == 0) {
+ int status = RUN_ALL_TESTS();
+ LOG(INFO) << "C2 Test result = " << status;
+ }
+ return status;
+}
diff --git a/media/codec2/hidl/1.0/vts/audio/VtsHidlC2V1_0TargetAudioEncTest.cpp b/media/codec2/hidl/1.0/vts/audio/VtsHidlC2V1_0TargetAudioEncTest.cpp
new file mode 100644
index 0000000..4f86aad
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/audio/VtsHidlC2V1_0TargetAudioEncTest.cpp
@@ -0,0 +1,675 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// #define LOG_NDEBUG 0
+#define LOG_TAG "codec2_hidl_hal_audio_enc_test"
+
+#include <android-base/logging.h>
+#include <gtest/gtest.h>
+#include <stdio.h>
+#include <fstream>
+#include <algorithm>
+
+#include <codec2/hidl/client.h>
+#include <C2AllocatorIon.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2Buffer.h>
+#include <C2BufferPriv.h>
+
+using android::C2AllocatorIon;
+
+#include <VtsHalHidlTargetTestBase.h>
+#include "media_c2_audio_hidl_test_common.h"
+#include "media_c2_hidl_test_common.h"
+
+class LinearBuffer : public C2Buffer {
+ public:
+ explicit LinearBuffer(const std::shared_ptr<C2LinearBlock>& block)
+ : C2Buffer(
+ {block->share(block->offset(), block->size(), ::C2Fence())}) {}
+};
+
+static ComponentTestEnvironment* gEnv = nullptr;
+
+namespace {
+
+class Codec2AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
+ private:
+ typedef ::testing::VtsHalHidlTargetTestBase Super;
+
+ public:
+ ::std::string getTestCaseInfo() const override {
+ return ::std::string() +
+ "Component: " + gEnv->getComponent().c_str() + " | " +
+ "Instance: " + gEnv->getInstance().c_str() + " | " +
+ "Res: " + gEnv->getRes().c_str();
+ }
+
+ // google.codec2 Audio test setup
+ virtual void SetUp() override {
+ Super::SetUp();
+ mDisableTest = false;
+ ALOGV("Codec2AudioEncHidlTest SetUp");
+ mClient = android::Codec2Client::CreateFromService(
+ gEnv->getInstance().c_str());
+ ASSERT_NE(mClient, nullptr);
+ mListener.reset(new CodecListener(
+ [this](std::list<std::unique_ptr<C2Work>>& workItems) {
+ handleWorkDone(workItems);
+ }));
+ ASSERT_NE(mListener, nullptr);
+ for (int i = 0; i < MAX_INPUT_BUFFERS; ++i) {
+ mWorkQueue.emplace_back(new C2Work);
+ }
+ mClient->createComponent(gEnv->getComponent().c_str(), mListener,
+ &mComponent);
+ ASSERT_NE(mComponent, nullptr);
+
+ std::shared_ptr<C2AllocatorStore> store =
+ android::GetCodec2PlatformAllocatorStore();
+ CHECK_EQ(store->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR,
+ &mLinearAllocator),
+ C2_OK);
+ mLinearPool = std::make_shared<C2PooledBlockPool>(mLinearAllocator,
+ mBlockPoolId++);
+ ASSERT_NE(mLinearPool, nullptr);
+
+ mCompName = unknown_comp;
+ struct StringToName {
+ const char* Name;
+ standardComp CompName;
+ };
+ const StringToName kStringToName[] = {
+ {"aac", aac},
+ {"flac", flac},
+ {"amrnb", amrnb},
+ {"amrwb", amrwb},
+ };
+ const size_t kNumStringToName =
+ sizeof(kStringToName) / sizeof(kStringToName[0]);
+
+ std::string substring;
+ std::string comp;
+ substring = std::string(gEnv->getComponent());
+ /* TODO: better approach to find the component */
+ /* "c2.android." => 11th position */
+ size_t pos = 11;
+ size_t len = substring.find(".encoder", pos);
+ comp = substring.substr(pos, len - pos);
+
+ for (size_t i = 0; i < kNumStringToName; ++i) {
+ if (!strcasecmp(comp.c_str(), kStringToName[i].Name)) {
+ mCompName = kStringToName[i].CompName;
+ break;
+ }
+ }
+ mEos = false;
+ mCsd = false;
+ mFramesReceived = 0;
+ if (mCompName == unknown_comp) mDisableTest = true;
+ if (mDisableTest) std::cout << "[ WARN ] Test Disabled \n";
+ }
+
+ virtual void TearDown() override {
+ if (mComponent != nullptr) {
+ if (::testing::Test::HasFatalFailure()) return;
+ mComponent->release();
+ mComponent = nullptr;
+ }
+ Super::TearDown();
+ }
+ // callback function to process onWorkDone received by Listener
+ void handleWorkDone(std::list<std::unique_ptr<C2Work>>& workItems) {
+ for (std::unique_ptr<C2Work>& work : workItems) {
+ // handle configuration changes in work done
+ if (!work->worklets.empty() &&
+ (work->worklets.front()->output.configUpdate.size() != 0)) {
+ ALOGV("Config Update");
+ std::vector<std::unique_ptr<C2Param>> updates =
+ std::move(work->worklets.front()->output.configUpdate);
+ std::vector<C2Param*> configParam;
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ for (size_t i = 0; i < updates.size(); ++i) {
+ C2Param* param = updates[i].get();
+ if (param->index() == C2StreamCsdInfo::output::PARAM_TYPE) {
+ mCsd = true;
+ }
+ }
+ }
+ mFramesReceived++;
+ mEos = (work->worklets.front()->output.flags &
+ C2FrameData::FLAG_END_OF_STREAM) != 0;
+ auto frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ work->input.ordinal.frameIndex.peeku());
+ ALOGV("WorkDone: frameID received %d",
+ (int)work->worklets.front()->output.ordinal.frameIndex.peeku());
+ work->input.buffers.clear();
+ work->worklets.clear();
+ {
+ typedef std::unique_lock<std::mutex> ULock;
+ ULock l(mQueueLock);
+ mWorkQueue.push_back(std::move(work));
+ if (!mFlushedIndices.empty()) {
+ mFlushedIndices.erase(frameIndexIt);
+ }
+ mQueueCondition.notify_all();
+ }
+ }
+ }
+ enum standardComp {
+ aac,
+ flac,
+ amrnb,
+ amrwb,
+ unknown_comp,
+ };
+
+ bool mEos;
+ bool mCsd;
+ bool mDisableTest;
+ standardComp mCompName;
+ uint32_t mFramesReceived;
+ std::list<uint64_t> mFlushedIndices;
+
+ C2BlockPool::local_id_t mBlockPoolId;
+ std::shared_ptr<C2BlockPool> mLinearPool;
+ std::shared_ptr<C2Allocator> mLinearAllocator;
+
+ std::mutex mQueueLock;
+ std::condition_variable mQueueCondition;
+ std::list<std::unique_ptr<C2Work>> mWorkQueue;
+
+ std::shared_ptr<android::Codec2Client> mClient;
+ std::shared_ptr<android::Codec2Client::Listener> mListener;
+ std::shared_ptr<android::Codec2Client::Component> mComponent;
+
+ protected:
+ static void description(const std::string& description) {
+ RecordProperty("description", description);
+ }
+};
+
+void validateComponent(
+ const std::shared_ptr<android::Codec2Client::Component>& component,
+ Codec2AudioEncHidlTest::standardComp compName, bool& disableTest) {
+ // Validate its a C2 Component
+ if (component->getName().find("c2") == std::string::npos) {
+ ALOGE("Not a c2 component");
+ disableTest = true;
+ return;
+ }
+
+ // Validate its not an encoder and the component to be tested is audio
+ if (component->getName().find("decoder") != std::string::npos) {
+ ALOGE("Expected Encoder, given Decoder");
+ disableTest = true;
+ return;
+ }
+ std::vector<std::unique_ptr<C2Param>> queried;
+ c2_status_t c2err =
+ component->query({}, {C2PortMediaTypeSetting::input::PARAM_TYPE},
+ C2_DONT_BLOCK, &queried);
+ if (c2err != C2_OK && queried.size() == 0) {
+ ALOGE("Query media type failed => %d", c2err);
+ } else {
+ std::string inputDomain =
+ ((C2StreamMediaTypeSetting::input*)queried[0].get())->m.value;
+ if (inputDomain.find("audio/") == std::string::npos) {
+ ALOGE("Expected Audio Component");
+ disableTest = true;
+ return;
+ }
+ }
+
+ // Validates component name
+ if (compName == Codec2AudioEncHidlTest::unknown_comp) {
+ ALOGE("Component InValid");
+ disableTest = true;
+ return;
+ }
+ ALOGV("Component Valid");
+}
+
+// Set Default config param.
+void setupConfigParam(
+ const std::shared_ptr<android::Codec2Client::Component>& component,
+ int32_t nChannels, int32_t nSampleRate) {
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ C2StreamSampleRateInfo::input sampleRateInfo(0u, nSampleRate);
+ C2StreamChannelCountInfo::input channelCountInfo(0u, nChannels);
+
+ std::vector<C2Param*> configParam{&sampleRateInfo, &channelCountInfo};
+ c2_status_t status =
+ component->config(configParam, C2_DONT_BLOCK, &failures);
+ ASSERT_EQ(failures.size(), 0u);
+ ASSERT_EQ(status, C2_OK);
+}
+
+// LookUpTable of clips and metadata for component testing
+void GetURLForComponent(Codec2AudioEncHidlTest::standardComp comp, char* mURL) {
+ struct CompToURL {
+ Codec2AudioEncHidlTest::standardComp comp;
+ const char* mURL;
+ };
+ static const CompToURL kCompToURL[] = {
+ {Codec2AudioEncHidlTest::standardComp::aac,
+ "bbb_raw_2ch_48khz_s16le.raw"},
+ {Codec2AudioEncHidlTest::standardComp::amrnb,
+ "bbb_raw_1ch_8khz_s16le.raw"},
+ {Codec2AudioEncHidlTest::standardComp::amrwb,
+ "bbb_raw_1ch_16khz_s16le.raw"},
+ {Codec2AudioEncHidlTest::standardComp::flac,
+ "bbb_raw_2ch_48khz_s16le.raw"},
+ };
+
+ for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) {
+ if (kCompToURL[i].comp == comp) {
+ strcat(mURL, kCompToURL[i].mURL);
+ return;
+ }
+ }
+}
+
+void encodeNFrames(const std::shared_ptr<android::Codec2Client::Component> &component,
+ std::mutex &queueLock, std::condition_variable &queueCondition,
+ std::list<std::unique_ptr<C2Work>> &workQueue,
+ std::list<uint64_t> &flushedIndices,
+ std::shared_ptr<C2BlockPool> &linearPool,
+ std::ifstream& eleStream, uint32_t nFrames,
+ int32_t samplesPerFrame, int32_t nChannels,
+ int32_t nSampleRate, bool flushed = false,
+ bool signalEOS = true) {
+ typedef std::unique_lock<std::mutex> ULock;
+
+ uint32_t frameID = 0;
+ uint32_t maxRetry = 0;
+ int bytesCount = samplesPerFrame * nChannels * 2;
+ int32_t timestampIncr =
+ (int)(((float)samplesPerFrame / nSampleRate) * 1000000);
+ uint64_t timestamp = 0;
+ while (1) {
+ if (nFrames == 0) break;
+ uint32_t flags = 0;
+ std::unique_ptr<C2Work> work;
+ // Prepare C2Work
+ while (!work && (maxRetry < MAX_RETRY)) {
+ ULock l(queueLock);
+ if (!workQueue.empty()) {
+ work.swap(workQueue.front());
+ workQueue.pop_front();
+ } else {
+ queueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+ if (!work && (maxRetry >= MAX_RETRY)) {
+ ASSERT_TRUE(false) << "Wait for generating C2Work exceeded timeout";
+ }
+ if (signalEOS && (nFrames == 1))
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ if (flushed) {
+ flags |= SYNC_FRAME;
+ flushed = false;
+ }
+ work->input.flags = (C2FrameData::flags_t)flags;
+ work->input.ordinal.timestamp = timestamp;
+ work->input.ordinal.frameIndex = frameID;
+ {
+ ULock l(queueLock);
+ flushedIndices.emplace_back(frameID);
+ }
+ char* data = (char*)malloc(bytesCount);
+ eleStream.read(data, bytesCount);
+ ASSERT_EQ(eleStream.gcount(), bytesCount);
+ std::shared_ptr<C2LinearBlock> block;
+ ASSERT_EQ(C2_OK, linearPool->fetchLinearBlock(
+ bytesCount, {C2MemoryUsage::CPU_READ,
+ C2MemoryUsage::CPU_WRITE},
+ &block));
+ ASSERT_TRUE(block);
+ // Write View
+ C2WriteView view = block->map().get();
+ if (view.error() != C2_OK) {
+ fprintf(stderr, "C2LinearBlock::map() failed : %d", view.error());
+ break;
+ }
+ ASSERT_EQ((size_t)bytesCount, view.capacity());
+ ASSERT_EQ(0u, view.offset());
+ ASSERT_EQ((size_t)bytesCount, view.size());
+
+ memcpy(view.base(), data, bytesCount);
+ work->input.buffers.clear();
+ work->input.buffers.emplace_back(new LinearBuffer(block));
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+ free(data);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+
+ // DO THE DECODING
+ ASSERT_EQ(component->queue(&items), C2_OK);
+ ALOGV("Frame #%d size = %d queued", frameID, bytesCount);
+ nFrames--;
+ timestamp += timestampIncr;
+ frameID++;
+ maxRetry = 0;
+ }
+}
+
+void waitOnInputConsumption(std::mutex& queueLock,
+ std::condition_variable& queueCondition,
+ std::list<std::unique_ptr<C2Work>>& workQueue,
+ size_t bufferCount = MAX_INPUT_BUFFERS) {
+ typedef std::unique_lock<std::mutex> ULock;
+ uint32_t queueSize;
+ uint32_t maxRetry = 0;
+ {
+ ULock l(queueLock);
+ queueSize = workQueue.size();
+ }
+ while ((maxRetry < MAX_RETRY) && (queueSize < bufferCount)) {
+ ULock l(queueLock);
+ if (queueSize != workQueue.size()) {
+ queueSize = workQueue.size();
+ maxRetry = 0;
+ } else {
+ queueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+}
+
+TEST_F(Codec2AudioEncHidlTest, validateCompName) {
+ if (mDisableTest) return;
+ ALOGV("Checks if the given component is a valid audio component");
+ validateComponent(mComponent, mCompName, mDisableTest);
+ ASSERT_EQ(mDisableTest, false);
+}
+
+TEST_F(Codec2AudioEncHidlTest, EncodeTest) {
+ ALOGV("EncodeTest");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ char mURL[512];
+ strcpy(mURL, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL);
+
+ // Setting default configuration
+ int32_t nChannels = 2;
+ int32_t nSampleRate = 44100;
+ int32_t samplesPerFrame = 1024;
+ switch (mCompName) {
+ case aac:
+ nChannels = 2;
+ nSampleRate = 48000;
+ samplesPerFrame = 1024;
+ break;
+ case flac:
+ nChannels = 2;
+ nSampleRate = 48000;
+ samplesPerFrame = 1152;
+ break;
+ case amrnb:
+ nChannels = 1;
+ nSampleRate = 8000;
+ samplesPerFrame = 160;
+ break;
+ case amrwb:
+ nChannels = 1;
+ nSampleRate = 16000;
+ samplesPerFrame = 160;
+ break;
+ default:
+ ASSERT_TRUE(false);
+ }
+ setupConfigParam(mComponent, nChannels, nSampleRate);
+ std::ifstream eleStream;
+ uint32_t numFrames = 128;
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ ALOGV("mURL : %s", mURL);
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mLinearPool, eleStream, numFrames,
+ samplesPerFrame, nChannels, nSampleRate));
+ // blocking call to ensures application to Wait till all the inputs are
+ // consumed
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+ eleStream.close();
+ if (mFramesReceived != numFrames) {
+ ALOGE("Input buffer count and Output buffer count mismatch");
+ ALOGE("framesReceived : %d inputFrames : %u", mFramesReceived, numFrames);
+ ASSERT_TRUE(false);
+ }
+ if ((mCompName == flac || mCompName == aac)) {
+ if (!mCsd) {
+ ALOGE("CSD buffer missing");
+ ASSERT_TRUE(false);
+ }
+ }
+ ASSERT_EQ(mEos, true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2AudioEncHidlTest, EOSTest) {
+ description("Test empty input buffer with EOS flag");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ typedef std::unique_lock<std::mutex> ULock;
+ std::unique_ptr<C2Work> work;
+ {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ ALOGE("mWorkQueue Empty is not expected at the start of the test");
+ ASSERT_TRUE(false);
+ }
+ }
+ ASSERT_NE(work, nullptr);
+ work->input.flags = (C2FrameData::flags_t)C2FrameData::FLAG_END_OF_STREAM;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+ uint32_t queueSize;
+ {
+ ULock l(mQueueLock);
+ queueSize = mWorkQueue.size();
+ if (queueSize < MAX_INPUT_BUFFERS) {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ }
+ }
+ ASSERT_EQ(mEos, true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2AudioEncHidlTest, EmptyBufferTest) {
+ description("Tests empty input buffer");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ typedef std::unique_lock<std::mutex> ULock;
+ std::unique_ptr<C2Work> work;
+ {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ ALOGE("mWorkQueue Empty is not expected at the start of the test");
+ ASSERT_TRUE(false);
+ }
+ }
+ ASSERT_NE(work, nullptr);
+ work->input.flags = (C2FrameData::flags_t)0;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+ uint32_t queueSize;
+ {
+ ULock l(mQueueLock);
+ queueSize = mWorkQueue.size();
+ if (queueSize < MAX_INPUT_BUFFERS) {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ }
+ }
+ ASSERT_EQ(mWorkQueue.size(), (uint32_t)MAX_INPUT_BUFFERS);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2AudioEncHidlTest, FlushTest) {
+ description("Test Request for flush");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ typedef std::unique_lock<std::mutex> ULock;
+ char mURL[512];
+ strcpy(mURL, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL);
+
+ // Setting default configuration
+ mFlushedIndices.clear();
+ int32_t nChannels = 2;
+ int32_t nSampleRate = 44100;
+ int32_t samplesPerFrame = 1024;
+ switch (mCompName) {
+ case aac:
+ nChannels = 2;
+ nSampleRate = 48000;
+ samplesPerFrame = 1024;
+ break;
+ case flac:
+ nChannels = 2;
+ nSampleRate = 48000;
+ samplesPerFrame = 1152;
+ break;
+ case amrnb:
+ nChannels = 1;
+ nSampleRate = 8000;
+ samplesPerFrame = 160;
+ break;
+ case amrwb:
+ nChannels = 1;
+ nSampleRate = 16000;
+ samplesPerFrame = 160;
+ break;
+ default:
+ ASSERT_TRUE(false);
+ }
+ setupConfigParam(mComponent, nChannels, nSampleRate);
+ std::ifstream eleStream;
+ uint32_t numFramesFlushed = 30;
+ uint32_t numFrames = 128;
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ ALOGV("mURL : %s", mURL);
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mLinearPool, eleStream, numFramesFlushed,
+ samplesPerFrame, nChannels, nSampleRate));
+ std::list<std::unique_ptr<C2Work>> flushedWork;
+ c2_status_t err =
+ mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
+ (size_t)MAX_INPUT_BUFFERS - flushedWork.size()));
+ uint64_t frameIndex;
+ {
+ //Update mFlushedIndices based on the index received from flush()
+ ULock l(mQueueLock);
+ for (std::unique_ptr<C2Work>& work : flushedWork) {
+ ASSERT_NE(work, nullptr);
+ frameIndex = work->input.ordinal.frameIndex.peeku();
+ std::list<uint64_t>::iterator frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ frameIndex);
+ if (!mFlushedIndices.empty() &&
+ (frameIndexIt != mFlushedIndices.end())) {
+ mFlushedIndices.erase(frameIndexIt);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ mWorkQueue.push_back(std::move(work));
+ }
+ }
+ }
+ mFlushedIndices.clear();
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mLinearPool, eleStream,
+ numFrames - numFramesFlushed, samplesPerFrame,
+ nChannels, nSampleRate, true));
+ eleStream.close();
+ err =
+ mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
+ (size_t)MAX_INPUT_BUFFERS - flushedWork.size()));
+ {
+ //Update mFlushedIndices based on the index received from flush()
+ ULock l(mQueueLock);
+ for (std::unique_ptr<C2Work>& work : flushedWork) {
+ ASSERT_NE(work, nullptr);
+ frameIndex = work->input.ordinal.frameIndex.peeku();
+ std::list<uint64_t>::iterator frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ frameIndex);
+ if (!mFlushedIndices.empty() &&
+ (frameIndexIt != mFlushedIndices.end())) {
+ mFlushedIndices.erase(frameIndexIt);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ mWorkQueue.push_back(std::move(work));
+ }
+ }
+ }
+ ASSERT_EQ(mFlushedIndices.empty(), true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+} // anonymous namespace
+
+int main(int argc, char** argv) {
+ gEnv = new ComponentTestEnvironment();
+ ::testing::AddGlobalTestEnvironment(gEnv);
+ ::testing::InitGoogleTest(&argc, argv);
+ gEnv->init(&argc, argv);
+ int status = gEnv->initFromOptions(argc, argv);
+ if (status == 0) {
+ int status = RUN_ALL_TESTS();
+ LOG(INFO) << "C2 Test result = " << status;
+ }
+ return status;
+}
diff --git a/media/codec2/hidl/1.0/vts/audio/media_c2_audio_hidl_test_common.h b/media/codec2/hidl/1.0/vts/audio/media_c2_audio_hidl_test_common.h
new file mode 100644
index 0000000..89eb69e
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/audio/media_c2_audio_hidl_test_common.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MEDIA_C2_AUDIO_HIDL_TEST_COMMON_H
+#define MEDIA_C2_AUDIO_HIDL_TEST_COMMON_H
+
+#define MAX_RETRY 20
+#define TIME_OUT 200ms
+#define MAX_INPUT_BUFFERS 8
+
+#endif // MEDIA_C2_AUDIO_HIDL_TEST_COMMON_H
diff --git a/media/codec2/hidl/1.0/vts/common/Android.bp b/media/codec2/hidl/1.0/vts/common/Android.bp
new file mode 100644
index 0000000..94f46ed
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/common/Android.bp
@@ -0,0 +1,33 @@
+cc_library_static {
+ name: "VtsMediaC2V1_0CommonUtil",
+ defaults: [
+ "VtsHalTargetTestDefaults",
+ "libcodec2-hidl-defaults",
+ ],
+
+ include_dirs: [
+ "frameworks/av/media/codec2/hidl/client/include",
+ ],
+
+ srcs: [
+ "media_c2_hidl_test_common.cpp",
+ ],
+
+ export_include_dirs: ["."],
+}
+
+cc_defaults {
+ name: "VtsMediaC2V1_0Defaults",
+ defaults: [
+ "VtsHalTargetTestDefaults",
+ "libcodec2-hidl-defaults",
+ ],
+
+ static_libs: [
+ "VtsMediaC2V1_0CommonUtil",
+ ],
+
+ shared_libs: [
+ "libcodec2_client",
+ ],
+}
diff --git a/media/codec2/hidl/1.0/vts/common/README.md b/media/codec2/hidl/1.0/vts/common/README.md
new file mode 100644
index 0000000..da569a8
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/common/README.md
@@ -0,0 +1,22 @@
+## Codec2 Hal @ 1.0 tests ##
+---
+#### master :
+Functionality of master is to enumerate all the Codec2 components available in C2 media service.
+
+usage: MtsHidlC2V1\_0TargetMasterTest -I software
+
+#### component :
+Functionality of component is to test common functionality across all the Codec2 components available in C2 media service. For a standard C2 component, these tests are expected to pass.
+
+usage: MtsHidlC2V1\_0TargetComponentTest -I software -C <comp name>
+
+#### audio :
+Functionality of audio test is to validate audio specific functionality Codec2 components. The resource files for this test are taken from hardware/interfaces/media/res. The path to these files on the device is required to be given for bitstream tests.
+
+usage: MtsHidlC2V1\_0TargetAudioDecTest -I software -C <comp name> -P /sdcard/media
+
+#### video :
+Functionality of video test is to validate video specific functionality Codec2 components. The resource files for this test are taken from hardware/interfaces/media/res. The path to these files on the device is required to be given for bitstream tests.
+
+usage: MtsHidlC2V1\_0TargetVideoDecTest -I software -C <comp name> -P /sdcard/media
+
diff --git a/media/codec2/hidl/1.0/vts/common/media_c2_hidl_test_common.cpp b/media/codec2/hidl/1.0/vts/common/media_c2_hidl_test_common.cpp
new file mode 100644
index 0000000..fdccdbb
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/common/media_c2_hidl_test_common.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "media_c2_hidl_test_common"
+#include <stdio.h>
+
+#include "media_c2_hidl_test_common.h"
+using ::android::hardware::media::c2::V1_0::FieldSupportedValues;
+
+void dumpFSV(const FieldSupportedValues& sv) {
+ ALOGD("Dumping FSV data");
+ using namespace std;
+ if (sv.type == FieldSupportedValues::Type::EMPTY) {
+ ALOGD("FSV Value is Empty");
+ }
+ if (sv.type == FieldSupportedValues::Type::RANGE) {
+ ALOGD("Dumping FSV range");
+ cout << ".range(" << sv.range.min;
+ if (sv.range.step != 0) {
+ cout << ":" << sv.range.step;
+ }
+ if (sv.range.num != 1 || sv.range.denom != 1) {
+ cout << ":" << sv.range.num << "/" << sv.range.denom;
+ }
+ cout << " " << sv.range.max << ")";
+ }
+ if (sv.values.size()) {
+ ALOGD("Dumping FSV value");
+ cout << (sv.type == FieldSupportedValues::Type::FLAGS ? ".flags("
+ : ".list(");
+ const char* sep = "";
+ for (const auto& p : sv.values) {
+ cout << sep << p;
+ sep = ",";
+ }
+ cout << ")";
+ }
+ cout << endl;
+}
diff --git a/media/codec2/hidl/1.0/vts/common/media_c2_hidl_test_common.h b/media/codec2/hidl/1.0/vts/common/media_c2_hidl_test_common.h
new file mode 100644
index 0000000..f765baa
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/common/media_c2_hidl_test_common.h
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MEDIA_C2_HIDL_TEST_COMMON_H
+#define MEDIA_C2_HIDL_TEST_COMMON_H
+
+#include <codec2/hidl/client.h>
+
+#include <android/hardware/media/c2/1.0/types.h>
+
+#include <C2Component.h>
+#include <getopt.h>
+#include <hidl/HidlSupport.h>
+#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/Mutexed.h>
+
+using namespace ::android::hardware::media::c2::V1_0;
+using namespace ::android::hardware::media::c2::V1_0::utils;
+
+using ::android::Mutexed;
+using ::android::hardware::Void;
+using ::android::hardware::Return;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::hidl_string;
+
+#include <VtsHalHidlTargetTestEnvBase.h>
+
+/*
+ * Handle Callback functions onWorkDone(), onTripped(),
+ * onError(), onDeath(), onFramesRendered()
+ */
+struct CodecListener : public android::Codec2Client::Listener {
+ public:
+ CodecListener(
+ const std::function<void(std::list<std::unique_ptr<C2Work>>& workItems)> fn =
+ nullptr)
+ : callBack(fn) {}
+ virtual void onWorkDone(
+ const std::weak_ptr<android::Codec2Client::Component>& comp,
+ std::list<std::unique_ptr<C2Work>>& workItems,
+ size_t numDiscardedInputBuffers) override {
+ /* TODO */
+ ALOGD("onWorkDone called");
+ (void)comp;
+ (void)numDiscardedInputBuffers;
+ if (callBack) callBack(workItems);
+ }
+
+ virtual void onTripped(
+ const std::weak_ptr<android::Codec2Client::Component>& comp,
+ const std::vector<std::shared_ptr<C2SettingResult>>& settingResults)
+ override {
+ /* TODO */
+ (void)comp;
+ (void)settingResults;
+ }
+
+ virtual void onError(
+ const std::weak_ptr<android::Codec2Client::Component>& comp,
+ uint32_t errorCode) override {
+ /* TODO */
+ (void)comp;
+ ALOGD("onError called");
+ if (errorCode != 0) ALOGE("Error : %u", errorCode);
+ }
+
+ virtual void onDeath(
+ const std::weak_ptr<android::Codec2Client::Component>& comp) override {
+ /* TODO */
+ (void)comp;
+ }
+
+ virtual void onInputBufferDone(
+ const std::shared_ptr<C2Buffer>& buffer) override {
+ /* TODO */
+ (void)buffer;
+ }
+
+ virtual void onFramesRendered(
+ const std::vector<RenderedFrame>& renderedFrames) override {
+ /* TODO */
+ (void)renderedFrames;
+ }
+ // std::mutex mQueueLock;
+ // std::condition_variable mQueueCondition;
+ // std::list<std::unique_ptr<C2Work>> mWorkQueue;
+ std::function<void(std::list<std::unique_ptr<C2Work>>& workItems)> callBack;
+};
+
+// A class for test environment setup
+class ComponentTestEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
+ private:
+ typedef ::testing::VtsHalHidlTargetTestEnvBase Super;
+
+ public:
+ virtual void registerTestServices() override {
+ registerTestService<IComponentStore>();
+ }
+
+ ComponentTestEnvironment() : res("/sdcard/media/") {}
+
+ void setComponent(const char* _component) { component = _component; }
+
+ void setInstance(const char* _instance) { instance = _instance; }
+
+ void setRes(const char* _res) { res = _res; }
+
+ const hidl_string getInstance() const { return instance; }
+
+ const hidl_string getComponent() const { return component; }
+
+ const hidl_string getRes() const { return res; }
+
+ int initFromOptions(int argc, char** argv) {
+ static struct option options[] = {
+ {"instance", required_argument, 0, 'I'},
+ {"component", required_argument, 0, 'C'},
+ {"res", required_argument, 0, 'P'},
+ {0, 0, 0, 0}};
+
+ while (true) {
+ int index = 0;
+ int c = getopt_long(argc, argv, "I:C:P:", options, &index);
+ if (c == -1) {
+ break;
+ }
+
+ switch (c) {
+ case 'I':
+ setInstance(optarg);
+ break;
+ case 'C':
+ setComponent(optarg);
+ break;
+ case 'P':
+ setRes(optarg);
+ break;
+ case '?':
+ break;
+ }
+ }
+
+ if (optind < argc) {
+ fprintf(stderr,
+ "unrecognized option: %s\n\n"
+ "usage: %s <gtest options> <test options>\n\n"
+ "test options are:\n\n"
+ "-I, --instance: software for C2 components, else default\n"
+ "-C, --component: C2 component to test\n"
+ "-P, --res: Resource files directory location\n",
+ argv[optind ?: 1], argv[0]);
+ return 2;
+ }
+ return 0;
+ }
+
+ private:
+ hidl_string instance;
+ hidl_string component;
+ hidl_string res;
+};
+
+/*
+ * common functions declarations
+ */
+void dumpFSV(const FieldSupportedValues& sv);
+#endif // MEDIA_C2_HIDL_TEST_COMMON_H
diff --git a/media/codec2/hidl/1.0/vts/component/Android.bp b/media/codec2/hidl/1.0/vts/component/Android.bp
new file mode 100644
index 0000000..4b913b6
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/component/Android.bp
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+cc_test {
+ name: "VtsHidlC2V1_0TargetComponentTest",
+ defaults: ["VtsMediaC2V1_0Defaults"],
+ srcs: ["VtsHidlC2V1_0TargetComponentTest.cpp"],
+}
+
diff --git a/media/codec2/hidl/1.0/vts/component/VtsHidlC2V1_0TargetComponentTest.cpp b/media/codec2/hidl/1.0/vts/component/VtsHidlC2V1_0TargetComponentTest.cpp
new file mode 100644
index 0000000..b7fb655
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/component/VtsHidlC2V1_0TargetComponentTest.cpp
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "codec2_hidl_hal_component_test"
+
+#include <android-base/logging.h>
+#include <gtest/gtest.h>
+
+#include <C2Config.h>
+#include <codec2/hidl/client.h>
+
+#include <VtsHalHidlTargetTestBase.h>
+#include "media_c2_hidl_test_common.h"
+
+static ComponentTestEnvironment* gEnv = nullptr;
+
+namespace {
+
+// google.codec2 Component test setup
+class Codec2ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase {
+ private:
+ typedef ::testing::VtsHalHidlTargetTestBase Super;
+
+ public:
+ virtual void SetUp() override {
+ Super::SetUp();
+ mClient = android::Codec2Client::CreateFromService(
+ gEnv->getInstance().c_str());
+ ASSERT_NE(mClient, nullptr);
+ mListener.reset(new CodecListener());
+ ASSERT_NE(mListener, nullptr);
+ mClient->createComponent(gEnv->getComponent().c_str(), mListener,
+ &mComponent);
+ ASSERT_NE(mComponent, nullptr);
+ }
+
+ virtual void TearDown() override {
+ if (mComponent != nullptr) {
+ // If you have encountered a fatal failure, it is possible that
+ // freeNode() will not go through. Instead of hanging the app.
+ // let it pass through and report errors
+ if (::testing::Test::HasFatalFailure()) return;
+ mComponent->release();
+ mComponent = nullptr;
+ }
+ Super::TearDown();
+ }
+
+ std::shared_ptr<android::Codec2Client> mClient;
+ std::shared_ptr<android::Codec2Client::Listener> mListener;
+ std::shared_ptr<android::Codec2Client::Component> mComponent;
+
+ protected:
+ static void description(const std::string& description) {
+ RecordProperty("description", description);
+ }
+};
+
+// Test Empty Flush
+TEST_F(Codec2ComponentHidlTest, EmptyFlush) {
+ ALOGV("Empty Flush Test");
+ c2_status_t err = mComponent->start();
+ ASSERT_EQ(err, C2_OK);
+
+ std::list<std::unique_ptr<C2Work>> flushedWork;
+ err = mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+
+ err = mComponent->stop();
+ ASSERT_EQ(err, C2_OK);
+ // Empty Flush should not return any work
+ ASSERT_EQ(flushedWork.size(), 0u);
+}
+
+// Test Queue Empty Work
+TEST_F(Codec2ComponentHidlTest, QueueEmptyWork) {
+ ALOGV("Queue Empty Work Test");
+ c2_status_t err = mComponent->start();
+ ASSERT_EQ(err, C2_OK);
+
+ // Queueing an empty WorkBundle
+ std::list<std::unique_ptr<C2Work>> workList;
+ err = mComponent->queue(&workList);
+ ASSERT_EQ(err, C2_OK);
+
+ err = mComponent->reset();
+ ASSERT_EQ(err, C2_OK);
+}
+
+// Test Component Configuration
+TEST_F(Codec2ComponentHidlTest, Config) {
+ ALOGV("Configuration Test");
+
+ C2String name = mComponent->getName();
+ EXPECT_NE(name.empty(), true) << "Invalid Component Name";
+
+ c2_status_t err = C2_OK;
+ std::vector<std::unique_ptr<C2Param>> queried;
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+
+ // Query supported params by the component
+ std::vector<std::shared_ptr<C2ParamDescriptor>> params;
+ err = mComponent->querySupportedParams(¶ms);
+ ASSERT_EQ(err, C2_OK);
+ ALOGV("Number of total params - %zu", params.size());
+
+ // Query and config all the supported params
+ for (std::shared_ptr<C2ParamDescriptor> p : params) {
+ ALOGD("Querying index %d", (int)p->index());
+ err = mComponent->query({}, {p->index()}, C2_DONT_BLOCK, &queried);
+ EXPECT_NE(queried.size(), 0u);
+ EXPECT_EQ(err, C2_OK);
+ err = mComponent->config({queried[0].get()}, C2_DONT_BLOCK, &failures);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_EQ(failures.size(), 0u);
+ }
+}
+
+// Test Multiple Start Stop Reset Test
+TEST_F(Codec2ComponentHidlTest, MultipleStartStopReset) {
+ ALOGV("Multiple Start Stop and Reset Test");
+ c2_status_t err = C2_OK;
+
+#define MAX_RETRY 16
+
+ for (size_t i = 0; i < MAX_RETRY; i++) {
+ err = mComponent->start();
+ ASSERT_EQ(err, C2_OK);
+
+ err = mComponent->stop();
+ ASSERT_EQ(err, C2_OK);
+ }
+
+ err = mComponent->start();
+ ASSERT_EQ(err, C2_OK);
+
+ for (size_t i = 0; i < MAX_RETRY; i++) {
+ err = mComponent->reset();
+ ASSERT_EQ(err, C2_OK);
+ }
+
+ err = mComponent->start();
+ ASSERT_EQ(err, C2_OK);
+
+ err = mComponent->stop();
+ ASSERT_EQ(err, C2_OK);
+
+ // Second stop should return error
+ err = mComponent->stop();
+ ASSERT_NE(err, C2_OK);
+}
+
+// Test Component Release API
+TEST_F(Codec2ComponentHidlTest, MultipleRelease) {
+ ALOGV("Multiple Release Test");
+ c2_status_t err = mComponent->start();
+ ASSERT_EQ(err, C2_OK);
+
+ // Query Component Domain Type
+ std::vector<std::unique_ptr<C2Param>> queried;
+ err = mComponent->query({}, {C2PortMediaTypeSetting::input::PARAM_TYPE},
+ C2_DONT_BLOCK, &queried);
+ EXPECT_NE(queried.size(), 0u);
+
+ // Configure Component Domain
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ C2PortMediaTypeSetting::input* portMediaType =
+ C2PortMediaTypeSetting::input::From(queried[0].get());
+ err = mComponent->config({portMediaType}, C2_DONT_BLOCK, &failures);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_EQ(failures.size(), 0u);
+
+#define MAX_RETRY 16
+ for (size_t i = 0; i < MAX_RETRY; i++) {
+ err = mComponent->release();
+ ASSERT_EQ(err, C2_OK);
+ }
+}
+
+} // anonymous namespace
+
+// TODO: Add test for Invalid work,
+// TODO: Add test for Invalid states
+int main(int argc, char** argv) {
+ gEnv = new ComponentTestEnvironment();
+ ::testing::AddGlobalTestEnvironment(gEnv);
+ ::testing::InitGoogleTest(&argc, argv);
+ gEnv->init(&argc, argv);
+ int status = gEnv->initFromOptions(argc, argv);
+ if (status == 0) {
+ status = RUN_ALL_TESTS();
+ LOG(INFO) << "C2 Test result = " << status;
+ }
+ return status;
+}
diff --git a/media/codec2/hidl/1.0/vts/master/Android.bp b/media/codec2/hidl/1.0/vts/master/Android.bp
new file mode 100644
index 0000000..e164d68
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/master/Android.bp
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+cc_test {
+ name: "VtsHidlC2V1_0TargetMasterTest",
+ defaults: ["VtsMediaC2V1_0Defaults"],
+ srcs: ["VtsHidlC2V1_0TargetMasterTest.cpp"],
+}
+
diff --git a/media/codec2/hidl/1.0/vts/master/VtsHidlC2V1_0TargetMasterTest.cpp b/media/codec2/hidl/1.0/vts/master/VtsHidlC2V1_0TargetMasterTest.cpp
new file mode 100644
index 0000000..01e64cb
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/master/VtsHidlC2V1_0TargetMasterTest.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "codec2_hidl_hal_master_test"
+
+#include <android-base/logging.h>
+#include <gtest/gtest.h>
+
+#include <codec2/hidl/client.h>
+
+#include <VtsHalHidlTargetTestBase.h>
+#include "media_c2_hidl_test_common.h"
+
+static ComponentTestEnvironment* gEnv = nullptr;
+
+namespace {
+
+// google.codec2 Master test setup
+class Codec2MasterHalTest : public ::testing::VtsHalHidlTargetTestBase {
+ private:
+ typedef ::testing::VtsHalHidlTargetTestBase Super;
+
+ public:
+ virtual void SetUp() override {
+ Super::SetUp();
+ mClient = android::Codec2Client::CreateFromService(
+ gEnv->getInstance().c_str());
+ ASSERT_NE(mClient, nullptr);
+ }
+
+ protected:
+ static void description(const std::string& description) {
+ RecordProperty("description", description);
+ }
+
+ std::shared_ptr<android::Codec2Client> mClient;
+};
+
+void displayComponentInfo(const std::vector<C2Component::Traits>& compList) {
+ for (size_t i = 0; i < compList.size(); i++) {
+ std::cout << compList[i].name << " | " << compList[i].domain;
+ std::cout << " | " << compList[i].kind << "\n";
+ }
+}
+
+// List Components
+TEST_F(Codec2MasterHalTest, ListComponents) {
+ ALOGV("ListComponents Test");
+
+ C2String name = mClient->getName();
+ EXPECT_NE(name.empty(), true) << "Invalid Codec2Client Name";
+
+ // Get List of components from HIDL Codec2Client instance
+ const std::vector<C2Component::Traits> listTraits =
+ mClient->ListComponents();
+
+ if (listTraits.size() == 0)
+ ALOGE("Warning, ComponentInfo list empty");
+ else {
+ (void)displayComponentInfo;
+ for (size_t i = 0; i < listTraits.size(); i++) {
+ std::shared_ptr<android::Codec2Client::Listener> listener;
+ std::shared_ptr<android::Codec2Client::Component> component;
+ listener.reset(new CodecListener());
+ ASSERT_NE(listener, nullptr);
+
+ mClient->createComponent(listTraits[i].name.c_str(), listener,
+ &component);
+ ASSERT_NE(component, nullptr) << "Create component failed for "
+ << listTraits[i].name.c_str();
+ }
+ }
+}
+
+} // anonymous namespace
+
+int main(int argc, char** argv) {
+ gEnv = new ComponentTestEnvironment();
+ ::testing::InitGoogleTest(&argc, argv);
+ gEnv->init(&argc, argv);
+ int status = gEnv->initFromOptions(argc, argv);
+ if (status == 0) {
+ status = RUN_ALL_TESTS();
+ LOG(INFO) << "C2 Test result = " << status;
+ }
+ return status;
+}
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_352x288_420p_30fps_32frames.yuv b/media/codec2/hidl/1.0/vts/res/bbb_352x288_420p_30fps_32frames.yuv
new file mode 100644
index 0000000..b5a3e4b
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_352x288_420p_30fps_32frames.yuv
@@ -0,0 +1 @@
+ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÒÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;<?;?<=<?>?A=AA>CCDB@A>:;?DDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌÌÌËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;>BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677<;>:=:::88:;;88::;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::>;D<=:<<98:9::9;<::;9><>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA=366:;<8C<AA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖËËËÌËËËËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<;999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNG¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËËÌÌËËËËËËËËËËËËÊÊËËËËÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÚÛÛÛÙÙÙÙÙÙÙÙÚÚÚÚÚÚØÖ××××××רר×××ÚÛÚÚÚÚÚÚÚÛÜÛÛÛÜÜÜÜÜÜÜÜÝÜÛÛÛÛÚÔÓÓÓÓÓÓÓÓÓÓÔÔÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXdIILN@99:3;@<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMMF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`ccccccccccdde¦º¸¸¸¸¸¸¸¸¸¸¸¹´ÓÓÓÓÓÓÓÒÒÒÒÓÓÓÛâáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃrliNRbLLVM<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKPFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞëëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤XRSSSSSSSSSSSTMCDDDDDDCCCDC?]ÑÓÓÓÓÓÓÒÒÒÒÒÒÒßêëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËwliJN_MRUM><<7;@C>6:7>?;=B@9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦\VWWWWWWWWWWWXQIIIIIIIIHHHHD`ÐÓÒÒÒÒÒÒÒÒÒÒÒÑßêêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;>@@8:;8<<<;>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÏÑÑÒÒÒÒÒÒÑÒÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbabaabbbbbb^¬©©©©©©©©©©©ª£gabbbbbbbbbbbb\TTTTTTTTTTTUQkÐÒÒÒÒÒÒÒÒÒÒÒÒÑßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9::=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÍÎÎÎÎÎÎÎÎÎÍÌÌÌÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÎÎÍËÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÅÆÆÆËÌËÌËÌÌÌÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌËËËËÊÊÊÊÊÊÊÊËËÊÊËËÍÕÕÕÖÖÖÖÖÖÖÖÖÖÕרØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8:;898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÒÓÏÏÏÒÔÏÏÒÔÕÔÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÐÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÕÖÖÖÖÖÖ××××××××ÖÖÖÖÖÖÖ××××××××××רØ×ÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀÌÏÎÎÎÎÎÒ«ÏÐÓ¹ÑÐÈÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLB@==<=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒ¶¥£Õ²µ¶¸¹¯¢ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÎ⦫Ò}~¯°ÑÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>><<96?B?B9648:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÑ¿ ²ÈÕÒÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>?>:8E@?B;749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÓ´ª¸¤Û£ÕÓÀ ÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<=<964:98::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯Ê £¿Ê¥§ØªªÔÏÏÏÔ«~£ Ø¡ÕÕ°¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>9<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÔ¬§¡Ù¡ÕÔ£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖ×××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CGDAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9=::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÓ¶²²¥©Ú¡®ÖÍÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHFE@<<>><==<756:96:;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÄ¢´Ú£¯ØÂ¡ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸« ÇÕ¢«¤Ìءڲ¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKK@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓÈ´ÕÔ±ÃÖ¹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUij[L_MJLJULFB<<?FEGKH=667:979:;:<=9>99:8;=>>A>=9<<:=>>;=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÔÈÁÕÑÒÑÃÕÒÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?ADLL@>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÑÓÔÒÒÒÒÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ==786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDCI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFID<AA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD88867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCDECALH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HQA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßßààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDD>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<88996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDE><<8:87995686673:>;>=7:>99996::87<CEG??;?>@=>A<;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;99:86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AD?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
¼ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkqtywt|}spxyÈÞÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxu|v}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9886543956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µ¶¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿½¾¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78473156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;;>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¸¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565454688686;:9<==;:86688:767>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®¯³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPF>8;727967443588797;9:==<::974:98668??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹º¹¹¸··¶µµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269664737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³µµ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´µ´¶¶··¶µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶······¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B@?C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬«««¬¯°±¯¯°²µµ¶·µµ¶µµµµµ¶µ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©©¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@AA:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬«ª§¥¥¥¥¥¦¨¨¨¨¨¥§¨¨§¨¨§¨¨©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637465738:::::<=::A<6=8378837;@??@@:BEC@BDCA?;;@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¥¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¥§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¦¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢£££¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¥¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@?BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747578;=8::99;=;;89>6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥¤¥¤¥¥¦¨¨§¨§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡££££¢£¥¦¦¦§§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¦¤£¡ ¡¡ ¡¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364689:89788:<;<9;;::67899>?@><=@>@:9@A?=A?>AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§§¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¢¢¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¤¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846799=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¤¦§¦¥¥¦¦¥¥£ ¡¡ ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:737959989<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢£¢£¤¤¦¦¥¤¤£¢¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££¤¤¤¤¢¡¡¡µ¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;866:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¢¤¡¢¢¡¡ «¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86:756::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡ ¥³¬ ®jv ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¦« ¨D ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢ b¦¡£QG ¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8:;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¦f]£ ®uIL ¡¡¡ ¡¢¡ }xjabb\Q<@<68CVHDB:8;:>;7796=:99647:;<>9::;>;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¤Rx¢ ¤_VN¡£¥¢¡¢¢¡¡ ¢¡ ¡
wqgjd\\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?=CEB=B@<<<:g¤¢ ¨}ges{zs¢ [_£dZL¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[[LF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡]]v¢dYM~¢ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡`a`tcUN¢¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y i^[ej_PR¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B@AB>>;CDD@CC>>>9a
y}{
kxvwsq}r ¡ shaTv\VPW
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v} £¤nLOc
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;?<:=:>BA8?<:?86429;B@?B>=8@B??@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{ l¥_r
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=99974869388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A>?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~¢|nRuZq}|~}|¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>89875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
}wXOLpL`oqw
¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~£U/0=wwvAD^km¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢¦gAZH;wykgE/8[ls ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©©¯Ko¡xA{wcbPPZG`n¡¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´´´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¦©§¨£x`¿Ö¦C{uOmuRd£¨§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤§§¤¥£¢b½À¯w£eLaxmQt¢¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWP^edlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@<><99<ABEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢¡¢§¡¦®¦¦jº¦Ð¡±¨XL¬Se ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡¨ª±²¯«¢¢w~}rÎɱ§¯kUª°bZ¦¥¢¡¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\U\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9><B??ADB9:¤§¡ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯··´µ¶³®n͹¢tTozsn{¦ª§££¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥©§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§£¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@B>C=;9>9@@@?BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²·»»»¹¹Á¸´µ ydY·À¦¨wkqoxxz}¢¥¦«¥¤¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨§¦¥£¡¤¢ ¡¥ vxyxc[RYT__amhvkqhiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;>CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ·ÁÆÌÏÎÌɾ³¤sfRD~xqngflikqrqqrt|©ÄÄ»¢§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¡¤§§¡ |xa^YSaiaftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃÅÇÛããÚ˼¯¤tYZQCizlounkeeYW^X\ciihe`h´ÀÀ¹©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwom[bRV\MG;<97979:7444143768<;:<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5^
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ¾ÍÑÕʹ§r^QTKD[f^dkea`hYTXRVXY\XZt¶»«´²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklgnvrrvrg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@93[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÂÁÇËÈ·ueUPOTH>^k^_eb`]daSVVUSTWr«°ª¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxoyjia]gaQFDA<997644:8465333656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB<89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄù¸ÃaIDGKD=[ebahc`[c_WQNOOU´º¬®¥¤¢§¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{wnkihvZgsxszgg^d[RXIF?;78876169744333646;8:;;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÄÄÂÄÁOFME;M[_eke_[`YXRMT¢ª¹µ³«©£¡ª¬§¬´´¿Ã¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyvvefijh^kpnyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈÌÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇÂÆjXG??G^cbj`ZXWSUv¶¾»¼º¼¬¦©»º¹·¿³µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««¬±££ £¢ £ }qtqocahvijjunyl^d[V`YLHD6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÁÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÎÅÆÆ½©rPK0XSUfaSNOp©ÈÈÂÄÆÀ¼¾´±°°Á¾¾ÁÆÀ¾·¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®¯µ¥¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r}xpg`kjwmifvotc]cUWUTMG:7;9977:748784523425;:9>:=<?=8:=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÂÃÂÁ¼?Nv~VLo¤ËÔŶ¿¿À¿ºº½µ³³À¿¹¿Â¹Á·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£ ¦yzyspfegdkebknoo_Y]WVNPJF99;97677637895613527<<<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ½¼Å§wjo©ÈÈÇÑÁ¯½½¸¹»»¾¸µ±º¿´¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬°§¦¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥£ ¤¢£¢¡£ ©¥¨}zxnfaebacddjcgd[ZZ]YQOE=;9:;77996499:5314527:;;@=?<<977;:9:<>@?>D<BAD@?>=BDBBB=:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÀº¿À¼»Å½ºÀÄ¿½¾¯se}ÑÅ¿¿É¿°Á¿º·»¾¹¶¸´¸¼µ½¸µ´¯³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdacchkggjfj^VVTYOTLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÖ·¿»ÃµºÇ¶µ¸º¼¸¹¶ª£É¿¿»Á¾¹Æ½Â¿¼Å¸··µ¸¶¶¼»¹¶´¸ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeegojelhYYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÄw§Ì½Ç·¹·¶´·¹³µ±¼ÉÃKzʾ¿¾½¼¿ÈÃÅžǸµ³³¾¸¹¸¾»º¹¼»º´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knqgqktfcn`\UHKJDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄÖ¯tºÈÏÂÀ¸®´´»½·¹±½ÃÊCtÍÿ¾½¼ÇÌÇÇÄǼ¶µ·Á½»¼Àû¿Â¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qfljouoxdhc\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÆÉÒqr«ÒÑÌÊĵº¿ÄȾ¾´¿ÀÀyRmËÆÂ¾Á¼¿ÃÌÊÇÅÆÁ¹¾½Ä¿À¿ÂÈ½ÇÆÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tpmmtlmo`c_bbNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»ÄÐú¾¼Ä¾·¼À¿ÉÏÇÈÊÊÂrs£ËÌËÍÊÆÂÃËÎÁ¼¸½º±pcb»ÈÄÀÀ¿ÄÀÊÉÃÃÃùþ¾¹À½ÃÆÂÊÎÇÆ½ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢¦¡{z{mmx|`qd\_``TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»«Úþ¶¾À¾¾º¦©²¶Ã¿¥zvxÄÇËÈÁÃÀÀÉÊÁ¿»¹±¡}sjÈÅÄ¿ÀÁ¿ËÇÃÀÈÀ»Â»¹´»»ÃÃÁÍÐÊĽµ¼»¹¿¹ºµµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsythp^\_]ZRFEDMIAD=H;;59;:<<:;;;<?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Ä¹m¬Î½¶¹À¼«~nhnlrsw|½¿ÆÀ¹À¼¾ÅĽ½¸±°~ÊÂü½¿¿Ãþ¿È½¾À¸È¾«¡¡¡¦¹ÁÉŸ²¸¸·½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmu{qoj\`aZTQAFIGK@ECI<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀÍ´v³½¶µÂ¥iZ]`MR[Znsw¸¸Âº³»·»½¿º»»®¤~ÀÄþ¼¿»»¸¶Á¶À»È¬¼º¸£·´°´´µ¼¹¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶¼´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvwxnra_g][UJ=??GG=GCC9:5;99><<9:<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɨx ¯µkefVX_IIMPSlw
¥°·¾¹²µ²»¹¼¶¹¾´§¡p®ÉÄÀ½¿¹³®²½»®»»ÎÜæâѸ¯®³º·º¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrm`db\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Å«|v `TCWVHakVOFI` «¯¶ºµ´²¬¼¹¸µ¸Á½²£¦r¥Ë¿¹ºµ®¥¬³°¦³¹èãÛÕ×ÕϺujl¬§¯¶³²ºµ»»»µ¸¶°µÄ²¾¼¾¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovsod^hY]^SONB?JCAKJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿µxoNJ?cZANwkMA\°µ³µ²´¯¬»º¸¶¹¿Ævªe§¿¸µ²±¤§§«¢½Ë«¨µÊÏÏËtklr ¤ª®§°¬¯±±±®®¯¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvtmvjl]\kU^\PNHDGMBGNG8665:5:=8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶{XFANZJJXvc@R¢¹³´²°±°¹¸¶»·º½¢²¬¤s«°©««£¨ ®³Z8KyªÅÊÆ¢
£©¨ ¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±¬ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wryiutoeUbdX]ROMI@ISDNC=8875:7<=:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯±»ªiN@RxqPIIKgYEQ»±¬³¯®¬¶¶²´µ®©¦¦¨ ¨©¡§¬}2RhVt¯µ±¢¢£¢¤ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ª©¤©«¦©¬«¦¡y|vzcxmn\QiUPOGPMMCPR@?;>4::5;:=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢ª¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨¼Â«¤¾iERQWII_KSadb®µª²´®ª«¯°²³¥ ¢ £¤¨ c^tZ£¡¤§¦ ¡£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~}uv}nl{dhVSdNJHGOSNKNH<E@=2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶¶º¹º··»®¨ ¡©¡ªÆ¿Ê¡PArxOnKKbeus`[^p±¯®³µª¦¬¬£¢¢¤¤nº¿£cg£¢¦¢¦£¦¨£¦ªªª®§¨°¥£¤¦§¬¦¡¥¢¯¨®²«¦«ª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ |~wy}eyyabSVaIIKLSUJSQM9>A67=65;:<<9;;8:<=;;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??855=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥£ÇÇWSId£]e~or]Pkc[d_]k´°°¸¬¦¡¢¢z¤ÇÖÕOl«£¡°££¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««¨¬¬§¡ £±®²±´ª²¯£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨¢§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshme\S[ZMRKOOVMTMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=?758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢«¤zUiruuqbvvXWc`cgYXWe¬®¬¯§¢¡ ¡£wÊÚ²²gFfzx{µ¯¦³¬¡£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³µ¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xvjwu^m[RaIRVHFVWKCMH=KI8E<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©¨®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¡ ¤np`cXL[SZMLPXRHMMG¬ª©¥ ¥ p½²Suyqeije^Pk¬º¬´´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ·»¶«®±¸·¼¯³°µÁ¼·¾³³µ¢¬¢©©²©«¨§¨ª§ ¨ ¨¨¥¥ª¢¢¨ ¤§ £§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhn]X[CWNJGNGCGN=>L>5<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©©ª ±¢·¤°¦£bW^e`WMQG>>?CC?>BQx¨©ª¦ ¡£
©¢¬ {z¥sZK_ZI@§Áµ¹»Àù½»¬®§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¸Â¾¸´»ÆÄ½Ã¼¸´ª³ª³´¯³®ª¯£¬¨·²£°¦¡£°±®°¤¥®£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trkkurqhW\QFUHDJPI?FB4FH96<>7;<><<::89<89;8;:9;<7;>=>=68@9;;=@<=@97<<;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ }`^e`QGD=C?E<?96Nª³§¤¤¢ ¥¬¦xl¢¡©©´y£¤¦bnk®LD·Ä¿ÄÈÍÐÈËò·µ¾²¾Å»¾ÌÍÆÌÌÌÒǾ¿À½ÇǸÄÊÉÄÁÇ¿º´º»´»·°¶²«»²®»·À»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxkfZ\FLMEDTMEBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;:::??=B>?7:A@=<=866<:<@?AAA>« §®§¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}sjaWNE>IY|pbB=\®¬¡vrplo¤«²§svynll{
YVyÀ§anÌÄÄËÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÁÆÆÆÊÈÏ¿ÉÑÍÇÆÉÆÂ½ÄÁ¾¾¿µ¾³¿ÀÃÄÈÅÈį¿¹²¸½ÄÂÁ»¼¼µ®§§®¨ ¢©¤ ¨«©£¤¤ £
yusebgrog_ZZDOMCFQIDCA55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:;>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £kf]TID@?K
¥ ²£yqqnjv¡·µoef\MVpzho_´§lÓÏÄÍÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÒ×Ò×ÒÕÖÓÔÈÌÇÌÍÊÓÍÎÓÍÆÉÊËÂÇÌÇÉÉÆ¿Ã³³ÈÅËËÌÏÇÊ¿¾¿½ÁÇÅÌÌÉÉÀÃÀ®°³¨¡ª£¦©¬¤¥¦
{ruvgcgwjeWXRDNG@IQC>B=:22A<E<78<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡cSLJDC?BRѽ²¯¦ ¤¡}yqlebhrpr{
upmprm¬iWcX_dpm~rOsÆÐÑÂÏÓÖØÕÕÒËÉÎÐËÆÍÒÉÒÕ×ÙÖØÓÖØÍÒÊÎÑÌÏÑÍÓÐÀÉÈËÄÌÍÌÏÐÆÇȶÀËÀÒÍÌÐÇÊÉÀÄÃÈÏÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpcaesc]R\JKGAFIJ?;A8>5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¥¥ ¢£[I@ADAFPu±¯¦ wida_``_^__]alusponkpnrbO\T\`Qf^XeZMjwyÕÑÐËÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÇÐ××ØÒØÒ×ÙÔÖÌÏÏÉÍÒÌÏÑÀÇÄÉÇÏÎÒÑÑÈÌÍÀËÍÆÔÏÍÏÈÅËÇÇÉÌËÔÔÑÕÏÒÌÓ¹ű¥¨µ®¨¨«¥²¨°³¬¬
|zqstmacim_VQ`JJCFCSN?<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B<:<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®§ª¨¡£¬gC8=>DXª¨}qecb__a_^a`^a`_`emppmjmost{qkeTGIQPGE=JP\_u[sÕÔÐÉÎÌÒÖÒÑÖÍÏÕÕÑÅÑÓÊÐÔÕÖÎÓÑØ×××ÌÈÎÄÊÏÍÊÍÀÊÁÉÊÎÏÐÌÐÎÎÌÏÐÈÌÑÑËÎËÃÊÈÊÍËÌÒÓÎÔÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¿»±
zvopokadnpaX\[IFFEMYE;@=33<<87865;>@=9<<8<>9<@;@:=8?98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤²|HFB;V¡k^^^adb``aa```^__]\bmrnmqqrqwiO~jQXKWOK`@K[RmbvÑÒÎÆÍÌÍÔËÎÒÌÊÖÖÐÌÐÓËÌÐÒÓÊÎÑÕÒÕÖÊÀÊÂÆÍÃÉÊÃÍÄÆÉËËÏËÎÍÑÎÔÌÇÉÐÍÉÇËÆÇÂÆÊÌÎÑÑÇÐÏÍÎÌÐÅÇÁ¸¹½Ä½ù²²¾°»Ãõª¥¡yqrkmh``qhYXhVMGMIQQB;D?;68:8:;57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨ xloov{ebbb`]^acb`__`aa`_][]gqqopqminpf}zfg[JV]c<AVKaiwÎÍÆÄÆÍÊÑÇÊÍÍÅÐÒÏÍÌÔÊÇÊÎÏÇÆÎÒËÐÏźĿÆÊ½ÃÇÉÎÅÃÈÀÇÎÈÄÍËÍÐÉÅÅÐÉÆÂÆÉÅ¿ÁÈÍÌÌÏÃÊÌÉÇÌÐÅÅÈ»ÇÃÉÉÂÏÀ½¼¿°ÁÉÆ¹½ª°²§¥¢£xoudk`^fqa[W`GIHGIMUG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»¤¶~g¡©
}s_[^]^`^`cdc_]\^_``_[Z\akrpmmhgijv}hhTWfPBE\VW]yÊĿ¿ÂÇÉÈÈÉÇ¿ÄËÅÇÊÌÉÄÁÊÉÁÁËÏÄËÈ¿¹Á¼ÆÈ¾ÀÆÏËÄÀûÊÇÈ»ÉÆÅÊÁ¾ÂËÆÅľƾ½ÁÄÆÌÆÅ¼¿ÊÃÅÇÒÅÁÉÀÊÊÇÈÆÐĄ̮̃ÄËÇÃÊ·¿¼º³©¬¤¥¬£¡¦£ |wsufj[anmZ\XRDLGCGDLDFS@54335@=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¾¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²°¶m^z{z
uxurp_Z[\``bcdded`[\^]^]_[YZ\anqmifgkhlseZ[SABEORSV·¸»¹·ÀÁÁý½¸¼¾¸ÃÉÄÆÁ¼Æ¿·ºÃÈ¿ÁÉ»¶»»Åÿ¼ÂÎÃÆ¾¾µÁ¾Ä»½Ç¼Ãºµ½ÆÄÂ÷À¶¶¿¿¼ÍĽ¶ºÈ»¿¾ÌÄÂÆÃÆÉÇÉÆÐÆÂÌDzÇÉÃÎÌÀÅ¿¼²·°²§¨¨¹°¥°ª¬zwxkeh`hodV^YJFJFHKAFBFJA9:658853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µ«·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÖÔÕ×ÍÊÏÅÉÅÇÁºÅ½¬®§`cwx}{ttc\\]^_`bcbbdeb]\[\^\^]Z[\]grokdciikr¢fYQQSN@;GLp ³®²²²²²º´»°¶¯³®±ºÁ»ÀÄ»¿º´±º¾À¸Ç¸´¼¶Á½¸½ÆÁûµ¯³µ»¿´Å¸»µ¬¹½¾À½±º¶°·º³Æ½·¯¼¿µ·µÅ½¾ÃÆÀÄÆÆÇÌÅ¿ÅÆ»ÇË¿ÏÉÇÃÅÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJGBDAEF?=:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐËÍÈÉÈÊÉÊÄÐÍÒÏÍÅÇÁÅÁ¿º¸É·«°[go
zx~
vw|sh]]]]^`_`da^cec_^\[^\]^Z[[]_kolfcfhgjum_SXd]ODD]£¦ª¨ª§²¬´¯±§¦«²º¹µÂ¹¹¹¯ª´¹º³Á¹¯À±½¼»µ»Ç¹Ã¶ª¨°²À¶¸½°±¨²³µ»¼«®¶§®¶®¼²°ª¸°®»®»¸»ÀÀ¾ºÃ¿ÆÃÅÀ¼ÆÁÇʸÅÇÅ¿ÇÃÂ¹ÄÆÂ»ÆÉÌ˳¹Â½»³tvwki`bliYWW[ALLMJEAC?FA;::996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÍÒËÃÅÁÄÏÆÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ¯ª±[i~{x}
y{wn^]\\]_`__dcbdcb`_]Z[ZZ]ZZZZ\cmmfdddfgjx~oh\cliqs¤ª¡¦¡©¨«©¯¢¥©¬´µ°¼¸¯¶®§·³³»·³¼¯¸¹µ²»Á²Á¯¥©£«±³³¨½ª«¨«¬®µ´¦¨®¡¤°©³¦§¨®¦¨·¬±³·ºº»²¼¾¾¾Ä¿µÁÀÇÈ·¾¿Å·Äÿ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji\aodWVXPHZSSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃǹ¹ËÁ˾»É¶½Ã¾ºÊ¸Áõ¶¼¶±¯µ¼®¨«cmz}~xt~|swe_]\\^_`^_ccab`a_]]\ZXY[[XWY\_ejdbcaddhmzwqqhthk¤ ££¥¥¬£¥«°¯¶¶¦¯«¦©³«³¹°µµ¶¹²°ºº±¶¥ ¤ ¦±¨¬©¹ª¥§§¨§³ §¦¤¥¬§¤¡¡±¬²µ³³°µ¼¶»ÁÀ²º¾ÃÁ±¹¹Â³À½Àµ¸»½¾¼ÂÇÄÃÄ¿¿Ä xqlbf`ko`UY_HNhOTHFKF<=@=:;;826536999;9::<:7<?<<;<88<9;:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;ȵ¶½¸ºÁº½¶ ¦º¶«³³»³ÄÏÉËŸ·ÇÀÌ¿¸Ê·»Å¸³Å¸³¿À¬¶¼²¬¦¯´¡£ir
|xusomjiipi_`]\\\^__acb``a`^\[\\XYXXXVXZ]^cb`cccbefivxto||Rg¢¡£¡¥¡©®¬°´¢¨¨©««¤´¸¬¶¯¬²´®³µ¯°ª¤¢²¤¦ª¸¢¦¦ ¨ª¥£°©¬¨ª«¬°²¸¯¸¹º°¶¼»º«³²¹³½´·²±µ´¿µ½À½Ã»»½{sl_e^ddXTW^IW]KPGJJGA<??A;?<05635:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»¸ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹È¸¸¿·²Â´±»»¬ºº±¢©«§m~
xrmomkb^bff]]^]]]\]_`abccba_\[[ZZYXWWWWWXWZ]abccbbcddmzrnw~g=e¢¡¤ ¢¬¬¬° ¤¡¬ª¦¡´¯°±¬¨¯²§º³¦µ ¢£¢£¢ª¶ª¢£¦¦¦£ ¡¬¨£¤¦«²³ªµ°²«²¹µ¯ª¯²²³·³¯©®±·±º¶º½¿·³±zvf_f_[YVSZUK[QLJEHKIC=?BB@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿²¥£¥±Ãµ¶½´¸ÂÌÈÆ¿Å¶ÁÀÇηÀý³¹¹²À¶±¹»²µ¯¤ª xxoqtqhedhdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWUW`bcaab``dfrpkr{P9[}
¦¡¥©¤®©¡¡¶¨ ¨µ©¦§°¤·°£· £ª¦¡¹¯£¡¤¢ ¡©ª¤¢£ªª°¨´¬ª¦²°¥«³±¯°¯¯§¨§²±´°»´º·®£zwe_aWYXSRTKM^LPLGHMLE=@>=B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´ºÂ±¾·½§§¢ª»À½À¹®´¸ÁÌÈÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°°±ª¡ª|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[[Y[[ZXVWWVWXWWVUZbb``a__`bgpinn9.0L£¢ ¤¤¤©¤ ¡µ¦ ¢§²¡¥§¥¯¥±«µ ©¡¢±±¢£ §§¡¢¤¥¥«¤¥°§¥¢«¬¦©®¯¯«¨ªª³¦¦«¯´±®¼¶±°¯{xseb\[]XNLQHRaMVPOJNOEBD?9=69:764599;9887;89=>;>;<69;7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±¶½°¼±·¬¥¦¬¸»¼Áź²¹µÄÉÉÀÂÆÅǶÆÄ³Á¿Å«··½¶½º»µ²¬¨ ¤t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVVRTRT__]^_\]]`ahkka.+Lu
¡©¢¡¡¡¢ §¨¢¢°© ¤©§¢¬¬ª©¢¡¡¢«¨°¢¡£¤¡¢ ¢¤¥£«¥¢¤ª¤«¥²©¦¥¦¦µ¦©¨³µ´¹º¯«¬sqpa[WVVRGQOHZ\ORJTKSLEGJC8;;=<9667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«±¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÉÌȵɽ±¾Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURRNPX\Z[\\\]\_bijb=+=Ln¤¤¦¤¨¤§¤ £«¢£§®ª³¥¦££¡©©¡ ¡ ££¡£¡¢¨£¢¨« «¯£¸¥£¤¢¬ª¨«¯´·²½µ³«®
uti\YYSURFXLQ[XMUOPLQRIOIB=??A?=75799<<977:79:;<=>;7;::=68:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ÌÆÅ¸ÀÎÏdzĻ·»Âȱ¸¿·¼¾»³¶¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPPXYYY\[Z[]^cnsSDP[`|}¦¤¢ª¨¥¡¥©¢§¥§ª¥ ¨ª¥
¡¤¡¢¥¥¨¨¨ °°¦±½§£¬´ª®§¯´°¹µÀ±®°«stbWTUNRJGVPRRLLXNKLOSGNKACFDC>B75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ¶¸¼½Àñ°±·®´´»³´££vkglnqnqjokdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTQMNMRWXYXXWZ[[`jifn_n\jx£¥£¢¨¤¢¡
££¢¥§¡ ¢¢¦¥§¨§¡ ´²¨³¸¡£¶¬ª¤²²¦µ¼´«¬±¢ztn^NQQMODNNNPKFNNJJNNQHMJAHLIHD?958889:;69:68;99><8:>9;?8789:885857688974577820301+)-/12876:999984988A7w¶§¤¶°¤§¤ª¥ ©¦¤³ª¢²Äµµ²³ÆÅ·ºÃÊÌÆ³¬º½´¸À¯©°¦®»¯ |n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRRSPQTQSUQNMKKSWWVWWWWZ\aeY_\l_^xoz £s}
{ £
~~sz¢£ ¡£¤¢´¯¬¯¦¸¦¥°¡±®±»ª©¯©xtdVMRPPMCSNLPMBPQHINSNIJJEKMGKK>849888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-02764789::65:87A7x·¡£´¨¦¥¨£¦¥¦¦¦²§¦´Á¸¯´°Éĸ¹ÀÎÆ¾³»Á¬Ä§¡¦¦·£ ~xfWV_gfighnciifb\XWXXXYYYYYYZ[[[YYYVWWWSTPNONOOPSTQMMJGNSSSTTSUXZ\hXZWimedEOiy~
~^;Vn{ry{}xqo~¡ §®©©©³¢¥«¨´£©¢tn`[NSRWLDTJPLLFNOIELQMKPJINPGJJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· ¢¡¦¦ª §©§£ª°¨§´Â¹°µ°Ç¸³½Ï¿¹¯®µÂ§ªÄª¢±£~sv]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKHFHNQQLORTUWY``TRbncE87yu
w~_IPmw}m~wuvxpQ|~yvgw~¤£¨©¥¥°ª¡¤¤¦ª¢ª¡¦§wnf^\HQQSMIUMSILKOIHFJNLMUKQRPGJD=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833989:99::::?9w¶¢§¡®¡§¨¥§§¯¬ªµ¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼§©~xqoXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDCINOhYNQSSUZf\T`gWXPJ|lw{w~x~s~wqmtptz~ªz{hv{prmxx{{wsrxhu
||© ¡ ©¥§¤ ¤sib]]JWPRHKXROJMLRJJJLPHLQLRUNFIB=78;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¢wx|vpojYKHIHGEHHPTTTWWSUUUUVWXWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LNQQSV^b^\aUe~s`rypsyx~nztynj}|t~z|tfu|lohs|mzq}qmvqhq~pD
wxz}{u}£¡¥yongc[XXUQJSUTOPNPVKNKOOJQOIOPLFD=;79;::?=9<:99??;8;=7<9999266856633611224.,,--.-0-+*''*.1362/876966527995y¦ ¦°¬®«§©°¯±«»¸«º¾¸³¬§°§¬¥©¤¡zvq|muqjmjXKFGEA@CDHLLMQQOQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zYJNOQTX\\[WVw»zko[sphvsuxlivrwhh~q}Ingw~mjdly
ksl|nr|imps
{}~{wputyyp|ojoooYVXTRRYORUTSXUMOHMKMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¤¬¯¢ª¨µ¯®¬³¿«¼Â¿¦¢¤¡¢szuotlqmekkYNDFC@<>>BFFGKKKLORRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_JMNORVZQVRPzW_ho]vigyt
q}qjrqzhhLyf1vrk}}tfeu~
filukp|hqq|n{t}}qqovmwyujyyxlkpheXR[XYY[NPUVYXNIHEJJHGB@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5m¤¨±§º¯«²°Â±»ÃÇ
zqtzpsqopdpg_TFIC?<;9:?@ADCEGIKOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQUKAHPF]¥©fqndufk|{|vvoqw~qs5q§ ¡¢
vp{|shgbjnrmpuioXupvm{}nrnp{svnbu
ux~}|trqm`\]^\ZYa_RN[ZXWLHIFIH?CABH?CD=;:7=;:;;9:99;:?<88=:8;66650121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©±®Á²»ÁÅ|n
ul|uxxmxnwdj^IPG>?7448;:;=>@BEHKLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMMPL7CMPQBF{itrrmvfpvx~{zsw|`
©zv~s{]dqtz|wmhjbyo
zoxu
zptzxkni]v}|
}q}vw{|xqtugh`[\^S\g^WPTX[UGJJELG?F@DD?AA=;97<;;=<::99;;=>79>9985654244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ « ±¨¯À²»Åºzvk}xs }}p~zhwkRXL@E211276688:<>AEFFGIKMOQRSTUWVVVTSPMF@:2= #c[5311i?GoIFIKMNQKJSZVNF_w}qqtju
uwzt¤¬©H¬¯®©tm|~hghyn
qGmwryvhmk_v}yzuv|xmow~uusm\^^\cdXgf\UPPWYPDLKFOICFCCA@CA=978:::;;:888::?>6;>7585773344236656778;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|} ¬ ¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23124668:=>?BEGHJLNQSTUTTVUSQOGC?80,#[??84.]ps£UFIKLMOW_ViWXZa{x|y}y|¤¬»±¦ºÇç¡¥|qw
ihptrw{v|mvuf ª¢zzyogkx~|ulf^Z[^j^ag`ZPLNWRQIPJDNGCJDC@DDB<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nuofwz¤¡¬¦ª®°¡xw|lpj]BA4.-//..02234778;=?BDHINQRTRSSTRPOHEB<87/9C><<63.lMPHJLKJMU_^wcbgl¦¢¡©§´¡§ÁÂǯx¹|¡
¡
lpuwqm
r ¤´¨¢}kjj|uc^e`[hl]ml_WKHNRPNLLFIPCDNFBCEFC>:96=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYooupv~§ ©ge¤~y}xxgMR>//.,/.-/000212567:?CENORTPPQSQNPIED>;<:DF?><752<?R5HHHLKMNQ]iwmzu¤£¦¥¨§¨³ª½ª´ÆÈ¶ÈÐϾ piª©
¦£wz~¡{wª²|£¡¥µ¯§lss}~sjb^b`bhe`gg\REJKPOIJLFGMCHLFFCBGEB;85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m|aw}{ªªBD}x|
v^bP560-1/,.0/./..0015>AAMPRSQRSTRNSLEE@<>=FG@A@8662<9;FHGIIMNPYi~rª´°§¥§£¤°§²®®ª¸¯±¼±Ãª¸É˷ÿ·¥¢°³¬¬ª£¥¦ £¦¢ª¨¥
¤¡¡ª ¤©°£¦·º ¢¯¢¡¢¡«®«²´¡¤©yz~ibi]fc_dd_gg_[OCIHSNFHKFJGFFHAKFCFFB;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhbWinXyv
ÚÈsV|z
qna@E64<2/110-,+-0..4>CAMUPRSUUVUN[PGHD<>>FHCDA7;<5C;=FKIFHQNPW}¥¦ §·À¼¥®À³¨¯¼¯´º²¼²¿´¹¹¢·Ä§µÈǵ½¸´¨£³°±§¯«¥v¤¡¬²´ª®¨¯¶º²º¬¯µ¢±«±µ»¶´´¦§¢¦¨¯¬±¸··§µ¨¤x
x[cfWgcbdaaga[TJDDLTPHIIDIGEA@@KDBMG=867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[YQbbWyuq}u
{¿»£¼´y{xn]W@DN<6:46AB7640/6CHCQ[OQUWU\WP_UIKKA?>GKFED;>@7D7?BJJEFVSO^§«¬¸«¯¸Åı·Áº°°¾´µ¾±¼®µs¯²¤¹Ä£¯Æ¸°³±³§¤µ¶ª° ¢¢¥°®¦«§¤¡´»¢¨²ºµ¼¿Ì¿Å޽³Á·º·¾¶º·¸««°¤¯¨¬½¯¼ºÁÁ«¹§©}~mXecYlfkfW\dYVSIGFLPGCHIAHD>?BBL@?MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALQVSYUZvjp~
nzsxb¹¡£{z|}}xzufP\dGEL;Qca[^SG?;HPDZcQQYXZgYT`_LRODA?IJHEEA@C<E6B>HGJLSZT]¨±¯µ²Á·³·ÅÉ·¹¿ºµ³¹¸µ¼²¸°Ä_s°¤±ª¼¨¤¨«ª£¢²µ¡ª¨ ®¥§¦¥¤£¨±´¨²³½¶Â¾ÓÉÉÓÆÂÅÌÂÊÃÀ½¼¾»»¶´¯¸¶¶Â¹Å½Âǯ¸©¡«¤§µtadc_Yc`jgSXaVRUIEEMJ@>GD=KA=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-+/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
skrrsÕÀµ }~x{{z~t}zlepuY^\Pedb`ed]\XW\MdmURmm_n_XgdTYUJDBKKIFHHHGBI:D?HKSTU\Z[´»´¹±ÁºµµÇÈ·´¸´·¸±µ³²´µct§p^¢¬ ¢¤ª¥¨¦¤¥ª°¸°½¹ÔÑÏ×ÐÊÌÒÌÏÍÊÆ¿¾ÁɼÀ¼ÀÀÄÄÄɾÇͲ£º°´®«·»|n_b^[`cZdcQ\`SQJCAEFE<@F?AHB?C<:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ[Yi_onkotu´¬¡¡
~|s|
{ts{ylmu{hreilifjji`fiilZms¤¼g\og]YYTHKNPJKPKSQILAJFJO_^afi`³Âµ¯·¹²¯Âij®·¯¯¹ª±°¥ª¶«µ§¦M¦¥¡§¬¯©°¨´´ÔÔÔÖÓÌÐÓÕÍÒÏÌÄÁÉнÉÉÊÉÑÆÌÍÂÏÑ·¯Ã¼Ã¹¤µ¹Á¢qe^__ZbYZgZQ]XNPABHEBH;@C>AG??A7;C>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYReVrgqoxy¡ª¦}
|p{r}qxvlpx~qzmxsmiqmcjmpxiw|~˾Áß§mcxnc[a`JPRUNY^O]\NPNTPTT\nmvq¬µ©±¤³¨«º¾¯©³¥£·¥ª «³¢°¦«¬¥¨¢¬ÏÒÕÒÎÌÓÔÔÏÔÑÎÇÃÔÑÆÍÒÓÓÖÌÑÑÄÑÖÅÀÎÇǨ½¶Î|qh`d_XaT_[PQTQOH>@FABE<@A>DC>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<UQMNZt
wlwp}~¡¡
y
~{q~zu
ovsls}{w{sxrksripqzyrz¾Ë}±vrvgaj]CZY[VecXcjSX\]`c]cwz}¨££¦¤©®·©¥²¡¡¬ ¢¡¦±¦j¢~¨°¢¡¡¥¤©ÉÍÏÈÃÌÑÕÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÈ××ÑÊ«ÂÂËuqebaZV[T]QKGJJJ@;:;DAD<BC>GB>BB:<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;OLFJXpu}hrxr
x~xs{}wznwpmvvx|t|zmvto}vux{µ;AÅ¥~|ieWICfcecgjcmw[^fhknhm¢£¤°££±¡¤¨¢±
~
y©£~«³¨§¾Ãƹ·ÇÎÒÑÒÐÌÒËÈÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÕ¾Ê˵zypg_[TWS\XFGKIEE=:7:@@B9GD?DCACB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt}~|x
zyqz{
uy
yp|ppzq{qnzuw||u~|¯sX©Â¶pmb=^hrpqpnxvehoruxqy¨ «¡¤«{~lz|®ª§¯¶½©®¾ÇÌÉÊÌËÐÉÃÒÊÔ×Ùר×ÕÛ×ÓÙÛÕÐÚÚÑÖÈÔÊ|~kk]\QUTaJCFJH>A>=7:=?;=G<?AAADA>?:87DB755479.556435532323647553458EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<99D>CGRj^mdbfkvqz~~{|}
wyo{{ty vutu~toou|
zv{·Å¤ÁɹwpeOfczw¢xyv{{vm¤¢ª
z}¡¼¡©¦¦®¨¶¿ÀÁ¹ÈÊÎÎÄÍÊÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆ}|jlhbVYWXNLENC;==<8:;=9=@6=??<>==9867CA6455=80665547745613955564557HH=DJE7925;H>;9:7IP][RUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Xea][htzylwvz{~~|z}
z{u}tm|}s~{~x~ynt}
|~z©Ã¡½£}}r~s¦
{hGq ¤~¥
¥·¢§¡¤¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¸{|{nlhZb]TQOIDLB<<>99;:99;<6?=><=99;;37D?7378>70688357<37804976755546FP5DNI8938AK=;3C@I<:DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=CQSRX^UXfmmmiqry{z|{z|{}t
yrysm~~w
¡o¨
z¡|}££ ¤¯
Wr«\¢
¡¡¤
²¡¢¨²¸¦½ÂÇÍÈÆÏÍÐÌÏ×ÑÑÕ®ÖÕØÚØÚÚ×ÖÙÙ rwji_`ZUXYC@IC?>>:48:;7:;:3;;?=>7;::1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcczma~nmwxy~z|{{wsp
zuvvt~¦£¥¢§s²¨
¢£©° n·
ÄȲ¡¥±d¤ÍÈ
~ª¢¡¥¨¡£³µ¦£¼Â¾ÈÅÅÉÈÉÂËÔÍÍÔ©ÒÑÖÕÖØÚÔÒÙÎ
ukfa``QKV\BBGC;A=837;<:9=649:<:82?992:I:>67BC32:96264>=4;>6949;57944JQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBeGu||m}xz~z~vv{ln~y|wx|~£´¨¤«³¡§ ¦¤¯¢¸³¡ ¤¯£¤¨©®°¤ À£É¸«£¥²
¨¢
s²£ } ¡±®£¤¸¿´ÄÇĽÃÿÇÎËÉÒ§ÏÌÓÒÐÖØÒÏØ¼u}z`cXcYRIKOFBCD5>;76:?;<7=42669774=5;5<K<>;<BA75<;5277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGM\]YJha;Hz{m
y|x}px|}|ory}{x¨¼©³½°¥®³´©£¢°µ£¹¥¬£©¸¦¤£©ª¤°±ª »»Ê¡i¶¸ª°£«½£^©²||
³ª¡¡ ¦®¨¢¤³¸«ÂÈĵº½»ÆÈÈÂСÆÉÍÍÄ×ÖÐÊÔ£s}l_]VbSQHD><CAA7?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPgHa`bpJ@~s|u~m}||~pww{«ÃÀ°½Æ¼³´Á½´¬³·¨²®®½«º£¨¹¸«§¦¢¡££ª¯²±«£¢¥¥£¹®¨¿»¬²¹¥£§}¼°z§°ª £¬ ¨§¤¢£°³¦ÀÆÃ°°»¶ÅÅÿͧÇÃÇüÖÐÌÄÊwve_]b^OLCL@EG?A>B<:4>A==5=6>333242A17@BM>G@CNCA=C<;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\iF_ig[]\{u
n~{~q~zz¨´ÆÉÀÂÌÂùȽº°«¹»²¶¹²À®¥À£«°¼½ª®«££§¬¯µ±ª ª¢¯³§£ººµÁ¼«¨²¤£¨ªÄäz ¥®©¡³¡¤ §¤¦§¤¯¥¿Ã®¨·µÉþ¶Î²Ä¾Ã»³ÑÉÈÁµx|p_[_mTNIDLLLJ@A=BD<5AD;:3=8B332262A15IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBh]Me\fTcjy
r{wy¡¨º¾ÉÈÊÂÒÉËÂͽÁ³¼¿§º¿½¼Ä¸¬Á©¬³¼¾ª°ª¤¥£¬®µ®·¶ ®¦££³¼©¨¼Á£¶·¯«°¬ª¬ª§¥¤uy¢¡©¤|¢ ¢¶¦¥¤£¥¦¥£¨¨¢²¬¨»¿Ã¯¥³·ÌÀº®Ã³»½Á¹¬ÂÂÁ¿q|d\Y^]LMNKGECHAAADK:4DH:;4<7F.12352A26SHN<JBJQEKCEE:ELB<7EV=<=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>lJ_XaZdeXw
~ ®§¤Ä¾ÈÄÈÆÒÍÎÍ˼¸°º¼´½Ë»Ã·¶¼´¿º¼®¯¨¡©¨¶®¯ª²¸¬¢¨¢«··ª¥¯¾Ä±½¹³§ª´³®¥© ±Å§|}©¤ ¡¡Z¤f¤³¥£«¬«¨¦¢¤¨¦µ«©º¼Â´¦´µËÁ¸ª¶¬³»¸®¨¸º¼·oq][WXPGKTNK?AGDDHFF85FM;>7>AK.32025B55PWN<LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hV<>@BFBsFiIRfdMF¦¡¨¥¡¯¾®¡È¾ÅÅÈÇÎÎÏÒʾ¼¶±»»¼¿Ï¶Ä¾¸¹·³³¶³¸´¬§«¬¹«©¨¯°£®¥¨¤¥µÀ°«¬´¾Ã¹À¸³§¸´·²¯¤°°¥ sÁ|°¤¢§ _J¥T°¯¥¯¯¦¡¦ ¦¡´©ª³¼»»«°²ÇÀ¸¥««±±£¡²²´¥srh_]QSMFQQPQ;HJHFGAC=9KT?A:=FM/7534:B44NWN<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;5FA:A?>H@5*B52,>c]g:35tde@R7}iW<:BC@=REWStbVFHª¡¨®§ £¥µÉµ©Ç¼ÃÄÉËÉÈÌÎÇ¿»³¯º¹ÀÂ͵ȻÁ¹¶º²¯¯´µ§¤«´µ«ª¦®¬¤¦¥©¬º¿¨«··¾ÁÀ¾¸²²Â°·¼¬£®µº¦¥u¾® ¨¦© ¦mu¢¢®²¢«ª««¯¥¥¡¥ª¢°¦©ªº¶¾³²®¾¹¶ £¦¨¥¦©©fidbTMNHIOJVL=LDMIJ@CD<QU<AABEO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CC:9C><@>;;G7-2>-1hNz\/0kh`<=BB86{fW<:=..SaLVH~e^HF¬¡»®ªª¢££¤¶Ç½´Á»ÂÂÈÉÆÂÎȾº²¯¹µÁÃʶƲÁ¼µ»¬©±¤£ªµ»§ª§¬ª¨¯¨¤««¾»¨½´·¾Ç¼¶µ¸À°½À³ªµ¶¬¿¦¢ »¶¨¤¢ §¤± ¥§©¤¡¢¡µ¯¥¥²¬«¥¤« ¨¤¡¡³´º¶¨µ²²£¥ª¡xd`b`LIGHNQIMEFFBQJH@DGAVSDH<AGQ1:B7:BF79]YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGD¨¤Ã¬¤¨ª¨¦¬¡«·ÅÁ»¿¸ÁÂÀÈÄ¿ÍǼ¾º²°¸´¿ÃȶÀ°¼¶º·§¤«¬¡¡««Ä¢¥¨¬¦«¯¢ª¨¾¸¦¿°··Ç·´¹¸¿±¾Á¶´²µ°¾¤£¡¢¤¢¢¾¤¨¨« ¥¼¢£¡¨ª ¤ ¶¬¥³§°© «¢
¡¥¤«±¶²«¥ª¬ ©if\c_QJHKOMHEDI@=OH@;FIH[ROK=HNU4BF8>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0--0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oSF<KxfcXN¢£Å¬ «¢¤ ¦ª«·±£ª³¶Å½À¶¿Á¼É¿Êȶ¸¶´±´´·ÂÆ·¿±¸µº¶ §«¥¤Á¥¡ª® ¤©°¢¦¨½µ¥±¼·¶¶Ä²³·º¾²ÃÀ·¸´µµ£¤ ¬¡¨¨ª¢Â¬¨«¥½¡¤ª««¥ W¥¡ ¹«§·£³¢¡±¡ ¢£¥®²¬©¢¢¥¤¤cg\ebNJKKOFEAGK>=IA:8JJN]QQI=LV\9FI=EMI8Hc\KCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+waS6SZkWsHE6=ue\LP¡Ã§¥¢³ ±¦©££©«¼±©¬µ²ÈÃÁóÂýÇĽÅʽ°±¶®±µ°¿Åµº±°º¶©°ª«¦¡¨Á±©¢®±ª¤¨½·¦¶»½¯·Ä³´Â¿²Æ³º·«µ¶ª¢¥¢« §ª®¯¯»±¥©©¡£¸ £®¯«¤¥ ¢¨µ§§µ£° °¡¢ ¥¬°¥¦¢ dh]igKJMJSAC@IG;;F>99NMU_RSJ>O^^=HPBMMI8Nd\LELRTY[SUO\bHA?ZQAHAKA7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0;v]^?[U_gr@8<HweA4¤Â§£©± £´©±ª¦¢¤²¬©»³°´´Ç¿Äõ¿Ä¾ÊŶÁɶ¬µ©±¸¬ÀÄ´¸¯¶º¥«²¬«¡§»´¨°¬®´²¨«º²§¹´·²¹Áª·³Ã½´Å§¾®·µ©¨¬¡¥£¢¢¤®·±´¶¨¤£ ¶¢¤¥±±¥¨¤ ¨ ¢¯³¢¦¯¥ § ¨©«¡§ zek^mkNQNNT=CANC;:I?77QN]_RVQAWa]BISHWKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[cZ33906p[bH05JqjWDWFyfC;¤¤ ¥¿¥¨®® ©µ©·¯«£ª´¶±°¸·°··¸Å¼Ãǽ¼ÃÂÈÁºÂÆÂ»ª¶¥»®Áø¸«®²¼£®±®³¦¨ªº©¡§°ª ¯´³«ª¶µ¬»¬³²º·¬¹°Âº¾¿¦Ãª°·¯©««¦ª ¡ °®³ª°¸ª¦¶¨¤¢¢¯°³«±¦ª¥¡£´°¦¡ª¤¢©¨§£}linbnoXQRZTACDU@;:IA7:XPd^PWWEY_^MLSN^LJ?Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=DFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[e@1747gYaF(@8m}i\V;{cC=¨¡©¼¡ª¯ª¢°·¨¤³²«¡¬µ½®³¹½»½·¶Á¿ÉùÄÃÁÁ¹Å¾Á¹°¶¨¬·²¼¿¿µª¯²¸¬©¯©©§»¥³«¢±°³¬ªµ³µ¼¯±µ¬°µ²ÀºÅ·«½¯±·¬©¢±¥¥¨£²©²©©²§ ¦¤´®§¢¬¬°§²ª°©¢¨£¡¨·©¢ ¡¦¥£ {gmrhqs_GYfVDCNXDZ9HB5>]Qh\NZ]H[_^NMSXdJKC]c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;GDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aU151=`V_8)C3YU\hK5zfL@¥ ¤¬µ£¬¨¥®µ¨®²¸¦§°·Å·±·¿Á¶µºÅ¾ËĹÃÁ»ÀºÅ¸Áº³´¬ªº·»»¾µ«¯±·¨¬¬¬««½«¯±£©±³¯®¶±¹¶ª¯²¨¶°´º¼Ê²ªµ´±´°¯§¡³¨¬¤±¢ ¥¯¢¤¢¥§²©¡¦±«©´¥®¯³®£§¬¹£¡®¢ ¥¢£¡{
zlnyov}aF`jZIHZ\={JGE6AcTi[M\aK\][RRSbaLKE`a`QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.+A/JGP[G3cXTLE°¨°©¬¤£®µ¨¶²·£¬³·É»µ»¼À¾µ´·ÃÀÌǼý¸¿ÀÀ¸À½²½®¨ºº¸·Ã·¬®²º§¯¨¤²ª¯»¤¬²²§§£²´±²±µ°·³©®¬²§¸¯¶´ÃŶ©µµ«°ª§£¶§±£±§©©£¥¥¤·§¢±³«§°§¯´¬¤ ¬¨ª¹¢©¥¢¨¤ v{nqxv|\Lel\KNc]>b{GI8GhWe[L^bMYZWTXUj]PPHa^_PKGQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=ELQ<3qjLED¤¤¬ª¥£°±³©¶¯µ«´¹Èº®Â½Ã¸³²µÂÃÎÄÀ¾µ¾ÁÀ»¿½´Ä©«º±·¸À¼°´´¡§±®¦¦±¥±µ¬©²°«¨©µº¬µ²µ«³¬ª«©¬©¹®²°Ç¿¸¤¹¯©¦§±¥¤£®£¨®£¢¢£¬£ ¡©¦¥¸¤«´´¤ª«©¬®¶®¢£¨ª ¤´£¡£§¡w~|}~rts~}\Scn_NYg\FD[G:MnXb[NabOVWVWTYh^QSMc[[UKFOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3De;6*HdHJ+:I?3CIS,>l@HI¨©¡¨¯¤¦¢³³°³´¯° «½Ì»®Á½Ç±´®´ÂÃÑÄſ³¿Âü¿¸½Å¨·¬´¹½À±¬³®¢¤§®ª¨¥°£©°ªª±®®¬«³»§¶°²©³©«¦¥¤®º¬ª±Ã¹´«¹©©¨©§±¥©¤£©¨¢¢¬¤¬¢§¨¡¬¦£¬·±° ©¢ ª®°¬§¨©£¡¨¡¡¥{w
ttrwl_Y`ncQsr\K;|F>WuXaYOd\NVVUWQ\b_SPOhYWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=398;*35>10485(5/*,.30;),,'%234$,2-860)(2=^K0.IgDF8<B05EKX1@]ANF¬§ ©±§¨°µ¬·´ª¤«ª½É¼±¿¹Ã¯±³ÄÃÍÎÿÀ´ÀÃĺÁ´ÉĬ¯·®³ºÀ¾´¯¯¬§¨ª±©§¨±¥³¬ª¯±®²³»¥¸³¬«®§« £±¸«ªº¶¤µµ¤ª§¬¬ª ¨§§°±£¦¥¡¡¬ª¡ ¦¤¢ª£¬¢¦±¶¬¬¡¥¢©ª®ª¡¥¤¤
¡
¥£|zuux¢xj^`nfWedN@gLDbzWbXRfUMVVVTO\]aUKOiWVVHJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<.2,&07XZ.0JgAA<<C+:JO^4DCJID¯¤¡ª¯¨§µªµ°ª¤«ª¨¼ÁÀ¹º´¼µ¦²¯ÄÉËÑ¿Á»¸¿ÀúºÂÄ®²µ²´¼Á½³²¯¬§¶ª¦¯ª·§°°®±«µª¶¶§µ·«¬¤©©¤´³©¨¤³´µ¡ª¨ª¨¬§«¬©¸µ©©ª©¡© ª¡ ¤£¦£ª¦´®§¤©¢£¤¦§ª¢¤£
£ t~xu{x~pqfgqx\atjO]VHmyUeVSdPMVUUQOX[bVIPjUWTGOXUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E23;:7*4:=+-341*8**+*,)*(/*&)%3;,$2)2/22%/3Rc02?f=NX?C,?LT_/Il8RF;¯ ¤ª«©£®²´¯©¥¯©¨»¿¼Á²°¹¢¶¯ÈÇÇÐÀ¿½»¼Ã¾»Ä¿¿¯²³²¶¾¼Â±²´«´©¥µ©¥²²·®¢¬´±¯±¹«¸®©®·¬ªª« £¡¶©¡¯²¡´ª¨§ª¢ª¡¡¬¨½®«®¡§§¬°¢¢¡¨§§©°©¢«¡¡¡¢£§©¥}
¤¡xt|twy{ut{k¤vi^elug|RVo^KxsTdSR_MMSZgNMWYeYGSiRR?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HO;YD3± ¤¥©£¤¢¬¦³²°¨¤°§ª¸¾Á¼±©¹ª§®°ÉÆÇÐþÀ¾¹¿À½É¼Á¸±°µ²º¼¹À³´¼¬¹¬£´¦¦«°µ·±¥¦¹´¬³»¯¼¥¶«©¯¤¤¬ª¨ª²¤³¨«§ª¤¨¢©§ª½ª´°®©¤ ®³£¥¥¤¥¨«¥¨¡ ¤©ª
~
£qzy}|hv|zuqr~jy
d_gcr
{mhy]^UAW{mTaPRYLLNpt]IZ[hZFVfPC>JODCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=;F]@*°¨¤¢¡«¤¶±±¤©°¦¹Á½¶±¤¹¬¨¨°ÂÈÈÌ·½¿µ¸Á¹È¶Âµµ³µ²½¹º½¶¯¹¶¿¬¢³¦ªª®´¶³¨¹»¨°¾²º ®´¶©«±£¥¨©£¥°¦¯ «©§¡©£¨ ¼§®°®¡ª¢¤®¦¡¢£ª¢¢¤¡¥¬{}£}yk}vxxbzzqoqtxkukgcgbnsmbjo`o@\ylU^NQRKJMTYVM\^mWEY`P^OHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R^>#¬§¢ §£·¯¡¯¯¨¬¸Ã»´® ¹¯«¨´ºÇÊÇ¿¸Á½¯´¿·Ä·Ã³°º±²À¶»¾·ª¹¸¾ª¤µ§¨©¯¬¸¯§¹»£¾´´ ·µ§¦§°³ ¥¦§ ¤¬§¨ ª¯§ ¦¢¨±¸¤±¯ «¡¬¤¦§¨£©¦¨¡ª}}|¡z}
|sp|qst_xwinqqpktezlgedbf`[rjrMMiXZMQLKHPSPGL[`oTFYZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e\FO=RZgH*?0]\5(¦¬¡£ ¶ª¯£´³©©¹Å·³® ·¬°µÅÇÀ·¿Á¹°µ½·¿»¾°¬¾°³¿²¼Â¸ª»º¸§¨µ§§ª¯ª±®¤»µ£ªºµ¯±¸¯©¥§¯±¡¤ ¤£ ¯¥¡¢¨¯¡ ¡£¤¢·°¡¦±««£®ª¥¨¤¥©¥¢©¢z~z{~z{prwnos^wwdlllkj
ogrijei]ds`[kviZJ^[YNOKHHSVG38^_lPEYVZeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDT]hD.<2dW,1¡¡ª£¡¢¡¶© »·¥¬½Å´°¯£¶°¬¬®´Ãü³¾º¶°³¹¸º·º¯®À³³¹¯¿À·¬½ºµ¥¢²©¦¨±©«°¿´¤§´µ¨²¼©¨¥©¯«¢§£¥ ±¤¤©¨¡¤ ¤¸©¤§®§¤¡¨ ©¢¡¡¢ª ¤©¤z{
|{
zw~|ltrlks`wthhjggphhhdfij`jcjh[f{b`StT\[RLJGIPT@!*h_iMEXU_`LJHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDh[JWGU`hB379gP'2¢¤£§£³¬§ªº¶¦¬ÃÁ¸±¬£¶®§®¶¿¿¼²Á¶°²¶¶¸¶¶ª½³®²±¼¾·¯¼»±¥µ©¤¤³¦¨Àª§¤¯³©¬µ»©©¬°¥©¦¤¥¬¡¤©¡¡§µ¦°ª® ¡ ¦ ¢ ¥¬¡© y
v~zs~~fyojjketskbgddvceffejjckr[_Y]lcaNiXZ`VJGHKMSW>9^lhHDVT][IJGFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>Hi[LZJVbf@:3BhH%5£ «¡ ¤²±¢²½¶¡±Å¼º²±£·¬ª©¸¼ººÀ±®®®¶¯²¸³©«¹±¯®³µºµ°¸½¬¦´© °¢¨¢¿°£®±¯·®µ¯¢¦¨¥§¥¤¢¨¬¯¦º¨®¢¡¤¤¨ª§ª§|s
}
ofymgkifprk\gcctbfgjnlgjjin]llrp`TcicfZIFMMOXQPUaeUAWSYTGIFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9A1-+.3<;K60.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC&4¡¯¡©±¯¸¿µ ´Á»¾º±¦·°§¤·¸·¶¬»®¬ª«·ª³·®¦²µ²®©°µµ°²µ¹¦¨´§¨ §«§½¬£®°µµ ±°¨¡£«§¦£©¢¤¤ª«ª» §¤ ¡k¢p£u©§¢ymjwql~
q_dag
ktw~gguheW\hsnMPicgr
h_efnmj]`aeNKD9GTh^JHQQUULHSapteF[QUPFHEC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=A@@=28@E=1,,08=G701.*.*/568,#1'214:276Xl16Ok[N\K[fb>G1Qd=*.¤° ª¬ª£½Å®©·Â·½¼§·°¤ª¢·³±²°¹¬©¦¬´¥¯´£©·µµ¨§«¶²´³¡¨²©¡£¤¥«¹¥¥¯³·¯¥ª®ª¬¤¡ ¦¦ ¥¤§¦¨©¤¶°¤£¢£¡ ¥¦ªsx
¡vif~sx o~}¡ }sulmieczlraS
mbliqXiqoY^i[ll[rnzr
fZ_GN?G_NFRVVQQRWUg]MVIRROFHG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*.(-4573%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(§«ª©§ª¿Ã®±º¼·À¿ª¥·°¨¬¥²´®®³¶ª¨¤°¥´²®µ¶´¦§§²°¬²¨© °§£¢¡²£¥¥µ½¦§«ª¬¨¥ ¦£¥¢£¤¨¢£¥¦¡¸¤¤ £¯©¡
±£¬yÔ¨ÁÆyx±¥·eÀ¿y
z}Êr»Åzrµ¦»{m±«°yhlX±®nei¼¼ngznrØ~Skc¶²~ss¡ªWOWbOVNFU[XQPS]W[QA]DPNEHI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>:B<?A8:J>52*22BE/.32.+/(-/186- /416A1=9Ww21Tk\O[M^g\>L1[]41!§§©¥¬±¨°Â½²µÀµ¶¾Á«¦³¬¬¨¦®³©®¶³¦§¥´¥§·³±µ«¦¤§°¬°¦©¦£¯¢ «¢³º£«©¢®¥¡¡§§¦§¦¡¦¢¡±££
¯kjª~fdp¦p®¡¤~x»}l¡v±_j´[¥eag{gkyk©e¾qg¦u±j{±xtcnm§n[¡EhfEu`~g|¤§Z`«hxyj§7J¯\XSld[KOX`\WV;NOWW/ITSJDFF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=03.33E4..53/+/(.0.:6/'$203B/>;Uv2-Vj\OYL_gY:M5_X30¢§¥£¤ª±·¬µ½¾°¶Ä±·ºÁ¦¨°ª®¨¨¯®£°º¯£¤²£©·§²²°£¥¡©¬®«¯¦¦¢¡¯¡¬¤¡³³¢¬£ ¡¨£¡¦¤¢ ª§¦¡ ¡
µµx
©µv³·~©k¦{w«gk±\«ztrx °vwqlll|N¤XHbb~ch¦_yruS^Q©mcq}b.Q¡o[Skh`LJ\eY\ZB>²{XXA#MhFCEA@A19>88:84;99<9:A:E::;6:CB8=?KNG:5:@FB@AD<FD;0201;F-0.940,.(/3,>831/2-D1=<S}n3+Xj\OXM_gX7J8aU50 ³¦¦¡¯©¨²¬©»¶Â°»Á¸·¿©¬¥¬±© ®»ª §³£ª´£¦²²§£¢¦ª±§¯§¤®¬ ¤¨µ¯¢ªª¨ª ¥§¢¢¤¢¢©¦¢¡Õ¹p°Á~Å|Ö»|¥¤{¤¥z¬yV¯z~k¹[ºw~¦{zªxz±nt¼
oP¯§ÅQ zc`ªbsrm`Sµ´È
|c¤3Bv]PjicP@XhZdaJHMqQ\QOYfZCE?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<9;DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7H:aP71%¢²¨¨¦´ª¥´©¤¼·Á°¹¿°µ´º²´§°¯¢¯²¥µ¨§¸¢¯°³´° ¤¦©°¨³¨£ª ©§°©£¢¨ ¥ ¡ ¡ ¡¡§¡¦ §¡²nhµq«n¦r´sr¶{¤¢~¡¦±wÒÒv\®{
¤oª¦k
}}{±qw³etogQÈZÂ\ yb_¬`usb^YÊo¿uMKµSUÆdTQjceXAPk`lhPVGJ9=URZWXID?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A?/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=`L620¢¤±£«¼¦´¦§µº¼²º¾¶µ³¹¸²¤´² °±¢«¯£¦¸¤±°´·© ¥¡©¤±§¬©£§¡§¥ª°¦¢ ¦£¥¥¦ ¢¡¡¥¢
¬{w¨v£©o§¡¢®³\r³R®}£rØ~x~v¯v´aemZ°XKuyf`¬^uwhk]¯wxl5yÈ®²_BTo^g`EPm`pmVVM.feiSYP;BE@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK96<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GB_H:99 ¹±´Â®¨²¨©²º·³·¾¸·±´º´¤·²³¬¨«§µ«¨°±ª³£© §¡µ¦¥©¢¤ ¢¤¦¯¦¡© ¢¡§¤¤¨¤¬¡¡¢ ¦©}}¥x¡ªp§¡£«}yo±Z¨ztÙwt¨¤{z²^d ~m]«[Zhgªcq{ks]«Z koeOJC¡\[Lt]bgM[a_qs_KW7JXGE=HGAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@5.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FH^B2?8£Á«´Â®«¬©¦´°·°µ¾¹¸±°µº¨º³¯¤¤¦¦©¯¨®¨µ«©®¡ ¦¤£¹¡¢« ¡©°°§¨¦ £§ª¦¨§ ¢¤¡¡¡ ¡ª®mr´s©u§s´xs³¤£¤w¸p{¢jk¶Z¡
ei ¢§nr´t~²j
ju³af¢ok]`M¡|Rs£ky~oq\¯V<wfTon.\§OcSkebmYc]ap{cT[S>=nq3CB@?L:!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¦¼¡²À¯««§·©·®µ¿´º¯®·¶ªÀµ¨© ¥£¡©©§´¢²§© §¤«¸¢¬£¢ «¶±¨¬©¥¤¬¢ª±£¦«±¡£¢ ¡©ªÔ»s°ÃÃ~Õ¸x§z¤¶u~wv²`ºyÀ}v¸cµ©}«©q{t¼§ ia¦¯¡~u«}¾os¼t²txnqn¤t½^w}Zay¼kZV\jy^j`fgcmxoY\ZC@@t@CG+4G"';?10<?7:B99=C4<@NZ^```__ZPPRKEFJ4HLR@JNEFOB=E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9¨£½¡²Ã°©ª¬±¦·¯¶Ã°¸°¸®À°«£¢£¡¨£ª²¤´¥¬¤ª¦¬¸¢¤¢¯¹²¬¤¨§¤£¬¨«¨¢³£¥§¡¢£¯©
¶·xµwmknsoy
tÁ»½{±¨ps¹}||¤»¹½ty´£twvt°ufj¶trqx¶^z}hynzc¬pu
X[§jEdZTf`c^cQggpluCNQLC:ZM?K2;/ 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O^]=+:VU'>;<¨¡¢À¥µÄ´¬ª¨¬ª©¹®°Å³²µ¦´¸¬©¡¡¥ ª£¬ª¥µ§¦ £¬¤¼¥ ©¡¡§¡²µ·¤¤¢¥¤ª¨¤¥¡¨¦§¤ª¡¤¯¨¥¡j}i¥wr}tyd{½¾ÀºoraskZ_ack`dnwcle^`bpir}gkrtx}b\xthP]n}{kXkzsJJopNtLEX]gaL[Xfc_O[muiqRQDEM;GI=M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S_V4)P_L(2=[O'?2>© ¨¢Â£µ»¶¢¬¥®§§´±¬Ç«¯²ª³¢½°°¥¢§£«¦®£¤´©¤ ¦¨½§¨¤¤©¨°³¿¬§§¢©§£ª ££§¬£ ¬£±§ °¤ §¡¡¤¡gm}qw¶«¡ z¥
mk}}uqxyvu|jstuev}wkozm_d]phMYZfj_WZoymmfUOFR9NYMRO(+:KB635=@A::C><ENSSTVWXZZ\\`bba_^^[TKCSGKNDGPLOI<:;389,2;810)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\J,<-@³¡³£À¡¤²²· ©¥²§¥¯´ªÇª¬¯¤³¤À§³ ¤¤£ª¦¬¢£¶«©¥Àª£¡¢§©¨³Ä°««¨ª« ¢¤¯§¢¦¨ ¯§ ¯ ¥¡ ®|«©
z£g¡³¯
v{}wyzofykuysis{vjudzf`jecdfkYk{oij]SLPD^TE@?>,4@F;45;>A;<?>>HNNOPSUVVXZ[_bca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T\Q05N[17E3[G5<,@´¡¹°¿¬«¯²± ª§²¢¬²¯Ä¯©ª¢±¼¢³¦¢¡§¥©¥¤¥²´°¥¾ «¢¡¨¬¬£´È´ ª¤«¦¨£ª ª¯ª¦¤¬£¯ ¤®£§¢§e|e~cymhk{¥«je}geeih{¢lh£wkj¢skmzzXf^^mv\hswvmwxsnytv|jY^lue]sik{pkc_RNWIdXAJ4>F7?FD71<=?AD;;DGHHILNPRRUW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO2YC;?.=¥ º¼º¯¬´±ª¥¨®°¦¬°»°¨¦£¬°¬£¢¦ª£¥§¨²®¢¢¯¥µ¸¥¢ ¥|¥¯£¨µÅ¸¥¢§¯¢£¢¨¨ ¡ª°«¬¤«¡ª§§« ¥¯£¨¢©}½r´rhx¹Ä¸q££z¦r«|ËÀÀ»q£|À½ÁÁ||ÃÀ~l¥²ooÊzvuyyqzpw
ymxbg`xd_eb^sglddYLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNQSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP.#F[3PY/UAB;/8£¹Ãµ°°Áª¨£¯¨°®¥²³®©¤¥¥¯«ª¢ª¦¡«¢¤¨¤¤´¤¢¥«·³§¢¥ ¡§¥¬®ÁÀ±¡©®©¡¡¢©£ ¬¯«®§¤¤¨¡¦¥¬¨£¨¬©§ª£¡~Îxz¤y_®^¨£¡|§s«¯^cª{¨
t³c« ³j¯u}·bZ£Ínv{Ú{p}v}ezvvk|n}
~m`qlph`_ye\qgjdg`RTRW]KOD5AHDD8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1ÂÀ¿µ´°¸£ª¨³«¥²ª«ª¢«¦®©¦¥¢¯ ¨§£¥ °«¦«°ª¨«¤¥§£¯¦±©Àdz¨©±®¡¨© °©¬«¨¨¥¢««²¤¡ª©¢¥¤®¥ q
u
¨q±}r¬¢¥v«}s¬v{|~ª¡}«{ {WÅ{pÁ}lupmeve
oawnronfpuuqagmf_ohingdWT]aZRSC9JI@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<(=1)3W@F!G:C1.+°ÓÆÆ²³¢£¢¢¬®¶®¨±¥¨©¦ªª§¡£¢¥«¡¥¨¨¢°¬©§®«¨¦§£¡¡§£¯¥®¶«ºÎ±¦®«¢« ©³««««¥£¬®±¡§«¥¤©§§¯ ¢¢¤j¤uz©tz²p¦q ¤`aR¬
®v¨
{
zf£¤£}©~®_|©V£z£{îÄr¯³³¹qb©¯Âthnqozxyplfferpf}jc]W`jXYUMMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+55*2PKL# A9D4,'ÃÉÖÔ¿¡«§ ®¢¯´°®©¬¢§¥©ªª¨¤¦ ¤¦§§£«¢¬¡£¯¡«¤´®® §¦¢¢¨ ¦±¦¦©²·É²µª«©¢¥³ §¬¥°«££ª¡²¡©²°¡¨§¬³¡¡¥{©lu«y|°o¥ Ò¸´·É²_`©¥ zxªÉt¤©©ÆÆyg¡¥t}¯]o´b°uK£m§Gd|qq{u~|n\fjsqfk_aYdn\_YIMMKEDAB>A<B?I;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ¨²¬¤¢²¸¬ª ¥¨¤©«ª§¦¦ª£ ¯«¥ ¬©¥§µ¢©ªµ±¬¤ ¥¬§£¡ª§®¢¦¨ª±µÃ²³ª¬¨¤¡£®¥¡¥¦±®©§«¢¶¬ °¸®¦°±°¢¦¡Nxz£}¤
¦¸{|y¹ÌÆÂ¶x¡~v¥¤©°
¬}c¦m¤p
|r¬`£rp`¼}RUt£{~v{sq]mnxrjo[d_joce]KMQTAIHFI:9K?B108866877-*5==?BDGILNPTVYYZ[\__^]__\ZZZYUSOH@882.,*.+*''?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤ª¸ª® ¬²³¥ ¥ª§¦§£¨¡³¯£©§² ¨¤¢µ¢¢¢©´¸£¡£¡±§¦¡¢°®¦©£¶³Å°©¬©§¢¤¥¦¥«±¢¯¥¦¯¤»¡µµ¬³°¶¯°¤®¢
ѵ÷y
¦y¡w ¥qª
µnri¤}s¯¦£¦nq²]¥tzl{|m©a¢qq~bs²¸hw¦}z}ynjyizsou^eeonfh`J[XX<HH@U4@F><*)63.013)&4:;<=>@CEIKNPRTVWWY]__^^`_][Z[XURRQF:223//++(@QRTUTSTVWWXXWUUUUQOQ[U%!2AH$)%s½¾¼¹´§¤µ¡¡£§¦«¬¦£¦¡¡¶¨£©§°£«£¥£ª³³¤£¨® §¤¨¶£«¤¶Ä°©«©¢¢ ¦¢§¦¨¨¯£¥¬¦½¬¼¯¬¡®°·©°¤§¯¡¦y¨}|°w¤¥m²p¡|¡¨¬
®
ª ¢{~«ªw z¯^¤}¦§d|rj¯]¤jp]`[ m¦||knctnz`gfqoihgCZa[=KU3U8BBC8$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZWSPONI7042.*,ATVVVTTUTUUTTUTSTVWWXVUUQHFIJ#((½¨ÅÁ¶À³¬ ·¥£¤¢ °°«¥ ¹¡£« ¯©¡«¨¤°¬¦¥¬¡¡¥¡¥¯¢©§·ªÁ¯¥¨¤¦¦¥¦ª¬¤¤©¨¾¥Áª©¡ ª°·©«¤²¦¨u¯~
~ºe°e}¡§¬°
¦¤¡¢
¡]lk³`{{±mgn±[~µ\¤kÈ¢d{»WvµY²}R®z¬W¡m¨|z ducxu}bkhrngfePUd\AV`>I(>9=4!",%2. *1/04579:<ACFHJLNPQRTWZ^```ab^_\[XUPNJGC553./@UYXWXWXXWWWWVWWVWXWWXYZZ[\XWWGB;Ò²±¶½º³Á²¢¬¦¤µ¨ ³³ª¤¡¶¡´¨ª¬°«¯§¡¯«¨¦¡¥®¨¢¥¤£¦¡£ª³ª½¯¤¨} © £©®¨¥¥¢¤¨ºÄ¥£§©²³ª¬¤¹«ª«©£¯¤¸Ãº§¬¯§¦«~ֽªb¤¿½}~£×»¸µ½¾m£o«lz²°Çi«°¼¬wv¡¾¼s¦ {|c~{egz|alfmkcQa[Sj\@UbCN)=:4/$%2 $(0496678;>ACEGIKMNNQTW]a\__a^`[\YTQMHC?=A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»³³°¿¸±¼²¢¦¥²¦¥Àª¸²¨¢À§¨³²º¨®¯¥¦°«®¥¢¬ £ª£§§¡©¤ ¢¬®ªº¨£|¥©¡ª©¡ª§ £ªº¨Ã¢¬¡©°²¨§¸¥¬¬svª¤¸d ph®nnw¤u®pq¨¤¯¤smmmfxonpzjqigrij
gqd]bjoY\f}v¦_apnee¡¡}wfxil{zemdhmcKdXJkZ;QfFQ'K:+# #,)-2.5:457:<?ABDFHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWWWY]^^]\\\]^]^][[UW^©¬³¨¹¸±³ª©¡£²ª¿³Å˾·«Á®¤¢© º£¤®¬¥®©
¬¦ª ¤£ ¤§©¤«¢§¦¨°»«¬|¥¨ ©£°¦¢«¹¯¿§£±¤ª®¯¨«©¥µ¢¬¶¡©¦·£ª©³¢ª ²¢¡¢¡¥¢¬§¥~g~tusp§lz¢¥tkwrxx}zjmfepeU`Y@j[HdbPY+F=+'!750.!%2(*699469;>?ABDEJKKMPPQXUWY^`ac]^TQKEC>9=@ASX[\ZWXXXXXYXXZZ[\^__`^^^__```_YY`¦©©¤´µ®®¢°£ µ±¬È¾Æ»º«£¦§²ª¤·§©µ§§¢§¬¤¨£¨¨§¢¤¨¡¶»§ª| ¦ © µ£¦ª¶§®À¢µ¤®ª§¦°¶¬º¥£§¶¢§ ª £«° £°¨°£ £ª¬¢« ¡~e
utwsj}£¤
}tt|s|jof_qj`[`ZndPafQZ:GGE>2=>9/*&+)&&3166589==?AACIJGJKLMSSTUZ``iaeVPKACB:9EMV[^^[Z\[[[\]]^_]^_`abbaaa`bbbdb\[c£¦¢¯±«®£©¦¬§µª¤µ½°£¤|¤³¥¦±©¸¦£ª¢®¢¨ ®ªª©©¹¶¤¥y£¨¸¢®µ¢®®t¢»¡°vx§¯¸t«£«d\bv ¥}m³¢¦ª£esyq©m£¨e¦
wjv
pz
`hZughs|¨f{
zjpzkqf`wplki\ffbcqT[>NNNSG>@UD:1/&4:306678<;>@AAFHBGFIKMSTUY\`hfgWQJ<DG<8UR[`ab`^__`aa_\]__`aabcdabaaedchd^]f¥¢ ®¯««©¥¨¢¦¥«·±³§¬¨t± ¨«§¹ ¤«¢§¡
v§ª¤»³§ uw¡¡§±´³¹¥}§¢y ¬´¥±ª¯¤z¬
¡¦¨§
w¥z§{³z¡cz
mpyp}
s
wht t}£ kly|rqhfypjlk\eljgu]^ITLR@E6.[UU7)!09>>743468;:=>>@DI?IEJLGSX[Y\bahfYQH9EL;>aV^bded`aa`bb_]`aabbbcfgcba`edcgcaah¢¥¬¬«§¬ §°¦¦©¦¯ÉÀ²¢¨ª·
§¢ ¾ }«¢ ¡
§£¥ º±§
pv ¡¤«´´Ê¨¬¶
¯®«¨¦}¨s{w§h¤y´ ¥§Â«¡r¥~
³¡}¡¡}
ms
~yq{tÅf©£k
¤
qjyv|xhivqhhl^dpmgnYgG]QM3E57Nbd7&3<EGD:64658;8>==?BM?NJJLCPZ]\Wb^jm\QE=KM@IcX]cfhgbbbbdc`_babccceiicbbbecafcbbi¡¯¦§¨¥«¤·°©«§ £¥¬¥¦¬¹¤°¢©¦¼¡z«¢
w¥£¹¤~bm ¡§~¡§ ¨¬
£©¢ukvM«x§¦©«}¡{z§jlg·~n`dY|dhr}yl]}n_Rp\_kx_Xd|p§ªk£nr¥p
jg m\p~gZ`cXQpwfnvtljp_kqnljYiO]XF9A5HE_l5,IDRMN=84859;6@;;>BP>QRLMBJ\]_W]^cv`MD:MONTa\\ffiibbdbddbab`cdcacjkdbddgdbgeach¸©£¦¬¡µ»ª®£¡¢¥®¡°¶¤©¢¡ §´u§~
¬¥ª¦±§¡in£¡¤¢ v§¥~
§ª¥x|~¢ps|ym¨{¢sv¦f~w¤_z}t¢n·´ºtµ¨dƸ{p¶r£cs¬«`|i³~m|q£lr£t
¤`´s}³ut\²kcpuxripYkmtsg]j^bLE=D6RBZs3=SG`JR=<395::6D;;@JP?UMOQ@E__[ZX``|dHC8MWUWbaZefkkbbeadd`ab`dc_`cknccddhdbgfchh¢·ª¤·´¬ ¢¤¤¦¯³¯¢¡¥«y
q }¨¡¤©¨¥~j{~}¡w¡q¡©£¥¨|~z z£xt}¥
¢d¡|mho{§~sit«tªh]
v
gªk¸f\¨o`^§vu~guoo¨^©y¼lª\]´h]or{xlj\qkzzd`gXbBQFO7WDRo5K[[_NZD@151<;7H?:CHU>YRY]>Db^V`Qac}jEB9N\^YdfXfgnmbbe_aa__``eb^bdoq`deekecihgki©³¦c«º±°¬¦© ¯²©®¥¡ £jr{z¤©£ ixz¢ rhp© ¤¥{°£¢¸w£³£¤y{«~¢q¡|
¯µ}k¡y~µ£¤«¨|}tªZ]o{xbL{z
cyBLX¢iq{lux±³§wnt~ptk¤^vHedatrofaliw|eebQ_W^UW@ZFQhETW]bX^ID=B8@A:IF8LEXAWR[WDFb\Z`K`m}rEB<U_bZeiVghmobfg^aa\]^`hb_edvl]egfkdeliiki¯¬S^ ¦³¹²²©£¬ª¢¥£© ¡woy
|r¡s¡ª|l
q¡x
|£¢}µ{¥y©{§hwm~t¡sr|p®}£¥£o^¨gu¢co¥aÓ}{xstb¢£t¤vk³`sª²¨¼wm~¿¦©´]m{pmr¢q]¤gs¦`h¦mÔ}p{{l}xsn©¤gafzr
lhfeowxiacS\gRRbHXJUaXT\fk\eQECKMJKBKE8O@QNXSYOSQ`fejRdwywIFEc^fZhjTihjocjg`c_]]]_hbaie|d^dgdkdjlfhlh¯«T[J~©¯±³¯²£
ª ¢¥¦©¡«¡{p}h}wol|¥«yvnw£z¢¢³¡¢¶y¬§¤®¥o¨
z¤¡r¤®¯¤ vµ¶µÉ¡s`©mz¡u¢w ~pMf£ps¥{ytak} kqd_q}shzi³µ³Æ¦r}zk«v
nxyj|vsQE}³_jwlzgkhcuvqoW_TYiQSiJWMYTV^iloVgWMKAJMKHKOBQKPecjmetrsy|nu{{TQOl^i\kiRjhilglfce_]]]^ibdik{_]dhcjfomeile ®¥d?¡²ª®¯µ¢¢ª¢£¦¦¨§zjye yui
z§ªz}xp¡y ¤¦fnxl¢d{p¥wpe¦z¤ysw¹n¢b} mriªku mo¦`iiu¢~`uobh e~iuocfmq¢Y^Zb¡l]mz}sqd¥mx¢dg§hsp¢pUp `f¨U^TnntlsnqikytkpRYWWfZTmJZP]IXiisjYkVQRFV]LXSbUik_xt{}p||r{svv^RrbgbpgPjhhllnhdg_]^]`jbjivt]\chcjjslfkmc£¥ydsl¦£©°±¦¬§£¢¤£{qh|su~{e|¨£~ri¦} ©¥¦x~¥±®¤v
x©s¥n¤¢»n}¥¯
|¥zr¨ g~o¬dw¨mª¢vx«¦k°kv³©k
mm_}«ªv}~¤v|¤ jx¬h®¶ux¾¤Z§«avsur|uqckohmTW[Vab]lM]R^J^mow`[qY\`[guenorbrt`xz~yrys~{{vbxddnsdRkgholrjfia_^\akbllzo\\bibljwmglnb¤©£©©¨¦¤¬¦¦«
t{p
~ttrn
}|§§§
vnl©©¢t~x®¢~p
v}{r§q~}zy{~v {}k
[yyrzqin~ruqe`wusuoynml^ugwe
§}t{jpv}wnnitz|x
\lXyioxsspxxp]lojhW[`W]fkdWcU_R`pyymkwgjkkw}rsusaovbt{xuyvy
~{nldyn^Vngiukxjiie\`ZcielqtnZ[bldllynhloa¶§¦ ¡¦£¥«¢¡¢¨ªr|}~{trq
{|
y~¥|¨¡
vr©¦ª~~¬§¥wnxn}¨
q~qkp} hl\sqtkwtYrn~i]je{`iy{{u
gwj`oqu^q¥enwqzqhif}{[]khnv\|zxvotsh]nllcZZ_ZYmr\`bZ_^ft|vpudkkk|~s|yudnuhm|~vz|{yz~o
{}t~ysiT\qilvpugkgd]aXjhkkqrnW[enlgsyohjm`¨¯ ¢ ¨£¢~® £¦|}s~v
ror~{
¡¨¢xy ©¡¡£¢© ¦¤
yv§~²¦±¤k|wxe|
w|zt ~}tns}v
£}zn
~zksiatq~{wwpwu]^ohna_Z]]SiqVe]]bmhv|}topekji}nyrjpqmg{sx}
zm|zx{}zyNdvjsnpzekecb`[tepgrqmV^ltmhyzqgikd¸¡ ¤ |¬¡~y|nys~mk~z~}
¬ s}zª¤¡
¦¤~tz
¥{}«¡©~pxru`u
nyvt¢
s|{qpzzv¤w~rn}oilnh^zh~}wvwu|x]`q~nuad[]_RgnTf\^bkiw{rlmdkjhltlmupzpynv}
vq~{|||`h{juiidjc`i\duhobumlUcqyepz{sejmmµ ¢{y§¦z{}n|ys
~}kh}|}
}©q ¡
|§x¢~¢ ¢|w ~|¤¢¢¦~~utqwa~r}rixrx~r{{owzyx£zv|ht~z|rmlh_~si}vvu~sk_atwqxedY__RkiVfZ`ahjwzrgldlhfkn~horly{ls~tv|{~irntiahlb_qVtoln`xhmWjtvcuz{rbjoz°¤¤ |w¥¡£y|r{tv
~xgc}x}y¡p
¥¦
w y~£wv~s£¢¡~|vq~n{d}
ql
fvo{
|x{{zp}wxvw|xbzzuxhmfbjkxtuw~r}ddasnusnaZa_[meSdYaaikvzrckcmfh}liuinpi}znrt|~z~|mvsumeljbbuVipn`xglbjvpfy|zq`rl
¬¦§~xª{y|~}|xtzzt}d_}t}~~¥£s{¦ r¥qkzo¤
{zqzlul|~nxp~erj{~tx|tv~|{¡xt}tu
qc|v{r~pbpde|copwsyxtubw`plvnp]\`^^k^Q^Ycaint|l`jejchwngmikmh}{xos
}t{}z}}ryxxmlkh_ircgqoewgnlazij}{xpaxm©£¨~x¯~w~|}|wxput|p||a\~rz{§}}£m¡ lezp£}{
tsvlqnv}toqu|}fqmy||tsxm~|{¦z{}w~qpfizuvq|c_qakt_qk{zzmsqfz^omsmsX[_`bl[QXYecgqrg]jigbgqodjheiizwvo
t|ux
|x
zw~{{sxjk_phtkromrgole|cnzvqlww~¢¡§¡¦v¬¡t|w
xyss{lsp{nvop[Y~vu¡¢y
m¡h¡e~w~}{|ovplmoq|jtqwuzgsnuzyyusozx¡{uxxnk_tutrry[_qaqk_pk~|qnnknwappkrmYYbaboXQT[fgcup
c]kmdbfkn`gg_hkurspuyvx
xw
|{wjqc|c|nqmtjholvx`qy|tut~¤¬§ v zrxupr
trwlpnvmv~mmUQªw~wr{¢y{£{r
~|f
f
qwzz||kvkoklm{az~w{x}zhtls}
{qyovyx|{zv|vpjl{ayqomstV_pcrb`mozripfguuirlbwe]WfaasTQO]ge^yp}`]irbbffj_he[gp~plqt}v}uv~y{
xs
{zxfqk`}ookz`jnuu_t}yxts
}x °¥
wtwtqp
tprpljwnn}}mtsRMßÈÖ{pu
w
¢x|s
¡~wz~xte
k¡cqz{y
{m|erokm{z\z{~{{isjs
|l~~m}{x|uwxrmgq
nkupjkvnT_pepZ`msyhlkcgysqqd`xa`Vl`_wQNLbgc]zqv]\evabfedagbYissnkrw}tzuv~s{r|~vesn|e~oplYlnyys`vz{wswwy®
w~}
uxpyqo
pmoseeyq}my}jhkc¤ÁÜ®ð rlv
w¥o¢r¢
}ztwuul|¢
^m{}
v
}~k}dxvkoysX{zzfrikum|x}trwusqguzcunqckwhSarhlV`ouzasd`iqso[dsabWn[^yNMMegb^wtn\]ey_`ee
`cc_Yjsknksx~twxw{q}~{t~shuqyl{ntqWqzvyrdwyiwr§£}qxy
¡|{sxptjpljm}u_ayw{qu{g`d|ëÚµÉÃÜrltwkq|{
uxr
u}n¡ai|}q~qwhvsjuxlZ}~
wark~~|mkwz{}mpy
tkqkryaujp^lwaResifS`qwuapa]hrtkXhiciYnW\vMKMfg^bstk\\ey_^dg{ad_]Ykoenjtx~st~{vzs
}wv{ulwvyxtnx{}Xzqogxwdvp
¡¢toqw~} xrtnodrigmxx\`y{{qqiagaÕ¶¦wnqx}rl{i|{}zszzptt~~b
g|~~m|ulmwutwvlc}
p_qo{{~zpey
z|}mny~umnjl|dilkZnwYSjsibQcsxmcf^Zk
ouc\h_em`oU\pOIOgf\hormZ\cs`[clwee]]Zlmcmjtwqp|}txx
}uy|voxy{on{w^tmiztsgs|q vvmw}w}vqoljau}gbjuzZ`x|zlp~ecggW_rt¾Å
xrtsj{|}|~t
vv}quq~sz
f}r}g}{y}i}vfpyxsxtlkzk^pvz}{~rhwwz~|mkz|vtohh~xe]rcYqtTTosibNhuyga^]XppuZec^knaqPZlSDThbZlon|pZ[^mcZcowdg\]`kjcliswqo~{tuz|v~xtryy~oo{qjyz~nm|vkjxtk
o}vjyyoysqljd`t{i_fr{[as}zfpzaed±²wKcZ¥ÛÒs|zol
yy|yxnqs}{jy¥~n}tw
pz~nxh
xr|e|~vcqsizqov}xy
{k\o|r|zqmo
qwvll}~vzehjraZx\ZrnOXrtg`Knwub^\[YvtpXg^gkr`oOXiS?Zg_[qkgzr\[YleYdqy_h]^elhfkiqwol~upzv
qq{
|zyukzlp~u~or|{poxg¡gpgz
|ixrllf_aozn_cpy]dlz`pv_deÕë¾3:>szx
nm
u|
|xnv
vmkt{uey§|m~rtx{y
lrixm||wayrdqinvrutv~sp[k|swz|xypjpw}}smjuuu\iiyqYW~T[rfM[srf\Jryq^\[Z]vvjZb[hfodjNXgR>_f\^vf`uq[YUodZeqy[h^`fmhjkhpx~mjyn{}{v
pnx}{{i{~jt|r{sw~zx~|km~li|~}kuqgic[cgso`bluahpzass^bd n]6[°¶ukwuwpm
tyx}zsgu}|no
}hvynez
¤}m}t}{
|q|~|i~mk{yjzwr_w~rdrhvnu|~pxz|umWm}us
vuzwrlq}{|ymmhltn\hfurR\|O]r]O\spdVKtykXZYZarvb^]agdijfOZiNAbe\awa\unXXSubZeosXj_bhkgmlipw|li}}p~|{wq{orw{j~{nxyvw}x~~zm£
{vykm
y~|~prpcf^Xg_pp`ahqfjotaso[acjv{¿¨¥Ê¹rt~zurspzsutwyyqcv
xhqvfvucj|~|q}rw}v{lyzuh{ilysizv}g`w}kjth|jv|r}w|ubUu{qr{pwwon}|w|zstgpgkqo]hctoLfwM_oVUZtnbQPuycSXX]brt]b\ieedleQ\qIDeb\dr_]xhUWVx^[fniWl^ajgeonipwzniy~s{~y|v}pwsnw~q|xzzuxzun}~{w|huz|wgpn`e\XeZnsaaaqmlhn`siX^cmw©Ú©È³szqw}{utu}vopn
txul`yxdqngum[m}x|wzl
s}r{nuwmhwem|vmkww|`bxzhuvc~|hu}vwr{}nZVq|os
}wksxjs~|y{wzqzrfrdllsZj`vfIooM]cXWVynbPSuwZQVX^as
p]acned^ocU^sGCg`^gi]Z|cRV]v[[glbWk`anfflphpvxtkvwx}w|u}oququ~
{wx|}
x|}}{~rux{wuz^~yt
w{bnm\b[[aVjtda\hopgqaqfW\ck|Êκ¢knonss~{
zytyttzjlvcvvpg^|xdqjjqcXm{rv}zmop{yrrp~ghrcnxqjlrx}|y]dyxiuygwhu~skpyn}]Wo|lr}zmnpvfv~~tzoyr
zwpdq`mkrWk_y]IplNXV_TU|kbOTvsRRTW^cvj^akkfcZobYdqHAi]ag_\V|^OVfqZ[jh]Xha_rfjhqgqsvynu{x~yut
po{xwuz
z|u}~~}|xvyv~}nuzdsp
zucnjY`Z]^ThseaYdrrgrakeWZ_ix¾®{ ·ncuiv}s{
{~wxswnzvejo`usjb^}vxep}gkkZVox£
ppvsl~r
}yuspizajmamvjgkkywzwZf}}xer~n
tfvqhl{umub[mzjryzet}mpgt}v}~pzjyywvodk`l}lmUj`xVLlmPSPhNY}hbOUvlMQTU_hwg^aqig`Wj]]ljJEk[ceWYVzZNWokY]le\Zec^ufleqgsptxp
vx|}vtnsy{{ss
y}v}
z~{w|vvzjv~}m
rq~pflgX]Z\[Teqe_XcsuivpeecW[[hporsefzkvwtu
x
zwtvnjzpahkgtnf^^{my|glwfjdUWsp¦|{vs{qzxlyyu|}uqsmhu]mi`ludggizo{rYgvuhpxvbw
}oln|qfse`jxfpuy|atvikpsyoyxr{e}}}vumbd`l|ljUibrTLklPMOpH^|faNVueKOSXblxf^gske`WdXcr^LLlXdbUTVtWMYweZ_la\[de_vgmbpjtoq~utxx~z}v~
nrt|{tq
zvt|
|~z~vz£¦y
lu}|v{osz
}uojieV][[ZScoe[Yat{jhmh`aX^Ziilohmbi{zkuuupz~wvnzhjyj_enhwgeXavh}xnioff]UXoh¨vz|xtn}mqtx~wtvjtwhio\me^ns_gbjxh{m[mrtjo~zxbw
ytspzrcqh[mudoqzwarpgiwsqkwvsuby|utocbal||kkUibgTLniPHSkFbyfbMTr^JNUZfmx{f_nrjd]VaVooXKTiXg^XNVlTK]z`\_l]][bf`zhlaoovnowuz}wyzyz}qst~zvt
~}ls|
}{v«z
lq{vuon}tjpnedX_ZZZUbkg\Z_ui^ml\aW[\kert}jk^mxwivxso|~~zvrlzhiwg]dshzwcbTcneuvfhiaWVYhd§n~wypn{ewmyzvq~ndwtehi]lb^po[h_luezh]tnrkq{vvcu|ysv~taplXpqanozscqlalynihyxspdsxxsoc`cls}ikTh^_ULudQHVbHcwfbLTqYKMXYilw{eenrgcZX^YxgUJ]dXiYYIWfPIcy[^_m[^]bd^ij`otymonvyr}~vvx}suuyzz}
jt{~~z{~|sq{|~fq{t~}wspl|~mzcppbe^eVZYWdfl`]]t
hXpm[^XZ\l{cqwvnc\ouuivwroyzwnotehte[gufvvy_]Reeis|abi\TX^cd¤hxt
wlmxfvl{ytry}yifwmaga_j`^ukYf]oobze[w|knopxytues{wps}raxcYnn`nozreqd^muhcfwzrlmsq{qpa]dln|eiSgYZUNz`RKZYHcudaJUnUKMZWjms{dlmtcaYZ\bx]TLd^YjTWHYaNHkwY_an\\_bc\
ihbnxzmojvym~wuttrvvx}}~~px}ywy~ssp¡{{yeuzsywluply|ps^poahblT[ZWidnf\\reSrn[ZYW`lvcjukk_[ournuuuk}|wonldipc[krdtvs\VSc_p~}p\ac^SZa\derq
skixknnyyzqvs{z{dfvh^b[ah\_whWb_phawa[|vjjrnxttuiqvtkp|lfwW[ilaop~wseo}[`opb^ip}kjr}povin_ZdklzafSfUXSQx]SPYRHdtbaGVlQIPZVlll|emora\ZXZmqXSQgWWjTUFZ]OIsvY`cncYaaa^jcemzyloivy{k}|y}nqnvz}t}tx
uspvo¢s{{fwon|pgyr{lsvsk^tobgfkS^\Vhbmm[\qdNom]VXUfishcuee^[pwoqvvzl}}wscdkoa\nmcsxkZTVabv{{o\c^cSZ`Zccnp
rifxmdruqzkytuo{v_gsd[^WbdYbueU`amdaq]\~ohisqtquwlm
}rsgo|oqoRZeidoq~trbluUbqjZ^nd{dkt{pqqhl^Xcijx^eSdUWQVoXRWTPHes`bFXkOIXTWnie|ilykbW]V\ueTSXiRZgUTI[ZPNyw[_emiZba_^nbgkyvnoivv~l}{krgs{u~s}
{ss}un¤swxnz`e}qgztymmqwgd|mcggiT`_Ug`mp\^nhMil`UVSogskfxef^Zrvns|ytn{wzykaelm^`ojeqy~gZUW_kvzyn^a]hVY`Xdbkp|vkiuk[upjyiurno|sYkn`Y^VbdXeqcT_biablZ`~kfltuomxwlh|nqfp{lqlaX_gfmqrr^ilSepdUbmaxaotztinji^W`fhu\dUaVTOYgSO\OPIep]cGZjNJ`LYme`xioe`U_U^v\USahO^cUTK]ZQZvv]_fmhXca[^qchjxqsmgvtysz|zntlst
z}{rstwqn~zz|~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z|}}~}}~}}}~}~~~~~~|z||}~|}~}|}~~}~~~~~>.1110/o]-0000-F¡¡¡¡¡¡
wegfffh\CDDDDCGdhgggggkonmnnqJ+....+H
}}{{z}~||~}}}~}}~~~~~
.h
S7¤¤¤¤¤¤£r]____aR4555549\`_____egggggj<;|}zzz|}{|~}}}~}}~~~~
|y{z||{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wwx{}|{}}||}}~~~~~
}{wvw{|||}}}}}}~~~~
}|vvx||{|}}}}}~~~~~~~
}wxz{zz|||{}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~
rtx|||{||}}~~~~~~}~~~~uxrvy|}|z}|}}~~~~~~~~p|tssvx}~|y}|}}~~~}~~sorx
ty}zxurkeimolffggpsswy}~yz{|}}~~~~}~~wm{sx{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||~~~~}~~~
sno{uv
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\YXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwtb^d_akqfhklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFEEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhb]jl]efgeccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFFHIJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^ZZjwlbnrjbYY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROM[krkamtrfQQSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMN]cokXisupSMOPPPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKFBFHUbglopomlZLLNMNOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHECFGHMZghgrnnhfd`^^XLJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>IZ]Z\elnjommlkihkdSGEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;=K[imnojomkjlmfQGEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;:=HcosmnlklhUC>CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtstrqtxxy}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99=J`ssphT?:;=@A@=;;><=<@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyz{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;==><:Bl}j@:;>=>?@@@??A?@@A@@@=??=<:;==<?@@BBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;[n@>DE?@AD_d;==;:=>AA??@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJKHVppqssttuyz{||~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8::mwH8;:=>A;Hd=<=<8:;@?=<=<<@==<<>;=<=>A@BA@@@BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII`pprrrtuvy{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR=<=ILFEuvN788:;>?WjA;<<::;>>>==79?==>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CrzJ;\z|wW<=?==>EhtL:=>?==>NSURLC@@?>A=;?B@BCB@BCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGEE?AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAGrzkb}^>@C@@=Js{Y:=AEBAGfhlha_OCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Ent}~}vMACE@?>Y{]?CEIIIWjjhihfgODGEEEDECA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z|{}}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEDCWu~XGHJMMSmwpimoqeKJIHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqruvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLNMTrxxrnoolMGIGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJHIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl
|PLMJ[wzqnmmlKCCBCFFEB@>>@AB@BD?>?DFHDFGIKIJHHHGIIJJIHFJJJJIJIJJJFILLJJKKfoprrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLKJT
uJJG[ghjfiszqC=;:<AA@><998<<<;>;8;?AB@ACCB@AADDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJIIe
gEVdjlaelxe796479;<:8567789787588;;;=@;999=<>;<=ACEHJMLLGIGORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIh~eboplhkqmxQ3873568:876565676767:67889:7578979866:<@GFIGIFEFOSRSSROPPRTepqsttvy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@6788=:=ECBe
quvppupjnK488557699776765:9:::;798987669:98878589;A=>>BA?AKLOQPQOOORWkqrttuvy{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=q
vxwvxrmmJ8;<9:;9:;::9;:9===>;;<<:>;9;;<;<;9:<8::::999<?<<ABDIJMKIKLWorsusvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
ux{xrqjHAAB>@CA@>=>>@???@?@==?B>@A?A?=@@@>?A<><;:;:9;?=;<==AACABCAXpqtttvz{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<<::;==?@BR
x{zzkWLHHHEFHGECA@BECCABCB?@DHECECEDAFDFDEFD@B>=@>=?@>?>?>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD:7:>:<;>???=A@CDFW
~yzwYNSMKKIJJJIEDDGHFDDEFDBHIKGHGFHGEKIKIJKJCECCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLKABBA98<>;<;>@?A>BBGGIY
zzu]QTOLNKJKHKGDGIIIEFIFFELLMIJGGHIJNMOLLNKGFGGEECFEFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@87<;;=:>@>?@CFIIP_
yzt^QPNNLJIFJIEKIGKJIJGGGKLNLLHHIJMQNONLOKIGIJHIDIHHFFGGIGCBACTnpuwwyzxyz{||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADHJLUq
vvxmTSPMLIGDHKHMLGKOLKJJLMLOPNHIKLOQQPQOOJHJJLJKFGHGFFIFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
dgmYXUQOMLEFGMPOPWUQPOQSRMSTOMSLPSUVRSQPLJMMMKNHGJFEHJEDEEBECcpuyyzzz{z{zz|~}}~}}}}|}~~TFFGGGGHF>@B=?==B@BBGVNFNPPTX{
oacodHUSSRK;;STR`u]UVTVYYRXXRZfPUWZ]RTWQOMRQPPQLLKHHJHEFIIIHIirvyxyyz{{|z{|}|}~}}}}}}~~~SHJIHGGFE??AAEACGEDELXRMTUVXZ|
~asbjY>[[ZUR?@WVY\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXUTVTOOMKLJIILMKOMSotvxyxxzzz{zz|}|~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~}ts[^^]TUSWWV[[uYU}a\X]_WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPQOQSTTXXYZ[n
nj]]^[VWUXTSXVcRerXZW_hP`f[[X\gaGOZhg][\]]WROSPPRVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPNMKJEC?@;PPZZ[SSQPRRRUSVTW_ux
~}`UY[VTWTRRMPMLfz[]TYUV]ZLTZUST^ZXWWWzjX[\\^TQQPINOWVX[Zdprvvttvxyy{{||}~~}}}~}}~~~zxwvsu{tk~kry^[VUSROKFCDAM^lVRSNOQOQURSRRUcdv
~zpsZNOQQMOLJKEFIFC?TdURQQNKQTQMOYRMNQSVUMQSRPOMLHCIHRTUZ\lquuusswzz{{|}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVQLILIaltPQSNQRQR[RSRQRUTas{|}{{
va`PHBEEDDDAEQCEAC>CIGV@HNLG]iPHFNFDEFIGHBDHGIKGDBAD@OQMSdrtvustuz|{{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSPUYSUQQTROV_klrv{{xyurnstsyx}lOIBC=<>@A@@?kQK`EFHIEB?GLNGMRUIBE?><=<==?=?ACC@?==B>JNGUnttustvxz|{|||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^JJPPNKLQRQTUUWQQWUPX[a]agmmlokg`nrjmlqu{z}{xz||xwxeEBBC>;CCBBDB\]O{NOONKLMOOQLKMWMHG@B<:77599=;;;8:8:?<BH?\stuvuvwy|||}||}}~}|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP_]ZIHPRQOMPQNQRTVXSSYTOYZ\WY]^^_e_]^qvk^`gkwooljonnlebYHGHHCBGIFFFDMROaWSWQPSSRU[OOQVPMICF?:96587979:365795<C>essvwwyy{}}||{|}~~}{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`VW^ZXMKTTSPQUOLRSTWXTTYRMXYZVXXVXY]WWXhsk]Vatkaa_^da_^YUQNOOMIHJLJIFCQPSZWTTNQSYS\eUOSTRNKIHC?A999897885757859:Gnqtwxz{{|~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTVUUUWPSTWTUR]n_RNZ`[WY;DVXT[fJLPSRONMNNNLJFQPUYSTOJOOUST\VRUSROMLIHHF??<:787659967675Wppswyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\]RTZWXUTWTRXXYYYSUOJGOPOOMRJOPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPSMIMKORPRRSTQROLMKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqnhihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHJHFLMPMG/E_R>3?>joaSRQ@GTQPQPQNQOQPLJLLOPNNPQQNPOJLMMKGEECA;=<<:=G6677Dmptvy{{}|}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]gTQSAGUPOQQPMMOMKLKLNOOQLOOMHLKIKKLKGFFED<AA>;@E;<89Sprtx{{{}{|{y|z{~~|{uturvvz{xzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONLQSLTUTWWULLKI<987;>@><=A@B=>EHFCEFIGJJ@FAA@FHEJOHQRb\RPROSOOPLMOMLMMNON[WKMQOGIHCIJLLKFFFE?BC><BG?B?Adpsvzz{{|{zzw{wy~~|{qstprswsxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCD=9779?B>;?B@@>@DJECGGIGIEBB?>=CBAGIDMObeQMONWKLNKLNMMLLONSdNJLRIIIEAHJLMNJGIGBAB@?EFEHDKnovyyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGMMJMPMPOHJD?A=989:?B?<ABAADEGJFDHHGGHCD?B??@A>CECKNRTLJIMTFIIJLJKLIJMMOPRPJGCLGCBJILMONIJIGCCCDHJMLIYrmwyxz{zy|vrpurtxyvxjqnjllnttmtu{stxrompovsnporpopstyjN`gsjt|ygosqiqhdqHKDGHIGJKIJKDFB=>=:9:;@B?=ABCCGFIKJEIIFGGCC;A@B>@@CECIMPHHKGHKDHJLMHJLHIJLKM]RHHDNFACJJMLPMKLJKFGGJNNQNLbmivvwzy{z}rmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKCFFGEFFGEGBC@><=9::;@C@>ACEEIEIJLFIIGFFCB;ABC>@CDCDGLNHKNHDHEILNMGILGFGIILNKIGENHBFMKMLOMMNMKIHIORRSNRfffrosxv{z|lhjnekqlspfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGIDFFECCBE@DB>?>:;;=:<>CA>ACDFJFIHLHGGGFEC@=DDB>ACCCEGIIGMQJFFGKNOKFHIFEDEIJHKIFHOKCILKOMONOONJJILRUUSOWd``mgproryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHEEHCBABD=BA>A=::=?:>=@B>@ADGJFIFIHFFGDCBAAFFCBBCDEEGGHFLQLIOJJMLIGHEGEDCIIHKJGKRMBNNLONOOMNOKKKOUWVUSX_^\ianjnhrsbdfedhhfnjfmmhkkmriqvtsqmvnoqrswsrstuvvvvwvwwvtwujsunutsqrkkrMGGFHBBADE<A@@C<8:<>9?<?B@@@DFHEHFFHGFFDCECDIECFEBEGEFGGEIMKIQMJKHHIEFHHECIJIKLKPSNDQROPQNOMNPMLMSWVXXUX]Z]d`icjigk_defcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqinyMHGHHBBBFE<?BBD<7;=>:>:@B>??BEFDGDEHEDFCDFEFJEEIGCGHFHGECFKJHNKLKHJLFIIKHEKKLMNORTOHSTRPROQMNQNMPWZVZYVZ]YXa`a`^hec`dehgjhhifhnllnmqpiuuxrrpupppruvpusuwu{~}xvtwvvvxplupmstnprrxNHHHIDBCHE<@EBE=89>>=<<AB<?>AAFCFCDIDDEEFGGGIFGKHDHHGIGFDHKIGKIMKJKLHLKLKJNKONORUVOKUVSPSQRLOQPOTYZY\ZY[]^]`c^\ackb`dghr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptLIKIKFBEGE<@GCD@:<>@?>?BB<@>BAFCEEEIFFEGFGHFHHIKJFJHHKHFFLIHGJGLLMLLIMKMMMPLPPQUVWOKVUTRSQRLORRQVZZ]^[\^^^``ad]c`ef`ehjdssfjgfkorqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGCEDE<@FDDC;??A@@@CA?B?ACHCFFGIFJFGDIHGIHJLHHJJILJFJKHIKJGKKMMJJMLNNNPKOPRUXVMMTUTRQQPMNTSRW[]^_]]`_`aa`acebdhbdijgvljiglosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrunwKLLLMGDCAE<?EEEC=AACBBCDACEAAEGCHHIHGJGCGIGHJFIMHIJMKNLGKIHKKNQKRQMSMKNNOPPOTOWXX[NRPW\ZRWPNTUTTXZ_bb_da^`b^`eaacingchhhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@DBEDDFBCEGCCIFCIJJIIKGDKJGIJIILHJJNLOKILHKLKZfJd\KlSHON_nUks[qpbwcSPavuhucav`Xnqbdvinzf[lt`ljT_wvijghfglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFB?@B?=DEFDCDCEEDFBFFGDEKFFJMLKLLGGMIGJKHKKIKKNLMLLLILML[sbdp^lmUMNfs]ffqlntgpi_aYnnbppbkjjfoqtetno\ougpMJqyvka`keemxlkvlmpsrprqpqrqrrrtrmmsnnopsutqsstuuutwxvutbmukpplrrqzKLIHGED?AB@>CFGCFCFEFEDCHHHDEKHGLNNLMMFJNHJKJILKJJKLMNNMMJMMN[roonpplkMPQlWMibtrpamnu\YlP\nmZqmkomxxtsip]_rkqjUuyxoc^kfbgpojjnoprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGGEEEBBB>@@FHCGDIFEEBFIHHEHLKGMMOLMNGLMILKIJMIKJJJNPONLLNNL\hdu]lqWlNPQmTYk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggaditxknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHLFIDEECAB=BACFDHGLHECCHKIHFJLLFNLLSRLGLLHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYrkgooqqomt]nXat_nopoqronusttj[^tcwxrjnzhaacfbbimtupsuvsqppqoqt{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEDEAA>DDBGDHIMIFCFJLJGFKNLFOJKWQKGKJJNJHJLIKJHHKMMMMIKKKSkc[i^_icrrZ_Yjn_eeUk_c[aaQ`lh]j\niid[oedp]Z\k[mqcpsldgccg``jmqpntyruqopqny
vsnkmmonqrttrtuuvyxxsunqunvqqutwrGGFIDEDFA@BFEDGBHJLHFDGKLIEFJOLIPILZPJEHHKMIHJJKKIHIFKKKLGHKKLMMLJKMNT[\TPTLPONOOVQONQNOQJJOPQdqiTYV\[\VY[]X]\\cfaaebcf__fknimtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCDGEEAEC@DHDFGCIKLHFCGKLIEGIPKLOKLWLIEEHIJHIKIMJHFGGIGHIEFLIJLOMJP\W^P\[`^MXYS\\b^MXZMXaRKYaZR_d\aX[ddVVX\YZX\VY\]b^daa_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtrxrxsqrurtOBCDLMBDDBEIEGGFKJKHEEIJKFEHHPKMMJMRIGE@HFKIKLJLJHFDIFDFGEFJHCJMLLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_c[`^[TXWY^]cbcacehekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaRJJMIECBCGHFHGIKJJIDFKKKEFIJNKNKHLNGGE>GGKIKLJKKIGDIDCDEAFJEAKLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQYUU\Y]c`__cdbhomnllllu
yu|
}wrrtxyyyy~}yuyvvrnzwvxYQKFDGEBEGHFGHHFGIGHGHKILDDKKNMLKHJJHIF?GGNKKKMKKKIFGCD@DAHIC@JKHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^PO\_accccb]dcbdcfXQVTQZWZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFDFKJFFFHGGIGFFILJNFDKKMNJLIKJHHFBHHQMLKOMJKIGGED?ECIICCHGET]Y^X_Y_[]UXXP]]QKJV^X^[]UYaRQ__bb``bb`cbaddbXOQPQZR[]]]]^__chgljnnp{{|~{
srw
|x\SKCAHFDGMRHCQJEGHHEFKJMPEFIJKNLLIKKIIGDHKQOMMPLLKKHICDAEDIGCCHFDWUE\T]SV_XOTUNZZMIJT`a[_X^^a]NXa\``_bcb]abW__TPOOOWQ\[[\\^_affeleoow|{{}
zo
~JNFDFFHDIRbPCV^IGGHDFMJPPEIIJKNLKJLKIJGEJNQQNOOMNLMHKADBCDGDCCFGBMHBKKOONLFMFGIJHGLKMOPILOPOSPKOSRUZYWYXXdWOSTPPNMNTRZXXZ]\``decgcklpsryy{z
~{}{
}KIEEHFGDKM]LGGXLGHJHGMLQPHKKKKNMUNOJJKGGKPSSNPONONNGKF`ED_LEgdFN\I^[rmOMUmYLDP`UkWgJ]WU^DLQULLSVQRTXWTXUT\UPfZhhdXRjRVUT[\[`_abab_fhfnkhrz|}~}|zr{z{
~z{LIEGFHEEKOSIJF`SGJOJIOMRPLMLLORUROOIKNGHMQ[YOPPNOOOIJQQI|YYrtYQmHqnoaVPqqsPCksmqspSo_ZnX]V\XUkhU]VcZ`Y[_VVXjtuu^_v^Wa[[f[^`aaa]_agmpl_pwtx~}vxzlv~tx}|~|z~wwNJEHMNBDLLFIKEQULKNIKRXWQNNOMQTNOQOKKNGMOS[ZTQROPPPJHZx]TxehZSURvgtlpbnfjQrOMwmjrpsrqrooo]ezuxqqzq~s}ku}bRh|essorr{|o~xnr_``baZ`_gknkblfglw~}{xwtvzir~ns|~wx{~x|u|||ssNLG`]GAELMGJJGIONMMJNV^YULQSNXZMSSRMKOHQRTYWWPTPPPQKHgxlcxrm[LNVypumubovPeeJfvqmwojfxwiWrQhzmijzz}lxzohoYvvjvup_rf}ilx|o^__baZ]bdgiidgbcdllppstssszqrxblugry{rrvy~suzn|}yxrnNKSuNCBFPPHJKIKPNNOMPZ`ZWKTWPa^RVQYRLPISTUXWWPUPONRJKrouuquqdiaWnLqp^FhyWvTKhy}x`y{sna]mocRgqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^\_ddiggee^abiiijknokqomjpacfcowxompsynqpk{ztromLL[VHGEGRPILMJKPQPPPPW\YUMUYUeXRRY]SLNITTWWYWOSNNNQIRmHiwK`dvwVXlOnl{sajgvULWkh}lmlx_Zpz{^`zscroxqhd}ir|^TLl_vukiu{zm~xk|p\^^b[^addfeeebZccikkrsrvglihdgaakagsrlgmmr}kmhk{tmmkmOHKKHJHHQPLNOLKRRROSRWRVTPWZVVTTTa_PNMJTSTQVVNNLMOPKHQNPULKLSTSSTPVUQQNQQXYRNPUTXXX[[URSW[WXWZOSUWXXR^YW^WUPYRWWWWX^Zgr^[[Y\]_cZ_ccdfdccbZcbgfemnmueegcaf_]g`dlhfgkhpzhggjujhgilPIKLLMKJSQMQQOLVUTPTUXUZUQZ]UUTWUYWOOKMVTQNUSNOMLQPLJRQKQMKLPRUSQRSSIHLNOQRQPQTVRXW\WSRPRTUUSZQNSRXVTYWUZVTRVTTUWXV\Y]`][ZZ\\_c[]bcdfdddaY`acabhhimbad^_c\Zd\ama^fefmsdigjkedcfhPJKLOOLMSPNSQPMXWUTUWWWYUS\`VWVYUXRPPJNWSPNUPNQNLSPMOUSNRNMOQUQUQRTUNKMOQTTRRQVWUYZ[YSURTWVVY[TPTUXUUZVXZUSRXVUW[XY^\UX^\^\[]``][bbcgfedbX_ab^`gdfea^_]]^ZZ_Z_g`^]]bhkagfgfd`bcbOLMLQQLOTOOSQOQ[YWWXZYXYV]jdVXYZWVSSOJNVTPOTPPPMMRRPRXTQQOMPTVOXRTUUONMQTUUTTRTWV[]\ZVVQQVXV[[WQTVVVVYTXXVSSYWVZ^Y\^^U^\^`\[___^ZbbdhgddbXa`b^^fcc`b]\\\\YZ[X[a\_]\_b__bdebd__`\PMNNRQMRROSTQOU\ZZW[[\YZ[dqmhd_[XUUWQLMVSMNROQROLPSRUZUSPPMQXWRWSSSXMOOQTXVUUSUYX[^][[VQNUVU[[WRSWVWXVTY[UTSZXW\^Z^__Ta\`a]`b_\`]c`cghdf`Yc`a__ed_`b[Z\[\ZZYXW\Z\[`^_[^^a`_b\Y`[QNONVQPTQOTTSPW\\\X^\^V[^jqwyc\[UUWPMOVSNQQORTRLRTTY[WUOROSXWTSURRZOPRRV[VWWSVZX\][[]VRMTUU[\VRUVVXYSUZ\USS]XZ]^\``_Va[cb]ad^\bab^cfidf][d`a``ce_b^YZ^[\ZYXYWWZZZa\][]\\Z]`W[[ZPOOOYPUTRQWRTP[^^][`\`U\]hjr}slg[TWWQNRZSRQTRTUTKRWV[YZSOSQVVVTOWRRZRTTTX]WXYSX]X^]YZ]TTNUVW^[XRUUYYYUWZ\VTW^Z]]`]bb]Y_[ea_dd^^cca]efidf]]da`aabd`b^XZ_Z\[XXXWW[Y[`\[[\[XY[^V^Y]QOORZPZTUVVSTT^^`^^b\`U]^bkytl}kZTYTPPS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[YUZ^X_^Y\YRVQYXY_[ZTUVZYZWXZ\WU[^]^`a_cc\^]]eaafd^^dc`\gdheda_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPVYQ]UVYWWUX__aa`c]_U]^beeuzhWXYSUSV[XWWVVW]XOU]Z^]\TRXSWWUSTXRSVTXWX]^X][V]_X__X\VQXTYZZaZ\VWX[Z[YYZ[YW^_`_cbadd\b\`fadfd^_dba[fchecf`f__aaaa`_^VU]Y[\[Y[YX]Z[[XXY[YZZ]_]TY]UNSYVS\TVWYVV\`abc`c^_V[`da_zuohYZYTWTW[ZZ[YXY`WPU^\``\TTXPUWVTVWRSUWZZ[_^Z_\V__Y]^Y]URXWYY]bZ^WX[\[\[[Z\ZZ__``dbcddbdZaebffe^ab`c]bcidcg_g^aacaa`^_XT[ZZ[[X[XX\[Z[XVYXW\[[`]V]]SOVYVVZUXUXWX]_badad`^YYadb`lfh^\\ZVWXY\\]_[Y[bVUX^]ac\RVYPWWWWWVSUTX\\^``]`\Wa^[^[Z^WUXX[Z_`\_YY\\]^_\[]Y[`a^`dcdeeebXcedhgd^c``ec\eidei_f]cbcaa`__[XYZYZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWYX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cYZX]`cd_RXYPWWXYYWVWV\]^`a`_b^Ya]]^Y\^YXUV[\`^]_[Z^]^^a][[Z\`b_becefefbZdffigb_c^afdYhhbfice^bbca``_]\ZX\YYXXZXWZ[ZYWXUU[]]]``bbxKXW[YV\[\]ZW\]_`bdaba]`Xbcbacab][\[XW\\_]`_][`d]\X[becaR\ZOYXZ[[ZWZY`]`bb`ac_\b]_][^]YXTW]^_`_`\[^^`bc\\X\^`bbcedfdefd\efgifcab[cg_\ihbhied`baca_`_\]\Y\YXWXYXW\ZZWVXOXZ]acefrkJYW\ZZ_\[^[X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\^^^YXU[_^]ab`^[`abfc_]T]``cddfegeffe^efhhgdd`Zeg]aghchhfc`bacb___]][Z[YXXXVZV\[ZVVUMXW\hikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyz{{{{{{{zzzzzzzz{{{{zz{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{zzzzzzzz{{{{{zz{|{{||}|||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ¼ÌÓÒÒÒÓÓĽ¾¿¾¾À¢~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊÝæääåäåÓÌÌÌÌÌϪ}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxxxwwwwwwwxyyyyyzwopppppprrrrrrrwzyyzzz~||||||}~|}}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuyvvvz{x{xwvwzwyyz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{yyyyyyyyyyyyyz{{{|||||||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwvy}||{y|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwvz}|z{x|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwv{}{y{x|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzyz}zy{y|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyx{xyzyyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqqqrststttttsstsssttttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttssrqqqponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssqpqpponnnnnonoppqqqqqppqroonopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrsssrrppppppoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqsqrrqpn|oppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqqqpprqornpppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqq}¡pro|nppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqu¡wqw}oqqqqpppppqqqpqpppqpppppppppppppppqqqpqqpppqppqqqqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrq¨o£~pqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxwwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssssrstr©¤y |rsssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~}|vvwwvuxzxxxxxwxyy´©¤¨¨}{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{|{{¯¦¡µ«¬£~{zzxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}}¥¡² §}}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~ ¯ ¢~~~~~~
~~}~~~}}}~~~~~~±¡
|~~~~~~~
|||{|}||~~~~~~~~~~~~«¥¤ ~}|}||}}~²¨¢ ¦¨¨
}||~~
±¦ ¡¤£
}}}
~~
}}~~
~~~~
~~}|}¡
~}}}}{££
~~}~
¡
}~
}}}
~}~~~
~}~
~
~}~
¡
~{z £¢
~}}}}~~|{{¡
~}}~~~~~~}~}}
}|}~~~}|}~|z
}}}~~}|}}{zz
~
~~~~~}~}~~}}}}~}|z{{~~}~~}}~
||}~}}~~}~}~}}~}}}}|{{{zzz{~~~~~~~}~~}|~~~~~~
~}~~}~~~}~~~}}}}{{|zzzzy~~|~~~~}|~~~~~~~~~~~}}}}
~}}}~~~~}}}}}|||{zzzzy~~~~~~~~~}~~}{|~~
~~}}}~~}}}}}}}}}|zzyyy{~~||~}~~~
}}}}}}~~}}}}}}|}}|{yyyyy|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxxyyz}}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yyz{}|
~~
~}|||}}||}}}}}}}}}}||{z|yzzzz{~}{||}~
~
~~
~}}||}}|||}||}|}}}|||{z{|zyz{|yx|}~}{{~}}|~||}
~{z|
~~}}}||||||||||||||}|||~~{z{zxz{{|}{~~~~~~}}|}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||}|yz{{xxy{{z|}}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{||||||||||}}|{}|||{|||zzy{|z}
~~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}
~~~}}|||}~}|}}}}}}|~|}|{}||z{z|}}
}~}~~~}||~}|}}|{}|~~~~~}|~}~~~
}|||}~{{}w~vx~}|}|}~~z~~|~~~~~~~~~~~}~~}|~}~}}}{|||{{z}~~|||}||~~|{{}~}~}}|{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~}~~~~~|}~}}}{{}}|z||}}}}|||||}|~{~{{{|||}|{|{{||zz}z~~
~{|~~|z~xyvw|||{{}{~~~~~~~}||}}|}}}}{|~~~~~~||}||}|}~{|{||||}|}|}|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~~}~|y|~}~}}~~}}~{{}}}|}|}}}}}}|}{}|}}~}~}}~}|{{{|{||{z{{zzz{~}
~zxyyz~~{yzx~s|||{|||~~~~~~~~~~{~|}~~}}}~}}~}}||}}}}|}}}~}}~~|{{{|{}|{z{{yzzyz{~
~~{zy{}}x|zr}{{}||~~}}}~~|~~~}|}}~}}}~~|}}|}}~~}~|}|{|}~||{|}zzzyyyz{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~~}}||~~~}}}}|}||{|}{{{zzzz{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~~}~~~|}}|~~~~}|}}{}~}||{||{{{|{||}}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}}~~~}}}~}~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~}~~~}~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{sy{|pwuvwyutz
}}}~}~~}~|}}~~~|z{z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
|}}~}~}|~~~~}}z{{|||}|}}~}}~~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~~}}}~~~~}}|~~
~~{{|||}}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~}}}~|~~~
~~~
}}}|{||yz{z~y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
}~}~}~~|~}~~}~}~~}
~}|}||{yvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtu
~~}}}}~||~~~~}~~~~}~~~~}~~}~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~~}}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|{{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~||}~~}}|~~~~}|~~|}~}~~
~}|{{{|yw{ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}}|}}~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~~}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y|||{zzzzzzxsvupprowvr{
~}~}~~|~|~}~~~|}~~z}~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxzxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z||{zxxy|||}{||}}}||}}~}}}~~}{|||||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}~xwvyyz{}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}z}{zvzxy{{|}}{|}}}}~|~~~}yy{zzzysrtowqwysw{
~}|z||{w|yyy{z}~}||||}~~}~{{{z{ztpxqytvxtv{~
~||}|x|yzyz|}|{||}}}||{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||}z||}}|z{~~~}}|}}|vrwxxvtvu}
}
{||}zz{}}||z|~}|}}~~~~~|}}~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~~}~~~}}}~}}~~|}
~
~}}||||~}}{|}}}}}~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}z}~{
}~~~}{}~~}|||}}}}|}}~}}|
hj|{qq|sstt}usqspurstv{}uvy
hzrss|r~}}~~}~|}}}||||}}||~}~}}}
}p{pyv~nypus|vyyrpvxqvtturstvinrotvnulwmzsnzm}rsvsvmnwlpylu}|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoolw}xpqzprtfu~n{ysoy}~{~}~~~~~~~}}~~~
~
quprsoszy~ttu~vnr
ynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~z~}|~}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}{}{|}}~}~~}~}~|}~~
}w
~~{|{~{|}~}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~~||~}}~~}}|}~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~}}||~~|}|||}|||~z{{|~
{{}}|||~}|||}~|}|~}||}||||}|~}{|}|}|~|||zz||}
{|~}|||~}||}|}{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~~|~~||}}|}}|~{{{z{|||{{{~{{}{{{~||||}~}{z|z||
|
~~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{||
z{
}~}|}}~}{~}|}yzzy{|}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}}|}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~yz}
~|}~~~~~}}~}~{}{zyzzyz|}yz{{{z|{{{{|}}}|~}|||~|{
~}}{
~|}}}~~~~~}}{|{zyyzyz{|yzzz{{|z{{{|}}}}}}|{}}|
~|~~
}~~~~~{||~}~|~~}}~{~{{zyzzyzz{yzzz{{|z||{|~~}|}||}~
~~~|}~~
~}}~~|~~|~||~}|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}~}~}
~}~~~}}~~~~~
~~||~}|~}{~|}}}~}||}}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌÌÌËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;>BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9><>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA=366:;<8C<AA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖËËËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<;999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNG¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËËÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××רר×××ÚÛÚÚÚÚÚÚÚÛÜÛÛÜÙ××××××××ÖÖÖÖÖ×ÚÛÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXdIILN@99:4;@<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMMF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËÌmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´¡¿½½½½½½¼¼¼¼¼½´½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃrliNRbLLVM<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKPFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ËÍN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤XRSSSSSSSSSSSNz®ªªªªªªª©©©©¬TSSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËwliJN_MRUM><<7;?C>6:7>?;=B@9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ËÍR,11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦\VWWWWWWWWWWWS}°««««««««ªªªYXXWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<;>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÌÎ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª¢fabbbbbbbbbbb^
³¯¯¯¯¯¯¯¯¯¯¯±¡cbbbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9::=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÌÍÄÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÎÎÍËÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌËËËËÎÒÒÒÒÒÒÒÒÒÒÒÓÓÑÌÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8:;898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÍÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÒÓÏÏÐÔÒÏÏÏÓÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÖÖÖÖÖÖÕÕÖÖÖÖÕÖÖÖÖÖ×ÖÖ×ØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÒ«ÏÑȧÒÑÇ«ÑÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLB@==<=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒ¶¥¤Ñ¬°Ñ¬²ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏμÄÍÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>><<96?B?B:648:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÑ¿ ²®ÁÉżÉÅÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?B:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÓ´ª¸¤ÖÎÑ¡ÏÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<=<964:98::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯Ê £¿Ê¥§ØªªÔÏÏÏÔ«~£¤³ÃÚ£¿ÕÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>9<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÔ¬§¡ÐÇËÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖ×××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CGDAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÓ¶²²¥ªÑÛ¥³ÐÛ£µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHFE@<<>><==<756:96:;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÄ¢«§ §»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸« ÇÕ¢«¤±¤¥¨ ¯§¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKK@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓÈ´ÖºÕ¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUij[L_MJLJULFB<<?FEGKH=667:979:;:<=9>99:8;=>>A>=9<<:=>>;=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÔÈÁÕÓÓ¹ÇÕÓÓ¹ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?ADLL@>775:8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÑÓÔÒÒÒÕÔÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ==786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDCI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFID<AA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD88867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCDECALH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HQA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<88996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8:87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;99:86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
¼ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkqtywt|}spxyÈÞÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxu|v}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9886543956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿½¾¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78473156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;;>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:767>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPF>8;727967443588797;9:==<::974:98668??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹º¹¹¸··¶µµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269664737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³µµ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶··¶µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶······¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B@?C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬«««¬¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©©¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@AA:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¥¥¥¥¦¨¨¨¨¨¥§¨¨§¨¨§¨¨©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637465738:::::<=::A<6=8378837;@??@@:BEC@BDCA?;;@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¥§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢£££¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@?BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747578;=8::99;=;;89>6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦§§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¦¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364689:89788:<;<9;;::67899>?@><=@>@:9@A?=A?>AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§§¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¤¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846799=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¤¦§¦¥¥¦¦¥¥£ ¡¡ ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ xlcdbdQGA=C;KHD:;;<>9::9:737959989<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢£¢£¤¤¦¦¥¤¤£¢¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££¤¤¤¤¢¡¡¡µ¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;866:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££ ¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¢¤¡¢¢¡¡ «¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86:756::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡ ¥³¬ ®jv ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¦« ¨D ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢ b¦¡£QG ¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8:;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¦f]£ ®uIL ¡¡¡ ¡¢¡ }xjabb\Q<@<68CVHDB:8;:>;7796=:99647:;<>9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¤Rx¢ ¤_VN¡£¥¢¡¢¢¡¡ ¢¡ ¡
wqgjd\\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢ [_£dZL¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[[LF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡]]v¢dYM~¢ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<9798:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡`a`tcUN¢¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y i^[ej_PR¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B@AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ shaTv\VPW
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v} £¤nLOc
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{ l¥_r
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974869388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~¢|nRuZq}|~}|¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
}wXOLpL`pqw
¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~£U/0=wwvAE^km¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUTbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢¦gAZH;wykgE08Yls ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T_MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©©¯Jo¡xA{wdaPQ[G`n¡¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¦©§¨£x`ÀÖ¦C{uOmvSd£¨§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤§§¤¥£¢b½À¯w£eLaxmQt¢¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^edlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢¡¢§¡¦®¦¦jº¦Ð¡±¨XL¬Se ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡¨ª±²¯«¢¢w~}rÏɱ§¯kUª°bZ¦¥¢¡¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\U\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¡ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯··´µ¶³®n͹£tTozsn{¦ª§££¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@?BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²·»»»¹¹Á¸´µ ydY·À¦©wkqoxxz}¢¥¦«¥¤¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvkqhiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ·ÁÆÌÏÎÌɾ³¤sfRD~xqngflikqrqqrt|©ÄÄ»¢§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSaiaftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃÅÇÛããÚ˼¯¤tYZQCizlounkeeYW^X\ciihe`h´ÀÀ¹©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwom[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ¾ÍÑÕʹ§r^QTKD[f^dkea`hYTXRVXY\XZt¶»«´²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklgnvrrvrg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÂÁÇËÈ·ueUPOTH>^k^_eb`]daSVVUSTWr«°ª¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxoyjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄù¸ÃaIDGKD=[ebahc`[c_WQNOOU´º¬®¥¤£§¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{wnkihvZgsxszgg^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÄÄÂÄÁOFME;M[_eke_[`YXRMT¢ª¹µ²¬©£¡ª¬§¬´´¿Ã¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyvvefjjh^kpnyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇÂÆjXG??G^cbj`ZXWSUv¶¾»¼º¼¬¦©»º¹·¿³µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««¬±££ £¢ £ }qtqocahvhjjunyl^d[V`YLHD6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÎÅÆÆ½©rPK0XSUfaSNOp©ÈÈÂÄÆÀ¼¾´±°°Á¾¾ÁÆÀ¾·¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®¯µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r}xpg`kjwmifvotc]cUWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÂÃÂÁ¼?Ov~VLo¤ËÔŶ¿¿À¿º»½µ³³À¿¹¿Â¹Á·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyspfegdlebknoo_Y]WVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ½¼Å§wko©ÈÈÇÑÁ¯½½¸¹»»¾·´±º¿´¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}zxnfaebacddjcgd[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÀº¿À¼»Å½ºÀÄ¿½¾¯se}ÑÅ¿¿É¿°Á¿º·»¾¹µ¸´¸¼µ½¸µ´¯³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdacchkggjfj^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÖ·¿»ÃµºÇ¶µ¸º¼¸¹¶ª£É¿¿»Á¾¹Æ½Â¿¼Å¸··´¸¶¶¼»¹¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeegojelhYYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÄw§Ì½Ç·¹·¶´·¹³µ±¼ÉÃKzʾ¿¾½¼¿ÈÃÅžǸ¶³µ½¸¸¸¾»º¹¼»º´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knqgqktfcn`\UHKJDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄÖ¯tºÈÏÂÀ¸®´´»½·¹±½ÃÊCtÍÿ¾½¼ÇÌÇÇÄǼ´ÀÁÀ½»¼ÀúÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qfljouoxdhc\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÆÉÒqr«ÒÑÌÊĵº¿ÄȾ¾´¿ÀÀyRmËÆÂ¾Á¼¿ÃÌÊÇÅÆÁ¹ÂºÅ¿À¿ÂȽÇÇÆÅ¼ºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tpmmtlmo`c_bbNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»ÄÐú¾¼Ä¾·¼À¿ÉÏÇÈÊÊÂrs£ËÌËÍÊÆÂÃËÎÁ¼¸½º±pcb»ÈÄÀÀ¿ÄÀÊÉÃÃÃû·´Á¹À½ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢¦¡{z{mmx|`qd\_`_TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»«Úþ¶¾À¾¾º¦©²¶Ã¿¥zvxÄÇËÈÁÃÀÀÉÊÁ¿»¹±¡}sjÈÅÄ¿ÀÁ¿ËÇÃÀÈÀ½¬«À³»»Á¾ÀÊÎÊĽµ¼»¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsythp^\_]ZRFEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Ä¹m¬Î½¶¹À¼«~nhnlrsw|½¿ÆÀ¹À¼¾ÅĽ½¸±°~ÊÂü½¿¿Ãþ¿È½¿¥Ã´¶µ½¾¾ÎÌ̸²¸¸·½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmu{qoj\`aZTQAFIGK@ECI<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀÍ´v³½¶µÂ¥iZ]`MR[Znsw¸¸Âº³»·»½¿º»»®¤~ÀÄþ¼¿»»¸¶Á¶ §¶ª°¾ÂºÒÉÈñ°´´µ¼¹¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶¼´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvwxnra_g][UJ=??GG=GCC9:5;99><<9:<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɨx ¯µkefVX_IIMPSlw
¥°·¾¹²µ²»¹¼¶¹¾´§¡p®ÉÄÀ½¿¹³®²½»®¿rz£¥Ã¿½¬ª¯²º·º¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrm`db\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Å«|v `TCWVHakVOFI` «¯¶ºµ´²¬¼¹¸µ¸Á½²£¦r¥Ë¿¹ºµ®¥¬³°¦´¡y§°´¥¨©®Áµ³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovsod^hY]^SONB?JCAKJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿µxoNJ?cZANwkMA\°µ³µ²´¯¬»º¸¶¹¿Ævªe§¿¸µ²±¤§§§ªºÅËÓÀ¤ ¤¥¼Ä¬®§°«¯±±±®®¯¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvtmvjl]\kU^\PNHDGMBGNG8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶{XFANZJJXvc@R¢¹³´²°±°¹¸¶»·º½¢²¬¤s«°©««£¨ ÎæááßÕÆ§ymq¡©Á¦¨¨¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±¬ª©®¯°¥¦ª¤¨³®«¨¦¦©«¦ª§«²¬¯³±«©wryiutoeUbdX]ROMI@IRDNC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯±»ªiN@RxqPIIKgYEQ»±¬³¯®¬¶¶²´µ®©¦¦¨ ¨©¡§ÛÏÆÆÌÏÌ¿}lje{¥Æª¢¢¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ª©¤©«¦©¬«¦¡y|vzcxmn\QiUPOGPMMCPR@>;>4::5;:=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢ª¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨¼Â«¤¾iERQWII_KS`cb®µª²´®ª«¯°²³¥ ¢ £¤¨®cr´ÆÇÇ«|iinfµ¡¡£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~}uv}nl{dhVSdNJHGOSNKNH<E@=2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶¶º¹º··»®¨ ¡©¡ªÆ¿Ê¡PArxOnKKbeus_Z^p±¯®³µª¦¬¬£¢¢¤¤¡K-HZ³ÂÁ«qx}¢¦£¦¨£¦ªªª®§¨°¥£¤¦§¬¦¡¥¢¯¨®²«¦«ª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ |~wy|eyyabSVaIIKLSUJSQM9>A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥£ÇÇWSId£\e~or]Pkc[d_]k´°°¸¬¦¡¢¢Rki`¯®£ªª¥¡°££¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««¨¬¬§¡ £±®²±´ª²¯£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨¢§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvsime\S[ZMRKOOVMTMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢«¤zUhruuqbvvXWc`cgYXWe¬®¬¯§¢¡ ¡£|k¢^p£¥§§·µ°¦³¬¡£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³µ¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xvjwv^m[RaIRVHFVWKCMH=KI8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©¨®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¡ ¤np`cXL[SZMLPXRHMMG¬ª©¥ ¥³ÊÊb
£¡®¼¾¸¬´´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ·»¶«®±¸·¼¯³°µÁ¼·¾³³µ¢¬¢©©²©«¨§¨ª§ ¨ ¨¨¥¥ª¢¢¨ ¤§ £§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhn]X[CWNJGMHCFN=>L>4<:6:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©©ª ±¢·¤°¦£bW^e`WMQG>>?CC?>BQx¨©ª¦ ¡£
ª¥~°ÔÒ±tas{x¥ÀÀ¾µ¹»Àù½»¬®§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¸Â¾¸´»ÆÄ½Ã¼¸´ª³ª³´¯³®ª¯£¬¨·²£°¦¡£°±®°¤¥®£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trklurqhW\QFUHDJPI?EB4FH96<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<<;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ }`^e`QGD=C?E<?96Nª³§¤£¢ ¥¬¦xl¢¡©}p¤Õ{KZptqzx½È¿ÄÈÍÐÈËò·µ¾²¾Å»¾ÌÍÆÌÌÌÒǾ¿À½ÇǸÄÊÉÄÁÇ¿º´º»µ»·°¶²«»²®»·À»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxkfZ\FLMEDTMEBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<@?AAA>« §®§¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}sjaWNE>IY|pbB=\®¬¡vrplo¤«®®
f¨|v_b`dihc[RvÀÊÄÄËÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÁÆÆÆÊÈÏ¿ÉÑÍÇÆÉÆÂ½ÄÁ¿¿¿µ¾³¿ÀÃÄÈÅÈį¿¹²¸½ÄÂÁ»¼¼µ®§§®¨ ¢©¥ ¨«©£¤¤ £
yusebgrog_ZZDOMCFQIDCA55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:;>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £kf]TID@?K
¥ ²£yqqnjv¢¶²t}|zz~y{e\PliZ<nÎÏÐÄÍÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÒ×Ò×ÒÕÖÓÔÈÌÇÌÍÊÓÍÎÓÍÆÉÊËÂÇÌÇÉÉÆ¿Ã³³ÈÅËËÌÏÇÊ¿¾¿½ÁÇÅÌÌÉÉÀÃÀ®°³¨¢ª£¦©¬¤¥¦
{ruvgcgwjeWXRDNG@IQC>B=:22A<E<78<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<969:>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡cSLJDC?BRѽ²¯¦ ¤¡}yqlebhrpr{
upmprm¤e|xwihfd¨¥u?¤ØÏÑÂÏÓÖØÕÕÒËÉÎÐËÆÍÒÊÒÕ×ÙÖØÓÖØÍÒÊÎÑÌÏÑÍÓÐÀÉÈËÄÌÍÌÏÏÆÇȶÀËÀÒÍÌÐÇÊÉÀÄÃÈÏÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpcaesc]R\JKGAFIJ?;A8>5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¥¥ ¢£[I@ADAFPu±¯¦ wida_``_^__]alusponkpnr^_^YWq}|\SqU·cÏÕÒÐÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ××ØÒØÒ×ÙÔÖÌÏÏÉÍÒÌÏÑÀÇÄÉÇÏÎÒÑÒÈÌÍÀËÍÆÔÏÍÏÈÅËÇÇÉÌËÔÔÑÕÏÒÌÓ¹ű¥¨µ®¨¨«¥²¨°³¬¬
|zqstmacim_VQ`JJCFCSN?<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B<:<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®§ª¨¡£¬gC8=>DXª¨}qecb__a_^a`^a`_`emppmjmost~OORJQo{l~lSrZ¬ÐÕÔÐÉÏÌÒÖÒÑÖÍÏÕÕÑÅÑÓÊÐÔÕÖÎÓÑØ×××ÌÈÎÄÊÏÍÊÍÀÊÁÉÊÎÏÐÌÐÎÎÌÏÐÈÌÑÑËÎËÃÊÈÊÍËÌÒÓÎÔÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¿»±
zvopokadnpaX\[IFFEMYE;@=33<<87865;>@=9<<8<>9<@;@:=8?98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤²|HFB;V¡k^^^adb``aa```^__^\bmrnmqqrrvqTONM\aufz
vYgtÌÒÑÍÆÎÌÍÔËÎÒÌÊÖÖÐÌÐÓËÌÐÒÓÊÎÑÕÒÕÖÊÀÊÂÆÍÃÉÊÃÍÄÆÉËËÏËÎÍÑÎÔÌÇÉÐÍÉÇËÆÇÂÆÊÌÎÑÑÇÐÏÍÍÌÐÅÇÁ¸¹½Ã½ù²²¾°»Ãõª¥¡yqrkmh``qhYXhVMGMIQQB;D?;68:8:;57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨ xloov{ebbb`]^acb`__`aa`_][]gqqopqmimrq]JCMN][`qbH]ogVÆÍÍÆÄÆÍÊÑÇÊÍÍÅÐÒÏÍÌÔÊÇÊÎÏÇÆÎÒËÐÏźĿÆÊ½ÃÇÉÎÅÃÈÀÇÎÈÄÍËÍÐÉÅÅÐÉÆÂÆÉÅ¿ÁÈÍÌÌÏÃÊÌÉÇÌÐÄÅÈ»ÇÃÉÉÂÏÀ½¼¿°ÁÉÆ¹½ª°²§¥¢£xoudk`^fqa[W`GIHGIMUG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»¤¶~g¡©
}s_[^]^`^`cdc_]\^_``_[Z\akrpmmhgiiw`FDHGB?MLQTg^N½ÇÄÀ¿ÂÇÉÈÈÉÇ¿ÄËÅÇÊÌÉÄÁÊÉÁÁËÏÄËÈ¿¹Á¼ÆÈ¾ÀÆÏËÄÀûÊÇÈ»ÉÆÅÊÁ¾ÂËÆÅľƾ½ÁÄÆÌÆÅ¼¿ÊÃÅÇÒÅÁÉÀÊÊÇÈÆÐĄ̮̃ÄËÇÃÊ·¿¼º³©¬¤¥¬£¡¦£ |wsufj[anmZ\XRDLGCGDLDFS?54335@=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¾¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²°¶m^z{z
uxurp_Z[\``bcdded`[\^]^]_[YZ\anqmifgkhl~q[MIG8F?CSJTdX¯¿¸¸»¹·ÀÁÁý½¸¼¾¸ÃÉÄÆÁ¼Æ¿·ºÃÈ¿ÁÉ»¶»»Åÿ¼ÂÎÃÆ¾¾µÁ¾Ä»½Ç¼Ãºµ½ÆÄÂ÷À¶¶¿¿¼ÍĽ¶ºÈ»¿¾ÌÄÂÆÃÆÉÇÉÆÐÆÂÌDzÇÉÃÎÌÀÅ¿¼²·°²§¨¨¹°¥°ª¬zwxkeh`hodV^YJFJFHKAEBFJ@9:658853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µ«·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÕ×ÍÊÏÅÉÅÇÁºÅ½¬®§`cwx}{ttc\\]^_`bcbbdeb]\[\^\^]Z[\]grokdciiktmXKCNW9:MFH[T¢³°³²²²²º´»°¶¯³®±ºÁ»ÀÄ»¿º´±º¾À¸Ç¸´¼¶Á½¸½ÆÁûµ¯³µ»¿´Å¸»µ¬¹½¾À½±»¶°·º³Æ½·¯¼¿µ·µÅ½¾ÃÅÀÄÆÆÇÌÅ¿ÅÆ»ÇË¿ÏÉÇÃÅÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJGBDADF?=:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐËÍÈÉÈÊÉÊÄÐÍÒÏÍÅÇÁÅÁ¿º¸É·«°[go
zx~
vw|sh]]]]^`_`da^cec_^\[^\]^Z[[]_kolfcfhhjw{_OQYE98FIDJa¤§®ª¨ª§²¬´¯±§¦«²»¹µÂ¹¹¹¯ª´¹»³Áº¯À±½¼»µ»Ç¹Ã·ª¨°²À¶¸½°±¨²³µ»¼«®¶§®¶®¼²°ª¸°®»®»¸»ÀÁ¾ºÃ¿ÆÃÅÀ¼ÆÁÇʸÅÇÅ¿ÇÃÂ¹ÄÆÂ»ÆÉÌ˳¹Â½»³tvwki`bliYWW[ALLMJEAC?FA:::996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÍÒËÃÅÁÄÏÆÍÁÂÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ¯ª±[i~{x}
y{wn^]\\]_`__dcbdcb`_]Z[ZZ]ZZZZ\cmmfdddfgjzlOZ[D@;6:=M¤ª¡¦¡©¨«©¯¢¥©¬´µ°¼¸¯¶®§·´³»·³¼¯¸¹µ²»Á²À¯¥©£«±³³¨½ª«¨«¬®µ´¦¨®¡¥°©³§§¨®¦¨·¬±³·ºº»²¼¾¾¾Ä¿µÁÀÇÈ·¾¿Å·Åÿ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji\aodWVXPHZSSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃǹ¹ËÁ˾»É¶½Ã¾ºÊ¸Áõ¶¼¶±¯µ¼®¨«cmz}~xt~|swe_]\\^_`^_ccab`a_]]\ZXY[[XWY\_ejdbcaddhmw]LJVVQQ>Bz¥ ££¥¥¬£¤«±®¶¶¦¯«¦©³«³¹°µµ¶¹²°ºº±¶¥ ¥ ¦±¨¬©¹ª¥§§¨§³ §¦¤¥¬§¤¡¡±¬²µ³³°µ¼¶»ÁÀ²º¾ÃÁ±¹¹Â³À½Àµ¸»½¾¼ÂÇÄÃÄ¿¿Ä xqlbf`ko`UY_HNhOTHFKF<=@=:;;826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;ȵ¶½¸ºÁº½¶ ¦º¶«³³»³ÄÏÉËŸ·ÇÀÌ¿¸Ê·»Å¸³Å¸³¿À¬¶¼²¬¦¯´¡£ir
|xusomjiipi_`]\\\^__acb````^\[\\XYXXXVXZ]^cb`cccbefkrWP`gojZ|¢¡£¡¥¡©®¬°´¢¨¨©««¤´¸¬¶¯¬²´®³µ¯°ª¤¢²¤¦ª¸¢¦¦¨ª¥£°©¬¨ª«¬°²¸¯¸¹»°¶¼»º«³²¹³½´·²±µµ¿µ½À½Ã»»½{sl_e^ddXTW^IW]KPGJJGA<??A;?<05635:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»¸ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹È¸¸¿·²Â´±»»¬ºº±¢©«§m~
xrmomkb^bff]]^]]]\]_`abccba_\[[ZZYXWWWWWXWZ]abccbbcddolet|oJO
£¢¤ ¢¬«¬° ¤¡¬ª¦¡´¯°±¬¨¯²§º³¦µ ¢£¢£¢ª¶ª¢£¦¦¦£ ¡¬¨£¤¦«²³ªµ°²«²¹µ¯ª¯²²³·³®©®±·±º¶º½¿·³±zvf_f_[YVSZUK[QLJEHKIC=?BB@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿²¥£¥±Ãµ¶½´¸ÂÌÈÆ¿Å¶ÁÀÇηÀý³¹¹²À¶±¹»²µ¯¤ª xxoqtqhedhdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWUW`bcaab``dfqqvy`>L`r¦¡¦©¤®©¡¢¶¨ ¨µ©¦§°¤·°£· £ª¦¡¹¯£¡¤¢ ¡©ª¤¢£ªª°¨´¬ª¦²°¥«³±°°¯¯§¨§²±´°¼´º·®£zwe_aWYXSRTKM^LPLGHMLE=@>=B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾·½§§¢ª»À½À¹®´¸ÁÌÈÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°°±ª¡ª|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWVUZbb``a__`bgpotR1,)?x¤¢ ¤¤¤©¤ ¡µ¦ ¢§²¡¥§¥¯¥±®«µ ©¡¢±±¢£ §§¢¢¤¥¥«¤¥°§¥¢«¬¦©®¯¯«¨ªª³¦¦«¯´±®¼¶±°¯{xseb\[]XNLQHRaMVPOJNOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°¼±·¬¥¦¬¸»¼Áź²¹µÄÉÉÀÂÆÅǶÆÄ³Á¿Å«··½¶½º»µ²¬¨ ¤t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVVRTRT__]^_\]]`ahonI+)Eo¡©¢¡¢¡¡ §©¢¢°© ¤©§¢¬¬ª©¢¡¡¢«¨°¢¡£¥¡¢ ¢¤¥£«¥¢¤ª¤ª¥²©¦¥¦¦µ¦©¨³µ´¹º¯«¬sqpa[WVVRGQOHZ\ORJTKSLEGJC8;;=<9667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«±¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÉÌȵɽ±¾Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURRNPX\Z[\\\]\_bkjJ;/=I\
¤¤¦¤©¤§¤¡£«¢£§®ª³¥¦££¡©©¡ ¡ ££¡£¡¢¨£¢¨« «¯¤®¸¥£¤¢¬ª¨«¯´·²½µ³«®
uti\YYSURFXLQ[XMUOPLQRIOIB=??A?=75799<<977:79:;<=>;7;;:=68:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ÌÆÅ¸ÀÎÏdzĻ·»Âȱ¸¿·¼¾»³¶¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPPXYYY\[Z[]^cplMBOtlk¦¤¢ª¨¥¢¥©¢§¥§ª¥ ¨ª¥
¡¤¡¢¥¥¨¨¨ °°§±½§£¬´ª®§¯´°¹µÀ±®°«stbWTUNRJGVPRRLLXNKLOSGNKACFDC>B75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ¶¸¼½Àñ°±·®´´»³´££vkglnqnqjokdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTQMNMRWXYXXWZ[[`ijflduva{|£¦£¢¨¤¢¡
££¢¥§¡ ¢¢¦¥§¨§¡ ´²¨³¸¡£¶¬ª¤²²¦µ»´«¬±¢ztn^NQQMODNNNPKFNNJJNNQHMJAHLIHC>958889:;69:68;99><8:>9;?8789:885857688974577820301+)-/12876:999984988A7w¶§¤¶°¤§¤ª¥ ©¦¤³ª¢²Äµµ²³ÆÅ·ºÃÊÌÆ³¬º½´¸À¯©°¦®»¯ |n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRRRPQTQSUQNMKKSWWVWWWWZ\aeZ`[nxevr
z
£
s}
{ £
~~sz££ ¡£¤¢´¯¬¯ ¦¸¦¥°¡±®±¼ª©¯©xtdVMRPPMCSNLPMBPQHINSNIJJEKMGKK>849888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-02764789::65:87A7x·¡£´¨¦¥¨£¦¥¦¦¦²§¦´Á¸¯´°Éĸ¹ÀÎÆ¾³»Á¬Ä¨¡¦¦·£ ~xfWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJGNSSSTTSUXZ\hXZXiqkfFPiz
~^;Vn{ry{}xqo~¡ §®©©¨³¢¥«¨´£©¢tn`[NSRWLDTJPLLFNOIELQMKPJINPGJJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· ¢¡¦¦ª §©§£ª°¨§´Â¹°µ°Ç¸³½Ï¿¹¯®µÂ§ªÄª¢±£~sv]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKHFHNQQLORTUWY``USdlcF98zv
w~_IPmw}m~wuvxpQ|~yvgw~¤£¨©¥¤°ª¡¤¤¦ª¢ª¡¦§wnf^\HQQSMIUMSILKOIHFJNMMUKQRPGJD=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.115221/,')+*,4833989:99::::?9w¶¢§¡®¡§¨¥§§¯¬ªµ¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼§©~xqoXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDCINOhYNQSSUZf]VaiZZQK}lw{w~y}s~wqmtptz~ªz{hv{prmxx{{wsrxhu
||© ¡ ©¥§¤ ¤sib]]JWPRHKXROJMLRJJJLPILQMRUNFIB=78;99>=:;<98@?::><7==79937785675251472/2.,./200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¢wx|vpojYKHIHGEHHPTTTWWSUUUUVWXWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LNQQSV^ba`cVht`rzpszy~ozuynj}|t~z|tfu|lohs|mzq}qmvqhq~pD
wxz}{u}£¡¥yongc[XXUQJSUTOPNPVKNKOOJQOIOPLFD=;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«§©°¯±«»¸«º¾¸³¬§°§¬¥©¤¡yvq|muqjmjXKFGEA@CDHLLMQQOQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zYJNOQTX\^`\Yy¼{mp\tqivsvymjwrwhiq}Ingw~mjdly
ksl|nr|imps
{}~{wputyyp|ojoooYVXTRRYORUTRXUMOHMKMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¤¬¯¢ª¨µ¯®¬³¿«¼Â¿¦¢¤¡¢szuotlqmekkYNDFC@<>>BFFGKKKLORRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_JMNORVZQWUS{X`jp^wjhyu
r~qjrqziiLyf1vrk}}tfeu~
filukp|hqq|n{t}}qqovmwyujyyxlkpheXR[XYY[NPUVYXNIHEJJHGB@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5m¤¨±§º¯«²°Â±»ÃÇ
zqtzpsqopdpg_TFIC?<;9:?@ADCEGIKOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQUKAHOG^¦ªgroevgl}|}vvorw~qs5q§ ¡¢
vp{|shfbjnrmpuioXupvm{}nrnp{svnbu
ux~}|trqm`\]^\ZYa_RN[ZXWLHIFIH?CABH?CD=;:7=;:;;9:99;:?<88=:8;66650121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®°®Á²»ÁÅ|n
ul|uxxmxnwdj^IPG>?7448;:;=>@BEHKLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMMPL7CMPQBF|jurrnwgpwy{{sx|~`
©zv~s{\dqtz|wmhjbyo
zoxu
zptzxkni]v}|
}q}vw{|xqtugh`[\^S\g^WPTX[UGJJELG?F@DC?AA=;97<;;=<::99;;=>79>9985654244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ « ±¨¯À²»Åºzvk}xs }}p~zhwkRXL@E211276688:<>AEFFGIKMOQRSTUWVVVTSPMF@:2= #c[5311i?GoIFIKMNQKJSZVOG`xrrtkvuxzu¤¬©H¬¯®
©tm|~hghyn
qGmwryvhmk_v}yzuv|xmow~uusm\^^\cdXgf\UPPWYPDLKFOICFCCA?CA=978:::;;:888::?>6;>7585773344236656778;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¬ ¦¸¯³¼³}tp~~}}~¤
x~sx_cWKB60./23124668:=>?BEGHJLNQSTUTTVUSQOGC?80,#[??84.]ps£UFIKLMOW_VkWYZb|y|zz}¤¬»±¦ºÇç¡¥|qw
ihptrw{v|mvuf ª¢zzyogkx~|ulf^Z[^j^ag`ZOLNWRQHPJDNGCJDCADCB<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nuofwz¤¡¬¦ª®°¡xw|lpj]BA4.-//..02234778;=?BDHINQRTRSSTRPOHEB<87/9C><<63.lMPHJLKJNV__zdchm §¢¡©§´¡§ÁÂǯx¹|¡
¡
lpuwqm
r ¤´¨¢}kjj|uc^e`[hl]ml_WKHNRPNLLFIPCDNFBCEFC>:96=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYooupv~§ ©ge¤~y}xxgMR>//.,/.-/000212567;?CENORTPPQSQNPIED>;<:DF?><752<?R5HHHLKMNQ^jxo{v¤¤§¦©§¨³ª½ªµÇȶÈÐϾ piª©
¦£xz~¡{wª²|£¡¥µ¯§lss}~sjb^b`bhe`gg\REJKONIILFGMCHMFFCBGEB;85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m|aw}{ªªBD}x|
v^bP560-1/,.0/./..0015>AAMPRSQRSTRNSLEE@<>=FG@A@8662<9;FHGIIMNPYjs«µ±¨¦¨£¤°¨³®®ª¸¯±¼±Ãª¹É˷ÿ·¥¢°³¬¬ª£¥¦ £¦¢ª¨¥
¤¡¡ª ¤©°£¦·º ¢¯¢¡¢¡«®«²´¡¤©yz~ibi]fc_dd_gg_[OCIHSNFHKFJGFFHAKFDFFB;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhbWhoXyv
ÚÈsV|z
qna@E64<2/110-,+-0.-4?CAMUPRSUUVUM[PGHD<>>FHCDA7;<5C;=FKIFHQNPW~¦¨ ¨¸Á½¥¯Á³©°½°µº³¼²¿´¹¹¢·Ä§µÈǵ½¸´¨£³°±§¯«¥v¤¡¬²´ª®¨¯¶º²º¬¯µ¢±«±µ»¶´´¦§¢¦¨¯¬±¸··§µ¨¤x
x[cfWgcbdaaga[TJDDLTPHIIDIGEA@@KDBMG=867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[YQabWytq}u
{¿»£¼´y{xn]W@DN<6:45AB7640/6CHCQ[OQUWU\WO_UIKKA?>GKFED;>@7D7?BJJEFVSO^¨¬¹¬°¹ÆÄ²¸Á»±±¾´µ¿²¼®µs¯²¤¹Ä£¯Æ¸°³±³§¤µ¶ª° ¢¢¥°®¦«§¤¡´»¢¨²ºµ¼¿Ì¿Å޽³Á·º·¾¶º·¸««°¤¯¨¬½¯¼ºÁÁ«¹§©}~mXecYlfkfW\dYVSIGFLPGCHIAHD>?BBL@?MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALQVSYUZvjp~
nzsxb¹¡£{z||}xzueP\dGEL;Qca[^SG?;HPDZcQQYXZgYS`_LSPEA?IJHEEA@C<E6B>HGJLSZT]ª²°¶²Â·´·Åʸ¹¿º¶³¹¹µ¼²¸°Ä_s°¤±ª¼¨¤¨«ª£¢²µ¡ª¨ ®¥§¦¥¤£§±´¨²³½¶Â¾ÓÉÉÓÆÂÅÌÂÊÃÀ½¼¾»»¶´¯¸¶¶Â¹Å½Âǯ¸©¡«¤§µtadd_Yc`jgSXaVRUIEEMJA>GD=KA=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-+/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
skrrsÕÀµ }~x{{y~t}zkepuY^\Pedb`ed]\XW\MdmURmm_n_XgdTYUJDBKKIFHHHGBI:D?HKSTU\Z[´»´º±Áº¶µÇÈ·´¸´·¸±µ³²´µct§o^¢¬ ¢¤ª¥¨¦ ¤¥ª°¸°½¹ÔÑÏ×ÐÊÌÒÌÏÎÊÆ¿¾ÁɼÀ¼ÀÀÄÄÄɾÇͲ£º°´®«·»|n_b^Z`cZddQ\`SQJCAEFE<@F>AHB?C=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ[Yh_onkotu´¬¡¡~|s{
{ts{ylmu{hreilifjjh`fiilZms¤¼g\og]ZZTHKNPJKPKSQILAJFJO_^afi`´Ã®µ®¸¹²¯Âij®·¯¯ºª±°¥ª¶«µ§¦M¦¥¡§¬¯©°¨´´ÔÔÔÖÓÌÐÓÕÍÒÏÌÄÁÉнÉÉÊÉÑÆÌÍÂÏÑ·¯Ã¼Ã¹¤µ¹Á¢qe^__ZbYZfZQ]XNPABHEBH;AC>AG??A7;C>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYReVsgqoxy¡ª¦}
|p{r}qxulpx~qzmxsmipmcjmpxhw|~˾Áß§mcxnc[a`JPRUNY^O]\NPNTPTT\nmvq¬µª±¤³¨«º¾¯©³¥£·¥ª «³¢°¦«¬¥¨¢¬ÏÒÕÒÎÌÓÔÔÏÔÑÎÇÃÔÑÆÍÒÓÓ×ÌÑÑÄÑÖÅÀÎÇǨ½¶Î|qh`d_XbS_[PQTQOH>@FABE<@A>DC>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<UQMNZu
wlwp}~¡¡
y
~{q~zu
ovsls}{w{sxrksripqzyrz¾Ë}±vrvhaj]CZY[VecXcjSX\]`c]cwz}¨££¦¤©®·©¥²¡¡ ¢¡¦±¦j¢~¨°¢¡¡¥¤©ÉÍÏÈÃÌÑÔÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÈ××ÑÊ«ÂÂËuqebaZVZT]QKGJJJ@;:;DAD<BC>GB>BB:<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;OLFJXpu}hrxr
x~xs{}wznwpmvvx}t
|zmvuo}vux{µ;AÅ¥~|ieWICfcecgjcmw[^fhknhm¢£¤°¢£±¡¤¨¢±
~
y©£~«³¨§¾Ãƹ·ÇÎÒÑÒÐÌÒËÈÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÕ¾Ê˵zypg_[TWR\XFGKIEE=:7:@@B:GD?DCACB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~|x
zyqz{
uy
yo|ppzq{qnzuw||u~|¯sX©Â¶pmb=^hrpqpnxvehoruxqy¨ «¡¤«{~lz|®ª§¯¶½©®¾ÇÌÉÉÌËÐÉÃÒÊÔ×Ùר×ÕÛ×ÓÙÛÕÐÚÚÑÖÈÔÊ|~kk]\QUTaJCFJH>A>=7:=?;=G<?AAADA>?:87DB755479.556435532323647553458EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<99D>CGRj^mdbfkvqz~~{|}
wyo{{ty vutu~toou|
zv{·Å¤ÁɹwpeNfczw¢xyv{{vm¤¢ª
z}¡¼¡©¦¦®¨¶¿ÀÁ¹ÈÊÎÎÅÍÉÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆ}|jlhbVYWXNLENC;==<8:;=9=@6=??<>==9867CA6455=80665547745613854564557HH=DJE7925;H>;9:7IP][RUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Xea][htzylwvz{~~|z}
z{u}tm|}~s~{~x~ynt}
|~z©Ã¡½£}}r~s¦
{hGq ¤~¥
¥·¢§¡¤¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¸{|{nlhZb]TQOIDLB<<>99::99;<6?=><=99;;37D?7378>70688357<37804976755546FP5DNI8938AK=;3C@I<:DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=CQSRX^UXfmmmiqry{z|{z|{}t
yrysm~~w
¡n¨
z¡|}££ ¤¯
Wr«\¢
¢¢ ¤
²¡¢¨³¹¦½ÂÇÍÈÆÏÍÐÌÏ×ÑÑÕ®ÖÕØÚØÚÚ×ÕÙÙ rwji_`ZUXYC@IC?>>:48:;7:;:3;;?=>7;::1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbzma~omwxy~z}{{wsp
zuvvt~¦£¥¢§r²¨
¢£ª°n·
ÄȲ¡¥±d¤ÍÈ
~ª¢¢¤¨¡£³µ¦£¼Â¾ÇÅÅÉÈÉÂËÔÍÍÔ©ÒÑÖÕÖØÚÔÒÚÎ
ukga``QKV\BBGC;A=837;<:9=649:<:82?992:I:>67BC32:96264>=4;>6949;57944JQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBeGu||m~xz~z~vv{ln~y|wx|~£´¨¤«³¡§ ¦¤¯¢¸³¡ ¤¯£¥§©®°¤ À£É¸«£¥²
¨¢
s²£¡} ¡±®£¤¸¿´ÄÇĽÃÿÇÎËÉÒ§ÏÌÓÒÐÖØÒÏØ¼u}z`cWcXRIKOFBCD5>;76:?;<7=42669774=5;5<K<>;<BA75<;5277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGM\]YJha;Hzzm
y|x
}px|}|ory}{x¨¼©³½°¥®³´©£¢°µ£¹¥¬¤©¸¦¥£©ª¤°±ª »»Ê¡i¶¸ª°¢«½£^©²||
´ª¢¡ ¦®§¢¤³¸«ÂÈĵº½¼ÆÈÈÂСÆÉÍÍÄ×ÖÐÊÓ£s}l`]VbTQGD><CAA7?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPgHa`bpJ@~r|um}||~pww{«ÃÀ°½Æ¼³´Á½´¬³¶¨²®½«»£¨¹¸«§¦¢¡££ª¯²±ª£¢¦¥£¹¯¨¿¼¬²¹¥£§}¼°y§±ª £¬ ¨§¤¢£°³¦ÀÆÃ°°»¶ÅÄþ̧ÇÃÇüÖÐÌÄÊwve_]b^OLCL@EG?A>B<:4>A==5=6>333242A17@BM>G@CNCA=C<;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\iF_ig[]\{uo~{~q~zz¨´ÆÉÀÂÌÂùȽº°«¹»²¶¹²À®¥À¤«°¼½ª®«££§¬¯µ±© ª¢°´§£ººµÁ»«¨²¤¤¨ªÄäy ¥ ®©¡³¡¤ ¦¤¥§¤¯¥¿Ã®¨·µÉþ¶Î²Ä¾Ã»³ÑÉÈÁµx|p_[_mTNIDLLLJ@A=BD<5AD;:3=8B332262A15IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBh]Me\fTcjyr{wy¡¨º¾ÉÈÊÂÒÉËÂͽÁ³¼¿§ºÀ½¼Ä¸¬Á©³¼¾ª±ª¤¥£¬®´®·µ ®¦¢£´¼©¨¼Á£¶¶¯«°¬ª¬ª§¥¤uy¢¡©¤|¢ ¢¶¦¤¤£¥¦¥£¨¨¢²¬¨»Àᥳ·ÌÀº®Ã³»½Á¹¬ÂÂÁ¿q|d[Z^]LMNKGECHAAADK:4DH:;4<7F.12352A26SHN<JBJQEKCEE:ELB<7EV=<=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>lJ_XaZdeXx
~ ®§¤Ã¾ÈÄÈÆÒÍÎÍ˼¸°º½´½Ë»Ä¶¶¼´¿º¼®¯¨¡¨¨¶®®©²·¬¢¨¢«··ª¥¯¾Ä±½¹³§ª´³¥© ±Å§||©¤ ¡¡Z¤f£³¥£««§¦¡¤¨¦µ«©º¼Â´¦´µËÁ¸ªµ¬³»¸®¨¸º¼·pq][WXPGKTNK?AGDDHFF85FM;>7>AK.32025B55PWN<LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hV<>@BFBsFiIRfdMF¦¡¨¥¡¯¾®¡Ç¾ÅÅÈÇÎÎÎÒʾ»¶±»»¼¿Ï¶Ä¾·¹·³²µ³¸´¬§«¬¹«©¨°°£®¥¨¤¥´À°«¬´¾Â¹À¹³§¸´·²¯¤°°¥ sÁ}°¤¢¨¡_J¤T°¯¥¯°¥¡¥¦¡´©ª³¼»»«°²ÇÀ¸¦««±±£¡²²´¥srh_]QSMFQQPQ;HJHFGAC=9KT?A:=EM/7534:B44NWN<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;5FA:A?>H@5*B52,>c]g:35tde@R7}hX<:BC@=REWStbVFH«¡¨®§ £¥µÉµ©Ç¼ÃÄÉËÉÈÍÍÇ¿»³¯º¸ÀÂ͵ȻÁ¹¶º²¯¯´µ§¤«´µ«ª¦®¬¤¦¥©¬º¿¨«··¾ÁÀ¾·²²Ã°·½¬£®µº¦¥u¾® ¨¦© ¦mu¢¢®²¢«ªª«¯¥¥¡¥ª¢°¦©ªº¶¾³²®¾¹¶ £§¨¥¦©©ficbTMNHIOJUL=LDMIJ@CD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CC:9C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW<:=..SaLVH~e^HF¬¡»®ªª¢££¤¶Ç½´Á»ÂÂÈÉÅÂÎȾº²¯¹µÀÂʶƲÁ¼µ»¬©±££ªµ»¦ª§¬ª¨¯¨¤«ª½»¨¬½´·¾Ç¼¶µ¸À°½À³ªµ·¬¿¦¢ » ¶¨¤¢ §¤± ¥§©¤¡¢ µ°¤¥²««¥¤ª ©¥¡¡³´º¶¨µ²²£¥ª¡xd`a`LIGHNQIMEFFBQJH@DGAVSDH<AGQ1:B7:BF79]YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGD¨¤Ã¬¤¨ª¨¦¬¢«·Å¼¿¸ÁÂÀÈÄ¿ÍÆ¼¾¹²°¹´¿ÂȶÀ°¼·º·§¤«¬¡¡««Ä¢¥¨¬¦«¯¢ª¨¾¸¦¾°··Ç·´¹¸¿°¾Á·µ²µ°¾¤£¡¢¤¢¢½¤¨¨« ¥¼¢£¡¨ª ¤ ¶¬¦³§°¨ «¢
¡¥¥«±¶²ª¥ª¬ ©if\c_QJHKOLGEDI@=OH@;FIH[RPK=HNU4BF8>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0--0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oSF<KxfcXN¢£Å« «¢¤¦ª«¶±£ª³¶ÅýÀ¶¿Á¼É¿Êȶ¹µ´±´´·ÂÆ·¿±¸µºµ §¬«¬¥¤Á¥ ª® ¤©°¢¦¨½µ¥±¼·¶¶Ã²³·º¾²ÃÀ·¸®´µµ£¤ ¬¡¨¨ª¢Á¬¨«¥½¡¤ªª«¥ W¥¡ ¹ª§·£³¢¡°¡ ¢£¥®²¬©¢¢¥¤¤cg\ebNJKKNFEAGK>=IA:8JJN]QQI=LV\9FI=DMI8Hc\KCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+waS6SZkWsHE6=ue\LP 礢³ ±¦©££©«»±©¬µ±ÈÄÁóÂýÇĽÅʽ°±¶®±µ¯¿Åµº±±º¶¬©°ªª¦¡§Á¬±©¢®±ª¤¨½·¦¶»½¯·Ä³´Â¿²Æ³º·«µ¶®«¢¥¢« §ª®®¯»±¥¨©¢£· ¡£®«¤¥ ¢¨µ§§µ£¯°¡¢ ¡¦¬°¥§¢
dh]hfKJLKSAC@IG;;F>99NMU_RSJ>O^^=HPBMLI8Nd]LELRTY[SUO\bHA?ZQAHAKA7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<w]^?[U_gr@8<HweA4¤ §£©± £´©±«¦¢¤²¬©»³°µ´Ç¿Äõ¿Ä¾ÊŶÁɵ¬µ©°¹¬¿Ä´¸¯¶º¦«²¬«¡§»´¨°¬®´²§ªº²§¹´¸²¹Áª·³Ã½´Å§¾®·µ©¨¬¡¥£¡¡¤®·±´¶¨¤£ ¶¢¤¥±±¥¨¤ ¨ ¢¯³¢¦¯¥¬§ ©©«¡§ zek^lkNQNNT=CANC;:I?77QN]_RVQBW`]BJSHWKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JqjWDWFyfC;¤¤ ¥¾¥¨®® ©µª·¯«£ª´¶±°¸·°·¸¸Å½Ãǽ¼ÃÂÈÁºÂÆÂºª¶¥»Áø¸ª²¼£®°®³¦¨ªºª ¦°ª ¯´³ªª¶µ¬»¬³²º·¬¹°Âº½¿¦Ãª°·¯©««¦ª ¡ °®³ª°¸©¦ ¶¨¥¢¢¯°³«±¦ª¥¡£´°¦¡©£¢©©§£~
linbnoXQQZTACDU@;:IA7:XPd^QWWEY_^MLSO^LJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=DFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gYaF(@8m}i\V;{cC=¨¡©¼ ª¯ª¢°·¨¤³²«¡µ½¯³¹½»½··Á¿ÉùÄÃÁÀ¹Å¾Á¸°¶¨«·²¼¿¿´ª¯²¸«©®©©§»¥³«¢±°³¬ªµ³µ¼°±µ¬°µ²ÀºÅ¶«½¯±·¬ª£±¥¥¨£²©²©©²§¦¤´®§¢¬¬°§²ª°©¢§£¡¨¶©¡ ¡¦¦£ {gmrhqs_GYfVDCMXDZ9HB5>]Qh\OZ]G[_^NMSXcJKC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;GDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aV151=`V_8)C3YU\hK5zfL@¥¤¬µ£¬¨¤®µ¨®³¸¦§°·Æ·±·¿Á¶µºÅ¾ÌŹÃÁºÀºÅ¸Áº³´¬ªº·»º¾µ«¯±·¨¬«¬®««½«®±£©±³®®µ±¹¶ª¯²¨¶°´º¼É²ªµ´±´°¯§¡³¨«¤±¢ ¥¯¢¤¢¥§²©¡¦±«©´¥®¯³®£§¬¸¢¡®¡¥££¡{
{lnyov}aF`jZIHZ[={JGE6AcTi[M]aK\][RRSbaLKE`a`QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.+A/JGP[G3cXTLE°¨°©¬¤£®µ¨¶³·£¬³·É»µ»»¿¾µ´·ÃÀÌǼý·¿¿Á¸À½²½®¨ºº¸·Â·¬®±º§®©¤²©¯»¤¬²²¦§¢²´±²±µ°·³©®¬²§¸¯¶´ÃŶ©µµ«°ª§£¶§°£±§©©¢¥¥¤·§¢±³«§°§¯´¬¤ ¬¨ª¹¢¨¤¡¨¥¡v{nqxv|\Lel\KOd]?b{GI8GhWe\L^bMYZWTXUj]OPHa^_PKGQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=ELQ<3rjLED¤¤¬ª¥¢°±²©·¯µ«´¹È¹®Á¼Ã¸³²µÂÃÎÄÀ¾µ¾ÀÀ»¿½´Ä©ª¹±¶·À¼°¬´´¡§±¯¦§±¥±µ¬ª²°«¨¨µº¬µ²µ«³¬ª«©¬©¹®²±È¿¸¤¹°©¦¨±¥¤£®£¨®£¢¢£¬£ ¡©¦¥¸¤«´´¤ª«©¬®µ®¢£¨ª ¤µ£¡£§¡ w~}|}rts~}\Scn^NZg]FD[G:MnXa[MabNVWVWUYh^QSMc[[TKFOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3De;6*HdHJ+:I?3CIS,>k@HI¨©¡¨¯¤¦£³³°³´°° «½Ì»®Â½Ç²´®´ÂÃÑÄſ³¾Âü¿¸½Å¨·¬³¹½À±¬²¢¤§®«¨¥°£ª°ª®ª±®®¬«³»§·°±¨²ª«¥¥£¯º¬ª±Â¹´¬¹©©¨©§±¥©¤¢©¨¢¢¬¥¬¡§¨¡¬¦£¬¶°± ©¢ ª°¬§§©¤¡¨¡¡¥|w
utrwl_Y_nbQsq\K;|F>WuWaYOd\NVVUWQ\b_SPNhYXWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=398;*35>10485(5/*,.30;),,'%234$,2-860)(2=^K0.IgDF8<B05EKX1@]@NF¬§ ©±§¨°µ¬¸µ©¤«ª½É¼±¿¹Ã¯°³ÄÃÍÎÿÀ³ÀÃĺÁ´ÉĬ¯·®³ºÀ¾´®®¬§©ª±©§¨±¥³ª¯°®²³»¥·³¬¬®¨«£±·«ªº¶¤µµ¤ª§«¬ª ¨¦¦°±£§¥¡¡«ª¡ ¦£¢ª£¬¢¦±¶¬¬¢¥¢©ª®©¡¥¤¤
¥£|zu~ux¢xj]_nfWedN@gLDbzWbXRfUMVVVTO\]aVKOiXVVHJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<.2,&07XZ.0JgAA<<C+:JO^4DBIID®¤¡ª¯©¨µªµ±ª¤«ª©¼ÁÀ¸º´¼µ¦³¯ÄÉËÒ¿Á»¸¿¿ÃºÂºÁÄ®±µ²´¼Á¾³²¯¬§·ª¦¯ª·®§°¯®±ªµª¶¶§´·«¬¤©ª¤´³¨¨¤³´µ¡ª¨«¨«§«¬¨¸µ©ª©©¢¨ª¡ ¤¢¦¢ª¦´®§¥©¢£¤¦§ª¢¤£
£ t~xu{x~pqffpw\atjO]VHmyUdVRcPMVTUQOX[bUIQjUWTGOXUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E23;:7*4:=+-341*8**+*,)*(/*&)%3;,$2)2/22%/3Rc02?f=NX?C,?LT_/Ik7RF;¯ ¤ª¬©£®²´¯©¤¯©¨»¿¼Á²°¹¢¶¯ÈÇÈÐÀ¿½º¼Ã¾»Ä¿¿¯²³²µ½¼Á²²´«´©¥µ©¥³²¸®¡¬´±¯±¹«¹®ª®·«ªª« £¡¶©¡®² ´ª¨§ª¢ª¡¡¬¨½®«®¡§§¬°¢¢ ¨§§©°¨¢«¢¡¡¢¢§©¥}
¤¡xt|twy{ut{k¤vi^ekug|RVo^KxsTdSQ_MMSZgNMWYeYGSjRR?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HP;YC3± £¥ª££¢¬¦³²±¨¤°§ª¸¾Á½±©ºª§®°ÉÆÈÐþ¿½¹¿À½É¼Á¸±°µ²º¼¹¿³´¼¬¹¬£´¦¦«±µ·±¥¦¹´¬³¼¯¼¥µ«©¯¤¤¬ª¨ª²£³¨«§©¤¨¢©§©½ª´°®©¤ ®³¢¤¥¤¥¨ª¥©¡ ¤¨©
~
¢qzy}{gv|zuqr~jy
d_gcr
{mhy]^UAW{mTbPRYKLNpt]IZ[hZFVfPC>JODCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°¨¤¡¡«¤¶±±¤©°¦¹Á½·±¤¹¬¨¨¯ÃÉÈÌ·½¿µ¸ÁºÈ¶Âµ´²µ²½¹º½¶®¹¶¿¬¢³¦ªª®´¶³¨¹»¨°¾²º ®´¶©«°£¥©©£¤°¦¯ ª©§¡©£¨ ¼§®°®¡ª¢¤®¦¡¢£ª¢££ ¡¥¬{}¤}yk}vxxbzzqoqtxjukgcgansmbjo`o@\ykV^NQRKIMTYVM\^mWEY`P^OHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R^>#¬§¢ §£·¯¢¯¯¨¬¸Ã»´® ¹¯«¨³ºÇÊÇ¿¸Á½¯´¿·Ä¶Ã²¯º±²À¶»½·ª¹¸¾ª¤´¦¨©¯¸¯§¸¼£¾´´ ¸µ§¦§°³¥¦¨ ¥¬§¨ ª¯§ ¦¢¨°¸¤±¯ «¡¬¤¦§¨£©¦¨¡ª}~||¡z }
|sp}qss_xwinqqpksdzlgecaf`[rjrMMiXZMQLKHPSPGL[`oTFYZRhOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0]\5(¥¬¡£ ¶«°£´³©©¹Å·³®¡¸¬¯µÅÇÀ·¿Á¹°µ½·¿»¾°¬¾°³¿²¼Â¸ª»º¸§§´§§ª¯«²¯¤»µ¤«ºµ¯±¹¯©¥§¯±¡¤ ¤£ ¯¦¡¢¨¯¡ ¡¤¤¡·°¡¦±««£®ª¥¨¤¥©¤¢©¢z~y{
~z{prwnos^wvdlllkj
nfrijeh]ds`[kviZJ^[XOOKHHSVG39^_lPEYVYfMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDT]hD.<2dW,1¡¡ª£¡¢¡¶ª »·¥¬½Å´°¯£µ¯¬¬¯´Ãü³¾º¶°³¹¸º·º¯À³³¸¯¿À·¬½ºµ¥¢²©§©±©«°¿´¤§´µ¨²¼©¨¥©¯«¢§£¥ ²¤¤©©¢¤ ¤¸©¥§®§¥¡¨ ©¢¡¡¡ª ¤¨¤z{}{
{w~|ltrlksawthhjhgphhidfii`jcjh[f{b`StT\[RLJGIPT@!*h_iMDWU^`LJHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gP'2¢¤£§£³¬§ªº¶§¬ÃÁ¸±¬£¶®§¯·¿¿¼²Á¶°®²¶¶¸¶¶ª½³®²°¼¾·¯»»±¥µ©¥¤³¦¨Àª§¥¯³ª¬µ»©©¬°¥©¦¤¥¬¢¤©¡¡§µ¦°ª® ¡ ¦ ¢ ¥¬¡© y
v~{s~~fyojjkftskbgddvceffejickr[_Y]lcaNiXZ`VJGIKMSX>9_lhHCVT\[IJGFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£ ¬¡ ¤²±¢²½¶¡±Å¼º²±£·¬ª©¸¼ººÀ±®®®¶¯³¸³©«¹±¯®³µºµ°¸¼«¦´©¯¢¨¡¿°£®±¯·®µ¯¢¦¨¥§¥¤¢¨¬¯¦º¨®¢¡¤¤¨ª§ª§{s
}
ofymgkifprk\gcctbfgjnlgjjhn]llrp`TcicfZIFLMOXQQUaeUAWSYTFIFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9A1-+.3<;K60.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC&4¡¯¡©±¯¸¿µ ´Â»¾º±¦·¯§¤¶··¶¬»®¬ª«¶ª³·®¦²µ±®©°µµ°³µ¹¦¨µ§¨ §«§½¬£®°µµ ±°¨¡£«§¦£©¢¤¤ª«©» §¤ ¡k¢p£u©§¢ymiwql~
q_dag
ktw~gguheW\hsnMPicgr
h_efnmj]`aeNKD9GTh^JHQPUULHSapteF[QUPFHEC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=A@@=28@E=1,,08=G701.*.*/568,#1'214:176Xl16Ok[N\K[fb>G1Qd=*.¤° ª¬ª£½Å¯©·Â·½¼¦·°¥ª¢¶³²²°¹¬©¦¬´¥¯´£©·µµ¨§«¶²´²¡¨²©¡£¤¥«¹¥¥¯³·¯¥ª®ª¬¤¡ ¦¦ ¥¤§¦§©¤¶°¤¢¢£¡ ¥¥ªsx
¡vif~sx o~}¡ }sulmieczlraS
mbliqXiqpY^i[ll[rnzr
fZ_GN?G_NFRVVQQRWUg]MVIRROFHG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*.(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(§«ª©§ª¿Ã¯±º¼¶À¾ª¥·°¨¬¥²´®®³¶ª¨¤°¥´²®µ¶´¦§§²°¬²§© °§£¢¡¬³£¥¥µ½¦§«ª¬¨¤¡ ¦£¥¢£¤¨¢£¥¦¡·¤¤ £¯©¡
±£¬yÔ¨ÁÆyx±¥·eÀ¿y
z}Êr»Åzrµ§º{m±«°yhlX±®nei¼¼ngznrØ~Skc¶²~rs¡ªWOWbOVNFU[XQQS]W[QA]DQNEHI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>:B<?A8:J>52*22BE/.32.+/(-/186- /416A1=9Ww21Tk\O[M^g\>L1[]41!§§ª¥¬±¨°Â½²µÀµ¶¾Áª¦³¬¬¨¦®³©®µ³¦§¥´¥§¸³±µ«¦¤§±°¦ª¦£¯¢ «¢³º£«©¢®¥¡¡§§¦§¦¡¦¢¡±££
¯kjª~fdp¦p®¡¤~x»}l¡v±_j´[¥eag{gkyk©e¾qg¦u±j{±xtcnm§n[¡EhfEu`~g|¤§Z`«hxyj§7J¯\XSld[KOX_\WV;NOWW/ITSJDFF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=03.33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_X30¢§¥£¤ª±·¬µ½¾°¶Ä²·ºÁ¦¨°ª®¨¨¯®£°º¯£¤²£©¸§²²°£¥¡©¬®«¯¦¦¢¡¯¡«¥¡³³¢¬£¬ ¡¨£¡¦¤¢ ª§¦¡ ¡
µµx
©µv³·~©k¦{w«gk±\«ztrx °vwqlll|N¤XHbb~ch¦`yruS^Q©mcq}b.Q¡o[Skh`LJ[dX\ZB>²{XXA#MhFCEA@A19>88:84;99<9:A:E::;6:CB8=?KNG:5:@FB@AD<FD;0201;F,0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50 ³¦¦¡¯©¨³¬©»¶Â°»Á¸·¿©¬¥¬±© ®»ª §³¬£«´£¦²²§£¢¦ª±§¯§¤®¬ ¤¨µ¯¢ªª¨ª ¥§¢¢¤¢¢©¦¢¡Õ¹p°Á~Å|Ö»|¥¤{¤¥z¬yV¯z~k¹[ºw~¦{zªxz±nt¼
oP¯§ÅQ zc`ªbsrm`Sµ´È
|c¤3Bv]PjicP@XhZdaJHMqP\QOYfZCE?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<9;DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7H:aP71%¢²¨¨¦´ª¥´©¤¼·Á°¹¿°µ´º²´§°¯¢¯²¥µ§§¸¢¯±³´° ¤¦©°¨³¨£ª ©§°©£¢¨ ¥ ¡ ¡ ¡¡§¡¦ §¡²nhµq«n¦r´sr¶{¤¢~¡¦±wÒÒv\®{
¤oª¦k
}}{±qw³etogQÈZÂ\ yb_¬`usb^YÊo¿uMKµSUÆdTQjceXAPk`lhPVGJ9=URZWXID?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=`L620¢¥±£«¼¦´¦§µº¼±º¾¶µ³¹¸²¤´² °±¢«¯£¦¸¤±°´·© ¥¡©¤±§¬©£§¡¦¥ª°¦¢ ¦£¥¥¦ ¢¡¡¥¢
¬{w¨v£©o§¡¢®³\r³R®}£rØ~x~v¯v´aemZ°XKuyf`¬^uwhk]¯wxl5yÈ®²_BTo^g`EPl`pmVVM.feiSYP;BE@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK96<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GB_H:99 ¹°´Â®¨³¨©²º·³·¾¸·±´º´¤·²³¬¨«§µ«¨°±ª³£© §¡µ¦¥©¢¤ ¡¤¦¯¦¡ª ¢¡§¤¥¨¤¬¡¡¢ ¦©}}¥x¡ªp§¡£«}yo±Z¨ztÙwt¨¤{z²^d ~m]«[Zhgªcq|ks]«Z koeOJC¡\[Lt]bgN[a_qs_KW7JXGE=HGAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@5.:>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FH_C2?8¢Á«´Â®«©¥´°·°µ¾¹¸±°µº¨º³¯¤¤¦¦©¯¨®¨´«©®¡ ¦¤£¹¡¢« ¡¨°°§¨¦ £§ª¦¨§ ¢¤¡¡¡ ¡ª®mr´s©u§s´xs³¤£¤w¸p{¢jk¶Z¡
ei ¢§nr´t~²j
ju³af¢ok]`M¡|Rs£kx~oq\¯V<wfTon.\§OcSkebmYc]ap{cT[R>=nq3CB@?L:!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FL^81C8¦¼¡²À¯««§·©·®µ¿´º¯®·¶ªÀµ¨©¡¥£¡©©§´¢²§© §¤«¸£¬£¢ ª¶°¨¬©¥¤¬¢ª±£¦«±¡£¢¡©ªÔ»s°ÃÃ~Õ¸x§z¤¶u~wv²`ºyÀ}v¸cµ©}«©q{t¼§ ia¦¯¡~uª}¾os¼t²txnqn¤t½^w}Zay¼kZV\jy^jafgcmwoY\ZC@@t@CG+4G"';?10<?7:B99=C4<@NZ^```__ZPPRKEFJ4HLR@JNEFOB=E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¢½¡²Ã°ªª«±¦·¯¶Ã¯¸°¸®À°«£¢£¡¨£©²¤´¥¬¤ª¦¬¸¡¤¢¯¹²¬¤¨§¤£¬¨«¨£´£¥§¡¢£¯©
¶·xµwmknsoy
tÁ»½{±¨ps¹}||¤»¹½ty´£twvt°ufjµtrqx¶^z}hynzc¬pu
X[§jEeZTf`c^cQggpluCNQMD:[M?J3;/ 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O^]=+:VU'>;<§¡¢À¥µÃ´«ª¨¬ª©¹®°Å³²µ¦³·«©¡¡¤ ª£¬ª¥µ§¦ £«¤½¦ ©¡¡§¡±µ·®¤¤¢¦¥ª§¤¥¡¨¥§¤ª¡¤¯¨¥¡j}i¥wr}tyd{½¾ÀºoraskZ_ack`dnwcle^`bpir}gkrtx}b[wthP]m}{kXkzsJJopNtLEX]gaL[Wgc_O[mtiqRQDEM;GI<M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S_V4)P_L(2=[O'?2>© ¨¢Â£µ»¶£¬¥®§§´±¬È«®²ª³¢½°±¥¢§£«¦®£¤´¨¤ ¥§¾§¨¤¤©¨°³¿§§¢©¨£ª ££§¬£ ¬£±§ °¤ §¡¡¤¡gm}qw¶«¡ z¥
mk}}uqxyvu|jstuew}wkozm_d]phMYZfj`WZoxmmfUOFR9OYMRO(+:KB635=@A9:C><ENSSTVWXZZ\\`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\J,<-@³ ³¢À¡¤²²· ©¥²§¥¯´ªÇª«¯¥³¤À§³ £¤£ª¦¬¢¢¶«©¤À«£¡¢§¨§³Ä°««¨ª«¡¢¤¯§¢¦¨®§ ¯ ¡¥¡ ®|«©
z£g¡³¯
v{}wyzofyjuysis{vjudzf`jecdfkYl{oij]SLPD^TE@?>,4@F;45;>A;<?>>HNNOPSUVVXZ[_bca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T\Q05N[17E3[G5<,@´ ¹°¿¬¬¯²± ª§²¬¢¬²¯Ä¯©ª¢±¼¢³¦¢¡§¥©¥¤¥²´¯¥¾ «¢¡¨«¬£´È´ ª¤ª¦¨£ª ª¯ª¦¤¬£¯ ¡¤®£§¢§e|e~cymhk{¥«je}geeih{¢lh£wkj¢skmzzXf^^mv\hswvnxxsnytv|jY^ltd]sik|pkc_RNWIdXAJ4>F7?FD71<=?AD;;DGHHILNPRRUW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO2YC;?.=¦ º¼º¯¬´±ª¥¨®°¦¬°»°¨¦£°«£¡¦ª£¥§©²®£¢¯¥µ¹¥¢ ¥|¦®£¨´Å¸¥¢§¯¢£¢¨¨¡¡ª°¬¬¥«¡ª§¨ ¬ ¥¯£¨¢©}½r´rhx¹Ä¸q££z¦r«|ËÀÀ»q£|À½ÁÁ||ÃÀ}l¥²ooÊzwuyyqzpw
ymxcg`xd`eb^sglddYLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNQSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP.#F[3PY/UAB;/8£¹Ãµ°°Áª¨£¯©°®¥²³®©¤¥¥¯ª«¢ª¦¡«¢¤¨£¤´¤¢¥ª¶³§¡¤¡ §¥¬®ÀÀ±¡©¯©¡¢£©£ ¡¯«®¨¤¤¨¡¦¥¬¨£¨¬©§ª£¡~Îxz¤y_®^¨£¡|§s«¯^cª{¨
t³c« ³j¯u}·bZ£Ínv{Ú{p}v}e{vvk|n}
~m`rmph`_ye\qgidg`RTSW]KOD5AHDD8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1ÂÀ¿µ´°¸£ª¨´«¥²««ª¢«¦®ª¦¥¢¯ ¨§¢¥ °«¦®«°ª¨«¤¥§£®¦¬±¨¿Ç³¨©±®¡©ª ®°©¬«©¨¥¢«¬²¤¡ª©¢¥¤®¥ q
u
¨q±}r¬¢¥v«}s¬v{|~ª¡}«{ {WÅ{pÁ}lupmevdnawnronfpuuqagmf_ohingdWT]aZRSC9II@D<>=@FECEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<(=1)3W@F!G:C1.+°ÓÆÆ²³ ¢¢¢¢¬®¶®¨±¥¨©¦««¦¡£¢¥«¡¥¨¨¢°¬¨§®«¨¦§¢¡ §£°¥µ«ºÍ±¦®«¢®¬ ©³««««¥£¬®±¡§«¥¤©§§¯ ¢¢¤j¤uz©tz²p¦q ¤`aR¬
®v¨
{
zf£¤£}©~®_|©V£z£{îÄr¯³³¹qb©¯Âthnqozxyplfferpf}jc]W`jXYUMMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+55*2PKL# A9D4,'ÃÉÖÔ¿¡«§ ®¢¯´°®¨¬¢§¥¨ª«©¤¦ ¤¥§§£«¢¬ £¯¡«¤´®® §¦¢¢¨ ¦±¦¦©²·È²µª«©¢¥³¡§¬¥°«££ª¡²¡©²°¡¨§¬³¡¡¥{©lu«y|°o¥ Ò¸´·É²_`©¥ zxªÉt¤¨©ÆÆyg¡¥t}¯]o´b°uK£m§Gd|qq{u~|n\fjsqfk_aYdn\_YIMMKEDAB>A<B?I;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ©²¬¬¥¢²¸«ª¡¥§¤©«ª¦¦¦ª£®«¥ ¬©¥§µ¢©ªµ±¬¥ ¥¬§£¡ª§®¢¥§ª°µÃ±³ª¬¨¥¡£®¥¡¦¦±®©§¬£¶¬ ±¸®¦°±°¢¦¡Nxz£}¤
¦¸{|y¹ÌÆÂ¶x¡~v¥¤©°
¬}c¦m¤p
|r¬`£rq`¼}RUt£{~v{sq]mnxrjo[d`iocd]KLQTAIHFI:9K?B108866877-*5==?BDGILNPTVYYZ[\__^]__\ZZZYUSOH@882.,*.+*''?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¸ª® ¬³²¥ ¥®ª§¦§£¨¡³®¢©¦² ©¤£µ¢¢¢©´¸£¡¢¡±§¦¡¢°®¦©£¶³Å±©¬©§¢¤¥¦¥«±¢¯¥¦¯¤»¡¶µ¬³°¶¯°¤®¢
ѵ÷y
¦y¡w ¥qª
µnri¤}s¯¦£¦nq²]¥tzl{|m©a¢qqbs²¸hw¦}z}ynjyizsou^eeonfh`J[XX<HG@U4@F><*)63.013)&4:;<=>@CEIKNPRTVWWY]__^^`_][Z[XURRQF:223//++(@QRTUTSTVWWXXWUUUUQOQ[U%!2AH$)%s¾¾¼¹´§¤´¡¡¢§¦®ª«¦£¥¡ ¶§£¨§°£«£¤£ª³³¤¤¨®§¤¨¶£«¤¶¬Ä°©«¨¡¢ ¦¢§¦¨¨¯£¦¬¦½¬¼¯¬¡®±·©°¤§¯¡¦y¨}|°w¤¥m²p¡|¡¨¬
®
ª ¢{~«ªw z¯^¤}¦§d|rj¯]¤kp]`[ m¦||knctnz`hfqoihgCYa[=KT3U8BBC8$$3+''3, /6674359@CFIKMNQRSSVZ]_a`aaa]][ZWSPONI7042.*,ATVVVTTUTUUTTUTSTVWWXVUUQHFIJ#((½¨Å¶À³¬ ·¥£¤¢ °¯ª¥ ¹¡£« ¯©®¡«¨¤¯¬¦¥¬¬¡¡¥¡¥¯¢©§·ªÁ¯¤©£¦¦¥¦ª¬¤¥©¨¾¤Áª©¡ ª°·©«¤²¦¨u¯~
~ºe°e}¡§¬°§¤¡¢
¡]lk³`{{±mgn±[~µ\¤kÈ¢d{»WvµY²|R®z¬W¡m¨|z ducxu}bjgqngfePUd[AV`>I(>9=4!",%2. *1/045799<ACFHJLNOQRTWZ^```ab^_\[XUPNJFC553./@UYXWXWXXWWWWVWWVWXWWXYZZ[\XWWGB;Ò²±¶½º³Á²¢¬¦¤µ¨ ³³©¤¡¶¡´¨ª¬¯«¯§¡¯«¨¦¡¥®¨¡¥¤£¦¡£ª³ª½¯¤§} © £©®¨¥¦¢¤¨»Å¥£§©²³ª¬¤¹«ª«©£¯¤¸Ãº§¬¯§¦«Ö½Âªb¤¿½}~£×»¸µ½¾m£o«lz²°Çi«°¼¬wv¡¾¼s¦ {|c~{egz|alfkkcQa[Sj\@UbCN)=:4/$%2 $(0496677;>ACFGIKMNNQTW]a\__a^`[\YTQMHC?=A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»³³°¿¸±¼²¢¥¥²¦¥Àª¸²¨¢À§¨³²º¨¯¥¦°«®¥¢¬ £ª£¦§¡©¤ ¢¬®ªº¨£|¥©¡ª©¡ª§ £ªº¨Ã¢¬¡©±²§§¸¥¬¬svª¤¸d ph®nnw¤u®pq¨¤¯¤smmmfxonpzjqigrij
gqd]bjoY\f}v¦_apnee¡¡}wfxilzzemdgmcKdXJkZ:QfER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWWWY]^^]\\\]^]^][[UW^©¬³¨¹¸±³ª©¡£²ª¿³Åʾ·ªÁ®¤¢¨¬º£¤®¬¥®©
¬¦ª ¤£ ¤§©¤«¢§¦¨°»«¬|¥© ©£±¦¢«¹¯À¦£±¤«®¯¨«©¥µ¢¬¶¡©¦·£ª©³¢ª ²¢¡¢¡¥¢¬§
¥~g~tusp§lz¢¥tjwrxx}zjmedpeU`Y@j\HdbPY+F=+'!750.!%2(*699469;>?ABDEJKKMPPQXUWY^`ac]^TQKEC>9=@ASX[\YWXXXXXYXXZZ[\^__`^^^__```_YY`¦©©¤´µ®®¢°£µ±¬È¾Æ»º«£¦§±©£¶§©µ§§¢§¬¤¨£¨¨§¢¤¨¢¶º¨ª| ¦ © ¶£¦«·§®À¢µ¤®®ª§§±¶¬º¥£§¶¢§ ª £«° £°¨°£ £ª¬¢« ¡~e
utwsj
}£¤
}ss{s|joe_qj`[`ZndQaeQZ:GGE>2=>9/*&+)&&316668:==?AACIJGJKLMSSTUZ``iaeVPKACB:9EMV[^^[Z\[[[\]]^_]^_`abbaaa`bbbdb\[c£¦¢¯±«®£©¦¬§µª¤µ½°£¤|¤²¤¥±©¸¦£ª¢®¢¨ ®©©ª©¹·¤¥y£¨¸£¯µ¢®®t¢»¡°vx§¯¸t«£«d\bv ¥}m³¢§ª£esyq©m¢©e¦
wjv
pz
`hZughs|¨f{
yj
ozkqe`wplki\febbqT[>NNNSG>@UD:1/&4:306678<;>@AAFHBGFIKMSTUY\`hfgWQJ<DG<8UR[`ab`^__`aa_\]__`aabcdabaaedchd^]f¥¢ ®¯««©¥¨¢§¤«¶±³§«¨t± ¨«§¹ ¤¬¢§¡
v§©¥»´§ uw¡¡§±´²¹¥}§¢y ¬µ¥°ª¯¤z¬
¡¦¨§
w¥z§{³z¡cz
mpyp}
s
wht t}£
kly|rqheypjlk\elkfu]^ITLR@E6.[UU7)!09>>743568;:=>>@DI?IEJLGSX[Y[bahfYQH9EL;>aV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah¢¥¬¬«§¬ §°¦¦©¥¯È¿±¢¨ª·
§¢ ¾ }¬¡¡
§£¤º²§
qv ¡¤«´´Ê¨¬¶
¯®«¨¦}¨s{w§h¤y´ ¥§Â«¡r¥~
³¡}¡¡}
ms
~yq{tÅf©£k
¤qiyv|xhivrhhl^dpmgnYgG]RM3E57Nbd7&3<EGD:64658;8>==?BM?NJJLCPZ]\Wa^il\QE=KM@IcX]cfhgbbbbdc`_babccceiicbbbecafcbbi¡¯¦§¨¥«¤·°©«¦ £¤¬¥¦¬¹¤°¢©¦¼¡z«¢w¥£¹¤~bm ¡¡ §~¡§ ¨¬
£©¢ukvM«x§¦©«}¡{z§jlg·~n`dY|dhr}yl]}m_Rp\_kx_Xd|p§ªk£nr¥p
jg m\p~gZ`cXQpwfnuskjp^kqnljYiO]YF9A5HE_l5,IDRMN=84859;6@;;>BP>QRLMBJ\]_W]^bu`MD:MONTa\\ffiibbdbddbab`bdcacikdbddgdbgeach¸©£¦¬¡µ»ª®¢¡¢¥¯¡°¶¤©¢¡ §´u¦~
¬¤«¦±§¡in£¡¤¢ v§¥~
§ª¥x|~¢ps|ym¨{¢sv¦f~w¤_z}t¢n·´ºtµ¨dƸ{p¶r£cs¬«`|i³~m|q£lr£t
¤a´s}³ut\²kcpuwripYlmssg]j^bLE=D6RBZs3=SG`JR=<395::6D;;@JP?UMOQ@E__[ZX``|dHC8MWUWbaZefkkbbeadd`ab`dd_`cknccddhdbgfchh¢·ª¤·´¬ ¢¤£¦¯³¯¢¡¥«x
q¡}¨¡¤©¨¥~j{~}¡ w¡q¡©¤¥¨|~z z£xt}¥
¢d¡|mho{§}rit«tªh]
v
gªk¸f\¨p`^§vu~guon§^©y»k~ª\]´h]nrzxlj\qkyzdagXbBRFO7WDRo5K[[_NZDA251<;7H?:CHU>YRY]>Db^V`Qac}jEB9N\^YdfXfgnmbbe_aa__``ec^bdoq`deekecihgki©³¦c«º±¯¬¦© ¯²©®¤¡ £ir{z¤©£ ixz¢ rhp© ¤¥{°£¢¸w£³£¤y{«~¢q¡|
¯µ}k¡y~µ£¤«¨|}tªZ]o{xbL{z
cyBLX¢iq{lux±³§wnt~ptk¤^vHedatr~ofaliw|eebQ_W]UW@ZFQhETW]bX^ID=B8@A:IF8LEXAWR[WDFb\Z`K`m}rEB<U_bZeiVghmobfg^aa\]^`hb_ecvl]egfkdeliiki¯¬S^ ¦³¹±²¨¢¬ª¢¥£©¡woy
|r¡s¡
ª|l
q¡x|¤ ¢}µ{¥y©{§hwm~t¡sr|p®}£¥£o^¨gu¢co¥aÓ}{xstb¢~£t¤vk³`sª²¨¼wm~¿¦©´]m{pmr¢q]¤gs¦`h¦mÔ~p{{l|xsn©¤gaezr
lhfdovxhacS\fQRbHXJUaXT\fk\eQFCKMJKBKE8O@QNXSYOSQ`ffjRdwywIFEc^fZhjTihjocjg`c_]]]_hbaie|d^dgdkdjlfhlh¯«T[J~©¯±³¯²£
ª ¢¥¦©¡«¡
{p}h}wol|¥«yvmw£{¢£³¡¢¶y¬§¤®¥o¨
z¤¡r¤®¯¤ vµ¶µÉ¡s`©mz¡u¢w ~pMf£ps¥{ytak} kqd_q}shzi³µ³Æ¦r}zk«v
nwyj|vsQE}³_jwlzgkhcuvqoW_TYiPSiJWMYTV^iloVhWMKAJMKHJOBQKPecjmetrsy|nu{{TQOl^i\kiRjhilglfce_]]]^ibdik{_]dhcjfomeile ®¥d?¡²ª®®´¢¢ª¢£¦¦¨§zjye yui
z¦ªz}xp¡y ¥§fnxl¢d{p¥wpe¦z¤ysw¹n¢b} mriªku mo¦`iiu¢~`upbh e~iuocfmq¢Y^Zb¡l]mz}sqd¥mx¢dg§hsp¢pUp `f¨U^TnntlsnqikytkpRYWWfZTmJZP]IXiisjYlWQRFV\LXSbUik_xt{}p||r{svv^RrbgcpgPjhhllnhdg_]^]`jbjivt]\chcjjslfkmc£¥ydsl¦£©°±¦¬§£¢¤£{qh|st~{e|¨£~ri¦} ©¥¦x~¥±®¤u
x©s¥n¤¢»n}¥¯
|¥zr¨ g~o¬dw¨mª¢vw«¦k°kv³©k
mm_}«ªv}~¤v|¤ jx¬h®¶ux¾¤Z§«ausur|uqckohmTW[Vab]lM]R^J^mow`[qY[`[gtenorbrt`xz~yrys~{{vbxdcnrdRkgholrjfia_^\akbml{o\\bibljwmglnb¤©£©©¨¦¤¬¦¦«
t{p
~ttrn}|§§§
vnl©©¢t~x®¢~p
v}{r§q~}zy{~v {~k
[yyrzqin~ruqe_wusuoynml^ugwe
¨}t{jpv}wnnhtz|x
\lXyioxsrpxxp]lojhW[`W]gkdWcU_R`pyymkwfkkkw}rrusaovbt{xuzuy
}{nldyn^Vnghukxjiie\`ZcielqunZ[bldllynhkoa¶§¦ ¡¦£¥«¢¡¢¨ªr|}~{tsq
{|
y~¥|¨¡
vr©¦ª~~¬§¥wnxn}¨
q~qkp} hl\sqtkwtYrn~j]je{`iy{{u
gwj`oqu^q¥enwqzqhif}
{[]khnv\|zxvotsh]nllcZZ_ZYmr\`bZ_^ft|vpudkkk|}s|yudnuhm|~vz}{yz~o
{}t~ysiT\qilvpugkgd]aXjhkkqrnW[enlgsyohjl`¨¯ ¢ ¨£¢~® £¦|}s~v
ror~{
¡¨¢xy¬¡©¡¡£¢© ¦¤
zv§~²¦±¥k|wxe|
w|zt ~}tns}v
¤}zn~zksiatq~{xwpxu]^oio`_Z]]SirVe]]bmhv|}topekji}nyrjpqmg{sw~
zm|zx{}zyNdvjsnpzekecb`[tepfrqmV^ltmhyzqgike¸¡ ¤ |¬¡~y|nys~mk~z~}
¬ r}z©¤¡
¦¤~tz¥{}«¡©~pxru`u
nyvt¢
s||qqzzv¤w~rm}oilnh^zh~}wvwv{x]`q~nuad[]_RgnUf\^bkiw{rlmdkjhltllupzpynv}
vq~{||{`h{juhidjc`i\duhobumlUcqyepz{sejmmµ ¢{x§¦z{}n|ys
~}kh}|}}©p¡
|§x¢~¢ £|w ~|¤¢¢¦~~utqwa~r}r
ixrx~r{{owzyx£zv}hs~z|rmlh_~si}vvt}tk_`twqxedY__RkiVfZ`aijwzrgldlhfkn~hoqly{ls~tv|{}irntiahlb_qVtoln`xhmWjtvcuz{rbjoz°¤¤ |w¥¡£y|r{tv
~xgc}x}y¡p
¥¦
w y~£wv~s£¢¡~|vq~n{d}
ql
fvo{
|x{{zp}wxvw|xazzuxhmfbjkxttw~r}cdasnusnaZa^[meSdYaailvzrckcmfh}liuhnpj}znrt|~z~|mvsumeljbbuVipn`xglbjvpfy|zq`rl
¬¦§~xªzy|~}|xtzzt}d_}t}~~¥¢s{¦ r¥qkzo¤
{zqzlul|~nwp~erj{~tx|tv~|{¡xt}tu
qb|v{r~pbpde|copwsyxtubw`plvnp]\`^^k^Q^Ycaint|l`jekchwngmikmi}{xot}t{}z}}ryxxmljh_ircgqoewgnlazij}{xpaxm©£¨~x¯~w~|}|wxput|p}|a\~rz{¦}}£m¢ lezp£}{
tsvlqnv}toqu||fqmy||tsxm~|{¦z{~w~qpfizuvq|c_qakt_qk{zzmsqfz^omsmsX[_`bl[PXYechrrg]jigbgqodjheiizwvp
t|u
x
|x
zw~{{sxjk_phtkromrgole|cnzvqlww~¢¡§ ¦v«¡t|w
xyss{lsp{nvop[Y~vu¡¢y
m¡h¡e~w~}{|ovplmoq|jtqwuygsnu{yyurnzx¡{uxxnk_tutrry[_qapk_pk~|qnnknwappkrmYYbaboXQT[fgcup
c]kmdbfkn`gg_hkursquyvx
xw
|{wjqc|c|nqmtjholvx`qy|tut~¤¬§ v zrxupr
trwlpnvmv~mmUQªw~wrz¢y{£{r
~|f
f
qwzz||kvkoklm{az~wzx|zhtls}
{qyouyx|{zv|wpjl|ayqomstV_pbrb`mozripfguuirlbwe]Wfa`sTQO]ge^yp}`\irbbffj_he[gp~plqt}v}
uu~y{
xs
|zxfqk`}ookz`jntu_t}yxts
}x °¥
wtwtqp
tprpljwnn}}mtrRMßÈÖ{puv
¡x|s
¡~wz~xte
k¢cqz{y
|m|erokl{z\z{}zzisjs
|l~~m}
{x|uwxsmgp
nkupikunT_pepZ`msyhlkcgyspqd`xa`Vl__wQNLbgc]zqv]\evabfedagbYissnkrw}tzuv}s{~r|~vesn|e~oplYlnyys`vz{vrwwy®
w~}
uxpyqopmoseeyq}my}jgkc¤ÁÜ®ð rlv
w¤o¡q¢
}ztwuul|¢
^l{}
v
}~k}dxvjnysX{zzfrikum}x}trwusqguzcunqckwhRarhlV`ouzard`iqso[drabWn[]yNMMegb^wsn\]dy^`ee
`cc_Yjsknksx~twxw{q}~zt~shuqyl{ntqWqzvyrdwyivr§£}qxy
¡|{sxpsjpljm}u_axw{qu{g`d|ëÚµÉÃÜrltwkq|{
uxr
u}n¡ai|}q~qwhvsjuwlZ|~
vark~~}nkwz{}mpy
tkpkryaujp]lwaResifS`qwuap`]hrtkXhiciYnW\vMKMfg^bstk\\ey^^dg{ad_]Ykoenjtx~st~{vzs
|vv{ulwvyxtnx{}Xyqogxwdv
p
¡¢toqw~} xrtnodrifmxx\`y{{qqjagaÕ¶¦wnqx}qk{h|{}zszzptt~~b
g|~~m|ulmwutwvlc}
p_qo{|~zpey
z|}mny~umnkk{dilkZnwZSjsibQcsxmcf^Zkntb\h_em`oU\pOIOgf\hormZ\cs`\clwee]]Zlmcmjtwrp|}txx
}ux|voxy{on{w^tmiztsgs|q vvmw}w}vqoljau}gbjuzZ`x|zlpecggW_rs½Å
wrtsj{|}|~t
vv}quq~szf~r~g}{y}i}vfpyxsxtlkyk^pvz}{~rhw
wz~|mkz|vtohh~we]rdYqtTTosibNhuyga^]YpptZec^knaqPZlSDThbZlon|pZ[^mcZcowdg\]`kjcljswqo~{tuz|v~xtryy~oo{qjyz~nm|vkjxtk
o~vjyyoysqljd`t{i`fr{[ar}zfpzaed±²wKbZ¥ÛÒs|y
ol
zy|yxnqs}{jy¥~n}tw
p{~nxh
xr|e|~vcqsizqov}wy
{k\o|r|zqmo
qw~wml}~vzehj~raZx[ZsnOXrtg`Knwub^\[Yu~toXg^fkq_oOXiS?Zg_[qkgzr\[YleYdqy_h]^elhfkiqwol~upzv
qq{
|zyukzlp~u}or|{poxf¡gpgz
|ixrllf_aozn_cpy\dlz`pv_deÕë¾3:>szw
nm
u|
|xnvvmku{uey§|m~rtx{y
lrixm||xbyrdqinvrusv~sp[k|sx{|xypjpw}}smjvuu\iiyqYW~T[rfM[srf\Jryp]\[Z]vvjZb[hfocjNXgR>_f]^vf`uq[YUodZeqy[h^`fmhjkhpx~mjyn{}zu
pnx}{{i{~jt|r{sv~zx~|km~li|~}kuqgic[cgso`bltahpzass^bc n]6[°¶uk~wuwpm
tyx}zsgu}|no
}hvynez
¤}m}t}{
|q|~|i~mk{yjzwr`w~rdrgvnu|~pwz|umWm}us
vtzwrlq}{|ymmhltn\hfurR\}O]r]O\spdVKtykXZZZarvb^]agdijfOZiNAbe\awa\unXXSub[eosXj_bhkgmlipw|li}|p~{{wr{orw{j~{nxyvw}x~~zm£
{vykm
y~|~prpcf^Yg_pp``hqfjotaso[`djv{¿¨¥Ê¹r
t~ztrspzsutwyyqcv
yhqufvucj|~|q}rw~v{lyzuh{ilysizv}h`w}kjth{jv|r|w|tbUu{qr{pwxon}|w|zsugpglqo]hctoLfwM_oVTZtncQPuybRXX]brt]b\ieeckdR\qIDeb\dq^]xhVWVx^\fniWl^ajgeonhpwzniy}s{~y}v}pvsnw~q|xzzuxzun}~{w|huz|vgon`e\XfYnsaaaqllhn`siY^cmw©Ú©È³szqv}{utu}vopm
txul`yxeqngum[m}x|wzl
s~r{muwmhwem|vmkww|abxzhuvc~|hu}vvrz}mZUq|os
}wksxjs|y{wzq{rfsdmlsZj`vfIooM\cXWVynbPSuwYQVX^as
p]acmec^ocU^sGCg`^gi]Z|cRV]v[[glbWk`anfflphpvxtkvvx}w{t}oququ~
{wx|}
x|}}{~rux{wuz^~yt
w{bnm\b[[aVjtda\hopgqapfW\ck|Êκ¢knonr
s~{
zytyttzjlvcvvpg^|xdqjjqcXm{rv}zmop{yrrp~ghrcnxqjlrx}|y]eyxiuygwhu~sjp~xn}]Wo|ls~znnpvfv~~uzoyr
zxqeq`mkrWk_y]IplNXV_UV|kbOTvsRRTW^cvj^akkfcZobYcqHAi]ag_\V|^OVfqZ[jh]Xha_rfjhqgqsvynu{x~yus
po{xwuz
z|u}~~}|xvyv~}nuzdso
zudnjY_[]]ThsfaYdrrgrakdWZ_ix¾®{ ·ncuiu}s{
{~wxswnzvejo`usjb^}vxep}gkkZVox£
~pqvsl~q
}yuspizajmamvjgkkywzwZf}}xer~n
tfvqhl{tmub[mzjszzet}mpgt}v}~pzjyyxvodk`m}lmUj`xVLlmPSPiNY|hbOUvlMQTU_gwg^aqigaWi]]ljJEk[ceWYVzZNWokY]le\Zec^ufleqgsptxp
vx|}vsnsy{{ss
y}v}
z~{w|vvziv~}m
rq~pflgX][\[Seqe_XcsuivpdebW[[hporsefzkvwtu
x
zwtvnjzpahkgtnf^^{ny|glwfjdVWsp¦|{vs{qzxlyzu|}uqsmhu]mi`mudggizo{rYgwuhpxvbw
}okn{qese`jxfpuy|auvjkptyoyxr{e}}}vumcd`l|ljUjbrTLklPMOqH^|faNVueKNTXakxf^gsje`WdXcr^LLlYdbUTUtWMYweZ_la\[de_wgmbojtoq~utxx~z}v~
nrt|{tq
zvt|
|~z~v{£¦y
lu}|v{osz
}unjieV][[ZScoe[Xat{jhmh`aX^Ziikphmbi{zkuuupz~wvnzhjyj_enhwgeXavh}ynioff]UXoh¨wz|xtn}mqtx~wtvjswhio\me^ns_gbjxh{m[mstjo~zxbw
ysrpzrcqh[mudnqzwaspgiwsqkwvsuby}utocbbl}|kkUibgTLniPHSlFbyfbMTr^JMUZfmx{f_mqjd]V`VooXKTiXg^XNVlTK]z`\_l]][be`zhlaopvnowuz}wyzyz}qtt~zvt
~}ls{
}~{v¬zlr{vuon}tjonedX_ZZZUbkg\Z_vi^ml\aW[\kert}jj^mxwiuxso|~~zvrlzhiwg]dshzwcbTcneuvfhiaWVYhd¨o~wypn{fwmyzvq~ndwtehi]lb^po[h_muezh]tnrkq{vvcu|xrv~taplXpqanozscqlamznjhyxspdtxxtoc`cms}ikTh^_ULudQHWbHcwfbLTqYKLXYilw{eenrfcZX^YwgUJ]dXiYYIWeQIcy[^_m[^]bd^ij`ntxmonvyr}~vvx}tuuyzz}
jt{}~
y{~|sq®{{~fq{t~}wspm|~mzcppbe]eVZYWdfl`]]thYpm[^XZ\l{bqwvmc\ouuivwroyzwnotehte[gtfvvy_]Reeis|abi\TX^cd¥hxt
wlmxfwl{ytry}yiewm`ga_j`^ukYf]oobze[w|knopxytues{wpr}raxcZmn`nozseqd^nuhcfwzrkmsq{qpa]dmo}diShYZUNz`RKZYHcudaJUnUJLZWjms{dlltcaYZ\bw\TLd^YjTWHYaNHkwY_an[[_bc]
ihbnxymojvym~wuttrvvw}}~~px}yxy~ssp¡{{yeuzsywltply|ps^poagblT[ZWidnf\\reSrm[YXW`lvcjujj_[ournutuk}|wonldipc[krdtvs\VSc_p~~p\ac^SZa\derq
skixknnyyzqvs{z{dfvh^c[ah\_whWb_phawa[|vjjrnxttuiq
vskp{lfwW[ilaoq~xseo~[`ppa^ip}kjr}povio`Zdkm{afSfUXSQx]SPZRHdtbaGVlQIPZVlll|emora[ZXZmqXSPgXWjTUFZ]OIsvY`cncXaaa^jcemzyloivy{k}|y}mqovz}t}txutpvo¢s{{fwon|pgxq{lsvsk^tobgfkS^\Vhbmm[\qdNom\VWUfishctee^[pwoqvvzl}}wscdkoa\nmcsxkZTVabw{|o\c^cSZ`Zccnp
rifxmdruqzkytuo{v_gsd\_WbdYbueU`amdaq]]~ohisqtquwlm
|rrgn{oqoRZdidoq~tsbmuUbqj[^ne|dku|pqqhl^Xcijx^fTdUWQVoXRWTPHes`bFXkOIYUWnie|ilykbW\V\ueTSWiRZgUTI[ZPNyw[_emjZba^^nbglzvnoivv~m}{krgt{u~s}
{ss}un¤swxnz`e}qgztymmqwgd|mcgghS`_Ug`mp\^nhNjl`UVSogskfxef^Zrvns|ytn{w{zkaelm^`ojeqy~gZUW_kwzzn^a]hVY`Xdbkp|vkiuk[upjyiurno|sYkn`Y^VbdXeqcT_biablZ`~kfltuomxwlh{nqfp{lqlaX_ggmqrr^ilSeqdUbmaxaotztinji^W`fhu\dUaVTOYgSO]OPIep]cGZjNJ`LYme`xioe`U^T^v\USagO^cUTK]ZQZvv]_fmhXca[^qchjxrsmgvtysz|zntlst
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDCGdhgggge¢ £dggggfo
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR4555549\`____]¦¤¤¤¤§|]____^j|}zzz|}{|~}}}~}}~~~~
|y{z||{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
}{wvx{|||}}}}}}~~~~
}|vvx||{|}}}}}~~~~~~~
}wxz{zz|||{}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~
rtx|||{||}}~~~~~~}~~~~uxrvy|}|z}|}}~~~~~~~~p|tssvx}~|y}|}}~~~}~~sorx
ty}zxurkeimolffggpsswy}~yz{|}}~~~~}~~wm{sx{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||~~~~}~~~
sno{uv
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\YXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwtb^d_akqfhklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhb]jl]efgeccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFFHIJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^ZZjwlbnrjbYY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROM[krkamtrfQQSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMN]cokXisupSMOPPPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKFBFHUbglopomlZLLNMNOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHECFGHMZghgrnnhfd`^^XLJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>IZ]Z\elnjommlkihkdSGEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;=K[imnojomkjlmfQGEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;:=HcosmnlklhUC>CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtstrqtxxy}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99=J`ssphT?:;=@A@=;;><=<@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyz{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;==><:Bl}j@:;>=>??A@??A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;[n@>DE?@AD_d;==;:=?AA??@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJKHVppqssttuyz{||~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8::mwH8;:=>A;Hd=<=<8:;DD<<=<<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII`pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR=<=ILFEuvN788:;>?WjA;<<::;LR===9:?<=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CrzJ;\z|wW<=?==>EhtL:=>?=<OhK@<8<A?>>A=;?B@BCB@BCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGEE?AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAGrzkb}^>@C@@=Js{Y:=AEBAPn^TPHACCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Ent}~}vMACE@?>Y{]?CEIJIThge_`XFMMFEEEDECA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z|{}}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEDCWu~XGHJMM\ihjebgZaNIIHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqruvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLNMfvohkilnaGHHGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl
|PLMNlxvnmoqpQ?DCBCFFEB@>>@AB@BD?>?DFHDFGIKIJHHHGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLKJT
uJIRtzwpmlnV;?;:<AA@><998<<=;>;8;?AB@ACCB@AADDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJIIe
gEYkoznloqsO696479;<:8567789787588;;;=@;999=<>;<=ACEHJMLLGIGORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIh~gdjlceius<4873568:876565676767:67889:7578979776:<@GFIGIFEFOSRSSROPPRTepqsttvy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@6788=:=ECBe
sqofgpr}e4688557699776765:9:::;798987669:98868589;A=>>BA?AKLOQPQOOORWkqrttuvy{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=q
xsnosmqa9:;<9:;9:;::9;:9===>;;<<:>;9;;<;<;9:<8::::999<?<<ABDIJMKIKLWorsusvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
wuyroo]BBAB>@CA@>=>>@???@?@==?B>@A?@?=@@@>?A<><;:;:9;?=;<==AACABCAXpqtttvz{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<<:;;==?@BR
{{vsqVKHHHEFHGECA@BECCABCB?@DHECECEDAFEFDEFD@B><@>=?@>?>?>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFW
z{t^ORLKKIJJJIFDDGHFDDEFDBHIKGHGFHGEKIKIJKJCECCDBABCBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGIY
{zp\QRNLNKJKIKGDGIIIEFIFFELLMIJGGHIJNMOLLNKGFGGEECFEFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@87<;;=:>@>?@CFIIP_
zzxdPOMNLJIFJIEKIGKJIJGGGKLNLLHHIJMQNONLOKIGIJHIDIHHFFGGIGCBACTnpuwwyzxyz{||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADHJLUq
vwtqURPMLIGDHJHMLGKOLKJJLMLOPNHIKLOQQPQOOJHJJLJKFGHGFFIFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
~d`h]WUQOMLEFGMPOPWUQPOQSRMSTOMSLPSUVRSQPLJMMMKNHGJFEHJEDEEBECcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B@BBGVNFNPPTX{
o_^odHUSSRK;;STR`u]UVTVYYRXXRZfPUWZ]RTWQOMRQPPQLLKHHJHEFIIIHIirvyxyyz{{|z{|}|}~}}}}}}~~~SHJIHGGFE??AAEACGEDELXRMTUVXZ|
~asbiY=[ZYTR?@WVY\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXUTVTOOMKLJIILMKOMSotvxyxxzzz{zz|}|~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~}ss[^]\SUSWWU[ZuYU}a\X]_WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
ni\\][VWUXTRXVcRerXZW_hP`f[[X\gaGOZhg][\]]WROSPPRVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQPRRRUSVTW_ux
~}`TX[VTVSRRMPMLfz[]TYUV]ZLTZUST^ZXWWWzkX[\\^TQQPINOWVX[Zdprvvttvxyy{{||}~~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQURSRRUcdv
~zosZNNQQMOLJKEFIFC?TdURQQNKQTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquuusswzz{{|}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^\YUQLILIaltPQSNQRQR[RSRQRUTas{|}z{
va^OGAEEDDCAEQCEAC>CIGV@HNLG]iPHFNFDEFIGHBDHGIKGDBAD@OQMSdrtvustuz|{{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSPUYSUQQTROV_klrv{{xytrnstsyx}lOIBB<<>@A@@?kQK`EFHIEB?GLNGMRUIBE?><=<==?=?ACC@?==B>JNGUnttustvxz|{|||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^JJPQNKLQRQTUUWQQWUPX[a]agmmlokg`nrjmlqu{z}{xz||xwxeDBBB>;CCBBDB\]O{NOONKLMOOQLKMWMHG@B<:77599=;;;8:8:?<BH?\stuuuvwy|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP_]ZIHPRQOMPQNQRTVXSSYTOYZ\WY]^^_e_]^qvk^`gkwooljonnlebYHGHHCBGIFFFDMROaWSWQPSSRU[OOQVPMIDF>:96587979:365795<C>essvwwzy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`VW^ZXMKTTSPQUOLRSTWXTTYRMXYZVXXVXY]WWXhsk]Vatkaa_^da_^YUQNOOMIHJLJIFCQPSZWTTNQSYS\eUOSTRNKIHC?A999897885757859:Gnqtwxz{{|~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTVUUUWPSTWTUR]n_RNZ`[WY;DVXT[fJLPSRONMNNNLJFQPUYSTOJNOUST\VRUSROMLIHHF??=:787659967675Wppswyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\]RTZWXUTWTRXXYYYSUOJGOPOOMRJOPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPSMILJORPRRSTQROLMKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqnhihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHJHFLMPMG/E_R>3?>joaSRQ@GTQPQPQNQOQPLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptvy{{}}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]gTQSAGUPOQQPMMOMKLKLNOOQLOOMHLLIKKLKGFFED<AA>;@E;<89Sprtx{z{}||{y|zz~~|{uturvvz{xzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONLQSLTUTXWULLKI<987;>@><=A@B=>EHGCEFIGJJ@FAA@FHEJOHQRb\QPROSOOPLMONLMMNON[WKMQOGIHCHJLLKFFFE?BC><BG?B?Adptvzzz{|{zzw{wy~~|{qstprswsxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCD=9779?B>;?B@@>ADJECGGIGIEBB?>=CBAGIDMObeQMONWKLNKLNMMLLONSdNJLRIIIEAHJLMNJGIGBAB@?EFEHDKnovyyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGMMJMPMPOHJD?A=989:?B?<ABAADEGKFCHHGGHCD?B??@A>CECKNRTLJIMTGIIJLJKLIJMMOPRPJGCLGCBJILMONIJIGCCCDHJMLIYrmwyxz{zy|vrpurtxyvxjqnjllnttmtu{stxrompovsnporpopstyjN`gsjt|ygosqiqhdqGKDGHHGJKIJKDFB=>=:9:;@B?=ABCCGFIKJDIIFGGCC;A@B>@@CECIMPHHKGHKDHJLMHJLHIJLKM]RHHDNFACJJMLPMKMJKFGGJNNQNLbmivvwzy{z}rmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKDFEGEFFGEGBC@><=9::;@C@>ACDEIEIJLFIIGFFCB;ABC>@CDCDGLNHKNHDHEILNMGILGFGIILNKIGENHBFMKMLOMMNMKHHIORRSNRfffqosxu{z|lhjnekqlspfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGIDFFECCBE@DB>?>:;;=:<>CA>ACDFJFIHLHGGGFEC@=DDB>ACCCDGHIGMQIFFGKNOKFHIFEDEIJHKIFHOKCILKOLNMOONJJILRUUROWd`amgqroryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHEEHCBABD<BA>A=::=?;>>@B>@ADGJEIFIHGFGDCBAAFFCBBBDEDGGHFLQLIOJJMLIGHEGEDCIIHKJGKRMBNNLPNOOMNOKKKOUWVUSX_^\iaminhrsbdfedhhfnjfmmhkkmriqvtsqmvnoqrswsrstuvvvvwvwwvtwujsunutsqrjksMGHFHBBADE<A@@C<8:<>9?<?B@@@DFHEHFFHGFFDCECDIECFEBEGEFGGEIMKHQMJKHHIEFHHECIIIKMKOSNDQROPQNOMNPMLMSWVXXUX]Z]d`ibjigk_defcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqinyMHGHHBBBFE<?BBD<7;=>:>:@B>??BEFDGDEHEDECDEFGJEEIGCGHFHGECFJJGNKLKHJLFIIKHEKKLMNORTOHSTRPROQMNQNMPWZVZYVZ]ZXa`a`^hec`dehgjhhifhnllnmqpiuuxrrpupppruvpusuwu{~}xvtwvvvxplupmstnprrxNHHGIDBCHE<@ECE=89>>=<<AB<?>AAFCFCDIDDEEFGGGIFGKHDIHGIGFDHKIGKHMKJKLHLKLKIMKONORUVOKUVSPSQRLOQPOTYZY\ZY[^^]`c^\ackb`dghr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptLIKIKFBEGE<@GCD@:<>@?>?BA<@>BAFCEEEIEFEGFHHFHHIKJFJHHKHFFLHHHJGLLMLLIMKMMMOLPPQUVWOKVUTRRQRLORRQV[[]^[\^^^``ad]c`ef`ehjdssfjggkorqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGCEDE<@FDDC;??B@@@DA?B?ACHCFFGIFJFGDIHGIHJLHHJJILJFJLHIKJGKKMMJJMLNNMPKOPRTXVMMTUTRRQPMNTSRW[]^_]]`_`aa`acebdhbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrunwKLLLMGDCAD<?EEEC=AACBBCDACEAAEGCHHIHGJGCGJGHJFIMHIJMKNLGKIHKKNQKRQMSMKNNOPPOTOWXX[NRPW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@DBEDDFBCEGCCIFCIJJIIKGDKJGIJIILHJJNLOKILHJLKZfJd\KlSHON_nUks[qpbwcSPavuhucav`Xnqbdvinzf[lt`ljT_wvijghfglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDCEEDFBFFGDEKFFJMLKLLGGMIGJKHKKIKKNLMLLLILML[sbdp^lmUMNfs]ffqlntgpi_aYnnbppbkjjfoqtetno\ougpMJqyvka`keemxlkvlmpsrprqpqrqrrrtrmmsnnopsutqsstuuutwxvutbmukpplrrqzKLIHGED?AB@>CFGCFCFEFEDCHHHDEKHGLNNLMMFJNHJKJILKJJKLMNNMMJMMN[roonpplkMPQlWMibtrpamnu\YlP\nmZqmkomxxtsip]_rkqjUuyxoc^kfbgpojjnoprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGGEEEBBB>@@FHCGDIFEEBFIHHEHLKGMMOLMNGLMILKIJMIKJJKOPONLLNNL\hdu]lqWlNPQmTYk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggaditxknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHLFIDEECAB=BACFDHGLHECCHKIHFJLLFNLLSRLGLLHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYrkgooqqomt]nXat_nopoqronusttj[^tcwxrjnzhaacfbbimtupsuvsqppqoqt{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEEEAA>DDBGDHIMIFCFJLJGFKNLFOJKWRKGKJJNIHJLIKJHHKMMMMIKKKSkc[i^_icrrZ_Yjn_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``jmqpntyruqopqny
vsnkmmonqrttrtuuvyxxsunqunvqqvtwrGGFIDECFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJKKIHIFKKKLGHKKLMMLJKMNT[\TPTLPONOOVQONQNOQJJOPQdqiTYW\[\VY[]X]\\cfaaebcf__fknimtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGEEAEC@DHDFGCIKLHFDGKLIEGIPKLOKLWLIEEHIJHIKIMJHFGGIGHIEFLIJLOMJP\W^P\[`^MXYS\\b^MXZMXaRKYaZR_d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtrxrxsqrurtOBCDLMBDDBEIEGGFKJKHEEIJKFEHHPKMMJMRHGEAHFJIKLJLJHFDIFDFGEFKHCJMLLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_c[`^[TXWY^]cbcacehekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaRJJMIECBCGHFHGHKJJIDFKKKEFIJNKNKHLNGHE>GGLIKLKKKIGDHDCDEAFJEAKLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQYUU\Y]c`__cdbhomnllllu
yu|
}wrrtxyyyy~}yuyvvrnzwvxYQKFDGEBEGIFGHHFFIGHGHKILDDKKNMLKHKJHIF?GGNKKKMKKKIFGCD@DAHIC@JKHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb]dcbdcfXQVTQZWZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFDFKJFFFHGGIGFFILJNFDKKMNJLIKJHIFBHHQMLKOMJKIGGED?ECIICCHGET]Y^X_Y_[]UXXP]]QKJV^X^[]UYaRQ__bb``bb`cbaddbXOQPQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAHFDGMRHCQJEGHHEFKJMPEFIJKNLLIKLIIHDHKQOMMPLLKKHICDAEDIGCCHFDWUE\T]SV_XOTUNZZMIJT`a[_X^^a]NXa\``_bcb]abW__TPOOOWQ\[[\\^_bffeleoow|{{}
zo
~JNFDFFHDIRbPCV^IGGHDFMJPPEIIJKNLKKLKIJGEJNQQNOOMMLMHKADACDGDCCFGBMHBKKOONLFMFGIJHGLKMOPILOPOSPKOSRUZYWYXXdWOSTPPNMNTRZXXZ]\`adecgcklpsryy{z
~{}{
}KIEEHFGDKM]LFGXLGHJHGMLQPHKKKKMMUNOJJKGGKPSSNPOMNNNGKF`ED_LEgdFN\I^[rmOMUmYLDP`UkWgJ]WU^DLQULLSVQRTXWTXUT\UPfZhhdXRjRVUT[\[``abab_fhfnkhrz|}~}|zr{z{
~z{LIEGFHEEKOSIJF`SHJOJIOMRQLMLLORUROOILNGHMQ[YOPPNOOOIJQQI|YYrtYQmHqnoaVPqqsPCksmqspSo_ZnX]V\XUkhU]VcZ`Y[_VVXjtuu^_v^Wa[[f[_`aaa]_agmpl_pwtx~}vxzlv~tx}|~|z~wwNJEHMNBDLLFIKEQULKNIKRXWQNNOMQTNOQOKKNGMPS[ZTQROPPPJHZx]TxehZSURvgtlpbnfjQrOMwmjrpsrqrooo]ezuxqqzq~s}ku}bRh|essorr{|o~xnr_``baZ`_gknkblfgmw~}{xwtvzir~ns|~wx{~x|u|||ssNLG`]GAEMMHJJGIONMMJNV^YULQSNXZMSSRMKOHQRTYWWQTPPPQKHgxlcxrm[KNVypumubovPeeIfvqmwojfxwiWrQhzmijzz}lxzohoYvvjvup_rf}ilx|o^__baZ]bdgiidgbcdllppstssszqrxblugry{srvy~suzn|}yxrnNKSuNCBFPPHJKIKPNNOMPZ`ZWKTWPa^RVQYRLPISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRgqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^\_ddiggee^abiiijknokqomjpacfcowxompsynqpk{ztromLL[VHGEGRPILMJKPQPPPPW\YUMUYUeXRRY]SLNITTWWYWOSNNNQIRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_Zpz{^`zscroxqhd}ir|^TLl_vukiu{zm~xk|p\^^b[^addfeeebZccikkrsrvglihdgaakagsrlgmmr}kmhk{tmmkmOHKKHJHHQPLNOLKRRROSRWRVTPWZVVUTTa_PNMJTSTQVVNNLMOPKHQNPULKLSTTSTPVUQQNQQXYRNPUTXXX[[URSW[WXWZOSUWXXR^YW^WUPYRWWWWX^Zgr^[[Y\]_cZ_ccdfdccbZcbgfemnmueegcaf_]g`dlhfgkhpzhggjujhgilPIKLLMKJSQMQQOLVUTPTUXUZUQZ]UUTWUYWOOKMVTQNUSNOMLQPLJRQKQMKLPRUSQRSSIHLNOQRQPQTVRXW\WSRPRTUUSZQNSRXVTYWUZVTRVTTUWXV\Y]`][ZZ\\_c[]bcdfdddaY`acabhhimbad^_c]Zd\bma^fefmsdigjkedcfhPJKLOOLMSPNSQPMXWUTUWWWYUS\`VWVYUXRPPJNWSPNUPNQNLSPMOUSNRNMOQUQUQRTUNKMOQTTRRQVWUYZ[YSURTWVVY[TPTUXUUZVXZUSRXVUW[XY^\UX^\^\[]``][bbcgfedbX_ab^`gdfea^_]]^ZZ_Z_g`^]]bhkagfgfd`bcbOLMLQQLOTOOSQOQ[YWWXZYXYV]jdVXYZWVSSOJNVTPOTPPPMMRRPRXTQQOMPTVOXRTUUONMQTUUTTRTWVZ]\ZVVQQVXV[[WQTVVVVYTXXVSRYWVZ^Y\^^U^\^`\[___^ZbbdhgddbXa`b^^fcc`b]\\\\YZ[X[a\_]\_b__bdebd__`\PMNNRQMRROSTQOU\ZZW[[\XZ[dqmhd_[XUUWQLMVSMNROQROLQSRUZUSPPMQXWRWSSSXMOOQTXVUUSUYX[^][[VQNUVU[[WRSWVWXVTY[UTRZXW\^Z^__Ta\`a]`b_\`]c`cghdf`Yc`a__ed_`b[Z\[\YZYXW\Z\[`^_[^^a`_c\Y`[QNONVQPTQOTTSPW\\\X^\^V\^jqwyc\[UUWPMOVSNQQORTRLRTTYZWUOROSXWTSURRZOPRRV[VWWSVZX\][[]VRMTUU[\VRUVVXYSUZ\USS]XZ]^\``_Va[cb]ad^\bab^cfidf][d`a``ce_b^YZ^[\[XXYWWZZZa\][]\\Z]`W[[ZPOOOYPUTRQWRTP[^^][`\`U\]hjr}slg[TWWQNRZSRQTRTUTKRWV[ZZSOSQVVVTOWRSZRTTTX]WXYSX]X^]YZ]TTNUVW^[XRUUYYYUWZ\VSW^Z]]`]bb]Y_[ea_dd^^cca]efidf]]da`aabd`b^XZ_Z\[XXXWW[Y[`\[[\[XZ[^V^Y]QOORZPZTUVVSTT^^`^^b\`U]^bkytl}kZTYTPPS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[YUZ^X_^Y\YRVQYXY_[ZTUVZYZWXZ\WU[^]^`a_cc\^]]eaafd^^dc`\gdheda_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPVYQ]UVYWWUX__aa`c]_U]^beeuzhWXYSUSV\XWWVVW]XOU]Z^]\TRXSWWUSTXRSVTXWX]^X][V]_X__X\VQXTYZZaZ\VWX[Z[YYZ[YW^_`_cbadd\b\`fadfd^_dba[fchecf`f__aaaa`_^VU]Y[\[Y[YX]Z[[XXY[YZZ]_]TY]UNSYVS\TVWYVV\`abc`c^_V[`da_zuohYZYUWTW[ZZ\YXY`WPU^\``\TTXPUWVTVWRSUWZZ[_^Z_\V__Z]^Y]URXWYY]bZ^WX[\[\\[Z\ZZ__``dbcdebdZaecffe]ab`c]bcidcg_g^aacaa`^_XT[ZZ[[X[XX\[Z[XVYXW\[[`]V]]SOVYVVZUXUXWX]_badad`^YYadb`lfh^\\ZVWXY\\]_[Y[bVTX^]ac\RVYPWWWWWVSUTX\\^``]`\Wa^[^[Z^WUWW[[_`\_XY\\]^^\[]Y[`a^`dcdeefbXcedhgd^c``ec\eidei_f]cbcaa`__[XYZYZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWYX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cYZX]`cd_RXYPWWXYYWVWV\]^`a`_b^Ya]]^Y\^YXUV[\`^]_ZZ^]^^a]\[Z\`b_becefefbZdffigb_c^afdYhhbfice^bbca``_]]ZX\YYXXZXWZ[ZYWXUU[]]]``bbxKXW[YV\[[]ZW\]_`bdaba]`Xbcbacab][\[XW\\_]`_][`d]\X[becaR\ZOYXZ[[ZWZY`]`bb`ac_\b]_][^]YXTX]]_`_`\[^^`bc\\X\^`bbcedfdefd\efgifcab[cg_\ihbhied`baca_`_\]\Y\YXWXYXW\ZZWVXOXZ]acffrkJYW\ZZ_\[^[X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\^^^YXU[_^]ab`^[`abfc_]T]`acddfegeffe^efhhgdd`Zeg]aghchhfc`bacb___\][Z[YXXXVZV\[ZVVVMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{zzzzzzz{||||{|{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyyz{{{{{zzzzzzzz|}}|||}|{zzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ¼ÌÓÒÒÒÓØZ%****"ÛÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääèÊÝæääååëTïååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyyyzxopppppprrrrrrrwzyyzzz~||||||}xssssss}
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvwzxzyy}zyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{yyyyyyy|}}}}}}{zzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwvy}{{}z|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwvz}|{~y|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwv{}|y|z|{wxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzyz}{{|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyx{xzzy{yxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqqqrstttttttsstsssttttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttssrqqqponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssrqqpponnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrsssrrqqppppoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqsqrrqqo|oppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqqqpprqpsnpppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqq}¡pro|nppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqu¡wqw}oqqqqpppppqqqpqpppqpppppppppppppppqqqpqqpppqppqqqqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrq¨o£~pqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxwwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssssrstr©¤y |rsssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~}|vvwwvuxzxxxxxwxyy´©¤¨¨}{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{|{{¯¦¡µ«¬£~{zzxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}}¥¡² §}}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~ ¯ ¢~~~~~~
~~}~~~}}}~~~~~~±¡
|~~~~~~~
|||{|}||~~~~~~~~~~~~«¥¤ ~}|}||}}~²¨¢ ¦¨¨
}||~~
±¦ ¡¤£
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{¡¥
~~}~
¦¥
¡
}~
}}}
~}~~~
~}~
~
~}~}
~{z¡
~}}}}~~|{{£¡¡
~}}~~~~~~}~}} ¡
}|}~~~}|}~|z
}}}~~}|}}{zz~
~~~~~}~}~~}}}}~}|z{{
~}~~}}~
|}}~}}~~}~}~}}~}}}}|{{{zzz{~~~~~~}~~}|~~~~~~
~|~~}~~~}~~~}}}}{{|zzzzy~~|~~~~}|~~~~~~~~~~~~}}}}
~}}}~~~~}}}}}|||{zzzzy~~~~~~~~~}~~}{|~~
~~}}}~~}}}}}}}}}|zzyyyz~~||~}~~~
}}}}}}~~}}}}}}|}}|{yyyyy|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxxyyz~}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yyz{}|
~~
~}|||}}||}}}}}}}}}}||{z|yzzz{{~}{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zyz{|yx|}~}{|~}}|~||}
~{z|
~~}}}||||||||||||||}|||~~{z{zxz{{|}{~~~~~~}}|}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||}|yz{{xxy{{z|}}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{||||||||||}}|{}|||{|||zzy{|z}
~~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}
~~~}}|||}~}|||}}}}|~|}|{}||z{z|}}
}~}~~~}||~}}}}|{}|~~~~~}|~}~~~
}|||}~{{}w~vx~}|}|}~~z~~|~~~~~~~~~~~}~~}|~}~}}}{|||{{z}~~|||}||~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~}~~~~|}~}}}{{}}|z||}}}}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}{~~~~~~~}||}}|}}}}{|~~~~~~||}||}|}~{|{||||}|}|}|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~~}~|y|~}~}}~~}}~{{}}}|}|}}}}}}|}{}|}}~}~}}}}|{{{|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~~~~{~|}~~}}}~}}~}}||}}}}|}}}~}}~~|{{{||}|{z{{yzyyy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}}~~|}}|}}~~}~|}|{|}~||{|}zzyyyyz{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~~}}||~~~}}}}|}||{|}{{{zzzz{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~}~~}~~~}~~|}}|~~~~}|}}{}~}||{||{{{|{||}}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}~~~~}}}~}~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~}~~~}~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{sy{|pwuvwyutz
}}}~}~~}~|}}~~|z|z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
|}}~}~~}|~~~~}}z{{||}}|}}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~~}}}~~~~}||~~~~{{|||}~}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~}}}~|~~~
~~~
}}}|{||yz{z~y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
}~}~}~|~~}~~}~}~~}~~~||||zyvyyzyvyv~|{{{~}{}~}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}~||~~~~}~~~~}~~~~}~~}~~~|}||{|uyyxxxyw{|{{{
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~~~}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~||}~~}}|~~~~}|~~|}~}~~~
~}|{{{|yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}}|}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~~}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y|||{zzzzzzxsvupprowvr{
~}~}~~|~|~}~~~|}~~z}~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxzxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z||{zxxy|||}{||}}}||}}~}}}~~}{|||||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}~xwvyyz{}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}z}{zvzxy{{|}}{|}}}}~|~~~}yy{zzzysrtowqwysw{
~~}|z||{w|yyy{z}~}||||}~~}~{{{z{ztpxqytvxtv{~
~||}|x|yzyz{}|{||}}}||{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||}z||}}|z{~~~}}||}|vrwxxvtvu}
}
{||}zz{}}||z|~}|}}~~~~~|}~~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~~}~~~}~}~}}~~|}
~
~}}||||~}}{|}}}}}~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}z}~{
}~~~}{}~~}|||}}}}|}}~}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r~}}~~|}}}||||}}||~}~}}}
}p{pyv~nypus|vyyrpvxqvtturstvinrotvnulwmzsnzm}rsvsvmnwlpylu}~|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoolw}xpqzprtfu~n{ysoy}~{~}~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~z~}}~}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}{}{|}}~}~~}~}~|}~~
}w
~~{|{~{|}~}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~~||~}~}~~}}|}~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}~|}|~}||}||||}|~}{|}|}|~|||zz||}
{}}|||~}||}|}{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~||}}|}}|~{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{||
z{
}~||}}~}{~}|}yzzy{}}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}}|}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~|}~~~~}}~}{}{zyzzyz|}yz{{{z|{{{{|}}}|~}|||~|{
~}}{
~|}}}~~~~~}}{|{zyyzyz{|yzzz{{|z{{{|}}}}}}||}}|
~|~~
}~~~~~{||}}~}~~}}~{~{{zyzzyzz{yzzz{{|z{|{|~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{y{zyzzz{|y{}{{~}}}}
~}~~~~}}~~~~~~
~~||~}|~}{~|}}}~}||}}{{zyzyy{yzzyzz{{{z{}}|~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌÌÌËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;>BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi`dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9><>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA=366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖËËËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÒÓÓÓÓÓÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<;999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNG¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËËÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××רר×××ÚÛÚÚÚÚÚÚÚÛÜÛÛÜÙ××××××××ÖÖÖÖÖÖÓÒÒÓÓÓÓÓÓÔÕÔÔÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;@<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMMF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËÌ
²âÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´¡¿½½½½½½½¼¼¼¼»¿ÒÒÒÓÓÓÓÒÒÓÔÓÓÓÛâáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃrliNSbLLVM<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKPFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ËÌnPSSSSSTTTTTTL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤XRSSSSSSSSSSSNz®ªªªªªªª©©©©¨°ÒÒÒÓÓÓÓÒÒÒÒÒÒÒßëêëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËwliJN_MRUM><<7;?C>6:7>?;=B@9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ËÌqUXWWWXXXXXXXQ¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦\VWWWWWWWWWWWS}°««««««««ªªª©²ÒÒÒÒÒÒÒÒÒÒÒÒÒÑßêêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<;>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÌÍx^a````aaaaaaZ¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª¢fabbbbbbbbbbb^
³¯¯¯¯¯¯¯¯¯¯¯®¶ÒÒÒÒÒÒÒÒÒÒÒÒÒÑßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9::=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÌÌÇÅÅÅÅÅÅÅÅÅÅÅÅÅÊÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÏÎÎÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌËËËËÎÒÒÒÒÒÒÒÒÒÒÒÓÓÒÕÓÔÖÖÖÖÖÖÖÖÖÖÕרØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8:;898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÍÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÒÓÏÎÑÔÔÓÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oVJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÒ«ÏÒÏÑ¥¢ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==<=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒ¶¥¤Ê¼¸µ³ ¢ªÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏγ¦ÆÇÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>><<96?B?B:648:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÑ¿ µ£«Öº¢¯±ÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?B:74:::9;;8;=?=>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÓ´ª»«¥±°³©ÔÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<=<964:98::97;?@<<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯Ê £¿Ê¥§ØªªÔÏÏÏÔ«~£¥§£ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>9<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÔ¬§¢¨´ª ©
¥ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CGDAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÓ¶²²¥«ÏØÁ¼¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHFE@<<>><==<756:96:;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÄ¢§¡¨ºÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==:::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸« ÇÕ¢«¤¸¤«£Ã «¤ÐÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKK@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓÈ´Ù©¬×»ÔÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUij[L_MJLJULFB<<?FEGKI=667:979:;:<=9>99:8;=>>A>=9<<:=>>;=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÔÈÁÕÒÕÀ¿ÖÒÕÅÄÕÑÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??>>ADLLA>775:8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÑÓÔÒÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ==786977899;;=?@<<89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDCI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFID<BA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD88867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCDECALH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HQA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8:87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
¼ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9768579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9886553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿½¾¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;;>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545659756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455588686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPF>8;727967453588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@BD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³µµ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶······¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬«««¯°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899::;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©©¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¥¥¥¥¦¨¨¨¨¨¥§¨¨§¨¨§¨¨©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::9:9<>::A<6=8378837;@??@@:BEC@BDCA?;;@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¥§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?A?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢£££¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@?BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747578;=8::99;=;;89>6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¦¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¦¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364689:89788:<;<9;;::67899>?@><=@>@:9@A?=A?>AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;989:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¤¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;=::;7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¤¦§¦¥¥¥¦¥¥£ ¡¡ ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ xlcdbdQGA=C;KHD:;;<>9::9:737959888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢£¢£¤¤¦¦¥¤¤£¢¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8687>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££¤¤¤¤¢¡¡¡µ¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡ ¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¢¤¡¢¢¢¡ «¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡ ¥³¬ ®jv ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¦« ¨D ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;9:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢ b¦¡£QH ¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¦f]£ ®uIL¡ ¡¡¡ ¡¢¡ }xjabb\Q<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¤Rx¢ ¤_VN¡£¥¢¡¢¢¡¡ ¢¡ ¡
wqgjd\\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢ [_£dZM¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[[LF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡]]v¢dYM¢ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡`a`tcUO¢¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;979:;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y i^[ej_PS¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;6397:9>8::<=998;9;<:>=;@@;<B<@:847<;B@AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ shaTv\VPW
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥£¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v} £¤nLOc
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{ k¥_r
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974869388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~¢|nRuYq}|~}|¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=;?:8<999=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
}wXOLqK_pqw
¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~£T/0=xww@D]km¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢¦gB[H;xykgE18Zls ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©©¯Jr¢yA|xdbQS]I`n¡¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¦©§¨£x`ÁÖ¥C|uOmvSd£¨§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@DB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤§§¤¥£¢b½À®x £eLaxmQt¢¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^edlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢¡¢§¡¦®¦¦jº¨Ñ¢³¨XL¬Se ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡¨ª±²¯«¢¢w~}rÏȰ§¯kUª°c[¥¥¢¡ ¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\U\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¡ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯··´µ¶³®nÌ»¤tTozsp}¦ª§¤ £¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@CC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²·»»»¹¹Á¸´µ ydX¶½¦§wkqoxy{~£¥¦«¥¤¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvkqhiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ·ÁÆÌÏÎÌɾ³¤sfRD}xqngflilrrqrru}©ÄÄ»¢§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSaiaftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃÅÇÛããÚ˼¯¤tYZQDixkntnkeeYW]X\cjjifaiµÁÀ¹©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwom[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ¾ÍÒÕʹ§r^QTKD[e^cjea`hYTXSVYZ]Y[u·¼¬´²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklgnvrrvrg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÂÁÇËÈ·ueUPOTH>^l^_eb`]daSUWVUUXs±ª¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxoyjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄù¸ÃaIDGKD=[ebbic`[c_WROPPV´º¬®¥¤£¨¤ ¥©´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{wnkihvZgsxszgg^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÄÄÂÄÁOFME;M[_eke_[`YYSNU£«¹µ²¬©£¡©¬§¬´´¿Ã¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyvvefjjh^kpnyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇÂÆjXG??G^cbj`ZXWTVw·À»¼º¼¬¦©»º¹·¿³µ¸²Áƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««¬±££ £¢ £ }qtqocahvhjjunyl^d[V`YLHD6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÎÅÆÆ½©rPK0XSUfaSNPq©ÈÈÂÄÇÀ¼¾´°°°Â¾¾ÁÆÀ¾·¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®¯µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r}xpg`kjwmifvotc]cUWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÂÃÂÁ¼?Ov~VLo¥ËÔŶ¿¿À¿º»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyspfegdlebknoo_Y]WVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ½¼Å§wkoªÉÈÇÑÁ¯½½¸¹»»¾·´°¹¾³¼¾±¹µ¸¼¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfaebacddjcgd[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÀº¿À¼»Å½ºÀÄ¿½¾¯se}ÑÅ¿¿É¿°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±··¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdacchkggjfj^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=96<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÕ¸¿»ÃµºÇ¶µ¸º¼¸¹¶ª¤~É¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeegpjelhYYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÄw¨Ì½Ç·¹·¶´·¹³µ±½ÉÄJ{ʾ¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~}knqgqktfcn`\UHKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄÖ®t»ÈÏÂÀ¸®´´»½·¹±½ÃÊCuÍÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljouoxdhc\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÆÉÒqr«ÑÑÌÊĵº¿ÄȾ¾´¿ÀÀyRnËÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tpmmtlmo`c_bbNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»ÅÐú¾¼Ä¾·¼À¿ÉÏÇÈÊÊÂrs£ÌÌËÍÊÆÂÃËÎÁ¼¸½º²pcb»ÈÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qd\_`_TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»«Úþ¶¾À¾¾º¦©²¶Ã¿¥yuxÄÇËÈÁÃÀÀÉÊÁ¿»¹±¡}skÈÅÄ¿ÀÁ¿ËÇÃÀÈÀºÁ¿Ã³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp^\_]ZRFEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Ä¹m¬Î½¶¹À¼¬}nhnmrsw|½¿ÆÀ¹À¼¾ÅĽ½¸±°}ÊÂü½¿¿Ãÿ¿Ç¼¼Âµ¬®´´¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmu{qoj\`aZTQAFIGK@ECI<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹Àδv³½¶µÂ¥iZ^`MR[Znsw¸¸Âº³»·»½¿º»»®¤~ÀÄþ¼¿»»¸¶ÁµÁº °¬¯½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶¼´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvxnra_g][UJ=??GG=GCC9:5;99><<9:<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɨx ¯µjegVY`IIMPSlw¥°·¾¹²µ²»¹¼¶¹¾´¥¡p®ÉÄÀ½¿¹³®²¼º®Á~p¢«¦¬º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrm`db\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Å«|v `TCXUGajVOEJ` ¬¯¶ºµ´²¬¼¹¸µ¸Á½°¢¥r¥Ë¿¹ºµ®¥¬³°©¤T¡¥¶´Á¶µ³¥§ª¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|pvsod^hY]^SONB?JCAKJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿µxoNJ?dYBNwjNA]°µ³µ²´¯¬»º¸¶¹¿Ævªd§¿¸µ²±¤¦§¥I©¸«ªª¤©¤«®¯§°«¯±±±®®¯¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvtmvjl]\kU^\PNHDGMBGNG8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³··{XFANYJJXwcAS£¹³´²°±°¹¸¶»·º½¢²«£r«°©««£¨ ¤oJ{
¨£¢£«¯¡£©¨¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wryiutoeUbdX]ROMI@IRDNC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼ªiN@RxqPIIKfYER®»±¬³¯®¬¶¶²´µ¯©¦¦¨ ¨©¡§§zbnl{~¨¡º¤¥££ ¥ ¤¬¥¦¨¥¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ª©¤©«¦©¬«¦¡x|vzcxmn]QiUPOGPMMCPRA?;>4::5;:=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢ª¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Â«¥¾iERQWIJ_IS`cb®µª²´®ª«¯°²³¥ ¢ £¤¨ µ~z{§ªª ¡¡£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nl|diVSdNJHGOSNKNH<E@=2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶¶º¹º··»®¨ ¡© ªÆ¿Ë¡PAsxOnKKbets`Z^p±¯®³µª¦¬¬£¢¢¤¤ÃÚú¶¡skz±«¡ §£¦¨£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¦«ª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ |~wy|eyyabSVaIIKLSUJSQM9?A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÇÇWSId¤\e~or]Pkc[d_]k´°°¸¬¦¡¢¢ªáÝÕÕѹ¡uf`¼¡rª®«¦¢±££¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvsime\S[ZMRKOOVMTMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢«¤zUirvupcvvXWc`cgYXWf®¬¯§¢ ¡£½µ²¾ÃÄÁ±xlia´q·¸¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³µ¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xvjwu^m[RaIRVHFVWKCMH=KI8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©¨®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¡ ¤np`cXL[SZMLPXRHMMH¬ª©¥ ¬OZ£·¼¶¢nehir_ªº½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ·»¶«®±¹·¼¯³°µÁ¼·¾³³µ¢¬¢©©²©«¨§¨ª§ § ¨¨¥¥ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhn\X\CWNJGMHCFN=>L>4<:6:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©©ª ±¢·¤°¦£bW^e`WMQG>>?CC?>BQx©©ª¦ ¢£
¬fARZz£²·¨hahqp`Ǿ¿Â¿¶º»Àù½»¬®§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¸Â¾¸´»ÆÄ½Ã¼¸´ª³ª³´¯³®ª¯£¬¨·²£°¦¡£°±®°¤¥¯£¡ ¡¦¡¤ªª ¢ ¦¨¡¢¤££¡¤¦¢¤|trklurqhW\QFUHDJPI?EB4FH96<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<<;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ }`^e`QGD<C>E<?96N~ª³§¤£¢ ¥¬¦xl¢¤lo{ja¦®¦fhy~³ÇÄÂÇÁÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÆÌÌÌÒǾ¿ÀþÇǸÄÊÉÄÁÇ¿º´º»µ»·°¶²«»²¯¼·À»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxkeZ\FLMEDTMEBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<@?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡~sjaWNE>IY|obB=\®¬ vrplo¤t|¢efyh|¢©ÁÍËÆÈÄÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÁÆÇÆÊÈÏÀÉÑÍÇÆÈÆÂ½ÄÁ¿¿¿µ¾³¿ÀÃÃÇÅÈį¿¹²¸½ÄÂÁ»¼¼µ®§§®¨ ¢©¥ ¨«©£¤¤ £
yusebgrog^ZZDOMCFQIDCA55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:;>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £kf]TID@?K¥ ²£yqqnjv¢±r¸Åb{
tq¡¥¥¸ÑÌÌÍÏÄÍÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÒ×Ò×ÒÕÖÓÔÈÌÇÌÍÊÓÍÎÓÍÆÉÊÊÂÇÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÇÅÌÌÉÉÀÃÀ®°³¨¢ª£¦©¬¤¥¦
{ruvgcgvjeVXRDNG@IQC>B=:22A<E<78<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>9:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡cSLJDC?CR®Ñ½²¯¦ ¤¡}yqlebhrpr{
upmprm
iµ×jlvrxw¶ÔÓÒÏÒÃÐÓÖØÕÕÒËÉÎÐËÆÍÒÊÒÕ×ÙÖØÓÖØÍÒÊÏÑÌÏÑÍÓÐÀÉÈËÄÌÍÌÏÏÆÇȶÀËÀÒÍÌÐÇÊÉÀÄÃÈÏÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpcaerc]R\JKGAFIJ?;A8>5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¥¥ ¢¢[I@ADAFQv²¯¦ wida____^__]alusponkpnsfl§µh|c_etpx§ÕÓÓÑÑÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ××ØÒØÒ×ÙÕÖÌÏÏÉÍÒÌÎÑÀÇÄÉÇÏÎÑÑÒÈÌÍÀËÍÆÔÏÍÏÉÅËÇÇÉÌËÔÔÑÕÏÒÌÓ¹ű¥¨µ®¨¨«¥²¨°³¬¬
|zqstmacim_VQ`JJCECSN?<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®§ª¨¡£¬gC8=>DXª¨}qecb__a__a`^``_`emppmjmosuh^YLZgbqxrjhÔÌÕÔÑÊÏÌÓÖÒÑÕÍÏÕÕÑÅÑÓÊÐÔÕÖÎÓÑØØØ×ËÈÎÄÊÏÍÊÌÀÉÁÉÊÎÏÐÌÐÎÎÌÏÐÈÌÐÑËÎËÃÊÈÊÍËÌÒÓÎÔÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¿»±
zvopokadnpaX\[IFFDMYE;@=33<<87855;>@=9<<8<>9<@;@:=8?98:?<=8;>B::=<:A==<:6==?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤²|HFB;V¡k^^^adb```````^`_^\bmrnmpprrvsgipqdXPQWXab\WK§ÐÉÒÒÎÆÎÌÍÔËÎÒÌÊÖÖÐÌÐÓËÌÐÑÓÊÎÑÕÒÕÖÊ¿ÊÂÆÍÃÈÊÃÍÄÆÉËËÏËÎÍÑÎÔÌÇÉÐÍÉÇËÆÇÂÆÊÌÎÑÑÇÐÏÎÎÌÐÅÇÁ¸¹½Ã½ù²²¾°»Ãõª¥¡yqrkmh``qhYXhVMGLIQQB;D?;68:8:;57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;776?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨ xlopw|ebbb`]^acb`__`aa`_][]gqqopqmimuneqsrxpVONTywUnÁÀÃÎÎÇÅÇÍÊÑÇÊÍÍÅÐÒÏÍÌÔÊÇÊÎÏÇÇÏÒËÐÏźĿÆÊ½ÃÇÉÎÅÃÈÀÇÎÈÄÍËÍÐÉÅÅÐÉÆÂÆÉÅ¿ÁÈÍÌÌÏÃÊÌÉÇÌÐÅÅÈ»ÇÃÉÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£xoudk`^fqa[W`GIHGIMUG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»¤¶~g¢ª
}~s_[^]^`^`cdc_]\^_``_[Z\akrpmmhgijs_e|
hWZNV eº¶»ÇÅÁÃÀÃÈÉÈÈÉÇ¿ÄËÅÇÊÌÉÄÁÊÉÁÁËÏÄËÈ¿¹Á¼ÆÈ¾ÀÆÏËÄÀûÊÇÈ»ÉÆÅÊÁ¾ÂËÆÅľƾ½ÁÄÆÌÆÅ¼¿ÊÃÅÇÒÅÁÉÀÊÊÇÈÆÐĄ̮̃ÄËÇÃÊ·¿¼º³©¬¤¥¬£¡¦£ |wsufj[anmZ\XRDLGCGDLDFS?54335@=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¾¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²°¶m^z|z
uxurp_Z[]``bcdded`[\^]^]_[YZ\anqmifgkhnr[mpoYK]^y¡m ±®À¹¹»¹¸ÀÁÁý½¸¼¾¸ÃÉÄÆÂ½ÆÀ·»ÃÈ¿ÁÉ»¶»»Åÿ¼ÂÎÃÆ¾¾µÁ¾Ä»½Ç¼Ãºµ½ÆÄÂ÷À¶¶¿¿¼ÍĽ¶ºÈ»¿¾ÌÄÂÆÃÆÉÇÉÆÐÆÂÌȲÇÉÃÎÌÀÅÿ¼²·°²§¨¨¹°¥°ª¬zwxkeh`hodV^YJFJFHKAEBFJA9:658853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µ«·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÕ×ÍÊÏÅÉÅÇÁºÅ½¬®§`cvx}{ttc\\]^``bcbbdeb]\[\^\^]Z[\]grokdciikvwf`h`Ffbwo^ª¨¢´±´³²²³»´»°¶¯³®±ºÁ»Àļ¿º´²º¾À¸Ç¸´¼¶À½¸½ÇÁûµ¯³µ»¿´Å¸»µ¬¹½¾À½±»¶°·º³Æ½·¯¼¿µ·µÅ½¾ÃÆÀÄÆÆÇÌÅ¿ÆÆ»ÇË¿ÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJGBDAEF?=:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÅËÍÈÅÈÍÌÐËÍÈÉÈÊÉÊÄÐÍÒÏÍÅÇÁÅÁ¿º¸É·«°[gozx~
vw|sh]]]]_`_`da^cec_^\[^\]^Z[[\_kolfcfhhjxpSend]Wb]LZ¦¢¦¨¯«©«¨²¬´¯±§¦«²»¹µÂ¹º¹°ª´¹»³Á¹¯À±½¼»µ»Ç¹Ã·ª¨°²À¶¸½°±¨²³µ»¼«®¶§®¶®¼²°ª¸°®»®»¸»ÀÁ¾ºÃ¿ÆÃÅÀ¼ÆÁÇʸÅÇÅ¿ÇÃÃ¹ÄÆÂ»ÆÉÌ˳¹Â½»³tvwki`bliYWW[ALLMJEAC?FA:::996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÏÇÍÁÂÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª±[i~{x}
y{wn^]\\]_`__dcbdcb`_]Z[ZZ]ZZZZ\cmmfdddfglyYRhcEKZS>] ¦«¢¦¡ª¨«ª¯¢¥©¬´µ°¼¸¯·¯¨¸´³»·³¼¯¸¹µ²¼Á²À®¥©£«±³³¨½ª«¨«¬®µ´¦©®¡¥°©³¦§¨®¦¨·¬±³·º»»²¼¾¾¾Ä¿µÁÀÇÈ·¾¿Å·ÅÃÀ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji\aodWVXPHZSSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃǹ¹ËÂ˾»É¶½Ã¾ºÊ·Áõ¶¼¶±¯µ¼©«cmz}~xt~|swe_]\\^_`^_ccab`a_]]\ZXY[[XWY\_ejdbcaddhnrBFEDDFSI^¥¡¡¤¤¦¥¬£¥¬²°¶¶§°«§ª´«³¹°µµ¶¹²°ºº±¶¤ ¤ ¦±¨¬©¹ª¥§§¨§³ §§¥¦¬§¤¡¡±¬²µ³´°µ¼¶»ÁÀ²»¾ÃÁ±¹¹Â³À½Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ yqlbf`ko`UY_HNhOTHFKF<=@=:;<826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;ȵ¶½¸ºÁº½¶ ¦º¶«³³»³ÄÏÉËŸ·ÇÀÌ¿¸Ê·»Å¸³Å¸³¿À¬¶¼²¬¦¯´¡£ir
|xusomjiipi_`]\\\^__acb````^\[\\XYXXXVXZ]^cb`cccbeemf35B=5GCn£¢¤¢¦¡ª®¬±´£¨©©«¬¤´¸¬¶¯¬²´®³µ¯°ª¤¢²¥¦ª¸¢¦¦¨« ¥£°©¬¨ª«¬°³¹¯¸¹º°¶¼»º«³²¹³½´·²±¶µ¿µ½À½Ã»»½{sl_e^ddXTW^IW]KPGJJGA<??A;?<05636:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»¸ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹È¸¸¿·²Â´±»»¬ºº±¢©«§m~
xrmomkb^bff]]^]]]\]_`abccba_\[[ZZYXWWWWWXWZ]abccbbcdeqR1:4/8B^c¥£¥¡£¬®± ¤¢«§¡µ°±±¬¨¯²§º³§¶¡¢£¡£¢ª¶ª¢£¦¦¦£ ¡¬¨£¤¦«³³ªµ°²«²¹´¯ª¯²²³·³®©®²¸°º¶º½¿·³±zvf_f_[YVSZUK[QLJEHKIC=?BB@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿²¥£¥±Ãµ¶½´¸ÂÌÈÆÀŶÁÀÇηÀý³¹¹²¿¶±¹»²µ¯£ª¡xxoqtqhfdiec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWUW`bcaab``dgpPQ?,1+$:k¥§¢¦ª¦®°©¢¢·©¡ ®¨µª¦§°¤·°¤· £ª¦¡¹°£¡¤¢ ¡©ª¤¢£ªª±¨´¬ª§³°¥«®³±¯°¯¯§¨¨²®²´°¼´º¸®£zwe_aWYXSRTKM^LPLGHMLE=@>=B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾·½§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°°±ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWVUZbba`a__`bhphJ1"&JI¤£¡¤¥¥ª®¥ ¢¶§¡¡¢¨³¢¥§¥¯¥±®«µ¡©¡¢±±££ §§¢¢¤¥¥«¤¥°§¥£«¬¦©®¯¯«¨ªª³¦¦«¯´±®¼¶±¯¯{xseb\[]XNLQHRaMVPOJNOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥¦¬¸»¼Áź²¹µÄÉÉÀÂÆÅǶÆÄ³Á¿Å«··½¶½º»µ²¬¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVVRTRT__]^_\]^_ajiG:4/:i|p¢©£¢¢¡¢¡¨ª££°©¡ ¤ª¨¢¬¬ª©®¢¢¢¢«©°¢¡£¥¡¢ ¢¤¥£«¥¢¤ª¤«¥®²©¦¥§¦µ¦ª¨³µ´¹º¯ª¬sqp`[WVVRGQOHZ\ORJTKSLEGJC8;;=<8667:9;:976977:;:=<<7;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«±¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÉÌȵɼ±¾Ãɱ¸Áµ¼À¼´µª¬¦r{tiiilgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTUVUTUURSNPY\[[\\\]\_bkK5BBR}w{¤¥§¥©¥¨¥¡¤¬¢¤¨®ª³¥¦££¡©©¡ ¡ ££¡£¡¢¨£¢¨« «°¤®¸¥£¤£¬ª¨«¯´·²½µ³«®
uti[YYSURFXLQ[XMUOPLQRIOJB=??A?=75799<<977:79:;<=>;7;;:=68:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³·®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ÌÆÅ¸ÀÎÏdzĻ·»Âȱ¸¿·¼¾»³¶¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNOQXYYY\[Z[]^fcUXlm|z§¥£«©¦®£¦ª£§¥§ª¥ ¨ª¥ ¡¤¡¢¥¥§©¨ °°¦±½§£¬´ª®§¯´°¹µÀ±®°«~rtcVTUNQJGVPRRLLXNKLOSGNKACFEC>B75889;9:7::7<=:;?>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ·¸¼½Àñ°±·®´´»³´££vkglnqnqjokdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTQMNMRWXYXXWZ[[`jpjpew}x}¤§¤¤©¥£¡
£¢¢¥§¡ ¢¢¦¤§©§¡ ´²¨³¸¡£¶¬ª®¤²²¦µ»´«¬±¢zsn^NQQMODNNNPKFNNJJNNQHMJAHLIHC>958889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶§¤¶°¤§¤ª¥ ©¦¤³ª¢²Äµµ²³ÆÅ·ºÃÊÌÆ³º½´¸À¯®©°¦®»¯ |n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKKSWWVWWWWZ]ag_c^rxs|t}¡¡¤s}{ £
~~tz££ ¡¤¤¢´¯¬°¦¸¦¥°¡±®±¼ª©¯©xtdVMRPPMCSNLPMBPQHINSNIJJEKMGKK>849888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-02764789::66:87A7x·¡£´¨¦¥¨£¥¥¦¦¦²§¦´Á¸¯´°Éĸ¹ÀÎÆ¾³¬ºÁ¬Ä¨¢¦¦·£ ~xfWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJGNSSSTTSUYZ]h\^[lumiGRk|_;Wo{ry{}xqp}¡ §®©©©³¢¥«¨´£©£tn`[NSRWLDTJPMLFNOIELQMKPJINPGJJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· ¢¡¦¦ª ¦©§£ª°¨§´Â¹°µ°Ç¸³½Ï¿¹¯®µÂ§ªÄª¢±£~sv]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKHFHNQQLORTUXYacZVhpeH;:{x
x`JQnw~m~wuvxpQ|~yvgw~
¤¢¨©¥¤°ª¡¤¤¦ª¢ª¡¦§wnf^\HQQSMIUMRILKOIHFJNMMUKQRPGJD=768:8:;;8:;8>?99>=8;<6;;478;7775344696/3/.115221/,')+*,4833989:99::::?9w¶¢§¡®¡§¨¥§¨¯¬ªµ¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼§©~xqoXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDCINOhYOQSSUZhf\dm\]SMoy|xz~txrnuptz~«
z{hv{prmxx{{wsrxhu
||© ¡ ©¥§¤ ¤sib]]JWPRHKXROJMLRJJJLPILQMRUMFIB=78;99>=:;<98@?::><7==79947785675251472/2.,./200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¢wx|vpojYKHIHGEHHPTTTWVSUUUUVWXWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LNQQSV^hmihYkvbt{ru{
zp
zvznk~|tz|tfu|lohs|mzq}qmvqhq~pD
wwz}{u}£¡¥xongc[XXUQJSUTOPNPVKNKOOJQOIOPLFD=;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«§©°¯±«»¸«»¾¸³¬§°§¬¥©¥¡yvq|muqjmjXKFGEA@CDHLLMQROQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zYJNOQTX]agc^| ½|nr^vsjwt
wznkwsxijq}Ingw~mjdly
ksl|nr|imps
{~{wpttyyp|pjoooYVXTRRYORUTRXUMOHMKMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¤¬¯¢ª¨µ¯®¬³¿«¼Ã¿¦¢¤¡¡szuotlqmekkYNDFC@<>>AFFGKKKLORRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORVZQWXW~[blr`yki{v
s
rkrr{ijLy
f1vrk}}tfeu
filukp|hqq|n{t~}qqoumwyujyyxlkpheXR[XYY[NPUVYXNIHEJJHGB@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5m¤¨±§º¯«²°Â±»ÃÇ
zqtzpsqopdpg_TFIC?<;9:?@ADCEGIKOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQUKAIPH_©jtqgxhm~}~wwprwrt5p¨ ¡¢
vp{|t®hgbjnrmpuioXupvm{}nrnp{svnbu
ux~}|srqm`\]^\ZYa_RN[ZXWLHIFIH?CABH?CD=;:7=;:;;9:99;9?<88=:8;66650121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®°®Á²»ÁÅ|nul|uxxmxnwdj^IPG>?7448;:;=>@BEHLLLLNPQSTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRRCH~mxutpyhrxz|{tx}
aªzw~t{]dqtz|wmhjbyo
zoxu
zptzxkni]v}|
}q}vw{|xqtugh`[\^S\g^WQTX[UGJJELG?F@DC>AA=;97<;;=<::99;;=>79>9985654244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¥ « ±¨¯À²»Äºzvk}xs }}p~zhwkRXL@E211376688:<>AEFFGIKMOQRSTUWVVVTSPMF@:2= #c[5311i?GoIFIKMOQKJT[WPHb{ttvmxvy
{u¥¬©H¯®©tm|~hghyn
qHlwryvhmk_v}yzuv|xmow~uusm\^^\cdXge\UPPWYPDLKFOICFCCA@CA=978:::;;:888::?>6;>7595773344236656778;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¬ ¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJLNQSTUTTVUSQOGC?80,#[??94.]ps£UFIKLMOW`WlXZ[d~{~|{
~¥»±¦ºÇç¡¥|qw
ihptrw{v|mvuf ª¢zyyogkx~|ule^[[^j^bg`ZOLNWRQHPJDNGCJDC@DCA<:87=<:<:88778:==8<=68756623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfwz¤¡¬¦ª®°¡xw|lpj]B@4--//./02234779;=?BDHINQRTRSSTRPOHEB<87/9C><<63.lMPHJLKJMV_a{edio ¨£¢ª¨µ¡§ÁÂǯx¹|¡
¡
lpuwqm
r ¤´¨¢}kjj|uc_e`[hl^ll^WKHNRPNLLFIPCDNFBCEFC>:96=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENORTPPQSQNPIED>;<:DF?><852<?R5HHHLKMNR^kyp}x ¥¥¨¦ª¨©´«¾«µÇȶÈÐϾ pi«©
¦£xz~¡{wª²|£¡¥µ¯§lss}~sja^b`bhd`hg\REJKONIILFGMCHLFFCBGEB;85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m}aw}{ªªBD}x|
w^bP460-2/,.0/./..0015>AAMQRSQRSURNSLEE@<>=FG@A@8662<9;FHGIJMNQYkt
¡·³ ©¨©¤¦±©®´¯¯«¹°²½²Ã«¹É˷ÿ·¥¢°³¬ª£¥¦ £¦¢ª¨¥
¤¡¡ª ¤¨±£¦·º ¢¯¢¡¢¡«®«²´¡¤©yz~ibi]fc_ed^gg_[OCIHSNFHKFJGFFHAKFDFFB;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhbWinXzv
ÚÈsV|z
qna@E64<3/110-,+-0.-4?CAMUPRSUUVUN[PGHD<>>FHCDA8;<5C;=FKIFHQNPW¨ª£ªºÂ¿§°Â´ª±¾±¶»³½³Àµ»º¢¸Å¨µÈǵ½¸´¨£´°±§¯«¥v¤¡¬²´ª®¨¯¶º²º¬°µ¢±¬±µ»¶´´¦§¢¦¨¯¬±¸·¸¦µ¨¤x
x[ceWgcbdaag`[TJDDLTPHIIDIGEA@@KDBMG=867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[YQbbWyuq}u
{¿»£¼´yzxn]W@EN<6:45AB764//6CHBQ[OQUWU\WP_UIKKA?>GKFED;>@7D7?BJJEFVSP^ ª ®®»¯²»Èų¹Ã»²²¿µ¶À³½¯¶t°³¥ºÄ£¯Æ¸°³±³§¤µ¶ª± ¢¢¥°®¦«§¤¡´»¢¨²ºµ¼¿Ì¿Å޽³Á·º·¾¶º·¸««°¤¯¨¬½¯¼ºÁÁ«¹§©~~mXdbYlfkfX\cYVSIGFLPGCHIAHD>?BBL@?MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALQVSXUZvjp~nzsxb¹¡£{z||}wzueP\dGEL;Qca[^SF?;HPEZcQQYXZgYT`_LSPEA?IJHEEA@D<E6B>HGJLSZT]«³±·³Ä¹¶¹ÇʹºÀ»¶´º¹µ¼³¹±Å`t±¤±ª½©¥¨«ª£¢²µ¡«¨ ®¥§¦¥¤£§±´¨²³½¶Â¾ÓÉÉÓÆÃÅÌÂÊÃÀ½¼¾»»¶´¯¸¶¶Â¹Å½Âǯ¸©¡«¤§µtacc_Xc`jgSX`VRUIEEMJA>GD=KA=B@=G>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-+/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrrsÕÀµ }~x{{y~s}zkfpuY^\Pedb`ed][XW\MdmURmm_n_XgdTYUJDBKKIFHHHHBI:D?HKSTU\Z[¶½µ»³Â¼·¶Èɸµºµ·¸²¶³²µ¶du§p^¢¬ ¢¤ª¥¨¦ ¤¥ª°¸°½¹ÔÑÏ×ÐÊÌÒÌÏÍÊÆ¿¾ÁɼÀ¼ÀÀÄÄÄɾÇͲ£º°´®«·»|m_b^Z`cZdcQ[`SPKCAEFE<@F?AHB?C=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ[Yh_onlotu´¬¡¡~|s{
{ts{ylmu{hreilifjji`fiilZms¤¼g\og]ZZTHKNPJKPKSQILAJFJO_^afiaµÄ®¶°¹º³¯ÂÅ´®¸°°»«²°¥ª·«µ§§M¦¥¡§¬¯¨°¨´´ÔÔÔÖÓÌÐÓÕÍÒÏÌÄÁÉнÉÉÊÉÑÆÌÍÂÏÑ·¯Ã¼Ã¹¤µ¹Á¢qe^__ZbYZgZQ]XOPBBHEBH;@C>AG??A7;C>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYReVsgqoyy¡ª¦}
|p{r}qxulqx~qzmxsmipmcimpxiw|~˾Áß§mcxnc[b`JPRUNY^O]\NPNTPTT\nmvq¬¶«²¥¯´©«»¿°ª´¦¤¸¦««´£°¦«¬¥¨¢¬ÏÒÕÒÎÌÓÔÔÐÔÑÎÇÃÔÑÆÍÒÓÓ×ÌÑÑÄÒÖÅÁÎÇǨ½·Î|qh`e_XbS_[PQTQOH>@FABE<@A>DC>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<UQMNZu
wlwp}~¡¡
y
~{q~zu
ovrks}{w{sxrksrioqzyqz¾Ë}±vrvhak]CZZ[VecXdjSX\]`c]cwz}©£¤ §¥ª¯¸ª¥³¢¡¡£¡¦±¦j¢~¨°¢¡¡¥¤©ÉÍÏÈÂÌÑÔÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÂËuqebaZVZT\QKGJJJ@;:;DAD<BC>GB>BB:<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;OLFJXpu}hsxr
x~xs{}wznwpmuux}t
|ymvtn}vtx{µ;AÅ¥~|ieWICfcecgjcmw[^fhknhn ££¥±£¤²¡¥ ¨¢±
y©£~«³¨§¾Ãƹ¶ÆÎÒÑÒÐÌÒËÈÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÕ¾Ê˵zypg_[TWR\WFGJIEE=:7:@@B9GD?DCACB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~|x
zyqz{
uy
yp|oozq{qnzuw}|t~|¯sX©Â¶pmb=^hrpqpnxvehoruxqz © «¡¤«|
~lz|®ª§¯¶½©¾ÇÌÉÉÌËÐÉÃÒÊÔרר×ÕÛ×ÓÚÛÕÐÚÚÑÖÈÔË|~kk]\QUTaICFIH>A>=7:=?;=G<?AAADA>?:87DB755479/556435532323647553458EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<99D>CGRj^mdbfkvqz~~{|~
wyn{{ty vusu}soou|
zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¤¢«
z}¡¼¡©¦¦®¨¶¿ÀÁ¹ÈÊÎÎÅÍÉÑÖÕÕÙÕ×ÛÔÖÙÚÛ×ÚÚÙØÎÛÆ}|jlhbVYWWNLENC;==<8:;=9=@6=??<>==9867CA6455=80665547745613854564557HH=DJE7925;H>;9:7IP][SUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Xea][htzylwvz{~~|z~
y{u}tm|}~s~{~x~xnt~{~z©Ã¡½¤}}r~s¦
{hGq ¤ ~¥
¥¸¢§¡¤¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¸{|{nlhZb]TPOIDLB<<>99;:99;<6?=><=99;;37D@8378>60688357<37804976755546FP5DNI8938AK=;3C@I<:DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=CQSRX^UXfmmmiqry{z|{z|{}t
yszsm~~w
¢n¨
z¡|}£¢ ¤¯
Wr«\¢¢¢ ¤
³¡¢¨²¸¦½ÂÇÍÈÆÏÍÐÌÏ×ÑÑÕ®ÖÕØÚØÚÚ×ÕÙÙ rwji_`ZUYYCAIC?>>:48:;7:;:3;;?=>7;::1:G=:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB:8:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbzma~omwxyz||{wsp
zuwvt~¦¤¥¢¨s²¨
¢£©°n·
ÄȲ¡¥²d¤ÍÈ
ª¢¢¤¨¡£³´¦£¼Â¾ÇÆÅÉÈÉÂËÓÍÍÔ©ÒÑÖÖÖØÚÔÒÚÎ
ukga``QKV\BBGC;A=837;<:9=649:<:82?992:I:>67BC32:96264>=4;>6949;57944JQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBeGu||m~xz~z~vv{ln~y|wx|~£´¨¤«³¡§ ¥¤¯¢¸³¡ ¤¯¢¤§©°¤ À£É¸«¢¥²
¨¢
s²£¡} ¡±£¤¸¿´ÄÇĽÃÿÆÎÊÉÒ§ÏÌÓÑÐÖØÒÏØ¼u}y`cWcXRIKOEBCD5>;76:?;<7=42669774=5;5<L<>;<BA75<;5277?@6??784987;<55OMDPRL8@=EAGA5:IENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGM\\YJha;Hzzm
y|x
}px|}|orz}{x¨¼©³½°¥®³³©£¢°µ£¹¥¤©·¦¤£©ª¤¯±ª »»Ê¡i¶·ª°¢«½¤^©²||
´ª¢¡ ¦®¨¢¤³¸«ÂÈĶº½¼ÅÈÈÂСÆÉÍÍÄ×ÖÐÊÓ£s}l`]VbTQGD><CAA8?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPfHa`bpJ@r|u~m}||~pww{«ÃÀ°½Æ¼³´Á¼´¬«³¶¨²®½«»£¨¹¸«¦¦¢¢¤£ª¯²±ª£¢¦¥£¹¯¨¿¼¬²¹¥£§}½°y§±ª £¬ §§¤¢¤°³¦ÀÆÃ°°»¶ÅÅÿͧÇÃÇüÕÐÌÄÊwve_]b^OLCL@EG?A?B<:4>A==5=6>333241A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EJHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\hF_ig[]\{uo~{~q~zz¨´ÇÉÀÂÌÂùǼº¯«¹»²¶¹²Á®¥À¤«°¼¼ª®«££§¬¯µ±© ª¢°´§£ººµÁ»«¨²¤¤¨©ÄĤy ¥ ®©¡ ² ¡¤ §¤¦§¤¯¥¿Ã®¨·µÉþ¶Î²Ä¾Ã»³ÑÉÈÁµx|p_[_mTNIDLLLJ@A=BD<5AD;:3=8B332263A15IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr{wy¡¨º¾ÉÈÊÂÒÉËÂͽÁ³¼¿§º¿½¼Ä¸¬Á©³¼½ª°ª¤¥£¬®´®·µ ®¦¢£´½©¨¼Á£¶¶¯«°¬ª¬ª§¥¤uy¢¡©¤|¢ ¢µ¦ ¥¤£¥¦¥£¨¨¢²¨»Àᥳ·ÌÀº®Ã³»½Á¹ÂÂÁ¿q|d[Z_^LMNKGECHAAADK:4DH:;4<7F.12352A26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>lI_XaZdeXx
~¡§¤Ã¾ÉÄÈÆÓÍÎÍ˼·°º½´½Ë»Ä¶¶¼´¿¹¼®¯¨¡©¨¶®®©²·¬¢¨¢«··ª¥¯¾Ä±½¹³§ª´³¥¨ ±Å§||©¤ ¡¡Z¤f£³¥¢¬¬§¦¡£¨¦µ«©º»Ã´¦´µËÁ¸ª¶¬³»¸®¨¸º¼·pq][VWPGKTNK?AGDDHFF85FM;>7>AK.32025B55PWN<LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hV<>@BFBsFiIRfdMF¦¡¨¥¢¯¾®¡Ç¾ÆÅÈÇÎÎÏÒʾ»¶±»»¼¿Ï¶Ä¾·¹·³²µ³¸³¬§«¬¹«©¨°°£®¥¨¤¥µÁ°«´¾Ã¹À¹³§¸´·²¯¤°¯¥ sÁ}°¤¢¨¡_J¤T°¯¥¯¯¦¡¦¦¡´©ª³¼¼»«°²ÇÀ¸¦¬«±±£¡²²´¥srh_]QRLFQQPQ;HJHFGAC=9KT?A:=EM/7534:B44NWN<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;5EA:A?>H@5*B52,>c]g:35tde@R7}hX<:BC@=REWStbVFH«¡¨®§
£¤µÉµ©Ç¼ÄÄÉËÉÈÌÎǾº³¯º¸ÀÁ͵ȻÁ¹¶º²¯¯³´§¤«´µ«ª¦®¬¤¦¥©¬º¿¨«··¾ÁÀ¾·²²Ã°·½¬£®µº¦¥u¾® ¨¦© ¦mu¢¢®²¢«©ªª¯¦¥¡¥ª¢°§©ªº·¾³²®¾¹¶ £§¨¥¦©©ficbTMMGIOJUL=LDMIJ@CD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CC:9C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW<:=..SaMVH~e^HF¬¡»®ªª¢££¤¶Ç½´Á»ÂÂÈÉÅÂÎȽ¹²¯¹µÀÃʶƲÁ¼µ»¬©±££ªµ»¦ª§¬ª¨¯¨¤«ª¾»¨½´·¾Ç¼¶µ¸À°½¿³©µ·¬¿¥¢¡¼ ¶¨¥¢ §¤± ¥§©¤¡¢ µ°¥¦±««¥¤ª ©¥¡¡³´»¶¨µ²²£¥ª¡xd_a`LIFHNQINEFFBQJH@DGAVSDH<AGQ1;B7:BF79]YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGD¨¤Ã¬¤¨ª¨¦¬¢«·Å¼¿¸ÁÂÀÈÄ¿ÍÆ»¾¹²°¹´¾ÃȶÀ°¼¶º·§¤«¬¡¡««Ä¢¥¨¬¦«¯¢ª¨¾¸¦¾°··Ç·´¸¸¾±¾À¶´²µ¯¾££¡¡¤¢¢¾¤¨¨« ¥¼¢£¡¨ª ¤ ¶¬¦³§°¨ «¢¡¥¥«±¶²ª¥ª¬ ©if\b^PJHKOLHEDI@=OH@;FIH[RPK=HNU4BF8>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0--0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcXN¢£Å« «¢¤¦ª«¶±£ª³¶ÅýÀ¶¿Á¼É¿Êȶ¸µ´±´´·ÂÆ·¿±¹µº¶ §¬«¬ ¥¤Á¥¡ª® ¤©°¢¦¨½µ¥±¼·¶¶Ã²²·º¾²ÃÀ¸¸´´µ£¤ ¬¡¨¨ª¢Â¬¨«¥½¡¤«««¥ X¦¡ ¹ª§·£³¢¡°¡ ¢£¥®²¬©¢¢¥¤¤cg\eaMJKKOFEAGK>=IA99JJN]QQI=LV]9FI=DMI8Hc\KCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+waS6SZkWsHE6=ue\LP 礢³ ±§ª££©¬»±©¬µ±ÈÄÁóÂýÇĽÄʽ°±¶®±µ°Àŵº±±º¶©°ªª¦¡§Â±©¢®±ª¤¨½·¦µ»½¯·Ä³³Â¿²Æ³º·«´¶ª¢¦¢«¡§ª®®¯»±¥©©¢£· ¡£®®«¤¥¡£¨µ§§µ£¯ °¡¢ ¡¦¬°¥§¢
dh]hfKJLKSAC@IG;;F>89NMU_RSJ>O^^=HPBMLI8Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<w]^?[U_gr@8<HweA4¤ §£©± £´©±«¦¢¤²¬©»²°µ´Ç¿Äõ¿Ä¾ÊŶÀɵ¬µ©°¹¬ÀÄ´¸¯¶º¥«²¬«¡§»´¨°¬®´²§ªº²¦¸³¸²¹Áª·²Ã½´Å§¾®·µ©§¬¡¥£¡¡¤®·±´¶¨¤£ ¶¢¤¥±±¥¨¤¡¨ ¢¯³¢¦¯¥¬§ ©©«¡§¡zek^lkNQNNT=CANC;:I?77QN]_RVQBW`]BJSHVKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JqjVCWFyfC;¤¤ ¥¿¦¨®® ©µª·¯«£ª´¶°°¸·°·¸¸Å½Ãǽ¼ÃÂÈÁºÁÆÁºª¶¥»Áø¸ª²¼£°®³¦¨ª¹ª¡§°ª ¯´³ªª¶µ¬º«³²º·¬¸°Áº½¿¦Ãª°¶®©««¦ª ¡ °®³ª°¸©¦ ¶¨¥¢¢¯°³«±§«¥¡£´°¦¡©¤¢©©§£~linbnnXQQZTACDU@;;H@7:XPd^QWWEY_^NLSO_LJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gYaF(@8m}h\V:{cC=¨¡©¼ ª¯ª¢°·©¥´²«¡µ½¯³¸¼»½··Á¿ÉùÄÃÁÀ¹Å½Á¸¯¶¨«·²¼¿¿´ª¯²¸«©®©©§»¥³«¢±°³¬ªµ³µ»¬¯±µ¬°µ²ÀºÅ¶«¼¯±·¬ª£±¥¥¨£²©²©©²§¦¤´®§¢¬¬°§²«±©¢¨¤¡¨¶©¡ ®¡¦¦£ {gmrhqs`GYfVDCMXDZ9HB6>]Qh\OZ]G[^^OMSXdJKC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aV151=`V_8)C3YU\gK5zfL@¥¤«¶£¬¨¤®µ©¯³¹¦§°·Æ·±·¿Á¶µºÅ¾ÌŹÃÁºÀºÅ¸Áº³´¬ªº¸»º¾µ«¯±·¨««¬®««½«®±£ª±³®®µ±¹·ª¯²¨¶¯³º¼É³ªµµ±´°¯§¡³¨¬ ¥±¢ ¥¯¢¤¢¥§²©¡¦±«©´¥®¯³®£§¬¸¢¡®¡¥££ {
{lnyov}bF`jZIHZ[={JGE6AcTi[M\aK\\ZRRRbaLKE`aaQMIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.+A/JGP[G3cXTLE°¨±©¬¤£®µ¨·³·£¬´·É»µ»»À¾µ´·ÃÀÌǼý·¿¿Á¸À½²½®¨º¹¸·Â·¬®±º§®¬¨¤²©¯»¤¬²²¦§£²´±²±µ°·³©®¬²§¸¯µ³ÄŶ©µµ«°®ª§£¶¦° £°§©©¢¥¥¤·§¢°³«§°§¯´¬¤¡¬¨ª¹¢¨¤¡
¨¥¡w|nqxv|]Lel\KOd]?b{GI8GhWe[M^bMYYWUXUj]OPHa^_PKGQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHg27'FaLV%-B.=ELQ<3rjLED¤¤¬ª¦¢°±²ª·°µ«µ¹É¹®Á¼Ã¸³²µÂÃÎÄÀ¾µ¾ÀÀ»¿½´Ä©ª¹±¶·À¼¯¬´´¡§±®¥¦±¥²µ¬ª²°«¨¨µº¬µ²µ«´ª«©¬©¹²°Ç¿¸¥¹°©¦¨±¥¤£®£¨¯¢¢¢£¬£ ¡©¦¥¸¤«´´¤ª«©¬®µ®¢£¨« ¤µ£¡£§ x~
}|}rts~~]Scn^NZg]FD[G:MnXa[NabNVVVWUYh^QSMcZ[TKFOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Dd;6*HdHJ+:I?3CIS,>k@HI¨©¡©°¤§£³³°´µ°° «½Ì»®Â½Ç²´®´ÂÃÑÄſ³¾Âü¿¸½Å¨·¬´¸¼À±¬²¢¤§®ª¨¥±£ª±ª®ª±®®¬«³»§·°²©²ª«¦¥¤®º¬ª°Â¹´¬¹©©¨©§±¥©¤¢®©¨¢¢¬¥¬¡§¨¡¬¦£¬¶°± ©¢ ª°¬§§©£ ¨¡¡¥
|w
utrwl_Y_nbQsq\K;|F>WuWaYOc\NUVUWQ\b_SOOhXXWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=398;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.JgDF8<B05EKX1@]@NF¬§ ©±§¨°µ¬¸µª¤ªª½É¼±¿¹Ã¯°³ÄÃÍÎÿÀ³ÀÃĺÁ´ÉĬ¯·®³ºÀ¾´®®¬§©ª±©¦©±¦´ª¯±®²´»¥·³¬¬®¨« £±·«ª¹¶¤µµ¤ª§¬¬ª ¨¦§±±¤§¥¡¡¬ª¡ ¦£¢ª£¬¢¦±¶¬¬¢¥¢©ª®©¡¥¤¤
¥£|zu~uw¢xj^_nfWedN@gLEbzWbXRfUMVVUTO\]aVLOjXVVHJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DBIID®¤¡ª¯¨¨µªµ±ª¥«ª©½ÀÀ¸º´¼µ¦³¯ÄÉËÒ¿Á»¸¿¿ÃºÂºÁÄ®±µ²´¼Á¾³±¯¬§·ª¥°«¸®§°¯®±«µª¶µ§´·«¬¤ªª¤´³¨¨¤³´µ¡ª¨«¨«§««¨¹¶©ªªª¢©ª¡ ¤¢¦¢ª¦´®§¥©¢£¤¦§ª¢¤£
£t~xu{x~pqffpw\atjO]VHmyUdVSdPMUUUQOX[bVIQjUWTGOXUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E23;:7*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02@f=NX?C,?LT_/Ik7RF;¯ ¤ª¬©£®²´¯ª¤¯©¨»¿¼Á²°¹¢¶¯ÈÇÇÐÀ¿½º¼Ã¾»ÄÂÀ¿®²³³¶½¼Á±²´«´©¥µ©¥³²¸®¡¬´±¯±¹«¹®ª®·«ªª« £¡µ¨¡¯²¡´ª¨§ª¢ª¡¡¬¨½®«®¡§¨¬°¢¢ ¨§§©°©¢¬¢¡¡¢¢§©¦}
¤
¡xt}txz{ut{k¤vi^ekug|RVp_KxsTdSQ_MMSZfNMWYeYGSjRR>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HP;YC3± ¤¥ª£¤¢¬¦³²±¨¤°§ª¸¿Á½±©ºª§°ÉÆÇÐþÀ½¹¿À½É¼Â¸±°µ²º¼¹À³µ¼¬¹¬£´¦¦«±µ·±¥¦¹´´¼¯¼¥¶«©¯¤¤¬ª¨ª²¤³¨«§©¤¨¢©§©½«´°®©¤ ¯³¢¤¥¤¥¨ª¥©¡ ¤©ª
~
¡rzy}{gv|{uqr~jy
d_gcr
{mgy]^VBW{mTbPRYKLNpt]IZ[hYFVgOC>KODCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°©¤¢¡«¤¶²±¤©°¦¹Â½·±¤¹¬©¨°ÂÈÈÌ·½¿µ¸ÁºÈ¶Ãµ´³µ²½¹º½¶®¹¶¿¬¢³¦ªª®´¶³¨¹»¨±¾²º ®´¶©«±£¥¨©£¥°¦¯ ª©§¡©£¨ ¼§®±®¡ª¢¤®¦¡¢£ª¢££ ¡¦¬{}
£}zl}vxxbzzrpqtxjukgcgansmbjo_pA]ykV^NQQKIMSYVM\^lWEXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R]>#¬§£¡§£·¯¢¯¯¨¬¸Ã»´® ¹¯«§³ºÇÊÇ¿¸Â½¯´¿·Ä¶Ã²°º±²À¶»½·ª¹¸¾ª¤´¦¨©¯¸¯§¸¼£¾´´¡¸µ§¦¨°³ ¥¥§ ¥¬§¨ ª¯§ ¦¢¨°¸£±¯¡«¡¬¤§§¨¢©¦¨¡ª}~||¡z
|
|tp|qss_xxjoqqpksdzlgecaf`[rjrMNiXZMQLKHPRPGM[_oTEYZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0][5(¥¬¡£ ¶«°£´³©©ºÅ·³®¡¸«¯µÅÇÀ·¿Â¹°µ½·¿»¾°¬¾°³¿²¼Â¸ª»º¸§§´§§ª¯«²¯¤»µ¤«ºµ¯±¹¯©¥§¯²¡¤ ¤£ ¯¥¡¢¨¯¡ ¡£¤¢¶°¡¦±«¬£®ª¥¨£¥ª¥¢©¢z~z{
~z{prvnos^xwelllkj
nfrijeh]ds`[kviZJ^[XOOKHHRUG39]^lPEYUYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDT]hD.<2dW,2¡¡ª£¡¢¡¶© »·¥¬¾Å´°¯£µ¯¬¬®´Ãü³¿º·±³¹¸º¸º¯®À³³¸¯¿À·½ºµ¥¢²©§©±©«°¿´¤§´µ¨²¼©¨¥©¯¬¢§¤¥ ±¤¤©©¢¤ ¤¸©¤§®¦¥¡¨ ©¢¡¡¡ª ¤¨¤z{}{
{w~|ltrlksawuhhjhgphhidfii`jcjh[f{c`StT\[RLJFIOS@!*h^iLDWU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gP'2¢¤¤§£´¬§ªº¶§¬ÃÁ¸±¬£¶®§®·À¿¼²Â¶°®²¶¶¹¶¶ª½³®²±¼¿·¯»»±¥µ©¥¤³¦¨Àª§¥¯³ª¬µ»©ª«±¥ª¦¤¥¬¡¤©¡¡§µ¦°ª®¡¡¡ ¦ ¢ ¥¬¡© y
w~
{s~~fyojjkftskcgddvceffejickr[_Y]ldaNiXZ`VJGHKMRX>9_lhHCUT][IIGFA.<?9A89RG@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=++,0B*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£ ¬¡ ¤³±¢²½¶¡±Å¼»²±£·¬ª©¸¼»ºÀ±®®®¶¯³¸³©«¹±¯®³¶º¶¯¸½¬¦´©¯¢¨¡¿°£®±¯·®µ¯¢§©¥§¥¤¢¨¬¯¦º¨®¢¡¤¤¨ª§ª§{s
|
ofymgkifprk\gcctbfgjnlgjjhn]llrp`TcicfYIFLMOXRQUaeUAWSYTGIFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9A1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC&4¡¯¡©±¯¹¿µ ´Â»¾º±¦·¯§¤·¸··¬»®¬ª«·ª³·®¦²µ²®©°¶¶°³µº¦©µ§¨ §«§½¬¤®°¶µ¬±°©¢£«¨¦£©¢¤¤ª«ª¼§¤ ¡k¢p£u©§¢ymiwql}
q^cag
ktw~gguheW\hsnMPicgs
h_efnmj]`aeNKD9GTh^JGPPUULHSapteF[QUPFHEC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=A@@=28@E=1,,08=G701.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.¤° ªª£½Å¯©·Â·½½¦·°¥ª¢·³²²°¹¬©¦¬´¦¯´¢©·¶¶¨§¬¶²®´³¡©²©¡£¤¥«¹¥¥¯³·®¥©®«¬¥¡¡§¦ ¥¤§¦§©¤¶°¤£¢£¡¡ ¥¥ªsx
¡vif~sx o~}¡ }sulmieczlraS
mbliqXiqpY^i[ll[rnzr
fZ_GN?G_MERVVQQRWUg]MVHRROFHG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(§«ª©§ª¿Ã¯±º¼¶À¿ª¥·°¨¬¥²´®®²µ©¨¥°¥´²µ¶µ¦§¨²°¬²§© °§£¢¡¬³£¥¥¶½¦§«ª¬¨¥¡ ¦£¥¢£¤¨¢£¥¦¡·¤¤ £¯©¡
±£¬yÔ¨ÁÆyx±¥·eÀ¿y
z|Êr»Åzrµ§º{m±«°yhlX±®nei¼¼ngzorØ~Skc¶²~rs¡ªWOWbOVNFU[XQQS]W[QA\DQNEHI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>:B<?A8:J>52*22BE/.32.+/(-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!§§ª¥¬²©°Â½²µÀµ¶¾Á«§´¬¬¨¦®³©¯µ²¦§¥´¥§¸³²¶«¥¤§±¬°¦ª¦£¯¢ «¢³º£ª©¢®¥¡¢§§¦§¦¡¦¢¡±££
¯kjª~fdp¦q®¡¤~x»}l¡v±_j´[¥e`g{gjxk©e¾qg¦u±j{±xtcnm§n[¡EhfEu`~g|¤§Z`«hxyj§7J¯\XSld[KNX_\WV;NOWW/ITSJDFF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=03.33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢§¥£¤ª±·¬µ½¿°¶Ä²·ºÁ¦©°ª®¨¨°®£°¹®£¤²£©¸§³³°£¥ ©¬¯«¯¦§£¡¯¡«¤¡´³¢«£ ¢¨£¡¦¤¢ ª¦¦ ¡
µµx
©µv³·~©~k¦{w«gk±\«ztrx °vwqlll|N¤XHbb~ch¦`yruS^Q©mcq~b.Q¡o[Skh`LK[dX\ZB>²{XXA#MhFCEA@A19>88:84;99<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.840,.(/3,>831/2-D1=<S}n3+Xj\OXM_gW7J8aU50 ³¦¦¡¯©§²¬©»¶Â°»Á¸·¿©¬¥¬±© ®»ª §³¬£«´£¦²²§£¢§ª±§°§¥®¬¡¤¨µ¯¢ªª¨ª ¥§££¥£¢©¦¢ Õ¹p°Á~Å|Ö»|¥¤{¤¥z¬yV¯z~j¹Z¹v~¦{zªxz±nt¼
oP¯§ÅQ zc`ªbsrm`Sµ´È
|c¤3Bv]PjicP@XgZdaJHMqP\QOYfYCD?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:;DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aP71%¢²¨¨¦´ª¥´©¤¼·Á°¹¿±µ´º²´§°¯¢¯²¥µ¨§¸¢¯°³´° ¤¦©°¨´¨£ª ©§°©££¨¡¥¡¡¢¡¡¢§ ¦ §¡²nhµq«n¦r´sr¶{¤¢¡¦±vÒÒv\®{
¤oª¦k
}}{±qx³etogQÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjceXAOk`lhPVGJ9=URZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aL620¢¥±£«¼¦´¦§¶»¼²º¾¶¶´¹¸²¤´² °±¢«¯£¦¸¤±°´·© ¥¡©¤±§¬©£§¡¦¥ª°¦¢ ¦ ¤¥¥§¡£ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
~v¯w´aemZ°XKuyf`^vwhl]¯wxl5yÈ®²_BTo^g`EPl`pmVVM.feiSYP;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK96<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`H:99 ¹°´Â¨³¨©²º·³·¾¹·±´º´¤·²³¬¨«§µ«¨¯±ª³£© §¡µ¦¦©¢¤ ¡¤¦¯¦¡ª £¡§¤ ¥¨¤¡ ¢ ¦©}}¥x¡ªp§¡£ª|xo±Z¨ ytØvt¨¤{{²^d ~m]«[Zhgªdr{ks^«Z koeOJC¡\[Lt]bgN[a_rs_KW7JXHE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@5.:>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¢Á«´Â®«©¥´°·°µ¾¹¹±°´¹¨º³¯¤¤¦¦©°©¯©´«©®¡ ¦¤£¹¢¢« ¡¨°°§¨¦ ¤¦ª§©§ ¢¤¡ ¡¡ª®mr´s©u§s´xs³¤£¤w¸p{¢jk¶Z¡
ei¡¢§mr´t~²j
ju³af¢ok]`M¡|Rs£ly~or]¯V<wfTon.\§OcSkebmZc]ap{cT[R>=np3CB@?M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¦¼¡²À®«¬§·©·¯µ¿´»¯®¶µªÀµ¨©¡¥£¡©©§µ¢²§© §¤«¸¢¬£¢ ª¶°¨¬©¥£¬¢«±£¦«±¡¢¢¡©ªÔ»s°ÃÃ}Õ¸x§z¤¶u~wv²`ºyÀ|u¸cµ©}«©q{t¼§ ia¦¯¡~uª}¾os¼t²uxnrn¤t½^w}Zay¼kZV\jy^jaegcmxoY\ZC@@s@CF+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB=E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¢½¡²Ã°ª«¬±§·¯¶Ã°¸°¹®À°«£¢£¡¨£ª²¤´¥¬¤ª¦¬¸¢¤¢¯¹²¬¤¨§¤£ ¨«¨£´¢¤§¢¢£¯©¶·xµwmknsoy
tÁ»½{±¨qs¹}||¤»¹½ty´£twvt°ufjµtrqw¶^z}hynzc¬pu
X[§jEeZTf`c^cQggpluCNQMD:ZM?J3;0 8>;.3=A99?=;<C6BSYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW9*O^]=+:VU'>;<§¡¢À¥µÃ´¬«¨¬«©º®°Å³²¶¦³·«©¡¡¥ ª£¬©¥µ§§ £«¤½¦¡©¡¡§¡±µ·¤¤¢¦¥ª©¥¥¡¨¥§¤ª ¤¯¨¥¡j}i¥wr}tyd{½¾ÀºoraskZ^`ck`dnwcle^`bpir}gkrtx}b[wthP\m}{kXkzsJJopNtLEX]gaL[Wgc_O[mtiqRQDEM;GI=M?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S_V4)P_L(3>[O'?2>© ¨¢Â£µº¶£¬¥®§§µ±¬È«¯²ª³¢½°±¥¢§£«¦®£¤´¨¥ ¥¨½§¨¤¤©¨°²¿¬§§¢©¨£« ££§¬£ «¢±§ °¤ §¡¡¤¡gm}qw¶«¡ z¥
mk}}uqxyvu|jstuew}wkozm_d]phMYZfj`WZoxmmfUPFS9OZMRO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\J,<-@³¡³¢À¡¤²²¶ ©¥²§¥°´ªÈª¬¯¥´¥À§³ ¤¤£ª¦¬¢£¶«©¥À«£¡¢§¨§²Ä°««¨ª¬¡¢¤¯§¢¥§®§ ¯ ¡¥¡ ®|«©
z£g¡³¯
v{}wyzofyjuysis{vjudzf`jecdfkYl{oik]SLPD^TF@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_bca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T\Q05N[17E4[G5<,@´ ¹°¿¬¬¯²± ª¦²¢¬³¯Ä¯©ª¢±»¢³¦¢¡§¥©¥¤¥²µ¯¥¾ «¢¡¨«¬£´È´ ª¤«¦©¤« ª¯©¥£«¢¯ ¤®£§£§e|e~cymhk{¥«je}geeih{¢lh£wkj¢skmzzXf^^mv\hswvmwxsmytv|jY^ltd^sik|pkd_RNXIdXAJ4>F7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO2YC;?.=¦ º½º¯¬´±ª¥¨®°¦°¼°¨¦£®°«£¡¦ª£¥§©²£¢¯¥¶¹¥®¢¡ ¥|¦®£¨´Ä¸¥¢§¯¢££©¨¡¡ª°««¤ª ª§§ ¬ ¥¯£©£©}½r´rhx¹Ä¸q££z¦r«|ËÀÀ»q£|À½ÁÁ||ÃÀ}l¥²ooÊzvuyyqzpw
ymxcg`xd`eb^sglddYLVIQZHOD2IE?DB>/<?>@A:8CCBCEHIKMNPSVY^__a_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP.#F[3PY/VAB;/8£¹Ãµ°°À©¨£¯¨°®¦²³®©¤¥¦¯ª«¢ª¦¡«¢¤¨£¤´¤¢¥«·³§®¢¥¡ §¥«®ÀÀ±¡©¯©¢¢¤ª£ ¢¯ª§££¨¡¥¥¬¨£¨¬©§ª£¡Îxz¤y_®^¨£¡|§s«¯^cª{¨
t³c« ³j¯u}·aZ£Ínv{Ú{p}v}ezvvk|n}~m`rmph``zd\qgidg`RTSW]KOD5AHDD8>6;@?A;=7@>>?BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸£ª§³«¦²««ª¢«¦®ª¦¥¢¯ ¨§¢¥ °«¦®¬°ª¨«¤¤§£®¦¬±¨¿Ç³¨©±®¡©ª¡®°©¬ª¨¨¥¢«¬²¤¡ª©¢¥¤®¥ q
u
¨q±}r¬¢¥v«}s¬v{|~ª¢~«{{WÅ{pÁ}muomevd
nawnronfpuuqagme_oiiogdXT]aZRSC9II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^\[ZRC>;92478452&# 1' 1' '45-&7=WJ-<(>1)3W@F!G:C1.+°ÓÆÆ²´ ££¢¢¬¯¶®¨±¥¨©¦««¦¡£¢¥«¡¥¨¨¢°¬¨§®«§¦§¢¡ §¤°¥µ«ºÍ±¦®«¢®¬ ©³«««¬«¥£¬®±¡§«¥¤©§§¯ ¢¢¤j¤uz©tz²p¦q ¤``R«
®v¨
{
zf£¤£}©~®_|©V£z£{ïÅr¯³³¹qb©¯Âthnqozxypmgeerpf}jc]W`jXYUMMQLCCAB;CA@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^aa`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*2PKL# A9D4,'ÃÉÖÔ¿¡«§ ¯¢°´°®©¬¢§¥¨ª«©¤¦ ¤¥§§£«¢¬ £¯¡«¤µ¯® §¦¢¢¨ ¦±¦¦©²·È²µª«©¢ ¥³¡§¬¤°«££ª¡²¡©²°¡¨§¬³¡¡¥{ªlu«y|°o¥ Ò¸´¸É²_`©¥ zxªÉt¤¨©ÆÆyg¡¥t}¯]p´b°uK£m§Gd|qq|u~|n\fjsqfk_aYdn\_YIMMKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ¨²¬¥¢²¸¬ª¡¥§¤©«ª¦¦¦ª£®«¥ ¬©¥§¶¢©ªµ²¬¥ ¥¬§£¡ª§®¢¥§ª°µÃ±³ª¬¨¥¡£®¥¡¦¦±®©§¬£¶¬ ±¸®¦°±°¢¦¡Nxz£}¤
¦¸{{y¹ÌÆÂ¶x¡~v¥¤©°
¬}c¦m¤p
}r¬`£sq`¼}RUt£{~w{sq\nnxrjo[d`iocd]KLQTAIHFI:9K>B108866877-*5==?BDGILNPTVYYZ[\__^]__]ZZZXUSOH@882.,*.+*''?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª®¡¬²³¥ ¥®ª§¦§£¨¡³®¢©¦² ©¤£¶¢¢¢©´¸£¡¢¡±§¦¡¢°®¦©£¶³Å±©¬©¨¢¤¥¦¥«°¢¯¥¦¯¤»¡¶µ¬³°¶¯°¤®¢
ѵ÷y
¦y¡w ¥qª
´nrj¤}s¯¦£¦nq²]¥tzl{|m©a£qqbs²¸hw¦}z~ynjyizsou^eeonfh`J[XX<HH@U4@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][[ZXURRQF:223//++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%r¾¿¼º´§¤µ¡¢¢§¦®ª«¦£¥¡¡¶§£¨§°£«£¤¢ª³³¤¤¨®§¤¨¶£«¤¶¬Ä°©«¨¡¢ ¦£§¦§¨¯£¥¬¦½¬¼¯¬¡®±·©°¤§¯¡¦y¨}|°w¤¥m²p¡|¡¨¬
ª ¢{~««x¡z¯^¤}¦§d|sj¯]¥kp
]`[ m¦||knctnz`hfqoihgCYa[>KU3U8BBC7$$3+''3, /6674359@CFIKMNQRSSVZ]_a``aa^][ZXSPONI7042.*,ATVVVUTUUUUTTUTTTVWWXVUUQHFIJ#((½¨Å¶À³¬ ·¥£¤¢ °¯ª¥ ¹¡£« ¯©®¡«¨£®°¬¦¥¬¬¡¡¥ ¥®¢©§·ªÁ¯¤©£¦¦¥¦ª¬¤¥©¨¾¤Â«©¡ ª°·©«¤²¦¨u¯~
~ºe°e}¡§¬°
¦¤¡¢
¡\lj³`{{±mgo±[~µ\¤kÈ¢d{¼Xv´Y²}R®z¬X¡n¨|z ducxu}bjgqngfePUd\AU`>I(>9=4!",%2. *1/045799<ACFHJLNPQRTWZ^````b^_\[XUPNJFC553./@UYXWXWXXWWXWVWWVWXWWXYZZ[\XWWGB;Ò²±·½º³Á²¢¬¦¤µ© ³³©¤¡¶ ´¨ª¬¯¬¯§¡¯«¨¦¡¥®©¢¤££¥¡£ª³ª½¯¤§~¡ © £©®¨¦¦¢¥¨»Å¦£§©³³ª¬£º«ª«©£¯¤¸Ãº§¬¯§¦«Ö½Âªb£¿½}~£×º¸µ
½¾m£o«lz²°Çi«°½¬xw¢¾¼s§ {|c~{egz|alfkkcQa[Sj\@UbCN)=:4/$%2 $(0496677;>ACFGIKMNNQTW]a\__a^`[\YTQMHC?=A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³³°¿¸±¼²¢®¦¥²¦¥Àª¸²¨¢À§¨³²º¨¯¥§°«®¥¢¬ £ª £¦¦¡©£ ¢¬®ªº¨£}¦©¡ª©¡«§ £ªº¨Ã¢¢©²²¨§¸¥¬¬svª¥¸d ph®nnw¤u®pq¨¤¯¤smmlfxonqzjqigqiigqd]bjoY\f}v¦_aqned¢¡}wfxil{zemdgmcKdXJkZ:QfER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWWWY]^^]\\\]^]^][[UW^©¬³©¹¸²³ª©¡®£³ª¿³ÅÊ¿·ªÁ®¤¢¨¬º£¤®«¦®©
¥© ¤£ ¥§¨£«¡¦¦¨°»«¬|¥© ª£±¦¢«¹¯À¦£±¤«®¯¨«©¥µ¢¬¶¡¨¦·£ª©³£ª ²¢¡¢¡¥¢¬§
¥~g~tusp§lz¢¥tjwrxx}zjmedpeU`Y@j\HdbPY+F=+'!750.!%2(*699469;>?ABDEJKKMPPQXUWY^`ac]^TQKEC>9=@ASX[\YWXXXXXYXXZZ[\^__`^^^__```_YY`¦¨ª¤´¶®®¡°£ ¶±¬È¾Æ¼º«£¦§±©£¶§©´¦¨¬¢§«£§£¨§¦¢¥§¢¶º¨ª|¡¦ ª ¶£¦«·§®À¢µ¥®®ª§§±¶¬º¥¤¦¶¢§ ª £«° £°¨°£ £ª¬¢«¡~e
uuxsj
}£¤
}st|s|joe_qj`[`ZndQaeQZ:GGE>2=>9/*&+)&&416668:==?AACIJGJKLMSSTUZ``iaeVPKACB:9EMV[^^[Z\[[[\]]^_]^_`abcaaa`bbbdb\[c£§¢¯±«®£©¦¬§µª¥µ½°®£¤|¤²¤¥±©¹¦£ª£¢¨ ®¨¨ª©¹·¤¥y£©¸£¯µ¢®®t¢»¡±vw¨¯¸t«£«d\bv ¥}m³£§ª£esyp©m¢¨e¦
wjvp{
`hZughs|¨f{
yjozkre`wplki\febbqT[>NNNSG>@UD:1/&4:306678<;>@AAFHBGFIKMSUUY]`hfgXQJ<DG<8UR[`ab`^__`aa_\]__`aabcdabaaedchd^]f¦£ ®¯¬«©¥¨¢§¤«¶±³§«¨t± ¨«§¹ ¤«¢§¡
u§ª¥»´§ uw¡¡§²´²º¥}§¡y ¬µ¥°ª¯¤z¬
¡§¨§
w¥z§{³z¡c{
mpyp~
s
xht u}£
kly|rqheypjlk\elkfu]^ITLR@E6.ZUU7)!09>>743568;:=>>@DI?IEJLGSX[Y\bahfZQH9EL;>aV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah¢¦¬«¨¬ §°¦¦©¥¯È¿±¢¨ª·
§¢ ¾ |¬¢
§£¤º²§
qv ¡¤«´´Ê©¬¶
¯®«¨¦}¨s{w§h¤y´¦§Â«¡r¥}
³¡}¡¡}
ms
~yq{tÅf©£k
¤qiyv|xhivrhhl^dpmgnYgG]RM3E57Nbd7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^il\QE=KM@JcX]cfhgbbbbdc`_babccceiicbbbecafcbbi¢¯§¨¨¥«¤·°©«¦ £¤¬¥¦¬¹¤°¢©¦½¡y«¡w¥£¹¤~bm ¡¡¡§~¡§ ¨¬
£©¢ukvM«x¨¦©«}¡{z§jkg·~n`dY|dhr}yl]}m_Rp\_kx_Xd|p§ªk£nr¥p
jg m\p~gZ`cXQpwfnuskjp^kqnljYiO]YF9A5HD_l5,IDRMN=84859;6@;;>BP>QRLMBJ\]_W]^bu`MD:MONTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ©£¦¬¡µ»ª®¢¡¢¥¯¡°¶¤©¢¡ §´u¦~
¬¤ª¦±§¡in£¢¤¢ v§¥~
§ª¥x|~¢ps|ym¨{¢sv¦f~w¤_z}t¢n·´ºtµ¨dƸ{p¶r£cs¬«`|i³~m|q£lr£t
¤a´s}³ut\²kcpuwripYlmssg]j^bLE=D6QBZs3=SG`JR=<395:96D;;@JP?UMOQ@E__[ZX``|dHC8MWUWbaZefkkbbeadd`ab`dd_`cknccddhdbgfchh£·ª¤·´ ¢¤£¦¯³¯¢¡¥«x
q¡}¨¡¤©¨¥~j{~}¡ w¡q¡©¤¥¨|~z z£xt}¥
¢d¡|mhoz§}rit«tªh]
v
gªk¸f\¨p`^§vu~huon§^©y»k~ª\]´h]nrzxlj\qkyzdagXbBRFO7WCRo5L[[_NZDA251<:7H?:CHU>YRY]>Db^V`Qac}jEB9N[^YdfXfgnmbbe_aa__``ec^bdoq`deekecihgki©´§c«º±¯¬¦© ¯²©®¥¡ £jr{z¤©£ iy{¢¡rhp©¡¥¥{°£¢¸w£³£¤y{«~¢q¡|
¯µ}k¡y~µ¢¤«¨|}tªZ]o{xbL{z
cyBLX¢jq{lux±³§wnt~ptk¤^vHedatrofaliw|eebQ_W]UW@ZFQhETW]bX^ID=B8?B:IF8LEXAWR[VDFb\Z`K`m~rEB<U_bZeiVghmobfg^aa\]^`hb_ecvl]egfkdeliiki°S^ ¦³¹²²©¢¬ª¢¥£© ¡woy
|r¡s¡
ª|l
q¡x|¤ ¢}µ{¥z©{§hwm~t¡sr|p®}¤¥£o^©gu¢co¥aÓ}{xssb¢~£t¤vk³`sª²¨¼wm~¿¦©´]m|pmr¢r]¤gs¦`h¦mÔ~p{{l|xsn©¤gaezr
lhfdovxhacS\fQRbHYJUaWT\fk\eQFCKMJKBKE8O@QNXSYOSQ`ffjRcwywIFEc]eZhjTihjocjg`c_]]]_hbaie|d^dgdkdjlfhlh¯ªT\K~©¯±³¯²£
© ¢¥¦©¡«¡
{p}h}wo
l|¥«yvnw£{¢£³¡¢¶z¬§¤®¥p©
z¤¡r¤®¯¤ vµ¶µÉ¡s`©my t¢w ~pMf£ps¥{ytak~ kqd_q}shyi³µ´Æ¦s}zk«v
nwyj{vsQE}³_jwlzgkhcuvqoW_TYiPShIWMYTV^iloVhWNKAJMKHJOAQKPecjmetrsy|nu{{TQOl^i\kiRjhilglfce_\]]^ibdik{_]dgcjfomeile¡®¥d?¡²ª®¯µ¢¢ª¢£¦¦¨§zjye yui
y¦ªz}xp¡z ¤¦fnxl¢d{q¥wpf¦z¤zsw¹n¢b} nriªku mo¦`iiu¢~`upbh e~iuocfmq¢Y^Zb¡l]nz}srd¥mx¢dg§hsp¢pUo _f¨U^TnntksnqilytkpRYWWfZTmIZP]IXiisjYlWQRFV\LXSaUik_wt{}p||r{svv^RrbgcpgPjhhklnhdg_]^]`jbjivu]\chcjjslfkmc£¥ydsm¦£©°±¦«§£¢¤£{qi|su~{d|¨£~ri¦} ©¥¦x~¤±¯¤u
x©s¥n¤¢»n}¥¯
|¥zr¨ g~o¬dw¨mª¢vw«¦k°kv³©k
mm_}«ªv~~¥v|¤ jx¬h®¶tw¾¤Z§«avsur|uqckohmTW[Vab]kM]R^J^mow`[qY\`[gtenorcrt`wz~yrys{{vbxdcnrdRkgholrjfia`^\akbmlzo\\bibljwmglnb¤©£©©¨¦®¤¬¦¦«
t{o
~ttsm}{§§§
vnl©©¢t~y®¢qw}{r§r~}zy{~v {}k
[yyrzqin~quqe_wusuoynml^ugwe¨}t{jpv}wnnhtz|x
\lXyioxsrpxxp]lojhW[`W]fkdVcU_R`pyymkwfkkkw}rrutaovbt{xuzuy
}{nldyn^Wnghukxjije\`Zcjemqtn[[bldllynhkoa·¨¦ ¢¦£¥«¢¡¢¨ªr|}~{trq
{}y~¥|¨¢
vr©¦ª~~§¥woxn~¨
q~qkp} hl\sqtkwtYrn~j]je{`ixz{u
gwj`oqu^q¦
enwqzqhif|{[]khnv\|zxvotsh]nllcZZ_[Ylq\_aZ_^ft|vpudkkk|}s|yuenuhm|~wz|{yz~o
{}t~yshT\qilvpugkhd]aXkhkkqrnW[enlgsyohjl`©°¡¢¡¨£¢~® £¦|}s~v
ror~z¡¨¢yz¡©¡¡££ª¡§¦zv§~²¦±¥k|wxe|
w|zt ~}tnr}v
¥
}zn
~zksiatq~{xwpxu]^oio`_Z]]ShrVd]]bmhv|}topekji}nyrjpqlg{rx}zm|zx{}zxNcvjsnpzekecb`[tfpgrqmU]ltmhyzqgike¹¡ ¤¡|¬ }y|nys~mk~z~
|
¬ s}{ª¤¡
¦¤tz¥{|«¢©~oxru`t
nyvt¢
s|{qqzzw¦
w~rm}oilnh^zi~}wvwv{x]`q~nu`c[]_RgnUf[^bkivzrlmdkjhltllupzpynv~
vq~{||{`h{juiidjc`i\cuhobumlUcqyepz{sejmm¶ £{x§¥z{}n|ys
~}kh}{}|©q ¡
|¨x¢~¢ £|w ~|¥¢¢¦~~utqwa~q}r
hxrx~r{{owzyx¤
{v}hs~z|rmlh_~ti}vvt}sk_`tvpwdcY__RkiVfZ`aijvyrgldlhfkn~hoqlyzls~tv|{}irntiahlb_qVtolm`xhmWjtvcuz{rbjoz±¥¤ |w¥¡£y|r{tv
~xgc}x|y¡p¥¦
v y~£wv~s£¢¢~|vq~n{d|
pl
fuo{
|x{{zp}w
x¡vw|xazzuyhmfbjkxttw~r}cdasnurmaZa^[meSdYaaikuyrckcmfh}liuhnpj}ymr~t|~z~|mvsumeljbbuVipn`xglbjvpfy|zq`rl
¦§~xªzy|~||xtyzt}d_}t|~}¤¢s{¦ r¥qkzo¤{yrzlul|~m
wp~~eri{~tx}tv~|{£xt}tv
qb|v{r~pcpde|copwsyxtubv`plvno\\`^^k^Q^Ycaint{l`jekchwngmikmi}{wos}t{}z}}rzxxmljh_ircgqoewgnlayik}{xpaxm©¤¨~x¯}w~|}|wxput|o}|a\~rzz¦}}£m¢ lezp£}{
ssvlqnu|toqu||eply||tsxn|
{§z{~
x~qp
fizuvq|c_qakt_qk{zylsqey^olsmrX[_`bl[PXYechrrg]jigbgqodjheiizwuo
t{u
x
|x
zw{{rxjk_phtkromrgole|cnzvqlww~¢¡§ ¦v«¡t|w
xyrs{kspznvop[Y~ut ¢y
m¡h¡e~w ~}{|ovplmop{itqwuyfrnu{yyusozy¢{uxynl
_tutrry[_qapk_pk~|qnnkmvapokqmYYbaboXQT[fgcup
c]kmdbfkn`gg_hkurspuyvx
xw
|{vjqc|c|nqmtjholvx_qy|tut~¤§
v zryupr
tqvlpnvmv~mmUQªwvqz¡x{£{r
~|f
f
qw{z||kwjnkll{az~w{x}ygsls}
zqyouyy{{zv|wqjl{ayqonstV_pbrb`mozqipfgsuirlbwe]WfaasTQO]ge^yp}`]irbbffj_he[gp~plqt}v|uv~y{
xs
~|yxfrj`~ookz`jntu_t}yxts
}x ±¥
wtwtqo
tprpkiwnn}}mtrRMßÈÖ{puv
¡x{s
¡~wz~xte
k¢cqz{y
|m|esoklzz[yz~{{isjs
|k}~m}
|x|uwxrmgq
nlupikvoS_pepZ`msyhlkcgxrpqd`xa`Vl__wQNLbgc]zrv^]evabeedagbYissnkqv|tzuv}s{r|~vesn|e~oplYlnyys`vz{vrwwy®
w~|
txpyqopmoseeyq}my}jgkc¤ÁÜ®ð¡slv
w¤o¢r¢
}ztwuul|¢
^m{}
v
}~k}dxvjnysX{
z~yfri~kum}x~trwusqgvzcunqckxhRarhlV`ouzard`i}pso[drabWn[]yOMLegb^wtn]]dy^_ee
`cc_Yjsknksw}twxw{q}~{t~sguryl{ntqWqzvyrdwyivr§£}qwy
¡|{swptjpljm|u_axw{qu{g`d|ëÚµÉÃÜsltwkq
|{
uxru}n¡ai|}q~qwhvsjtwlZ}
}vark~~}mkw
{{}mpy
tkqlsyaujp^mxaResifS`qwuap`]hqtkXhiciYnW\vMKLfg^bstk\\ey^^dg{ad_]Ykofojtx~ss~{vzt
|vw{ulwvyxtnx{}Xyqogxwdv
p
¡¢toqw~} xrtnodrifmxx\`y{{qqjagaÕ¶¦xoqx}qk{i|{}zszzptt}~b
g|~~m|tlmwutwvlc
~}p_qo{{~ypey
z|~mny~umnkl{dilkZoxZSjsibQcsxmcf^Zkntb\h_em`oU\pOHOgf\hoqn[\cs`\clwee]]Zlmcmjswrq|}txx
}uy|vpxy{on{w^tmiztsgs|q vvmw}w~vrpljau}gbjuz[`x|zlpecggW_qs½Å
wrtsk{|}|~t
vv}quq~syf~r}g}{y}i|vfpyxswtlkyk^pvz}{~rhx
w{|mkz|vtoih~we]rdYquTTosibNhuyga^]YoptZec^knaqPZlRDThbZlom{pZ[^mcZcowdg\]`kjcliswro~{tuz|v~xtsyy~oo{qjyz~nm|vkjxtk
o~vjyyozsqljd`t{i`fr{[ar}zfpzaed±²wKbZ¥ÚÒs|z
ol
yy|yxnqs}{jy¥~n}tv
p{~oxh
xr|e|~ucqsiyqou|wyzk\o|r}
zqmp
qwwml~vzehj~raZx[ZsoOXrtg`Knwvb^\[Yu~spXg^fkr_oOXiS?Yg_[qkgyr\[YleZcpy_h]^elhflirxpn}vp{v
qq{|zyukzlp~u}or|{poyf¡gpgz
|ixrllf_aoym`coy\dlzaqv_deÕë¾3:>ryxnm
u}
|xnvvmku{uey§|l~rtx{y
lrixm||xbyrdqinurutv~sp[k|sx{|wypkpw}}smjvuu]iiyqZW~T[rfM[srf\Jryq][[Z^vviZb[hfocjNXgR>^f]^vf_uq[YUodZeqy[h^`gmhjkipx~mjyn{}zu
pnw}{{i{}kt|r{sv}~zx~|km~li|~}kuqgic[cgso`altahpzast^bc n]6[°¶uj~xuwpm
tyx}zsgv}|no
}hvynez
¥}m}t}{
|q|~|i~mk{yjzwr`w~rdrgvnu{}pwz|umWm}us
vtzwrmq}{|ynmhmun]hgurR\}O]r]O\spdVKtykXYYZbrva^]agdijfOZiNAbd\`wa]unXXSub[eosXj_bhkgmlipw|lh}|p~{zwr{oqw{j~{nxyvw}x~~zm£
|vzkm
z}{~prpcf^Yg_pp`ahpfjotato[`djv{¿¨¥É¸r
t~ztrspzsutwyyqdwyhqufwvdj|~|q}rw~v{lyzuh{ilysizv}h`w}kjth{jv|~~q|w|tbUu{qr{pwxoo}|w|zsuhpglrp]hctoLfwM_oVTZtnbQOuybRXX]bqt\b]ieeckdR\qIDeb\dq^]xhVWVx^\fniVl^ajgeonhpwzniy}s{~y|v}pvsnw~q|xzzux~zuo}~{w|huz|vgpn`e\XfYmsaaaqllhn`siX^cmw©Ú©È³ryqv}{utu~vopm
txul`yxeqngun[m}x|wzl
s~r{muwmhwem|vmkww|`bxzhuvc~{hu}uvr{}mZUq|os
}wksxjt|y{wzq{rgsdmls[j`vfIooM\cXWVymbPSuwYQVX^ar
p]acmec^ocU^sGCg`^gi]Z{cRV]v[[glbVk``nfflphpvxtkvvx}w{t}oququ}
{wx|}
x|}}{~rvx{wuz^~zt
w{bnm\b[[aUjtd`[hopgqaqfW\ck|Êκ¢knonr
s~{
zytzutzjlvcvvog_|xdqjjqcXm{rv}zmop{yrrp~ghrcnxqjlrx}|y]ezxiuygwhu}sjo~xn}]Wo|ls~znnpvfv~uzoyr
zxqer`mkrXk_y]IplOXV_UV|kbOTvsRRTW^cuj]akkfcZobYcqHAi]ag_\U{^OVfqZ[jh]Xha_rfjhqgqsvynu{x~yus
pp{xwuy
z|u}~~}|xvyv~}nuzdto
zucnjY_[]]Uhse`YdrrgrakdWZ_ix¾®{ ·nbtiu}s{
{~wxswozvejoausjb^}wxep}gkk[Vox¤
pqvsl~r
}yuspizajmamvjgkkywzw[g}|yfr~n
tfupgk{tmub[mzjszzet|mpgt~w}~pzjyyxvodlal}lnVjaxVLlmPSPiNY}hbOUvlMQTU_hwg^aqigaWi]]ljJEl[beWYTyZNWokY]le\Zec^tfleqgsptxp
vx|
}usnsy{{sr
y}v}
z~{w|wvzjv~}m
sqpflgW][\[Sepe_XcruivpdebW[[hporsefzjvwuu
x
zwtvnkzpahkgtng^_|ny|glwfjdVWsp§}{vt{qzxlyzu|}uqsmhu]mi`mudggizo{sYgvuhpxvbw
}okm{qese`jwfpuy|auvjkqtzpywr{e}}}vumce`l|mkVjcrTLklPMOpG^|faNVueKNTXalxf^gsje`WdXcr^LLlXdbUTUsWMYweZ_la\[de_wgmbojtoq~utxx~z}v~
nrt|{uq
zut|
|~z~v{£¦y
lu||u{otz
}unjieV][[ZScne\Ybt{jhmh`aW]Ziikphmbi{zkuuupz~wvn{hjyj_enhwgeXavi}ynioff]UXoh¨w{|xtn}mqtx~wtvjtwhio\me^ns_gbjxh{m[mstjo~zwaw
zsrpzrcqh[mudnqzwasphjxtqkwvsuby}utocbbl}|kkUibgTLniPHRlEayfbNTr^JMUZfmx{f_mqjd]V`VpoWJTiXg^XNVlTK]z`\_l]][be`zhlanpvnowuz}wyzyz}qttzvt
~}ls{
}~{u¬zlrzvuoo}tjonedX_ZZZUbjg\Z_ui^ml\aVZ[kert}jj^mxwhuxso|~~zvslzhiwg]dsgzwccTdofuvfhiaWVYhd¨owzpn{fwmyzvq~ndwtehi]lb^po[h_muezh]tnrkq{vubu|xru~taplXpqanozscqlam{pjgywspdtxxtoc`cms}jlTi^_ULudQHWbGcwfbLTqYKLXYilw{eenrfcZX^YwfTI]dXiYYIWeQIcy[^_m[^]bd^ij`ntxmonvyr}~uvx}tuuyzz}
jt{}~
y{~|sq®||~fqzt~}wspm|~mzcppbe]eVZYWcfk`]]thYpm[^WY[l{bqwvmc\ntuhvwroyzwootehte[gufvvy_]Seejs|abi\TX^cd¥iyt
wlmxfwl{ytry}yifwmaga_k`^ukYf]oobze[w|knopxytueszvor}raxcYnn`opzseqd_nvjcfxzrlmsq{qpa]dmo}eiThYZUNz`RKZYHcudaJUnUJLZWjms{dlltcaYZ\bw\TKd^YjTWHYaNHkwY_an[[_bc]
ihbnxymojvyn~vuttqvvw}}~~px}yxy~ssp¢{{yeuzsywltply|ps^poagblT[ZWidmf\\reSrm[YXW`lvcjujj_[ntrmutuk}|wonldipc[krdtvs\WTd`q~~p\ac^SZa\derq
skixknnyyzqvs{z{dfvh^c[ah\_whWb_phawa[|vjjrnxtttiq
vsjp|mfwW[ilaoqxseo~[aqqb_io|kjr}povjp`Zdkm{agTgUXSQx]SPYRHdtbaGVlQIPZVlll|emora[ZXZmqXSPgXWjTUFZ]OIsvY`cncXaaa^jcemzyloivy{k}
|y}mqovz}t}tx
utpvo¢t{{fwon|pgxq{lsvsk^tobgfkS^\Vhbll[\qdNom\VWUfishctee^Zpvoqvvzl}}wscdkoa\nmcsxkZTVbcw{|o\c^cT[`Zccnp
rifxmdruqzkytuo{v_gsd\_WbdYbueU`amdaq]]~ohisqtquvlm
|
qrgn|oqoRZeidprtsbmuUcrk\^nd{dku|pqqim_Xcijx^fUdUWQVoXRWTPHes`bFXkOIYUWnie|ilykbW\V\ueTSWiRZgUTI[ZPNyw[_emjZba^^nbglzvnoivv~m~{krgt{v~s}
{ss}un¤swxnz`e}qgztymmqwgd|mcgghS`_Ug`lo\^nhNjl`UVSogskfxef^Zrvns|ytn{w{zkaelm^`njeqy~gZVX_lxzzn^a]hVX`Xdbkp|vkiuk[upjyiurno|sYkn`Y^VcdYeqcT_biablZ`~kfltuomxvlh{mqfp{lqlaX_gfnrrr^ilSfqeVbmaxaotztinkj_W`fhu\dVbVTOYgSO]OPHep]cGZjNJ`LYme`xioe`U^T^v\USagO^cUTK]ZQZvv]_fmhXca[^qchjxrsmgvsys{~|zntlst
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDCGdhgggge¢ ¥^*....+H
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR4555549\`____]¦¤¤¤¤ªV;|}zzz|}{|~}~}~}}~~~~
|y{z||{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
~|vvx||{|}}}}}~~~~~~
~wxz|zz|||{}}~~~~~~~}xyzyz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz||||}~~}}~~
zy}{{{z||||~~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}~~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~
rtx|||{||}}~~~~~~}~~~~uxrvy|}|z}|}}~~~~~~~~~p
|ussvx}~|y}|}}~~~}~~sorx
ty}zxurkeimolffggpsswy}~yz{|}|~~~~}~~wm{sx{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
sno{uv
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\YXXWTPQRSRSMMJIFEHJGGHGGLNIgsuxz}zxwy||||~~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwtb^d_akqfhklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhb]jl]ffgeccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHIJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^ZZjwmbnsjaYY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROM[krlanurfQQSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMN]cokYisupSMOPPPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKFBFHUbhlopomlZLLNMNOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtttwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHECFGHMZghgrnnhfd`^^XLJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>IZ][\elnkommlkihkdSGEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxz}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;=K\imnojomkjlmfQGEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;:=HcosmnlkliUC>CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtstrqtxxy}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99=J`ssphT?:;=@A@=;;><=<@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyz{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;==><:Bl}j@:;>=>?@A@??A@@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;[n@>DE?@AD_d;==;:=>AA@>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJGVppqssttuyz{||~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8::mwI8;:=>A;Hd=<=<8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR=<=ILFEuvN788:;>?WjA;<<::;>??==9:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CszJ;\z|wW<=?==>EhtL:=>?=<ASD?<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hlopoqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAGrzkb}^>@C@@=Js{Y:=AEA@YaGC==@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBBC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqprutwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Eot}~}vMACE@?>Y{]?CEIJIjfQMECGFGEGEEEDECA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEDCWu~XGHJLNig[[VLHNMHIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHFHFQnnpqruvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLMVedb`e`N_IGGGGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl
|PLMcjihcfhg_@@CCCCFFEB@>>@AA@BD?>?DFHDFGIJIJHHHGIIIJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLKJT
uIMmumjiiikI:<>;:<AA@><998<<=;>;8;?AB@ACCB@AADDBCFHIHHHLMKGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJIIe
fQuxtmmnolD7896479;<:8567789787588;;;=@;999=<>;<=ACEHJMLLGIGORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIh~mv|qoponK26873568:876565676767:67889:7578979776:<@GFIFIFEFOSRSSROPPRTepqsttvy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@6788=:=ECBe
rs|rqnonD3688557699776765:9:::;798987669:98868689;A=>>BA?AKLOQPQOOORWkqrttuvz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=q
lhloy}f>;;;<9:;9:;::9;:9===>;;<<:>;9;;<;<;9:<8::::999<?<<ABDIJMKIKLWorsusux{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
floy~^ECBAB>@CA@>=>>@???@?@==?B>@A?@?=@@@>?A<><;:;:9;?=;;==AACABCAXpqtttvz{{|}{}~~}}}~~~~~~~REBAGJNOLIGK:8:;9::<=:;;==?@BR
yprov]KLHHHEFHGECA@CEDCABCB?@DHECECEDAFEFDEFD@B><@>=?@>?>?>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFW
|srpXLRLKKIJJJIFDDGHGDDEFDBHIKGHGFHGEKIKIJKJCFCCDBAACBDCCDDC@=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGIY
ywuocQNLNKJKHKGDGIIIEFIFFELLMIJGGHIJNMOLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~}}}}~~~~~QA?>?EGG=<@@88<;;=:>@>?@CFIIP_
y|xrYNMNLJIFJIFKIGKJIJGGGKLNLMHHIJMQNONMOKIGIJHIDIHHFFGGIGCBACTnpuwwyzxyz{||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADHJLUq
yrb][PPMLIGDHJHMLGKOLKJJLMLOPNHIKLOQPPQOOJHJJLJLFGHGFFHFEEBABB\orwxyzyyyzz{|~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
`\WWWUQOMLEFGMPOPWUQPOQSRMSTOMSLPSUVRSQPLJMMMLNGGJFFHJEDEEBECcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B@BBGVNFNPPTX{
n_[mdHUSSRK;;STS`u]UVTVYYRXXRZfPUWZ]RTWQOMRQPPQKLKHHJHEFIIIHIirvyxyxz{{|z{|}|}~}}}}}}~~~SHJIHGGFE??AAEACGEDELXRMTUVXZ|
~arahX=[ZYTR?@WVY\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXUTVTOOMJLJIILMKOMSosvxyxxzyz{z{|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~|rs[^]\SUSWWU[ZuYU}a\X]_WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
ni\\][VWUXTRXVcRerXZW_hP`f[[X\gaGOZhg][\]]WROSPPRVVVVYZnrtwvvuxxx{{|}}}~~~}~}}}}r}ot|]SPOMKJEC?@;PPZZ[RSQPRRRVSVTW_ux
~}`TX[VTVSRRMPMLfz[]TYUV]ZLTZUST^ZXWWWzkX[\\^TQQPINOWVX[Zdprvvttvxyy{{|}}}~}}}~}}~~~zxwvsu{tk~kry^[VUSROKFCDAM^lVRSNOQOQURSRRUcdv
~zosZMNQQMOLJKEFIFC?TdURQQNKQTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquuusswzz{{|}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^\YUPLILIaltPQSNQRQR[RSRQRUTbs{|}{{
va^OFAEEDDCAEQCEAC>CIGV@HNLG]iPHFNFDEFIGHBDHGIKGDBAD@OQMSdrtvustuz|{{{{|}}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTSOV`klrv{{xytrnstsyx~lOIBB<<>@A@@?kQK`EFHIEB?GLNGMQUIAE??<=<==?=?ACC@?==B>JNGUnutustvx{|{||||}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljjf`[QRZ\Y^JJPQNKLQRQTVUWQQWUPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeDBBB>;CCBBDB\]O{NOONKLMOOQLKMWMHG@A<977599=;;;8:8:?<BH?\stuuuvwy|||}||}}}~|~}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP_]ZIHPRQOMPQNQRTVXSSYTOYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHGHHCBGIFFFDMRPaWSXQPSSRU[OOQVPMIDF>:96587979:365795<C>essvwwyy{}}||{|}~~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`VW^ZXMKTTSPQUOLRSTWXTTYRMWYZVXXVXY]WWXhsk]Vaskba_^da_^YUQNOOMIHJLJIFCQPS[WTTNQSYS\eUOSTRNKIHC?A9998978857578599Gmrtwxy{{|~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTVUUUWPSUWTUR]n^RNZ_[VY;DVXT[fJLPSRONMNNNLJFQPUYSTOJNOUST\VRUSROMLIHHF??<:787659967665Wppswyz{|}}}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpofedc\]RTZVWUTWTRXXYYYSUOJGOPOOMRJPPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPSMILJORPRRSTQROLMKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqnhihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHKHFLMPMG/E_R>3?>joaSRQ@GTQPQPQNQOQPLJLLOPONPQQNPOJLMMKGEEDB;==<9=G6677Dmptvy{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]gTQSAGUPOQQPMMOMKLKLNOOQLOOMHLLIKKLKGFFED<AA>;@E;<89Sprtx{z{}||{y|zz~~|{uturvvz{xzr|{|yymqoxrqunnqroootssrutkgg^ejmpknqmimcLOOMQSLTUTXWULLKI<987;>@><=A@B=>EHGCEFIGJJ@FAA@FHEJOHQRb\QPROSOOPLMONLMMNON[WKMQOGIHCHJLLKFFFE?BC><BG?B?Adptvzzz{|{zzw{wy~~|{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCD=9779?B>;?B@@>@DIECGGJGIEBB?>=CBAGIDMObeQMONWKLNKLNMMLLONSdNJLRIIIEAHJLMNJGIGBAB@?EFEHDKnovyyy{{z{zwtxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGMMJMPMPOHJD?A=98::?B?<ABAADEGKFCHHGGHCC?B??@A>DECKNRTLJIMTFIIJLJKLIJMMOPRPJGCKGCBIILMONIJIGCCCDHJMLIYrmwyxz{zy|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqGKDGHHGJKIJKDFB=>=:9:;@B?=ABCCGFIKJDIIFGGCC;A@B>@@BECIMPHHKGHKDHJLMHJLHIJLKM]RHHDNFACJJMLPMKMJKFGGJNNQNLbmivvwzy{z}rmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKDFEGEFFGDGBC@><=9:::@C@>ACDEIEIJLFHHGFFCB;ABC>@CDCDGLNHKNHDHEIMNMGILGFGIILNKIGENHBFMKMLOMMNMKHHIORRSNRfffqosxu{y|lhjnekqlspfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGIDFFECCCE@DB>?>:;;=:<>CA>ACEFJFIHLHGGGFEC@=DDB>ACCCDGHIGMPJFFGKNOKFHIFEDEIJHJIFHOKDILKOMONOONJJILRUUROWd`amgqroryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHEEHCBABD<BA>A=::=?;=>@B>@BDGJEIFIHGFGECBAAFFCBBBDEDGGIFLQLIOJJMLIGHEGEDCIIHKJGKRMBNNLPNOOMNOKKKOUWVUSX_^\iaminhrsbeffdhhfnjfmmhkkmriqvtsqmvnoqrswsrstuvvvvwvwwvtwujsunutsqrjksMGHFHBBADE<A@@C<8:<>9?<?B@@@DFHEHFFHGFFDCECDIECGEBEGEFGGEJMKHQMJKHHIEFHHECIIIKMKOSNDQROPQNOMNPMLMSWVXXUX]Z]d`ibjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqinyMHGHHBBBFE<?BBD<7;==:>:@B>??CEFDFDEHEDECDEFGJEEJGCGHFHGECFJJGNKLKHJLFIIKHEKKLMNORTOHSTSPROQMNQNMPWZVZYVZ]ZXa`a`^hec`dfhgjhhifhnllnmqpiuuxrrpupppruvpusuwu{~}xvtwvvvxplupmstnprrxNHHGIDBCHE<@EBE=89>>=<<AB<?>AAFCFCDIDDEEFGGGIFGKHDIHGIGFDHKIGKHMKJKLHLKMKIMKONORUVOKUVSPSQRLOQPOTYZY\ZY[^^]`b^\ackb`dfgr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptLIKIKFBEGE<@GCD@:<?@?>?BA<@>BAFCEEEIEFEGFHHFHHIKJFJHHKHFFLIHHJGLLMLLIMKMMMOLPPQUVWOKVVUSRQRLORRPV[[]^[\^^^``ad]c`ef`ehjdssfjggkorqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGBEDE<@FDDC;??A@@@CA?B?ACHCFFGIFJFGDIHGIHJLHHJJILJFJKHIKJGKKMMJJMLNNMPKOPRTXVMNTUTRRQPMNTSRW[]^_]]`_`aa`acebdhbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvnwKMLLMGCCAD<?EEEC=AACBCCDACDAAEGCHHIHGJGCHIGHJFIMHIJMKNLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSPW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@DBEDDFBCEGCCIFCIJJIIKGDKJGHJIILHJJNLOKILHJLKZfJd\KlSHON_nUks[qpbwcSPavuhucav`Xnqbdvinzf[lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDCEEDFBFFGDEKFFJMLKLLGGMIGJKHKKIKKNLMLLLILML[sbdp^lmUMNfs]ffqlntgpi_aYnnbppbkjjfoqtetno\ougpMJqyvka`keemxlkvmnpsrprqpqrqrrrtrmmsnnopsutqsstuuutwxvttbmukpplrrqzKLIHGED?AB@>CFGCFCFEFEDCHHHDEKHGLNNLMMFJNHJKJILKJJKLMNNMMJMMN[roonpplkMPQlWMibtrpamnu\YlP\nmZqmkomxxtsip]_rkqjUuyxoc^kfbgpojjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGGEEEBBB>@@FHCGDIFEEBFIHHEHLJGMMOLMNGLMILKIJMIKJJKOPONLLNNL\hdu]lqWlNPQmTYk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHLFIDEECAB=BACFDHGLHECCHKIHFJLLFNLLSRLGLLHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYrkgooqqomt]nXat_nopoqronusttj[^tcwxrjnzhaacfbbimtupsuvsqppqoqt{~}wlkqnlmnprsqttsuutxxyxtukoumtontsvsHKHIBEEEAA>DDBGDHIMIFCFJLJGFKNLFOJKWRKGKJJNIHJLIKJHHKMMMMIKKKSkc[i^_icrrZ_Yjn_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmqpntyruqopqny
vsnkmmonqrttrtuuvyxxsunqunvqqvtwrGGFIDECFA@BFEDGBHJLHFCGKLIEFJOLIPIL[QJEHHKMIHJJKKIHIFKKKLGHKKLMMLJKMNT[\TPTLPONOOVQONQNOQJJOPQdqiTYW\[\VY[]X]\\cfaaebcf__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCDGEEAEC@DHDFGCIKLHFDGKLIEGIPKLOKLWLIEEHIJHIKIMJHFGGIHHIEFLIJLOMJP\W^P\[`^MXYS\\b^MXZMXaRKYaZR_d\aX[ddVVX\YZX\VY\]b^daa_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtrxrxsqrurtOBCDLMBDDBEIEHGFKJKHEFIJKFEHHPKMMJMRIGEAHFJIKLJMJHFDIFDFGEFKHCJNLLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_c[`^[TXWY^]cbcacehekrpoppnow
{
uqprrsvyyzyyxxxvryvxrqxvuvaSJJMIECBCGHFHGHKJJIDFKKKEFIJNKNKHLNGHE>GGLIKLKKKIGDHDCDEAFJEAKLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQXUU\Y]c`__cdbhomnllllu
yu|
}wrrtxyyyy~}yuyvvrnzwvxYQKFCGEBEHIFGHHFFIGHGIKILDDKKNMLKHKJHIF?GGNKKKMKKKIFGCD@DAHIC@JKHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTQ[WZ`_]^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKJFFFHGGIGFFILJNFDKJMNJLIKJHIFBHHQMLKOMJKIGGED?ECIICCHGET]Y^X_Y_[]UXXO]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQZRZ]]]]^__dhgljnnp{{|~{
srw
|x\SKCAHFDGMRHCQJEGHHEFKIMPEFIJKNLLIKLIIHDHKQOMMPLLJKHICDAEDIGCCHFDWUE\T]SV_XOTUNZZMIJT`a[_X^^a]OYa\``_bcb]abW`_TPOOOWQ\[[\\^_bffeleoow|{{}
zo
~INFDFFHDIRbPCV^IGGHDFMKPPEIIJKNLKKLKIJGEJNQQNOOMNLMHKADACDGECCFGBMHBKKOONLFMFGIJHGLLMOPILOPOSOLPSRUZYWYXXdWOSTPPNMNTRZXXZ]\`adecgcklpsryy{z
~{}{
}KIEEHFGDKM]LGGXLGHJHGMLQQHLKKKNMUNOJJKGGKPSSNPONNNNHKF`ED_LEgdFN\I^[rmOMUmYLDP`UkWgJ]WU^DLQULLSVQRTXWTXUT\UPfZhhdXRjRVUT[\[``abab`fhfnkhrz|}~}|zr{z{
~z{LIFGFHEEKOSIJF`THIOJIOMRQKMLLORUROOILMGHMQ[YOPPNOOOIJQQI|YYrtYQmHqnoaVPqqsPCksmqspSo_ZnX]V\XUkhU]VcZ`Y[_VVXjtuu^_v^Wa[[f[_`a`a]`agmpl`pwtx}vxzlv~tx}|~|z~wwNJEHMNBDLLGIKERVLKNIKRXWQMOOLQTNOQOKKNGMPS[ZSQROPPPJHZx]TxehZSURvgtlpbnfjQrOMwmjrpsrqrooo]ezuxqqzq~s}ku}bRh|essorr{|o~xnr_``baZ`_gknkblfgmw~~{xwtvzir~ns|~wx{~x|u|||ssNKG`]GAEMMHJJGJPOMMJNV^YULQSNXZMSSRNLOHQRTYWVPTPPPQKHgxlcxrm[KNVypumubovPeeJfvqmwojfxwiWrQhzmijzz~lxzohoYvvjvup_rf}ilx|o^__ba[]bdgijdgbcdllppstsssyqrxblugqy{sruy~suzn|}yxrnNKSuNCBFPOHJKIKPOOOMPZ`ZXKTWPa^RVQYRLOISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^\_ddighee^abiiijknokqomjpacfcowxompsy~nqpk{ztromLL[VHGEGRPILMJKPQPPPPW\XUMUYUeXRRY^SLNITTWWYWOSNNNQIRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_Zpz{^`zscroxqhd}ir|^ULl`vukiu{zm~xk|p\^^b[^addgeeebZccikkrsrvglihdgaakagsrlglmr|kmhk{tmmkmOHKKHJHHQPLNOLKRRROSRWRVTPWZVVTTTa_PNMKTSTQVVNNLMOPKHQNPULKLSTTSTPVUQQNQQXYRNPUTXXX[[URSW[WXXZOSUWXXR^YW^VTPYRWWWWX^Zgr^[[Y\]_cZ_ccdfdccbZcbgfemnmueegcaf_]g`dlhfgkhpzhggjujhgilQIKLLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYWOOLMVTQNUSNOMLQPLJRQKQMKLPSUSQRSSIHLNOQRQPQTVRXW\WSRPRTUVSZQNSRXVTYVUZVTRUSTUWXV\Y^`]\ZZ\\_c[]bcdfdddaY`acabhhimbad^_c]Zd\bma^fefmsdigjkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSPPJNWSPNUPNQNLSPMOUSNRNMOQUQUQRTUNKMOQTTRRQVWUYZ[YSURTWVVY[TPTUXUUZUWZVSRWVUW[XZ_\UX^\^][]``][bbcgfedbX_ab^`gdfea^_]]^ZZ_Z_g`^]]chkagfhfd`bcbOLMLQQLOTOOSQOQ[YWWX[YXXV]jdVXYZWVSSOJNVTPOUPPPNMRRPRXTQQOMPTVOXRTUUONMQSVUTTRTWVZ]\ZVVQQVXV[[WQTVVVVYTXXVSRYWVZ^Y]_^U^\^`\[___^ZbbdhgddbXa`b^^fcd`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQOU\ZZW[[\YZ[dqmhd_[XVUWQLMVSMNROQROLQSRUZUSPPMQXWRWSSSXMOOQTXVUUSUXX[^][[VQNUVU[\WRSWVWXVTY[UTRZXW\^Z^_`Ua\aa]`b_\`]cacghdf`Yc`a__ed_`b[Z\[\YZYXW\Z\[`^_[^^a`^b\Y`[QNONVQPTQOTTSPW\\\X^\^W\^jqwyc\[UUWPMOVSNQQORTQLRTTY[WUOROSXWTSURRZOPRRV[VWWTVZX\][[]VSMTUU[\VRUVVXYSUZ\USS]XZ]^\```Va[cb]ad^\bac_cfidf^[d`a``ce_b^YZ^[\[YXYVWZZZa\][]\\Z]`W[[ZPOOOYPUTRQWRTP[^^][`\`U\]hjr}slg\TWWQORZSRQTRTUTKRWV[YZSOSQVVWTOWRSZRTTTX]WXYSX\X^]YZ]TUNUVW^[XRUUYYYUWZ\VSW^Z]]`]bb]Y_[ea_dd^^cca^efidf^]da`aabd`b^XZ_[\[XXXWW[Y[`\[[\[XZ[^V^Y]QOORZPZTUVVTTT^^`^^b\`U]^bkytl}kZUYTPPS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[ZUZ^X_^Y\YQWRYYY_[ZTUVZYZWXZ]WU[^]^`a_dc\^]]eaafd^^dc`\gdhedb_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SNPVYQ]UVYWWUX__aa`c]_T]_beeuzhWYYSUSV\XWWVVW]XOU]Z^]\TRXSWWUSTXRSVTXWX]^X][V]_X__X\VQXTYZZaZ\VWX[Z[YYZ[YW^_`_cbadd\b\`fadfd^_dbb[fchecf`f__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNSYVS\TVWYVV\`abc`c^_V[`da_zuohY[YUWTW[ZZ\YXY`WPU^\``\TTXPUWVTVWRSUWZZ[_^Z_\V__Z]^Y]URYWYY]bZ^WX[\[\[[Z\ZZ__``dbcddbdYafcffe^ab`c^bcidcg_g^aacaa`^_XT[ZZ[[X[XX\[Z[XWYXW\[[`]V]]SOVYVVZUXUXWX]_badad`^YYadb`lfh^[\ZVWXY\\]_[Y[bVTX^]ac\RVYPWWWWWVSUTX\\^``]`\Wa^[^[Z^XUXW[[_`\_XY\\]^_\[]Y[`a^`ecdeefbXcedhgd^c``ec\eidei_f]cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWYX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cYZX]`cd_RXYPWWXYYWVWV\]^`a`_b^Ya]]^Y\^YXUW[\`^]_ZZ^]^^a]\[Z\`b_becefefbZdffigb_c^afdZhhbfice^bbca``_]]ZX[YYXXZXWZ[ZYWXUU[]]]``bbxKXW[YV\[\]ZW\]_`bdaba]`Xbcbacab][\[XW[\_]`_][`d]\X[becaR\ZOYXZ[[ZWZY`]`bb`ac_\b]_][^]YYTX]]_`_`\[^^`bc]\X\^`bbcedfdefd\efgifcab[cg`\ihbhied`baca_`_\]\Y\YXWXYXW\ZZWWXOXZ]acffrkJYW\ZZ_\[^\X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\^^^YXU[_^]ab`^[`abfc_]T]`acddfegeffe^efhhgdd`Zeg^aghchhfc`bacb___\][Z[YXXXVZV\[ZVVVMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{zzzzzzz{||||||{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{zzzzzzzz|}}}}|||{||{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½ÌÓÒÒÒÓØZ%+++*%c~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊÝæääååëT]}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyyy{xpoooppprrrrrrrwzyyzzz~||||||}
xssssssy}||}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwtvwz{x{xwvwzxzzy~yxxyxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{yyyyyyy|}}}}}}|{{{||||||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwvy}|}z{~{wwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwvz}}|}|~|wxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwv{}|y{}~|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzyz}{|}|~{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyx{xz{y|xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||
{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxyyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oxyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{{|||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|}}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqqqrstttttttsstsssttttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttssrqqqponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssrqqpponnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnnnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrsssrrqqppppoooooooopopooooppqooopppppopoppqrqqqrrqrqqqqqqqqpppppqoonnnmmnnnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqsqrrqqo|oppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqqqpprqpsnpppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqq}¡pro|oppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqrqt¡vqw}oqqqqpppppqqqpqpppqpppppppppppppppqqqpqqpppqppqqqqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrq¨o£~pqqrqqqqqqqqqqqpqqqqqqrssrrssuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssssrstr©¤y |rsssrssttuuuuutuwxwwwwwxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~}|vvwwvuxzxxxxxwxyy´©¤¨¨}{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{|{{¯¦¡µ«¬£~{zzxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}}¥¢² §}}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~ ° ¢~~~~~~
~~}~~~}}}~~~~~~²¡
|~~~~~~~
|||{|}||~~~~~~~~~~~«¤¤ ~~|}||}}~²¨¢ ¦¨¨
}||~~
±¦ ¡¤£
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{
~~}~
¡}~
}}} ª¨
~}~~
¥¤
~}~
~
~~
~{z
~}}}}~~|{|
~}}~~~~~~}~}}
}|}~~~}|}~|z
}}}~~}|}}{zy ~
~~~~~}~}~~}}}}~}|z{z~~}~}}~
|}}~}}~}~}~}}~~}}}|{{{zzz{~~~~~~~~~~}|~~~~~
~|~~}~~~}~~~}}}}{{|zzzzy~~|~~~~}|~~~~~~~~~~~}}}}
~}}}~~~~}}}}}|||{zzzzy~~~~~~~~}~}}{|
~~
~}}}~~}}}}}}}}}|zzyyy{~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyy|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxxyyz~}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yyz|}~~
~}|||}}||}}}}}}}}}}||{z|yzzz{}~}{||}
}
~~
~}}||}}|||}||}|}}}|||{z{|zyz{|yy}~}{|~}}|~||}
~{z|
~~}~}||||||||||||||}|||~{z{zxz{{|}{~~~~~~}|~~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||}|yz{{xxy{{z|}}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{||||||||||}}|{}|||{|||zzy{|{}
~~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}
~~~~}}||}~}|}}}}}}|}|}|{}||z{z|}}
}~}~~~}||~~}}}}|{}|~~~~~}|~}~~~
}|||}~{{}w~vx~}|}}}~~z~~|~~~~~~~~~~~}~~}|~}~}}}{|||{{z}~~|||}|}~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~}~~~~|}~}}}{{}}|z||}}}}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}{~~~~~~~}||}}|}}}}{|~~~~~||}||}|~~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}|}|}}}}}~|}|}|}}~}~}}}}|{{{|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}}}}||}}}}|}}}~}}~~|{{{||}|{z{{yzyxy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~|}}|}}~~}~|}|{|}~||{|}zzyyyyz{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~~}}||~~~}}}}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv}
~~}~~}~~~}~~|}}|~~~~}|}}{}}}||||}{{{|{||}}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{}~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~}~~}~~
~~~~}{z{z|{z
~~}~~~~}~}}z{|
{{sy{|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}~{{zx|vyz|qtxwvxury
|}}~}~~}|~~~~}}z{{||}~}}}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~~}}}~~~~}||~~~~{{|||}~}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vwvst
}~}}}~~}}}~|~~~
~~~
}}}|{||yz{z~y{yx~{||~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~}~~}~}~~~~
~~||||zyvyyzyvyv~|{{{~}|}~}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}~||~~~}~~~~}~~~~}~~}~~~|}||{|uxyxxxyw{|{{{
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~~~}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~||~~~~}}|~~~~}|~~|}~}~~~
~}|{{{|yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}}|}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~~}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxzxy{||}|||||||}}}||}|~}~~~}|z||{}}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{wwy||{}|{|||}|}}}}|}|~~~~|z|}{}}{yz{zyxstunsqpxruz
~}~~}~~~}~}{~~{|}{z||{zxxy|||}{||}|}||}}~}}}~~}{|||||{zy{{yysrunvrpxqvv
~~~}~}~}~~{}|}||}xxuxxy{||}{{|||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz{||||{||}}~~~}~|~}}~|w{zz{yysqunwpuzrvy
~~}}}|}z}{yvzxy{{|}}{|}}}}~|~~~}yy{zzzysrtowqwysw{
~~~}|z||{w|yyy{z}~}|}||}~~}~{{{z{ztqxqytvxtv{
~
~||}|x|yzyz|}|{||}}}||{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||}z||}}|z{~~~}}||}{vrvxxvtvu}
}
{||}zz|}}||z|~}|}}~~~~~|}~~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~~}~~~}~}~~~~~|}
~
~}}||||~}}{|}}}}}~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uz
}z}~{
}~~~}{}~~}|||}}}}|}}~}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r~}}~~|}}}||||}}||~}~}}}
}p{pyv~nypus|vyyspvxqvtturstvinrotvnulwmzsnym}rsvsvmnwlpylu}~|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpur~ozyymonzoolw}xpqzprtfu~n{ysoy}~{~}~~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~z~}}}~}}~~}~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwpy}}m~uo
zrr{|upozks|nv~~}}{}{|}}}}~~}~}~|}~~
}w
~~{|{~||}~}}~}~~~~~~~}}}~|{|~||
}{{|~{||}~~||~}~}~~}}|}~~~~~|}}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~}}||~~|}|||}|||~z{{|~
{{~~|||~}|||}~|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~~|||~}||}|}{|||||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|~{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{||
z{
}~~||}}~}{~}|}zzzy{}}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}}|}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~|}~~~~}}~}{}{zyzzyz|}yz{{{z|{{{{|}}}|~}||}~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzzz{{|z{{{|}~}}}}||}}|
~|~~
}~~~~~{||}}~}~~}}~{~{{zyzzyzz{yzzz{{|z||||~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{y{zyzzz{|y{}{{~}}}}
~}~~~~}}~~~~~~
~~||~}|~}{~|}}}~}||}}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌÌÌËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;>BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9><>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA=366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖËËËÌËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<;999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNG¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËËÌÌËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××רר×××ÚÛÚÚÚÚÚÚÚÛÜÛÛÛÙ××××××××××××Ö×ÚÛÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;@<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMMF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´»¹¹¹¹¹¹¸¸¸¸¸¹°½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃrliNSbLLVM<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKPFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤XRSSSSSSSSSSSOw¨¤¤£££££££££¥SSSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËwliJN_MRUM><<7;?C>6:7>?;=B@9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦\VWWWWWWWWWWWSz©¥¥¥¤¤¤¤¤¤¤¤¦WWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<;>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÏÑÑÒÒÒÒÒÒÑÒÑÑÑÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª¢fabbbbbbbbbbb^©©©©©©©©©©©«cabbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9::=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÍÎÎÎÎÎÎÎÎÎÎÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÏÎÎÎÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌËËËËÍÒÒÒÒÒÒÒÒÒÒÒÒÒÑÍÌÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8:;898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÒÓÏÏÎÐÓÐÎÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÖÖ××ÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oVJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÎÍÍÍйÇÓÀËÏÎÎÎÎÎÒ«ÏÏÒ¹¾ÔÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==<=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒ¶¥£ÔÀ°±¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÎŤ Ã}~¯°ÑÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>><<96?B?B:648:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÑ¿ ³§ºÔÒÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?B:74:::9;;8;=?=>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÓ´ª¹ ÒÓÀ ÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<=<964:98::97;?@<<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÔ«~£¬¯¡¹×¯¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>9<97659:6:<;7<?@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÔ¬§¡©Ø£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CGDAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÓ¶²²¥¦Å¢ÑÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHFE@<<>><==<756:96:;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÄ¢¯Ç¡ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==:::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸« ÇÕ¢«¤Ï¦«¤Å´¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKK@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓÈ´Ö̧׹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUij[L_MJLJULFB<<?FEGKI=667:979:;:<=9>99:8;=>>A>=9<<:=>>;=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÔÈÁÕÑÔʽÕÒÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?ADLLA>775:8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÑÓÔÒÒÒÓÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ==786977899;;=?@<<89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<AA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD88867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCDECALH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HQA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8:87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
¼ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9768579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9886553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿½¾¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;;>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>=<=>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPF>8;727967453588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³µµ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶······¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬«««¯°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899::;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©©¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¥¥¥¥¦¨¨¨¨¨¥§¨¨§¨¨§¨¨©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::9:9<=::A<6=8378837;@??@@:BEC@BDCA?;;@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¥§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?A?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢£££¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@?BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747578;=8::99;=;;89>6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¦¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364689:89788:<;<9;;::67899>?@><=@>@:9@A?=A?>AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¤¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¤¦§¦¥¥¥¦¥¥£ ¡¡ ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ xlcdbdQGA=C;KHD:;;<>9::9:737959888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢£¢£¤¤¦¦¥¤¤£¢¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8687>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££¤¤¤¤¢¡¡¡µ¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡ ¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¢¤¡¢¢¢¡ «¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86:746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡ ¥³¬ ®jv ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¦« ¨D ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢ b¦¡£QH ¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¦f]£ ®uIL¡ ¡¡¡ ¡¢¡ }xjabb\Q<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¤Rx¢ ¤_VN¡£¥¢¡¢¢¡¡ ¢¡ ¡
wqgjd\\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢ [_£dZM¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[[LF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡]]v¢dYM¢ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡`a`tcUO¢¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;879:;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y i^[ej_QS¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B@AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ shaTv\WPW
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥£¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v} £¤nMPc
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{ ~j¥}_r
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974869388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~¢{mQuZq}|~}|¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
}wWNKrM_oqw
¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~£T//=xwvAD]km¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢¦gB[H;xykgE18Zls ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©©¯Jr¢yA|xdbQT^I`n¡¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¦©§¨£x`ÁÖ¥C|uOnvSd£¨§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤§§¤¥£¢b½À®y¡¤eL_xmQt¢¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^edlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢¡¢§¡¦®¦¦jº©Ñ¢³¨XLSe ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡¨ª±²¯«¢¢
w~}rÎÆ¯¦¯kUª°c[¥¥¢¡ ¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\U\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¡ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯··´µ¶³®¬n̼¥tTozsp}¦ª§¤ £¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²·»»»¹¹Á¸´µydXµ»¦§wkqoxy{~
£¥¦«¥¤¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvkqhiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ·ÁÆÌÏÎÌɾ³¤rfRD
}xqngflilrrqrru}©ÄÄ»¢§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSaiaftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃÅÇÛããÚ˼®£tYZQDiwjntnkeeYW]X\cjjifai¶ÁÀ¹©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwom[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ¾ÍÒÕʹ¦
r^QTKD[e^cjea`hYTXSWYZ]Y[u·¼¬´²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklgnvrrvrg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÂÁÇËȶtcUPOTH>^l__eb`]daSUWVUUXs±ª¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxoyjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄù¸ÃaIDGKD=[eabic`[c_WROPPW´º¬®¥¤£¨¤ ¥©´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{wnkihvZgsxszgg^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÄÄÂÄÁOFME;MZ]ele_[`YYSNU£«¹µ²¬©£¡©¬§¬´´¿Ã¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyvvefjjh^kpnyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇÂÆjXG??F]baj`ZXWTVw·¿»¼º¼¬¦©»º¹·¿³µ¸²Áƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««¬±££ £¢ £ }qtqocahvhjjunyl^d[V`YLHD6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÎÅÆÆ½©rPK0XSVeaSNPq©ÈÈÂÄÇÀ¼¾´°°°Â¾¾ÁÆÀ¾·¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®¯µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r}xpg`kjwmifvotc]cUWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÂÃÂÁ¼?OwVLo¥ËÔŶ¿¿À¿º»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyspfegdlebknoo_Y]WVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ½¼Å§wko«ÈÈÇÑÁ¯½½¸¹»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfaebacddjcgd[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÀº¿À¼»Å½ºÀÄ¿½¾¯sd}ÑÅ¿¿É¿°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±··¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdacchkggjfj^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÕ¸¿»ÃµºÇ¶µ¸º¼¸¹¶ª¤~É¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeegpjelhYYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÄw¨Ì½Ç·¹·¶´·¹³µ±½ÉÄI{ʾ¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~}knqgqktfcn`\UHKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄÖ®t»ÈÏÂÀ¸®´´»½·¹±½ÃÊCuÍÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljouoydhc\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÆÉÒqr«ÑÑÌÊĵº¿ÄȾ¾´¿ÀÁxRnËÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tpmmtlmo`c_bbNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»ÅÐú¾¼Ä¾·¼À¿ÉÏÇÈÊÊÂrs£ÌÌËÍÊÆÂÃËÎÁ¼¸½º±ocb»ÈÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qd\_`_TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»«Ûþ¶¾À¾¾º¦©²¶Ã¿¥yuxÄÇËÈÁÃÀÀÉÊÁ¿»¹± |rlÈÅÄ¿ÀÁ¿ËÇÃÀÈÀºÂ»¹³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp^\_]ZRFEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Ä¸mν¶¹À¼¬}nhnmrsw|½¿ÆÀ¹À¼¾ÅĽ½¸±°}ÊÂü½¿¿Ãÿ¿Ç¼¼À´³®´´¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmu{qoj\`aZTQAFIGK@ECI<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹Àͳv³½¶µÂ¥iZ^`MR[Znsw¸¸Âº³»·»½¿º»»®¤~ÀÄþ¼¿»»¸¶Áµ¿º´®¬¯½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶¼´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvxnra_g][UJ=??GG=GCC9:5;99><<9:<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɨx ¯µjegVY`IIMPSlw¥°·¾¹²µ²»¹¼¶¹¾´¥¡q®ÉÄÀ½¿¹³®²¼º®»´³¥ª¦¬º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrm`db\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Åª|u `TCXUGajVOEJ` ¬¯¶ºµ´²¬¼¹¸µ¸Á½°¡¥r¥Ë¿¹ºµ®¥¬³±¦²°¨ ¤¶´Á¶µ³¥§ª¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|pvsod^hY]^SONB?JCAKJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿µxoNJ?dYBNwjNA]°µ³µ²´¯¬»º¸¶¹¿Åuªc©¿¸µ²±¤§¦¢®¦¨¸«ªª¤¨¤«®¯§°«¯±±±®®¯¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvtmvjl]\kU^\PNHDGMBGNG8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶{XFANYJJXwcAS£¹³´²°±°¹¸¶»·º¼¡²«£r¬°©««£¨ ¥
§£¢£¡¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wryiutoeUbdX]ROMI@IRDNC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼©iN@RxqPIIKgYER®»±¬³¯®¬¶¶²´µ®¨¦¦¨ ¨©¡§U¢§¡¢¡¥¥££ ¥ ¤¬¥¦¨¥¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ª©¤©«¦©¬«¦¡x|vzcxmn]QiUPOGPMMCPRA?;>4::5;:=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢ª¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Â«¥¾iERQWIJ`JT`cb®µª²´®ª«¯°²³¥ ¡ £¤¨£UV § £¥¨ ¡¡£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nl{diVSdNJHGOSNKNH<E@=2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶¶º¹º··»®¨ ¡© ªÆ¿Ë¡PArwOnKKcfus`Z^p±¯®³µª¦¬¬£¢¢¤¤:d¢©¡ ¦§«¢ §£¦¨£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¦«ª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ |~wy|eyyabSVaIIKLSUJSQM9?A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÇÇWSIe£[e~or]Qkc[d_]k´°°¸¬¦¡¢¢£=d{y££§¦«§®®ª¦¢±££¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvsime\S[ZMRKOOVMTMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢«¤zUirvupcvvXWc`cgYXWf®¬¯§¢ ¡£ jcfpzxu~¦©«¥µ²´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³µ¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xvjwu^m[RaIRVHFVWKCMH=KI8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©¨®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¡ ¤np`cXL[SZMLPXRHMMH¬ª©¥ ¶«g}uy{´®³Á©·¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ·»¶«®±¹·¼¯³°µÁ¼·¾³³µ¢¬¢©©²©«¨§¨ª§ § ¨¨¥¥ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhn\X\CWNJGMHCFN=>L>4<:6:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©©ª ±¢·¤°¦£bW^e`WMQG>>?CC?>BQx©©ª¦ ¢£
¼Õ¹
zqpl©»Ä¹Ã¾¿Â¿¶º»Àù½»¬®§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¸Â¾¸´»ÆÄ½Ã¼¸´ª³ª³´¯³®ª¯£¬¨·²£°¦¡£°±®°¤¥¯£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trklurqhW\QFUHDJPI?EB4FH96<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ }`^e`QGD<C>E<?96N~ª³§¤£¢ ¥¬¦xm³ÛÔ¼«rh]]ζsÇÅÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÆÌÌÌÒǾ¿ÀþÇǸÄÊÉÄÁÇ¿º´º»µ»·°¶²«»²¯¼·À»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxkeZ\FLMEDTMEBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<@?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡~sjaWNE>IY|obB=\®¬ vrpmp»ÃÇÄÀ·r`W
¹ÐÌÌÌÇÊÅÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÁÆÇÆÊÈÏÀÉÑÍÇÆÈÆÂ½ÄÁ¿¿¿µ¾³¿ÀÃÃÇÅÈį¿¹²¸½ÄÂÁ»¼¼µ®§§®¨ ¢©¥ ¨«©£¤¤ £
yusebgrog^ZZDOMCFQIDCA55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:;>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £kf]TID@?K¥ ²£yqrol{g¶µ¡}zzkheq_ºÔÑÑÍÍÎÐÄÍÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÒ×Ò×ÒÕÖÓÔÈÌÇÌÍÊÓÍÎÓÍÆÉÊÊÂÇÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÇÅÌÌÉÉÀÃÀ®°³¨¢ª£¦©¬¤¥¦
{ruvgcgvjeVXRDNG@IQC>B=:22A<E<78<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡cSLJDC?CR®Ñ½²¯¦ ¤¡}yqlebhrpr{
upmqqpyQY|¤£~ojcfjf]ØÑÒÓÔÒÏÑÃÐÓÖØÕÕÒËÉÎÐËÆÍÒÊÒÕ×ÙÖØÓÖØÍÒÊÏÑÌÏÑÍÓÐÀÉÈËÄÌÍÌÏÏÆÇȶÀËÀÒÍÌÐÇÊÉÀÄÃÈÏÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpcaerc]R\JKGAFIJ?;A8>5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¥¥ ¢¢[I@ADAFQv²¯¦ wida____^__]alusppnlqoucZw
ia_cicyÌÔÍÏÕÔÔÑÑÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ××ØÒØÒ×ÙÕÖÌÏÏÉÍÒÌÎÑÀÇÄÉÇÏÎÑÑÒÈÌÍÀËÍÆÔÏÌÏÉÅËÇÇÉÌËÔÔÑÕÏÒÌÓ¹ű¥¨µ®¨¨«¥²¨°³¬¬
|zqstmacim_VQ`JJCECSN?<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®§ª¨¡£¬gC8=>DXª¨}qecb__a_^a`^a`_`emppmknqrv|`]gYY^muÇÔÎËÒÍÕÔÑÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÓÊÐÔÕÖÎÓÑØØØ×ËÈÎÄÊÏÍÊÌÀÉÁÉÊÎÏÐÌÐÎÎÌÏÐÈÌÐÑËÎËÃÊÈÊÍËÌÒÓÎÔÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¿»±
zvopokadnpaX\[IFFDMYE;@=33<<87855;>@=9<<8<>9<@;@:=8?98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤²|HFB;V¡k^^^adb``aa```^__^\bmqnnqqrqww[gbUYj³ÍÎÄÍÊÒÒÎÆÎÌÍÔËÎÒÍË×ÖÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÖÊÀÊÂÆÍÃÈÊÃÍÄÆÉËËÏËÎÍÑÎÔÌÇÉÐÍÉÇËÆÇÂÆÊÌÎÑÑÇÐÏÎÎÌÐÅÇÁ¸¹½Ã½ù²²¾°»Ãĵª¥¡yqrkmh``qhYXhVMGLIQQB;D?;68:8::57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨ xlopw|ebbb`]^acb`__`aa`_][]gqqpqqmimxhUx|[Ti®ÅÆ¿ÁÄÎÎÇÅÇÍÊÑÇÊÍÍÆÑÒÏÍÌÔÊÇÊÎÏÇÇÏÒËÐÏźĿÆÊ½ÃÇÉÎÅÃÈÀÇÎÈÄÍËÍÐÉÅÅÐÉÆÂÆÉÅ¿ÁÈÍÌÌÏÃÊÌÉÇÌÐÅÅÈ»ÇÃÉÉÂÏÁ½¼¿°ÁÉǹ½ª±²§¥¢£xoudk`^fqa[W`GIHGIMUG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»¤¶~g
¢ª
}~s_[^]^`^`cdc_]\^_``_[Z\akrpmmhgikq_eojX\w¢·ºº¸»ÈÅÁÃÀÃÈÉÈÈÉÇÁÅËÅÇÊÍÉÄÁÊÉÁÁËÏÄËÈ¿¹Á¼ÆÈ¾ÀÆÏËÄÀûÊÇÈ»ÉÆÅÊÁ¾ÂËÆÅľƾ½ÁÄÆÌÆÅ¼¿ÊÃÅÇÒÅÁÉÀÊÊÆÈÆÐĄ̮̃ÄËÇÃÊ·¿¼º³©¬¤¥¬£¡¦£ |wsufj[anmZ\XRDLGCGDLDFS?54335@=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¾¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²°¶m^z|z
uxurp_Z[]``bcdded`[\^]^]_[YZ\bnqnifgkinv\ZZ\`s~®¯±¯®À¹º»¹¸ÀÁÁý½¹¼¿¹ÄÉÅÆÂ½ÆÀ·»ÃÈ¿ÁÉ»¶»»Åÿ¼ÂÎÃÆ¾¾µÁ¾Ä»½Ç¼Ãºµ½ÆÄÂ÷À¶¶¿¿¼ÍĽ¶ºÈ»¿¾ÌÄÂÆÃÆÉÇÉÆÐÆÂÌȲÇÉÃÎÌÀÅÿ¼²·°²§¨¨¹°¥°ª¬zwxkeh`hodV^YJFJFHKAEBFJA9:658853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µ«·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÕ×ÍÊÏÅÉÅÇÁºÅ½¬®§`cvx}{ttc\\]^``bcbbdeb]\[\^\^]Z[\]grpkdcijjupHO\Yhsoid¥¦ª¨£µ±µ³²²³»µ¼°¶¯³¯²»Â»Áļ¿º´²º¾À¸È¸´¼¶À½¸½ÇÁûµ¯³µ»¿´Å¸»µ¬¹½¾À½±»¶°·º³Æ½·¯¼¿µ·µÅ½¾ÃÆÀÄÆÆÇÌÅ¿ÆÆ»ÇË¿ÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJGBDAEF?=:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÅËÍÈÅÈÍÌÐËÍÈÉÈÊÉÊÄÐÍÒÏÍÅÇÁÅÁ¿º¸É·«°[gozx~
vw|sh]]]]_`_`da^cec_^\[^\]^Z[[\_kolfcfhgjy_CPL\\VRs¡¦¢§©¯«©«¨³µ¯±§¦¬³»º¶Ã¹º¹°ª´¹»³Â¹¯À±½¼»µ»Ç¹Ã·ª¨°²À¶¸½°±¨²³µ»¼«®¶§®¶®¼²°ª¸°®»®»¸»ÀÁ¾ºÃ¿ÆÃÅÀ¼ÆÁÇʸÅÇÅ¿ÇÃÃ¹ÄÆÂ»ÆÉÌ˳¹Â½»³tvwki`bliYWW[ALLMJEAC?FA:::996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÏÇÍÁÂÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª±[i~{x}
y{wn^]\\]_`__dcbdcb`_]Z[ZZ]ZZZZ]cmmfdddeglxQ=ELX_Z¥¡§«¢¦¡ª©«ª¯¢¥ªµ¶±½¸¯·¯¨¸´³¼·³¼°¸¹µ²¼Á²À®¥©£«±³³¨½ª«¨«¬®µ´¦©®¡¥°©³¦§¨®¦¨·¬±³·º»»²¼¾¾¾Ä¿µÁÀÇÈ·¾¿Å·ÅÃÀ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji\aodWVXPHZSSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃǹ¹ËÂ˾»É¶½Ã¾ºÊ·Áõ¶¼¶±¯µ¼©«dmz}~xt~|swe_]\\^_`^_ccab`a_]]\ZXY[[XWY\_ejdbcaddhnsFDdp]®¦¡¡¤¥¦¥¬¤¥¬²°¶¶§°«§ª´«³¹°µµ®¶¹³°ºº±¶¤ ¤ ¦±¨¬©¹ª¥§§¨§³ §§¥¦¬§¤¡¡±¬²µ³´°µ¼¶»ÁÀ²»¾ÃÁ±¹¹Â³À½Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ yqlbf`ko`UY_HNhOTHFKF<=@=:;<826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;ȵ¶½¸ºÁº½¶ ¦º¶«³³»³ÄÏÉËŸ·ÇÀÌ¿¸Ê·»Å¸³Å¸³¿À¬¶¼²¬¦¯´¡£ir
|xusomjiipi_`]\\\^__acb````^\[\\XYXXXVXZ]^cb`cccbeelkY{y_T\D^b¤¤¢¤¢¦¢ª®¬±´£¨©©«¬¤´¸¬¶¯³µ¯³µ¯°ª¤¢²¥¦ª¸¢¦¦¨« ¥£°©¬¨ª«¬°³¹¯¸¹º°¶¼»º«³²¹³½´·²±¶µ¿µ½À½Ã»»½{sl_e^ddXTW^IW]KPGJJGA<??A;?<05636:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»¸ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹È¸¸¿·²Â´±»»¬ºº±¢©«§m~
xrmomkb^bff]]^]]]\]_`abccba_\[[ZZYXWWWWWXWZ]abccbbcdeofYXH2!"\X_¥£¥¡¤ ®± ¤¢«§¡µ°±±¬©¯³¨º³§¶¡¢£¡£¢ª¶ª¢£¦¦¦£ ¡¬¨£¤¦«³³ªµ°²«²¹´¯ª¯²²³·³®©®²¸°º¶º½¿·³±zvf_f_[YVSZUK[QLJEHKIC=?BB@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿²¥£¥±Ãµ¶½´¸ÂÌÈÆÀŶÁÀÇηÀý³¹¹²¿¶±¹»²µ¯£ª¡xxoqtqhediec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWUW`bcaab``dfqQ:3!+hx¨¢§ª¦®°ª¢£·©¡ ®¨µª¦§®±¤¸°¤· £ª¦¡¹°£¡¤¢ ¡©ª¤¢£ªª±¨´¬ª§³°¥«®³±¯°¯¯§¨¨²®²´°¼´º¸®£zwe_aWYXSRTKM^LPLGHMLE=@>=B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´ºÂ±¾·½§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°°±ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWVUZbb``a__`bii=3-2N¥¤¢¥¦¥ª®¥¡£¶§¡¡¢©³¢¥¨¥°¦±®«µ¡©¡¢±±££ §§¢¢¤¥¥«¤¥°§¥£«¬¦©®¯¯«¨ªª³¦¦«¯´±®¼¶±¯¯{xseb\[]XNLQHRaMVPOJNOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±¶½°»±·¬¥¦¬¸»¼Áź²¹µÄÉÉÀÂÆÅǶÆÄ³Á¿Å«··½¶½º»µ²¬¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVVRTRT__]^_\]]`akX4?Mt£ «¤££¢£¡©ª£¤±©¡ ¥ª¨¢¬ª©®¢¢¢¢¬©°¢¡£¥¡¢ ¢¤¥£«¥¢¤ª¤«¥®²©¦¥¦¦µ¦ª¨³µ´¹º¯ª¬sqpa[WVVRGQOHZ\ORJTKSLEGJC8;;=<9667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«±¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÉÌȵɼ±¾Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTUVUTUURSNPY][[\\\]\_ch@Rq{
¥¦©¦ª¦¨¥¢¤£¤®© ®ª³¥¦££¡©©¡ ¡ ££¡£¡¢¨£¢¨« «°¤®¸¥£¤£¬ª¨«¯´·²½µ³«®
uti[YYSURFXLQ[XMUOPLQRIOIB=??A?=75799<<977:79:;<=>;7;;:=68:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³·®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ÌÆÅ¸ÀÎÏdzĻ·»Âȱ¸¿·¼¾»³¶¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNOQXYYY\[Z[]^eqyvs
¨§¤¬ª§¯£¦«£¨¦®§ª¥ ¨ª¥ ¡¤¡¢¥¥§©¨ °°¦±½§£¬´ª®§¯´°¹µÀ±®°«~rtcVTUNRJGVPRRLLXNKLOSGNKACFEC>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ·¸¼½Àñ°±·®´´»³´££vkglnqnqjokdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTQMNMRWXYXXWZ[[`jtlri{|¥¨¥¤ª¦¤¢
¤¢¢¥§¡ ¢¢¦¤§©§¡ ´²¨³¸¡£¶¬ª®¤²²¦µ»´«¬±¢zsn^NQQMODNNNPKFNNJJNNQHMJAHLIHC>958889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶§¤¶°¤§¤ª¥ ©¦¤³ª¢²Äµµ²³ÆÅ·ºÃÊÌÆ³º½´¸À¯®©°¦®»¯ |n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKKSWWVWWWVZ]aidhcv|v~w~
¢ ¢¤ s~{ £
~~tz££ ¡¤¤¢´¯¬°¦¸¦¥°¡±®°»ª©¯©xtdVMRPPMCSNLPMBPQHINSNIJJEKMGKK=749888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-02764789::66:87A7x·¡£´¨¦¥¨£¥¥¦¦¦²§¦´Á¸¯´°Éĸ¹ÀÎÆ¾³¬ºÁ¬Ä¨¢¦¦·£ ~xfWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJGNSSSTTSUYZ]h_c`qxqkISm}_;Vo|ry{}xqp}¡ §®©©©³¢¥¬§³£©£tn`[NSRWLDTJPMLFNOIELQMKPJINPGJJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· ¢¡¦¦ª ¦©§£ª°¨§´Â¹°µ°Ç¸³½Ï¿¹¯®µÂ§ªÄª¢±£~sv]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKHFHNQQLORTUXY`e^[muiJ=;|y
x`JQnx~m~wuvxpQ|~yvgw~
¤¢¨©¥¤°ª¡¤¤¦ª¡©¡¦§wnf^\HQQSMIUMSILKOIHFJNLMUKQRPGJD=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.115221/,')+*,4833989:99::::?9w¶¢§¡®¡§¨¥§¨¯¬ªµ¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼§©~xqoXMKMMNLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDCINOhYNQSSUZktdhq`_UOpz}yz
txrnuptz~«
z{hv{prmxx{{wsrxhu
||© ¡ ©¥§¤ ¤sib]]JWPRHKXROJMLRJJJLPHLQMRUMFIB<78;99>=:;<98@?::><7==79937785675251472/2.,./200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¢wx|vpojYKHIHGEHHPTTTWWSUUUUVWXWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LNQQSV^qzpk\nwcu}su|{p{vznk~|tz|tfu|lohs|mzq}qmvqhq~pD
wwz}{u}£¡¥xongc[XXUQJSUTOPNPVKNKOOKROIOPLFD=;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«¨©±¯±«¼¸«»¾¸³¬§°§¬¥©¥¡yvq|muqjmjXKFGEA@CDHLLMQQOQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zYJNOQTX]dmib£¾|pt_wtkxuxznkxsxijq}Ingw~mjdly
ksl|nr|imps
{~{wpttyyp|pjoooYVXTRRYORUTRXUMNHMKMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¤¬¯¢ª¨µ¯®¬´¿«¼Ã¿¦¢¤¡¡szuotlqmekkYNDFC@<>>AFFGKKKLORRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORVZQXZZ ]cmtazlj|wt
sksr{ijLy
f1vrk}}tfeu
filukp|hqq|n{t~}qqoumwyujyyxlkpheXR[XYY[NPUVYXNIHEJJHGB@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5m¤¨±§º¯«²°Â±»ÃÇ
zqtzpsqopdpg_TFIC><;9:?@ADCEGIKOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQUKAIQH`ª®lurhyin~xxqswrt5p¨ ¡¢
vp{|t®hgbjnrmpuioXupvm{}nrnp{svnbu
ux~}|srqm`\]^\ZYa_RN[ZXWLHJFIH?CABH?CD=;:7=;:;;9:99;:?<88=:8;66650121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®°®Á²»ÁÅ|nul|uxxmxnwdj^IPG=?7449;:;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMQRCHozwvqzis
y{}|t y}
aªzw~t{]dqtz|wmhjbyo
zoxu
zptzxkni]v}|
}q}vw{|xqtugh`[\^S\g^WQTX[UGJJDKG?F@DC>AA=;97<;;=<::99;;=>79>9985654244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À²»Äºzvk}xs }}p~zhwkRXL@E211376688:<>AEFFGJKMOQRSTUWVVVTSPMF@:2= #c[5311i?GoIFIKMOQKJT[WQId}vuwnywz}
v¥¬©H¯®©tm|~hghyn
qHlwryvhmk_v}
yzuv|xmow~uusm\^^\cdXge\UPPWYPDLKFOICFCCA@CA=978:::;;:888::?>6;>7585773344236656778;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¬ ¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJMNQSTUTTVUSQOFC?80,#[??84.]ps£UFIKLMOW`XmXZ\e|}| ¥»±§»Çç¡¥|qw
ihptrw{v|muuf ª¢zzyogkx~|ule^[[^j^bg`ZOLNXRQHPJDNGCJDCADDB<:87=<:<:88778:==8<=68756623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfwz¤¡¬¦ª®°¡xw|lpj]B@4--//..02234778;=?BDHINQRTRSSTRPOHDB<87/9C><<63.lMPHJLKJMV_a|eejq
¡©¤¢ª¨µ¡§ÁÂǯx¹|¡
¡
lpuwqm
q ¤´¨¢}kjj|uc_e`[hl^ll^WKHNRQNLLFIPCDNFBCEFC=:96=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENORTPPQSQNPIED>;<:DF?><752<?R5HHHLKMNR^lzq~y¢ ¦¦©§«¨©´«¾«¶ÇÈ·ÈÐϾ pi«©
¦£xz~¢{wª²|£¡¥µ¯§lss}~sja^b`bhd`hg\REJKPOIILFFMCHLFFCBGDA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m}aw}{ªªBD}x|
w^bP460-2/,.0/./..0015>AAMQRSQRSURNSLEE@<>=FG@A@8662<9;FHGIIMOQYlu £¯¹´ ª©ª¥¦²©®´°°¬º°²½²Ã«ºÉ˸ÿ·¥¢°³¬ª£¥¦ £¦¢ª¨¥
¤¡ «¡¤¨±£¦·º ¢¯¢¡£¡«®«²´¡¤©yz~ibi]fc_ed^gg_[OCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhbWinXzv
ÚÈsV|z
qna@E64<3/110-,+-0.-4?CAMUPRSUUVUN[PGGD<>>FHCEA7;<5C;=FKIFHQNPWª¥¬¼ÄÀ§°Ãµª±¾±¶¼´½³Àµ»º¢¸Å¨µÉǵ½¸´¨£´°±§¯«¥v¤¡¬²´ª®¨®¶»²º¬°µ¢±¬±µ»¶´®´¦§¡¦©¯¬±¸·¸¦µ¨¤x
x[ceWgcbdaag`[TJDDLUQHIJDIGEA@@KDBMG<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[YQbbWyuq}u
{¿»£¼´yzxn]W@EN<6:45AB764//6CHBQ[OQUWU\WP_UIKJA?>GKFED;>@7D7?BJJEFVSP^¡ª¡®°½°³¼ÉÆ´¹Ã¼²²¿µ¶À³¾¯¶t°³¥ºÄ¤¯Æ¹°³±³§¤µ¶ª± ¢¢¥°®¦«§¤¡´»¢¨²ºµ¼¿Ì¿Å޽³Á·º·¾¶º·¹¬«°¤¯©½°¼ºÁÁ«¹§©~~mXdbYlfkfX\cYVSIGFLQGCHIAHD>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALQVSYUZvjp~nzsxb¹¡£{z||}wzueP\dGEL;Qca[^SF?;HPEZcQRYXZgYT`_LSPEA?IJHEEA@D<E6B>HGJLSZT]¬´²¸µÅ»¶ºÇ˹ºÀ»¶´º¹¶½³¹±Å`t±¤±ª½©¥¨«ª£¢²µ «¨ ®¥§¦¥¤£§±´¨²³½¶Á¾ÓÉÉÓÆÃÅÌÂÊÃÀ¾½¾»¼·´¯¸·¶Ã¹Å½Âǯ¸©¡«¤§µtacc_Yc`jgSX`VRUIEENKA>GD=KA=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((+-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrrsÕÀµ }~x{{y~t}zkfpuY^\Pedb`ed][XW\MdmURmm_n_XgdTYUJDBKKIFHHHHBI:D?HKSTU\Z[¶¾¶»´Ã¼¸·Èɹµ¹µ·¸²¶´³®µµdu§p^¢¬ ¢¤ª¥¨¦ ¤¥ª°¸°½¹ÔÑÏ×ÐÊÌÒÌÏÎÊÆ¿¾ÂɽÁ¼ÁÀÄÄÅʾÇͲ£º°´®«·»|m_b^Z_cZdcQ[`SPKCAEFE<@F>AHB@C=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ[Yh_onlotu´¬¡¡
~|s{
{ts{ylmu{hreiligjji`fiilZms¤¼g[og]ZZTHKNPJKPKSQILAJFJO_^afiaµÅ¯·±¹»³°ÃÅ´¯¸°°»«²°¦ª·«µ§§M¦¥¡§¬¯¨°¨´´ÔÔÔÖÓÌÐÓÕÍÒÏÌÅÂÉоÉÉÊÉÑÇÌÍÂÏÑ·¯Ã¼Ã¹¤µ¹Á¢qe^__ZbYZgZQ]XOPBBHEBH;AC>AG??A7;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYReVsgqoyy¡ª¦}|p{r}qxulqx~qzmxsmipmcimpxiw|~Ë¿Áß§mcxnc[b`JPRUNY^O]\NPNTPTT\nmvq·«²¥¯´©«»¿°ª´¦¤¸¦«® «´£°¦«¬¥¨¢¬ÏÒÕÒÎÌÓÔÔÏÔÑÎÇÃÔÑÇÍÒÓÓ×ÌÑÑÄÒÖÅÁÎÇǨ½·Î|qh`e_XbS_[PQTQOH>@FABE<@A>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<UQMNZu
wlwp}~¡¡
y
~{r~zu
ovrks}{w{sxrksrioqzyqz¾Ë~²vrvhak]CZZ[VecXdjSX\]`c]cwz}©£¤ §¥ª¯¸ª¥³¢¡¡£¡§±¦j¢~¨°¢¡¡¥¤©ÉÍÏÈÂÌÑÔÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÂËuqebaZVZU\QKGJJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;OLFJXpu}hsxr
x~ws{}wznwpmuux}t
|ylvtn}vtx{µ;AÅ¥~|ieWICfcecgjcmw[^fhknhn ££¥±£¤²¡¥ ¨ £±
y©£~«³¨§¾Ãƹ¶ÆÎÒÑÒÐÌÒËÈÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÕ¾Ê˵zypg_\TWR]WFGJIEE=:7:@@B:FD?DCADB;?;;7DC75655;0679443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~|x
zxqz{
uy
yp|oozq{qnzuw}|t~|¯sX©Â¶pmb=^hrpqpnxvehoruxqz ©¡¬¡¥«|
~lz|®ª§¯¶½©¾ÇÌÉÉÌËÐÉÃÒÊÔ×Ùר×ÕÛ×ÓÙÛÕÐÚÚÑÖÈÔË|}kj]\QUTaICFIH>A>=7:=?;=G=?AAADA>>:87DB755479.556435532323647553458EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<99D>CGRj^mdbfkvqz~~{|~
wyn{{ty vusu}soou|
zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥¢«
z}¡¼¡©¦¦®¨¶¿ÀÁ¹ÇÊÎÎÅÍÉÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆ}|ikgaVYWWNLENC;==<8:;=9=@6=?@<?=<9867CA6455=80665547745613854564557HH=DJE7925;H>;::7IP][SUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Xea][htzylwvz{~~|z~
z{u}tm|}~s~{~x~xnt~{~z©Ã¡½¤}}r~s¦
{hGq ¤
~¥
¥¸¢¨¡¤¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¸{|znkhYb]TPOIDLB<<>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<:DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=CQSRX^UXfmmmiqry{z|{z|{}t
yszsm~~w
¢n¨
z¡|}£¢ ¤¯
Wr«\¢¢¢ ¤
³¡¡¨²¸¦½ÂÇÍÈÆÏÍÐÌÏ×ÑÑÕ®ÖÕØÚØÚÚ×ÕÙÙ rwjh__ZUYYCAIC?>>:49:;7:;:3;;?=>7;9:1:G=:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB:8:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbzma~omwxyz||{wsp
zuwvt~¦¤¥¢¨s²¨
¢£©°n·
ÄȲ¡¥²d¤ÍÈ
ª¢¢¤¨¡£³´¦£¼Á¾ÇÅÅÉÈÉÂËÓÍÍÔ©ÒÑÖÖÖØÚÔÒÚÎ
ukf``_QKV\BBGC;A=837;<:8=649:<:82?992:I:>67BC32:96264>=4;>6949;57944JQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBeGu||m~xz~z~vv{ln~y|wx|~£´¨¤«³¡§ ¥¤¯¢¸³¡ ¤¯¢¤§©°¤ À£É¸«¢¥²
¨¢
s²£¡} ¡¡±£¤·¾³ÅÇĽÃÿÆÎÊÉÒ§ÏÌÓÑÐÖØÒÏØ¼u}y`bWbXRIKOEBCD5>;76:?;<7=42669774=5;5<L<>;<BA75<;4277?@6??784987;<55OMDPRL8@=EAGA5:IENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGM\\YJha;Hzzm
y|x
}px|}|osz}{x¨¼©³½°¥®³³©£¢°µ£¹¥¤©·¦¤£©ª¤¯±ª »»Ê¡i¶·ª°¢«½¤^ª²|}´ª¢¡ ¦®¨¢¤³¸«ÂÈĶº½¼ÅÈÈÂСÆÉÍÍÄ×ÖÐÊÓ£s}l_\UaSQHD><CAA8?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPfHa`bpJ@r|u~m}||~pww{«ÂÀ°½Æ¼³´Á¼´¬«³¶¨²½«»£¨¹¸«¦¦¢¢¤£ª¯²±ª¤¢¦¥£¹¯¨¿¼¬²¹¥£§}½°z§±« ¤¬ ¨§¤¢¤°³¦ÀÆÃ°°»¶ÅÅÿͧÇÃÇüÕÐÌÄÊvud_]b]OLCL@EG>A?B<:4>A==5=6>333241A17@BN>G@CNCA=C=;86CB5BIB:878;5B>79VKDWOF8=4K@C>4EJHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\hF_ig[]\{un~{~q~zz¨´ÇÉÀÂÌÂùǼº¯«¹»²¶º²À¯¥À£«°¼¼ª®«££§¬¯µ±© ª¢°´§£ººµÁ»«¨²¤¤¨©ÄĤz¡ ¥ ®ª¡ ² ¡¤ §¤¦§¤¯¥¿Ã®¨·µÉþ¶Î²Ä¾Ã»³ÑÉÇÁµw{o^[_mTNIDMKKJ@A=BD<5AD;:3=8B332263A15IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr{wy¡¨»¾ÉÈÊÂÒÉÊÂͽÁ³¼¿§º¿½¼Ä¸Á©¬³¼½ª°ª¤¥£¬®´®¶µ ®¦¢£´½©¨¼Á£¶¶¯«°¬ª¬ª§¥¤uy
£¡©¥|¢ ¢µ¦ ¥¤£¥¦¥£¨¨¢²¨»Àᥳ·ÌÀº®Ã³»½Á¹Â¿p{c[Y_^LMNKGDCHBAADK:4DH:;4<7F.12352A26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>lI_XaZdeXx
~¡®§£Ã¾ÉÄÈÆÓÍÎÍ˼·°º½´½Ë»ÃÁ¶·¼´À¹¼®¯¨¡©¨¶®®©²·¬¢¨¢«··ª¥¯¾Ä±½¹³§ª´³¥¨ ±Å§}}ª¥ ¡¡Z¤f£³¥¢¬¬§¦¡£¨¦µ«©º»Ã´¦´µËÁ¸ª¶¬³»¸®¨¸º¼·op\ZVWPGLTNK?AHDDHFF85FM;>7>AK.32025B55PWN<LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hV<>@BFBsFiIRfdMF¦¡¨¥¢¯¾®¡Ç¾ÆÅÈÇÎÎÏÒʾ»¶±»»¼¿ÏµÄ½·¹·³²¶³¸³¬§«¬¹«©¨¯¯£®¥¨¤¥µÁ°«´¾Â¹À¹³§¸´·²¯¤°¯¥ sÁ}±¥£¨¡ `J¤T°¯¥¯¯¦¡¦¦¡´©ª³¼¼»«°²ÇÀ¸¦¬«±±£¡²²´¥sqg^\PRMFQQPQ;HKHFGAC=9KT?A:=EM/7534:B44NWN<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;5EA:A?>H@5*B52,>c]g:35tde@R7}hX<:BC@=REWStbVFH«¡¨®§
£¤µÉ´©Ç¼ÃÄÉËÉÈÌÎÆ¾º³¯º¸ÀÁ͵ȺÁ¹µº²¯¯³´§¤«´µ«ª§¬¤®¦¥©¬º¿¨«··¾ÁÀ¾·²²Ã°·½¬£®´º¦¥u¾®¡ ©§ ©¡§mu¢¢®²¢«©ªª¯¦¥¡¥ª¢°§©ªº·¾³²®¾¹¶ £§¨¥¦©©fhc`SMMGIOJUL=LEMIJ@CD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CC:9C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW<:=..SaMVH~e^HF¬¡»®ªª¢£¬£¤¶Ç½´Â»ÃÂÈÉÅÂÎȽ¹²¯¹µÀÃʶƲÁ¼µ»¬©¬°££ªµ»¦ª§¬ª¨¯¨¤««¾¼¨¼´·¾Æ¼¶µ¸À°½¿³©µ·¬¿¥¢¡¼ ·¨¥£ §¥²¡¥§©¤¡¢ µ°¥¦±««¥¤ª ©¥¡¡´´º¶¨µ²²£¥ª¡xc_a_LIFHNQINEFFBQJH@DGAVSDH<AGQ1;B7:BF79]YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGE¨¤Ã¬¤¨ª¨¦¬¢«·Å¼¿·ÁÂÀÈÄ¿ÍÆ»¾¹²°¹´¾ÃȵÀ°¼¶º·§¤««¡¡««Ä¢¥¨¬¦«¯¬¢ª¨¾¸¦¾°··Æ·´¸¸¾±¾À¶´²µ°¾££¡¡¤¢£¾¤¨¨« ¦½¢¤¢©« ¤ ¶¬¦³§°¨ «¢¡¥¤«±µ±ª¥ª¬ ©ie\b^PJHKOLHEDI@=OH@;FIH[RPK=HNU4BF8>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0--0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcXN¢£Å« «¢¤¦ª«¶±£©³¶Å½À¶À¼É¿Êȶ¸µ´±´´·ÂÆ·¿±¹µº¶ §¬«¬ ¥¤Á¥¡ª ¤©°¢§¨½µ¥±»·¶µÃ²²·º¾²ÃÀ¸¸´µµ£¤ ¡¨¨ª¢Â¬¨«¦ ½¡¤««¬¦¡X¦¡ ¹ª§·£³¢¡°¡ ¢£¥®³«©¢¢¥¤¤cg\eaMJKKOFEAGK>=IA99JJN]QQI=LV]9FI=DMI8Hc\KCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+waS6SZkWsHE6=ue\LP 礢³ ²§ª££©¬»±©¬µ±ÈÃÁóÂþÇĽÄʽ°±¶®±µ°Àŵº±±º¶©°©ª¦¡§Â±ª¢®±ª¤¨½·¦¶»½¯·Ã³³Â¿²Æ³º·«µ¶®ª¢¦¢«¡§«¯¯¯»±¥©©¢¤¸ ¡£®¯«¤¥¡£¨µ§§µ£¯ °¡¢ ¦¬°¥§¢
dh]hfKJLKSAC@IG;;F>89NMU_RSJ>O^^=HPBMLI8Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<w]^?[U_gr@8<HweA4¤ §£©± £´©±«¦¢¤²¬©»²°µ´Æ¿ÄĶ¿Ä¾ÊŶÀɵ¬µ©°¹¬ÀÄ´¸¯¶º¥«²¬ª¡§»´¨°®µ²§ª»³§¹³¸²¸Àª·²Ã½´Å§¾®·µ©§¬¡¥¤¡¡¤®·±´¶¨¤£ ·£¤¥®±±¥©¥¡¨ ¢¯³¢¦¯¥¬§ ©©ª¢§¡zej]lkNQNNT=CANC;:I?77QN]_RVQBW`]BJSHVKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JqjVCWFyfC;¤¤ ¥¿¦¨®® ©µª·¯«£ª´¶°°¸·°·¸·Ä½Ãǽ¼ÃÂÇÁºÁÆÁºª¶¥»Áø¸ª²¼£±²¦¨ª¹ª¡§°« ¯´³ªª·µ¬»¬³²¹·¬¸°Áº½¿¦Ãª°¶®©««¦ª¡¡ °¯³«°¸©¦ ·©¥¢¢¯±³«±§« ¥¡£´°¦¡©¤¢©©§ £~limbnnXQQZTACDU@;;H@7:XPd^QWWEY_^NLSO_LJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gYaF(@8m}h\V:{cC=¨¡©¼ ª¯ª£±·©¥´²«¡µ½¯³¸¼»½·¶À¿ÉĹÄÃÀÀ¹Å½Á¸¯¶¨«·²¼¿¿´ª¯²¸¬¨®©©§»¥³«¢±°³¬ª¶³µ¼°±µ¬°µ²ÀºÅ¶«¼¯±·¬ª£±¥¥¨£²ª³©ª²§ ¦¤´®§¡¬¬±§³«±©£¨¤¡¨¶©¡ ¡§¥£ {gmrhqs`GYfVDCMXDZ9HB5>]Qh\OZ]G[^^OMSXdJKC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aV151=`V_8)C3YU\gK5zfL@¥¤«¶£¬¨¥®µ©¯³¹¦§°·Æ·±·¿Â¶µºÅ¾ÌŹÃÁºÀºÅ¸Áº³´¬ªº¸»º¾µ«¯±·¨««¬®««¾«¯±£ª±³®®µ±¹·ª®±§µ°³º¼É²ªµµ±´°®¦ ³ ¨¬ ¥±¢ ¥¯¡¤¢¥§²©¡¦±¬ªµ¥®°´¯£§¬¸¢¡®¡¥££¡{
{lnyov}bF`jZIHZ[={JGE6AbUi[M\aK\\ZRSSbaLKE`a`PMIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.+A/JGP[G3cYTLE°¨±©¬¤£®µ¨·³·£¬´·É»µ»»À¾µ´·ÃÀÌǻĽ·¿¿Á¸À½²½®¨º¹¸·Â·¬®²º§¯¬¨¤²©¯»¤¬²²¦§£²´±²±µ°·³©®«²¦¸¯µ³ÄŶ©µµ«°®©§¢¶¦° £°§©©¢¥¥¤·§¢°³«§°§¯´¬¤¡¬¨ª¹£¨¤¡¨¥¡w|nqxv|]Lel\JOd]?b{GI8GgWf[M^bMYYWUXUi]OPHa^_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHg27'FaLV%-B.=ELQ<3rkLED¤¤¬ª¦£°²²ª·°µ«µ¹É¹®Á¼Ã¸³²µÂÃÏÄÀ¾µ¾ÀÀ»¿½´Ä©ª¹±¶·À¼¯¬´´¡§±®¥¦±¥²µª²±«¨¨µº¬µ²µ«´ª«¨¬©¹²°Ç¿¸¥¹°©¦§°¥¤£®£¨¯¢¢¢£¬£ ¡©¦¥¸¤«´´¤ª«©¬®¶®¢£¨« ¤µ£¡£§ x~
}}}rts~~]Scn^NZg]FD[G:NmXb[NabNVVVWUYh^QSMcZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Dd;6*HdHJ+:I?3CIS,>l@HI¨©¡©°¤§£³´°´´°° «½Ì»®Â½Ç²´®´ÁÃÑÄÆ¿Á²¾Âü¿¸½Å¨·¬´¸¼À±¬²®¡£§®ª¨¥±£ª°ª®«±®®¬«³»§·°²©²ª«¦¥£º«°Â¹´¬¹©©¨©§±¥©¤¢®©¨¢¢¬¥¬¢§¨¡¬¦£¬¶°± ©£ ª°¬§§©£ ¨ ¡¥|w
utrwl_Y`ncQsq\K;|F>WuX`YOc\NUVUWQ\b_SOOhYWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=397;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.JgDF8<B05EKX1@]@NF¬§ ©±§¨°µ¬¸µª¤ªª½É¼±¿¹Ã¯°³ÃÄÎÎÿÀ´ÀÃĺÁ´ÉĬ¯·®³ºÀ¾´®®¬¦¨ª±©¦©²¦´ª¯±®²´»¥·³¬¬®¨« £°·¬ª¹¶¤µµ¤ª§¬¬ª ¨¦§±±¤§¥¡¡«ª¡ ¦¤£ª£¬¢¦±¶¬¬¢¥£©«®©¡¥¤¤
¥£|zu~uw¢xj^`nfWfdN@gLEbzWbXRfUMVVUTO\]aVLOjWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72;::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DBIID®¤¡ª¯©¨µªµ±ª¥«ª©¼ÀÀ¹º´¼µ¦³¯ÃÉËÑ¿Á»¹¿¿ÃºÂºÁÄ®±µ²´¼Á¾³±¯¬¬§·ª¥°«¸®¨°¯®±«µª¶µ§´·«¬¤ªª¤³³©¨¤³´µ¡ª¨«¨«§««¨¹¶©ªª©¢©ª¡ ¤£¦¢ª¦´®§¥©¢¤¥¦§ª¢¤£
£t~xuzx~pqfgqx\atjO]VHmyUdVScPMUUUQOX[bVIQjTVTGPYUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E23;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02@f=NX?C,?LT_/Ik7RF;¯ ¥ª¬ª£®²´¯ª¤¯©¨»¿¼Á²°¹¢¶¯ÈÇÈÑÀ¿½º¼Ã¾»ÄÂÀ¿¯²³³¶½¼Á±²´«´©¥¶©¥³²¸¯¢´±¯±¹«¹®ª®·«ªª« £¡µ©¡®²¡´ª¨§«£ª¡¡¬¨½®«®¡§¨¬°¡¢ ¨¦§©°©¢¬¢¡¢¢£§©¦}
¤¡xt}txz{tt{j¤vi^ekug|RVp_KxsTdSQ_MMSZfNMWYeYGSjRQ>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HP;YC3° ¤¥ª£¤£¬¦´³±¨¤°§ª¸¿Á½±©ºª§°ÉÆÈÐþÀ½¹¿À½É¼Â¸±°µ²º¼¹À³µ¼¬¹¬£µ§§¬±¶¸²¥§¹µ´¼¯¼¥¶«©¯¤¤¬ª¨ª²¤³¨ª§ª¤©¢©§©½«´°®©¤ ¯³¢¥¥¤¥¨ª¥©¡ ¤©ª
~¢rzy~|hv|{uqq~jz
d_gcr
{mgy]^VBW{mTaPRYKLNpt]IZ[hYFVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°©¤¢¡«¤¶²±¤©°¦¹Â½·°¤¹¬©¨°ÂÈÉÌ·½¿µ¸ÁºÈ¶Ãµ´³µ²½¹º½¶®¹¶¿¬¢´¦ª«®µ·´©¹»¨±¾²º ®´¶©«±£¥¨©£¤°¦¯¡ª©§¢ª£¨ ¼§®±®¡ª¢¤®¬¦¡¢£ª¢££¡¦¬{}¤}zl}vyxbzzrpqsxjukgcgansmbjo_pA]ykV^NQQKIMSYVM\^lWEXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R]>#«§¢¡¨¤·¯¢¯¯¨¬¸Ãº´® ¹¯«§³ºÇÊÇ¿¸Â½¯´¿·Ä¶Ã²°º±²À¶»½·ª¹¸¾ª¤µ§¨ª¯¸¯¨¸¼¤¾´´¡¸µ§¦¨°³ ¥¥§¡¥¬§¨ ª¯§ ¦¢¨°¸£±¯¡«¡¬¤§¦¨¢©¦¨¡ª}~||¡z |
|tp|qst`xxjoqqpksdzlhecaf`[rjrMNiXZMQLKHPRPGM[_oTEYZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0][5(¥¬¡¤¡·«°£´³©©ºÅ·³®¡¸«¯µÅÇÀ·¿Â¹°µ½·¿»¾°¬¾°³¿²¼Â¸ª»º¸§¨µ¨§«¯«²¯¤»¶¤«ºµ¯±¹¯©¥§¯²¡¤ ¤£ ¯¦¡¢¨¯¡ ¢£¤¢¶°¡¦±«¬£®ª¥¨£¥ª¥¢©¢z~zz
~z{prvnos_xwellljj
nfrikeh]ds`[kviZJ^\XOOKHHRUG39]^lPEYUYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDT]hD.<2dW,2¡¡ª£¡¢¡·ª »·¥¬½Å´±¯£µ¯¬¬®´Ãü³¿º·±³¹¸º¸º¯®À³³¸¯¿À·½ºµ¥¢²©§©±ª±¿µ¤§´µ¨²¼©¨¥©¯¬¢§¤¥ ²¤£¨©¢¤ ¤¸©¤§®¦¥¡¨ ©¢¡¡¡ª ¤¨¤z{}z
{w~|ltrllsawuhhjggphhidfii`jcjh[f{c`StT\[RLJFIOS@!*h^iLDWU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gP'2¢¤¤¦£´§ªº¶§¬ÄÁ¸±¬£¶®§®·À¿¼²Â·°®²¶¶¹¶¶ª½³®²±¼¿·®»»±¥¶ª¥¥³§©À«§¥¯³ª¬µ»©ª«±¥ª¦¤¥¬¢¤©¡¡§µ¦°ª®¡¡¡ ¦¡ ¥¬¡©y
w}
{s~~fyojjkftskcgddvbefffjickr[_Y^mdaNiXZ`VJGHKMRX>9_lhHCUT][IIGEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>HiZLYJVbf@:3BhH%5£ ¡ ¤³±¢²½¶¡±Æ¼º²±£·¬ª©¸¼»ºÀ²®®®¶¯³¸³©«¹±¯®³¶º¶¯¸½¬¦µª ¯£©®¡¿ °£®±¯·®µ¯¢§©¥§¥¤¢¨¬¯¦º¨®¢¡¤¤¨ª§©¦{s
|
ofymgkifqrk\hcctbfgjnlgjjhn]llsp`TcicfYIFLMOXRQUaeUAWSYTGIFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC&4¡°¡©±¯¹¿µ ´Â»¾º±¦·¯§¤·¸··»®ª«·ª³·®¦²µ²®©°¶¶°³µº¦©µ¨¨ ¨¬§½¬¤®¯¶µ¬±°©¢£«¨§£©¢¤¤ª«ª¼§¤ ¡k¢p£u©§¡ymiwql}
q^cagktw~gguheW\hsmNPjcgs
h_efnmj]`aeNKD9GTh^JGPPUULHR`oteF[QUPFHEC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=A@@=28@E=1,+08=G701.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.¤° ªª£½Å¯©·Â·½½¦·°¥ª¢·³²²±¹¬©¦¬´¦¯´¢©·¶¶¨§¬¶²®´³¡©³©¡£¥¦«¹¥¥¯³·®¥©®«¬¥¡¡§¦ ¥¥§¦§©¤¶°¤£¢£¡¡ ¥¥ªsx
¡vif~sx o~}¡ }tulmieczlraS
mbliqXiqpX^i[ll[rnzr
gZ_GN?G_MERVVQQSWTg]MVHRROFHG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(§«ª©§ª¿Ã¯±º¼·À¿ª¥·°©¬¤²´®®³·ª¨¥°¥´²µ¶µ¦§¨²°¬²§© ±§£¢¡¬³£¥¥¶½¦§«ª¬¨¥¡ ¦£¥£¤¤©¢£¥¦¡·¤¤ £¯©¡
±£¬yÔ¨ÁÇyx±¥·eÀ¿y
z|Êr¼Åzrµ¦»{m±«°yhlX±®nei½¼ngzorØ~Skc¶²~rs¡ªWOWbOVNFU[XQQS\W[PA\DQNEHI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>:B<?A8:J>52*22BE/.32.+/(-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!§§ª¥¬²©°Â¾²µ¿µ¶¾Á«§´¬¬©¦®³©¯¶³§§¦´¥§¸³²¶«¥¤§±¬°¦ª¦¤°¢¡«¢³º£ª©¢®¥¡¢§§ §§¦¡¦¢¡±££
¯kjª~fdp¦q®¡¤~x»}k¡v±_j´[¥e`g{gjxk©e¾rg¦u±j|±xtcnm§n[¡EhfEu`~g|¤§Z_«hxyj§7J¯\XSld[KNX_\WV;NOWW/ITSJCFF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢§¥£¤ª±·¬µ½¿°¶Ä²·ºÁ¦©°ª®¨¨¯®£°º¯£¤²£©¸§³³°£¥ ©¬¯«¯¦§£¡¯¢«¥¡´³¢«£ ¢¨£¡¦¤¢ ª¦¦ ¡
µµx
©µv³·~©~k¦{w«gk±\«ztrx °vwqlll|N¤XHbb~ch¦`yruS^P©mcq~b.Q¡o[Skh`LK[dX\ZB>±yWXA#MhFCEA@A19>88:84;:9<8:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.840,.(/3,>831/2-D1=<S}n3+Xj\OXM_gW7J8aU50 ³¦¦¡¯©§³¬©»¶Â°»Á¸·¿©¬¦±© ®»ª §´¬£«´¤¦²³§£¢§ª±§°§¥®¬ ¤¨µ¯¢ªª¨ª ¥¨¢£¥£¢©¦¢ Õ¹p°Á~Å|Ö»|¥¤{¤¥z¬yV¯z~j¹Z¹v~¦{zªxz±nt¼
oP¯§ÅQ zc`ªbsrm`Sµ´È
|c¤3Bv]PjicP@XgZdaJHMnN\QOYfYCD?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:;DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aP71%¢²¨¨¦´ª¥´©¤¼·Á°¹¿±µ´º²´§±¯¢°²¦µ§§¹¢¯°³´°¡¤¦©°¨´¨£ª ©§°©££¨¡¥¡¡¡¡¡¡¢§ ¦ §¡²nhµq«n¦r´sr¶{¤¢¡¦±vÒÒv\®{
¤oª¦k
}}{±qx³etofQÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjceXAOk`lhPVGI9=URZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aL620¢¥°¬£«¼¦´¦§¶»¼²º¾¶¶´¹¸²¥´³ ±±¢«¯¤¦¹¤±°´¸ª ¥¡©¤±§¬©£§¡¦¥ª°¦¢ ¦ ¤¦¥¦¡£ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
~v¯w´aemZ°XKuyf`^vwhl]¯wxl5yÈ®²_BTo^g`EPl`pmVVM.fdiSYP;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK96<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`H:99 ¹°´Â¨³¨©²º·³·¾¹·±´º´¤·²³¬¨«§µ«¨¯±ª´¤© §¡µ¦¦©¢¤ ¡¤¦¯¦¡ª £¡¨¤ ¥¨¤¡ ¡¢ ¦©}}¥x¡ªp§¡£ª|xo±Z¨ ytØvt¨¤{{²^d ~m\«[Zhgªdr{ks^«Z koeOJC¡\[Lt]bgN[a_rs_KV7JYGE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@5.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¢À«´Â®«©¥´°·°µ¾¹¹±°µº¨º´¯¤¤§§©°©¯©´«ª®¡ ¦¤£¹¢¢« ¡¨°°§¨¦ ¤¨ª§©§ ¢¤¡¢¡ ¡«®mr´s©u§s´xs³¤£¤w¸p{¢jk¶Z¡
ei¡¢§mr´t~²j
ju³af¢ok\_M¡|Rs£ly~or]¯V<wfTon.\§OcSkebmZc]ap{cTZR>?np3CB@?M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¦¼¡²À®«¬§·©·¯µ¿´»¯®·¶ªÀµ¨© ¥£¡ª©§µ¢²§®© §¤«¸¢¬£¢ ª¶°¨¬©¥¥¬¢ª²£¦«±¡£¢¡©«Ô»s°ÃÃ~Õ¸x§z¤¶u~wv²`ºyÀ|u¸cµ©}«©q{t¼§ ia¦¯¡~tª}¾os¼t²uxnrn¤t½^w}Zay¼kZV\jy^jaegcmxoZ\YCAAs@CF+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB=E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¢½¡²Ã°ª«¬±§·¯¶Ä°¸°¹®À°«£¡£¡¨£ª²¤´¥¬¥ª¦¬¸¢¤¢¯¹²¬¤¨§¤¤¬ ¨«¨£³£¥§¢¢£¯ ©¶·xµwmknsoy
tÁ»½{±¨qs¹|||¤»¹½tz´£twvt°ufjµtrqw¶^z}hynzc¬pu
X[§jEeZTf`c^cQggpluCNPMD;ZM?J3;0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITAKNGEOF?G<7>7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O]]=+:VU'>;<§¡¢¿¥´Ã´¬«¨¬«©º®°Å³²¶¦³¸«©¡¡¥ ª£¬©¥µ§§ £«¤½¦¡©¡¡§¡±µ·¤¤¢¦¥ª©¥¥¡¨¥§¤©¡¤¯¨¦¡j}i¦wr}tyd{½¾Àºor`rjZ^`ck`cmwble^`cpir}gkrux}~b[wthP\m}{kXkzsJJopNtMEX]gaL[Wgc_O[muiqRQDEM;GI=M?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEKOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P_L(3>[O'?2>© ¨¢Â£µº¶£¬¥®§§µ±¬È«¯²ª³¢½°±¦¢§£«¦®£¤´¨¥ ¦¨½§¨¤¤¨¨°²¿¬§§¢©¨£« ££§¬£ «£°§ °¥¡§¢¢¥¡gm}qw
µª ¡ z¥
mk}|uqxyvu|jstuew}wkozm`c]phMYZfj`WZoymmfTPFS9OZMQO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\J,<-@³¡³¢À¡¤²²¶ ©¥²§¥°´ªÈª¬¯¥´¥À¦³ ¤¤£ª¦¬¢£¶«©¥À«£¡¢§¨§²Ä°««¨ª¬¡¢¤¯§¢¥¨®§ ¯ ¡¦ ¢ ®|ª©
z¤g¡³¯
v{}wyzofyjuysis{vkudyf`jecdfkYl{oik]SLPD^TE@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_bca_]^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4[G5<,@´ ¹°¿¬«®²± ª¦²¢¬³¯Ä¯©ª¢±¼¢³¦¢¡§¥©¥¤¥²µ¯¥¾ «¢¡¨«¬£´È´ ª¤«¦©¤« ª¯ª¦¤«¢® ¤¯£§£§e|e~cymhk{¤ªje}geeih{¡kg£wkj£slmzzXf^^mv\hswvmwxsmytv|kY^ltd^sik|qkd_RNXIdXAJ4>G7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO2YC;?.=¦ º½º¯¬´±ª¥¨®°¦°¼°¨¦£®°¬£¡¦ª£¥§©²£¢¯¥¶¹¥®¢¡ ¤|¦®£¨´Ä¸¥¢§¯¢££©¨¡¡ª°««¤« ª§§ ¬¡¥°¤© £©}½r´rhx¹Ä¸q¢£z¦r«|ËÀÀ»q£}À½ÂÁ||ÃÀ}l¥²ooÊzvuyyqzpw
ynxcg`xd`ec^tglddYLVIQZHOD2IE?DB>/<?>@A:8CCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP.#F[3PY/VAB;/8£¹Ãµ°°À©¨£¯¨°®¦²³®©¤¥¦¯«ª¢ª¦¡«¢¤¨¤¤´¤¢¦«·³§®¢¥¡§¥¬®ÀÀ±¡©¯©¢¢¤ª£ ¢¯ª§¤¤¨¡¦¥¬¨£¨©¨« ¤¢~Îxz¤y_®^§¢ |§s«¯^cª{¨
u³c«¡³j¯t}·aZ£Ínv{Ú{p}v}ezvvk|n}~marmph``zd\qhjdg`RTSW]KOC5AHDD8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸£ª§³«¦²««ª£ª¦¯©¦¥¢¯ ¨§¢¥ °«§®¬°ª¨«¤¥§£®¦¬±©Àdz¨©±®¢©ª¡®°©¬ª¨¨¥¢«¬²¥¢ªª¢¥¤ ®¦ q
u
¨q±}r¬~¢¥v«}s¬v{|~ª¢~«{{WÅ{pÁ}muomeveoawnronfpuuqagme_oiiogdXT]aZRSD9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^\[ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3W@F!G:C1.+°ÓÆÆ²´ ££¢¢¬¯¶®¨±¦¨ª¦««¦¡£¢¥«¡¥¨¨¢°¬¨§®«§¦§£¡ §£°¥¶«ºÎ²¦®¬¢®¬ ©³««««¥£«®±¡§«¥¤©¨¨¯¡¢£¤j¤uz©tz²p¦q ¤``R«
®v¨
z{f£¤£}©~®_|©V£z£{ïÅr¯³³¹rb©¯Âthnqozxypmgeerpf}jc]W`jXYUMMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*2PKL# A9D4,'ÂÉÕÔ¿¡«§ ¯¢°´°®©¬¢§¦¨ª«©¤¦ ¤¥§§£«¢¬¡£¯¡«¤µ¯® §¦¢¢¨ ¦±¦¦©²®·È²µª¬©¢ ¥³¡§¬¤°«££ª¡³¡ª³±¡¨§®´¡¢¦{ªlu«y|°o¥ Ò¸´¸É²_`©¥ zxªÉt¤¨©ÆÆyg¡¥t}¯]p´b°uK£m§Gd|qq|u~|n\fjsqfk_aYdn\_YINMKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ¨²¬¥¢²¸¬ª¡¥¨¤ª«ª¦¦¦ª£®«¥ ¬©¥§¶¢©«µ²¬¥ ¥¬¨£¡ª§®¢¥§©°µÃ²³ª¨¥¡£®¥¡¦¦±¯©§¬£·¬¡±¸¯®¦±²±£¦¢Nxz£}¤
¦¸{{y¹ÌÆÂ¶x¡~v¤£©°
¬}c¦m¤p
}r¬`£sq`¼}RUt£{~w{sq\nnxrjp[d`iocd]LMQTAIHFI:9K>B108866877-*5==?BDGILNPTVYYZ[\__^]__]ZZZXUSOH@882.,*.+*''?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª®¡¬²³¥ ¥®ª§¦§£¨¡³®¢©¦² ©¤£¶¢¢¢©´¸£¡¢¡±§¦¡¢°®¦©¢¶²Å±©©¨¢¤¥¦¥«°¢¯¥§¯¤»¬¡¶¶´±·¯±¥®¢
ѵ÷y
¦y¡w ¥qª
´nri¤|s¯¥¢¦nq²]¥tzl{|m©a£qqbs²¸hw¦}z~ynjyizsou^eeonfh`K[XX<HH@U4@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][[ZXURRQF:223//++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¾¿¼º´§¤µ¡¢¢¨¦®««¦£¥¡¡¶§£¨§°£¬£¤¢ª³³¤¤¨®§¤¨¶£«¤¶¬Ä°©«©¢¢ ¦¢§¦§¨¯¤¦¦½¬½¯¬¡¯²·©²¥¨°¢§y¨}|°w¤¥m²p¡|¡§¬
ª ¢{~««x¡z¯^¤}¦§d|sj¯]¥kp
]`[ m¦||knctnz`hfqoihhCZa[>KU3U8BBC7$$3+''3, /6674359@CFIKMNQRSSVZ]_a`aaa^][ZXSPONI7042.*,ATVVVUTUUUUTTUTTTVWWXVUUQHFIJ#((½¨Å¶À³¬ ·¥£¤¢°°ª¥ ¹¡£« ¯©®¡«¨£®°¬¦¥¬¬¡¡¦¡¥®¡¨§·©Á¯¤©¤§¦¥¦ª¬¤¥©¨¾¤Â¬ª¢ ª±·¨¬¥²§¨u¯~
~ºe°e}¡¦¬°
¦¤¡¡
¡\lj³`{{±mgo±[~µ\¤kÈ¢d{¼Xv´Y²}R®z¬X¡m¨|zeucxt}bjgqngffPUd\AU`>I(>9=4!",%2. *1/045799<ACFHJLNPQRTWZ^`_`ab^_\[XUPNJFC553./@UYXWXWWXWWWWVWWVWXWWXYZZ[\XWWGB;Ò²±·½º³Á²¢¬¦¤µ© ³³©¤¡¶ ´¨ª¬¯¬¯§¡¯«¨¦¡¥®©¢¥££¥ ¢ª³©½¯¤¨~¡¡© ¢©®¨¦¦¢¤©» Ʀ¤¨ ©³³ª¥º¬««©£¯¤¸Ãº§¬¯§¦ª~սªb£¿½}~£×º¸µ
½¾m£o«lz²°Çi«°½¬xw¢¾¼s§ {{d~{egy|alfkkcQb[Sj\?UbCM)=:4/$%2 $(0496677;>ACFGIKMNNQTW]a\__a^`[\YTQMHC?=A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³³°¿¸±¼²¢®¦¥²¦¥Àª¸²¨¢À§¨³²º¨¯¥§°«®¥¢¬ £ª £¦§¡©£¡¬®ªº§£}¦©¡ª©¡«§ £ª»¨Ä¢¢¨²²§®©¹¦svª¥¸d ph®nnw¤u®pq¨£®¤rlllfxonqzjqigqiigqd]bjoY\f}v¦_aqned¢¢~wgxikyzemdgmcKeXJkZ:QfFQ'K:+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXZZYYZYXXYXWWWWY]^^]\\\]^]^][[UW^©¬³©¹¸²³ª©¡®£³ª¿³ÅÊ¿·ªÁ®¤¢¨¬º£¤®«¦®©
¦ª ¤£ ¥§©£ª¡¦§¨°»««|¦© ©£±¦¢«¹¯Á§£²¥ª®°©«©¥µ¢¬¶¡¨¦·£ª©³£ª ²¢¡¢¡¥¢«§
¥
~g~tusp§lz¢¥skwqxw}zjmedpeUaY@j\HcbPY+F=+'!750.!%2(*699469;>?ABDEJKKMPPQXTVY^`ac]^TQKEC>9=@ASX[\YWXXXXXYXXZZ[\^__`^^^__```_YY`¦¨ª¤´¶®®¡°£ ¶±¬È¾Æ¼º«£¦§±©£¶§©´¦¨¬¢§¬¤§£¨¨¦¡¤©¢¶»§ª}¢¦ ª ¶£¦«·§®À¢¶¥®®¯«§§±¶»¥¤¦¶¢§ ª £«° £°¨¯£ £ª¬¡«¡
~f
uuxsj
}£¤
}tt{s|joe_qj`[`ZndPafQZ:GGE>2=>9/*&+)&&416668:==?AACIJGJKLMSSSUZ``iaeVPKACB:9EMV[^^[Z\[[[\]]^_]^_`abbaaa`bbbdb\[c£§¢¯±«®£©¦¬§µª¥µ½°®£¤|¤²¤¥±©¹¦£ª¢®¢¨ ®©¨¨ªº·¤¤z£©¸£¯µ¢¯®t£¼¢°wx§¯¸u¬£«d\bv ¥}m³£§ª¢esyq¨m¢¨e¦
wjvp{
`hZughs{¨f{
zj
ozkre`wplki\ffbbqT[>NNNSG>@UD:1/&4:306678<;>@AAFHBGFIKMSTUY]`hfgXQJ<DG<8UR[`ab`^__`aa_\]__`aabcdabaaedchd^]f¦£ ®¯¬«©¥¨¢§¤«·±³§«¨t± ¨«§¹ ¤«¡§¡v§©¥»´¨ uw¡¡§²µ³º¦}§¢y ¬´¥°ª¯¤z¬
¡§¨§
w¥z§{²z¡bz
mpyp~
s
xht u}
£
kly|qqhexpjlk\eljfu]^ITLR@E6.ZUU7)!09>>743568;:=>>@DI?JEJKGSX[Y\bahfZQH9EL;>aV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah¢¦¬«¨¬ §¯¦¦©¥¯ÉÀ±¢¨ª·
§¢ ¾ |
ª §£¤º²¨
qv ¡¤«´´Ê©¬¶
°¯¬¨¦}¨s{w§h¤y´¦§Â«¡r¥}
²¡}¡¡}
mr
~yq{tÅf©£k
¤
qiyu|xhivrhhl^dpmgnYgG]RM3E47Nbd7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^il\QE=KM@JcX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢¯§¨¨¥«£·°©«¦ ¤¥¬¥¦¬¹¤°¢©¦½¡yª¡w¥¤¹®¥~bm ¡¡¡§~¡§
©¬
£©¢ulvM«x¨¦©«}¡{z§jkg·~n`dY{dhr}yl]}m_Rp\_kx_Xd|p§ªk£nr¥p
jg m[o}gZ`cXQpwfnuskjo]jqnljYiO]YF9A5HD_l5,IDRMN=84859;6@;;>BP>QRLMBJ\]_W]^bu`MD:MONTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ©£¦¬ ¶»ª®¢¡£¦¯¡°¶¤©¢¡ §´u¦~
¬¤ª§±§¢in£¢¤¢¡ v§ ¦
§«¥x|~¢ps|ym¨{¢sv¦f~w¤_z}t¢n·´ºtµ¨dƸ{p¶r£bs¬«`|i³~m|q£lr£t
¤a³r}³ut\²kcpuwrioXkmssg]i^bLE=D6QBZs3=SG`JR=<395:96D;;@JP?UMOQ@D__[ZX``|dHC8MWUWbaZefkkbbeadc`ab`dd_`cknccddhdbgfchh£·ª¤¶´ ¢¤£¦¯³¯¢¡¥«x
q }¨ ¤©¨¥
~j{~}¡ w¢q¡©¥¦©}~z z£xt}¥
¢d¡|mhoz§}rit«tªh]
v
gªk¸f\¨p`^§vu~huon§]©y»k~ª\]´h]nrzxki\qkyzd`fXbBQFO7WCRo5L[[_NZDA251<;7H?:CHU>YRY]>Db^V`Qac}jEB9N[^YdfXfgnmbbe_aa__``ec^bdoq`deekecihgki©´§c«¹±¯¬¦© ¯²©®¥¡ £jr{z¤©£ iy{¢¡rhp©¡¥¦{°£¢¸w£³£¤y{«~¢q¡|
¯µ}k¡y~µ¢¤«¨|}tªZ]o{xbL{z
cyBLX¢jq{lux±³§wns}ptk¤^vHedatrof`liw|eeaQ_W]TW@ZFQhETW]bX^ID=B8?B:IF8LEXAWR[VDFb\Z`K`m~rEB<U_bZeiVghmobfg^aa\]^`hb_ecvm]egfkdeliiki°S^ ¦³¹²²©¢¬ª¢¥£© ¡woy
{r¡s¡
©}l
q¡x|£ ¢}µ{¥z©|§hwm~t¡sr|p®}¤¥£o^¨gu¢co¥aÓ}{xssb¢~£t¤vk³`sª²¨¼wm~¿¦©´]m|pmr¢r]¤gs¦`h¦mÔ~pz{l|xsn©¤gaezr
lhfdovxh`cS\fQQbHYJUaWT\fk\eQFCKMJKBKE8O@QNXSYOSQ`ffjRcwywIFEc]eZhjTihjocjg`c`\]]_hbaie|d^dgdkdjlghlh¯ªT\K~©¯±³¯²£
ª¡¢¥¦©¡«¡
{p}h}wo
l|¥«yvnx£{¢£³¡¢¶z¬§¤®¥p©
{¤¡r¤®¯¤ vµ¶µÉ¡s`©my t¢w ~pMf£ps¤{ytak~ kqd_q}shyh²µ´Æ¦s}zk«v
nwyj{urQE}³_jwlzgkhcuuqnW_TYiPShIWMYTV^iloVhWNKAJMKHJOAQKPecjmetrsy|nu{{TQOl^i\kiRjhilhlfce_\]]^ibdik{_]dgcjfomeile¡®¥d?¡²ª®¯µ¢¢«££¦¦¨§zjye yui
z¦ªz}yp¡z ¥¨fnxl¢d{q¥wpg¦z¤zsw¹n¢b} nriªku mo¦`iiu¢~`upbh e~iuocfmq¢Z^[b¡l]nz}qqd¥mx¢dg§hsp¢pUo _f¨T^TnntksnqilytkpRYWWfZTmIZP]IXiisjYlWQRFV\LXSaUik_wt{}p||r{svv^RrbgcpgPjhhklnhdg_]^]`jbjivu]\chcjjsmfkmc£¥ydsm¦£©°±¦¬§£¢¤£{qi|su~{d|¨£~ti¦} ©¦¦x~¤±¯¥vx©s¥n¤¢»n}¥¯
|¥zr¨ g~o¬dw¨mª¢vw«¦k°kv³©k
mm`~«ªv~~¤w|¤ jx¬h®¶tw¾¤Z§«avsur|uqckoimSW[Vab]kM]R^J^mow`[qY\`[gtenorcrt`wz~yrys{{vbxdcnrdRkgholrjfia`^\akbmlzo\\bibljxmglnb¤©£©©¨¦®¤¬¦¦«
szo}ttsm}{§§§
vol©ª¢u~y®¢qw}{r§r~}zy{~v {}k
[yyrzqin~quqe_wtruoynml
]ugwe§}t{jpv}wnnhtz|x
\lXyioxsrpxxp]lnjgV[`W]fkdVcU_R`pyymkwfkkkw}rrutaovbt{xuzux
}{nldyn^Wnghukxjije\`Zcjemqtn[[bldllynhloa·¨¦ ¢¦£¤«¢¡¢¨ªq|}~{trq
{}y~¥|¨¢
vr©§ª~~§¥woxn~¨
q~qkp} hl\sqtkwtYrn~j]je{`ixz{u
gwj_oqu^q¤
enwqzqhif|{[\khnv[|yxvotsh]nkkbZZ_[Ylq\_aZ_^ft|vpudkkk|}s|yudnuhm|~wz|{yz~o{}t~yshT\qilvpugkhd]aXkhkkqrnW[enlgszohjm`©°¡¢¡¨£¢~® £¦|}r}v
ror~z¡¨¢yz¡ª¡¢¤£ª¡§¦zv§~²¦±¥k|wxe|
w|zt ~}tnr}v
¤
}zn
~zksiatq~{xwpxu]^ohn_^Z]]ShrVd]]bmhv|}topekji}nyrjpqlg{rx}{m|zx{}zxNcvjsnpzekecb`[tfpgrqmU]ltmiyzqgikd¹¡ ¤¡|¬ }y|nys}mk~z~
|
¬ s}{ª¥¢
§¥u{¥{|«¢©~oxru`u
nyvt¡
s{|qqzzw¥
w~rm}oilnh^zi~}wvwv{x]`q~nt`c[]_RgnTf[^bkivzrlmdkjhltlluozpznv~
vq~{||{`h{juiidjc`i\cuhobumlUcqyepz{sejmm¶ £{x§¥zz}n|ys}}kh}{}|©q ¡
|¨x£ ~£¡£}w ~|¥¢¢¦~~utqwa~r}r
hxrx~r{|pwzyx¤
{v}hs~z|rmlh_~ti}vvt}sk_`tvpwdcY__RkiVfZ`ahjvyqgkdlhfkn~hoql~x{ls~tv|{}irntiahlb_qVtolm`xhmWjtvcuz{rbjoz±¥¤ }w¥¡£y|r{tv
}wgc~x|y¡p¥¦
v ¡x~¤xw~s£¢¢~|vq~n{d|
ql
fuo{|x{{zq}w
x¡vw|xazzuyhmfbjkxttw~r}cdasnurmaZa^[leSdYaahkvyqckcmfh|miuhnpi}znr~t|~{~|mvsumeljbbuVipn`xglbjvpfy|zq`rl
¦§~xª{y|~||xtyzt}d_}t}~}¤¢s{¦ r¦rkzo¤{yqzlul|~nxq~~eri{~tx}uw|{£xt}tv
qb|v{r~pcpde|copwsyxtubw`plvno\\_^^k^P^Ycahnt{l`iekciwngmikmh}{xos}t{}z}}rzxxmljh_ircgqoewgnlayik}{xpaxm©¤¨~x¯~w~|}|wxput|o}|a\~s{z¦}}£m¢ me
zp£}{
ssvlqnu|tnqu||eply{|tsxn|
{§z{~
x~qp
fizuvq|c_qakt_qk{zylsqfz^olsmrX[_`al\PWXecgqqg]iigbgqodjheiizwuo
t{u
x
|x
zw{{rxjk_phtkromrgole|cnzwqlww~¢¡§ ¦v«¡t|w
xyrs{kspznvop[Y~vu ¢x
l¡i¢e~w~}{|ovplmop{itqwuyfrnu{yyusozy
¢{uxynl
_tutrry[_qapk_pk~|qnnknwapokqmYYbaboYQTZfgcupc]kndcfkn`gg_hkurspuyvy
xw
|{vjqc|c|nqmtjholvx_qy|tut~¤¬§
v zryupr
tqvlpnvmv~mmUQ«wwrz¡x{£{r
}gg
qw{z||kwjnkll{bz~v{x}ygsls~
zqyouyy|{zv|wqjl{ayqomstV_pbrb`mozqipfguuirlbwe]Wfa`sTQO\fe]yp}`\irbbefj_he[gp~pkqt}v|uv~y{
xs
~|yxfrj`~ookz`jntu_t}yxts
}x °¥
wtwtqp
tprpkiwnn}}mtsRMßÈÖ{puv
¡w{s
¡~wz~yuf
k¢cqz{z|m|esoklzz[yz~{{isjs
|k}~m}
|y|uwxsmgq
nlupijunS_pepZ`msyhlkcgyspqd`xa`Vl__vPNLbgc]zqu]\evabeedagbYissnkqv|tzuv}s{r|~vesn|e~nplYlnyys`vz{vrwwy®
w~|
txpyqopmoseeyq}my}jhkc¤ÁÜ®ð¡slv
w¤p¡r¢
}zuxvum
|¢
^m{}
v~~k}dxvjnysX{
z~yfri~kum}x~trwusqgvzcunqcjvhRarhlV`ouzard`iqso[drabWn[]xNMLegb^wsn\\dy^_ee
`cc_Yjsknksw}twxw{q}~{t~sguryl{ntqWqzvyrdwyivr§£}qwy
¡|{swptjpljm|u_axw{qu{g`d|ëÚµÉÃÜsltwjq
|{
uxr
u}o¡ai|}rqwhvsjtwlZ}
}vark~~}mkw
{|}mpy
tkplsyaujp^lwaResifS`qwuap`]hrtkXhhciYmW\uLKLfg^bss
j\\ey^^dg{ad_]Ykofojtx~ss~{vzs
|vw{ulwvyxtnx{}Xyqogxwdv
p
¡¢toqw~} xrtnodrifmxx\`y{{qqiagaÕ¶¦xoqx}qk{i|{}zsz{qt
u~b
g|~~m|ulmwuuxvlc
~}p_qp{{~ypey
z|~mny~umnkl{dilkZnwZSjsibQcsxmcf^Zkntb\h_em`oU\pOHOgf\horn[\cs`\clwee]]Zlmcmjswqp|}txx
|uy|vpxy{on{w^tmiztsgs|q vvmw}w~vrpljau}gbjuz[`x|zlp~ecggW_qs½Å
wrtsk{|}|~t
vv}quq~szf}r}g}{y}i}vfpyxtxtlkyk^pvz}{~rhx
w{|mkz|vtohh~we]rdYptSTosibNhuyga^]YoptZec]knaqPZlRDThbZlon|pZ[^mcZcowdg\]`kjcliswqn~{tuz|
v~xtsyy~oo{qjyz~nm|vkjxtk
o~vjyyozsqljd`t{i`fr{[ar}zfpzaed±²wKbZ¥ÚÒs|z
ol
yy|yxnqs}{jy¥n~uw
pz~oxh
xr|e|~vcqsjzqou|wyzk\p|r}
zqmp
qwwml}~vzehj~raZx[ZrnNXrtg`Knwvb^\[Yu~spXg^fkq_oOXiS?Yg_[qkhzr\[YkeYcpy_h]^elhfliqxom}up{v
qq{|zyukzlp~t}or|{poyf¡gpgz
|ixrllf_aoym_boy\dlzaqv_deÕë¾3:>ryx
nm
u}
|xnvvmku{uey§}msux{y
lri~xm|{xbyrdqinvrutv~so[k}sx{|wypkpw}}smjvuu]iiyqZW~T[rfM[srf\Jryq][[Z^vviZb[gfocjNXfQ=^f]^vf_uq[YUodZdqz\h^`gmgjkipx}mjyn{}zu
pnw}{{i{}kt|r{sv}zx~|km~li|~}kuqgic[cgso`altahpzast^bc n]6[°¶uj~wuwpm
tyx}zsgv}|no
}hvynez
¥}m}t~{
|q|~|i~mk{yjzvr`w~rdrgvnu|}pwz|u~mWm}us
vtzwrmq}{|ymmhlun]hgurR\}O]r]O\spdVKtykXYYZbrva^]agdijfOZhNAad\`wa\umXXSubZeosXj_bhkgmlipw|li}|p~{zwr{oqw{j~{nxyww}x~~zm£
|vzkm
z}{~prpcf^Yg_pp`ahpfjotato[`djv{¿¨¥É¸r
t~ztrspzsutwyyqdwyhqufwvdj|}q~rx~w{lyzuh{ilysizv}h`w}kjth{jv|~~q|v|t~bUu{qr{pwxoo}|w|zsugpglrp]hctoLfwM_oVTZtnbQOuybRXX]bqt\b]ieeckdR\qIDdb\dq^\xhUWVx^\fniWl^ajgennhpwzniy~s{~y|v}pvsnw~q|xzzuxzuo}~{w|huz|vgpn`e\XfYmsaaaqllhn`siX^cmw©Ú©È³ryqv}{utu~vopm
txul`yyeqngun[m}y}wzl
tr{muwmhwem|vmjwv|`bxzhuvc~|hu}uvrz}mYVr}os
}wksxjt|y{wzq{rfsdmls[j`vfIooM\cXWVymbPSuwYQVX^ar
p]acmec^ocU^rGBf_^gi]Z{cRV]v[[gkaWk``nfflqhpvxtkvwx}w{t}oququ}
{wx|}
x|}}{~rvx{wuz^~zt
w{bnm\b[[aUjtd`[hopgqaqfW\ck|Êκ¢knonr
s~{
zytzutzjlvcvvog_|ydqjjqcXm{rw}{mop{yrrp~ghrcnxqjlqw}|y]ezxiuygwhu}sjo~xn}]Wp}ms~znnpvfv~~uzoyr
zxqeq`mkrXk_y]IplOXV_UV|kbOTvsRRTW^cuj]akkfcZobYcpGAh]ag_\V|^OVfqZ[jh]Xha_rfjhqgqsvynu{w~yus
pp{xwuy
z|u~}~~}|xvyv~}nuzdto
zucnjY_[]]Uhse`YdrrgrakdWZ_ix¾®{¸nbtiu}s{
{~wxswozvejoausjb^}wyep}gkk[Vox¤
pqwtlr
}yuspizajmamvjgkkywzw[g}|yfr~n
tfvpgk{tlub[nzjszzet|mpgt}v|~pzjyyxvodk`m}lnVjaxVLlmPSPiNY}hbOUvlMQTU_hwg^aqigaWi]]liJDjZbeWYUyZNWokY]le]Zec^tfleqfsptxp
vx|
}usnsy{{sr
y}v}z~{w|wvzjv~}m
sqpflgX][\[Tepe_XcruivpdebW[[hporsefzjvwtt
x
zwtvnkzpahkgtmg^_|oz|hlwfjdVWsp§}|vs{q{xlyzu{}uqsmhu]mi`ludgfizo{rYgvuhpxwcx
}okm{qfse`kxfpuy|auuikqtyoxwr{e}}}vumcd`l|mkVjcrTLklPMOpG^|faNVueKNTXalxf^gsje`WdXcr^LKkYdbVTUsVMYweZ_l`\[de_wgmboitoq~utxxz}v~
nrt|{uq
zut}
|~z~v{£¦y
lu||u{otz
}unjieV][[ZScne\Ybt{jhmh`aW^Ziikphmbi{zkuuupz~wvn{hjyj_enhwgeXavi}ynioff]UXoh¨wz|xtn}mqtx~wtvjswhio\me^ns_gbjxh{m[mstjo~zxbw
zsrpzrcqh[mudnqzwarogixsqkwvsuby}utocbbl}|kkUibgTLnhPHRlEayfbMTr^JMUZfmy{f_mqjd]V`VooXKTiXg_YNUlTK]z_\_l]][be`zhlanpvnowuz}wyzyz}qttzvt
~}ls{
}~{u¬zlrzvuoo}tjonedX_ZZZUbjg\Z_ui^ml\aW[\kert}jj^mxwhuxso|~~zvslzhiwg]dsgzwccTdofvvfhiaWVYhd¨owzpo{fwmyzvq~ndwtehi]lb^pp[g_muezh]tnrkq{vvdu|xru~taplXpqanozscqk`lznihywspdtxxtoc`cms}jlTi^_ULucQGWbGcwfaLTqYKLXYimw{eenrfcZX^YwfUK]dXiXZIWeQIcx[]_m[^\bd^ij`ntxmonvyr}~uvx}tuuyzz}
jt{}~
y{~|sq®||~fqzt~}wspm|~mzcppbe]eVZYWcfk`]]thXpm[^XZ\l{bqwvmc\ntuivwrnyzwootehte[gufvvy_]Seejs|abi\TX^cd¥iyt
xlmyfwl{ytry}yiewm`ga_k`^ukYf]oobze[w|knopxytufszvor}raxcYnn`opzseqd^muhcfxzrlmsq{qpa]dmo}eiThYZUNy_RJZYHcudaJUnUJL[Wjms{dllucaYZ\bw\TLd^YjTWHYaNHjvX_an[[_bc]
ihbnxymojvyn~vuttqvvw}}~~px}yxy~ssp¢{{yeuzsywltply|ps^poagblT[ZWidmf\\reSrn[YXW`lvcjujj_[nusnutuk}|wonldipc[krdtvs\WTd`q~q\ac^SZa\derq
skjxlnnyyzqvs{z{dfvh^c[ah\_whWb^phawa[|vjjrnxttujr
vsjp|mfwW[ilaoqyseo~Z`ppa^io|kjr}povjp`Zdkm{agTgUXSQw\RPYRHdsb`GVlQIPZUklk|emora[ZXZmqXSPgXWiTUGZ\OIsuX`cncXaaa^jcemzyloivy{k}
|y}mqovz}t}tx
utpvo¢t{{fwon|pgxq{lsvsk^tobgfkS^\Vhbll[\qdNom\VWUgishctee^Zpvprvvzl}}wscdkoa\nmcsxkZTVbcw||p\c^cT[`Zccnp
rifyndruqzkytuo{v_gsd\_WbdYbueU_`mdaq]]~ohisqtquwmm
|
qrgn|oqoRZeidprusbluUbqj[^nd{dku|pqqim_Xcijx^fUdUWQVoXQWTPHer_aFXkOIYTVnid|ilykbW\V\ueTRViRYgUTIZ[PNyw[_emjZba^^nbglzvnoivv~m~{krgt{u~s}
{ss}un¤swxnz`e}qgztymmqwgd|mdgghS`_Ug`lo\^nhMil`UVSogskfxef^Zrvot|ytn{w{zkaelm^`njeqy~gZVX_lx{zo^a]hVX`Xdbkp|vkjvl[upjyiurno|sYkn`Y^VcdYeqcT_biablZ`~kfltuomxwmi{mqfp{lqlaX_gfnrsr^ilSepdUbmaxaotztinkj_W`fhu\dVbVTOYgSO]OPHep]cGZjNJ`KXme_xioe`U^T^v\UR`gP^bUTK\ZQZvv]_fmhXca[^qchjxrsmgvsys{~|yntlst
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~?/1110/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDCGdhgggghMBCCDDCXhfgggfo
}}{{z}~||~}}}~}}~~~~~
-hS7¤¤¤¤¤¤£r]____aR4555549\`___`aA565554Ma____^j|}zzz|}{|~}~}~}}~~~~
|y{z||{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
~|vvx||{|}}}}}~~~~~~
~wxz{zz|||{}}~~~~~~~}xyzyy{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz||||}~~}}~~
zy}{{{z||||~~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}~~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~
rtx|||{||}}~~~~~~}~~~~uxrvy|}|z}|}}~~~~~~~~~p
|ussvx}~|y}|}}~~~}~~sorx
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~wm{sx{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~
sno{uv
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\YXXWTPQRSRSMMJIFEHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwtb^d_blqfhklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhb]jl]ffgeccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHIJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^ZZjwmbnrjaYY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROM[krlamurfQQSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMN]cokYisupSMOPPPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKFBFHUbhkopomlZLLNMNOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHECFGHMZghgrnnhfd`^^XLJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>IZ]Z\elnkommlkihkdSGEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;=K[imnojomkilmfQGEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;:=HcosmnljkhUC>CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtstrqtxxy}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99=J`stpgT?:;=@A@=;;><=<@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyz{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;==><:Bl|j?9;>=>?@@@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;[n@>DE?@AD_d;==;:=>AA@>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJGVppqssttuyz{||~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8::mwI8;:=>A;Hd=<=<8:;??=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR<==ILFEuvN788:;>?WjA;<<::;>??==9:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;\z|wW<=?==>EhtL:=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAGrykb}^>@C@@=Js{Y:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Eot}~}vMACE@?>Y{]?CEIILQMMKECFGGEGEEEDECA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEDCWu~XGHJNiZOPNIGIHHIIHHGGHHECEEEFFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqruvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHKVs^VQKHHHHDGGGGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl|PJYne^]TGCMF@@CCCCFFEB@>>@AA@BD?>?DFHDFGIJIJHHHGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLKJT
uJ`baaceSNX<<<>;:<AA@><998<<=;>;8;?AB@ACCB@AADDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJIIe
qhhgegifhF68896479;<:8567789787588;;;=@;999=<>;<=ACEHJMLLGIGORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIh~xmlihijY5655873568:876565676767:67889:7578979776:<@GFIFIFEFOSRSSROPPRTepqsttvy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@6788=:=ECBe
vmmmllU785688557699776765:9:::;798987669:98868589;A=>>BA?AKLOQPQOOORWkqrttuvz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=q
rnoope@>:;;<9:;9:;::9;:9===>;;<<:>;9;;<;<;9:<8::::999<?<<ABDIJMKIKLWorsusvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
rrqqcGFCBAB>@CA@>=>>@???@?@==?B>@A?@?=@@@>?A<><;:;:9;?=;<==AACABCAXpqtttvz{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
~rsrSKJKHHHEFHGECA@BECCABCB?@DHECECEDAFEFDEFD@B><@>=?@>?>?>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFW
{zt^g]PKKKIJJJIFDDGHGDCEFDBHIKGHGFHGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGIY
{x{ogUMLMJJKHKGDGIHIEEHFFELLMIJGGHIJNMOLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@88<;;=:>@>?@CFIIP_
xrURROMNKIIFJIEKIGKJIJGGGKLNLLHHIJMQNPNMOKIGIJHIDIHHFFGGIGCBACTnpuwwyzxyz{||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADHJLUq
s[VTQQOLKHGCHJHMLGKOLKJJLMLOPNHIKLOQQPQOOJHJJLJLFGHGFFIFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|\[WVWUQNLKEFGMPOPWUQPOQSRMSTOMSLPSUVRSRPLJMMMKNGGJFFHJEDEEBECcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B@BBGVNFNPPTX{
l]ZmbGUSRQK;;STS`u]UVTVYYRXXRZfPUWZ]RTWQOMRQPPQKKKHHJHEFIIIHIirvyxyxz{{|z{|}|}~}}}}}}~~~SHJIHGGFE??AAEACGEDELXRMTUVXZ|
~ao_gX<YZYTQ?@WVY\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXUTVTOOMJLJIILMKOMSosvxyxwyyz{z{|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~{qrZ]]\SUSWWU[ZuYU}a\X]_WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
nh[\]ZUWUXSRXVcRerXZW_hP`f[[X\gaGOZhg][\]]WROSPPRVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQPRRRUSVTW_ux
~}_SWZVSVTRRMPMLfz[]TYUV]ZLTZUST^ZXWWWzkX[\\^TQQPINOWVX[Zdprvvttvxyy{{|}}}~}}}~}}~~~zxwvsu{tk~kry^[VUSROKFCDAM^lVRSNOQOQURSRRUcdv
~zorYLMPPMOLJKEFIFC?TdURQQNKQTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquuusswzz{{|}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^\YUPLILIaltPQSNQRQR[RSRQRUTbs{|}{{
v`^NE@DDDDCAEQCEAC>CIGV@HNLG]iPHFNFDEFIGHBDHGIKGDBAD@OQMRdrtvustuz|{{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTSOV`klrv{{xytrnstsyx~lNHAA<<>@A@@?kQK`EFHIEB?GLNGMQUIAE??<=<==?=?ACC@?==B>JNGUnutustvx{|{||||}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNKLQRQTVUWQQWUPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeDBAB=;CCBBDB\]O{NOONKLMOOQLKMWMHG@A<977599=;;;8:8:?<BH?\stuuuvwy|||}||}}}~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP_\ZIHPRQOMPQNQRTVXSSYTOYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHGHHCBGIFFEDMRPaWSXQPSSRU[OOQVPMIDF>:96587979:365795<C>essvwwyy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`VW^ZXMKTTSPQUOLRSTXXTTYRMWYZVXXVXY]WWXhsk]Vaskba_^da_^YUQNOOMIHJLJIFCQPS[WTTNQSYS\eUOSTRNKIHC?A999897885757859:Gmrtwxy{{|~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTVUUUWPSUWTUR]n^RNZ_[VY;DVXT[fJLPSRONMNNNLJFQPUYSTOJOOUST\VRUSROMLIHHF?><:787659967675Wopswyz{|}}}}|}}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpofedc\]RTZVWUTWTRXXYYYSUOJGOPOOMRJPPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPSMILKORPRRSTQROLMKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHKHFLMPMG/E_R>3?>joaSRQ@GTQPQPQNQOQPLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptuy{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]gTQSAGUPOQQPNMNMKLKLNOOQLOOMHLLIKKLKGFFED<AA>;@E;<89Sprtx{z{}{|{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTXWULLKI<987;>@><=A@B=>EHGCEFIGJJ@FAA@FHEJOHQRb\QPROSOOPLLOMLMMNON[WKMQOGIHCHJLLKFFFE?BC><BG?B?Adpswzzz{|{zzw{wy~~|{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCD=9779?B>;?B@@>@DIECGGIGIEBB?>=CBAGIDMObeQMONWKLNKLMMMLLONSdNJLRHIIEAHJLMNJGIGBAB@?EFEHDKnovyyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGMMJMPMPOHJD?A=98::?B?<ABAADEGKFCHIGGHCC?B??@A>DECKNRTLJIMTFIIJLJKLIJMMOPRPJGCLGCBJILMONIJIGCCCDHJMLIYrmwyxz{zy|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqGKDGHHGJKIJKDFB=>=99:;@B?=ABCCGFIKJDIIFGGCC;A@B>@@BECIMPHHKGHKDHJLMHJLHIJLKM]RHHDNFACJJMLPMKMJKFGGJNNQNLbmivvwzy{z}rmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKDFEGEFFGEGBC@><=9:::@C@>ACDEIEIJLFIIGFFDB;ACC>@CDCDGLNHKNHDHEILNMHILGFGIILNKIGENHBFMKMLOMMNMKHHIORRSNRfffqosxu{z|lhjnekqlspfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGIDFFECCCE@DB>?>:;;=:=>CA>ACEFJFIHLHGGGFEC@=DEB>ACCCDGHIGMPJFFGKNOKFHIFEDEIJHJIFHOKCIMKOMONOPNJJILRUUROWd`amgproryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHEEHCBABD=BA>A=::=?;=>@B>@BDGJEIFIHGFGECBAAFFCBBBDEDGGIFLQLIOJJMLIGHEGFDCIIHKJGKRMBNNMPNOOMNOKKKOUWVUSX_^\iaminhrsbeffdhhfnjfmmhkkmriqvtsqmvnoqrswsrstuvvvvwvwwvtwujsunutsqrjksMGHFHBBADE<A@@C<8:=>9?<?B@@@DFHEHFFHGFFDCECDIECGEBEGEFGGEJMKHQMJKHHIEFHHECIIIKMKOSNDQRPPQNOMNPMLMSWVXXUX]Z]d`hbjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqinyMHGHHBBBFE<?BBD<7:>=:>:@B>??CEFDFDEHFDECDEFGJEEJGCGHFHGECFJJGNKLKHJLFIIKHEKKLMNORTOHSUSPROQMNQNMPWZVZYVZ]YXa`a`^hec`dfhgjhhifhnllnmqpiuuxrrpupppruvpusuwu{~}xvtwvvvxplupmstnprrxNHHGIDBCHE<@EBE=89>>=<<AB<?>AAFCFCDIEDEEFGGGIFGKHDIHGIGFDHKIGKHMKJKLHLKMKJNKONORUVOKUWSPSQRLOQPOTYZY\ZY[^^]`c^\ackb`dggr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptLIKIKFBEGE<@GCD@:<?@?>?BA<@>AAFCEEEIEFEGFHHFHHIKJFJHHKHFFLIHHJGLLMLLIMKNMMPLPPQUVWOKVVUSSQRLORRPV[[]^[\^__a`ad]c`ef`ehjdssfjggkorqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGCEDE<@FDDC;??B@@@CA?B?ACHCFFGIFIFGDIHGIHJLHHJJILJFJKHIKJGKKMMJJMMNNNPKOQRTXVMNTVTRRQPMNTSRW[]^_]]`_`aa`acebdhbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvnwKLLLMGDCAD<?EEEC=AACBBCDACDAAEGCHHIHGJGCHIGHJFILHIJMKNLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSPW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@DBEDDFBCEGCCIFCHJKIIKGDKJGHJIIKHJJNLOKILHJLKZfJd\KlSHON_nUks[qpbwcSPavuhucav`Xnqbdvinzf[lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDCFEDFBFFGDEKFFJMLKLLGGMIGJKHKKIKKNLMLLLILML[sbdp^lmUMNfs]ffqlntgpi_aYnnbppbkjjfoqtetno\ougpMJqyvka`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIHGED?AB@>CFGBFCFEFEDCHHHDEKHGLNNLMMFJNHJKJILJJJKLMNNMMJMMN[roonpplkMPQlWMibtrpamnu\YlP\nmZqmkomxxtsip]_rkqjUuyxoc^kfbgppjjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGGEEEBBB>@@FGBGDIFEEBFIHIEHLJGMMOLMNGLMILKIJMIKJJKOPONMLNNL\hdu]lqWlNPQmTYk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadiuyknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHLFIDEECAB=BACGDHGLHECCHJIHFJLLFNLLSRLGLLHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYrkgooqqomt]nXat_nopoqronusttj[^tcwxrjnzhaacfbbimtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEEEAA>DDBGDHIMIFCFJLJGFKNLFOJKWRKGKJJNIHJLIKJHHKMMMMIKKKSkc[i^_icrrZ_Yjn_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrvtwrGGFIDECFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJKKIHIGKKKLGHKKLMMLJKMNT[\TPTLPONOOVQOOQNOQJJOPQdqiTYW\[\VY[]X]\\cfaaebcf__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFEAEC@DHDFGCIKLHFDGKLIEGIPKLOKLWLIEEHIJHIKIMJHFGGIGHIEFLIJLOMJP\W^P\[`^MXYS\\b^MXZMXaRKYaZR_d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBDCBEIEGGFKJKHEEIJKFEHHPKMMJMRIGEAHFJIKLJLJHFDIFDFGEFKHCJNLLU_Y`X`a[`TXYT^^Z_RY\P^\YN_\^SZ^c^Z]`c`Y_c[`^[TXWY^]cbcacehekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCGHFHGHKJJIDFKKKEFIJNKNKHLNGHE>GGLIKLKKKIGDHDCDEAFJE@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQXUU\Y]c`__cdbhomnllllu
yu|
}wrrtxyyyy~}yuyvvrnzwvxXQKFCGEBEGIFGHHFFIGHGHKILDDKKNMLKHKJHIF?GGNKKKMKKKIFGCD@DAHIC@IJHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTQ[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFDFKJFFFHGGIGFFILJNFDKKMNJLIKJHHFBHHQMKKOMJKIGGED?ECIIBBGFET]Y^X_Y_[]UXXO]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAHFDGMRHCQJEGHHEFKJMPEFIJKNLLIKLIHGDHKQOMMPLLJKHICDAEDIGCBGFDWUE\T]SV_XOTUNZZMIJT`a[_X^^a]OYa\``_bcb]abW`_TPOOOWQ\[[\\^_bffeleoow|{{}
zo
~INFDFFHDIRbPCV^IGGHDFMKPPEIIJKNLKKLKIJGEJNQQNOOMNLMHKADACDGECBEGBMHBKKOONLFMFGIJHGLKMOPILOPOSOLPSRUZYWYXXdWOSTPPNMOTSZXXZ]\`adecgcklpsryy{z
~{}{
}KIEEGFGDKM]LGGXLGHJHGMLQQHKKKKNMUNOJJKGGKPSSNPONNNNGKF`ED_LEfdEN\I^[rmOMUmYLDP`UkWgJ]WU^DLQULLSVQRTXWTXUT\UPfZhhdXRjRVUT[\[``abab`fhfnkhrz|}~}|zr{z{
~z{LIFGFHEEKOSIJF`THIOJIOMRQLMLLORUROOIKMGHMQ[YOPPNOOOIJQQI|YYrtYQmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[_VVXjtuu^_v^Wa[[f[_`a`a]`agmpl`pwtx}vxzlv~tx}|~|z~wwNJEHMNBDLLFIKERVLKNIKRXWQMOOMQTNOQOKKNGMPS[ZSQROPPPJHZx]TxehZSURvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essorr{|o~xnr_``baZ`_gknkblfgmw~~{xwtvzir~ns|~wx{~x|u|||ssNKG`]GAEMMHJJGJPOMMJNV^YULQSNXZMSSRNKOHQRTYWVPTPPPQKHgxlcxrm[KNVypumubovPeeJfvqmwojfxxiWrQhzmijzz}lxzohoYvvjvup_rf}ilx|o^__ba[]bdgiidgbcdllppstsssyqrxblugqy{srvy~suzn|}yxroNKSuNCBFPPHJKIKPOOOMPZ`ZWKTWPa^RVQYRLPISTVXWWOUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^]_ddiggee^abiiijknokqomjpacfcowxompsy~nqpk{ztsomLL[VHGEGRPILMJKPQPPPPW\XUMUYUeXRRY^SLNITTVWYWOSNNNRIRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_Zpz{^`zscroxqhd}ir|^TLl`vukiu{zm~xk|p\^^b[^bddgeeebZccikkrsrvglihdg`akagsrlgmmr|kmhk{tmnkmOHKKHJHHQPLNOLKRRROSRWRVTPWZVVTTTa_PNMKTSTQVVNNLMOPKHQNPULKLSTTSTPVUQQNQQXYRNPUTXXX[[URSW[WXXZOSUWXXR^YW^VTPYRWWWWX^Zgr^[[Y\]_cZ_ccdfdccbZcbgfemnmueegcaf_]g`dlhfgkhpzhggjujhgilQIKLLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYWOOLMVTQNUSNOMLQPLJQQKQMKLPRUSQRSSIHLNOQRQQQTVRXW\WSRPRTUVSZQNSRXVTYVUZVTRUTTUWXV\Y^`]\ZZ\\_c[]bcdfdddaY`acabhhimbad^_c]Zd\bma^fefmsdigjkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSPPJNWSPNUPNQNLSPMOUSNRNMOQUQUQRTUNKMOQTTRRQVWUYZ[YSURTWVVY[TPTUXUUZUWZVSRWVUW[XZ_\UX^\^][]aa^[bbcgfedbX_ab]`gdfea^_]]^ZZ`Z_g`^]]bhkagfhfd`bcbOLMLQQLOTOOSQOQ[YWWX[YXYV]jdVXYZWVSSOJNVTPOUPPPMMRRPRXTQQOMPTVOXRTUUONMQTVUTTRTWVZ]\ZVVQQVXV[[WQTVVVVYTXXVSRYWVZ^Y]_^U^\^`\[____ZbbdhgddbXa`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQOU\ZZW[[\XZ[dqmhd_[XVUWQLMVSMNROQROLQSRUZUSPPMQXWRWSSSXMOOQTXVUUSUYX[^][[VQNUVU[\WRSWVWXVTY[UTRZXW\^Z^_`Ua\aa]`b_\`]cacghdf`Yc`a__ed_`b[Z\[\YZYXW\Z\[`^_[^^a`^b\Y`[QNONVQPTQOTTSPW\\\X^\^V\^jqwyc\[UUWQMOVSNQQORTRLRTTYZWUOROSXWTSURRZOPSRV[VWWSVZX\][[]VSMTUU\\WRUVVXYSUZ\USS]XZ]^\```Va[cb]ad^\bac_cfidf^[d`a``ce_b^YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUTRQWRTP[^^][`\`U\]hjr}slg\TWWQNRZSRQTRTUTKRWV[ZZSOSQVVVTOWRSZRTTTX]WXYSX]X^]YZ]TUNUVW^[YRUUYYYUWZ\VSW^Z]]`\bb]Y_[ea_dd^^cca^efidf^]da`aabd`b^XZ_[\[XXXWW[Y[`\[[\[XZ[^V^Y]QOORZPZTUVVSTT^^`^^b\`U]^bkytl}kZUYTPPS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[YUZ^X_^Y\YQWRYXY_[ZTUVZYZWXZ]WU[^]^`a_dc\^]]eabfd^^dc`\gdhedb_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SNPVYQ]UVYWWUX__aa`c]_T]_beeuzhWYYSUSV\XWWVVW]XOU]Z^]\TRWSWWUSTXRSVTXWX]^X][V]_X__X\VQXTYZZaY\VWX[Z[YYZ[YW^_`_cbadd\b\`fadfd^_dbb[fchecf`f__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNSYVS\TVWYVV\`abc`c^_V[`da_zuohY[YUWTW[ZZ\YXY`WPU^\``\TTXPUWVTVWRSUWZZ[_^Z_\V__Z]^Y]URYWYY]bZ^WX[\[\[[Z\ZZ__``dbcddbdYafcffe^ab`c^bcidcg_g^abcaa`^_XT[ZZ[[X[XX\[Z[XWYXW\[[`]V]]SOVYVVZUXUXWX]_badad`^YYadb`lfh^[\ZVWXY\\]_[Y[bVTX^]ac\RVYPWWWWWVSUTX\\^``]`\Wa^[^[Z^XUXW[[_`\_XY\\]^_\[]Y[`a^`ecdeefbXcedhgd^c``ec\eidei_f]cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWYX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cYZX]`cd_RXYPWWXYYWVWV]]^`a`_b^Ya]]^Y\^YXUW[\`^]_ZZ^]^^a]\[Z\`b_becefefbZdffigb_c^afdZihbfice^bbca``_]]ZX\YYXXZXWZ[ZYWXUU[]]]``bbxKXW[YV\[\]ZW\]_`bdaba]`Xbcbacab][\[XW[\_]`_][`d]\X[becaR\ZOYXZ[[ZWZY`]`bb`ac_\b]_][^]YYTX]]_`_`\[^^`bc]\X\^`bbcedfdefd\efgifcab\cg`\ihbhied`baca_`_\]\Y\YXWXYXW\ZZWWXOXZ]acffrkJYW\ZZ_\[^\X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\^^^YXU[_^]ab`^[`abfc_]T]`acddfegeffe^efhhgdd`[fg^ahhbhhfc`b`cb___\][Z[YXXXVZV\[ZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{zzzzzzz{{{|{{{{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{zzzzzzzz{{{{{{{{zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½ÌÓÒÒÒÓÕ³ÖÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊÝæääåä祿éååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxxxwwwwwwwxyyyyyywopppppprrrrrrrwzyyzzz~||||||}
~|||||{
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuyvvvz{x{xwvwzwyzz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{yyyyyyyz{{z{{{zzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwvy}||zy|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwvz}}~}y{zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwv{}|||z|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzyz}{|}z|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyx{xz{yyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||
{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{{|||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqqqrstttttttsstsssttttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttssrqqqponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssrqqpponnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnnnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrsssrrqqppppoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnnnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqsqrrqqo|oppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqqqpprqpsnpppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqq}¡oro|oppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqrqu¡vqw}oqqqqpppppqqqpqpppqpppppppppppppppqqqpqqpppqppqqqqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrq¨o£~pqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssssrstr©¤y¡|rsssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~}|vvwwvuxzxxxxxwxyy´©¤§©}{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{|{{¯¦¡µª¬£~{zzxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}}¥¢² §}}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~ ° ¢~~~~~~
~~}~~~}}}~~~~~~±¡
|~~~~~~~
|||{|}||~~~~~~~~~~~~«¤¤¡}}|}||}}~²¨¢ ¦¨¬¨
}||~~
±¦ ¡¤£
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{
~~}~
¡}~
}}}
~}~~
~}~
~
£«¢
~~¥¦¦¢
~{y¡
~}}}}~}|{~
~}}~~~~~~}~}}
}|}~~~}|}~|z
}}}~~}|}}{{z~
~~~~~}~}~~}}}}~}|z|{~}~~}}~
|}}~}}~}~}~}}~~}}}|{{{z{{|}~~~~~}~~}|~~~~~
~|~~}~~~}~~~}}}}{{|zzzzy~~~|~~~~}|~~~~~~~~~~~}}}}
~}}}~~~~}}}}}|||{zzzzy~~~~~~~~~}~~}{|~~
~~}}}~~}}}}}}}}}|zzyyy{
~~||~}~~~
}}}}}}~~}}}}}}|}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxxyyz}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yyy|}~~
~}|||}}||}}}}}}}}}}||{z|yzz{|}~}{||}
}
~~
~}}||}}|||}||}|}}}|||{z{|zyz{|yy}~}{|~}}|~||}
~{z|
~~}}}||||||||||||||}|||~~{z{zxz{{|}{~~~~~~}|~~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||}|yz{{xxy{{z|}}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{||||||||||}}|{||||{|||zzy{|z}
~~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}
}~}~~~}||~}}}}|{}|~~~~~}|~}~~~
}|||}~{{}w~vx~}|}|}~~z~~|~~~~~~~~~~~}~~}|~}~}}}{|||{{z}~~|||}||~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|}~}}}{{}}|z||}}}}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}{~~~~~~~}||}}|}}}}{|~~~~~||}||}|~~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~~~|z|}}~}}~~}}~{{}}}|}|}}}}}~|}{}|}}~}~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~~}~}|||~}}}|}}}~}}~~|{{{||}|{z{{yzzyy{~
~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~|}}|}}~~}~|}|{|}~||{|}zzyyyyz{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~~}}||~~~}}}}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv}
~~}~~}~~~}~~|}}|~~~~}|}}{}}}||||}{{{|{||}}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{}~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}~~~~}}}~}~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~~~~}~~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{sy{|pwuvwyutz
}}}~}~~}~|}}~~|z|z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
|}}~}~~}|~~~~}}z{{||}}|}}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~~}}}~~~~}||~~~~{{|||}~}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z}y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
}~}~}~|~}~~}~}~~~~~~||||zyvyyzyvyv~|{{{~}{}~}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}~||~~}~~~~}~~~~}~~}~~~|}||{|uyyxxxyw{|{{{
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~~}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~||~}~~}}|~~~~}|~~|}~}~~~
~}|{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}}|}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~~}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxzxy|||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z||{zxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}{|}xxuxxy{||}{||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz|||||{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}z}{zvzxy{{|}}{|}}}}~|~~~}yy{zzzysrtowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxqytvxtv{~
~||}|x|yzyz|}|{||}}}||{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||~z||}}|z{~~~}}||}|vrvxxvtvu}
}
{||}zz|}}||z|~}|}}~~~~~|}~~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~~}~~~}~}~}}~~|}
~
~}}||||~~}}{|}}}}}~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uz~
}y}~{
}~~~}{}~~}|||}}}}|}}~}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r~}}~~|}}}||||}|||~}~}}}
}p{pyv~nypus|vyyrpvxqvtturstvinrotvnulwmzsnym}rsvsvmnwlpylu}~|~}}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoolw}xpqzprtfu~n{ysoy}~{~}~~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~z~}}}~}}~~}~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwpy}}m}uo
zrr{|upozks|nv~~}}{}{|}}~}~~}~}~|}~~
}w
~~{|{~{|}~}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~~||~}~}~~}}|}~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}~|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}}|||~}|}}|}{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~||}}|}}|~{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{||
z{
}~~||}}~}{~}|}yzzy{|}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}}|}~}~{~}|{yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~|}~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}}}}}}||}}|
~|~~
}~~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z||||~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{y{zyzzz{|y{}{{~}}}}
~}~~~~}}~~~~~~
~~||~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌÌÌËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;>BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=<>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9><>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA=366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖËËËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<;999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNG¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËËÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××רר×××ÚÛÚÚÚÚÚÚÚÛÜÛÛÛÙ×××××××××××××ÖÔÓÓÓÓÓÓÓÓÓÓÔÔÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;@<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMMF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËÌmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´»¹¹¹¹¹¹¸¸¸¸¸·½ÓÓÓÓÓÓÓÒÒÒÒÓÓÓÛâáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃrliNSbLLVM<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKPFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ËÍN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤XRSSSSSSSSSSSOw¨¤¤£££££££££¢«ÓÒÒÓÓÓÓÒÒÒÒÒÒÒßëêëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËwliJN_MRUM><<7;?C>6:7>?;=B@9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ËÍR,11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦\VWWWWWWWWWWWSz©¥¥¥¤¤¤¤¤¤¤¤£¬ÒÒÒÒÒÒÒÒÒÒÒÒÒÑßêêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<;>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÌÎ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª¢fabbbbbbbbbbb^©©©©©©©©©©©¨°ÒÒÒÒÒÒÒÒÒÒÒÒÒÑßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9::=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÌÍÄÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÎÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌËËËËÍÒÒÒÒÒÒÒÒÒÒÒÒÒÒÔÓÔÖÖÖÖÖÖÖÖÖÖÕרØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8:;898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÍÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÒÓÏÏÏÓÓÏÏÐÓÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oVJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÒ«ÏÐСËÓÇ«ÑÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==<=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒ¶¥£Ö§ «Ï¬²ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏι¡´ÍÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>><<96?B?B:648:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÑ¿ µ ¨µ¿ÉÅÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?B:74:::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÓ´ª¹¦ ÄÓ¡ÏÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<=<964:98::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯Ê £¿Ê¥§ØªªÔÏÏÏÔ«~£¥ÇÉØ£¿ÕÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ×××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>9<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÔ¬§¤»ÍÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CGDAA8;?<=;<<7558968;:9<:>?<<=9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÓ¶²²¥¯³¥ÐÛ£µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHFE@<<>><==<756:96:;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÄ¢ £¢§»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==:::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸« ÇÕ¢«¤¾¨¡£¨¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFRQKK@>=D<?CF=557;96:;:;=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓÈ´Ù¯¥Ô¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUij[L_MJLJTLFB<<?FEGKI=667:979:;:;=9>98:8;=>>A>=9<<:=>>;=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÔÈÁÕÒÕÀ½ÖÔÓ¹ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?ADLLA>775:88899:<><>7::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÑÓÔÒÒÒÔÕÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ==786977899;;=?@<<89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<AA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDKIMKFIE>BD88867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCDECALH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÔÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HQA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD;:<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDE@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<877966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<::;868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8:87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;99:86885668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßá mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
¼ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9768579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9886553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿½¾¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956535658756578;><;999:8779769=;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455588686<:9<==;:86688:767>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPF>8;728967443588797;9:==<::974:98668?>@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269664737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³µµ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶······¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬«««¯°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:9358963:=>@?@:@BBB??@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·³°°¬«ª©©¨§¨©©©¨¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<699367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¥¥¥¥¦¨¨§¨¨¥¦¨¨§¨¨§¨¨©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<>::A<7<8378837;@??@@:BEC@BDCA?;;@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬¬¬«ª©¨¥£¤¥¦¦¥¦§§ª¨¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡ ¡¡£¥¤££¤¤¤¥§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°«©©®«¨¥¥¦¦§¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<?=?A?<?BC?BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥£¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢£¢¡ ¢¡¢£££¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>>;:99=7669656>B>>A?=>CA>CC@@;@?BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¤¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747578;=8::99;=;;89>6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899898=;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡££¢££¤¤¥¦¦¥¤¤¢¡¡££££¢£¥¦¦¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¦¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364689:89788:=;<9;;::67899>?@><=@>@:9@A?=A?>AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡ ¤§§¦¥£¢¡£§¦¦¥££¦¦¦¦¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢£¥¤¥¥¥¥¥¥¥¤£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¥¤£¢¢¦§§¦£¤¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢££¤¥¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:865846789=88;:;?;:;<:::7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¤¦§¦¥¥¥¦¥¥£ ¡¡ ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¥¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢£¢£¤¤¦¦¥¤¤£¢¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8687>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££¤¤¤¤¢¡¡£·¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££ ¡¢¤£¢£¤¢§W^]TW_nk ¡ ¡¡ ¡¡¢¦¡¢¢¢¡ ¡©¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA==;::;;;75;86;746::>;:=>>=;;;><:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¥¡ ¡¢¢¢¡ ¥² ®fx ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¦¬ ªD ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<=98;8:;79:589;=<9=;=><=>;??:9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢¢¢ a¨£¡OH ¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;BC9<??;:97;8887489<;<8;;<=:<>9?A<:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe §j\¢ ¯rJL¡ ¡¡¡ ¡¢¡ }xjabb\Q<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¥Sw¢ £_WN¡£¥¢¡¢¢¡¡ ¢¡ ¡
wqgjd\\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢ \`£eZM¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[[LF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡]^u¢eZM¢ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<9=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ab`~tcUO¢¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799:=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y i][c}i^PS¡¡}
£ª¡¢¤¢ª±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998:9;<:>=;@@;<B<@:847<;B@AB>>;CDD@CC=>>9ay}{
kxvwsq}r ¡ vnfVy[TPY
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::8;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v¢¥¦tOPd
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8::@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
¢|f¥{ct
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974869388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~~£ylQsXp{|~|
¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:8758885979:=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
}uSKKs
L^oqw
¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:=88;:9:<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~£P0/;xvu@B[jn¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?:<895875795:::9<8:<=:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢§cC_K<xxifG16Wmr ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FC>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©ª®Ixª~@|xebQVcJ^o¡¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GE>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¦©§¨¢vcÂÔ¥E}xOmxVb£¨§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@DB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§ª©¤§§¤¥£¢c»À®|¤£lI\{pRt£¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^edlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;@AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢ ¢§¡¦®¦¦l¹¬Ó£´¬\M¯Ue¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡¨ª±²¯«££w~zsÑİ£lV§®f]¦ ¥¢¡¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\U\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¡ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯··µµ¶²°m˽¦tVmwus¦ª§¤¡£¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²¸»¼¼ººÂ¹µ´vaVµ»¦§xmrpxyz}¡¦§¬¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvkqhiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ¸ÂÈÎÒÐÌȽ±£peRD
}xrofekhkqsqqrt{©ÆÆ»¢§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSaiaftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃÅÇÛäãÙÉ»®£rYZQDfwjntnkeeYX]X\bijheak¸ÁÀ¹©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ¾ÌÐÔʹ¦p\QTKD[f^cjebah[UYTWYZ\Y]y¸º«´²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklgnvrrurg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅľÃÁÇËɸtaTOOSH>_l__ecb_dbTVWVTU[y¢®°ª¨«¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxoyjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄù¸ÃfKDGKD=Zdbbjda\d_XSPPR\¶º¬®¥¤£¨¤ ¥©´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{wnkihvZgrxszgg^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÄÄÂÄÁ°SGME;KZ_flg_\`YZTOY§¬¸µ²¬©£¡©¬§¬´´¿Ã¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyvvefjjh^konyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇÂÇq\H??D^bakb[XWSY¡¹¿»¼º¼¬¦©»º¹·¿³µ¸²Áƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocahvhjjtnyl^d[U`YLHD6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÎÆÆÆÀ¯zUN/VTWhaRNTz²ÉÈÂÄÇÀ¼¾´°°°Â¾¾ÁÆÀ¾·¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r}xpg`kjwmifvotc]cUWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÂÂÂÃÁCNyVPyÍÓŶ¿¿À¿º»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyspfegdlebknoo_Y]WVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ¾¼Ç¦ymr´ÌÈÇÑÁ¯½½¸¹»»¾·´°¹¾³¼¾±¹µ¸¼¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}zxnfaebacddjcgd[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÉÏÀº¿À¼»Å½ºÀÄ¿½¿®pa|ÑÅ¿¿É¿°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±··¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬¬§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ §¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdacchkggjfj^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=96<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÔ¸¿»ÃµºÇ¶µ¸º¼¸¹¶«¥|É¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¡¢¡¡£¢ £ ¢¦zyqmeegpjelhYYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÃv¨Ì½Ç·¹·¶´·¹³µ±½ÉÅH|ʾ¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~}knqgqktfcn`\UHKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄ×s»ÈÏÂÀ¸®´´»½·¹±½ÃÊDvÍÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljnuoydhc\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÆÉÑps¬ÑÑÌÊĵº¿ÄȾ¾´¿ÀÀwQoËÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tpmltlmo`c_bbNHN?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»ÅÑú¾¼Ä¾·¼À¿ÉÏÇÈÊÉÁ
qs¥ÌÌËÍÊÆÂÃËÎÁ¼¸½º°ncc¼ÈÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qd\_`_TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»«Ûþ¶¾À¾¾º¦©²¶Ã¿¥xuxÄÆËÈÁÃÀ¿ÉÊÁ¿»¹± |rk®ÈÅÄ¿ÀÁ¿ËÇÃÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¤¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp^\_]ZRFEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Ä·mν¶¹À¼¬}nhnmrsw|½¿ÆÀ¹À¼¾ÅĽ½¸±°|ÊÂü½¿¿Ãÿ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmu{poj\`aZTQAFIGK@ECI<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀͲv³½¶µÂ¥iZ^`MR[Znsw¸¸Âº³»·»½¿º»»®¤~ÀÄþ¼¿»»¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶¼´±¬£¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvwnra_f][UJ=??GG=GCC9:5;99><<9:<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɧ
x ¯µjegVY`IIMPSlw¥°·¾¹²µ²»¹¼¶¹¾´¥ q®ÉÄÀ½¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Åª|u `TCXUGajVOEJa ¬¯¶ºµ´²¬¼¹¸µ¸Á½¯¡¥r¥Ë¿¹ºµ®¥¬³°¦¯¨ ¥¶µÂ·¶´¥¨ª¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovsnc^gY]^SONB?JCAKJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¾´xoNJ?dYBNwjNA]°µ³µ²´¯¬»º¸¶¹¿Åu¨c©¿¸µ²±¤¦¦£¥©®¹¬««¥¨¤«®¯§°«¯±±±®®¯¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmujl]\kT^\PNHDGMBGNG8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶{XFANYJJXwcAS£¸³´²°±°¹¸¶»·º¼¡±ª£r¬°©««£¨ ¡¨®¤£¤ ¢¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wryhutoeUadW]ROMI@IRDNC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼ªiM@RxqPIIKgYDR®»±¬³¯®¬¶¶²´µ®¨¦¦¨ ¨©¡§£¨ ¡¢¡¦¥££ ¥ ¤¬¥¦¨¥¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ª©¤©«¦©¬«¦¡x|vzcxmn]QiUPOGPMMCPRA?;>4::5;:=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢ª¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Â«¥¾iERQWIJ`KTacb®µª²´®ª«¯°²³¥ ¡ £¤¨¡© £¥¨ ¡¡£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nl{diVRdNIHGOSNKNH<E@=2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶¶º¹º··»®¨ ¡© ªÆ¿Ë¡PAswPnKLcfus`Z^p±¯®³µª¦¬¬£¢¢¤¤£© ¦§«¢ §£¦¨£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¦«ª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ |~wy|eyyabSVaHIKLSUJSQM9?A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÇÇWSJe£Ze~or]Qkc[d_\k´°°¸¬¦¡¢§¥¡£¤¨¥£§®®ª¦¢±££¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvsime\S[ZMQKOOVMTMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢«¤zUirvupcvvXWc`cgYXWg®¬¯§¢ ¡££n} ¢¢¢¦«§«¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³µ¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xvjwu^m[RaIRVHFVWKCMH=KI8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©¨®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¡ ¤np`cXL[SZMLPXRHMMH¬ª©¥ HG¦£®§¤¬ ¨«µ°´°°¶¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ·»¶«®±¹·¼¯³°µÁ¼·¾³³µ¢¬¢©©²©«¨§¨ª§ § ¨¨¥¥ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhn\X\CWNJGMHCFN=>L>4<:6:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©©ª ±¢·¤°¦£aW^e`WMQG>>?CC?>BQx©©ª¦ ¢£
¦v*`£«®¸¯¯®¯¯¸¼»»¸µ¸Ã¾¿Â¿¶º»Àù½»¬®§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¸Â¾¸´»ÆÄ½Ã¼¸´ª³ª³´¯³®ª¯£¬¨·²£°¦¡£°±®°¤¥¯£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trklurqhW\QFUHDJPI?EB4FH96<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`QGD<C>E<?96N~ª³§¤£¢ ¥¬¦xlW5f
|y¼¼¼°¹ÁÃÂÆ¿¾ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÆÌÌÌÒǾ¿ÀÃ¾ÇÆÂ¸ÄÊÉÄÁÇ¿º´º»µ»·°¶²«»²¯¼·À»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxkeZ\FLMEDTMEBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<@?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}sjaWNE>IY|obB=\®¬ vrplplT`kprns®Ä¾ÁÌÍÐÈÄÈÐÌÌÌÇÊÅÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÁÆÇÆÊÈÏÀÉÑÍÇÆÈÆÂ½ÄÁ¿¿¿µ¾³¿ÀÃÃÇÅÈį¿¹²¸½ÄÂÁ»¼¼µ®§§®¨ ¢©¥ ¨«©£¤¤ £
yusebgrog^ZZDOMCFQIDCA55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:;>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £kf]TID@?K¥ ²£yqqnj{dXwwrnr¾ÏÍÓʳÑÐÐÑÑÍÍÎÐÄÍÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÒ×Ò×ÒÕÖÓÔÈÌÇÌÍÉÓÍÎÓÍÆÉÊÊÂÇÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÇÅÌÌÉÉÀÃÀ®°³¨¢ª£¦©¬¤¥¦
{ruvgcgvjeVXRDNG@IQC>B=:22A<E<78<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡cTLJDC?CR®Ñ½²¯¦ ¤¡}yqlebhrpr{
upmpro{v}truotÏÐÓ¶×ÓÑÒÔÔÒÏÑÃÐÓÖØÕÕÒËÉÎÐËÆÍÒÊÒÕ×ÙÖØÓÖØÍÒÊÏÑÌÏÑÍÓÐÀÉÈËÄÌÍÌÏÏÆÇȶÀËÀÒÍÌÐÇÊÉÀÄÃÈÏÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpcaerc]R\JKGAFIJ?;A8>5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¥¥ ¢¢[I@ADAFQv²¯¦ wida____^__]alusponkpos{ymih^m¾Ó£ÒÖÔÎÏÕÔÔÑÑÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ××ØÒØÒ×ÙÕÖÌÏÏÉÍÒÌÎÑÀÇÄÉÇÏÎÑÑÒÈÌÍÀËÍÆÔÏÌÏÉÅËÇÇÉÌËÔÔÑÕÏÒÌÓ¹ű¥¨µ®¨¨«¥²¨°³¬¬
|zqstmacim_VQ`JJCECSN?<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®§ª¨¡£¬fC8=>DXª¨}qecb__a_^a`^a`_`emppmjlosv}ryrb\SY£r«ÚÏÓÎËÒÍÕÔÑÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÓÊÐÔÕÖÎÓÑØØØ×ËÈÎÄÉÏÍÊÌÀÉÁÉÊÎÏÐÌÐÎÎÌÏÐÈÌÐÑËÎËÃÊÈÊÍËÌÒÓÎÔÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¿»±
zvopokadnpaX\[IFFDMYE;@=33<<87855;>@=9<<8<>9<@;@:=8?98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤²{HFB;W¡k^^^adb``aa```^__^\bmrnnpqrqvtowytc[\{wÑÔÉÌÍÄÍÊÒÒÎÆÎÌÍÔËÎÒÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÖÊÀÊÂÆÍÃÈÊÃÍÄÆÉËËÏËÎÍÑÎÔÌÇÉÐÍÉÇËÆÇÂÆÊÌÎÑÑÇÐÏÎÎÌÐÅÇÁ¸¹½Ã½ù²²¾°»Ãĵª¥¡yqrkmh``qhYXhVMGLIQQB;D?;68:8:;57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨ xlopw|ebbb`]^acb`__`aa`_][]gqqopqmimsphrtgfc]wÂÅÇÇÄĽÁÅÎÎÇÅÆÍÊÑÈËÍÍÆÑÒÏÍÌÔÊÇÊÎÏÇÇÏÒËÐÏźĿÆÊ½ÃÇÉÎÅÃÈÀÇÎÈÄÍËÍÐÉÅÅÐÉÆÂÆÉÅ¿ÁÈÍÌÌÏÃÊÌÉÇÌÐÅÅÈ»ÇÃÉÉÂÏÁ½¼¿°ÁÉǹ½ª±²§¥¢£xoudk`^fqa[W`GIHGIMUG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<::79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»¤¶~g
¢ª
}~s_[^]^`^`cdc_]\^_``_[Z\akrpmmhgijujcb^be]¨Æ¸¿Á¹¹¸¸½ÈÅÁÃÀÃÇÊÈÈÉÈÁÅÌÆÈÊÍÉÄÁÊÉÁÁËÏÄËÈ¿¹Á¼ÆÈ¾ÀÆÏËÄÀûÊÇÈ»ÉÆÅÊÁ¾ÂËÆÅľƾ½ÁÄÆÌÆÆ¼¿ÊÃÅÇÒÅÁÉÀÊÊÆÈÆÐĄ̮̃ÄËÇÃÊ·¿¼º³©¬¤¥¬£¡¦£ |wsufj[anmZ\XRDLGCGDLDFS?54335@=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¾¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²°¶l^y|z
uxurp_Z[]``bcdded`[\^]^]`[YZ\anqmifgkinw\XV]aiªÁµ¸°°±¯¯Áºº»º¸ÀÁÁľ½¹½À¹ÄÊÅÆÂ½ÆÀ·»ÃÈ¿ÁÉ»¶»»Åÿ¼ÂÎÃÆ¾¾µÁ¾Ä»½Ç¼Ãºµ½ÆÄÂ÷À¶¶¿¿¼ÍĽ¶ºÈ»¿¾ÌÄÂÆÃÆÉÇÉÆÐÆÂÌȲÇÉÃÎÌÀÅÿ¼²·°²§¨¨¹°¥°ª¬zwxkeh`hodV^YJFJFHKAEBFJA9:658853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µ«·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÕ×ÍÊÏÅÉÅÇÁºÅ½¬®¦`cvx}{ttc\\]^``bcbbdeb]\[\^\^]Z[\]grokdcijkwrOQWbq´«®®¤§«©¤µ²µ³²³´»µ½±·°µ¯²»Â»Áļ¿º´²º¾À¸È¸´¼¶À½¸½ÇÁûµ¯³µ»¿´Å¸»µ¬¹½¾À½±»¶°·º³Æ½·¯¼¿µ·µÅ½¾ÃÆÀÄÆÆÇÌÅ¿ÆÆ»ÇË¿ÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJGBDAEF?=:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÅËÍÈÅÈÍÌÐËÍÈÉÈÊÉÊÄÐÍÒÏÍÅÇÁÅÁ¿º¸É·«°[gozx~
vw|sh]]]]_`_`da^cec_^\[^\]^Z[[]_kolfcfhhl{eI\u¨¨¨£§¤¨©°¬©«©³µ°²¨§¬³»º¶Ã¹º¹°ª´¹»³Â¹¯À±½¼»µ»Ç¹Ã·ª¨°²À¶¸½°±¨²³µ»¼«®¶§®¶®¼²±ª¸°®»®»¸»ÀÁ¾ºÃ¿ÆÃÅÀ¼ÆÁÇʸÅÇÅ¿ÇÃÃ¹ÄÆÂ»ÆÉÌ˳¹Â½»³tvwki`bliYWW[ALLMJEAC?FA:::996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÏÇÍÁÂÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª°[i~{x}
y{wn^]\\]_`__dcbdcb`_]Z[ZZ]ZZZZ\cmmfdddfhmydm¢¥®¡¢¨¬£§¡«©««°£¦©µ¶±½¸¯·¯¨¸´³¼·³½°¸¹µ²¼Á²À¯¥©£«±³³¨½ª«¨«¬®µ´¦©®¡¥¯©³¦¨¨®¦¨·¬±³·º»»²¼¾¾¾Ä¿µÁÀÇÈ·¿¿Å·ÅÃÀ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji\aodWVXPHZSSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃǹ¹ËÂ˾»É¶½Ã¾ºÊ·ÁÄÁ´¶¼¶±¯µ¼©«dmz}~xt~|swe_]\\^_`^_ccab`a_]]\ZXY[[XWY\_ejdbcaddhmyy¦ §¢¢¤¤¦¥£¥¬²°¶·§°¬¨ª´«³¹°¶¶®¶º³°ºº±¶¤ ¤ ¦±¨¬©¹ª¥§§¨§³ §§¤¦¬§¤¡¡±¬²µ³´°µ¼¶»ÁÀ²»¾ÃÁ±¹¹Â³À½Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ yqlbf`ko`UY_HNhOTHFKF<=@=:;;826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;ȵ¶½¸ºÁº½¶ ¦º¶«³³»³ÄÏÉËŸ·ÇÀÌ¿¸Ê·»Å¸³Å¸³¿À¬¶¼²¬¦¯´¡£ir
|xusomjiipi_`]\\\^__acb````^\[\\XYXXXVXZ]^cb`cccbeflysqjX[oE{ ¥¢¤¢§¢ª®¬±µ¤¨ª©¬¬¤´¸¬·°¬³µ¯³µ¯°ª¤¢²¥¦ª¸¢¦¦¨« ¥£°©¬¨ª«¬°³¹¯¸¹º°¶¼»º«³²¹³½´·²±¶µ¿µ½À½Ã»»½{sl_e^ddXTW^IW]KPGJJGA<??A;?<05636:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»¸ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹È¸¸¿·²Â´±»»¬¹º±¢©«§m~
xrmomkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWWWXWZ]abccbbcdepjXA":qhi¦£¥¡¤ ®¯² ¤¢«§¡µ°±²¬©°³¨º³§¶¡¢£¡£¢ª¶«¢£¦¦¦£¡¬¨£¤¦«³³ªµ°²«²¹´¯ª¯²²³·³®©®²¸°º¶º½¿·³±zvf_f_[YVSZUK[QLJEHKIC=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿²¥£¥±Ãµ¶½´¸ÂÌÈÆÀŶÁÀÇηÀý³¹¹²¿¶±¹»²µ¯£ª¡xxoqtqhediec\\[[]]\[^`a^__`^\[Z\ZYXVWVVXWXWUW`bcaab``dfrDH§¢§«§¯°ª££·©¡ ®¨µª§§®±¤¸°¤· £ª¦¡¹°£¡¤¢ ¡©ª¤¢£ªª±¨´¬ª§³°¥«®³±¯°¯¯§¨¨²®²´°¼´º¸®£zwe_aWYXSRTKM^LPLGHMLE=@>=B<:7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´ºÂ±¾·½§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWVUZbb``a__`bj_%7n¥¤¢¥¦¦ «¯¦¡£¶§¡¡¢©³¢¥¨¥°¦±®«µ¡©¡¢±±££ §§¢¢¤¥¥«¤¥°§¥£«¬¦©®¯¯«¨ªª³¦¦«¯´±®¼¶±¯¯{xseb\[]XNLQHRaMVPOJNOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±¶½°»±·¬¥¦¬¸»¼Áź²¹µÄÉÉÀÂÆÅǶÆÄ³Á¿Å«··½¶½º»µ²¬¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWUTVVRTRT__]^_\]]`alW\ £ «¤££¢¤¢ª«¤¥±ª¡¡¥ª¨¢¬ª©®¢¢¢¢«©°¢¡£¥¡¢ ¢¤¥£«¥¢¤ª¤«¥®²©¦¥¦¦µ¦ª¨³µ´¹º¯ª¬sqp`[WVVRGQOHZ\ORJTKSLEGJC8;;=<9666:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«±¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÉÌȵɼ±¾Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSNPY][[\\\]\_bk} ¦§ª§«§©¥¢¤®¤¤¯© ®ª³¦¦££¡©©¡¡¡ ££¡£¡¢¨£¢¨« «°¤®¸¥£¤£¬ª¨«¯´·²½µ³«®
uti[YYSURFXLQ[XMUOPLQRIOIB=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³·®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ÌÆÅ¸ÀÎÏdzĻ·»Âȱ¸¿·¼¾»³¶¦© ztvwnmhmmmpgghfd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNOQXYYY\[Z[]^dzzw©¨¥«©°£§¬ £¨§®§ª¥ ¨ª¥ ¡¤¡¢¥¥§©¨ °°¦±½§£¬´ª®§¯´°¹µÀ±®°«~rtcVTUNQJGVPRRLLXNKLOSGNKACFEC>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ·¸¼½Àñ°±·®´´»³´££vkglnqnqjokdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTRMNMRWXYXXWZ[[`iwpvm
¦©¦¥«¦¥¢
¤¢¢¥§¡ ¢¢¦¤§©§¡ ´²¨³¸¡£¶¬ª®¤²²¦µ»µ«¬±¢zsn^NQQMODNNNPKFNNJJNNQHMJAHLIHC>958889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶§¤¶°¤§¤ª¥ ©¦¤³ª¢²Ãµµ²³ÆÅ·ºÃÊÌÆ³º½´¸À¯®©°¦®»¯ |n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKKSWWVWWWVZ]alimg{zz£¡£¤¡s~{ £
~~tz££ ¡¤¤¢´¯¬°¦¸¦¥°¡±®±¼ª©¯©xtdVMRPPMCSNLPMBPQHINSNIJJEKMGKK=749888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-02764789::66:87A7x·¡£´¨¦¥¨£¥¥¦¦¦²§¦´Á¸¯´°Éĸ¹ÀÎÆ¾³¬ºÁ¬Ä¨¢¦¦·£ ~xfWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJGNSSSTTSUX[]idgdu|tmKUn_;Vo|ry{}xqp}¡ §®©©©³¢¥«¨´£©£tn`[NSRWLDTJPMLFNOIELQMKPJINPGJJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· ¢¡¦¦ª ¦©§£ª°¨§´Á¹°µ°Ç¸³½Ï¿¹¯®µÂ§ªÄª¢±£~sv]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKHFHNQQLORTUXY`id^qylL?=}z
y`JQnx~m~wuvxpQ|~yvgw~
¤¢¨©¥¤°ª¡¤¤¦ª¢ª¡¦§wnf^\HQQSMIUMRILKOIHFJNLMUKQRPGJD=768:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.115221/,')+*,4833989:99::::?9w¶¢§¡®¡§¨¥§¨¯¬ª¶¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼§©~xqoXMKMMNKMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDCINOhYNQSTUZm}jmvccXR
q|~zz
uxsouptz~«
z{hv{prmxx{{wsrxhu
||© ¡ ©¥§£ ¤sib]]JWPRHKXROJMLRJJJLPHLQMRUMFIB=78;99>=:;<98@?::>=7==79947785675251472/2.,./200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¢~ww|wpojYKHIHGEHHPTTTWWSTUUUVWXWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LNQQSV^s~vraqydw~tv}|p{v{ok~|tz|tfu|lohs|myq}qmvqhq~pD
wwz}{u}£¡¥xongc[XXUQJSUTOPNPVKNKOOJROIOPLFD=;79;::?=9<:99??;8;=7<9999266856633511224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«¨©±¯±«¼¸«»¾¸³¬§°§¬¥©¥¡yvq|mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zYJNOQTX]eoog¥©À}qv`yvlywy{
nkxsxijq}Ingw~mjdly
krl|nr|imps
{~{wpttyyp|pjoooYVXTRRYORUTRXUMNHMKMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¤¬¯¢ª¨µ¯®¬´¿«¼Ã¿¦¢¤¡¡szuotlpmekkYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORVZQX[^¥aeoub|mk}xu
skts|ijLy
f1vrk}}tfeu
filukp|hqq|n{t~}qqoumwyujyyxlkpheXR[XYY[NPUVYXNIHEJJHGB@GECG=998;9:9<:9;:::@<9:<98>787715233533645031.**+),,++)(+'),,226,,4775478iO8;5m¤¨±§º¯«²°Â±»ÃÇ
zqtzpsqopdpg_TFIC><;9:?@ADCEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQULBIQIb®²nwtizjoy
yr txst5p¨¡¡¢
vp{|t®hgbjnrmpuioXupvm{}nrnp{svnbu
ux~}|srqm`\]^\ZYa_RN[ZXWLHJFIG?CABH?CD=;:7=;:;;9:99;:?<88=:8;66651111253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®°®Á²»ÁÅ|nul{uxxlwnwdj^IPG=?7448;:;=>@BEHLLLLNPQSTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL8DNRSDJs|yys{jt
z|~}u¡y~
aªzw~s{]dqtz|wmhjbyo
zoxu
zptzxkni]v}|
}q}vw{|xqtugh`[\^S\g^WQTX[UGJJDKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À²»Äºzvk}xs¡}}p~zhwkRXL@E211376688:<>AEFFGJKMOQRSTUWVVVTSPMF@:2= #c[5311i?GoIFILMOQLKT\XRKg
xwyozx{
~v ¥¬©H®°®©tm|~hghyn
qHlwryvhmk_v}
yzuv|xmow~uusm\^^\cdXgf\UPPWYPDLKFOICFCCA@CA=978:::;;:888::?>6;>7585773344236656778;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¬ ¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[??94.]ps£UFIKMMPW`XoY[]g~| ¦»±§»Çè¡¥|qw
ihptrw{v|muuf ª¢zyyogkx~|ule^[[^j^bg`ZOLNXRQIPJDNGCJDCADDB<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfwz¤¡¬¦ª®°¡xw|~lpj]B@4--//..02234778;=?BDHINQRTRSSTRPOHDB<87/9C><<63.lMPHJLLKNV_b~ffkr¢©¤£«©¶¢¨ÁÂǯxº|¡
¡
lpuwqm
q ¤´¨¢}kjj|uc_e`[hl^ll^WKHNRQMLLFIPCDNFBCEFC=:96=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENORTPPQSQNPIED>;<:DF?><852<?R5HHHLLMNR^m{r{¤¢ §§ª§«©ªµ«¿«¶ÇÈ·ÈÐϾ pi«©
¦¢xz~¢{wª²|£¡¥µ¯§lss}~sja^b`bhd`hg\REJKPOIILFFMCHLFFCBGDA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m}aw}{ªªBD}x|
w^bP460-1/,.0/./..0015>AAMQRSQRSURNSLEE@<>=FG@A@8662<9;FHGIJNOQYlv¢¦±»¶¢¬ª«¦§³ª¯µ±±º±³½²Ã«ºÉ˷ÿ¸¥¢°³¬ª£¥¦ £¦¢«¨¥
¤¡ «¡¤¨±£¦·º ¢¯£¢£¡«®«²´¡¤©yz~ibi]fc_ed^gg_[OCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhbWinXzv
ÚÈsV|z
qna@E64<2/110-,+-0.-4?CAMUPRSUUVUN[PGGD<>>FHCEA8;<5C;=FKIGHQOQW«¡¯§®¾ÅÁ¨±Äµ«²¿²·½µ¾´Á¶»º£¸Å¨µÈǵ½¹´¨£´°±§¯«¥v¤¡¬²´ª®¨®¶»²º¬°µ¢±¬±µ»¶´®´ §¨£§©¯¬±¸·¸¦µ¨¤x
x[ceWgcbdaag`[TJDDLUQHIJDIGEA@@KDBMG<967;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[YQbbWyup}u
{¿»£¼´yzxn]V@EN<6:45AB764//6CHBQ[OQUWU\WP_UIKJA?>GKFFD;>@7D7?BJJEFVTP^£¬¢°±¿²µ¾ÊǵºÄ½²³À¶·Á´¾°·t±³¦ºÄ¤°Æ¹°²±´¨¤µ¶ª± ¢¢¥°®¦«§¤ ¬´»¢¨²ºµ¼¿Ì¿Å޽³Á·º·¾¶º·¹¬¬±¥°©½°¼ºÁÁ«¹§©~~mXdbYlfkfX\cYVSIGFLQGCHIAHD>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALQVSYUZvjo~nzsxb¹¡£{z||}wzueP\dGEL;Qca[^SF?;HPEZcQRXXZgYT`_LSPEA?IJHEEA@D<E6B>HGJLSYT]¶³¹¶Ç¼¸»É̺»À»·µ»º¶½³¹±Å`u²¤±ª½©¥¨«ª¤¢²µ «¨ ®¥§¦¥££§±´¨²³½¶Á¾ÓÉÉÓÆÃÅÌÂÊÃÀ½¼¾»¼·´¯¸·¶Ã¹Å½Âǯ¸©¡«¤§µtacc_Yc`jgSX`VRUIEENK@>GD=KA=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKEAIMPRKQ]glkp
slrrsÕÀµ }~x{{y~t}zkfpuY^\Pedb`ed][XW\MdmURmm_n_XgdTYUJDBKKIFHHHHBI:D?HKSTU\Z[·¾·¼µÄ¾¹¸Éʺ¶¹µ·¹²·´³®µ¶du§p^¢¬ ¢¤ª¥¨¦ ¤¬¥ª°¸°½¹ÔÑÏ×ÐÊÌÒÌÏÎÊÆ¿¾ÂʽÁ¼ÁÀÄÄÅʾÇͲ£º°´®«¸»|m_b^Z_cZdcQ[`SPKCAEFE<@E>AHB@C=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ[Yh_onlotu´¬¡¡
~|s{
{ts{ylmu{hreiligjji`fiilZms¤¼g[og]ZZTHKNPJKPKSQILAJFJO_^afiaµÅ°¸²º»³°ÄƵ¯¸°°»«²±¦ª·«µ§§N¦¥¡§¬¯¨°¨´´ÔÔÔÖÓÌÐÓÕÍÒÏÌÄÂÉоÉÉÊÉÑÇÌÍÂÏÑ·¯Ã¼Ã¹¤µ¹Á¢qe^__ZbYZgZQ]XOPBBHEBH;AC>AG??A7;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYReVsgqoyy¡ª¦}|p{r}qxulqx~qzmxsmipmcimpxiw|~Ë¿Áß§mcxnc[b`JPRUNY^O]\NPNTPTT\nmvq¬·«³¦¯µ©«»¿°ª´¥¤¸¦«® «´£°¦«¬¥¨¢¬ÏÒÕÒÎÌÓÔÔÏÔÑÎÇÃÔÑÇÍÒÓÓ×ÌÑÑÄÒÖÅÁÎÇǨ½·Î|qh`e_XbS_[PQTQOH>@FABE<@A>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<UQMNZu
wlwp}~¡¡
y
~{r~zu
ovrks}{w{sxrksrioqzyqz¾Ë~²vrvhak]CZZ[VecXdjSX\]`c]cwz}©¤¤¡ §¥ª¯¸ª¥²¡¡¡£¡§±¦j¢~¨°¢¡¡¥¤©ÉÍÏÈÂÌÑÔÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÂËuqebaZVZU\QKGJJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;OLFJXpu}hsxr
x~ws{}wznwpmuux}t
|ylvtn}vtx{µ;AÅ¥~|ieWICfcecgjcmw[^fhknhn ££¥±££±¡¥ ¨ £±
y©£~«³¨§¾Ãƹ¶ÆÎÒÑÒÐÌÒËÈÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÕ¾Ê˵zypg_\TWR]WFGJIEE=:7:@@B:FD?DCADB;?;;7DC75655;0679443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~|x
zxqz{
uy
yp|oozq{qnzuw}|t~|¯sX©Â¶pmb=^hrpqpnxvehoruxqz © ¬¡¥«
}
~lz|®ª§¯¶½©¾ÇÌÉÉÌËÐÉÃÒÊÔ×Ùר×ÕÛ×ÓÙÛÕÐÚÚÑÖÈÔË{}kj]\QTU`ICFIH>A>=7:=?;=G=?AAADA>>:87DB755479.566435542323647553458EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<99D>CGRj^mdbfkvqz~~{|~
wyn{{ty vusu}soou|
zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥¢«
z}¡¼¡©¦¦®¨¶¿ÀÁ¹ÇÊÎÎÅÍÉÑÖÕÕÙÕ×ÛÔÖÙÚÛ×ÛÚÙØÎÛÆ}{ikgaUYVWNLENC;==<8:;=9=@6=?@<?=<9867CA6455=80665547745613854564557HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Xea][htzylwvz{~~|z}
z{u}tm|}~t{~x~xnt~{~z©Ã¡½¤}}r~s¦
{hGq ¤
~¥
¥¸¢¨¡¤¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¹{{znkhYb]TPOIDLB<<>99::99;=6?>><=9:;;37D?7378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=CQSRX^UXfmmmiqry{z|{z|{}t
yszsm~~w
¢n¨
z |}£¢ ¤¯
Wr«\¢¢¢ ¤
³¡¡¨²¸¦½ÂÇÍÈÆÏÍÐÌÏ×ÑÑÕ®ÖÕØÚØÚÚ×ÕÙÙ rwjh_^YUYYCAIC?>>:49:;7:;:3;;?=>7;9:0:G=:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbzma~omwxyz|
{{v
sp
zuwvt~¦¤¥¢¨s±§
¢£©°n·
ÄȲ¡¥²d¤ÍÈ
ª££¤¨¡£³´¦£¼Á¾ÇÅÅÉÈÉÂËÓÍÍÔ©ÒÑÖÖÖØÚÔÒÚÎukf``_PKV\BBGC;A=837;<:8=649:<:82?9929I:>67BC32:96264>=4;>6949;57944JQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBeGu||m~xz~z~vv{ln~y|wx|~£´¨¤ª³¡§ ¥¤¯¢¸³¡ ¤¯¢¤§©°¤ À£É¸«¢¥²
¨¢
t²¤¡} ¡¡±£¤·¾³ÅÇĽÃÿÆÎÊÉÒ§ÎÌÓÑÐÖØÒÏØ¼u|x_bWbXRIKOEBCD5>;76:?;<7=42669774=5;5<L<>;<BA75<;4277?@6??784987;<55OMDPRL8@=EAGA5:IENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGM\\YJha;Hzzm
y|x
}px|}|osz}{x¨¼©²½°¥®³³©£¢°µ¢¸¥¤©·¦¤£©ª¤¯±ª »»Ê¡i¶·ª°¢«½¤^ª²|}´« ¢¡ ¦®¨¢¤³¸«ÂÈĶº½¼ÅÈÈÂСÆÉÍÍÄ×ÖÐÊÓ£s}k_[UaSQGD><CAB8?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAE@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPfHa`bpJ@r|u~m}||~pww{«ÂÀ°½Æ¼³´Á¼´¬«³¶¨²½«»£¨¹¸«¦¦¢¢¤£ª¯²±ª¤¢¦¥£¹¯¨¿¼¬²¹¥£§}½°z§°« ¤¬¡ §§¤¢¤°³¦ÀÆÃ°°»¶ÅÅÿͧÇÃÇüÕÐÌÄÊvvd_\b]OLCL@EG>A?B<:4>A==5=6>333241A17@BN>G@CNCA=C=;86CB5BIB:878;5B>79VKDWOF8=4K@C>4EJHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\hF_ig[]\{un~{~q~zz¨´ÇÉÀÂÌÂùǼº¯«¹»²¶º²À¯¥À£«°¼¼ª®«£¢§¬¯µ±© ª¢°´§£ººµÁ»«¨²¤¤¨©ÄĤz¡ ¥ ®ª¡ ² ¡¤ §¤¦§¤¯¥¿Ã®¨·µÉþ¶Î²Ä¾Ã»³ÑÉÇÁµw{o^[^lTNIDMKKJ@A=BD<5AD;:3=8B332263A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr{wy¡¨»¾ÉÈÊÂÒÉÊÂͽÁ³¼¿§º¿½¼Ä¸Á©¬³¼½ª°ª¤¥£¬®´®¶µ ®¦¢£´½©¨¼Á£¶¶¯«°¬ª¬ª§¥¤uy
£¢©¥|£ ¢µ¦ ¥¤£¥¦¥£¨¨¢²¬¨»Àᥳ·ÌÀº®Ã³»½Á¹Â¿p{c[Y^]MMNKGDCHBAADK:4DH:;4<7F.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>lI_XaZdeXx
~¡®§£Ã¾ÉÄÈÆÓÍÎÍ˼·°º½´½Ë»ÃÁ¶·¼´À¹¼®¯¨¡©¨¶®®©²·¬¢¨¢«··ª¥¯¾Ä±½¹³§ª´³¥¨ ±Å§}}ª¥ ¢¡Z¤f£³¥¢¬¬§§¡£¨¦µ«©º»Ã´¦´µËÁ¸ª¶¬³»¸®¨¸º¼·op\ZVWPGLTNK?AHDDHFF85FM;>7>AK.32025B55PWN<LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hV<>@BFBsFiIRfdMF¦¡¨¥¢¯¾®¡Ç¾ÆÅÈÇÎÎÏÒʾ»¶±»»¼¿ÏµÄ½·¹·³²¶³¸³¬§««¹«©¨¯¯£®¥¨¤¥µÁ°«´¾Â¹À¹³§¸´·²¯¤°¯¥ sÁ}±¥£¨¡ `J¥T°¯¥¯¯¦¡¦¦¡´©ª³¼¼»«°²ÇÀ¸¦¬«±±£¡²²´¥sqg^\PSMFQQPQ;HKHFGAC=9KT?A:=EM/7534:B34NWN<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;5EA:A?>H@5*B52,>c]g:35tde@R7}hX<:BC@=REWStbVFH«¡¨®§
£¤µÉ´©Ç¼ÃÄÉËÉÈÌÎÆ¾º³¯º¸ÀÁ͵ȺÁ¹µº²¯¯³´§¤ª´µ«ª§¬¤®¦¥©¬ºÀ¨«··¾ÁÀ¾·²²Ã°·½¬£®µº¦¥u¾®¡ ©§ ª¡§mu¢¢²¢«©ªª¯¦¥¡¥ª¢°§©ªº·¾³²®¾¹¶ £§¨¥¦©©fhc`SMMGIOJUL=MEMIJ@CD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CC:9C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW<:=..SaMVH~e^HF¬¡»®ªª¡£¬£¤¶Ç½´Â»ÃÂÈÉÅÂÎȽ¹²¯¹µÀÃʶƱÁ¼µ»¬©¬°££ª´»¦ª§¬ª¨¯¨¤««¾¼¨¼´·¾Æ¼¶µ¸À°½¿³©µ·¬¿¥¢¡¼ ·©¥£¡§¤³¡¥§©¤¢£ µ°¥¦±««¥¤ª ©¤¡¡´µº¶¨µ²²¢¦«¡xc_a_LIFHNQINEFGBQJH@DGAVSDH<AGQ1;B7:BF79]YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGE¨¤Ã¬¤¨ª¨¦¬¢«·Å¼¿·ÁÂÀÈÄ¿ÍÆ»¾¹²°¹´¾Ãȵ¿°¼¶º·§¤««¡¡«ªÄ¢¥¨¬¦«¯¬¢ª¨¾¸¦¾°··Æ·´¸¸¾±¾À¶´²µ¯¾££¡¡¤¢£¾¤©©¬¡¦½¢£¢©« ¤ ¶¬¦²¦°¨ «¡¡¥¤«±µ±ª¥ª¬ ¡©ie\b^PJHKOLHEDI@=OH@;FIH[ROK=HNU4BF8>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0--0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcXN££Å« «¢¤¦ª«¶±£©³¶Å½À¶À¼É¿Êȶ¸µ´±´´·ÂÆ·¾±¸´º¶ §¬ª«¥¤Á¥¡ª ¤©°¢§¨½µ¥±»·¶µÃ²²·º¾²ÃÀ¸¸´´µ£¤ ¬¡¨¨ª¢Â¬¨¬¦ ½¡¤««¬¦¡X¦¡ ¹ª§¶£³¢¡± ¢£¥®³«©¢¢¥¤¤cg\eaMJKKOFEAGK>=IA99JJN]QQI=LV\8FI=DMI8Hc\KCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+waS6SZkWsHE6=ue\LP 礢³ ²§ª££©¬»±©¬µ±ÈÃÁóÂþÇĽÄʽ°±¶®±µ°Àŵº±°º¶©°©©¦¡§Â±ª¢®±ª¤¨½·¦¶»½¯·Ã³³Â¿²Æ³º·«´¶ª¢¦¢«¡§«¯¯¯»²¥©©¢¤¸ ¡£®¯«¤¥¡£¨µ§§´£¯ °¡¢ ¦¬°¥§¢
dh]hfKJLKSAC@IG;;F>89NMU_RSJ>O^]=HPBMLI8Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<w]^?[U_gr@8<HweA4¤ §£©± £´©±«¦¢¤²¬©»²°µ´Æ¿ÄĶ¿Ä¾ÊŶÀɵ¬µ©°¹¬ÀÄ´·¯¶º¥«²¬ª¡§»´¨°®µ²§ª»³§¹³¸²¸Àª·²Ã½´Å§¾®·µ©§¬¡¥¤¡¡¤®·±´¶©¤£ ·£¤¥®±±¥©¥¡¨ ¢¯³£¦¯¥«§ ©©ª¢§¡zej]lkNQNNT=CANC;:I?77QN]_RVQAW`\BJSHVKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JqiVCWFyfC;¤¤¡¥¿¦¨®® ©µª·¯«£ª´¶±°¸·°·¸·Ä½Ãǽ¼ÃÂÇÁºÁÆÁºª¶¥»Á÷·ª²¼£±²¦¨ª¹ª¡§°« ¯´³ªª·µ¬»¬³²¹·¬¸°Áº½¿¦Ãª°¶®©««¦ª¡¡ °¯³«°¹©¦ ·©¥¢¢¯±³«±§« ¥¡¤´°¦¡©£¡©©§ £~limbnnXQQZTACDU@;;H@7:XPd^PWWDY^^NLSN_LJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gYaF(@8l}h\V:{cC=¨¡©¼ ª¯ª£±·©¥´²«¡µ½¯³¸¼»½·¶À¿ÉĹÄÃÀÀ¹Å½Á¸¯¶¨«·²¼¿¿´ª®²¸¬¨®¨©§»¥³«¢±°³¬ª¶³µ¼°±µ¬°µ²ÀºÅ¶«¼¯±·¬ª£±¥¤¨£²ª³©ª³§ ¦¤´®§¡¬¬±§³«±©£¨¤¡¨¶©¡ §¦£
{gmrhqs`GYfVDCMXDZ9HB5>]Qh\NZ]G[^]OMSXdJKC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aV151=`V_8)C3YU\gK5zfL@¥¤«¶£«¨¥®µ©®³¸¦§°·Æ¶°·¿Á¶´ºÅ¾ÌŹÃÁºÀºÄ¸Áº³µ¬ªº¸»º¾µ«¯±·¨««¬®««¾«¯±£ª±³®®¶±¸¶ª®±§µ°³º¼É²ªµµ±´°®¦ ³ ¨¬ ¤±¢ ¥¯¢¤¢¥§²©¡¦±¬ªµ¤®°´¯£§¬¸¢¡®¡¥££¡{
{lnyov}bF`jZIHZ[={JGE6AbUi[M\aJ\\ZRSSbaLKE`a`PMIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.+A/JGP[G3cYTLE°¨±©¬¤£®µ¨·³·£¬´·Éº´»»À¾´³·ÃÀÌǻĽ·¿ÀÀ¸À½²½®¨º¹¸·Â·¬®²º§¯¬¨¤³©¯»¤¬²²¦§£²´±²±µ°·²©®«²¦¸¯µ³ÄŶ©µµ«°®©§¢¶¦° £°§©©¢¥¥¤·§¢°³«§±§¯µ¬¤ ¬¨ª¹£¨¤
¨¥¡w|nqxv|\Lel\JOd]?b{GI8GgWf[L^bLYYWUXUi]OPHa^_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHg27'FaLV%-B.=ELQ<3rkLED¤¤¬ª¦£°²²ª·°µ«µ¹É¸®Á¼Ã·³±µÂÃÏÄÀ¾µ¾ÁÀ»¿¼´Ä¨ª¹±¶·À¼¯¬´´¡§±®¥¦±¥²µ¬ª²±«¨¨µº¬µ²µ«³¬ª«¨¬©¹²°Ç¿¸¥¹°©¦§°¥¤£®£¨¯¢¢¢£¬£ ¡©¦¥¸¤«´´¤ª«¨¬®¶®¢£¨« ¤µ£¡¢§ x~}}}rts~~\Scn^NZg]FD[G:NmXbZMabNVVVWUYh^QSMcZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Dd;6*HdHJ+:I?3CIS,>l@HI¨©¡©¯¤§£³´°´´°° «½Ìº®Á¼Ç±´³ÁÃÑÄÆ¿Á²¾Ã¼¿¸½Å¨·¬´¸¼À±¬²®¡£§®ª¨¥±£ª°ª®«±®®¬«³»§·°²©²©ª¦¥£º«°Â¹´¬¹©©¨©§±¥©¤¢®ª¨¡£¬¥«¡§¨¡¬¦£¬¶°± ©¢ª°«§§©£ ¨ ¡¥}w
utrwl_Y`ncQsq\K;|F?WuX`YOc\MUVUWQ\b_SOOhYWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=397;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.JgDF8<B05EKX1@]@NF¬§ ©±¨¨°µ¬¸µ©¤«ª½É¼±¾¸Ã¯°¬³ÃÄÎÎÿÀ´ÀÄĺÁµÉĬ¯·®³ºÀ¾´®®¬¦¨ª±©¦©²¦´ª¯±®²´»¥¸³¬¬§« £°·¬ª¹¶¤µµ¤ª§¬¬ª ¨¦§±±¤¦¥¡¡«ª¡ ¥££ª£¬¢¦±¶¬¬¢¥£©«©¡¥¤¤
¥£|{u~uw£xj^`nfWfdN@gLEbzWbXReUMVVUTO\]aVLOjWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72;::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DBIID®¤¡©¯©¨µªµ°ª¤«ª©¼ÀÀ¹¹´¼µ¦²¯ÃÉËÑ¿Á»¹ÀÀºÁºÂÄ®±µ²´¼Á¾³±¯¬¬§·ª¥°«¸®¨°¯®±«µª¶µ§µ·¬¬¤©ª¤³³©¨¤³´µ¡ª¨«¨«§««¨¹¶©ªª©¡©ª¡ ££¦¢ª¦´®§¥©¢¤¤¦§ª¢¤£ ~
£t~xuzx~pqfgqx\atjO]VHmyUdVRbOLUUUQOX[bVIQjTVTGPYUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E23;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02@f=NX?C,?LT_/Ik7RF;¯ ¥©¬ª£®²´¯ª¤¯©¨»¿¼Á²°¹¢¶¯ÈÇÈÑÀ¿½º¼Ã¾»ÄÁÀ¿¯²³³¶½¼Á²²´«´©¥¶©¥³²¸¯¢µ±¯±¹«¹®ª®·«ªª« £¡µ©¡®²¡´ª¨§«£ª¡¡¬¨½®«®¡§¨¬°¡¢ ¨§§©°©¢¬¢¡¡¢£§©¦|
¤
xt}txz{tt{j¤vi^elug|RVp^KxsTdSQ_MMSZfNMWYeYGSjRQ>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HP;YC3° ¤¥ª¢¥£¬¦´³±¨¤°§ª¸¿Á½±©ºª§°ÉÆÈÐþÀ½¹¿À½É¼Â¸±°µ²º¼¹À³µ¼¹¬£µ¦§¬±¶¸²¦§¹µ´¼¯¼¥µ«©¯¤¤¬ª¨ª²¤³¨ª§ª¤©¢©§©½«³°®©¤ ¯³¢¥¥¤¥¨ª¥©¡ ¤©ª
}~
¢rzy~|hv|{uqq~jz
d_hcr
{mgy]^VBW{mTaPRYKLNpt]IZ[hYFVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°©¤¢¡«¤¶²±¤©°¦¹Â½·°¤¹¬©¨°ÂÈÉÌ·½¿µ¸ÁºÈ¶Ãµ´³µ²½¹º½¶®¹¶¿¢³¦ª«®´·´©¹»¨±¾²º ®´¶©«±£¥¨©£¤°¦¯¡ª©§¢ª£¨ ¼§®±®¡ª¢¤®¬¦¡¢£ª¢££¡¦¬{}£}zl}vyxbzzrpqsxjukgcgansmbjo_pA]ykV^NQQKIMSYVM\^lWEXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R]>#«§¢¡¨¤·¯¢¯¯¨¬¸Ãº´® ¹¯«§³ºÇÊÇ¿¸Â½¯´¿·Ä¶Ã²°º±²À¶»½·ªº¸¾ª¤µ§¨ª¯¸°¨¸¼£¾´´¡·µ¦¦¨°³ ¥¥§¡¤¬§¨ ª¯§ ¦¢¨°¸£±¯¡«¡¬¤§¦¨¢©¦¨¡ª}||¡z
|
|tp|qst`xxjoqqpksdzlhedaf`[rjrMNiXZMQLKHPRPGM[_oTEYZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0][5(¥¬¡¤¡·«°£´³©©ºÅ·³®¡¸«¯µÅÇÀ·¿Â¹°µ½·¿»¾°¬¾°³¿²¼Â¸ª»º¸§¨µ¨§«¯«²¯¤»¶¤«ºµ¯±¸¯©¥§¯²¡¤ ¤£ ¯¦¡¢¨¯¡ ¢£¤¢¶°¡¦±«¬£®ª¥¨£¥ª¥¢©¢z~yz
~z{prvnos_xwellljj
ofrikfh^ds`[kviZJ^\XOOKHHRUG39]^lPEYUYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDU]hD.<2dW,2¡¡ª£¡¢¡·ª »·¥¬½Å´±¯£µ¯¬¬®´Ãü³¿º·±³¹¸º¸º¯®À³³¸¯¿À·½ºµ¦¢²©§©±ª± ¿µ¤§´µ¨²¼©¨¥©°¬¢§¤¥ ²¤£¨©¢¤ ¤¸©¤§®¦¥¡¨ ©¢¡¡¡ª ¤¨¤y{}z
{w~|ltrllsawuhhjggphhicfjj`kcjh[f{c`StT\[RLJFIOS@!*h^iLDWU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gP'2¢¤¤¦£´§ªº¶§¬ÄÁ¸°¬£¶®§®¶À¿¼²Â¶°®²¶µ¸¶¶ª½³®²±¼¿·¯¼»±¥¶ª¥¥³§©À«§¥¯³ª¬µ»¨ª«±¥ª¦¤¥¬¢¤©¡¢§µ¦°ª®¡¡¡ ¦¡ ¥¬¡©x
v}
{s~~fyokjkfuskcgddvbefffjjckr[_Y^mdaNiXZ`VJGHKMRX>9_lhHCUT][IIGEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=++,0B*JK./*+3722(57$+7.72685]yN2>HiZLYJVbf@:3BhH%5£ ¡ ¤³±¢²½¶¡±Æ¼º±±£·¬ª©¸¼»ºÀ²®®®¶®²¸³©«¹±¯®³¶º¶¯¸½¬¦µ©¯£©®¡¿ °£®±¯·®µ¯®¢§©¥§¥¤¢¨¬¯¦º¨®¢¡¤¤¨ª§©¦{s
|
ofymhkifqrk\hcctbfgjnlgkjhn]llsp`TcicfYIFLMOXQQUaeUAWSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC&4¡°¡©±¯¹¿µ ´Â»½º±¦·¯§¤··¶·»®¬ª«¶©³·®¦²µ²®©°¶¶°³¶º¦©µ¨¨ ¨¬§½¬¤®¯¶µ¬±°©¢£«¨§¤©¢¤¤ª«ª¼§¤ ¡k¢p£u©§¡ymi~vql}
p^cag
ktw~gguheW\hsmNPjcgs
h_efnmj^_aeNKD9GTh^JGQPTULHR`oteF[QUPFHEC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=A@@=28@E=1,+08=G701.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.¤° ªª£½Å¯©·Â·½½¦·°¥ª¢¶³±²±¹¬©¦¬´¥¯´¢©·¶¶¨§¬¶²®´³¡©³ª £¥¦«¹¥¥¯³·®¥©®«¬¥¡¡§¦ ¥¥§¦¨©¤¶°¤£¢£¡ ¥¥ªsx
¡vif}sx o~|¡ |tulmieczlraS
mbliqXiqpX^i[ll[rnzr
gZ_GN?G_MERVVQQSWTg]MVHRROFGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(§«©©§ª¿Ã¯±º¼¶À¿ª¥·¯©¬¤²´®®³¶ª¨¥°¥´²µ¶µ¦§¨²°¬²§ª ±§¢¢ ¡¬³£¥¥¶½¦§«ª¬¨¦¡ ¦£¥£¤¤©¢£¥¦¡·¤¤ £¯©¡
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êr¼Åzrµ¦»{m±«°yhlX±®nei½¼ngzorØ~Skc¶²rs¡ªWOWbOVNFU[XQPR\W[PA\DQNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>:B<?A8:J>52*22BE/.32.+/(-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!§§ª¥¬²¨°Â¾²µ¿µ¶¾Á«§³¬¬©¦®³©®¶³§§¦´¥§·³²¶«¥¤§±¬°¦ª¦£°¢¡«¢´º£ª©¢®¥¡¢§§ §§¦¡¦¢¡±££
¯kjª~fdp¦q®¡¤~x»}k¡v±_j´[¥e`f{fjxk©e¾rg¦u±j|±xtcnm§n[¡EhfEu`~g|¤§Z_«hxyj§7J¯\XSld[KNX_\WV;NOWW/ITSJCFF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢§¥£¤ª±·¬µ½¿°¶Ä²·ºÁ¦©°ª®¨¨¯®¢°º¯£¤²£¨¸§³³°£¥ ©¬¯«¯¦§£¡¯¢«¥¡´³¢«£ ¢¨£¡¦¤¢ ª¦¦ ¡
µµx
©µv³·~©~k¦{w«gk±\«ztrx °vwqlll|N¤XHbb~ch¦`yruS^P©mcq~b.Q¡o[Skh`LK[dX\ZB>±yWXA#MhFCEA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J9aU50 ³¦¦¡¯©§³¬©»¶Â°»Á¸·¿©¬¦±© ®»ª §´¬£«´¤¦²³§£¢§ª±§°§¥®« ¤¨µ¯¢©©¨ª ¥¨¢£¥£¢©¦¢ Õ¹p°Á~Å|Ö»|¥¤{¤¥z¬yV¯z~j¹Z¹v}¦|zªxz±nt¼
oP¯§ÅQ zc`©bsrm`Sµ´È|c¤3Bv]PjicP@XgZdaJHMnN\QOYfYCD?E?0=<59;74<<8=:<C:F::?6:@C;6@OLH<:;DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aP71%¢²¨¨¦´ª¥´©¤¼·Á°¹¿±µ´º²´§±¯¢°²¦µ§§¹¢¯°³´°¡¤¦©°¨´¨£ª ¨¨°©£¢¨ ¥¡¡¡¡¡¡¢§ ¦ §¡²nhµq«n¦r´sr¶{¤¢¡¥~°vÒÒv\®{
¤oª¦k|}{°rx³etofQÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjceXAOk`lhPVGI9=URZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aL620¢¥°¬£«¼¦´¦§¶»¼²º¾¶¶´¹¸²¥´³ ±±¢«¯¤¦¹¤±°´¸ª ¥¡©¤±§¬©£§¡¦¥«°¦¢ ¥ ¤¦¥¦¡£ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
~
v¯w´aemZ°XKuyf`^vwhl]¯wxl5yÈ®²_BTo^g`EPl`pmVVM.fdiSYP;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK96<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`H:99 ¹°´Â¨³¨©²º·³·¾¹·±´º´¤·²³¬¨«§µ«¨¯±ª´¤© §¡µ¦¦©¢¤ ¡¤¦¯¦ © ¢¡¨¤ ¥¨¤¡ ¡¢ ¦©}}¥x¡ªp§¡£ª|xo±Z¨ ytØvs¨¤|{²^d ~m\«[Zhgªdr{ks^«Z koeOJC¡\[Lt]bgN[a_rs_KV7JXGE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@5.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¢À«´Â®«©¥´°·°µ¾¹¹±°µº¨º´¯¤¤§§©°©¯©µ«ª®¡ ¦¤£¹¢£« ¡¨°°§¨¦¤¨ª§©§ ¢¤¡¢¡ ¡«®mr´s©u§s´xs³¤£¤w¸o{¢jk¶Z¡
ei¡¢§mr´t²j
ju³af¢ok\_M¡|Rs£ly~or]¯V<wfTon.\§OcSkebmZc]ap{cTZR>>mo3CB@?M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¦¼¡²À®«¬§·©·¯µ¿´»¯®·¶ªÀµ¨© ¥£¡ª©§µ¢²§®© §¤«¸¢¬£¢ ª¶°¨¬ª¥¥¬¢ª²£¦«±¡£¢¡©«Ô»s°ÃÃ~Õ¸x§z¤¶u}wv²`ºyÀ|u¸cµ©|¬©q{t¼§ ia¦¯¡~tª}¾os¼t²uxnrn¤t½^w}Zay¼kZV\jy^jaegcmxoZ\YCA@s@CF+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¢½¡²Ã°ª«¬±§·¯¶Ä°¸°¹®À°«£¡£¡©£ª²¤´¥¬¥ª¦¬¸¢¤¢¯¹²¬¤¨§¤¤ ¨«¨£³£¥§¢¢£¯ ©¶·xµwmknsoy
tÁ»½{±¨qs¹|||¤»¹½uz´£twvt°ufjµtrqw¶^z}hynzc¬pu
X[§jEeZTf`c^cQggpluCNPMD:ZM?J3;0 8>;.3=A99?=;<C6BSYZZ[[Z[^`b`]SGGH4DITAKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O^]=+:VU'>;<§ ¢¿¥´Ã´¬«¨¬«©º®°Å³²µ¦³¸«©¡¡¥ «¤¬©¥µ§§ £«¤½¦¡©¡¡§¡±µ·¤¤¢¦¥ª©¤¥¡¨¥§¤©¡¤¯¨¦¡j}i¦xr}tyd{½¾Àºor`rjZ^`ck`cmwble^`cqir}gkrux}~b[wthP\n}{kXkzsJJopNtMEX]gaL[Xgc_O[muiqRQDEM;GI=M?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P_L(3>[O'?2>© ¨¢Â£µº¶£¬¥®§§µ±¬È«¯²ª³¢½°±¦¢§£«¦®£¤´¨¤ ¦¨½§¨¤¤¨¨°²¿¬§§¢©¨£« ££§¬£ «£°§ °¥¡§¢£¥¡gm}qw
µª ¡¡z¥
mk}|uqxyvv|kstuew}wkozm`c]phMYZfj`WZoymmfTPFS9OZMQO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\J,<-@³ ³¢À¡¤²²¶ ©¥²§¥°´ªÈª¬¯¤´¥À¦³ ¤¤£ª¦¬¢£¶«©¥À«£¡¢§¨§²Ä°««§ª¬¡¢¤¯§¢¥¨®§ ¯ ¡¦ ¢ ®|ª©
z¤g¡³¯
v{}wyzofykuzsis{vkudyf`jfcdfkYl{oik]SLPD^TE@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_bca_]^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4[G5<,@´ ¹¯¿¬«®²± ª¦²¢¬³¯Ä¯©ª¢±¼¢³¦¢¡§¥©¥¤¥²µ¯¥¾ «¢¡¨ª«£´È´ ª¤«¥©£« ©¯ª¦¤«¢® ¤¯£§£§e|e~cymhk{¤ªje}geeih{¡kg£wkj£slnzzXf^^mv\hswvnxxsmytv|kY^ltd^sik|qkd_RNXIdXAJ4>G7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO2YC;?.=¥º¼º¯¬´±ª¥¨®°¦°¼°¨¦£®°¬£¡¦ª¬£¥§¨²£¢¯¥¶¹¥®¢¡ ¤{¥¢¨´Ä¸¥¢§¯¡£¢©¨¡ ©°««¤« ª§§ ¬¡¥°¤© £©}½r´rhx¹Ä¸q¢£z¦r«|ËÀÀ»q£}À½ÂÁ||ÃÀ}l¥²ooÊzwvyyqzpw
ynxcg`xd`ec^tglddYLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__a_^^^^___^\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP.#F[3PY/VAB;/8£¹Ãµ°°À©¨£¯¨°®¦²³®©¤¥¦¯«ª¢ª§¢«¢¤¨¤¤´£¢¦«·³§®¢¥¡¦¬¤¬ÀÀ±¡©¯©¢¡£ª£¡¢¬®ª§¤¤§¡¦¥¬¨£¨©¨« ¤ ¢~Îxz¤y_®^§¢ |§s«¯^cª{¨
u³c«¡³j¯u}·aZ£Ínv{Ú{p~v~e{vvk|n}~marmph``yd\qhjdg`RTSW]KOC5AHDD8>6;@?A;=8@>>?BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸£ª§³«¦²««ª£ª¦¯©¦¤¢¯ ¨§¢¥ °¬§®¬°ª¨«¤¤§£¥«°¨Àdz¨©±®¡©©¡¬®¨¬ª¨¨¤¢«¬²¥¢ªª¢¥¤ ®¦ q
u
¨q±}r¬~¢¥v«}r~«v{|~ª¢~«{{WÅ{pÁ}muomeveoawnronfpuuqagme_oiingdXS]aYRSC9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3W@F!G:C1.+°ÓÆÆ²´ ££¢¢¬¯¶®¨±¦¨ª¦««¦¡£¡¥«¡¥¨¨¢°¬¨§®«§¦§£¡ ¬¦£¯¬¤¬µªºÎ²¦®¬¢®¬ ¨±ª«««¥£«®±¡¨«®¥¤©¨¨¯¡¢£¤j¤uz©tz²p¦q ¤``R«
®v§
z{f£¤£}©~®_|©V£z£{ïÅr¯³³¹rb©¯Âthnqozxypmgeerpf|ic]W`jXYULLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^aa`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÔ¿¡«§ ¯¢°´°®©¬¢§¦¨ª«©¤¥¤¥§§£«¢¬¡£¯¡«£µ¯® §¦¢¢§¥±¥¤¨±·È²µª¬©¢¥³¡¦¬¤°ª££ª¡³¡ª³±¡¨§®´¡¢¦|©lu«y|°o¥ Ò¸´¸É²_`©¤ zxªÉt¤¨©ÆÆyg¡¥t}¯]p´b°uK£m§Gd|qq|u~|n\fjsqfk^aYdm\_YIMLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ¨²¬¥¢²¸¬ª¡¥¨¤ª«ª¦¦¥ª£®«¥ ¬©¥§¶¢¨ªµ²¬¥ ¥¬§£©§®¡¥§©°µÃ²³ª¨¥¡£¯¥¡¥¦±®¨¦¬£·¬¡²¸¯®¦±²±£¦¢Nxz£}¤
¦¸{{y¹ÌÆÂ¶x¡~v¥¤©°
¬}c¦m¤p
}r¬`£sq`¼}RUt£{~v{sq\nnxrjo[d_inbd^LLQTAIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__]ZZZXUSOH@882.,*.+*''?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª®¡¬²³¥ ¥®ª§¦¦£§¡³®¢©¦² ©¤£¶¢¢¡©´¸£¡¢¡±¦¥ ¡¯®¥¨¢¶²Å±©©¨¢¤¥¦¤«°¢®¤¦¯¤»¬¡¶¶´±·¯±¥® £
ѵ÷y
¦y¡w ¥qª
´nrj£|s¯¦£¦nq²]¥tzl{|m©a£qqbs²¸hw¦}y~ynjyizsou^eeomfg`J[XX<HH@U4@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][[ZXURRQF:223//++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¾¿¼º´§¤µ¡¢¢¨¦®««¦¢¦ ¶§£¨§°£¬£¤¢ª³³¤¤¨®¦¢§µ¢ª¤¶¬Ä°©«©¡¢ ¦¢¦¥¨¨®£¥¦½¬½¯¬¡¯²¸©²¥¨°¢§y¨}|°w¤¥m²p¡|¡§¬
®
ª ¡{~««x¡z¯^¤}¦§d}sj¯]¥kp
]`[ m¦||knctnz`gfqnhghCYa[>KU3U8BBC7$$3+''3, /6674359@CFIKMNQRSSVZ]_a`aaa^][ZXSPONI7042.*,ATVVVTTUTUUTTUTSTVWWXVUUQHFIJ#((½¨Å¶À³¬ ¸¥£¤¢°°ª¤¹ £« ¯©®¡«¨£®°¬¦¥¬¬¡ ¦¡¤®¡¨§·©Á¯¥©¤¦¦¥¦ª¬¬¤¥©¨¾¤Â¬ª¢ «²¸©¬¥²§¨u¯~
~ºe°e} ¦¬°
¦¤¡¡ \lj³`{{±mgo±[~µ\¤kÈ¢d{¼XvµY²}R®z¬X¡m¨|zeu~cxt|ajgpmgefOUd\AU_>I(>9=4!",%2. *1/045799<ACFHJLNPQRTWZ^`_`aa^_\[XUPNJFC553./@UYXWXWWXWWXWVWWWWXWWXYZZ[\XWWGB;Ò²±·½º³Á²¢¬¦¤µ¨ ³³©£ µ ´¨ª¬¯¬¯§¡¯«¨¦¡¥®¨¡¥££¥ ¢ª³©½°¥¨}¡ © ¢©®¨¦¦¢¥©» Ʀ¤¨ ª´´«¥º¬««©£¯¤¸Ãº§¬¯§¦ª~սªb£¿½}~£×º¸µ
½¾m£o«lz²°Çi«°½¬xw¢¾¼s¦ {{d~{egy{alekjcPb[Sj\?TaCN)=:4/$%2 $(0496677;>ACFGIKMNNQTW]a\__a^`[\YTQMHC?=A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³³°¿¸±¼²¢®¦¤²¦¥Àª¸²¨¡¿¦§²±º¨¯¥§°«®¥¢¬ £ª £¦§¡©£¡¬ªº®¨£|¦©¡ª©¡«§ £ª»¨Ä¢¢©³³©®¨¹¦svª¥¸d ph®nnw¤u®pq¨£®¤rlllfxonqzjqigqii
gqd]bjoY\f}v¦_aqned¡¢~vgxikyyemcflbKeXJlZ:PeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY\^^]\\\]^]^][[UW^©¬³©¹¸²³ª©¡®£²©¿³ÅÊ¿·«À¬¤¢§¬º£¤®«¦®©
¦ª ¤£ ¤¦©£ª¡¦¦§¯º¬¬{¥© ©£±¦¢«¹¯Á§£²¥«¯°©¬ª¦µ¢¬¶¡¨¦·£ª©²£ª ²¢¡¢¡¥¡«§¥}g~tusp§lz¢¥sjwqxw}zjmdcodUaY@j\HcaOY+F=+'!750.!%2(*699469;>?ABDEJKKMPPQXUVY^`ac]^TQJED>9=@ASX[\YWXXXXXYXXZZ\\^__`^^^__```_YY`¦¨ª¤´¶®®¡°£ µ±¬È¾Æ¼º«£¥§±©£¶§©´¦¨¬¢§¬¤§£§¨¦¡¤¨¡µº¨«|¡¦ ª¶£¦«·§®À¢¶¥®¯¯«¨¨±· »¥¤¦¶¢§ ª £«¯ £¯¨¯£ £ª«¡«¡
}f
uuxsj
}£¤
|ss{s|jod^pj`[`ZndP`ePZ:GGE>2=>9/*&+)&&416668:==?AACIJGJKLMSSSUZ``iaeVPJACB:9EMV[^^[Z\[[[\]]^_]^__aabaaa`bbbdb\[c£§¢¯±«®£©¦¬§µª¥µ½°®¢£z£²¤¥±©¹¦£ª¢®¢¨ ©¨©©¹¶¤¥y£©¸£¯µ¢¯®t£¼¢±wx¨°¹u¬£«d\bv ¥}m³£§ª¢esyp¨m¢¨e¦
wjvp{
`hZughs{¨f{yj
ozkre_vqlkh\ffbbpS[>NNNSG>@UD:1/&4:306678<;>@AAFHBGFIKMSTUY]`hfhXPJ<DG<8UR[`ab`^__`aa_\]__`aabcdabaaedchd^]f¦£ ®°¬«©¥¨¢§¤«¶±³§«§¬s° ¨«§¹ ¤¬¢§¡u§©¤º³¨ uw¡¡§²µ³º¦ ~§¢z¡µ¥±ª¯¤z¬¡§¨§
w¥z§{²z¡
bz
mpyp~
s
xht u}
£
klx{qqgdwojlk\ekjft\^ITLR@E6.ZUU7)!09>>743568;:=>>@DI?IEJLGSX[Y\bahfZQH9DL;>aV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah¢¦¬«¨¬ §¯¦¦©¥¯È¿±¢¨©¶¬§¢ ¾ |¬¡ §£¤º²¨
qv¡¥«´´Ê©¬¶
°¯¬¨¦}¨r{w§h¤y´¦§Â«¡r¥}
²¡}¡¡}
mr
~yq{tÅf©£k
¤
q
hxu|xhhvphhl^dplgnYgG]RM3E47Nbd7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^il\QE=KM@JcX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢¯§¨¨¥«£·°©«¦ £¤«¤¦«¸£¯¡¨¦½¡y«¡w¤£¹®¥~bm ¡¡¡§~¡§
©
£©¢ukvM«x¨¦©«}¡{z§jkg·~n`dY{dhr}yl]}m_Rp\_kx_Xd|p§ªk£nr¥p
jg m[o}gZ`bXPowfmtrkjo]jplljYiO]YF9A5HD_l5,IDRMN=84859;6@;;>BO>QRLMBJ\]_W]^bu`MD:MONTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ©£¦¬ ¶»ª®¢¡¢¥®¡¯µ£¨¡ §´u¦~
¬¤©¦±§¢in£ ¡¤¢¡ v§ ¦
§«¥x|~¢ps|ym¨{¢sv¦f~w¤_z}t¢n·´ºtµ¨dƸ{p¶r£bs¬«`|i³~m|q£lr£t
¤a³r}³us[²jbotvqioXklrsg]i^bLE=D6QBZs3=SG`JR=<395:96D;;@JP?UMOQ@E__[ZX``|dHC8MWUWbaZefkkbbeadc`ab`dd_`cknccddhdbgfchh£·ª¤¶´ ¢¤£¦®²®¬¢¡¤«x
q¡}¨ ¤©¨¥
~j{~}¡ w¢q¡©¥¦©}~z z£xt}¥
¢d¡|mhoz§}rit«tªh]
v
gªk¸f\¨p`^§vu~huon§]©y»k~ª\]´g\nrzxki\qjxyd`fXbBQFO7WCRo5L[[_NZDA251<;6H?:CHU>YRY]>Db^V`Qac}jEB9N[^YdfXfgnmbbe_aa__``ec^bdoq`deekecihgki©´§c«¹±°¬¦© ¯±©¤¡ £jr{z£©£ iy{£ ¡rhp©¡¥¦{°£¢¸w£³£¤y{«~¢q¡|
¯µ}k¡y~µ¢¤«¨|}tªZ]o{xbL{z
cyBLX¢jq{lux±³§wns}ptk¤]vHed`tq~~of`liv|eeaQ_W]TW@ZFQhETW]bX^ID=B8?B:IF8LEXAWR[VDFb\Z`K`m~rEB<U_bZeiVghmobfg^aa\]^`hb_ecvm]egfkdflihki°S^ ¦³¹²²©¢¬ª¢¬¤£¨ ¡woy
|r¡s¡
©|l
q¡x|¤ ¢}µ{¥z©|§hwm~t¡sr|p®}¤¥£o^©gu¢co¥aÓ}{xssb¢~£t¤vk³`sª²¨¼wm~¿¦©´]n|pmr¢r]¤gs¦`h¦mÔ~pz{l|xsn©¤g`ezq
lhfdnuxh`cS\fQQbHYJUaWT\fk\eQFCKMJKBKE8O@QNXSYOSQ`ffjRcwywIFEc]eZhjTihjocjg`c`\]]_hbaie|d^dgdkdjmghlh¯ªT\K~©¯±³¯²£
© ¡¤¦©¡ª¡
{p}h}wol|¥«yvnw£{£¤³¡¢¶z¬§¤®¥p©
{¤¡r¤®¯¤ vµ¶µÉ¡s`©my t¢w ~pMf£ps¤{ytak~ kqd_q}shyi³µ´Æ¦s}zk«v
mvxj{urQE}³_jvkzfkhcuuqnW_TYiPShIWMYTV^iloVhWNKAJMKHJOAQKPecjmetrsy|nu{{TQOl^i\kiRjhilhlfce_\]]^ibdik{_]dhcjfomeile¡®¥d?¡²ª®¯µ¢¢ª¢£¥¥§¦zjye yui
y¦ªz}yp¡y ¥¨fnxl¢d{q¥wpg¦z¤zsw¹n¢b} nriªku mo¦`iiu¢~`upbh e~iuocfmq¢Z^[b¡m]nz}srd¥mx¢dg§hsp¢oUo _f¨T^TnmskrmpilytkpRYWWfZTmIYO]IXiiskYlWQRFV\LXSaUik_wt{}p||r{svv^RrbgcpgPjhhklnhdg_]^]`jbjivu]\chcjjsmfkmc£¥ydsm¦£©°±¦«¦£¢£¢{qi|su~{d|¨£~si¦} ©¦¦x~¤±¯¥vx©s¥n¤¢»n}¥¯
|¥zr¨ g~o¬dw¨mª¢vw«¦k°kv³©k
mm`~«ªv~~¥v|¤ jx¬h¶tw¾¤Z§«aurtp|uqckoimSW[Vab]kM]R]J^mow`[qY\`[gtenorcrt`wz~yrys{{vbxdcnrdRkgholrjfia`^\akbmlzo\\bibljxmglnb¤©£©©¨¦®¤¬¥¦©
t{o
~ttsm}{¦§§
vol©ª¢u~y®¢qw}{r§r~}zy{~v {}k
[yyrzqin~quqe_wtruoynml
^ugwe
¨}t{jpv}wnnhsz|x
\lXyioxrqoxxp]knjgV[`W]fkdVcU_Q_pyymkwfkkkw}rrutaovbt{xuzux
}{nldyn^Wnghukxjije\`Zcjemqtn[[bldllynhloa·¨¦ ¢¦£¤«¢¡¡§©r|}~
{trq
{}y~¥|¨¢
wr©§ª~~§¦woxn~¨
q~qkp} hl\sqtkwtYrn~j]jd{`ixz{u
gwjapqt^q¥
enwqzqhhe|{[\khnv[|yxunssg\mkkbZZ_[Ylq\_aZ_]et|vpudkkk|}s|yudnuhm|~wz|{yz~o{}t~yshT\qilvpugkhd]aXkhkkqrnW[enlgszohjm`©°¡¢¡¨£¢~® ¢¥|}s~v
ror~z¡§¢yz¡ª¡¢££ª¡§¦zv§~²¦±¥k|wxe|
w|zt ~}uor~w
¥
}zm
~zksiatq~zwwowt]^ohn_^Z]]ShrVd]]blhv|}topekji}nyrjpqlg{rx}{m|zx{}zxNcvjsnpzekecb`[tfpgrqmU]ltmiyzqgikd¹¡ ¤ |¬ }y|nys~mk~z
|
¬ s}{ª¥¢
¦¥u{¥{|«¢©~oxru`u
nyvt¡
s{|rqzzw¦
w~qm|ohlmh_zh~|vuvu{x\_q~nt`c[]_RgnTe[^bkivzrlmdkjhltlluozpynv~
vr~{||{`h{juiidjc`i\cuhobumlUcqyepz{sejmm¶ £{x§¥yz
|n|ys
~}kh}|~|©q ¡
|¨x£ ¢ £}w ~|¤¡¢¦~~utqwa~r}r
hxrx}r{|pwzxx¥
{
v|gs}y{qmkg_~sh|uvt|sj^`tvpwdcY__RkiUeY`ahjvyqgkdlhfkn~hoql~yzls~tv|{}irntiahlb_qVtomm`xhmWjtvcuz{rbjoz±¥¤ }w¥¡£y{~r{tv
~xgc~y}y¡p¥¦
w ¡y~£xw~s£¢¢~|vq~n{d|
ql
fuo{
|w{{zq}wx¡vw|x`zy~txgmeajjwstv~q|cc`snurmaZa^[leRcYaahkvyqckcmfh|miuhnpi}ymr~t|~{~|mvsumeljbbvVipn`xglbjvpfy|zq`rl
¦§~xªzy|~||xtyzt}d_}
u}~}¤¢s{¦ s¦rkzo¤{yqzlul|~nxq~~eri{~sx}uw|{£xt}tv
pb|v{r}pbocd|cnpvsxwstbv`olvno\\_^^j^P]Ycahnt{l`iekciwnglikmh}{wos}t{}z}}rzxxmljh_ircgqoewgnlayik}{xpaxm©¤¨~x¯}w~{}|wxput|o}|a\~s{z¦}}£n¢ me
zp£}{
ssvlqnu|tnqu||eply||tsxn|
{§z{~
w~qp
fizuvq|b_pakt_qj{yylspey^nlsmrX[_`ak[PWXecgqqg]iigbgqodiheiizwuo
t{u
x
|x
zw{{rxjk_phtkromrgole|cnzwqlww~¢¡§ ¦v«¡s|v
xyss{kspznvoq[Y~vu ¢x
m¡
i¢e~w~}{|ovplmop{itqwuyfrnu{yyusozy
¢{uwynl
_tusqqyZ_qapk^pj}{qmmjmv`ookqmYYbabnXQTZfgcupc]kndcfkn`gg_hkurspuyvy
xw
|{vjqc|c|nqmtjholvx_qy|uut~¤¬§
v yqxtpr
tqvlpnvmv~nnUQ«xwrz x{£|s
}hg
qw{z||kwjnkll{bz~v{x}ygsls~
zqyovyy|{zv|wqjl{ayqnmrtV_pbra`mozqhoffstiqkbwe]Wf``rSQO\fe]yp}`\irbbefj_he[gp~pkqt}v|uv~y{
xs
~|yxfrk`~ookz`jntu_t}yxts
}x °¥
vtwtqp
tprpkiwnn}}musRMßÈÖ{puv w{s
¡wz~yuf
k¢cqz{z|m|esoklzz[yz~{zhrjs
|k}~m}
|x|uwxrmgq
nkuphjunS_oepZ`lrxgkjbfxrpqc_w``Vk_^vPNLagc]zqu]\evabeedagbYissnkqv|tzuv~s{r|~vesn|e~nplYlnyys`vz{vrwwy®
w~|
txpyqoomoseeyq}mz}jhkc¤ÁÜ®ð¡slvv
£p¡r¢
~zuxvum
|¢
^m{}
v~~k}dxvjnysX{
z~yeri~kum}x~trwusqgvzcunqcjvhRaqglV_otzard`i}pso[cr`bVnY\xNMLdfb^wsn\\dy^_ee
`cc_Yjsknksw}twxw{q}~{t~sguryl{ntqWqzvyrewyivr¦£}qwy
¡|{swptjplim|u_axw|qu|h`d|ëÚµÉÃÜsltwjq
|{
vxr
u~o¡ai|}rqwhvsjtwlZ}
}vark~~}mkw{|~npy
tkqlsyaujo]lwaRerifS`pvuap`]hqskWghbiXmV[uLKLeg^bss
j\\ey^^dg{ad_]Ykofojtx~ss~{vzs
|vw{ulwvyxtnx{}Xyqogywdv
p
¢toqw~} xrtnodrifmxx\`y{{qqjagaÕ¶¦xnqw|qk{i||}ztz{qu
t~b
g|~~m|ulmwuuxvlc
~}p_qo{{~ypey
z|~mny~umnkl{diljYnwZSjsibQcrxmcf^Zjntb\h_dl_nU[pOHOge\goqmZ\cs`\clwee]]Zklcmjswqp|}txx
|uy|vpxy{on{w^tmiztsgs|q vvmw|w~vqpljau|gbjuz[`x|zmqechgW_qs¼Äwqtsk{|}|t
vv}quq~szf}r}g}{y}i}vfpyxtxtlkyk^pwz}
{~rhxwz|mkz|vtoih~we]qcXptSTosibNhuyga^]XootYec]jm`pOYlRDThbZlom{oY[^mcZcowdg\]`kjcliswqn~{tuz|
v~xtsyy~oo{qjyz~nm|vkjxtk
o~vjyyozsqljd`t{i`fr{[as}zgpzaed±²wKbZ¥ÚÑr{y
ol
yy|yxoqt}{jy¥n~uw
pz~oxh
xr|e|~vcqsjzqou|wyzk\o|r}
zqmp
qwwmm~vzehj~raZxZYrnNXrtf`Kmwub^\[Yu}rpWg^fjq_oNWiS?Yg_[pkgyq[[YkeYcpy_h]^elhfliqxom}vp{v
qq{|zyukzlp~t}or|{poyf¡gpgz~
|ixrllf_aoym_boy\dlzaqv_deÕë¾2:>ryw
nm
u}
|xnv
wnku{tey§}msux{x
lsi~xm|{xbyrdqinvrutv~soZk}sx{|wypkqw}}tmjvuu\iiyqZW}SZrfM[srf\Jqxp][[Z]uuiYb[genbiMWfQ=^f]^vf_uq[YUodZdpy[h^`gmgjkipx}mjyn{}zu
pnw}{{i{~kt|r{sw}zx~|kl~kh|~}kuqgic[cgso`altahpzast^bc n\5Z¯µuj~wuwpm
tyx}zsgu~}oq
}hvynez
¥}m}t~{
|r|~
|i~mk{yjzvr`w~rdrgvnu|}pwz|u~mXm}usvtzwrmq}{|zmmhmun]hftrR\|N\q]O\spdVKtykXYYZaqua]]`fdhhfNZhNAad\`va\umXXSta[eorWj_bhkgmlipw|li}|p~{zwr{oqw{j~{nxyww}x~~zm£
{vzkm
y}{}prpcf^Yg_pp`ahpfjotato[`djv{¾§¤É¸r
s}ytrspzsutwyyqdwzhqufwvdj|}q~rx~wzlyzuhzilysizv}h`x}kjth{jv|~~q|v|t~bUu{qr{pwxoo}|w|{tuhpglrp]hctoLfvL^oVTZtnbQOtybRXX]aps[a]heecjdQ[qIDdb\dq^\xhUWVw^\fnhVl^ajgennhpwzniy}s{~y|v}pvsnw~q|xzztxzuo}~{w{guz|vgpn`e\XfYmsaaaqllhn`siX^cmw©Ú©Ç³rypv}{utu~vopm
txul`yyeqogun[m}y}wzl
tr{muvmhwfm|vmjwv|`bxzhuvc~|hu}uvrz}mYVr}os~wksxjt|y{wyq{rgsdmls[j_vfIooL[cXWVymbPSuvYQVX^`ro\`cmdc]ocT]rGBf_^fi]Z{cRV\u[[gkaVk``nfflqhpvxtkvvx}w{t~oququ}
{wx|}
x|}}{~rvx{wuz^~ytw{bnm\b[[aUjtd`[hopgqaqfW\ck|Êκ¢knomrr~{
zytzutzjlvcvvog_|yeqjjqcXm{rw}{mop{yrrp~ghrcnxqjlqw}|y]ezxiuygwhu}sjo~xn}]Wp}ms~{mnpvfv~~u{pxr
{xqer`mkrXk_x]IplNWV_TU|kbOTvrQRTW^bti]`kjfbYnaXcpGAh]af_\V|^OVeqY[jh]Xha_rfjhqgqswynu{w~yus
pp{xwuy
z|u~}~~}|xvyv~}nuzdto
zucnjY_[]]Uhse`YdrrgrakdWZ_ix¾®z¸nbtiu|rz{~wxswozvejoausjb^}wxep}hkkZVox¤
pqwtlr
}yusoiyajmamvjgkkywzw[g}|yfr~n
tfvpgk{tlub[nzjsz{et|mpgt}v|~pzjxyxwoelal}lnVjaxVKklOROiNY}hbOUukMQTU^fvg]aqhgaWi\\kiJEjZbeWXUyZNWnjY]le\Zec^tfleqfsptxp
vx|
}utnsy{{sr
y}v}z~{w|wvzjv~}lrq~oflgX][\[Tepe_XcruivpdebW[[hporsefzjuwttx
zwtvnkzpahkgtnf^_|oz}hmwfjdVWsp§}|vs{q{xlyzu|}uqsmhu]mi`mudgfizo{sYgvuhpxvbw
}okm{qfse_kxfquz}auuikqtyoxwr{e|}~wunce`l|mkVjcrTLjkPLOpH^|faNVtdKOTXakw~f]gsie_WcWcq]KKkXdbUTUsVMYveZ_l`\[de_wgmbpitoq~utxxz}v~
nrt|{tq
zut}
|~z~v{£¦y
lu||u{o
sz
}unjieV][[ZScne[Xbt{jimh`aW^Ziilogmbi{zktuuoz~wvn{hjyj_enhwgeXavi}ynioff]UXoi¨wz|xtn}mqtx~wt
vjsvhio\me^ns_gbjxh{m[mstjo~zwaw
zsrpzrcqh[mvdorzwarogixsqkwvsubz}vuocbbm||kkUibgTLnhPHRlEayfbMTr_JMUYelx{f_mpjc]V`VpoWJShXg^XMUlTK]z_\_l]][be`zhlaoovnowuz}wyzyz}qtt~zvt
~}ls{
}~{u¬zlrzvuno}tjonedX_ZZZUbjg\Z_ui^ml\aW[\kequ}ij^mxwhuxsn|~~zvslzhiwg]dsgzwccTdofvvfhjaWVYhc¨owzpo{fwmyzvq}ndwtehi]lb^pp[g_muezh]tnrkq{vubu|xru~taplXpraopztcqk`lznihywspdtxxtpd`cmr}jlTi^_ULucQGWbGcwfaLTqYKLXXhlvzedmqfcZX]XwgTJ\cXiXXHWeQIcx[]_m[^\bd^ij`otxmonvyr}~uvx}tuuyzz}
jt{}~
y{~|sq®||~fqzt~}vrol|~mzcppbe]eVZYWcfk`]]siYqn[^XZ\l{bqwvlc\ntuhuwqnyzwootehte[gufvvz_]Seejs|aci\TW^bd¥iyt
xlmyfwl{ytrx|yiewm`ga_k`^ukYf]oobze[w|knopxytueszvor}raxcZno`opzseqd^muhcfxzrkmsr{qqa^emn}diThYZUNy_RJZYHcudaJUnUJLZWilr{dllsbaYZ[aw]TKc]YjSVGYaNHjvX_an[[_bc]
ihbnxymojvyn~vuttqvvw}}~~px}yxy~ssp¢{{yeuzsywltply|ps^poagblT[ZWidmf\\qeSrn[YXW`kudjujj_[ntrmttuk}}wonldipc[krdtvs\WTc_p~q\bc^SZa\derq
skjxlnnyyzqvs{z{dfvh^c[ah\^whWb^phawa[|vjjrnxtttiq
vsjp|mfwW[ilapqxseo~Z`ppa^io|kjr}qovio`[dkl{afTgUXSQw\RPYRHdsb`GVlQIPZUklk|emora[ZXYlpWSPfWWiSTFZ\OIsuX`cncXaaa^jcemzylnivy{k}
|y}mqovz}t}tx
utpvo¢t{{fwon|pgxq{lsvsk^tobgfkS^\Vhbll[\qdOom\VWUfhshctee^Zpvoqvvzl}}wscdkoa\nmcsxkZTVbbv||p\c_cTZ`Zccnp
rifyndruqzkytuo{v_gsd\_WbdYaueU_`mdaq]]~ohisqtquvlm
|
qrgn|oqoRZeidprusbluUbqj[^nd{dkt|qqqil_Xdijx^fUdUWQVoXQWTPHer_aFXkOIYTVnid|ikxkaW\U[tdSRVhQYgTSHZ[PNyw[_emjZba^^nbglyvnnivv~m~{krgt{u~s}
{ss}un¤swxnz`e}qgztylmqwgd|mdgghS`_Ug`lo\^nhMil`UVSoerkfxee]Zrvns{ysn{w{zkaelm^`njepy~gZVX_jw{zo_b^gVY`Xdbkp|wkjvl[upjyiurno{sXko`Y^VcdXeqcT_biablZ`~kfltuomxvlh{mqfp{lqlaX_ggnrsr^ilSepdUbmaxaotztinkj^W`fhu\dVbVTOYgSO]OPHep]cGZjNJ`KXme_xhn~d`U^T]u[TR`gN^bUSJ\ZQZvv]_fmhXca[^qchjxrsmhvsys{~|yntlss
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDCGdhgggghMBCCDDE9.....+H
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR4555549\`___`aA565557';|}zzz|}{|~}~}~}}~~~~
|y{z||{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
~|vvx||{|}}}}}~~~~~~
~wxz|zz|||{}}~~~~~~~}xyzyz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz||||}~~}}~~
zy}{{{z||||~~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}}~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~
rtx|||{||}}~~~~~~}~~~~uxrvy|}|z}|}}~~~~~~~~~p|ussvx}~|y}}}}~~~}~~sorx
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~vn{sx{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
smnztv
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\YXXWTPQRSRSMMJIFEHJGGHGGLNIgsuxz}zxwy||||~~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwtb^d_bkqfhklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhb^ll]fggebcbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHIJHHHIIHIVpsuyz{yvvyzz{}~}}~~~~~~l[YVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^ZZkwmbnsjbZY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxwz{}~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROM[krlamtrgQQSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMN\dokYisupSMOPPPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKFBEIVcgkopnmlZMLNMNOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHECGHIN[gigrnnifd`__XLJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>IZ][]flnkommlkiikcRGEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;=J[innojomkjllePGEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979::=GbnsnnlklgTB?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEFEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtstrqtxxy}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99<I_stqfR?:;=@A@=;;><=<@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyz{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;==><:Bl}i>:;>=>?@@@>?A@@@A@@@=??=<:;==<?@ABBA@ADFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@<\n@>DE??AD_d<==;;=>AA@>@@?A??=<><=;;<=>A@?@>@CCDBCEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{||~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mwH8;:=>A:Ie=<=<8:;??=<=;<@==<==;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIGHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR<<=ILFFuwM788:;>?WjA;<<:;;>??==8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CryI;\z|wW<=?==>EhtL:=>?==?AC@<9;A?>>A=;?A@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAGrykb}^>@C@@=Js{Y:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Ent}~}vMACE@?>Y{]?CEIJJIMMKECFFGEGEEEDECA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEDCWu~XGHJLNOPPMIGIGHIIHHGGHHECEEEFFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqruvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHJONOOMKGGGGDGGGGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl|OXdLIIGGDDCC@@CCCCFFEB@>>@AA@BD?>?DFHDFGIJIJHHHGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLKJT
voiSM@>A???<<<>;:<AA@><998<<=;>;8;?AB@ACCB@AADDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJIIe
~lbaR>8?@778896479;<:8567789787588;;;=@;999=<>;<=ACEHJMLLGIGORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIh~o`deYAW=5655873568:876565676777:67889:7578979776:<@GFIFIFEFOSRSSROPPRTepqsttvy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@6788=:=ECBe
jfkifQ7885588557699776765:9:::;798987669:98868589;A=>>BA?AKLOQPQOOORWkqrttuvz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=q
klkb?<>?99;<9:;9:;::9;:9===>;;<<:>;9;;<;<;9:<8::::999<?<<ABDIJMKIKLWorsusvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
ml`EDFFBAAB?@CA@>=>>@???@?@==?B>@A?@?=@@@>?A<><;:;:9;?=;<==AACABCAXpqtttvz{{}}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
{mkOKMKJGHHEFHGECA@BECCABCB?@DHECECEDAFEFDEFD@B>=@>=?@>?>?>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFW
xmamdMOKKKIIJJIFDDGHGDCEFDBHIKGHGFHGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGIY
yyeaOOMLMJIJHKGDGIHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@88<;;=:>@>?@CFIIP_
iRRONNMNJHHEJIEKIGKJIJGGGKLNLMHHIJMQNPNMOKIGIJHIDIHHFFGGIGCBACTnpuwwyzxyz{||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADHJLUq
aTUSPPOLKHGCHJGLKGKOLKJJLMLOPNHIKLOQQPQOOJHJJLJLFGHGFFIFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
}ZXUUVUPNLKEFFLONPWUQPOQSRMSTOMSLPSUVRSRPLJMMMKNGGJFFHJEDEEBECcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B@BBGVNFNPPTX{
jZXlcGTRRQK;;RSR`u]UVTVYYRXXRZfPUWZ]RTWQOMRQPPQKKKHHJHEFIIIHIirvyxyxz{{|z{|}|}~}}}}}}~~~SHJIHGGFE??AAEACGEDELXRMTUVXZ|
~an]eV;YZYTQ?@VUX\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXUTVTOOMJLJIILMKOMSosvxyxwzzz{z{|}{~~}~}}}~~~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~zopZ\]\SUSVVU[ZuYU}a\X]^WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~gZZ\ZUWUWRQWVcRerXZW_hP`f[[X\gaGOZhg][\]]WROSPPRVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[SSQORRRUSVTW_ux
~|^RWYVSVSRQLOMKfy[]TYUV]ZLTZUST^ZXWWWzkX[\\^TQQPINOWVX[Zdprvvttvxyy{{||}~~}}}~}}~~~zxwvsu{tk~kry^[VUSROKFCDAN^lVRSNOQOQURSRRUcdv
~yorXKMOPMOLJKDEIEC>TdURQQNKQTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquuusswzz{{|}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^\YUPLILIaltPQSNQRQR[RSRQRUTbs{|}{{
v`^ME@DDDDCAEPBCAC=CIGV@HNLG]iPHFNFDEFIGHBDHGIKGDBAD@OQMRdrtvustuz|{{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTSOV`klrv{{xytrnstsyx~lNH@A;<>@@?@?kPJ`EFHIEB?GLNGMQUIAE>?<=<==?=?ACC@?==B>JNGUnutustvx{|{|||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNKLQRQTVUWQQWUPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeDBAB=:BCAADB\]O{NOONKLMOOQLKMWMHG@A<977599=;;;8:8:?<BH?\stuuuvwy|||}||}}~~|~}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP_]ZIHPRQOMPQNQRTVXSSYTOYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHGHHBAGIEEFDMRPaWRWQPSSRU[OOQVPMIDF>:96587979:365795<C>essvwwyy{}}||{|}~~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`VW^ZXMLTTSPQUOLRSTXXTTYRMWYZVXXVXY]WWXhsk]Vaskba_^da_^YTQNONLIHJLIIFCQPS[WTTNQSYS\eUOSTQNKIHC?A9998978857578599Gmrtwxy{{|~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTVUUUWPSUWTUR]n^RNZ_[VY;DVXT[fJLPSROMMNNNLJFQPUYSTOJNOUST\VRUSROMLIHHF?><:787659967665Wppswyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpofedc\]RTZVWUTWTRXXYYYSUOJGOPOOMRJPPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPSMILJORPRRSTQROLMKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHKHFLMPMG/E_R>3?>joaSRQ@GUQPQPQNQOQPLJLLOPONPQQNPOJLMMKGEEDB;=<<9=G6677Dmptuy{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]gTQSAGUPOQQPNMNMKLKKNOOQLOOMHLLIKKLKGFFED<AA>;@E;<89Sprtx{z{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpknqmimcLOOMQSLTUTXWULLKI<987;>@><=A@B=>EHGCEFIGJJ@FAA@FHEJOHQRb\QPROSOOPLLOMLMLMON[WKMQOGIHCHJLLJFFFE?BC><BG?B?Adpswzz{{|{zzw{wy~~|{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCD=9779?B>;?A@@>@DIECGGIGIEBB?>=CBAGIDMObeQMONWKLMKLMMMLLONSdNKLRIIIEAHJLMNJGIGBAB@?EFEHDKnovyyy{{z|zwtxux||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGMMJMPMPOHJD?A=98::?B?<@BAADEGKFCHIGGHCC?B??@A>DECKNRTLJIMTGIIJLIKLIJMMOPRPKGCKGCBIILMONIJIGCCCDIJMLIYrmwyxz{zy|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqHKDGHHGJKIJKDFB=>=99:;@B?=BBCCGFIKJDIIFGGCC;A@B>@@BECIMPHHKGHKDHILMHJLHIJLKM]RHHDNFACJJMLPMKMJKFGGJMNQNLbmivvwzy{z}rmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKDFEGEFFGEGBC@><=9:::@C@>BCDEIEIJLFIIGFFDB;ACC>@CDCDGLNHKNHDHEILNMGILGFGIILNKIGENHBFMKMLOMMNMKHHIORQRNRfffqosxu{z|lhjnekqlspfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGIDFFECCBE@DA>?>:;;=:<>CA>ACEFJFIHLHGGGFEC@=DEB>ACCCDGHIGMPJFFGKNOKFHIFEDEIJHJIFHOKCIMKOMONOONJJILRUUROWd`amgproryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHEEHCBABD=BA>A=::=?:=>@B>@BDGJEIFIHFFGECBAAFFCBBBDEDGGIFLQLIOJJLLIGHEGFDCIIHKJGKRMBNNMPNOOMNOKKKOUWVUSX_^\iaminhrsbeffdhhfnjfmmhkkmriqvtsqmvnoqrswsrstuuvvvwvwwvtwujsunutsqrjksMGHFHBBADE<A@@C<8:=>9?<?B@@@DFHEHFFHGFFDCECDIECGEBEGEFGGEJMKHQMJKHHIEFHHECIIIKMKOSNDQRPPQNOMNPMLMSWVXXUX]Z]d`hbjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqinyMHGHHBBBFE<?BBD<7:>>:>:@B>??CEFDFDEHEDECDEFGJEEJGCGHFHGECFJJGNKLKHJLFIIKHEKKLMNORTOHSUSPROQMNQNMPWZVZYVZ]YXa`a`^hec`dfhgjhhifhnllnmqpiuuxrrpupppruvpusuwu{~}xvtwvvvxplupmstnorrxNHHGIDBCHE<@EBE=89>>=<<AB<?>AAFCECCIDDEEFGGGIFGKHDIHGIGFDHKIGKHMKJKLHLKMKJNKONORUVOKUWSPSQRLOQPOTYZY\ZY[^^]`c^\ackb`dfgr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptLIKIKFBEGE<@GCD@:<?@?>?BA<@>AAFCEEDIEFEGFHHFHHIKJFJHHKHFFLIHHJGLLMLLIMKNMMOLPPQUVWOKVVUSRQQLORRPV[[]^[\^__a`ad]c`ef`ehjcssfjggkorqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGBEDE<@FDDC;??A@@@CA?B?ACHCFEFIFIFGDIIGIHJLHHJJILJFJKHIKJGKKMMJJMMNNNPKOPRTXVMNTVTRRQPLNTSRW[]^_]]`_`aa`acebdhbdijgvljigmnsqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvnwKLLLMGCCAD<?EEEC=AACBBCDACDAAEGCHGHHGJGCHIGHJFILHIJMKNLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSPW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimnsrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBCEGCCIFCIJJIIKGDKJGHJIIKHJJNLOKILHJLKZfJd\KlSHON_nUks[qpbwcSPavuhucav`Xnqbdvinzf[lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDBEEDFBFFGDEKFEJMLKLLGGMIGJKHKKIKKNLNLLLILLL[sbdp^lmUMNfs]ffqlntgpi_aYnnbppbkjjfoqtetno\ougpMJqyvka`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvttbmukpplrrqzKLIHGED?AB@>CFGBFCFEFEDCHHGDEKHGLNNLMLFJNHJKJILJJJKLMNNMMJMMN[roonpplkMPQlWMibtrpamnu\YlQ\mmZqmkomxxtsip]_rkqjUuyxoc^kfbgppjiopprspqpqprrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGGEEEBBB>@@FGBGDIFEEBFIHHEHLJGMMNKMNGLNILKIJMIKJJKOPONMLNNL\hdu]lqWlNPQmTYk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadiuyknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHLFIDEECAB=BACGDHGLHECCHKIHFJLLFNLLSRLGLLHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYrkgooqqomt]nXat_nopoqronusttj[^tcwxrjnzhaacfbbimtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEEEAA>DDBGDHIMIFCFJLJGFKNLEOJKWRKGKJJNIHJLIKJHHKMMMMIKKKSkc[i^_icrrZ_Yjn_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrvtwrGGFIDECFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJKKIHIGKKKLGHKKLMMLJKMNT[\TPTLPONOOVQOOQNOQJJOPQdqiTYW\[\VY[]X]\\cfaaebcf__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFEAEC@DHDFGCIKLHFDGKLIEGIPKLOKLWLIEEHIJHIKIMJHFGGIGHIEFLIJLOMJP\W^P\[`^MXYS\\b^MXZMXaRKYaZR_d\aX[ddVVX\YZX\VY\]b^daa_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBDCBEIEGGFKJKHEFIJKFEHHPKMMJMRIGEAHFJIKLJLJHFDIFDFGEFJHCJNKLU_Y`X`a[`TXYT^^Z_RY\P^\YN_\^SZ^c^Z]`c`Y_c[`^[TXWY^]cbcacehekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCGHFHGHKJJIDFKKKEFIJNKNKHLNGHE>GGLIKLKKKIGDHDCDEAFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQXUU\Y]c`__cdbhomnllllu
yu|
}wrrtxyyyy~}yuyvvrnzwvxXQKFCGEBEGIFGHHFFIGHGHKILDDKKNMLKHKJHIF?GGNKKKMKKKIFGCD@DAHIB?IJHO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTQ[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKJFFFHGGIGFFILJNFDKKMNJLIKJHHFBHHQMKKOLJKIGGED?ECIIBBGFET]Y^X_Y_[]UXXO]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAHFDGMRHCQJEGHHEFKJMPEFIJKNLLIKLIHGDHKQOMMPLLJKHICDAEDIGCBGFDWUE\T]SV_XOTUNZZMIJT`a[_X^^a]OYa\``_bcb]abW`_TPOOOXQ\[[\\^_bffeleoow|{{}
zo
~INFDFFHDIRbPCV^IGGHDFMKPPEIIJKNLLKLKIJGEJNQQNOOMNLMHKADACDGECBEGBMHBKKOONLFMFGIJHGLKMOPILOPOSOLPSRUZYWYXXdWOSTPPNMOTSZXXZ]\`adecgcklpsryy{z
~{}{
}KIEEGFGDKM]LGGXLGHJHGMLQQHLKKKNMUNOJJKGGKPSSNPONNNNGKF`ED_LEfdEN\I^[rmOMUmYLDQ`UkWgJ]WU^DLQULLSVQRTXWTXUT\UPfZhhdXRjRVUT[\[``abab`fhfnkhrz|}~}|zr{z{
~z{LIFGFHEEKOSIJF`THIOJIOMRQLMLLORUROOILMGHMQ[YOPPNOOOIJQQI|YYrtYQmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[_VVXjtuu^_v^Wa[[f[_`a`a]`agmpl`pwtx}vxzlv~tx}|~|z~wwNJEHMNBDLLFIKEQVLKNIKRXWQNOOMQTNOQOKKNGMPS[ZSQROPPPJHZx]TxehZSURvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essorr{|o~xnr_``baZ`_gknkblfgmw~~{xwtvzir~ns|~wx{~x|u|||ssNKG`]GAEMMHJJGJPOMMJNV^YULQSNXZMSSRNKOHQRTYWVPTPPPQKHgxlcxrm[KNVypumubovPeeJfvqmwojfxxiWrQhzmijzz~lxzohoYvvjvup_rf}ilx|o^__ba[]bdgijdgbcdllppstsssyqrxblugqy{srvy~suzn|}yxrnNKSuNCBFPPHJKIKPOOOMPZ`ZWKTWPa^RVQYRLPISTVXWWOUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^]_ddighee^abiiijknokqomjpacfcowxompsynqpk{ztsomLL[VHGEGRPILMJKPQPPPPW\XUMUYUeXRRY^SLNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_Zpz{^`zscroxqhd}ir|^TLl`vukiu{zm~xk|p\^^b[^bddgeeebZccikkrsrvglihdg`akagsrlgmmr|kmhk{tmnkmOHKKHJHHQPLNOLKRRROSRWRVTPWZVVTTTa_PNMKTSTQVVNNLMOPJHQNPULKLSTTSTPVUQQNQQXYRNPUTXXX[[URSW[WXXZOSUWXXR^YW^VTPYRWWWWX^Zgr^[[Y\]_cZ_ccdfdccbZcbgfemnmueegcaf_]g`dlhfgkhpzhggjujhgilQIKLLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYWOOLMVTQNUSNOMLQPLJQQKQMKKPSUSQQSSIHLNOQRQQQTVRXW\WSRPRTUVSZQNSRWVTYVUZVTRUTTTWXV\Y^`]\ZZ\\_c[]bcdfdddaY`acabhhimbad^_c]Zd\bma^fefmsdigjkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSPPJNWSPNUPNQNLSPMOUSNQNMNQUQUQRTUNKMOQTTRRQVWUYZ[YSURTWVVY[TPTUXUUZUWZVSRWVUW[XZ_\UX^\^][]`a^[bbcgfedbX_ab]`gdfea^_]]^ZZ`Z_g`^]]bhkagfhfd`bcaOLMLQQLOTOOSQOQ[YWWX[YXXV\jdVXYZWVSSOJNVTPOTPPPMMRRPRXTQQOMOSVOXRTUUONMQTVUTTRTWVZ]\ZVVQQVXV[[WQTWVVVYTXXVSRYWUZ^Y]_^U^\^`\[____ZbbdhgddaXa`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQOU\ZZW[[\YZ[dqmhd_[XVUWQLMVSMNROQROLQSRUZUSPPMQWWRWSSSXMOOQTXVUUSUYX[^][[VQNUVU[\WRTWVWXVTX[UTRZXW\^Z^_`Ua\aa]`b_\`]c`cghdf`Yc`a__ed_`b[Z\[\YZYXW\Z\[`^_[^^a`^c\Y`ZQNONVQPTQOTTSPW\\\X^\^W\^jqwyc\[UUWQMOVSNQQORTRLRTTYZWUOROSXWTSURRZOPSRV[VWWTV[X\][[]VSMTUU\\VRUVVXYSUZ\USS]XZ]^\```Va[cb]ad^\bab_cfidf^[d`a``ce_b^YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUTRQWRTP[^^][`\`U\]hjr}slg\TWWQNRZSRQTRTUTKRWV[ZZSOSQVVVTOWRSZRTTTX]WXYSX]X^]YZ]TUNUVW^[XRUUYYYUWZ\VTW^Z]]`]bb]Y_[ea_dd^^cca^efidf^]da`aabd`b^XZ_[\[XXXWW[Y[`\[[\[XZ[^V^Y]QOORZPZTUVVSTT^^`^^b\`U]^bkytl}kZUYTPPS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[YUZ^X_^Y\YQWRYXY_[ZTUVZYZWXZ\WU[^\^`a_dc\^]]eaafd^^dc`\gdhedb_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SNPVYQ]UVYWWUX__aa`c]_T]_beeuzhWYYSUSV\XWWVVW]XOU]Z^]\TRWSWWUSTXRSVTXWX]^X][V]_X__X\VQXTYZZaY\VWX[Z[YYZ[YW^_`_cbadd\b\`fadfd^_dbb[fchecf`f__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNSYVS\TVWYVV\`abc`c^_V[`da_zuohY[YUWTW[ZZ\ZXY`WPU^\``\TTXPUWVTVWRSUWZZ[_^Z_\V__Z]^Y]URYWYY]bZ^VW[\[\\[Z\ZZ__``dbcddbdYafbffe^ab`c^bcidcg_g^abcaa`^_XT[ZZ[[X[XX\[Z[WWYXW\[\`]V]]SOVYVVZUXUXWX]_badad`^YYadb`lfh^[\ZVWXY\\]_[Y[bVTX^]ac\RVYPWWWWWVSUTX\\^``]`\Wa^[^[Z^XUXW[[_`\_XY\\]^_\[]Y\`a^`ecdeefbXcedhgd^c``ec\eidei_f]cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWYX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cYZX]`cd_RXYPWWXYYWVWV\]^`a`_b^Ya]]^Y\^YXUW[\`^]_ZZ^]^^a]\[Z\`b_becefefbZdffigb_c^afdZihbfice^bbca``_]\ZX[YYXXZXWZ[ZYWXUU[]]]``bbxKXW[YV\[\]ZW\]_`bdaba]`Xbcb`cab][\[XW[\_]`_][`d]\X[becaR\ZOYXZ[[ZWZY`]`bb`ac_\b]_][^]YYTX]]_`_`\[^^`bc]\X\^`bbcedfdefd\efgifcab\cg`\ihbhied`baca_`_]]\Y\YXWXYXW\ZZWWXOXZ]acffrkJYW\ZZ_\[^\X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\^^^YXU[_^]aa`^[`abfc_]T]``cddfegeffe^efhhgdd`Zfg^ahhbhhfc`b`cb___\][Z[YXXXVZV\[ZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{zzzzzzz{{{|{{{{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{zzzzzzzz{{{{{{{{{{{{{}|||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½ÌÓÒÒÒÓÕ~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääèÊÝæääåäç¥}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyyyzxooooppprrrrrrrwzyyzzz~||||||}~|||||||}||}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvwzxzzy}yxxyxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{yyyyyyyz{{z{{{{{{{||||||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwvy}|}}z|{wwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwvz}}}}y|zwxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwv{|}|{z|{wxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzyz}|}|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyx{xz{y{yxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||
{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxyyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oxyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|}}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqqqrstttttttsstsssttttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttssrqqqponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssrqqpponnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnnnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrsssrrqqppppoooooooopopooooppqooopppppopoppqrqqqrrqrqqqqqqqqpppppqoonnnmmnnnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqtqrrqqo~nppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqqqpprqptnpppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqq}¢oro|oppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqrqu¢wqw }oqqqqpppppqqqpqpppqpppppppppppppppqqqpqqpppqppqqqqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrq©o£~pqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssssrstr©¤{¡|rsssrssttuuuuutuwxwwwwwxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~}|vvwwvuxzxxxxxwxyy ´©¦©©}{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{|{{¯¤¡µª¬£{zzxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}}¥¢± §}}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~ ° ¢~~~~~~
~~}~~~}}}~~~~~~±¡
}~~~~~~~
|||{|}||~~~~~~~~~~¡«¥¤¢ ~~|}||}}~¡²§¡ ¦¨¬©¡
}||~~
±¦ ¡¤£
}}}
~~
}}~
~~~~
~~}|}
~}}}}{
~~}~
¡
}~
}}}
~}~~
~}~
~
~~
~{z§¤
~}}}}~~|{}§¤¢
~}}~~~~~~}~}|
}|}~~~}|}~|z
}}}~~}|}}{zy
~
~~~~~}~}~~}}}}~}|zz{
~}~}}~
|}}~}}~}~}~}}~~}}}|{{{zzz{~~~~~~~}~~}|~~~~~
~|~~}~~~}~~~}}}|{{|zzzzy~~~|~~~~}|~~~~~~~~~~~}}}}
~}}}~~~~}}}}}|||{zzzzy
~~~~~~~~~}~}}{|~~
~}}}~~}}}}}}}}||zzyyyz
~~||~}~~~
}}}}}}~~}}}}}}|}}|{yyyyy|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxxyyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yyy|~~~
~}|||}}||}}}}}}}}}}||{z|yzz{|~~}{||}
}
~~
~}}||}}|||}||}|}}}|||{z{|zyz{|yy}}}{{~}}|~||}
~{z|
~~}}}||||||||||||||}|||~{z{zxz{{|}|~~~~~~}|}~}~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||}|yz{{xxy{{z|}}~~~~}|}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||}}|{}|||{|||zzy{|{}
~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}
~~~~}}||}~}||}}}}}|~|}|{}||z{z|}}
}~}~~~}||~}}}}|{}|~~~~~}|~}~~~
}|||}~{{}w~vx~}|}|}~~z~~|~~~~~~~~~~~}~~}|~}~}}}{|||{{z}~~|||}|}~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|}~}}}{{}}|z||}}}}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}{~~~~~~~}||}}|}}}}{|~~~~~~||}||}|~~{|{||||}|}|~|}|{{{|z{|{|}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}}}}}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~~}~}|||~}|}|}}}~}}~~|{{{||}|{{{{yzyyy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~~|}}|}}~~}~|}}{|}~||{|}zzyyyyz{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~~|}||~~~}}}}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv}
~~}~~}~~}~~|}}|~~~~}|}}{}}}||{|}{{{|{||}}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{}~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}}~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~~~~~}~~
~~~~}{z{z|{z
~~}~~~~}~}}z{|
{{sy{|pwuvwyutz
}}}~}~~}~|}}~~|z|z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
|}}~}~~}|~~~~}}z{{||}~|}}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~~}}}~~~~}||~~~~{{|||}~}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z}y{yx~{||~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzswvst}~}~}~|~}~~}~}~~~~~~||||zyvyyzyvyv~|{{{~}{}~}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}~||~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~~}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~||~}~~}}|~~~~}|~~|}~}~~~
~}}{{||yw{ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}}|}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~~}~~}}|}~~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~~}~{z|}|{}y{zzxzxy|||}|||||||}}}||}|~}~~~}|z||{}}{yzzzyytuuooqpwst}
~~~|~~}~~}}~|||~{{~yz{z{wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyxstunsqpxruz
~}~~}~~~}~}{~~{|}{z||{zxxy|||}{||}}}|}}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}{|}xxuxxy{||}{||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz{}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}{}{zvzxy{{|}}{|}}}}~|~~~}yy{zzzysrtowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxqytvxtv{
~
~||}|x|yzyz|}|{||}}}||{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||}z||}}|z{~~~}}||}|vrvxxvtvu}
}
{||}zz|}}||z|~}|}}~~~~~|}~~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}~}~~~~~|}
~
~}}||||~~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uz~
}y|~{
}~~~}{}~~}|||}}}}|}}~}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~|}}}||||}|||~}~}}}
}p{pyv~nypus|vyyrpvxqvtturstvinrotvnulwmzsnym}rsvsvmnwlpylu}~|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoolw}xpqzprufu~n{ysoy}~{~|~~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~z~}|}~}}~~}~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwpy}}m}uo
zrr{|upozks|nv~~}}{}{|}|}}~~}~}~|}~~
}w
~~{|{~|||}}}~}~~~~~~~}}}~|{|~||
}{{|~{||}~~||~}~}~~}}|}}~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~~|||~}|||}~|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~~|||~}|}}|}{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|~{{{z{|||{{{~{|}{z{~||||}~}{z|z||
|
~~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{||
z{
}~~||}}~}{~}|}yzzy{}}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}}|}~}~{~}|{yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~|}~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}}{
~|~}}~~~~~}}{|{zyzzyz{|yzzz{{|z{{{|}~}}}}||}}|
~|~~
}~~~~~{||}}~|~~}}~{~{{zyzzyzz{yzzz{{|z||||~~}|}||}~
~~}|}~~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}}}}
~}~~~~}}~~~~~~
~~||~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌÌÌËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;>BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9><>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA=366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖËËËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<;999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNG¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËËÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ØÙØØØØØØØØÙÙÙÙÛÜÜÜÜÜÜÜÝÜÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;@<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMMF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖËÌ
²âÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸·©§§§§§§§§§§§§©½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃrliNSbLLVM<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKPFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ËÌnPSSSSSTTTTTTL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§££££££££££££ g@DDDDDDCCCDDCFSSSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËwliJN_MRUM><<7;?C>6:7>?;=B@9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ËÌqUXWWWXXXXXXXQ¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥¢jFIIIIIIIHHHHGJWWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<;>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÌÍx^a````aaaaaaZ¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©§sQTTTTTTTTTTUTV`bbbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9::=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÌÌÇÅÅÅÅÅÅÅÅÅÅÅÅÅÊÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÏÎÎÏÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÐÐÐÐÐÏÏÏÏÏÏÏÏÏÍÊÊÊÊÊÊÊËËÊËËËËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8:;898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÍÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÑÔÏÏÎÒÒÏÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÖ××××××××××רØ×ØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÓ»ÏÏÒ§ÐÏÑ¥¢ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒµ³Ö³£¦Ö° ¢ªÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÑ ª®ÐÀÇÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>><<96?B?B:648:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÑÅ´À¡´¢¯±ÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?B:74:::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÖ§µ¶¹°³©ÔÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<=<964:98::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯Ê £¿Ê¥§ØªªÔÏÏÏÏÏÕ¥¶ x£ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>9<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÖ¥¶®¨y©
¥ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CGDAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÐÕ¥¶·µ¯¦½¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHFE@<<>><==<756996:;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÐÖ¦´Æ£¥§ºÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÇÒ×¥±Ø«¤Ð«¤ÐÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKK@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÑÔµÃÕÅ·×»ÔÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUij[L_MJLJULFB<<?FEGKI=667:979:;:<=9>99:8;=>>A>=9<<:=>>;=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÑÃÔÑÔÇÃÕÑÕÅÄÕÑÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?ADLLA=775:8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÔÒÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ==786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFID<AA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD88867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCDECALH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HQA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
¼ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9886553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿½¾¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;;>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶······¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨§¨¨§¨¨©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;;@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¥§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@?BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747578;=8::99;=;;89>6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦§§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¦¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364689:89788:<;<9;;::67899>?@><=@>@:9@A?=A?>AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¤¦§¦¥¥¦¦¥¥£ ¡¡ ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢£¢£¤¤¦¦¥¤¤£¢¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢¢£¤¤¤¤¢¡¡¦¹¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ £¦¡¢¡¢¡ £¦¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡ ¦±® ay ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¦ «{C ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡a¨¤MI ¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe §lZ ¯nKL¡ ¡¡¡ ¡¢¡ }xjabb\Q<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¥Tt¢¡¡`XN¡£¥¢¡¢¢¡¡ ¢¡ ¡
wqgjd\\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢ ]`£eZL¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[[LF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡^_s¡eZM¢ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ab`|scUO¡¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y j\Za{i^PT¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B@AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ xskX|[TPY
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v¤§¦yUOd
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
¤zb£s
hu
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974869388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~~¢vjPqWny{~|
¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
}rNGIsJ\nov
¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~£L32;yur?=Vjm¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢§_EdN=ywgdH56Tnq ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©©®K¶@{{hcR_qQ[o¡¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¦©§¨¢thÅÒ¨I}Ol{Z`£¨§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤§§¤¥£¢b¸¿ª
¯£wGWrRs¢¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^edlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢¡¢§¡¦®¦¦o³¶Ö¦¸±bP´£Vd¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡¨ª±²¯«££wuxÓ»©¨lU¡ªh_§ ¥¢¡¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\U\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¡ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯··µ´¶²¬°lÇĪvZisuu¥©§¤ £¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ ª²·»¼¼ººÂ¹´³t^Q°¯¤¢wnsqwxy| ¥§¬¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvkphiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ¸ÃÉÐÔÑÌǼ¯¡mcRC~~yuomddigjqrqqqry©ÇǼ¢§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSai`ftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃÄÇÛäã×ǹ¢oWXPDargkrkhceXW\W[`higd`lºÀ¿¹©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ¾ËÏÔ˹¥nZPTJC\f]ahdaai\TXUWXY[X_}¡¸¹«´²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklgnurrurg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅľÃÁÇËɺt_RNORG=^l`_eca^dcTUWVTU]§®¯ª¨«¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxoyjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄù·Ä£jLCEJD=Yaadlda\e_YSPPUa·¹¬®¥¤£§¤ ¥©´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{wnkihvZgrxszgg^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÄÄÂÄÁ³VHMF;IX_hmh_\_YZTP]ª¬¸µ²¬©£¡©¬§¬´´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyvuefjjh^konyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇÂÈ£w`H??A^]\kd[XVR]¨º¾º¼º¼¬¦©»º¹·¿³µ¸²Áƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocahvhjjtnyl^d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÍÆÆÇµ]T/UY]l_QMW¹ÊÇÂÄÆÀ¼¾´°°°Â¾¾ÁÆÀ¾·¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r}xpg`kjwmifvotc]cUWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÁÂÂÅÆNRUTµÎÒŶ¿¿À¿º»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyspfegdlebknoo_Y]WVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ¾¼Å§|tu¼ÎÇÇÐÀ¯½½¸¹»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfaebacddjcgc[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÉÏÀº¿À¼»Å½ºÀÄ¿½¾±saÏÄ¿Àɾ°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabcgjggjfj^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÔ¸¿»ÃµºÇ¶µ¸º¼¸¹¶³¶tÉ¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeefpjelhYYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÃv¨Ì½Ç·¹·¶´·¹³µ±»ÆÇB|ʾ¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knqgqktfcn`\UHKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄ×s»ÈÏÂÀ¸®´´»½·¹°½ÃÈFvÍÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljnuoxchc\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÆÉÑps¬ÑÑÌÊĵº¿ÄȾ¾´¿À¿wSoËÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tpmltlln_c_bbNHN?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÉÁqs¥ÌÌËÍÊÆÂÃËÎÁ¼¸½º°odc»ÈÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qc[_`_TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»«Úþ¶¾À¾¾º¦©²¶Ã¿¥xuxÄÆËÈÁÃÀÀÉÊÁ¿»¹± ~slÈÅÄ¿ÀÁ¿ËÇÃÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³µ¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp^\_]ZRFEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Ä·mν¶¹À¼¬}nhnmrrw|½¿ÆÀ¹À¼¾ÅĽ½¸±°~ÊÂü½¿¿Ãÿ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±±·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmu{poj\`aZSQAFIGK@ECI<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀͲu³½¶µÂ¥iZ^`MR[Znsv¸¸Âº³»·»½¿º»»¯¤~ÀÄþ¼¿»»¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶¼´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvwnra_f][UJ=??GG=GCC9:5;99><<9:<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɧx ¯µjegVY`IIMPSlv¥°·¾¹²µ²»¹¼¶¹¾´¦¡r®ÉÄÀ½¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Åª|u `TCXUGajVOEJ` ¬¯¶ºµ´²¬¼¹¸µ¸Á½°¡¦s¥Ë¿¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨ª¨°¶³²ºµ»»»µ¸¶°¶Ä²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovsnc^gY]^SONA?JCAKJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¾´xoNJ?dYBNwjN@\¯µ³µ²´¯¬»º¸¶¹¿Åu©d§¿¸µ²±¤¦§¤¥©®¹¬««¥¨¤«®¯§°«¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrwsmujl]\kT^\PNHDGMBGNG8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶{XFANYJJXwc@S£¹³´²°±°¹¸¶»·º¼¡±«¤s«°©««£¨ ¨®¤£¤ ¢¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wryhutoeUadW]ROMI@IRDNC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼ªhN@RxpPIIKgYDR®»±¬³¯®¬¶¶²´µ®¨¦¦¨ ¨©¡§¤¨ ¢¢¡¥¥££ ¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ª©¤©«¦©¬«¦¡x|vzcwmn]QiUPOGPMMCPR@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢ª¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Â«¥½hERQWIJ`JT`cb®µª²´®ª«¯°²³¥ ¢ £¤¨¢ª £¥¨ ¡¡£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nk{diVRdNIHGOSNKNH<E@=2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶¶º¹º··»®¨ ¡© ªÆ¿Ë PAswPnKKcfts_Z^p±¯®³µª¦¬¬£¢¢¤¤ ¤ª¡¡¦§«¢ §£¦¨£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¦«ª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ |~wy|eyz`bSVaHIKKSTJSQM9?A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÇÇWSJe£Ze~or\Qkc[d_\j´°°¸¬¦¡¢¢¥¥© ¦¤§®®ª¦¢±££¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvsilf[S[ZMQKOOVMSMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢«¤yUirvupcvvXWc`cgXWVg®¬¯§¢ ¡£¢¤ £¤¨¬¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³µ¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xvjxu^m[RaIRVHFVWJCMH=KI8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©¨®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¡ £np`cXL[SZMLPXRGLLG¬ª©¥ ¦ §¥°©¦¢ª¶°µ²°¶¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«®±¹·¼¯³°µÁ¼·¾³³µ¢¬¢©©²©«¨§¨ª§ § ¨¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhn\X\CWNJGMHCFN=>L>4<:6:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©©ª ±¢·¤°¦£aW^e`WMQG>>?CC?>BQx©©ª¦ ¢£
«£«±¯¹±±°±°º½¼¼¹¶¸Ã¾¿Â¿¶º»Àù½»¬®§±±Â¶¸ÂÆÀÈÊÀÉ¿°¹¹½¸Â¾¸´»ÆÄ½Ã¼¸´ª³ª³´¯³®ª®£¬¨¶²£°¦¡£°±®°¤¥¯£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trklurqhW\QFUHEJPI?EB4FH96<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`QGD<C>E<?96N~ª³§¤£¢ ¥¬¦xl¥¢¢««²¼¶Ã½¾²»ÁÃÂÅ¿¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÆÌÌÌÒǾ¿ÀÃ¾ÇÆÂ¸ÄÊÉÄÁÇ¿º´º»µ»·°¶²«»²¯¼·¿»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxkeZ\FLMEDTMEBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<@?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}sjaWNE>IY|obB=\®¬ vrpmp¥¬´¸ÄºÍÇ˾ÂÌÍÍÌÇÈÐÌÌÌÇÊÅÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÁÆÇÆÊÈÏÀÉÑÍÇÆÈÆÂ¼ÃÁ¿¿¿µ¾³¿ÀÃÃÇÅÇį¿¹²¸½Äº¼¼µ®§§®¨ ¢©¥ ¨«©£¤¤ £
yusebgrog^ZZDOMCEPIDCA55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:;>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £kf]TID@?K¥ ²£yqrokx¢¶»¹¼ÊÁÓÒÒÈÍÎÑÓÑÑÐÐÑÑÍÍÎÐÄÍÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÒ×Ò×ÒÕÖÓÔÈÌÇÌÍÉÓÍÎÓÍÆÉÊÊÂÆÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÇÅÌÌÉÉÀÃÀ®°³¨¢ª£¦©¬¤¥¦
{ruvgcgvjeVXRDNG@IQC>B=:22A<E<78<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡cTLJDC?CR®Ñ½²¯¦ ¤¡}xqkebhrpr{
upmqro¼ÇÑÑ×ÖÕÑÖÍÔÖÖÓÓÑÒÔÔÒÏÑÃÐÓÖØÕÕÒËÉÎÐËÆÍÒÊÒÕ×ÙÖØÓÖØÍÒÊÏÑÌÏÑÍÓÐÀÉÈËÄÌÍÌÏÏÆÇȶÀËÀÒÍÌÐÇÊÈÀÄÃÈÏÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpcaerc]R\JKGAFIJ?;A8>5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¥¥ ¢¢[I@ADAFQv²¯¦ wica____^__]alusppnlpouw¸Õ×Ö×ÖÓ×ÏÕÔÙÔÔÎÏÕÔÔÑÑÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ××ØÒØÒ×ÙÕÖÌÏÏÉÍÒÌÎÑÀÇÄÉÇÏÎÒÑÒÈÌÍÀËÍÆÔÏÌÎÉÅËÇÇÉÌËÔÔÑÕÏÒÌÓ¹ű¥¨µ®¨¨«¥²¨°³¬¬
|zqstmacim_VQ`JJCECSM@<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®§ª¨¡£¬fC8=>DXª¨}qecb__a_^a`^a`_`emppmknptyvi|©ÍÔØØØÑÅÓÒ×ÏÓÎËÒÍÕÔÑÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÓÊÐÔÕÖÎÓÑØØØ×ËÈÎÄÉÏÍÊÌÀÉÁÉÊÎÎÐÌÐÎÎÌÏÏÈÌÐÑËÎËÃÉÇÊÍËÌÒÓÎÓÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¿»±
zvopokadnpaX\[IFFDMYE;@=33<<87855;>@=9<<8<>9<@;@:=8?98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤²{HFB;W¡k^^^adb``aa```^__^\bmqnnrrtuzqbmÇÕÔФÊÏÎÓÊÍÎÄÍÊÒÒÎÆÎÌÍÔËÎÒÍÊÖÖÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÖÊÀÊÁÆÍÃÈÊÃÍÄÆÉËËÏËÎÍÐÎÔÌÆÉÐÍÉÇËÆÇÂÆÊÌÎÑÑÇÐÏÎÎÌÐÅÇÁ¸¹½Ã½ù²²¾°»Ãĵª¥¡yqrkmh``qhYXhVMGLIQQB;D?;68:8:;57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨ xlopw|ebbb`]^acb`__`aa`_][]gqqpqrokqytenÏÍÖÉÃÈÈÅÆ¾ÂÅÎÎÇÅÆÍÊÑÈËÍÍÅÐÒÏÍÌÔÊÇÊÎÏÇÇÏÒËÐÏźĿÆÊ½ÃÇÉÎÅÃÈÀÇÎÈÄÍÊÌÐÈÅÅÐÉÆÂÆÉÅ¿ÁÈÍÌÌÏÃÊÌÉÇÌÐÅÅÈ»ÇÃÉÉÂÏÁ½¼¿°ÁÉǹ½ª±²§¥¢£xoudk`^fqa[W`GIHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»¤¶~g
¢ª
}~s_[^]^`^`cdc_]\^_``_[Z\akrpnnijmnzgUÀ¢y»Ïø¿Âººº¸½ÈÅÁÃÀÃÇÊÈÈÉÇÀÅËÆÈÊÍÉÄÁÊÉÁÁËÏÄËÈ¿¹Á¼ÆÈ¾ÀÆÏËÄÀûÊÇÈ»ÉÆÅÊÁ¾ÂËÆÅľƾ½ÁÄÆÌÆÆ¼¿ÊÃÅÇÒÅÁÉÀÊÊÆÈÆÐĄ̮̃ÄËÇÃÊ·¿¼º³©¬¤¥¬£¡¦£ |wsufj[anmZ\XRDLGBGDLDFR@54335@=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¾¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²°¶l^y|z
uxurp_Z[]``bcdded`[\^]^^`[YZ\bnqnjhinmsyVj{«ÃÅÀ®µ¸°±²°°Á»»»¹¸ÀÁÁľ½¹½¿¹ÄÉÅÆÂ½ÆÀ·»ÃÈ¿ÁÉ»¶»»Åÿ¼ÂÎÃÆ¾¾µÁ¾Ä»½Ç¼Ãºµ½ÆÄÂ÷À¶¶¿¿¼ÍĽ¶ºÈ»¿¾ÌÄÂÆÃÆÉÇÉÆÐÆÂÌȲÇÉÃÎÌÀÅÿ¼²·°²§¨¨¹°¥°ª¬zwxkeh`hodV^YJFJFHKAEBFJA9:658853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µ«·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÕ×ÍÊÏÅÉÅÇÁºÅ½¬®¦`cvx}{ttc\\]^``bcbbdeb]\[\^\^]Z[\]grplfelmo{x^fǹ¿·¬¯®¥¨¬ª¥·³µ³²³´»µ½±·°µ®²»Â»Áļ¿º´²º¾À¸È¸´¼¶À½¸½ÇÁûµ¯³µ»¿´Å¸»µ¬¹½¾À½±»¶°·º³Æ½·¯¼¿µ·µÅ½¾ÃÆÀÄÆÆÇËÅ¿ÆÆ»ÇË¿ÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJGBDAEF?=:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐËÍÈÉÈÊÉÊÄÐÍÒÏÍÅÇÁÅÁ¿º¸É·«°[gozx~
vw|sh]]]]_`_`da^cec_^\[^\]^Z[[\_komgehklo~mhº¸¶³®¨«¥ §¥©ª±¬©«©³µ°²¨¦¬³»º¶Ã¹º¹°ª´¹»³Â¹¯À±½¼»µ»Ç¹Ã·ª¨°²À¶¸½°±¨²³µ»¼«®¶§®¶®¼²±ª¸°®»®»¸»ÀÁ¾ºÃ¿ÆÃÅÀ¼ÆÁÇʸÅÇÅ¿ÇÃÃ¹ÄÆÂ»ÆÉÌ˳¹Â½»³tvwki`bliYWW[ALLMJEAC?FA:::996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÏÇÍÁÂÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª°[i~{x}
y{wn^]\\]_`__dcbdcb`_]Z[ZZ]ZZZZ\dmnfefgikpz·¯´¬£¢¤¤¢£©¬£§¡«©¬«°£¦ª´¶±½¸¯·¯¨¸´³¼·³½°¸¹µ²¼Á²À¯¥©£«±³³¨½ª«¨«¬®µ´¦©®¡¥¯©³¦¨¨®¦¨·¬±³·ºº»²¼¾¿¾Ä¿µÁÀÇÈ·¿¿Å·ÅÃÀ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji\aodWVXPHZSSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃǹ¹ËÂ˾»É¶½Ã¾ºÊ·ÁÄÁ´¶¼¶±¯µ¼©«cmz}~xt~|swe_]\\^_`^_ccab`a_]]\ZXY[[XWY\_fkecedfhlq¥¤ª¢¡¢ §¢¢¥¥§¥¤¦¬²°¶·§°¬¨ª´«³¹°¶¶®¶º³°ºº±¶¤ ¤ ¦±¨¬©¹ª¥§§¨§³ §§¤¦¬§¤¡¡±¬²µ³³°µ¼¶»ÁÀ²»¾ÃÁ±¹¹Â³À½Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ yqlbf`ko`UY_HNhOTHFKF<=@=:;;826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;ȵ¶½¸ºÁº½¶ ¦º¶«³³»³ÄÏÉËŸ·ÇÀÌ¿¸Ê·»Å¸³Å¸³¿À¬¶¼²¬¦¯´¡£ir
|xusomjiipi_`]\\\^__acb````^\[\\XYXXXVX[]^dbadeedhjl§¥¢ ¥£¥¢§¢ª¯±µ¤¨ª©¬¬¤´¸¬·°¬³µ¯³µ¯°ª¤¢²¥¦ª¸¢¦¦ ¨« ¥£°©¬¨ª«¬°²¹¯¸¹º°¶¼»º«³²¹³½´·²±¶µ¿µ½À½Ã»»½{sl_e^ddXTW^IW]KPGJJGA<??A;?<05635:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»¸ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹Ç¸¸¿·²Â´±»»¬¹º±¢©«§m~
xrmomkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWWWXWZ]accddefgiq«¦¤¦¡¤¡®®² ¤¢«§¡µ°±²¬©°³¨º³§¶¡¢£¡£¢ª¶«¢£¦¦¦£¡¬¨£¤¦«³³ªµ°²«²¹´¯ª¯²²³·³®©®²¸°º¶º½¿·³±zuf_f_[YVSZUK[QLJEHKIC=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿²¥£¥±Ãµ¶½´¸ÁÌÈÆ¿Å¶ÁÀÇζÀý³¹¹²¿¶±¹»²µ¯£ª¡xxoqtqhediec\\[[]]\[^`a^__`^\[Z\ZYXVWVVXWXWUWacdbbcccfissGM} ¨£¨«§®°ª££·©¡ ®¨µª§§®±¤¸°¤· £ª¦¡¹°£¡¤£ ¡©ª¤¢£ªª±¨´¬ª§³°¥«®³±¯°¯¯§¨¨²®²´°¼´º¸®£zve_aWYXSRTKM^LPLGHLKE=@>=B<:7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´ºÂ±¾·½§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWVUZbbaab`acdkregn¦¥£¦§¦ ª¯¦¡£¶§¡¡¢©³¢¥¨¥°¦±®«µ¡©¡¢±±¢£ §§¡¢¤¥¥«¤¥°§¥£«¬¦¨®¯¯«¨ªª³¦¦«¯´±®¼¶±¯¯{xseb\[]XNLQHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±¶½°»±·¬¥¦¬¸»¼Áź²¹µÄÉÉÀÂÆÅǶÅijÁ¿Å«··½¶½º»µ²¬¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVVRTRT__^_`]__aci
¡¤¡¬¥¤¤££¢ª«¤¥±ª¡¡¥ª¨¢¬ª©®¢¢¢¢«©°¢¡£¤ ¢ ¢¤¥£«¥¢¤ª¤«¥®²©¦¥¦¦´¦ª¨³µ´¹º¯ª¬sqp`[WVVRGQOHZ\ORJTKSLEGIC8;;=<9667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«±¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÉÌȵɼ±¾Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSNPY][\]]]^^acl~¡§¨ª¨«§©¦£¥¯¤¥¯© ®ª³¦¦££¡©©¡¡¡ ££¡£¡¢¨£¢¨« «°¤®¸¥£¤£¬ª¨«¯´·²½µ³«®
uti[XYSURFXLQ[XMUOPLQRIOIB=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³·®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ÌÆÅ¸ÀÎÏdzĻ·»Âȱ¸¿·¼¾»³¶¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNOQYYYY\\\]^_dz|y
ª¨¦®¬©°¤¨¬ ¤¨§®§ª¥ ¨ª¥ ¡¤¡¢¥¥§©¨ °°¦±½§£¬´«®§¯´°¹µÀ±®°«~rtcVTUNQJGVPRRLLXNKMORGNKACFDC>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ·¸¼½Àñ°±·®´´»³´££vkglnqnqjokdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTQMNMRWXYXYX[[\`iztyo
§ª¦¦«§ ¥£
¤¢¢¥§¡ ¢¢¦¤§©§¡ ´²¨³¸¡£·¬ª®¤²²¦µ»µ«¬±¢zsn^NQQMODNNNPKFNNJJNNQIMJAHLIHC>958889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶§¤¶°¤§¤ª¥ ©¦¤³ª¢²Ãµµ²³ÆÅ·ºÃÊÌÆ³º½´¸À¯®©°¦®»¯ |n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKLSWWVWXXWZ]allpj~}| £¡£¤¡s~{ £
~~tz££ ¡¤¤¢´¯¬°¦¸¦¥°¡±®±¼ª©¯©xtdVMRPPMCSNLPMBPQHINSMHJJDKMFKK=749888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-02764789::66:87A7x·¡£´¨¦¥¨£¥¥¦¦¦²§¦´Á¸¯´°Éĸ¹ÀÎÆ¾³¬ºÁ¬Ä¨¢¦¦·£ ~xfWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJGNSSSTUTVXZ]ifkgywpLVo_;Vo|ry{}xqp}¡ §®©©©³¢¦«¨´£©¢tn`[NSRWLDTJPMLFNOIELQMKOJIMPFIJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· ¢¡¦¦ª ¦©§£ª°¨§´Á¹°µ°Ç¸³½Ï¿¹¯®µÂ§ªÄª¢±£~sv]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKHFHNQQMORTUXY`jhbu|oM@>~{
y`JQnx~m~wuvxpQ|~yvgw~
¤¢¨©¥¤°ª¡¤¤¦ª¢ª¡¦§wnf^\HQQSMIUMSILKOIHFJNLMTKQQOFJD=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.115221/,')+*,4833989:99::::?9w¶¢¦¡®¡§¨¥§¨¯¬ª¶¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼§©~xqoXMKMMNLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDCINOhYNQSTUZnnpxeeYRr}
{{uxsouptz~«
z{hv{prmxx{{wsrxhu
||© ¡ ©¥§£ ¤sib]]JWPRHKXROJMLRJJJLPHLQMRTMFIB=78;99>=:;<98@?::>=7==79937785675251472/2.,./200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¢~ww|wpojYKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LNQQSV^uytbszexuw~|q{v{ok~|tz|tfu|lohs|myq}qmvqhq~pD
wwz}{u}£¡¥xongc[XXUQJSUTOPNPVKNKOOJROIOPLFD=;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«¨©±¯±«¼¸«»¾¸³¬§°§¬¥©¤¡yvq|mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zYJNOQTX]fppi
¥©À}rwazwmzwy{
olxsxijq}Ingw~mjdly
krl|nr|imps
{~{wpttyyp|pjoooYVXTRRYORUTRXUMNHMKMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¤¬¯¢ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡szuotlpleljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORVZQY[_¦afpwc|nl~yu
tlts|ijLy
f1vrk}}tfeu
filukp|hqq|n{t~}qqoumwyujyyxlkpheXR[XYY[NPUVYXNIHEJJHGB@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5m¤¨±§º¯«²°Â±»ÃÇ
zqtzpsqopdpg_TFIC><;9:?@ADCEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQULBIQIb®²pyuj{kpz
yr txst5p¨¡¡¢
vp{|t®hgbjnrmpuioXupvm{}nrnp{svnbu
ux~}|srqm`\]^\ZYa_RN[ZXWLHJFIG?CABH?CD=;:7=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®°®Á²»ÁÅ|nul{uxxlwnwcj^IPG=?7449;:;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL8DNRSDJs~zzt}ku{|~}u¡y~
aªzw~s{]dqtz|wmhjbyo
zoxu
zptzxkni]v}|
}q}vw{|xqtugh`[\^S\g^WQTX[UGJJDKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À²»Åºzvk}xs }}p~zhvkRXL@E211376688:<>AEGFGJKMOQRSTUWVVVTSPMF@:2= #c[5311i?GoIFILMOQLKT\XRKgzxzp{y{~v¡¥¬©H®°®©tm|~hghyn
qHlwryvhmk_v}
yzuv|xmow~uusm\^^\cdXgf\UPPWYPDLKFOICFCCA@CA=978:::;;:888::?>6;>7585773344236656778;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¬ ¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23124668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[??84.]ps£UFIKMMPW`XoY[]h
}
¡¦»±§»Çè¡¥|qw
ihptrw{v|muuf ª¢zzyogkx~|ule^[[^j^bg`ZOLNXRQIPJDNGCJDCADDB<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfwz¤¡¬¦ª®°¡xw|~lpj]B@4--//..02234778;=?BDHINQRTRSSTRPOHDB<87/9C><<63.lMPHILLKNV`cfflt £ª¥£«©¶¢¨ÁÂǯxº|¡
¡
lpuwqm
q ¤´¨¢}kjj|uc_e`[hl^ll^WKHNRQMLLFIPCDNFBCEFC=:96=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENORTPPQSQNPIED>;<:DF?><752<?R5HHHLLMNR^n{r|¥¤ ¡§¨ª¨¬©ªµ«¿«¶ÇÈ·ÈÐϾ pi«©
¦¢xz~¢{wª²|£¡¥µ¯§lss}~sja^b`bhd`hg\REJKPOIILFFMCHLFFCBGDA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m}aw}{ªªBD}x|
w^bP460-1/,.0/./..0015>AAMQRSQRSURNSLEE@<>=FG@A@8662<9;FHGIJNOQYm
v ¤§²¼·£««¦¨³«¯µ±±»±³½²Ã«ºÉ˷ÿ¸¥¢°³¬ª£¥¦ £¦¢«¨¥
¤¡ «¡¤¨±£¦·º ¢¯¡¢£¡«®«²´¡¤©yz~ibi]fc_ed^gg_[OCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhbWinXzv
ÚÈsV|z
qna@E64<2/110-,+-0.-4?CAMUPRSUUVUN[PGGD<>>FHCEA7;<5C;=FKIGHQOPW¬¢±©°¿ÆÂ©²Åµ«²¿²·½µ¿´Á¶»º£¸Å¨µÈǵ½¹´¨£´°±§¯«¥v¤¡¬²´ª®¨®¶»²º¬°µ¢±¬±µ»¶´®´¦§£§©¯¬±¸·¸¦µ¨¤x
w[ceWgcbdaag`[TJDDLUQHIJDIGEA@@KDBMG=867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[YQbbWyup}u
{¿»£¼´yzxn]V@EN<6:45AB764//6CHBQ[OQUWU\WP_UIKJA?>GKFFD;>@7D7?BJJEFVTP^£¬¢±³Á´¶ÀËȵ»Ä½²³¿¶·Á´¿°·t±³¦ºÄ¤°Æ¹°²±´¨¤µ¶ª± ¢¢¥°®¦«§¤ ¬´»¢¨²ºµ¼¿Ì¿Å޽³Á·º·¾¶º·¹¬«°¥°©½°¼ºÁÁ«¹§©~~lXdbYlfkfX\cYVSIGFLQGCHIAHD>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALQVSYUZvjo~nzsxb¹¡£{z|}}wzueP\dGEK;Qca[^SF?;HPEZcQRYXZgYT`_LSPEA?IJHEEA@D<E6B>HGJLSYT]®·´¹·È¾¸¼É̺»À»·µ»º¶½³¹±Å`u±¤±ª½©¥¨«ª¤¢²µ «¨ ®¥§¦¥££§±´¨²³½¶Á¾ÓÉÉÓÆÃÅÌÂÊÃÀ¾½¾»¼·´¯¸·¶Ã¹Å½Âǯ¸©¡«¤§µsacc_Yc`jgSX`VRUIEENK@>GD=KA=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrrsÕÀµ }~x{{y~t}zkfpuY]\Pedb`ed][XW\MdmURmm_n_XgdTYUJDBKKIFHHHHBI:D?HKSTU\Z[¸¿¸½¶Å¿º¸Éʺ¶¹µ·¹²·´³®µ¶du§p^¢¬ ¢¤ª¥¨¦ ¤¬¥ª°¸°½¹ÔÑÏ×ÐÊÌÒÌÏÎÊÆ¿¾ÂʽÁ¼ÁÀÄÄÅʾÇͲ£º°´®«¸º{m_a]Z_bZdcQ[`SPKCAEFE<@E>AHB@C=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ[Yh_onlotu³« ¡
~|s{
{ts{ylmu{hreiligjji`fiilZms¤¼g[og]YZTHKNPJKPKSQILAJFJO_^afia¶Æ°¸²º¼´°ÄƵ¯¸°°»«²±¦ª·«µ§§N¦¥¡§¬¯¨°¨´´ÔÔÔÖÓÌÐÓÕÍÒÏÌÅÂÉоÉÉÊÉÑÇÌÍÂÏÑ·¯Ã¼Ã¹¤µ¹Á¢pe^__ZaXZgZQ]XOPBBHEBH;AC>AG??A7;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYReVsgqoyy ©¦}|p{r}qxulqx~qznxsmipmcimpxiw|~Ë¿Áß§mcxnc[b`JPRUNY^O]\NPNTPTT\nmvq·«³¦¯µ©¬»¿°ª´¦¤¸¦«® «´£°¦«¬¥¨¢¬ÏÒÕÒÎÌÓÔÔÏÔÑÎÇÃÔÑÇÍÒÓÓ×ÌÑÑÄÒÖÅÁÎÇǨ½·Î|pg_d_WaS_[PQTQOH>@FABE<@A>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<UQMNZu
wlwp}~¡¡
y
~{r~zu
ovrks}{w{sxrksrioqzyqz¾Ë~±vrvhak]CZZ[VecXdjSX\]`c]cwz}©¤¤¡ §¥ª¯¸ª¥³¢¡¡£¡§±¦j¢~¨°¢¡¡¥¤©ÉÍÏÈÂÌÑÔÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÂËupebaYUZT\QKGJJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;OLFJXpu}hsxr
x~ws{}wznwpmuux}t
|ylvtn}vtx{µ;@Å¥~|ieWICfcecgjcmw[^fhknhn ££¥±£¤²¡¥ ¨ £±
y©£~«³¨§¾Ãƹ¶ÆÎÒÑÒÐÌÒËÈÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÕ¾Ê˵zypf_[SWR\WFGJIEE=:7:@@B:FD?DCADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~|x
zxqz{uy
yp|oozq{qnzuw}|t~|¯sXªÂ¶pmb=^hrpqpnxvehoruxqz ©¡¬¡¥«
}
~lz|®ª§¯¶½©¾ÇÌÉÉÌËÐÉÃÒÊÔ×Ùר×ÕÛ×ÓÙÛÕÐÚÚÑÖÈÔË{}jj]\QTT`ICFIH>A>=7:=?;=G=?AAADA>>:87DB755479.556435532323647553458EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<99D>CGRj^mdbfkvqz~~{|~
vyn{{ty vusu}soou|
zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥¢«
z}¡¼¡©¦¦®¨¶¿ÀÁ¹ÇÊÎÎÅÍÉÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆ}{ikgaUYVWNLENC;==<8:;=9=@6=?@<?=<9867CA6455=80665547745613854564557HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Xea][htzylwvz{~~|z}
zzu}tm|}~t{~x~xnt~{~z©Ã¡½¤}}r~s¦
{hGq ¤
~¥
¤¸¢¨¡¤¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¹{{znkhYb]TPOIDLB<<>99::99;=6?>><=9:;;37D?7378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=CQSRX^UXfmmmiqry{z|{z|{}t
yrzsm~~w
¢n¨
z |}£¢ ¤¯
Wr«\¢¢¢
¤³¡¡¨²¸¦½ÂÇÍÈÆÏÍÐÌÏ×ÑÑÕ®ÖÕØÚØÚÚ×ÕÙÙ rwjh_^YUYYCAIC?>>:49:;7:;:3;;?=>7;9:0:G=:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbzma~omwxyz|
{{v
sp
zuvvt~¦¤¥¢¨r±§
¢£©°n·
ÄȲ¡¥²d¤ÍÇ
ª££¤¨¡£³´¦£¼Á¾ÇÅÅÉÈÉÂËÓÍÍÔ©ÒÑÖÖÖØÚÔÒÚÎukf``_PKV\BBGC;A=837;<:8=649:<:82?9929I:>67BC32:96264>=4;>6949;57944JQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBeGu||m~xz~z~vv{lo~y|wx|~£´¨¤ª³¡§ ¥¤¯¢¸³¡ ¤¯¢¤§©°¤ À£É¸«¢¥²
¨¢
t²¤¡} ¡¡±£¤·¾³ÅÇĽÃÿÆÎÊÉÒ§ÎÌÓÑÐÖØÒÏØ¼u|x_bWbXRIKOEBCD5>:76:?;<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGM\\YJha;Hzzm
y|x
}px|}|osy}{x¨¼©²½°¥®³³©£¢°¬µ¢¸¥¤©·¦¤£©ª¤¯±© »»Ê¡i¶·ª°£«½¤^ª³|}´« ¢¡ ¥®¨¢¤³¸«ÂÈĶº½¼ÅÈÈÂСÆÉÍÍÄ×ÖÐÊÓ£s}k_[UaSQGD><CAB8?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPfHa`bpJ@~r|u~m}||~pww{«ÃÀ°½Æ¼³´Á¼´¬«³¶¨²½«»£¨¹¸«¦¦¢¢¤£ª¯²±ª£¢¥¥£¹¯¨À»¬²¹¥£§}½°z§°« ¤¬¡ §§¤¢¤°³¦ÀÆÃ°°»¶ÅÅÿͧÇÃÇüÕÐÌÄÊvvd_\b]OLCL@EG>A?B<:4>A==5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\hF_ig[]\{un~{~q~zz¨´ÇÉÀÂÌÂùǼº¯«¹»²¶º²À¯¥À£«°¼¼ª®«£¢§¬¯µ±© ª¢°³§¢ººµÁ»«¨²¤£¨©ÄĤz¡ ¥ ®ª¡ ² ¡¤ §¤¦§¤¯¥¿Ã®¨·µÉþ¶Î²Ä¾Ã»³ÑÉÈÁµw{o^[^lTNIDMKKI@A=BD<5AD;:3=8B332263A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr{wy¡¨»¾ÉÈÊÂÒÉÊÂͽÁ³¼¿§º¿½¼Ä¸Á©¬³¼½ª°ª¤¥£¬®´®¶µ ®¦¢£´¼©©¼Á£¶¶¯«¯«ª¬ª§¥¤uy
£¢©¥|£ ¢µ¦ ¥¤£¥¦¥£¨¨¢²¬¨»Àᥳ·ÌÀº®Ã³»½Á¹Â¿p{c[Y^]MMNKGDCHBAACK:4DH:;4<7F.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>lI_XaZdeWx
~¡®§£Ã¾ÉÄÈÆÓÍÎÍ˼·°º½´½Ë»ÃÁ¶·¼´À¹¼®¯¨¡©¨¶®®©²·¬¢¨¢«··©¥¯¾Ä±½¸³§ª´³®¥¨ ±Å§}}ª¥ ¢¡Z¤f£³¥¢¬¬§§¡£¨¦µ«©º»Ã´¦´µËÁ¸ª¶¬³»¸®¨¸º¼·op\ZVWPGLTNK?AHDDHFF85FM;>7>AK.32025B55PWN<LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hV<>@BFBsFiIRfcMF¦¡¨¥¢¯¾®¡Ç¾ÆÅÈÇÎÎÏÒʾ»¶±»»¼¿ÏµÄ½·¹·³²¶³¸³¬§««¹«©¨¯¯£®¥¨¤¥µÁ°«¬´¾Ã¹À¸³§¸´·²¯¤°¯¤ sÁ}±¥£¨¡ `J¥T°¯¥¯¯¦¡¦¦¡´©ª³¼¼»«°²ÇÀ¸¦¬«±±£¡²²´¥sqg^\PSMFQQPQ;HKHFGAC=9KT?A:=EM/7544:B34NWN<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;5EA:A?>H@5*B52,>c]g:35tde@R7}hX<:BC@=REWSsbVFH«¡¨®§
£¤µÉ´©Ç¼ÃÄÉËÉÈÌÎǾº³¯º¸ÀÁ͵ȺÁ¹µº²¯¯³´§¤ª´µ«ª§¬¤®¦¥©¬ºÀ¨«·¶¾ÁÀ¾·²²Ã°·¼¬£®µº¥¥u¾®¡ ©§ ª¡§mu¢£²¢«©ªª¯¦¥¡¥ª¢°§©ªº·¾³²®¾¹¶ £§¨¥¦¬©©fhc`SMMGIOJUL=MEMIJ@CD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CC:9C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW<:=..SaMVH~e^HF¬¡»®ªª¡£¬£¤¶Ç½´Â»ÃÂÈÉÅÂÎȽ¹²¯¹µÀÃʶƱÁ¼µ»¬©¬°££ª´»¦ª§¬ª¨¯¨¤«ª¾¼¨¼´·¾Æ¼¶µ¸À°½¿³©µ·¬¿¥¢¡¼ ¶©¥£ §¥³¡¥¨ª¤¡¢ µ°¥¦±««¥¤ª ©¤¡¡´µº¶¨µ²²¢¦ª¡xc_a_LIFHNQINEFGBQJH@DGAVSDH<AGQ1;B7:BF79]YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGE¨¤Ã¬¤¨ª¨¦¬¢«·Å¼¿·ÁÂÀÈÄ¿ÍÆ»¾¹²°¹´¾Ãȵ¿°¼¶º·§¤««¡¡«ªÄ¢¥¨¬¦«¯¬¢ª¨¾¸¦¾°··Æ·´¸¸¾±¾À¶´²µ¯¾££¡¡¤¢£¾¤¨©¬ ¦½¢£¢©« ¤ ¶¬¦²¦°¨ «¡¡¥¤«±µ±ª¥ª¬ ¡©ie\b^PJHKOLHEDI@=OH@;FIH[ROK=HNU4BF8>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0--0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcXN££Å« «¢¤¦ª«¶±£©³¶Å½À¶À¼É¿Êȶ¸µ´±´´·ÂÆ·¾±¸´º¶ §¬ª«¥¤Á¥¡ª ¤©°¢¦¨½µ¥±»·¶µÃ²²·º¾²ÃÀ¸¸´´µ£¤ ¬¡¨¨ª¢Â¬¨¬¦ ½¡¤«««¦ X¦¡ ¹ª¦¶£³¢¡± ¢£¥®³«©¢¢¥¤¤cg\eaMJKKOFEAGK>=IA99JJN]QQI=LV\8FI=DMI8Hc\KCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+waS6SZkWsHE6=ue\LP 礢³ ²§©££©¬»±©¬µ±ÈÃÁóÂþÇĽÄʽ°±¶®±µ°Àŵº±°º¶©°©©¦¡§Â±ª¢®±©¤§½·¦¶»½¯·Ã³³Â¿²Æ³º·«´¶ª¢¦¢«¡§«¯¯¯»²¥©©¢¤¸ ¡£®¯«¤¥¡£¨µ§§´£¯ °¡¢ ¦¬°¥§¢
dh]hfKJLKSAC@HG;;F>89NMU_RSJ>O^]=HPBMLI8Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<w]^?[U_gr@8<HweA4¤ §£©± £´©±«¦¢¤²¬©»²°µ´Æ¿ÄĶ¿Ä¾ÊŶÀɵ¬µ©°¹¬ÀÄ´·¯¶º¥«²¬ª¡§»´¨°®´±§ªº³§¹³¸²¸Àª·²Ã½´Å§¾®·µ©§« ¥¤¡¡¤®·±´¶©¤£ ·£¤¥®±²¥©¥¡¨¢¯³¢¦¯¥«§ ©©ª¢§¡zej]lkNQNNT=CANC;:I?77QN]_RVQAW`\BJSHVKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JqiVCWFyfC;¤¤ ¥¿¦¨®® ©µª·¯«£ª´¶±°¸·°·¸·Ä½Ãǽ¼ÃÂÇÁºÁÆÁºª¶¥»Á÷·ª²¼£±²¦¨ª¹ª¡§°« ¯´³ªª·µ¬»¬³²¹·¬¸°Áº½¿¦Ãª°¶®©««¦ª¡¡ °¯³«°¹©¦ ·©¥¢¢¯±³«±§« ¥¡£´°¦¡©£¡©©§ £~limbnnXQQZTACDT@;;H@7:XPd^PWWDY^^NLSN_LJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gYaF(@8l}h\V:{cC=¨¡¨¼ ©¯ª¢±·¨¤´±ª¡µ½¯³¸¼»½·¶À¿ÉĹÄÃÀÀ¹Å½Á¸¯¶¨«·²¼¿¿´ª®²¸¬¨®¨©§»¥³«¢±°³¬ª¶³µ¼°±µ¬°´²ÀºÅ¶«¼¯±·¬©£±¥¤¨£²ª³©ª³§ ¦¤´®§¡¬¬±§²«±©£¨¤ ¨¶©¡ §¦£
{gmrhqs`GYfVDCMXDZ9HB5>]Qh\NZ]G[^]OMSXdJKC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aV151=`V_8)C3YU\gK5zfL@¤ ¤«¶£«¨¤®µ©®³¸¦§°·Æ¶°·¿Á¶´ºÅ¾ÌŹÃÁºÀºÄ¸Áº³µ¬ªº¸»º¾µ«¯±¶¨««¬®««¾«¯±£ª±³®®¶±¸¶ª®±§µ°³º¼É²ªµ´°´°®¦ ³ ¨¬ ¤±¢ ¥¯¢¤¢¥§²©¡¦±¬ªµ¤®°´¯£§¬¸¢¡®¡¥££¡{
{lnyov}bF`jZIHZ[={JGE6AbUi[M\aJ\\ZRSSbaLKE`a`PMIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.+A/JGP[G3cXTKE °§±©¬¤£®´¨·³·£¬´·Éº´»»À¾´³·ÃÀÌǻĽ·¿ÀÀ¸À½²½®¨º¹¸·Â·¬®±¹§¯¬¨¤³©¯»¤¬²²¦§£²´°²±´°·²©®«²¦¸¯µ³ÄŶ©µµ«°©§¢¶¦° £°§©©¢¥¥¤·§¢°³«§±§¯µ¬¤ ¬¨ª¹£¨¤
¨¥¡w|nqxv|\Lel\JOd]?b{GI8GgWf[L^bLYYWUXUi]OPHa^_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHg27'FaLV%-B.=ELQ<3rkLDD¤£¬ª¦£°²²ª·°µ«µ¹É¸®Á¼Ã·³±µÂÃÏÄÀ¾µ¾ÁÀ»¿¼´Ä¨ª¹±¶·À¼¯¬´´¡§±®¥¦±¥²µ¬ª²±«¨¨´º¬´²´«³¬ª«¨¬©¹²°Ç¿¸¤¹°©¦§°¥¤£®£¨¯¢¢¢£¬£ ¡©¦¥¸¤«´´¤ª«¨¬®¶®¢£¨« ¤µ£¡¢§ x~}}}rts~~\Scn^NZg]FD[G:NmXbZMabNVVVWUYh^QSMcZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Dd;6*HdHJ+:I?3CIS,>k?HI©©¡©¯¤§£³³°´´°° «½Ìº®Á¼Ç±´³ÁÃÑÄÆ¿Á²¾Ã¼¿¸½Å¨·¬´¸¼À±¬²¡£§®ª¨¥±£ª°ª®«±®®¬«³º¦·°²©²©ª¦¥£º¬ª°Â¹´¬¹¨¨¨©§±¥©¤¢®ª¨¡£¬¥«¡§¨¡¬¦£¬¶°± ©¢ª°«§§©£ ¨ ¡¥}w
utrwl_Y`ncQsq\K;{F?WuX`YOc\MUVUWQ\b_SOOhYWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.IgDF8<B05EKX1@]@NF¬§ ©±¨¨°µ¬¸µ©¤«ª½É¼±¾¸Ã¯°¬³ÃÄÎÎÿÀ´ÀÄĺÁµÉĬ¯·®³ºÀ¾´®®¬¦¨©±©¦©²¦´ª¯±®²³º¤¸³¬¬§« £°·«ª¹¶¤µµ£©§¬¬ª ¨¦§±±¤¦¥¡¡«ª¡ ¥££ª£¬¢¦±¶¬¬¢¥£©«©¡¥¤¤
¥£|{u~uw£xj^`nfWfdN@gLDbzWbXReUMVVUTO\]aVLOjWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DBIID¯¤¢©¯©¨µªµ°ª¤«ª©¼ÀÀ¹¹´¼µ¦²¯ÃÉËÑ¿Á»¹ÀÀºÁºÂÄ®±µ²´¼Á¾³±®¬¬§·ª¥°«¸®¨°¯®±«µª¶µ¦´·¬¬¤©ª¤³³¨¨¤³´µ¡©¨«¨«§««¨¹¶©ªª©¡©ª¡ ££¦¢ª¦´®§¥©¢¤¤¦§ª¢¤£ ~
£t~xuzx~pqfgqx\atjO]VHmyUdVRbOLUUUQOX[bVIQjTVTGPYUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02?f=NX?C,?LT_/Ik7RF;¯ ¥©¬ª£¬®²´¯ª¤¯©¨»¿¼Â²¯¹¢¶¯ÈÇÈÑÀ¿½º¼Ã½»ÃÁ¿¿¯±³²¶½¼Á²²´«´©¥¶©¥³²¸¯¢µ±¯±¹ª¸®ª®·«ªª« £¡µ©¡®²¡´ª¨§«£ª¡¡¬¨½®«®¡§§«°¢¢ ¨§§©°©¢¬¡¡¡¢£§¨¥|
¤
¡xt}txy{tt{j¤vi^elug|RVp^JxsTdSQ_MMSZfNMWYeYGSjRQ>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HP;YC3° ¤¥ª¢¥£¬¦´³±¨¤°§ª¸¾Á½°¨¹ª§°ÉÆÈн¿½¹¿¿½É¼Â¸±°µ±º¼¹À³´¼¹¬£µ¦§¬±¶¸²¦§¹µ´¼¯»¥µ«©¯¤¤¬ª¨ª²¤³¨ª§ª¤©¢©§©½«³°®©£ ®³¢¥¥¤¥¨ª¥© ¤©©
}~
¢rzy~|hv|{upr~jz
d_hcr
{mgy]^VBW{mTaPRYKLNpt]IZ[hYFVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°©¤¢¡«¤¶²±¤©°¦¹Â½·°¤¹¬©¨°ÂÈÉÌÁ·½¿µ¸ÁºÈµÃµ´³µ²½¹º½¶®¹¶¿¢³¦ª«®´·´©¹»¨±¾²º ®´¶©«±£¥¨©£¤°¦¯¡ª©§¢ª£¨ ¼§®±®¡ª¢£®¬¦¡¢£ª¢££¡¦¬{}£}zl}vyxbzzrppsxjukgcgansmbjo_pA]ykV^NQQKIMSYVM\^lWEXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R]>#«§¢¡§£·¯¢¯¯¨«¸Âº³ ¹¯«§³ºÇÊÇ¿·Â½¯´¾·Ä¶Â²°¹±²À¶»½·ª¹¸¾ª¤µ§¨ª¯¸°¨¸¼£¾´´¡·µ¦¦¨°³ ¥¥§¡¤¬§¨ ª¯§ ¦¢¨°¸£±¯¡«¡¬¤¦¦¨¢©¦¨¡ª}||¡z
|
|tp|qst`xxiopqpksdzlhedaf`[rjrMNiXZMQLKHPRPGM[_oTEYZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0][5(¥¬¡¤¡·«°£´³©©ºÄ·²®¡¸«¯µÅÇÀ·¿Á¹°´½·¿»¾°¬¾°³¿±¼Â¸©»º¸§¨µ¨§«¯«²¯¤»¶¤«ºµ¯±¸¯©¥§¯²¡¤ ¤£ ¯¦¡¢¨¯¡ ¢£¤¢¶°¡¦±«¬£®ª¥¨£¥ª¥¢¨¡z~yz
~z{prvnos_xwdllljj
ofrikfh^ds`[kviZJ^\XOOKHHRUG39]^lPEYUYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDU]hD.<2dW,2¡¡ª£¡¢¡·ª »·¥¬½Å´±¯£µ¯¬¬®´Ãü³¿º·±³¹¸º·º¯®À³´¹¯¿À·¬½ºµ¦¢²©§©±ª± ¿µ¤§´µ¨²¼©¨¥©°¬¢§¤¥ ²¤£¨©¢¤ ¤¸©¤§®¦¥¡¨©¢¡¡¡ª¡¤¨¤y{}z
{w~|ltrllsawthhjggphhicfii`jcjh[f{c`StT\[RLJFIOS@!*h^iLDWU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gP'2¢£¤¦£´§ªº¶§¬ÄÁ·±¬£¶®§®¶À¿¼²Â¶°®²¶µ¸¶¶ª½³®²±¼¿·®¼»±¥¶ª¥¥³§©À«§¤¯²©¬µ»¨ª«±¥ª¦¤¥¬¢¤©¡¢§µ¦°ª®¡¡¡ ¦¡ ¥¬¡¨x
v}
{s~~fyokjkftskcgddvbefffjjckr[_Y^mdaNiXZ`VJGHKMRX>9_lhHCUT][IIGFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£ ¡ ¤³±¢²½¶¡±Æ¼º±±£·¬ª©¸¼»ºÀ²®®®¶®²¸³©«¹±¯®³¶º¶°¸½¬¦µ©¯£©®¡¿ °£®°®·®µ¯®¢§©¥§¥¤¢¨¬¯¦º¨®¢¡¤¤¨ª§©¦{s
|
ofymhkifqrk\hcctbfgjnlgkjhn]llsp`TcicfYIFLMOXQQUaeUAWSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC&4¡°¡©±¯¹¿µ ´Â»½º±¦·¯§¤··¶·»®¬ª«¶©³·®¦²µ²®©°¶¶°³¶º§¨µ¨¨ ¨¬§½¬£®¯µµ±°©¢£«¨¦¤©¢¤£ª«ª¼§¤ ¡k¢p£u©§¡ymi~vql}
p^cag
ktw~gguheW\hsmNPjcgs
h_efnmj^_aeNKD9GTh^JGQPTULHR`oteF[QUPFHEC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=A@@=28@E=1,+08=G701.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.£
° ªª£½Å¯©·Â·½½¦·°¥ª¢¶³±²±¹¬©¦¬´¥¯´¢©·¶¶¨§¬¶²®´³¡©³ª £¥¦«¹¥¥¯³·®¥©®«¬¥¡¡§¦ ¥¥§¦¨©¤¶°¤£¢£¡ ¥¥ªrx
¡vif}sx o~|¡ |tulmieczlraS
mbliqXiqpX^i[ll[rnzr
gZ_GN?G_MERVVQQSWTg]MVHRROFGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(¦«©©§ª¿Ã®±º¼¶À¿ª¥·¯©¬¤²´®®³¶ª¨¥°¥´²µ¶µ¦§¨²°¬²§©±§¢¢ ¡¬³£¤¥µ¼¦§«ª¬¨¦¡ ¦£¥£¤¤©¢£¥¦¡·¤¤ £¯©¡
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êr¼Åzrµ¦»{m±«°yhlX±®nei½¼ngzorØ~Skc¶²rs¡ªWOWbOVNFU[XQPR\W[PA\DQNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>:B<?A8:J>52*22BE/.32.+/(-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦§ª¥¬²¨°Â½±µ¿µ¶¾Á«§³¬¬©¦®³©®¶³§§¦´¥§·³²¶«¥¤§±¬°¦ª¦£°¢¡«¢´º£ª©¢®¥¡¢§§ §§¦¡¦¢¡±££
¯kjª~fdp¦q®¡¤~x»}k¡v±_j´[¥e`f{fjxk©e¾rg¦u±j|±xtcnm§n[ EhfEu`~g|¤§Z_«hxyj§7J¯\XSld[KNX_\WV;NOWW/ITSJCFF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢§¥£¤ª±·¬´½¿¯¶Ä²·ºÁ¦©°ª®¨¨¯®¢°º¯£¤²£¨¸§³³°£¥ ©¬¯«¯¦§£¡¯¢«¥¡´³¢«£ ¢¨£¡¦¤¢ ª¦¦ ¡
µµx
©µv³·~©~k¦{w«gk±\«ztrx °vwqlll|N¤XHbb~ch¦`yruS^P©mcq~b.Q¡o[Skh`LK[dX\ZB>±yWXA#MhFCEA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aT50 ³¦¦¡¯©§³¬©»¶Â°»Á¸·¿©¬¦±© ®»ª §´¬£«´¤¦²³§£¢§ª±§°§¤®« ¤¨´¯¢©©¨ª ¥¨¢£¥£¢©¦¢ Õ¹p°Á~Å|Ö»|¥¤{£¥z¬yV¯z~j¹Z¹v}¦|zªxz±nt¼
oP¯§ÅQ zc`©bsrm`Sµ´È|c¤3Bv]PjicP@XgZdaJHMnN\QOYfYCD?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:;DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aP71%¢²¨¨¦´ª¥´©¤¼·Á°¹¿±µ´º²´§±¯¢°²¦µ§§¹¢¯°³´°¡¤¦©°¨´¨£ª ¨§°©£¢¨ ¥¡¡¡¡¡¡¢§ ¦ §¡²nhµq«n¦r´sr¶{¤£¡¥~°vÒÒv\®{
¤oª¦k|}{°rx³etofQÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjceXAOk`lhPVGI9=URZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aL620¡¥°¬£«¼¦´¦§¶»¼²º¾¶¶´¹¸²¥´³ ±±¢«¯¤¦¹¤±°´¸ª ¥¡©¤±§¬©£§¡¦¥ª°¦¢ ¥ ¤¦¥¦¡¢¬ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
~
v¯w´aemZ°XKuyf`^vwhl]¯wxl5yÈ®²_BTo^g`EPl_pmVVM.fdiSYP;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK96<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`H:99 ¹°´Â¨³¨©²º·³·¾¸·±´º´¤·²³¬¨«§µ«¨¯±ª´¤© §¡µ¦¦©¢¤ ¡¤¦¯¦ © ¢¡¨¤ ¥¨¤¬¡ ¡¢ ¦©}}¥x¡ªp§¡£ª|xo±Z¨ ytØvs¨¤|{²^d ~m\«[Zhgªdr{ks^«Z koeOJC¡\[Lt]bgN[a_rs_KV7JXGE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@5.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¢¿«´Â®«©¥´°·°µ¾¸¸±°µº¨º´¯¤¤§§©°©¯©´«ª®¡ ¦¤£¹¢£« ¡¨°¯§¨¦¤¨ª§©§ ¢¤¡¢¡ ¡«®mr´s©u§s´xs³¤£¤w¸o{¢jk¶Z¡
ei¡¢§mr´t²j
ju³af¢ok\_M¡|Rs£ly~or]¯V<wfTon.\§OcSkebmZc]`p{cTZR>>mo3CB@?M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¦»¡²À®«¬§·©·¯µ¿´º¯®·¶ªÀµ¨© ¥£¡ª©§µ¢²§®© §¤«¸¢¬£¢ ª¶°¨¬ª¥¥¬¢ª²£¦«±¡£¢¡©«Ô»s°ÃÃ~Õ¸x§z¤¶u}wv²`ºyÀ|u¸cµ©|¬©q{t¼§ ia¦¯¡~tª}¾os¼t²uxnrn¤t½^w}Zay¼kZV\jy^jaegbmxoZ\YCA@s@CF+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¢½¡²Ã°ª«¬±§·¯¶Ã°¸°¹®À°«£¡¢¡©£ª²¤´¥¬¥ª¦¬¸¢¤¢¯¹²¬£§§¤¤¬ ¨«¨£³£¥§¢¢£¯ ©¶·xµwmknsoy
tÁ»½{±¨ps¹|||¤»¹½uz´£twvt°ufjµtrqw¶^z}hynzc¬pu
X[§jEeZTf`c^cQgfpluCNPMD:ZM?J3;0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O^]=+:VU'>;<§ ¢¿¥´Ã´¬«¨¬«©º®°Å³²µ¦³¸«©¢¡¥ «£¬©¥µ§§ £«¤½¦¡©¡¡§¡±µ·¤¤¢¦¥ª©¤¥¡¨¥§¤©¡¤¯¨¦¡j}i¦xr}tyd{½¾Àºor`rjZ^`ck`cmwbke^`cphr}gkrux}~b[wthP\n}{kXkzsJJopNtMEX]gaLZXgc_O[muiqRPDEM;GI=M?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P_L(3>[O'?2>© ¨¢Â£µº¶£¬¥®§§µ±¬È«¯²ª³¢½°±¦¢§£«¦®£¤´¨¤ ¦¨½§¨¤¤¨¨°²¿¬§§¢©¨£« ££§¬£ «£°§ °¥¡§¢£¥¡gm}qw
µª ¡ z¥
mk}|uqxyvv|jstuew}wkozm`c]phMXZfj`WZoymmfTOFS9OZMQO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\J,<-@³ ³¢À¡¤²²¶ ©¥²§¥°´ªÈª¬¯¤´¥À¦³ ¤¤£ª¦¬¢£¶«©¥À«£¡¢§¨§²Ä°«ª¨ª¬¡¢¤¯§¢¥¨®§ ¯ ¡¦ ¢ ®|ª©
z¤g¡³¯
v{}wyzofykuzsis{vkudyf`jecdfkYl{oik\SLPD^TE@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_bca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4[G5<,@´ ¹¯¿¬«®²± ª¦²¢¬³¯Ä¯©ª¢±¼¢³¦¢¡§¥©¥¤¥²µ¯¥¾ «¢¡¨ª«£´È´ª¤ª¦©£« ©¯ª¦¤«¢® ¤¯£§£§e|e~cymik{¤ªje}geeih{¡kg£wkj£slnzzXf^^mv\hswvnwxsmytv|kY^ltd^sik|qkd_RNXIdXAJ4>G7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO2YC;?.=¥º¼º¯¬´±ª¥¨®°¦°¼°¨¦£®°¬£¡¦ª¬£¥§¨²£¢¯¥¶¹¥®¢¡ ¤{¥¢¨´Ä¸¥¢§¯¢£¢©¨¡ ©°««¤« ª§§ ¬¡¥°¤© £©}½r´rhx¹Ä¸q¢£z¦r«|ËÀÀ»q£}À½ÂÁ||ÃÀ}l¥²ooÊzwvyyqzpw
ynxcg`xd`ec^tgldcXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP.#F[3PY/VAB;/8£¹Ãµ°°À©¨£¯¨°®¦²³®©¤¥¦¯«ª¢ª§¢«¢¤¨¤¤´£¢¦«·³§®¡¥¡¦¬¤¬ÀÀ±¡©¯©¢¡£ª£¡¢¬¯ª§¤¤§¡¦¥¬¨£¨©¨« ¤ ¢~Îxz¤y_®^§¢ |§s«¯^cª{¨
t³c«¡³j¯u}·aZ£Ínv{Ú{p~v~e{vvk|n}~marmph``yd\qhjdg`RTSW]KOC5AHDD8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸£ª§³«¦²««ª£ª¦¯©¦¤¢¯ ¨§¢¥ °¬§®¬°ª¨«¤¥§£¥«°¨Àdz¨©±®¢©©¡¯©¬ª¨¨¥¢«¬²¥¢ªª¢¥¤ ®¦ q
u
¨q±}r¬~¡¥v«}r~«v{|~ª¢~«{{WÅ{pÁ}muomeveoawnrnnfpuuqagme_oiingdXS]aYRSC9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÓÆÆ²´ ££¢¢¬¯¶®¨±¦¨ª¦««¦¡£¡¥«¡¥¨¨¢°¬¨§®«§¦§£¡ ¦£¯¬¤¬µªºÎ²¦®¬¢®¬ ©²««««¥£«®±¡¨«®¥¤©¨¨¯¡¢£¤j¤uz©tz²p¦q ¤``R¬
®v§
z{f£¤£}©~®_|©V£z£{ïÅr¯³³¹qb©¯Âthnqozxypmgeerpf|ic]W`jXYULLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÔ¿¡«§ ¯¢°´°®©¬¢§¦¨ª«©¤¥¤¥§§£«¢¬¡£¯¡«£µ¯® §¦¢¢¨ ¥±¥¤¨±·È²µª¬©¢¥³¡§¬¤°ª££ª¡³¡ª³±¡¨§®´¡¢¦|©lu«y|°o¥Ò¸´¸É²_`©¤ zxªÉt¤¨©ÆÆyg¡¥t}¯]p´b°uK£m§Gd|qq|u~|n\fjsqfk^aYdm\_YIMLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ¨²¬¥¢²¸¬ª¡¥¨¤ª«ª¦¦¥ª£®«¥ ¬©¥§¶¢¨ªµ²¬¥ ¥¬¨£ ª§®¡¥§©°µÃ²³ª¨¥¡£¯¥¡¥¦±¯©§¬£·¬¡±¸¯®¦±²±£¦¢Nxz£}¤
¦¸{{y¹ÌÆÂ¶x¡~v¥¤©°
¬}c¦m¤p
}r¬`£sq`¼}RUt£{~v{sq\nnxrjo[d_inbd^LLQTAIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__]ZZZXUSOH@882.,*.+*''?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª®¡¬²³¥ ¥®ª§¦¦£§¡³®¢©¦² ©¤£¶¢¢¡©´¸£¡¢¡±§¦¡¢°®¥¨¢¶²Å±©©¨¢¤¥¦¤«°¢¯¥§¯¤»¬¡¶µ´±·¯±¥® £
ѵ÷y
¦y¡w ¥qª
´nrj£|s¯¦£¦nq²]¥tzl{|m©a£qqbs²¸hw¦}y~ynjyizsou^eeomfg`J[XX<HH@U4@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][[ZXURRQF:223//++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¾¿¼º´§¤µ¡¢¢¨¦®««¦¢¦ ¶§£¨§°£¬£¤¢ª³³¤¤¨®§¤¨µ¢ª¤¶¬Ä°©«©¡¢ ¦¢¦¥¨¨¯¤¦¦½¬½¯¬¡¯²¸©²¥¨°¢§y¨}|°w¤¥m²p¡|¡§¬
®
ª ¡{~««x¡z¯^¤}¦§d|sj¯]¥kp
]`[ m¦||knctnz`gfqnhghCYa[>KU3U8BBC7$$3+''3, /6674359@CFIKMNQRSSVZ]_a`aaa^][ZWSPONI7042.*,ATVVVTTUTUUTTUTSTVWWXVUUQHFIJ#((½¨Å¶À³¬ ¸¥£¤¢¯°ª¤¹ £« ¯©®¡«¨£®°¬¦¥¬¬¡ ¦¡¥®¡¨§·©Á¯¥©¤¦¦¥¦ª¬¤¥©¨¾¤Ã¬©¢ «²¸©¬¥²§¨u¯~
}ºe°e} ¦¬°
¦¤¡¡ \lj³`{{±mgo±[~µ\¤kÈ¢d{¼XvµY²}R®z¬X¡m¨|zeu~cxt|ajgpmgefOUd\AU_>I(>9=4!",%2. *1/045799<ACFHJLNPQRTWZ^```ab^_\[XUPNJFC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò²±·½º³Á²¢¬¦¤µ¨ ³³©£ µ ´¨ª¬¯¬¯§¡¯«¨¦¡¥®¨¡¥££¥ ¢ª³©½°¥¨}¡ © ¢©®¨¦¦¢¤©» Ʀ¤¨ ª´´«¥º¬««©£¯¤¸Ãº§¬¯§¦ª~սªb£¿½}~£×º¸µ
½¾m£o«lz²°Çi«°½¬xw¢¾¼s¦{{d~{egy{alekjcPb[Sj\?TaCN)=:4/$%2 $(0496677;>ACFGIKMNNQTW]a\__a^`[\YTQMHC?=A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³³°¿¸±¼²¢®¦¤²¦¥Àª¸²¨¡¿¦§²±º¨¯¥§°«®¥¢¬ £ª £¦§¡©£¡¬ªº®¨£|¦©¡ª©¡«§ £ª»¨Ä¢¢©³³©®¨¹¦svª¥¸d ph®nnw¤u®pq¨£®¤rlllfxonqzjqigqii
gqd]bjoY\f}v¦_aqnee¡¡~wgxikyyemcflbKeXJlZ:PeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY\^^]\\\]^]^][[UW^©¬³©¹¸²³ª©¡®£²©¿³ÅÊ¿·ªÀ¬¤¢§¬º£¤®«¦®©
¦ª ¤£ ¤§©£ª¡¦¦§°»¬¬{¥© ©£±¦¢«¹¯Á§£²¥«¯°©¬ª¦µ¢¬¶¡¨¦·£ª©²£ª ²¢¡¢¡¥¡«§¥}g~tusp§lz¢¤sjwqxw}zjmdcodUaY@j\HcaOY+F=+'!750.!%2(*699469;>?ABDEJKKMPPQXUVY^`ac]^UQJED>9=@ASX[\YWXXXXXYXXZZ\\^__`^^^__```_YY`¦¨ª¤´¶®®¡°£ µ±¬È¾Å»¹«¢¥§±©£¶§©´¦¨¬¢§¬¤§£¨¨¦¡¤¨¡¶»¨«|¡¦ ª¶£¦«·§®À¢¶¥®¯¯«¨¨±· »¥¤¦¶¢§ ª £«¯ £¯¨¯£ £ª«¡«¡
}f
uuxsj
|£¤
|ss{s|jod^pj`[`ZndP`ePZ:GGE>2=>9/*&+)&&416668:==?AACIJGJKLMSSSUZ``i`eVPJACB:9EMV[^^[Z\[[[\]]^_]^__aabaaa`bbbdb\[c£§¢¯±«®£©¦¬§µª¥µ¼°¢£z£²¤¥±©¹¦£ª¢®¢¨ ®ª¨©©º·¤¥y£©¸£¯µ¢¯®t£¼¢±wx¨°¹u¬£«d\bv ¥}m³£§ª¢esyp¨m¢¨e¦
wjvp{
`hZughs{¨fzyj
ozkre_vqlkh\ffbbpS[>NNNSG>@UD:1/&4:306678<;>@AAFHBGFIKMSTUY]`hfgXPJ<DG<8UR[`ab`^__`aa_\]__`aabcdabaaedchd^]f¦£ ®¯¬«©¥¨¢§¤«¶±³§«§¬s° ¨«§¹ ¤¬¢§¡u§©¤»´¨ uw¡¡§²µ³º¦ ~§¢z¡µ¥±ª¯¤z¬¡§¨§
w¥z§{²z¡
bz
mpyp~
s
xgt u}
£
klx{qqgdwojlk\ekjet\^ITLR@E6.ZUU7)!09>>743568;:=>>@DI?IEJLGSX[Y[aahfZQH9DL;>aV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah¢¥¬¬«¨¬ §¯¦¦©¥¯È¿±¢¨©¶¬§¢ ¾ |¬¡ §£¤º²¨
qv¡¥«´´Ê©¬¶
°¯¬¨¦}¨r{w§h¤y´¦§Â«¡r¥}
²¡}¡¡}
mr
~yq{tÅf©£k
¤q
hxu|xhhvphhl^dplflXgG]RM3E46Nbd7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^il\QE=KM@JcX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢¯§¨¨¥«£·°©«¦ £¤«¤¦«¸£¯¡¨¦½¡y«¡w¤£¹®¥~bm ¡¡¡§~¡§
©
£©¢ukvM«x¨¦©«}¡{z§jkg·~n`dY{dhr}yl]}m_Rp\_kx_Xd|p§ªk£nr¥p
jg m[o}gZ`bXPowfmtrkjo]jqmkiXiO]YF9A5HD_l5,ICRMN=84859;6@;;>BO>QRLMBJ\]_W]^bu`MD:MONTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ©£¦¬ ¶»ª®¢¡¢¥®¡¯µ£¨¡ §´u¦~
¬¤©¦±§¢in£ ¡¤¢¡ v§ ¦
§«¥x|~¢ps|ym¨{¢sv¦f~w¤_z}t¢n·´ºtµ¨dƸ{p¶r£bs¬«`|i³~m|q£lr£t
¤a³r}³us[²jbotvqioXkmsrf]i^bLE=D6QBZs3=SG_JR=<395::6D;;@JP?UMOQ@E__[ZX``|dHC8MWUWbaZefkkbbeadc`ab`dd_`cknccddhdbgfchh£·ª¤¶´¬ ¢¤£¦®²®¬¢¡¤«x
q¡}¨ ¤©¨¥
~j{~}¡ w¢q¡©¥¦©}~z z£xt}¥
¢d¡|mhoz§}rit«tªh]
v
gªk¸f\¨p`^§vu~huon§]©y»k~ª\]´g\nrzxki\qkyyc`fXbBQFO7WCRo5K[Z_NZDA251;;6H?:CHU>YRY]>Db^V`Qac}jEB9N[^YdfXfgnmbbe_aa__``ec^bdoq`deekecihgki©´§c«¹±¯¬¦© ¯±©¤¡ £jr{z£©£ iy{£ ¡rhp©¡¥¦{°£¢¸w£³£¤y{«~¢q¡|
¯µ}k¡y~µ¢¤«¨|}tªZ]o{xbL{z
cyBLX¢jq{lux±³§wns}ptk¤]vHed`tq~~of`liv|debQ_W]TW@ZFQhDSW\bX^ID=B8?B:IF8LEXAWR[VDFb\Z`K`m~rEB<U_bZeiVghmobfg^aa\]^`hb_ecvm]egfkdflihki°S^ ¦³¹²²¨¢¬ª¢¬¤£¨ ¡woy
|r¡s¡
©|l
q¡x|¤ ¢}µ{¥z©|§hwm~t¡sr|p®}¤¥£o^¨gu¢co¥aÓ}{xssb¢~£t¤vk³`sª²¨¼wm~¿¦©´]m|pmr¢r]¤gs¦`h¦mÔ~py{l|xsn©¤g`ezq
lhfdnvxg`cS\fQQbHXJUaWT[ej\eQFCKMJKBKE8O@QNXSYOSQ`ffjRcwywIFEc]eZhjTihjocjg`c`\]]_hbaie|d^dgdkdjmghlh¯ªT\K~©¯±³¯²£
© ¡¤¦©¡ª¡
{p}h}wol|¥«yvnx£{£¤³¡¢¶z¬§¤®¥p©
{¤¡r¤®¯¤ vµ¶µÉ¡s`©mz t¢w ~pMf£ps¤{ytak} kqd_q}shyi³µ´Æ¦s}zk«v
mvxj{urQE}³_jvkzfkhcuuqnW_TYiPShIVMYTV]hknVgWNKAJMKHJOAQKPecjmetrsy|nu{{TPNl^i\kiRjhilhlfce`\]]^ibdik{_]dhcjfnmeile¡®¥d?¡²ª®¯µ¢¢ª¢£¥¥§¦zjye yui
y¦ªz}yp¡z ¥¨fnxl¢d{q¥wpg¦z¤zrw¹n¢b} mriªku mo¦_iiu¢~`upbh e~iuocfmq¢Z^[b¡m]nz}srd¥mx¢dg§hsp¢oUo _f¨T^TnmskrmpilytkpRYWWfZTmIYO]IXiisjYkVQRFV\LXSaUik_wt{}p||r{svv^QrbgcpgPjhhklnhdg_]^]`jbjivu]\chcjjsmfkmc£¥ydsm¦£©°±¦«¦£¢£¢{qi|su}{d|¨£¬~si¦} ©¦¦x~¤±¯¥vx©s¥n¤¢»n}¥¯
|¥zr¨ f~o¬dw¨mª¢vw«¦k°kv³©k
mm`~«ªv~~¥v|¤ jx¬h¶tw¾¤Z§«aurtp|uqckoimSW[Vab]kM]R]J^mnw_[qY\`[gtenorcrt`wz~yrys{{vbxdcnrdRkgholrjfia`^\akbmlzo\\bibmjxmglnb¤©£©©¨¦®¤¬¥¦©
t{o
~ttrm}{¦¦§
vol©ª¢u~y®¢qw}{r§q}}zy{~v {}k
[yyrzqin~quqe_wtruoynml
^ugwe
¨}t{jpv}wnnhsz|x
\lXyioxrqoxxp]knjgV[`W]fkdVcU_Q_pxylkvfkkkw}rrutaovbt{xuzux
}{nldyn^Wnghukxjije\`Zcjemqtn[[bldllynhloa·¨¦ ¢¦£¤«¢¡¡§©r|}~
{trp
{}y~¥|¨¡
wr©§ª~~§¦woxn~¨
p}qkp} hl\sqtkvtYrn~j]jd{`ixz{u
gwjapqt^q¥
enwqzqhhe|{[\khnv[|yxunssg\mkkbZZ_[Ylq\_aZ_]et{uptdkkk|}s|yudnuhm|~wz|{yz~o{}t~yshT\qilvpugkhd]aXkhkkqrnW[enlgszohjm`©°¡¢¡¨£¢~® ¢¥{
}s~v
ror~z¡§¢yz¡ª¡¢££ª¡§¦zv§~²¦±¥k|wxe|
w|zt ~}uor~w¥
}zm
~zksiatq~zwwowt]^ohn_^Z]]ShrVd]]blhu||sopdkji}nyrjpqlg{rx}{m|zy{}zxNcvjsnpzekecb`[tfpgrqmU]ltmhyzqgikd¹¡ ¤ |¬ }y{nys~mk~z
|
« s}{ª¥¢
¦¥u{¥{|«¡©~oxqu`u
nyvt¡
s{|rqzzw¦
w~qm|ohlmh_zh~|vuvu{x\_q~nt`c[]_RgnTe[^bkivyqlmdkjhltlluozpynv~
vq~{{|{`h{juhidjc`i\cuhobumlUcqyepz{sejmm¶ £{x§¥yz
|n|ys
~}kh}|~|¨p ¡
|¨x£ ¢ £}w ~|¤¡¢¦~~uspwa~r}r
hxrx}q{|pwzyy¤
{
v|gs}y{qmkg_~sh|uvt|sj^`tvpwdcY__RkiUeY`ahjvyqgkdlhfkn~hoql~yzls~tv|z}irntiahlb_qVtomm`xhmWjtvcuz{rbjoz±¥¤ }w¥¡£y{~r{tv
~xgc~y}y¡~p¥¦
w ¡y~£xw~s£¢¢~|vq}n{d|
ql
fuo{
|w{
{zq}wy¡vw|x`zy~txgmeajjwstv~q|cc`snurmaZa^[leRcYaahkvyqckcmfh|miuhnpi}ymrt|}z~|mvsumeljbbvVipn`xglbjvpfy|zq`rl
¦§~xªzy|~||xtyzt}d_}~u}~}¤¢r{¦ s¦rkzo¤{yqykul|~nxq~~eri{~sx|uw|{£xt}tv
pa|v{r}pbocd|cnpvsxwstbv`olvno\\_^^j^P]Ycahnt{k`iekciwnglikmh}{wos}t{}z}}rzxxmljh_ircgqoewgnlayik}{xpaxm©£¨
~x¯}w~{}|wxput|o}|a\~s{z¦}}£n¢ me
zp£}{
ssvkpnu|tnqu||eply||tsxn|
{§z{~
w~qpehyuvq|b_pakt_qj{yylspey^nlsmrX[_`ak[PWXecgqqf]iigbgqodiheiizwuo
t{u
x
|x
zw{{rxjk_phtkromrgole|cnzwqlww~¢¡§ ¦v«¡s|v
xyss{kspznvoq[Y~vu ¢x
m¡
i¢e~w~}{|ovplmop{itqwuyfrnu{yyusozy
¢{uwynl
^susqqyZ_qapk^pj}{qmmjmv`pokqmYYbabnXQTZfgcupb]kndcfkn`gg_hkurspuxuy
xw
|{vjqc|c|nqmtjholvx_qy|uut~¤¬§
v yqxtpr
tqvlpnvmv~nnUQ«xwrz x{£|s
}hg
qw{z||kvjnkll{bz~v{x}ygsls}
zpyovyy|{zv|wqjl{`xqnmrtV_pbra`mozqhoffstiqkbwe]Wf``rSQO\fe]yp|`\irbbefj_he[gp~pkqt}v|uu~y{
xs
~|yxfrk`}ookz`jnuu_t}yxts
}x °¥
vtwtqp
tprpkiwnn}}musRMßÈÖ{puv w{s
¡wz~yuf
k¢cqz{y
|l{espklzz[yz~{zhrjs|k}~m}
|x|uwxrmgq
nkuphjunS_oepZ`lrxgkjbfxrppc`w``Vk_^vPNLagb]zqu]\evabeedagbYissnkqv|tzuv~s{r|~vesn|e~oplYlnyys`vz{vrwwy®
w~|
txpyqoomoseeyq}mz}jhkc¤ÁÜ®ð¡slvv
£p¡r¢
~zuxvtm
|¢
^m{}
v
}~k}dxujnysX{
z~yeri~kum}x~trwusqgvzcunqcjvhRaqglV_otzard`i}prn[cr`bVnY\xNMLdfb^wsn\\dy^_ee
`cc_Yjsknksw}twxw{q}~{t~sguryl{ntqWqzvyrewyivr¦£}qwy
¡|{swptjplim|u_axw|qu|h`d|ëÚµÉÃÜsltwjq
|{
vxr
u~o¡ai|}q~qwhvritwlZ}
}vark~~}mkw{|~npy
tkqlsyaujo]lwaRerifS`pvuap`]hqsjWghbiXmV[uLKLeg^bss
j\\ey^^dg{ad_]Ykofojtx~ss~{vzs
|vw{ulwvyxtnx{}Xzqogywdv
p
¢toqw~| xrtnodrifmxx\`y{{qqjagaÕ¶¦xnqw|qk{i||}ztz{qt
t~b
g|~~m|tkmwutwvlc
~}p_qo{{~ypey
z|~mny~umnkl{diljYnwZSjsibQcrxmcf^Zjnsb[g_dl_nU[pOHOge\goqmZ\cs`\clwee]]Zklcmjswqp|}txx
|uy|vpxy{on{w^tmiztsgs|q vvmw}v~vqpljau|gbjuz[`x|zmqechgW_qs¼Äwqtsk{|}|t
vv}quq~szf}r}g}{y}i|vfoyxswtlkyk^pwz}{~rhxwz|mkz|vtoih~we]qcXptSTosibNhuyga^]XootYda]jm`pOYlRDThbZlom{oY[^mcZcowdg\]`kjcliswqn~{tuz|
v~xtsyy~oo{qiyz~nm|vkjxtk
o~vjyzozsqljd`t{i`fr{[as}zgpzaed±²wKbZ¥ÚÑr{y
ol
yy|yxoqt}{jy¥~n~uw
pz~oxh
xr|e|~vcpsiyqou|wyzk\o|r}
zqmp
qwwmm~vzehj~raZxZYrnNXrtf`Kmwub^\[Yu}rpWf]fjq_oNWiS?Yg_[pkgyq[[YkeYcpy_h]^elhfliqxom}up{v
qq{|zyukzko~t}or|{poyf¡gpgz~
|ixrllf_aoym`boy\dlzaqv_deÕë¾2:>ryw
nm
u}
|xnv
wnku{tey§}msux~{x
lri~xm|{xbyqdqh~nurutv~so[k}sx{|wypkqw}}tmjvuu\iiyqZW}SZrfM[srf\Jqxp][[Z]uuiYb[genbiMWfQ=^f]^vf_uq[YUodZdpy[h^`gmgjkhpx}mjyn{}zu
pnw}{{i{~jt|r{sw}zx~|kl~kh|~}kuqgic[cgso`altahpzast^bc n\5Z¯µuj~wuwpm
tyx}z~sgu~}oq}hvynez
¥}m}t~{|r|~
|i~mk{yjzvr`w~qdrgunu{}pwz|u~mWm}usvtzwrmq}{|zmmhmun]hftrR\|N\q]O\spdVKsyjXYYZaqua]]`fdhhfNZhNAad\`va\umXXSta[eorWj_bhkgmlipw|lh}|p~{zwr{oqw{j~{nxyww}x~~zm£
{vzkm
y}{}prpcf^Yg_pp`ahpfjotato[`djv{¾§¤É¸r
s}ytrspzsutwyyqdwzhqufwvdj|}q~rx~wzlyzuhzilysizv}h`x}jjth{jv|~~q|v|t~bUu{qr{pwxoo}|w|{suhpglrp]hctoLfvL^oVTZtnbQOtybRXX]aps[a]heecjdQ[qIDdb\dq^\xhUWVw^\fnhVl^ajgennhpwzniy}s{~y|v}pvsnw~q|xzztxzuo}~{w{guz|vgpn`e\XfYmsaaaqllhn`siX^cmw©Ú©Ç³rypv}{utu~vopm
txtl`yyeqogun[m}y}wzl
tr
{muvmhwfm|vmjwv|`bxzhuvc~{hu}uvrz}mYVr}os~wksxjt|y{wzq{rgsdmls[j_vfIooL[cXWVymbPSuwYQVX^`ro\`cmdc]ocT]rGBf_^fi]Z{cRV\u[[gkaVk``nfflqhpvxtkuvx}w{t~oququ}
{wx|}
x|}~
{~rvx{wuz^~ytw{bnm\b[[aUjtd`[hopgqaqfW\ck|Êκ¢knomrr~{
zytyutzjlvcvvog_|yeqjjqcXm{rw}{mop{yrrp~ghrcmxqjlqw}|y]eywiuxfwhu}sjo~xn}]Wp}ms~{mnpvfv~~u{pys
{xqer`mkrXk_x]IplNWV_TU|kbOTvsRRUW^bti]`kjfbYnaXcpGAh]af_\V|^OVeqY[jh]Xha_rfjhqgqsvynt{w~yus
pp{xwuy
z|u~}~}|xvyv~}nuzdto
zucnjY_[]]Uhse`YdrrgrakdWZ_ix¾®z¸nbtiu|rz{~wxrwozvejoausjb^}wxep}hkkZVox¤
pqwtlr
}yusoiyajmamvjgkkywzw[g}|xer}ntfupgk{tlub[nzjsz{et|mpgt}v|~pzjyzxvoelal}lnVjaxVKklOROiNY}hbOUvlMQTU^fvg]aqhgaWi\\kiJEkZbeWXUyZNWnjY]le]Zec^tfleqfsptxp
vx|
}usnsy{{sr
y}v}{~{w|wvzjv~}lrq
~oflgX][\[Tepe_XcruivpdebW[[hporsefzjuwtt
x
zwtunkzpahkgtnf^_|oz}hmwfjdVWsp§}|vs{q{xlyzu|}uqsmhu]mi`mudgfizo{rYgvuhpxvbw
|okm{qfse`kxfquz}auuikqtyoxwr{e}}~wunbe`l|mkVjcrTLjkPLOpH^|faNVueJOSXakw~f]gsie_WcWbq]KKkXdbUTUsVMYveZ_l`\[ce_wgmbpitoq~utwxz}v~
nrt|{tq
zut}
}~z~v{£¥y
lu||u{o
sz
}unjieV][[ZScne[Xbt{jimh`aW^Ziilogmbi{zktuuoz~vunzhjyj_enhwheXavi}yniofg]UXoi¨wz|xtn}mqtx~wt
vjsvhio\me^ns_gbjxh{m[mrtjo~ywaw
xsrpzrcqh[mvdorzwarogixsqkwvsubz}vuocbbm||kkUibgTLnhPHRlEayfbMTr^JMUYelx{f_mpjc]V`UonWJShXg^XMUlTK]z_\_l]][be`zhlaoovnowuz}wyzyz}qtt~zvt
~}ls{
}~{u¬zlrzvuno}tjonedX_ZZZUbjg\Z_ui^ml\aW[\kequ}ij^mxwhuxsn|~~zvslzgiwg]dsgzwccTdofvvfhjaWVYhc¨owzpo{fwmyzvq}ndwtehi]lb^pp[g_muezh]tnrkq{~uubu{xru~taplXpraopztcqk`lznihywspdtxxtpd`cmr}jlTi^_ULucQGWbGcwfaLTpYKLXXhlvzedmqfcZX]XvfTJ\cXiXXHWeQIcx[]_m[^\bc^ij`ntxmonvyr}~uvx}tuuyzz}~
jt{}~
y{~|sq®{{~fqzt~}vrol|~mzcppbe]eVZYWcfk`]]shYqn[^XZ\l{bqwvlc\ntuhuwqn
yzwootehte[gufvvz_]Seejs|aci\TW^bd¥iyt
xlmyfwl{ytrx|yiewm`ga_k`^ukYf]oobze[w|knnpxytueszvor}raxcZno`opzseqd^muhcfxzrkmsr{qqa^emn}diThYZUNy_RJZYHcudaJTmUJLZWilr{dllsbaYZ[av\TKc]YjSVGYaNHjvX_an[[_bc]
ihbnwymojvxm~vuttqvvw}}~~px}yxy~ssp¢z{yeuzsywltply|ps^poagblT[ZWidmf\\qeSrn[YXW`lvdjujj_[ntrmttuk}}wonldipc[krdtvs\WTd`q~q\bc^SZa\derq
skjxlnnyyzqvs{z{dfvh^c[ah\^whWb^phawa[|vjjroxtstiq
vsjp|mfwW[ilapqxseo~Z`ppa^io|kjr}qovio`[dkl{afTgUXSQw\RPYRHdsb`GVkQIPZUklk|emora[ZXYlpWSPfWWiSTFZ\OIsuX`cncXaab]jcemzylnivyzk}
|y}mqovz}t}tx
utpvo¢s{{fwon|pgxq{lsvsk^tobgekS^\Vhbll[\qdNom\VWUgithctee^Zpvoqvvzl}}wscdkoa\nmcsxkZTVbcw||p\c_cTZ`Zccnp
rifyndruqzkytuo{v_gsd\_WbdYaueU_`mdaq]]~ohisqtpuvlm
|
qrgn|oqoRZeidprusbluUbqj[^nd{dkt|qqqil_Xdijx^fUdUWQVoXQWTPHer_aFXkOIXTVnid|ikxkaW\U[tdSRVhQYgTSHZ[PNyw[_emjZb`_^nagkyvnnivv~m~{krgt{u~s}
{ss}un¤swxnz`e}qgztylmqwgd|mcgghS`_Ug`lo\^nhMil`UVSofskfxee]Zrvns{ysn{w{zkaelm^`njepy~gZVX_lx{zo_b^gVY`Xdbkp|wkjvl[upjyiurno|sXko`Y^VcdXeqcT_biablZ`~kflsuomxvlh{mqfp{lqlaX_ggnrsr^ilSepdUbmaxaotztinkj^W`fhu\dVbVTOYgSO]OPHep]cGZjNJ`KXme_xhn~d`U^T]u[TR`gN^bUSJ\ZQZvv]_fmhXca[^pchjwrsmhvtysz~|yntlss
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBKzlnmnnojfggggfo
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR455553?wegggghc_____^j|}zzz|}{|~}}}~}}~~~~
|y{z||{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}}}}~~~~~~~
~wxz|zz|||{}}~~~~~~~}xyzyz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~
rtx|||{||}}~~~~~~}~~~~uxrvy|}|z}|}}~~~~~~~~p{ussvx}~|y}|}}~~~}~~snrx
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~vmzsx{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
smmytu
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\YXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwta^d_bjpfhklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghha_ml]fggebcbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^ZZkwlbosjbZY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROM[jrk_ltsgQQSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMN\cnkZisupSMOPPPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKECEIVbfkqpnmlZMLNMNOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHECGHIN[ghgqnnifd`__XLJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<=HY\[^flnkommlkiijbQGEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;=JZhnnpjnmkjlldOGEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;:=E`nsnnlllfQB?CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtstrqtxxy}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99<H\tuqeP>:;=@A@=;;><=<@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyz{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;==><:Aj|i=9;>=>?@@@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@<\n@>DE?@AA[c<==;:=>AA@>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{||~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mwH8;:=>A:Id=<=<8:;??=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR<==ILFFuwM788:;>>VjA;<<::;>??==9:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CryI;\z|wW<=?==>EhtL:=>?==?AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAGrykb}^>@C@@=Js{Y:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{|{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Ent}~}vMACE@?>Y{]?CEIJIIMMKECFGGEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z{{~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEDCWu~XGHJMLNOOLHGHGHIIHHGGHHECEEEFFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqruvy{{{z|}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLMLMNLIFGGGDGGGGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl|PKLKHHFFDDCC@@CCCCFFEB@>>@AA@BD?>?DFHDEGIJIJHHHGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLKJT
uKJFB??@???<<<>;:<AA@><998<<=;>;8;?AB@ACCB@AADDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJIIe
hCA=88::9878896479;<:8567789787588;;;=@;999=<>;<=ACEHJMLLGIGORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIh~`C7555766655873568:876565676767:67889:7578979776:<@GFIGIFEFOSRSSROPPRTepqsttvy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@6788=:=ECBe
fI59@58874578557699776765:9:::;798987669:98868589;A=>>BA?AKLOQPQOOORWkqrttuvz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=q
ePZC:<=>99:;8:;9:;::9;:9===>;;<<:>;9;;<;<;9:<8::::999<?<<ABDHIMKIKLWorsusvx{{||{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
}jS=BDEEBA@B?@CA@>=>>@???@>?==?B>@A?@?=@@@>?A<><;:;:9;?=;<==AACABCAXpqtttvz{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
tECGJLJJGGHEFHGEBA@CEDCABBB?@DHECECEDAFEFDEFD@B><@>=?@>?>?>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFW
ZJPNNLOJJKIIJJIECDFGFDCEFDBHIKGHGFHGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGIY
lmUNMOLJLJIJHJFDGIHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@87<;;=:>@>?@CFIIP_
}`XPONMLMJHHEIIEKIGJJIJGGGKLNLLHHIJMQNPNMOKIGIJHIDIHHFFGGIGCBACTnpuwwyzxyz{||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADHJLUq
_TTROONKJGFBGJGLKFKOLKJJLMLOPNHIKLOQQPQOOJHJJLJKFGHGFFHFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
}ZXTTVTOMKJDEGLONOWUQPOQSRMSTOMSLPSUVRSQPLJMMMKNGGJFFHJDDEEBECcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B@BBGVNFNPPTX{
iYXkbFTQQPJ;;RSR`u]UVTVYYRXXRZfPUWZ]RTWQOMRQPPQKKKHHJHEFIIIHIirvyxyyz{{|z{|}|}~}}}}}}~~~SHJIHGFFE??AAEACGEDELXRMTUVXZ|
~am\eV:YYXSQ?@VUX\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXTTVTOOMJLJIILMKOMSotvxyxwzyz{zz|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~zopY[\[RTRVVU[ZuYU}a\X]^WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~gYY\YTVTWRQWVcQerXZW_hP`f[[X\gaGOZhg][\]]WROSPPRVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
~|]QVXURUSQQLOMKfy[]TYUV]ZLTZUST^ZXWWWzkX[\\^TQQPINOWVX[Zdprvvttvxyy{{||}~~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQURSRRUcdv
~ymqWJLNOKNKIJDEIEC>TdURQQNKQTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquuusswzz{{|}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^\YUPLILIaltPQSNQRQR[RSRQRUTbs{|}{{
u_]LD?CCCCB@DPBCAC=CIGV@HNLG]iPHFNFDEFIGHBDHGIKGDBAD@OQMRdrtvustuz|{{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTSOV`klrv{{xytrnstsyx}kMG?@;;>????>kPJ`EFHIEB?GLNGMRUIBE??<=<==?=?ACC@?==B>JNGUnttustvxz|{|||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNKLQRQTUUWQQWUPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeC@@B=:BCAADB\]O{NONNKLMOOQLKMWMHG@B<977599=;;;898:?<BH?\stuuuvwy|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP_]ZIHPRQOMPQNQRTVXSRYTOYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHFFHBAGIEEFDMRPaWRWQPSSRU[OOQVPMIDF>:96587979:365795<C>essvwwyy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`VW^ZXMKTTSPQUOLRSTXXTTYRMWYZVXXVXY]WWXhsk]Vaskaa_^da_^YTQNONLIHJLIIFCQPS[WTTNQSYS\eUOSSQNKIHC?A999897885757859:Gnqtwxy{{|~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOTVXXYSUTLKTVUUUWPSUWTUR]n^RNY_[VY;DVXT[fJLPSSOMMNNNLJFQPUYSTOJNOUST\VRUSROMLIHHF?>=:787659967675Wppswyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\]RTZVWUTWTRXXYYYSUOJGOPOOMRJPPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPRMILJORPRRSTQROLMKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHKHFLMPMG/E_R>3?>joaSRQ@GUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptuy{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]gSQSAGUPOQQPNMNMKLKKNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Sprtx{z{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTXWULLKI<987;>@><=A@B=>EHGCEFIGJJ@FAA@FHEJOHQRa\QPROSOOPLLOMLMLMON[WKMQOGIHCHJLLJFFFE?BC><BG?B?Adpswzzz{|{zzw{wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCD=9779?B>;?B@@>@DIECGGIGIEBB?>=CBAGIDMObeQMONWKLMKLMMMLLONSdNJLRIIIEAHJLMNJGIGBAB@?EFEHDKnovyyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGMMJMPMPOHJD?A=98::?B?<@BAADEGKFCHIGGHCC?B??@A>DECKNRTLJIMTGIIJLJKLIJMMOPRPKGCLGCBJJLMONIJIGCCCDIJMLIYrmwyxz{zy|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqHKDGHHGJKIJKDFB=>=99:;@B?=BBCCGFIKJDIIFGGCC;A@B>@@BECIMPHHKGHKDHILMHJLHIJLKM]RHHDNFACJJMLPMKMJKFGGJMNQNLbmivvwzy{z}rmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKDFEGEFFGEGBC@><=9:::@C@>BCDEIEIJLFIIGFFDB;ACC>@CDCDGLNHKNHDHEILNMGILGFGIILNKIGENHBFMKMLOMMNMKHHIORQRNRfffqosxu{z|lhjnekqlspfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGIDFFECCBE@DB>?>:;;=:=>CA>ACEFJFIHLHGGGFEC@=DEB>ACCCDGHIGMPJFFGKNOKFHIFEDEIJHJIFHOKCIMKOMONOPNJJILRUUROWd`amgproryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHEEGCBABD=BA>A=::=?:=>@B>@BDFJEIFIHFFGECBAAFFCBBBDEDGGIFLQLIOJJLLIGHEGFDCIIHKJGKRMBNNMPNOOMNOKKKOUWVUSX_^\iaminhrsbeffdhhfnjfmmhkkmriqvtsqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGHFHBBADE<A@@C<8:=>9?<?B@@@DFHEHFFHGFFDCECDIECGEBEGEFGGEJMKHQMJKHHIEFHHECIIIKMKOSNDQRPPQNOMNPMLMSWVXXUX]Z]d`hbjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqinyMHGHHBBBFE<?BBD<7:>=:>:@B>??CEFDFDEHEDECDEFGJEEJGCGHFHGECFJJGNKLKHJLFIIKHEKKLMNORTOHSUSPROQMNQNMPWZVZYVZ]YXa```^hec`dfhgjhhifhnllnmqpiuuxrrpupppruvpusuwu{~}xvtwvvvxplupmstnprrxNHHGIDBCHE<@EBE=89>>=<<AB=?>ABFCECCIDCEEFGGGIFGKHDIHGIGFDHKIGKHMKJKLHLKMKJNKONORUVOKUWSPSQRLOQPOTYZY\ZY[^^]`c^\ackb`dggr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptLIKIKFBEGE<@GCD@:<?@?>?BA<@>AAFCEEDIEFEGFHHFHHIKJFJHHKHFFLIHGJGLLMLLIMKMMMOLPPQUVWOKVVUSSQQLORRPV[[]^[\^__a`ad]c`ef`ehjdssfjggkorqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGCEDE<@FDDC;??B@@@CA?B?ACHCFEFIFIFGDIIGIHJLHHJJILJFJKHIKJGKKMMJJMLNNNPKOQRTXVMNTVTRRQPLNTSRW[]^_]]`_`aa`acebdhbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvnwKLLLMGDCAD<?EEEC=AACBBCDACDAAEGCHGHHGJGCHIGHJFILHIJMKMLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSPW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBCEGCCIFCIJJIIKGDKJGHJIIKHJJNLNKILHJLKZfJd\KlSHON_nUks[qpbwcSPavuhucav`Xnqbdvinzf[lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDBEEDFBFFGDEKFEJMLKLLGGMIGJKHKKIKKNLNLLLILML[sbdp^lmUMNfs]ffqlntgpi_aYnnbppbkjjfoqtetno\ougpMJqyvka`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIHGED?AB@>CFGBFCFEFEDCHHGDEKHGLNNKMMFJNHJKJILKJJKLMNNMMJMMN[roonpplkMPQlWMibtrpamnu\YlQ\mmZqmkomxxtsip]_rkqjUuyxoc^kfbgppjjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGGEEEBBB>@@FGBGDIEEEBFIHHEHLJGMMNKMNGLMILKIJMIKIJKOPONMLNNL\hdu]lqWlNPQmTYk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadiuyknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHLFIDEECAB=BACGDHGLHECCHKIHFJLLFNLLSRLGLLHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYrkgooqqomt]nXat_nopoqronusttj[^tcwxrjnzhaacfbbimtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEEEAA>DDBGDHIMIFCFJLJGFKNLEOJKWRKGKJJNIHJLIKJHHKMMMMIKKKSkc[i^_icrrZ_Yjn_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrvtwrGGFIDECFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJKKIHIGKKKLGHKKLMMLJKMNT[\TPTLPONOOVQOOQNOQJINPQdqiTYW\[\VY[]X]\\cfaaebcf__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFEAEC@DHDFGCIKLHFDGKLIEGIPKLOKLWLIEEHIJHIKIMJHFGGIGHIEFLIJLOLIP\W^P\[`^MXYS\\b^MXZMXaRJYaZR_d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBDCBEIEGGFKJKHEEIJKFEHHPKMMJMRIGEAHFJIKLJLJHFDIFDFGEFJHCJMKLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_c[`^[TXWY^]cbcacehekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCGHFHGHKJJIDFKKKEFIJNKNKHLNGHE>GGLIKLKKKIGDHDCDEAFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQXUU\Y]c`__cdbhomnllllu
yu|
}wrrtxyyyy~}yuyvvrnzwvxXQKFCGEBEGIFGHHFFIGHGHKILDDKKNMLKHKJHIF?GGNKKKMKKKIFGCD@DAHIB?IJHO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTQ[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKJFFFHGGIGFFILJNFDKKMNJLIKJHHFBHHQMKKOLJKIGGED?ECIIBBGFET]Y^X_Y_[]UXXO]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAHFDGMRHCQJEGHHEFKJMPEFIJKNLLIKLIHGDHKQOMMPLLJKHICDAEDIGCBGFDWUE\T]SV_XOTUNZZMIJT`a[_X^^a]OYa\``_bcb]abW__TPOOOWQ\[[\\^_bffeleoow|{{}
zo
~INFDFFHDIRbPCV^IGGHDFMKPPEIIJKNLKKLKIJGEJNQQNOOMNLMHKADACDGECBEGBMHBKKOONLFMFGIJHGLKMOPILOPOSOLPSRUZYWYXXdWOSTPPNMOTSZXXZ]\`adecgcklpsryy{z
~{}{
}KIEEHFGDKM]LGGXLGHJHGMLQQHLKKKNMUNOJJKGGKOSSNPONNNNGKF`ED_LEfdEN[I^[rmOMUmYLDP`UkWgJ]WU^DLQULLSVQRTXWTXUT\UPfZhhdXRjRVUT[\[``abab`fhfnkhrz|}~}|zr{z{
~z{LIFGFHEEKOSIJF`THIOJIOMRQKMLLORUROOILMGHLP[YOPPNOOOIJQQI|YYqtYQmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[_VVXjtuu^_v^Wa[[f[_`aaa]`agmpl`pwtx}vxzlv~tx}|~|z~wwNJEHMNBDLLFIKEQVLKNIKRXWQMOOMQTNOQOKKNGMOR[ZSQROPPPJHZx]TxehZSURvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essorr{|o~xnr_``baZ`_gknkblfgmw~~{xwtvzir~ns|~wx{~x|u|||ssNKF`]GAEMMHJJGJPOMMJNV^YULQSNXZMSSRNKOHQRTYWVPTPPPQKHgxlcxrm[KNVypumubovPeeIfvqmwojfxxiWrQhzmijzz}lxzohoYvvjuup_rf}ilx|o^__ba[]bdgiidgbcdllppstsssyqrxblugqy{srvy~suzn|}yxrnNJSuNCBFPPHJKIKPOOOMPZ`ZWKTWPa^RVQYRLOISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^]_ddighee^abiiijknokqomjpacfcowxompsy~nqpk{ztsomLL[VHGEGRPILMJKPQPPPPW\XUMUYUeXRRY^SMMITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_Zpz{^`zscroxqhd}ir|^TLl`vukiu{zm~xk|p\^^b[^bddgeeebZccikkrsrvglihdg`akagsrlgmmr|kmhk{tmmkmOHKKHJHHQPLNOLKRRROSRWRVTPWZVVTTTa_PNMJTSTQVVNNLMOPJHQNPULKLSTSSTPVUQQNQQXYRNPUTXXX[[URSW[WXXZOSUWXXR^YW^VTPYRWWWWX^Zgr^[[Y\]_cZ_ccdfdccbZcbgfemnmueegcaf_]g`dlhfgkhpzhggjujhgilQIKLLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYWOOLMVTQNUSNOMLQPKJQQKQMKKPRUSQRSSIHLNOQRQQQTVRXW\WSRPRTUVSZQNSRWVTYVTZVTRUTTTWXV\Y^`]\ZZ\\_c[]bcdfdddaY`acabhhimbad^_c]Zd\bma^fefmsdigjkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSPPJNWSPNUPNQNLSPMOUSNQNMNQUQUQRTUNKMOQTTRRQVWUYZ[YSURTWVVY[TPTUXUUZUWZVSRWVUW[XZ_\UX^\^][]`a^[bbcgfedbX_ab]`gdfea^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaOLMLQQLOTOOSQOQ[YWWX[YXYV\jdVXYZWVSSOJNVTPOTPPPMMRRPRXTQQOMOSVOXRTUUONMQSVUTTRTWVZ]\ZVVQQVXV[[WQTWVVVYTXXUSRYWUZ^Y]_^U^\^`\[____ZbbdhgddbXa`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQOU\ZZW[[\XZ[dqmhd_[XVUWQLMVSMNROQROLQSRUZUSPPMQXWRWSSSXMOOQTXVUUSUXX[^][[VQNUVU[\WRTWVWXVTX[TSRZXW\^Z^_`Ua\aa]`b_\`]c`cghdf`Yc`a__ed_`b[Z\[\YZYXW\Z\[`^_[^^a`^b\Y`ZQNONVQPTQOTTSPW\\\X^\^V\^jqwyc\[UUWQMOVSNQQORTRLRTTYZWUOROSXWTSURRZOPSRV[VWWTVZX\][[]VSMTUU\\VRTVVXYSUZ\USS]XZ]^\```Va[cb]ad^\bab_cfidf^[d`a``ce_b^YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUTRQWRTP[^^][`\`U\]hjr}slg\TWWQNRZSRQTRTUTKRWV[ZZSOSQVVVTOWRSZRTTTX]WXYSX\X^]YZ]TUNUVW^[XRUUYYYUWZ\VTW^Z]]`]bb]Y_[ea_dd^^cca^efidf^]da`aabd`b^XZ_[\[XXXWW[Y[`\[[\[XZ[^V^Y]POORZPZTUVVSTT^^`^^b\`U]^bkytl}kZUYTPPS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[YUZ^X_^Y\YQWRYXY_[ZTUVZYZWXZ\VU[^\^`a^dc\^]]eaafd^^dc`\gdhedb_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SNPVYQ]UVYWWUX__aa`c]_T]_beeuzhWYYSUSV\XWWVVW]XOU]Z^]\TRWSWWUSTXRSVTXWX]^X][V]_X__X\VQXTYZZaY\VWX[Z[YYZ[XW^_`_cbadd\b\`fadfd^_dbb[fchecf`f__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNSYVS\TVWYVV\`abc`c^_V[`da_zuohY[YUWTW[ZZ\YXY`WPV^\``\TTXPUWVTVWRSUWZZ[_^Z_\V__Z]^Y]URYWYY]bZ^VW[\[\[[Z\YZ__``dbcddbdYafcffe^ab`c^bcidcg_g^abcaa`^_XT[ZZ[[X[XX\[Z[WWYXW\[\`]V]]SOVYVVZUXUXWX]_badad`^YYadb`lfh^[\ZVWXY\\]_[Y[bVTX^]ac\RVYPWWWWWVSUTX\\^``]`\Wa^[^[Z^XUXW[[_`\_XY\\]^_\[]X[`a^`ecdeefbXcedhgd^c``ec\eidei_f]cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWYX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cYZX]`cd_RXYPWWXYYWVWV]]^`a`_b^Ya]]^Y\^YXUW[\`^]_ZZ^]^^a]\[Z\`b_becefefbZdffigb_c^afdZihbfice^bbca``_]\ZX\YYXXZXWZ[ZYWXUU[]]]``bbxKXW[YV\[\]ZW\]_`bdaba]`Xbcbacab][\[XW[\_]`_][`d]\X[becaR\ZOYXZ[[ZWZY`]`bb`ac_\b]_][^]YYTX]]_`_`\[^^`bc]\X\^`bbcedfdefd\efgifcab\cg`\ihbhied`baca_`_\]\Y\YXWXYXW\ZZWWXOXZ]acffrkJYW\ZZ_\[^\X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\^^^YXU[_^]aa`^[`abfc_]T]``cddfegeffe^efhhgdd`Zfg^ahhbhhfc`b`cb___\][Z[YXXXVZV\[ZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyz{{{{{{{{{{{{{{{{{{{{zzzzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{|||||||z{{{{z{{{zzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ¼E>????;þ¿¾¾½ÊÔÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊ:23333.¡ÒÌÌÌÌËÙåååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyzzzxopppppprrrrrrrwzyyzzz~|||||||vuuuuuu~
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwtvwz{x{xwvwzxzzy~zyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{|||||||zyyyyyzzzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwx}y}}|}{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww|z}}|}}xxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww|z}{|}|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx|z}|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyxzyzzx{xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqqqrstttttttsstsssttttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttssrqqqponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssrqqpponnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrrssrrqqppppoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqtqrrqqnnppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqqqppqqptnpppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqq|¢prp|nppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqu£xpx }oqqqqpppppqqqpqpppqpppppppppppppppqqqpqqpppqppqqqqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrq©o£~pqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrsssssssrª¥|¡|rsssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~}|vvwwvuxzxxxxxwxxy¡³©§©ª}{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{|{{¯¢¡µ©«¤{zzxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}}¤¡±¦}}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~°¡ ¢~~~~~~
~~}~~~}}}~~~~~~° |~~~~~~~
|||{|}||~~~~~~~~~~¡¬¥¢¢¡~~|}||}}~¢²¦ ¡¦§¬©¡
}||~~
¯¤ ¤¢
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{
~~}~
¡
}~
}}}
~}~~
~}~
~
~~
~{{
~}}}}~~|{{
~}}~~~~~~}~}}
}|}~~~}|}~|z
}}}~~}|}}{zz~
~~~~~}~}~~}}}}~}|z{{
~~}~~}}~~
|}}~}}~}~}~}}~~}}}|{{{zzz{~~~}~~~}~~}|~~~~~~~
~|~~}~~~}~~~}}}|{{|zzzzy~~~~|~~~~}|~~~~~~~~~~~}}}}
~~}}~~~~}}}}}|||{zzzyy~~~~~~~~~}~~}{|~~
~}}}~~}}}}}}}}}|zzyyyz
~~||~}~~~
}}}}}}~~}}}}}}|}}|{yyyyx}
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxxyyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yyy|~~~
~}|||}}||}}}}}}}}}}||{z|yzz{|~~}{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zyz{|yy}}|{{~~}}|~||}
~{z|
~~}}}||||||||||||||}|||~~{z{zxz{{|}|~~~~~}}}|}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||}|yz{{xxy{{z|}~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||}}|{}|||{|||zzy{|z}
~~~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}
}~}~~~}||~}}}}|{}|~~~~~}|~}~~~
}|||}~{{}w~vx~}|}|}~~z~~|~~~~~~~~~~~}~~}|~}~}}}{|||{{z}~~|||}||~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|}~}}}{{}}|z||}}}}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}{~~~~~~~}||}}|}}}}{|~~~~~~||}||}|}~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}|}|}}}}}}|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||~}|}|}}}~}}~~|{{{||}|{z{{yzyyy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~~|}}|}}~~}~|}}{|}~||{|}zzyyyyz{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}|
}~}~~~}}||~~~}}}}|}||{|}{{{zzz{{|}}}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~}~~}~~~}~~~~|}}|~~~~}|}}{}~}||{|}{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{}~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}~~~~}}}~}~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~~~~~}~~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{sy{|pwuvwyutz
}}}~}~~}~|}}~~|z|z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
|}}~}~~}|~~~~}}z{{||}}|}}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~~}}}~~~~}||~~~~{{|||}~}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z}y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
}~}~}~|~}~~}~}~~~~~~||||zyvyyzyvyv~|{{{~}{}~}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}~||~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~~}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~||~}~~}}|~~~~}|~~|}~}~~~
~}|{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~~}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxzxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z||{zxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz||||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}z}{zvzxy{{|}}{|}}}}~|~~~}yy{zzzysrtowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxqytvxtv{~
~||}|x|yzyz|}|{||}}}||{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||}z||}}|z{~~~}}||}|vrvxxvtvu}
}
{||}zz|}}||z|~}|}}~~~~~|}~~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}~}~}}~~|}
~
~}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}~~~}{}~~}|||}}}}|}}~}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r~}}~~|}}}||||}|||~}~}}}
}p{pyv~nypus|vyyrpvxqvtturstvinrotvnulwmzsnym}rsvsvmnwlpylu}~|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoolw}xpqzprtfu~n{ysoy}~{~|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}{}{|}|~}~~}~}~|}~~
}w
~~{|{~{||}}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~~||~}~}~~}}|}~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}~|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}}|||~}|}}|}{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~||}}|}}|~{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{||
z{
}~~||}}~}{~}|}yzzy{|}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}}|}~}~{~}|{yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~|}~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}}}}}}||}}|
~|~~
}~~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z||||~~}|}||}~
~~}|}~~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}}}}
~}~~~~}}~~~~~~
~~||~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌÌÌËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;>BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHKA=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÔÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMOH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ØÙØØØØØØØØÙÙÙÙÛÜÜÜÜÜÜÜÝÜÛÛÛÜÚÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;@<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸·©§§§§§§§§§§§§©ÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃrliNSbLLVM<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKPFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§££££££££££££ g@DDDDDDCCCDC?\ÓÓÒÒÒÒÒÒÒÒÒÒÒÑàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËwliJN_MRUM><<7;?C>6:7>?;=B@8<:=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥¢jFIIIIIIIHHHHC`ÒÓÒÒÒÒÒÒÒÒÒÒÒÑßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<<>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©§sQTTTTTTTTTTUQjÒÓÒÒÒÒÒÒÒÒÒÒÒÒßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÎÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÐÐÐÐÐÏÏÏÏÏÏÏÏÏÍÊÊÊÊÊÊÊËËÊËÌÌÌÓÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÑÔÏÏÎÑÒÎÏÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÕÕÕÕÕÖ××××××××××רØ×ÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÓ»ÏÏÓ¸ÏÑÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒµ³Õ²¹º¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÑ ª®Ô£¨²Ñ}~¯°ÑÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<96?B?B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÑűÕõÕÓÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÖ§±ÔÖ£´ÔÓÀ ÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<==964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÔ¤±ÔÕ¢´ÔÕ°¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÔ¤²ÕÕ¢µÔÔ£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CGDAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÐÕ¤³ÕÕ¢¶ÔÍÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHFE@<<>><==<7569969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÐÕ¤³ÕÖ£¶×à ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÇÒÖ£±Ö×¢´Ú²¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÑÕµÃÓÕ±ÆÖ¹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<<?GEGKI=667:979:;:<=9>99:8;=>>A>=9<<:=>>;=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÑÃÔÒÒÐÃÕÑÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??>>AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÔÒÒÒÒÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:69896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<AA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCDEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<;979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:9;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
¼ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿½¾¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ººººººººº¹ºººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨¨©ª§¥¤£¢¢¢£¢ ¢¢¡¡¡ ¡¡¢£¤££¥¥¦¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¦¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99>7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89>6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦§§§§¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¦¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥§§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:766846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=AC@DA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¤¦§¦¥¥¦¦¥¥£ ¡¡ ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡¡¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?B@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢£¢£¤¤¦¦¥¤¤£¢¡¡ª¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢¢£¤¤¤¤¢¡¡ª¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡ ¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¢°§¡¢¢¢ ®yz¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡ ¤¥§ ¦K ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ £¢yª¤ ¨ZI ¡¡ ¢¤¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¨mo«¢¬KO¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¤T¨ªdTQ ¡¡¡ ¡¢¡ }xjabb\Q<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq bb¢f]Q¡£¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢ec}¤g\Q¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\LF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡¤hgfyfZT¢ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡neblocVW¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ysr^x¡aYSZ¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;6397:9>8::<=998;9;<:>=;@@;<B<@:847<;B@AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ y¨¡ª|bR`
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v }b©nkp
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{¨xiRpVmy{~
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~~ zOCIvIWosw{¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
S44;y
urC8Nko ¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~¡nFdU?zzgdL<9Mnu¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢¤Qt°H{xmRiYWq ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©©¬_¿Ø¬F£]k{^^¢¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¦©§¨¦oz½ÀªÌ¨³HVpRx©§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤¨§¤¥£¢¢r®Éβ°²nS¾ Tl£¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^edlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢ £§¡¦®¦¦ }
{н¨rR¬gc£ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª©¢ ¢¨ª®±²®«¤©{j½Ã«®vdpxzv£¤§£¡ ¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\U\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¡ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯·¶´³¶²°²§u^N{spsqx|~
¡¤£¢¤¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²¶»¾¿À¿Å¿µ«pfXGwsuzqnihbbiiovwx}£¨¬¦¤¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvkqhiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µºÈÒÙÜÕǺx\[OE^kejphdbgYW]Y^fnnmmln¨ÈÆ»¢§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSai`ftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃÄÅÙâßϽ°¨xbUWME^lacjeabi]U\WYZ^ca\c©ÅÀ½¸©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ¼ÇÇÎÐÄ«{o\STVK@^lefneb^faUXZXVWWb¥¶»¹«´²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklgnurruqg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÄÂÆÉÉÀ¤ZLHJNH>Z`blqha_e\XUSTQV¶Ã¯¬ªªª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxoyjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÇÆÄÄø³Áº wLJQI=MTbjinc__Z\USZ·´«®¥¤£§¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{wnkihvZfrxszgg^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÄÂŽ»¾eVKBJ=^VXkg[ZYXVp°±«¸µ³¬©£¡©¬§ ¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyvuefijh^jonyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÈ¿ÆÆ¶ lKYARr{ZRPSk¾Àº½»¼º¼¬¦©»º¹·À³µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvijjtnyl^d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÍÅÅÅÄÉÀªxoSOqÂÒÇÄÁÄÇÁ¼¾´±°°Â¾¾ÁÆÀ¿¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r}xpg`kjwlifuotc]cUWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÁÁÀÂμsj
ZËËÍÏŶ¿¿ÀÀº»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyspfefckdbkmoo_Y]WVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ½¼ÂÁÒËÄÈÑÁ¯½½¸¹»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfaebaccdjcgc[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÀ»¿À¼»Ä½ºÀÄ¿½½¶¾È¤fÍÄ¿ÀÉ¿°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabchjggjej^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÕº¿»ÃµºÇ·¶¹»¼¸¹µºÄɦBÉ¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeefpjelhXYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÄx©Ì½Ç·¹¸¶´·¹³µ²ºÅÊFÊ¿¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knqgqktfbn`\THKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄ×®t»ÈÏÂÀ¸®µµ»½·¹±¾ÃÇL{Íÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljnuoxchb\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÇÉÒqt®ÑÑÌÊĵº¿ÄȾ¾´¾ÀÀ{YsËÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltlln_c_abNHN?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÊÁrt¦ÌÌËÍÊÆÂÃËÎÁ¼¸¼º±rif»ÈÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qc[_`_TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»«Úþ¶¾À¾¾º¦©²¶ÃÀ¥yvyÄÆËÈÁÃÀÀÉÊÁ¿»¹±¡xq®ÈÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³µ¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp^\_]ZRFEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Ä·mν¶¹À½«}nhnmrsx}½¿ÆÀ¹À¼¾ÅĽ½¸±¯ÊÂü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±±·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmu{qoj\``ZSPAFIGK@ECI<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀͲv³½¶µÂ¥iZ^`MR[[ntw¡¸¸Âº³»·»½¿º»»®£¿Äþ¼¿»»¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvwoqa_f][UJ=??GG=GCC9:5;99><<9:<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɧ
x ¯µjfgVY`IIMPTlw¦°·¾¹²µ²¼¹¼¶¹¾µ «¨t®ÉÄÀ½¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Åª|v¡`TCXUGajVOEJa¡¬¯¶ºµ´²¬¼¹¸µ¸Á½³¦ªt¦Ë¿¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨ª¨°¶³²ºµ»»»µ¸¶°¶Ä²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovsnc^gY]]SONA?JCAJJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿´yoOJ?dYBNwjNA\°µ³µ²´¯¬»º¸¶¹¿Æv¬ e©¿¸µ²±¤¦§¤¥©®¹¬««¥¨¤«®¯§°«¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrwsmujl]\kU^\PNHDGMBGNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶|XFAOYJJXwcAS£¹³´²°±°¹¸¶»·»¼¢±«¤s¬°©««£¨¡ ¨®¤£¤ ¢¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wryhutneUadW]ROMI@ISENC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼©hM?RxqPIIKgZES¯»±¬³¯®¬¶¶²´µ®©¦¦¨ ¨©¡§¤¨ ¢¢¡¥¥££ ¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦¡x|vzcwmn]QiUPOGPMMCPR@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Âª¥½hDRQWIJ`JUadc®µª²´®ª«¯°²³¥ ¢ £¤¨£ª £¥¨ ¡¢£¨¨§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nl{diVRdNJHGOSNKNH<E@<2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© ªÆ¿Ê PAsvOmJKcfts`[`q±¯®³µª¦¬¬£¢¢¤¤ ¤ª¡¡¦§«¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¦«ª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wy|eyz`bSUaHIJKSTJSQM9?A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÆÆWSJe¤Ze}or\Qkc[e`^k´°°¸¬¦¡¢£¥¦© ¦¤§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvsilf\SZZMQKOOVMSMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yUiqvupcvvXXc`chZYWg®¬¯§¢ ¡£¢¥¡¤¤¨©¬©¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³¶¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§}xvjxu^m[RaIRUHFUWJCMG=KI8E<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ £op`cXL[RZMLPXRHMMG¬ª©¥ ¦ ¨¥±ª§®£«®¶°µ²±®¶¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«®±¹¸¼¯³°µÂ¼·¾³³µ¢¬¢©©²©«¨§¨ª§ § ¨¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmin\X\CWNJGMHCFN=>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£bW^e`WMQG=?@CC?>BQx©©ª¦¢£
«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÉ¿°¹¹½¹Â¾¸´»ÆÄ½Ã¼·³ª³ª³´¯³®ª¯£¬¨¶±£°¦¡£°±®°¤¥¯£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trklurqhW\QFUHDJPI?EB4FH95<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<<;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`QGE<C>F<>96N~ª³§££¢ ¥«¦xm ¤¢«¬´¼¶Ã½¾³»ÁÃÂÅÀ¿ÂÆÅÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÊÉÃÁÇ¿º´º»µ»·°¶²ªº²®¼¸¿»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxkeZ\FLMEDTMECE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;?>=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}sjaWOE>IZ|obB=\®¬ wrqmp¦®´¹Å»ÍÇ˾ÁÌÍÍÌÈÈÐÌÌÌÇÊÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÁÆÆÆÊÈÏÀÉÑÍÇÆÈÆÂ¼ÄÁ¾¿¿¶¾³¿ÀÃÃÇÄÇį¿¹²¸½Äº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrog^ZZDOMDEPIDCA55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A?<@?>9;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £jf]TIDA?K¥ ²£yqroly¤¶º¹¾ËÁÓÑÓÈÍÎÑÓÑÒÐÐÑÑÍÎÏÐÅÍÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÖÓÔÈÌÆÌÍÉÓÍÎÓÍÆÉÊÊÂÆÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÇÅÌÌÉÉÀÃÀ®¯³¨¢ª£¦©¬¤¥¦
{ruvgcgvjeVXRDNF@IQC>B=:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡bTLJDC?CR¯Ñ½²¯¦ ¤¡}xqkebhrpr{
upnqsp
³Ã¾ÅÑÐ×ÖÕÒÖÍÔÖÖÔÓÑÒÓÔÒÏÒÃÐÓÖØÕÕÒËÊÎÑËÆÍÒÊÒÕÖÙÖØÓÖØÍÒÊÏÑÌÏÑÌÓÐÀÉÈËÄÌÍÌÏÏÅÇȶÀËÀÒÍÌÐÆÊÉÀÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpc`erc]R\JKGAEIJ>;A8>5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢¡ZI@ADAFQv²¯¦ wica____^__]alusppolqquÄÈÇÔÖ××ÖÓÖÐÕÔÙÔÔÎÏÕÔÔÑÑÌÑÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑØÒ×ÙÔÖÌÏÏÉÍÒËÎÑÀÆÄÉÇÏÎÑÑÒÈÌÍÀËÍÆÔÏÌÏÈÄËÇÇÈÌËÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨«¥²¨°³¬
|zqstmbcim_VQ`JJCECRM@<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·ØÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£¬fC8=>DXª¨}qecb__a_^a`_``_`emppnkorvwÌÁÓÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÑÊÏÌÓÖÒÑÕÍÏÕÕÑÅÑÔÊÐÔÕÖÎÓÑØ×××ËÈÎÄÉÏÌÊÌÀÉÁÉÊÎÎÏËÐÎÎÌÏÏÈÌÐÐËÎËÃÊÇÉÍËÌÒÓÎÔÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¾»±
zvopokadnpaX\[JFFDMXE;@=33<<87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6==?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦£§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤±zHFB;W¡k^^^adb``aa```^`_^\bmroostuvy¤¿ÌÕÑÖÓÓØÖÎÎÓËÎÎÅÎÊÒÒÏÇÎÍÍÔËÎÒÍË×ÖÐÌÑÔËËÐÒÓÊÎÑÕÒÕÕÊÀÊÁÆÍÂÉÊÃÍÄÆÉËËÏÊÎÍÐÎÔÌÆÉÐÍÉÇËÅÇÂÆÊÌÍÐÒÇÐÏÎÎÌÐÅÇÁ¸¹½Ãýù³²¾±»ÃĶª¥¡yqrkmh``qhYXhVMGLIPQB;D?;68:8:;57==@;:<=9<=9==:>:<7;=9;@<>;>>A<9=>=B=;776?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨ xlopw{ebbb`]^acb`_``aa__][]grrprspmry¥ÇÓÎÌÐÏÓÔÉÄÈÈÅÆ¿ÃÅÏÎÇÅÇÍÊÑÈËÎÍÆÑÒÐÎÌÔÊÇÊÎÏÇÇÏÒËÐÏźĿÆÊ½ÃÈÊÎÅÃÇÀÇÍÈÄÌÊÌÏÈÄÄÐÉÆÂÆÉÅ¿ÁÇÌËÌÏÂËÌÉÇËÐÅÅÇ»ÇÃÉÉÂÏÁ½¼¿°ÁÉǺ½ª±²§¥¢£xoudk`^fqa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»¤¶~g
¢ª
}~s`[^]^`^`cdc_]]^_``_[Z\`lrqnokloo}¹ÑËÂÂÏËÍĺ¿Ãº»º¹¾ÈÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈÊÍÉÄÁÊÉÁÁËÐÅËÈ¿¹Á¼ÆÇ¾ÀÆÏËÄÀûÉÇɼÉÇÅÊÁ¾ÂËÆÅľƽ½ÁÃÅÌÅÆ¼ÀÉÃÅÇÒÄÁÉ¿ÊÊÆÈÆÑĄ̮̃ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¦£ |wsufj[anmZ\XRDLGBGELDFS@54335@=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²°¶l^y|z
uxurp_[[]``bddded`\\^]^^`[YZ\bornkikposÈ»ÀÌÀÆÁ°¶¹±±³±°Á»»¼º¸ÁÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ·»ÃÉ¿ÁÉ»¶»ºÆÃ¿¼ÂÎÃÆ¾¾µÁ½Ã»½Ç¼Ãº´½ÆÄÂ÷À¶¶¾¿»Ìý¶ºÈ»¿¾ËÃÁÆÃÆÉÇÉÆÐÆÂÌDzÇÉÃÎÍÁÅÿ½²·°²§¨¨¹°¥°ª¬zwxkeh`hodV^YJFJFHKAFBFJA9:658853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÕ×ÍÊÎÅÉÅÇÁºÅ½¬®¦`cux}{ttc\\]^``bcbbdeb]\[\^\^]Z[\^hsqmggnoryÄúÀ¸°°¦©«¥·³µ´³³´»¶½²·°´®²»Â¼Áļ¿º´²º¾À¸È¸´¼¶Á½¸½ÇÁÄ»µ¯²µº¿´Å¸»µ¬¹½¾À½±»¶°·º³Æ¼·¯»¿µ·µÅ¼¿ÃÆÀÄÅÆÇÌÅÀÆÆ»ÇËÀÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJFBDAEF?=:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐËÍÈÉÈÊÉÊÄÐÍÒÏÍÅÇÁÅÁ¿º¸É·«°[gozx~vw|sh]]]]_`_`da^cec_^\[^\]^Z[[]_lpnifjmns{¿¿¸¸´¯ª«¦¡¨¦©ª±ª¬©´¶°³©®§¬³»º¶Ã¹º¹°«´¹»´Â¹¯À±¾¼»¶¼È¹Ã·ª¨°²À¶¸½°±¨±³µ»¼¬®¶¦®¶®»²±ª¹°®»®¼¸¼ÀÀ¾ºÃ¿ÆÃÅÀ¼ÆÂÈ˸ÅÇÅ¿ÇÄÃºÄÆÂ»ÆÉÌ˳¹Â½»³tvwki`bliYWW[ALKMJEAC@GA;::996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÏÇÍÁÂÆ¿ÄÄÃÃÊÂÉÊ¿À¼Áº³µµÃ®ª°[i~{x}
z{wn^]\\]_`__dcbcdb`_^Z[ZZ]ZZZZ\enohfgiknr¹°µ¤£¥¥£¤ª¤¨¢«ª¬«°£¦ªµ¶±½¸¯·¯¨®¸´´¼¸³¼°¸¹¶²¼Á²Á¯¦©£«±³´¨½ª«¨«®µ´¦¨¡¤¯©²¦¨¨®¥¨·¬±³·ºº»²¼¾¾¿Å¿µÂÁÇÈ·¿ÀÅ·ÄÃÀ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji\aodWVXPHZRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÍÃǹ¹ËÂ˾»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ¼©«cmz}~xt~|swe_]\\^_`^_ccab``_^]\ZXY[[YXZ\_fkfdfehkor
©¥«£££ ¡¨££¥¥§¦® ¤¦¬²°··§°¬¨ª´«´º±¶¶®¶º³°»º±·¥ ¤ §±¨¬©ºª¥¦§¨§³ ¨§¤¦¬§¤ ¡±¬²µ³´±µ½¶»ÁÀ²»¾ÃÁ²¹¹Â³À½Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ xqlbf`ko`UY_HNhOTHFKF<=@=:;;826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;ȵ¶½¸ºÀº½µ ¡¦º¶«³³»³ÄÏÉËÂÆ¸·ÇÀÌ¿¸Ê·»Å¸³Å¸³¿À¬µ¼²¬¦¯´¡£ir
|xusomjiipi_`]\\\^__acb````^\[\\XYXXXVX[]_dccfgggkmn¨ ¡¦£¥£§¢«°±µ¤©ªª¬¬¥´¸·°¬³µ¯³¶¯±ª¤¢²¥¦ª¹¢¦¦ ¨« ¥£°©¬¨ª«¬°³¹¯¸¹º°¶¼»º¬³³¹³½´·±±¶µ¿µ½À½Ã»»½{sl_e^ddXTW^IW]KPGJJGA<??A;?<05536:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»¸ÁÁÁ´¤¤¤¦À²¯¶¬µ·ÅÏÈÈÀÆ»»ÃÃϾ¹Ç¸¸¿·²Â´±»»¬¹º±¢©«§m~
xrmomkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ]bddfffhikr§ §¥¦¢¥¡¯®®¯²¡¥£®«¨¢µ°²²¬©°³¨»³§¶¡££¢®£¢ª¶«££¦¦¦£ ¡¬¨£¤¦«³´ªµ°²«³¹´¯ª°²²³·³®©®²·°º¶º½À¸³±yuf_f_[ZVSZUK[QLJEHKIC=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿³¥£¥±Ãµ¶½´¹ÁÌÈÆ¿Å¶ÁÀÇζÀý³¹¹²¿¶±¹»²´¯£ª¡xxoqtqhediec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv ¡¡©£¨«§¯°«£¤¸ª¡ ¯¨·«§§®±¤¸°¤· £«¦¡¹°£¡¤¢ ¡©ª¤¢£ªª±¨´¬ª§³°¥«®³±¯°¯¯§¨¨²®±´°¼´º¸¯£zve_aWYXSRTKM^LPLGHLKE=@>=B<:7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´ºÂ±¾·½®§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bccbcbbcfi ¦¥£¦§¦ «¯¦ ¢£·¨¡¡¢©³¢¥¨¥°¦±®¬µ¡©¡¢±±££¡§§¡¢¤¥¥«¤¥°§¥£«¬¦©®°¯«¨ªª³¦¦«¯´±®¼¶±°¯ {xseb\[]XNLQHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±¶½°»±·¬¥¦¬·»¼Áź²¹µÄÉÉÀÃÆÅǶÆÄ³Á¿Å«··½¶½º»µ²¬¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWUTVVRTRU`a_`a_``bdi~¢ ¥¡¬¥¤¤£¤£««¥¥±ª¡¡¥ª¨¢®¬ª©®¢¢¢¢«©°¢¡£¤ ¢ ¢¤¥£«¥¢£«¤«¥®²ª¦¥¦¦´¦ª¨³µ´¹º°«¬sqp`[WVVRGQOHZ\ORJTKSLEGJD8;;><9667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«²¨§¯¹¹³ÀȺ¶À¯ÅÈ̺ÁÉÌȵɼ±½Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTUVUTUURRNQY]\]]^^__bdm¡ ¨©«¨¬§©¦¤¥¯¤¥¯© ®«³ ¦¦¢¤¡©ª¡¡¡ ££¡£¡¢¨£¢¨« «°¤®¸¦£¤£¬©¨«¯´·²½µ³«¯
uti[XYRURFXLQ[XMUOQLQRINJB=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏdzĺ·»Âȱ¸¿·¼¾»³¶¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNOQYZZZ]\\]_`d{}z «©¦¯¬¨°¥©¡¤¨§¯§ª ¥¡¨«¥ ¡¤¡¢¥¥§©¨ °°¦±½¨ £¬´ª®§°´°¹µÀ±®±«~rtcVTVNRJGVPRRLLXNKMORHNKACFDD>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʲ¶¸¼½Àñ°±·®´´»³´££vkglnqnrjokdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTRNNNRWXZYYX\\]aj|v{q¨ «¦¦¬¨ ¦£
¤£¢¥§¡ ¢¢¦¤§©§¡ ´²¨³¸¡£·¬©¤³²¦µ»µ«¬±£zsn^NQQMODNNNPKFNNJJNNQIMJAHLHHC>958889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤·±¥§¤ª¥ ©¦¤³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬¹½´¸À¯®©°¦®»¯ |n__frpvqjnieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXXZ]annrl
}¡£¢¤¥¢s~{ £
~~tz££ ¡¤¤¢´¯¬°¦¸¦¥°¡±®±¼ª©¯ªxtdVMRPPMCSNLPMBPQHINSMHJJDKMFKK=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-02764789::66:87A7x·¡£´¨¦¥¨£¥¥¦¦¦²§¦´Á¸¯´°Éĸ¹ÀÎÆ¾³¬ºÁ¬Ä¨¢¦¦·£ ~xfWV_gfighociigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNTSSTUUWY[]ihmh{yqMVp
_;Vo|s
y{}xqp}¡ §®©©©³¢¦®¬¬¨´£©£tn`[NSRWLDTJPMLFNOIELQMKOJIMPFIJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦© ¦©§£ª°¨§´Á¹°µ°Ç¸³½Ï¿¹¯®µÂ§ªÄª¢±£~sv]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKIFHNQQMORTVXZ`kjdv~qNA?|y`JQnx~
mxvvxpQ|~xvhw~¤¢¨©¥¤°ª¡¤¤¦ª¢ª¡¦¨vng^\HQQSMIUMRILKOIHFJNLMTKQQOGJD=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833989:99::::?9w¶£§¡®¡§¨¥§¨¯¬ª¶¼¶¸·³Á»¶¨¹È¸¶¨¨µ¶ª²¼§©~xqoXMKMNOLMQW[\ZXZUUVVVWYYXXYYXYYYZXXVVWUSPMJE@@kssIMKEDCINOhYOQSTUZnpszgfZSs~|
{vxsouqtz~«
z{iv{prmxx{{wssxgu
||© ¡ ©¥§¤ ¤sib]]JWPRGKXROJMLRJJJLPHLQLRTMFIB=78;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¢vw|voojYKHHHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^uzvdt{fyvx|q|w{ok~}tz}tfv|lohs|myq}qmvqhq~pD
wwz}{u}£¡¥xongc[XXUQJSUTOPNPVKNKOOJROHNPLFD<;79;::?=9<:99??;8;=7<9999266856633511224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«¨©±¯±«¼¸¬»¾¸³¬§°§¬¥©¤¡
yvq|mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX]eopj¥ªÀ~sxb{wn{xy{omytyjjq}Jnhw~mjdly
krl|nr|imps
{~{wpttyyp|ojoooYVXTRQYORTTRXUMNHMKMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥¯¢ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡szuotkpldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORVZQX[_¦agrxd}olyu
tltt|jjMy
g1vsl~~tfeu
filukp|hqq|n|t~}qqnumwyujyyxlkpheXR[XYY[MPUVYXNIHEJJHGC@GECG=998;9:9<:9;:::@<9:<98>787715234533645031/**+),,++)(+'),,226,,4775478iO8;5m¤¨±§º¯«²°Â±»ÃÇ
zqtzprpoodqg_TFIC><;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQULAIQIb¯²pzvk|lqz
yr txsu5q¨¡¡£
vp||t®hgbjnrmpuipXupvm{}mrnp{svnbu
ux~}{sqqm`[]^\ZYa_RN[ZXWLHJFIG?CABG?CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®°®Á²»ÁÅ|nul{uxxmwnwdj^IPG=?7449;;;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_HLMNPL7CMQSDK
t{{u~lv{|~}u¢z~aªzw~s{]dqtz|wmhjbyo
zoxuzptzxkni]v}|
}q}vw{|xqtufg`[[^S\g^WPTX[UGJJEKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+(&''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À²»Åº{vk}xs }}p~zhvlRXL@E211376688:<>AEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMOQLKT]YRKhzy{q|y|~v¡¥©H®¯®©tm|~hghyn
qHlwryvhmk_v}yzuv|xmow~uusm\^^[cdXge\TPPVYPDLKFOICFCC@@CA=978:::;;:888::?>6;>7595773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¬ ¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./33123668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[??84.]ps£UFIKMMPW`YoY\^i~
¡¡¦»±§»Çè¡¥|qw
ihptrw{v|nvuf¡«¢zyypgkx|ule^[[^j^bg`ZOLNWRQIPJDNGCJDCADDA<:87=<:<:88778:==8<=68756623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfwz¤¡¬¦«¯°¡xw|~mpj]B@4--//..02234779;=?BDHINQRTRSSTRPOHDB<87/9C><<63.lMPIILLKNV`cfgmt £ª¥¤¬©¶¢¨Á®ǯxº|¡
¡
lpuwqm
q ¤´©¢}kjj|uc^d`[gl]ll^WKHNRQMLLFIPCDMFBCEFB=997=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENORTPPQSQNPIED>;<:DF?><752<?R5HHHLLMNR^n|s|§¥¡ ¢¨¨«¨¬©ª¶«¿«¶ÈÈ·ÈÐϾ pi«©
¦¢xz~¢{w«²|£¡¦µ¯¨lss}~si`^b`bhd`gf\REJKPOIILFFMCHLFGCBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m|aw}{ªªBD}x|
v^bP460-1/,.0///..0015>AAMQRSQRSTRNSLEE@<>=FG@A@8662<9;FHGIJNOQYm
w¡¥¨³¼·¤®««¦¨´«°¶²±»±³¾³Ã«ºÉʷÿ¸¥¢°³¬ª£
¦¦ £¦¢«¨¥
¤¡ «¡¤¨±£¦·º ¢°¢¢£¡«¯¬²µ¢¤ªyz~ibi]fc^dd^gg_[OCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhbWioXz
v
ÚÈsV|z
qna@E64<3/110-,+-1.-4?CAMUQRSUUVUN[PGHE<>>FHCEA7;<5C;=FKIGHQOPW¢±©±ÀÆÂª³Å¶«³¿³¸¾¶¿´Á¶»º£¸Å¨¶Éǵ¾¹´¨£´°±§¯«¥v¤¡¬²´ª®©®¶»²º¬°µ¢±¬±µ»·µ®´ §¨£§©¯¬²¹·¸¦¶©¤x
w[ceWgcbd`ag`[TJDDLUQHIJDIGEA@@KDBMG<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[YQbcWyup}u
{¿»£¼´y
zxn]V@EM<6:56AB764//6CHBQ\PQUWU\VP_UILKA?>GKFFD;>@7D7?BJJEFVSP^¤£±³Áµ·ÁÌȵ»Ä½³³À¶¸Áµ¿¯·t±³¥ºÄ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°®¦«§¤ ¬´»¢¨²ºµ¼¿Ì¿Å޽³Á·º·¾·º·¹¬¬°¥°©½°¼ºÁÁ«¹§ª~~lXdbYkfjfW\cYVSIGFLQGCHIAHD>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALQVSYUZvjo~nzsxb¹¡£{z|}}wzueP\dGEL;Qca[^SF?;HPEZcQRXXZgYT``LSPEA?IJHEEA@D<E6B>HGJLSZT]®¸´º¸È¿¹½ÉÌ»¼Á»·µ»º¶½´º±Æ`u²¤±«½©¥¨«ª¤¢²µ «¨ ®¥§¦¥¤¢§±´§²²½¶Á¾ÓÉÉÓÆÃÅÌÂÊÃÀ¾½¾»¼·´¯¸·¶Ã¹Å½Âǯ¹©¡«¤¨µs`cc_Xc`jgRX`VRUIEENK@>GD=JA=B@=F>;HA796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkpslrrsÕÀµ }~x{|y~t}zkfpuY]\Pedb`ed][XW\MdmURmm_n_XgdUYUJDBKKIFHHHHBI:D?HKTTV\Z[¹À¸½¶Å¿º¸Éʺ¶¹µ·¹²·µ³®¶¶du¨p^¢¬ ¢¤ª¥ ¨¦ ¤¬¥ª°¸°½¹ÔÑÏÖÐÊÌÒÌÏÎÊÆ¿¾ÂʽÁ¼ÁÀÄÄÅʾÈ㤻°´¯«¸»{m^a]Z_bZdcP[`SPKCAEFE<@E>AHA@D=:E>=J?37535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ\Yh_onlotu³« ¡
~|s{
{ts{ylmu{hreiligjih`fiilZms¤¼g[oh]ZZTHKNPJKPKSQHLAJFJO_^bgia·Ç°¹²º½µ±ÄƵ¯¸±°»«²±§«·«¶§§N¦¥¡§¬¯¨°¨´´ÔÕÕÖÓËÐÔÕÍÓÏÍÅÂÉоÉÉÊÉÑÇÌÍÂÐÑ·¯Ã¼Ä¹¥µºÂ¢pe^^_YaXZfZQ]XOPBBHEBH;AC>AG??A7;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYReVshqoyy ©¦}|p{r}qxulqx~qznxslipmcjmpxiw|~Ë¿Áß§mcxnc[a`JPRUNY^P]\NPNTQUT\nmvq¸¬´¦°µª¬¼¿°ª´¦¤¸¦«® «´£±®¦«¬¥¨¢¬ÏÒÕÒÎÌÓÔÔÐÔÑÎÈÃÔÑÇÍÒÓÓ×ÌÑÑÅÒÖÅÀÎÇǨ¾·Î{pg_d^XaS^ZPQTQOH>@FABE<@A>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMNZu
wlwo}~¡¡y
{r~zu
ovrks}{w{sxrjsrioqzyqz¾Ë~²vrvhak]CZZ[VecYdjTX\]`d^cwz~©£¥¡ ¨¥ª°¸ª¥³£¡¢£¡§±¦j¢~§°¡¡¡¥¤©ÈÍÏÈÂÌÑÔÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÂËtpebaYUZT\PKGIJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznwpmuvx}t
|ylvtn}vtx{µ;AÅ¥~|ieWICfcecgjdnw[^fhknin ££¥±£¤³¡¥ ¨ £±
~
z©£~«³¨§½Ãƹ¶ÆÎÒÑÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÖ¾Ë˵zxpf^[SWR[VFGJIEE=:7:@@B:FD?DCADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqs
|
|x
zyq{{uz
yp|oozq{qnztw}|u~{¯sX©Â¶pnb=^hrpqpnxvehoruxqz ©¡¬¡¥«}
~lz|®ª§¯¶½©¾ÇÌÉÉÌËÐÉÃÒÊÔרר×ÕÛ×ÓÙÛÕÐÛÚÑÖÈÔË{}jj\[QTT_HCFIH>A>=7:=?;=G=?AAADA>?:87EB755479/566435542323647553458EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<99D?CGRj^mdbfkvqz~~{|~
vyo{{tz vutu}soou|
zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥£«
z}¡¼¡©¦¦®¨¶¿ÀÀ¹ÇÊÎÎÅÍÊÑÖÕÕÙÕ×ÛÔÖÙÚÛ×ÛÚÚØÎÛÆ}{ikgbUXVVNLENC;==<8:<>8=@6=?@=?><9867DA6455=80665547745613854564557HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Xea][htzylwvz{~~|z}
zzu}tm|}~t|~x~xnt~
|}z©Ã¡½£}}r~s¦
{hGq ¤
~¦
¥¸¢¨¡¤¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¹{{zmkgYb\TPOIDLB<<>99::99;=6?>><=9:;;37D@8378>60688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=DRSRX^UXfmmmiqsy{z|{z|{}t
yrzsm~~w
¢n¨
z |}£¢ ¤¯
Wr«\¢¢¢
¤³¡¢¨²¹¬¦½ÂÇÍÈÆÏÍÐÌÏ×ÑÑÕ®ÖÕØÚØÚÚ×ÕÙÙ rwih_^YTXYCAHC?>>:49:;7:;;3;;?=>7;9:1:H>:37=@51677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcczma~omwxyz|
{{v
sp
zuvvt
~¦¤¦¢¨s±§
¢£©° n·
ÄȲ¡¥²d¤ÍÈ
ª££¤¨¡£³´¦£¼Á¾ÇÅÅÉÈÉÂËÓÍÍÔ©ÒÑÖÖÖØÚÔÓÚÎukf``_PKV\BBGC;A=837;<:8=649:<:82?992:I:=67BC32:96264>=4;>6949;57944JQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBeGu}|m}xz~z~vv{lo~y|wx|~£´¨¤«³¡§ ¥¤¯¢¸³¡ ¤¯¢¤§©°¤ À£É¹«¢¥²
¨¢
t²¤¡} ¡¡±®£¤·¾³ÅÇĽÃÿÆÎÊÉÒ§ÏÍÓÑÐÖØÒÏØ¼u|x_bWbXRIKOEBCD5>:76:?;<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGM[\YIha;Hz{m
y|x
}px|}|osz}{x
¨¼©³½¯¥®³³©£¢°¬µ¢¸¥¤©·¦¤£©ª¤¯±ª »»Ê¡i¶·ª°¢«½¤^©²|}´« ¡¢ ¥¯¨¡¥³¸«ÂÈĶ»½¼ÅÈÈÂСÆÉÍÍÄ×ÖÐËÓ£s}k_\UaSQGD><CAB8?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPfHa`bpI@r|u~m}}|~pww{«ÃÀ°½Æ»³´Á¼´¬«³·¨²½«º¤¨¹·ª¦¦¢¢¤£ª¯²±ª£¢¥¥£¹®¨À»¬²¹¥¤§}½¯y§°« £¬ ¡§§¤¢¤°³¦ÁÆÃ°°»¶ÅÄÿͧÇÃÇüÖÐÌÄÊvud_\b]OKCL@EG>A?B<:4>A==5=6>333242A17@BN?G@CNCA=C=;86CB5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\hF_igZ]\{un~{~q~zz¨´ÇÉÀÂÌÁúǼº¯«¹»²¶º³À®¥À¤«°¼¼ª®«££¨¬¯µ°ª ª¢°´§¢ººµÁ»«¨²¤¤¨©Ääy¡ ¦ ®ª¡ ² ¡¤ §¤¦§¤¯¥¿Ä®©·µÉþ¶Ï²Å¾Ã¼³ÑÉÇÁµw{o_Z^lTNIDMKKI@A=BD<5AD;:3=8B332263A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr{wz¡¨»¾ÉÈÊÂÒÉÊÂͼÁ³¼¿§º¿¾¼Ä¸¬Á©¬³»½ª°ª¤¥£¬®´¶µ ®¥¢£´¼©¨¼Á£µ¶¯«¯¬ª«ª§¥¤uy
££©¥}£ ¢µ¦¥¤£¥¦¥£¨¨¢²¨»Àᥳ·ÌÀ¹®Ã³»½Á¹Â¿p{c[X^\MMNJGDCHBBACK:4DH:;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>lI_XaZddWx
~ ®§£Ã¾ÉÄÈÆÒÍÎÍ˼·°º½´½Ë»ÃÁ¶·¼³À¹¼®¯¨¡©¨¶®©²·¬¢§¡«··©¥¯¾Ä±½¹³§©³³®¥¨ ±Å§}}ª¥¡¢¡Z¥e£³¥¢««§§¡¤©§¶¬©º¼Ãµ¦´µËÁ¸ª¶¬³»¸®¨¸º¼·np\ZVWPGKSMK?AHEDHFF85FM;>7>AJ.32025B55PWN<LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hV<>@BFBsFiIRecLF¥¡¨¥¢¯¾®¡Ç¾ÆÅÈÇÎÎÎÒʾ»¶±º»¼¿ÏµÄ½·¹·²²¶³·³¬¦««¹«©¨¯°£®¤§¤¥´Á°«¬³¾Â¹À¹³§¸´·³¯¤°¯¥¡sÁ}±¦£ ©¡ `J¥T°¯¥¯¯¦¡¦ §¡´©ª³½¼»«°²ÇÀ¸¦¬«±±£¡²²´¥sqg^\PRMEQQPQ;HKIFGAC=9KT?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hX<:BC@=REWSsbVFH«¡¨®§
£¥µÉ´©Æ¼ÃÄÈËÉÈÌÎǾº³®¹¹ÁÁ͵ȻÁ¹µº±¯¯²´§¤ª´µ«©¦¬¤®¥¥¨¬ºÀ¨«¶¶¿ÁÀ¿¸²²Ã°·½«£®µº¥¦v¾®¡¡©¨ ª¡§mu¢£®²£«©ª«¯¥¥¡¥ª¢±¦©«º·½³²®¾¹¶ £§©¥¦¬©©fhb`SLMGHNJUL=MEMIJ@CD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW<:=..SaMVH~e^HF¬¡»®ªª¡£¬¤¤¶Ç½´Á»ÂÂÇÉÅÂÎȽ¹²¯¹µÀÂʶƱÁ¼µ»«©¬°££ª´º¦ª§¬ª¨¯§¤«ª¾¼¨¼´¸¾Æ¼¶µ¸À°½À³©µ¶«¿¥£¡» ¶©¥£¡§¥³¢¥¨ª¤¡¢¡µ¯¥¦±««¥¤ª ©¤¡¡´´ºµ¨µ²²£¦ª¡xc_a_LIFHNQIMDFFBQKHADGAVRDH<AGQ1;A7:BF79]YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGE§¤Ã¬¤¨ª¨¦¬¢ª¶Å¼¿¸ÀÂÀÈÄ¿ÍÆ»¾¹²°¸´¿Ãȵ¿°¼·º·§¤««¬¡¡«ªÄ¢¥©¬¦«¯¬¢ª¨¿¸¦¾°··Æ¶´¹¸¾²¿Á¶´²´¯½££¡¡¤¢£¾¤©©¬ ¦½¢£¢©« ¤¡µ¬¦²¦°© «¡¡¥¤«±µ±ª¥ª¬ ¡¨je\b^PJHKOMHECI@=OH@;GIH[ROK=HNU4BE8>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcXN¢¤Å¬¡¬¢¥ ¦©¬¶±£ª³¶Å½À¶¿Á»É¿Êȶ¸µµ±´´·ÂÆ·¾±¸µº¶ §ª«¥¤Á¥ ©® ¤©°¢¦¨½µ¦²¼·¶µÃ²³·º¾³ÄÀ¸¸®´´´£¤ ¬¡¨¨ª¢Â©¬¦ ½¡¤«««¦ X¦¡ ¸ª¦¶£²¢¡° ¢£¥®³«©¢¢¥¥¤cg\eaMJKKOFEAFK>=IA99JJN]QQI=LV\8FI=DMI8Hc\KCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+waS6SZkWsHE6=ue\LO ¡Ã§¥¢³ ²§ª££¬©¬»±©¬µ±ÈÃÁóÂþÇĽÄʽ°°¶®±µ°Àŵº±°º¶©°©©¦¡¨Â¬±ª¢®±ª¤§½·¦·»½¯·Ã³³Â¿²Ç³º·«´¶ª¢¦¢«¡§«¯¯¯»²¦©©¢¤¸¡¡£®¯«¤¥¡£§´§§´£¯¯ ¢ ¦¬°¥§¢
dh]hfKJLKSBC@IG;;F>89NMU_RSJ>O^]=HPBMLI8Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<w]^?[U_fr@8<HweA4¤Â¨£ª± £´©²«¦¢¤²¬©»²°´´Æ¿ÄĵÀľÊŶÀɵ«µ©±¹¬ÀÅ´¸®¶º¥«²«ª¡§»µ¨°®´²§ªº³§¹²¸²¸Àª¸²Â½´Å§¾®·µ©§¬¡¥¤¡¡¤®·²µ¶¨¤£ ·£¤¥®±²¥©¤¡¨¢¯²¢§¯¥«¦ ©©ª¢§¡zfj]lkOQNNT=BANC;:I?77QN]_RVQAW`\BJSHVKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JqjVCWFyfC;¤¤¡¥¿¦¨®® ©µª¸¯«¤ª´·±°¸·°·¸·Å½Ãǽ¼ÄÂÇÁ¹ÁÆÁºª¶¥»Á÷¸ª²¼£°²¦¨ª¹ª¡§°« ¯´³ªª·µ¬»¬³²¹·¬¸°Áº½¿¦Ãª°¶®©ª«¦ª¡¡ °®³«°¹©¦ ·©¥¢¢¯±³«±§« ¥ ¤´°¦ ©£ ©©§ £~ljmbnnXQQZTACEU@;;H@7:XPd^PWWDY^^NLSO_LJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gYaF(@8m}h\V:{cC=¨¡©¼¡ª¯ª¢±·©¥´²«¡µ½¯³¸½»½·¶ÁÿÉĹÅÃÀÀ¹Å¾Á¸¯¶¨«·²¼¿¿´ª®²¸¬¨®¨©§»¥³«¢±°³¬ª¶³µ¼°±µ¬°µ±ÀºÅ¶«¼¯±·¬¬©¢±¥¤¨£²ª³©ª³§ ¦¤´®§¡¬¬±§²«±©£¨¤ ©¶©¡ ¦¦£
{gmshps_GYfVDCNXDZ9HB5>]Qh\NZ]G[^]OMRXdKKC]c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aV151=`V_8)C3YU\gK5zfL@¤¤¬¶£¬¨¤®µ©®³¸¦¦°¸Æ¶°·¿Á¶´ºÅ¾ÌŹÃÁºÀºÄ¸Á¹²µ¬ªº¸»º¾µ«¯±·¨«««®««¾«¯±£ª±²®®¶²¸¶ª®±§µ¯´º¼É²ªµ´±´¯®¦ ³¨¬ ¤±¢ ¥¯¡¤¢¥¦²©¡¦±¬ªµ¤®°´¯£§¬¸¢¡¡¥££¡{
{lnyou|aF`jZIHZ[={JGE6AbUi[M\aJ[\ZSSSbaLKE`a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.+A/JGP[G3cXTKE¯¨±©¬¥£®®µ©·³·£¬´·Êº´»»À¾´³·ÄÀÌǼĽ·¿ÀÀ¸À½²½®¨º¹¸·Â·¬®²¹§®¬§¤²ª¯»¤¬²²¦§¢±³°²±µ°·²©®«²¦¸¯µ³ÄŶ©µµ«°©§¢¶¦± ¤°§©©¢¥¥¤¶§¢°³«§±§°µ¬¤¡¬¨ª¹¢¨¤
¨¤¡w|nqxv|]Kel\JOd\?b{GI8GgWf[L^bMXYWUXUi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHg27'FaLV%-B.=ELQ<3rkLDD¤¤¬«¦£°²²ª·°µ«µºÉ¸®Á¼Ã·³±µÂÃÏÄÀ¾´½ÁÀ»¿¼´Ä¨ª¹±¶·À¼¯¬´´¡§±¥¦±¥²µ¬ª²±«¨¨´¹¬´²µ¬³¬ª«¨¬©¹²°Ç¿¸¤¹°©¦§¬°¥¤£®£©¯¢¢¢£¬£ ¡©¦¥¸¤«´´¤ª«¨¬®¶®¢£¨ª ¤´£ ¢§ x~}}}rts~~\Sdn^NZg]FD[G:NmXbZMabNVVVWTYh^QRLdZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Dd;6*HdHJ+:I?3CIS,>k?HI©ª¡©¯¤§£³´°´µ±° «½Ìº®Á¼Ç±´´ÂÃÑÄÅ¿Á²¾Ã¼¿¸½Å¨·¬´¸¼À±¬²®¡£§®ª§¥±£«±ª®«±®®¬«²º§·±²©²©ª¦¥£º¬ª°Â¹´¬¹¨©¨©§°¥©¤¢®ª¨¢¢¬¥«¡§¨¡¬¦¢¬¬¶°± ©¢ª°¬¦§©£ ¨ ¡¥}w
utrvl_Y`ncQsr\K<|F?WuX`YOc\MUVUWQ\b_SOOhXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.IgDF8<B05EKX1@]@NF¬§¡©±¨¨¯µ¬¸µ®©¤««½É»°¾¸Ã¯°¬²ÄÄÎÎÿ¿´ÁÄĺÁ´ÉĬ¯·®³ºÀ¾´®®¬¦§©±©¦¨²¦´ª°±¯²¬³º¤¸³¬¬§« £°·«ª¹¶¤µµ£©¨¬¬ª¬ ¨¦§±±£¦¥¡¡«ª¡ ¥£¢ª£¬¢¦±¶¬¬¢¥£©«®©¡¥¤¤
¥£|{u~ux£xk^`ngWfdN@gLDbzWbXReUMVUUTO\]aVKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DBIID¯¤¢©¯©¨µª¶°ª¤«©©¼ÁÀ¸¹´¼µ¦²¯ÄÊËÑ¿Á»¸ÀÀºÁºÂÄ®±µ²´¼Á¾³±¯¬¬¨·ª¦°«¸®¨±°®±«µªµ¶§µ·«¬¤©ª¤³³¨¨¤³´µ¡©¨«¨«¦««¨¹¶©ª©©¡©©¡ £¢¦¢ª¦´®§¥©¢¤¥¦§ª¢££~
£t~xuzx~prggqx\atiO]VHmyUdVRbOLVTUQOX[bVHPjTVTGPYUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02?f=NX?C,?LT_/Ik7RF;¯¥ª¬ª¤®²´¯ª¥¯©©»¾»Á±°¹¢¶¯ÉÇÈÑÀ¿½º¼Ã½»ÃÁ¿¿¯²³²¶½¼Á±²³«³©¥µ¨¤¬³²¸¯¢µ±¯±¹ª¸®ª¯·«ªª« £¡µ©¡¯²¡µª¨§ª£ª¡¡¬¨½¯«®¡§§«¯¢¢ ¨¦§©°©¢¬¢¡¡¢£§¨¥|
¤
¡xt}txz{tt{j£vi^elug|RWp^KxsTdSQ_MMSZgNMWYeYGSjRQ>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HP;YC4°¤¥ª¢¥£¬¦´³±©¤°§ª¸¾Á¼°¨¹ª§®°ÉÇÈѽÀ¾¹¿¿½É¼Â¸±°µ²º¼¹À³´¼¹¬£µ¦§¬±¶¸²¦§¹µ´¼¯»¥¶ª©¯¤¥¬«¨ª²¤´©ª§©¤©£©¨©½«³°®©£ ®²¢¤¥¤¥§ª¥©¡ ¤¨©
}~
¢rzx~|hw|{uqr~izd`hcr
{mhy]^VCX{mTaPRYKKMpt]IZ[gZFVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*¯©¤£¡ª¤·²±¤©±§¹Á½µ°¤¹¬¨¨°ÃÉÉÌÁ·½¿µ¸ÁºÈµÃµ´³µ²½¹º½¶®¹¶¿¢³¦ª«®µ·´©º»¨±¿²º ¯´¶©¬±£¥§©£¤¯¦¯¡«©§¢ª£© »§®±®¡ª¢£®¬¦¡¢¢ª¢££¡¥¬z}£}yl}vyxb{zrpqsxjujgchansmbjp`oB]ykV^NQQKIMSYVM\^mWEXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R]=#«§£¡§£·¯®¢¯°©«¹Âº³ ¹¯«§³ºÇÊÈ¿·Á¾¯´¾·Ä¶Â²°º±²À¶»¾·ª¹¸½ª¤´¦¨ª¯¹°¨¸¼£¾´³¡®¸µ§¦¨°³ ¤¥¨¡¤¬¨¨ ª¯§ ¦¢¨ °¸£±¯¡«¡¬¤¦¦©¢©¦¨¡©}~|{¡y}
|tp|qst`yxjopqpjsdzlhedbf`[rjqMNiXZMQLKHPRQHM\_oTEYZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0][5(¥¬¡¤¡·«°£´´©©ºÅ·³® ¸®¬°µÅÇÀ¶¿Â¹°´½·¿»¾°¬¾°³¿²½Â¹ª»º¸§¨µ¨§«¯«³°¥»¶¤«ºµ®±¸¯©¥§¯²¡¤ ¤¤¡¯¦¡£¨¯¡ ¢¤¤¢·°¡¦±«¬£¯ª¥¨£¥ª¤¢¨¡z}yz
y{prvnot_xwemlljjofrikfh^dt`[kviZJ^\XOOKHHRUG39]^lQEYUYeMHIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDU]hD.<2dW,2¡¡ª¤¡¢ ·ª® »¸¥¬½Å´±¯£µ°¬¬®µÃü³¿º·±³¹¸º·º¯®À³´¹°¿À¸½ºµ¥¢²©§©±«± ¿µ¤§µµ¨²¼©¨¥©°¬£§¤¥¡±¥£¨©¢¥ ¤¸¨¤§®¦¥¡¨¨¢¡¡¡ª £§¤yz
|z
|w~|ltrllsawuiijggohhicfii`jcjh\f{c`StT\[SLJGIOS@!*h^jMDWU^`KIGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gP'2¢¤¤¦£´§ªº¶§¬ÄÁ·±¬£¶®§®®¶¿¾¼²Á·°®²¶¶¸¶¶ª½³®²±½¿·®¼»±¤¶ª¥¥³¨ªÀ«§¥¯²©¬µ»¨©«±¥©¦¤¦¬¢¤©¡¡§µ¦°ª®¡¡¡ ¦¡ ¥¬¡©x
v}
{s}}fxokjkfuskcgddvcefffjjcks[_Z]mdaNiXZ`VJGHKMSX>9_liHCUT][IHFFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£ ¬¡ ¤³±¢²½¶¡±Æ¼º±±¤¶¬ª®¨¸»º¹À²®®®¶®²¸³©¬¹±¯®³¶º¶°¸½¬¦µ©¯£©®¢À ±£®°®·µ®¢¦©¥§¥¥¢¨¬¯¦º¨®¢¡¤¤¨ª§©¦{t
|
p~fymhkifqrk\hcctbfgjnlgjjhn]lltpaTcidfZIFLMOYQPVaeUAWSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC'4¡°¡©±¯¹¿µ ´Â»½º±¦¶¯¨¤¶·¶¶¬¼¯¬ª«¶ª³¸®¦³µ²®©°¶¶±³µº¦©µ¨¨¡¨¬§½¬£®¯µµ¬¬±¯©¢¢«¨¦¤ª¢¤¤ªªª¼§¤ ¡k¢p£u©§¡ymi~vql}
p^cag
ktw~gguheW\hsnNPjcgs
h_efnmj]`afNKD9GTg^JGPPUULHSaptfF[QUPFHEC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=A@@=28@E=1,+08=G601.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.£
° ªª£½Å¯©¸Â¸½¼§¶°¥«£¶²±²°¹©¦¬´¦¯µ£©¸¶¶¨§¬¶²®´³¡©³ª £¥¦«¹¥¥¯³·®¥©ª¬¥¡ §¦ ¥¥§¦¨©¤¶°¤£¢£ ¤¥ªrx
¡vif}sx o~|¡ |tullheczlqaS
mbliqXiqpX^i[ll[qnzr
gZ^GN?G_MERVVQQRWUg^MWIRRPFGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa70(¦«ªª§ª¿Ã®±º½·À¾ª¥·°©¬¥²´®¯²¶ª©¥°¥´³µ¶µ¦§¨³°²§®ª±§¢¢¡¡³£¥¥µ½¦¬§«ª¬¨¥¡ ¦£¥£¤¤©££¤¦¡·¤¤ £¯©¡
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êr¼Åzrµ¦»{l±«°xhkX±®nei¼¼ngzorØ~Skc¶²rt¡ªWOWbPVNFU[XQPR\W[QA]DQNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦§ª¥¬²¨°Â½±µ¿µ·¾Áª§³¬¬©§®³©¯µ³¦§¦´¥§¸¯³²¶«¥¤§±®®°¦ª§£°¢¡«¢´º¢ª©¡®¥¡¡§§ §§§¡¦¢¡±££
¯kjª~fdp¦q®¡¤~x»}k¡v±_j´[¥e`f{fjxk©e¾rg¦u±j|±xtcmm§n[ EhfEu`~g|¤§Z_«ixyj§7J¯\XSld[KNX_\WV;NPWW/ITSJDEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢¬¨¥£¤ª±·¬´½¿¯¶Ä²·ºÁ¦©°«®¨©¯®£°º®£¤²£¨¸¨³³°£¥ ª¯¬¯¦§£¡¯¢¬¥¡´³¢«¢ ¡¨£¡¦¤¢¡ª¦¦ ¡
µµx
©µv³·~©k¦{w«gk±\«ztrx °vwqkkl|N¤XHbb~ch¦`yruS^P©mcq~b.Q¡o[Skh`LK[dX\ZB?²yXXA#MhFCDA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50³¦¦¡¯©§³¬©»¶Â°»Â¸¶¿ª¬¦±© ®¼ª §´¬£«µ¤¦²³§¤¢§ª²¨°§¥« ¤¨´®¢©©¨ª ¤§¢ £¤£¢©¦¢ Õ¹p°Á~Æ|Ö»|¥¤{¤¥z¬yV¯z~j¹[ºw}¦|z©x{±nt¼
oP¯§ÅQ zc`ªbsrm`Sµ´È|c¤3Bv]PjidP@XgZdaJHNnN\ROYfYCD?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:;DHCBCD<EF81211DC./0483+-(.323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ71%¢²¨¨¦´ª¥´©¤¼·Á°¹À±µ´º³µ§±¯¢°²¦¶¨§¹£¯± ³´±¡¤§©°¨´¨¤© ¨§°©£¢¨¡¥¡¡¡¡¡¡¢¦¡¦§¡²nhµq«n¦r´sr¶{¤£¡¥~°vÒÒv\®{
¤oª¦k
}}{°rx³etofRÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjcfXAOk`lhPUHI9=VRZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥°¬£«¼¦´¦§¶»¼²º¿·¶³¹¹²¤´³ ±±¢«°¤¦¹¤±°´¸ª ¦¡©¤±¨¬©¤¦¡¦¥ª°¦¢ ¥ ¤¦¦¦¡¢ ¡¦¢
¬{w¨v£©o§¡¢®
³\r³R®}¤rØ~x~
v¯w´aelZ°XKuyf`^vwhk]¯wxl5yÈ®²_BTo^g`EPm_pmVVM.fdiSXQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I:99 ¹°´Â¨³¨©²º·³¸¾¹·±´»µ¤·²³¬¨¬§µ«¨°±«´¤© ¨¡µ¦¦©¢£¡¡¤¦¯¦¡©¢¡¨¥¡¥©¤¬¡ ¡¢ ¦©}}¥x¡ªp§¡£ª|xo±Z¨ ytÙwt¨¤|{²^d ~l\«[Zhgªdr{ks]«Z koeOJC¡\[Lt]bgM[a_rt_KV7JXGE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¢¿«´Â®«©¥´°·±µ¾¹¹²°¶º¨º´¯¤¤§§ª°©¯©µ¬ª¯¡¡ ¦¤¤¹¢£« ¡¨°¯§¨¦£¨«§©§ £¤¡¢¡ ¡«®mr´s©u§s´xs³¤£¤w¸o{¢jk¶Z¡
ei ¢§nr´t²j
ku³af¢oj\_M¡|Rs£ly~oq\¯V<wfTon.\§OcSkebmZc]ap{cTZR>>mo3CB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¦»¡²À¯«¬§·©·¯µÀ´»¯®·¶ªÀµ¨© ¥£¡ª©§µ£²¨®ª § ¥«¹£¤¢ ª¶°¨¬©¥¥£ª²¤¦«±¡£¢ ¡©«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸cµ©}¬©q{t¼§ ia¦¯¢~tª}¾os¼t²uxnqn¤t½^w}Zay¼kZV\jy^jaegcmxoZ\ZDA@s@CF+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¢¼¡²Ã°ª««±§¸¯¶Ä°¹°¬¹®À±«£¢£¡©¤ª²£´¦¥ª§¬¹£ ¥¢¯¹²¬£§§¤¤ ¨«¨£³£¥¨¡¢£¯ ©¶·xµwmknsoy
tÁ»½z±¨ps¹|||¤»¹½uz´£tvvt°ufjµtrqw¶^z}hynyb¬pu
X[§jEeZTf`c^cQhgqmuBNPMD;ZM?J3;0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>707LT_G'SbW8*O^]=+:VV'>;<§ ¡¿¥´Ã´¬«¨¬«©º®°Å®´±¬¶¦´¸¬©¡¡¥ «¤©¥´§§ £¬¤¾¦¡ª¡¡§¡±µ·¤¤¢¦¥ª©¥¥¡¨¥§¤©¡£¯¨¦¡j}i¦xr}tyd{½¾ÀºorasjZ]ack`cmwbke^`cphr}
gj~rux}~b[wthP\n}|kXk{rJJopNtMEX]gaLZXgc_O[nuirRPDEN;HI=M?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P_L(3>[O'?2>© ¨¢Â£µºµ£¬¥®§§µ±¬È«¯±©³¢½±±¦ ¢¨¢¬¦¯££´©¥¡¦¨¾§¨¥¤¨¨°²¿¬§§¢©¨£¬ ££§¬£ «£±§ °¥¡§¢£¥¡gm}qw
µª
¡ z¥lj||uqxyvv|jsuuew}wkozm`c]phMXZfj`WZpznmfTOFS9OZMRO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³¡³¢À¡¤²²¶ ª¦²§¥°´ªÈª¬¯¤´¥À§³ ¤¤£ ª§¬£¢¶«ª¥Á«£¡¡§¨§²Ä°««¨ª¡¢¤¯§¢¥¨®§ ¯ ¡¦ ¢ ®|ª©
z£f¡³¯
v{}vyzofykuzris{vkudyf`jecdfkYl{pij\SLPD^TF@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_bca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4[G5<,@´ º¯¿¬«®²± «¦±¢¬³¯Ä¯ª«¢²¼£³¦¢¡¨¥©¦¤¥²´°¥®¾ ¬¢¡¨ª«£´È´ª¤«¦©£¬ ©¯ª¦¤¬¢® ¤¯£§£§e|e~cymik{¤ªjd}geeih{¡lh£wkj£slnzzXe^^mv\hswwnxxsmytv|kY^lud^sik|qkc^RNXIdXAJ4>G7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO2YC;?.=¥º¼¹¯¬´±ª¥¨°¦°¼°©¦£®°¬ £¢¦ª£¥¨©²£¢¯¥¶¹¦®£¡¤{¥¢¨´Ä¸¥¢§¯¢£¢©©¡ ª°«¬¤« ª§§ «¡¥°¤ª £©}½r´rhx¹Ä¸q¢£z¥s«|ËÀÀ»q¢}À½ÂÁ|{ÃÀ~l¥²noÊzwvyyqzpw
ynxcf_yd`ec^thldcXLWIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP.#F[3PY/VAB;/8£¹Ã´°°À©¨£¯©°®¦³´¯©¥¥¦°««¢ª§¢¬¢¥¨¤¤´¤¢¦«·³§®¢¥ ¦¬¤«ÀÀ±¡©¯©¢¡£ª£ ¢¯ª§¤¤§¡¦¥¨¤¨©©« ¤ ¢~Îxz¤y_®^§¢ |§s«¯^cª{§
u³c«¡³j®t}·aZ£Ímu{Ú{p~v~e{vvk|n}marlph``yd\qhjdg`RTSW]KOC5AHDD8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5477164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸£ª§³«¦²¬¬ª¢ª§¯© §¥¢¯ ¨§£¦¡°¬§®¬°ª¨¬¤¤§£®¥«°¨¿Ç³¨©±®¢©ª ¯©¬ª¨¨¤¢«¬²¥¢ªª£¦¤¡¯¦ q
u
¨q±}r¬~¡¥wª}s~«v{|~ª¢~«z{VÄzoÁ}muomeveoawnronfpuuqagme_oiingdXS]aZRSC9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;92478452&# 1' 1' '45-&7=WJ-<(>1)3V@F!G:C1.+°ÓÆÆ²´ ££¢¢¬¯¶®¨°¦¨ª¦««¦¡¤¡ ¥«¢¥ ¨¨£°¬©§®¬¨§¨£¡ ¦¢¯¬¤¬µª¹Í²¦®¬¢¬ ©²«««¬«¤£¬¯±¢¨«®¥¥ª¨©°¡¢¤¤j¤uz©tz²p¦q ¤``R«®v§z{f£¤£}©~®_}©U¢z¢{ïÅr¯³³¹qb©¯Âthnqnzxypmgeerpf|ic]W`jXYULLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÕÕ¿¡«§ ¯¢°´°®©¬¢§¦¨ª«©¤¦¤¦§§£¬¢¬¡£¯¢«¤µ¯® ¨¦£¢¨ ¥°¦¤¨±¬¶È²µª¬©¡¤³¡§¬¥°ª£¢ª¡³¡ª³°¡¨§®®´¢¢¦{ªlu«y|°o¤Ò¸´¸É²_`©¤ zxªÉt¤¨©ÆÇxf¡¥s}¯]p´b°uK£m§Gd|qq|u~|n\fjsqfk^aYdm\_YINLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ¨²¬¥¢²¸¬ª ¥¨¥ª«©¦¦¦ª£ ®«¦ ¬©¥§¶¢©ª¶²¥ ¥¬§¢ ©¦®¡¤§©°µÃ²³ª¨¥¡£®¥¡¥¦±¯©§¬£·¬¡±¸¯®¦²²²£§¢Nxz£}¤¦¸{{y¹ÌÆÂ¶x¡~v¥¤¨°
¬}b¥l¤p}r¬`£sq`¼}RUt£{~v|sq\nnxrjo[d_inbd^LLQTAIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__]ZZZYUSOH@882.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª®¡¬²³¥ ¥®®«§¦¦£§¡³¯¢©§² ª¥¢µ¢¢¡©´¸¤¢£¡±¦¤¡¢¯®¥¨¢¶²Ä±©©§¢¤¥¦¤«°¢¯¥¦¯¤»¬¡¶¶´±·°±¥®£
ѵ÷y
¦x¡w ¥qª
´nrj£|s¯¥¢¦mq²]¥szk{|m©a£qqbs²¸hw¦}y~ynjyiyrou^eeomfg`J[XX<HH@U4@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¿¿¼º´§¥µ¡¢£¨¦®«¬¦¢¦ ¡¶§£©§±£¬£¥£ª³³¤¤©®¦£§µ¢ª¤¶«Ã°©«©¡¢ ¦£§¥¨©¯£¥¦½¬½°¬¡¯²¹ª²¥¨°¢§y¨}|°w¤¥m²o |¡§¬
®
ª ¡{~««x z¯^£}¦§c|sj¯]¥kp
]`[ m¦||knctnzagfqnhghCZa[>KU3U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a``aa]][ZXSPONI8052.*,ATVVVUTUUUUTTUTTTVWWXVUUQHFIJ#((½©ÆÂ¶Á³¬ ¸¥£¤£°°ª¤¹ £« ¯©®¡«¨¤®°¬¦¦¬¬¡ ¥¡¤®¡¨§·©Á¯¥©¤¦¦¥¥ª¬¤¥ª¨¾¤Â«©¢ «²¸©¥²§¨v¯~
}ºe±e} ¦¬°
¦¤¡¡
[lj³`{{±mgo±[~µ]¤kÈ¢d{¼XvµY²}R®z¬X¡m¨|zeuc
xt|bjgqmgefOVd\AU_>I(>:=4!",%2. *1/04579:<ACFHJLNPQRTWZ^`_`ab^_\[XUPNJGC553./@UZXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·½º³Á³£¬¦¤¶¨ ³³©£ µ ´¨ª¬¯¬¯¨¢¯¬¨§¡¦®¨¡¤££¦ ¢ª³©½¯¤¨}¡ © ¢©®¨¦¦¢¥©» Ʀ¤¨ ª´´«¥º¬««©£¯¤¸Ãº§¬¯§¦ª~սªb£¿½}~£×º¸µ
½¾l£o«lz²°Çi«°½¬xw¢¾¼s¦{{d~|egy{alekjcPa[Sj\?UbCN)=:4/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC?=A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³³±¿¹²½²¡®¦¥²¦¥¿ª¸²¨¢¿§§²±º¨¯¦§°¬®¥¢¬ £ª ¢¦§¡¨¢¡¬®ªº¨£|¦©¡ª©¡ª§ £ª»¨Å¢ ®£©³³©®¨¹¦suª¤·d ph®nnw¤u®pq¨£®¤rmllfxonqzjqigqii
gqd]bjoY\f}v¦_aqnee¡¡~wgxikzyelcflbKdXJlZ:PeER'K:+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYYWWVWY\^^]\\\]^]^][[UW^©¬³©¹¸²³ª©¡®£²©¾²ÄÊ¿·ªÀ¬¤¡§¬ º£¤®¬®§®©
¦ª ££ ¤¦¨£ª ¦¦§°»¬¬{¥© ©£±¦¢«¹¯Á§£²¥«¯°©¬ª¦¶¢¬¶ ¨¥¶£ª©²£ª ²¢¡¢¡¥¡«§¥}g~tusp§lz¢¤sjwqxw|zjmdcodUaY@j\HcaOY+F=+'!750.!%2(*699469;>?ABDEJKKMPPQXTVY^`ac]^UQJED>9=@ASX[\YWXXXXXYXXZ[\\^__`^^^__```_YY`¦¨ª¥´¶®®¢°£ µ±¬Ç¾Æ»¹«£¥¦±©¤·§©µ§¨¢§¬¤§£§¨¦¡¤¨¡¶»¨«|¡¦ª¶£§«·§®Á£¶¥®¯¯«¨¨²· »¥¤¦¶¢§ ª £¬¯ £¯¨¯£ £ª«¡«¡
}f
uuxsj
|£¤
|sszs|jod^pj`[`YndP`ePZ:GGE>2=>9/*&+)&&416668:==?AACIJGJKLMSSSUZ``i`eVPJACB:9EMV[^^[Z\[[[\]]__]^_`aabaaa`bbbdb\[c£§£¯²¬®£©¦§µª¥µ¼°¢£{£²¤¥±©¹§£ª¢®¢¨ ©¨©©º·¤¥y£©¸£¯µ¢¯¯t£½£±wy©°¹u¬£ªd\bv ¥}m³£§ª¢esyp¨m¢¨e¦
wjvp{
`hZughs{¨fzyjoykre_vplkh[gfbbpS\>NNNSG>@UD91/&4:306678<;>@AAFHBGFIKMSTUY]`hfgWQJ<DG<8UR[`ab`^__`aa_\]__`aabcdabaaedchd^]f¦£ ®°¬«©¥¨®¢¦¤«¶±³§«§¬t° ¨«§¹ ¤¬¢§¡u¦©¤»´¨ uw¡¡§²µ³»¦ ~§¢z¡µ¥±ª¯¤z¬¡§¨§
w¥z§{²z¡
cz
mpyp~
s
xgt u}
£
klx{qqgdxojlk[eljet\^ITLR@E5.ZUU6)!09=>743568;:=>>@DI?IEJLGSX[Y[aahfYQH9EL<>bV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah¢¥¬¬«¨¬¨°¦¦©¥¯È¿±¢¨©µ
¬§¢ ¾ |¬¢¡§¢¤º²¨
qv¡¥«´´Ê©·
°®¬¨¦}¨r{w§h¤y´¦§Â«¡r¥}
²¡}¡ }
mr
~yq{tÅf©£k¤q
hxu|xhhvqhhl^dpmgmXgG]RM2D46Nbe7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^il\QE=LM@JdX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢¯§¨¨¥«£·°©ª¦ £¤«¤¦«¸£°¡¨¦½¡y«¢
w¥£¹®¥~bm ¡¡§~¡§
©
£©£ukvM«x¨§©«}¡{z§jkg·~n`dY{dhs}yl]}m_Sp\_kx_Xd|p§ªk£nr¥p
jf m[o}gZ`bXPowfmtskjo^kqmkiXiO^YF9A4HD_l5,ICRMN=84859;6@;;>BO>QRLMBJ\]_W^^bu`MD:MONTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ©£¦¬ ¶»«¢¡¢¥®¡¯µ£¨¡ §´u§
¬¤©¦±§¢in£ ¡¤£¡ w§¡¦
§«¥x|~¢ps|ym¨{¢sv¦f~w¤_z}t¢n·´ºtµ¨dƸ{p¶r¤cs¬«`|i³~m|q£lr£t
¤`³q}³us[²jcotvqhoXkmsrf]i^cLE=D6RBZs3=SG_JR=<395::6D;;@JP?UMOQ@E_^[ZX``|dHC8LWUWcaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£·ª ¤·´ ¢¤£¦®²®¬¡¡¤«x
q¡}¨ £©¨¥
~j{~}¡ w¢r¡©¥¦©}~z z£xt}¥¢d¡|mho{§}rht«tªh]
v
gªk¸f\¨p`^§vu~ht
on§]¨~x»k~ª\]´g\nrzxki\qkyyc`fXbBQFO7WDSo5K[Z_OZD@151;;6H?:CHU>YRY]>Db^V`Qac}jEB9N[^YegXfgnmbbe_aa__``ec^bdoq`deekecihgki©´§c«º±¯¬¦© ¯±©¤¡ ¡¤jr{z¤©£ iy{£ ¡rhp©¡¥¦{°£¢¸w£³£¤y{ª¢q¡|
¯µ}k¡y~µ£¤«¨|}tªZ]o{xbL{z
cyBLX¢jq{lux±³§wns}ptk¤]vHed`tq~~nf`liv{ddbQ_X]UW@ZFQhESW\bX^ID=B8?A:IF8LEXAWR[VDFb\Z`K`m~rEC<U_bZfjVghmobfg^aa\]^ahb_ecvm]egfkdflihki°S^ ¦³¹²²©¢¬ª¢¬¤¢¨ ¡woy
|r¡s¡
©}l
q¡x|¤¡¢}µ{¥z©|§hwm~t¡sr|p®}¤¦¤o^¨gu¢co¥aÓ}{xstb¢~£s¤uk³`sª²¨¼wm~¿¦©´]n|pmr¢r]¤gs¦`h¦mÔ}pz{l|xsn©¤g`ezqlgfdouwgacS\fQQbIXJUaWS[ej[eQFDKMJKBKE8O@QNXSYOSQaeejRcwywIFEc]eZhjTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°«T\K~©¯±´¯³£
© ¡¤¥©¡ª¡{p}
h}wo
l|¥«yvnw£{£¤³¡¢¶z¬§¤®¥p©
{¤¡r£®¯¤ vµµµÉ¡s`©my t¢w ~oMf£ps¤{ztak} kqd_q}shyi³µ´Æ¦s}zk«v
mvxj{urPE}³_jvkyfkhcuupnW_TYiQShIVMYTV]hknVgWNKBJMKHJOAQKPecjmetss~y|nu{{TPOl^i\kiRjhilglfce`\]]^ibdik{_]dhcjfnmeile¡®¦e?¡²ª®¯µ¢¢ª¢£¥¥§¦zjye yui
z¦ªz}yp¡z ¥¨fnxl¢d|q¥wpg¦z¤zrw¹n¢b} mriªku mo¦_iit¢}`uobh e~iuocfmq¢Z^[c¡m]nz}srd¥mx¢dg§hsp¢oUo _f¨T^TnmskrmpilyskoRYWWfZTmIYO]IXiisjYkVQRFV\MXSaUik_wt{}p}|r{svv^QrbgcpgPjhhklnhdg_]^]`jcjivu]\cicjjsmfkmc¤¥zdtm§®£©°±¦«¦£¢£¢|qi|st}|d|¨£¬~si¦} ©¦¦x~¥²¯¥vx©s¥n¥¢»n}¥¯
|¥zr¨ f~o¬cw¨mª¢vw«¦k°kv³©kmm`~«ªv~~¥v|¤ jx¬h¶tw¾¤Y§«aurtq|uqckohlSW[Vab]kM]R]J^mnw_[qY\`[gtenorbqt`wz~yrys{{vbxdcnrdRkgholrjfia`^\bkbmlzo\\bibljxmglnb¥ª£©ª¨¦®¤¬¥¦©
t{p
~tt
rm}{¦¦§
vol©«£ u~y®£qw}{r§q}}zy{~v {}k
[yyrzqin~quqe_wtruoynnl
^ugwe
¨}t{jpv}wnmgsz|x
\kXyioxrroxxp]knjgV[`W]fkdVbU_Q_pxylkvfjklw}rrusaoubt{xuzux
}{mldyn_Wnghukxjije\`Zcjemqtn[[bldllynhloa¸¨¦ ¢¦¤¥«¢¡¡§©r|}~
{trp
{|
y~¥|¨¡
wr©¨ ª~~¨¦woxn~¨
p}qkp} hm]sqtkvtYrn~~j]jd{
`ixz{u
gwjapqu^q¥
enwqzqghe|{[\jgnv[|yxunssg\mkkbZZ_[Zlq\_aZ_]ft~{uptckkk|~s|xudmuhm|~vz|{yz~o{}s~yshU\qiluougkhd]aXkhlkqrmW[enlgszohjm`ª° ¢¡¨£¢~® ¢¥{
}s~v
qor~z
¡§¢yz¡ª¡¢££ª¡§¦zv§~²¦²¥k|wxe|w|zt ~}uor}w¥
}ym
~zkrhatq~zwwpwt]^ohn_^Z]]ShrVd\]blhu{|sopdkkj}nyrjpplg{rx}{m|yx{}zxNdvjrmpzekecb`[tfpfrqmU]ltmiyzqgikd¹¢ ¤ |¬ }x|nys~mk~z}
« s}{ª¥¢
¦¥u{¥{|«¡ª~owqu`~u
~
nyut¡
s||rqzzw¦
w~pl|nhlmh_zi~|vuvu{x\_p~nu`c[]_RgnTe[^bkivz~qlmdkjhlslluoyoynv~
vq~{z|{`i|juhidjc`i\cuhobumlUcqyepz{sejmm·¡£{x§¥yz
|n|ys
~}jh}}~}¨p ¡
}¨x£ £¡¤}w~|¥¡¢¦~~utpwa}q|q
hwqx}q{|pwzyy¥
{v|gs}y{qlkg_~sh|uvt}sj^`tvpwdcY__RkiUeY_ahjvyqgkdmhfkn}horl~yzls~tv|z}irnsiahlb_qVtomm`xhmWjtvcuz{rbjoz²¥¥ |v¥¡£y{~r{tv
~xgc}y}y¡~p¦¦
w ¡y¤xw~s£¢¢~|vq}n{d|
pl
eun{
|w{
|zq}wx¡vw|xazy~txgmeajjwstu}q|bc`tnurmaZa^[leRcY`ahkvyqcjcmeh}lhthnpi}ymqt|}z~|mvttmeljbbvVipn`xglbjvpfy|zq`rl
¦¨~xªzy|~||xty{t}d_}~u}~}
¤£s{¦¡s¦rkzo¤|zqykul{~~m
xp~~dqi{~sx|uw|{£xt}tv
pa|vzq}obocd|cnovsxwstav`olumo\\_^^j^P]Ycahmt{l`ifjciwnflijmh}{wos}t{}z}}rzxxnljh_ircgqoewgnlayik}{xpaxmª £¨~x¯}w~|}|wxput|o}|a\~s{{¦}}¤m¢¡mf
zp£}{
srukpnu|tnqu||dply|}ssxn|
{§{{~
w~qpehyuup|b_pakt^qj{yylspex]nlsmrX[_`ak[PWXecgqqf]jigbgqodigeiizwuo
t{u
x
|x
zw{{rxjk`phtkromrgole|cnzwqlww~¢¡¨ ¦v«¡t|w
xyss{kspznwoq[Y~wu ¡x
m¡
i¢e~w~||ouplmop{
isqwuyfrnu{yyvsozy
¢{uwynl
^susqpyZ_qapk^pj}{qmmjlv`oojqmYYbabnXQTZfgcvpb]kndbfkn`gf`hkurspuxuy
ww
|{wjqc|c|nqmtjholvx_qy|uut~¤¦
v zrxtpr
tqvlpnvmw~nnUQ«xwrz¡x{¤|r
}hg
qw{z||kvjnkll{az~vzx|yfsks~
zpyovyy||{v}wpjl{ayqnmstV_pbra`lnzqhpffsthqkawe]Wfa`rSQO\fe]yp|`\irbbefj_he[gp~plqt}v|
uu~y{
xs
~|yxfrk`~ookz`jntu_t}yxts
}x °¥
wtwtqp
tprpkiwnn}}nusRMßÈÖ{puu w{s
¡wz~yufk¢cqz{y
|~l{espkkzy[yz}~{zgrjr
|k}~m~
|y|uwxrmgq
nkuphjunT_oepZ`lrxgkkbfxrppc_w``Vk_^vPNKagc]zqu]\evabeedafbYissnkrw}tzuv~s{r|~vesn}e~nplYlnyytav{{vrwwy®
w~}
txpyqoomoseeyq}mz}jhkc¤ÁÜ®ð¡rlvv
£o¡r£~zuxvum
|¢
^
m{}
v
}}k}dxujnysWz
y~yeri~kum}x~trwusqgvzcunqcjwhRaqglV_otzard_h~prnZcr`bVnY\xNMLdgb^wsn\\dy^`de
`cc_Yjrknksw~twxw{q}~{t~sguryl{ntqWqzvyrewyivr§£
}qxy
¡|{rwptjplim|u_axw{qu|h`d|ëÚµÉÃÜrltvjq
|{
vxru}n¡aj}}q~qwhvritwkZ|
}uarj~~|mkw
{|~npyukqlsy`ujo]kw`RerifS`pvtap`]hqsjWghbiXmV[uLKLeg_bss
j\\ey^^dg{ad_]Ykneojtx~ss~{vzs
|vw{ulwvyxtnxz}Xzqogywdv
p
¡¢torw~| xrtnodrifmxx\_y{{qqjafaÕ¶¦xnqw|qk{i||}ztz{qu
u~b
g}~~m|tkmwutwvkc
~|
p_qo{{~ypeyz|~nny~umnkl{~diljYnwZRjsibQcsxlbe^Zjnsb\h_dl`nU[pNHOge\goqmZ\cs`\clwde]]Zllcmjswqp{}txx
|uy|vpxy{on|w^tmizssgs|r vvmw~}v~vqpljau|gbjuz[`x|zmqecggW_qs¼Äwqstk{|}|u
vv}quqszf}r~g}{y}i}vfoyxswslj
xk]pwz}
{}qhx
wz|mkz|vtoih}we]qcXptSTosibNhtxfa^]XootYec]jm`pOYlRDThbZlom{oY[^mcZcpvdg\]`ljcliswqn~{tuz|v~xtsyy~oo{qiyz~nm|vkjxtk
o~vjyzozspljd`t{i`fr{[as}zgpzaed±²wKbZ¥ÚÑr{y
olzy|yxoqt}{jy¥
n~uw
p{~oxh
xr|e|~vcpshyqou{vxzk[o|r}
zqmp
qwwmm}vzehj~raZx[YrnNXrsf`Kmwub^[[Yu}rpXh^fjq_oNWiR?Yg_[pkgyq[[YkeYcqy_h]^elhfliqxom}up{v
qq{|zyukzlo~t}or|{poyf¡
gpgz~
|ixrkkf_aoym_boy]dlzaqv_deÕë¾2:>ryw
nm
u}
|xnv
wnku{uey§}msux~{x
lri~xm|{xbyqdqh~muqu
~su}roZk|sx{|wypkqw~~tmjvuu\iixqZW~SZreL[srf[Jqxp^[ZY\uuiYb[genbiMXfQ=^f]^vf_uq[YUodZeqy[h^`gmgikipx}mjyn{}zu
pnw~{{i{}kt|r{sw}zx~|kl~kh{~}kuqgic[cgso`altahpzast^bc n\5Z¯µuj~wuxpm
tyx}z~rgv~}oq}hvynez
¥}m}u~{|q|~
|i~mk{yjzvr`w~qdrgumu{}owy{t}lWm}uswuzwrmq}{|znmimun]hftrR\|N\q\O\sodVKsykXYXY`qua]]`gdhhfNZhNAad\`va\umXXSta[eosWj_bhkgmlipw|lh}|p~~|zwr{oqw{j~{nxyww}x~~zm£
{vykm
y}{}prpbf^Yg_pp`ahpfjotato[`djv{¾§¤É¸r
s}ytrsp{sutwyypcwyirufwvcj|}q~sx~w{lyzvhzilysizv}h`x}jjsh{jv~z}~q{v{s}aUu{qs{pwwoo}|w|{tuhqhlrp]hctoLfvL^oUTYsnbQOtybSWW\aps[a]heecjdQ[qIDdb\dq^\xhUWVw^\fniVl^ajgennhpwzniy}r{~y|v}pvsmw~q|xzztxzuo}~{w|huz|vgpn_d\XfYmsaaaqllhn`siX^cmw©Ù©Ç³rypv}zutu~wppn
txtl`zyeqogun[m}y}wzl
t~r
{muvnhwem|vmjwv|`bxzhuuc~{gu|tuqz|l~YVr|ot~wksxjt|y{wzq|rgtdmmt[k`vfIooL[cXWVxmbPSuvYQUW]`ro\`cmdc]ocT]rGBf_^fi]Z{cRV\u[[gkaVk``nfflqhpvxtkuvx}w{t~oququ~{wx|}
x|}~
{~svx{wuz^~ytwzbnl[b[[aUjtd`[hopgqaqfW\ck|Êι¢knnmr
r~
{zytzuu{jlvcvvog_|yeqjjqcXl{rv}{mpp
{yrrp~ghrcnxqjlqw}}z]ezwiuyfvgt}rjo~xm{\Xp}ls~{mnpvfv~~uzpys
{xqer`mksXk_y]IplNWV_TU|kbOTvsQRTV]bti\`kjfbYnaXcpGAh]af_\V|^OVeqY[jh]Xga_rfjhqgqswynt{w~yus
pp|xwuyz|u~}~~}|xvyv~}nuzdso
zudnjY_[]]Uhse`YdrrgrakdWZ_ix¾®z·nbtit|rz{~xxswo{wejo`usjb^~xxep}hkkZVow¤
qqwtlr
}yusoiyajmamvjgkkywzw[g~|xes~ntfvofkztltb[nzjszzet}mpgt~w|~pzjyzxwoelal}lnVkaxVLklOROiNY}gbOUvlMQTU^fvg^aqhgaWi]\kiJEkZbeWXUyZNWnjY]le]Zec^ufleqfsptxp
vx|
}vtnsy{{ss
y}v}{~{w|wvzjv~}lrq~pflgW][\[Sepe_XcruivpdebW[[hporsefzjuvtt
x
zwtunkzqbhkgtmf^_|oz}hmwfjdVWsp§}|vs{r{ylzzv|}uqsmhu]mi_ludgfizo{rYgwuhpxvbw
|njm{pere_kxfquz}auvikqtzoxxr{e}~~wunceal|mkVjcrTLklPLOpH^{eaNVueKOSW`kw~f]gsie_WcWbq]LKkXdbUTUsWMYveZ_l`\[ce_wgmbpitoq~utwxz}v~
nrt|{tq
zut}
|~z~v{£¥y
lu}{uzo
sz
}unjieV][[ZScne[Xbt{jhmh`aW_Ziikoglbi{zktuuo{}vvnzhjyj_eniwgeXbwi~ynioff]UYpi¨wz|xuo}nrtx~wt
vjsvhio\me^ns_gbjxh{m[mstjo~ywav
ysqoyqbph[mvcprzwarogixsqkwvtubz}vuoccbm||kkUibgTLnhPHRlEaxeaMTs^JMUYelx{f_mpjd]V`UooWJShXg^XMUlTK\z_\_k]][be`zhlaoovnowuz}wyzyz}qtt~zvt
}|ls{
}~{v¬zlrzvtno}tjonddX_ZZZUbjg\Z_ui^ml\aV[\keqt|ij]mxwhuxsn|~~zvslzhixg]dshzwccTdogvvfhiaWVYhd¨oxzpo{fxnyzvq}ndwsdii]lb^po[g_muezh]torkq{~uvbu
{wru~s`plXprapp{scqk`lzoigywtpdtyytqdadmr~jkTi^_ULucQGWbGcveaLTqYKLXXglvzeemqfcZX]XwfTJ\cXiXXHWeQIbx[]_m[^]bc^ik`otxmonvyr}~uvx}tuuyzz}jt{}~
y{~|sq®{{~fqzt~}vrol{~mzcpobe]eVZYWcfk`]]siXpm[^WZ\l{bqwulb[ntuhuwrnyzwootehte[gufvvz`]Sefjs|aci\TX^bd¥iyt
xlnxfwl{ytrx|xifwm`ha_k`^ukYf]oobze[w|knnpxytteszvoq|qawcZno`op{reqd^muicfxzrlmtr|rqa^emn}eiThYZUNy`RKZYHbtc`JUnUJLZVilr{cllscaZZ[aw\TKc]YjSVGYaNHjvX_am[[_bc]
ihbnxylojvxm~vuttqvvw}}~~px}yxy~ssp¢{{xduysyvktply|pr^po`gblT[ZWidmf\\rfRrm[YXW`lvdjuji_[nurmtuuk}|wonleiqc[krdtvs\WTd`q~q\bc^SZa\derqskjxlnoyyzqvszz{dfvh^c[ah\^wiWb^phawa[|vjjroxtsthqurjp{levW[ilapqyseo~Z`oqb^io|kjr}qovio`[dkl{agTgUXRQw\SPYRHcsb`GVlQIPZVklk|emora[ZXYlpWSPfWWiSTFZ\OIsuX`dmcX`ab]jdemzxkoiuy
{k}}y}mqovz}t}txutpuo¢s{{fwon|pgxq{lsvsk^tnagfkS^\Vhbll[\qdNom\VWUfithctee]Zpvoqvvzl}}wscekoa]nmdsxkZTVbcw||p\c_cTZ`Zccnprjgyneruqzkytuoz~v_gsd\_WbdYaufV_`mdaq]]~phisqtquvkm
|
qqfn{opnRZeidprusbluUbqk[^nd{dkt|qqqil_Xdijx^fUeUVPUoXRWTPHer_aFXkOIXTVnid|ikxkaW\V[tdSRWhQYgTSHZ[PNxw[_fmjZb`_^nbgkyvnnivv~~m~{~krgt{u~s}
{ss}un¤swxnz`e}qgztylmqwgd|mcfghS`_Ug`lo\^nhMil`UVSnfskfxde]Zrvns{ytn{w{zlbelm^`ojeqygZVX_lx{zo_b^hVY`Xdbkq|wkjvl[upjyiurno{sXko_Y^WcdXeqcT_biablZ`~kflsuomxvkh
zmpeo{lqlbX_ggnrsr^ilSepdUbmaxbouztjnkj_X`fhu]dWbVSOYgSO]OOHeo]cGZjNJ_KXme_xhn~d`U^T]u[TS`gN^bUSJ\ZQZvv]_fmhXca[^qchjxrsmgvsys{~|yntlst
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBKzlnmnnqI,00//,I
}}{{z}~||~}}}~}}~~~~~
-hS7¤¤¤¤¤¤£r]____aR455553?weggggk<;|}zzz|}{|~}}}~}}~~~~
|y{z||{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{||}}}}~~~~~~~
~wxz{zz|||{}}~~~~~~~}xyzyy{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|{{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}|{}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz||||}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}~~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~ysxrvy|}|z}|}}~~~~~~~~p{wvssvx}~|y}|}}~~~}~~ul
rx
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~xmutv{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
pbgxsou
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwr\bi\bdkghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghh`ctl^jngdbcbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z[kskamtneYY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROM[eokZistkRQSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMNXbhmnopqnSLOPPPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKECFIVcfgqnmhg]QNNNOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEEKMMR_jmhnmmjhfcccZLJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>ET]_cilnimlljjkjg^OGEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;;GV_npqkmkjimgXIEEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;;<=QeqrsolhXE@?CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:999<Kn{qVA8:<=@A@=;;><=<@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyz{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;====<;Jle9:;==>?@A@??A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@<\n@>DE??A:F_>>=;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{||~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mwH8;:==A<Kd=<=<8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR<<=IMFFuwM788:;>>WjA;<<::;>??==9:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;]z|wW<=?==>FhtL:=>?==?AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAHrykb}^>@C@A=Jr{Y:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBBC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot}~}
vMACE@?>Y{]?CEIJIIMMKECFGGEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEDCWu~XGHJMLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHFHFQnnpqruvy{{{z|}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLMLMNLIGGGGDGGGGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl|PKLKHGFFDECC@@CCCCFFEB@>>@AA@BD?>?DFHDEGIJIJHHHGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJT
uIIFB??@???<<<>;:<AA@><998<<=;>;8;?AB@ACCB@AADDBCFHIHHHKMLGIJMMNMJJKKJLLSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIe
fBB=88::9878896479;<:8557789787588;;;=@;999=<>;<=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIh~T:8656766656773568:876565676768:67889;7578979876:<@GFIFIFEFPSRSSROPPRTeqqsttvy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBe
G566468874578567699776765:9:::;798987779:98878689;A=>>BA?AKLOQPQOOORWkqrttuvz{{{}}~~~}}}}~~~THGIILMKJKKLIH?@A@<:579897;B:=q
z><:8;<=>9::;8:;9:;::9;:9===>;;<=:=;9;;<;<<9:<8::::999<?<<ABDIJLKIKLWorsusux{{||{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
oO>>BDEEBA@B?@BA@>=>>@???@??==?B?AA?@?=@@@>?A=><;:;99;?=;<==AACABCAXpqtttvz{{}}{}~~}}}~~~~~~~REBAGJNOLIGK:8:;9::<=:;;==?@BR
c>DFJLJJFGHEFGGEBA@CECCABCB?@DHDCECEEAFEFDEFD@B><@>=?@>?>?>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CCFW
VHMMNLOJJKIIJJIECDFGFDCEFDBHIKHHGFHGEJIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLKABBA98<>;<;>@?A>BBGGJY
PNPOMOLJLJIIHJFDFHHIEEHFFELLMIJGFHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@87<;<=:>@>?@CFIJQ_
rNSQONMLMJHGEIIEJHGJJIJGGGKLNLMHHIJMPNPNMOKIGIJHIDIHHFFGGIGCBACUnpuwwyzxyz{||}~~~~}~}~~~~~TDAABGHB?8?@8:<8=>;=A>?ADHJLUq
`TTROONKJHFBGJGLJFKOLKJJKMLOPNHIKLOQQPQOOJHJJLJKFGHGFFHFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
}YXTTUTOMKJDEFKONOWUQPOQSRMSTOMSLPSUVRSQPLJMMMKNGGJFFHJDDEEBECcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BBGVNFNPPTX{
iYWkaFTQQPI;;RSR`u]UVTVYYRXXRZfPUWZ]RTWQOMRQPPQKKKHHJHEFIIIHIirvyxyxz{{|z{|}|}~}}}}}}~~~SHJIHGFFE??AAEACGEDELXRMTUVX[|
}am\eU:YYXSQ?@VUY\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXTTVTOOMJLJIILMKOMSosvxyxwyyz{z{|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~yopY[\[RTRVVT[ZuYU}a]X]^WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~gYY\YTVTWRQWVcQerXZW_hP`f[[X\gaGOZhg\[\]]WROSPPQVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[SSQORRRUSVTW_ux
}|\QVXURURQQLOMKfy[]TYUV]ZLTZUST^ZXWWWzkX[[\^TQQPINOWVX[Zdprvvttvxyy{{|}}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRRUcdv
~ynqVJLNOKMKHJDEIEC>TdURQQNKQTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquuusswzz{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRUTbs{|}{{
u_]LD?CCCCB?DPBC@C=CIGV@HNLG]iPHFNFDEFIGHCDHGHKGDBAD@OQMRdrtvustuz|{{{{|}}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OOOLQSQUYSUQQTSOV`klrv{{xytrnstsyx~kMG?@;;>@@??>kPKaEFHIEB?GLNGMQUIAE??<=<==?=?ACC@?<=B>JNGUnttustvxz|{}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNLLQRQTVTWRQWVPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeC@@B=:BCBBDB\]O{NONNKLMOOQLKMWMHG@A<977599=;;;8989?<BH?\stuvuvwy|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIHPRQOMPQNQRTVXSRYTNYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHFFHBAGIEEFDMRPaWRWQPSSRU[OOQVPMIDF>:96587979:365795<C>essvwwyy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZXMLTTSPQUOLRSTWXTTXQLWYZVXXVXY]WXXhsk]Vaskba_^da_^YTQNNNLIHJLIIFCQPS[WTTNQSYS\eUOSSQNKIHC?A9998978857578599Gmqtwxy{{|}}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnpppnmd]__YWOPXVVSTVOOTVXXYSUTLKTVUUUWPSUWTUR]n^RNY_[VY;DVXT[fJLORROMMNNNMJFQPUYSTOJNOUST\VRUSROMLIHHF?>=:787659967665Wppswyz{|}~}~|}}|}}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpofedc\]RTZVWUTWTRXXYYYRUOJGOPOOMRJPPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPRMILKORPRRSTQROLMKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHKIFLMPMG/E_R>3?>joaRRQ@GUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptuy{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHFFHJMLEGCORC8ENS]gSPSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Sprtx{z{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTXWUMLKI<987;>@><=A@B=>EHGCFFIGJJ@FAA@FHEJOHQRa\QPROSOOPLLOMLMLMON[WKMQOGIHCHJLLJFFFE?BC><BG?B?Adpswzz{{|{zzw{wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHDD=9779?B>;?B@@>ADJECGGIFIEBB?>=CBAGIENObeQMONWKLMKLMMMLKONSdNJLRIIIEAHJLMNJGIFBAB@?EFEHDKnovyyy{{z{zwtxux||yznqrmnorrvrsx|xvvmpmsputlpprooorvvrVVnqglyjmqrnnjhoHJCGMMJMPMPOHJD?A=98::?B?<@BAADEGJFCHIGGHCC?B??@A>DECLNRTLJIMTGIIJLJKLIJLMOPRPKGCLGCBJILMONIJIGCCCDIJMLIYrmwyxz{{y|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqGKDGHHGJKIJKDGB=>=:9:;AB?=BBCCGFIKJDIIFGGCC;A@B>@@CEDIMPHHKGHKDHILMHJLHIJLKM]RHHDNFADJJMMPMKMJKFGGJMNQNLbmivvwzy|z}rmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKDFEGEFFGEGBC@><=9::;@C@>BCEEIEIJLFIIGFFDB;ACC>@CCCDGLNHKNHDHEILNMGILGFGIILNKIGENHCGMKMLOMMNMKHHIORQRNRfffqosxu{z|lhjoekqlspfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFECCBE@DA>?>:;;=:=>CA>ACEFJFIHLHGGGFEC@=DEB>ACCCDGHIGMPJFFGKNOKFHIFEDEIJHJIFHPKDIMKOMONOPNJJILRUUROWd`amgproryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHEEHCBABD=BA>A=::=?:=>@B>@BDGJEIFIHFFGECBAAFFCBBBDEEGGIFLQLIOJJLLIGHEGFDCIIHKJGKRMBNOMQNOOMNOKKKOUWVUSX_^\iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGHFHBBADD<A@@C<89=>9?<?B@@@DFHEIFFHGFFDCECDIECGEBEGEFGGEJMKHQMJKHHIEFHHECIIIKMKOSNDQRPQQNPMNPMLMSWVXWUX]Z]d`hbjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqinyMHGHHBBBFD<?BBD<7:>>:>:@B>??BEFDGDEHFDEDDEFGJEEJGCGHFHGECFJJGMKLKHJLFIIKHEKKLLNORTPHSUSPSOQMNQNMPWZVZYVZ]ZXa```^hec`dfhgjhhifhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprrxNIHGICACHE<@EBE=9:>>=<<AB<?>ABFCECCHECEEFGGGIFGKHDHHGIGFDHKIGKHMKJKLHLKMKJNLOOORUVOKUWSQSQRLOQPOTYZY\ZY[^^^`c^\ackb`dghr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptMIKHJFBEGE<@GCD@:<>@?>?BA<@>AAFCEEDIEFEGFHHFHHIKJFJHHKHFFLIHHJGLLMLLIMKMMMOLPPQUVWOKVVUSSQQLORRPV[[]^[\^__a`ad]c`ef`ehjcssfjgglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJJLJLGCEDE<@FDDC;??A@@@CA?B?ACHCFEFIFIFFEIIGIHJLHHJJILJFJKHIJJGKKMMJJMLNNNPLOPRTXVMNTVTRRQPLNTSRW[^^_]]`_`aa`acebdhbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvnwKMLKMGDCAD<?EEEC=AACBBCDACDAAEGCHGHHGJGDHIGHJFILHIJMKMLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSPW\ZRWPNTUTTXZ_bb_da^`b^`eaacinhcihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBCEGCCIECIJJIIKGEKJGHJIIKHJJNLNKILHJLKZfJd\KlSHON_nUks[qpbwcSPavuhucav`Xnqbdvinzf[lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDBEEDFBFFGDEJEEJMMKLLGGMIGJKHKKIKKNLNLLLILML[sbdp^lmUMNfs]gfqlntgpi_aYnnbppbkjjgoqtetno\ougpMJqyvkb`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprvtqsstuuutwxvutbmukpplrrqzKLIHGED?AB@>CFGBFCFEFEDCHHGDEKHGLMNLMMFJNHJKJILJJJKLMNNMMJNMM[roonpplkMPQlWNibtrpamnu\YlQ\mmZqmkomxxtsip]_rkqjUuyxpc^kfbgppjjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGGEEEBBB>@@FGBGDIEEEBFIHHEGKJGMMNKMNGLNILKIJMIKIJKOPONMLNNL\hdu]lqWlNPQmUZk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadjuyknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHLFIDEECAB=BACGDHGLHECCHKHHFJLLFNLLSRLGLMHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt]nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtontsvsHKHIBEEEA@>DDBGDHIMIFCFJLIGFJMLEOJKWRKGKKJNIIJLIKJIHJMMMMIKKKSkc[i^_icrrZ_Yjo_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxtunqunwqrvtwrGGFIDEDFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHKJKKIHIGKKKLGHKKLMMLJKMNT[\TPTLPONOOVQOOQNOQJINPQdqiTYW\[\UY[]X]\\cfaaebce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFFAEC@DHDFGCIKLHFDGKLHDGIPKLOKLWLIEEHIJHIKIMJHFGGIGHIEFLIJLOLIP\W^P\[`^MXYS\\b^MXZMXaRJYaZR_d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstxyyxyxwxtqxrxsqrurtOBCELMBDCBEIEGGFKJKHEFIJKFEHHPJMMJMRIHEAHFJIKLJMJHFDIFDFGEEJHCJMKLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_c[`^[TXWY^]cbbacehekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIDBBCGHFHGHKIIIDGKKKEFIJNKNLHLNGHE>GGLIKLKKKIGDIDCDEBFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQYZPZ_aa]^ca`bbbcceZQYVU\Y]c`__cdbhomnllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKFCGEBEGIFGHHFFJGHGIKILDDKJMMLLHJJHJF?GGNKKKMKKKIFGCD@DAHIB?IJHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTR[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKJFFFHGFIFFFILJNFDKKLNJLIKJHIFBHIQMLKOLJKIGGED?ECHHABGGET]Y^X_Y_[]UXXO]]QKJV^X^[]UY`RQ__bb``bb`cbaddaXOQQQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAHFDGMRHCQJFHHHEFKJMPEFIJKNLLILLHIGDHKQNMLPLLJKHICDAEDHGBAGEDWUE\T]SV_XOTUNZZMIJT`a[_X^^a]OYa\``_bcb]abW__TPOOOWQ\[[\\^`bffelfoow|{{}
zo
~INFDFFHDIRbPCV^IGGHDFMKPPEIIJKNLLLMKJJGEJNQQNOOMNLMHKADACDFDCBEFBMHBKKOONLFMFGIJHGLKMOPILOPOSOLPSRUZYWYXXdWOSTPPNMOTRZXXZ]\`adecgcklpsrzy{z~{}{
}KIEEHFGDKM]LGGXMHHJHGMLQQHLKKKNMUNOKKKGGKPSSNPONONNGKF`ED_LEfdEM[I^[rmOMUmYLDP`UkWgJ]XU^DLQULLSVQRTXWTXUT\UPfZhhdXRjRVUT[\[``abbb`fhfnkhrz|}~}|zr{z{
~z{LIFGFHEEKOSIJF`THIOJIOMRQKMLLORUROOIKMGHMQ[YOPPNOOOIJQQI|YYqtYQmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[`VVXjtuu__v_Xa[[f[_`aaa]`bgmpl`pwtx}vxzlv~tx}|~|z~wwNJEHMNBDLLGILEQVLKNIKRXWQMOOMQTNOQPKKNGMPS[ZSQROPPPJHZx]TxehZSURvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essosr{|o~xnr_``baZ``gknkblfgmw~~{xwtvzir~ns|~wx{~x|u|||ssNKF`]GAEMMHJKGJPOMMJNV^YULQSNYZMSSRNKOHQRSYWVPTPPPQKHgxlcxrm[KNVypumubnvPdeJfvqmwojfxxiWrQhzmijzz}lxzohoYvvjuup`rf}ilx|o^__ba[]cdgiidgbcdllppstsssyqrxblugqy{srvy~suzn|}ywrnNJSuNCBFPPHJKIKPOOOMPZ`ZWKTWPa^RVQYRLOISTUXWWPUPONRJLrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^]_ddighee^abiiijknokqnmjpacfcowxompsy~nqpj{ztsomLL[VHGEGRPILMJKPQPPPPW\XUMUYUeXRRY^SLNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_[pz{^`zscroxqhd}ir|^TLl`vukiu{{m~xk|p\^_b[^bddgeeebZccikkrsrwglihdg`akagsrlgmmr|kmhk{tmmkmOGKKIJHHQPLNOLKRRROSRWRVTPW[VVTTTa_PNMKTSTQUVNNLMOPJHQNPULKLSTSSTPVUQQNQQXYRNPUTXXX[ZURSW[WXWZOSUWXXR^YW^VTPYRWWWWX^[gr^[[Y\]_cZ_ccdfdccbZccffemnmueegcaf_]g`dlhfgkhpzhggkujhgilQIKLMMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYWOOKMVTQNUSNOMLQPKJRQKQMKKPRUSQRSSIHLNOQRQQQTVRXW\WSSPRTUVSZQNSRXVTYVTZVTRUTTUWXV]Y^`]\ZZ\\_c[]bcdfdddaY`acabhhimbad^_c]Zd\bma^fefmsdihkkedcfhPJKKOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSPPJNWSPNUPNQNLSPLOUSNQNMNQUQUQRTUNKMOQTTRRQVWUYZ[YSURTWWWY[TPTUXUUZUWZVSRWVUW[XZ_\UX^\^][]`a^[bbcgfedbX_ab]`gdfea^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPLMLPQLOTOOSQOQ[ZXWX[YXYV\jdVXYZWVSSOJNVTPOTPPPNLQQPRXTQQOMOSVOWRTUUONMQSVUTTRTWVZ]\ZVVQQVXV[[WQTWVVVYTXXVSRYWVZ^Y]_^U^\^`\[____ZbbdhgddbXa`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQOU\ZZW[[\XZ[dqmhd_[YVUWQLMVSMNROQROLPSRUZUSPPMQXWRWSSSXMOOQTXVUUSUYX[^][[VROUVV[[WRTWVWXVTX[TSRZXW\^Z^_`Ua\aa]`b_]`]c`cghdf`Yc`a__ed_`c[Z\[\YZYXW\Y\[`^_[^^a`^b\Y`ZQNONVQPTROUTSPW\\\X^\^V\^jqwyc\[UUXQMOVSNQQPRTRKQTTYZWUOROSXWTSURRZOPSRV[VVWSVZX]^[[^VSNTUV\\VRTVVXYSTY\USS]XZ]^\```Va[cb]ac_\bab_cfidf^[d`a`acd_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUTRQWRTP[^^][`\`U\]hjr}slg\TWWQNRZSRQTRTUTKRVV[ZZSOSQVVVTOWRSZRTTTX]WXXSX\X^]YZ]TUNVWW^[XRUUYYYUWY\UTW^Y]]`]bb^Y_[ea_dd^^cca^efidf]]da``abd`b^XZ_[\[XXXWW[Z\`\[[\[XZ[^V^Y]POORZP[TUVVTTT^^`^^b\`U]^bkytl}kZUYUQQS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[YUZ^X_^Y\YRWRYYY_[ZTUVZYZWXZ\VUZ^\^`a_dc\^]]eaafd^^dc`\gdhedb_da_a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPWYQ\UVYWWUX__aa`c]_T]_beeuzhXYYSUSV\XWWVVW]XOU]Z^]\TRWSWVUSTXRSVTXWX]^X][V]_X__X\VQYTYZZaY\VWX[Z[YYZ[XV]_`_cbadd]b\`fadfd^_dbb[fchecfaf__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNTYVS\TVWYVV\`abcac^_V[`da_zuohY\ZUWTW[ZY\YXY`WPV^\``\TTXPUWVTVWRSUWZZ[_^Z_\V__Y]^Y^USYWYY]bZ^VW[\[\[[Z[YY__``dccdebdYafcffe^ab`c^bcidcg_g^abcaa`^_XT[ZZ[[X[XX\[Z[WWYXW\[\`]V]]SOVZVVZUXUXWX]_badad`^YYadb`lfh^[][VWXY\\\_[Y[bVTX^]ac\RVYPWVWWWVSUTX\\^``]`\Wa^[^\[^XVXX[[_`\_XY\\]^^\[]X[`a^`ecdeefbXcedhgd^c``ec]eidei_f]cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWZX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cYZX]`cd_RXYPWWXYYWVWV]]^`a`_b^Ya]]^Y]^YXUW[\`^]_ZZ^]^^a]\[Z\`b_becefefbZdffigc_c^afdZiicfice^bbca``_]]ZX\YYXXZXWZ[ZYWXUU[]]]``bbxKXW[YW][\]ZW\]_`bdaba]`Xbcbacab][\[XW[]_]`_][`d]\XZbecaR\ZOXXZ[[ZWZY`]`bb`ac_\b]_][^^YYTX]^_`_`\[^^`bc]\X\^`bbcedfdefd\efgifcab\cg`\iibhied`baca_`_]]\Y\YXWXYXW\ZZWWXOXZ]acffrkJYW\ZZ_\[^\X][^_acbaa]b[bdb`bcb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]]\Z[[c`bbc`bda`c^`\^^^ZXV[_^]aa`^[`abec_]T]``cddfegeffe^efhhgdd`[eg^ahhbhhfc`b`cb___]][Z[YXXXVZV\[[VVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{{{{z{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{|||||||z{{{{zzz{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½E>????;þ¿¾¾Á¢~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊ:23333.¡ÒÌÌÌÌϪ}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxyxxxxwwwwwwwxyyyzyywopppppprrrrrrrwzyyzzz~|||||||vuuuuuu~||}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvuuyvvvz{x{xwvwzwyyz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{|||||||zyyyyyzz|{{||{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwx}y{{y|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww{yy{x|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww{yz{w|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzw{yz|y|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyxzyyzyyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||
{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttssrqqqponnmmmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssrqqpponnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwppopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrrssrrqpruppoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqrwtqrrqnnppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqprp
rqqo{~npppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqw£pqq}oppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqrs¨o{¢~pqqqqpppppqqqpqpppqpppppppppppppppqqqpqqpppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrq«p£~pqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxwxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrsssssssr±ª¦{ssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~~|vvwwvuxzxxxxxxxx|©¯£±¯|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~||||{«¡´¤©z{zxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}}¡£¯£~}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~°¡~~~~
~~}~~~}}}~~~~~~¤£{}~~~~~~
|||{|}||~~~~~~~~~~¨¯¦¦©¦
|}||}}~
«¯ £¢¤ª«¥
}||~~
«© ¢¡
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{
~~}~
¡
}~
~}}
~}~~
~}~
~
~~
~{z
~}}}}~~|{|
~}}~~~~~~}~}}}
}|}~~~}|}}|y|
}}}~~}|}}{zz~
~~~~~}~}~~}}}}~}|zy|~~}~~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~}~~~~~~}|~~~~~~
~|~~}~~~}~~~}}}|{{|zzyyy{~~~|~~~~}|~~~~}~~~~~}}}}
~~}}~~~~}}}}}|||{zyyyx}~~~~~~~~~}~~}{|~~
~}}}~~}}}}}}}}}{zzyyyz
~~||~}~~~
}}}}}}~~}}}}}}|}}|{yyyxx}
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yyy|~~~
~}|||}}||}}}}}}}}}}||{z|yzz{|~}~~{||}
}
~~
~}}||}}|||}||}|}}}|||{z{|zyz{|yy}}|{{~~}}|~||}
~{z|
~~}}}||||||||||||||}|||~~{z{zxz{{|}|~~~~~}}}|}}}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||}|yz{{xxy{zz|}~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{||||{|||zzy{|z}
~~~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}
~~~~}}||}~}||}}}}}|~|}|{}||z{z|}}
}~}~~~}||~}}}}|{}|~~~~~}|~}~~~
}|||}~{{}w~vx~}|}|}~~z~~|~~~~~~~~~~~}~~}|~}~}}}{|||z{z}~|||}||~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|}~}}}{{}}|z||~}}}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~||}||}|}~{|{||||}|}|}|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||||||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}}|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~~}~}|||~}|}|}}}~}}~~|{{{||}|{z{{yzzxy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~~|}}|}}~~}~|}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~~|}||~~~}}}}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~}~~|}}|~~~~}|}}{}}}|||{|{{{|{||}}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~~}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~~~~~}~~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{sy{|pwuvwyutz
}}}~}~~}~|}}~~|z|z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
|}}~}~~}|~~~~}}z{{|||~|}}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z~y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~}~~}~}~~~~~~||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}|~||~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~~~~}}|~~~}|~~|}~}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~}}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxzxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z||{zxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}|||xxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz{}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}{}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysrtowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxqytvxtw{~
~||}|x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||}z||}}|z{~~~}}||}|vrvxxvtvu}
}
{||}zz|}}||z|~}|}}~~~~~|}~~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}~}~}}~~|}
~
~}}||||~~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uz~
}y|~{
}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r~}}~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwmzsnym}rsvsvmnwlpylu~|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoolw}xpqzprtfu~n{ysoy}~{~|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}{}{|}|~}~~}~}~|}~~
}x
~~{|{~{||}}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~~||~}~}~~}}|}~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}}|||~}|}}|}{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~||}}|}}|~{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{||
z{
}~~}|}}~}{~}|}yzzy{|}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}}|}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}}}}}}||}}|
~|~~
}~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z||||~~}|}||}~
~~}~|}~~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~~
~~|}~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌÌÌËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ØÙØØØØØØØØÙÙÙÙØ××××××××ÖÖÖÖÖ×ÚÛÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;@<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸·©§§§§§§§§§§§§¦±¾½½½½½½½¼¼¼¼½´½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVM<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§££££££££££££ ¬ªªªªªªª©©©©¬TSSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;<B@8<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥¢
««««««««ªªªYXXWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<<>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©§±¯¯¯¯¯¯¯¯¯¯¯±¡cbbbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÎÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÐÐÐÐÐÏÏÏÏÏÏÏÏÎÐÓÒÒÒÒÒÒÒÒÒÒÓÓÑÌÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÑÔÏÏÐÔÒÏÏÏÓÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ×ÖÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÓ»ÏÑȧÒÑÇ«ÑÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒµ´Ñ¬°Ñ¬²ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÑ ª¯ÍÄÍÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<96?B?B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÑű׽ÉżÉÅÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÖ§±ÕÒÎÑ¡ÏÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<==964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÕ¥±Ù°ÃÚ£¿ÕÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÖ¥²ÖÍÇËÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÐÕ¥³ÖÍÛ¥³ÐÛ£µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHGE@<<>><==<7569969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÐÖ¦´Í§ §»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@C;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÇÒ×¥´¼£¥¨ ¯§¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÑÔµÄÕºÕ¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<<?GEGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÑÃÔÓÓ¹ÇÕÓÓ¹ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA=775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÔÒÒÒÕÔÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:69896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<AA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCDEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
¼ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿½¾¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨§¨¨§¨¨©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦§§§§¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡ ¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¤¦§¦¥¥¦§¦¥£ ¡¡¤¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡¡¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢£¢£¥¤¥¥¥¤¤£¢¡¡©ª¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢¦¤£¤¤¤¢¡¡ª}~¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ±µ¤ ¢¡ ¢P¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡ ¡§±¢ªbL ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ª}®¢ §NS ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¢Y«jUU¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¢mc ¡i`X ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¢si¢£j_X £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢©upj|h_\¡¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡£{lkope[_¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡t~ £xeU`¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¦l±§¤xca¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ ¥ x[k§[t|v
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v¨kTPrN]tx
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{¨z;/<xzyG:Sou
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~OOT?{nfN;5Ppz~
¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
¤uSxP|yRh|R\u ¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~aÖÀ_¦¯¤¦pqVh¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢£e¿ÐÛ·¦À±T^wiU ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©ª²s³¯ÑÅ¢¬qjÅP{¢¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¦©§¨¬~È೪tF®±[p©§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\dc[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤¨¦¤¥£¢¥¡o±£tczum¤¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^edlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢ £§¡¦®¦¦¨kQ~vtopst~£¡¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡¨ª±²®¬«©p_Hounqvkiehfgqv~¡¤¥ ¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\U\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¡ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯·µ³¶º½»¯jcWH\kfjqgcceZZabkuz~£¦ ¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²·¾ÅÍÐÇÀµ¦w^]SG\tkjqe`ciZX^Y^enpqtx
¦®§¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvkqhiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ¼ÐÜàÙÊ»¯ yc\^SA_ljqwgb^g^U\\[[^edbcn²É¹¡§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSai`ftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃÄÀÎ×ØÎº£|o]VXXL=^bhtrmbaf[WWXXVXX]q°Å˺¸·©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆºÄÀÇÏÒǦ
]OKOSL=VWhb`qha_XZWXVT^±Ä½³´¶ªµ²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklgnurruqg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÃÃÆÆÁ¶Ç³\SVPCVS\afpeX[Z^XYg¯¿º¶¦©©©ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxoyjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÃÄĹ´¿¹»Ê®y]PNW|tUTXWYa°·©«²´¬®¥¥£§¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyy{wnkihvZfrxsyff^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÄž·½Ãò}VLpw¥NQS[t µ·²¬¸µ³¬©£¡©¬§¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh^jonyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÄÇÃÇȰ`X¦HLm³Â¼¾¹¼º¼º¼¬¦©»º¹·¿²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvijjtnyl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÍÅÅÅÂÅÅÍÐǨEm¹ÅÉÍÆÅÁÄÇÁ¼¾´±°°Â¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`kjwlifuotc]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÁÁÀÁÅÆÉα^iÄÐÇËÏŶ¿¿ÀÀº»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfefckdbkmno^Y]VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ½¼ÁÁ¿ÀÉ?ÒÌÅÈÑÁ¯½½¸¹»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfaebaccdjcgc[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÉÎÁ»¿À¼»Ä½ºÀÄ¿½¼¸»ÀÅ«HÌÄÀÀÉ¿°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabchjggjej^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÔº¿»ÃµºÇ·¶¹»¼¸¹µºÃÉ©LÉ¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeefpjelhXYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÄxªË½Ç·¹¸¶´·¹³µ²ºÅÉMÊ¿¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knqgqktfbn`\THKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄ×®u¼ÈÏÂÀ¸®µµ»½·¹±¾ÃÇTÍÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljnuoxchb\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÇÉÒrt®ÑÑÌÊĵº¿ÄȾ¾´¾À¿avËÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltlln_c_abNHN?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÊÁst¦ÌÌËÍÊÆÂÃËÎÁ¼¸¼º°xqi»ÈÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qc[_`_TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»«Úþ¶¾À¾¾º¦ª²¶ÃÀ¥ywzÄÆËÈÁÃÀÀÉÊÁ¿»¹²¢u®ÈÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp^\_]ZRFEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Ä·mν¶¹À¼ª}nhnmrtx}½¿ÆÀ¹À¼¾ÅĽ½¸±® ÊÂü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmu{qoj\``ZSPAFIGK@ECI<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀͲu³½¶µÁ¤iZ^`MR[[otx¢¸¸Âº³»·»½¿º»»®¢¢¦¾Äþ¼¿»»¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvwoqa_f][UJ=??GG=GCC9:5;99><<9:<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɦx ¯µjfgVY`IIMPTmx§°·¾¹²µ²¼¹¼¶¹¾µ¥µ¥vÉÄÀ½¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Æ©|v¡_SCXUGajVOEJa¢¯¶ºµ´²¬¼¹¸µ¸Á½¹«®u¦Ë¿¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨ª¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovsnc^gY]]SONA>JB@JJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿´ynNK?dYBNwiMA]°µ³µ²´¯¬»º¸¶¹¿Æv°¤f©¿¸µ²±¤¦§¤¥©®¹¬««¥¨¤«®¯§°«¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmujl]\kU^\PNHDGMBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶|XFAOYJJXwb@S£¹³´²°±°¹¸¶»·»¼£³¤t¬°©««£¨¡ ¨®¤£¤ ¢¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wryhutneUadW]ROMI@IRDNC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼©hM?RxqPIIKhZER®»±¬³¯®¬¶¶²´µ®©§¦¨ ¨©¡§¤¨ ¢¢¡¥¥££ ¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦¡x|vzcxmn]QiUPOGPMMCPQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Âª¥½hDRQWIJ`JUadc®µª²´®ª«¯°²³¥ ¢ £¤¨¢ª £¥¨ ¡¢£¨¨§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}mk{dhVRdNJHGOSNKNH<E@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© ªÆ¿Ê PAsvOmJKcfts`\`r±¯®³µª¦¬«¢¢¢¤¤ ¤ª¡¡¦§«¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¦«ª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wy|eyz`bSUaHIJKSTJSQM9?A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÆÆWSJe¤Ze}or[Qkc[ea^k´°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvsilf[SZZMQKOOVMSMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yUiqvupcvvXWc`chZYWg®¬¯§¢ ¡£¢¥¡¤¤¨¨¬©¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³¶¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§}xvjxu]m[RaIRUHFUWJCMG=KI8E<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ £op`cXL[RZLKPXRHMMG¬ª©¤¦ ¨¥±ª§®£«®¶°µ²±®¶¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«®±¹¸¼¯³°µÂ¼·¾³³µ¢¬¢©©²©«¨§¨ª§ § ¨¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmim\X\CWNJGMHCFN=>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£bW^e`WMQG=>?CC?>BQx©©ª¥¢£
«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÉ¿°¹¹½¹Â¾¸´»ÆÄ½Ã¼·³ª³ª³´¯³®ª¯£¬¨¶±£°¦¡£°±®°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trklurqhW\QFUHDJPI?EB4FH95<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`QFD;C>F<?96N~ª³§££¢ ¥«¦xm ¤¢«¬´¼¶Ã½¾³»ÁÃÂÅÀ¿ÂÆÅÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÊÉÃÁÇ¿º´º»µ»·°¶²ªº²®¼¸¿»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxjeZ[FLMEDTMECE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}sjaWNE>IY|oaB=\®¬ wrqmp¦®´¹Å»ÍÇ˾ÁÌÍÍÌÈÈÐÌÌÌÇÊÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÁÆÆÆÊÈÏÀÉÑÍÇÆÈÆÂ¼ÄÁ¾¿¿¶¾³¿ÀÃÃÇÄÇį¿¹²¸½Äº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZZDOMDEPIDCA55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £jf]TID@?J
¤ ²£yqroly¤¶º¹¾ËÁÓÑÓÈÍÎÑÓÑÒÐÐÑÑÍÎÏÐÅÍÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÖÓÔÈÌÆÌÍÉÓÍÎÓÍÆÉÊÊÂÆÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÇÅÌÌÉÉÀÃÀ®¯³¨¢ª£¦©¬¤¥¦
{ruvgcgvjdVWRDNF@IQC>B=:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡bTLJDC?CR¯Ñ½²¯¦ ¤¡}xqkebhrpr{
upnqsp
³Ã¾ÅÑÐ×ÖÕÒÖÍÔÖÖÔÓÑÒÓÔÒÏÒÃÐÓÖØÕÕÒËÊÎÑËÆÍÑÊÒÕÖÙÖØÓÖØÍÒÊÏÑÌÏÑÌÓÐÀÉÈÊÄÌÌÌÏÏÅÇȶÀËÀÒÍÌÐÆÊÉÀÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpc`erc]R\IKGAEIJ>;A8>5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢¡ZI@ADAFQv±¯¦ wica____^__]alusppolqquÄÈÇÔÖ××ÖÓÖÐÕÔÙÔÔÎÏÕÔÔÑÑÌÑÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑØÒ×ÙÔÖÌÏÏÉÍÒËÎÑÀÆÃÈÆÏÎÑÑÒÈÌÍÀËÍÆÔÏÌÏÈÄËÇÇÈÌËÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨«¥²¨°³¬
|zqstmbcim_VQ`JJCECRM@<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£«fC8=>DXª¨}qecb__a_^a`^a`_`emppnkorvwÌÁÓÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÑÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÓÑØ×××ËÈÎÄÉÏÌÊÌÀÊÀÉÊÎÎÏËÐÎÎÌÏÏÈÌÐÐËÎËÃÊÇÉÍËÌÒÓÎÔÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¾»±
zvopokadnpaX\ZJFFDMXE;@=33<<87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤±{HFB;W¡k^^^adb``aa`a`^__^\bmroostuvy¤¿ÌÕÑÖÔÓØÖÎÎÓËÎÎÅÎÊÒÒÏÇÎÍÍÔËÎÒÍË×ÖÐÌÑÔËËÐÒÓÊÎÑÕÒÕÕÊÀÊÁÆÍÂÈÊÃÌÄÆÈËËÏÊÎÍÐÎÔÌÆÉÏÍÉÇËÅÇÂÆÊÌÍÐÒÇÐÏÎÎÌÐÅÇÁ¸¹½Ãýù³²¾±»Ãĵª¥¡yqrkmh``qhYXhVMGLIPQB;C>;68:8:;57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨ xlopw|eabb`]^aca````aa__][]grrprspmry¥ÇÓÏËÐÐÓÔÉÄÈÉÅÆ¿ÃÅÏÎÇÅÇÍÊÑÈËÎÍÆÑÒÐÎÌÔÊÇÊÎÏÇÇÏÒËÐÏźĿÆÊ½ÃÈÉÎÅÃÇÀÇÍÈÄÌÊÌÏÈÄÄÐÉÆÂÆÉÅ¿ÁÇÌËÌÏÂËÌÉÇËÐÅÅÇ»ÇÃÉÉÂÏÁ½¼¿°ÁÉǹ¼ª°²§¥¢£xoudk`^fqa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»¤¶~g
¢ª
}~s_[^]^`^`cdc_]]^_``_[Z\`lrqnokloo}¹ÑÈÉÊÏËÍĺ¿Ãº»º¹½ÈÆÂÃÀÃÈÊÈÈÊÈÁÅÌÆÈÊÍÉÄÁÊÉÁÁËÐÅËÈ¿¹Á¼ÆÇ¾ÀÆÏËÄÀûÉÇɼÉÇÅÊÁ¾ÂËÆÅľƽ½ÁÃÅÌÅÆ¼ÀÉÃÅÇÒÄÁÉ¿ÊÊÆÈÆÑĄ̮̃ÄËÇÄÊ·¿¼º´©¬¤¥¬£¡¦£ |wsufj[anmZ\XRDLGBGELDFS@54335@=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²°¶l^y|z
uxurp_Z[]``bcdded`\\^]^^`[YZ\bornkikposǽÉÅËÀÆÁ°¶¹±±³²±Â¼¼¼º¸ÀÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ·»ÃÉ¿ÁÉ»¶»ºÆÃ¿¼ÂÎÃÆ¾¾µÁ½Ã»½Ç¼Ãº´½ÆÄÂ÷À¶¶¾¿»Ìý¶ºÈ»¿¾ËÃÁÆÃÆÉÇÉÆÐÆÂÌDzÇÉÃÎÌÁÅÿ½²·°²§¨¨¹°¥°ª¬zvxkeh`hodV^YJFJFHKAFBFI@9:658853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÕ×ÍÊÎÅÉÅÇÁºÅ½¬®¦`cux}{ttc\\]^``bcbbdeb]\[\^\^]Z[\^hsqmggnory½ËÁúÀ¸°°¦©«¦¸´¶´³³³»¶½±·°´®²»Â¼Áļ¿º´²º¾À¸È¸´¼¶Á½¸½ÇÁÄ»µ¯²µº¿´Å¸»µ¬¹½¾À½±»¶°·º³Æ¼·¯»¿µ·µÅ¼¿ÃÆÀÄÅÆÇËÅÀÆÆ»ÇËÀÎÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJFBDAEE?=:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐËÍÈÉÈÊÉÊÄÐÍÒÏÍÅÇÁÅÁ¿º¸É·«°[gozx~vw|sh]]]]_`_`da^cec_^\[^[]^Z[[]_lpnifjmnr|¤Æ¿¸¸´¯ª«§¡©¦ª¬²ª¬©´¶±³©®§¬³»º¶Ã¹º¹°«´¹»´Â¹¯À±¾¼»¶¼Ç¹Ã·ª¨°²À¶¸½°±¨±³µ»¼¬®¶¦®¶®»²±ª¹°®»®¼¸¼ÀÀ¾ºÃ¿ÆÃÅÀ¼ÆÂÈ˸ÅÇÅ¿ÇÄÃºÄÆÂ»ÆÉÌ˳¹Â½»³tvwki`bliYWW[ALKMJEAC@FA:::996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÏÇÍÁÂÆ¿ÄÄÃÃÊÂÉÊ¿À¼Áº³µµÃ®ª°[i~{x}
z{wn^]\\]_`__dcbcdb`_^Z[ZZ]ZZYZ\enohfgiknrº°µ¥£¦¦¤¤ª®¤¨¢«ª¬ª°£¦ªµ¶±¼¸¯·¯¨®¸´´¼¸³¼¯¸¹µ²¼Á²Á¯¥©£«±²³¨½ª«¨«®µ´¦¨¡¤¯©²¦¨¨®¥¨·¬±³·ºº»²¼¾¾¾Ä¿µÁÁÇÈ·¾ÀÅ·ÅÃÀ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji\aodWVXPHZRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÍÃǹ¹ËÂ˾»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ¼©«cmz}~xt~|swe_]\\^_`^_ccab``_^]\ZXY[[YXZ\_fkfdfehkor
©¥«¤ ££ ¢©£¢¥¦§¦ ¤¦¬²¯··§°¬¨ª´«´º±¶¶®¶¹²°ºº±·¤ ¤ ¦±¨¬©ºª¥§§¨§³ ¨§¤¦¬§¤ ¡±¬²µ³´±µ½¶»ÁÀ²»¾ÃÁ±¹¹Â³Á½Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ xqlbf`ko`TY_HNhOTHFKF<=@=:;;826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;ȵ¶½¸ºÀº½µ ¡¦º¶«³³»³ÄÏÉËÂÆ¸·ÇÀÌ¿¸Ê·»Å¸³Å¸³¿À¬µ¼²¬¦¯´¡£ir
|xusomjiipi_`]\\\^__acb````]\[\\XYXXXVX[]_dccfgggkmn¨¡ ¡¦¤¥¢§¢«°±µ¤©ªª¬¬¤´¸·°¬³¶¯³µ¯°ª¤¢²¥¦ª¹¢¦¦ ¨« ¥£°©¬¨ª¬°³¹¯¸¹º°¶¼»º«³³¹³½´·±±¶µ¿µ½À½Ã»»½{sl_e^ddXTW^IW]KPGJJGA<??A;?<05535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»¸ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹Ç¸·¿·²Â´±»»¬¹º±¢©«§m~
xrmomkb^aff]]^]]]\]_aabccba_\[[ZZYXXWWWXXXZ]bddfffhikr§¡¡¨¥¦¢¥ ¡¯®¯²¡¥£®«¨¢µ°²²¬©¯³§º³¦¶¡££¡£¢ª¶«££¦¦¦£ ¡¬¨£¤¦«³´ªµ°²«³¹´¯«¯²²³¸³®©®²·°º¶º½À¸³±yuf_f_[YVSZUK[QLJEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÁÌÈÆ¿Å¶ÁÀÇζÀý³¹¹²¿¶±¹»²´¯£ª xxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv ¡¡¨¤©«¦¯°«£¤¸© ¯¨·«§§°¤·°¤· £ª¦¡¹°£¡¤¢ ¡©ª¤¢£ªª±¨´¬ª§³°¥«®³±°°¯¯§¨¨²®±´°¼´º¸®£zve_aWYXSRTKM^LPLGHLKE=@>=B<:7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´ºÂ±¾·½®§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bccbcbbcfi§¦¤§¨ ¦ «¯¦ ¢£·¨¡¡¢©³¢¥¨¥°¦±®¬µ¡©¡¢±±££¡§¨¡¢¤¥¥«¤¥°§¥£«¬¦©®¯¯«¨ªª³¦¦«¯´±®¼¶±°¯ {xseb\[]XNLQHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±¶½°»±·¬¥¦¬·»¼Áź±¹µÄÉÉÀÃÆÅǶÆÄ³Á¿Å«··½¶½º»µ²¬¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVURTRU`a_`a_``bdi£ ¥¡¦¥¥¤¤£ª«¥¥±ª¡¡¥ª¨¢®¬ª©¢¢¢¢«©°¢¡£¤¡¢ ¢¤¥£«¥¢£«¤«¥®²ª¦¥¦¦´¦ª¨³µ´¹º°«¬sqp`[WVVRFPOHZ\ORJTKSLEGJD8;;><9667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÉÌȵɼ±½Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURRNQY]\]]^^__bdm¡ ¨©«¨¬§©¦¤¥¯¤¥¯© ®«´ ¦¦£¤¡©ª ¡¡¡ ££¡£¡¢¨£¢¨« «°¤®¸¦£¤£¬©¨«¯´·²½µ³«¯
uti[XYRUREXLQ[XMUOQLQRINJB=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏdzĺ·»Âȱ¸¿·¼¾»³¶¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNOQYZZZ]\\]_`d||¡ «ª¦¯¬¨°¥©¡¤¨§¯§ª ¥¡¨«¥ ¡¤¡¢¥¥§©¨ °°¦±½¨ £¬´ª®§°´°¹µÀ±®±«~rtcVTVNRJGVPRRLLXNJLORGMKACFDD>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«©§©²°¤¶Æ´¹º³ÊŹºÁËÐʲ¶¸¼½Àñ°±·®´´»³´££vkglnqnrjokdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTRNNNRWXZYYX\\]aj}w|r
¨«¦¦¬¨ ¦£
¤£¢¥§¡ ¢¢¦¤§©§¡ ´²¨³¸¡£·¬©¤³²¦µ»µ«¬±£zsn^NQQMODNNNPKFNNJJNNQIMJAHLHHC>958889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤·±¥§¤ª¥ ©¦¤³ª¢²Ãµµ²³ÆÆ¶ºÃÊÌÆ³¬¹½´¸À¯®©°¦®»¯ |n__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXXZ]anosm
~¡£¢¤¥¢s~{ £
~~tz££ ¡¤¤¢´¯¬°¦¸¦¥°¡±®±¼ª©¯ªxtdVMRPPMCSNLPMBPQHINSMHJJDKMFKK=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-02764789::65:87A7x·¡£´¨¦¥¨£¥¥¦¦¦²§¦´Á¸¯´°ÉÄ·¹ÁÎÆ¾³¬ºÁ¬Ä¨¢¦¦·£ ~xfWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNTSSTUUWY[]iioj|zrMWq
_;Vo|s
y{}xqp}¡ §®©¨¨³¢¦®¬¬¨´£©£tn`[NSRWLDTJPMLFNOIELQMKOJIMPFIJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦© ¦©§£ª°¨§´Á¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÄª¢±£~sv]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKIFHNQQMORTVXZ`klfxrOA?|y`JQnx~
mwuvxpQ|~xvhw~¤¢¨©¥¤°ª¡¤¤¦ª¢ª¡¦¨vng^\HQQSMIUMSILKOIHFJNLMTKQQOGJD=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833989:99::::?9w¶£§¡®¡§¨¥§¨¯¬ª¶¼¶¸·³Á»¶¨¹È¸¶¨¨µ¶ª²¼§©~xqoXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDCINOhYNQSTVZnqt|hg[Ss~|
{vxsouqtz~«
zzhv{prmxx{{wssxgu
||©¡ ©¥§¤ ¤sib]]JWPRGKXROJMLRJJJLPHLQLRTMFIB<78;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¢vw|voojYKHHHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^t{weu|gxvx}q|w{ok~}tz|tfv|lohs|myq}qmvqhq~pD
wwz}{u}£¡¥xongc[XXUQJSUTOPNPVKNKOOJROHNPLFD<;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«¨©±¯±«¼¸¬»¾¸³¬§°§¬¥©¤¡
yvq|mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX]epqk¦ªÀ~txb{wn{yy|omytyjjq}Inhw~mjdly
krl|nr|imps
{~{wpttyyp|ojoooYVXTRQYORTTRXUMNHMKMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¤¯¢ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡sztotkpldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORVZQY\_§ahryd~olzvtltt|jjMy
f1vsl~~tfeu
filukp|hqq|n{t~}qqnumwyujyyxlkpheXRZXYY[MPUVYXNIHEJJHGC@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5n£¨±§º¯«²°Â±»ÃÇ
zqtyprpoodqg_TFIC><;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQULAIQIb¯²qzwk|lq
zyr txsu5q¨¡¡¢
vp||shgbjnrmpuioXupvm{}mrnp{svnbu
ux~}{sqqm`[]^\ZYa_RN[ZXWKHJFIG?CABG?CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®°®Á²»ÁÅ|nul{txxmwnwdj^IPG=?7449;;;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMQSDKu|{u~lv|}~u¢z~aªzw~s{]dqtz|wmhjbyo
zoxu
zptzxkni]v}|
}q}vw{|xqtufg`[[^S\g^WPTX[UGJJEKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À²»Åº{vk}xs ||p}zhvlRXL@E211366688:<>AEGFGJKMOQQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMOQLKT]YRKh{y{q|z|~v¡¥©H®¯®©tm|~hghyn
qHlwryvhmk_v}yzuv|xmow~uusm\^^[ccXgf\TPPWYPDLKFOICFCC@@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¬ ¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23124668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[??84.]ps£UFIKMMPW`XpY\^i
~
¡¡¦»±§»Çè¡¥|qw
ihptrw{v|nvuf ª¢zzypgkx{ule^[[^j^bg`ZOLNWRQIPJDNGCJDCADDA<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfwz¤¡¬¦«¯°¡xw|~mpj]B@4--//..02234778;=?BDHINQRSRSSTRPOHDB<87/9C><<63.lMPHILLKNV`cfgmt £ª¥¤¬©¶¢¨Á®ǯxº|¡
¡
lpuwqm
q ¤´©¢}kjj|uc^d`[gl]ll^WKHNRQMLLFIPCDMFBCEFB=997=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENORTPPQSQNPIED>;<:DF?><752<?R5HHHLLMNR^n|s}§¥¡¡¢¨¨«¨¬©ª¶«¿«¶ÈÈ·ÈÐϾ pi«©
¦¢xz~¢{w«²|£¡¦µ¯¨lss}}si`^b`bhd`gf\REJKPOIILFFMCHLFGCBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m|aw}{ªªBD}x|
v^bP460-1/,.0///..0015>AAMQRTQRSTRNSLEE@<>=FG@A@8662<9;FHGIJNOQYm
w¢¦©´¼¸¤¬¬¦¨´«°¶²±»±³¾³Ã«ºÉ˷ÿ¸¥¢°³¬ª£
¦¦ £¦¢«¨¥
¤¡ «¡¤¨±£¦·º ¢°¢¢£¡«¯¬²µ¢¤ªyz~ibi]fc^dd^gg_[OCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhbWioXz
v
ÚÈsV|z
qna@E64<3/110-,+-1.-4?CAMUQRSUUVUN[PGHE<>>FHCEA7;<5C;=FKIGHQOPW£²©±ÀÆÂª³Å¶«³¿³¸¾¶¿´Á¶»º£¸Å¨¶Éǵ¾¹´¨£´°±§¯«¥v¤¡¬²´ª®©®¶»²º¬°µ¢±«±µ»·µ®´ §¨£§©¯¬²¹·¸¦¶©¤x
wZceWgcbd`ag`[TJDDLUQHIJDIGEA@@KDBMG<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[YQbcWyup}u
{¿»£¼´y
zxn]V@EN<6:56AB764//6CHBQ\PQUWU\VP_UIKKA?>GKFFD;>@7D7?BJJEFVSP^¤£±´Âµ·ÁËȵ»Ä½³³À¶¸Áµ¿¯·t±³¥ºÄ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°®¦«§¤ ¬´»¢¨²ºµ¼¿Ì¿Å޽³Á·¹·¾·º·¹¬¬°¥°©½°¼ºÂÁ«¹§ª~~lXdbYkfjfW\cYVSIGFLQGCHIAHD>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALQVSYUZvjo~nzsxb¹¡£{z|}}wzueP\dGEL;Qca[^SF?;HPEZcRRYXZgYT``LSPEA?IJHEEA@D<E6B>HGJLSZT]®¸´º¸È¿¹½ÉÌ»»À»·µ»º¶½´º±Æ`u²¤±«½©¥¨«ª¤¢²µ «¨®¥§¦¥¤¢§±´§²²½¶Á¾ÓÉÉÓÆÃÅÌÂÊÃÀ¾½¾»¼·´¯¸·¶Ã¹Å½Âǯ¹©¡«¤¨µs`cc_Xc`jgRX`VRUIEENK@>GD=KA=B@=F>;HA796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkpslrrsÕÀµ }~x{|y~t}zkfpuY]\Pedb`ed][XW\MdmURmm_n_XgdUYUJDBKKHFHHHHBI:D?HKTTV\Z[¹À¸½¶Å¿º¸Éʺ¶¹µ·¹²·µ³®¶¶du¨p^¢¬ ¢¤ª¥ §¦ ¤¬¥ª°¸°½¹ÔÑÏÖÐÊÌÒÌÏÎÊÆ¿¾ÂʽÁ¼ÁÀÄÄÅʾÈ㤻°´¯«¸»{m^a]Z_bZdcP[`SPKCAEFE<@E>AHA@D=:E>=J?37535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ\Yh_onlotu³« ¡
~|s{
{ts{ylmu{hreiligjih`fiilZms¤¼g[oh]ZZTHKNOJKPKSQHLAJFJO_^bgia·Ç°¸²º½µ±ÄƵ¯¸°°»«²±§«·«¶§§N¦¥¡§¬¯¨°¨´´ÔÕÕÖÓÌÐÓÕÍÓÏÍÅÂÉоÉÉÊÉÑÇÌÍÂÐÑ·¯Ã¼Ä¹¥µºÂ¢pe^^_YaXZfZQ]XOPBBHEBH;AC>AG??A7;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYReVshqoyy ©¦}|p{r}qxulqx~qznxslipmcjmpxiw|~Ë¿Áß§mcxnc[a`JPRUNY^P]\NPNTQUT\nmvq¸¬´¦°µª¬¼¿°«´¦¤¸¦«® «´£±®¦«¬¥¨¢¬ÏÒÕÒÎÌÒÔÔÐÔÑÎÈÃÔÑÇÍÒÓÓ×ÌÑÑÅÒÖÅÀÎÇǨ¾·Î{pg_d^XaS^ZPQTQOH>@FABE<@A>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMNZu
wlwo}~¡¡y
~{r~zu
ovrks}{v{sxrjsrioqzyqz¾Ë~²vrvhak]CZZ[VecYdjTX\]`d^cwz~©£¤¡ ¨¥ª°¸ª¥³£¡¢£¡§±¦j¢~§°¡¡¡¥¤©ÈÍÏÈÂÌÑÔÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÂËtpebaYUZT\PKGIJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznwpmuvx}t
|ylvtn}vtx{µ;AÅ¥~|ieWICfcecgjcnw[^fhknin ££¥±££²¡¥ ¨ £±
~
z©£~«³¨§½Ãƹ¶ÆÎÒÐÒÐËÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÖ¾Ë˵zxpf^[SWR[VFGJIEE=:7:@@B:FD?DCADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqs
|
|x
zyqz{uz
yp|oozq{qnztw}|u~{¯sX©Â¶pnb=^hrpqpnxvehoruxqz © ¬¡¥«}
~lz|®ª§¯¶½©¾ÇËÉÉÌËÏÉÄÒÊÔ×Ùר×ÕÛ×ÓÙÛÕÐÛÚÑÖÈÔË{}jj\[QTT_HCFIH>A>=7:=?;=G=?AAADA>>:86DB755479.566435532323647553458EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<99D?CGRj^mdbfkvqz~~{|~
vyn{{tz vutu}soou|
zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥¢«
z}¡¼ ©¦¦®¨¶¿ÀÀ¹ÇÉÍÎÅÍÊÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÚØÎÛÆ}{ikgbUXVVNLDMB;==<8:<>8=@6=?@=?><9867DA6455=80665547745613854564557HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Xea][htzylwvz{~~|z}
zzu}tm|}~t|~x~xnt~
|}z©Ã¡½£}}r~s¦
{hGq ¤
~¥
¥¸¢¨¡¤¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¹{{zmkgYb\TPOICLA<<>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=DRSRX^UXfmmmiqsy{z|{z|{}t
yrzsm~~w
¡n¨
z |}£¢ ¤®
Wr«\¢¢¢
¤³¡¡¨²¹¬¦½ÁÇÍÈÆÏÍÐÌÏ×ÑÑÕ®ÖÕØÚØÚÚ×ÕÙÙ rwih_^YTXYCAHC?>>:49:;7:;;3;;?=>7;9:1:H>:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbyma~omwxyz|
{{v
spzuvvt
~¦¤¥¢¨s±§
¢£©¯n·
Äȱ¡¥²d¤ÍÈ
ª££¤¨¡£³´¦£¼Á¾ÇÅÅÉÈÉÂËÓÍÍÔ©ÒÑÖÖÖØÚÔÓÚÎukf``_PKV\BBFC;A=837;<:8=649:<:82?992:I:=67BC32:96264>=4;>6949;57944JQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBdGu}|m}xz~z~vv{ln~y|wx|~£³¨¤«²¡§ ¥¤¯¢¸³¡ ¤¯¢¤§©¯¤ À£É¸«¢¥²
¨¢
t²¤¡} ¡±®£¤·¾³ÅÇĽÃÿÆÎÊÉÒ§ÏÍÓÑÐÖØÒÏØ¼u|x_bWbXRIKOEBCD5>:76:?;<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGM[\YIha;Hz{m
y|x
}px|}|osz}{x
¨¼©²½¯¥®³³©£¢°¬µ¢¸¥¤©·¦¤£©ª¤¯°© »»É¡i¶·ª°¢«½£^©²|}´«¡¢ ¥¯¨¡¥³¸«ÂÈĶ»½¼ÅÈÈÂСÆÉÍÍÄ×ÖÐÊÓ£s}k_\UaSQGD><CAB8?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPfHa`bpI@r|u~m}}|~pww{«ÃÀ°½Æ»³´Á¼´¬«³·¨²½«º¤¨¹·ª¦¦¡¢££ª¯²±ª£¢¥¥£¹®¨À»¬²¹¥¤§}½¯z§°« £¬ ¡§§¤¢¤°³¦ÁÆÃ°°»¶ÅÄÿͧÇÃÇüÖÐÌÄÊvud_\b]OKCL@EF>A?A<:4>A==5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\hF_igZ]\{un~{~q~zz¨´ÇÉÀÂÌÁúǼº¯«¹»²¶º³À®¥À¤«°¼¼ª®«¢¢§¬¯µ°ª ª¢°´§¢ººµÁ»«¨²¤¤¨©Ääy¡ ¦ ®ª¡ ² ¡¤ ¦¤¦§¤¯¥¿Ä®©·µÉþ¶Î²Ä¾Ã»³ÑÉÇÁµw{o_Z^lTNIDMKKI@A=BD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr{~wz¡¨»¾ÉÈÊÂÒÉÊÂͼÁ³»¿§º¿¾¼Ä¸¬Á©¬³»½ª°ª¤¥£¬®´¶µ ®¥¢£´¼©¨¼Á£µ¶¯«¯¬ª«©§¥¤uy
££©¥}£ ¢µ¦¥¤£¥¦¥£¨¨¢²¨»Àᥳ·ÌÀ¹®Ã³»¾Á¸Â¿p{c[X^\MMNJGDDHBBACK:4DH:;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>lI_XaZddWx
~ ®§£Ã¾ÉÄÈÆÒÍÎÍ˼·°º½´¼Ë»ÃÁ¶·¼³À¹¼®¯¨¡©¨¶®©²·¬¢§¡«··©¥¯¾Ä±½¹³§©³³®¥¨ ±Å§}}ª¥¡¢¡Z¥e£³¥¢««§§¡¤¨§¶¬©º¼Ãµ¦´µËÁ¸ª¶¬³»¸®¨¸º¼·np\ZVWPGKSMK?AHDDHFF85FM;>7>AJ.32025B55PWN;LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hV<>@BFBsFiIRecLF¥¡¨¥¢¯¾®¡Ç¾ÆÅÈÇÎÎÎÒʾ»¶±º»¼¿ÏµÄ½·¹·²²¶³·³¬¦««¸«©¨¯°£®¤§¤¥´Á°«¬³¾Â¹À¹³§¸´·³¯¤°®¤¡sÁ}±¦£ ©¡ `J¥T°¯¥¯¯¦¡¦ §¢´©ª³½¼»«°²ÇÀ¸¦¬«²±£¡²²´¥sqg^\PRMEQQPQ;HKIFGAC=9KT?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hX<:BC@=REWSsbVFH«¡¨®§
£¥µÉ´©Æ¼ÃÄÈËÉÈÌÎǾº³®¹¹ÀÁ͵ȻÁ¹µº±¯¯²´§£ª´´«©¦¬¤®¥¥¨¬ºÀ¨«¶¶¿ÁÀ¿¸²²Ã°·½«£®´¹¥¦v¾®¡¡©¨ ª¡§mu¢¢®²£«©ª«¯¥¥ ¥ª¢±¦©«º·½³²®¾¹¶ £§©¥¦¬©©fhb`SLMGHNJUL=MDMIJACD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW<:=..SaMVH~e^HF¬¡»®ªª¡£¬¤¤¶Ç½´Á»ÂÃÈÉÅÂÎȽ¹²¯¹´ÀÂʶƱÁ¼µ»«©¬°££ª´º¦ª§¬ª¨¯§¤««¾¼¨¼´¸¾Æ¼¶µ¸À°½¿³©µ¶«¾¤¢¡» ¶©¥£¡§¥³¢¥¨ª¤¡¢¡µ¯¥¦±««¥¤ª ©¤¡¡´´ºµ¨µ²²£¦ª¡xc_a_LIGHMQIMDFFAQKIADGAVRDH<AGQ1;B7:BF79]YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGE¨¤Ã¬¤¨ª¨¦¬¢ª¶ÅÁ¼¿¸ÁÃÁÈÄ¿ÍÆ»¾¹²°¸´¿Ãȵ¿°¼·º·§¤««¬¡¡«ªÄ¢¥©¬¦«¯¬¢ª¨¿¸¦¬½°··Æ¶´¹¸¾°¾Á¶´²´¯½££¡¡¤¢£¾¤©©¬ ¦½¢£¢©« ¤¡µ¬¦²¦°© «¡¡¥¤«±µ±ª¥ª¬ ¡¨ie[b^PJHKOLHECI@=OH@;GIH[ROK=HNU4BE8>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcWM¢¤Å«¡«¢¥ ¦©¬¶±£ª³¶Å½À¶À¼É¿Êȶ¸µµ±´´·ÂÆ·¾±¸µº¶ §ª«¥¤Á¥ ©® ¤©¯¢¦¨½µ¥±»·¶µÃ²³·º¾±ÃÀ¸¸®´´´£¤ ¬¡¨¨ª¢Â©¬¦ ½¡¤«««¦ X¦¡ ¸ª¦¶£²¢¡° ¢£¥®³«©¢¢¥¥¤cg\eaMJKKOFEAFK>=IA99JJN]QQI=LV\8FI=DMI8Hc\KCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+waS6SZkWsHE6=ue\LO ¡Ã§¥¢³ ²§ª££¬©¬»±©¬µ±ÈÃÁó¾ǼÄʽ°°¶®±µ¯Àŵº±°º¶©°©©¦¡¨Â¬±ª¢®°©¤§½·¦¶º½¯·Ã³³Â¿±Æ³º·«´¶®ª¢¦¢«¡§«¯¯¯»²¦©©¢¤¸¡¡£®¯«¤¥¡£§´§§´£¯¯ ¢ ¦¬°¥§¢
dh]hfKJLKSBC@IG;;F>89NMU^RSJ>O^]=HPBMLI8Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<w]^?[U_fr@8<HweA4¤Â¨£©± £´©²«¦¢¤²¬©»²°´´Æ¿Äĵ¿Ä¾ÊŶÀɵ«µ©±¸¬ÀÅ´¸®¶º¥«²«ª¡§»µ¨°®´²§ªº³§¹³¸²¸Àª¸²Â½´Å§¾®·µ©§¬¡¥¤¡¡¤®·²µ¶¨¤£ ·£¤¥®±²¥©¤¡¨¢¯²¢§¯¥«¦ ©©ª¢§¡zej]lkOQNNT=BANC;:I?77QN]_RVQAW`\BJSHVKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JqjVCWFyfC;¤¤¡¥¿¦¨®® ¨µª¸¯«¤ª´·±°¸·°·¸·Å½Ãǽ¼ÄÂÇÁ¹ÁÆÁºª¶¥»Á÷¸ª²¼£°²¦¨ª¹ª¡§°«¯´³ªª·µ¬»«³²¹·¬¸°Áº½¿¦Ãª°¶®©ª«¦ª¡¡ °®³«°¹©¦ ·©¥¢¢¯±³«±§« ¥ ¤´°¦ ©¤ ©©§ £~ljmbnnXQQZTACEU@;;H@7:XPd^PWWDY^^NLRO_LJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gYaF(@8m}h\V:{cC=¨¡©¼¡ª¯ª¢±·¨¥´²«¡µ½¯³¸¼»½·¶ÁÿÉĹÅÃÀÀ¹Å¾Á¸¯¶¨«·²¼¿¿´©¯²¸¬¨®¨©§»¥³«¢±°³¬ª¶³µ¼¯±µ¬°µ±¿ºÅ¶«¼¯±·¬¬©¢±¥¤¨£²ª³©ª³§ ¦¤´®§¡¬¬±§²«±©£¨¤ ©¶©¡ ¦¦£
{gmshps_GYfVDCNXDZ9HB5>]Qh\NZ]G[^]OMRXdJKC]c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'_^aV151=`V_8)C3YU\gK5zfL@¤¤¬¶£¬¨¤®µ©®³¸¦¦°¸Æ¶°·¿Âµ´ºÅ¾ÌŹÃÁºÀºÄ¸Á¹²µ¬ªº·»º¾µ«®±·¨«««««¾«¯±£ª±²®®µ±¸¶ª®±§µ¯´º¼É²ªµ´±´¯®¦ ³¨¬ ¤±¢ ¥¯¡¤¢¥¦²©¡¦±«ªµ¤®°´®£§¬¸¢¡ ¥££¡{
{loyou|aF`jZIHZ[={JGE6AbUi[M\aJ[\ZRSSbaLKE`a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.+A/JGP[G3cXTKE¯¨±©¬¥£®®µ©·³·£¬´·Êº´»»À¿µ³·ÄÀÌǼĽ·¿ÀÀ¸À½²½®¨º¹··Â·¬®²¹§®¬§¤²ª¯»¤¬²²¦§¢±³°²±´°·²©®«²¦¸¯µ³ÄŶ©µµ«°©§¢¶¦± ¤°§©©¢¥¥¤¶§¢°³«§±§¯µ¬¤¡¬¨ª¹¢¨£
¨¤¡w|nqxv|]Kel\JOd\?b{GI8GgWf[L^bMXYWUXTi]POHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=ELQ<3rkLDD¤¤¬«¦£°²²ª·°µ«µºÉ¸®Á¼Ã·³±µÂÃÏÄÀ¾´½ÁÀ»¿¼´Ä¨«º±¶·¿½¯¬´´¡§±¥¦±¥²µ¬ª²±«¨¨´¹¬´²µ¬³¬ª«¨¬©¹±°Ç¿¸¤¹¯©¦§¬°¥¤£®£©¯¢¢¢£¬£ ¡©¦¥¸¤«³´¤ª«¨¬®¶®¢£¨ª ¤´£ ¢§ x~}}}rts~~\Rdn^NZg]FD[G:NmXbZMabNVVVWTYh^QRLdZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Ce;6*HdHJ+:I?3CIS,>k?HI©ª¡©¯¤§£³´°´µ±° «½Ìº®Á¼Ç±´®´ÂÃÑÄÅ¿Á²¾Ã¼¿¸½Å¨·´¹¼À°¬²®¡£§®ª§¥±£«±ª®ª°®®¬«²º§·±²©²©ª¥¥£º¬ª°Â¹´¬¹¨©¨©§°¥©¤¢®ª¨¢¢¬¥«¡§¨¡¬¦¢¬¬·°± ©¢ª°«¦§©£ ¨ ¡¥}w
utrvl_Y`ncQsr\K<|F?WuX`YOc\MUVUWQ\b_TOOhXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.IgDF8<B05EKX1@]@MF¬§¡©±¨¨¯µ¬¸µ®©¤««½É»°¾¸Ã¯°²ÄÄÎÎÿ¿´ÁÄĺÁ´ÉĬ¯¸®³¹À¿´®®¬¦§©±©¦¨²¦´ª°±¯²¬³º¤¸³¬¬§«£°·«ª¹¶¤µµ£©¨¬¬ª¬ ¨¦§±±£¦¥¡¡«ª¡ ¥£¢ª£¬¢¦±·¬¬¢¥¢©ª©¡¥¤¤
¤£|{u~ux£xk^`ngWfdN@gLDbzWbXReUMVUUTO\]bVKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DBIHD¯¤¢©¯©¨µª¶°ª¤«©©¼ÁÀ¸¹´¼µ¦²¯ÄÊËÑ¿Á»¸ÀÀºÁºÂÄ®±¶²´»Á¾³²¯¬¬¨·ª¦°«¸®§°°®±«µªµ¶§µ·«¬¤©ª£³³¨¨¤³´µ¡©¨«¨«¦««¨¹¶©ª©©¡©©¡ £¢¦¢ª¦´®§¥©¢£¥¦¦©¢££~
£t~xuzx~prggqx\atiO]VHmyUdVRbOLVTUQOX[bVHPjTVTGPYUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02?f=NX?C,?LT_/Ik7RF;¯ ¥©¬ª¤®²´¯ª¥¯©©»¾»Á±°¹¢¶¯ÉÇÈÐÀ¿½º¼Ã½»ÃÁÀ¿¯²³²¶½¼Á±²³«³©¥µ¨¤¬³²¸¯¢´±¯±¹ª¸®ª¯·«ª©« £¡µ©¡¯²¡µª¨§ª£ª¡¡¬¨½¯«®¬¡§§«¯¢¢ ¨¦§©°¨¢¬¡¡¡¢¢¦¨¥|
¤
¡xt}txz{tt{j£vi^elug|RWp^KxsTdSQ_MMSZgNMWYeYGSjRQ>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HP;YC4±¤¥ª£¥£¬¦´³°©¤°§ª¸¾Á¼°¨¹ª§®°ÉÆÈнÀ¾¹¿¿½É¼Â¹±°µ²º¼¹À³´¼¹¬£µ¦§¬±¶¸²¦§ºµ´¼¯»¥µª©¯¤¥¬ª§ª²¤´©ª§ª¤©¢¨¨©½«³°©£ ®²¢¤¤¤¤§ª¥©¡ ¤¨©
}~
¢~rzx~|hw|{uqr~izd`hcr
{mgy]^VCX{mTaPRYKKMpt]IZ[gZEVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°©¤£¡ª¤¶²±¤©±§¹Á½¶°¤¹¬¨¨°ÃÉÈÌÁ·½¿µ¸ÁºÈ¶Ä¶´³µ²½¹º½¶®¹¶¿¢³¦ª«®µ·´©º»¨±¿²º ®´µ¨¬®±£¥§©£¤¯¦¯¡«©§¡©£¨ »§®±®¡ª¢£¬¦¡¢¢ª¢££¡¥¬z}£|yl}vyxb{zrpqsxjujgchansmbip`oB]ykV^NQQKIMSYVM\^mWEXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R]=#¬¦£¡§£·¯¢¯°©«¹Âº³ ¹¯«§³ºÇÊÈ¿·Á¾¯´¾·Ä¶Ã²°º±²À¶»¾·ª¹¸½ª¤´¦¨ª¯¸°¨¸¼£¾´³¡®·´¦¦§°³ ¤¥§¡¤¬¨¨ ª¯§ ¦¢¨°¸£±¯¡«¡¤¦¦©¢©¦¨¡©}~|{¡y
}{sp|qst`yxjopqpjsdzlhedbf`[rjqMNiXZMQLKHPRQHM\_oTEYZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0][5(¥¬¡¤¡·«°£³´©©ºÅ¶²® ¸®¬°µÅÇÀ¶¿Â¹°´½·¿»¾°¬¾°³¿²½Â¹ª»º¸§¨µ¨§«¯«³¯¥»¶¤«ºµ®°¸®©¥§¯²¡¤ ¤¤¡¯¦¡£¨¯¡ ¢£¤¡·°¡¦°««£¯ª¥¨£¥©¤¢¨¡z}yz
~
zzpqvnot_xwemlljjofrikfh^dt`[kviZJ^\XOOKHHRUG39]^lQEYUYeMHIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDU]hD.<2dW,2¡¡ª¤¡¢ ·ª® »¸¥¬½Å³°®£µ°¬¬®´Ãü³¿º·±³¹¸º¸»¯®À³´¹°¿À¸½ºµ¥¢²©§©²ª±¿µ¤§µµ¨²¼¨§¥©¯¬£§¤¥¡±¥£¨©¢¤£¸¨¤§¦¥¡¨¨¢¡¡¡© £§¤yz
|z
{w~{ltqllsawuiijggohhicfii`jcjh\f{c`StT\[SLJGIOS@!*h^jMDWU^`KIGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gP'2¢¤¤¦£´¬§ªº·§¬ÄÁ¶°¬£¶®§®®·¿¿¼²Á·°®²¶¶¸¶¶®ª½³®²±½¿·®¼»±¤¶ª¥¥³¨ªÀª§¥¯²©¬µ»¨©«±¥©¦¤¦¢¤©¡¡§µ¦¯ª®¡¡¡ ¦¡ ¥«¡¨x
v}
{s}}fxokjkfuskcgddvcefffjjcksZ_Z]mdaNiXZ`VJGHKMSX>9_liHCUT][IHFFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£ ¬¡ ¤³±¢²½¶¡±Æ¼º±±¤¶¬ª®©¹¼»ºÀ²®®®¶®²¸³©¬¹±¯®³¶º¶°¸½¬¦µª ¯£©®¢¿ ±£®°®·µ®¢¦©¥§¥¥¢¨¬¯¥º§®¢¡¤¤¨©§¨¦{t
|
p~fymhkifqrk\hcctbfgjnlgjjhn]lltpaTcideZIFLMOYQPVaeUAVSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC'4¡°¡©±¯¹¿µ ´Â»½º±¦¶¯¨¥·¸··»®¬ª«¶ª³¸¦³µ²®©°¶¶±³µº¦©µ¨¨¡¨¬§½¬£®¯µµ¬¬±¯©¢¢«¨¦¤ª¢¤¤ªª©»§¤ ¡k¢p£u©§¡xmi~vql}
p^cag
ktw~gguheW\hsnNPjcgs
h_efnmj]`afNKD9GTg^JGPPUULHRaotfF[QUPFHEC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08=G601.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.£
° ªª£½Å¯©¸Â¸½¼§¶°¥«£·³²³±¹©¦¬´¦¯µ¢©¸¶¶¨§¬¶²®´³¡©³ª¡£¥¦«¹¥¥¯³·®¥©ª¬¥¡ §¦ ¥¥§§§©£µ¯£¢¢£ ¥¥ªrx
¡vif}rx o~}¡ |tullheczlqaS
mbliqXjqpY^i[ll[qnzr
gZ^GN?G_MERVVQQRWUg^MWIRRPFGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa70(¦«ªª§ª¿Ã¯±º½·À¾ª¥·°©¬¥²´®¯³·ª©¥°¥´³µ¶µ¦§¨³°²§®ª ²¨¢¢¡¡³£¤¥µ¼¦¬§«ª¬¨¥¡ ¦£¥£¤¤©££¤¦¡·£¤ £¯©¡
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Åzrµ¦»{l±«°xhkX±®nei¼¼ngzorØ~Skc¶²rt¡ªWOWbPVNFU[XQPR\W\PA]DQNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦§ª¥¬²¨±Â½²µ¿µ·¾Áª§³¬¬©§®³©¯¶´§§¥´¥§¸¯³²¶«¥¤§±®®°¦ª§¤°£¡«¢³º¢ª©¡®¥¡¡§§ §§§¡¦¡¡°¢£
¯kjª~fdp¥q®¡¤~x»}k¡v±_j´[¥e`f{fjxk©d¾rg¦u±j|±xtcmm§n[ EhfEu`~h|¤§Y_«ixyj§7J¯\XSld[KNX_\WV;NPWW/ITSJDEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢¬¨¥£¤ª±·¬µ½¿°¶Ä²·ºÁ¦©°«®¨©°®£°º¯£¤²£¨¸¨³³°£¥ ª¯¬¯¦§£¢°¢«¥¡³³¡«¢ ¡¨£¡¦¤¢¡ª¦¦¡
µµx
©µv³·~¨~k¦{w«gk±[«ztrx °vwqkkl|N¤XHbb~ch¦`ysvS^P©mcq~b.Q¡o[Skh`LK[dX\ZB?²yXXA#MhFCDA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50³¦¦ ¯©§²¬ª»¶Â°»Â¸¶¿ª¬¦±©¡®¼ª §´¬£«µ¥¦²³§¤¢§ª²¨°§¥®¬ ¤¨´®¡©©¨ª ¤§¢ £¤£¢¨¥¢ Õ¹p°Á~Å|Ö»|¤¤{£¥z¬yV¯z~j¹[ºw}¦|z©x{±nt¼
oP¯§ÅQ zc`©bssm`Sµ´È|c¤3Bv]PjidP@XgZdaJHNnN\ROYfYCD?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:;DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ71%¢²¨¨¥´ª¥´©¤¼·Â°¹À±µ´º³µ§±°¢°²¦¶¨§¹£¯± ³´°¡¤§©°¨´¨¤ª ©§°¨¢¬¢¨¡¥¡¡¡¡¡¡¢¦¡¦§ ²nhµq«n¦r´sr¶{££¡¥~°vÒÒv\®{
¤oª¦k
}}{°rx³etofRÈZÂ\yb_`vtb^YÊo¿uMKµSUÆdTQjcfXAOk`lhPUHI9=VRZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746@>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥°£ª¼¦´¦§¶»¼²º¿·¶³¹¹²¥´³¡±±¢«°¤¦¹¤±°´¸ª ¦¡©¤±¨¬©¤¨¡¦¥ª°¦¡¥ ¤¦¥¦¡¢ ¡¥¢
¬{w¨v£©o§ ¢®
³\r³R®}¤rØ~x~v¯w´aelZ°XKuyf`^vwhk]¯wxl5yÈ®²_BTo^g`EPm_pmVVN.ediSXQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I:99 ¹°´Â¨³¨©²º·³¸¾¹·±´»µ¤¸²´¬¨¬§µ«¨±±«´¤© ¨¡µ¦¦©¢¤¡¢¤¦¯¦ ©¢¡¨¤ ¥¨¤¬¡ ¡ ¦©}}¥x¡ªp§ £ª|xo±Z¨ ytÙwt¨¤|{²^d ~l\«[Zhgªdr{ks]¬Z koeOJC¡\[Lt]bgM[a_rs_KV6JXGE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¢¿«´Â®«©¥´°·±µ¾¹¹²°¶º¨»´°¤¤§§ª°©¯©µ¬ª¯¡¡ ¦¤¤¹¢£« ¡¨°¯¦¨¦£¨ª¦©§ ££¡¢¡¡«®mr´s©u§s´xs³¤£¤w¸o{¢jk¶Z¡
ei ¢§nr´t²j
ku³af¢oj\_M¡|Rs£ly~oq\¯V<wfTon.\§OcSkebmZc]ap{cTZQ>>mo3CB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¦»¡²À®«¬§·©¸¯µÀ´»¯®·¶«Àµ¨© ¥¤¡ª©§µ£²§®ª § ¤«¹£¤¢ ª¶°§¬©¥¥¬¢ª²£¦«°¡£¢ ¡©«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸cµ©}¬©q{t¼§ ia¦¯¢~tª}¾os¼t²uxnqn¤t½^w}Zay¼kZV\jy^jaegbmxoY[YDA@s@CF+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¢¼¡²Ã°¬ª««±§¸¯¶Ä°¹°¹®À±«£¢£¡©£ª²¤µ¦¥ª¦¬¹£ ¥¢®¹²¬£§§¤¤¬ ¨«¨£³£¥§¡¢£¯ ©¶·xµwmknsoy
tÁ»½{±¨ps¹|||¤»¹½uz´£tvvt°ufjµtrqw¶^z}hynyb¬pu
X[§jEeZTf`c^cQhgqmuBNPMD;ZM?J3;0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O^]=+:VV'>;<§ ¢¿¥´Ã´¬«¨¬«©º®°Å®´²¶¦´¸¬©¡¡¥ «¤ª¦µ§§ £¬¤¾¦¡ª¡¡§¡±µ·¤¤¢¥¥ª¨¥¥¡¨¥§¤©¡£¯¨¦¡j}i¦xr}tyd{½¾ÀºorasjZ^ack`cmwbke^`cphr}
gj~rtx}~b[wthP\n}|kXlzrJJopNtLEW]gaLZXgc_O[nuirRPDEN;HI=M?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P_L(3>[O'?2>© ¨¢Á¢µºµ£¬¥®§§µ±¬È«¯²ª´¢½±±¦ ¢¨¢¬¦¯¤¤µ©¥¡¦¨¾§¨¥¤¨¨¯²¿¬§§¢©¨£¬ ££§¬£ «£±§ °¥¡§¢£¥¡gm}qw
µª ¡ z¥lj||uqxyvv|jsuuew}wkozm`c]phMXZfj`WZpznmfTOFS9OZMRO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³¡³¢À¡¤²²· ª¦²§¥°´ªÈª¬°¤´¥À§³ ¤¤£ ª§¬££¶«ª¥Á«£¡¡§¨§²Ä¯«ª§ª¡¢¤¯§¢¥¨®§ ¯ ¡¦ ¢ ®|ª©
z£f¡³¯
v{}vyzofykuyris{vkudyf`jecdfkYl{pij\SLPD^TF@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4[G5<,@´ º¯¿«®²² «¦±¢¬³¯Ä¯ª«¢²¼£³¦¢¡¨¥©¦¤¥²´°¥®¾ ¬¢¡¨ª«¢³È³ª¤ª¦¨£« ©¯ª¦¤¬¢® ¤¯£§£§e|e~cymik{¤ªjd}geeih{¡lh£wkj£slnzzXe^^mv\hswwnwxsmytv|jY^lud^sik|qkc^RNXIdXAJ4>G7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO2YC;?.=¥º¼º¯¬´±ª¥¨°¦°¼°©¦£®°¬ £¢¦ª£¥¨©²£¢¯¥¶¹¥£¡¤{¥¢¨´Ä¸¥¢§¯¢£¢©©¡ ª°«¬¤« ª§§ «¡¥°¤ª £©}½r´rhx¹Ä¸q¢£z¥s«|ËÀÀ»q¢}À½ÂÁ|{ÃÀ}k¥²noÊzwvyyqzpw
ynxcf_yd`ec^thldcXLWIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP.#F[3PY/VAB;/8£¹Ãµ°°À©¨£¯©°®¦³´¯©¥¥¦°««¢ª§¢¬¢¥¨¤¤´¤¢¦«·³§®¢¥ ¦¬¤«ÀÀ± ©¯©¡¡£ª¤ ¡¯ª§¤¤§¡¦¥¨¤¨©©« ¤ ¢~Îxz¤y_®^§¢ |§s«¯^cª{§
u³c«¡³j®t}·aY£Ímu{Ú{p~v~e{vvk|n}
marlph``yd\qhjdg`RTSW]KOC5AHDD8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸£ª¨³«¦²¬¬ª¢ª§¯© §¤¢¯ ¨§£¥¡°¬§®¬°ª¨¬¤¤§£®¥«°¨¿Ç³¨©±®¢©ª °¨¬ª¨¨¤¢«¬²¥¢ªª£¦¤¡¯¦ q
u
¨q±}r¬~¡¥wª}s~ªv{|~ª¢~«z{VÄzoÁ}muomeveoawnronfpuuqagme_oiingdXS]aZRSC9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÓÆÆ²´ £££¢¬¯¶®¨°¦¨ª¦««¦¡¤¡ ¥«¢¥ ¨¨¢°¬©§®¬¨§¨£¡ ¬¦¢¯¬¤¬µª¹Í²¦¬¢¬ ©²ª«ª¬«¤£¬¯±¢¨«®¥¥ª¨©°¡¢¤¤j¤uz©tz²p¦q ¤``R«®v§z{f£¤£}©~®_}©U¢z¢{ïÅr¯³³¹qb©¯Âthmqnzxypmgeerpf|ic]W`jXYULLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÕÕ¿¡«§ ¯¢°´°®©¬¢§¦¨ª«©¤¦¤¦§§£¬¢¬¡£¯¢«¤µ¯® ¨¦¢¢¨ ¥°¦¤¨±¬¶È²µª«©¡¤³¡§¬¬¥¯ª£¢ª¡³¡ª³°¡¨§®®´¢¢¦{ªlu«y|°o¤Ò¸´¸É²_`©¤ zxªÉt£¨©ÆÇxf¡¥s}¯]p´b°uK£m§Gd|qq|u~|n\fjsqfk^aYdm\_YINLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ¨²¬¥¢²¸¬ª ¥¨¥ª«©¦¦¦ª£®«¦ ¬©¥§µ¢©ª¶²¥ ¥¬§¢ ©¦®¡¤§©°µÃ²²©¬¨¥¡£®¥¡¥¦¬°®©§¬£·¬¡±¸¯®¦²²²£¦¢Nxz£}¤¦¸{{y¹ÌÆÂ¶x¡~v¥¤¨°
¬}b¥l¤p}r¬`£sq`¼}RUt£{~v|sq\nnxrjo[d_inbd^LLQTAIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@882.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª¯ ¡¬²³¥ ¥®®«§¦¦£§¡³¯¢©§² ©¤¢µ¢¢¡©´¸¤¢£¡±¦¤¡¢¯®¥¨¢¶²Ä±©©§¢¤¥¦¤ª°¢¯¥¦¯¤»¬¡¶¶´±·°±¥®¢
ѵ÷y
¦x¡w ¥qª
´nrj£|s¯¥¢¦mp²]¥szk{|m©a£qqbs²¸hw¦}y~ynjyiyrou^eeomfg`J[XX<HH@U4@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¿¿¼º´§¥µ¡¢£¨¦®«¬¦¢¦ ¶§£©§±£¬£¤£ª³³¤¤©¦£§µ¢ª¤¶«Ã°©ª©¡¢ ¦£§¥§¨¯£¥¦½¬½°¬¡¯²¹ª²¥¨°¢¦y¨}|°w¤¥m²o |¡§¬
®
ª ¡{~««xy¯^£}¦§c|sj¯]¥kp
]`[ m¦||knctnz`geqnhghCZa[>KU3U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI8052.*,ATVVVTTUUUUTTUTSTVWWXVUUQHFIJ#((½©ÆÂ¶Á´¬ ¸¥£¤£°°ª¤¹ £« ¯©®¡«¨¤®°¬¦¦¬¬¡ ¥¡¤®¡¨¦¶©À¯¥©£¦¦¥¥ª¬¤¥ª¨¾¤Â«©¢ «²¸©¥²§¨v¯~
}ºe±e} ¦¬°
¦¤¡¡
[lj³`{{±mgo±[}´\¤kÈ¢d{¼XvµY²}R®z¬X¡m§|zeuc
xt|ajgqmgefOVd\AU_>I(>:=4!",%2. *1/04579:<ACFHJLNPQRTWZ^```ab^_\[XUPNJFC553./@UZXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·½º³Á³£¬¦¤¶¨ ³´©£ µ ´¨ª¬¯¬¯©¢¯¬¨§¡¦®¨¡¤££¦ ¢©²©½¯¥¨} © ¢©®¨¦¦¢¥©» Ʀ¤¨ ª´´«¥º¬««©£¯¤¸Ãº§¬¯§¦ª~սªb£¿½}~£×º¸µ
½¾k¢o«lz²°Çi«°½¬xw¢¾¼s¦{{d~|egy{alekjcPa[Sj\?UbCN)=:4/$%2 $(0496678:>ACFGJKMNNQTW]a\__a^`[\YTQMHC?=A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³³±¿¹²½²¡®¦¥²¦¥¿ª¸²¨¢¿§§²±º¨¯¦§°¬®¥¢¬ £ª ¢¦§¡¨¢¡¬©¹¨£|¦©¡ª©¡ª§ £ª»¨Å¢ ®£©³³©®¨¹¦suª¤·d ph®nnw¤u®pq¨£®¤rmllfxonqzjqigqiifpd]bjoY\f}v¦_aqnee¡¡~wgxikzyelcflbKdXJlZ:PeER'K:+# ",)-2.5:4579<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY\^^]\\\]^]^][[UW^©¬³©¹¸²³ª©¡®£²©¾²Äɾ·ªÀ¬¤¡§¬ º£¤®¬®§®©
¦ª ££ ¤¦¨£ª ¦¦§°º«¬{¥¨ ©£±¦¢«¹¯Á§£²¥«¯°©¬ª¦¶¢¬¶ ¨¥¶£ª©²£ª ²¢¡¢¡¥¡«§
¤}g~tusp§lz¡£sjwqxw|zjmdcodUaY@j\HcaOY+F=+'!750.!%2(*699469;>?ABDEJKKMPPQXUVY^`ac]^UQJED>9=@ASX[\YWXXXXXYXXZ[\\^__`^^^__```_YY`¦¨ª¥´¶®®¡¯£ µ±¬Ç¾Æ»¹«£¥¦±©¤·§©µ§¨¢§¬¤§£§¨¦¡¤§¡¶»¨«|¡¦ª¶£§«·§®Á£¶¥®¯¯«¨¨²· »¥¤¦¶¢§ ª £¬¯ £¯¨¯£ £ª«¡ª
}f
uuxsj
|¢£
|sszs|jod^pj`[`YndP`ePZ:GGE>2=>9/*&+)&&416668:==?AACIJGJKLMSSSUZ``i`eVPJACB:9EMV[^^[Z\[[[\]]__]^_`aabaaa`bbbdb\[c£§£¯²¬®£©¦§µª¥µ¼°¢£{£²¤¥±©¹¦£ª¢®¢¨ ©¨©©º¶¤¥y£©¸£¯µ¢¯¯t£½£±wy©°¹u¬£ªd\bv ¥}m³£§ª¢esyp¨m¢¨e¥wjvp{
`hZughs{§fzyjoykre_vplkh[gfbbpS\>NNNSG>@UD91/&4:306678<;>@AAFHBGFIKMSTUY]`hfgWQJ<DG<8UR[`ab`^__`aa_\]__`aabcdabaaedchd^]f¦£ ®°¬«©¥¨®¢¦¤«¶±²§«§¬t°¨«§¹ ¤¬¢§¡u¦©¤»´§ tw ¡§²µ³»¦ ~§¢z¡µ¥±ª¯¤z¬¡§¨§
w¥z§{²z bympyp~
s
xgt u}¢
klx{qqgdxojlk[eljet\^ITLR@E5.ZUU7)!09=>743568;:=>>@DI?IEJKGSX[Y[aahfYQH9EL<>bV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah£¦¬«¨¬¨°¦¦©¥¯È¿±¢¨©µ¬§¢ ¾ |¬¢¡§¢¤º²§
pu¡¥«´´Ê©·
°¯¬¨¦}¨r{w§h¤y´¦§Â«¡r¥}
²¡}¡ |
mr
~yq{tÅf©£k£q
hwt|xhhvqhhl^dpmgmXgG]RM2D46Nbd7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^il\QE=LM@JdX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢ °§¨¨¥«£·°©ª¦ £¤«¤¦«¸£°¡¨¥¼¡y«¢
w¥£¹¤~bm ¡¡¡§~¡§
ª
£©£ukvM«x¨§©«}¡{z§ikg
·~n`dY{dhr}yl]|m_Sp\_kx_Xd|p§ªk£nr¥p
jf m[o}gZ`bWPowfmtskjo^kqmkiXiO^XF9A4HD_k4,ICRMN=84859;6@;;>BO>QRLMBJ\]_W^^bu`MD:MONTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ©£¦¬ ¶»«¢¡¢¥®¡¯µ£¨¡ §´u§
«¤©¦±§¡in£ ¡¤£¡ w§¡¦¨«¥x|~¢ps|ym¨{¢sv¦f~w¤_z}t¢n·´ºtµ¨dƸ{p¶q¤bs¬«`|i³~m|q£lr£t
¤`³q}³us[²jcotvqhoXkmsrf\i^cLD=D6QBZr3=SG_JR=<395::6D;;@JP?UMNQ@E_^[ZX``|dHC8LWUWc`Zefkkbbeadc`ab`dd_`cknccddhdbgfchh£·« ¤·´ ¢¤£¦®²®¬¡¡¤«x
q¡}§ £©¨¥~j{} w¢r¡©¥¦©}~z z£xt}¥¢d¡|lhnz§}rht«tªh]
vgªj¸f\¨p`^§vu~ht
on§]¨~x»k~ª\]´g\nrzxki\qkyyc_fXbBQFO7WCRo5K[Z_OZD@151;;6H?:CHU>YRY]>Db^V`Qac}jEB9N[^YefXfgnmbbe_aa__``ec^bdoq`deekecihgki©µ§c«¹±¯¬¦© ¯±©¤¡ ¡¤jr{z£©£ iy{¢ ¡rhp©¡¥¦{°£¢¸w£³¢¤y{ª¢q¡|
¯µ}k¡x~´¢£«¨|}tªZ]o{xbL~{z
cyBLX¢jq{lux±³§wns}ptk¤]vHed`tq~~nf`liv{ddaQ_W]UW@YFQhDSW\bX^ID=B8?B:IF8LEXAWR[VDFb\Z`K`m~rEC<U_bZfjVghmobfg^aa\]^ahb_ecvm]egfkdflihki°S^ ¦³¹²²©¢¬ª¢¬¤¢¨ ¡woy
|r s¡
©|lq¡x|£ ¢}µ{¥z©|§hwm~t¡sq|p®}¤¦¤o^¨gu¢co¥aÓ|{xrsc¢~£s¤uk³`sª²§¼wm~¾¦©´]n|pmr¢r]¤gs¦`h¦mÔ}pz{l|xsn©¤g`ezqkgfdouwg`cS\fQQbIWJTaWS[ej[eQFCKMJKBKE8O@QNXSYOSQaeejRcwywIFEc]eZhjTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°«T\K~©¯±´¯³£
© ¡¤¥© ª¡{p}h}wo
l|¥ª
yvnw¢z£¤³¡¢¶z¬§¤®¥p©
{¤¡r£®¯¤ v´µµÉ¡s`©my t¢w ~oLf£ps¤{ztak~ kqd_q}shyi³µ´Æ¦s}zk«v
mvxj{urPE}´_jvkyfjgcuupnV^TYiPRhIVMYTV]hknVgWNKAJMKHJOAQKPecjmetss~y|nu{{TPOl^i\kiRjhilglfce`\]]^ibdik{_]dhcjfnmeile¡®¦e?¡²ª®¯µ¢¢ª¢£¥¥§¦zjye yui
z¦©z}yp¡z ¥¨fnxl¢d|q¥wpg¦z¤zrv¹n¢b} mriªku mo¦_iit¢}`uobh e~iuocfmq¢Z_[b¡m]nz}srd¥mx¢dg§hsp¢oUo _f¨T^TnmskrmpilyskoRYWWgZSmIYO]IXiisjYkVQREV\LXSaUik_wt{}p}|r{svv^QrbgcpgPjhhklnhdg_]^]`jcjivu]\cicjjsmfkmc¤¥zdtm§®£©°±¦«¦£¢£¢{qh|st}|d|¨¢¬~si¦} ©¦¦x~¥²¯¥vx©s¥n¤¢»n}¥¯
|¥zr¨ f~o¬cw©l©¢vwª¦j°kv³©kmm`~«ªv~~¥v|¤ jx¬h¶tw¾¤Y¦«aurtq|uqckohlSW[Vab]kM]R]J^mnw_[qY\`[ftenorbqt`wz~yrys{{vbxdcnrdRkgholrjfia`^\bkbmlzo\\bibljxmglnb¥ª£©ª¨¦®¤¬¥¥©
tzp
~tt
rm}{¦¦¦
vol©«£ u~y®£qw}{r§q}}zy{~v {}k
[yyrzqin~quqe^wtrunynml
^ugwe
¨}t{jpv}wnmgsy|x
\kXyinxrroxxp]knjgV[`W\fkdVbU_Q_pxylkvfjkkv}qrusaoubt{xuzux
}{mldyn^Wnghukxjije\`Zcjemqtn[[bldllynhloa¸¨¦ ¢¦¤¥«¢¡¡§©r|}~
{trp
{|
y~¥|§¡
wrª¨ ª~~¨¦woxn~¨
p}qkp} hm]sqtkvtYrn~~j]jd{
`iwz{u
gw
japqu^q¥
enwqzqghe|z[\jgnv[{yxunssg\mkkbZZ_ZYlq\_aZ_]ft~{uptckkk|}s|xudmuhm|~vz|{yz~o{}s~yshT\qiluougkhd]aXkhlkqrmW[enlgszohjm`ª° ¢¡¨£¢~® ¢¥{
}s}v
qor}z
¡¦¢xz¡«¡¢££ª¡§¦zv§~²¦²¥k|wxe|w|yt ~}uor}w¥
}ym
}zkrhatq~zwwpwt]^ohn_^Z]]ThrVd\\blhu{|sopdkki|nyrjpplg{rx}{m|yx{}zxNdvjrmpzekecb`[tfpfrqmU]ltmiyzqgikd¹¢ ¤ |¬ }x{nyr~mk~z}
«r}{ª¥¢
¦¥u{¤z|«¡ª~owqu`~u~
nxut¡
s{|rqzzw¦
w~pl|nhlmh_zi}|vuvu{w\_p~nu`c[]^RgnTe[^bkivz~qlmdkjglslluoyp
ynv~
vq~{z|{`i|juhidjc`i\cuhobumlUcqyepz{sejmm·¡£{x§¥yz
|n|ys
~}jh}|}}¨p ¡
}¨x£ £¡¤}w~|¥¡¢¦~~ttpwa}q|q
hwqx}qz|pwzyy¥z
v|gs}y{qlkg_~sh|uvt}sj^`tvpwdcY_^RkiUeY_ahjvyqgkdmhfkn}hoql~xzls~tv|z}irnsiahlb_qVtomm`xhmWjtvcuz{rbjoz²¥¥ |v¥¡£y{~r{tv
~xgc}x}y ~p¦¦
w ¡y¤xw}s£¢¢~|vq}n{d|
pleun{
|w{
{zq}wx¡vw|xazy~txgmeajjwstu}q|bc`tnurmaZa^[leRcY`ahkvyqbjcmeh}lhthnpi}ymqt|}z~|mvttmeljbbvVipn`xglbjvpfy|zq`rl
®¦¨~xªzy|}||xtyzs}d_}~t}~}
¤¢s{¦¡s¦rkzo¤|zqykul{~~m
xp}~dqi{~sx
|uw|{£xt}tv
pa|vzq}obocd|cnovsxwstav`olumo\\_^^j^P]Ycahnt{k`ifjciwnflijmh}{wos}t{}z}|rzxxnljh_ircgqoewgnlayik}{xpaxmª £¨~x¯}w~{|{wxput|o}|a\~szz¦}}¤m¢¡mf
zp£}{
srukpnu|tnqu{{dply|}ssxn|
{§z{}
w~qpehyuup|b_pakt^qj{yylspex]nlsmrXZ__akZPWXecgqqf]jigbgqodigeihzwuo
t{u
x
|x
zw{{rxjk`phtkromrgole|cnzwqlww~¢¡¨ ¦v«¡t|v
xyss{kspzmvoq[Y~vu ¡x
m¡
i¢e~w~||nuplmop{
isqwuxfrnu{yyusozy
¢{uwynl^susqpyZ_qapk^pj}{qmmjlv`oojqmYXa`anXQTZfgcupb]kndbfkn`gf`gkurspuxuy
ww
|{wjqc|c|nqmtjholvx_qy|uut~¤¦
v zrxtpr
tqvlpmvmv~nmUQ«xwrz¡x{¤|r
}hg
qw{z||kvjnkll{az~vzx|yfsks~
zpyouyy||zv|wpjl{`yqnmstV^pbra`lnzqhpffsthqkawe]Vf``rSQN\fe]yp|_\irbbefj_he[gp}plqt}v|
uu~z{
xs
~|yxfrj`}ookz`jntu_t}yxts
}x °¥
wtwtpp
tprokiwnn}}nusRMßÈÖ{puu w{s
¡~wz~yvfk¢cqz{y
|~l{erokkzy[yz}~zzgrjr
|k}~m}
|y|uwxrmgq
nkuphjunT_pepZ`lrxgkkbfxrppc_w``Vk_^vPNKagc]zpt\\ev`aeedagbXissnkrw}tzuv~szr|~vesn}e~oplYlnyysav{{vrwwy®
w~}
twpyqoomoseeyq}mz}jhkc¤ÁÜ®ð¡rlvv
£o¡r
£
~zuxvum
|¢
^
m{}
v
}}k}dxujnysWz
y~
~xeri~kum}x~trwusqgvzcunqbjwhRaqgkV_otzard_h}prnZcr`bVnY\xNMLdga^wsn\\dy^_de
`cc_Yjrknksw~twxw{q|~{t~sguqym{ntqWqzvyrdwyivr§£
}qxy
¡|{rwptjpljm|u_axw{qu|h`d|ëÚµÉÃÜrltvjq
|{
vxru}n¡aj}}q~qwhvritwkZ|
}uarj~~|mkw
{|~npyukqlsy`ujo]kw`RerhfS`pvtap`]hqsjWghbiXmV[uLKLfg^brs
j[\ey^^dg{ad_]Ykneojtx~ss~{vzs
|vv{ulwuyxtnxz}Xzqogywdv
p
¡¢torw~| xrtnodrifmxx\_y{{qqjafaÕ¶¦xnqw|qk{i||}ztz{qu
u
~b
g}~~m|tkmwutwvkc
~|
~o_qo{{~ypey
z|~nny~umnkl{~diljYnwZRjsibQcsxlbe^Zjnsa[g_dl_nU[pNHOge\gnqlZ[cs`\clwde]]Zllcmjswqp{}txx
|uy|vpxy{on|w^tmizssgs|r vvmw~}v~vqpljau|gbjuzZ`x|zmqecggW_qs¼Äwqstk{|}|u
vv}quqszf}r~g}{y}i}vfoyxswslj
xj]pwz}
{}qhxwz}mkz|vtoih}we]qcXptSToshbNhtxfa^]XoosYeb]jm`pOYlRDTgaZlnm{oY[^lcZcpvdg\]`ljcliswqn~{tuz|
v~xtsyy~oo{qiyz~nm|vkjxtk
o~vjyzozspljd`t{i`er{[as}zgpzaed±²wKbZ¥ÚÑr{y
olzy|xxoqt}{jy¥
~n~uw
p{}oxh
xr|e|~vcpshyqou{vxyj[o|r}
zqmp
qwwmm}vzehj~raZx[YrnNXrsf`Kmwub^[[Yu}roWg]fjp_oNWiR?Yg_Zpkgyq[[YkeYcqy_h]^elhfliqxom}up{v
qq{|zyukzko~t}or|{poyf¡
gpgz~
|ixrkkf_aoym_boy]dlz`qv_deÕë¾2:>ryw
nl
u}
|xnv
wnku{uey§}msux~{x
lri~xm|{xbyqdqh~muqu
~su}rnZk|sx{|wypkqw~~tmjvuu\iixqZW~SZreL[srf[Jqxp^[[Y\uuiYb[genbiLWfQ=^f]]vf_uq[YUodZeqy[h^`gmgjkipx}mjyn{}zu
pnw~{{i{}kt|r{sw}zx~|kl~kh{~}kuqgic[cgso`altahpzast^bc n\5Z¯µuj~wuwpl
tyx}y~rgv~}op}hvynez
¥}m}u~{|q|~
|i~mk{zjzvr`w~qdrgumu{}owy{t}lWm}uswuzwrmq}{|znmimtn]hftrR\|N\q\O\sodVKsykXYYZ`qua]]agdhhfNZhNAad\`va\umXXSta[eosWj_bhkgmlipw|lh}|p~~|zwr{oqw{j~{nxyww}x~~zm£
{vykm
y}{}prpbf^Yg_pp`ahpfjotato[`djv{¾§¤È¸r
s}ytrsp{sutwyypcwyirufwvcj|}q~sx~w{lyyvhzilysizv}h`x}jjsh{jv~z}~q{v{s}aUu{qs{pwwoo}|w|{tuhqhlrp]hctoKfvL^oUTYsnbQOtybSXX\aps[a\hedcjdQ[qIDdb\cq^\xhUWVw^\fniVl^ajgennhpwzniy}r{~y|v}pvsmw~q|xyztxzuo}~{w|huz|vgpn_d\XfYmsaaaqllhn`siX^cmw©Ù©Ç³rypv}zutu~wopn
txtl`zyeqogun[m}y}wzl
t~r
{muvnhwem|vmjwv|`bxzhuuc~{gu|tuqz|l~YVr|ot~wksxjt|y{wzq|rgtdmmt[k`vfIooL[cXWVxmbPSuvYQVX]`ro\`cmdc]nbT]rGBf_^fi]Z{cRV\u[[gkaVk``nfflqhpvxtkuvx}w{t}oququ~{wx|}
x|}~{~svx{wuz^~ytwzbnl[b[[aUjtd`[hopfraqfW\ck|Êι¢knnmr
r~
{
zytyuu{jlvcvvog_|yeqjjqcXl{rv}{mpp
{yrrp~ghrcnxqjlqw}|z]ezwiuyfvgt}rjo~xm{\Xp}ls~{mnpvfv~~uzpys
{xqer`mksXk_y]IplNWV_TU|kbOTvsQRTV]bti\`kjfbYnaXcpGAh]`f_\V|^OVepY[jh]Xga_rfkhqgqswynt{w~yus
pp{xwuyz|u~}~~}|xvyv~}nuydso
zudnjY_[]]Uhse`YdrrgrakdWZ_ix¾®z·nbtit|rz{~wwswo{vejo`usjb^~xxep}hkkZVox¤
qqwtlr
}yusoiyajmamvjgkkywzw[g~|xes~ntfvofkztltb[mzjszzet}mpgt~w|~pzjyzxwoelal}lnVkaxVLklOROiNY}gbOUvlMQTU^fvg^aphgaWi]\kiJDkZbdVXUyZNWnjY]le]Zec^ufmdrfsptxp
vx|
}utnsy{{ss
y}v}{~{w|wvzjv~|lrq
~pflgW][\[Tepe_XcruiupdebW[[hporsdeyjtvtt
xzwsunkzpahkgtmf^_|oz}hmwfjdVWrp§}|vs{r{ylzzv{}uqsmhu]mi_mudgfizo{rYgvuhpxvbw
|njm{pere_kxfquz}auvikqtzoxwq{e}~~wunceal|mkVjcrTLjkPLNpH^{fbNVueKOSW`kw~f]gsie_VbWbp]KKkXdaUTUsVMYveZ_l`\[ce_wgmbpitoq~utwxz}v~
nrt|ztq
zut}
|~z~v{£¥y
lu}{uzo
sz
}unjieV][[ZScne[Xbt{jhmh`aW_Ziiloglaizzktuto{}vunzhjyj_eniwgeXbwi~ynioff]UXoh¨wz|xuo}nrtx~wt
vjsvhio\me^ns_gbjxh{m[mstjo~ywav
x
sqoyqbph[mvcprzwarogixsqkwvsubz}vuoccbm||kkUibgTLmhPGRlEaxfbMTs^JMUYelx{f_mqjc\V_UnoWJShXg^XMUlTK\z_\_k]][be`zhlaoovnowuz}wyzyz}qtt~zvt
}|ls{
}~{v¬zlrzvtno}tjonddX_ZZZUbjg\Z_ui^ml\aV[\kert|ij]lxwhuwrn|~~zvslzhixg]dshzwccTdogvvfhiaWVYhd¨oxzpo{fxnyzvq}ndwsdii]lb^po[g_muezh]torkq{~uvbu
{wru~s`plXprapp{scqk`lzoihywspdtyytqdadmr~jlTi^_ULtcQGWbGcwfaLTqYKLXXglvzeemqfcZX]XvfTJ\cXiXXHWeQIbx[]_m[^]bc^ij`ntxmonvyr}~vvx}tuuyzz}jt{}~
y{~|sq®{{~fqzt~}vrol{~mzcpobe]eVZYWcfk`]]siXpm[^WZ\l{cqwulb[ntuhuvqm
yywnotehte[gufvvz`]Sefjs|aci\TX^bd¥iyt
xlnxfwl{ytrx|xifwm`ha_k`^ukYf]oobze[w|knnpxytteszvoq|qawcYno`op{reqd^muicfwyrkmtr{rqa^emn}eiThYZUNy`RKZYHbudaJUnTJLZVilr{cllscaYZ[aw\TKc]YjSVGYaNHjvX_am[[_bc]
ihanwylojvxm~vuttqvvw|}~~px}yxy~ssp¢{{xduysyvktply|pr^po`gblT[ZWidmf\\rfRrm[YXW`kvcjuji_[mtrmtttk}|wonldiqc[krdtvs\WSd`q~q\bc^SZa\derqskjxlnoyyzqvrzz{dfvh^c[ah\^wiWb^phawa[{vjjroxtsthq~urjp{levW[ilapqyseo~Z`oqb^io|kjr}qovio`[dkl{agTgUXRQw\SPYRHcsbaGVlQIPZVklk|emoqa[ZXYlpWSOfWWiSTFZ\OIruX`dmcX`ab]jddmyxkoiuy
{k}}y}mqovz}t}txutpuo¢s{{fwon|pgxq{lsvsk^tnagfkS^\Vhbll[\qdNom\VWUfishctee]Zovoquuzl}}wscekoa]nmdsxkZTVbcw||p\c_cTZ`Zccnprjgyneruqzkysuoz~v_gsd\_WbdYaufV_`mdaq]]~ohisqtquvkm
{
qqfn{opnRZeidprusbluUbqk[^nd{dkt|qqqil_Xdijx^fTeUVPUoXQWTPHer_aFXkOIXTVnid|ikxkaW\U[tdSRVhQYgTSHZ[PNxw[_fmjZb`_^nbgkyvnnivv~~m~{~krgt{u~s}
{ss}un¤swxnz`e}qgztylmqwgd|mcfghS`_Ug`lo\^nhMil`UVSnfskfxde]Zquns{xsn{w{zlbelm^`ojeqygZVX_lx{zo_b^hVY`Xdbkq|wkjvl[upjyiurmo{sXko_Y^WcdXeqcT_biablZ`~kfksuomxvkh
zmpeo{lqlbX_ggnrsr^ilSepdUbmaxaotztjnkj_X`fhu]dVbVSOYgSO]OOHeo]cGZjNJ_KXme_xhn~d`U^T]t[TS`fN]bUSJ\ZQYuv]_fmhXca[^qchjxrsmgvsys{~|yntlst
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|}~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBK £dggggfo
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR455553?¢¤¤¤¤¤§|]____^j|}zzz|}{|~}}}~}}~~~~
|y{z||{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{||}}}}~~~~~~~
~wxz{zz|||{}}~~~~~~~}xyzyy{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~wrtx|||{||}}~~~~~~}~~~~rsxrvy|}|z}|}}~~~~~~~~sptwssvx}~|y}|}}~~~}~~wkztw
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{ek~qu{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
h^hegcn
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwo^rl\imgehklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghh^hul]munfbcbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z]gom_ksulYY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROMVbhmsppsnRQTPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMNTaeenmmihTMNOPPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKDCFLZhlhmlmigc[URONOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEEPTUZdkmgllkjjihig[LJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>BJYchlkolmljijki_TIEEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;:FNMampptpjkiXKBEEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;;=;;K`m{sj[G=@@CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99:98BjmH97<<=@A@=;;><=<@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;===<=<;G\9<<>=>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@<\n@>DE?>A<E^=>=;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mwH8;:==A<Kc=<=<8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR<==ILFFuwM788:;>>WjA;<<::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;]z|wV<=?==>FitL:=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAHrykb|]>@C@@=Jr{Y:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot}~}uLACE@?>Y{]?CEIJIIMMKECFGGEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEDCWu~XGHJMLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqruvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLMLMNLIGGGGDGGGGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl|PKLKHGFFDECC@@CCCCFFEB@>>@AA@BD?>?DFHDEGIJIJHHHGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJT
uIIFB??@???<<<>;:<AA@><998<<=;>;8;?AB@ACCB@AADDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIe
fBB=88::9878896479;<:8557789787588;;;=@;999=<>;<=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIh~T:8656766656773568:876565676768:67889;7578979776:<@GFIFIFEFOSRSSROPPRTepqsttvy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBe
G676468874578567699776765:9:::;798987779:98878589;A=>>BA?AKLOQPQOOORWkqrttuvz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=q
z>988;<>>9::;89;9:;::9;:9===>;;<=:=;9;;<;<<99<8::::999<?<<ABDIJMKIKLWorsusvx{{||{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
l<;>BCEEBA@B>@BA@>=>>@???@??==?B?AA?@?=@@@>?A=><;:;99;?=;<==AACABCAXpqtttvz{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
^>DGILJJFGGDFGGEBA@CECCABCB?@DHDCECEEAFEFDEFD@B><@>=?@>?>?>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CCFW
VHMLNLNJIKIIJJIECDFGFDCEFDBHIKHGGFHGEJIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGJY
PNPNLOLJLJIIHJFDFHHIEEHFFELLMIJGFHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@87<;<=:>@>?@CFIJQ_
rNRPNMMLLJHGEIIEJHGJJIJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGHGCBACUnpuwwyzxyzz||}~~~~}~}~~~~~TDAABGHB?8?@8:<8=>;=A>?ADHJLUq
_SSQNOMKJGEBGJGLJFKNKKJJKMLOPNHIKLOQQPQOOJHJJLJKFGHGFFIFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|XWSSUSNLKJDEFKONOWUQPOQSRMSTOMSLPSUVRSQPLJMMMKNGGJFFHJDDEEBECcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BBGVNFNPPTX{
hXWkaERQQPI;;RSR`u\UVTVYYRXXRZfPUWZ]RTWQOMRQPPQKKKHHJHEFIIIHIirvyxyyz{{|z{|}|}~}}}}}}~~~SHJIHGFFE??AAEACGEDELXRMTUVX[|
}am\dU:XXXSQ?@VUY\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXTTVTOOMJLJIILMKOMSosvxyxwzyz{zz|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~ynpYZ[[RSRVVT[ZuYU}`\X]^WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\YSVTWRQWVcQerXZW_hP`f[[X\gaGOZhg\[\]]WROSPPQVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOMKfy[]TYUV]ZLTZUST^ZXWWWzkX[[\^TQQPINOWVX[Zdprvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRRUcdv
~ymqVIKMNKMKHJDEIEC>TdURQQNKQTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquuusswzz{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRUTbs{|}{{
u_]LD?CCCCB?DPBC@C=CIGV@HNLG]iPHFNFDEFIGHCDHGHKGDBAD@OQMRdrtvustuz|{{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTSOV`klrv{{xytrnstsyx~kMG?@;;>@@??>kPKaEFHIEB?GLMGMRUIBE??<=<==?=?ACC@?<=B>JNGUnttustvxz|{}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNKLQRQTUUWQQWVPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeC@@B=:BCBBDB\]O{NONNKLMOOPLKMWMHG@B<977599=;;;8989?<BH?\stuvuvwy|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIHPRQOMPQNQRTVXSRYTNYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHFGHBAGIEEFDMRPaWRWQPSSRU[OOQVPMIDF>:96587979:365795<C>essvwwyy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZXMKTTSPQUOLRSTWXTTXQLWYZVXXVXY]WWXhsk]Vaskba_^da_^YTQNNNLIHJKIIFCQPS[WTTNQSYS\eUOSSQNKIHC?A999897885757859:Gnqtwxy{{|~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnpppnmd]__YWOPXVVSTVOOTVXXYSUTLKTVUUUWPSUWTUR]n^RNY_[VY;DVXT[fJLORROMMNNNLJFQPUYSTOJNOUST\VRUSROMLIHHF?>=:787659967675Wppswyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\]RTZVWUTWTRXXYYYRUOIGOPOOMRJPPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPRMILJORPRRSTQROLLKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHKIFLMPMG/E_R>3?>joaRRQ@GUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptuy{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]gSPSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Sprtx{z{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTXWUMLKI<987;>@><=A@B=>EHGCFFIGJJ@FAA@FHEJOHQRa\QPROSNOPLLOMKMLMON[WKMQOGIHCHJLLJFFFD?BC><BG?B?Adpswzzz{|{zzw{wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHDD=9779?B>;?B@@>ADJECGGIGIEBB?>=CBAGIENObeQMONWKKMKLMMMLKONSdNJLRIIIEAHJLMNJGIFBAB@?EFEHDKnovyyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGMMJMPMPOHJD?A=98::?B?<@BAADEGKFCHIGGHCC?B??@A>DECLNRTLJIMTFIIJLJKLIJLMOPRPKGCLGCBJJLMONIJIGCCCDIJMLIYrmwyxz{{y|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqGKDGHHGJKIJKDGB=>=:9:;AB?=BBCCGFIKJDIIFGGCC;A@B>@@CEDIMPHHKGHKDHILMHJLHIJLKM]RHHDNFADJJMMPMKMJKFGGJMNQNLbmivvwzy|z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKCFEGEFFGEGBC@><=9::;@C@>BCEEIEIJLFIIGFFDB;ACC>@CCCDGLNHKNHDHEILNMGILGFGIILNKIGENHCGMKMLOMMNMKHHIORQRNRfffqosxu{z|lhjoekqlspfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFECCBE@DB>@>:;;=:=>CA>ACEFJFIHLHGGGFEC@=DEB>ACCCDGHIGMPJFFGKNOKFHIFEDEIJHJIFHPKDIMKOMONOPNJJILRUUROWd`amgproryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHEEHCBABD=BA>A=9:=?:=>@B>@BDGJEIFIHFFGECBAAFFCBBBDEEGGIFLQLIOJJLLIGHEFEDCIIHKJGKRMBNOMQNOOMNOKKKOUWVUSX_^\iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGHFHBBADD<A@@C<8:=>9?<?B@@@DFHEIFFHGFFDCECDIECGEBEGEFGGEJMKHQMJKHHIEFHHECIIIKMKOSNDQRPQQNPMNPMLMSWVXWUX]Z]d`hbjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqinyMHGHHBBBFD<?BBD<7:>>:>:@B>??BEFDGDEHFDECDEFGJEEJGCGHFHGECFJJGMKLKHJLFIIKHEKKLMNORTPHSUSPSOQMNQNMPWZVZYVZ]ZXa```^hec`dfhgihhifhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprrxNIHGICACHE<@EBE<8:>>=<<AB<?>ABFCECCHECEEFGGGIFGKHDHHGIGFDHKIGKHMKJKLHLKMKJNLONORUVOKUWSQSQRLOQPOTYZY\ZY[^^^`c^\ackb`dghr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptMIKHJFBEGE<@GCD@:<>@?>?BA<@>AAFCEEDIEFEGEHHFHHIKJFJHHKHFFLIHHJGLLMLLIMKMMMOLPPQUVWOKVVUSSQQLORRPV[[]^[\^__a`ad]c`ef`ehjcssfjgglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJJLJLGBEDE<@FDDC;??A@@@CA?B?ACHCFEFIFIFFDIIGIHJLHHJJILJFJKHIJJGKKMMJJMLNNNPLOPRTXVMNTVTRRQPLNTSRW[^^_]]`_`aa`acebdhbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvnwKMLKMGDCAD<?EEEC=AACBBCDACDAAEGCHGHHGJGDHIGHJFILHIJMKMLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSPW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBCEGCCIECIJJIIKGEKJGHJIIKHJJNLNKILHJLKZfJd\KlSHON_nUks[qpbwcSPavuhucav`Xnqbdvinzf[lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDBEEDFBFFGDEJEEJMMKLLGGMIGJKHKKIKKNLNLLLILML[sbdp^lmUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\ougpMJqyvkb`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIHGED@BB@>CFGBFCFEFEDCHHGDEKHGLMNLMMFJNHJKJILJJJKLMNNMMJMMM[roonpplkMPQlWNibtrpamnu\YlQ\mmZqmkomxxtsip]_rkqjUuyxpc^kfbgppjjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGGEEEBBB>@@FGBGDIEEEBFIHHEGKJGMMNKMNGLNILKIJMIJIJKOPONMKNNL\hdu]lqWlNPQmUZk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHLFIDEECAB=BACGDHGLHECCHKHHFJLLFNLLSRLGLMHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt]nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEEEA@>DDBGDHIMIFCFJLIGFJMLEOJKWRKGKKJNIHJLIKJIHJMMMMIKKKSkc[i^_icrrZ_Yjo_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrvtwrGGFIDEDFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJKKIHIGKKKLGHKKLMMLJKMNT[\TPTLPONOOVQOOQNOQJINPQdqiTYW\[\UY[]X]\\cfaaebce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFFAEC@CHDFGCIKLHFDGKLHDGIPKLOKLWLIEEHIJHIKILJHFGGIGHIEFLIJLOLIP\W^P\[`^MXYS\\b^MXZMXaRJYaZR_d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCELMBDCBEIEGGFKJKHEEJJKFEHHPJMMJMRIGEAHFJIKLJLJHFDIFDFGEEJHCJMKLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_c[`^[TXWY^]cbcacehekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIDBBCGHFHGHKIIIDFKKKEFIJNKNLHLNGHE>GGLIKLKKKIGDIDCDEBFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQYUU\Y]c`__cdbhomnllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKFCGEBEGIFGHHFFJGHGHKILDDKJMMLLHJJHJF?GGNKKKMKKKIFGCD@DAHIB?IJHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTR[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFDFKJFFFHGFIFFFILJNFDKKLNJLIKJHIFBHHQMKKOLJKIGGED?ECHHABGGET]Y^X_Y_[]UXXO]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAHFDGMRHCQJFHHHEFKJMPEFIJKNLLILLHIGDHKQNMMPLLJKHICDAEDHGBAGEDWUE\T]SV_XOTUNZZMIJT`a[_X^^a]OYa\``_bcb]abW__TPNOOWQ\[[\\^_bffelfoow|{{}
zo
~INFDFFHDIRbPCV^IGGHDFMKPPEIIJKNLLLMKJJGEJNQQNOOMNLMHKADACDFDCBEFBMHBKKOONLFMFGIJHGLKMOPILOPOSOLPSRUZYWYXXdWOSTPPNMOTRZXXZ]\`adecgcklpsrzy{z~{}{
}KIEEHFGDKM]LGGXLGHJHGMLQQHLKKKNMUNOKKKGGKPSSNPONONNGKF`ED_LEfdEM[I^[rmOMUmYLDP`UkWgJ]WU^DLQULLSVQRTXWTXUT\UPfZhhdXRjRVUT[\[``abbb`fhfnkhrz|}~}|zr{z{
~z{LIFGFHEEKOSIJF`SHJOJIOMRQKMLLORUROOIKMGHMQ[YOPPNOOOIJQQI|YYqtYQmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[`VVXjtuu__v_Xa[[f[_`aaa]`bgmpl`pwtx}vxzlv~tx}|~|z~wwNJEHMNBDLLFILEQVLKNIKRXWQMOOMQTNOQPKKNGMPS[ZSQROPPPJHZx]TxehZSTRvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essosr{|o~xnr_``baZ``gknkblfgmw~~{xwtvzir~ns|~wx{~x|u|||ssNKF`]GAEMMHJKGJPOMMJNV^YULQSNYZMSSRNKOHQRTYWVPTPPPQKHgxlcxrm[KMUypumubnvPdeJfvqmwojfxxiWrQhzmijzz}lxzohoYvvjuup`rf}ilx|o^__ba[]bdgiidgbcdllppstsssyqrxblugqy{srvy~suzn|}ywrnNKSuNCBFPPHJKIKPOOOMOZ`ZWKTWPa^RVQYRLOISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^]_ddighee^abiiijknokqnmjpacfcowxompsy~nqpj{ztsomLL[VHGEGRPILMJKPQPPPPW\XUMUYUeXRRY^SLNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_[pz{^`zscroxqhd}ir|^TLl`vukiu{{m~xk|p\^_b[^bddgeeebZccikkrsrwglihdg`akagsrlgmmr|kmhk{tmmkmOHKKIIHHQPLNOLKRRROSRWRVTPW[VVTTTa_PNMKTSTQUVNNLMOPJHQNPULKLSTSSTPVUQQNQQXYRNPUTXXX[ZURSW[WXWZOSUWXXR^YW^VTPYRVWWWX^[gr^[[Y\]_cZ_ccdfdccbZccffemnmueegcaf_]g`dlhfgkhpzhggkujhgilQIKLMMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYWOOKMVTQNUSNOMLQPKJRQKQMKKPRUSQRSSIHLNOQRQQQTVRXW\WSSPRTUVSZQNSRXVTYVTZVTRUTTUWXV]Y^`]\ZZ\\_c[]bcdfdddaY`acabhhimbad^_c]Zd\bma^fefmsdihkkedcfhPJKKOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSPPJNWSPNUPNQNLSPLOUSNQNMNQUQUQRTUNKMOQTTRRQVWTYZ[YSURTWWWY[TPTUXUUZUWZVSRWVUW[XZ_\UX^\^][]`a^[bbcgfedbX_ab]`gdfea^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTOOSQOQ[ZXWX[YXYV\jdVXYZWVSSOJNVTPOTPPPNLQQPRXTQQOMOSVOWRTUUONMQSUUTTRTWVZ]\ZVVQQVXV[[WQTWVVVYTXXVSRYWVZ]Y]_^U^]^`\[____ZbbdhgddbXa`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQOU\ZZW[[\XZ[dqmhd_[YVUWQLMVSMNROQROLPSRUZUSPPMPXWRWSSSXMOOQTXVUUSUYX[^][[VROUVV[[WRTWVWXVTX[TSRZXW\^Z^_`Ua\aa]`b_]`]c`cghdf`Yc`a__ed_`c[Z\[\YZYXW\Y\[`^_[^^a`^b\Y`ZQNONVQPTROUTSPW\\\X^\^V\^jqwyc\[UUXQMOVSNQQPRTRKQTTYZWUOROSXWTSURRZOPSRV[VVWSVZX]^[[^VSNTUV\\VRTVVXYSTY\USS]XZ]^\```Va[cb]ac_\bab_cfidf^[d`a`acd_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUTRQWRTP[^^][`\`U\]hjr}slg\TWWQNRZSRQTRTUTKRVV[ZZSOSQVVVTOWRSZRTTTX]WXXSX\X^]YZ]TUNVWW^[XRUUYYYUWY\UTW^Y]]`]bb^Y_[ea_dd^^cca^efidf]]da``abd`b^XZ_[\[XXXXW[Z\`\[[\[XZ[^V^Y]POORZP[TUVVTTT^^`^^b\`U]^bkytl}kZUYUQQS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[YUZ^X_^Y\YRWRYXY_[ZTUVZYZWXZ\VUZ^\^`a_dc\^]]eaafd^^dc`\gdhedb_da_a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPWYQ\UVYWWUX__aa`c]_T]_beeuzhXYYSUSV\XWWVVW]XOU]Z^]\TRWSWVUSTXRSVTXWX]^X][V]_X__X\VQYTYZZaY\VWX[Z[YYZ[XV]_`_cbadd\b\`fadfd^_dbb[fchecf`f__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNTYVS\TVWYVV\`abcac^_V[`da_zuohY\ZUWTW[ZY\YXY`WPV^\``\TTXPUWVTVWRSUWZZ[_^Z_\V__Y]^Y^USYWYY]bZ^VW[\[\[[Z[YY__``dbcdebdYafcffe^ab`c^bcidcg_g^abcaa`^_XT[ZZ[[X[XX\[Z[WWYXW\[\`]V]]SOVZVVZUXUXWX]_badad`^YYadb`lfh^[][VWXY\\\_[Y[bVTX^]ac\RVYPWVWWWVSUTX\\^``]`\Wa^[^\[^XVXX[[_`\_XY\\]^^\[]X[`a^`dcdeefbXcedhgd^c``ec]eidei_f]cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWZX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cXZX]`cd_RXYPWWXYYWVWV]]^`a`_b^Ya]]^Y]^YXUW[\`^]_ZZ^]^^a]\[Z\`b_bdcefefbZdffigc_c^afdZiicfjce^bbca``_]]ZX\YYXXZXWZ[ZYWXUU[]]]``bbxKXW[YW][\]ZW\]_`bdaba]`Xbcbacab][\[XW[\_]`_][`d\\XZbecaR\ZOXXZ[[ZWZY`]`bb`ac_\b]_][^^YYTX]^_`_`\[^^`bc]\X\^`bbcedfdefd\efgifcab\cg`\iibhjed`baca_`_]]\Y\YXWXYXW\ZZWWXOXZ]acffrkJYW\ZZ_\[^\X][^_acbaa]b[bdb`bcb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\^^^ZXV[_^]aa`^[`abec_]T]``cddfegeffe^efhhgdd`[eg^ahhbhhfc`b`cb___]][Z[YXXXVZV\[[VVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{||||{|{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvvvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{|||||||}}}}}|}|{zzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooooy~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½E>????@0*+++*"ÛÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooony~y1333332j{éääääèÊ:233334!ïååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyzyzxopppppprrrrrrrwzyyzzz~|||||||vuuuuuutssssss}
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvwzxzyy}zyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{||||||||}}}}}}{zzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwx}y{}z|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww|y{~y|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww|yy|z|{wxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx|z{|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyxzyzzy{yxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttssrqqqponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssrqppponnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrrrssrqozopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqy{prqpqnppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqprq}zpqo |opppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqrvpt}oppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqrp¬n£~pqqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrp±¨z¦ }pqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssssssss³¦¤§±¢vssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~~|vvwwvuxzxxxxxxww«¡¶¦¢§zyyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~||||{¦£±¡¤z{zxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}}¬}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~£~~~~~
~~}~~~}}}~~~~~~~²©£¥§}|}~~~~
|||{|}||~~~~~~~~~¯¦¥¤¨|}||}}~¦±©¥ £¨¨£
}||~~
£¡
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{
~~}~
¡
}~
~}}
~}~~~
~}~
~
~~
~{z
~}}}}~~|{|
~}}~~~~~~}~}}}
}|}~~~}|}}|y|
}}}~~}}}}{zz~~
~~~~~}}}~~}}}}~}|zzz~~}~~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~|~~~}~~}|~~~~~~~
~|~~}~~~}~~~}}}|{{|zzyyy{~~~~|~~~~}|~~~~}~~~~~}}}}
~~}}~~~~}}}}}|||{zyyyx}~~~~~~~~}~~}{|~~
~}}}~~}}}}}}}}}{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}|}}|{yyyxx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yyy|~~~
~}|||}}||}}}}}}}}}}||{z|yzz{|~}~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zyz{|yy}}~|{{~~}}|~||}
~{z|
~~}}}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}}|}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||}|yz{{xxy{{z|~|~~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}|~}~~~
}|||}~{{}w~vx~}|}|}~~z~~|~~~~~~~~~~~}~~}|~}~}}}{|||{{z}~|||}||~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|}~}}}{{}}|z||~}}}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~||}||}|}~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}}|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~~}~}|||~}|}|}}}~}}~~|{{{||}|{z{{yzyyy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~~}}||~~~}}}}|}||{|}{{{zzz{{|}}}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~}~~|}}|~~~~}|}}{}}}|||{|{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{{~
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~~~~~}~~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|z|z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
|}}~}~~}|~~~~}}z{{|||~|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z~y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~}~~}~}~~~~~~||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}|~||~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~~}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~~~~}}|~~~}|~~|}~}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~}}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}{||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxzxy{||}||{||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z||{zxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz||||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}z}{yvzxy{{|}}{|}}}}~}~~~}yy{zzzysrtowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxqytvxtw{~
~||}|x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||}z||}}|z{~~~}}|}}|vrvxxvtvu}
}
{||}zz|}}||z|~}|}}~~~~~|}}~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
~}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwmzsnym}rsvsvmnwlpylu~|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoolw}xpqzprtfu~n{ysoy}~{~|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}z}{|}|~}~~}~}~|}~~
}w
~~{|{~{||}}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~~||~}~}~~}}|}~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}}|||~}|}}|}{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~||}}|}}|~{{{z{|||{{{~{|}{z{~||||}~}{z|z||
|
~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{||
z{
}~~||}}~}{}}|}yzzy{|}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}}}}}}||}}|
~|~~
}~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z||||~~}|}||}~
~~}~|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ØÙØØØØØØØØÙÙÙÙØ××××××××ÖÖÖÖÖÖÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;A<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌͲâÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸·©§§§§§§§§§§§§¦±¾½½½½½½½¼¼¼¼»¿ÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVM<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎnPSSSSSTTTTTSL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§££££££££££££ ¬ªªªªªªª©©©©¨°ÒÒÒÒÒÒÒÒÒÒÒÒÒÑàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;<B@8<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÎqTXWWWXXXXXXWP¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥¢
««««««««ªªª©²ÒÒÒÒÒÒÒÒÒÒÒÒÒÑßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<<>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÎx^a````aaaa``Z¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©§±¯¯¯¯¯¯¯¯¯¯¯®¶ÒÒÒÒÒÒÒÒÒÒÒÒÒÒßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÇÅÅÅÅÅÅÅÅÅÅÅÅÄËÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÏÎÏÏÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÐÐÐÐÐÏÏÏÏÏÏÏÏÎÐÓÒÒÒÒÒÒÒÒÒÒÓÓÒÕÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÑÔÏÏÑÔÔÓÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÓ»ÏÒÏÒ¤¡ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒµµÊ¼¸µ³¡©ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÑ ª°Ä¢ÅÈÐÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<96?B?B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÑųÀ¬Öº¡°²ÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÖ§µ»§«¥²¯³ªÕÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<==964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÕ¥´Á §¤ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ×××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÖ¥²Ö£´« ©
¤ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÐÕ¥³ÖÉØÁ¼¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHGE@<<>><==<756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÐÕ¥´É¡¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@C;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÇÒÖ£³Â¤ª£¡Ã «¤ÑÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÑ͵̯©¬×¼ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<<?GEGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÑÂÔÒÕÁ¿ÖÒÕÅÄÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÔÒÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ=>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:69896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?BGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498566:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545659756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455588686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸···¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899::;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶···¸·¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸·¶······¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::9:9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µ´¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«¨¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦§§§§¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥§§¦¦¢¡ ¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¥¦§¦¥¥§§¦¥£ ¡ ¦¯¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡¡¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢¤¥¤¦¦¦¤¤£¢¢¡£¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢¦®¤¤¤¤¢¡¡ [¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ª´°¢£¢ ©pP¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡¡ «® ¢SZ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ £¡h¬ªsV_ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¨th¤£¡kbb¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe §l§¢ldc ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¦vpjee £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¦u||xf_e¡¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡{¢ `f ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡©km®ª¡gzg ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¦¥p_j¤Vg{}|¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ ©gEHt
OE`u
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v=:<xvnQ95^v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{~£Z^lPy¡ScjFgx
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~~Y£o¶¼±¼y}Nu~
¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
} xÜֱ̳¸¼ebra` ¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~h³É´ÈÔ¯®º§t©jX¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡££o©Â¾¶±w]ÊU ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«ª©³ y¬}yrgcx¢¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¥©§§©ªxW{zpnksv|}v ©§ ¢¢®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤¨¦¤¦¢¡©|hKitnpxjhdjknz¤£ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢¡£§¡¦®¦§§¯lbK]snowgbce_^jt~¢¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª©¢ ¡¨©°³µ¼²oe\GVvrs|gadjZZ`cmx¢¢¡¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £«ª¨®¶¸¼Áý¯{ed[@]lnx{ka_g[X`^afpsy¢¨¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «³ºÆÐÚÕÆ¸¨}gbcU=^jlvqrdbcYW\_]]ahjkn{¥®§¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amivkphiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ½Òàáк¥raY[[O?Wri^[nl^]WYXZZXYY[drºÈ¾·¡§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`ftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃüÃÈÎÔÐÀ£~aUSUXQFInz^VXW\[]ZW`|²¼ÀÆÇ···©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÁÅÈÈÅ¿ÅeVXUQIku£¬£OU\_a\]l±Ä¼½®©²·«µ²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|~jfhaklgnurruqg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8BBBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÄÃÆÆÀ±ÄÈÒ»fUVQVf¢®NVWX[g³·®°²¦ªªª«¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxozjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄĹ´À¶³¾ÆÈ°ZTSP±GOVYq¦¼°¥´µ¬¯¥¥£§¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyy{wnkihvZgrxsyff^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÄž¸½ÀÂÂánUJ¶
EKZ~¡¢§´²¬¸µ³¬©£¡©¬§¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh^jonyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÄÇÄÄÈËÆ¬s_v_KW·¹À½¾¹¼º¼º¼¬¦©»º¹·¿²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvijjtnyl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÍÅÅÅÃÆÅÈÌÔÌILW ÉÁÈÍÆÄÁÄÇÁ¼¾´±°°Â¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`kjwlifuotc]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÂÃÁÂÆÆÆÊÌ{G
ÎÍÇÌÐŶ¿¿ÀÀº»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegcjdbkmno^Y]VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ¾½ÁÀ¿ÀÇ¥JÒÌÅÉÑÁ¯½½¸¹»»¾·´±¹¾³¼¾±¹µ¸»¶¼´µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbaccdjcgc[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÁ»¿À¼»Ä½ºÀÄ¿½¼¸¼ÀůOÍÄÀÁÉ¿°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±··¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabchjggiei^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÕ»¿»ÃµºÇ·¶¹»¼¸¹µºÄȪPÉ¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¹¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmfefpjekhXYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÅy¬Ì½Ç·¹¸¶´·¹³µ²ºÅÊRÊ¿¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~}knqgqktfbn`\THKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄ×®v½ÈÏÂÀ¸®µµ»½·¹±¾ÃÇXÎÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljnuoxcgb\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÇÉÑsv°ÑÑÌÊĵº¿ÄȾ¾´¾À¿fxËÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltlln_c^abNHN?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÊÂuv§ÌÌËÍÊÆÂÃËÎÁ¼¸¼º°}wk¼ÈÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qd[^__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»»¬Ûþ¶¾À¾¾º¦ª³·ÃÀ¦{y{ÄÆËÈÁÃÀÀÉÊÁ¿»¹±£
z¯ÈÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp^\_\ZQEEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Å·m®Î½¶¹À¼ª}nhnmttz~¾¿ÆÀ¹À¼¾ÅĽ½¸²®¤§ÊÃü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wmv{qoj\``YSPAFIGK@ECH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀͲv³½¶µÁ¤iZ^`NS[\puy£¸·Âº³»·»½¿º»»¯¢¨¤¾Åþ¼¿»»¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvwora_f][UJ=??GG=GCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɧx¡°µjfgVY_IIMPTny©°·¾¹²µ²¼¹¼¶¹¾µª¼«±w¬ÊÄÀ½¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|quwtwrl`ca\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Æ©{v¡_SCYUHbjUOEJc¤®¯¶ºµ´²¬¼¹¸µ¸Á½¢¾¯°v§Ë¿¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨ª¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovsnc^gY]]SONA>JB@JJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿´ynNK?eYBOxhMB^±µ³µ²´¯¬»º¸¶¹¿Åw´§fª¿¸µ²±¤¦§¤¥©®¹¬««¥¨¤«®¯§°«¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶¯ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmujl]\kU][PNHDGMBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶|XFAOXJJYxcAT£¹³´²°±°¹¸¶»·»½£³®¤t¬°©««£¨¡ ¨®¤£¤ ¢¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhutoeUadW]QOMH@IRDMC=8875:7<>:;=89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼©hM@SyqPIIKhZET¯»±¬³¯®¬¶¶²´µ®©§¦¨ ¨©¡§¤¨ ¢¢¡¥¥££ ¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦¡x|vzcwln]QiUPOGPMLCPQ@>;>49:5;9=;:9<99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Âª¥¼gDSQXIKaJVbed¯µª²´®ª«¯°²³¥ ¢ £¤¨£ª £¥¨ ¡¢£¨¨§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nk{dhVRdNJHGOSNKNH<E@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© ªÆ¿ÊOAssPnJLcfut`\bs²¯®³µª¦¬«¢¢¢¤¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wy|eyy`bSVaHIJKSTISQM9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥ÆÆWSJf¤Zf}or[Qkc\fb`l´°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZZMQJOOVMSMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yUirwupcwvXWc`diZZWg®¬¯§¢ ¡£¢¥¡¤¤¨¨¬©¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³¶¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§}xvjwu^m[RaIRUHFUWJCMG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ ¤op`cXL[RZLLQYRHNNH¬ª©¤¦ ¨¥±ª§®£«®¶°´²±®¶¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«®±¹¸¼¯³°µÂ¼·¾³³µ¢¬¢©¨²©«¨§¨ª§ § ¨¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhm\X\CWNJGMGCFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£bW^e`WMQG=>@CD?>BRx©©ª¥¢£
«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶»»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÄ½Ã¼·³ª³ª³´¯³®ª¯£¬¨¶±£°¦ £°±®°¤¥¯£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trkkurqhV\QFUHDJPI?EA4FH95<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`QFD;C?F<>96N~ª³§££¢ ¥«¦xm ¤¢«¬´¼¶Ã½¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÃÊÊÃÁÇ¿º´º»µ»·°¶²ªº²®»¸¿»º«¸«ª¸»µ¼®®¸£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkdioxkeY[FKLEDTMECE7:?:549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;?>=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}riaWNE>IZ|oaA=\®¬ wrqmp¦®´¹Å»ÍÇ˾ÁÌÍÍÌÇÉÑÌÌÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÔÐÓÓÌÊÂÅÆÆÊÈÏÀÉÑÌÇÆÈÆÂ¼ÃÁ¿¿¿¶¾³¿ÀÃÃÇÅÇį¿¹²¸¼Äº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZZCNLDFPIDC@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A?<@?>9;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £if\TID@?K¤ ²£yqroly¤¶º¹¾ËÁÓÑÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ò×ÒÕÖÓÔÈÌÇÌÍÊÓÍÎÓÍÆÉÊÊÂÆÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÆÅÍÌÉÉÀÃÀ®¯³¨¢ª£¦©¬¤¥¦
{ruvgcgvjdVWQDNF@IQC>B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡aSLJDC?CR°Ò½²¯¦ ¤¡}xqkebhroq{
upnqtp
³Ã¾ÅÑÐ×ÖÕÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÒÄÐÓÖØÕÖÒËÉÎÑËÆÍÑÊÒÕÖÙÖ×ÓרÎÒÊÏÑÌÏÐÌÓÐÀÉÈÊÄÌÌÌÏÏÅÇȶÀËÀÒÍÌÐÆÊÉÀÄÃÈÎÍÐÑÏÍËÈ͸·»¨¥«§£ª¥©¨¨}xsvpc`erc]R\IJGAEIJ>;A8=5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢¡YI@ADAFQv²¯¦ wica__`_^__]alusppolrquÄÈÇÔÖ××ÖÓÖÐÕÔÚÔÔÎÏÕÔÔÑÑÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑØÒ×ÙÔÕÌÏÏÊÍÒËÏÑÀÆÃÈÆÏÎÑÑÒÈÌÍÀËÍÆÓÏÌÎÈÄËÇÇÉÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨«¥²¨°³¬
|zqstmbcim_VP_JJCFCRM@<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·ØÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£«eC8=>DXª¨}qecb__a_^a`_``_`emppnkorwwÌÁÓÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÑËÏÍÓÖÒÑÕÍÏÕÕÑÅÑÔÊÐÔÕÖÎÓÑØ×רËÈÎÄÉÏÌÊÌÀÊÀÉÊÎÎÏËÐÎÎÌÏÏÈÌÐÐËÎËÃÊÇÉÍÊÌÒÓÍÓÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¾»±
zvopokadnpaW\ZIFFDMXE;@=33<<87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤±zHFB;W¡k^^^adb``aa``a^__^\bmroostvvy¤¿ÌÕÑÖÔÓØÖÎÎÓËÎÎÅÎÊÒÒÏÇÎÍÎÔÌÎÒÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÍÂÈÊÃÌÄÆÉÊËÏËÎÍÐÎÓÌÆÉÐÍÈÇËÅÇÂÆÊÌÍÐÒÇÐÏÎÎÌÐÅÇÁ¸¹½Ãýø²²¾±»Ãõª¥¡yqrkmg``qhYXhVMGLIPQB;C>;68:8::57==@;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?;<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±ÇøÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨xlpqy|eabb`]^aca`__`aa`_][]grrprsqmry¥ÇÓÏËÐÐÓÔÊÅÉÉÆÆ¿ÃÅÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÐÎÌÔÊÇËÎÏÇÇÏÒËÐÏÆºÄ¿ÆÊ½ÃÈÉÎÅÃÇÀÇÍÈÄÌËÌÏÈÄÄÐÉÆÂÆÉÅ¿ÁÇÌËÌÏÂËÌÉÇËÐÄÅÇ»ÇÃÈÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£xotdk`^fqa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»£¶~h
¤«
}~s_[^^^`^`cdc_]]^_``_[Z\`lrqookloo}¹ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈÊÍÉÄÂËÉÁÁËÐÅËÈ¿¹Â»ÆÇ¾ÀÆÏËÄÀûÉÇɼÉÇÅÊÀ¾ÂËÆÅľƽ½ÁÃÅÌÅÆ¼ÀÉÃÅÇÒÅÁÉ¿ÊÉÆÈÆÑÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¦£ |wstfiZanmZ\XRDLFBGELDFS@54335?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÚØÙÏËÒÍÍÎÈÁµÃ¾±¯¶l^z}¡z
vxurp_[[]``bcdded`\\]]_^`[YZ\borokikposǽÊÅËÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÁÉ»·»ºÆÃ¿¼ÂÎÃÆ¾¾µÁ½Ä»½Ç»Ãº´½ÆÄÂ÷À¶¶¾¿»Ìý¶ºÈ»¿¾ËÃÁÆÂÅÉÇÉÆÐÆÂÌȲÇÉÃÎÌÀÅÿ½²·°²§¨¨¹°¥°ª¬zvwjdg`hodV^YJFJFHKAFBFJ@9:658854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÉÆÍÍÎÑÈÐÆÕÔÕ×ÍÊÎÅÉÅÇÁ¹Å½«®¦`dux~{ttc\\]^``bcbbdeb]\[\^\^]Z[\^hsqmggnpry½ÌÀúÀ¸°±§ª¬§¸´¶´³³´»¶½±·°µ¯²»Â¼Áļ¿»µ²º¾À¸È¹´»·Á½¸½ÇÁﵝ²¶»¿´Å·»µ«¹½¾À½±»¶°·º³Æ¼·¯»¿µ·µÅ¼¾ÃÅÀÄÅÆÇËÅÀÆÆ»ÇËÀÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJFBDAEE?<:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÉÈÊÈÊÄÐÍÒÏÍÅÇÁÆÀ¿º·É¶ª°[gp
zx~vw|sh]]]]_`_`da^cec__\[^\]^Z[[]_lpnifjmnr|¤ÇÀ¸¸µ°«¬§¢©§ª¬³ª¬ª´¶±³©®§¬³»º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶¼Ç¹Ã¶ª¨°²À¶¸½°±§±³µ»¼¬®¶¦®¶®»²±ª¹°®»®»¸»ÀÀ¾ºÃ¿ÆÃÅÀ¼ÆÁÇ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÆÉÌ˳¹Â½»³svvki`bliYWW[ALKMJEAC@FA:9:996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÐÇÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª°[j{x}
z{wn^]\\]_`__dcbcdb`_]Z[ZZ]ZZZZ\enohfhiknrº°µ®¥¤¦¦ ¤ ¥«®¤¨¢«ª¬«°£¦ª´¶±½¹¯·°¨®¸´³¼¸´¼¯¸¹¶²¼Á²Á®¥¨£«±²³¨½ª«¨«®µ´¦¨¡¤¯©²¦¨¨®¦¨·¬±³·ºº»²¼¾¾¾Ä¿µÂÁÇÈ·¾ÀÄ·Äÿ»¿Ä¾ÄÈÌÊ¿¿ÃÀÀ©stsji\aodWVXPHYRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÍÃǹ¹ËÁ˾»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ»¨«dmz}~xt~|swe_]\\^_`^_ccab`a_^]\ZXY[[YXZ\_fkfdgehkor
ª¥«¥ ¤¤¡¢©££¥¦§¦ ¤¦²°¶·§±¨ª´«´º±¶¶®¶¹³°ºº±·¥ ¤¦±¨¬©ºª¤§§¨§² ¨§¤¦¬§¤ ¡±¬²´³´°µ¼¶»ÁÀ²»¾ÃÁ±¹¹Â³Á¾Àµ¸¼½¾¼ÂÇÅÃÄ¿ÀÄ xqlbf`ko`TY_HNgOTHFKF<=@=:;;826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;È´¶½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÃÆ¸·ÇÀÌ¿¸É·»Å¸³Å¸³¿À¬µ¼²¬¥¯³¡£ir
|xusomjiipi_`]\\\^__acb```a^\[\\XYXXXVX[^_dcbegggkmo© ¢¡¢§ ¤¥¢§£ «°±µ¤©ªª¬¬¤´¸·°¬³¶¯³µ¯°ª£¢²¥¦ª¹¢¦¦ ¨« ¥£¯©«¨ª¬°²¸¯¸¹º°¶¼»º«³²¹³½´¶±±¶µ¿¶½À¾Ã»º½{sk_e^ddXTW^IW\KPGJJGA<??@;?<05535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹Ç¸·¾·²Â´±»»¬¹º±¢©«§m~
xrmomkb^aff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bddfffhikr§ ¢¡¨¥§¢¥ ¡¯®®¯²¡¥£®«§¢µ°²²¬©¯³§º³¦¶¡££¡£¢ª¶«££¦¥¦£ ¡«¨£¤¦«²³ªµ°²«²¹´¯ª¯²²³·³®©®²¸±º¶º½À¸³±zuf_f^[YVSZUK[QLJEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÁÌÈÆ¿Å¶ÁÀÇηÀĽ³¹¹²¿¶±¹»²´¯¤ª xxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv ¡¡¡©¤©«§¯°«£¤¸ª¡ ®¨¶ª§¨±¤¸°¤· £ª§¡¹°£¡¤¢ ¡©©¤¢£ªª±¨´¬ª§³°¥«®³±°°¯¯§¨¨²®²µ°¼´º¸®£zwe_aVYXSRTKM^LPLGHLKE=@>=B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾·½®§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbbcfi §¦¤§¨ ¦ ª¯¦¢£·¨¡¡¢¨³¢¥¨¥°¦±¬µ¡©¢¢²±££¡§§¢¢¤¥¥«¤¥°§¥£«¬¦¨®¯¯«¨ªª³¦¦«¯´±¯¼¶±¯¯ {xsea\[]XNLQHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥¦¬·»¼Áź±¹µÄÉÉÀÃÆÅǶÅijÁ¿Å«··½¶½º»µ²«¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZZ[YYZ[WUXWTTVURTRU`a_`a_`acdi¤ ¥¢¦¥¥¤¤£ª«¥¥±ª ¡¥«¨¢®©©®¢¢¢¢«©±¢¡£¤¡¢ ¢¥¦£«¥¢¤ª£«®¥®²©¦¥¦¦´¦ª¨³µ´¹º°ª¬sqp`[WVVRFPOHZ\ORJTLSLEGJD8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«²¨§¯¹¹³ÀɺµÀ¯ÅÈ̺ÁÊÌȵɼ±½Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\\]^^__bdm¢¡©©«©¬§©¦¤¥¯¥¥¯© ¡¯«´ ¦¦£¤¡©ª ¡¡¢ ££ £¡¢¨££¨« «¯¤®¸¦£¤£¬ª¨«¯³·²½µ³«¯
tsh[XYSUREXLQ[XMUOQLQRINJC=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99577570141-+/434988::8::748=8?9~³§³·¯¨§¯®©¨¬·¶«¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»Âȱ¸¿·¼½»³µ¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNOQYZZZ]\\^_`e}}¢ «ª¦¯¬¨±¥© ¡¤¨§®§ª ¥¡¨«¥ ¡¤¡¢¥¦¨¨¨ ±°¦±½¨ £¬´«®§°µ°¹µÀ±®±«~rsbVTVNRJGVPRRLLXNJLORGMKACFDD>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576761321-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ¶·¼½Áñ°±·´´»³´¢£vkglnqnrkpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVTRNNNRWXZYYY\\]aj~x}s
© «¦¦¬¨¡¦£
¤£¢¥§ ¢¢¦¤¦©¦¡ ´²¨³¸¡£·¬ª®¤²²¦µ¼µ«¬±£ysn]NQQLODNNNPKFNNJJNNQIMJAHLHHC>958889:;69:68;99><8:>9;?8789:886857688974577820301*)-/12876:999984988A7w¶¦¤·±¥§¤ª¥ ©¦¤³ª¢²Ãµµ²³ÆÆ¶ºÃÊÌÆ³¬¹½´¸À¯©°¦®º¯{n__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]anptn¡£¢¤¥¢s~{ £
~~tz££ ¡¤¤¢´¯¬°¦¸¦¦±¡°®°¼ª©¯ªwscVMROPMCSNLPMBPQHINSMHJJDKMFKK=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-02764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ¬Ã¨¢¦¦¶£ }w~fWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNTSSTUUVY[]jjpk}{sNXr _;Vo|s
y{}xqp}¡ §®©¨¨®³¢¦®¬«¨´£©£sn_[NSRWLDTJPMLFNOIELQMKOJIMPFIJ=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//((++-3854779<:79;86A9y· £®¡¦¦ª ¦©§£©¯¨§´Â¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅª£±¢}su]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MNQMKIFHNQQMORTVXZ`lmgysPB?}y`JQnx~
mwuvxpQ|~xvhw~¤£¨©¥¤±ª¡¤¤¦©¢ª¢¦¨vmf^[HQQSMIUMSILKOIHFJNLMTKQQOGJD=768:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')**,4833989:99::::?9w¶£§¡¯¡§¨¥§¨¯¬ªµ¼¶¸¶³Á»¶¨¹È¸¶¨¨µ¶ª²¼§¨~}wpoXMKMMNLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMJEDCINOhYOQSTUZnru}ih\Tt~|
{vxsovqtz~«zzhv{prmxx{{vsrxgu
||© ©¥§¤ ¤sha]]JWPRGKXROJLMRJJJLPHLQLRTMFIB<78;99>=:;<98@?::>=7==79937785675251472/2.,./200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²¼¸¶º´±·º²ª¬©¨²¯¢~vx|vooiXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^t{xfv|gyvx}q|w{ok~}t{|tfv|lohs|myq}qmvqhq~pD
wxz}{u}£¡¥xongc[XXUQJSUTOPNQVKNKOOJROINPLFD<;79;::?=9<:99??;8;=7<9999266856633511224.,,-..-0-+*''*.1362/876966527995y¦ ¡¦°¬®«¨©±¯±«¼¸¬»¾¸³¬§°§¬¥©¤¡
yuq{mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX]eprl§ªÀ~tyb{xo|yz}omytyjjq~Inhw~mjdly
lrl|nr|inps
{~{wpttyyp|ojoooYVXTRQYORTTRXUMNHMJMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥¬°£ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡sztotkpldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\_§aisye~omzvtltt|jjMy
g1vsl~~tfeu
gilukq|hqq|n|t~}qqnvmwyujyywkkphfXRZWYY[MPUVYXNIHEJJHGC@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5n£¨±§º¯«²°Â±»ÃÇ
zqtyprpoodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯² q{xl}lq
zyr¡txsu5q¨¡¡¢
vp||t®hgbjnrmpuioXupwm{}mrnp{svnbv
ux~}{sqqm`\]^[YX`_RN[ZXWLHJFJG?CABH?CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®±®Á²»ÁÅ|nul{txxlwnwci^JPG>?6449;;;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lv|~
~u¢z~aªzw~s{]eqtz|wmhjbyo
zoxu
zptyxkni]v||
}q}uw{|wpstfg`[[^S[g^WPTX[UGJJDKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À²»Åº{vk}xs }|p~zgvkRWL@E211366688:<>AEGFGJKMOQQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJh{y|q|z}~v¡¥ªH®¯¯©tm|}hghyn
qGlwryvhmk_v}yzuv|xmpw~ttrl[^^\ccXge\TOPVYPDLKFNICFCC@@CA=988:::;;:888::?>6;>7595773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¡¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMMPW`XpY\^i
~
¡¡¦»±§»Çè¡¥|qv
ihptqw{v
}nvuf «¢zyyogkx{tle^[[^j^bg`ZOKNWRQIPJDNGCJDC@DDA<:87=<:<:88778:==8<=68756623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfw{¤¡¬¦«¯°¡xw|~
mpj]B@4--//..02234778;=?BDHINQRSRSSTRPOHDB<87/9D><<63.lMPHILLKNV`cggmu £ª¥£¬©¶¢¨Á®ǯxº|¡
¢
lpuwqm
q ¤µ©¢}kjk}uc^d`[gl]ll^WKGNRQMLLFIPCDMFBCEFB=997=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENPRTPPQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¥¢¡¢¨¨«¨¬©ª¶«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢xz~¡{w«²|£¢¦¶¯¨lss}}si`^b`bhd`gf\REJKPOIILFFMCHLFGDBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m}aw}{ªªBD}x|
v^bP460-1/,.00//..0015>ABMQRSQRSTRNSLEE@<>=GG@A@8662<9;FHGIJNOQYm
w£§ª´½¸¤¬¬§¨´«°¶²²»±³½³Ã«ºÉ˷ÿ¸¥¢°³¬ª£
¦¦ £¦¢«¨¥
¤¡ «¡¤©°£¦·»¡£°¢¢£¡«¯¬²µ¢¤ªzz~ibi]fc^dd^gg_[OCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhcWioXz
v
ÚÈsV|z
qna@E64<3/110-,+-1.-4?CAMUQRSUUVUN[PGHD<>>FHCEA8;<5C;=FKIGHQOPW ®£³ª²ÀÇê³Å¶¬³¿³¸¾¶¿´Á¶»º£¸Å¨¶Éǵ¾¹µ¨£´°±§¯«¥v¤¡¬²´ª®¨®¶»²º¬¯µ¢±«±µ»·µ®´ §¨£§©¯²¹·¸§¶¨¤xwZceWgbbd`af`[UJDDLUQHIJDIGEA@@KDBMG<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQbcWyup}u
{¿»£¼´y
zxn]V@EM<6:46AB764//6CHCQ[OQUWU\VP_UIKKA@?GKFED;>@7D7?BJJEFVSP^¤£±´Ã¶¸ÁÌɶ»Ä½³³À¶¸Áµ¾¯·t±³¥ºÄ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°®¦¬§¤ ¬´»¢¨²ºµ¼¿Ì¿Å޽³Â·¹·¿·º·¹¬¬°¥°©½°¼ºÂ¬º¨ª}~lXdbYkfjfW\cYVSIGFLQGCHIAHD>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWSYUZvjo~nzsxb¹¡¢{z|}}wzueP\dGEL;Qca[^SF?;HPEZcQRXXZgYT``LSPEA?IJHEEA@C<E6B>HGJLSZT]®¸µº¸È¿º½ÉÌ»¼À¼·µ»º¶½´º±Æ`u²¤±«½ª¥¨««¤¢²µ «§®¥§¦¥££§±´§²³½¶Á¾ÓÉÉÓÇÃÅÌÂÊÃÀ¾½¾»¼·´¯¸·¶Ã¹Å½Âǯ¹ª¡«¤¨¶s`cc_Xb`jgRX`VQUIEENK@>GD=JA=B@=F><H@796379>489:57045/26389373426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrssÕÀµ }~x{|y~s}zkfpuY]\Pedb`ed][XW\MdmURmm_n_XgdUYUJDBKJHFHHHGAI9D?HKTTV\Z[¹À¸½·ÆÀ»¹Êʺ¶¹µ¸¹²·µ´®¶¶du¨p^¢¬ ¢¤«¥§¥¤¬¥ª°¸°½¹ÔÑÎÖÏÉÌÒÌÏÎÊÆ¿¾ÂʽÁ¼ÁÀÄÄÅʾÈ㤻°´¯«¸»{m^a]Z_aZdcP[`SPKCAEFE<@E>AHA@D=:E>=J?37535;=468977022/24169775554D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ\Yh_onlouu³¬¡
~|s{
{ts{ylmu{hreiligjih`fiilZms¤¼g[oh]ZZTHKNOJKPKSQHLAJGJO_^bfia·Ç°¸²»½µ±ÄƵ°¸°¯»«²±§«·«µ§§N¦¥¡§¬¯¨°§´´ÔÔÔÖÒËÐÓÕÍÓÏÍÅÂÉоÉÉÊÉÑÇÌÍÂÐÑ·¯Ã¼Ä¹¥µºÂ¢pe^^^YaXZfZQ]WOPBBHEBH;AC>AG??A8;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeVshqoyy ª¥}|p{r}qxulqx~q{nxslipmcjmpxiw|~Ë¿Áß§ncxnc[a`JPRUNY^P]\NPNTQUT\nmvq¸¬´¦¯¶ª¬¼À°«´¦¤¸¦«® «´£±¦«¬¤§¢¬ÏÒÕÑÍÌÒÔÔÐÔÑÎÈÃÔÑÇÍÒÓÓ×ÌÑÑÅÒÖÅÀÎÇǨ¾·Î{pg_d^XaS^ZPQTPOH>@FABE<@B>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMNZu
wlwp}~¡¡y
~{r~zu
ovrks}{v{sxrjsripqzyrz¾Ë~²vrvhak]CZZ[VecXdjSX]]`d^cxz~©£¤¡ ¨¥ª°¸ª¥³£¡¡£¡§±¦j¢
~§°¡ ¡¥¤¨ÈÎÏÈÂËÑÔÒÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÂËtpebaYUZT\PKGIJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznwpmuux}t
|ylvtn}vux|µ;AÅ¥~|ieWICfcecgjdnx[^fhknin ££¦±££³¡¥ © £±~
z~©£}«³¨§½Ãƹ¶ÆÎÒÐÒÐËÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÖ¾Ë˵zxpf^[SWR[VFGJIEE=:7:@@B:GD?DCADB;?;;7DC75655;0689443341014558754449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt}~
|x
zyqz{uz
yp|oozq{qnzuw}|u~{¯sX©Â¶pnb=^hrpqpnxvehoruxqz ª ¬¡¥«}
~my|®ª§¯µ½©¾ÇËÉÉÌËÐÉÃÒÊÔרר×ÕÛ×ÓÙÛÕÐÚÚÑÖÈÔË{}ji\[QTT_HCFIH>A==7:=?;=G=?AAADA>?:86DB755479.566435532323646553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<::D?CGRj^mdbfkvrz~~{|~
vyn{{tz vutu}too
t|zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥£«
z}¡¼¡©¦¦®¨¶¿ÀÀ¹ÇÊÎÎÅÍÉÑÖÕÕÙÕ×ÛÔÖÙÚÛ×ÛÚÚØÎÜÆ}{ikgaUXVVNLDMB;==<8:<>9=@6=?@=?><9867DA6455=80665547745613855564557HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz|~~|z}
zzu~um|}~s~|~x}xnt}{}z©Ã¡½£}}r~s¦
{hGq ¤
~¥
¥¸¢¨¡£¯·ºµ¬ÀÆÊÐÈÇÌÏÓÓÒØÓÕ×ÀרÙÛØÚÚÙÙ×Û¸z{zmkgXb\TPOICLA<<>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=DRSRX_VXfmmmiqsy{z|{z|{}t
yrzsm~~w
¡n¨
z |}£¢ ¤®
Wr«\¢
¢£ ¤³¡¡¨²¹¬¦½ÂÇÍÈÆÏÌÐÌÏ×ÐÑÔ®ÖÕØÚØÚÚ×ÖÙÙqvih_^YTXYCAHC?>>:49:;7:;;3;;?=>7;9:1:H>:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbymb~omxxzz|
{{v
spzuvvt
}~¦¤¥¢¨r±§¢£©¯n·
ÄȲ¡¥²d¤ÍÇ
ª££¥©¡£³´¦£¼Á¾ÇÅÅÉÈÉÂËÓÍÍÔ©ÒÑÖÖÖØÚÔÓÚÎsie`__PKV\BBFC;A=837;<:8=649:<:82?9:2:I:=67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFu}|m~xz~z~vv{ln~y|wx|~£³¨¤«²¡§ ¥¤®¢·³¡ ¤¯¢¤§©¯¤ À£É¸«¢¥²
¨¢
t²¤¡} ¡²®£¥·¾³ÅÇĽÃÿÆÎÊÉÒ§ÎÍÓÒÐÖØÒÏØ»s{w^bWbXQIJOEBCD5>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGN[\YJga;Hz{m
y|x
}px|}|osz}{x
§¼©²½¯¥®³³¨£¢°¬µ¢¸¥¤©·¦¤£©ª¤¯°© »»É i¶¸«°¢«½£^ª²|}´«¢¢ ¥¯¨¢¥³¸«ÂÈĵ»½¼ÅÈÈÂÑ¡ÆÉÍÍÄÖÖÐËÓ¢q|j^\U`SQGD?=CAB8?874>F<<6<35345454B3::BM:A;AHB;:@<746<B9?@B874:96>=47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeHb`cpJ@~r|u~m}}|pww{«ÂÀ°¾Æ»³´Á¼´¬«³¶¨²®®½«º¤¨¹·«¦¦¢¡££ª¯²±ª£¢¥¥£¹®¨À»¬²¹¥¤§}½°z§±« ¤¬¡ ¡¨§¤¡¤°³¦ÁÆÃ°°»¶ÅÄþͧÇÃÇüÖÐÍÄÊvud_\b]OKCL@EF>A?B;:4>A==5=6>333241A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\gG`igZ][{un~{q~zz¨´ÇÉÀÂÌÁúǼº¯«¹»²¶º³À®¥À¤«°»»ª®«¢¢§¬¯µ°ª ª¢°´§£ººµÁ»«¨²¤¤¨©ÃĤz¡ ¦ ®ª¡ ³ ¡¤ §¤¦§¤¯¥¿Ä®©·µÉþ¶Î²Å¾Ã»³ÑÉÈÁµw{o_Z^lTNIDMKKI@A=CD<5AD;:3=8B332263A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr{~wz¡¨»¾ÉÈÊÂÒÉÊÂͼÁ³»¾§º¿¾¼Ã¸¬Á©¬³»½ª°©¤¥£¬®´¶µ ®¥¢£´½©¨¼Á£¶¶¯«¯¬ª«©¦¥¥uy
££©¥}£ ¢µ¦¥¤£¥¦¥£©¨¢²¨»Àᥳ·ÌÀ¹®Ã³»¾Á¹ÂÂÁÀp{c[Y^\MMNJGDCHBBACK:4DH:;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>kI_XaZdeVx
~ ®§£Ã¾ÉÄÈÆÓÍÎÍ˼·°º¼´¼Ê¼ÃÁ¶·¼´À¹¼¯¨ ©§¶®©²·¬¢§¡«·¸©¥¯¾Ä±½¹³§©³³®¥¬§ ±Å§|}ª¥¡£¢Z¥f£³¥£¬«§§¡¤¨¦¶¬©º¼Ãµ¦´¶ËÁ¸ª¶¬³»¸®¨¸º½¸np\ZVWPGKSMK?AHEDGFG85FM;>7>AJ.32025B55PWN;LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBrFiIRebLF¦¡¨¥¢¯¾®¡Ç¾ÆÅÈÇÎÎÎÒʾ»¶±º»¼¾Î¶Ä½·¹·²²µ³¸²«¦««¸«©¨°°£®¤§¤¥´À°ª¬³¾ÂºÀ¹³§¸³·³®¥®®¤¡sÁ}±¦£ ¨¡ `J¥T°¯¥¯¯¦¡¦ §¢´©ª³½¼»«°²ÇÀ¸¦««±±£¡²²´¤rqg^\PRMEQQPQ;HKIFHAC>9KT?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=REWRsbWFH«¡¨®§
£¥µÉ´©Æ¼ÃÄÈÊÉÈÌÎǾº³¯¹¸ÀÁ͵ȺÀ¸µº±¯¯²´¦£ª´´«©¦®¬¤®¥¥¨¬º¿¨«¶¶¿ÁÀ¿¸³²Â¯·½«£®´¬¸¥¦v¾ ®¡ ¡©¨ ª¡§nv¢¢®²£«©ª«®¥¥ ¥ª¢±§ª«º·½³²®¾¹¶£§¨¥¦¬©©ehb`SLMGHNJUL=MDMIJACD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..SaMVHe^HF¬¡»®ª«¢¤¬££¶Ç½´Á»ÃÃÈÉÅÂÎȽ¹²¯¹´ÀÂʶƱÁ¼µ»«©¬¯£¢ª´º¦ª§¬ª¨¯§¤««¾¼¨¬¼³¸¾Æ¼·µ¸À°½¿³©µ¶«¾¤¢¢¼ ·©¥£¡§¥³¢¥¨ª¤¢¢ µ¯¥¦±««¥¤ª ©¥¢¡´µºµ¨µ²²¢¦ª¡xb_a_LIGHMQIMEFFBRJHADGAVSDH<AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGE¨¤Ã¬¥©ª¨¦¬¡ª¶Ä¼¿¸ÁÃÁÈÄ¿ÍÆ»¾¹²°¸³¿ÃȵÀ°¼·¹·§¤««¬¡ ªªÄ¢¥©¬¦¬¯¬¢ª¨¿¸¦¬½°··Æ¶µ¹¸¾°¾Á¶´²´¯¾££¡¡¥££¾¥©¨¬¡¦½¢¤¢©«¡
¤ µ¬¦²§°© «¡¡¥¤¬±¶±ª¥ª¬ ¡¨ie[b^PJHKOLHECI@=OH@;GIH[ROK=HNU4BF9>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcXM¢£Å«¡¬¢¤ §ª¬¶°£ª³¶Å½À¶À¼É¿Êȶ¸µµ±´´·ÁÆ·¾±¸µº¶ §ª¬¥¤Á¥ ©® ¤©¯¢¦§½¶¥±»·¶µÃ²³·º¾±ÃÀ¸¸®´´´¢¤ ¡¨¨«¢Ã©¬®¦ ½¡¤«««¦¡X¦¡ ¸ª§·£³¢¡° ¢¤¦®³«©¢¢¥¥¤cg\eaMJKKOFEAFK>=IA99JJN]QQI=LW\9FI=DMI8Hc\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\LO¡Ã§¥¢³¡²§ª¤£©¬»°¨¬µ²ÈÃÁó¾ǼÅʽ°°¶®±µ¯¿Åµº±°º¶©±©ª¦¡§Â¬±ª¢®°©¤§½·¦¶º½¯·Ã³³Â¿±Æ³º·«´¶ª¢¥£«¡§«¯¯¯»²¦ ©©¢¤¸¡¡¤®¯¬¤¦¡£§´§§´£¯¯ ¢ ¡¦¬°¥§¢
dh\hfKJLKSBC@IG;;F>89NMU^RSJ>O^^=HPBMLI9Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤ ¨£ª±¡£´©²«¦¢¤²¬®©»²°´´Æ¿ÄĶÀžÊŶÀɵ«µ©±¸¬ÀÄ´·®·º¥«²«ª¦»µ¨°®´²§ªº³§º³¸²¸Àª·²Â¼´Å§½®·µ©§¬¡¥¤¡¡¤¯¸²µ¶ ¨¤£ ·£¤¥®±²¥©¥¢¨¢®²¢¦¯¥¬¦©©«¢§¡zej]lkOQNNT=BANC;:I?77QO]^RVQAW`\BJSHWKH:Ud]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JpiVCWFyfC;¤¤¡¥¿¦§¯¯¡©µª¹¯«¤ª´·±°¹¶°·¸¸Å½Ãǽ¼ÄÂÇÁ¹ÁÇÁºª¶¥»Á÷¸ª²¼£°²¥¨ª¹ª §°ª°´³ª©¶¶¬»¬³²¹·¬¹°Á¹½¾¦Â«°¶®©ª«¦ª¡¡ °®³«°¹©¦ ·©¥¢¢¯±³«±§« ¥¡£³°¦¡©¤ ©©§ £~ljmbnnXRQZTACEU@;;H@7:XPd^PWWDY^^MLRO_KJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gY`F(@8l}h\V:{cC=¨¡©¼¡ª°ª£±¸©¥µ²«¡¬µ½¯³¸¼º½·¶Á¿ÉĹÅÃÁÀ¹Å¾Á¸¯¶§«·²¼¿¿µª®²¸¬¨¨©§»¥³«¢±°³¬ª¶³µ½¯±µ¬°µ±À¹Ä¶«¼¯±·¬¬©¢±¥¤¨£²ª³©ª³§ ¦¤´®§¢¬¬®±§²¬²©£¨¤ ¨µ©¡ §¦£
{gmshps_GYfVDCNXDZ9HB5>]Rh\NY]G[^]OMRXdJJC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'_^aV151=`V^8)C3YU\gK5zfL@¤ ¤¬¶£¬©¥®®¶ª®´¹¦¦°¸Æ·±·¾Áµ´»Å¾ÌŹÃÁºÀºÄ¸Á¹³µ¬ªº·»º¾µ«®±¶¨«ª«««½«®±£ª±³®®¶²¹·ª®²§µ¯´º¼É²ªµ´±´¯®¦ ³¨¬ ¥±¢ ¥¯¡¤¢¥¦²©¡¦±«ªµ¤®°µ¯£§¬¸¢¡ ¥££¡{
{lnyou|aF`jZIHZ[={JGE6AbTiZM\aJ[\ZRRSbaLKE`a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.*A/JGP[G3cYTKD¯¨±©¬¥£®®µ©¶´·£«´·Êº´»º¿¾µ´·ÃÁÍǼĽ·¿ÀÀ¸À½²½®§ºº··Â·¬®²¸¦®«§£³ª¯º¤²±¦§¢²³±²±µ±·²©®«²§¸¯µ³ÄĶ©´µ«°©§¢¶¦± ¤±§©©¢¥¥¤¶§¢°³«§±§°µ¬¤¡¬¨ª¹¢¨£ ¨¤¡w
|nqxv|]Kel\JOd\?b{GI8GgWe[M^bMXYWUXTi]POHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=ELQ<3rkKDC¤¤¬«¦£°²³ª¶°¶«µºÈ¹®Á»Ã·³²µÂÃÏÄÀ¾´½ÁÀº¿½³Ä¨ª¹±¶·À½°¬³³ §°¥¦±¥²µ¬«²°¬©¨´º¬´³µ¬´¬©«¨¬©¹±°Ç¾¸¤¹¯©¦§¬°¥££®£©¯¢£¢£¬£ ¡©¦¥¸¤«´´¤ª«¨¬®¶®¢£¨ª ¤´£ ¡§ x~
}}}rts~~\Rdn^NZg]FD[G:NmXb[MabNVVVWTYg^QRLdZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Ce;6*HdHJ+:I?3CIS,>k>HI©ª¡©¯¤§£³´±´µ±±¡«½Ìº®Á»Æ±´´ÂÃÑÄÆ¿Á³¾Ã¼À¸¼Å¨·¬³¸¼Á±¬²¡¤§©¨¤±£«±ª¯«±®®«³»§·±²©²©«¦¥£º¬ª°Â¹´¬¹¨©¨©§°¥©¤¢®ª¨¢¢¬¤«¡§¨¡¬¦¢¬«·±± ©¢ª°¬¦§©£ ¨ ¡¥
}w
usrvl_Y`ncQsr\K<|F?WuX`YOc\NUVUWP\a_TOOhXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.IgDF8<B05EKX1@\@MF¬§¡©±¨©°¶¬¸´®ª¤««½É»±¾·Ã¯°³ÄÄÎÎÿ¿´ÁÄĺÁ´ÉĬ¯·®²ºÀ¿´®®«¥¨ª°©¦¨²¦´ª°®±¯³¬³º¤¸³¬¬§« ¢°·«ªº¶¤µµ£©¨¬¬ª¬ ¨¦¦±²£¦¥¡¡«© ¦£¢ª¤¬¢¦±·¬¬¢¥¢©ª©¡¥¤¤
¤£|{u~uw¤yk^`ngWfdN@gLDbzWbXReUMVUUTO\]aVKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DAIHD¯¤¢©¯©¨µ«¶°«¤«ª©¼ÁÀ¸¹³¼µ¦²¯ÄÉËÑ¿Á»¹ÀÀºÁºÂÄ®±µ²´»Á¾³²¯«¬¨¶ª¥°«¹®¨°°®±«µª¶µ¦´¶«¬¤©ª£³³¨¨¤³´ ¶®¡©¨«¨«¦««¨¹¶©©©©¡©¨¡ £¢¦¢ª¦´®§¥©¢£¥¦§ª¢££ ~
£txu{x~prggqx\atiO]VHmyUdVRcOLVTUQOXZbVHPjTVSGPYUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02?f=NX?C,?LT_/Ik7QE;¯ ¥ª¬ª¤®³´®ª¥¯©©»¾»Á±¯¸¢µ¯ÉÇÈÐÀ¿½»¼Ã½ºÃÁÀ¿¯±³²¶½¼Á²²³«´©¥µ¨¤³²¸¯¢µ±¯±¹ª¸®ª®¶«ª©« £¡µ©¡¯²¡µª¨¨ª£ª¡¡¬¨½¯¬®¬¡§§¬¯¢¢ ¨§§©°¨¢¬¢¡¡¢¢¦¨¥|
¤
¡
xs}txz{tt{j¤vi^elug|RWp^KxsTdSQ_MMSZgNMWYeYGSjRQ>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mi:38_=ad?F1CP[[+HP;YC4±¤¥ª£¥£¬¦´³°©¤°§ª¸¾Á¼°¨¹ª§®°ÉÆÈнÀ¾¹¾¾¼É¼Â¹±°µ²º¼¹À³´»¹¬£µ¦§¬±¶¸²¦§ºµ´¼¯»¥µ«©¯¤¥¬ª§ª²¤´©ª§ª¤©¢¨¨©½«´¯©£ ®²¢¤¤¥¤§ª¥©¡ ¤©©
}~
¢~rzy~|hw|{uqr~izd`hcr
{mhy]^VCX{mTaPRYKKMpt]IZ[hZEVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°©¥£¡ª¤¶²±¤©±§¹Á½µ°£¹¨¨°ÃÉÈÌÁ·½Àµ·¿ºÈ¶Ãµ´³µ²½¹º½¶¹¶¿¢³¦ª«®µ·´ªº»¨±¿²º ¯´¶©¬®±£¥§©£¤¯¦¯¡ª©§¡©£¨ »§®±® «¢£¬¦¡¢¢ª¢££¡¦¬{}£|yl}vyxb{zrpqsxjujgchansmbjp`oB]ykV^NQQKIMSYVM\^mWDXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3R]=#¬§£¡§£·¯¢¯¯©«¹Âº³¹¯«¨´ºÇÊÈ¿·Â¾¯´¾¶Ä¶Ã²°º±²À¶»¾¸©¹¸½ª¤´¦¨ª¯¸°©¹¼£¾´³¡®·µ§¦§°³ ¤¥§¡¤¬¨¨ ª®§ ¦¢¨°¸£±¯¡«¡¤¦¦©£©¦¨¡ª}~||¡y
}{sp|qst`yxjopqpjsdzlhfdbf`[rjqMNiXZMQLKHPRQHM\_oTEXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0][5(¥¬ ¡¤¡·ª°£´´©©ºÅ¶²® ·¬°µÅÇÀ¶¿Â¹°µ¼¶¾»¿¯¬¾°³¿²½Ã¹©»º¸§¨µ¨§«¯«³¯¥¼¶¤«ºµ®±¸¯©¥§¯²¡¤ ¤¤¡¯¦¡£¨¯¡ ¢£¤¢¶°¡¦°««£¯ª¥¨¤¥©¤¢©¡z}yz
~
zzpqvnot_xwemlljjofrikfi^dt`[kviZJ^\XOOKHHRUG39^^mQEXVYeMHIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDU]hD.<2dW,2¡¡ª¤¡¢¡·©® º¸¥¬½Å³°®£µ¯®´Ãü³¿º·±³¹·¹·º¯®À³´¹¯¿Á¸¬½ºµ¦¢²©§©²ª± Àµ¤§µµ¨²¼©§¥©¯¬£§¤¥¡±¥¤¨©¢¤£¸¨¤§¦¥¡¨¨¢¡¡ ¡ª £¨¤yz
}z
{w~{ltqllsawuiijggohhicfij`kcjh\e{c`StT\[SLJGIOS@!*i^jMDWU^`KIGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gP'2¢£¤§£µ¬§ªº·§¬ÄÁ¶°¬£µ®§®¯·¿¿¼²Á·°®²¶µ¸¶¶ª½³®²±½¿¸®¼»±¥¶ª¥¥³¨ªÀ«¨¥¯²©¬µ»¨©«±¥©¦¤¦¢¤©¡¡§¶¥¯ª®¡¡¡ ¦¡ ¥«¡© y
v}
{s}}fxokjkguskcgddvcefffjjcksZ_Y]mdaNiXZ`VJGIKMRX>9_liHCUS\[IHFFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£¡¤³±¢±½¶¡±Æ¼º±±¤·¬ª®©¹¼»ºÀ²®®®¶®²¸³¨«¹±¯®³¶º¶°¸½¬¦µª ¯£©®¢À ±£®¯·®µ®¢§©¥§¥¥¢¨¬¯¥º§®¢¡¤¤ ¨©§©§|t
|
p~fymhkigqrk\hcctbfhjnlgjjhn]lltpaUcideZIFLMOXQQVaeT@VSYUFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC'4¡°¡¨²¯¸¿¶ ´Â»½¹±¦¶°¨®¥·¸··»®¬ª«¶ª³¸¥³µ²®©°·¶±³µº¦©µ¨¨¡¨¬§¾£®®´µ¬±¯©¢£«¨¦¤ª¢¤£«ª©»§¤ ¡k¢p£u©§¡xni~vql}p^cagltw~gguheW\hsnNPjcgs
g_dfnmj]`aeNKD9FTg^JGPPTUKHR`oteFZQUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.£° ªª£½Å¯©¸Â¸½¼§¶°¥«£·³²³±¹©¦¬´¦¯µ¢¨¸¶¶¨§¬·³®´³¡©³ª¡£¥¦«º¥¥¯²¶®¤©®«¬¥¡ §§ ¥¥§§§ª£µ¯£¢¢£ ¡ ¤¥ªrx
¡vif}rx¡o~}¡ |tvllheczkqaS
mcliqYjpoX^i[ll[qnzr
gZ^GN?G_MERVVQQRWTg^MWIRSPFGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa70(¦«ªª§ª¿Ã¯±º½·À¿ª¥·°©¥²´®¯³·ª©¥°¥´³µ¶´¦§¨³±²¨®ª ²¨ £¢¡¡³£¤¥µ¼¦¬§«ª¬¨¥¡ ¦£¥£¤¤©£¤¥¦¡·££ £¯©¡
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Åzrµ¦»{l±«°xhkX±®nei¼¼nhzorØ~Skc¶²rt¡ªWOWbPVNFU[XQPR\W\P@\DQNEGJ<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦§ª¥²¨±Â½²µÀµ·¾Â«¦³¬©§®³©¯¶´§§¥´¥§·®³²¶ª¥¤§²®®±¦ª§¤±£¢®«¢³¹£ª©¢®¥¡¢§§ §§§¡¦¢ °¢£
¯kjª~gdp¥q®¡¤~x»}k¡v±_j´[¥f`fzfjxk©d¾rg¦u±j|±xtcmm§n[ EhfEu`~h|¤§Y_«ixyj§7J¯\XSld[KNX_\WV;NOXW/ITTJDFF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢¬§¥£¤ª²·¬´½¾°¶Ä²·ºÂ§©°«®©©°®£°º¯£¤²£¨¸¨³²°£¥ ª¯¬¯¦§£¢°¢¬¥¡³²¢«¢ ¡¨£¡¦¤¢ ª¦¦ ¡
µµx
©µv³·~¨~l¦{w«gk±[«{tqx °vwqkkl|N¤XHcc~ch¦`ysuS^P©mcq~b.Q¡o[Skh`LK[dX\ZB>±yXXA#MhFCEA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50³¦¦ ®©§²¬©»¶Â°»Â¸¶¿ª¬®¦±©¡®»ª §´¬£«µ¥¦³³§£¢§ª²¨°¨¥¯¬¡¤¨´®¡©©¨ª ¥§¢ £¤£¢©¥¢ Õ¹p°Â~Å|Ö»|¤¤{¤¥z¬yV¯z~j¹Z¹v}¦|zªy{±nt¼
oP¯§ÅQ zc`©bssm`Sµ´È|c¤3Bv]PjidP@XgZdaJHNmM[ROYfYCD?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ71%¢±¨¨¥³ª¥´©¤¼·Á°¹À±µ³º³µ§±°£°²¦µ§§¹£¯± ³´° ¤§©°©´¨¤« ©§°¨¢¬¢¨¡¥¡¡¡¡¡¡¢¦¡¦ § ²nhµq«n¦r´sr¶{¤£¡¥~°vÒÒv\®{
¤oª¦k
}}{±sy³etofRÈZÂ\yb_`vtb^YÊo¿uMKµSUÆdTQjcfXAOk`lhPUGI8=VQZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746@>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥¯¤ª¼¦µ¥§¶»¼²º¿·µ³¹º³¥´´¡±±¢«¯¤¦¹¤±°´¸ª ¦¡©¤²¨¬©¤¨¢§¥ª°¦¡¥ ¤¦¥¦¡¢ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
~w¯x³aelZ°XKuyf`^vwhk]¯wxl5yÈ®²_BTo^g`EPm_pmVUM.echRXQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I:99¸°´Á¨³¨©²º·³¸¿¹·±´»´¤¸³³¬¨«§µ«¨±±«´¤© ¨¡¶§¦©¢¤¡¢¥¦¯¦ ©¢¡¨¤ ¥¨¤¬¡ ¡ ¦©}}¥x¡ªp§¡£ª|xo±Z¨ ytØvt¨£|{²^d ~l\«[Zhgªdr{ks]¬Z koeOJC¡\[Lt]bgM[a_rs_JV6JXHE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¡¿«´Â®¬©¦´°·±µ¿¹¹±°µº©º´¯¤¤§§ª°©¯©µ¬ª¯¡¡ ¦¥¤º¢£« ¢ ¨°¯¦¨¦£¨ª¦©§ ££¡¢¡¡«®mr´r©v§s´xs³¤£¤w¸o{¢jk¶Z
ei¡¢§mr´t²j
ku³af¢oj\_M¡|Rs£ly~oq\¯V<weTon.\§OcSkebmZc]ap{cTZQ>>mo3CB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¥»¡²À®®««§·©¸¯µÀµ»°®¸¶ªÁµ¨¨ ¥¤¡ª©§µ£²¨¯ª § ¤«¸£¥£ ª¶°§¬©¥¥¬¢ª²£¦«°¡£¢¡©«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~tª}¾ns¼t²uxnqn¤t½^w}[ay¼kZV\jy^jaegbmxoY[YCA@r@CF+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7B9§¡¼¢±Ã°ª«¬±§¸¯¶Ä±¹°¹®À±«£¢£¡©£ª²¤µ¦¥ª¦¬¹£® ¥£®¹²¬£§§¤¤¬ ¨«¨£³£¥§¢¢£¯ ©
µ·xµwmknsoytÁ»½{²¨pt¹|{|¤»¹½uz´£tvut°ufjµtrqw¶^z}hymyc¬pu
Y[§jEeZTf`c^cQhgqmuBMPLD:ZM?J3;0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O^]=+:VV'>;<§ ¡¿¥´Â´¬«¨¬«©º®°Å®´²¶¦´¸¬©¡¡¥ «¤ª¦µ§§ £¬¤¾¦¡ª¡¡¨¡±µ·¤¤¢¥¥ª¨¥¥ ¨¦¦£©¡£°¨§¡j~i¥xr}tzd{½¾ÀºoqasjZ^ack`dmwbke^`cqir}
gj~rtx}~b[wthP\n}|kXlzsJJopNtLEW]gaLZXgc_O[nuirRODEN;HH=M?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P_L(3=[O'?2>¨ ¨¡Â£´¹µ£¬¥®§§µ±«È«°²ª´¢½±±¦ ¢¨¢¬¦¯¤¤µ©¥¡¦¨¾§¨¦¤©¨¯²¿¬§§¢©¨£¬ £¢§¬¢«¢±§ ±¤¡¨¢£¥¡gn}qw
µª ¡¡z¤lj||uqxyvv|kstuev}wkozm`c]phMXZfj`WZpznmfSOFS9OYNRO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³¡³¡¿¡¤±²· ª¦²§¥°´ªÈ«°¤´¥À§³ ¤¤£ ª§¬££¶«ª¥Á«¤¢¢§¨§²Ä¯«ª§ª ¬¡¡¤¯¦¡¥¨®§ ¯ ¡¦ ¢ ®|ª¨{£f¡³¯
v{}vyzofzkuysis{vkudyf`jecdfkYl{pij\SLPD_TF@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¿¬«®²± «¦±¢¬³°Ä°ª«¢²¼£³¦¢¡§¥©¦¤¥²´°¥®¾ «¢¢¨ª«¢³È³ª¤ª¦¨£ª ©¯©¥£«¢® ¤¯£¨£§e|e~dylhk{¤ªje~geeih{¡kh£wkj£sln{zXe^^mv\hswwnxxsmytv|jY^lud]sik|qkc^RNWJdXAJ4>G7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³±ª¥¨°¦°¼±©¦£®°¬ £¢¦«£¥¨©²£¢¯¥¶¹¥®£¡ ¥{¥¢¨´Ä¸¤¢§¯¢££©¨¡ ª°ª«¤ª ª§§ «¡¥°¤ª ¤©~½r´rhx¹Ä¸q¢£z¦sª|ËÀÀ»q¢}À½ÂÁ||ÃÀ}k¥²noÊzwvzyqzpw
ynxcf_yd`ec^thldbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BQ/#F[3PY/UAB;/8£¹Ã´°°À©¨£¯©°®¦³´¯©¥¦¦°««¢ª§¢¬£¥¨¤¤´¤¢¦«¸³§¯¢¥¡§¬¤«ÀÀ± ©¯©¡¢£©£ ¡®©¬§££§¡¦¥¨¤¨©©¬ ¤ ¢Îxz¤y_®^§¢ }§t«¯^cª{§
u³c«¡³j
¯t}·aY£Ímu{Ú{p~v~e{vvk|n}
~marlph`_yd\qhjdf`RTRW]KOC5AHDD8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸¤ª¨³«¦²¬¬ª£ª¦¯ª §¤¢¯ ¨§£¥¡°¬§®¬±ª¨¬ ¤¥§£®¤«°¨¿Ç³¨©±®¡©ª ¯§«©§¨¤¢«¬²¥¢ªª£¦¤¡° ¦ q
t¨q±|q¬~¡¥wª}s~«v{|~ª¢~«{{VÄzoÁ}muomeveoawnromfpuuqagme_oiingdXS\aYQSC9II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´ £££¢¬¯¶®¨°¦¨ª¦¬««§¢£¡ ¥«¢¥ ¨¨¢°¬©§®¬¨¦©£¡ ¦£¯¬£¬µª¹Í²¦¬¢®¬ ©²©ªª¬«¤£¬¯±¢¨«®¥¥ª¨©±¢£¤¤j¤uz©tz²p¦q ¤`aR«®v¦z{f£¤£}©®_}©U¢z¢{ïÅr¯³³¹qb©¯Âthmpnyxypmfeeqpf|jc]W`iXXULLQLCCAB;CA@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÖÕ¿¡«§¡¯¢°´°®©¬¢§¦©ª«©¤¦ ¤¦§§£¬¢¬¡£¯¢«¤µ°¯ ©¦¢¢¨ ¥°¦¤¨±¬¶È²µª«©¢¥³ §¬¬¤®ª£¢ª¡³¡ª³±¡¨§®®¶¢¢¦|ªlu«y|°o¤Ò¸´¸É²_`©£ zxªÉt¤¨©ÆÇxf¡¥s}¯]p´b°uK£m§Gd|qq{u~|o[fjrpek^aYcm\^YINLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ©³¬¥¢²¸¬ª ¥¨¥ª«ª§ ¦¥ª£®«¦ ¬©¥§µ¢©ªµ²¬¥ ¥¬§£ ©¦®¡¤§©°µÃ²³ª¨¤¡£®¦¡¥¦«°®¨¦¬£·¬¡±¹¯®¦²²²¤§¢Nxz£}¤¦¸{|y¹~ÌÆÂ¶x¡~v¥¤¨°
¬}b¥l¤p
}r¬`£sq`¼}RUt£{~u{s
q]nnxrjo[d_hnbd]LLQTAIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@882.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª¯ ¡¬²³¥ ¥®®ª§¦¦£§¡³®¢©§² ©¤¢µ¢¢¡©´¹£¢¢¡±§¥¡¢¯®¤¨¢¶²Ä±©©§¢¤¥¦¤©¯¢®¥¦¯¤»¬¡¶·´±·°²¦®¢
ѵ÷y
¦x¡w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{|m©a£qqbs²¸hw¦}x}ynjyiyrnu^ednmfg`J[XX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¿¿¼º´§¥µ¡¢£¨§®«¬¦¢¦ µ§£©§±£¬£¤£ª´´¤¤©§¤§µ¡ª¤¶«Ã°©«©¡¡ ¦¢¦¤¦¬¨®£¥¦½¬½°¬¢¯²¹ª³¦¨±¢¦y¨}|°w¤¥m²o |¡¨¬
®
ª¡¡{~««xz¯]£}¦§d|sj¯]¥kp
]`[ m¦{{lnc~tnz`geqnhghBZa[>KT3U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI8052.*,ATVVVTTUUUUTTUTTTVWWXVUUQHFIJ#((½©ÆÂ¶Á´¬ ¸¥£¤£°¯ª¤¹ £« ¯©®¡«¨¤®±¬¦¦¬¬¡¡¥¡¤ ¨¦¶©À¯¥©¤¦¥¤¤©¬¬¤¥ª¨¾¤Ã¬ª¢¡«²¹ª®¦²§¨v¯~
}º®e°e}¡¦¬°
¦¤¡¡
[lj³`{{±mgo°[}´\¤kÈ¢d{¼XvµZ²}R®z¬X¡n¨|z~eu~bxt|ajfqmfefOVd\BU_>J(>:=4!",%2. *1/04579:<ACFHJLNPQRTWZ^`_`ab^_\[XUPNJFC553./@UZXWXWXXWWXWVWWWWXWWXYZZ\\XWWGB;Ò³²·½º³Á³£¬¦¤¶¨ ³³©£ µ ´¨ª¬¯¬¯©¢¯¬¨§¡¦®¨¡¤££¥£©²©½¯¤¨} ¨¡¨®¨¦¦£¥©» Ʀ¤¨¡«´µ¬®¦º¬««©£¯¤¸Ãº§¬¯¦¥ª~սªb£¿½}~£×º¸µ
½¾k£o«lz²°Çj«°½¬xw¢¾¼s§{{d~{dgy{`kekjbPa[Sj\@UaCN)=:4/$%2 $(0496678:>ACFGJKMNNQTW]a\__a^`[\YTQMHC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»³´±¿¹²½²¢®¥¥²¦¥¿ª¸²¨¡¿¦§²±º¨¯¥¦°¬®¥¢¬ £ª £¦§¡¨¢¡¬©¹¨£{¦¨ ©©¡ª§¡£ª»¨Ä¢ ®£ª³´ª¯©¹¦suª¤·d pgmow¤u®pq¨£®¤rmmlfxonqzjqigqiigpd]bjoY]g~w¦_aqnee¢ ~wgxikyydlcflbKdXJkZ:QeER'K:+# ",)-2.5:4579<?ABDEHKLMOQSV]WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³©¹¸²³ª©¡®£²©¾²Äɾ¶ªÀ¬¬£¡¨¬ º£¤®¬§®©
¦ª ££ ¤§¨£ª ¦¦§°º«¬{¥¨©£±¦¢«¹¯À§¤²¥¬°±ªª¦¶¢¬¶ ¨¥¶£©©³£« ±¢ ¢ ¥¡«§
¤}g~tvtq§lz¡£sjwqxw|zjldcodUaY@j[HcaOY+F=+'!740.!%2(*699469;>?ABDEJKKMPPQXTVY^`ac]^UQJED>9=@ASX[\ZWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥´¶®®¢°£ µ±¬Ç½Å»¹«¢¦¦±¨£¶§©µ§©¢¨¬¤§£¨¨¦¡£§¡¶»¨«{ ¥ª ¶£§«·§®Á®£¶¦¯¯°¬¨¨²·»¥¤¦¶¢§©£¬¯¡£°¨¯£ £ª«¡ª
}f
uuysj
|¢£
{sszr|jod^pja[`YncP`dPZ:GGE>2==8/+&+)&&416668:==?AACIJGJKLMSSSUZ``i`eVPJACB:9EMV[^^[Z\[[[\]]__]^__aabaaa`bbbdb\[c¤¨¢¯²¬®£©¦§µª¥´¼¯¢£z¢±¤¥±©¹§£ª£®¢§ ®©¨¨©º¶¤¥y¢¨¸£¯µ¢¯¯u¤½£²wy©°¹u«£ªd\bv ¤}n³£§ª£esyp¨l¢¨e¥wjvp{aiZuhhs{¦fzyjoykqe_vplkh[gebbpS\>NNNSG>@TD91/&4:306678<;>@AAFHBGFIKMTTUY]`hfgWQJ<DG<8UR[`ab`^`_`aa_\]__`aabcdabaaedchd^]f¦£ ¯°¬«©¥¨®£¦¤«¶°²§«¦¬t°¨«§¹ ¤¬¢§¡u¦©¤º´§ uw ¡§²µ³»§ ~§¢z¢µ¥±ª¯£y¬¢§©§
w¥z§{²z cympyp
txgt t}¢
k
lx{qqgdxojlj[ekjet\^ITLQ@E5.ZTU7)!09=>743568;:=>>@DI?JEJKGSX[Y[aahfYQH9EK<>aV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah£¦®«¨¬¨°¦¦©¥®È¾±¢§©¶¬§¢ ¾ |¬¡ §¢¤º²§
pu¡¥«´´Êª·
¯°¬©¥}¨r{w§h¤y´¦¨Â«¡r¥}
±¡}¡ |
mr
yq|uÅf©£k£q
hwt|whhvqhhk^dpmgmXgG]RM2D46Nac7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^jm\QE=LM@JdX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢°§©©¦«£·°©ª¦ £¤«¤¥«¸£°¡¨¥½¡y«¡
w¤£¹®¤~bm¡¡¡§~¡§
ª
£©£uk¬uM«x¨§©«}¡{z§ikg¶~n`dY{dhr}yl]|m_Sp\_ky`Ye}p§ªk£nr¥p
jf m[o}gZ`bWPowfmtskjo^kpmliXiO^XF9A4GD^k4,ICRMN=84859;6@;;>BO>QRLMBJ\]_W^^cv`MD:MOMTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ª¤¦¬ ¶»«¢ ¢¥®¡®¶£¨¡ §´u¦
¬¤©¦±§¢in¢ ¡¤£¡ w§¡§¨«¥x|~¢ps{ym¨{¢sv¦f~w¤_z}s¢n·´ºtµ¨dƸ{p·q¤bs¬«`}i³~n|q£lr£t
¤`³q}´ts[²jbotvqioXklrrf]i^cLD=D6QAYq3=SG_JR=<395::6D;;@JP?UMNQ@E_^[ZX``|dHC8LWUVcaZefkkbbeadc`ab`dd_`cknccddhdbgfchh£¸« ¤·´ ¢££¦®²®¬ ¡¤«x
q¡}¨ £©¨¥~k{~} w¢r¡¨¥¦©}~z z£xt}¦¢d¡|lhn{§}rht«tªh]
vhªj¸f\¨p`^§vu~huom§]¨~x»k~ª[]³g\nrzxki\qjxyc`fXbBQFO7VCRo5K[Z_OZD@151;;6H?:CHU>YRY]>Db^V`Qac}jEB9N[]YefXfgnmbbe_aa__``ec^bdoq_deekecihgkiªµ§c«¹±¯¬¦©¯±©£¡ ¡¤jr{z£©£ ix{¢ ¡rhp©¡¦¦{°£¢¸w£³¢¤y{ª¢q¡|
¯µ}k¡x~´££«¨|}tªZ]o{xbL~zz
cyBLY¢jr|mux±³§wns}ptk¤]vHedatq~~nf`liv{debR_W]UW@ZFQhDSW\bX^ID=B8?B:IF8LEXAWR[VDFb\Z`K`m~rEC<U_bZfjVghmobfg^aa\]^ahb_ecvl^egfkdflihki°®T^ ¦³¹²²©¢«ª¢¬¤¢¨¡woy
|r¡s¡
©|l
q¡x|£ £}µ{¥z©|§hwm~t¡sq|p®}¤¦£o^¨gu£co¥aÓ|{xrsc¢~£s¤vk³`sª²¨¼wm~¾¦©´^n}qnr¢r]¤gs¦ah¦mÔ}
pz{l|xsn©¤gaezqkgfdnuwg`cS\fQQbIWJTaWS[ej\eQFCKMJKBKE8O@QNXSYOSQafejRcwywIFEc]eZhjTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°«T\K~©¯±´¯³£
© ¡¤¥¨ © {p}h}wol|¥«
zvnw¢{£¤³¡¢¶z¬§¤®¥p¨
{¤¡r£®¯¤¡v´µµÉ¡s`©my u¡w ~oLf£ps¤{ztak~ kqd_q}tizi³µ´Æ¦s~zk«v
mvxj{urPE}´^jvkyfjhbtupnV^TYiPSiJVMYTV]hknVhWNKAJMKHJOAQKPecjmeussy|nu{{TPOl^h[kiRjhilglfce`\]\^ibdik{_]dhcjfomeile¡¯¦f?¡²ª®¯µ¢¢ª¢£¥¦§¦yjye yui
z¦©z}yp¡y ¥§fnxl¢d|q¥wpg¦z¤zrv¹n¢b}¡mriªku mn¦_ihu¢}`uobh e~iuocfmr¢Z_[b¡m]n{~srd¥mw¢dg§hsp¢oUo _f¨T^TnmskrmpikyskoRYWWgZTmJYO]IXiisjYkVQREV\LXSaUik_wt{}p}|r{svv^QrbgbpgPjhhklnhdg_]^]`kcjivu]\cicjjslfkmc¤¦zetm§®£©°±¦«¦£¡¢¢{qh|st}{d|¨¢¬~si¥} ª¦¦x~¥²¯¥wx©s¥n¤¢»n}¥¯|¥zr¨ f~o«cx¨l©¢vwª¦j°kv³©kmm`~«ªv~¥v}¤ jw¬g¶tw¾¤Y¦«aurtq|tqcj~nhlSW[Vab]kM]R]J^mnv`[qY\`[ftenorbqt`wz~yrys{{vbxdcmsdRkgholrjfia`^\bkbmlzo\\bibljwmglnb¥ª¤©ª¨¦®¤«¥¥©
tzp
~tt
rm}{¦¦¦
vol©ª¢u~y®£q
x~{r§q}}zx{~~v {}k
[yyrzphn~quqe^wtruoynnm
^vhxe
©}t|jpv}vnmgsy{x
\kXyinxrroxxp]lnigV[`W\fkdVbU_Q_pxxlkvfjkkv}qrusaoubt{xuzuy
}{mldxn^Wnghukxjije\`Zcjemqtn[[bldllynhloa¸¨¦¡¢¦¤¥«¢¡¬¡§©r|}~
{trp
{}
y~¥|§¡
wr
©
¨ª~~¨¦woyn~¨
p}qkp}hm]sqtkvtYrn}~j]jd{
`ixz{u
gwkapqv^r¦
enwqzqghe{z[\jgnv[{yxunssf\mkkbZZ_ZYlq\_aZ_]ft~ztptckkk|}s|xudmuhm|~vz|{zz~o{}s~ysiT\qiluougkhd]aXkhlkqrmW[enlgsyohjm`ª°¡£¡¨£¢~ ¢¥{
}s}v
qor~z
¡¦¢x
z¬¡«¡¡££ª¡§¦ {w§~²¦²¥k|wxe|w|yt ~}uos~w¦
}ym}zjrhatp}zwwpwt]^ohn_^Z]]ThrVc\\blhu||sopdkki|nyrjpplg{rx~
{m|yx{}zyNdvjrmpzekecb`[tfpfrqmU]ltmiyzqgikd¹¢¡¤ {« }y{nxs~mk~z}
¬r}{ª¦¡¦¥u{¤z|ª¡ª~oxrua~u
~
nyut¡
s||rr{zx¦
w~qm|nhlmh_zh}|vuvu{w\_p}nu`c[]^QgnTe[^bkivz~qlmdkjhlslmunyp
ynv~
vq~{z|{`i|juhiejc`i\duhobumlUcqyepz{sejml·¡£{x§¤yz
|n|ys
}}kh}|~}©p¡¢
}¨x£ £¡£}w ~|¤ ¡¦~~ttpv`}q|q
hwqx~}r{|qxzzy¥z
v|gs}y{qlkg_~sh|uvt}sj^`svpwdcY_^RkiUeY_ahjvyqgkdmhekm~hpqk}yzks~tv|z}jrnsibhlb_qVtomn`xhmWjtvcuz{rbjoy²¥¥ |v¥¡¢x{~q{tv
~xgc}y}y¡~p¦¦
w ¡y~¤xw~r£¡¢~|vq}nzd|
pleuo{|w{
|{q~w
y¢vw|xazy}txgmeajjwstu}q|bcasnurmaZa^[leRcY`ahkvyqbjcmeh}lhuinog}ymqt|~z~|mvttmeljbcuViqn`xglbjvpfy|zq_ql
®¦¨}xªzy|~||xtyzt}d^}~u}~}
¤£s{§¡s¦sk
zo£|yqzkul{~~m
xp}~dri{~sx}vw|
|¤xt}tv
pb|vzq}obocd|cnovsxwstau`olumo\\_^_j^P]Ycahmt{k_ifjchwnflijlg}{wns}t{}z}}rzxxnljh_irbhqoevgnlayik}{xpawmª £¨~w®}w~{}{vxptt|o}|a[~szz¦}|¤n¢¡nf
zp¢}{srukpnu|tnqu{{dplx}}ssyn}
{
¨z{}
w~qpdiyuup|b_pakt^qj{yylspex]nlsmrYZ__akZPWXecgqq~f]jigbgqndigdiizwuo
t{u
x
|x
zw{zrxjk_phtjromqgole|cnzwqlww~¢¡¨ ¦uª¡t|v
xyrs{
krpzmvnq[X~wu ¡x
m¡
j¢e
~w~||nuplmop{
isqwuxfrnu{yyvso{
z
£{uwynl^susqpxZ^qapk^pj}{qmmjlv`pojqmZXaabnXQTZfgcvob]kndbfkn`ff_gkurspuxuy
ww
|{vjqc|c|nqltjholvx_qy|tut~¤§
u zrxtpr
squkomvmv~mnUQ«wwsz¡x{¤
|s
~hg
qx{z||kvjnkll{az~vzx|ygsls~
zqyovzy}|zv}wpjlzayqnmrtV^pbra`lnzqhpffsthpkawe]Vf``rSQN\fe]yp|_\irbbefj_hd[gp~pkqt}v|
tu~y{xs
~|yxfrj`}ookz`jntu_t}yxts
|x °¥
wtvspo
tprpkjwnn}}musRMßÈÖ|puv w{s
¡~wz~yufk¢
cqz{y
|~l{erokkzy[yz}~zzhrjs
|k}~n~|y|uwxrmgq
nkuphjunS_pepZ`lrxgkkbfxrppc_w``Vk_^vPNKagc]zpt\\ev`aeecafbXissmjqv}tyuv~sz~r|~vesn}e~opkZlnyysav{{vrwwy®
w~}
twpyqnomoseeyq}my}jhkc¤ÁÜ®ï¡slvv
£o¡r
£
~zuxvum
|¢
^m{}
v
}}k}dxujnysWz
y~
~xeri~kum}x~trwusqgvzcunqbjwhRaqgkV_otzard_h}prmZcrabVnY\xNMLdgb^wsm\\dy^`de
`cc^Yjrknkrw~twxw{q|~{t~shuqymzntpWqzvyqexyivr§£
}pxy
¡|{swpsjpljm|u_axw{qu{g`d|ëÚµÉÃÜsltvjq
|{
vxru}n¡aj}}q~qwhvritwkZ|
}uask~~|mkx
{|~npyukqlsy`ujo]kw`RerhfS`pvtap`]hqsjWghbiXmV[uLKLfg_brs
i[\ey^^dg{ad_]Yknfoisx~ss~zvzs
|vw{ulwuyxtnx{|Xzqogywdv
q
¡¢sorw~|xrsnodrifmxx\_y{{qqjagaÕ¶¦xnqw|qk{i||}ztz{qt
u
~ag}~~m|tkmwutwvkc
~|~o^qp{{~ypfyz}nny~umnll{~ciljYnwZRjsibQcsxlbe^Zjnsa[g_dl_nU[pNHOge\gnql[[cs`\clwde]]Zklbmjtwqp|}txx
|uy|vpwy{om|w^tmiztsgs|r vv~mv~}v}vqoljau|gbjuzZ`x|zmqedhgW^qs¼Ävqstk{|}|u
vv}quqsze}
r~g}{y}i}vfoyxswslj
yj]pwz|
{}rhx
w{}mkz|vtoih}we]qcXptSToshbNhtxfa^]XoosYeb]jm`pOYlRDThaZknm{oZ[^lcZcpvdg\]`kjclisvqn~{tuz|
v~xtryyoo|qiyz~mm|vkjxtk
n}vjxzozsqljd`t{i`fr{[as}zgpzaee±²wJbZ¤ÙÐr{y
olzy|xxoqt}{jy¥~n~uw
oz}oxh
xr|e}~ucpshyqou
{vxyjZo|r}
zrmpqxwmm}vzehj~raZx[YrnNXrsf`Kmwub^[[Yu}roWg]fjp_oNWiR?Yg_[pjgyq[[YkeYcqy_h]^elhfliqwom}up{v
qq{}zzujzlo~t}or|{poxf¡
gphz~
|ixrklf_aoym_boy]dlzaqv_eeÕë¾2:>ryw
nl
u}
|xnv
wnlu{ufy¨}mtvx~{xlsi~xm|{xayqdqi~mtqt~su}snZk}tx{|xypkqx~tmjvuu\iixqYW}SZreL[sre[Jqxp^[[Y\uuhYb[genbiMWfQ=^f]]vf_tp[YUodZeqyZh^`gmgilhpx~ljyn{}zu
pnw~{{i{~kt|r{sw}zx~|kl~ki{~}kuqghc[bgso`altahpzast^cd n\5Y¯µuj~wuwpl
tyx}zsgv~}op}hwynez¥~n~v~{|q{}
|i~mk{zjzvr`w~qdrgumu{
|~owy{t}lWm}uswuzwrmr~|}znmimun]hftrR[{N\q\O\rodVKsykXYYZ`qu`]]agdhhfNZhNAad\`vb\umXXStaZdnrWj^bhkgmlipw|li}}p~~{zwr{oqw{j~{nxyww}x~zm
£{vykmy}{}prpcf^Yg_pp`ahpfjouato[adiv{¾¦£È¸r
s}ytrsp{sutwyyqcwyirufwvcj|}r~sw~wzkxy~uhzilysizv}h`w~jjsh{iv~z}}q{v{s}aUu{qs|pwwoo}|x}|u
vhqhlrp]hctoKevL^oUTYsmbQOtybSXX\apt[`\hedcjdP[qIDdb\cq_\whUWVw^\enhVl^ajgeoohpwzniy~s{~y|v}pvsmw~q|xyztxyvo~}zw|htz|vgpn_d\XeYmsaaaqllhn`siY^dmw©ÚªÇ³rypv}zutu~wpq~m
t
xtl`zyfqogun[m}y}x{mtr
{
muvnhwfm|vmjwv|`bxzhuuc~{gt{tuqz|l~YVr|otxksxjt|y|w{r|sgtdmmt[k`vfHnoL[cXWVxmbPSuwYQVX]`ro\`cmdc]nbT]rGCf_^fi]Z{bRV\u[[gkaVk_anfflqhpvxtkuvx}w{t}oququ~{wx|}
x|}~{~svyzwuy^~ytw{bnl[b[[aUjtd`[hopgraqfW]ck|Êι¢knnmr
r~
{
zytyuu{jmucvvog_|yeqjjqcXm{sw~{mpp
zy~qqo}ghrcnxrjlqw}|z]eywiuyfvgt|rjn~xm{\Xp}ls|nnpvfv~~u{qzs{yqer`mlsXk_x]IolMWV_TU|kaOTvsQRTV]bt
h\`kjfbYnaXcpGAh]`f_\V{^OVepZ[jh]Wg`_rfjhrhqswxnt{w~yus
pp{xwuy
z|u~}~~}|xuyw~}nuydto
zucnjY_[]]Uhse`YdrrgsbkdW[`ix¾®{·mbtit|rz{~xxswo{wejn`urib_~xyfp}hjk[Wox£
qqxtmr
}ytrohyajmamvkgklzwzw[g}|xes~nteu~pfkztltb[mzjt{zft}mpgt~w|~q{ky{ywpelal~mnVk`xVKklOROiNY}gbNUvlMQTU^fvf]aphgaWi]\liJEkZbdVXUyZNWnjY]le\Yec^tfldrgsptxp
vx|
}usnsy{{sr
y}v}{~{w|wwziv~|l
rq~oflgW][\[Sepe_XcsuiupdebW\\hporseeyjtvtt
xzwtunkzpagkgtmf^_|o{}hmwfidVWrp§||vs|r{ymzzv{}uprmgu]mi_ludgfizo{rYgvugpxvbw
|njmzpere`kxfrvz}auvikqtzoxxr|e}~~xvnceal|mkVjbrTLikPLNpH^{faNUueKOSW`kw~e]gsie_VcWbp]KKkXdaUTUsWMYveZ_k`\Zce_wgmbpitoq~utxx~z}v~
nrt|ztq
zut}
|~z~v{£¥y
lu|{uzo
sz
}unjieV][[ZScne[Xat{jhmh`bW_[iikoglaizyjtuto{}vunzhjyj_eniwhfXbwi~zoiogf]UXoh§vz|xun}mqtx~wt
vjrvgho\me^ns_gbjxh{m[mstjo~ywbwx
sqpyqbph[nwdps{xarpgixsqkwvsubz~wupcccm|}kkUibgTLmiPGRlEaxfbMTs^JMUYelx{f_mqjc\V_UooWJShXg^XMUlTK\z_[_k]][be`zhlaoounowuz}wyzyz}qttzvt
}}ls{
}~{v¬zlryvtno}tjonddX_ZZZUbjg\Z_ui^ml\aV\\kert}ij]lwvhuwrn|~~zvslzgiwg]dshzwccTdogwvfhjaWVYhd§n~xzpo{fxnyzvq}~ndvsdhh]lb^po[g^muezi]torkq{~uvcu
{wru~s`plYprbqq{udrl`lzojhzwtpdtyyuqdadms~jlTi^_ULtcQGWbGcwfaLTqYKLXXglvzeemqfcZX]XvfTJ\cXiXXHWeQIcy[]`l[^\bd^ij_otxnonvyr}~vvx}tuuyzz}~jt{}~
y{~|sq®{{~fqzt}}vrom{~mzbpobe]eVZYWcfk`]]siXpm[^XZ\l{cqwvmc[ntthuvqm
yywnotehte[gufvvz`]Sefjs}aci\UX^bd¥hyt
xlnxfwl{ytrx{xhevm`fa_j`^ukYe]onbzf[x|knnpwytuerzvoq|qawcZnoapq{seqd^mvicfxzskmts|rqb^emo}eiThYZUNy`RKZYHbudaJUnTJLZVilr{cllscaYZ[aw\TKc]YjSVGYaNHjvX_bm[[_bc]
ihanxylojvxm~vuttqvvx|}~~~px}yxy~ssp¢{{yduysyvksply|pr^poagblT[ZWidmf\\rfRrm[YXX`lvdjujj_[mtrmtttk}|wonldipc[krdtvs\WSd`q~q\ac^SZa\derqskjxlnoyyzqvryzzdfug^b[ah\^wiWb^phaxa[{vjjrowtstip~vrjp{levW[jmbprzseo~[`oqb^io}ljr}qpwkp`[ekm{agTgUXRQw\SPYRHcsbaGVlQIPZVklk|emoqa[ZXYlpWSOfWWiSTFZ\OIruY`dmcXa`a^jcdmyxkoiuy
{k}
}y}mqowz|t}txutpuo¢s{{fwon|pfxq{lsvsk^tnagfkS^\Vhbll[\qdNom\VXUgithctee]Zovoquuzl}}wscdkoa]nmdsxkZTVbcw||p
\c_cTZ`Zccnprjgyneruqzkysunz~u_fsc[^WbdYaufV_amcaq]]~ohisqspuukl{
qrfn{opnRZejeqsvsblvUbqk[^nd|ekt|qrrjm`Ycijx^fTeUVPUoXQWTPHer_aFXkOIXTVnid|ikxkaW\U[tdSRVhQYgTSHZ[PNxw[`fliZb`^^nbfkyunnivv~~m~{~krgtzu~r}
{ss}un¤swxn{`d|qgysymmqvgd|mcfghS`_Ug`lo\^nhMil`UVSofslexde]Zquns{xsn{w{zlbelm^`ojeqygZVX_lx{{o_b^hVY`Xdbkq|wkjvl[upjyiurmn{rXjn^Y]VbdXeqdT_bibbmZ`~kfksunmwvkh
zmqfo{lqlbX_hhosss^imSepdUbnaybotztjolj_X`fhu]eVbVSOYgSO]OOHeo]cGZjNJ_KXme_xhn~d`U^T]t[TS`fN]bUSJ\ZQYuv]_fmhXba[^qcgjwqsmgvsys{~|yntlss
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|}~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBK ¥^*///0,H
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR455553?¢¤¤¤¤¤ªV:|}zzz|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}}}}~~~~~~~
~wxz{zz|||{}}~~~~~~~}xyzyz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}
suv{||{|}}}~~}~~~~}~}~~~urtx|||{||}}~~~~~~}~~~~o|txrvy|}|z}|}}~~~~~~~~xjsvssvx}~|y}|}}~~~}~~{gqru
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~y\hupdo{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
dik\gjk
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwncul[junehklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghg`gooflrtjbcbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Y\bgjroqsmZY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROMR_cemnnjhRQTPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNOMMUckglmmgeYQOOPQONNONOPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKEEKR^hmglmljjfb\UPOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHFFS[]afjnjomkjkkjjfZKJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;?@CS^cmllnwrjikh_TMFEEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;<;GKBNbmpzskj`KFBEFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnppsttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;;=<:>M`tpcNC?@@CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99;:68WfA88;<=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;===<<<:DY9<<==>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@<]n@>DE??A<F]=>=;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mwI8;:==A<Kb=<=<8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR<==ILFFvwN788:;>>WiA;<<::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvvw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;]y|wV<=?==>EitM:=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAHrykb}]>@C@@=Ir{Z:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot}~}uLACE@?>X{]?CEIJIIMMKECFGGEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
qCDEDCWu~XGHJMLNOOLHGHHHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z|}~~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
mAAVtWHLMLMNLIGGGGDGGGGFHFHECDDFEDDHHCCCFIJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrsvwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl
|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIJHHHGIIIJIHFJJJJIJIJJJFILLKJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJU
uIIFB??@???<<<>;:<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIe
fBB=88::9878896479;<:8567789787688;;;=@;999=<>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIj~T:8666766645773568:876565676778:67789;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBf
G676468874578567699766765:9:;:;898987779:98878689;A=>>BA?AKLOQPQOOORWkqrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=qz>988;<=>9::<9:;9:;:99;:9===>;;<=:>;9;;<;<<9:<8::;:999<?<=ABDIJMKIKLWorsusvx{{||{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?>H~
l<;>BCEEAA@B>@B@@>==>@?>?@?@==?B?@A?A?=@@@>?A=><;:;99;?=;<==AACABCAXpqtttvz{{}}{}~~}}}~~~~~~~REBAGJNOLIGK:8:;9::<=:;;==?@BR
^>DGIKJIFGGDFHGEB@@CECB@BCB?@DHECECEEAFEFDEFD@B?<@>=?@>?>?>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFW
VHMLMLOIIKIIJJIECDFGFDCEFDBHIKHGGFHGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGIY
PNPNLNLJLJIIHJFDFHHIEEHFFELLMIJGGHIJNMNLLNKHGGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@88<;<=:>@>?@CFIIP_
rNRPNMMLLJHGEIIDJHGKJHJGGGKLNLLHHIJMQNPNMOKIGIJHIDIHHFFGGHGCBACUnpuwwyzxyzz||}~~~~}~}~~~~~TDAABGGB?8?@8:<8=>;=A>?ADHJLUq
_RRPMNMKJGEBGJGLKFKNKKJJLMLOPNHIKLOQPPQOOJIJJLJLFGHGFFIFEEBABB\orwxyzzyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|XVRRTSOLKJDEFKONOWUQPOQSSMSTOMSLPSUVRSQPLJMMMKNGGJFFIJDDEEBDCcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BBGVNFNPPTX{
hWUkaERQQPI;;RTR`u]UVTVYYRXXRZfPUWZ]RTWQONRPPPQKKKHHJHEFIIIHIirvyxyyz{{|z{|}|}~}}}}}}~~~SHJIHGGFE??AAEBCGEDELXRMTUVX[|
}al[dU:XXXSQ?@VUY\d`VYbr]]W]ZUEQYZ[Y_TYgRVVXTTVTOOMJLJIILMKOMSosvxyxwyyz{z{|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~ynpXZ\[RSRVVT[ZuYU}`\X]^WIV]][[_YHYXY[]XXYWRQNPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\YTUTWRQWVcQerXZW_hP`f[[X\gaGOZhg\[\]]WROSPPQVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOMKfy[]TYUV]ZKTZUST^ZXWWWzkX[[\^TQQPINOWVX[Zdprvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRSUcdv
~ymqVIKMNKMKHJDFHEC>TdURQQNKRTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquvusswzz{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRVTbs{|}{{
u_]KC?CCCCB?DPBC@C=CIGV@HNLG]iPHFOFDEFIGHCDHGHKGDBAD@NQMRdrtvustuz|{{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kMG?@:;>@@??>jQKaEFHIEB?GLNGMQUIBE??<=<==?=?ACC@?<=B>JMGUnttustvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljjf`[QRZ\Y^JJPQNKLQRQTVTWQQWVPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeC@@B=:BCAADB\]O{NONNKLMOOQLKLWNHG@A<977699=;;;8989?<BH?\stuvuvxz|||}||}}~~|~}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIHPRQOMPQNQRTVXSRYTNYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHFFHBAGIEEFDMRPaWRWQPSSRU[OOQWPMIDF>:96587979:365795<C>essvwwyy{}}||{|}}~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZXMLTTSPQUOLRSTWXTTXQLWYZVXXVXY]WXXhsk]Vaskaa_^da_^YTQNNNLIHJKIIFCQPS[WTTNQSYS\eUOSTQNKIHC?A9998978857578599Gnqtwxy{{}~}}|{}|~~~z}~|}~}~~~~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOTVXXYSUTLKTVUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLORROMMNNNLJFQPUYSTOJNOUST\VRUSROMLIHHF??<:787659967665Wppswyz{|}~}~|}}|}}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpofedc\]RTZVWUTWTRXXYYYRUOIGOPOOMRJOPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPRMILJORPRRSTQROLLKLLHCBA=::876;B5566:doqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJHGEHLHKIFLMPMG/E_R>3?>joaRRQ@GUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptvz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]fSQSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Spruy{z{}||{y|zz~~|{utvrvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTXWUMLKI<987;>@><=A@B=>EHGCFFIGJJ@FAA@FHEJOHPRa\QPRNSNOPLLOMKMLMON[WKMQOGIHCHJLLJFFFE?BC><BG?B?Adptw{z{{|{zzw{wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHDD=9779?B>;?B@@>ADIECGGIGIEBB?>=CBAGIDMObeQMNNWKKMKLMMMLKNNSdMJLRIIIEAHJLMNJGIFBAB@?EFEHDKnovyyy{{z{zwtxux||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHJD?A=999:?B?<@BBADEGKFCHIGGHCC?B??@A>DEDKMRTLJIMTGIIJLJKLIJLMOPQPKGCKGCBJJLMONIJIGCCCDIJMLIYrmwyxz{{y|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqGKDGHHGJKIJKDGB=>=:::;AB?=BBCCHFILJDIIFGGCC;A@B>@@BEDIMPHHKGHKDHIKMHJLHIJKJM\RHHDNFADKJMMPMKMJKFGGJMNQNLbmivvw{x|z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKCFEGEFFGEGBC@=<=9:::AC@>BCEEIEIJLFIIGFFCB;ACC>@CCCDGLNHKNHDHEILNMGILGFGIILNKIHENIBFMLNLOMNNMKHHIORQSNRfffqosxu{y|lhjnekqlsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFECCCE@DB>@?:;;=:=>CA>ACEFJFIHLHGGGFEC@=EEB>BCCCDGHIGMPJFFGKNOKFHJFEDEIJHKIFHPKCIMLPMONOONJJILRUUROWd`amgproryzgehhdilfqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLGEEHCBABD=CB>@=9:=?:=>@B>@BDGJFIFIHFFGECCAAFFCBCBDEEGGIFLQLIOJJLLIGHEFEDCIIHKJGKRMBNOMQNOOMNOKKKPUWVUTX_^\iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGHFHBB@DD<BAAC<8:=>9?<?B@@@DFHEHFFHGFFDCECDIECFEBEGEFGGEJMKHQMJKHHIEFHHECIJIKMKOSNDQRPQQNPMNPMLMSWVXXVX]Z]d`hbjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqioyMHGHHBBBFE<@CBD<7:>=:>:@B>??CEFDFDEHFDEDDEFGJEEJGCGHFHGECFJJGMJLKHJLFIIKHEKKLMNORTOHSUSPSOQMNQNMPWZVZYVZ]ZXa```_hec`dfhgjhhifhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprrxNIHGICACHE<@EBE<8:>>=<<AB<?>ABFCECCHECEEFGGGIFGKHDIHGIGFDHKIGKHMKJKLHLKMKJNLONORUVOKUWSQSQRLOQPOTYZY\ZY[^^^`c^\ackb`dghr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvptMIKHJFBEGE<@GCD@:<>@?>?BA<@>AAFCEEDIEFEGEHHFHHIKJFJHHKHFFLIHHJGLLLLLIMKMMMOLPPQUVWOKVVUSSQQLORRQV[[]^[\^__a`ad]d`ef`ehjcssfjgglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGBEDE<@FDDC;??A@@@CA?B?ACHCFEFIFIFFDIIGIHJLHHJJILJFJKHIJJGKKMMJJMLNNNPLOPRTXVMNTVTRRQPLNTSRW[^^_]]`_`aa_acebdhbdijgvlkigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvnwKMLKMGDCAD<?EEEC=AACBBCDACDAAEGCHGHHGJGDGIGHJFILHIJMKMLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSQW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBCEGCCIECIJJIIKGDKJGHJIIKHJJNLNLILHJLKZfJd\KlSHON_nUks[qpbwcSPbvuhucav`Xnqbdvinzf[lt`lkT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDBEEDFBFFGDEJEEJMMKLLGGMIGJKHKKIKKNLMMLLILML[sbdp^lmUMNfs]feqlntgpi_aYnnbppbkjjgoqtetnn\ougpMJryvkb`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIHGED@AB@>CFGBFCFEEEDCHHGDEKHGLMNLMMFJNHJKJILJJJKLMNNMMJMMM[roonpplkMPQlWNibtrpamnu\YlQ\mmZqmkomxxtsip]_rkqjUuyxpc^kfbgppjjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGHEEEBBB>@@FGBGDIEEEBFIHHEGKJGMMNLMNGLNILKIJMIJIJKOPONMKNNL\hdu]lqWlNPQmUZk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHMGIDEDCAB=BABFDGFLHECCHKHHFJLLFNLLSRLGLMHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt]nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtontsvsHKHIBEEEA@>DDBGDHIMIFCFJLIGFJMLFOJKWRKGKKJNIHJLIKJIHJMMMMIKKKSkb[i^_icrrZ_Yjo_eeUk_c[aaQ`mh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrvtwrGGFIDEDFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJKKIHIGKKKLGHKKLLLLJKMNT[\TPTLPONOOVQOOQNOQJINPQdqiTYW\[\UYZ]X]\\cfaaebce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFFAEC@CHDFGCIKLHFDGKLHDGIPKLOKLWLIEEHIJHIKILJHFGGIGHIEFKIJKNLIP\W^P\[`^MXYS\\b^MYZMXaRJYaZR_d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCELMBDCBEIEGGFKJKHEEJJKFEHHPJMMJMSHGEAHFJIKKILJHFEIFDFGEEJHCJMKLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_b[`^[TXWY^]cbcacehekrpoppnnw
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIDBBCGHEHGHKIIIDFKKKEFIJNKNLHLNGHE>GGLIKKJLKIGEIDCDEBFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQYVU\Y]c`__cdbhomnllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKFCGEBEGIFGHHFFJGHGHKILDDKJMMLLHJJHJF?GFNKKKMKKKIGGCD@DAHIB?IJHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTR[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKJFFFHGFIFFFILJNFDKJLNJLIKJHIFBHIQMKKOMKKIHGED?ECHHBBGGET]Y^X_Y_[]UXXP]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAGFDGMRHCQJFHHHEFKJMPEFIJKNLLILLIIGDHKQOMMPLMKKHICDAEDHGBAGEDWUE\U^SV_XNTUNZZMJKT`a[_X^^a]NYb\``_bcb]abW__TPNOOWQ][[\\^`bffelfoow|{{}
zo
~INFDFFHDIRbPCV^IGGHDFMKPPEIIKKNLLLMKJJGEJMQQNOPMNLNHKADACDFDCBEFBMHBKLPONLFMFGIJHGLKMOPILOPOSOLQSRUZYWYXXdWOSTPPNMOTS[YXZ]\`adecgcklpsrzy{z~{}{
}KIEEGFGDKM]LGGXLGHJHGMLQQILKLKNMUNOKKLGGKPSSNPONONOHKF`ED_LDfdEM[I^[rmOMUmYLCQ`UkWgJ]XU^DMQULLSVQRTXWTXUT\UPfZhhdXRjSWVT[\[``aaab`fhfnkhrz|}~}|zr{z{
~z{LHEGFHEEKOSIJF`SGJOJIOMRQKMLLORUROOJLNGHMQ[YOPPNOPOIJQQI|YYqsXPmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[`VVXjtuu__v_Xa[\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMNBDLLGILEQVLKNIKRXWQMOOMQTNOQPKKNGMPS[ZTQROPPPJHZx]TxehZRTQvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essosr{|o~yor_``baZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHJKGJPOMMJNV^YULQSNXZLSSRNLPIQRTYWWPTPPPQKHgxlcxrm[KMUypumubnvPdeJfvqmwojfxxiWrQhzmijzz~lxzohoYvvjuup`rg|ilx|o^__ba[]bdgiidgbcdllppstsssyqrxblugry{ssuy~suzn|}ywrnNKStNCBFPPHJKJLQOOOMPZ`ZWKTWPa^RVQYRLOISTVXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttrmn]t~zkmy|ktl|kpvux^__b^]_ddighfe^abiiijknokqnmjpacfdowxompsy~nqpj{ztromLL[VHGEGRPILMKLQQPPPQW\XUMUYUfXRRY^SLNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_[pz{^`zscroxqhd|ir|^TLl`vukiu|{m~xk|p]^_b[^bddgeeebZccikkrsrwglihdgaakagsrlgmmr|kmhk{tmmkmOHJKHIHHQPLNOMMSRROSRWRVTPW[VVTTTa_PNMKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQPNQQXYRNPUTXXX[ZURSW[WXWZOSUWXXR]YW^WTPYRVWWWX_[gr^[[Y]]_cZ_ccdfdccbZccffemnmueegcaf_]g`dlhfgkhpzhggkujhgilQIKKLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYWOOLMVTPNUSNOMLQPKJRQKQMKKORURQRSRIHLNOQRQQQTVRXW\WSSPQUUVSZQOSRXVTYVTZUTRUSTUWXW]Z^a][ZZ\\`c[]bcdfdddaY`acabhhimcad^_c]Zd\bma^fegmsdihkkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSPPKOWSPNUPNQNKSPLOUSNRNMNQTQUQSTUNKMOQTTRRQVWTYZ[YSURTWWWY[TOTUXUUZUWYURRWVUW[YZ_]UX^\^][]aa^[bbcgfddbX_`b^`hefea^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTOOSQOQ[ZXWXZZXYV\jdVXYZWVSSOJNVTPOTPPPNMQQPRXTQQOMOSVOXRTUUONMQSUUTTRTWVZ]\ZVWQRWXV[[WQTWVVVYTXXURRYWVZ]Y]_^V^]^`\[____ZbbdhgddbYb`a^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQOU\[ZW[[\YZ[dqmhd^[YVUWQLMVRMNROQROLPSRUZUSPPLPXWRWSSSXMOPRTXVUUSUYX[^][[VROUVV[[WRTWVWXVTX[TSRZXW\^Z^_`Ua\aa]`b_]`]c`cghdf`Zc`a__ed_`c[Z\[\YZYYW\Y\[`^_[^^a`^b\Y`ZQNONVQPTROUTSPW\]\X^\^V\^jqwyb\[VVXQMOVSNQQPRTRKQTTYZWUOQNSXWTSURRZOPSSV[VVWTVZX]^[[^VSNTUV\\VRTVVXYSTY\USS]XZ]^\```Va[cb]ac_\bab_cfidf^[d`a`acd_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUURQWRTP[]^^[`\`U\]ijr}slg\UYWPNRZSRQSRTUTKRVV[ZZSOSRVVVTOWRSZRTTTX]WXXSX\X^]YZ]TUNVWW^[XRUUYYYUWY\UTW^Y]]`]bb^Y_[ea_dd^^cca^efidf^^da``abd`b^XZ_[\[XXXXW[Z\`\[[\[XY[^V^Y]POORZPZTUVVSTT^^`_^b\`U]^bkytl}kZUYUQPS\TUTUTVYWLR[W][]ROUSXWWTPXRSWSVUU[]X[YUZ^X_^Y\YRWRYXY_ZZTUVZYZWXZ\VUZ^\^`a_dc\^]]eaafd^^dc`\gdhedb_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOQWYQ]UVYWWUX__aa`c]`T]_beeuzhXYYSVSV\XWWVVW]XOU]Z^]]TRWSWVUSTXRSVTXXX]^X][V]_X__X]VQYTYZZaY\VWX[Z[YYZ[XV]_`^cbbed\b\`fadfd_`dbb[fchecfaf_`aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNTZVS\TVWYVV\`abcac__V[`da_zuohY\ZUXTW[ZY\YXY`WPV^\`a\TTXPUWVTVWRSUWZZ\_^Z_\V__Y^^Y^VSYWYY]bZ^VW[\[\[[Z[YY__``dbcdebdYbfcffe^ab`c^bcidcg_g^bbcaa`^_XT[ZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXUXWX]_badad`^YYadb`lfh^\][VWXY\\\_[Y[bVTX^]ac\RVXPWVWWWVSUTX\\^``]`]Wa^[^\[^XVXX[[_`\_XY]\]^^\[]X[`a^`dcdeefbXcedhgd^c`_ec]eidei_f^cbcaa`__[XYZYZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWZX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cXZX]`cd_RXYPWWXYYWVWV]]^`a`_b^Ya]]^Y]^YXVW[\`^]`ZZ^]^^a\[[Z\_b^bdcefefbZdffigc_c^afeZiicfice^bbca``_]]ZX\YYXXZXWZ[ZYWXVU[]]]``bbxKXW\YW\[\]ZW\]_`bdaba]`Xbcbacab][\[XW[\_]`_][`d\\XZbecaR\ZOXXZ[[ZWZY`]`bb`ac_\b]_][^^YYUX]^_`_`\[^^`bc\\X\^`bbcedfdefd\efgifcab\cg`\iibhjed`baca_`_]][Y\YXWXYXW\[ZWWXOXZ]acffrkJYW]ZZ_\[^\X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\]^_ZXV[_^]aa`^[`abeb_]T]``cddfegeffe^efhhgdd`[eg^ahhbhhfc`b`cb___]]\Z[YXXXVZV\ZZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{||||||{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{|||||||}}}}}|||{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½E>????@0*+++*%b~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊ:233334!]}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyzy{xnoooppprrrrrrrwzyyzzz~|||||||vuuuuuutssssssy}}}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwtvwz{x{xwvwzx{zy}yxxyxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{||||||||}}}}}}|{{{{{||||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwx}z}z{}{wwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww|z}|}~|wxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww|zz{}~|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx{y|}|~{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyxyxz{y|xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsstrqqpponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssrpqsponnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrsqtsrqonpoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqxqrrpwnppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqqqqv¡prp¡}opppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqroªpw ¡}oppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqrp±p¥¡}pqqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrp¶ª²¦zqqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrsssssssu §£³¨¦¥xtsssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~~|vvwwvuxzxxxxxwxx¨£±£¤zyzyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~}|{||£¥ ¡{{yxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}} }}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~±ª¥¡¡¡~~~~~~
~~}~~~}}}~~~~~~¤®¡§¡ ¨¬
~}~~~~
|||{|}||~~~~~~~~~
§±¤§¡ ¢£«©|}||}}~©ª£¢¡ ¢¥¡
}||~~
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{
~~}}
¡
}~
~}}
~}~~~~
~}~
~
~~
~{z
~}}}}~}|{|
~}~~~~~~~}~}}}
}|}~~~}|}}|y|
}}}~~}|}}{zz~~
~~~~~}}}~~}}}}~}|zzz~~}~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~}~~~~~~~}|~~~~~
~|~}~~~}~~~}}}|{{|zzyyy{~~~~|~~~~}|~~~~~~~~~~}}}}
~~}}~~~~}}}}}|||{zyyyx~~~~~~~~~~}~}}{|~~
~}}}~~}}}}}}}}|{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~}~~{||}
}
~~
~}}||}||||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}}|~||}
~{z|
~~}}}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}}|}}}~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~~}~~~~}|}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{||||{|||zzy{|z}
~~~
~~~
~~}}~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~}~}||~}}}}|{}|~~~~~}|~}~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~~}~~}|~}~}~|{|||z{z}~|||}|}~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|~~}}}{|}}|z||~}|}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~|}}|||{~~{|{||}|}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}}|}{}|}}~|~}}}}|{{{|{{|{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~~}~}|||~}|}|}}}~}}~~|{{{||}|{{{{yzyxy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~}~~|}}|~~~~}|}}{}}}|||||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}~~~~~~}}|}}~~~~~~~}}~~
~~~~}{z{z|{z
~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}|}}~~|z{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
|}}~}~~}|~~~~}}z{{|||~|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{|||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z~y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~~}~~}~}~~~~~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}|||~~~}~~~~}~~~~}~~}~~~|}||{|uxyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~|~}~~}}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~~~}}|~~~}|~~|}~}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~}}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~~}~zz|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||xxuxxy{||}|{|||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}{}{yvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~
~||}|x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{}~|y|zzz}||~z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
|||}zz|}}||z|~}}}}~~~~~|}}~~}||xvvw
~
}}||{||}}~~~}~||}}}~~~}}~~~}}}~}}~~|}
~
~}}||||~~~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uz
}y|~{
}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r~}}~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwm{snym}rsvsvmnwlpylu}|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}~{~|~~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m}uo
zrr{|upozks|nv~~}}z}{|}}}}~~}~}~|}~~
}w
}~{|{~{||}~}}~}~~~~~~~}}}~|{|~||
}|{|~{||}~||~}~}~~}}|}~~~~|}}~{|||{{~
~|{}~{|{~~}{|~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~~|||~}|||}}|}|~}|}}}|||}|~}{|}|}|~|||zz||}
{}~~|||~}|}}|}{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|~{{{z{|||{{{~{|}{z{~||||}~}{z|z||
|
~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{}}|}yzzy{}}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}~{
~{}}~~~~~~}}{|{zyzzyz{|yzzz{{|z{{{|}~}}}}||}}|
~|~~
~}~~~~{||}}~|~~}}~{~{{zy{zyzz{yzzz{{|z||||~~}|}||}~
~~}~|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ØÙØØØØØØØØÙÙÙÙØ×××××ר×××××Ö×ÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;A<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸·©§§§§§§§§§§§§¦®¹¸¸¸¸¸¸¸¸¸¸¸¹°½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVM<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§££££££££££££ ¥£££££££££££¥SRSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;<B@8<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥¢
¦¤¤¤¤¤¤¤¤¤¤¤¦WWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<<>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©§ª©©©©©©©©©©©«babbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÏÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÐÐÐÐÐÏÏÏÏÏÏÏÏÎÐÑÒÒÒÒÒÒÒÒÒÒÒÒÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÑÔÏÏÎÐÓÐÎÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ××ÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÓ»ÏÏÒ¹¾ÔÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒµ³ÔÀ°±¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÑ ª®Ö¢ Ã}~¯°ÑÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<96?B?B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÑűϺÔÒÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÖ§³È ÒÓÀ ÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<==964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÕ¥´¾©¯¡¹×¯¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÖ¥µ¿©Ø£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÐÕ¥µÆ¦Å¢ÑÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHGE@<<>><==<756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÐÕ¥³ÑÇ¡ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@C;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÇÒÖ£°Ù¥«¤Å´¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÑÕµÃÕ̧׹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<<?GEGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÑÂÔÒÔ˽ÕÒÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA=775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÔÒÒÒÓÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ=>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:69896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD88867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?BGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545659756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¸¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455588686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¸¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::9:9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µ´¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«¨¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦§§§§¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡ ¡¬¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¥¦§¦¥¥¦§¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡¡¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢¤¥¤¦¥¥¤¤£¢¢¡¢j¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢¥¶©£¤¤¢¡¡¥V¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ §ª°¨ ¡ ¢Y]¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡¡ ¦¢«¥§Uf ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ªwv¢¤kai ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¨i« nik¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe £yu kik ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £x|
}jgl£¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢ ~
fm ¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡§¡qe¦¬¡hyk ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡¡wef¦Xg}x ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y §¥xNJpRDax¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ «N7<t}pS?6az
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|vsTpW|°©ZgnHk}
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{~¤\
|ÊűÅ~zPx
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~~rÏ×ÍÕ¦¹¼k]r]g
¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
|wѽÇÓÇÁ´w¥¨cb ¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~o¢¦¹¬¢¡
vaÈZ¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡£ |¥
wupl¦a ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©¬ªª¯§~Xryymkiuxxz ¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¥©¨§«©
pR`tqrzifbikp|
¢©§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤¨¦¤¦¢£°piOVxvt|hadf__n} ¤ ¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ £§¢¦§°²©|icIRsuxh`cjZ[bku¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª©¢ ¡¨©µº¼½¬mgaBZnp}~na_f[Yaahpx ¡¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocmiib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £«ª§®¹ÁÆÌÅ·¥rhiZ?SpoqlthaaZX_cabjqv{§¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ ª´¿ÎÙÛκ«o`abSCJyk`bml[[WZY][Z^cffhw¥¯§¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amivkphiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ¼ÎÚÝÔÀ¤ve]YZ\SJCmjVTXW]\]]XUW[i~ªÁǺ¶¡§ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`ftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃù½ÀÆÎÑÍ·ud[YZWSIUoª³¦NU^ab___fw§º¾ÁÅÅ´¶¶©¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÅÁÅÆÁ¾¼Ìİo\UXSPS¡µNY[]]`mªºÁµ¹©§±µ«µ²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|~jfhaklgnurruqg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8BBBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÃÃÆÆÁ±¿¿ÎμiXWZL¹LTYW`¦¼°¦«¬²¦ª©©«¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|uklndomiqxozjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄŵÀ·³¼Áƾ©yXUQ·LSU] ¦·¯¥´´®¥¤£§¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyy{wnkihvZgrxsyff^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÄž¸½ÁÿǽlRZiZQRd«¦´²¬¸µ²¬©£¡©¬§¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh^jonyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÄÇÄÄÆÉÎÊVHOPk»·À½¾¹¼º¼º¼¬¦©»º¹·¿²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvijjtnyl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÍÅÅÅÃÅÄÉËÑÓ¤RL`°ÇÀÉÍÆÄÁÄÇÁ¼¾´±°°Â¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`kjwlifuotc]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÂÃÁÂÆÆÆÈÎIÎÌÇÌÐŶ¿¿ÀÀº»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegcjdbkmno^Y]VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ¾½ÁÀÀÀŪN¤ÑÌÅÉÑÁ¯½½¸¹»»¾·´±¹¾³¼¾±¹µ¸»¶¼´µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbaccdjcgc[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÁ»¿À¼»Ä½ºÀÄ¿½½¸¼ÀįSÌÄÀÁÉ¿°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±··¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabchjggiei^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÕ¼¾»ÃµºÇ·¶¹»¼¸¹µºÄɪTÈ¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¹¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmfefpjekhXYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÏÅy˽Ƿ¹¸¶´·¹³µ²»ÅÊUÊ¿¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~}knqgqktfbn`\THKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄׯv¾ÈÏÂÀ¸®µµ»½·¹±¾ÃÇ\Îÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljntoxcgb\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÇÉÑtw±ÑÑÌÊĵº¿ÄȾ¾´¾¿¿
jzËÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltlln_c^abNHN?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÊÂvw¨ÌÌËÍÊÆÂÃËÎÁ¼¸¼¹¯|m¼ÈÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qd[^__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»º¬Ûþ¶¾À¾¾º¦ª³·ÃÀ¦|z|ÄÆËÈÁÃÀÀÉÊÁ¿»¹±£~°ÈÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp^\_\ZQEEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Å¶m®Î½¶¹À¼ª}nhnmtu{¾¿ÆÀ¹À¼¾ÅĽ½¸±¯§¬ÊÃü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wlv{qni\``YSPAFIGK@ECH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹Àͱv³½¶µÁ¤iZ^`NS[\pvz
¤¸·Âº³»·»½¿º»»¯¢¬²¢¨¾Åþ¼¿»»¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvwoqa_f][UJ=??GF=GCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɦx¡¯µjfgVY_IIMPTo{©°·¾¹²µ²¼¹¼¶¹¾µ¯À°µx¬ÊÃÀ½¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|quwtwrl_ca\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Æ¨{v¡_SCYUHbjUOEJe¥¯¯¶ºµ´²¬¼¹¸µ¸Á½§Â²²v§Ê¿¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨ª¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovsnc^gY]]SONA>JB@KJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿´ynNK?eYBOxhMC^
±µ³µ²´¯¬»º¸¶¹¿Åx¸©f«¿¸µ²±¤¦§¤¥©®¹¬««¥¨¤«®¯§°«¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmujl]\kU][PNHDGMBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶
|XFAOXJJYxcAU£¹³´²°±°¹¸¶»·»¼¤³®¤t¬°©««£¨¡ ¨®¤£¤ ¢¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhutoeUadW]QOMH@IRDMC=8875:7<>9;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼©hM?SxqPIIKhZEU°º±¬³¯®¬¶¶²´µ®©§¦¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦¡x|vzcwln]QiUPOGPMLCPQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Âª¥¼gDS}QXIKaJVbee¯µª²´®ª«¯°²³¥ ¢ £¤¨¢ª £¥¨ ¡¢£¨¨§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nk{dhVRdNJHGOSNKNH<E@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© «Æ¿ÊOAtqPnJLcfut`]bt²¯®³µª¦¬«¢¢¢¤¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wy|eyy`bSVaHIJKSTISQM9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥ÆÆWSJf¤Yf}or[Rkc\gb`m´°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZZMQJOOVMSMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yUirwupcwvXWb`di[ZWh®¬¯§¢ ¡£¢¥¡¤¤¨¨¬©¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³¶¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§}xvjwu^m[RaIRUHFUWJCMG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ ¤op`cXL[RZLLQYRHONH¬ª©¤¦ ¨¥±ª§®£«®¶°´²±®¶¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«®±¹¸¼¯³°µÂ¼·¾³³µ¢¬¢©¨²©«¨§¨ª§ § ¨¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhm\X\CWNJGMGCFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£bW^e`WMQG=>@CD?>BRx©©ª¥¢£
«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶»»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÄ½Ã¼·³ª³ª³´¯³®ª¯£¬¨¶±£°¦ £°±®°¤¥¯£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤|trkkurqhV\QFUHDJPI?EA4FH95<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`QFD;C>F<>96N~ª³§££¢ ¥«¦xm ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÃÊÊÃÁÇ¿º´º»µ»·°¶²ªº²®»¸¿»º«¸«ª¸»µ¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkcioxkeY[FKLEDTMECE7:?:549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}riaWNE>IY|oaA=\®¬ wrqmp¦®´¹Å»ÍÇË¿ÂÌÍÍÌÇÉÑÌÌÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÔÐÓÓÌÊÂÅÆÆÊÈÏÀÉÑÌÇÆÈÆÂ¼ÃÁ¿¿¿¶¾³¿ÀÃÃÇÅÇį¿¹²¸¼Äº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZZCNLDFPIDC@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £if\TID@?J¤ ²£yqroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ò×ÒÕÖÓÔÈÌÇÌÍÊÓÍÎÓÍÆÉÊÊÂÇÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÆÅÍÌÉÉÀÃÀ®¯³¨¢ª£¦©¬¤¥¦
{ruvgcgvjdVWQDNF@IQC>B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡aSLJDC?CR°Ñ½²¯¦ ¤¡}xqkebhroq{
upnqtp
³Ã¾ÅÑÐ×ÖÖÒÖÎÔÖ×ÔÓÑÓÔÔÓÏÑÄÐÓÖØÕÖÒËÉÎÑËÆÍÑÊÒÕÖÙÖ×ÓרÎÒÊÏÑÌÏÐÌÓÐÀÉÈÊÄÌÌÌÏÏÅÇȶÀËÀÒÍÌÐÇÊÉÀÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpc`erb]R\IJGAEIJ>;A8=5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢¡YI@ADAFQv²¯¦ wica__`_^__]alusppolrquÄÈÇÔÕ×××Ó×ÐÕÔÚÔÔÎÏÕÔÔÑÑÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑØÒ×ÙÔÕÌÏÏÊÍÒËÏÑÀÆÃÈÆÏÎÑÑÒÈÌÍÀËÍÆÓÏÌÏÈÅËÇÇÉÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨«¥²¨°³¬
|zqstmacim_VP_JJCFCRM@<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·ØÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£«eC8=>DXª¨}qecb__a_^a`_``_`emppnkorwwÌÁÓÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÑÊÏÍÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÓÑØ×רËÈÎÄÉÏÌÊÍÀÊÀÉÊÎÎÏËÐÎÎÌÏÏÈÌÐÐËÎËÃÊÇÉÍËÌÒÓÍÓÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¾»±
zvopokadnpaW\ZIFFDMXE;@=33<<87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤±zHFB;W¡k^^^adb``aa``a^__^\bmroostvvy¤¿ÌÕÑÖÔÓØÖÎÎÓËÎÎÅÎÊÒÒÏÇÎÍÎÔÌÎÒÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÍÂÈÊÃÌÄÆÉÊËÏËÎÍÐÎÓÌÆÉÐÍÉÇËÅÇÁÆÊÌÍÐÒÇÐÏÎÎÌÐÅÇÁ¸¹½Ãýø²²¾±»Ãõª¥¡yqrkmg``qhYXhVMGLIPQB;C>;68:8::57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±ÇøÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨xlpqy|eabb`]^aca``_`aa`_][]grrprsqmry¥ÇÓÏËÐÐÓÔÊÅÉÉÆÆ¿ÃÅÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÐÎÌÔÊÇËÎÏÇÇÏÒËÐÏÆºÄ¿ÆÊ½ÂÇÉÎÅÃÇÀÇÍÈÄÌËÌÏÈÄÄÐÉÆÂÆÈÄ¿ÁÇÌËÌÏÂËÌÉÇËÐÄÅÇ»ÇÃÈÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£xotdk`^fqa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»£¶~h
¤«
}~s_[^^^`^`cdc_]]^_``_[Z\`lrqookloo}¹ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈÊÍÉÄÂËÉÁÁËÐÅËÈ¿¹Â»ÆÇ¾ÀÆÏËÄÀûÉÇɼÉÇÅÊÀ¾ÂËÆÅľƽ¼ÁÃÅÌÅÆ¼ÀÉÃÅÇÒÅÁÉ¿ÊÉÆÈÆÑÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¦£ |wstfiZanmZ\XRDLFBGELDFS@54335?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÚØÙÏËÒÍÍÎÈÁµÃ¾±¯¶l^z}¡z
vxurp_[[]``bcdded`\\]]_^`[YZ\borokikposǽÊÅËÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÁÉ»·»ºÆÃ¿¼ÁÎÃÆ¾¾µÁ½Ã»½Ç»Ãº´½ÆÄ·¿¶¶¾¿»Ìý¶ºÈ»¿¾ËÃÁÆÂÅÉÇÉÆÐÆÂÌȲÇÉÃÎÌÀÅÿ½²·°²§¨¨¹°¥°ª¬zvwjdg`hodV^YJFJFHKAFBFJ@9:658854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÉÆÍÍÎÑÈÐÅÕÔÕ×ÍÊÎÅÉÅÇÁ¹Å½«®¦`dux~{ttc\\]^``bcbbdeb]\[\^\^]Z[\^hsqmggnory½ÌÀúÀ¸°±§ª¬§¸´¶´³³´»¶½±·°µ¯²»Â¼Áļ¿»µ²º¾À¸È¹´»·Á½¸½ÇÁﵝ²¶»¿´Å·»µ«¹½¾À½±º¶°·º³Æ¼·¯»¿µ·µÅ¼¾ÃÅÀÄÅÆÇËÅÀÆÆ»ÇËÀÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJFBDAEE?<:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÉÈÊÈÊÄÐÍÒÏÍÅÇÁÆÀ¿º·É¶ª°[gp
zx~vw|sh]]]]_`_`da^cec__\[^\]^Z[[]_lpnifjmnr|¤ÇÀ¸¸µ°«¬§¢©§ª¬³ª¬ª´¶±³©®§¬³»º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶¼È¹Ã¶ª¨°²À¶¸½°±§±³µ»¼«®µ¦®¶®»²±ª¹°®»®»¸»ÀÀ¾ºÃ¿ÆÃÅÀ¼ÆÁÇ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÆÉÌ˳¹Â½»³svvki`bliYXW[ALKMJEAC?FA:9:996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÐÇÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª°[j{x}
z{wn^]\\]_`__dcbcdb`_]Z[ZZ]ZZYZ\enohfhiknrº°µ®¥¤§§ ¤ ¥«®¤¨¢«ª¬«°¤¦ª´¶±½¹¯·°¨®¸´³¼¸´¼¯¸¹µ²¼Á²Á®¥¨£«±²³¨½ª«¨«¬®µ³¥¨®¡¤¯©²¦¨¨®¦¨·¬±²·ºº»²¼¾¾¾Ä¿µÂÁÇÈ·¾ÀÄ·Äÿ»¿Ä¾ÄÈÌÊ¿¿ÃÀÀ©stsji\aodWWXPHYRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÍÃǹ¹ËÁ˾»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ»¨«dmz}~xt~|swe_]\\^_`^_ccab`a_^]\ZXY[[YXZ\_fkfdgehjor
ª¥¬¥¡¤¤¡£©££¥¦§¦ ¤¦²°¶·§±¨ª´«´º±¶¶®¶¹²°ºº±·¥ ¤¦±¨¬©ºª¤§§¨§² §¦¤¦¬§¤ ¡±¬²´³´°µ¼¶»ÁÀ²»¾ÃÁ±¹¹Â³Á¾Àµ¸¼½¾¼ÂÇÅÃÄ¿ÀÄ xqlbf`ko`UY_HNgOTHFKF<=@=:;;826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;È´¶½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÃÆ¸·ÇÀÌ¿¸É·»Å¸³Å¸³¿À¬µ¼²¬¥¯³¡£ir
|xusomjiipi_`]\\\^__acb```a^\[\\XYXXXVX[^_dcbegggkmo©¡¢¡¢§ ¤¥¢§£ «°±µ¤©ªª¬¬¤´¸·°¬³¶¯³µ¯°ª£¢²¥¦ª¹¢¦¦ ¨« ¥£¯©«¨ª¬°²¸¯¸¹º°¶¼»º«³²¹³½´¶±±¶µ¿¶½À¾Ã»º½{sk_e^ddXTW]IW\KPGJJGA<??@;?<05535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹Ç¸·¾·²Â´±»»¬¹º±¢©«§m~
xrmomkb^aff]]^]]]\]_aabccba_\[[ZZYXXWWWXXXZ^bddeffhikr§¡¢¡¨¥§¢¥ ¡¯®®¯²¡¥£®«§¢µ°²²¬©¯³§º³¦¶¡££¡£¢ª¶«££¦¥¦£ ¡«¨£¤¦«²³ªµ°²«²¹´¯ª¯²²³·³®©®²¸±º¶º½À¸³±zuf_f^[YVSZUK[QLJEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÁÌÈÆ¿Å¶ÁÀÇηÀĽ³¹¹²¿¶±¹»²´¯¤ª xxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv ¡¡¡©¤©«§¯°«£¤¸ª¡ ®¨¶ª§¨±¤¸°¤· £ª§¡¹°£¡¤¢ ¡©©¤¢£ªª±¨´¬ª§³°¥«®³±°°¯¯§¨¨²®²µ°¼´º¸®£zwe_aVYXSRSKM^LPLGHLKE=@>=B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾·½®§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbbcfi §¦¤§¨ ¦ ª¯¦¢£·¨¡¡¢¨³¢¥¨¥°¦±¬µ¡©¢¢²±££¡§§¢¢¤¥¥«¤¥°§¥£«¬¦¨®¯¯«¨ªª³¦¦«¯´±¯¼¶±¯¯ {xsea\[]XNLQHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥¦¬·»¼Áź±¹µÄÉÉÀÃÆÅǶÅijÁ¿Å«··½¶½º»µ²«¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZZ[YYZ[WUXWTTVURTRU``_`a_aacdi¤ ¥¢¦¥¥¤¤£ª«¥¥±ª ¡¥«¨¢®©©®¢¢¢¢«©± ¢¡£¤¡¢ ¢¥¦£«¥¢¤ª£«®¥®²©¦¥¦¦´¦ª¨³µ´¹º°ª¬sqo`[WVURFPNHZ\ORJTKSLEGJD8;;=<9667:9;:976977:;:=<<6;<8>598:88659:<<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±½Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURRNQY]\]]^___bdm
¢¡©©«©¬§©¦¤¥¯¥¥¯© ¡¯«´ ¦¦£¤¡©ª ¡¡¢ ££ £¡¢¨££¨« «¯¤®·¦£¤£¬ª¨«¯³·²½µ³«¯
tsh[XYSUREXLQ[XMUOPLQRINJC=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99576570141-+/434988::8::748=8?9~³§³·¯¨¨¯®©¨¬·¶«¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»Âȱ¸¿·¼½»³µ¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_`e}}¢ «ª¦¯¬¨±¥© ¡¥¨§®¨« ¥¡¨«¥ ¡¤¡¢¥¦¨¨¨ ±°¦±½¨ £¬´«®§°µ°¹µÀ±®±«~rsbVTVNRJGVPRRLLXNJLORGMKACFDD>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8´¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ¶·¼½Áñ°±·´´»³´¢£vkglnqnrkpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]aj~x~t
© «¦¦¬¨¡¦£
¤£¢¥§ ¢¢¦¤¦©¦¡ ´²¨³¸¡£·¬ª®¤²²¦µ¼µ«¬±£ysn]NQQLODNNNPKFNNJJNNQIMJAHLHHC>858889:;69:68;99><8:>9;?8789:886857688974577820301*)-/12876:999984988A7w¶¦¤·±¥§¤ª¥ ©¦¤³ª¢²Ãµµ²³ÆÆ¶ºÃÊÌÆ³¬¹½´¸À¯©°¦®º¯|n__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]anpuo¡£¢¤¥¢s~{ £
~~tz££ ¡¤¤¢´¯¬°¦¸¦¦±¡°®°¼ª©¯ªxtdWMROPMCSNLPMBPQHINSMHJJDKMFKK=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-02764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ¬Ã¨¢¦¦¶£ ~x~fWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNSSSTUUVY[]jjpk~{sNXr _;Vo|s
y{}xqp}¡ §®©¨¨®³¢¦®¬«¨´£©£to`\OSRWLDTJPMLFNOIELQMKOJIMPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £®¡¦¦ª ¦©§£©¯¨§´Â¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅª£±¢~su]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMORTVXZ`lngzsPB?}y`JQnx~
mwuvxpQ|~xvhw~¤£¨©¥¤±ª¡¤¤¦©¢ª¢¦¨vng_]HQQSMIUMSILKOIHFJNLMTKQPOFIC=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833989:99::::?9w¶£§¡¯¡§¨¥§¨¯¬ªµ¼¶¸¶³Á»¶¨¹È¸¶¨¨µ¶ª²¼§¨~}xqoXMKMMNLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZnru}ih\Tt~|
{vxsovqtz~«
y{hv{prmxx{{vsrxgu
||© ©¥§¤ ¤shb]]JWPRGKXROJLMRJJJLPHLQLRTMEHA=77;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²¼¸¶º´±·º²ª¬©¨²¯¢~vx|vooiXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^t{xfv|gyvx}q|w{ok~}t{|ufv|logs|myq}qmvqhq~pD
wxz}{u}£¡¥xomgc[XXUQJSUTOPNQVKNKOOJROINPLFD<<79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¡¦°¬®«¨©±¯±«¼¸¬»¾¸³¬§°§¬¥©¤¡
yuq{mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX]eprl§ªÀ~tyb{xo|yz}omytyjjq~Inhx~midly
lrl|nr|inps
{~{wpttyyp|ojoooYVXTRQYORTTRXUMNHMJMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥¬°£ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡sztotkpldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\_§aisye~omzvtltt|jjMy
g1vsl~}tfeu
gilukq|hqq|n|t~}qqnvmwyujyywkkphfXRZWYY[MPUVYXNIHEJJHGC@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5n£¨±§º¯«²°Â±»ÃÇ
zqtyprpoodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯² q{xl}lq
zyr¡txsu5q¨¡¡¢
vp||t®hgbjnrmpuioXupwm{}mrnp{svnbv
ux~}{sqqm`\]^[YX`_RN[ZXWLHJFJG?CABH?CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®±®Á²»ÁÅ|nul{txxlwnwci^JPG>?6449;;;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lv|~
~u¢z~aªzw~s{]eqtz|wmhjbyo
zoxu
zptyxkni]v||
}q}uw{|wpstfg`[[^S[g^WPTX[UGJJDKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À²»Åº{vk}xs ||p~zgvkRWL@E211366688:<>AEGFGJKMOQQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJh{y|q|z}~v¡¥ªH®¯¯©tm|}hghyn
qGlwryvhmk_v}yzuv|xmpw~ttrl[^^\ccXge\TOPVYPDLKFNICFCC@@CA=:88:::;;:888::?>6;>7595773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¡¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23124668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`XpY\^i
~
¡¡¦»±§»Çè¡¥|qv
ihptq
w{v
}nvuf «¢zzyogkx{tle^[[^j^bg`ZOKNWRQIPJDNGCJDCADDA<:87=<:<:88778:==8<=68756623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfw{¤¡¬¦«¯°¡xw|~
mpj]B@4--//..02234778;=?BDHINQRSRSSTRPOHDB<87/9D><<63.lMPHIKKKNV_cggmu £ª¥£¬©¶¢¨Á®ǯxº|¡
¢
lpuwqm
q ¤µ©¢}kjk}uc^d`[gl]ll^WKGNRQMLLFIPCDMFBCEFB=997=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENPRTPPQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¥¢¡¢¨¨«¨¬©ª¶«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢xz~¡{w«²|£¢¦¶¯¨lss}}si`^b`bhd`gf\REJKPOIILFFMCHLFGDBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m}aw}{ªªBD}x|
v^bP460-1/,.00//..0015>ABMQRSQRSTRNSLEE@<>=GG@A@8662<9;FHGIJNOQYm
w£§ª´½¸¤¬¬§¨´«°¶²²»±³½³Ã«ºÉ˷ÿ¸¥¢°³¬ª£
¦¦ £¦¢«¨¥
¤¡ «¡¤©°£¦·»¡£°¢¡£¡«¯¬²µ¢¤ªzz~ibi]fc^dd^gg_[OCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhcWioXz
v
ÚÈsV|z
pna@E64<2/110-,+-1.-4?CAMUQRSUUVUN[PGHE<>>FHCEA7;<5C;=FKIGHROPW ®£³ª²ÀÇê³Å¶¬³¿³¸¾¶¿´Á¶»º£¸Å¨¶Éǵ¾¹µ¨£´°±§¯«¥v¤¡¬²´ª®¨®¶»²º¬¯µ¢±«±µ»·µ®´ §§¢§©¯²¹·¸§¶¨¤xwZceWgbbd`af`[UJDDLUQHIJDIGEA@@KDBMG<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQbcWyuq}u
{¿»£¼´y
zxn]V@EM<6:46AB764//6CHCQ[OQUWU\VO^UIKKA@?GKFFD;>@7D7?BJJEFWTP^¤£±´Ã¶¸ÁÌɶ»Ä½³³À¶¸Áµ¾¯·t±³¥ºÄ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°®¦¬§¤ ¬´»¢¨²ºµ¼¿Ì¿Å޽³Â·¹¸¿·º·¹¬¬°¥°ª½°¼ºÂ¬º¨ª}~lXdbYkfjfW\cYVSIGFLQGCHIAHD>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWSYUZvjp~nzsxb¹¡£{z|}}wzueP\dGEL;Qca[^SF?;HPEZcQRYXZgYT``LSPEA?IJHEEA@C<E6B>HGJLSZT]®¸µº¸È¿º½ÉÌ»¼À»·µ»º¶½´º±Æ`u²¤±«½ª¥¨««¤¢²µ «§®¥§¦¥££§±´§²³½¶Á¾ÓÉÉÓÇÂÅÌÂÊÃÀ¾½¿»¼·´¯¸·¶Ã¹Å½Âǯ¹ª¡«¤§¶s`cc_Xb`igRX`VQUIEENK@>GD=KA=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrssÕÀµ }~x{|y~t}zkfpuY]\Pedb`ed][XW\MdmURmm_n_XgdUYUJDBKKHFHHHGAI9D?HKTTV\Z[¹À¸½·ÆÀ»¹Êʺ¶¹µ¸¹²·µ´®¶¶du¨p^¢¬ ¢¤«¥§¥¤¬¥ª°¸°½¹ÔÑÎÖÐÉÌÒÌÏÎÊÆ¿¿ÂʽÁ¼ÁÀÄÄÅʾÈ㤻°´¯«¸»{m^a]Z_aZccP[`SPKCAEFE<@E>AHA@D=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ\Yh_onlouu³¬¡
~|s{
{ts{ylmu{hreilifjih`fiilZms¤¼g[oh]ZZTHKNOJKPKSQHLAJGJO_^bfia·Ç°¸²»½µ±ÄƵ°¸°¯»«²±§«·«µ§§N¦¥¡§¬¯¨°§´´ÔÔÔÖÒËÏÔÕÍÓÏÍÅÂÉпÊÉÊÉÑÇÌÍÂÐÑ·¯Ã¼Ä¹¥¶ºÃ¢pe^^^YaXZfZQ]WOPBBHEBH;AC>AG??A8;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeVshqoyy ª¥}
|p{r}qxulqx~q{nxslhpmcjmpxiw|~Ë¿Áß§ncxnc[a`JPRUNY^P]\NPNTQUT\nmvq¸¬´¦¯¶ª¬¼À°«´¦¤¸¦«® «´£±¦«¬¤§¢¬ÏÒÕÑÍËÒÓÔÐÔÑÎÈÃÔÑÇÍÒÓÓ×ÌÑÑÅÒÖÅÀÎÇǨ¾·Ïzpf_d^XaS]ZPQTPOH>@FABE<@B>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMNZu
wlwp}~¡¡y
{r~zu
ovrks}{v{swqjsripqzyrz¾Ë~²vrvhak]CZZ[VecXdjSX]]`d^cxz~©£¤¡ ¨¥ª°¸ª¥³£¡¡£¡§±¦j¢
~§°¡ ¡¥¤¨ÈÎÏÈÂËÑÔÑÔÓÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÃÌtpda`YUZT\PKGJJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznwpmuux}t
|ylvtn}vux|µ;AÅ¥~|ieWICfcecgjdnx[^fhknin ££¦±££³¡¥ © £±~
z~©£}«³¨§½Ãƹ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÖ¾ËÌ´ywpf^[SWR[VFGJIEE=:7:@@B:GD?DCADB;?;;7DC75655;0689443341014558754449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt}~
|x
zyqz{uz
yp|oozq{qnzuw}|u~{¯sX©Â¶pnb=^hrpqpnxvehoruxqz ª ¬¡¥«}
~my|®ª¦¯µ½©¾ÇËÉÉÌËÐÉÃÒÊÔרר×ÕÛ×ÓÙÛÕÐÚÚÑÖÈÔË{}ji\[QTT_HCFIH>A>=7:=?;=G=?AAADA>?:86DB755479.566435532323646553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<::D?CGRj^mdbfkvrz~~||~wyn{{tz vutu}too
t|zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥£«
z}¡¼¡©¦¦®¨¶¿ÀÀ¹ÇÉÍÎÅÍÉÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÚØÎÜÆ}{ikgaUXVVNLDMB;==<8:<>9=@6=?@=?><9867DA6455=80665547745613855564557HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz|~~|{~
zzu}um|}~s~|~x}xnt}{}z¨Ã¡½£}}r~s¦
{hGq ¤
~¥
¥¸¢¨¡£¯·ºµ¬ÀÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¸z{zmkgXb\TPOICLA<<>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX_VXfmmmiqsy{z|{{|{~u
yrzsm~~w
¡n¨
z |}£¢ ¤®
Wr«\¢
¢£ ¤³¡¡¨²¹¬¦½ÂÇÍÈÆÏÌÐÌÎ×ÐÑÔ®ÖÕØÚØÚÚ×ÖÙÙqvih_^YTXYCAHC?>>:49:;7:;;3;;?=>7;9:1:H>:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbymb~omxxzz||{wsp
zuvvt
}~¦£¥¢¨r±§¢£©¯n·
ÄȲ¡¥²d¤ÍÈ
ª££¥©¡£³´¦£¼Á¾ÈÅÅÉÈÉÂÊÓÍÍÔ©ÒÑÖÖÖØÚÔÓÚÎsie`__PKV\BBFC;A=837;<:8=649:<:82?9:2:I:=67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFu}|m~xz~z~vv{lny|xx|~£³¨£«²¡§ ¥¤®¢·³¡ ¤¯¢¤§©¯¤ À£É¸«¢¥²
¨¢
t²¤¡} ¡²®£¥·¾´ÅÇĽÃÿÆÎÊÉÒ§ÎÍÓÒÐÖØÒÏØ»s{w^bWbXQIJOEBCD5>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGN[\YJga;Hz{m
y|x
}px}}|osz}{x
¨»¨²½¯¥®³³¨£¢°¬µ¢¸¥¬¤©·¦¤£©ª¤¯°© »»É i¶¸«°¢«½£^©²|}³«¢¢ ¥¯¨¢¥³¸«ÂÈĵ»½»ÅÈÈÂÑ¡ÆÉÍÍÄÖÖÐËÓ¢q|j^\U`RQGD>=CAB8?874>F<<6<35355454B3::BM:A;AHB;:@<746<B9?@B874::6>=47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeHb`cpJ@~r|u~m}}|pww{«ÂÀ°¾Æ»³´Á¼´«³¶¨²®®½ª»¤¨¹·«¦¦¢¡££ª¯²±ª¤¢¥¥£¹®¨À»¬²¹¥¤§}½°z§±« ¤¬¡ ¡¨§¤¡¤°³¦ÁÆÃ°°»¶ÅÄþͧÇÃÇüÕÐÍÄÊvud^\a\OKCL@EF>A?B;:4>A==5<6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\gG`igZ][{un~|q~zz§´ÆÉÀÂÌÁúǻº¯«¹»²¶º³À®¥À¤ª°»»ª®«¢¢§¬¯µ°ª ª¢°´§£ººµÁ»«¨²¤¤¨©ÃĤz¡ ¦ ®ª¡ ³ ¡¤ ¦¤¦§¤¯¥¿Ä®©·µÉþ¶Î²Å¾Ã¼³ÑÊÈÁµv{n^Z]lTNICLKJI@A=CD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr|~wz¡¨º¾ÈÉÊÂÒÉÊÂͼÁ³»¾§º¿¾¼Ã·¬Á©¬³»½ª°©¤¥£¬®´¶¶ ¯¥¢£´½©¨¼Á£¶¶¯«¯¬ª«©¦¥¥uy
££©¥}£ ¢µ¦¥¤£¥¦¥£©¨¢²¨»Àᥳ·ÌÀ¹®Ã³»¾Á¸ÂÂÁÀp{cZX]\MLMIGDCHBBACK:4DH:;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>kI_XaZdeVx
~ ®§£Â½ÉÄÈÆÓÍÎÍ˼·°º¼´¼Ê¼ÃÁ¶¶»³¿¹¼¯¨ ©§¶®©²·¢§¡«·¸©¥¯¾Ä±½¹³§©³³®¥¬§ ±Å§|}ª¥¡£¢Z¥f£³¥£¬«§§¡¤¨¦¶¬©º¼Ãµ¦´¶ËÁ¸ª¶¬³º¸®¨¸º½¸np\ZVWOGKSMK?AHEDGFG85FM;>7>AJ.32025B55PWN;LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBrFiIRebLF¦¡¨¥¢¯¾®¡Ç½ÆÅÈÇÎÎÎÒʾ»¶±º»¼¾Î¶Ä½·¸·²²µ³¸²«¦««¸«©¨°°£®¤§¤¥´À°ª¬³¾ÂºÀ¹³§¸³·³®¥®®¤¡sÁ}±¦£ ¨¡ `J¥T°¯¥¯¯¦¡¦ §¢´©ª³½¼»«°²ÇÀ¸¦««±±£¡²²´¤rpg^\PRMEPPPQ;HKIFHAC>9KT?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=REWRsbWFH«¡¨®§
£¥µÉ´©Æ»ÃÄÈÊÉÈÌÎǾº³¯¹¸ÀÁ͵ȺÀ¹µº±¯¯²´¦£ª´´«©¦®¬¤®¥¥¨¬º¿¨«¶¶¿ÁÀ¾¸³²Â¯·½«£®´¬¸¥¦v¾ ®¡ ¡©¨ ª¡§nv¢¢®²£«©ª«¯¥¥ ¥ª¢±§ª«º·½³²®¾¹¶£§¨¥§¬©©ehb`SLMGHNJVL=MDMIJACD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..SaMVHe^HF¬¡»®ª«¢¤¬££¶Ç½´ÁºÃÃÈÉÅÂÎȽ¹²¯¹´ÀÂʶƱÁ¼µº«¨¬¯£¢ª´º¦©¦¬ª¨¯§¤«ª¾¼¨¬¼³·½Æ¼¶µ¸À°½¿³©´¶«¾¤¢¢¼ ·©¥£¡§¥³¢¥¨ª¤¢¢ µ¯¥¦±««¥¤ª ©¥¢¡´µºµ¨µ²³¢¦ª¡xb_a_LIGHMQIMEFFBRJHADGAVSDH<AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGE¨¤Â¬¥©ª¨¦¬¡ª¶ÄÁ¼¿¸ÁÃÁÈÄ¿ÍÆ»¾¹²°¸³¿Ãȵ¿°¼·¹·§¤««¬¡¡««Ä¢¥¨¬¦¬¯¬¢ª¨¿¸¦¬½°·¶Ç¶´¹¸¾°¾Á¶´²´¯¾££¡¢¥££¾¥©¨¬¡¦½¢¤¢©«¡
¤ µ¬¦²§°¨ «¡
¡¥¤¬±¶±ª¥©¬ ¡©je[b^PJIKOMHFCI@=OH@;GIH[ROK=HNU4BF9>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcXM¢£Ä«¡¬¢¤ §ª¬¶°£ª³¶Å½À¶À¼É¿Êȶ¸µµ±´´·ÁÆ·¾±¸µº¶ §ª¬¥¤Á¥ ª® ¤©¯¢¦§½¶¥±»·¶µÃ²³·º¾±ÃÀ¸¸³´µ¢¤ ¡©¨«¢Ã©¬®¦ ½¡¤«««¦¡X¦¡ ¸ª§·£³¢¡¯ ¢¤¦®³«©¢¢¥¥¤cf\eaMJKKOFEAFK>=JA99JJN]QQJ=LW\9FI=DMI8Hc\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\LO¡Ã§¥¢³¡²§ª¤£©¬»°¨¬µ²ÈÃÁó¾ǼÅʽ°±·®±µ¯¿Åµº±°º¶©±©ª¦¡¨Â¬±ª¢®°©¤§½·¦¶º¼¯·Ä³³Â¿±Æ³º·«´¶ª¢¥£«¡§«¯¯¯»²¦ ©©¢¤¸¡¡¤®¯¬¤¦¡£§´§§´£¯¯ ¡ ¡¦¬°¥§¢
cg\hfKJLKSBC@IG;;F?99NMU^RSJ>O^^=HPBMLI9Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤ ¨£ª±¡£´©²«¦¢¤²¬®©»²°´´Æ¿ÄĵÀžÊŶÀɶ«µ©±¸¬ÀÄ´·®¶º¥«²«ª §»µ¨°®´²§ªº³§º³·²¸Àª·²Â¼´Å§¾®·µ©§¬¡¥¤¢¢¤¯¸²µ¶ ¨¤£ ·£¤¥®²²¥©¥¢¨¢®²¢¦¯¥¬¦©©«¢§¡zej]lkOQNNT=BANC;:I@77QO]^RVQAW`\BJSHWKH:Ud]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JpiVCWFyfC;¤¤¡¥¿¦¨¯¯¡©µª¹¯«¤ª´·±°¹¶°·¸¸Å½Ãǽ¼ÄÂÇÁ¹ÁÇÁºª·¥»Á÷¸ª²¼£°²¦¨ª¹ª §°ª°´³ª©¶¶¬»¬²²¹·¬¹°Á¹½¾¦Ã«°·®¨ª«¦ª¡¢ °®³«°¹©¦ ·©¥¢¢¯±³«±§« ¥¡£³°¦¡©£ ©©§ ¤~kjnbnnXRQZTACEU@;:IA7:XPd^PWWDY^^MLRO_KJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gY`F(@8l}h\V:{cC=¨¡©½¡ª°ª£±¸©¥µ²«¡µ½¯³¸¼º½·¶ÁÿÉĹÅÃÁÀ¹Å¾Á¸¯¶¨«·²¼¿¿µª®²¸¬¨¨©§»¥³«¢±°³¬ª¶³µ½¯±µ¬°µ±À¹Ä¶«¼¯±¸¬¬©¢±¥¤¨¤²ª³ªª³§ ¦¤´®§¢¬¬®±§²¬²©£¨¤ ¨µ©¡¬§¦£
{fmshps_GYfVDCNXDZ9HB6>]Rh\NZ]G[^]OMRXdJJC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'_^aV151=`V^8)C3YU\gK5zfL@¤ ¤¬·£¬©¥®®¶ª®´¹¦§°¸Å·±·¾Áµ´»Å¾ÌŹÃÁº¿ºÄ·Á¹³µ¬ªº·»º¾µ«®±·¨«ª«««½«®±£ª±³®®¶²¹·ª®±§µ¯´º¼É²ªµ´±´¯®¦¡³¨¬ ¥±¢ ¥¯¡¤¢¥¦²©¡¦±«ªµ¤®°µ¯£§¬¸¢¡ ¥£¢¡{
{lnyou|aF`jZIHZ[={JGE6AbTiZM\aJ[\ZRRSbaLKE`a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.*A/JGP[G3cYTKD¯¨±©¬¥£®®µ©¶´·£¬´·Éº´»º¿¾µ´·ÃÁÍǼĽ·¾¿À·¿½²½®§ºº··Â·¬®²¹§®«§£³ª¯º¤²±¦§¢²³±²±µ±¸²©®«²§¸¯µ³ÄĶ©´µ«°©§¢¶¦± ¤±§©©¢¥¥¤·§¢°³«§±§°µ¬¤¡¬¨ª¹¢¨£ ¨¤¡w|nqxv|]Kel\JOd\?b{GI8GgWe[M^bMXYWUXTi]POHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=ELQ<3rkKDC¤¤«¦£°²³ª¶°¶«µ¹É¹®Á»Ã·³²µÂÃÏÄÀ¾µ½À¿º¿½³Ä¨ª¹±¶·À½°¬´´¡§°¥¦±¥²µ¬«²°¬©¨´º¬´³µ¬´¬©«¨¬©¹±°Ç¾¸¤¹¯©¦¨°¥££®£©¯¢£¢£¬£ ¡©¥¥¸¤«´´¤ª«¨¬®¶®¢£¨ª ¤´£ ¡§ x~
}}}rts~~\Rdn^NZg]FD[G:NmXb[MabNVVVWTYg^QRLdZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Ce;6*HdHJ+:I?3CIS,>k>HI©ª¡©°¤¨£³´±´µ±±¡¬½Ëº®Á»Æ±´´ÂÃÑÄÆ¿Á³¾Â¼¿¸¼Å¨·¬³¸¼Á±¬²®¡¤§©¨¤±£«±ª¯«±®®«³»§·±²©²©«¦¥£º¬ª°Â¹´¬¹¨¨¨©§±¥©¤¢®ª¨¢¢¬¥«¡§¨¡¬¥£¬·±± ©¢ª°¬¦§©£ ¨ ¡¥
}w
usrvl_Y`ncQsr\K<|F?WuX`YOc\NUVUWP\a_TOOhXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.IgDF8<B05EKX1@\@MF¬§¡ª²©©°¶¬¸´®ª¤««½É»±¾·Ã¯°³ÄÄÎÎÿ¿´ÁÃĺÀ´ÉĬ¯·®²ºÀ¿´®®¬¦¨ª°©¦¨²¦´ª°®±¯³¬³º¤¸³¬¬§« ¢°·«ªº¶¤µµ¤©§¬¬ª¬¡¨¦¦±²¤¦¥¡¡«ª¡ ¦£¢ª¤¬¢¦±·¬¬¢¥¢©ª©¡¥¤¤
¥£|{u~uw¤yk^`ngWfdN@gLDbzWbXReUMVUUTO\]aVKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DAIHD¯¤¢ª°ª¨µ«¶°«¤«ª©¼ÁÀ¸¹³¼µ¦²¯ÄÉËÑ¿Á»¹ÀÀ¹ÁºÂÄ®±µ²´»Á¾³²¯¬¬¨¶ª¥°«¹®¨°°®±«µª¶µ¦´¶«¬¤©ª£³³¨¨¤³´ ¶®¡©¨«¨«§ ª«¨¹¶©ªª©¡©¨¡ £¢¦¢©¦´®§¥©¢£¥¦¦©¢££~
£txu{x~prggqx\atiO]VHmyUdVRcOLVTUQOXZbVHPjTVSGPYUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02?f=NX?C,?LT_/Ik7RE;¯ ¥ª¬«¤®³´®ª¥¯©©»¾»Á±¯¸¢µ¯ÉÇÈÑÀ¿½»¼Ã½ºÃÁÀ¿¯±³²¶½¼Á²²³«´©¥µ©¤³³¸¯¢µ±¯±¹ª¸®ª®¶«ªª« £¡¶¨¡¯²¡´ª¨§ª£ª¡¡¬¨½¯¬®¬¡§§¬¯¢¢ ¨§§©°¨¢¬¢¡¡¢¢¦¨¥}
¤
¡
xs}txz{tt{j¤vi^elug|RWp^KxsTdSQ_MMRZgNLVYeXGSjRQ>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mi:38_=ad?F1CP[[+HO;XB4± ¤¥ª£¥£¬¦´³°©¤°§ª¸¾Á¼°¨¹ª§®°ÉÇÈнÀ¾¹¾¾¼É¼Â¹±°µ²º¼¹À³´»¹¬£µ§§¬²¶¹²¦§ºµ´¼¯¼¥µ«©¯¤¥¬ª§ª²¤³¨ª§ª¤©¢©¨©½«´¯©£ ®²¢¤¤¥¤§ª¥©¡ ¤©©
}~
¢~rzy~|hw|{uqr~izd`hcr
{mhy]^VCX{mTaPRYKKMpt]HZ[gYEVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*±©¥£¡ª¤¶²±¤©±§¹Á½µ°£¹¨¨°ÃÉÉÌÁ·½Àµ·¿ºÈ¶Ãµ´³µ²½¹º½¶¹¶¿¢³§ª«¯µ·´ªº»¨±¿²¹ ¯´¶©¬±£¥¨ª£¤°¦¯ «©§¡©£¨ »§®±®¡ª¢£¬¦¡¢¢ª¢££¡¦¬{}¤|yl}vyxb{zrpqsxjujgchansmbjp`oB]ykV^NQQKILSYVM\^mWDXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3Q]=#¬§£¡§£·¯¢¯¯©«¹Âº³¹¯«¨´ºÇÊÇ¿·Â¾¯´¾·Ä¶Ã²°º±²À¶»¾¸©¹¸½ª¤µ§¨ª°¹°©¹¼£¿´´¡®·µ¦¦§°³ ¥¦¨¡¤¬¨© ª®§ ¦¢¨°¸¤±® ¬¡¤¦¦©£©¦¨¡ª}||¡y
}{sp|qst`yxjoqqpksdzlhfdbf`[rjqMNiXZMQLKHPRQHM[_oTDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0\[5(¥¬ ¡¤¡·ª°£´´©©ºÅ¶²® ·¬°¶ÅÇÀ·¿Â¹°µ¼·¿»¿¯¬¾°³¿²½Ã¹©»º¸§¨¶¨§«°¬³°¦¼¶£ªºµ®±¸¯©¥§¯²¡¤ ¤£¡¯¦¡£¨¯¡ ¢£¤¢¶°¡¦±«¬£¯ª¥¨¤¥©¤¢©¡z~zz
~zzpqvnot_xwemllkjofrikfi^dt`[kviZJ^[XOOKHHRUF29]^mPDXVYeMHIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDU]hD.<2cV,2¢¡ª¤¡¢¡·©® º¸¥¬½Å³°®£µ¯¯´Ãü³¿º·±³¹¸º¸º¯®À³´¹¯¿Á¸¬½ºµ¦¢³ª§©²«± Àµ¤¦´µ¨²¼©¨¥©¯¬£§¤¥¡²¥¤¨©¢ ¤£¸¨¤§®¦¥¡¨¨¢¡¡ ¡ª £¨¤y{}z
{w~{ltqllsawuiijggohhicfij`kcjh\e{c`StT\[SLJGIOS@!*h^jLCVU^`KIGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gO'2¢£¤§£µ¬§ªº·§¬ÄÁ¶°¬£µ®§®¯·À¿¼²Á·°®²¶¶¸¶¶ª½³®²±½¿¸®¼»±¥¶«¥¥´©ª®À«¨¤¯²©¬µ»¨©«±¥©¦¤¦¢¤©¡¡§¶¥¯ª®¡¡¡ ¦¡¡¥«¡© y
w}
{s}}fxokjkguskcgddvcefffjjdkrZ_Y]mdaNiX[`VJGIKMRX>9_liHBTS\[IHFFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£¡¤³±¢±½¶¡±Æ¼º±±¤·¬ª®©¹¼»»®Á²®®®¶®²¸³¨«¹±¯®³¶º¶°¸½¦µª °¤ª®¢À ±¤®°®·®µ®¢§©¥§¥¥¢¨¬¯¥º¨®¢¡¤¤ ¨©§©§|s
|
p~fymhkigqrk\hcctbfhjnlgjjhn]lltpaUcideZIFLMOXQQVaeU@VSYUFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC'4¡°¡¨²¯¸¿¶ ´Â»½º±¦¶°¨®¥·¸··»¯¬ª«¶ª³¸¥³µ²®©°·¶±³µº§©µ¨¨¢©§¾£®¯µµ¬±¯©¢£«¨¦¤ª¢¤£«ª©»§¤ ¡k¢p£u©§¡xni~vql}p^cagltw~gguheW\hsnNPjcgs
g_dfnmj^_aeNKD9FTg^JGPPTUKHR`oteFZQUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.£° ªª£½Å¯©¸Â¸½½§·°¥«¤·³²³±¹©¦¬´¦¯µ¢¨¸¶¶¨§¬·³®´³¢©³ª¡¤¦§«º¦¥¯³·®¤©®«¬¥¡ §§ ¥¥§§§ª£µ¯££££ ¡ ¤¥ªrx
¡vif}rx¡o~}¡ |tvllheczkqaS
mcliqYjpoX^i[kk[qnzr
gZ^GN?G_MFRVVQQRWTg^MWIRSPFGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa70(¦«ªª§©¾Ã¯±º½·À¿ª¥·°©¦³´®¯³·«©¥±¥´³µ¶´¦§¨³±²¨®« ²¨ £¢¡¢³£¥¥µ¼§¬§«ª¬¨¥¡ ¦£¥£¤¤©£¤¥¦¡·££ ¤¯©¡
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Åzrµ¦»{l±«°xhkX±®nei¼¼nhzorØ~Sjb¶²rt¡ªWOWbPVNFT[XQPR\W\P@\DQNEGJ<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦§ª¥²§°Â½²µÀµ·¾Â«§³¬©§®³©¯¶´§§¦´¥§¸®³²¶ª¥¤§²®®±¦ª§¤±£¢®«¢³º£ª©¢®¥¡¡§§ §§§¡¦¢ °¢£
¯kjª~gdp¥q®¡¤~x»}k¡v±_j´[¥f`fzfjxk©d¾rg¦u±j|±xtcmm§n[ EhfEu`~h|¤§Y_«ixyj§7J¯\XSld[KNW_\WV;NOXW/ITTJDFF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢¬§¥£¤ª²·«³½¾°¶Ä²·ºÁ§©°«®¨©°®£°º¯¤¤®²£©¸¨³²°£¥ ª¯¬¯¦§£¢°¢¬¥¡³³¢«¢ ¡¨£¡¦¤¢ ª¦¦ ¡
µµx
©µv³·~¨~l¦{w«gk±[«{tqx °vwqkkl|N¤XHcc~ch¦`ysuS^P©mcq~b.Q¡o[Skh`LK[dX\ZB>±yXXA#MhFCEA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50³¦¦ ®©§²¬©»¶Â°»Â¸¶¿©«®¦±©¡¯¼ª¡§´¬£«µ¥¦³³§£¢§ª²¨°¨¥¯¬¡¤¨´®¡©©¨© ¥§¢ £¤£¢©¥¢ Õ¹p°Â~Å|Ö»|¤¤{¤¥z¬yV¯z~j¹Z¹v}¦|zªy{±nt¼
oP¯§ÅQ zc`©bssm`Sµ´È|c¤3Bv]PjidP@XgZdaJHNmM[ROYfYCD?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ71%¢±¨¨¥³ª¥´©¤¼·Á°¹À±µ³º²´¦±°£°²¦®¶¨§¹£¯± ³´° ¤§©°©´©¤« ©§°¨£¢¦¡¥¡¢¡¡¡¡¢¦¡¦ §¡²nhµq«n¦r´sr¶{¤£¡¥~°vÒÑv\®{
¤oª¦k
}}{±sy³etofRÈZÂ\yb_`vtb^YÊo¿uMKµSUÆdTQjcfXAOk`lhPUGI8=VQZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746@>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥¯¤ª¼¦µ¥§¶»¼²º¿·µ³¹¹²¤´´¡±±¢¬°¤¦¹¤±°´¸ª ¦¡©¤²¨¬©¤¨¢§¥ª°¦¢¤ ¤¦¦¦¡¢ ¡¦¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
~w¯x³aelZ°XKuyf`^vwhk]¯wxl5yÈ®²_BSo^g`EPm_pmVUM.echRXQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I:99 ¹°´Á¨³¨©²º·³¸¿¹·±´»´¤·³´¬¨¬§µ«¨±±«´¤© ¨¡¶§¦©¢¤¡¢¥¦¯¦ ©¡¢¨¥ ¥¨¤¬¡ ¡¡ ¦©}}¥x¡ªp§¡£ª|yo±Z¨ ytØvt¨£|{²^d ~l\«[Zhgªdr{ks]¬Z koeOJC¡\[Lt]bgM[a^qs^JV6JXHE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¡¿«´Â®¬©¦´°·±µ¿¹¹±°µº©º´°¤¥§§ª°©¯©µ¬ª¯¡¡ ¦¥¤º¢£« ¢ ¨°¯¦¨¦¤¨«§©§ £¤¡¡¡ ¡«®mr´r©v¦s´xs³¤£¤w¸o{¢kk¶Z
ei¡¢§mr´t²j
ku³af¢oj\_M¡|Rs£ly~oq\¯V<weTon.\§OcRkebmZc\_ozbTZQ>>mo3CB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¥»¡²À®®««§·©¸¯µÀµ»¯®¸¶ªÁ¶©© ¦¤¢ª©§µ£²§¯ª § ¤«¸£¥£ ª¶°§¬©¥¥¢ª²£¦«°¡£¢¡©«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~tª}¾ns¼t²uxnqn¤t½^w}[ay¼kZV[jz^jaegalwnY[YCA@r@CG+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¢¼¡±Ã°ª«¬±§¸¯¶Ä±¹±º¯®À±«¤¢£¡©£ª²¤µ¦¥ª¦¬¹£® ¥£®¹²¬£§§¤¤¬ ¨«¨£³£¥§¢¢£° ©
µ·xµwmknsoytÁ»½{²¨pt¹|{|¤»¹½uz´£tvut°ufiµtrpw¶^z}hymyc¬pu
Z[§jEdYSf`c^cQgfpluBMPLD:ZM?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O^]=+:VV'>;<§ ¡¿¥´Â´¬«¨¬«©º®°Å®´²®·§´¸©¢¡¥ «¤ª¦µ¨§ £¬¤¾¦¡ª¡¡¨¡±µ·¤¤¢¦¥ª©¥¥¡¨¦¦£©¡£°¨§¡j~i¦xr}tzd{½¾ÀºoqasjZ^ack`dmwbke^acqir}
gj~rtx}~b[wthP\n}|kXlzsJJopMuMEW^f`KZWgc_O[muirRODEN;HH=L?2-2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P_L(3=[O'?2>¨ ¨¡Â£´¹µ£¬¥®§§µ±«È«°²«´£¾±²¦ ¢¨¢¬¦¯¤¤µ©¥¡¦¨¾§¨¦¤©¨¯²¿¬§§¢©¨£¬ ££§¬¢«¢±§ ±¤¡¨¢¤¦¢gn}qw
µª ¢¡z¤lj||uqxyvv|kstuev}wkp{m`c]pgLXZfj`WZoymmfSOFS9OYMRO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³¡³¡¿¡¤±²· ª¦²§¥°´ªÈ«¬°¥µ¦À§´ ¤¤£ ª§¬££¶«ª¥Á«¤¢¢§¨§²Ä¯«ª¨ª ¬¡¢¤¯¦¡¥¨®§ ¯ ¡¦ ¡£ ®|ª¨{£f¡³¯
v{|vyzofzkuysiszukudyf`iecdfkYl{oij\RLPD_TE@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¿¬«®²± «¦±¢¬³°Ä°ª«£³®¼£´¦¢¡§¥©¦¤¥²´°¥®¾ «¢¢¨ª«¢³È³ª¤ª§¨¤« ©¯©¥£«¢® ¡¤¯£¨¤¨e|e~dylhk{¤ªje~geeih{¡kh£wkj£sln{zXe^^lv\hswwnxxsmytw|jY^ktd]sik|qkc^QMWJdXAJ4=F7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³±ª¥¨°¦±¼±©§¤¯° £¢¦«£¥¨©²£¢¯¦¶¹¥®£¡ ¥{¥¢¨´Ä¸¤¢§¯¢££©¨¡ ª°ª«¤ª ª§¨ ¬¡¥°¤ª ¥ª~½r´rhx¹Ä¸q¢£z¦sª|ËÀÀ»q¢}À½ÂÁ||ÃÀ}k¥²ooÊzwvzyqzqx
ynxcf_yd`ec^tgldbWKUIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BQ/#F[3PY/UAB;/8£¹Ã´°°À©¨£¯©°®¦³´¯©¥¦¦±««¢ª§¢¬£¥¨¤¤´¤¢¦«¸³§¯¢¥¡§¬¤«ÀÀ± ©¯©¡¢£ª£ ¡®©¬§££§¡¦¥©¤¨©©¬ ¥¡¢Îxz¤y_®^§¢ |§t«¯^cª{§
t³c«¡³j
¯t}·aY¢Ínu{Ú{p~v~e{vvk|o}
~m`rlph`_yd\qhjcf_QTRW]KOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸¤ª¨´«¦²¬¬«¤«¦°ª §¥¢¯ ¨§£¦¡°¬¦¬±ª¨¬ ¤¥§£®¤«°¨¿Ç³¨©±®¡©ª ®°§«©§¨¤¢«¬³¥¢ªª£¦¥¡° ¦ q
t¨q±|q¬~¡¥wª}s~«v{|~ª¢~«{{VÄzoÁ}muomeveoawnromfpuuqagme_oiingcWS\aYRSC8II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´ £££¢¬¯¶¯¨±¦¨ª§««§¢£¢ ¥«¢¥ ¨¨¢°¬¨¦®¬¨¦©£¡ ¦£¯¬£¬µª¹Í²¦¬¢®¬ ª²©ªª¬«¤£¬¯±¢¨«®¥¦ª©©±¢£¤
¤j¤uz©tz²p¦q ¤`aR«®v¦z{f£¤¤}©®_}©U¢z¢{ïÅr¯³³¹qb©¯Âthmpnyxypmfeeqpf|ib]W`iXXULLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÖÕ¿¡«§¡¯¢°´°¯©¢§¦ª««©¤¦ ¤¦§§£¬¢¬¡¤¯¢ª£µ°¯ ©¦¢¢¨ ¥°¦¤¨±¬¶È²µª«©¢¥³ §¬¬¤®«££ª¢³®¢ª³±¡©¨®¯¶¢¢§|ªlu«y|°o¤Ò¸´¸É²_`©£ zxªÉt¤¨ªÆÇxf¡¥s}¯]p´b°uK£m§Gd|qq{u~|n[fjrpej_aXdm\^YINLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ©³¬¥¢²¹¬ª¡¦¨¥ª«ª§ ¦¥ª£¯«¦ ¬©¥§µ¢¨©µ²¬¥ ¥¬§£ ©¦®¡¤§©°´Â±³ª¨¤¡£®¦¡¦¦¬°®©§¬¤·¬ ±¹¯®§²³³¤§¢Nxz£}¤¦¸{|y¹~ÌÆÂ¶x¡~v¥¤©°
¬}b¥l¤p
}r¬`£sq`¼}RUt£{~v{s
q\mnxrjo[d_hnbd]KLQTAIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@882.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª¯ ¡¬³³¥ ¥®®ª§¦¦£§¡³®¢©§² ©¤¢µ¢¢¡¨´¹£¢¢¡±§¥¡¢¯®¤¨¢¶°Ã±©©§¢¤¥¦¤©¯¡¯¥¦¯¥¼¡¶·µ²¸°³¦¯ £
ѵ÷y
¦x¡w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{|m©a£qqbs²¸hw¦}y}ymixiyrnu]ednmfg`J[XX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¿¿¼º´§¥µ¡¢£¨§®«¬¦¢¦ µ§£©§±£¬£¤£¨³´¤¤©§¤§µ¡ª¤¶ªÂ°©«©¡¡ ¦£§¥¦¬¨®£¥¦¾¬½°¬¢°²¹«´¦¨±£§z¨}|°w¤¥m²o |¡¨¬®
ª¡¡{~««xz¯]£}¦§d|sj¯]¥kp
]`[ m¦|{kmc~tnz`geqnhggCZa[>KT3U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI8052.*,ATVVVTTUUUUTTUTSTVWWXVUUQHFIJ#((½©ÆÂ¶Á´¬ ®¸¥£¤£°¯ª¤¹ £« ¯©®¡«¨¤®±¬¦¦«¬¡¡¥¡¤ ¨¦¶¨¿¯¥©¤¦¦¥¥ª¬¬¤¥ª¨¾¤Ã¬ª¢¡«²¹ª®¦³®¨©v¯~
}º®e°e}¡¦¬°
¦¤¡¡
[lj³`{{±mgo±[}´\¤kÈ¢d{¼XvµZ²}R®z¬X¡n¨|z~dt~bxt|ajgqmfeeOUd\BU_>J(>9=4!",%2. *1/04579:<ACFHJLNPQRTWZ^`_`ab^_\[XUPNJFC553./@UZXWXWXXWWXWVWWWWXWWXYZZ\\XWWGB;Ò³²·½º³Á³£¬¦¥¶¨ ³³©£ µ ´¨ª¬¯¬¯¨¢¯¬¨§¡¦¨¡¤££¥£ª²¨»¯¤¨}¡ © ¢©®¨¦¦£¥©» Ʀ¤¨¡«´µ¬®¦»¬¬¬©£¯¤¸Ãº§¬¯¦¥ª~սªb£¿½}~£×º¸µ
½¾k£o«lz²°Çj«°½¬xw¢¾¼s§{zc}{dgy{`lekjbPaZSj\@UaBN*=:4/$%2 $(0496678:>ACFGJKMNNQTW]a\__a^`[\YTQMHC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼´´±¿¹²½²¢®¦¥²¦¥¿ª¸²¨¡¿¦§²±º¨¯¦¦°¬®¥¢¬ £¨£¦§¡¨¢¡¬¨¸¨£{¦©¡ª©¡ª§¡£ª»¨Ä¢ ®£ª³´ª¯¨º§®®suª¤·d pgmow¤u®pq¨£®¤rmmlfxonqzjqigriigpd]bjoY]g~w¦_aqnee¢ ~vfxikyydlcflbKdXJlZ:QeER'K:+# ",)-2.5:4579<?ABDEHKLMOQSV]WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^©³©¹¸²³ª©¡®£²©¾²Äɾ¶ªÀ¬¬£¡¨¬ º£¤®¬¦®©
¦ª £¢¤§¨£ª ¦¦§¯º«¬{¥¨ª¤±¦¢«¹¯À§¤²¥¬°±ª«¦·¢· ¨¥¶£©©²£« ±¢ ¢ ¥¡«§
¤}g~tvtq§lz¡£riwqxw|zjldcodU`X@i[HcaOZ+F=+'!740.!%2(*699469;>?ABDEJKKMPPQXUVY^`ac]^UQJED>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¦©ª¤´¶®®¢°£ µ±¬Ç½Å»¹«¢¦¦±¨£¶§©´§¨¬¢¨¬¤¦£¨¨¦¡£§¡µ»¨«{¡¥ª ¶£§«·§®Á®£¶¦¯¯°¬©©²¸ ®¼¥¤¦¶¢§©£¬¯ £°¨¯£ £ª«¡ª
}f
uuysj
|¢£
{rszr|jod^pja[_XmcP`dPZ:GGE>2==8/+&+)&&416668:==?AACIJGJKLMSSSUZ``i`eUPJACB:9EMV[^^[Z\[[[\]]__]^__aabaaa`bbbdb\[c¤¨£¯²¬®£©¦ §µª¥´¼¯¢£z¢±¤¥±©¸¦£ª£®¢§ ®©¨¨©¹¶¤¥y¢©¸£¯µ¢¯¯u¤½£²wy ª±ºu¬¤ªd\bv ¤}n³£§ª£esyp¨l¢¨e¥wjvp{aiZuhhs{¦f{xjoykqe_vplkh[febbpS\>NNNSG>@TD91/&4:316678<;>@AAFHBGFIKMTTUY]`hfgWQJ<DG<8UR[`ab`^`_`aa_\]__`aabcdabaaedchd^]f¦£ ¯°¬«©¥©®£¦¤«¶°²§«¦¬t¯¨«§¹ ¤«¢¦ u¦©¤º³§ uw ¡§²µ³»§ ~§¢z¢®¶¦±ª¯£y¬¡§©§
w¥z§{²z bympyp
txgt t}¢k
lx{qqgdxojljZekjet\_ITLQ@E5.ZTU7)!09=>743568;:=>>@DI?JEJKGSX[Y[aaifYQH9EK<>aV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah£¦®«¨¬ ¨±¦¦©¥®È¾±¢§©µ¬§¢ ¾ |ª §¢¤¹°§
pu¡¥«´´Êª·
¯¯¬©¥}¨r{w§h¤y´¦¨Â«¡r¥}
±¡}¡ |
mr
yq|uÅf©£k£q
hwt|whhuqhhk]cpmgmXgG]RM2D46Nac7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^jm\QE=LM@JdX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢°§©©¦« ¤¸°©ª¦ £¤«¤¥ª·£¯¡§¥½¡yª w¤¢¸¬¤~bm ¡¡¡§~¡§
ª
£©£uk¬uM«x¨§©«}¡{z§ikg¶~n`dY{dhr}yl]|m_Sp\_ky`Ye}p§ªk£nr¥p
jf l[n|fZ`bWPowfmtrkjo]jpmliXiO^XF9A4GD^k4,ICRMN=84859;6@;;>BO>QRLMBJ\]_W^^cv`MD:MOMTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ª¤¦¬¡µ¼«®¢ ¢¥¬®¡®µ£¨¡ ¦´u¦~
«£©¥°¦¡in£ ¡¤£¡ w§¡§¨«¥x|~¢ps{ym¨{¢sv¦f~w¤_z}s¢n·´ºtµ¨dƸ{p·q¤bs¬«`}i³~n|q£lr£t
¤`²q|³ts[²jbotvqioXjlrrf]i^cLD=D6QAYq3=SG_JR=<395::6D;;@JP?UMNQ@E_^[ZX``|dHC8LWUVcaZefkkbbeadc`ab`dd_`cknccddhdbgfchh£¸« ¤·µ® ¢££¦®²®¡¡¤«x
q¡}¨ £¨¨¥~k{~} w¢r¡¨¥¦©}~z z£xt}¦¢d¡|lhn{§}rht«tªh]
vhªj¸f\¨p`^§vu~huom§\¨~x»j}©[]³g\nrzxki\pjxyc`fXbBQFO7VCRo5KZZ_OZD@151;;6H?:CHU>YRY]>Db^V`Qac}jEB9N[]YefXfgnmbbe_aa__``ec^bdoq_deekecihgkiªµ§c«º²±¬¦©®±©¬¤¡¡¤jr{z£¨£ ix{¢ ¡rhp©¡¦¦{°£¢¸w£³¢¤y{ª¢q¡|
¯µ}k¡x~´££«¨|}tªZ]o{xbL~zz
cyBLY¢jr|mux±³§wmr}orj£]vHedasq~~nf`liv{debR_W]UW@ZEQhDSW\bX^ID=B8?B:IF8LEXAWR[VDFb\Z`K`m~rEC<U_bZfjVghmobfg^aa\]^ahb_ecvl^egfkdflihki°S^ ¦³¹³³©¢«©¡¬¥¢¨¡woy
|r s¡
¨|l
q¡x|£ £}µ{¥z©|§hwm~t¡sq|p®}¤¦£o^¨gu¢co¥aÓ|{xrsc¢~£s¤vk³`sª²¨¼wm~¾¦©´^n}qnr¢r]¤gs¦ah¦mÔ}
oxzk{wsn©¤gaeyqkgfdnuwg`cS\fQQbIWJTaWS[ej\eQFCKMJKBKE8O@QNXSYOSQafejRcwywIFEc]eZhjTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°«T\K~©¯±´°³£
© ¡¤¥¨ © {p}h}wo~
l|¤ª
zvnw¢{£¤³¡¢¶z¬§¤®¥p¨
{¤¢r£®¯¤¡v´µµÉ¡s`©my u¡w ~oLf£ps¤{ztak~ kqd_q}tizi³µ´Æ¦s~zk«umuxi{urPE}´^jvkyfjhbtupnV^TYiPSiJVLYTV]hknVhWNKAJMKHJOAQKPecjmeussy|nu{{TPNl^h[kiRjhilglfce`\]\^ibdik{_]dhcjfoleile¡¯¦f?¡³«¯¯¶¢¢ª¢£¥¦§¦yjye yug
z¦©z}yp¡y ¥§fnxl¢d|q¥wpg¦{¤zrv¹n¢b}¡mriªku mn¦_ihu¢}`uobh e~iuocfmr¢Z_[b¡m]n{~srd¥mw¢dg§hso¢oSo _f¨T^TnmskrmpikyskoRYWWgZTmJYO]IXiisjYkVQREV\LXSaUik_wt{}p}|r{svv^QrbgbpgPjhhklnhdg_]^]`kcjivu]\cicjjslfkmc¤¦zetm§®¤©°±¦«¦£¡¢¢{qh|st|zc|¨¢¬~si¥} ª¦¦x~¥²¯¥wy©t¥n¤¢»n}¥¯|¥zr¨ f~o«cx¨l©¢vwª¦j°kv³©kmm`~«ªv~¥v}¤ jw¬g¶tw¾¤Y¦«aurtq|tqcj~nhlSW[Vab]kM]R]J^mnv`[qY\`[ftenoqbqt`wz~yrys{{vbxdcmsdRkgholrjfia`^\bkbmlzo\\bibljwmglnb¥ª¤©ª¨§®¤«¥¥©
tzp~tt
rl}{
¦¥¦
vol©ª£ u~y®£q
x~{r§q}}zx{~~v {}k
[yyrzphn~quqe^wusuoynnm
^vhxe
©}t|jpv}vmmgsy{x
\kXyinxrroxxp]lnifV[`W\fkdVbU_Q_pxxlkvfjkkv}qrtsaoubt{xuzuy
}{mldxn^Wnghukxjije\`ZcjflqunZ[bldllynhloa¸¨¦¡¢¦¤¥«£¡¬¡§©r|}~
{srp
{}
x}¤|§¡
wr
©
¨ ª~~¨¦woyo~¨
p}qkp}hm]sqtkvtYrn}~j]jd{
`ixz{u
gwkapqv^r¦
enwqzpfge{z[\jgnv[{yxunssf\mkkaYZ_ZYlq\_aZ_]ft~ztptckkk|}s{xtdmuhm|~vz|{zz~o{}s~ysiT\qiluougkhd]aXkhlkqrmW[enlgsyohjm`ª°¡£¡¨££~ ¢¥{
}s}v
qor~z §¡xz¬¡«¢¢££ª¡§¦ {w§~²¦²¥k|wxe|w|yt¡~}uos~w¦
}wl}zjrhatp}zwwpwt]^ohn^^Z]]ThrVc\\blhu||sopdkki|nyqjpplg{rx}{m|zx|}zyNdwjrmpzekecb`[tfpfrqmU]ltmiyzqgikd¹¢¡¤¡|«}y{nxr~mk~z}«r}{ª¦¢¦ ¥u|¥{|ª¢ª~oxruau
~
nyut¢
s||rr{zx¦
w}ol~|nhlmh_zh}{vuvu{w\_p}nt_c[]^QgnTe[^bkivz~qlmdkjglslluoyp
ynv~
vq~{{|{`i{juhidjc`i\duhobtmlUcqyepz{sejml·¡£{x§¤yz
|n{xs
}}kh}|~}¨p¡¢
}¨x£ £¡¤}x ~|¤¢¢¦~~ttpv`~q|q
hwqx~}r{|qxzzy¥
{
v{fr|y{qljf_~sh|uvt}sj^`svpwdcY_^RkiTdY_ahjvyqfkdlhekm~hoql~xzks~tv|z}jrmsibhlb_qVtomn`xhmWjtvcuz{rbjoy²¥¥ |v¥¡¢x{~q{tv
~xgc}y}y ~p¦¦
w y~¤xw~r£¢¡~|vq}nzd|
pleuo{|w{
|{q~w
y¢vw|w`yx}txgleaijwstv}q|bcasnurmaZa^[leRcXaailvyqcjcmeh}lhuhlpi}ymqt|~z~|mvstneljbcuViqn`xglbjvpfy|zq_ql
®¦¨}xªzy|~||xtyzt}d^}~u}~}¤¢s{§¡s¦rk
zo¤|yqzkul|~~m
xp}~dri{~sx}vw|
|¤xt}tvoa{uzq}obocd{bnovsxwstau`olumo\\_^^k^P]Xcbimt{k_jfjchwnflhjlh}{wns}t{}z}}rzxxnljh_irbhqoevgnlayik}{xpawmª £¨~w®}w~{}{vxptt{o
}|a[~szz¥}}¤n¢¡mf
zp£}{srukpnu{tnqu{{dplx}}tsyn}
{
¨z|~
w~qpdiytup|b_pakt^pj{yylspex]nlsmrYZ__bkZPWXecgqq~f]ihgbgqndigdihzwuo
t{u
x
|x
zw{zrxjk_phtjromqgole|cnzwqlww~¢¡¨ ¦uª t|v
xyrs{
krpzmvnq[X~wu ¡x
m¡
i¢f
~w~||nuplmop{
isqwtxfrnu{zyvso{
z
£{uwynl^strppyZ^p`pj^oj|{qmmjlv`pojqmZXaabnXQTZfgcvob]kmdbfkn`ff_gkurspuxuy
ww
|{vjqc|c|nqltjholvx_qy|tut~¤¦
u zrxtpr
squkomumv~mnUQ«wwsz x{¤
|r
}gg
qx{z||kvjnkll{~az~wzw|ygsls~{qyovzz}|{w}vpjlzaxpnlrtV^obr`_lnyqhpfgsthpkawe]Vf``rSQN\fe^yp|_\hrbbefj_hd[gp~pkqt}v|
tu~y{xs
~|yxfrj`}ookz`jntu_t}yxts
|x °¥
wtvspo
spqojivnn}}musRMßÈÖ|puv w{s
¡~~wz~yufl¢
cqz{y
|~l{erokkyy\y{}~~
zzhrjs
|k}~n~|y|vxxrlgq
nkuohjtmR^odpY_kqwgkkbfxropc_w``Vk_^vPNKagc]zpt\\ev`aeecafbXissmjqv}tyuv~sz~r|~vesn}e~opkZlnyysav{{vrwwy¯
w~}
twpyqnomn~rdexp}mz}jhkc¤ÁÜ®ï¡slvv
£o¡r
£
~{uxuum
}¢
^m{}
v
}}k}dxuinxsXz
y~~xeri
kumyuswuspgvzcunpbivgQ`qglU_ntyard_h}prnZcrabVnY\xNMLdgb^wsm\\dy^`de
`cc^Yjrknkrw~twxw{q}~{t~shuqymzntpWqzvyqexyivr§£
}pxy
¡|{swpsjokim|u^axw{qu{g`d|ëÚµÉÃÜsltwjq
|{
vxru~o¡aj}}q~qwhvrisvkZ|
|uask~~}mkx
||nqyulpksy`ujn]kv_QdqifS`pvt`p`]hqsiWghbiXmV[uLKLfg_brs
i[\ey^^dg{ad_]Yknfoisx~ss~zvzs
|vw{ulwuyxtnx{|Xzqogywdv
q
¡¢sorw~|xrsnodr~hflwx[_y{{qqi`faÕ¶¦xnqw|qk{i|{}ztz{qt
u
~a
g}~~m|tkmwutvujb}|~o_rp{|~ypfy{}noy~umokl{~diljYnvZRiribQbrwlbe^Zjmsb[g_dl_nU[pNHOge\gnql[[cs`\clwde]]Zklbmjtwqp{}txx
}uy|vpwy{om|w^tmiztsgs|rvv~mv~}v}vqoljau|fbiuzZ_w|zmqecggW^qs¼Ävq~stk{|}|u
uv}quq~t{e}r~g}{y}i}vfoyxsvrkj
~xj^qwz}
{~rhxx{}nlz}wtoih}we^rcXpsSTnsibNgtxf`^]XnosYeb]jm`pOYlRDThaZknm{oZ[^lcZcpvdg\]`kjclisvqn~{tuz|
v~xtsyyoo|qiyz~mm|vkjxtk
n}vjxzozsqljd`tzh_er{Zar|yfpzadd±²wJbZ¤ÙÐr{x
olzy|xxoqt}{jy¦~m}vx
oz~oxh
xr|e}~ucpshxpnt
zvxyj[p|r}
zrmprxwmn~wzehj~raZxZYrmNXrsf`Jmvta^[[Yu}roWg]fjp_oNWiR?Yg_[pjgyq\ZYkeYcqy_h]^elhfliqwom}up{v
qq{}zzujzko~t}or|{poxf¡
gphz~
|ixrklf_aoym_boy\dly`pv_eeÕë¾2:>ry
vnl
u}
|xnv
wnlu{tfy¨}mtuy
~{ylsi~xm|{xbyqdqi~mtqt}su~so[k}tx{|xzqlqx~tmjvuu\iixqYW}SZqeL[sre[Jpwo][ZY]t~thYb[genbiMWfQ=^f]]vf_tp[YUodZeqyZh^`gmgilipx}ljyn{}zu
pnw~{{h{~kt|r{sw}zx~|kl~ki{~}kuqghc[bgso_altahpy`st^cd n\5Y¯µuj}vuwpl
tyx}zsgv~}op}hwynez¥~n~v~||r|}
|i~mk{zjzvr`w~qdrgumu{
|~owy|t~mWm~vswuzwsnr~|}znmimun]hftrR[{N\q\O\rodVKsxjWYYZaqt`]]`fdhhfNZhNAad[`va\umXXStaZdnrWj^bhkgmlipw|li}}p~~{zwr{oqw{j~{nxyww}x~zm
£{vykmy}{}pqpcf^Yg_pp``hpfjot`so[adiv{¾¦£È¸r
s}xtrsp{sutwyyqcwyirufwvcj|}r~sywzmyy~uhzilysizv}h`w~jjsh{iv~z}}q{v{t}aUu|rs|pwxpp}|x}|u
vhqhlrp]hctoKevL^oUTZsmbQOtxaRWX\aps[`\hedcjdP[qIDda\dq^\whUWVw^\enhVl^ajgeoohpw{niy~s{~y|v}pvsmw~p|xyztxyvo~}zw|htz|vgom_d\XeYmsa`aqllhm_siY^dmw©ÚªÇ²rxpu{zutu~wpq~m
txul`zyfqogun[m}y}x{mus
{
muvnhwfm|vmjwv|abxzhuuc~{gt{tuqz|lYVr}otxksxku|y|w{r|sgtemmt[k`vfHnoL[cXWVxmbPStvXPUX^`qo\`bldc^nbT]rGCf_]fh^Z{bRV\u[[gkaVk_anfflqhpvxtkuvx}w{t}oququ~{wx|}
x|}~{~svyzwuy^~ytw{bnl[b[[aVjtc`[hopgq`qfW]ck|Êι¢kmnmr
r}
{
zytyuu{jmucvwog_|yeqjjqcXm{sw~{mpp
zy~qqo}ghrcnxrjlqw}|z]eywiuyfvgt|rjn~ym|]Xp}ms|nnpvgw~~u{qzs{yqeranlsXk_x]IolMWV_TU|kaOTurQQTV^bt
h\`jiebYnaXcpGAh]`f^]V{^OVepZ[jh]Wg`_rfjhrhqsvxnt{w~yus
pp{xwuy
z|u~}~~}|xuyw~}nuydto
ztcnjY_[]]Tgse`YdrrgrakdW[`ix¾®{·nbsht|rz{~xxswo{vejnausjb_~xyfp}hjk[Wox£
qqxtlr
}ytrohyajmamvkgklzwzw[g}|xes~nteu~pfkztltb[n{kt|zft}mphu~w|}q{ky{ywpelam~mnVk`xVKklOROiNY|gbNUukMPTU^gvf]aogfaWi]\liJEjZbdWYUyZNWnjY]le\Yec^tfldrgsptxp
vx|
}usnsy{{sr
y}v}{~{w|wwziv~|l
rq~oflfW][\[Tdpe_XcruivodebW\\hporseeyjtvss
xzwtunkzpbgkgtnf^_|o{}hmwfidVWrp§||vs|r{ylzzv{}uprmgu]mi_mudgfizo{rYgvugpxuaw
|njmzqere`lygrvz}auvikquzpywr|f}~~xvnceam|mkVjbqTLjkPLNpH^{eaMUtdKNSWajw~e]grhe_VcWbp]KKkXcaTSTsVLYveZ_k`\Zce_wgmbpisoq~utxx~
z}v~
nrt|ztq
zut}
|~z~v{£¦y
lu|{uzo
sz
}unjieV][[ZScne[Xat{jimh`bW_Ziikoglahzykttto{}vunzikzj_enhwgeXbwi~zoiogf]UXoh§vz|xuo~nrtx~wt
vjrvgho\me^ns_gbjxh{m[mstjo~yw`vx
sqpyqcph[nvdps{xarpgixsqkwvtvc{~wupcccl{|kkUibgTKmiPGRlEaxeaMTr]KMUYdkwze_mpid\V_UonVIShXf^WLTkTK\z_[_k]][be`zhlaoounowuz}vyzyz}qtt~yvt
}}ls{
}~{v¬zlryvtno}tjonddX_ZZ[Ubjg[Z_ui^nl\aV\\kert}ij]lwvgtwrn|~~zvslzhjxf]drgzwccTdogwvfhjaWVYhd§n~xzpp|fxnyzvq}~ndvsdhh]lb^po[g^muezi]torkq{~uuat
{wru~taplYprbqq{udrl`lzojhzwtqetyyuqdadlr}jlTi^^ULtcQGWbGcve`KTpXJMXXgkvzdempfcZX]XvfSI\cXhXXHVdPHby[]`l[^\bd^ij_otxnonvyr}~uvx}tuuyzz}~jt{}~
y{~|sq®|{~fqzt}}vrom{~mzbpobe]eVZYWcfk`]]siYqn[^XZ\l{cqwvmc[msthuvqm
yywnoteiue[gtfvvz_]Sefjs}aci\UX^bd¥hytxlnygwl{ytrx{xhevm`fa_j`^ukYe]onbzf[x|knnpwyttdrzvoq|rawcZnoapq{seqd^mvicfxzslmts|rqb^emn}eiThYZUNy`RKZYHctc`ITmTJMZVilr{cllscaYZ[aw\SJc]XiSVGX`NGjvX_bm[[_bc]
ihanxylojvxm~vuttqvvw|}~~~px}yxy~ssp¢{{yduysyvksply|pr^poagblT[ZWhcmf\\rfSrn[YXX`lvdjujj_[mtqmtttk}|wooleiqc[krdtvs\VSd`q~q\ac^SZa\derqtkjylnoyyzqvryzzdfug^b[ah\^wiWb^phaxa[{vjjrowtstip~vrjp|mevW[jmbprzseo~[`oqb^io{kks}rpwkp`[ekm{agTgUXRQw\SPYRHcsb`GVlRIPZUkkk|emoqa[ZXYlpWROfWVhSTFY\OIruY`dmcXa`a^jcdmyxkoiuy{k}
|y}mqowz|t}txutpuo¢t{{fwon|pfxq{lsvsk^tnagfkS^\Vhbll[\qdNon]VXUgithctee]Znunpuuzk}}wscekna\nmcsxkZTVbcw||p
\c_cTZ`Zccnpsjgyneruqzkytunz~u_fsc[^WbdYaufV_amcaq]]~ohisqspuukl{
qrfn{oqnSZejeqsvsblvUbqk[^nd{dku|rrrjm`Ycijx^fTeUVPUoXQWTPHer_aFXkOIXTVmhd|ikwjaW\U[tdSRVhQXeSSHYZPNxw[`fliZb`^^nbfkyunnivv~m~{~krgt{u~r}
{ss}un¤swxn{`d|qgysymmqvgd|mcfghS`_Ug`lo\^nhMim`UVSofslexde]Yqumr{xsm|w{zlbelm^`njepy~gZVX_lx{{o_b^hVY`Xdbkq|wkjvl[upjyiurmn{rXjn^Y]VbdXeqdT_bibbmZ`~kfksunmwvkh
zmqfo{lqlbX_hhosss^imSepdUbnaxbou{ujolj_X`fhu]eVbVSOYgSO]OOHeo]cGZjNJ`KXmd_xhn}d`U^T]t[TR_fN\aTSJ[YQZvv]_fmhXba[^qcgjwqsmgvsys{~|yntlss
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|}~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBK[ADDDDCXhggggfo
}}{{z}~||~}}}~}}~~~~~
-hS7¤¤¤¤¤¤£r]____aR455553?R155554Ma____^j|}zzz|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}}}}~~~~~~~
~wxz{zz|||{}}~~~~~~~}xyzyz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}|suv{||{|}}}~~}~~~~}~}~~~~srtx|||{||}}~~~~~~}~~~~tvxtxrvy|}|z}|}}~~~~~~~~|h}uvssvx}~|y}|}}~~~}~~bj~lt
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~w^jficl{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
dom[irk
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwocqoajsqehklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhceknsprulccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Y\`bcmoppmZY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROMO_hflnmgeQPSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNOLLVdmfjmmjg\SOOPQONNONOPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKGGOU`hnhllkjjhd_VOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEES^bfhjmlspjijlkjfXJJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>??MY^jmlnysjjlf\RLEEEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;;GJ>GYjowpkiYGDAEFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;;>=:;DXml_HA>A@CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:9:;:77Sc=78<<=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;==>===;EY9;<>=>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@<]n@>DE??A<E\===;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mvH8;:==A<Ja<<=<8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR<==ILFFvwM788:;>?WiA;<<::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;]y|wV<=?==>FjuM:=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAHrykb}]>@C@@=Js|Y:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot}~}uLACE@?>Y|]?CEIJIIMMKECFFGEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
qBDEDCWu~XGHJMLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHFHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCFIJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrsvwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIJHHHGIIIJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJU
uIIFB??@???<<<>;:<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIe
fBB=88::9878896479;<:8567789787688;;;=@;999=<>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIj~T:8656766645773568:876565676778:67789;7578979876:<@GFIFIFEFOSRSSROPORTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBf
G676468874578567699766765:9:;:;898987779:98868689;A=>>BA?AKLOQPQOOORWkqrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=qz>988;<=>9::<9:;9:;:99;:9===>;;<=:>;9;;<;<<9:<8::;:999<?<=ABDIJMKIKLWorsusux{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?>H~
l<;>BCEEAA@B>@B@@>==>@?>?@?@==?B?@A?A?=@@@>?A=><;:;99;?=;<==AACABCAXpqtttvz{{}}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
^>DGIKJIFGGDFHGEB@@CECB@BCB?@DHECECEEAFEFDEFD@B?<@>=?@>?>?>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFW
VHMLMKNJIKIIJJIECDFGFDCEFDBHIKHGGFHGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGIY
PNPNLNKJLJIIHJFDFHHIEEHFFELLMIJGGHIJNMNLLNKHGGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@87<;<=:>@>?@CFIIP_
rNRONLLLLJHGEIIDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGHFCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@8:<8=>;=A>?ADHJLUq
_RRPMNMKJGEBGJGLJFKNKKJJLMLOPNHIKLOQPPQOOJIJJLJLFGHGFGIFEEBABB\orwxyzzyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|XVRRTSOLKJDEFKONOWUQPORSSMSTOMSLPSUVRSQPLJMMMKNGGJFFIJDDEEBDCcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BBGVNFNPPTX{
hWUkaERQQPI;;RTR`u]UVTVYYRXXRZfPUWZ]RTWQONRPPPQKKKHHJHEFIIIHIirvyxyyz{{|z{|}|}~}}}}}}~~~SHJIHGFFE??AAEACGEDELXRMTUVX[|
}al[dU:XXXSQ?@VUY\d`VYbr]]W]ZVEQYZ[Y_TYgRVVXTTVTOOMJLJIILMKOMSosvxyxwzyz{zz|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~znpXZ\[RSRVVT[ZuYU}`\X]^WIV]][[_YHYXY[]XXYWRQNPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\YTUTWRQWVcQerXZW_hP`f[[X\gaGOZhg\[\]]WROSPPQVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOMKfy[]TYUV]ZLTZUST^ZXWWWzkX[[\^TQQPINOWVX[Zdprvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRSUcdv
~ymqVIKMNKMKHJDFHEC>TdURQQNKRTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquvusswzz{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRVTbs{|}{{
u_]KC?CCCCB?DPBC@C=CIGV@HNLG]iPHFOFDEFIGHCDHGHKGDBAD@NQMRdrtvustuz|{{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kMG?@:;>@@??>jQKaEFHIEB?GLNGMQUIBE??<=<==?=?ACC@?<=B>JMGUnttustvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNKLQRQTUUWQQWVPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeC@@B=:BCAADB\]O{NONNKLMOOQLKLWMHG@B<977599=;;;8989?<BH?\stuvuvxz|||}||}}}~|~}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIHPRQOMPQNQRTVXSRYTNYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHFFHBAGIEEFDMRPaWRWQPSSRU[OOQWPMIDF>:96587979:365795<B=essvwwyz{}}||{|}}~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZXMLTTSPQUOLRSTWXTTXQLWYZVXXVXY]WWXhsk]Vaskaa_^da_^YTQNNNLIHJKIIFCQPS[WTTNQSYS\eUOSTQNKIHC?A9988978857578599Gmrtxxy{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOTVXXYSUTLKTVUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLORROMMNNNLJFQPUYSTOJNOUST\VRUSROMLIHHF??<:787659967675Wpptwyz{|}}}~|}}|}}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpofedc\]RTZVWUTWTRXXYYYRUOIGOPOOMRJOPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPRMILJORPRRSTQROLLKLLHCBA=::876;B5566:doruxx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHKIFLMPMG/E_R>3?>joaRRQ@GUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptvz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMLEGCORC8ENS]gSQSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Spruy{z{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTXWUMLKI<987;?@><=A@B=>EHGCFFIGJI@FAA@FHEJOHQRa\QPRNSNOPLLOMKMLMON[WKMQOGIHCHJLLJFFFE?BC><BG?B?Adptw{zz{|{zzw{wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHDD=9779?B>;?A@@>ADIECGGIFIEBB?>=CBAGIEMObeQMNNWKKMKLMMMLKNNSdMJLRIIIEAHJLMNJGIFBAB@?EFEHDKnovyyy{{z|zwsxux||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHJD?A=999:?B?<@BAADEGKFCHIGGHCC?B??@A>DEDLMRTLJIMTGIIJLJKLIJLMOPQPKGCKGCBJJLMONIJIGCCCDIJMLIYrmwyxz{{y|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqHKDGHHGJKIJKDGB=>=:::;AB?=BBCCHFIKJDIIFGGCC;A@B>@@BECIMPHHKGHKDHIKMHJLHIJKJM\RHHDNFADKJMMPMKMJKFGGJMNQNLbmivvw{y{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKCFEGEFFGEGBC@=<=9:::@C@>BCDEIEIJLFIIGFFDB;BCC>@CCCEGLNHKNHDHEILNMGILGFGIILNKIHENIBFMLNMOMNNMKIHIORQRNRfffqosxu{z|lhjnekqlsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFECCCE@DB>@?:;;=:=>CA>ACEFJFIHLHGGGFEC@=EEB>BDCCEGHIGMPJFFGKNOKFHJFEDEIJHKIFHPKCIMLPMONOONJJHMRUUROWd`amgproryzgehhdilfqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLGEEHCBABD=BA>A=9:=?:=>@B>@BDGJFIFIHFFGECBAAFFCBCBDEEGGHFLQLIOJJLLIGHEFFDCIIHKJGKRMBNOMQOOOMNOKKKPUWVUTX_^\iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGHFHBB@DD<A@@C<89=>9?<?B@@@DFHEHFFHGFFDCECDIECFEBEGEFGGEJMKHQMJKHHIEFHIFCIJIKMKOSNDQRPQRNPMNPMLMSWVXXVX]Z]d`hbjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqioyMHGHHBBBFD<?BBD<7:>>:>:@B>??CEFDFDEHFDEDDEFGJEEJGCGHFHGECFJJGMJLKHJLFIIKHEKKLMNORTOHSUSPSOQMNQNMPWZVZYVZ]ZXa```_hec`dfhgjihifhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprrxNIHGICACHE<@EBD=9:>>=<<AB<?>ABFCECCHECEEFGGGIFGKHCIHGIGFDHKIGKHMKJKLHLKMKJNLONORUVOKUWSQSQRLOQPOTYZY\ZY\__^`c^\ackb`dghr
hgifjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvotMIKHJFBEGE<@GCD@:<>@?>?BA<@>AAFCEEDIEFEGEHHFHHIKIEJHHKHFFLIHHJGLLLLLIMKMMMOLPPQUVWOKVVUSSQQLOSRPV[[]^[\^__a`ad]d`ef`ehjcssfjgglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGBEDE<@FDDC;??A@@@CA?B?ACHCFEFIFIFFDIHGIHJMHHJJILJFJKHIJJGKKMMJJMLNNNPLOPRTXVMNTVTRRQPLNTSRW[^^_]]`_`aa_acebdhbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvowKMLKMGDCAD<?EEEC=AACBBCDACDAAEGCHGHHGJGDGIGHJFILHIJMKMLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSQW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBCEGCCIFCIJJIIKGDKJGHJIIKHJJNLNLILHJLKZfJd\KlSHON_nUks[qpbwcSPbvuhucav`Xnqbdvinzf[lt`lkT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDBEEDFBFFGDEKEEJMMKLLGGMIGJKHKKIKKNLMMLLILML[sbdp^lmUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIHGED@BB@>CFGBFCFEFEDCHHGDEKHGLMNLMMFJNHJKJILJJJKLMNNMMJMMM[roonpplkMPQlWNibtrpamnu\YlQ\mmZqmkomxxtsip]_rkqjUuyxpc^kfbgppjjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGHEEEBBB>@@FGBGDIEEEBFIHHEGKJGMMNLMNGLMILKIJMIJIJKOPONMKNML\hdu]lqWlNPQmUZk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHMGIDEECAB=BABFDHGLHECCHKHHFJLLFNLLSRLGLLHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt]nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtontsvsHKHIBEEEA@>DDBGCHIMIFCFJLIGFJMLFOJKWRKGKJJNIHJLIKJIHJMMMMIKKKSkb[i^_icrrZ_Yjo_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrvtwrGGFIDEDFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJJKIHIGKKKLGHKKLLLLJKMNT[\TPTLPONOOVQOOQNOQJINPQdqiTYW\[\UYZ]X]\\cfaaebcf__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFFAEC@CHDFGCIKLHFDGKLHDGIPKLOKLWLIEEHIJHIKHLJHFGGIGHIEFLIJKNLIP\W^P\[`^MXYS\\b^MYZMXaRJYaZR_d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCELMBDDBEIEGGFKJKHEEJJKFEHHPJMMJMSHGEAHFJIKKILJHFEIFDFGEEJHCJMKLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_b[`^[TXWY^]cbcacfhekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvuvaSJJMIDBBCGHEHGHKIIIDFKKKEFIJNKNLHLNGHE>GGLIKKJLKIGEIDCDDBFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQYVU\Y]c`__cdbhomnllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKFCGEBEHIFGHHFFJGHFHKILDDKJMMLLHJJHJF?GFNJKKMKKKIGGCD@DAHIB?IJHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTR[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKJFFFHGFIFFFILJNFDKJLNJLIKJHIFBHHQMKKOMKKIHGED?ECHHAAGGET]Y^X_Y_[]UXXP]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAGFDGMRHCQJFHHHEFKJMPEFIJKNLLILLIIGDHKQOMMPLMKKHICDAEDHGBAGEDWUE\U^SV_XNTUNZZMJKT`a[_X^^a]OYb\``_bcb]abW__TPNOOWQ][[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPCV^IGGHDFMJPPEIIKKNLLLMKJJGEJMQQNOPMNLNHKADACDFDCBEFBMHBKLPONLFMFGIJHGLKMOPILOPOSOLQSRUZYWYXXdWOSTPPNMOTS[XXZ]\`adecgcklpsrzy{z~{}{
}KIEEGFGDKM]LGGXLGHJHGMLQQILKLKNMUNOKKLGGKPSSNPONONOHKF`ED_LDfdEM[I^[rmOMUmYLCP`UkWgJ]XU^DMQULLSVQRTXWTXUT\UPfZhhdXRjSWVT[\[``aaab`fhfnkhrz|}~}|zr{z{
~z{LHEGFHEEKOSIJF`SHJOJIOMRQKMLLORUROOJLNGHMQ[YOPPNOPOIJQQI|YYqsXPmHqnoaVPqqsPBksmqspSo_[nX]V\XUkhU]VcZ`Y[`VVXjtuu__v_Xa[\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMNBDLLFIKEQVLKNIKRXWQNOOMQTNOQPKKNGMPS[ZTQROPPPJHZx]TxehZRTQvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essosr{|o}yor_``baZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHJJGJPOMMJNV^YULQSNXZMSSRNKOIQRTYWWQTPPPQKHgxlcxrm[KMUypumubnvPdeJfvqmwojfxxiWrQhzmijzz}lxzohoYvvjuup`rg|ilx|o^__ba[]bdgiidgbcdllppstsssyqrxblugry{ssuy~suzn|}ywrnNKStNCCFPPHJKJKPOOOMPZ`ZXKTWPa^RVQYRLOISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttrln]t~zkmy|ktl|kpvux^__b^]_ddighfe^abiiijknokqnmjpacfdowxompsy~nqpj{ztromLL[VHGEGRPILMJKPQPPPQW\XUMUYUfXRRY^SLNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_[pz{^`zscroxqhd|ir|^TLl`vukiu|{m~xk|p]^_b[_bddgeeebZccikkrsrwglihdg`akagsrlgmmr|kmhk{tmmkmOHJKHIHHRPLNOLKRRROSRWRVTPW[VVTTTa`PNMKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXYRNPUTXXX[ZURSW[WXWZOSUWXXR]YW^VTPYRVWWWX^[gr^[[Y\]_cZ_ccdfdccbZccffemnmueegcaf_]g`dlhfgkhpzhggkujhgilQIKLLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYXPOLMVTPNUSNOMLQPKJRQKQMKKORURQQSSIHLNOQRQQQTVRXW\WSSPQUUVSZQOSRXVTYVTYUTRUTTUWXW]Z^a]\ZZ\\`c[]bcdfdedaY`acabhhimcad^_c]Zd\bma^fefmsdihkkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSQPKOWSPNUPNQNKSPLOUSNRNMNQTPTQSTUNKMOQTTRRQVWTYZ[YSURTWWWY[TOTUXUUZUWYURRXVUW[YZ`]UX^\^]\]aa^[bbcgfedbX_ab^`hefea^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTOOSQOQ[ZXWXZZXYV\jdVXYZWVSTOJNVTPOTPPPNMQQPRXTQQOMOSVNWRTUUONMQSUUTTRTWVZ]\ZVWQRWXV[[WQTVVVVYTXXURRXVVZ]Y]_^V^]^`\\`___ZbbdhgddbYb`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQPU\ZZW[[\YZ[dqmhd^[YVUWQLMVSMNROQROLPSRUZUSPPLPWWRWSSSXMOPRTXVUUSUYX[^][[VROUVV[[WRTWVWXVTX[TSRZWW\^Z^_`Ua\aa^`b_]`]c`cghdf`Zc`a__ed_`c[Z\[\YZXYW\Y\[`^_[^^a`^b\Y`ZQNONVQPTROUTSPW\]\X^\_W\^jqwyb\[VVXQMOVSNQQPRTRKQTTYZWUORNSXWTSURRZOPSSV[VVWTVZX]^[[^VSNTUV\\VRTVVXYSTY\USS]XZ]^\```Vb[cb^ac_\bab_cfidf^[d`a`acd_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUURQWRTP[]^^[`\`U\]ijr}slg\UXWPNRZSRQTRTUTKQWV[ZZSOSRVVVTOWRSZRTTTX]WXXSX\X^]YZ]TUNVWW^[XRUUYYYUWY\VTW^Y]]`]bb^Y_[eb_dd^^cca^efidf^^da`abbd`b^XZ_[\[XXXXW[Z\`\[[\[XZ[^V^Y]POORZPZTUVVTTT^^`_^b\`U]^bkytl}lZUYUQPS\TUTUTVYWLRZW][]ROUSXWVTPXRSWSVUU[]X[YUZ^X_^Y\YRWRYXY_ZZTUVZYZWXZ\VUZ^\^`a_dc\^]]eaafd^^dc`\gdhedb_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX__aa`c]`T]_beeuzhXYYSVSV\XWWVVW]XOU]Z^]]TRWSWVUSTXRSVTXXX]^X][V]_X__X]VQYTYZZaY\VWX[Z[YYZ[XV]_`^cbbed\b\`fadfd_`dbb[fchecfaf_`aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNTZVS\TVWYVV\`abcac__V[`da_zuohY\ZUXTW[ZY\YXY`WPV^\`a\TTXPUWVTVWRSUWZZ\_^Z_\V__Y^^Y^VSYWYZ]bZ^VW[\[\[[Z[YY__``dbcdebdZbfcgfe^ab`c^bcidcg_g^bbcaa`^_XT[ZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXUXWX]_badad`^YYadb`lfh^\][VWXY\\\_[Y[bVTX^]ac\RVYPWVWWWVTVTX\\^``]`\Wa^[^\[^XVXX[[_`\_XY]\]^^\[]X[`a^`dcdeefbYceehgd^ca`ec]eidei_f^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWZX[\XWY^`baeada]^Yacb_a``^\\\WW[[]]__\Z]cXZX]`cd_RXYPWWXYYWVWV]]^`aa_b^Ya]]^Y]^YXVW[\`^]_ZZ^]^^a\[[Z\`b^bdcefefbZdffigc_c_afeZiicfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxLXW\YW\[\]ZW\]_`bdbba]`Xbcbacab][\[XW[\_]`_][`d\\XZbecaR\ZOXXZ[[ZWZY`]`bb`ac_\b]_][^^YYUX]^_`_`\[^^`bc\\X\^`bbcedfdefd\efgifcab\dg`\iibhife`baca_`_]][Y\YXWXYXW\[ZWWXOXZ]acffrkJYW]ZZ_\[^\X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\]^_ZXV[_^]aa`^[`abeb_]T]``cddfegeffe^efhhgdd`[eg^ahhbhhfc`b`cb___]]\Z[YXXXVZV\ZZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{|{{{{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{||||||||||{{{{{zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½E>????=u³ÖÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊ:233330s¿éååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxwxwwwwwwwxyyyzyywopppppprrrrrrrwzyyzzz~|||||||vuuuuuuz}}}||{
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuyvvvz{x{xwvwzwyzz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{|||||||{{{{{{{zzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwx}y}zy|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww|z~}y{zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww|z||z|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx|y|}z|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyxyxz{yyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxxyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssssrrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttstrqppponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsstssqpuwoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrsrssrqonpoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqvurro} {nppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqrqqq¢{opppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqro¯oy¢¢zoppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqrp²¦v¬¤{pqqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrp³¨¤¦±¨vqqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrsssssssv¡¡£´¦¤|ssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~~|vvwwvuxzxxxxxwxx§§££zyzyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~}||||¡{{yxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}~}§§£ }}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~²§©¢ ¡«¦~~~~~~
~~}~~~}}}~~~~~~©®©£ ¡¥©¤~|~~~~
|||{|}||~~~~~~~~~ª¯¤¤¡ ¡¡¡©« |}||}}~¦£¡ ¡
}||~~
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{
~~}}
¡
}~
~}}
~}~~~~
~}~
~
~~
~{z
~}}}}~}|{|
~}}~~~~~~}~|}}
}|}~~~}|}}|y|
}}}~~}}}}{zz~~
~~~~~}}}~~}}}}~}|zzz~~}~~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~}~~~~}~~}|~~~~~
~|~}~~~}~~~}}}|{{|zzyyy{~~~~|~~~~}|~~~~~~~~~}}}}
~~}}~~~~}}}}}|||{zyyyx}~~~~~~~~}~~}{|~~
~}}}~~}}}}}}}}}{zyyyyy~~||~}~~~
}}}}}}~~}}}}}}}}~|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~}~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}}|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}}|}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{{z|~|~~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~}}~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}|~}~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~~}~~}|~}~}~|{|||z{z}~|||}||~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|~~}}}{{}}|z||~}|}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~|}}|||{~~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||||||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}}|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~~}~}|||~}|}|}}}~}}~~|{{{||}|{z{{yzzxy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~}~~|}}|~~~~}|}}{}}}|||||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|}
~~~~~~~~~z{z}}uqz|zqz~}ywtt
~~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}~~~~~~}}|}}~~~~~~~~}~~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||}}}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{|||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z~y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~}~~}~}~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}|||~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~~~~}}|~~~}|~~|}~}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~}}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{{}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}|||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz||||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}{}z}{zvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~
~||}|x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{}~}y|zzz}||}z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
{||}zz|}}||z|~}|}}~~~~~|}}~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uz
}y|~{
}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwm{snym}rsvsvmnwlpylu}|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}~{~|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}z}{|}}~}~~}~}~|}~~
}w}~{|{~{||}~}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}~}~~}}|}~~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}}|||~}|}}|~{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~||}}|}}|~{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~~||}}{}}|~zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{}}|}yzzy{}}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}}}}}}||}}|
~|~~
}~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z||||~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ØÙØØØØØØØØÙÙÙÙØ×××××ר××××××ÖÔÓÓÓÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;A<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸·©§§§§§§§§§§§§¦®¹¸¸¸¸¸¸¸¸¸¸¸·½ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÛââââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVM<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§££££££££££££ ¥£££££££££££¢«ÓÒÒÒÒÒÒÒÒÒÒÒÓÑßêêëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;<B@8<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥¢
¦¤¤¤¤¤¤¤¤¤¤¤£¬ÒÒÒÒÒÒÒÒÒÒÒÓÓÑßêêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<<>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©§ª©©©©©©©©©©©¨°ÒÒÒÒÒÒÒÒÒÒÒÓÒÒàéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÐÐÐÐÐÏÏÏÏÏÏÏÏÎÐÑÒÒÒÒÒÒÒÒÒÒÒÒÒÔÔÔÕÕÕÕÖÖÖÖÖÖ×ÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÑÔÏÏÏÓÓÏÏÏÓÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ××ÖÕÖÖÖÖ××××××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÓ»ÏÐСËÒÇ«ÑÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒµ³Ö§ «Ï¬²ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÑ ª¯Ê¡´ÍÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<96?B?B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÑų¿ ¨µ¿ÉÅÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÖ§²Ì£ ÄÓ¡ÏÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<==964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÕ¥±ÙÇÉØ£¿ÕÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ×××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÖ¥³È¤»ÍÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÐÕ¥·±¯³¥ÐÛ£µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHGE@<<>><==<756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÐÕ¥·±¢§»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@C;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÇÒÖ£²É¨¡£¨¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÑÕµÃׯ¥Ô¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<<?GEGKH=557:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÑÂÔÒÕÀ½ÖÔÓ¹ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>675;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÔÒÒÒÔÕÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:69896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFID<BA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE><HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK@;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A>HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AA?JO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ACCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?BGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495666788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643954775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573146498566:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730473786766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455588686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶·¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶µµ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469444738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨§¨¨¥¦¨¨¨§¨§¨©©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::9:9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª¨¥¦§§§¨¨§§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©«««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤¤£¢¢£¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦§§§§¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¦¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§§¦¢¡ ¨¢¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¥¦§¦¥¥¦¦¦¥£ ¡¡ t¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡¡¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢¤¥¥¬¦¤¥¤£¢¡¡¦a¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢¤¶µ¥£¤¢¡¡£]f¡¡ ¢¡ ¢¡¢£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¦¥±¢¡ §
Un¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡¡ z¦g]q ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ©i§jgr ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¤t}©¢kip¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe {w}jir ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq z
kfs£¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢ }r¥xir¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡«q`§©azyt ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡p`i¢T_y{
¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y §§tEFn{P>[v¡¡}
£ª¡¢¤¢«±·´¹µ±´¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ ©LDFpqRG8`x
¡§ ¤£ª©³¶±µ°¨ª¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v¬u]x_¶¯¥bv~Kj~
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{¨`³ÎìÀ¥zRz
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~~rÐÖÉ׺³cdpZn¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¦ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
}͵ÂÎÈ¿¬|ª¬_h ¢±®©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~u¢´ªphÍ`¨®²°°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡£¡z£wtmv£f ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©¬ªª¯§~[fxxmjhuv}w£¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¥ª¨§ª¬qV[tqryiebiip|£©§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNQOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤¨¦¥¥¢¢°qkRRvwt{haef^_o| ¤ ¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢ £§¡¦®¨°²¬hfKNpuwi`biZ]bku¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡§©¶¼¾½¬nhcFUno||n`^fZZabgpx ¡¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocmjib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¯¼ÆËÍÆ·¦shj\BNpntnsgbaYX_cabjquz¡¨¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[__\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «´ÀÔÝÛ˹«p``bUFEun`_mm\[WZY][[^bdehx§¯¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amivkphiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´´·ÅÒÙÖÉ®xf]Z[\TLAkjYTXW\\]]XUX`r¡²Åô² §ª¬§«©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`ftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃù½¾ÁÇÍÐÄ ~i]YXWSITl§³¨NU^ab___fz¯¿¾¾À²µ¶¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuwnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÅÁÅÆÀ¼¹Ìɹs\UXTQR³NY\^]`mª»Á²¶§¦±µ«µ²³©®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|~jfhaklgnurruqg^`\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8BBBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÃÃÆÆÁ±¿¼ËпjXWYL·MUYX`¦¼°¦«®³§ª©©«¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tklndomiqxozjia]gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄŵÀ¸³¼ÁÅ¿©wWUQ½MSV[ ¦·¯¥´´¯¥¤£¨¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyy{wnkihuZfrxsyff^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÄž¸½ÁÿǻcQaePS`ª¦´²¬¸µ³«©£¡©¬§¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh]jonyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÄÇÄÄÆÊÎÂRIPQf§º·À½¾¹¼º¼º¼¬¦©»º¹·¿²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvhiitmyl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÍÅÅÅÃÅÄÉÌÓÓMM\ªÇÀÈÍÆÄÁÄÇÁ¼¾´±°°Â¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`kjwlieuntc]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÂÃÁÂÆÆÇÊÍIÍÍÇÌÐŶ¿¿ÀÀº»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegcjdbjmno^Y]VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ¾½ÁÁÀÀǦM¤ÑÌÅÉÑÁ¯½½¸¹»»¾·´±¹¾³¼¾±¹µ¸»¶¼´µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbacccjbgc[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÁ»¿À¼»Ä½ºÀÄ¿½½¸»ÀİSÍÄÀÁÉ¿°Á¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±··¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabchjggiei^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÕ¼¾»ÃµºÇ·¶¸»½¹¹µºÃÈ«TÈ¿¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¹¶´·ºµ³¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeefpjekhXYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÐÅy˽Ƿ¹¸¶´·º´·³»ÅÊ UÉ¿¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~}knqgpksfbn`\THKKDJCCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄØ¯v¾ÈÏÂÀ¸®µµ»¾·º²¾ÂÈ[Í¿¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rfljntnwcgb\cQKUHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÇÉÑtw±ÑÑÌÊĵº¿ÄȾ¾µ¿ÀÀh}ÍÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltlln_c^abNHN?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÊÂvw¨ÌÌËÍÊÆÂÃËÎÁ¼¹½»±zmÀÇÄÀÀ¿ÄÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{z{mmx|`qc[^__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»ºÛþ¶¾À¾¾º¦ª³·ÄÀ¦|z|ÄÆËÈÁÃÀÀÉÊÁÀ¼º²¥y³ÈÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp]\_\ZQEEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Å¶n¯Î½¶¹À¼ª}nhnmtu{¾¿ÆÀ¹À¼¾ÅĽ½¸±®¦«¢ÊÃü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wlu{pni\__YSPAFIGK@ECH<=6;99<;::;;=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹Àͱv´½¶µÁ¤iZ^`NS[\pvz
¤¸·Âº³»·»½¿º»»®¥²¡¥ÁÅþ¼¿»»¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvwnqa_f][UJ=??GF=GCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɦx¢°µjfgVY_IIMPTo{©°·¾¹²µ²¼¹¼¶¹¾µ±¾®³x°ÉÄÀ½¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Æ¨{v¡_SCYUHbjUOEJe¥¯¯¶ºµ´²¬¼¹¸µ¸Á½¬Ä´´w§Ê¿¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨ª¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovrnc]fY]]SONA>JB@KJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿³ynNK@eYBOxhMC^
±µ³µ²´¯¬»º¸¶¹¿Æ~º«¢h«¿¸µ²±¤¦§¤¥©®¹¬««¥¨¤«®¯§°«¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶¯ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuil][jT][PNHDGMBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶
|XFAOXIJYxcAU£¹³´²°±°¹¸¶»·º½§´¯§w°©««£¨¡ ¨®¤£¤ ¢¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhutneUacW]QOMH@IRDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼©hM@SyqOIILiZEU°º±¬³¯®¬¶¶²´µ®©¦¦¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦¡x|vzcwln]QiTPNGPMLCPQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Áª¥¼gDS~PXIKaJWbee¯µª²´®ª«¯°²³¥ ¢ £¤¨¢ª £¥¨ ¡¢£¨¨§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nk{dhVRdMJHGOSNKNH<E@<2?859;>;98;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© «Æ¿ÊOAupPmJLdfvta]bt²¯®³µª¦¬«¢¢¢¤¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wy|eyy`bSU`HIJKSTISQM9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥ÇÆWSJf¤Yf}or[Rkd\gb`mµ°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§¡ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[S[YMQJOOVMSMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yUjrwupcwvXWb`di[ZWh®¬¯§¢ ¡£¢¥¡¤¤¨¨¬©¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³¶¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xvjwu^m[R`HRUHFUWJCMG=KH8F<77;>=<:;98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ ¤op`cWK[RZLLQYRHONH¬ª©¤¦ ¨¥±ª§®£«®¶°´²±®¶¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«®±¹¸¼¯³°µÂ¼·¾³³µ¢¬¢©¨²©«¨§¨ª§ § ¨¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhm\X[CWNJGMGCFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£bW^e`WMQG=?@CD?>BRx©©ª¥¢£
«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶»»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÄ½Ã¼·³ª³ª³´¯³®ª¯£¬¨¶±£°¦ £°±®°¤¥¯£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤{trkkurqhV\QFUHDJPI?EA4FH95<>7;<>=<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`PFD;C>F<>96N~ª²§££¢ ¥«¦xm ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÃÊÉÃÁÇ¿º´º»µ»·°¶²ªº²®»¸¿»º«¸«ª¸»µ¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢
~zrkcioxkeY[FKLEDTLDCE7:?:549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}riaWNE>IY|oaA=\®¬ wrqmp¦®´¹Å»ÍÇË¿ÂÌÍÍÌÇÉÑÌÌÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÔÐÓÓÌÊÂÅÆÆÊÈÏÀÉÑÌÇÆÈÆÂ¼ÃÁ¾¿¿¶¾³¿ÀÃÃÇÅÇį¿¹²¸¼Äº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZZCNLDFPIDC@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £if\TID@?K¤ ²£yqroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ò×ÒÕÖÓÔÈÌÇÌÍÊÓÍÎÓÍÅÉÊÊÂÇÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÆÅÍÌÉÉÀÃÀ®¯³¨¢ª£¦©¬¤¥¦
{ruvgcgvjdVWQDNF@JQB>B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡aSLJDC?CS°Ò½²¯¦ ¤¡}xqkebhroq{
upnqtp
³Ã¾ÅÑÐ×ÖÖÒÖÎÔÖ×ÔÓÑÓÔÔÓÏÑÄÐÓÖØÕÖÒËÉÎÑËÆÍÑÊÒÕÖÙÖ×ÓרÎÒÊÏÑÌÏÐÌÓÐÀÈÈÊÄÌÌÌÎÏÅÇȶ¿ÊÀÒÍÌÐÇÊÉÀÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨}xsvpc`erb]R\IJGAEIJ>;A8=5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢¡YI@ADAFQv²¯¦ wica__`_^__]alusppolrquÄÈÇÔÖ×××ÓÖÐÕÔÚÔÔÎÏÕÔÔÑÑÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑØÒ×ÙÔÕÌÏÏÊÍÒËÎÑÀÆÃÈÆÏÎÑÑÒÈÌÍÀËÌÆÓÏÌÏÈÅËÇÇÉÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨«¥²¨°³¬
|zqstmacim_VP_JJCFCRM@<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·ØÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£«eC8=>DXª¨}qecb__a_^a`_``_`emppnkorwwÌÁÓÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÑÊÏÍÓÖÒÑÖÍÏÕÕÑÅÑÔËÐÔÕÖÎÓÑØ×רËÈÎÄÉÏÌÊÌÀÊÀÉÊÎÎÐËÐÎÎÌÏÏÈÌÐÐËÎËÃÊÇÉÍËÌÒÓÍÓÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¾»±
zvoqokadnpaW\ZIFFDMXE;@=33<<87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤±zHFB;W¡k^^^adb``aa``a^__^\bmroostvvy¤¿ÌÕÑÖÔÓØÖÎÎÓËÎÎÅÎÊÒÒÏÇÎÍÎÔÌÎÒÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÍÂÈÊÃÌÄÆÉËËÏËÎÍÐÎÓÌÆÉÏÍÈÇËÅÇÁÆÊÌÍÐÒÇÐÏÎÎÌÐÅÇÁ¸¹½Ãýø²²¾±»Ãõª¥¡yqrkmg``qhYXhVMGLIPQB;C>;68:8::57==@;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±ÇøÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨xlpqy|eabb`]^aca``_`aa`_][]grrprsqmry¥ÇÓÏËÐÐÓÔÊÅÉÉÆÆ¿ÃÅÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÐÎÌÔÊÇËÎÏÇÇÏÒËÐÏÆºÄ¿ÆÊ½ÂÇÉÎÅÃÇÀÇÍÈÄÌËÌÏÈÄÄÐÈÆÂÆÈÄ¿ÁÇÌËÌÏÂËÌÉÇËÐÄÅÇ»ÇÃÈÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£xotdk`^fqa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»£¶~h
¤«
}~s_[^^^`^`cdc_]]^_``_[Z\`lrqookloo}¹ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈÊÍÉÄÂËÉÁÁËÐÅËÈ¿¹Â»ÆÇ¾ÀÆÏËÄÀûÉÇÉ»ÉÇÅÊÀ¾ÂËÆÅľƽ¼ÁÃÅÌÅÆ¼ÀÉÃÅÇÒÅÁÉ¿ÊÉÆÈÆÑÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¦£ |wstfiZanmZ[XRDLFBGELDFS@54335?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÚØÙÏËÒÍÍÎÈÁµÃ¾±¯¶l_z|¡z
vxurp_[[]``bcdded`\\]]_^`[YZ\borokikposǽÊÅËÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÁÉ»·»ºÆÃ¿¼ÁÎÃÆ¾¾µÁ½Ã»½Æ»Ãº´¼ÆÄ·¿¶¶¾¿»Ìý¶ºÈ»¿¾ËÃÁÆÂÅÉÇÉÆÐÆÂÌȲÇÉÃÎÌÀÅÿ½²·°²§¨¨¹°¥°ª¬zvwjdg`hocV^YJFJFHKAEBFJ@9:658854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÉÆÍÍÎÑÈÐÅÕÔÕ×ÍÊÎÅÉÅÇÁ¹Å½«®¦`dvx~{ttc\\]^``bcbbdeb]\[\^\^]Z[\^hsqmggnpry½ÌÀúÁ¸°±§ª¬§¸´¶´³³´»¶½±·°µ¯²»Â¼Áļ¿»µ²º¾À¸È¹´»·Á½¸½ÇÁﵝ²¶º¿´Å·»µ«¸½¾À½±º¶°·º³Æ¼·¯»¿µ·µÅ¼¾ÃÅÀÄÅÆÇËÅÀÆÆ»ÇËÀÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn]V^`FKHHJFBDAEE?<:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÉÈÊÈÊÄÐÍÒÏÍÅÇÁÆÀ¿º·É¶ª°[hp
zx~vw|sh]]]]_`_`da^cec__\[^\]^Z[[]_lpnifknnr|¤ÇÀ¸¸µ°«¬§¢©§ª¬³ª¬ª´¶±³©®§¬³»º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶¼È¹Ã¶ª¨°²À¶¸½°±§±³´»¼«®µ¦®¶®»²±ª¹°®»®»¸»ÀÀ¾ºÃ¿ÆÃÅÀ¼ÆÁÇ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÆÉÌ˳¹Â½»³swvki`blhXXW[ALKMJEAC?FA:9:996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÐÇÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª°[j{x}
z{wn^]\\]_`__dcbcdb`_]Z[ZZ]ZZYZ\enohfhiknrº°µ®¥¥§§ ¤ ¥«®¤¨¢«ª¬«°£¦ª´¶±½¹¯·°¨®¸´³¼¸´½¯¸¹¶²¼Á²À®¥¨£«±²³¨½ª«¨«¬µ³¥¨®¡¤¯©²¦¨¨®¥¨·¬±³·ºº»²¼¾¾¾Ä¿µÂÁÇÈ·¾ÀÄ·Äÿ»¿Ä¾ÄÈÌÊ¿¿ÃÀÀ©stsji\aocWVXPHYRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃǹ¹ËÁ˾»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ»¨«dmz}~xt~|swe_]\\^_`^_ccab`a_^]\ZXY[[YXZ\_fkfdgehjor
ª¥¬¥¡¤¤¡£©££¥¦§¦ ¤¦¬²°¶·§±¨ª´«´º±¶¶®¶¹³°ºº±·¥ ¤¦±¨«¨¹ª¤¦§¨§² §¦¤¦¬§£ ¡±¬²´³´°µ¼¶»ÁÀ²»¾ÃÁ±¹¹Â³Á¾Àµ¸¼½¾¼ÂÇÅÃÄ¿ÀÄ xplbf`ko`UY_HNgOTGFKF<=@=:;;826536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;È´¶½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÃÆ¸·ÇÀÌ¿¸É·»Å¸³Ä¸³¿À¬µ¼²¬¥¯³¡£ir
|xusomjiipi_`]\\\^__acb```a^\[\\XYXXXVX[^_dcbegggkmo©¡¢¡¢§ ¤¥¢§£ «°±µ¤©ªª¬¬¤´¸·°¬³¶¯³µ¯°ª£¢²¥¦©¸¢¦¦ ¨« ¥£¯©«¨ª«°²¸¯¸¹º°¶¼»º«³²¹³½´¶±±¶µ¿¶¾À¾Ã»º½zsk_e^ddXTW]IW\KOGJJGA<??@;?<05535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹Ç¸·¾·²Â´±»»¬¹º±¢©«§m~
xrmomkb^aff]]^]]]\]_aabccba_\[[ZZYXXWWWXXXZ^bddeffhikr§¡¢¡¨¥§¢¥ ¡¯®®¯²¡¥£®«§¢µ°²²¬©¯³§º³¦¶ ¢£¡£¢ª¶«££¦¥¦£ ¡«§££¦«²³ªµ°²«³¹´¯ª¯²²³·³®©®²¸±º¶º½À¸³±
yuf_f^[YVSZUK[QLIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÁÌÈÆ¿Å¶ÁÀÇηÀĽ³¹¹³¿¶±¹»²´¯¤ª xxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv ¡¡¡©¤©«§¯°«£¤¸ª¡ ®¨¶ª§§±¤¸°¤· £ª§¡¬¹¯¢¡¤¢ ¡©©¤¢£ªª±¨´¬ª§³°¥«®³±°°¯¯§¨§²®±´¯¼´º¸®£zve_aVYXSRSKM^LPLGHLKE=@>=B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾·½®§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbbcfi §¦¤¦§ ¦ ª¯¦¢£·¨¡¡¢¨³¢¥¨¥°¥±®¬µ¡©¡¢±±££¡§§¢¢¤¥¥«¤¥°§¥£«¬¦¨®¯¯«¨ªª³¥¦«¯´±®¼¶±¯¯ zwrea\[]XNLQHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥¦¬·»¼Áź±¹µÄÉÉÀÃÆÅǶÅijÁ¿Å«··½¶½º»µ²«¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZZ[YYY[WUXWTTVURTRU``_`a_aacdi¤ ¥¢¦¥¥£¤£ª«¥¥±ª ¡¥«¨¢®¬©©®¢¢¢¢«©°¢¡£¤¡¢ ¢¥¦£«¥¢¤«¤«®¥®²©¦¥¦¦´¦©¨³µ´¹º°ª¬rpo`[WVURFPNHZ\PRITKSLEGJD8;;=<9667:9;:976977:;:=<<6;<8>598:88659:;<97?<9578452121..1426:8698598989;9@9{µ´¬´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±½Ãɱ¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURRNQY]\]]^___bdm
¢¡©©«¨¬§©¦¤¥¯¥¥¯© ¡¯«´ ¥¦£¤¡©ª ¡¡¢ ¤£ £¡¢¨££¨« «¯¤·¦£¤¢¬ª¨«¯³·²½µ³«¯
tsh[XYSUREXLQ[XMTNPLQRINJC=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99577570141-+/434988::8::748=8?9~³§³·¯¨§¯®©¨¬·¶«¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»Âȱ¸¿·¼½»³µ¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_ae}}¢ «ª¦¯¬¨±¥© ¡¥¨§®¨«¥¡¨«¥ ¡¤¡¢¥¦¨¨¨ ±°¦±½¨£¬´ª®§°µ°¹µÀ±®±«~rsbVTVNRJGVPRRLLWMJMORGMKACFDD>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576761320-*.102877;99;8948;8@8³¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ¶·¼½Áñ°±·´´»³´¢£vkglnqnrkpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajy~t© «¦¦¬¨¡¦£
¤£¢¥§ ¡¢¢¦¤¦©¦¡ ´²§²¸¡¢¶¬©¤²²¦µ¼µ«¬±£ysn]NQQLODNNNPKFNNJJNNQIMJAHLHHC>858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤¶°¥§¤ª¥ ©¦¤³ª¢²Ãµµ²³ÆÆ¶ºÃÊÌÆ³¬¹½´¸À¯©°¦®º¯{n__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]anquo¡£¢¤¥¢s~{ £
~~tz££ ¡¤¤¢´¯¬°¬¥¸¦¦±¡°®°¼ª©¯ªwscVMROPMCSNLPMBPQHINRMHJJDKMFKK=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-02764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ¬Ã¨¢¦¦¶£ }w~fWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUVY[]jjqk~{sNXr_;Vo|s
y{}xqp}¡ §®©¨¨³¢¦®¬«¨´£©£sn_[NSRWLDTJPMLFNOIELQMKOJIMPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £®¡¦¦ª ¦©§£©¯¨§´Â¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅª£±¢}su]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMORTVXZ`lngzsPB?}y`JQnx~
nxuvxpQ|~xvhw~¤£¨©¥¤°ª¡¤¤¦©¢ª¢¦¨vmf^[HQQSMIUMRILKOIHFJNLMTKQPOFIC=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833989:99::::?9w¶£§¡¯¡§¨¥§¨¯¬ªµ¼¶¸¶³Á»¶¨¹È¸¶¨¨µ¶ª²½¦¨~}wpoXMKMMNLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZnru}ih\Tt~|
{vxsovqtz~«
y{hv{prmxxz{vsrxgu
||© ©¥§¤ ¤sha]\JWPRGKXROJLMRJJJLPHLQLRTMEHB<77;99>=:;<98@?::>=7==79937785675252472/2.,//200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²¼¸¶º´±·º²ª¬©¨²°¡~vx|vooiXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^t{xfv|gyvx}q|w{ok~}t{|ufv|logs|lyq}qmvqhq~pC
~wwz}{u}£¡¥xomfcZXXUQJSUTOPNPVKNKOOJROINPLFD<<79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¡¦°¬®«¨©±¯±«¼¸¬»¾¸³¬§°§¬¥©¤
yuq{mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX]eprl§ªÀ~tyb{xo|yz}omytyjjq~Inhx~midly
ksl|nr|inps{~{vottyyp|ojonoXVXTRQYORTTRXUMNHMJMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥¬°£ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡sztotkpldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\_§aisye~omzvtlts|jjMy
g1vsl~}tfeu
filukq|hqq|n|t~}qpnumwyujyywkkoheXRZWYY[MPUVYXNIHEJJHGC@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5n£¨±§º¯«²°Â±»ÃÇ
zqtyprpoodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯² q{xl}lq
zyr¡txsu5q¨¡¡¢
vp||t®hgbjnrmpuioXupwlz}mrnp{svnbv
ux~}{sqqm`[]^[YX`_RN[ZXWLHJFJG?CABH?CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®±®Á²»ÁÅ|nul{txxlwnwci^JPG>?6449;;;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_HLMNPL7CMRSDJv||v~lv|~
~u¢y~aªzw~sz]dqtz|wmhjbyo
znwtzptyxkni]v||
}q}uw{|wpstfg`[[^S[g^WPTX[UGJJDKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À²»Åº{vk}xs }|p~zgvkRWL@E211366688:<>AEGFGJKMOQQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJh{y|q|z}~v¡¥¬ªH®¯¯©tm|}hghyn
qGlwryvhmk_v}yzuv|xmow~ttrl[^^[ccXge[TOPVYPDLKFNICFCC@@CA=978:::;;:888::?>6;>7595773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¡¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23124668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`XpY\^i
~
¡¡¦»±§»Çè¡¥|qv
ihptqw{v
}nvuf «¢zyyogkx~{~tle^[[^j]af`ZOKNWRQIPJDNGCJDBADDA<:87=<:<:88778:==8<=68756623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfw{¤¡¬¦«¯°¡xw|~
mpj]B@4--//..02234779;=?BDHINQRSRSSTRPOHDB<87/9D><<63.lMPIIKKKNV_cggmu £ª¥£¬©¶¢¨Á®ǯxº|¡
¢
lpuwqm
q ¤µ©¢}kjj|tb^d`[gk]lk^WKGNRQMLLFIPCDMFACEFB=997=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENPRTPPQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¥¢¡¢¨¨«¨¬©ª¶«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢xz~¡{w«²|£¢¦¶°¨lss}}ri`]b`bhd`gf[REJKPOIILFFMCHLFGDBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m}aw}{ªªBD}x|
v^bP460-1/,.00//..0015>ABMQRSQRSTRNSLEE@<>=GG@A@8662<9;FHGIJNOQYm
w£§ª´½¸¤¬¬§¨´«°¶²²»±³½³Ã«ºÉ˷ÿ¸¥¢°³¬ª£
¦¦ £¦¢«¨¥
¤¡ «¡¤©°£¦·º £°¢¢£¡«¯¬²µ¢¤ªzz}
hah\ec^dd^fg_ZOCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhcWioXz
v
ÚÈsV|z
pna@E64<2/110-,+-1.-4?CAMUQRSUUVUN[PGGD<>>FHCEA7;<5C;=FKIGHROPW ®£³ª²ÀÇê³Å¶¬³¿³¸¾¶¿´Á¶»º£¸Å¨¶Éǵ¾¹µ¨£´°±§¯«¥v¤¡¬²´ª®¨®¶»²º¬¯µ¢±«±µ»·´®´ §¨£§©¯²¹·¸§¶¨¤xvZbeWfbbd``f`[TIDDLUQHIJDIGEA@@KDBMG<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQbcWyuq}u
{¿»£¼´y
zxn]V@EN<6:46AB764//6CHCQ[OQUWU\VO^UIKJA@?GKFFD;>@7D7?BJJEFWTP^¤£±´Ã¶¸ÁÌɶ»Ä½³³À¶¸Áµ¾¯·t±³¥ºÄ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°®¦¬§¤ ¬´»¢¨²ºµ¼¿Ì¿Å޽³Â·º¸¾·º·¹¬¬°¦±ª½°¼»Â¬º¨ª}}kWdbYkejfW\cYVSIGFLQGCHIAHD>?BBK@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWSYUZvjp~nzsxb¹¡£{z|}}wzueO\dGEL;Qca[^SF?;HPEZcQRYXZgYT``MSPEA?IKHEEA@C<E6B>HGJLSZT]®¸µº¸È¿º½ÉÌ»¼À»·µ»º¶½´º±Æ`u²¤±«½ª¥¨««¤¢²µ «§®¥§¦¥££§±´§²³½¶Á¾ÓÉÉÓÇÂÅÌÂÊÃÀ¾½¿»¼·´¯¸·¶Ã¹Å½ÂȰ¹©¡«¤§¶s`cb^Xb`igRX`VQUIEENK@>GD=JA=B@=F>;H@796379>489:57045/26389373426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrssÕÀµ }~x{|y~t}zkepuY]\Pedb`ed][XW\MdmURmm_n_XgdUYUJDBKKHFHHHGAI9D?HKTTV\Z[¹À¸½·ÆÀ»¹Êʺ¶¹µ¸¹²·µ´®¶¶du¨p^¢¬ ¢¤«¥§¥¤¬¥ª°¸°½¹ÔÑÎÖÐÉÌÒÌÏÎÊÆ¿¿ÂʽÁ¼ÁÀÄÄÅʾÈ㤻°´¯«¸»{m_a]Y^aZccP[`SPKCAEFE<@E>AHA@D=:E>=J?47535;=468977022/24169775554D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ\Yh_onlouu³¬¡
~|s{
{ts{ykmu{hreilifjih`fiilZms¤¼g[oh]ZZTHKNOJKPKSQHLAJGJO_^bfia·Ç°¸²»½µ±ÄƵ°¸°¯»«²±§«·«µ§§N¦¥¡§¬¯¨°§´´ÔÔÔÖÒËÏÔÕÍÓÏÍÅÂÉпÊÉÊÉÑÇÌÍÂÐÒ¸¯Ã¼Ä¹¥¶ºÃ¢pe^^^Y`WYfZQ]WOPBBHEBH;AC>AG??A8;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeVshqoyy ª¥}
|p{r}qxukqx~q{nxslhpmcjmpxiw|~Ë¿Áß§ncxnc[a`JPRUNY^P]\NPNTQUT\nmvq¸¬´¦¯¶ª¬¼À°«´¦¤¸¦«® «´£±¦«¬¤§¢¬ÏÒÕÑÍËÒÓÔÐÔÑÎÈÃÔÑÇÍÒÓÓ×ÌÑÑÅÒÖÅÀÎÇǨ¾·Ïzpf_c]W`S]ZPQTPOH>@FABE<@B>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMN[u
wlwp}~¡¡y
{r~zu
ovrks||w{swqjsripqzyrz¾Ë~²vrvhak]CZZ[VecXdjSX]]`d^cxz~©£¤¡ ¨¥ª°¸ª¥³£¡¡£¡§±¦j¢
~§°¡ ¡¥¤¨ÈÎÏÈÂËÑÔÑÔÓÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÃÌtpda`XTYT\PKGJJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznwpmuvx}t
|ylvtn}vux|µ;AÅ¥~|ieWICfcecgjdnx[^fhknin ££¦±££³¡¥ © £±~
z~©£}«³¨§½Ãƹ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÖ¾ËÌ´ywpf^[SVR[VFGJIEE=:7:@@B:GD?DCADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~
|x
zyqz{uz
yp|oozq{qnzuw}|u~{¯sX©Â¶pnb=^hrpqpnxvehoruxqz ª ¬¡¦«}
~my|®ª§®µ½©¾ÇËÉÉÌËÐÉÃÒÊÔרר×ÕÛ×ÓÙÛÕÐÛÚÑÖÈÔË{}ji\[PST^HCFIH>A>=7:=?;=G=?AAADA>>:86DB755479.566435542323646553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<::D?CGRk_mdbfkvqz~||~wyo{{tz vutu}too
t|zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥£«
z}¡¼¡©¦¥®¨¶¿ÀÀ¹ÇÉÍÎÅÍÉÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÚØÎÜÆ}{ikgaTXUUMLDNC;==<8:<>9=@6=?@<?><9867DA6455=80665547745613855564557HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz|~~|{~
zzu}tm|}~s~|~x}xnt}{}z¨Ã¡½£}}r~s¦
{hGq ¤
~¥¥¸¢§¡£¯·ºµ¬ÀÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¸z{zmkgX`\SPOICLB=<>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8689?=DRSRX_VXfmmmiqsy{z|{{|{~u
yrzsm~~w
¡n¨
z |}£¢ ¤®
Wr«\¢
¢£
¤³¡¡¨²¹¬¦½ÂÇÎÇÆÏÌÐÌÎ×ÐÑÔ®ÖÕØÚØÚÚ×ÖÙÙqvih_^XTWXC@HC>>>:49:;7:;:3;;?=>7;9:1:H>:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbymb~omxxyz||{wsp
zuvvt
}~¦£¥¢¨r±§¢£©¯n·
ÄȲ¡¥²d¤ÍÇ
ª££¥©¡£³´¦£¼Á¾ÈÅÅÉÈÉÂÊÓÍÍÔ©ÒÑÖÖÖØÚÔÓÚÎsie`__OJU[BAFC;A=837;<:8=649:<:82?9:2:I:=67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFu}|m~xz~z~vv{lny|xx|~£³¨£«²¡§ ¥¤®¢·³¡ ¤¯¢¤§©¯¤ À£É¸«¢¥²
¨¢
t²¤¡} ¡²®£¥·¾´ÅÇĽÃÿÆÎÊÉÒ§ÎÍÓÒÐÖØÒÏØ»s{w^bWbXPHJOEBCD5>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6??784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGN[\YJga;Hz{m
y|x
}px}}|osz}{x
¨»¨²½¯¥®³³¨£¢°¬µ¢¸¥¬¤©·¦¤£©ª¤¯°© »»É i¶¸«°¢«½£^ª²|}³«¢¡ ¥¯¨¢¥³¸«ÂÈĵ»½»ÅÈÈÂÑ¡ÆÉÍÍÄÖÖÐËÓ¢q|j^\U`RPFD>=CAB8?874>F<<6<35355453B3::BM:A;AHB;:@<746<B9?@B874::6>=47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeHb`cpJ@~r|u~m}}|pww{«ÂÀ°¾Æ»²´Á¼´«³¶¨²®®½ª»¤¨¹·«¦¦¢¡££©¯²±ª¤¢¥¥£¹®¨À»¬²¹¥¤§}½°z§±« ¤¬ ¡¨§¤¡£°²¦ÁÆÃ°°»¶ÅÄþͧÇÃÇüÕÐÍÄÊutd^\a\OKBL@EF>A?B;:4>A==5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\gG`igZ][{un~|q~zz§´ÆÉÀÂÌÁùȼº¯«¹»²¶º³À®¥À¤ª°»»ª®«¢¢§«®µ°ª ª¢°´§¢ººµÁ»«¨²¤¤¨©ÃĤz¡ ¦ ®ª¡ ³ ¡¤ ¦¤¦§¤¯¥¿Ä®©·µÉþ¶Î²Å¾Ã¼³ÑÊÈÁµvzn^Z]lTNICLJJI@A=CD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr|~wz¡¨º¾ÈÈÊÂÒÉÊÂͼÁ³»¾§º¿¾¼Ã·¬Á©¬³»½ª°©¤¥£«®´®¶µ ®¦¢£´½©¨¼À£¶¶¯«¯¬ª«©¦¥¥uy
££©¥}£ ¢µ¦¥¤£¥¦¥£©¨¢²¬¨»Àᥳ·ÌÀ¹®Ã³»¾Á¸ÂÂÁÀp{cZX]\MLMIGDCHBBACK:4DH:;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>kI_XaZdeVx
~ ®§£Â½ÈÄÈÆÓÍÎÍ˼·°º¼´¼Ê¼ÃÁ¶¶»³¿¹¼¯¨ ©§¶®©²·¢¨¡«·¸©¥¯¾Ä±½¹³§©³³®¥¬§ ±Å§|}ª¥¡£¢Z¥f£³¥£¬«§§¡¤¨¦¶«©º¼Ãµ¥´¶ËÁ¸ª¶¬³º¸®¨¸º½¸np\ZVWOGKSMK?AHEDGFG85FM;>7>AJ.32025B55PWN;LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBrFiIRebLF¦¡©¥¢¯¾®¡Ç½ÅÄÇÇÎÎÎÒʾ»¶±º»¼¾Î¶Ä½·¸·²²µ³¸²«¦««¸ª©§¯°£®¤§¤¥´À°ª¬³¾Â¹À¹³§¸³·³®¥®®¤¡sÁ}±¦£ ¨¡ `J¥T°¯¥¯¯¥¡¦ §¢´©ª³½¼»«°²ÇÀ¸¦««±±£¡²²´¤rpg^\PRMEPPPQ;HKIFHAC>9KT?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=REWRsbWFH«¡©¯§
£¥µÉ´©Æ»ÃÄÈÊÈÇÌÎǾº³¯¹¸ÀÁ͵ȺÀ¹µº±¯¯²´§£ª´´ª©¦®¬¤®¥¥©º¿¨«¶¶¾Á¿¾¸³²Â¯·½«£®´¬¸¥¦v¾ ¯¡ ¡©¨ ª¡§nv¢¢®²£«©ª«®¥¤¥©¢°§©«º·¾³²®¾¹¶£§¨¥§¬©©ehc`SLMGHNJVL=MDMIJACD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..SaMVHe^HF¬¡»¯ª«¢¤¬££¶Ç½´ÁºÂÃÈÉÅÂÎÈÁ½¹²¯¹´ÀÂʶƱÀ¼µº«¨¬¯£¢ª´º¦©¦¬ª¨¯§¤««¾»¨¬¼³·½Æ¼¶µ¸À°½¿³©´¶«¾¤¢¢¼ ·©¥£¢¨¥³¡¥¨ª¤¢¢ µ¯¥¥±«¬¬¤£© ©¥¢¡´µºµ¨µ²³¢¦ª¡wb^`^KIGHMQIMEFFBRJHADGAVSDH<AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDCpbGE¨¤Ã¥©ª¨¦¬¡ª¶ÄÁ¼¿¸ÁÃÁÈÄ¾ÍÆ»¾¹²°¸³¿Ãȵ¿¯¼·¹·§¤ª«¬ ªªÄ¢¥¨¬¦¬¯¬¢ª¨¾¸¦¬½°·¶Ç¶´¹¸¾°¾Á¶´²´¯¾££¡¢¥££¾¥©©¬¡¦½¢¤¢©«¡
¤ µ¬¥²§°¨ª
¡¥¤¬±¶±ª¥©¬ ¡©idZa]PJIKOMHECI@=OH@;GIH[ROK=HNU4BF9>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxfcXM¢£Å¬¡¬£¤ §ª¬¶°£ª³¶Å½À¶À¼É¾Êȶ¸µ´°³´·Áƶ¾°¸´º¶ §ª«¥¤Á¥ ª® ¤©¯¢¦§½µ¥±»·¶µÃ²³·º¾±ÃÀ¸¸³´µ¢¤ ¡©¨«¢Ã©¬®¦ ½¡¤«««¦¡W¦¡ ¸ª§¶£³¢ ¯ ¢¤¦®³«©¢¢¥¥¤ce[d`LIKKOFEAFK>=JA99JJN]QQJ=LW\9FI=DMI8Hc\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\LO¡Ä§¥¢³¡²§ª¤£©¬»°¨¬µ²ÈÃÁó¾ǼÄʽ°°¶®°µ¯¿Åµ¹°°º¶©°©©¦¡§Â¬±ª¢®°©¤§½·¦¶º½¯·Ä³³Â¿±Æ³º·«´¶ª¢¥£«¡¨«°®®»²¦ ©©¢¤¸¡¡¤®¯¬¤¦¡£§´§§´£°®¢ ¡¦¬°¥§¢
cf[hfKIMKSBC@IG;;F?99NMU^RSJ>O^^=HPBMLI9Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤Â¨£ª±¡£´©²«¦¢¤²¬®©»²°´´Æ¿ÄĵÀžÊĵÀȵ«µ¨°¸¬ÀÄ´·®¬¶º¥«±«©¦»µ¨°®´²§ªº³§º²·²¸Àª·²Â¼´Å§¾®·µ©§¬¡¥¤¢¢¤¯¸²µ¶ ¨¤£·£¤¥®±²¥©¥¢¨¢®²¢¦®¥¬¥
©©«¢§¡ydi]ljNPNNT=BANC;:I@77QO]^RVQAW`\BJSHWKH:Ud]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33906p[bH05JpiVCWFyfC;¤£¡¥¿¦¨¯¯¡©µª¹¯«¤ª´·±°¹¶°·¸¸Å½Ãǽ¼ÄÂÇÁ¹ÁÆÁºª¶¥»Á÷·ª²¼£°±¥¨ª¹ª §°ª¯´³ª©¶¶¬»«²²¹·¬¹°Á¹½¾¦Ã«°·®¨ª«¦ª¡¡ °®³«°¹©¦ ¶©¥¢¢¯±³«±§« ¥¡£³°¦¡©¢©©§ ¤~kimamnXQQZTACEU@;:IA7:XPd^PWWDY^^MLRO_KJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1747gY`F(@8l}h\V:{cC=¨¡©½¡ª°ª£±¸©¥µ²«¡µ½¯³¸¼º½·¶ÁÿÉĹÅÃÁÀ¸Å½Á¸¯¶§«·²¼¿¾µ©®²¸¬¨§©§»¥³«¢±°³¬ª¶³µ¼¯±µ¬°µ±À¹Ä¶«¼¯±¸¬¬©¢±¥¤¨¤²ª³©ª³§ ¥¤´®§¢¬¬®±§²¬²©£§¤¡¨µ©¡¬§¦£
{flshpr_GYfVDCNXDZ9HB6>]Rh\NY]G[^]NMRXdJJC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'_^aV151=`V^8)C3YU\gK5zfL@¤ ¤¬·£¬©¥®®¶ª®´¹¦§°¸Å·±·¾Áµ´»Å¾ÌŹÃÁº¿ºÄ¸Á¹³µ¬ªº·»º¾µª±¶¨«ª«¬««½«®±£ª±³®®¶²¹¶©®±§µ°³º¼É²ªµ´±´¯®¦¡³¨¬ ¥±¢ ¥¯¡¤¢¥¦²©¡¦±«ªµ¤®°µ¯£§¬¸¢¡¬¥£¢ {
{knynu|aF`jZIHZ[={JGE6AbTiZM\aJ[]ZRRSbaLKE`a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.*A/JGP[G3cYTKD¯¨±©¬¥£®®µ©¶´·£¬´·Éº´»º¿¾µ´·ÃÁÍǼĽ·¾¿À·¿½²½®§ºº··Â·¬±¹¦®«§£²ª¯º¤²±§§¢±³±²±µ±¸²¨®«²§¸¯µ³ÃŶ©´µ«°©§¢¶¦± ¤±§©©¢¥¥¤·§¢°³«§±§°µ¬¤¡¬¨ª¸¢§¢§¤ v{
nqxv|]Kel\JOd\?b{GI8GgWe[L^bMXYWTXTi]POHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=ELQ<3rkKDC¤¤«¦£°²³ª¶°¶«µ¹É¹®Á»Ã·³²µÂÃÏÄÀÁ½´½À¿º¿½³Ä¨ª¹±¶·¿½¯«³³ §°¥¦°¥²µ¬«²°¬©¨´¹¬´³µ¬´¬©«¨¬©¹±°Ç¾¸¤¹¯©¦¨°¥££®£©¯¢£¢£¬£ ¡©¥¥¸¤«´´¤ª«¨¬®¶¯¢£¨ª ¤´£
§ w~
||}qts~}~\Rdn^NZg]FD[G:NmXa[M`bNVWVWTYg^QRLdZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Ce;6*HdHJ+:I?3CIS,>k>HI©ª¡¨°¤¨£³´±´µ±±¡¬½Ëº®Á»Æ±´´ÂÃÑÄÆ¾À²¾Â¼¿¸¼Å¨·¬³¸¼Á°«²¡¤§©¨¤°£«±ª¯«±®®«³»§·±²©²©ª¦¥£º¬©±Â¹´¬¹¨¨¨©§±¥©¤¢®ª¨¢¢¬¤«¡§¨¡¬¥£¬·±± ©¢ª°¬¦§©£ §¡ ¥
|w
usrvl_Y`ncQsr\K<|F?WuX`YOd\NUVUWP\a_SONhXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^K0.IgDF8<B05EKX1@\@MF¬§¡ª²©¨°µ¬¸´®ª¤««½É»±¾·Ã¯°³ÄÄÎÎÿ¿´ÀÃĺÀ´ÉĬ¯·®²ºÀ¿³®®«¥¨ª°©¦¨²¥´ª°®±¯³¬³º¤¸´¬¬®§« ¢°·«ªº¶¤µµ¤©§¬¬ª¬¡¨¦¦±²¤¦¥¡¡«© ¦£¢ª¤¬¢¦±·¬¬¢¥¢©ª©¡¥¤£
¤£|{u~uw£yk^`ngWfdN@gLDbzWbXReUMVUUTO\]aUKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DAIHD¯¤¢ª°ª¨µ«¶°«¤«ª©¼ÁÀ¸¹³¼µ¦²¯ÄÉËÑ¿Á»¹ÀÀ¹ÁºÂÄ®±µ²´¼Á¾³²®«¬¨¶ª¥°ª¹¯¨°°®±«µª¶µ¦´¶«¬¤©ª£³³¨¨¤´´ ¶®¡©¨«¨«§ ª«¨¹¶©ª©©¡©¨¡ £¢¦¢©¦´®§¥©¢£¥¦§ª¢££~
¢txu{x~prggqx\atiO]VHmyUdVRcOLUTUQOXZbVHPjTWSGPYUI>IHOQPxMNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02?f=NX?C,?LT_/Ik7RE;¯¥ª«¤®³´®ª¥¯©©»¾»Á±¯¸¢µ¯ÉÇÈÑÀ¿½º¼Ã½ºÃÁÀ¿¯²³²¶½¼Á²²³«³©¥µ©¤³³¹¯¢µ±¯±¹ª¸®ª®¶«ªª« £¡¶®¨¡¯²¡´ª¨§ª£ª¡¡¬¨½¯¬®¬¡§§«¯¢¢ ¨§§©°¨¢¬¡ ¡¢£¦¨¥}
¤
xs}uxz{tt{j£ui^elug|RWp^KxsTdSQ_MMSZgNLVYeXGSjRR>BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mi:38_=ad?F1CP[[+HO;XB4°¤¥ª£¥£¬¦´³°©¤°§ª¸¾Á¼°¨¹ª§®°ÉÇÈнÀ¾¹¾¾¼É¼Â¹±°µ²º¼¹À³´»¹¬£µ§§¬²¶¹²¦§ºµ´¼¯¼¥µ«©¯¤¥¬ª§ª²¤³¨ª§ª¤©¢¨¨©½«´¯©£ ®²¢¤¤¥¤¨ª¥©¡ ¤©©
}~
¢~rzy~|hw|zupq~iyd`hdr
{mgy]^VCX{mTaPRXKKMpt]HZ[gYEVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°©¥£¡ª¤¶²±¤©±¦¹Á½µ°£¹¨¨°ÃÉÉÌÁ·½Àµ·¿ºÈ¶Ãµ´³µ²½¹º½¶¹¶¿¢³§ª«¯µ·´ªº»¨±¿²¹ ¯´¶©¬±£¥¨©¢¤°¦¯ «©§¡©£¨ »§®±®¡ª¢£¬¥ ¢¢ª¢££¡¦¬{}~
¤|yl}vyxb{zrppsxjtjgchansmbjp`oB]ykV^NPQJILSYVM\^mWDXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3Q]=#«§£¡§£·¯¢¯¯©«¸Âº³¹¯«¨´ºÇÊÇ¿·Â¾¯´¾·Ä¶Ã²°º²³Àµ»¾¸©¹¸½«¤µ§¨ª°¹°©¹¼£®¿´´¡®·µ§¦§°³ ¥¦§ ¥¬¨© ª®§ ¦¢¨°¸¤±® ¬¡¬¤¦¦¨£©¦¨¡ª}||¡y
}{sp|qst`yxjopqpjsczlhfdae`[rjqMNiXZMPLJGPRQHM[_oTDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0\[5(¥¬¡¤¡·ª°£´´©©¹Å¶²® ·¬°¶ÅÇÀ·¿Â¹°µ¼·¿»¿¯¬¾°³¿±½Ã¹©»º¸§¨¶¨§«°¬³°¦¼¶¤«ºµ®±¸¯©¥§¯²¡¤ £¤¡¯¦¡£¨¯¡ ¢£¤¢¶°¡¦±«¬¢®ª¤¨¤¥©¤¢©¡
z~zz
zzpqvnpt_xwemllkinfrikfi]ct`[kviZJ^[XOOKHHRUF29]^mPDXVYeMHIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDU]hD.<2cV,2¢¡©¤¡¢¡·©® º¸¥¬½Å³°®£µ¯¯´Ãü³¿º·°³¹¸º¸º¯®À³´¹°¿Á¸¬½ºµ¥¢³ª§©²«±¡Àµ¤§µµ¨²¼©¨¥©¯¬£§¤¥¡²¥¤¨©¢ ¤£¸¨¤§®¦¥¡¨¨¡¡ ¡ª £¨¤y{}z
{w~{ltqllsawthhjggo
ghhcfij`jcig[e{c`StT\[SLJGIOS@!*h^jLCVU^`KIGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gO'2¢££¦£µ¬§ªº·§¬ÄÁ¶°¬£µ®§®¯·À¿¼²Á¶°®²¶¶¸¶¶ª½³®²±½¿¸®¼»±¥¶«¥¥´©ª®Á«¨¥¯²©¬µ»©©«±¥©§¤¦¢¤©¡¡§¶¥¯ª®¡¡¡ ¦¡ ¥«¡© y
w}
{s}}fxokjkguskcgddvbeffejjdkrZ_Y]mdaNiX[`VJGIKMRX>9_liHBTS\[IHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0B*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£¬¡¤³±¢±½¶¡±Æ¼º±±¤·¬ª®©¹¼»»®À²®®®¶®²¸³¨«¹±¯®³¶º¶°¸½¦µ« °¤ª®¢À ±¤®°®·®µ¯¢§©¥§¥¤¢¨¬¯¥º¨®¢¡£¤ ¨©§©§|s
|
p~fymhkigqrk\hccsafhjnlgjjhn]lltpaUcideZIFLMOXQQVaeU@VSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC'4¡°¡¨²¯¸¿¶ ´Â»½¹±¦¶°¨®¥·¸··»¯¬ª«¶ª³¸¥³µ²®©°·¶±³µº§©µ¨¨¢©§¾£®¯´µ¬±°©¢£«¨¦£©¢¤£«ª©»§¤ ¡k¡p£u©§¡xnj~vql}p^cagltw~gguheW\hsnNPjcgrg_dfnmj^_aeNKD9FTg^JGPPTUKHR`oteFZQUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.£° ªª£½Å¯©¸Â¸½¼§¶°¥«¤·³²³±¹©¦¬´¦¯µ¢¨¸¶¶¨§¬·³®´³¢©³ª¡¤¦¦«º¦¥¯²¶®¤©®«¬¥¡ §§ ¥¥§§§ª£µ¯££££¡¡ ¤¥ªrx
¡vif}rx¡o~}¡ |tvllheczkqaS
mcliqYjqoX^i[kk[qnzr
gZ^GN?G_MFRVVQQRWTg^MWIRSOEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa70(¦«ªª§ª¿Ã¯±º½·À¿ª¥·°©¦³´®¯³·«©¥±¥´³µ¶´¦§¨³±²¨®« ²¨ £¢ ¡³£¥¥µ¼§¬§«ª¬¨¥¡ ¦£¥£¤£©£¤¥¦¡·££ ¤®©¡
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Åzrµ¦»{l±«°xhkX±®nei¼¼nhznrØ~Sjb¶²rt¡ªWOWbPVNFT[XQPR\W\P@\DQNDGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦§ª¥²¨±Â½²µÀµ·¾Â«¦³¬©§®³©¯¶´§§¦´¥§¸®³²¶ª¥¤§²®®±¦ª§¤±£¢®«¢³º£ª©¢®¥¡¡§§ ¦§§¡¦¢ °¢£
¯jjª~gdp¥q®¡¤~x»}k¡v±_j´[¥f`fzfjxk©d¾rg¦u±j|±xtcmm§n[ EhfEu`~g|¤§Y_«ixyj§7J¯\XSld[KNW_\WV;NOXW/ITTICEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢¬§¥£¤ª²·¬´½¾°¶Ä²·ºÂ¦©°«®¨©°®£°º¯£¤®²£©¸¨³²°£¥ ª¯¬¯¦§£¢°¢¬¥¡³³¢«¢ ¡¨£ ¥¤¢ ª¦¦ ¡
µµx
©µv³·~¨~k¦{w«gk±[«{tqx °vwqkkl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¡o[Skh`LK[dX\ZB>±yXXA#MhEBEA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50³¦¦¡®©§²¬©»¶Â°»Â¸·Àª¬®¦±©¡¯¼ª¡§´£«µ¤¦³³§£¢§ª²¨°§¥¯¬¡¤¨´¯¢©©¨ª ¥§¢ £¤£¢©¥¢ Õ¹p°Â~Å|Ö»|¤¤{¤¥z¬yV¯z~j¹Z¹v}¦|zªy{±nt¼
oP¯§ÅQ zc`©ctrm`Sµ´È|c¤3Bv]PjidP@XgZdaJHNmM[ROYfZCD?E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ71%¢±¨¨¥³ª¥´©¤¼·Á°¹À±µ´»³µ§±°£°²¦®¶¨§¹®£¯± ³´° ¤§©°©´¨¤« ª§°©£¬¢¨¡¥¡¢¡¡¡¡¢§¡¦ §¡²nhµq«n¦r´sr¶{¤£¡¥~°vÒÑv\®{
¤oª¦k
}}{±sy³etofRÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjcfXAOk`lhPUGI8=VQZWXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746@>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥¯¤ª¼¦µ¥§¶»¼²º¿·µ´ºº³¥´´¡±±¢¬°¤¦º®¤±°´¸ª¦¡©¤²¨¬©¤¨¢§¥ª°¦¢¥ ¤¦¥¦¡¢ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
~w¯x³aelZ°XKuyf`_wwhk]¯wxl5yÈ®²_BSo^g`EPm_pmVUM.echRXQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I:99¸°´Á¨³¨©²º·³¸¿¹·²µ¼µ¤·³´¬¨¬§µ«¨±±«´¤© ¨¡¶§¦©¢¥¡¢¥¦¬¯¦ ©¢¢¨¥ ¥¨¤¬¡ ¡¡ ¦©}}¥x¡ªp§¡£ª|yo±Z¨ ytØvt¨£|{²^d ~l\«[Zhgªdr{ks]¬Z koeOJC¡\[Lt]bfM[a_rs_JV6JXHE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¡¿«´Â®¬©¦´°·±µ¿¹¹²°·»©º´°¤¥§§ª°©¯ªµ¬ª¯¡¡ ¦¥¤º¢£« ¢ ¨¯¯¦¨¦¤¨«§©§ £¤¡¡¡ ¡«®mr´r©v¦s´xs³¤£¤w¸o{¢kk¶Z
ei¡¢§mr´t²j
ku³af¢oj\_M¡|Rs£mz~oq\¯V<weTon.\§OcRkebmZc]`p{cSZQ>>mo3CB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¥»¡²À®®««§·©¸¯µÀµ¼°¯¹¸«Á¶©© ¦£¢ªª¨¶£²§¯ª § ¤«¸£¥¢¡«µ°§¬ª¥¥¢ª±¤¦«°¡£¢¡©ªÔ»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~tª}¾ns¼t²uxnqn¤t½^w}[ay¼kZV[jz^jaegbmxoY[YCA@r@CG+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¡¼¢±Ã°ªª¬±§¸¯¶Ä±º±®º¯®À±«¤¢£¢©¤ª²¤µ¦¥ª¦¬¸¢® ¥£¯¹²¬£§§¤¤¬ ¨«¨£³£¥§¡¢£° ©
µ·xµwmknsoytÁ»½{²¨pt¹|{|¤»¹½uz´£tvut°ufiµtrpw¶^z}hymyc¬pu
Z[§jEeZTf`c]cQggpluBMPLD:ZM?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbW8*O^]=+:VV'>;<§ ¡¿¥´Â´¬ª¨¬«©»®°Å®´²®·§´¸©¢¡¥ «¤ª¦µ¨§ £«¤½¦ ª¡¢¨¡²µ·££¢¦¥ª©¤¥¡¨¦¦£©¡£°¨§¡j~i¦xr}tzd{½¾ÀºoqasjZ^ack`dmwbke^acqir}
gj~rtx}}b[wthP\n}|kXlzsJJopMuMEW]gaLZWgc_O[mujqRODEN;HH=L?2-2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P_L(3=[O'?2>¨ ¨¡Â£´¹¶£¬¥®§¨µ²«È«°³«´£¾±²¦ ¢¨£¬¦¯¤¤µ©¥¡¦¨½§¨¦¤©¨°²¿¬§¦¡©¨£¬££§¬¢«¢±§ ±¤¡¨¢¤¦¢gm}qw
µª ¢¡z¤lj||tqxyvv|kstuev}wkp{m`c]phMXZfj`WZoymmfSOFS9OYMRO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³¡³¡¿¡¤±²· ©¥²§¥°µªÈ«¬°¥µ¦À§´ ¤¤£ ª§¬££¶«©¥À«¤¢¢§¨§²Ä¯«ª¨ª ¬¡¢¤¯¦¡¥¨®§ ¯ ¡¦ ¡£ |ª¨{¤f¡³¯
vz|vyzofzkuysiszuktdyf`iecdfkYl{pij\SLPD_TE@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¿¬«®²± ª¦±¢¬³°Ä°ª«£³®¼£´¦¢¡§¥©¦¤¥²´°¦¾ «¢¢¨ª«¢³È³ª¤ª§¨¤« ©¯©¥£«¢® ¡¤¯£¨¤¨e|e~cylhk{¤ªje~geeih{¡kh£wkj£sln{zXe^^lv\hswwnxxsmytw{iY^ktd]sik}qkc^RNWJdXAJ4=F7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³°ª¥¨°§°¼±©§¤¯° £¢¦«£¥¨©²£¢¯¦¶¹¥®£¡ ¥{¥¢¨³Ä¸¤¢§¯¢££©©¡ ª°ª«¤ª ª§¨ ¬¡¥°¤ª¡¥ª~½r´r
hx¹Ä¸q¢£z¦sª|ËÀÀ»q¢}À½ÂÁ||ÃÀ}k¥²ooÊzwvzyqzqx
ymwcf_yd`ec^thldbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BQ/#F[3PY/UAB;/8£¹Ã´°°À©¨£¯©°®¦³´¯©¥¦¦±««¢ª§¢¬£¥¨¤¤´¤¢¦«·³§®¢¥¡§¬¤«ÀÀ± ©¯©¡¢£ª£ ¡®©¬§££§¡¦¥©¤¨©©¬¡¥¡¢Îxz¤y_®^§¢ }§t«¯^cª{§
t³c«¡³j
¯t}¸aY£Ímu{Ú{p~v~e{vvk|o~
~m`rlpg`_yd\qhjcf`RTRW]KOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-K0';\;L-!P@F4.1ÂÀ¿µ´°¸¤ª¨´«¥²¬¬«¤«¦°ª §¥¢¯ ¨§£¥¡°¬§®±«¨¬ ¤¥§£®¤«°©Àdz¨©±®¡©ª ®°§«©§¨¤¢«¬³¥¢ª©£¦¥¡° ¦ q
t¨q±|q¬~¡¥wª}s~«v{|~ª¢~«{{VÄzoÁ}muomeveoawnromfpuup`gme_oiingcWS\aYRSC8II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´ £££¢¬¯¶¯¨±¦¨ª§««§¢£¢ ¥ª¡¥ ¨¨¢°¬¨§¯¬¨¦©£¡ ¦£¯¬£¬µªºÎ²¦¬¢®¬ ª²©ªª¬«¤£¬¯±¢¨«®¥¦ª©©±¢£¤
¤j¤uz©tz²p¦q ¤`aR«®v¦z{f£¤¤}©®^}©U¢z¢{ïÅr¯³³¹qb©¯Âthmpnyxxolfeeqpf|ib]W`iXXULLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÖÕ¿¡«§¡¯¢°´°¯©¢§¦ª««©¤¦ ¤¦§¦£«¢¬¡¤¯¢ª¤µ°¯ ©¦¢¢¨ ¥°¦¤¨²·É²µª«©¢¥³ §¬¬¤®«££ª¢³®¢ª³±¡©¨®¯¶¢¢§|ªlu«y|°o¤Ò¸´¸É²_`©£ zxªÉt¤¨ªÆÆxf¡¥s}¯]p´b°uK£m§Gd|qq{u~{n[fjrpej_aXdm\^YINLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ©³¬¥¢²¹¬ª¡¦¨¥ª«ª§ ¦¥ª£¯«¦ ¬©¥§µ¢©ª¶²¬¥¥¬§£ ©¦®¡¤§ª°µÂ²³ª¨¤¡£®¦¡¦¦¬°®©§¬¤·¬ ±¹¯®§²³³¤§¢Nxz£}¤¦¸{|y¹~ÌÆÂ¶x¡~v¥¤©°
¬}b¥l¤p
}r¬`£sq`¼}RUu¤{~u{s
q\mnxrjo[d_hnbd]KLQTAIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@882.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª¯ ¡¬³³¥ ¥®®ª§¦¦£§¡³®¢©¦² ©¤¢µ¢¢¢©µ¹£¢¡¡±§¥¡¢¯®¤¨¢¶²Ä±©©§¢¤¥¦¤©¯¡¯¥¦¯¥¼¡¶·µ²¸°³¦¯ £
ѵ÷y
¦x¡w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{|m©a£qqbs²¸hx¦}x}ymixiyrnu]ednmfg`J[XX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¿¿¼º´§¥µ¡¢£¨§®«¬¦¢¦ µ§¢©§°£¬£¤£ª´´¤¤§§¤§µ¡ª¤¶«Ã°©«©¡¡ ¦£§¥¦¬¨®£¥¦¾¬½°¬¢°²¹«³¦¨±£§z¨}|°w¤¥m²o |¡¨¬®
ª¡¡{~««xy¯]£}¦§d|sj¯]¥kp
]`[ m¦{{kmc~tnz`geqnhggCZa[>KT3U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a``aa^][ZXSPONI8052.*,ATVVVTTUUUUTTUTSTVWWXVUUQHFIJ#((½©ÆÂ¶Á³¬ ®¸¥£¤£°¯ª¤¹ £« ¯©®¡«¨¤®±¬¦¦¬¬¡¡¥¡¥ ¨¦¶©À¯¥©¤¦¥¤¤©¬¬¤¥ª¨¾¤Ã¬ª¢¡«²¹ª®§ ³®¨©v¯~
|º®e°e}¡¦¬°
¦¤¡¡
[lj³`{{±mgo°[}´\¤kÈ¢d{¼XvµZ²}R®z¬X¡n¨|y~dt~bxt|ajgqmfeeOUd\BU_>J(>9=4!",%2. *1/04579:<ACFHJLNPQRTXZ^```ab^_\[XUPNJFC553./@UZXWXWXXWWXWVWWWWXWWXYZZ\\XWWGB;Ò³²·½º´Â³£¬¦¥¶¨ ³³©£ µ ´¨ª¬¯¬¯¨¢¯¬¨§¢¦®¨¡¤¤£¥£ª²©½¯¥¨} ¨¡¨®¨¦¦£¥©» Ʀ¤¨¡«´µ¬®¦»¬¬©£¯¤¸Ãº§¬¯¦¥ª~սªb£¿½}~£×º¸µ
½¾k£o«lz²°Çj«°½¬xw¢¾¼t§zzc}{dgy{`lekjbPaZSj\@UaBN*=:4/$%2 $(0496678:>ACFGJKMNNQTW]a\__a^`[\YTQMHC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»³´±¿¹±½²¢®¦¥²¦¥¿ª¸²¨¡¿¦§²±º¨¯¦¦°¬®¥¢¬¡£ª£¦§¡¨¢¡¬ª¹®¨£{¦¨ ©©¡ª§¡£ª»¨Ä¢ ®£ª³´ª°© º§®®suª¤·e pgmow¤u®pq¨£®¤rmmlfxonqzjqigqiigpd]bjoY]g~w¦_aqnfe¢}vfxikyydlcflbKdXJlZ:QeER'K:+# ",)-2.5:4579<?ABDEHKLMOQSV]WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³©¹¹²³ª©¡®£²©¾²Äɾ¶ªÀ¬¬£¡¨¬ º£¤®¬¦®©
¦«¡££¤§¨£ª ¦¦§¯º¬¬{¥¨©£±¦¢«¹¯À§¤²¥¬°±ª«§·£· ¨¥¶¢©©³£« ±¢ ¢ ¥¡«§
¤}g~tvtq§lz¡¢riwqxw|zjldcodU`X@j[HcaOZ+F=+'!740.!%2(*699469;>?ABDEJKKMPPQXTVY^`ac]^UQJED>9=@ASX[\ZWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥µ¶®®¢°£ µ±¬Ç½Å»¹«¢¦¦±¨£¶§©´§¨¬¢§¬¥ §£¨¨¦¡£§¡µ»¨«{ ¥ª ¶£§«·§®Á®£¶¦¯¯°¬©©³¸ ®¼¥¤¦¶¢¦©£¬¯¡£°¨¯£ £ª«¡ª
}f
uuysj
}¢¢{rszr|jod^pja[_YncP`dPZ:GGE>2==8/+&+)&&406668:==?AACIJGJKLMSSSUZ``i`eUPJACB:9EMV[^^[Z\[[[\]]__]^__aabaaa`bbbdb\[c¤¨£°³¬®£©¦ §µª¥´¼¯¢£z¢±¤¥±©¸¦£ª£®¢§¡®ª¨¨©¹¶¥¦y¢¨¸£¯µ¢¯¯u¤½£² wy ª²ºu¬¤ªd\bv ¤}n³£§ª£esyp¨l¢¨e¥wjvp{aiZuhhs{¦eyxjoykqe_vplkh\gebbpS\>NNNSG>@TD91/&4:316678<;>@AAFHBGFIKMTTUY]`hfgWQJ<DG<8UR[`ab`^`_`aa_\]__`aabcdabaaedchd^]f¦£¡¯±¬«©¥©®£¦¤«¶°²§«¦¬t¯¨«§¹ ¤«¢§¡u®¦©¤º´¨ uw ¡§²µ³¼§ ~§¢z¢®¶¦±©¯£y¬¢§©§
w¥z§{²z cympyp
txht t}¢k
lx{qqgdxojlj\fkjet\_ITLQ@E5.ZTU7)!09=>643568;:=>>@DI?JEJKGSX[Y[aaifZQH9EK<>aV^bdfd`aa`bb_]`aabbbcfgcba`edcgcaah£¦®«¨¬ ¨±¦¦©¥®È¾±¢§©µ¬§¢ ¾ |¬¡ ¨¢¤º²§
pu¡¥«´´Êª®·
¯°®©¥}¨r{w§h¤y´¦¨Â«¡r¥}
±¡}¡ |
mr
yq|uÅf©£k£q
hwt|whhuqhhk^dpmgmXgG]RM2D46Nac7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^jm\QE=LM@JdX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢°§©¨¦« ¤¸°©ª¦ £¤«¤¥ª·£¯¡§¥½¡y«¡
w¤£¹®¥~bm¡¡¡§~¡§
«®£©£uk¬uM«x¨§©«}¡{z§ikg¶~n`dY{dhr}yl]|m_Sp\_ky`Ye}p§ªk£nr¥p
if m[n|fZ`bWPowfmtrkjo^kpmliXiO]XF9A4GD^k4,ICRMN=84859;6@;;>BO>QRLMBJ\]_W^^cv`MD:MOMTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ª¤¦¬¡µ¼«®¢ ¢¥¬®¡®µ¢¨¡ ¦´u¦
¬¤©¦±§¢in¢ ¡¤£¡ w§¡§©¬¥x|~¢ps{ym¨{¢sv¦f~w¤_z}s¢n·´ºtµ¨dƸ{p·q¤bs¬«`}i³~n|q£lr£t£`³q|³ts[²jbotvqioXklrrf]i^bKE=D6QAYq3=SG_JR=<395::6D;;@JP?UMNQ@D_^[YX``|dHC8LWUVcaZefkkbbeadc`ab`dd_`cknccddhdbgfchh£¸« ¤·µ® ¢££¦®±¬¡¡¤«x
q¡}¨¡£©¨¥
~k{~} w¢r¡¨¥§ª~~z z£xt}¦¢d¡|lhn{§}rht«tªh]
vhªj¸f\¨p`^§vu~hunm§]¨~x»k~ª[]³g\nrzxki\qjxyc`fXbAQFO7VCRo5KZZ_OZD@151;;6H?:CHU>YRY]>Db^V`Qac}jEB9N[]YefXfgnmbbe_aa__``ec^bdoq_deekecihgkiªµ§c«º²±¬¦©®°¨¬¤¡¡¤jr{z¤©£ ix{¢ ¡rhp©¢§§|¯£¢¸w£³¢¤y{ª¢q¡|
¯µ}k¡x~´££«¨|}tªZ]o{xbL~zz
cyBLY¢jr|mux±³§vns}osk¤]vHedasq~~nf`liv{debR^W]UW@ZEQhDSW\bX^ID=B8?B:IF8LEXAWR[VDFb\Z`K`m~rEC<U_bZfjVghmobfg^aa\]^ahb_ecvl^egfkdflihki°T^ ¦³¹³³©¢«©¡«¤¡¨¡woy
|r¡s¡
©|l
q¡x|£ £}µ{¥z© |§hwm~t¡sq|p®}¤¦£o^¨gu£co¥aÓ|{xrsc¢~£s¤vk³`sª²¨¼wm~¾¦©´^n}qnr¢r]¤gs¦ah¦mÔ}
pzzk|xsn©¤gaeypkgfdnuwg`cT[fQQbIWJTaWS[ej\eQFCKMJKBKE8O@QNXSYOSQafejRcwywIFEc]eZhjTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°«T\K~©¯±´°³£
© ¡¤¥¨ © {p}h}wol|¤ª
zvnw¢{£¤³¡¢¶z¬§¤®¥p¨
{¤¢r£®¯¤¡v´µµÉ¡s`©my u¡w ~oLf£pr¤{ztak~ kqd_q}tizi³µ´Æ¦s~zk«umuxizurPE}´^jvkyfjhbtupnV^TYiPSiIVMYTV]hknVgWMJBJMKHJOAQKPecjmeussy|nu{{TPNl^h[kiRjhilglfce`\]\^ibdik{_]dhcjfoleime¡¯¦f?¡³«¯¯¶¢¢ª¢¢¥¥§¦yjye yui
z¦©z}yp¡y ¥§fnxl¢d|q¥wpg¦{¤zrv¹n¢b}¡mriªku mn¦_ihu¢}`uobh e~iuocfmr¢Z_[b¡m]o{~srd¥mw¢dg§iso¢oSo _e¨T^TnmskrmpikyskoRYWWgZTmJYO]IXiisjYkVQREV\LXSaUik_wt{}p}|r{svv^QrbgbpgPjhhklnhdg_]^]`kbjivu]\cicjjslfkmc¤¦zetm§®¤©°±¦«¦¢¡¢¢{qh|st}{d|¨¢¬~si¥} ª¦¦x~¥²¯¥wy©t¥n¤¢»n}¥¯|¥zr¨ f~o«cx¨l©¢vwª¦j°kv³©kmm`~«ªv~¥v}¤ jw¬g¶tw¾¤Y¦«aurtp|uqcj~nhlSW[Vab]kM]R]J^mnv`[qY[`[ftenoqbqt`wz~yrys{{vbxdcmsdRkgholrjfia`^\bkbmlzo\\bibljwmglnb¥ª¤©ª¨§®¤«¤¥©
tzo~ttrm}{
¦¥¦
vol©ª£ u~y®£q
x~{r§q}}zx{~~v {}k
[yyrzphn~quqe^wusuoynnm
^vhxe
©}t|jpv}vmmgsy{x
[kXyinwrqpxxp]lnigV[`W\fkdVbU_Q_pxxlkvejkkv}qrtsaoubt{xuzuy
}{mldxn^Wnghukxjije\`ZciflqunZ[bkdllynhloa¸¨¦¡¢¦¤¥«£¡¬¡¦©~r|}~
{srp
{}
x}¤|§¡
wr
©
¨ ª~~¨¦woyo~¨
p}qkp}hm]sqtkvtYrn}~j]jd{
`ixz{u
gwkapqv^r¦
enwqzpfge{z[\jgnv[{ywunssf\mkkbZZ_ZYlq\_aZ_]ft~ztotckkk|}s{xtdmuhm|~vz|{zz~o{}s~ysiT\qiluougkhd]aXkhlkqrmW[enlgsyohjm`ª°¡£¡¨££~¢¥{|s}v
qor~z §¡x
z¬¡«¢¢££ª¡§§ {w§~²¦²¥k|wxe|w|yt¡~}uosw¦
}wl}zjrhatp}zwwovt]^ohn_^Z]]ThrVc\\blhu||sopdkji|nyqjpplg{rx}{m|zx|}zyNdvjrmpzekecb`[tfpfrqmU]ltmiyzqgikd¹¢¡¤¡|« }y{nxr~mk~z}«r}zª¦¢¦¥v{¥{|ª¡ª~oxruau
~
nyut¡
s|}rr{{x¦
w}ol~|nhlmg_zh}{vtvu{w\_p}nu`c[]^QgnTe[^bkivz~qlldkjhlslluoyp
ynv~
vq~{{|{`i|juhiejc`i\cuhobtmlUcqyepzzrejml·¡£{x§¥yz
|n{xs
}}kh}|~}¨p¡¢
|¨x£ £¡£~
x ~|¤ ¡¦~~ttpv`~q|q
hwqx~}r{|qxzzy¥
{
v{fr|y{qljf_~sh|uvs|sj^`svpwdcY_^RkiTdY_ahjvyqfkdlhekm~hoql~xzks~tv|z}jrnsibhlb_qVtomn`xhmWjtvcuz{rbjoy²¥¥ |v¥¡¢x{~q{tv
~xgc}y}y ~p¦¦
w ¡y~¤y
w~r£¡¢|vq}nzd|
pleuo{|w{
|{q~w
y¢ww|w`yx}txgleaijwstu}q|bcasnurmaZa^[leRcX`ahkvyqcjcmeh}lhuhlpi}ymqt|~z~|mvttmeljbcuViqn`xglbjvpfy|yq_ql
®¦¨}xªzy{}||xtyzt}d^}
t}~}¤¢s{§ s¦sk
zo£|yqzkul|~~m
xp}~dri{~sx}vw|
|¤xt}tvoa{uzq}obocd{bnovsxwstau`oluno\\_^^k^P]Xcahmt{k_jfjchwnflhjlh}{wns}t{}z}}rzxxnljh_irbhqoevgnlayik}{xpawmª £¨~w®}w}{|{vxptt{o
}|a[~szz¥}}¤
n¢¡nf
zp¢}{srukpnu{tnqu{|dplx}}tsyn}
{
¨z|~
x~qpchytup|b_pakt^pj{yxlspex]nlsmsXZ__bkZPWXecgqq~f]ihgbgqndigdihzwuo
t{u
x
|x
zw{zrxjk_phtjromqgole|cnzwqlww~¢¡¨ ¦uª¡t{v
xyrs{
krpzmvnq[X~wu ¡x
m¡
j£f
~w~||nuplmop{
isqwtxfrnu{zyvso{
z
£{uxyol^rtrppxZ^p`pj^oj}zpmmjlv`pojqmZXaabnXQTZfgcvob]kmdbfkn`ff_gkurspuxuy
ww
|{vjqc|c|nqltjholvx_qy|tut~¤§
u zrxtpr
squkomumv~mnUQ«xwsz x{¤|s
~h
g
qx{z||kvjnkll{~az~wzx|ygsls~{qyovzz}|{w}wqjlz`xpnlrtV^obr`_lnyphoffsthpkawe]Vf``rSQN\fe]yp|_\hrbbefj_hd[gp~pkqt}v|
tu~y{xs
~{yxfrj`}ookz`jntu_t}xxts
|x ±¥
wtvspo
spqojivnn}}musRMßÈÖ|puv w{s
¡~~xz~zugl¢
cqz{y
|~l{erokkyy\y{}~zzhrjs
|k}~n~|y|vxxsmgqmjtohjtnS^odpY_kqwfkjbfxropc_w``Vk_^vPNKagc]zpt\\ev`aeecafbXissmjqv}tyuv~sz~r|~vesn}e~opkZlnyysavz{vrwwy®
w~}
twpyqnomn~rdexp}mz}jhkc¤ÁÜ®ï¡slvv
£o r
£
~{uxvvn
}¢
^m{}
v
}}k}dxuinxsXz
y~
~xeri
kum~zuswusqguzbtmpbivgRaqglU_ntyard_h}prnZcrabWnY\xNMLdgb^wsm\\dy^`de
`cc^Yjrknkrw~twxw{q}~{t~shuqymzntpWqzvyqewyhvr§£
}pxy
¡|{swpsjokim|u^axw{qu{g`d|ëÚµÉÃÜsltwjq
|{
vxsup¡aj}}q~qwhvriswlZ|
}uask~~}mkx
||nqzulqlry`tin]kv`ReqifS`pvt`o`]hqsiWghbiXmV[uLKLfg_brs
i[\ey^^dg{`d_]Yknfoisx~ss~zvzs
|vw{ulwuyxtnx{|Xzqogxwcv
q
¡¢sorw}|xrsnodr~hflwx[_y{{qqjagaÕ¶¦xnqw|qj{i|{}zt{{qu
u
~ag}~~m|tkmwtsvukc
~|~o_rp{|~ypfy{}noy~umokl{~chkjYnvZRjribQbrwlbe^Zjmsb[g_dl`nU[pNHOge\gnql[[cs`\clwde]]Zklbmjtwqp{}uxx
}uy|vpwy{om|w^tmiztsgs|r vv~mv~}v}vqoljau|fbiuzZ_w|zmqedhgW^qs¼Ävq~stk{|}|u
uv}qurt{e}
r~g}{y}i}vfoxxsvslj
yj^qwz}
{~rhx
x|}nlz}wtoih}we]qcXpsSTnsibNgtxf`]\XnosYeb]jm`pOYlRDThaZknm{oZ[^lcZcovdg\]`kjclisvqn~{tuz|
v~xtsyyoo|qiyz~mm|vkjxtk
n}vjxzozsqljd`tzh_er{Zar|yfpzaee±²wJbZ¤ÙÐr{x~
olzy|xxoqt}{jy
¥o~vx
oz}oxh
xr|e}~ucprhxqou
{vxyj[p|r}
zrmprxwmn~wzehj}r`YwZYrmNXrsf`Jmvta][[Yt}roWg]fjp_oNWiR?Yg_[pjgyq\ZYkeYcpy_h]^elhfliqwom}up{v
qq{}zzujzko~t}or|{poxf¡
gphz~
|ixrklf_aoym_boy\dlzaqv_eeÕë¾2:>ry
vnl
u}
|xnv
wnlu{tfy¨}ntuy
~{xlri~xm|{xbyqdqh~mtqt
~su~so[k}tx{|xypkqx~tmjvuu\iixqYW}SZqeL[sre[Jpwo][ZY]t~thYb[genbiLWfQ=^f]]vf_tp[XTodZdpyZh^`gmgilipx}ljyn{}zu
pnw~{{h{~kt|r{sw}zx~|kl~ki{~}kuqghc[bgso_altahpzast^cd n\5Y¯µuj}vuwpl
tyx}z~rgv~}op}hwynez¥~n~u~||q{}
|i~mj{zjzvr`w~qdrgumu{
|owy|t~mWm~vswuyxrmr~|}znmimun]hftrR[{N\q\O\rodVKsxjWYYZaqt`]]`fdhhfNZhNAad[`va\umXWRtaZdnrWj^bhkgmlipw|li}}p~~{zwr{oqw{j~{nxyww}x~zm
£{vykmy}{}pqpcf^Yg_pp``hpfjouato[adiv{¾¦£È¸r
s}xtrsp{sutwyyqcwyirufwvcj|}r~sywzkxy~uhzikysizv}h`w~jjsh{iv~z~~q{v{t}aUu|rs|pwxpo~}x}|u
vhqhlrp]hctnKevL^oUTZsmbQOtxaRWX\aps[`\hedcjdP[qIDda\dq^\whUVTw^\enhVl^ajgeoohpw{niy~r{~y|v}pvrmw~p|xyztxyvo~}zw|htz|vgom_d\XeYmsa`aqllhn`siY^dmw©ÚªÇ²rxpu{zutu~wpq~m
txtl`zyfqogun[m}y}x{mus
{
muvnhwem|vmjwv|abxzhuuc~zgt{tuqz|lYUr}otxksxjt}z|w{r|sgsemmt[j_veHnoL[cXWVxmbPStvXPUX^`qo\`cmdc^nbT]rGCf_]fh^Z{bRV\u[[gkaVk_anfflqhpvxtkuvx}w{t}oqtqu~{wx|}
x|}~{~svyzwuy^~ytw{bnl[b[[aVjtc`[hopgraqfW]ck|Êι¢kmnmr
r}
{
zytyuu{jmucvwpg^|yeqjjqcXm{sw~{mpp
zy~qqo}ghrbmxrjlqw}|z]eywiuxfvgt|rin~ym|]Wp}ms|nnpvgv~~u{qzs{yqeranlsXk_x\IolMWV_TU|kaOTurQQTV^bt
h\`kjfbYnaXbpGAh]`f^]V{^OVdpZ[jh]Wg`_rfjhrgpswxntzw~yus
pp{wwuy
z|u~}~~}|xuyw~}nuydto
ztcnjY_[]]Tgse`YdrrgsbkdW[`ix¾®{·nbsht|rz{~xxswo{vejnausjb^~xyfq}hjk[Wox£
qqxtmr
}ytrohyajm`mvkgklywzw[g}|xes}nteu~pfkztltb[n{kt|zft}mpgt~w}~r{ky{ywpelam~mnVk`wVKklOROiNY|gbNUukMPTU^gvf]aphg`Wi]\khJEjZbdWYUyZNWnjY]le\Yec^tfldrgrptxp
v~x|
}usnsxzzss
y}v}{~{w|wwziv~|l
rq~oflgW][\ZSdpe_XcruivpeebW\\hporseeyjtvss
xzwtunkzpbgkgtnf^_|o{~hlwfidVWrp§||vs|r{ymzzv{}uprmgu]mh_ludgfizo{rYgvuhpxuaw
|njmzqese`lygrvz}auvikqtzpyxr|e~~~xvnceam|mkVjbqTLikPLNpH^{faMUtdJNSWajw~e]gsie_VcWbp]KKkXcbUTUsWMXudZ_k`\Zce_wgmbpisoq~utxx~
z}v~
nrt{ztq
zuu}
|~z~v{£¦y
lu|{uzo
sz
}unjheV][[ZScne[Xat{jimh_bW_[iikoglahzykttto{}vunzhjyj_enhwgeXbwi~zoioff]UXoh§vz|xuo~nqtx~wt
vjrvgho\me^ms_gajxh{m[mstjo~yw`vx
sqpyqcph[nvdps{xarpgixsqkwvtub{~wupcccm|}kkUibgTKlhPGRlEaxfbMTr]JLTYdkwze_mpid\V_UooWJShXf^XMUlTK[y_[_k]][be`zhlaoounowuz}wyzyz}qtt~yvt
}}ls{
}~{v¬zlryvtno}tjpmddX_ZZZUbjg[Z_ui^nl\aV\\kert}ij]lwvgtwrn|~~zvslzgixf]drgzwccTeogwvfhi`WVYhd§n~xzpp|fxnyzvq}~ndvsdhh]lb]oo[g^ltezi]torkq{~uuat
{wru~taplYprbqq{udrl`lzojhzwtpdtyzuqdadms~jlTi^^ULscQGWbGcvfaKTpXJKWXgkvzdempfcZX]XvfTJ\cXhXYIWeQHbxZ^`l[^\bd^ij_otxnonvyr}~uvx}tuuyzz}~jt{}~
y{~|sq®|{~fqzt}}vrom{~mzbpoae^eVYYWcfk`]]siYqn[^WZ\l{cqwvmc[msthuvqm
yywnotehte[gtfvvz_]Refjt}aci\TX^bc¥hytxlnygwl{ytrx{xhevm`fa_j`]tkYe]onbzf[x|knnpwyttdrzvoq|rawcZnoapq{seqd^mvicfxzslmts|sqa^emo}eiThYZUNy`RKZYHbtdaITmSIKZWilr{cllscaYZ[aw\SKc]XiSWHY`NGiuX^am[[_bc]
ihanxylojvxm~vuttqvvw|}~~~px}yxy~ssp¢{{yduysyvksply|pr^po`gblTZYWhcmf\\rfSrn[YXX`lvdjujj_[mtqmtttk}|wooleiqc[krdtvs\WTd`q~q\ac]SZ`\cerqtkjylnoyyzqwryzzdfug^b[ah\^whWb]phaxa[{vjjrowtstip~vrjp|mevW[jmbprzseo~[`oqb^io|lks}rpxkp`[ekm{agTgUXRQw\SPYRHcsb`GVkQHOZUkkk|emoqa[ZXYlpWROfWWiSTFZ\OIrtX_cmcXa`a^jcdmyxkoiuy{k}
|y}mqowz|t}txutpuo¢t{{fwon|pfxq{lsvsk^tnagekR][Vhbll[\qdNon]VXUgithctee]Znunpuuzk}}wscekna\nmcsxkZTVbcw||p
\c_cT[`Ybcnpsjgyneruqzkyttnz~u_fsc[^WbdYaufU_`mcaq]]~ohisqspuukl{
qrfn{oqnSZejeqsvsblvUbqk[^nd|eku|rrrjm_Ycijx^fTeUVPUnXRWTPHer_aFXjNHWTVmhd|ikwjaW\U[tdSRVhQYfTSHZ[PNxvZ^eliZb`^^nbfkyunnivv~m~{~krgt{u~r}
{ss}un¤swxn{`d|qgysymmqvgd|lcfghS__Ug`lo\^nhMim`UVSofslexde]Yqumr{xsm|w{zlbelm^`njepy~gZVX`kw{zo^b^gVY`Wcbkq|wkjvl[upjyiurmn{rXjn^Y]VbdXeqcT^bibbmZ`~kfksunmwvkh
zmqfo{lqlbX_hhosss^imSepdUbnaybou{ujolj_X`fhu]eVbVSOYfSO]OOHeo]cGZiMI_KXmd_xhn}d`U^T]t[TR_fN]bTSJ\ZQZuu\^emhXba[^qcgjwqsmgvsys{~|yntlss
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|}~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBK[ADDDDE9/0000,H
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR455553?R155557':|}zzz|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}}}}~~~~~~~
~wxz{zz|||{}}~~~~~~~}xyzyz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}wsuv{||{|}}}~~}~~~~}~}~~~wurtx|||{||}}~~~~~~}~~~~yntvxrvy|}|z}|}}~~~~~~~~gxuwssvx}~|y}|}}~~~}~~aizht
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~w`kbgdn{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
don[jrl
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzoq{xy{|{xw{xuwttvuuvwpcppdkrqdhklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhdeimsprukbcbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z]`aclnookZY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPRONP^iflnkgcQPSPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNOLLUdmfjmkif\SOOPQONNONOPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKGIOU`hnhklkijhd_WONOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEDR]bfhjnlsojijlkieUJJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>>>KV\imlnysjjlf[QJDDEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;;GJ=FYknwpkiYGDBEEDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;;>=:;F[nm`IA>A@CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:9:;:78Vd?88<<=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;==>===;EY9;<>=>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;]n@>DE??A<D[===;;=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mwH8;:==A<I`<<=<8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YR<==IMFFvwM788:;>>Ug@;<<::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvvw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;]y|wV<=?==>EitK:=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCE@Hrykb}]>@C@A=Is|Y:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot}}uLACE@?>Y|]?CEIJIIMMKECFGGEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
qBDEDCWu~XGHJMLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLMLMNLIGGGGDGGGGFHFHECDDFEDDHHCCCFIJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrsvwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIJHHHGIIJJIHFJJJJIJIJJJFILLKJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJU
uIIFB??@???<<<>;:<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIe
fBB=88::9878896479;<:8567789787688;;;=@;999=<>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIj~T:8656766645773568:876565676778:67889;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBf
G676468874578567699766765:9:;:;898987779:98878689;A=>>BA?AKLOQPQOOORWkqrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=qz>988;<=>9::<9:;9:;:99;:9===>;;<=:=;9;;<;<<9:<8::;:999<?<=ABDIJMKIKLWorsusvx{{||{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?>H~
l<;>BCEEAA@B>@B@@?==>@?>?@?@==?B?AA?A?=@@@>?A=><;:;99;?=;<==AACABCAXpqtttvz{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHECEDEEAFEFDEFD@B?<@>=?@>?>?>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CCFW
VHMLMKNJIKIIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGJY
PNPNLNKJLJIIHJFDFHHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@88<;<=:>@>?@CFIJQ_
rNRONLLLLJHGEIIDJHGKJHJGGGKLNLLHHIJMQNONMOKIGIJHIDIHHFFGGHGCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGGB?8?@8:<8=>;=A>?ADHJLUq
_RRPMNMKJGEBGJGLJFKNKKJJLMLOPNHIKLOQQPQOOJHJJLJKFGHGEFIFEEBABB\orwxyzzyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|XVRRTROLKJDEFKONOWUQPORSRMSTOMSLPSUVRSQPLJMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BCGVNFNPPTX{
hWUkaERQQPI;;RTR`u]UVTVYYRXXRZfPUWZ]RTWQONRPPPQKLKHHJHEFIIIHIirvyxyyz{{|z{|}|}~}}}}}}~~~SHJIHGFFE??AAEACGEDELXRMTUVX[|
}al[dU:XXXSQ?@VUY[c`VYbr]]V]ZVEQYZ[Y_TYgRVVXTTVTOOMJLJIILMKOMSosvxyxwzyz{z{|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~znpXZ\[RSRVVTZZtYU}`\X]^WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\YTUTWRQWUbQerXZW_hP`f[[X\gaGOZhg\[\]]WSNSPPQVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOLKfy[]TYUV]ZLTZUST^ZXWWWzkX[[\^TQQPINOWVX[Zdprvvttvxyy{{|}}}~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKMNKMKHJDFHEC>TdURPQNKRTQMOYRMNQSUUMQSRPOMLHCIHRTUZ\lquvusswzz{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]][YVPLILIaltPQSNQRQR[RSRQRVTbs{|}{{
u_]KC?CCCCB?DPBC@C=CIGV@HNLG]iPHFOFDEFIGHCDHGHKGDBAD@NQMRdrtvustuz|z{{{|}}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kMG?@:;>@@??>jQKaEFHIEB?GLNGMQUIBE?><=<==?=?ACC@?<=B>JMGUnttustvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljjf`[QRZ\Y^JJPQNKLQRQTUUWQQWVPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeC@@B=:BCAADB\]O{NONNKLMOOQLKLWMHG@B<977599=;;;8989?<BH?\stuvuvxz|||}||}}~~|~}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIHPQQOMPQNQRTVXSRYTNYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHFFHBAGIEEFDMRPaWRWQPSSRU[OOQWPMIDF>:96587979:365795<B=essvwwyz{}}||{|}~~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXQLWYZVXXVXY]WXXhsk]Vaskaa_^da_^YTQNNNLIHJKIIFCQPS[WTTNQSYS\eUOSTQNKIHC?A9998978857578599Gnrtxxy{{}~}}|{}|~~~z}~|}~}~~~~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTVUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLORROMMNNMLJFQPUYSTOJNOUST\VRUSROMLIHHF??=:887659967675Wpptwyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOIGOPOOMRJOPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPRMILJORPRRSTQROLLKLLHCBA=::876;B5566:doruxx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJHGEHLHKIFLMPMG/E_R>3?>joaRRQ@GUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptvz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BDDA@GHGHFFHJMLEGCORC8ENS]fSQSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Spruy{{{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpknqmimcLOOMQSLTUTXWUMLKI<987;?@><=@@B=>EHGCFFIGJJ@FAA@FHEJOHPRb\QPRNSOOPLLOMKMLMON[WKMQOGIHCHJKLJFFFD?BC><BG?B?Adptw{zz{|{zzw{wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHDD=9879?B>;?B@@>ADIECGGIFIEBB?>=CBAGIDMObeQMNNWKLMKLMMMLKNNSdNJLRIIIEAHJLMNJGIFBAB@?EFEHDKnovyyy{{z|zwtxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHJD?A=999:?B?<@BBADEHKFCHIGGHCC?B??@A>DECKNRTLJIMTGIIJLJKLIJLMOPRPKGCLGCBJJLMONIJIGCCCDIJMLIYrmwyxz{{y|vrpurtxyvxjqojllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqHKDGHHGJKIJKDGB=>=:::;AB?=BBCCHGJLJDIIFGGCC;A@B>@@BECIMPHHKGHKDHIKMHJLHIJKJM\RHHDNFADKJMMPMKMJKFGGJMNQNLbmivvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKCFEGEFFGEGBC@=<=9:::AC@>BCDEIGKJLFIIGFFDB;BCC>@CCCEGLNHKNHDHEILNMHILGFGIILNKIHENIBFMLNMOMNNMKIHIORQRNRfffqosxu{z|lhjnekqlsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFECCCE@DB>@?:;;=:=>CA>ACEFJGJHKHGGGFEC@=EEB>BCCCEGHIGMPJFFGKNOKFHJFEDEIJHKIFHPKCIMLPMONOONJJHMRUTROWd`amgproryzgehhdilfqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLGEEGCBABD=BA>A=9:=?:=>@B>@BDGJFJFIHFFGECBAAFFCBCBDEEGGHFLQLIOJJLLIGHEGFDCIIHKJGKRMBNOMPOOOMNOKKKPUWVUTX_^\iaminhrsbefedihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGHFHBB@DD<A@@C<89=>9?<?B@@@DFHEHFFHGFFDCECDIECFEBEGEFGGEJMKHQMJKHHIEFHIFCIJIKMKOSNDQRPQRNPMNPMLMSWVWXVX]Z]d`hbjigk_eefcgggkggkmkmlprhttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqioyMHGHHBBBFE<?BBD<7:>>:>:@B>??BEFDFDDHFDECDEFGJEEJGCGHFHGECFJJGMJLKHJLFIIKHEKKLMNORTOHSUSPSOQMNQNMPWZVZYVZ]ZXa```^hec`dfhgjihjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprrxNIHGICACHE<@EBD=9:>>=<<AB<?>ABFCECCHECEEFGGGIFGKHCIHGIGFDHKIGKHMKJKLHLKMKJNLONORUVOKUWSQSQRLOQPOTYZY\ZY[^^^`c^\ackb`dghr
hgjfjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvotMIKHJFBEGE<@GCD@:<>@?>?BA<@>AAFCEEDIEFEGEHHFHHIKIEJHHKHFFLIHHJGLLLMLIMKMMMOLPPQUVWOKVVUSSQQLOSRQV[[]^[\^__a`ad]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGBEDE<@FDDC;??A@@@CA?B?ACHCFEFHFIFFDIHGIHJMHHJJILJFJKHIJJGKKMMJJMLNNNPLOPRTXVMNTVTRRQPLNTSRW[^^_]]`_`aa_acebchbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvowKMLKMGDCAD<?EEEC=AACBBCDACDAAEGCHGHHGJGDGIGHJFILHIJMKMLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSQW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBCEGCCIFCIJJIIKGDKJGHJIIKHJJNLNLILHJLKZfJd\KlSHON_nUks[qpbwcSPbvuhucav`Xnqbdvinzf[lt`lkT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDCEEDFBFFGDEKEEJMMKLLGGMIGJKHKKIKKNLMMLLILML[sbdp^lmUMNfs]feqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIHGED@BB@>CFGBFCEEFEDCHHGDEKHGLMNLMMFJNHJKJILJJJKLMNNMMJMMM[roonpplkMPQlWNibtrpamnu\YlQ\mmZqmkomxxtsip\_rkqjUuyxpc^kfbgppjjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGHEEEBBB>@@FGBGDIEEEBFIHHEGKJGMMNLMNGLNILKIJMIJIJKOPONMKNML\hdu]lqWlNPQmUZk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHMGIDEDCAB=BABFDHGLHECCHKHHFJLLFNLLSRLGLLHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt]nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtontsvsHKHIBEEEA@>DDBGCHIMIFCFJLIGFKMLFOJKWRKGKJJNIHJLIKJIHJMMMMIKKKSkb[i^_icrrZ_Yjo_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrvtwrGGFIDEDFA@BFEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJJKIHIGKKKLGHKKLLLLJKMNT[\TPTLPONOOVQOOQNOQJINPQdqiTYW\[\UYZ]X]\\cfaaebcf__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFFAEC@CHDFGCIKLHFDGKLHDGHPKLOKLWLIEEHIJHIKHLJHFGGIGHIEFLIJKNLIP\W^P\[`^MXYS\\b^MYZMXaRJYaZR_d\aX[ddVVX\YZX\VY\]b^daa_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCELMBDDBEIEGGFKJKHEEJJKFEHHPJMMJMSHGEAHFJIKLILJHFEIFDFGEEJHCJMKLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_b[`^[TXWY^]cbcacfhekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIDBBCGHEHGHKIIIDFKKKFFIJNKNLHLNGHF>GGLIKKJLKIGEIDCDDBFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQYVU\Y]c`__cdbhomnllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKFCGECEHIFGHHFFJGHFHKILDDKJNMLLHJJHJG?GFNJKKMKKKIGGCD@DAHIB?IJHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTR[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKJFFFHGFIGFFILJNFDKJLNJLIKJHIFBHIQMKKOMKKIHGED?ECHHAAGFET]Y^X_Y_[]UXXP]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQ[R[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAGFDGMRHCQJFHHHEFKJMPEFIJKNLLILLIIGDHKQOMMPLMKKHICDAEDHGBAGEDWUE\T^SV_XNTUNZZMJKT`a[_X^^a]NYb\``_bcb]abW__TPNOPXR][[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPCV^IGGHDFMJPPEIIKKNLKKLKJJGEJMQQNOPMNLNHKADACDFDCAEFBMHBKLPONLFMFGIJHGLKMOPILOPOSOLQSRUZYWYXXdWOSTPPNMOUT[XXZ]\`adecgcklpsrzy{z~{}{
}KIEEGFGDKM]LGGXLGHJHGMLQQILKLKNMUNOKKLGGKPSSNPONONOHKF`ED_LDfcEM[I^[rmOMUmYLCP`UkWgJ]XU^DMQULLSVQRTXWTXUT\UPfZhhdXSkSVVT[\[``aaab`fhfnkhrz|}~}|zr{z{
~z{LHEGFHEEKOSIJF`SHJOJIOMRQKMLLORUROOJLNGHMQ[YOPPNOPOIJQQI|YYqsXPmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[`VVXjtuu__v_Xa[\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMNBDLLFIKEQVLKOIKRXWQNOOMQTNOQPKKNGMPS[ZTQROPPPJHZx]TxehZRTQvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essosr{|o}yor_``baZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHJJGJPOMMJNV^YULQSNXZMSSRNKOIQRTYWWQTPPPQKHgxlcxrm[KMUypumubnvPdeJfvqmwojfxxiWrQhzmijzz~lxzohoYvvjuup`rg|ilx|o^__ba[^bdgiidgbcdllppstsssyqrxblugry{ssuy~suzn|}yxrnNKStNCCFPPHJKJKPOOOMPZ`ZXKTWPa^RVQYRLOISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttqlm]t~zkmy|ktl|kpvux^__b^]_ddighfe^abiiijknokqnmjpacfdowxompsy~nqpj{ztsomLL[VHGEGRPILMJKPQPPPQW\XUMUYUfXRRY^SLNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvULWkh}lmlx_[pz{^`zscroxqhd|ir{]ULl`vukiu{{m~xk|p]^^b[_bddgeeebZccikkrsrwglihdg`akagsrlgmmr|kmhk{tmmkmOHJKHIHHRPLNOLKRRROSRWRVTPW[VVTTTa`PNMKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXYRNPUTXXX[ZURSW[WXWZOSUWXXR]YW]VTPYRWWWWX_[gr^[[Y\]_cZ_ccdfdccbZccffemnmueegcaf_]g`dlhfgkhpzhggkujhgilQIKKLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYXPOLMVTPNUSNOMLQPKJRQKQMKKORURQQSSIHLNOQRQQQTVRXW\WSSPQUUVSZQOSRXVTYVTYUTRUTTUWXW]Z^a]\ZZ\\`c[]bcdfdddaY`acabhhincad^_c]Zd\bma^fefmsdihkkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSQPKOWSPNUPNQNKSPMOUSNRNMNQTPTQSTUNKMOQTTRRQVWTYZ[YSURTWWWY[TOTUXUUZUWYURRXVUW[YZ_]UX^\^]\]aa^[bbcgfddbX_ab^`hefda^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTOOSQOQZYXWXZZXYV\jdVXYZWVSTOJNVTPOTPPPNMQQPRXTQQOMOSVNWRTUUONMQSUUTTRTWVZ]\ZVWQRWXV[[WQTVVVVYTXXURRXVVZ]Y]_^V^]^`\\`___ZbbdhgddbYb`a^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQPU\ZZW[[\YZ[dqmhd^[YVUWQLMVSMNROQROLPSRU[USPPLPWWRWSSSXMOPRTXVUUSUYX[^][[VROUVV[[WRTWVWXVTX[TSRZWW\^Z^_`Ua\aa^`b_]`]c`cghdf`Zc`a__ed_`c[Z\[\YZXYW\Y\[`^_[^^a`^b\Y`ZQNONVQPTROUTSPW\]\X^\_W\^jqwyb\[VVXQMOVSNQQPRTRKQTTY[WUORNSXWTSURRZOPSSV[VVWTVZX]^[[^VSNTUV\\VRTVVXYSTY\USS]XZ]^\```Vb[cb^ac_\bab_cfidf^[d`a`acd_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUURQWRTP[^_^[`\`U\]ijr}slg\UXWPORZSRQSRTUTKQWV[ZZSOSRVVVTOWRSZRTTTX]WXXSX\X^]YZ]TUNVWW^[XRUUYYYUWY\USV^Y]]`]bb^Y_[eb_dd^^cca^efidf^^da`aabd`b^XZ_[\[XXXXW[Z\`\[[\[XZ[^V^Y]POORZPZTUVVTTT^^`_^b\`U]^bkytl}lZUYUQPS\TUTUTVYWLRZW][]ROUSXWVTPXRSWSVUU[]X[YUZ^X_^Y\YRWRYXY_ZZTUVZYZWXZ\VTZ^\^`a_dc\^]]eaafd^^dc`\gdhedb_da_a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX__aa`c]`T]_beeuzhXYYSVSV\XWWVVW]XOU]Z^]]TRWSWVUSTXRSVTXXX]^X][V]_X__X]VQYTYZZaY\VWX[Z[YYZ[XV]__^cbadd\b\`fadfd_`dbb[fchecfaf__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNTZVS\TVWYVV\`abcac__V[`da_zuohY\ZUXTW[ZY\ZXY`WPV^\`a\TTXPUWVTVWRSUWZZ\_^Z_\V__Z]^Y^VSYWYZ]bZ^VW[\[\[[Z[YZ__``dbcdebdZbfcgfe^ab`c^bcidcg_g^bbcaa`^_XT[ZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXUXWX]_badad`^YYadb`lfh^\][VWXY\\\_[Y[bVTX^]ac\RVYPWVWWWVTVTX\\^``]`\Wa^[^\[^XVXX[[_`\_XY]\]^_\[]X[`a^`dcdeefbYceeigd^ca`ec]eidei_f^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNSWYVWZX[\XWY^`badada]^Yacb_a``^\\\WW[[]]__\Z]cXZX]`cd_RXYPWWXYYWVWV]]^`a`_b^Ya]]^Y]^YXVW[\`^]_ZZ^]^^a\[[Z\_b^bdcefefbZdfgjgc_c_afeZiicfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxLXW\YW\[\]ZW\]_`bdbba]`Xbcbacab][\[XW[\_]`_][`d\\XZbec`R\ZOXXZ[[ZWZY`]`bb`ac_\b]_][^^YYUX]^_`__\[^^`bc\\W\^`bbcedfdefd\efhjgcab\dg`\iibhifd`baca_`_]][Y\YXWXYXW\[ZWWXOXZ]acffrkJYW]ZZ_\[^\X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\]^_ZXV[_^]aa_^[`abeb_]T\``cddfegeffe^efhigdd`[eg^ahhbhhfc`b`cb___]]\Z[YXXXVZV\ZZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{|{{{{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvvvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{||||||||||{{{{{{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooooy~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½E>????=u~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooony~y1333332j{éääääèÊ:233330s}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuutvwwwwwwxyyyzyzxopppppprrrrrrrwzyyzzz~|||||||vuuuuuuz}}}||||}}}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvwzxzzy}zyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{|||||||{{{{{{{{{{{{{{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwx}y}}z|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww|z}}y|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww|{|{z|{wxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx{z}|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyxyxzzy{yxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|}}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssrrrrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttstrqppponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsssssro~{oonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrsurrrps{opoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqqt|pro vpppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqrp¡ups vppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqo±n~¤ vpppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqrp³©|¯£wpqqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrp±§«¨¯¤trqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrsssssssu¢¢³¥£zssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~~|vvwwvuxzxxxxxwxx¥¥¤£zyzyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~}|{|}¢{{yxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}~}~¦©¤ }}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~±¨©¢¡¡«£~~~~~~
~~}~~~}}}~~~~~~§®¨£ ¡¥©¤|~~~~
|||{|}||~~~~~~~~ª®¤¤¡ ¡¡¡©ª|}||}}~¦£ ¡ ¡
}||~~
}}}
~~
}}~~
~~~~
~~}||
~}}}}{
~~}}
¡
}~
~}}
~}~~~~
~}~
~
~~
~{z
~}}}}~}|{|
~}~~~~~~~}~}}}
}|}~~~}|}}|y|
}}}~~}}}}{zz~~
~~~~~}}}~~}}}}~}|zzz~~}~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~}~~~~~~~}|~~~~~
~|~}~~~}~~~}}}|{{|zzyyy{~~~~|~~~~}|~~~~~~~~~~}}}}
~~}}~~~~}}}}}|||{zyyyx}~~~~~~~~~}~}}{|~~
~}}}~~}}}}}}}|}{zyyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~}~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}}|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}}|}~}~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{{z|~|~~~}~~~~}|}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{||||{|||zzy{|z}
~~~
~~~
~~}}~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}|~}~~~}|||}~{{}w~vx~}|}}}~~z}}|~~~~~~~~~~~}~~}|~|~}~|{|||z{z}~|||}||~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|}~}}}{{}}|z||~}|}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~|}}|||{~~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||||||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}}|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~~}~}}}|~}|}|}}}~}}~~|{{{||}|{{{{yzzxy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~|}}|}}~~}~}}}{|}~||{|}zzzyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~}~~}~~~}~~|}}|~~~~}|}}{}}}|||||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}~~~~~~}}|}}~~~~~~~}}~~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||~}}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z~y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~}~~}~}~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}|~||~~~}~~~~~~~~~}~~~~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~||~~~}}|~~~}|~~|}~}~~~
~}}{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~}}~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~~}~zz|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}|||xxuxxy{||}|{|||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}z}{yvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~
~||}|x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{}~}y|zzz}||}z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
{||}zz|}}||z|~}}}}~~~~~|}}~~}||xvvw
~
}}||{||}}~~~}~||}}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uz
}y|~{
}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwm{snym}rsvsvmnwlpylu}|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}~{~|~~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}z}{|}}~}~~}~}~|}~~
}w}~{|{~{||}~}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}~}~~}}|}~~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}}|||~}|}}|~{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~||}}|}}|}{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~~||}}{}}|}zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{}}|}yzzy{}}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}~{
~|~}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}~}}}}||}}|
~}~~
}~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z||||~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937676=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÕÕÕÕÕÕÕÕÕÕÕÕÕÕØÛÜÝÜÜÜÜÝÜÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;A<7=9AC=@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌͲâÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸ºÑÔÔÔÔÔÔÔÔÔÔÔÔØ®|½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVM<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎnPSSSSSTTTTTSL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¢¦ÎÓÒÒÒÒÒÒÒÒÒÒÒÙ;DDDDDDCCCDDCFSSSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;<B@8<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÎqTXWWWXXXXXXWP¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¤§ÍÓÒÒÒÒÒÒÒÑÑÑÒÙ@HIIIIIIHHHHGJWWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<<<<>::;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÎx^a````aaaa``Z¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©¬ÎÓÒÒÒÒÒÒÒÒÑÒÒÙMTTTTTTTTTTUTV`bbbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:=<;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÇÅÅÅÅÅÅÅÅÅÅÅÅÄËÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÏÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÕÕÕÕÕÕÕÕÕÔÔÔÕÕÐËËÊÊÊÊÊËËÊËËËËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÓÔÐÏÎÒÔÏÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÔÔÔÔÔÕ××××××××××רØ×ØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎЦÅÑÒ¨ ÐÏѤ¡ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<=B>BB@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒª¬Î³£§Ö¯¡©ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐÉ
¥«¡ÀÈÐÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<96?B?B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѤ°½¡´¢°²ÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÐÕ¹¹¯³ªÕÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<==964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÐÑ¢ x¤ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@==<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÕ§¤¥¬¨y©
¤ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAA8;?<=;<<7558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÒÀ¢Ì¶µ¯¦½¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF?HHGE@<<>><==<756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÔ¤ ¹À£¥§»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@C;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÈƦ½¨£«¤Ð«¤ÑÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ Ôʨɷ×¼ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<<?GEGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÔ¯°³ÐÕÇÃÕÑÕÅÄÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÔÖÖÖÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886586987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAD?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨§¨¨§¨©©ª§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨¨§¨¨§¥¤¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§¦¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢£¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡¤¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥£¢¡¡¡¡¢£¥§¦¦§¬«§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦§§§§¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¢ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB?DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¤¥¨§¦¢¡©¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¦¦¥¥¦§¦¥¤¥¦¦¥£ ¡¡§y¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡¡¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢¤¥¤«°£¤¤£¢¡¡¢a¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢£ª°«¢£¢¡¡¦s_¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¨¥¡ ]d¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¢¢¢¡¡ ¨¬¤Xf ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ £¤o¤¥ybf ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢§y¤ xkf¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:<>9?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¢~ujg ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ª}qhh£¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢pbh¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ |z£ke ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡©gnªhl ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¦t_eWr{z¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ ¢tRMoxIYpw
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v§S9@tqgE:Uo
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{¨yNhTtweOUC_w~
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
~~ _ub§]{Qk}
¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
}c¹Ô½º©·t|iY ¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~ÏÄÕ°_qTz¨®²¯°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895875795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡£¡nº¤¸Ñ±¨®l³§Ut ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUJTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«©©°£t~±¼³«]Älo¢¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOYKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¥©§¨ª¯v{§zjmzo£¨§ ¢¡®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_VZNRNPOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤¨¦¤¥£¡¡«|[i~{roksq{{¢¢ ¡¡¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOXO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢ £§¡¦§§¢¬§}lS[woqvkgdjfnx ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c_s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¡¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡§©®´·¶¹¶®jcOVnkkshbdb[`fov£¥¡¡¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocmjib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª©´ÂÆÆÈÇ¿³¦ub`JOoqmtg`ggX][`glou~¤¡¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²ÀØáÞÕÆ·ª|gb_FRjnqxh`biY[^[\]aba`f|¡½½¨¤¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvlphiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ¶¿ÉÕÖÇue`c\AQlhuvmbcdZYZ[XY[YWgµÀ¿¶®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`fsotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃù½¾ÁÈÐÍf]YW\UBJqhmgrga_X[WYWTSb¼Â¸·»°µ¶¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuvnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÅÁÅÅÁÁÀ½fVUWRHDtkb`ogY[Y][^XcºÅ¾¥¥±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|~ifhaklgnvqruqg^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÃÃÆÆÁ±Çʶ
^VTOGbhVU]`a]b±Á¹®²§«¨¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|~tklndomiqxnyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄŵÀ¶µÉÏ£kUUQS_©¥QV[^^fÀ·¦«³µ®¥¤£§¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyy{vnkihuZfrxsyff^d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÄž·½Ãʺ}UTTLMTWWh»´±¬¸µ²¬©£¡©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh]jonyxcba`^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÅÇÃÇÂXQK°IOUh Á½¿¹¼º¼º¼¬¦©»º¹·¿²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvhiitmyl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÍÅÅÄÃÅÇɧtMz²GNxÌÍÆÄÁÄÇÁ¼¾´±°°Â¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`kjwlieuntc]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅÁÁÀÀÆËÃd}dKÉÉËÐŶ¿¿ÀÀº»½µ³³À¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegcjdbjmno^Y]VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁ½¼ÁÀÀÄPIsÉÎÄÈÐÁ¯½½¸¹»»¾·´±¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbacccjbgc[ZZ]YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÁ»¿À¼»Ä½ºÀÄ¿½¼¸»¿ÅyI ÍÄ¿¿É¿°Á¿º·»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabchjggiei^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÕ¼¾»ÃµºÇ·¶¹»¼¸¹µºÄÊM¥ÈÀ¿»Á¾¹Æ½Â¿¼Å¸¶·´¸¶¶»»¹¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxqmeefpjekhXYOKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÐÅy˽Ƿ¹¸¶´·¹³µ²»ÅÊP¤É¿¿¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksfbn`\THKKDJCCG>:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄØ®v¾ÈÏÂÀ¸®µµ»½·¹±¾ÃÇQ¢Îÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qflintnwcgb\cQKUHEECGB<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÇÉÑsw±ÑÑÌÊĵº¿ÄȾ¾´¿ÀÃUÏÆÂ¾Á¼¿ÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltlln_c^abNHN?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÊÂuw¨ÌÌËÍÊÆÂÃËÎÁ¼¸½º»]ÌÆÄÀÀ¿ÄÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmx|`qc[^__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»ºÛ¾¶¾À¾¾º¦ª³·ÄÀ¦{y|ÄÆËÈÁÃÀÀÉÊÁ¿»º²®zlzÇÆÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxthp]\_\ZQEEDMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Å¶m¯Î½¶¹À¼ª}nhnmtuz¾¿ÆÀ¹À¼¾ÅĽ½¸±± {q¼ÈÃü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wlu{pni\__YSPAFIGK@ECH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹Àͱu´½µµÁ¤iZ^`NS[\pvz
¤¸·Âº³»·»½¿º»»®¢¯ÅÃþ¼¿»»¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦{zsvvwnqa_f][UJ=??GF=GCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âɦw¢°µjfgVY_IIMPTo{©°·¾¹²µ²¼¹¼¶¹¾²°©ÇÇÃÀ½¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca\^OIB?=IDFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Æ¨{v¡_SCYUHbjUOEJe¥¯¯¶ºµ´²¬¼¹¸µ¸Á½¡±°¤£z¿È¿¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨ª¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´¶¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovrnc]fY]]SONA>JB@KJ@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿³ynNK@eYBOxhMC^
±µ³µ²´¯¬»º¸¶¹¿Åµ¿®n¬¾¸µ²±¤¦§¤¥©®¹¬««¥¨¤«®¯§°«¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuil][jT][PNHDGMBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³·¶{XFAOXIJYxcAU£¹³´²°±°¹¸¶»·º¾°µ®¯~¬°©««£¨¡ ¨®¤£¤ ¢¦¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhutneUacW]QOMH@IRDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²¼©hM?SyqOIILhZEU°º±¬³¯®¬¶¶²´µ®©¥§¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦¡x|vzcwln]QiTPNGPMLCPQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Áª¥¼fDS~PXIKaIWbee¯µª²´®ª«¯°²³¥ ¢ £¤¨¢ª £¥¨ ¡¢£¨¨§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£~|uv}nk{dhVRdMJHGOSNKNH<E@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© «Æ¿ÊNAvnOmJLdfvta]bt²¯®³µª¦¬«¢¢¢¤¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¢¥¢¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wy|eyy`bSU`HIJKSTISQM9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÇÆVSJf£Yf}or[Rkc\gb`m´°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[S[YMQJOOVMSMB7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yUiqwuocwvXWb`di[ZWh®¬¯§¢ ¡£¢¥¡¤¤¨¨¬©¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°¨«¨³¶¸³¸²´¤ ¥ ¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xvjwu^m[R`HRUHFUWJCMG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ £op`cWK[RZLLQYRHONH¬ª©¤¦ ¨¥±ª§®£«®¶°´²±®¶¸½¿ºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«®±¹¸¼¯³°µÂ¼·¾³³µ¢¬¢©¨²©«¨§¨ª§ § ¨¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmiwmhm\X[CWNJGMGCFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£bW^e`WMQG=?@CD?>BRx©©ª¥¢£
«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÄ½Ã¼·³ª³ª³´¯³®ª¯£¬¨¶±£°¦ £°±®°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤{trkkurqhV\QFUHDJPI?EA4FH95<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`PFE;B>F<>96N~ª²§££¢ ¥«¥xm ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÓǾ¿ÀÂ¾ÇÆÂ·ÃÊÉÃÁƾºµº»µ»·°¶²ªº²®»¸¿»º«¸«ª¸»µ¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkcioxkeY[FKLEDTLDCE7:?:549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}riaWNE>IY|oaA=\®¬ wrqmp¦®´¹Å»ÍÇË¿ÂÌÍÍÌÇÉÑÌÌÌÇÉÅÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÔÐÓÓÌÊÂÅÆÆÊÈÏÀÉÑÌÇÆÈżÃÁ¾¿¿¶¾³¿ÀÃÃÇÅÇį¿¹²¸¼Äº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZZCNLDFPIDC@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>9;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £if\TID@?J
¤ ²£yqroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÑ×ÍÆÇÉÌÃÅÊÏÊÓ×Ò×ÒÕÖÓÔÈÌÇÌÍÊÓÍÎÓÍÅÉÊÊÁÇÌÇÉÉÆ¿Ã³³ÈÅËËËÏÇÊ¿¾¿½ÁÆÅÍÌÉÉÀÃÀ®¯³¨¢ª£¦©¬¤¥¦
zruvgcgvjdVWQDNF@JQB>B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡aSLJDC?CS°Ò½²¯¦ ¤¡}xpkebhroq{
upnqtp
³Ã¾ÅÑÐ×ÖÖÒÖÎÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÑÊÒÕÖÙÖ×ÓרÎÒÊÏÑÌÏÐÌÓÐÀÈÇÊÄÌÌÌÎÏÅÇȶ¿ÊÀÒÍÌÏÆÊÈ¿ÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨|xsvpc`erb]R\IJGAEIJ>;A8=5586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢¡YI@ADAFQv²¯§ wica__`_^__]alusppolrquÄÈÇÔÖ×××ÓÖÐÕÔÚÔÔÎÏÕÔÔÑÑÌÐÎÔ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑ×Ñ×ÙÔÕÌÏÏÊÍÒËÎÑÀÆÃÈÆÏÎÑÑÒÈÌÍÀËÌÆÓÏÌÎÈÄËÇÇÉÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨«¥²¨°³¬
|zqstmacim_VP_JJCFCRM@<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><?@=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£«eC8=>DXª¨}pecb__a_^a`_``_`emppnkorvwÌÁÓÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÑÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔËÐÔÕÖÎÒÐØØ×ØËÈÎÄÉÏÌÊÌÀÊÀÈÊÎÎÐËÐÎÎÌÏÏÈÌÐÐËÎÊÃÊÇÉÍËÌÒÓÍÓÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¾»±
zvopokaenpaW\ZIFFDMXE;@=33<<87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤±yHFB;W¡k^^^adb``aa``a^__^\bmroostvvy¤¿ÌÕÑÖÔÓØÖÎÎÓËÎÎÅÎÊÒÒÏÇÎÍÎÔÌÎÒÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÍÂÈÊÃÌÄÆÉÊËÏËÎÍÐÎÓÌÆÉÏÍÈÇËÅÇÁÆÊÌÍÏÑÇÐÏÍÎÌÐÅÇÁ¸¹½Ãýø²²¾±»Ãõª¥¡yqrkmg``qhYXhVMGLIPQB;C>;68:8::57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±ÇøÊÕÖÙÚÛØÌÌÏÈÖÕĵ¯´¨xlpqy|eabb`]^aca``_`aa`_][]grrprsqmry¥ÇÓÏËÐÐÓÔÊÅÉÉÆÆ¿ÃÅÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÐÎÌÔÊÇËÎÏÇÇÏÒËÐÏÆºÄ¿ÆÊ½ÂÇÉÎÅÃÇÀÇÍÈÄÌËÌÏÈÄÄÐÈÆÂÆÈÄ¿ÁÇÌËËÎÂËÌÉÇËÐÄÅÇ»ÇÃÈÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£xotdk`^fqa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼¹ÌÌÆÐÕÕØÚÛØÐÉÏÏÑÓÈ·»»£¶}h
¤«
}~s_[^^^`^`cdc_]]^_``_[Z\`lrqookloo}¹ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈÊÍÉÄÂËÉÁÁËÐÅËÈ¿¹Â»ÆÇ¾ÀÆÏËÄÀûÉÇÉ»ÉÇÅÊÀ¾ÂËÆÅľƽ¼ÁÃÅÌÅżÀÉÃÅÇÒÅÁÉ¿ÊÉÆÈÆÑÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¦£ |wstfiZanmZ[XRDLFBGELDFS@54335?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾±¯µl^z|¡z
uxurp_[[]``bcdded`\\]]_^`[YZ\borokikposǽÊÅËÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÃÉ¿ÁÉ»·»ºÆÃ¿¼ÁÎÃÆ¾¾µÁ½Ã»½Æ»Ãº´¼ÆÄ·¿¶¶¾¿»ÌüµºÈº¿¾ËÃÁÆÂÅÉÇÉÆÐÆÂÌȲÇÉÃÎÌÀÅÿ½²·°²§¨¨¹°¥°ª¬zvwjdg`hocV^YJFJFHKAEBFJ@9:658854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÉÆÍÍÎÑÈÐÅÕÔÖ×ÍÊÎÅÉÅÇÁ¹Å½«®¥_dux~{ttc\\]^``bcbbdeb]\[\^\^]Z[\^hsqmggnory½ÌÀúÁ¸°±§ª¬§¸´¶´³³´»¶½±·°µ¯²»Â¼Áļ¿»µ²º¾À¸È¹´»·Á½¸½ÇÁﵝ²¶º¿´Å·»µ«¸½¾À½±º¶°·º³Æ¼·¯»¿µ·µÅ¼¾ÃÅÀÄÅÆÇËÅÀÆÆ»ÇËÀÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn]V^`FKHHJFBDAEE?<:566633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÉÈÊÈÊÄÏÍÒÏÍÅÇÁÆÀ¿º·É¶ª°[ho
zx~vw|sh]]]]_`_`da^cec__\[^\]^Z[[]_lpnifjmnr|¤ÇÀ¸¸µ°«¬§¢©§ª¬³ª¬ª´¶±³©®§¬³»º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶¼È¹Ã¶ª¨°²À¶¸½°±§±³´»¼«®µ¦®¶®»²±ª¹°®»®»¸»ÀÀ¾ºÃ¿ÆÃÅÀ¼ÆÁÇ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÆÉÌ˳¹Â½»³swvki`blhXWW[ALKMJEAC?FA:9:996854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÄÐÇÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª°[j{x}
z{wn^]\\]_`__dcbcdb`_]Z[ZZ]ZZYZ\enohfhiknrº°µ®¥¥§§ ¤ ¥«¤¨¢«ª¬«°£¦ª´¶±½¹¯·°¨®¸´³¼¸´½¯¸¹µ²¼Á²À®¥¨£«±²³¨½ª«¨«¬µ³¥¨®¡¤¯©²¦¨¨®¥¨·¬±²·ºº»²¼¾¾¾Ä¿µÁÁÇÈ·¾ÀÄ·Äÿ»¿Ä¾ÄÈÌÊ¿¿ÃÀÀ©stsji\aocWVXPHYRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃǹ¹ËÁ˾»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ»¨«dmz}~xt~|swe_]\\^_`^_ccab``_^]\ZXY[[YXZ\_fkfdgehjor
ª¥¬¥¡¤¤¡£©££¥¦§¦ ¤¦¬²°¶·§±¨ª´«´º±¶¶®¶¹²°ºº±·¥ ¤¦±¨«¨¹ª¤§§¨§² §¦¤¦¬§£ ¡±¬²´³´°µ¼¶»ÁÀ²»¾ÃÁ±¹¹Â³Á¾Àµ¸¼½¾¼ÂÇÅÃÄ¿ÀÄ xplbf`ko`UY_HNgOTGFKF<=@=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;>97776788666;::;9:;<859<:>>@;È´¶½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÃÆ¸·ÇÀÌ¿¸É·»Å¸³Ä¸³¿À¬µ¼²¬¥¯³¡£ir
|xusomjiipi_`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggkmo©¡¢¡¢§ ¤¥¢§£ «°±µ¤©ªª¬¬¤´¸·°¬³¶¯³µ¯°ª£¢²¥¦©¸¢¦¦ ¨« ¥£¯©«¨ª«°²¸¯¸¹º°¶¼»º«³²¹³½´¶±±¶µ¿¶¾À¾Ã»º½zsk_e^ddXTW]IW\KOGJJGA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÅÏÈÈÀÆ»»ÃÃϾ¹Ç¸·¾·²Â´±»»¬¹º±¢©«§m~
xrmomkb^aff]]^]]]\]_aabccba_\[[ZZYXXWWWXXXZ^bddeffhikr§¡¢¡¨¥§¢¥ ¡¯®®¯²¡¥£®«§¢µ°²²¬©¯³§º³¦¶ ¢£¡£¢ª¶«££¦¥¦£ ¡«§££¦«²³ªµ°²«³¹´¯ª¯²²³·³®©®²¸±º¶º½À¸³±
yuf_f^[YVSZUK[QLIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÁÌÈÆ¿Å¶ÁÀÇηÀĽ³¹¹³¿¶±¹»²´¯¤ª xxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv ¡ ¡©¤©«§¯°«£¤¸ª¡ ®¨¶ª§§±¤¸°¤· £ª§¡¬¹¯¢¡¤¢ ¡©©¤¢£ªª±¨´¬ª§³°¥ª®³±°°¯¯§¨§²®±´¯¼´º¸®£zve_aVYXSRSKM^LPLGHLKE=@>=B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾·½®§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ®¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfa\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbbcfi §¦¤¦§ ¦ ª¯¦¢£·¨¡¡¢¨³¢¥¨¥°¥±®¬µ¡©¡¢±±££¡§§¢¢¤¥¥«¤¥°§¥£««¦¨®¯¯«¨ªª³¥¦«¯´±®¼¶±¯¯ zwrea\[]XNLQHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥¦¬·»¼Áź±¹µÄÉÉÀÃÆÅǶÅijÁ¿Å«··½¶½º»µ²«¨£t~vncafihfgifil`]\[ZZZZ\]\[\^_\ZZ[YYZ[WUXWTTVURTRU``_`a_aacdi¤ ¥¢¦¥¥£¤£ª«¥¥±ª ¡¥«¨¢®¬©©®¢¢¢¢«©°¢¡£¤¡¢ ¢¥¥£«¥¢¤«¤«®¥®²©¦¥¦¦´¦©¨³µ´¹º°ª¬rpo`[WVURFPNHZ\PRITKSLEGJD8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´¬´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±½ÃȬ±¸Áµ¼À¼´µª¬¦r{tiijlgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURRNQY]\]]^___bdm
¢¡©©«¨¬§©¦¤¥¯¥¥¯© ¡¯«³ ¥¦£¤¡©ª ¡¡¢ ¤£ £¡¢¨££¨« «¯¤·¦£¤¢¬ª¨«¯³·²½µ³«¯
tsh[XYSUREXLQ[XMTNPLQRINIB=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³·¯¨¨¯®©¨¬·¶«¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»ÂȰ¸¿·¼½»³µ¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_ad}}¢ «ª¦¯¬¨±¥©¡¥¨§®¨ª¥¡¨«¥ ¡¤¡¢¥¦¨¨¨ ±°¦±½¨£¬´ª®§°µ°¹µÀ±®±«~rsbVTVNRJGVPRRLLWMJMORGMKACFDD>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¦±·ª¥¢±«ª§©²°¤¶Æ´¹º³ÊŹºÁËÐʱ¶·¼½Áñ¯±·´´»³´¢£vkglnqnrkpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajy~t© «¦¦¬¨ ¦£
¤£¢¥§ ¡¢¢¦¤¦©¦¡ ´²§²¸¡¢¶¬©¤²²¦µ¼µ«¬±£ysn]NQQLOCMNNPKFNNJJNNQHMJAHLHHC>858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤¶°¥§¤ª¥ ©¦¤³ª¢²Ãµµ²³ÆÆ¶ºÃÊÌÆ³¬¹½´¸À¯©°¦®º¯{n__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]anquo¡£¢¤¥¢s~{ £
~~tz££ ¡¤¤¢´¯¬°¬¥¸¦¦±¡°®°¼ª©¯ªwscVMROPMCSNLPMBPQHINRMHJJDKMFKK=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-02764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ¬Ã§¢¦¦¶£ }w~fWV_gfighnciigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUVY[]ijqk~{sNXr_;Vo|s
y{}xqp}¡ §®©¨¨³¢¦®¬«¨´£©£sn_[NSRWLDTJPMLFNOIELQMKOJIMPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £®¡¦¦ª ¦©§£©¯¨§´Â¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅª¢±¢}su]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMORTVXZ`lngzsPB?}y`JQnx}
nxuvxpQ|~xvhw~¤£¨©¥¤°ª¡¤¤¦©¢ª¢¦¨vmf^[HQQSMIUMSILKOIHFJNLMTKQPOFIC=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833989:99::::?9w¶£§¡¯¡§¨¥§¨¯¬ªµ¼¶¸¶³Á»¶¨¹È¸¶¨¨µ¶ª²½¦¨~}wpoXMKMMNLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZnru}ih\Tt~|
{vxsovptz~«y{hv{prmxxz{vsrxgu
||© ©¥§¤ ¤sha]\JWPRGKXROJLMRJJJLPHLQLRTMEHA=77;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().12721987:8775:<;7v®£¡´©¯ª¥«°±ª½´²¼¸¶º´±·º²ª¬©¨²°¡~vx|vooiXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^t{xfv|gyvx}q|w{ok~}t{|ufv|logs|lyq}qmvqhq~pC
~wwz}{u}£¡¥xomfcZXXUQJSUTOPNPVKNKOOJROHNPLFD<<79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¡¦°¬®«¨©±¯±«¼¸¬»¾¸³¬§°§¬¥©¤
yuq{mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX]eprl§ªÀ~tyb{xo{yz}omytyjjq~Inhx~midly
ksl|nr|inps{~{vottyyp|ojonoXVXTRQYORTTRXUMNHMJMOKCINGF@:99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥¬°£ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡sztotkpldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\_§aisye~omzvtlts|jjMy
g1vsl~}tfeu
filukq|hqq|n|t~}qpnumwyujyywkkoheXRZWYY[MPUVYXNIHEJJHGB@GECG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5n£¨±§º¯«²°Â±»ÃÇ
zqtyprpoodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯² q{xl}lq
zyr¡txsu5q¨¡¡¢
vp||t®hgbjnrmpuioXupwlz}mrnp{svnbv
ux~}{sqqm`[]^[YX`_RN[ZXWLHJFJG?CABH?CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®±®Á²»ÁÅ|nul{txxlwnwci^JPG>?6449;;;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lv|~
~u¢y~aªzw~sz]dqtz|wmhjbyo
znwtzptyxkni]v||
}q}uw{|wpstfg`[[^S[g^WPTX[UGJJDKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À±ºÅº{vk}xs ||p~zgvkRWL@E211366688:<>AEGFGJKMOQQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJh{y|q|z}~v¡¥¬ªH®¯¯©tm|}hghyn
qGlwryvhmk_v}yzuv|xmow~ttrl[^^[ccXge[TOPVYPDLKFNICFCC@@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¬¡¦¸¯³½³}tp~~}}~¤
x~sx_cWKB60./23124668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`XpY\^i
~
¡¡¦»±§»Çè¡¥|qv
jhotq
w{v
}nvuf «¢zzyogkx~{~tle]Z[]j]af`ZOKNWRQIPJDNGCJDBADDA<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfw{¤¡¬¦«¯°¡xw|~
mpj]B@4--//..02234778;=?BDHINQRSRSSTRPOHDB<87/9D><<63.lMPHIKKKNV_cggmu £ª¥£¬©¶¢¨Á®ǯxº|¡
¢
lpuwqm
q ¤µ©¢}kjj|tb^d_[gk]lk^WKGNRQMLLFIPCDMFACEFB=997=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYoouqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENPRTPPQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¥¢¡¢§¨«¨¬©ª¶«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢xz~¡{w«²|£¢¦¶¯¨lss}}ri`]a_agd`gf[REJKPOIILFFMCHLFGDBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppt`m}aw}{ªªBD}x|
v^bP460-1/,.00//..0015>ABMQRSQRSTRNSLEE@<>=GG@A@8662<9;FHGIJNOQYm
w£§ª´½¸¤¬¬§¨´«°¶²²»±³½³Ã«ºÉ˷ÿ¸¥¢°³¬ª£
¦¦ £¦¢«¨¤
¤¡ «¡¤©°£¦·º £°¢¢£¡«¯¬²´¢¤ªzz}
hah\eb]dd^fg_ZOCIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLhcWioXz
v
ÚÈsV|z
pna@E64<2/110-,+-1.-4?CAMUQRSUUVUN[PGGD<>>FHCE@8;<5C;=FKIGHROPW ®£³ª²ÀÇê³Å¶¬³¿³¸¾¶¿´Á¶»º£¸Å¨¶Éǵ¾¹µ¨£´°±§¯«¥v¤¡¬²³ª®¨®¶»²º¬¯µ¢±«±µ»·´®´ §¨£§©¯²¹·¸¦¶¨¤xvZbeWfaac``f`[TIDDLUQHIJDIGEA@@KDBMG<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQbcWyuq}u
{¿»£¼´y
zxn]V@EN<6:46AB764//6CHCQ[OQUWU\VO^UIKJA@?GKFFC;>@7D7?BJJEFWTP^¤£±´Ã¶¸ÁÌɶ»Ä½³³À¶¸Áµ¾¯·t±³¥ºÄ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°®¦¬§¤ ¬´»¢¨²ºµ¼¿Ì¿Å޽³Â·º¸¾·º·¹¬¬°¦±ª½°¼»ÁÁ«º¨ª}}kWdbYkejeW\cYVSIGFLQGCHIAHD>?BBK@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWSYUZvjp~nzsxb¹¡£{z|}}wzueO\dGEL;Qca[^SF?;HPEZcQRYXZgYT``MSPEA?IJHEEA@C<E6B>HGJLSZT]®¸µº¸È¿º½ÉÌ»¼À»·µ»º¶½´º±Æ`u²¤±«½ª¥¨««¤¢²µ «§®¥§¦¥££§±´§²³½¶Á¾ÓÉÉÓÇÂÅÌÂÊÃÀ¾½¿»¼·´¯¸·¶Ã¹Å½Âȯ¹©¡«¤¨¶s`cb^Xb`igRX`VQUIEENK@>GD=KA=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrrsÕÀµ }~x{|y~t}zkepuY]\Pedb`ed][XW\MdmURmm_n_XgdUYUJDBKKHFHHHGAI9D?HKTTV\Z[¸À¸½·ÆÀ»¹Êʺ¶¹µ¸¹²·µ´®¶¶du¨p^¢¬ ¢¤«¥§¥¤¬¥ª°¸°½¹ÔÑÎÖÐÉÌÒÌÏÎÊÆ¿¿ÂʽÁ¼ÁÀÄÄÅʾÈ㤻°´¯«¸»{l^a]Y^aZccQ[`SPKCAEFE<@E>AHA@D=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ\Yh_onlouu³¬¡
~|s{
{ts{ykmu{hreilifjih`fihlZms¤¼g[oh]ZZTHKNOJKPKSQHLAJGJO_^bfia·Ç°¸²»½µ±ÄƵ°¸°¯»«²±§«·¬µ§§N¦¥¡§¬¯¨°§´´ÔÔÔÖÒËÏÔÕÍÓÏÍÅÂÉпÊÉÊÉÑÇÌÍÂÐÒ¸¯Ã¼Ä¹¥¶ºÃ¢od]]^Y`WYfZQ]WOPBBHEBH;AC>AG??A8;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeVshqoyy ª¥}
|p{r}qxukqx~q{nxslhpmcjmpxiw|~Ë¿Áß§ncxnc[a`JPRUNY^P]\NPNTQUT\nmvq¸¬´¦¯¶ª¬¼À°«´¦¤¸¦«® «´¢±¦«¬¤§¢¬ÏÒÕÑÍËÒÓÔÐÔÑÎÈÃÔÑÇÍÒÓÓ×ÌÑÑÅÒÖÅÀÎÇǨ¾·Ïzof^b]W`S]ZPQTPOH>@FABE<@B>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMN[u
wlwp}~¡¡y
{r~yu
ovrks||w{swqjsripqzyrz¾Ë~²vrvhak]CZZ[VecXdjSX]]`d^cwz~©£¤¡ ¨¥ª°¸ª¥³£¡¡£¡§±¦j¢
~§°¡ ¡¥¤¨ÈÎÏÈÂËÑÔÑÔÓÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÃÌsoda`XTYT\PKGJJJ@;:;DAD<BC>GB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznwpmuvx}t
|ylvtn}vux{µ;AÅ¥~|ieWICfcecgjdnx[^fhknin ££¦±££³¡¥ © £±~
z~©£}«³¨§½Ãƹ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÙÚÑÖ¾ËÌ´ywoe^[SVR[VFGJIEE=:7:@@B:GD?DCADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~
|x
zyqz{uz
yp|oozq{qnzuw}|u~{¯sX©Â¶pnb=^hrpqpnxvehoruxqz ª ¬¡¦«}
~my{®ª§®µ½©½ÆËÉÉÌËÐÉÃÒÊÔ×Ùר×ÕÛ×ÓÙÛÕÐÛÚÑÖÈÔËz|ji\[PST^HCFIH>A>=7:=?;=G=?AAADA>>:86DB755479.566435532323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<::D?CGRk_mdbfkvqz~||~wyn{{tz vutu}too
t|zv{·Å¤ÁɸwpeNfczw¢xyv{{vm¥£«
z}¡¼¡©¦¥®¨¶¿ÀÀ¹ÇÉÍÎÅÍÉÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÚØÎÜÆ|{hjf`TXUUMLDNC;==<8:<>9=@6=?@<?><9867CA6455=80665547745613854564557HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz{~~|{~
zzu}tm|}~s~|~x}xnt}{}z¨Ã ¼£}}r~s¦
{hGq ¤
~¥¥¸¢§¡£¯¶ºµ¬ÀÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¸yyymkfW`\SPOICLB=<>99::99;=6?>><=9:;;37D?8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX_VXfmmmiqry{z|{{|{~u
yrzsm~~w
¡n¨
z |}£¢£®
Wr«[¢
¢£
¤³¡¡§²¸¬¦½ÂÇÎÇÆÏÌÐÌÎ×ÐÑÔ®ÖÕØÚØÚÚ×ÖÙÙq~uig^]XTWXC@HC>>>:49:;7:;:3;;?=>7;9:1:H>:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbymb~omwxyz||{wsp
zuvvt
}~¦£¥¢¨r±§¢¢©¯n·
ÄȲ¡¥²d¤ÍÇ
ª££¥©¡¢³´¥£¼Á¾ÈÅÅÉÈÉÂÊÓÍÍÔ©ÒÑÖÖÖØÚÔÓÚÎsid_^^OJU[BAFC;A=837;<:8=649:<:82?9:2:I:=67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFu||l}xz~z~vv{lny|xx|~£³¨£«²¡§ ¥¤®¢·³¡ ¤¯¢¤§¨¯¤ À£É¸«¢¥²
¨¢
t²¤¡} ¡±®£¤·¾´ÅÇĽÃÿÆÎÊÉÒ§ÎÍÓÒÐÖØÒÏØ»s{w^aVaWPHJOEBCD5>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGN[\YJga;Hzzm
y|x
}px|}|osz}{x
¨»¨²½¯¥®³³¨£¢°¬´¢¸¥¬¤©·¦¤£©ª£¯°© »»É i¶¸«°¢«½£^ª²|}³«¢¡ ¥¯¨¢¥³¸«ÂÈĵ»½»ÅÈÇÂÑ¡ÆÉÍÍÄÖÖÐËÓ¢q|j^[U_RPFD>=CAA8?874>F<<6<35355454B3::BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeHb`cpJ@~r|u~m}}|pww{«ÂÀ°¾Æ»²´Á¼´«³¶¨²®®½ª»¤¨¹·«¦¦¢¢££©¯²±ª¤¢¥¥£¹®¨À»¬²¹¥¤§}½°z§±« ¤¬ ¡¨§¤¡£°²¦ÁÆÃ°°º¶ÅľͧÇÃÇüÕÐÍÄÊutc][a[NKCL@EF>A?B;:4>A==5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\gG`igZ][{un~|q~zz§´ÆÉÀÂÌÁùȼº¯«¹»²¶º³À®¥À¤ª°»»ª®«¢¢§«®µ°ª ª¢°´§¢ººµÁ»«¨²¤¤¨©ÃĤz¡¦ ®ª¡ ³ ¡¤ ¦¤¦§¤¯¥¿Ä®©·µÉþ¶Î²Å¾Ã¼³ÑÊÈÁµvzn]Y]kSMICLJJI@A=CD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBg\Me\fTcjyr|~wz¡¨º¾ÈÈÊÂÒÉÊÂͼÁ³»¾§º¿¾¼Ã·¬Á©¬³»½ª°©¤¥£«®´®¶µ ®¦¢£´½©¨¼À£¶¶¯«¯¬ª«©¦¥¥uy
££©¥}£ ¢µ¦¥¤£¥¦¥£©¨¢²¬¨»Àᥳ·ÌÀ¹®Ã³»¾Á¸ÂÂÁÀozcYW\\LLMIGDCHBBACK:4DH:;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>kI_XaZdeVx
~ ®§£Â½ÈÄÈÆÓÍÎÍ˼·°º¼´¼Ê¼ÃÁ¶¶»³¿¹¼¯¨ ©§¶®©²·¢¨¡«·¸©¥¯¾Ä±½¸³§©³³®¥¬§ ±Å§|}ª¥¡£¢Z¥f£³¥£¬«§§¡¤¨¦¶«©º¼Ãµ¥´¶ËÁ¸ª¶¬³º¸®¨¸º½¸no[XUVOFKSMK?AHEDGFG85FM;>7>AJ.32025B55PWN;LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBrFiIRebLF¦¡©¥¢¯¾®¡Ç½ÅÄÇÇÎÎÎÒʾ»¶±º»¼¾Î¶Ä½·¸·²²µ³¸²«¦««¸ª©§¯°£®¤§¤¥´À°ª¬³¾Â¹À¸³§¸³·³®¥®®¤¡sÁ}±¦£ ¨¡ `J¥T°¯¥¯¯¥¡¦ §¢´©ª³½¼»«°²ÇÀ¹¦««±±£¡²²´¤rpf][OQLEPPPQ;HKIFHAC>9KT?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=REWRsbWFH«¡©¯§
£¥µÉ´©Æ»ÃÄÈÊÈÇÌÎǾº³¯¹¸ÀÁ͵ȺÀ¹µº±¯¯²´§£ª´´ª©¦®¬¤®¥¥©º¿¨«¶¶¾Á¿¾¸³±Â¯·½«£®´¬¸¥¦v¾ ¯¡¡©¨ ª¡§nv¢¢®²£«©ª«®¥¤¥©¢°§©«º·¾³²½¹¶£§¨¥§¬©©ega_RLMGGNJVL=MDMIJACD<QU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..SaMVHe^HF¬¡»¯ª«¢¤¬££¶Ç½´ÁºÂÂÈÉÅÂÎÈÁ½¹²¯¹´ÀÂʶƱÀ¼´º«©¬¯£¢ª´º¦©¦¬ª¨¯§¤««¾»¨¬¼³·½Æ¼·µ¸À°½¿³©´¶«¾¤¢¢¼ ·©¥£¡¨¥³¡¥¨ª¤¢¢ µ¯¥¥±«¬¬¤£© ©¥¢¡´µºµ¨µ²³¢¦ª¡wb^`^KIFHMQIMEFFBRJHADGAVSDH<AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:h]FDDobGE¨¤Ã¥©ª¨¦¬¡ª¶Ä¼¿·ÁÃÀÇÄ¿ÍÆ»¾¹²°¸³¿Ãȵ¿¯¼¶¹·¦£««¬ ªªÄ¢¥¨¬¦¬¯¬¢ª¨¾¸¦¬½°·¶Ç¶´¹¸¾°¾Á¶´²´¯¾££¡¢¥££¾¥©¨¬¡¦½¢¤¢©«¡
¤ µ¬¥²§°¨ª
¡¥¤¬±¶±ª¥©¬ ¡©idZa]PJGKOLHECI@=OH@;GIH[ROK=HNU4BF9>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxecWL¢£Å¬¡¬£¤ §ª¬¶°£ª³¶ÄýÀ¶¿Â¼È¾Êȶ¸µ´°³´·Áƶ¾°¸´¹µ¦ª«¥¤Á¥ ª® ¤©¯¢¦§½µ¥±»·¶µÃ²³·º¾±ÃÀ¸¸³´µ¢¤ ¡©¨«¢Ã©¬®¦ ½¡¤«««¦¡W¦¡ ¸ª§¶£³¢ ¯ ¢¤¦®²«©¢¢¥¥¤ce[d`LIJKNFEAFK>=JA99JJN]QQJ=LW\9FI=DMI8Hc\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\KN¡Ä§¥¢³¡²§ª¤£©¬»°¨¬µ²ÈÃÁ³ÂĽÆÄ½Äʽ°°¶®°µ¯¿Åµ¹°°ºµ¬¨°©©¦¡§Â¬±ª¢®°©¤§½·¦¶º½¯·Ä³³Â¿±Æ³º·«´¶ª¢¥£«¡¨«°®®»²¦ ©©¢¤¸¡¡¤®¯¬¤¦¡£§´§§´£°®¢ ¡¦°¥§¢
cf[hfKILJSBC@IG;;F?99NMU^RSJ>O^^=HPBLLI9Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤Â¨£ª±¡£´©²«¦¢¤²¬®©»²°´´Æ¿ÄĶÀľÊĵÀȵ«µ¨°¸¬ÀÄ´·®¬¶º¥«±«©¦»µ¨°®´²§ªº³§º²·²¸Àª·²Â¼´Å§¾®·µ©§¬¡¥¤¢¢¤¯¸²µ¶ ¨¤£·£¤¥®±²¥©¥¢¨¢®²¢¦®¥¬¥
©©«¢§¡ydi]ljNPMNT=BANC;:I@77QO]^RVQAW`\BJSHWKH:Ud]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1\cZ33806p[bH05JpiVCWFyfC;¤£¡¥¿¦¨¯¯¡©µª¹¯«¤ª´·±°¹¶°·¸¸Å½Ãǽ¼ÄÁÇÀ¹ÁÆÁºª¶¥»Á÷·ª²¼¢°±¥¨ª¹ª §°ª¯´³ª©¶¶¬»«²²¹·¬¹°Á¹½¾¦Ã«°·®¨ª«¦ª¡¡ °®³«°¹©¦ ¶©¥¢¢¯±³«±§« ¤¡£³°¦¡©¢©©§¤~kimamnXQQZTACEU@;:IA7:XPd^PVWDY^^MLRN_KJ>Zd^NIQN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1647gY`F(@8l}h\V:{cC=¨¡©½¡ª°ª£±¸©¥µ²«¡µ½¯³¸¼º½·¶ÁÿÉĹÅÃÀÀ¸Å½Á¸¯¶§«·²¼¿¾µ©®±·«¨§©§»¥³«¢±°³¬ª¶³µ¼¯±µ¬°µ±À¹Ä¶«¼¯±¸¬¬©¢±¥¤¨¤²ª³©ª³§ ¥¤´®§¢¬¬®±§²¬²©£§¤¡¨µ©¡¬¦¦£
{flshpr_GYfVDCNXDZ9HB6>]Rh\NY]G[^]NMRXdJJC\c`PLMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'_^aV150=`V^8)C3YU\gK5zfL@¤ ¤¬·£¬©¥®®¶ª®´¹¦§°¸Å·±·¾Áµ´»Å¾ÌŹÃÁº¿ºÄ¸Á¹³µ¬ªº·»º¾µª±¶¨«ª«¬««½«®±£ª±³®®¶²¹¶©®±§µ°³º¼É²ªµ´±´¯®¦¡³¨¬ ¥±¢ ¥¯¡¤¢¥¦²©¡¦±«ªµ¤°µ¯£§¬¸¢¡¬¥£¢ {
{knynu|aF`jZIHZ[={JGE6AbTiZM\aJ[]ZRRSbaLKE`a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.*A/JGP[G3cYTKD¯¨±©¬¥£®®µ©¶´·£¬´·Éº´»º¿¾µ´·ÃÁÍǼĽ·¾¿À·¿½²½®§ºº··Â·¬±¹¦®«§£²ª¯º¤²±§§¢±³±²±µ±¸²¨®«²§¸¯µ³ÃŶ©´µ«°©§¢¶¦± ¤±§©©¢¥¥¤·§¢°³«§±§¬°µ¬¤¡¬¨ª¸¢§¢§¤ v{
nqxv|]Kel\JOc\?b{GI8GgWe[L^bMXYWTXTi]POHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=ELQ<3rkKDC¤¤«¦£°²³ª¶°¶«µ¹É¹®Á»Ã·³²µÂÃÏÄÀÁ½´½À¿º¿½³Ä¨ª¹±¶·¿½¯«³³ §°¥¦°¥²µ¬«²°¬©¨´¹¬´³µ¬´¬©«¨¬©¹±°Ç¾¸¤¹¯©¦¨°¥££®£©¯¢£¢£¬£ ¡©¥¥¸¤«´´¤ª«¨¬®¶¯¢£¨ª ¤´£
§ w~
||}qts~}~\Rdn^NZf]FD[G:NmXa[M`bNVWVWTYg^QRLdZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Ce;6*HdHJ+:I?3CIS,>k>HI©ª¡¨°¤¨£³´±´µ±±¡¬½Ëº®Á»Æ±´´ÂÃÑÄÆ¾À²¾Â¼¿¸¼Å¨·¬³¸¼Á°«²¡¤§©¨¤°£«±ª¯«±®®«³»§·±²©²©ª¦¥£º¬©±Â¹´¬¹¨¨¨©§±¥©¤¢®ª¨¢¢¬¤«¡§¨¡¬¥£¬·±± ©¢ª°¬¦§©£ §¡ ¥
|w
usrvl_Y`ncQsr\K<|F?WuX`YOd\NUVUWP\a_SONhXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^J0.IgDF8<B05EKX1@\@MF¬§¡ª²©¨°µ¬¸´®ª¤««½É»±¾·Ã¯°³ÄÄÎÎÿ¿´ÀÃĺÀ´ÉĬ¯·®²ºÀ¿³®®«¥¨ª°©¦¨²¥´ª°®±¯³¬³º¤¸´¬¬®§« ¢°·«ªº¶¤µµ¤©§¬¬ª¬¡¨¦¦±²¤¦¥¡¡«© ¦£¢ª¤¬¢¦±·¬¬¢¤¢©ª©¡¥¤£
¤£|{u~uw£yk^`ngWfdN@gLDbzWbXReUMVUUTO\]aUKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4DAIHD¯¤¢ª°ª¨µ«¶°«¤«ª©¼ÁÀ¸¹³¼µ¦²¯ÄÉËÑ¿Á»¹ÀÀ¹ÁºÂÄ®±µ²´¼Á¾³²®«¬¨¶ª¥°ª¹¯¨°°®±«µª¶µ¦´¶«¬¤©ª£³³¨¨¤´´ ¶®¡©¨«¨«§ ª«¨¹¶©ª©©¡©¨¡ ¤¢¦¢©¦´®§¥©¢£¤¦§©¢££~
¢txu{x~prggqx\asiO]VHmyUdVRcOLUTUQOXZbVHPjTWSGPYUI>IHOQPxLNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02?f=NX?C,?LT_/Ik7RE;¯¥ª«¤®³´®ª¥¯©©»¾»Á±¯¸¢µ¯ÉÇÈÑÀ¿½º¼Ã½ºÃÁÀ¿¯²³²¶½¼Á²²³«³©¥µ¨¤³³¹¯¢µ±¯±¹ª¸®ª®¶«ªª« £¡¶®¨¡¯²¡´ª¨§ª£ª¡¡¬¨½¯¬®¬¡§§«¯¢¢ ¨§§©°¨¢¬¡ ¡¢£¦¨¥}
¤
xs}uxz{tt{j£ui^elug|RWp^JxsTdSQ_MMSZgNLVYeXGSjRR>BNQaQ:IHLSIqPLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HO;XB4°¤¥ª£¥£¬¦´³°©¤°§ª¸¾Á¼°¨¹ª§®°ÉÆÈнÀ¾¹¾¾¼É¼Â¹±°µ²º¼¹À³´»¹¬£µ¦§¬²¶¹²¦§ºµ´¼¯¼¥µ«©¯¤¥¬ª§ª²¤³¨ª§ª¤©¢¨¨©½«´¯©£ ®²¢¤¤¥¤¨ª¥©¡ ¤©©
}~
¢~rzy~|hw|zupq~iyd`hdr
{mgy]^VBW{mTaPRXKKMpt]HZ[gYEVgOC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F\@*°©¥£¡ª¥·²±¤©±¦¹Á½µ°£¹¨¨°ÃÉÉÌÁ·½Àµ·¿ºÈ¶Ãµ´³µ²½¹º½¶¹¶¿¢³¦««¯µ·´ªº»¨±¿²¹ ¯´¶©¬±£¥¨©¢¤°¦¯ «©§¡©£¨ »§®±®¡ª¢£¬¥ ¢¢ª¢££¡¦¬{}~
¤|yl}vyxb{zrppsxjtjgchansmbjp`oA]ykV^NPQJILSYVM\^mWDXaO^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdN)=3Q]=#«§£¡§£¸¯¢¯¯©«¸Âº³¹¯«¨´ºÇÊÇ¿·Â¾¯´¾·Ä¶Ã²°º²³Àµ»¾¸©¹¸½«¤µ§¨ª°¹°©¹¼£®¿´´¡®·µ§¦§°³ ¥¦§ ¥¬¨© ª®§ ¦¢¨°¸¤±® ¬¡¬¤¦¦¨£©¦¨¡ª}||¡y
}{sp|qst`yxjopqpjsczlhfdae`[rjqMNiXZMPLJGPRQHM[_oTDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0\[5(¥¬¡¤¡·ª°£´´©©¹Å¶²® ·¬°µÅÇÀ·¿Â¹°µ¼·¿»¿¯¬¾°³¿±½Ã¹©»º¸§¨µ¨§«°¬³°¦¼¶¤«ºµ®±¸¯©¥§¯²¡¤ £¤¡¯¦¡£¨¯¡ ¢£¤¢¶°¡¦±«¬¢®ª¤¨¤¥©¤¢©¡
z~zz
zzpqvnpt_xwemllkinfrikfi]ct`[kuiZJ^[XOOKHHRUF29]^mPDXVYeMHIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cm74GAf[HTDU]hD.<2cV,2¢¡©¤¡¢¡·©® º¸¥¬½Å³°®£µ¯¯´Ãü³¿º·°³¹¸º¸º¯®À³´¹°¿Á¸¬½ºµ¥¢³ª§©²«±¡Àµ¤§µµ¨²¼©¨¥©¯¬£§¤¥¡²¥¤¨©¢ ¤£¸¨¤§®¦¥¡¨¨¡¡ ¡ª £¨¤y{}z
{w~{ltqllsawthhjggo
ghhcfij`jcig[e{c`StT\[SLJGIOS@!*h^jLCVU^`KIGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tA3CDg[KWGU`hB379gO'2¢££¦£µ¬§ªº·§¬ÄÁ¶°¬£µ®§®¯·À¿¼²Á¶°®²¶¶¸¶¶ª½³®²±½¿¸®¼»±¤¶«¥¥´©ª®Á«¨¥¯²©¬µ»©ª«±¥©§¤¦¢¤©¡¢§¶¥¯ª®¡¡¡ ¦¡ ¥«¡© y
w}
{s}}fxokjkguskcgddvbeffejjdkrZ_Y]mdaNiX[`VJGIKMRX>9_liHBTS\[IHFFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£¬¡¤³±¢±½¶¡±Æ¼º±±¤·¬ª®©¹¼»º®À²®®®¶®²¸³¨«¹±¯®³¶º¶°¸½¦µª °¤ª¯¢À ±¤®°®·®µ¯¢§©¥§¥¤¢©¬¯¥º¨®¢¡£¤ ¨©§©§|s
|
p~fymhkigqrk\hccsafhjnlgjjhn]lltpaUcideZIFLMOXQQVaeU@VSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC'4¡°¡¨²¯¸¿¶ ´Â»½¹±¦¶°¨®¥·¸··»¯¬ª«¶ª³¸¥³µ²®©°·¶±³µº§©µ¨¨¢©§¾£®¯´µ¬±°©¢£«¨¦£©¢¤£«ª©»§¤ ¡k¡p£u©§¡xnj~vql}p^cagktw~gguheW\hsnNPjcgrg_dfnmj^_aeNKD9FTg^JGPPTUKHR`oteFZQUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:175Xl16Ok[N\K[fb>G1Qd=*.£° ªª£½Å¯©·Â¸½¼§¶°¥«¤·³±³±¹©¦¬´¦¯µ¢¨¸¶¶¨§¬·³®´³¢©³ª¡¤¦§«º¦¥¯²¶®¤©®«¬¥¡ §§ ¥¥§§§ª£µ¯££££¡¡ ¤¥ªrx
¡vif}rx¡o~}¡ |tvllheczkqaS
mcliqYjqoX^i[kk[qnzr
gZ^GN?G_MFRVVQQRWTg^MWIRSOEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa70(¦«ªª§ª¿Ã¯±º½·À¿ª¥·°©¬¦³´®®³·«©¥±¥´³µ¶´¦§¨³±²¨®« ²¨ £¢¡£³£¥¥µ¼§¬§«ª¨¥¡ ¦£¥£¤¤©£¤¥¦¡·££ ¤®©¡
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Åzrµ¦»{l±«°xhkX±®nei¼¼nhznrØ~Sjb¶²rt¡ªWOWbPVNFT[XQPR\W\P@\DQNDGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦§ª¥²¨±Â½²µÀµ·¾Â«¦³¬¬©§¯³©¯¶´§§¦´¥§¸®³²¶ª¥¤§±®®±¦ª§¤±£¢®«¢³º£ª©¢®¥¡¡§§ §§§¡¦¢ °¢£
¯jjª~gdp¥q®¡¤~x»}k¡v±_j´[¥f`fzfjxk©d¾rg¦u±j|±xtcmm§n[ EhfEu`~g|¤§Y_«ixyj§7J¯\XSld[KNW_\WV;NOXW/ITTICEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y30¢¬§¥£¤ª²·¬´½¾°¶Ä²·ºÂ¦©°«®©©°®£°º¯£¤®²£¨¸¨³²°£¥ ª¯¬¯¦§£¢°¢¬¥¡³³¢«¢ ¡¨£¡¦¤£ ª¦¦ ¡
µµx
©µv³·~¨~k¦{w«gk±[«{tqx °vwqkkl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¡o[Skh`LK[dX\ZB>±yXXA#MhEBEA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50³¦¦¡®©§²¬©»¶Â°»Â¸·Àª¬®¦±©¡¯¼ª¡§´£«µ¤¦³³§£¢§ª²¨°§¥¯¬¡¤¨´¯¢©©¨ª ¥§¢ £¤£¢©¥¢ Õ¹p°Â~Å|Ö»|¤¤{£¥z¬yV¯z~j¹Z¹v}¦|zªy{±nt¼
oP¯§ÅQ zc`©ctrm`Sµ´È|c¤3Bv]PjidP@XgZdaJHNmM[ROYfYCD>E?0=<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ71%¢±¨¨¥³ª¥´©¤¼·Á°¹À±µ´»³µ§±°£°²¦®¶¨§¹®£¯± ³´° ¤§©°©´¨¤ª ª§°©£¬¢¨¡¥¡¢¡¡¡¡¢¦¡¦ §¡²nhµq«n¦r´sr¶{££¡¥~°vÒÑv\®{
¤oª¦k
}}{±sy³etofRÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjcfXAOk_lhOUGI8=VQZWXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746@>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥¯¤ª¼¦µ¥§¶»¼²º¿·µ´ºº³¥´´¡±±¢¬°¤¦º®¤±°´¸ª¦¡©¤²¨¬©¤¨¢§¥ª°¦¢¥ ¤¦¥¦¡¢ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
~w¯x³aelZ°XKuyf`_wwhk]¯wxl5yÈ®²_BSo^g`EPm_pmVUM.echRXQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I:99¸°´Á¨³¨©²º·³·¿¹·²µ¼µ¤·³´¬¨¬§µ«¨±±«´¤© ¨¡¶§¦©¢¥¡¢¤¦¬¯¦ ©¢¢¨¥ ¥¨¤¬¡ ¡¡ ¦©}}¥x¡ªp§¡£ª|yo±Z¨ ytØvt¨£|{²^d ~l\«[Zhgªdr{ks]¬Z koeOJC¡\[Lt]bfM[a_rt_JV6JXHE=GFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>102144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C2?8¡¿«´Â®¬©¦´°·±µ¿¹¹²°·»©º´°¤¥§§ª°©¯©µ¬ª¯¡¡ ¦¥¤º¢£« ¢ ¨¯¯¦¨¦¤¨«§©§ £¤¡¡¡ ¡«®mr´r©v¦s´xs³¤¢¤w¸o{¢kk¶Z
ei¡¢§mr´t²j
ku³af¢oj\_M¡|Rs£mz~oq\¯V<weTon.\§OcRkebmZc]ap{cSZQ>>mo3CB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¥»¡²À®®««§·©¸¯µÀµ¼°¯¹¸«Á¶©ª ¦£¢ªª¨¶£²§¯ª § ¤«¸£¥¢¡«µ°§¬ª¥¥¢ª±¤¦«°¡£¢¡©ªÔ»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~tª}¾ns¼t²uxnqn¤t½^w}[ay¼kZV[jz^jaegbmwoY[YCA@r@CG+5G"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¡¼¢±Ã°ªª¬±§¸¯¶Ä±¹±®º¯®À±«¤¢£¢©£ª²¤´¦¥ª¦¬¹£® ¥ £¯¹±¬£§§¤¤ ¨«¨£³£¥§¢¡£° ©
µ·xµwmknsnztÁ»½{²¨pt¸|{|¤»¹½uz³£tvut°ufiµtrpw¶^z}hymyc¬pu
Z[§jEeZTf`c]cQggpltBMPLD:ZM?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbV8*O]]=+:VV'>;<§ ¡¿¥´Â´¬ª¨¬«©»®°Å®´²®·§´¸©¢¡¥ «¤©¦µ¨§ £¬¤¾¦¡ª¢¢¨¡²µ·¤¤¢¦¥ª©¤¥¡¨¦¦£©¡£°¨§¡j~i¦xr}tzd{½¾Àºoq`rjZ^ack`cmwbke^`cqhr}
gj~rtx}}b[wthP\n}{kXlzsIJopMuMEW]gaLZWgc_O[mujqRODEN;HH=L?2-2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P^L(3=[O'?2>¨ ¨¡Â£´¹¶£¬¥®§¨µ²«È«°²«´£¾±²¦ ¢¨£¬¦¯¤¥µ©¥¡¦©¾§¨¦ ¤©¨°²¿¬§§¢©¨£¬££§¬¢«¢±§ ±¤¡¨¢¤¦¢gm}qw
µª ¢¡z¤lj||tqxyvv{kstudw}wkp{m`c]phMXZfj`WZoynmfSOFS9OYMRO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³¡³¡¿¡¤±²· ©¥²§¥°µªÈ«¬°¥µ¦À§´ ¤¤£ ª¦££¶«©¥Á«£¢¢§¨§²Ä¯««¨ª ¬¡¢¤¯¦¡¥¨®§ ¯ ¡¦ ¡£ |ª¨{
£f¡³¯
vz|vyzofzkuyshszuktdyf`iecdfkYk{pij\SLPD_TE@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¿¬«®²± ª¦±¢¬³°Ä°ª«£³®¼£´¦¢¡§¥©¦¤¥³µ°¦®¾ «¢¡¨ª«¢³È³ª¤«§¨¤« ©¯©¥£«¢® ¡¤¯£¨¤¨e|e~cylhk{¤ªje~geeih{¡kh¢wkj£slnzzXe^^lv\hswwnxxsmytw{iY^ktd]sij}qkc^RNWJdXAJ4=F7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³°ª¥¨°§°¼±©§¤¯°£¢¦«£¥§©²£¢¯¦¶¹¥®£¡ ¥{¥¢¨³Ä¸¤¡§¯¢££©©¡ ª°ª«¤ª ª¦¨ ¬¡¥°¤ª¡¥ª~½r´r
hx¹Ä¸q¢£z¦sª|ËÀÀ»q¢}À½ÂÁ{|ÃÀ}k¥²ooÊzwvzyqzqx
ymwcf_yd`ec^thldbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP/#F[3PY/UAB;/8£¹Ã´°¯À©¨£¯©°®¦²´¯©¥¦¦±««¢ª§¢¬¢¥¨¥¤´¤¢¦«¸³§¯¢¥ ¡§¬¤«ÀÀ±¡©¯©¡¢£ª£ ¡®©¬§££§¡¥¥©¤¨©©¬¡¥¡¢Îxz¤x_®^§¢ |§t«¯^cªz§
t³c«¡³j¯t}¸aY£Ímu{Ú{p~v~e{vvk|o~
~m`rlpg`_yd\qhjcf`RTRW]KOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1ÂÀ¿µ´°¸¤ª¨³«¥²¬¬«¤«¦°ª §¥¢¯ ¨§£¥¡°¬§®±ª¨¬ ¥¥§£®¤«°¨ÀƳ¨©±®¡©ª ¯§«©§¨¤¢«¬³¥¢ª©£¦¥¡° ¦ q
t¨q±|q¬~¡¥wª}r~«vz|~ª¢~«{{VÄzoÁ}muomeveoawnromfpuup`gme_oiingcWS\aYRSC8II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´ £££¢¬¯¶®¨±¦¨ª§««§¢£¢ ¥ª¡¥ ¨¨¢¯¬¨§¯¬¨¦©£¢¡¦£¯¬£¬´ª¹Í²¦¬¢®¬ ©²©ªª¬«¤£¬¯±¢¨«®¥¥ª©©±¢£¤
¤j¤uz©tz²p¦q ¤``R«®v®¦z{f£¤¤}©®^}©U¢z¢{ïÅr¯³³¹qb©¯Âthmpnyxxolfeeqpf|ib]W`iXXULLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÖÕ¿¡«§¡¯¢°´°¯©¢§¦ª««©¤¦ ¤¦§¦£«¢¬¡¤¯¢ª¤µ°¯ ©¦£¢¨ ¥°¦¤¨±·È²µª«©¢¥³ §¬¬¤®ª£¢ª¢³®¢ª³±¡©¨®¯¶¢¢§|ªlu«y|°o¤Ò¸´¸É²__©£ zxªÉt¤¨ªÆÆxf¡¥s}¯]p´b°uK£m§Gd|qq{u~{n[fjrpej_aXdm\^YINLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/=-5OTQ;<F2,$§¤ÀƸ©³¬¥¢²¹¬ª¡¦¨¥ª«ª§ ¦¥ª£¯«¦ ¬©¥§µ¢©ª¶²¬¥ ¥¬§£ ©¦®¡¤§©°µÂ²³ª¨¤¡£®¦¡¥¦«°®¨¦¬¤·¬ ±¹¯®§²³³¤§¢Nxz£}¤¦¸{|y¹~ÌÆÂ¶x¡~v¤¤©°
¬}b¥l¤p
}r¬`£sq`¼}RUu¤{~u{s
q\mnxrjo[d_hnbd]KLQTAIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@882.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¹ª¯ ¡¬³³¥ ¥®®ª§¦¦£§¡³®¢©¦² ©¤£¶¢¢¢©µ¹£¢¢¡±§¥¡¢¯®¤¨¢¶²Ä±©©§¢¤¥¦¤©¯¢®¥¦¯¥¼¡¶·µ²¸±³¦¯ £
ѵ÷y
¦x¡w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{|m©a£qqbs²¸hx¦}x}ymixiyrnu]ednmfg`J[XX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s¿¿»º´§¤µ¡¢£¨§®«¬¦¢¦ µ§¢©§°£¬£¤®£ª´´¤¤¨® §¤§µ¡ª¤¶¬Ã°©«©¡¡ ¦¢¦¤¦¬¨®£¥¦¾¬½°¬¢°³¹«´¦¨±£§z¨}|°w¤¥m²o |¡§¬
®
© ¡{~«ªxy¯]£}¦§d|sj¯]¥kp
]`[ m¦{{kmc~tnz`geqnhggCZa[>KT3U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI8052.*,ATVVVTTUUUUTTUTSTVWWXVUUQHFIJ#((½©ÆÂ¶Á³¬ ®¸¥£¤£°¯ª¤¹ £« ¯©®¡«©¤®±¬¦¦¬¬¡¡¥¡¥ ¨¦¶©À¯¥©¤¦¥¤¤©¬¬¤¥ª¨¾¤Ã¬ª¢¡«²¹ª®§ ³®¨©v¯~
|º®e°e}¡¦¬°
¦¤¡¡
[lj³`{{±lgo°[}´[¤kÈ¢d{¼Xv´Z²}R®z¬X¡n¨|y~dt~bxt|ajgqmfeeOUd\BU_>J(>9=4!",%2. *1/04579:<ACFHJLNPQRTWZ^```ab^_\[XUPNJFC553./@UZXWXWXXWWXWVWWWWXWWXYZZ\\XWWGB;Ò³²·½º´Â³£¬¦¥¶¨ ³³©£ µ ´¨ª¬¯¬¯¨¢¯¬¨§¢¦®¨¡¤¤£¥£ª²©½¯¥¨} ¨¡¨®¨¦¦£¥©» Ʀ¤¨¡«´µ¬®¦»¬¬©£¯¤¸Ãº§¬¯¦¥ª~սªb£¿½}~£×º¸µ
½¾k£o«lz²°Çj«°½¬xw¢¾¼t§zzc}{dgy{`lekjbPaZSj\@UaBN*=:4/$%2 $(0496678:>ACFGJKMNNQTW]a\__a^`[\YTQMHC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»³´±¿¹±½²¢®¦¥²¦¥¿ª¸²¨¡¿¦§²±¹¨¯¦¦°¬®¥¢¬¡£ª£¦§¡¨¢¡¬ª¹®¨£{¦¨ ©©¡ª§¡£ª»¨Ä¢ ®£ª³´ª°© º§®®suª¤·e pgmow¤u®pq¨£®¤rmmmexonqzjqigqiigpd]bjoY\g~w¦_aqned¢}vfxikyydlcflbKdXJlZ:QeER'K:+# ",)-2.5:4579<?ABDEHKLMOQSV]WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³©¹¹²³ª©¡®£²©¾²Äɾ¶ªÀ¬¬£¡¨¬ º£¤®¬¦®©
¦«¡££¤§¨£ª ¦¦§¯º¬¬{¥¨©£±¦¢«¹¯À§¤²¥¬°±ª«§·£· ¨¥¶¢©©³£« ±¢ ¢ ¥¡«§
¤}g~tvtq§lz¡¢riwqxw|zjldcodU`X@j[HcaOZ+F=+'!740.!%2(*699469;>?ABDEJKKMPPQXUVY^`ac\^UQJED>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥µ¶®®¢°£ µ±¬Ç½Å»¹«¢¦¦±¨£¶§©´§¨¬¢§¬¥ §£¨¨¦¡£§¡µ»¨«{ ¥ª ¶£§«·§®Á®£¶¦¯¯°¬©©³¸ ®¼¥¤¦¶¢¦©£¬¯¡£°¨¯£ £©«¡ª
}f
uuysj
}¢¢{rszr|jod^pja[_YncP`dPZ:GGE>2==8/+&+)&&406668:==?AACIJGJKLMSSSUZ``i`eUPJACB:9EMV[^^[Z\[[[\]]__]^__aabaaa`bbbdb\[c¤¨£°³¬®£©¦ §µª¥´¼¯¢£z¢±¤¥±©¸¦£ª£®¢§¡®ª¨¨©¹¶¥¦y¢¨¸£¯µ¢¯¯u¤½£² wy ª²ºu¬¤ªd\bv ¤}n³£§ª£esyp¨l¢§e¥wjvp{aiZuhhs{¦eyxjoykqe_vplkh\gebbpS\>NNNSG>@TD91/&4:316678<;>@AAFHBGFIKMTTUY]`hfgWQJ<DG<8UR[`ab`^`_`aa_\]__`aabcdabaaedchd^]f¦£¡¯±¬«©¥©®£§¤«¶°²§«¦¬t¯¨ª§¹ ¤«¢§¡u®¦¨¤º´¨ uw ¦²µ³¼§ ~§¢z¢®¶¦±©¯£y¬¢§©§
w¥z§{±z cympyp
txht t}¢k
lx{qqgdxojlj\fkjet\_ITLQ@E5.ZTU7)!09=>643568;:=>>@DI?IEJKGSX[Y[aaifYQH9EK<>aV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®«¨¬ ¨±¦§©¥®È¾±¢§©µ¬§¢ ¾ |¬¡ ¨¢£º²§
pu ¤«´´Êª®·
¯°®©¥}¨r{w§h¤y´¦¨Â«¡r¥}
±¡}¡ |
mr
yq|uÅf©£k£q
hwt|whhuqhhk^dpmgmXgG]RM2E46Nac7&3<EGD:64658;8>==?BM?NIJLCPZ]\Wa^jm\QE=LM@JdX]cfhgbbbbcc`_babccceiicbbbecafcbbi¢°§©¨¦« ¤¸±ª«§ £¤«¤¥ª·£¯¡§¥½¡y«¡
w¤£¹®¥~bm ¡¡§~¡§
«®£©£uk¬uM«x¨§©«}¡{z§ikg¶~n`dY{dhr}yl]{m_Sp\_ky`Ye}p§ªk£nr¥p
if m[n|fZ`bWPowfmtrkjo^kpmliXiO]XF9A4GD^k4,ICRMN=84859;6@;;>BO>QRLMBJ\]_W^^cv`MD:MOMTb\\ffiibbdbddbab`bdcacikdbddgdbgeach ¸ ª¤¦¬¡µ¼¬®¢ ¢¥¬®¡®µ¢¨¡ ¦´u¦
¬¤©¦±§¢in¢ ¡¤£¡ w§¡§©¬¥x|~¢ps{ym¨{¢sv¦f~w¤_z}s¢n·´ºtµ¨dƸ{p·q¤bs¬«`}i³~n|q£lr£t£`³q|³ts[²jbotvqioXklrrf]i^bKE=D6QAYq3=SG_JR=<395::6D;;@JP?UMNQ@E_^[YX``|dHC8LWUVcaZefkkbbeadc`ab`dd_`cknccddhdbgfchh£¸« ¤·µ® ¢££¦®±¬¡¡¤«x
q¡}¨ £©¨¥
~k{~} w¢r¡¨¥§ª~~z z£xt}¦¢d¡|lhn{§}rht«tªh]
vhªj¸f\¨p`^§vu~hunm§]¨~x»k~ª[]³g\nrzxki\qjxyc`fXbAQEO7VCRo5KZZ_OZD@151;;6H?:CHU>YRY]>Db^V`Qac}jEB9N[]YefXfgnmbbe_aa__``ec^bdoq_deekecihgkiªµ§c«º²°¬¦©®°¨¬¤¡ £jr{z£©£ ix{¢ ¡rhp©¢§§|¯£¢¸w£³¢¤y{ª¢q¡|
¯µ}k¡x~´££«¨|}tªZ]o{xbL~zz
cyBLY¢jr|mux±³§vns}osk¤]vHedasq~~nf`liv{debR^W]UW@ZFQhDSW\bX^ID=B8?B:IF8LEXAWQ[VDFb\Z`K`m~rEC<U_bZfjVghmobfg^aa\]^ahb_ecvl^egfkdflihki°T^ ¦³¹³³©¢«©¢«¤¡¨¡woy
|r¡s
©|l
q¡x
|£ £}µ{¥z© |§hwm~t¡sq|p®}¤¦£o^¨gu¢co¥aÓ|{xrsc¢~£s¤vk³`sª²¨¼wm~¾¦©´^n}qnr¢r]¤gs¦ah¦mÔ}
pzzk|xsn©¤gaeypkgfdnuwg`cT[fQQbIWJT`WS[ej\eQFCKMJKBKE8O@QNXRYOSQafejRcwywIFEc]eZhiTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°«T\K~©¯±´°³£
© ¤¥¨ © {p}h}wol|¤ª
zvnx¢{£¤³¡¢¶z¬§¤®¥p¨
{¤¡r£®¯¤¡v´µµÉ¡s`©my u¡w ~oLf£pr¤{ztak~ kqd_q}tizi³µ´Æ¦s~zk«umuxizurPE}´^jvkyfjhbtupnV^TYiPShIVMYSV]hknVgWMKAIMKHJOAQKPecimeussy|nu{{TPNl^h[kiRjhilglfce_\]\^ibdik{_]dhcjfomeile¡¯¦f?¡³«¯¯¶¢¢ª¢¢¥¥§¦yjye yui
z¦©z}yp¡y ¥§fnxl¢d|q¥wpg¦{¤zrv¹n¢b}¡mri«ju mn¦_ihu¢}`uobh e~iuocfmr¢Z_[b¡m]o{~srd¥mw¢dg§hso¢oSo _e¨T^TnmskrmpikyskoRYWWgZTmIYO]HXiisjYkVQREV\LXSaUik_wtz}p}|r{svv^QrbgbpgPjhhklnhdg_]^]`kbjivu]\cicjjslfkmc¤¦zetm§®¤©°±¦«¦¢¡¢¢{qh|st}{d|¨¢¬~si¥} ª¦¦x~¥²¯¥wy©t¤n¤¢»n}¥¯|¥zq¨ f~o«cx¨l©¢vwª¦j°kv³©kmm`~«ªv~¥v}¤ jw¬g¶tw¾¤Y¦«aurtp|uqcj~nhlSW[Vab]kM]R]I^nnv`[qY[`Zgtenoqbqt`wz~yrys{{vbxdcmsdRkgholrjfia_^\bkbmlzo\\bibljwmglnb¥ª¤©ª¨§®¤«¤¥©
tzo~ttrm}{
¦¥¦
vol©ª£ u~y®£q
x~{r¦q}}zx{~~v z}k
[yxrzphn~quqe^wusuoynnm
^vhxe
©}t|jpv}vmmgsy{x
[kXyinwrqpxxp]lnigV[`W\ekcUbU_Q_pxxlkvejkkv}qrtsaoubt{xuyuy
}{mldxn^Wnghukxjije\`ZciflqunZ[bkdllynhloa¸¨¦¡¢¦¤¥«£¡¬¡¦©~r|}~
{srp
{}
x}¤|§¡
wr
©
¨ ª~~¨¦woyo}¨
p}qkp}hm]sqtkvtXrn}~j]jd{
`ixz{u
gwkapqv^r¦
enwqzpfge{z[\jgnv[{ywunssf\mkkbZZ_ZYlq\_aZ^]ft~ztotckkj{}s{xtdmuhm|~vz|{zz~o{}s~ysiT\qiluougkhd]aXkhlkqrmW[enlgsyohjm`ª°¡£¡¨£¢~¢¥{|s}v
qor~z §¡x
z¬¡«¢¢££ª¡§¦ {w§~~²¦²¥k|wxe|w|yt¡~}uosw¦
}wl}zjrhatp}zwwovt]^ohn_^Z]]ShrUc\\alhu||sopdkji|nyqjpplg{rx}{m|zx|}zyNdvjrmpzekecb`[tfpfrqmU]ltmiyzqgikd¹¢¡¤¡|« }y{nxr~mk~z}«r}{ª¦¢
¦¥v{¥{|ª¡ª~ox
rt`u
~
myut¡
s||rr{zx¦
w}ol~|nhlmg_zh}{vtvu{w\_p}nt`c[]^QgnTdZ^bkivz~qlldkjglslltoyo
ynv~
vq~{{|{`i|juhiejc`i\cuhobtmlUcqyepzzsejml·¡¤{x§¥yz
|n{xs
}}kh}|}}¨p¡¢
|¨x£ £¡£~
x ~|¤ ¡¦~~ttpv`~q|q
gwqx~}r{|qxzzy¥
{
v{fr|y{qljf_~sh|uvs|sj^`svpwdcY_^RkiTdY_ahjvyqfkdlhekm~hoqk}xzks~tv~|z}jrnsibhlb_qVtomn`xhmWjtvcuz{rbjoy²¤¥ |v¥¡¢x{~q{tv
~xgc}x}y ~p¦¦
w¡¡y~¤y
w~r£¡¢|vq}nzd|
pleuo{|w{
|{q~w
y¢ww|w`yx}txgleaijwstu}q|bcasntrmaZa^[leRcX`aikvyqcjcmeh}lhuhloi|ymqt|~z~|mvttmeljbcuViqn`xglbjvpfy|yq_ql
®¦¨}xªzy{}||xtyzt}d^}
t}~}¤¢s{§ s¦sk
zo£|yqykul|~~m
xp}~dri{~sx}vw|
|¤xt}tvoa{uzq}obocd{bnovsxwstau`oluno\\_^^k^P]Xcahmt{k_jfjchwnflhjlh|zwns}tz}z}}rzxxnljh_irbhqoevgnlayik}{xpawmª £¨~w®}w}{|{vxptt{o
}|a[~szz¥}}¤
n¢¡nf
zp¢}{srukpnu{tnqu{|dplx}}tsyn}
{
¨z|~
x~qpchytup|b_pakt^pj{yxlspex]nlsmsXZ__bkZPWXecgqq~f]ihgbgqndigdihzwuo
t{u
w
|x
zw{zrxjk_phtjromqgole|cnzwqlww~¢¡¨ ¦uª¡t{v
xyrs{
krpzmvnq[X~vu ¡x
m¡
j£f
~w~||nuplmop{
isqwuxfrnu{zyvso{
z
£{uxxol^rtrppxZ^p`pj^oj}zpmmjlv`pojqmZXaabnXQSZfgcuob]kmdbfkn`ff_gkuqspuxux
ww
|{vjqc|c|nqltjholvx_qy|tut~¤¦
u zrxtpr
squkomumv~mnUQ«xwrz x{¤|r
~h
g
qx{z||kvjnkll{~az~wzx|ygsls~{qyovzz}|{w}wqjlz`xpnlrtV^obr`_lnyphoffsthpkawe]Vf``rSQN\fe^yp|_\hrbbefj_hd[gp~pkqt}v|
tu~y{xs
~{yxfrj`}ookz`jntu_t}xxts
|x ±¥
vtvspo
spqojivnn}}musRMßÈÖ|puvw{s
¡~~wz~zugl¢
cqz{y
|~l{erokkyy\y{}~zzhrjs
|k}~n~|y|vxxsmgqmjtohjtnS^odpY_kqwfkjbfxropc_w``Vk_^vPNKagc]zpt\\ev`aeecafbXissmjqv}tyuv~sz~r|~vesn}e~opkZlnyysavz{vrwwy¯
w~}
twpyqnomn~rdexp}mz}jhkc¤ÁÜ®ï¡slvv¢
o r
£
~zuxvvn
}£
^m{}
v
}}k}dxuinxsXz
y~
~xeri
kum~zuswusqguzbtmpbivgRaqglU_ntyard_h}prnZcrabWnY\xNMLdgb^wsm\\dy^`de
`cc^Yjrknkrw~twxw{q}~{t~~shuqymzntpWqzvyqewyhvr§£
}pxy
¡|{rwpsjokim|u^axw{qu{g`d|ëÚµÉÃÜsltvjq
|{
vxrup¡aj}}q~qwhvriswlZ|
}uask~~}mkx
||nqzulqlry`tin]kv`ReqifS`pvt`o`]hqsiWghbiXmV[uLKLfg_brs
i[\ey^^dg{`d_]Yknfoisx~ss~zvzs
|vw{ulwuyxtnx{|Xzqogxwcv
q
¡¢sorw}|xqsnodr~hflwx[_y{{qqjagaÕ¶¦xnqw|qj{i|{}ztzzpu
u~ag}~~m|tkmwtsvukc
~|~o_rp{|~ypfy{}noy~umokl{~chkjYnvZSiribQbrwlbe^Zjmsb[g_dl_nT[pNHOge\gnql[[cs`\clwde]]Zklbmjtwqp|}txx
}uy|vpwy{om|w^tmiztsgs|r vv~mv~|v}vqoljau|fbiuzZ_w|zmqedhgW^qs¼Ävq~stk{|}|u
uv}qurt{e}
r}g}{y}i}vfoxxsvslj
yj^qwz}
{~rhx
x|}nlz}wtoih}we]qcXpsSTnribNgtxf`]\XnosYeb]jm`pOYlRDThaZknm{oZ[^lcZcovdg\]`kjclisvqn~{tuz|
v~xtryyoo|qiyz~mm|vkjxtk
n}vjxyozspljd`tzh_er{Zar|yfpzaee±²wJbZ¤ÙÐr{x~
plzy|xxoqt}ziy
¥o~vx
oz}oxh
xr|e}~ucprhxqou
{vxyj[p|r
}
zrmprxwmn~wzehj}r`YwZYrmNXrsf`Jmvta][[Yt}roWg]fjp_oNWiR?Yg_[pjgyq\ZYkeYcpy_h]^elhfliqwom}upzv
qq{|zzujzko~t}or|{poxf¡
gphz~
|ixrklf_aoym_boy\dlzaqv_eeÕë¾2:>ry
vnl
u}
|xnvwnlu{tfy§}ntvy
~{xlri~xm|{xayqdqh~mtqt
~su}so[k}tx{|xypkrx~tmjvuu\iixqYW}SZqeL[rre[Jpwo][ZY]t~thYb[genbiMWfQ=^f]]vf_tp[YUodZdpyZh^`gmgilipx}ljyn{}zu
pnw~{{h{~kt{r{sw}zx~|kl~ki{~}kuqghc[bgso_alsahpzast^cd n\5Y¯µuj}vtwpl
tyx|z~rgv~}op}hvymey¥~m}v||q{}
|i~mj{zjzvr`w~qdrgumu{
|owy|t~mWm~vswuyxrmr~}}znmimun]hftrR[{N\q\O\rodVKsxjWYYZaqt`]]`fdhhfNZhNAad[`va\umXXStaZdnrWj^bhkgmlipw|li}}p~~{zwr{oqw{j~{nxyvw}x~zm
£{vykmy}{}pqpcf^Yg_pp``gpfjouato[adiv{¾¦£È¸r
s}xtrrp{sutwyyqcwyhrufwvcj|}q~sxwzkxy~uhzikysizv}h`w~jjsh{iv~z~~q{v{t}aUu|rr|pwxpo~}x}|u
vhqhlrp]hctnKevL^oUTYsmbQOtxaRWX\aps[`\hedcjdP[qIDda\dq^\whUWVw^\enhVl^ajgeoohpw{niy~r{~y|v}pvrmw~p|xyztxyvo~}zw|htz|vgom_d\XeYmsa`aqllhn`siY^dmw©ÚªÇ²rxpu{zutu~woq~m
txtl`zyeqogun[m}y}wzmus
{
muvnhwem|vmjvv|abxzhuuc~zgt{tuqz|lYUr}ot~xksxjt}z|x{r|sgsemmt[j_veHnoL[bWWVxmbPStvXPUX^`qo\`cmdc^nbT]rGCf_]fh^Z{bRV\u[[gkaVk_anfflqhpvxtkuvx}w{t}oqtqu~{wx|}
x|}~{~svyzwuy^~ytw{bnl[b[[aVjtc`[hopgraqfW]ck|Êι¢kmnmr
r}
{
zytyutzjmucvwpg^|yeqjjqcXl{sw~{mpp
zy~qqo}ghrbmxrjlqw}|z]eywiuxfvgt|rin~ym|]Wp}ms{nnpvgv~~u{qzt{yqeranlsXk_x\IolMWV^TU{kaOTurQQTV^bt
h\`kjfbYnaXbpGAh]`f^]V{^OVdpZ[jh]Wg`_rfjhrgpswxntzw~yus
pp{wwuy
z|u~}~~}|xuyw~}nuydto
ztcnjY_[]]Tgse`YdrrgsbkdW[`ix¾®{·nbsht|rz{}xxsvo{vejnausjb^~xyfq}hjkZVox£
qqxtmr
}ytrohyajm`mvkgkkzwzw[g}|xes}nteu~pfkztltb[n{kt|zft}mpgt~w}~q{kz{ywpelam~mnVk`wVKklOROhNY|gbNUukMPTU^gvf]aphg`Wi]\khJEjZbdWYUyZNWnjY]le\Yec^tfldrgrptxp
v~x|
}usnsxzzss
y}v|{~{w|wwziv~|l
rq~oflgW][\[Sdpe_XcruivpeebW\\hporseeyjtvss
xzwtunjzpbgkgtnf^_|o{~hlwfidUWrp§||vs|r{ymzzv{}uprmgu]mh_ludgfizo{rYgvugpxuaw
|njmzpere`lyfrv{}auvikqtzpyxr|f~~~xvnceam|mkVjbqTLikPLNpG^{faMUtdJNSWajw~e]gsie_VcWbp]KKkXcbUTUsWLYvdZ_k`\Zce_wgmbpisoq~utwx~
z}v~
nrt{ztq
zuu}
|~z~v{£¥y
lu|{uzo
sz
}unjheV][[ZScne[Xat{jimh_bW_Ziikoglahzykttto
z}vunzhjyj_enhwgeXbwi~zoioff]UXoh§vz|xuo~nrtx~wt
vjrvgho\me^ms_gajxh{m[mssio~yw`vxsqpyqcqh[nvdps{xarpgixsqkwvtvc{~wupcccm|}kkUibgTKlhPGRlEawfbMTr]JLTYdkwze_mpid\V_UnnWJShXf^XMUlTK\z_[_k]][be`zhlaoounowuz}wyzyz}qtt~yvt
}}ls{
}~{v¬zlryvtno|tjpmddX_ZZZUbjg[Z_ui^nl\aV\\kert}ij]lwvgtwrn{~}yvslzgixf]drgzwccTeogwvfhi`WVYhd§n~xzpp|fxnyzvq}~ndvsdhh]lb]oo[g^ltezi]torkq{~uuat
zwru~taolYprbqq{udrl`lzojhzwtqetyzuqdadms~jlTi^^ULscQGWbGcvfaKTpXJKWXgkvzdempfcZX]XvfTJ\cXhXYIWeQHbyZ]`l[^\bd^ij_otxnonvyr}~uvx}suuyzz}~jt{}~
yz~|sq{{~fqzt}}vrol{~mzbpoae^eVYYWcfk`]]siYqn[^WZ\l{cqwvmc[msthuvqm
yywnotehte[gtfvvz_]Refjt}aci\TX^bc¥hytxlnygwl{ztrx{xhevm`fa_j`]tkYe]onbzf[x|knnpxyttdrzvoq|rawcZnoapq|seqd^mvicfxzsmnts|sqa^emo}eiThYZUNy`RKZYHbtdaITmSIKZWilr{cllscaYZ[av\SKc]XiSWHY`NGjvX_am[[_bc]
ihanxylojvxm~vussqvvw|}~~~px}yxy~ssp¡{{yduysyvkspky|pr^po`gblTZYWhcmf\\rfSrn[YXX`lvdjujj_[mtqmtttk||wonldiqc[krdtvs\WTd`q~q\ac]SZ`\cerqtkjylnozzzqwryzzdfug^b[ah\^whWb]phaxa[{vjirowtstip~vrjp{mevW[jmbprzseo~[`oqb^io|lks}rpxkp`[ekm{agTgUXRQw\SPYRHcsb`GVkQHOZUkkk|emoqa[ZXYlpWROfWWiSTFZ\OHruY`dmcXa`a^jcdmyxkoiuy{k}
|y}mqowz|t}tx
utpuo¢t{{fwon|pfxqzlsvsk^tnagekR][Vhbll[\qdNon]VXUgithctee]Znunpuuzl}|wscekna\nmcsxkZTVbcw||p
\c_cT[`Ybcnpsjgynerurzkyttnz~u_fsc[^WbdYaufU_`mcaq]]~ohisqspuukl{
qrfn{oqnSZejeqsvsblvUbqk[^nd|eku|rrrjm_Ycijx^fTeUVPUnXRWTOHer_aFXjNHWTVmhd|ikwjaW\U[tdSRVhQYfTSHZ[PNxw[`fliZb`^^nbfkyunnivv~m~{~krgt{u~r}
{ss}un¤swxn{`d|qgzsylmqvgd|lcfghS__Ug`lo\^nhMim`UVSofslexde]Yqumr{xsm{w{zlaelm^`njepy~gZVX`kw{zo^b^gVY`Wcbkq|wkjvl[vpkyiurmn{rXjn^Y]VbdXeqcT^bibbmZ`~kfksunmwvkh
~zmqfo{lqlbX_hhosts^imSepdUbnaybou{ujolj_X`fhu]eVbVSOYfSO]OOHeo]cGZiMI_KXmd_xhn}d`U^T]t[TR_fN]bTSJ\ZQZvv]_fmhXba[^qcgjwqsmgvsys{~|yntlss
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|}~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDEB1/0000.\pnmnnojfggggfo
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR4555553Sjgggghc_____^j|}zzz|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{||}}}}~~~~~~~
~wxz{zz|||{}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}
|suv{||{|}}}~~}~~~~}~}~~~|xrtx|||{||}}~~~~~~}~~~~mqxrvy|}|z}|}}~~~~~~~~g}t~ssvx}~|y}|}}~~~}~~hp|t{
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~]ivme{{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
gfm^igt
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvuuvwq`tnaptjehklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghgcfnm]lupebcbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z]fjoqqsteYY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPRONQ_cenoonbOQTPPNNOMJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNOLMP_hgmnlgaRMNOOPONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKHFINXfmhlmljhc\WUQOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBPZ[]dioikljijikkcRHJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>>=L^glknkomiijleTICDEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;<;GKG]mmnxqijhVHAEFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;;>;:OipzslcI=@@CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:99::AWtqX?7<<=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;===<>;;W_::<>=>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;]n@>DE??A;FX;==;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mwH8;:==A;I[:<=<8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YQ<==ILEFuwM788:;>>P`;;=<::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;]y|wV<=?==>B]jA;=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAHrykb}]>@C@@>FnvM:=AEABBFHC=<@DDA@?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot}~}uLACE@??W|\?CEIJIIMMKECFGGEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
qBDEDCWu~XGHJMLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHHHGFEFFFDFHGEEHHFHGHFQnnpqruvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCFIJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrsvwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Ul|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIIGHHGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJU
uIIFB??@???<<<>::<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIe
fBB=88::9878896479;<:8567689787688;;;=@;999=<>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIj~T:8656766645763468:876565676778:67789;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBf
G676468874578567699766765:9:::;898987779:98878589;A=>>BA?AKLOQPQOOORWkqrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=qz>988;<=>9::<9:;9:;:99;:9===>;;<=:=;9;;<;<<99<8::;:999<?<=ABDIJMKIKLWorsusvx{{||{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?>H~
l<;>BCEEAA@B>@B@@>==>@?>?@?@==?B?AA?A?=@@@>?A=><;:;99;?=;<==AACABCAXpqtttvz{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHDCECEEAFEFDEFD@B?<@>=?@>?>?>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CCFW
VHMLMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwyx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A>BBGGJY
PNPNLNKJLJIIHJFDGHHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@87<;<=:?@>?@CFIJQ_
rNRONLLLLJHGEIIDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGHGCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@8:<8=>;=A>?ADHJLUq
_RRPMNMKJGEBGJGLJFKNKKJJMMLOPNHIKLOQQPQOOJHJJLJKFGHGEGIFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|WVRRTROLKJDEFKONOWUQPOQSRMSTOMSLPSUVRSQPLJMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?CBFVNFNPPTX{
hWUkaERQQPI;;QSR`u]UVTVYYRXXRZfPUWZ]RTWQONRPPPQKKKHHJHEFIIIHIirvyxyyz{{|z{|}|}~}}}}}}~~~SHJIHGFFE??AAEACGEDELXRMTUVX[|
}al[dU:XXXSQ?@VUY[c`VYbr]]V]ZVEQYZ[Y_TYgRVVXTTVTOOMJLJIILMKOMSosvxyxwzyz{zz|}{~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~znpXZ\[RSRVVTZZtYU}`\X]^WIV]][[_YHYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\YTUTWRQWUbQerXZW_hP`f[[X\gaGOZhg\[\]]WSNSPPQVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOLKfy[]TYUV]ZLTZUST^ZXWWWzkX[[\^TQQPINOWVX[Zdprvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKMNKMKHJDFHEC>TdURQQNKRTQMOYQMNQSUUMQSRPOMLHCIHRTUZ\lquvusswzz{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]][YVPLILIaltPQSNQRQR[RSRQRVTbs{|}{{
u_]KC?CCCCB?DPBC@C=CIGV@HNLG]iPHFNFDEFIGHCDHGHKGDBAD@NQMRdrtvustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kMG?@:;>@@??>jQKaEFHIEB?GLNGMQUIBE?><=<==?=?ACC@?<=B>JMGUnttustvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNKLQRQTUUWQQWVPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeC@@B=:BCAADB\]O{NONNKLMOOQLKLWMHG@B<977599=;;;8989?<BH?\stuvuvxz|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIHPRQOMPQNQRTVXSRYTNYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHFGHBAGIEEFDMRPaWRWQPSSRU[OOQWPMIDF>:96587979:365795<B=essvwwyz{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKTTSPQUOLRSTWXTTXQLWYZVXXVXY]WWXhsk]Vaskaa_^da_^YTQNNNLIHJKIIFCQPS[WTTNQSYS\eUOSTQNKIHC?A9988978857578599Gnrtxxy{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTVUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLORROMMNNNLJFQPUYSTOJNOUST\VRUSROMLIHHF?>=:787659967675Wpptwyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOIGOPOOMRJOPOPNNOTLMIPOSTU2=XMI@Q=caQSQPNPQPNNMQNTRPRMILJORPRRSTQROLLKLLHCBA=::876;B5566:doruxx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJIGEHLHKIFLMPMG/E_R>3?>joaRRQ@GUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptvz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@=;=?ABAC@BEDA@GHGHEFHJMKEGCORC8ENS]fSQSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Spruy{z{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTXWUMLKI<987;?@><=A@B=>EHGCFFIGJJ@FAA@FHEJOHPRa\QPRNSOOPLLOMKMLMON[WKMQOGIHCHJKLJFFFD?BC><BG?B?Adptw{zz{|{zzw{wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHDD=9779?B>;?B@@>ADIECGGIFIEBB?>=CBAGIDMObeQMNNWKLMKLMMMLKNNSdNJLRIIIEAHJLMNJGIFBAB@?EFEHDKnovyyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHJD?A=999:?B?<@BBADEGKFCHIGGHCC?B??@A>DECKNRTLJIMTFIIJLJKLIJLMOPRPKGCLGCBJJLMONIJIGCCCDIJMLIYrmwyxz{{y|vrpurtxyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqhdqHKDGHHGJKIJKDGB=>=:::;AB?=BBCCGFILJDIIFGGCC;A@B>@@BECIMPHHKGHKDHIKMHJLHIJKJM\RHHDNFADKJMMPMKMJKFGGJMNQNLbmivvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoiktgdoFKCFEGEFFGEGBC@=<=9:::@C@>BCDEIEIJLFIIGFFDB;BCC>@CCCEGLNHKNHDHEILNMHILGFGIILNKIHENIBFMLNMOMNNMKIHIORQRNRfffqosxu{z|lhjnekqlsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFECCCE@DB>@?:;;=:=>CA>ACEFJFIHKHGGGFEC@=EEB>BDCCEGHIGMPJFFGKNOKFHJFEDEIJHKIFHPKCIMLPMONOPNJJHMRUTROWd`amgproryzgehhdilfqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLGEEGCBABD=BA>A=9:=?:=>@B>@BDGJFJFIHFFGECBAAFFCBCBDEEGGHFLQLIOJJLLIGHEGFDCIIHKJGKRMBNOMPOOOMNOKKKPUWVUTX_^\iaminhrsbefedihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGHFHBB@DD<A@@C<89=>9?<?B@@@DFHEHFFHGFFDCECDIECFEBEGEFGGEJMKHQMJKHHIEFHIFCIJIKMKOSNDQRPQRNPMNPMLMSWVWXVX]Z]d`hbjigk_eefcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqioyMHGHHBBBFD<?BBD<7:>>:>:@B>??BEFDFDDHFDECDEFGJEEJGCGHFHGECFJJGMJLKHJLFIIKHEKKLMNORTOHSUSPSOQMNQNMPWZVZYVZ]ZXa```^hec`dfhgjihjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprrxNIHGICACHE<@EBE=8:>>=<<AB<?>ABFCEBCHECEEFGGGIFGKHCIHGIGFDHKIGKHMKJKLHLKMKJNLONORUVOKUWSQSQRLOQPOTYZY\ZY[^^^`c^\ackb`dghr
hgjfjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvotMIKHJFBEGE<@GCD@:<>@?>?BA<@>AAFBEDDIEFEGEHHFHHIKIEJHHKHFFLIHHJGLLLLLIMKMMMOLPPQUVWOKVVUSSQQLOSRPV[[]^[\^__a`ad]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvnvJKLJLGBEDE<@FDDC;??A@@@CA?B?ACHBFEFHFIFFDIHGIHJMHHJJILJFJKHIJJGKKMMJJMLNNNPLOPRTXVMNTVTRRQPLNTSRW[^^_]]`_`aa_acebchbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvowKMLKMGDCAD<?EEEC=AACBBCDACDAAEGCHGGGFJGDGJGGJFILHIJMKMLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSQW\ZRWPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBCEGCCHECHIIHIKGDKJGHJIIKHJJNLNLILHJLKZfJd\KlSHON_nUks[qpbwcSPbvuhucav`Xnqbdvinzf[lt`lkT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJJJFC?@B?=DEFDCDBEEDFBFFGDDJEEJLLJLLGGMIGIKHKKIKKNLMMLLILML[sbdp^lmUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemxlkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIHGED@BB@>CFGBFCFEFEDCHHGDEKHGLMNKMMFJNHJKJILJJJKLMNNMMJMMM[roonpplkMPQlWNibtrpamnu\YlQ\mmZqmkomxxtsip\_rkqjUuyxpc^kfbgppjjopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryIKGHEEEBBB>@@FGBGDIEEEBFIHHEGLJGMMNLMNGLMILKIJMIJIJKOPONMKNML\hdu]lqWlNPQmUZk^klvaldsSecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHMGIDEECAB<BABFDHGLHECCHKHHFJLLFNKLSRLGLLHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt]nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEEEA@=CDBGCHIMIFCFJLIGFJMLFOJKWRKGKJJNIHJLIKJIHJMMMMIKKKSkbZi^_icrrZ_Yjo_eeUk_c[aaQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrvtwrGGFIDEDFA@AEEDGBHJLHFDGKLIEFJOLIPIL[QJEHHKMIHJJJKIHIGKKKLGHKKLLLKIKMNT[\TPTLPONOOVQOOQNOQJINPQdqiTYW\[\UYZ]X]\\cfaaebcf__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFFAEC@CHDFGCIKLHFDGKLHDGIPKLOKLWLIEEHIJHIKHLJHFGGIGHIEFLIJKNLIP\W^P\[`^MXYS\\b^MYZMXaRJYaZR_d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCELMBDDBEIEGGFKJKHEEJJKFEHHPJMMJMSHGEAHFJIKKILJHFEIFDFGEEJHCJMKLU_Y`X`a[`TXYT^^Z_RY\P^\YN^\^SZ^c^Z]`c`Y_b[`^[TXWY^]cbcacfhekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIDBBCGHEHGHKIIIDFKKKFFIJNKNLHLNGHF>GGLIKKJLKIGEIDCDDBFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQYVU\Y]c`__cdbhomnllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKFCGEBEHIFGHHFFJGHFHKILDDKJMMLKHJJHJF?GFNJKKMKKKIGGCD@DAHIB?IJHP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QO\_accccb\dcbdcfXQUTR[WZ`_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKJFFFHGFIFFFILJNFDKJLNJLIKJHIFBHHQMKKOMKKIHGED?ECHHAAGFET]Y^X_Y_[]UXXP]]QKJV^X^[]UY`RQ__bb``bb`cbaddbXOQQQZR[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAGFDGMRHCQJFHHHEFKJMPEFIJKNLLILLIIGDHKQOMMPLMKKHICDAEDHGBAGEDWUE\T^SV_XNTUNZZMJKT`a[_X^^a]NYb\``_bcb]abW__TPNOOWQ][[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPCV^IGGHDFMJPPEIIKKNLKKLKJJGEJMQQNOPMNLNHKADACDFDCAEFBMHBKLPONLFMFGIJHGLKMOPILOPOSOLQSRUZYWYXXdWOSTPPNMOTS[XXZ]\`adecgcklpsrzy{z~{}{
}KIEEGFGDKM]LGGXLGHJHGMLQQILKLKNMUNOKKLGGKPSSNPONONOHKF`ED_LDfcEM[I^[rmOMUmYLCP`UkWgJ]WU^DLQULLSVQRTXWTXUT\UPfZhhdXRjSWVT[\[``aaab`fhfnkhrz|}~}|zr{z{
~z{LHEGFHEEKOSIJF`SHJOJIOMRQKMLLORUROOJLNGHMQ[YOPPNOPOIJQQI|YYqsXPmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[`VVXjtuu__v_Xa[\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMNBDLLFIKEQVLKOIKRXWQNOOMQTNOQPKKNGMPS[ZTQROPPPJHZx]TxehZRTQvgtlpbnfjQrOMwmjrpsrqrpoo]ezuxqqzq~s}ku}bRh|essosr{|o}yor_``baZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHJJGJPOMMJNV^YULQSNXZMSSRNKOIQRSYWWQTPPPQKHgxlcxrm[KMUypumubnvPdeJfvqmwojfxxiWrQhzmijzz}lxzohoYvvjuup`rg|ilx|o^__ba[]bdgiidgbcdllppstsssyqrxblugry{ssuy~suzn|}yxrnNKStNCBEPPHJKJKPOOOMPZ`ZXKTWPa^RVQYRLOISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLiy}x`y{sna]mocRhqunmypwlvttqlm]t~zkmy|ktl|kpvux^__b^]_ddighee^abiiijknokqnmjpacfdowxompsy~nqpj{ztromLL[VHGEGRPILMJKPQPPPQW\XUMUYUfXRRY^SLNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajg~vULWkh}lmlx_[pz{^`zscroxqhe|ir{]ULl`vukiu{{m~xk|p]^^b[_bddgeeebZccikkrsrwglihdg`akagsrlgmmr|kmhk{tmmkmOHJKHIIHQPLNOLKRRROSRWRVTPW[VVTTTa`PNMKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXXRNPUTXXX[ZURSW[WXWZOSUWWXR]YW]VTPYRWWWWX^[gr^[[Y\]_cZ_ccdfdccbZccffemnmueegcaf_]g`dlhfgkhpzhggkujhgilQIKLLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYXPOLMVTPNUSNOMLQPKJRQKQMKKORURQQSSIHLNOQRQQQTVRXW\WSSPQUUVSZQOSRWVTYVTYUTRUTTTWXW]Z^a]\ZZ\\`c[]bcdfdedaY`acabhhincad^_c]Zd\bma^fefmsdihkkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXSQPKOWSPNUPNQNKSPMOUSNRNMNQTPTQSTUNKMOQTTRRQVWTYZ[YSURTWWWY[TOTUXUUZUWYURRXVUW[YZ_]UX^\^]\]aa^[bbcgfddbX_ab^`hefda^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTOOSQOQZYXWXZZXYV\jdVXYZWVSTOJNVTPOTPPPNMQQPRXTQQOMOSVNWRTUUONMQSUUTTRTWVZ]\ZVWQRWXV[[WQTVVVVYTXXURRXVUZ]Y]_^V^]^`\\`___ZbbdhgddbYb`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQPU\ZZW[[\YZ[dqmhd^[YVUWQLMVSMNROQROLPSRUZUSPPLPWVQWSSSXMOPRTXVUUSUYX[^][[VROUVV[[WRTWVWXVTX[TSRZWV\^Z^_`Ua\aa^`b_]`]c`cghdf`Zc`a__ed_`c[Z\[\YZXYW\Y\[`^_[^^a`^b\Y`ZQNONVQPTROUTSPW\]\X^\_W\^jqwyb\[VVXQMOVSNQQPRTRKQTTXZWUORNSXWTSURRZOPSSV[VVWTVZX]^[[^VSNTUV\\VRTVVXYSTY\TSS]XZ]^\```Vb[cb^ac_\bab_cfidf^[d`a`acd_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUURQWRTP[]^^[`\`U\]ijr}slg\UXWPNRZSRQSRTUTKQWV[ZZSOSRVVVTOWRSZRTTTX]WXXSX\X^]YZ]TUNVWW^[XRUUYYYUWY\TSV^Y]]`]bb^Y_[eb_dd^^cca^efidf^^da`aabd`b^XZ_[\[XXXXW[Z\`\[[\[XZ[^V^Y]POORZPZTUVVTTT^^`_^b\`U]^bkytl}lZUYUQPS\TUTUTVYWLRZW]Z\ROUSXVVTPXRSWSVUU[]X[YUZ^X_^Y\YRWRYXY_ZZTUVZYZWXZ\VTZ^\^`a_dc\^]]eaafd^^dc`\gdhedb_da_a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX__aa`c]`T]_beeuzhXYYSVSV\XWWVVW]XOU]Z^]]TRWSWVTSTXRSVTXXX]^X][V]_X__X]VQYTYZZaY\UVX[Z[YYZZXV]__^cbadd\b\`fadfd_`dbb[fchecfaf__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNTZVS\TVWYVV\`abcac^_V[`da_zuohY\ZUXTW[ZY\YXY`WPV^\`a\TTXPUWVTVWRSUWZZ\_^Z_\V__Z]^Y^VSYWYZ]bZ^VW[\[\[[YZYZ__``dbcdebdZbfcgfe^ab`c^bcidcg_g^bbcaa`^_XT[ZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXUXWX]_badad`^YYadb`lfh^\][VWXY\\\_[Y[bVTX^]ac\RVYPWVWWWVTVTX\\^``]a\Wa^[^\[^XVXX[[_`\_XY]\]^^\Z\X[`a^`dcdeefbYceehgd^ca`ec]eidei_g^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNRWYVWZX[\XWY^`baeada]^Yacb_a``^\\\WW[[]]__\Z]cXZX]`cd_RXYPWWXYYWVWV]]^`a`_b^Ya]]^Y]^YXVW[\`^]_ZZ^]^^a\[[Z\_b^bdcefefbZdffigc_c_afeZiicfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxLWW\YW\[\]ZW\]_`bdbba]`Xbcbacab][\[XW[\_]`_][`d\\XZbec`R\ZOXXZ[[ZWZY`]`bb`ac_\b]_][^^YYUX]^_`__\Z^^`bc\\W\^`bbcedfdefd\efgifcab\dg`\iibhife`baca_`_]][Y\YXWXYXW\[ZWWXOXZ]acffrkJYW]ZZ_\[^\X][^_acbaa]b[bdb`bbb\[[ZWXiq`\`_]\ac_^YYcedaS_ZRYX\]][Z[[c`bbc`bda`c^`\]^_ZXV[_^]aa_][`abeb_]T\``cddfegeffe^efhhgdd`[eg^ahhbhhfc`b`cb___]]\Z[YXXXVZV\ZZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{{{{{zzzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{|{zzzzzzzzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½°Á¾¾¾¾½ÊÓÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊ»ÎËËÌÌËÛæååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyyyzxooppppprrrrrrrwzyyzzz~||||||}}}}}}|}
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwtvwz{x{xwvx{xyyy}zyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{zzzzyyyyyzzzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy||{|{}|xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwwy}}}}~}xxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww|z}|}~|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz~{||{~{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy|zzzy|xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrsuuttssrrrrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqsttstrppqponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqrsrstsqsqoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrrrswssrooopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpqqrqprpnpppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqrp¤uo{¤oppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqp¯m§pqppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqrq}®¢p¦qqqqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrq²©¡±prqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssssssrsª¢³§«rtsssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~~|vvwwvuxzxxxxxxxw}§ £°¡{yzyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~}||||¦¬ £¢zzyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}~}~ ~}}}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~¨©¡|~~~~~
~~}~~~}}}~~~~~~°¥¦¡¢ª¥~}}~~~~
|||{|}||~~~~~~~~¡²ª¦¡ ¢¨« |}||}}~©®©£¤¡¢¡ ¢¤£
}||~~
¡¢
}}}
~~
}}~~
~~~~
~~}|}
~}}}}{
~~}}
¡
}~
}}}
~}~~~~
~}~
~
~~
~{z
~}}}}~~|{|
~}}~~~~~~}~}}}
}|}~~~}|}}|y|
}}}~~}}}}{zz~~
~~~~~}}}~~}}}}~}|zzz~~}~~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~}~~~~}~~}|~~~~~
~|~}~~~}~~~}}}|{{|zzyyy{~~~~|~~~~}|~~~~~~~~~}}}}
~~}}~~~~}}}}}|||{zyyyx}~~~~~~~~~}~~}{|~~
~}}}~~}}}}}}}}}{zyyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~}~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}}|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}}|}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{{z|~|~~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~}~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}|}~}~~~}||~}}}}|{}|~~~~~}|~}~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~~}~~}|~|~}~|{|||{{z}~~|||}||~~|{{}~}~~}{{{}|{{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|}~}}}{{}}|z||~}|}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~|}}|||{~~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}}|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~~}~}}}|~}|}|}}}~}}~~|{{{||}|{z{{yzyyy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}}|~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~}~~}~~~}~~|}}|~~~~}|}}{}}}|||||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~~~~}}~~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|z|z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||~|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z~y{yx~{|{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~}~~}~}~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}|~||~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~||~~~~}}|~~~~}|~~|}~}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~}}~~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|{}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~}}}|}z}{yvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~
~||}|x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{~~}y|zzz}||}z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
{||}zz|}}||z|~}|}}~~~~~|}}~~}||xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwmzsnym}rsvsvmnwlpylu}|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}~{~|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}z}{|}}~}~~}~}~|}~~
}w}~{|{~{||}~}|~}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}~}~~}}|}~~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}}|||~}|}}|~{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~||}}|}}|}{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~~||}}{}}|}zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{}}|}yzzy{}}zz{{}|}||zz}||}|~~{{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}|||~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}}}}}}||}}|
~|~~
}~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z||||~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{yzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÕÕÕÕÕÕÕÔÔÔÔÕÕÔÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÕÕÕÕÕÕÕÕÕÕÕÕÕÕØÛÜÝÜÜÜÜÝÜÛÛÛÜÚÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸ºÑÔÔÔÔÔÔÔÔÔÔÔÔØ®|ÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVM<::77>C>8>:??A=?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¢§ÏÓÒÒÒÒÒÒÒÒÒÒÒÙ;DDDDDDCCCDC?\ÓÓÒÒÒÒÒÒÒÒÒÒÒÑàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤£¨ÏÓÒÒÒÒÒÒÒÒÒÒÒÙ@HIIIIIIHHHHC`ÒÓÒÒÒÒÒÒÒÒÒÒÒÑßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©¬ÏÓÒÒÒÒÒÒÒÒÒÒÓÙMTTTTTTTTTTUQjÒÓÒÒÒÒÒÒÒÒÒÒÒÒßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÔÕÕÕÕÕÕÕÕÔÔÔÔÕÐËËÊÊÊÊÊËËÊËÌÌÌÓÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÓÔÐÎÎÒÔÏÏÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕ××××××××××רØ×ÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?89:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎЦÅÑÓ¹ÐÑÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒª¬Í³ºº¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?><7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐÉ
¥¯ ¢§²Ñ}~¯°ÑÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@B9647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѤ°½¡ÇµÕÓÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÐÕ¹¤Ú¤µÔÓÀ ÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÐÑ·Ø¢µÔÔ¯¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ×××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÕ§¤ ÒÖ¢µÔÔ£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJACFDAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÒÀ¢ÉÔÕ¢¶ÔÎÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÔ¤ ·ÐÖ£¶×à ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==:::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÈƦ½¦Ú¢´Ù±¤§ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÔʦڱÆÖ¹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÔ¯°³ÑÓÑÃÔÒÒÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=>AELLA=775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÔÖÖÖÓÒÒÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ=>786967899;;=?@<<89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;877797799=?A?<:9@?<>B?:8776=?@@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98868975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELBA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH@E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@<D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¥¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¥££¢¢¢¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=6789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬¨¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥£¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢ ¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=AC@DA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡©µ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡¡¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?B@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¤¤¤£¢¡ £¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££ª©£¤¢¡¡£¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¢¢¬¯¡¡ §s¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡¡ ¡¡§¢¤ a| ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ §¥Yy ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¤¤Xt¡¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¤¤y_o¢ ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £ xii£¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¥xje¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡¥wjd ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡thb ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y yzylb^ ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ wwma]
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|vr{td
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{xZln{s}
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}rtdOu`\qs{}|¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
~} _KIt|ZJakz
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~xIBEtxmU>Lds¨®²¯°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¡¢ aS[JtrcWFESl ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ªª©§¢¥¨©«ª©¯¤VTt|l\YmU_w¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®««¬¤¡¢¥©§§©£tjÀ½Po_{kVn¡¡¨§ ¢¢®««ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©©¤¨¦¤¦¢¡¡eƽe©¡^q]`¢¢ ¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]\PUOXO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤ ¢¡¢§¡¦®¦¦_µ¾Ê¤©uh¯rW ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_[UYQUW[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?B?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡§©±²¯«££¤m¨Æ¡F¬X¡¥¤¥ ¤³¥¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocmjib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ £ªª§¸Á¾¹¶·³®¬¯}{l» Wg¨¡¥¢°¾ ¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxjb[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ «²·ÏÞÞØÍɼ·¹º¯xdj§£{hkrvz
vo¸©£«¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvlphiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°²´µ¶»Ã×àØÎƽº¶®xjPczrmhhnkllkf_Zw²´ªµµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`fsotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃù½¿ÄÔϹ®©¤d_J\|npwoihb]_^a`^ZTn·²ª´¼°µ¶¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuvnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÅÁÅÉÌÆ¡|hWXISkefnhbe`Y[XZZYUl³¹¢¦±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|~ifhaklgnvqruqg^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÃÃÆÆÀ¯tmdZVWENgbajd`gfYZYXXTf³¼²¦ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|~tklndomiqxnyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄĹ´ÇºYSSWU@Ofdaid`fi[XWXSb©¸³µ¬®¥¤£¨¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyy{wnkihuZfrxsyff]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÄÂIJyQKNO=Qcbemf_dh^YWWdª»ª¸µ³¬©£¡©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh]jonyxcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈǽOMM@Mg^gkj`ba^\Yd¥Á»º¼º¼¬¦ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvhiitmyl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÌÉÎÅÈ¿|SNEGo`aalb\]^[]ÇÂÄÇÁ¼¾´±°°Á¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`kjwlieuntb]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅîTMHjc\_n]TZY[È·¿¿ÀÀº»½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegcjdbjmno^Y]VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÁÁÀÄÁûTIY^myPPSVÈï½½¸¹»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbacdcjcgc[ZZ\YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÁ»¿À¼»Ä½ºÀÄÁºWGNEKZ~¸Ë¾°Á¿º·»¾ºµ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabchjggjfi]VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÖ»¾»Ã¶¹Ç·µ·º¼º¹nJx@Z¶¼Á¾¹Æ¼Â¿¼Å¸¶·´¸¶¶»»¹¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeefoielhXXNKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÐÅx¬Ë½Ç¸¹¸¶³¶¹³¶´´|V ¿À¾½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksfbm`\TIKJDJCCG>:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄ×u½ÈÏÂÀ¸®µ´º½·¸±¿¿Íÿ¾½¼ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qflintnxcgb\cQKTHEECGB<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÇÉÑqu°ÑÑÌÊĵº¿ÃȾ¾´¿Ã¯|iµÌžÁ¼¿ÃÌÊÇÅÆÀ¹¾¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_c^`aNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÊÁ
st¨ÌÌËÍÊÆÂÃËÎÁ¼¸¼º¹uX¶ÈÆÄÀÀ¿ÄÀÊÊÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmx|`qc[^__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»ºÛ¾¶¾À¾¾º¦ª³·ÄÀ¥ywzÄÆËÈÁÃÀÀÉÊÁ¿»º°¶vVµÆÅÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxshp][^]YRFDCMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Å´m¯Î½¶¹À¼ª}nhnmtsy~¾¿ÇÀ¹À¼¾ÅĽ½¸²¯®nT©ÅÆÃü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wlu{pni[__YSPAFHGK@ECH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀͰu´½µµÁ¤iZ^`NS[\ptx£¸·Âº³»·»½¿º»»¯¬lWÅÃÃþ¼¿»»¸µÁµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_f][TJ=??GF=GCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹ÂÉ¥x¢°µjfgUY_IIMQTny¨°·¾¹²µ²¼¹¼¶¹¾±´¨o_ÁÃÇÃÀ½¿¹³¯²½º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_cb\^OIB?=IDFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Æ§{v¢`SCYUHbjUOEJe£®¯¶ºµ´²¬¼¹¸µ¸Áººlz¼ÂÇ¿¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²º¶»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wp|ovrnc]gX]]SOMA>JBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿³ynNJ@eYBPxhLC^±µ³µ²´¯¬»º¸¶¹¿Ä³z¨¼»¸µ²±¤¦§¤¥©®¹¬««¥¨¤«®¯§°¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuil][jT]\PNHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³¸µ{XFBQXIJYxbAU¤¹³´²°±°¹¸¶»·º¿±²ª ¹®©««£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wryiutndUacW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²»©hM@TyqOIIKhZEV±»±¬³¯®¬¶¶²´µ®©¢§§ ¨©¡§¤¨ ¢¢¡¥¥££ ¥ ¤¬¥¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vzcwln]QhTPNGPMLBPQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Áª¥½fDS¡PXIK`IXaee¯µª²´®ª«¯°²³¥ ¢ £¤¨¢ª £¥¨ ¡¢£¨¨§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uv}mk{dhVRdMJHGORNJNH<E@<2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© «Æ¿ËNAuoPnJLcfvua]bs²¯®³µª¦¬«¢¢¢¤¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¥¢¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wx|dyy`bSU`HIJKSTIRQM9?B67<65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÇÆVRKf£Xg}or[Rkc\gbam´°°¸¬¦¡¢£¥¦© ¦¤§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«º¨¦«§««©¬¬§ £±®²±´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshlf[SZZMQJOOULSMB7>B78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yUiqwuodwvXWb`di[ZWh®¬¯§¢ ¡£¢¥¡¤¤¨¨¬©¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¿°¬±®©ª´±°¨«¨²¶¸³¸²´¤ ¥¬¡¡¢¡ ¥¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xujwu^m[R`HRUHFUVJCMG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ £op`cWL[SZLLQYRHONH¬ª©¤§ ¨¥±ª§®£«®¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÂ¼·¾³³µ¢¬¢©¨²©ª¨§¨ª§ § §¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmivmhm\X\CWNJGMGCFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£bW^e`WMQG=?@CD?>CRx©©ª¥¢£
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÄ½Ã¼·³ª³ª³µ¯³®ª¯£¬¨¶±£°¦ £¯±®°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤{trkktrqhV\QFTIDJPI?EA4FH95<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`PFE;B>F<>96N~ª³§££¢ ¥«¥xm ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÄÊÉÃÁƾºµº»µ»·°¶²ªº²®»·¿»º«¸«ª¸»µ¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkchoxkeZ[FKLEDTMDCE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;?>=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}riaWNE>IZ|oaA=\®¬ wrqmp¦®´¹Å»ÍÇË¿ÂÌÍÍÌÇÉÑÌÍÌÇÉÅÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÂÅÆÆÊÈοÈÑÌÇÅÇżÃÁ¿¿¿¶¾³®¿ÀÃÃÇÄÇÄ®¿¸²¸¼Äº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLDFPIDC@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A?<@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £if\TID@?J¤ ²£yqroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕ×Ñ×ÍÆÇÉÌÃÅÊÏÊÓ×Ò×ÒÕÖÓÔÈÌÆÌÍÉÒÍÎÓÍÅÈÊÊÁÇÌÇÉÈÆ¿Ã³³ÈÄËËËÏÇÊ¿¾¿½ÁÇÅÍÌÉÉÀÃÀ®¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDNF@JQB>B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>9:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡aSLJDC?CT±Ñ½²¯¦ ¤¡}xpkebhqoq{
upnqtp
³Ã¾ÅÑÐ×ÖÖÒÖÎÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÖ×ÓÖØÎÒÊÏÑÌÏÐÌÓпÈÇÊÄÌÌÌÎÏÅÆÇ¶¿Ê¿ÒÍÌÐÆÉÈÀÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨|xsvpc`drb]R\IJGAEIJ>;A8=5586;85:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢¡YI@ADAFQv²¯§ wica__`_^__]blutppolrquÄÈÆÔÖ×××ÓÖÐÕÔÚÔÔÎÏÕÔÔÑÑÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ×רÑ×ÒØÙÔÖÌÏÏÊÍÒËÎÐÀÆÂÈÆÎÎÑÑÒÈËÍÀÊÌÆÓÏÌÎÈÅÊÇÇÈÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·ØÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£«eC8=>DXª¨}pecb__a__aa_``_`fnppnkorwwÌÁÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÕÍÏÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÎÄÉÏÌÊÌÀÉÀÈÊÍÎÐËÐÍÎËÎÏÈËÐÐËÎÊÂÉÇÉÌËÌÒÓÍÓÒÑÐÐʽȹ°®»¹µ«¶°¨¸³¾»±
zvopokadnpaW\ZIFFDMXE;@=33<<87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¥¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÁ±©¬©¤±yHFB;W¡k^^^adb``````a^__^\bmroostvvy¤¿ÌÕÑÖÔÓØÖÎÎÓËÎÎÅÎÊÒÒÏÇÎÍÍÔÌÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÍÂÈÉÃÌÃÅÈÊËÏÊÍÍÐÎÓÌÆÉÏÍÈÇËÅÇÁÆÊÌÍÐÑÇÐÏÎÍÌÐÅÇÁ¸¹½Ã½ù²²¾±»Ãõª¥¡yqrkmg``qhYXhVMGLIPQB;C>;6898::57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?;<;<=8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨xlpr{|eabb`]^acb`__`aa`_][]grqqrspmry¥ÇÓÏËÐÐÓÔÊÅÉÉÆÇ¿ÃÅÏÎÇÅÇÍÊÒÈËÎÎÆÑÒÐÍÌÔÊÇËÎÏÇÇÏÒËÐÏÆºÄ¿ÆÊ½ÂÇÉÎÄÂÇÀÇÍÈÄÌÊÌÏÈÄÄÐÈÆÂÆÈÅ¿ÁÇÌÌÌÏÂËÌÉÇËÐÄÅÇ»ÇÃÉÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£xotdk`^fqa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ½¹ÍÌÆÐÕÕÙÚÛØÐÉÏÏÑÓÈ·»»£¶}h
¤«
}~s_[^^^`^`cdc_\]^_``_[Z\`krrookloo}¹ÑÈÉÊÏËÍĺÀû»»º¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈËÍÉÄÂÊÉÁÁËÐÅËÈ¿¹Â»ÆÇ¾¿ÆÏËÿûÉÇÉ»ÈÇÅÊÀ¾ÂËÆÅľƽ¼ÀÃÅÌÅżÀÊÃÅÇÒÅÁÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¦£ |wstfiZanmZ[XRDLFBGDLDFS@54335?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²¯¶l^y}¢z
vxurp_Z[]``bcdded`[\]]_^`[YZ\borokilposǽÊÅËÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÃÉ¿ÁÉ»·»ºÆÃ¿¼ÁÍÃÆ¾¾µÁ½Ã»½Æ¼Ãº´¼ÆÄÂ÷À¶¶¾¿»Ìü¶ºÈº¿¾ËÃÁÆÂÅÉÇÉÆÐÆÂÌȲÇÉÃÎÌÁÅÿ½²·°²§¨¨¹°¥°ª¬zvwjdg`hodV^YJFJEGKAEBFJ@9:648854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÎÅÉÅÇÁ¹Å½¬®¥_dux~{ttc\\]^``bcbadeb]\[\^\^]Z[\^hsqmggnory½ÌÀúÀ¸°±§ª¬§¸´¶´³³´»µ¾±¶°µ¯²¼Â¼ÁļÀ»µ²º¾À¸È¹´»·Á½·¼ÆÁüµ®²µº¿´Å·»µ«¸½¾À½±»¶°¶º³Å¼·¯»¿µ·´Å¼¾ÂÅÀÃÅÆÇËÅÀÆÆ»ÇËÀÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÐÍÒÏÍÅÇÁÆÀ¿º¸É¶ª°[ho
zx~vw|sh]]]]_`_`da^cec__\[^\]^Z[[]_lpnhfknnr|¤ÇÀ¸¸µ°«§¢©§ª¬³ª¬©´®·±³©®¦¬³¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶¼Ç¹Â·ª¨°²À¶¸½°±¨±³µ»¼¬®µ¦®¶®»²±ª¹°»®»¸»ÀÀ¾¹Ã¿ÆÃÅÁ¼ÆÂÈ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÆÉÌ˳¹Ã½»³swvkiablhYWW[ALKMJEAC?FA:9:995854::9;<=;:;>8;@<=9:79=9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÏÇÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³µµÃ®ª°[j{x}
z{wn^]\\]_`__dcadcb`_]Z[ZZ]ZZZZ\enohfgiknrº°µ®¥¤§§ ¤ ¥«¤¨¢«ª¬«°£¦ªµ¶±½¹¯·°¨®¸´´¼¸´½¯¸¹µ²¼À²À¯¥¨£«±²³¨½ª«¨«¬µ´¦¨®¡¤¯©²¦¨¨®¦¨·±²·ºº»²¼¾¾¾Ä¿µÂÁÇÈ·¾¿Å·Äÿ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©stsji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁʾ»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ»¨«dmz}~xt~|swe_]\\^_`^_ccab``_]]\ZXY[[YXZ\_fkfdgehjor
ª¥¬¥¡¤¤¡£©££¥¦§¦ ¤¦¬²°¶·§±¨ªµ«´¹±¶¶®¶¹²°ºº±·¥ ¤¦±¨«¨¹ª¤¦§¨§² §¦¤¦¬§£ ¡±¬²´³´°µ½¶»ÁÀ²º¾ÃÁ±¹¹Â³Á¾Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ xplbf`ko`UY^HNgOTGFKF<=?=:;;825536999;9::<:7<?<<;<88<9;:;78::<98>:?=98<:;=:7776788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÂÆ¸¶ÇÀÌ¿¸É·»Å¸³Ä¸³¿À¬¶¼²¬¥¯³¡£ir
|xusomjjipi^`]\\\^__acb```a]\[\\XYXXXVX[^_dcbegggkmo©¡£¡¢§ ¤¥¢§£ «°±µ¤©ªª¬¬¤´¸·°¬³¶¯³µ¯°ª£¢²¥¦©¸¢¦¦ ¨¬« ¥£°©«§««¬°²¸¯¸¹º°¶¼»º«³²¹³¾´¶²±¶µ¿¶¾À½Ã»º½zsk_e^ddXTW]IW\KPGJJGA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÃÃϾºÇ¸¸¿·²Â´±»»¬ºº±¢©«§m~
xrmomkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bddeffhikq¨¡¢¡¨¥§¢¥ ¡¯®®¯²¡¥£®«§¢µ°²²¬©¯³§º³¦¶ ¢£¡£¢ª¶«££¦¥¦£ ¢«§¤£¦«²³ªµ°²«²¹´¯ª¯²²³¸³®©¬®²¸°º¶º½À¸³±
yuf_f^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿²¥£¥±Âµ¶½´¸ÂÌÈÆ¿Å¶ÁÀÇηÀĽ³¹¹³¿¶±¹»²´¯¤ª xxoqtqhedhdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¡ ¡ ¡©¤©«§¯°«£¤¸ª¡ ®¨¶ª§§±¤¸°¤· ¢ª§¡¬¹¯¢¡¤¢ ¡ª©¤¢£ªª°¨´¬ª§³°¥«®³±°°®¯§¨¨²±´°¼´º¸®£zve_aVYXSRSKM^LOKGGLLE=A><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ̲ÁÂÁ¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbcdfi §¦¤¦§ ¦ ª¯¦¢£·¨¡¡¢¨³¢¥¨¥°¥±®¬µ¡©¡¢±±££¡§§¡¢¤¥¥«¤¥°§¥£««¦©®¯¯«¨ªª³¦¦¬¯´±®¼µ±¯¯ zwsea\[]XNLQGQaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥¦¬¸»¼Áź±¹µÄÉÉÀÃÆÅǶÅij¿ū··½¶½ººµ²«¨£t~vncafihfgifjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWUTVURTRU``_`a_aabei£ ¥¢¦¥¥£¤£ª«¥¥±ª ¡¥ª¨¢®¬©©®¢¢¢¢«©°¢¡£¤¡¢ ¡¤¥£«¥¢¤ª£«®¥®²©¦¥¦¦´¦©¨³µ´¹º°ª¬rpp`[WVVRFQNHY[ORITKSLEFID8;;=<8667:9;:976977:;:=<<6;<8>698:88659:;<97?<9578452121..1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀɺµÀ¯ÅÈ̺ÁÊÌȵɼ±¾ÃȬ±¸Áµ¼À»´´ª¬¦r{tiiilgjlmkjle]\\[[\ZXZ][[^``\XXZYXWXWTUVUTUURRNQY]\]]^___bdm£¡¨©«¨¬§©¦¤¥¯¥¥¯© ¯«³ ¥¦£¤¡©ª ¡ ¢¡¤£ £¡¢¨££¨« «°¤·¦£¤¢¬ª¨«¯³·³¾µ³«¯
tsh[XYSUREXLQ[XMTNPLQRINIB=??A?=75799<<977:79:;<=>;7;;:=58:;8976989:6:=99577570141-+/434988::8::748=8?9~³§³·®©¨¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»ÂȰ¸¿·¼½»³µ¦© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_ad}~¢ «ª¦¯¬¨°¥© ¥©§®¨ª¥¡¨«¥ ¡¤¡¢¥¦¨¨¨ ±°¦±½¨£¬´ª®§°µ°¹µÀ±®±«~rsbVTVNRJGVPSQLLWMJMORGMKACFDC>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576761320-*.102877;99;8948;8@8³¬¥±·ª¦£±«ª§©²±¤¶Æ´¹º³ÊŹºÁËÐʱ¶·¼½Áñ¯±·´´»³´¢£vkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\]]ajyt© «¦¦¬¨ ¦£
££¢¤§ ¡¢¢¦¤¦©¦¡ ´²§²·¡¢¶¬©¤²²¦µ¼µ«¬±£ysn]NQQLOCMNNPKFNNJJNNQHMJAGKHHC>858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶§¤¶°¥§¤ª¥ ¨¦¥³ª¢²Ãµµ²³ÆÆ¶ºÃÊÌÆ³¬¹½´¸À¯©°¦®º¯®{n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]anruo¡£¢¤¥¢s~{ £
~~sz££ ¡¤¤¢´¯¬¯¥¸¦¦±¡°®°¼ª©¯ªwscVMROPNCSNLPLBPQHINRMHJJDJLFJK=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-02764789::65:87A7x·¡£´©¦¦¨£¦¥¦¦¦³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ¬Ã§¢¦¦¶¬£ }w~fWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUVY[]ikqk~{sNXr_;Vo|s
y{}xqp
}¢ §®©¨¨³¢¦®¬«¨´¢©£sn_[NSRWLDTJPLLFNOIELQMKOJILPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £®¡¦¦ª §©§£©°¨§´Â¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅª£±¢}su]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`lnhztOB?}y`JQnx}
nxuvxpQ{~xvgw~¤£¨©¥¤°ª¡¤¤¦ª¢ª¢¦¨vmf^[HQQSMIUMRILKOIHFJNLMTKQPOFIC<768:8:;;8:;8>?99>=8;<6;;478;7775344696/3/.125221/,')**,4833989:99::::?9w¶£§¡¯¢§¨¥§¨¯ªµ¼¶··³Á»¶¨ºÈ¸¶¨¨µ¶ª²½§¨~}wpoXMKMMNLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZnru~ih\Tt|
{vxsovqtz~«y{hv{prmxxz{vsrwhu
||© ©¥§¤ ¤sha]]JWPRGKXROJLMRJJJLPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937785675252472/2.,//200/-+(().12721987:8775:<;7v®£¡´©¯©¥¬°±ª½´²»¸¶º´±·º²ª¬©¨²°¡vx|vooiXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^t{xfv}gyvx}q|w{ok~}t{|ufv|
logs|lyq}qmvqhq~pC
wwz}{u}£¡¤womfbZXXUQJSUTOPNPVKNKOOJQOHNPLFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¡¦°®«¨©±¯±«¼¸¬»¾¸³¬§°§¬¥©¤
yuq{mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX]eprl§ªÀ~tyb{xo|yz}omytyjjq~Inhx~midly
ksl|nr|inps{~{vottyyp|nioooXVXTRQYORTTRXUMNHNJMNKCHMGE@:89;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥°¢ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡sztotkpldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\_§bisye~pmzvtlts|jjMy
g1vsl~~tfeu
filukq|hqq|n|t~}qpnumwyujyywkkoheXQZWYY[MPUVYXNIHEJJHGB@GDCG=998;9:9<:9;:::@<9:<98>787715234533645031/**+),,++)(+'),,226,,4775478iO8;5n¤¨®²§º¯«²°Â±»ÃÇyqtyprpoodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ q{xl}lq
zyr¡txsu5q¨¡¡¢
vq||t®hgbjnrmpuipXupwl{}mrnp{svnbv
ux~}{rppl`[]^\YX`_RN[ZXWLHJFIG?BABH?CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¥§¯¥´©®±®Á²»ÁÆ}nul{txxlwnwci^JPG>@7449;;;=>@BEHLLLLNPQRTUVWXZXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lw|~
~u¢y~
aªzw~sz]drtz|wmhjbyozowtzptyxkni]v}|
}q}uw{|wpstfg`[[^T\f^WPTX[UGJKDKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À±ºÅºz
vk}xs }|p~zgvkRWL@E211367688:<>AEGFGJKMOQQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJh{y|q|z}~v¡¥¬ªH®¯¯©tm}}hghyn
qGlwryvhmk_v}yzuv|xmow}ttrl[^][ccXge\UPPVYPDLKFNICFCC@@CA=988:::;;:888::?>6;>7595773344236656768;DFLMMLC7+"%'+)+++/00+nu22420L\5=<^t|~
¬¡¦¸¯³½³}tp~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJMNQSTUTTVUSQOGC?80,#[>?94.]ps£UFIKMNPW`XpY\^i
~
¡¡¦»±§»Çè¡¥|qv
ihouqw{v
}nvuf «¢zzyogkx~zsle^Z[]j]af`YOKNWRQIPJDNGCJDBADDA<:87=<:<:88778:==8<=68756623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯±¡xw|~
mpj]B@4--//./02234778;=?BDHJNQRSRSSTRPOHDB<87/9D><<63.lMPHJKKKNV_cggmu £ª¥£¬©¶¢¨Áîǯxº|¡
¢
lpuwqm
r ¤µ©¢~kjk|tb^d_[gk]lk^WKGORQNLLFIPCDMFACEFB=:97=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªge¤~y}
xx~gMR>/..,/.-/000212467;?CENPRTPPQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¥¢¡¢§¨«¨¬©ª¶«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢wz~¡{w«²}£¢¦¶°¨lsr|}ri`]a_agd`gf[REJKPOIILFFMCHLFGDBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}{ªªBD}x|
v^bP460-1/,.00//..0015>ABMQRSQRSTRNSLEE@<>=GG@A@8662<9;FHGIJNOQYm
w£§ª´½¸¤®¬¬§¨´«°¶²²»±³½³Ã¬»É˷ÿ¸¥£°²¬ª£
¦¦ £¦¢«¨¤
¤¡ ª ¤©±£§·º £°¢¢£¡«¯¬²µ¢¤ªzz}
hah\eb]dc^fg_ZODIHSNFHLFJGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjoXz
v
ÚÈsV|z
pna@E64<2/110-,+-1.-3?DAMUQRSUUVUN[PGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÀÇê³Å¶¬³¿³¸¾¶¿´Á¶»º£¸Å¨¶Éǵ¾¹´¨£´±±§¯«¥v¤¡¬²³ª¨®¶»²º¬¯µ¢±¬±µ»·µ®µ §§£§©¯²¹·¸§¶©¥ xvZbeWfaac_`f`[TIDDLUQHIJDIGEA@@KDBMG<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQbcWyuq}u
{¿»£¼´y
zxn]V@EN<6:46AB764//6CHCQ\OQUWU\VO^UIKJA@>GKFED;>@7D7?BJJEFWTP^¤£±´Â¶¸ÁÌɶ»Ä½³³À·¸Áµ¾¯·t±³¥ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°¦¬§¤ ¬´º¢©²ºµ»¾Ì¿Å޽³Â·º¸¾·º·¹¬¬°¦±ª½°¼ºÂ¬º¨®«~}kWdbYkejeW[cYVSIGFLQGCHIAHD>?BBK@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWSYUZvjp~nzsxb¹¡£{z|}}wyueO\dGEL;Qca[^SF?;HPE[cQRYXZgYT``MSPEA?IJHEFA@C<E6B>HGKLSZT^¯¸µº¸É¿º½ÉÌ»¼À¼·µ»»·½´º±Æ`u²¥±«½ª¥¨«ª£¢²µ¡«¨®¥§¦¥¤¢§±´§²³½¶Á¾ÓÉÉÓÇÂÅÌÂÊÃÀ¾½¿»¼·´¯¸·¶Ã¹Å½ÃȰ¹ª¡«¤§¶s`bb^Xb`ifRX`VRUIEENKA>GD=KB=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrrsÕÀµ }x{|ys}zkepuY]\Peeb`ed][XW\MemURmm_n_XgeUYUJDBKJHFHHHGBI9D?HKTTV\Z[¹À¸½·ÆÀ»¹Êʺ¶º¶¸¹²·µ´®¶¶du¨p^¢¬ £¤ª¥ ¨¥¤¬¥ª°·°½¹ÔÑÎ×ÐÉÌÒÌÏÎÊÇÀ¿ÂʽÁ¼ÁÀÄÄÅÊ¿È㤻°´¯«¸¼zl^a]Y^aZccQ\`SPKCAEFE<@E>AHA@D=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ\Yh_onlouu³¬¡
~|s{
{ts{xkmu{hreilifjih`fihlZnt¤¼g[oh]ZZTHKNOJKPKSQHLAJFKP_^bfjb·Ç°¸³»½µ±ÄƵ°¹°°»«²±§ª·¬µ§§O¦¥¡§¬¯¨°¨´´ÔÔÔÖÒËÐÔÕÍÓÏÍÅÂÉоÊÉÊÉÑÇÌÍÃÐÒ¸°Ã¼Ä¹¥¶ºÃ¢pd]]^Y`XYfZQ]WOPBBGDBH;AC>AG??A8;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeVshqoyy ª¥}
|p{r}qxukqx~q{nxslipmcimpxiw|~Ë¿Âß§ncwoc[a`JPRUNY^P]\NPNTQUT[nmvq¸¬³§°¶ª¬¼À°«µ¦¤¸¦«® «´£±¦«¬¤§¢¬ÏÒÕÑÍÌÒÓÓÐÔÑÎÈÃÔÑÇÍÒÓÓ×ÍÑÑÅÒÖÅÀÎÇÇè¾·Ïzof^c^W`S]ZPQUPNH>@FABE<@B?ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMN[u
wlwp}~¡¡y
{r~yu
ovrks||w{swqksripqzyrz¾Ë~²vrwhaj]CZZ[VecXdjSX]\`d^cwz~©¤¤¡ ¨¥ª°¸ª¥´£¡¡£¡§±¦j¢
}§°¡ ¡¥¤¨ÈÎÏÈÂËÑÔÑÔÓÎÓÍÆÖÓÌÔØÖÖØÕ×ÕÉÔÚÍÉ××ÑʬÃÃÌspca`XTZT\PKGJJJ@;:;DAD<BC>HB>BB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
w~xs{}wznxpmuvx}t
|ymvtn}vux|µ;AÅ¥~|ieVICfcecgjdnx[_fhknin £¤¦²£¤³ ¡¥ © ¢±~
z~©£}«³¨§½Ãƹ¶ÆÍÒÐÒÐÌÒËÉÔÎÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÕ¾ËÌ´ywoe^ZSVR[WFGJIEE=:7:@AB:GD@ECADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~
|x
zyqz{uz
zp|oozq|qnzuw}|u{°tX©Â¶pnb=^hrpqpnxveioruxqz ª ¡¥«}
~my{®ª§®µ½©½ÆËÈÉÌËÏÉÃÑÊÔ×Ùר×ÕÛ×ÓÙÛÖÏÛÚÑÖÉÔËz|ji\[PST^HCEIH>A==7:=?;=G=?AAADA>>:86DB755479.566435532323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<::D?CGRk_mdbfkvqz~||~wyo{{uz vutu}toot|
zv{·Æ¥ÂɸwpeNfczw¢xyv{{um¥ £«
z|¡¼¡©¦¥®¨¶¿ÀÀ¹ÇÉÍÎÅÍÊÑÖÕÕÙÕ×ÛÔÖÙÚÛ×ÛÚÚØÎÜÆ|zhie`TXVUMLDNC;==<9:<>9=@6=?@<?><9867CA6455=80665547745613854564567HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz{~~|
{~
z{u}tm|}~s~|~x}ynt
}
{}z©Ã ¼¤}}r~s¦
{hGp ¤
~¥
¥¸¢§¡£¯¶ºµ¬ÀÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¸yyymjfW`\TPOHCLB==>99::99;=6?>><=9:;;37D?8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqry{z|{z|{~u
yszsm~}w
¡n¨
z |}£¢¤¯
Wr«[¢
¢¢
¤³¡¡§²¸¬¦½ÂÇÎÇÆÏÌÐÌÎ×ÐÑÔ®ÖÕØÚØÚÚ×ÖÙÙq~uhg^]XTWXC@HC>>>:49:;7:;:3;;?<>7;9:1:H>:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbymb~omwxyz}{{wsp
zuvvt
}¦£¥¢¨r±§
¢ ¢©¯ n·
ÄȲ¡¥²d¤ÍÇ
ª££¥©¡¢³´¥£¼Á¾ÈÅÅÉÈÉÂÊÓÍÍÔ©ÒÑÖÖÖØÚÔÓÚÎtid_^^NKTZBAGC;A=837;<:8>649:<:82?9:2:I:=67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFu||l}xz~z~vv|loy|xx|}£³¨£«³¡§ ¥¤®¢·³¡ ¤¯¢¤§¨¯¤ À£É¸«¢¦²
¨¢
t²¤¡} ¡±®£¤·¾´ÅÇĽÃÿÆÎÊÉÒ§ÎÍÓÒÐÖØÒÏØ»s{w^aVaWQIIOEABE5>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGN[\YJg`;Hzzm
z|x
}px|}|osz}{x
§»¨²½¯¥®³³¨£¢°¬´£¸¤¬¤©·¦¤£©ª£¯°ª»»É i¶¸«°£«½£^ª²|}³ª¢¡ ¥¯¨¢¥³¸«ÂÈĵ»½»ÅÈÇÂÑ¡ÆÉÍÍÄÖÖÐËÔ¢q|j^[T_RPGD><CAB8?874>F<<6<35345453B3::BM:A;AHB;:@<746<B9?@B874:96>=47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeGb`cpJ@r}um}}|pww{«ÂÀ¯½Æ»²´Á¼´«³¶¨²®®½ª»¤¨¹·«¦¦¢¢££©¯²±«¤¢¥¥£¹®¨¿»¬²¹¥£¦}½°z§±« £¬ ¡§§¤¡¤°²¦ÁÆÃ°°º¶ÅľͧÇÃÇüÕÐÍÄÊtsc][a[NKBL@EF>A?B;:4>A==5<6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\fF`igZ][{uo~|q~zz§´ÆÉ¿ÂÌÁùȼº¯«¹»²¶º²À®¥À¤ª¯»»ª«¢¢§«¯µ°ª ª¢°´§¢º¹µÁ»«¨²¤£¨
©ÃĤz¡¦ ®ª¡ ³ ¡¤ ¦¤¦§¤¯¥ÀÄ®©·µÉþ¶Î²Å¾Ä¼³ÑÉÈÁµuym]Y]kSMICLKKI@A=CD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBf[Me\fTcjyr|xz¡¨º¾ÇÈÊÂÒÉÊÂͽÁ³¬»¾§º¿½»Ã¸¬Á©¬³»½ª°ª£¥£«®´¶µ ®¦¢£´½©¨¼Á£¶¶¯«¯¬ª«©¦¥¥uy
££©¥}£ ¢µ¦¥¤£¥¦¥£©¨¢²¬¨¼Àᥳ·ÌÀ¹®Ã³»¾Â¸¬ÂÂÁÀnzbYX]\LLMJGDCHBBACK:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>kI_XaZddVx
~¡®¦¤Ã¾ÈÃÈÅÓÍÎÍ˻·¯º½´¼Ê¼ÃÁ¶¶¼³¿¹¼®¯¨ ©§¶®©²·¢¨¡«·¸©¥¯¾Ã±½¹³§©³³¬¤«§ ±Å§|}ª¥¡£¢Z¥f£³¥¢¬«§¦¡¤¨¦¶«©º¼Äµ¥´¶ËÁ¸©¶¬³»¸®¨¸º½¸no[XUVOFKSNK?AHEDHFG95FM;>7>AJ.32025B55OVN;LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBrFiIRebLF¦¡©¥¢¯¾®¡Ç½ÅÄÇÆÎÎÎÒʾ»¶±º»¼¾Î¶Ä½·¸·²²µ³·³¬¦««¸«©§¯°£¯¤¨¤¥´À°ª¬³¾Â¹À¹³§·³·²®¤¬®®¤¡tÁ}±¦£ ¨¡ `J¥T°¯¥¯¯¬¥¡¥ §¢´©ª³¼¼»«°²ÇÀ¹¥««±±£¡²²´¤qof\[OQLEPPQQ;HKIFHBC>9KT?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=QEWRsbWFH« ¢¨¯§
£¤µÈ´©Æ»ÃÃÈÊÉÇÌÎǾº²®¹¸ÀÁ͵ȺÀ¹µ¹±¯¯²´§£ª´´«©¦®¬¤®¥¥©¬º¿¨«¶¶¾Á¿¾¸²²Â°¸¼«£®´¬¸¥¦v¾ ¯¡¡©¨ ©¡§nv¢¢²£«©ª«®¥¤ ¤¨¢±§©«º·¾³²½¹¶ £§¨¥§¬©©efa_RLMGGNJVL=MDMIJACD<PU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..SaMUHe^HE¬¡»®ª«¢¤££¶Æ½´ÁºÂÂÈÈÅÂÎȽ¹²¯¸´ÀÂʶƱÁ¼´º«¨¬¯£¢ª´»¦©¦«ª¨¯§¤«ª½¼¨¼³·½Æ¼¶µ·À¯½¿³¨´¶«¾¤£¢¼ ·©¥£¡¨¥³¡¥¨©¤¡£ ´¯¥¥°««¬¤£© ©¥¢¡´´ºµ¨µ²³¢¦ª¡wa^`^JIFHMQINEFFBRKIADGAVRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCobGE§¤Ã¬¤©ª¨¦¡«¶Ä»¾·ÁÃÀÇľÍÇ»¾¹²°¸³¿Ãȵ¿¯¼¶º·¦¤ª«¬ ª«Ä¢¥¨«¦«¯«¢©¨¾¸¦½°·¶Ç¶µ¹¸¾°¾Á¶´²´¯½££®¡¢¥££¾¥©¨¬¡¦½¢£¢©«¡
¤ µ¬¦²§°§ª ¡¥¤¬±¶²ª¥©¬ ¡©idZa]OJHKOMHEDIA=OHA;GIH[ROK=HOU4BF9>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxecWL¢£Å¬¡¬®£¤ §ª¬¶°£ª³¶Ä½¿¶À¼È¾Êȶ¸µ´°³´·Áƶ¾°¸´¹µ¦¬ª«¥¤Á¥ © ¤©¯¢¦§½µ¥±¼·µµÃ²³·¹¾±ÃÀ··³´µ¢¤ ¡¨©«¢Ã©¬®¦ ¾¡¤«««¦¡X¥¡ ¸ª§¶£³¡ ¯¢¤¦®²«©¢¢¥¥¤ce[d`LIJKOFEAFJ?=JB99JKN]QQI=LW\9FI=DMI8Hc\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\KN¡Ã§¥¢³ ²§ª¤£©¬»°©¬µ²ÇÃÁ³ÂĽÆÄ¼Åʼ°°¶®°µ¯¿Åµ¹°°ºµ¬¨°©©¦¡§Â¬°ª¢®°©¤§½·¦¶º¼®¶Ã³³Â¿±Æ³º¶«´µª¢¥£«¡¨«°®¯»²¦ ©©¢¤¹ ¡¤®¯¬¥¦¡£§´¦§´£¯®¡ ¡¦¬°¥§¢
cf[heKILJSBC@HG;;F?99NMU^RSJ>O^^=HPBLLI9Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤ ¨£ª²¡£µ©²«¦¢¥²¬®©»²°µ´Æ¿ÄĵÀžÊĶÀȵ«µ¨°¸¬ÀÄ´·®¬¶¹¥«²«ª¦»µ¨°®´±§ªº²§¹³·²¸Àª·²Â¼³Å§¾®·´©§¬¡¥¤¢¢¤®¸±µ¶ ¨¤¤ ·¢¤¥±²¥ª¦¡¨¢¯²¢¦®¥¬¥
©©ª¢§¡yei]liNPMNT=CAMC::I@77QO]^RVQAW`\BJSHVKH:Ud]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05JpiVCWFyfC;¤£¡¦¿¦§¯¯ ©µ«¹¯«¤ª´·±°¹·°·¸¸Å½Ãǽ¼ÄÁÇÀ¹ÁÆÁºª¶¥»Á÷¸ª²»¢°²¥§«¹ª §°ª°´²ª©¶µ¬»¬²²¹·¬¹°Âº½¾¦Âª°·¯©ª«¦ª¡¡ °®³«°¹©¦ ¶©¥¢¢¯±³«±§« ¥¡£³°¥¡©¢©¨§£~
kimamnXQQZUACET@;;HA7:XPd^PVWDY^^MLRN^KJ>Zd^NHPN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1647gY`F(?8l}h[V:{cC=¨¡©½¡ª°ª£±¸©¥µ²«¡µ½¯³¸¼º½·¶Á¿ÉĹÅÃÀÀ¸Ä¾Á¸¯¶¨«·²¼¿¿´©®±·«¨§©§»¥³«¢±°³¬©¶³µ¼¯±µ¬°µ±ÀºÄ¶«¼®±¸«¬©¢±¥¤©£²ª³©ª³§ ¦¤´®§¡¬¬±§²¬²©¤¨¤¡¨µ©¡¬¦¥£
{flshpr_GYfVDCNXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\c`PKMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'_^aU150=`V^8)C3YU\gK5zfL@¤ ¤¬·¤¬©¥®®¶©®³¹¦§±¸Æ·±·¾Áµ´ºÅ¾ÌŹÃÀº¿ºÄ¸Á¹²µ¬ªº·ºº¾µª±¶§«ª«¬««½«®±£ª°³®®¶±¹¶©®°§¶°³»¼É²ªµ´±´¯®¦¡³¨ ¥±£ ¥¯¡¤¢¥§²©¡¦±«©µ¥®°µ¯£§¬¸£¡¬¥£¢ {
{knxnu|aF`jYIHZ[={JGE6AbTiZM\aJ[]ZRRRb`LKE_a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.*B/JGP[H3cYUKD °¨±©¬¥£®®µ©·´¸£¬´·Ê»´»º¿¾´´·ÃÁÍǻý·¾¿À¸¿½±½®§º¹··Â·¬±¹¦®«§£²©¯º¤²±§§¢²³°²°´±·²¨®«±¦¸¯µ³ÃŶ©´µ«°©§¢¶¦± ¤±§©©¢¥¥¥·§¢±³«§±§¬°µ¬¤¡¬¨ª¹¢¦¡¨¤ v|
nqxv|]Kel\KOc\?b{GI8GgWe[L^bMXYWTXTi]POHa^_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=EMQ<3rkJDC¤¤«§¤°²³ª·°¶«µ¹É¹®Á»Â·³²µÂÃÏÄÀÁ¾µ½À¿º¿½³Ä¨ª¹°¶·À½¯¬³³ §°¥¦°¥²µ¬«²°¬©¨´¹¬´²µ¬³¬©¬¨¬©¹®±°Ç¾¸¥¹¯©¦¨°¥££®£©¯¢£¢£¬£¡ª¦¦¸¥«´´¤©«¨«¯¶®¢£¨ª ¤´£
§ w~
}|}qtr~}~\Rdo^NZf]FD[G:NmXa[M`aNVWVWTYg^QRLcZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Cd;6*HdHJ+:I?3BIS,>k=GH©ª¢©¯¤¨¤³´±´µ±±¡¬½Ìº®Á¼Ç±´´ÂÃÑÅÆ¾À²¾Á¼¿¸¼Å¨·¬³¸¼Á°¬² ¤§©¨¤°£ª±ª¯«±®¯«³»§·±²©²©«¥¥£º¬ª±Â¹´¬º¨¨¨©¨±¥©¤¢®ª¨¢¢¬¤«¡§©¡¬¥¢¬«·±± ¨¢ª®°¬¦§©£ § ¥
}w
tsrvl_Y`ncQsr\K<|F?WuX`YNc\NUVUWP\b^SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^J0.IgDF8<B05EKX1@[?MF¬§¢ª²©©°¶¬¸µ®ª¥««½É¼±¾·Ã¯±³ÄÄÎÎÿ¿´ÀÃĺÀ´ÉĬ¯·®²¹À¿³®®«¥§ª°©§¨±¥´ª°®±¯³¬³»¤¸´¬¬®§«£°·«ªº¶¤¶µ¤©§¬¬ª¡¨¦¦±²¤¦¥¡¡«© ¦¤¢ª¤¬¢¦±·¬¢¤¢¨ª©¡¥¤¤
¤£|{t~tx¤yk^`ngWfdN@gLDbyWbXReUMVUVTO\]aUKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D@HHD¯¤£ª°ª©µ«¶±«¤«ª©¼ÁÀ¸¹³¼µ¦³¯ÄÉËѾÁ»¹À¿Â¹ÁºÂÄ®±µ²³»Á¾³²®«¬§¶ª¥¯«¹¯¨°°®±«µª¶µ§µ¶«¬¤©ª£³³¨¨¤´´ ¶®¡©¨«¨¬§ «¬¨¹¶©ª©©¡©¨¡ ¤¢¦¢©¦´®§¥©¢£¤¦¦©¢¤£~
£txu{x~oqggqx\atiO]VHmxUdVQbOLUTUQOX[bVHPjTWTGPYUI>IHOQPxLNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021&/2Rc02?f=NX?C,>LT_/Ik6QE;¯ ¥ª«¤¯³´®ª¥¯©©º¾»Á±¯¸®¢¶¯ÉÇÈÑÀ¿½º¼Ã¾ºÃÁÀ¿¯²³²µ½¼Á²²³«³©¥µ¨¤³³¹¯£µ±¯±¹ª¸®ª®¶«ªª«£ ¶©¡¯³¡´ª¨§ª£ª¡¡¬¨½¯¬®¬¡§§«¯¢¢ ¨§§ª°¨¢¬¡¡¡¢£¦¨¦}
¤
¡
xt}uyz{tt{j£ui^elug|RWp^JxsSdSQ^MMRZgNLVYeXGSiRQ>BNQaQ:IHLSIqPLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Lh:38_=ad?F1CP[[+HO:WB4±¤¦«£¦¤¬¦´³°©£°§ª¸¾À¼°¨¹ª§®°ÉÆÈнÀ¾¹¾¿¼É¼Â¹°°µ²º¼¹À³´»¹£µ¦§¬±¶¹²§§ºµµ¼¯¼¥µ«©¯£¥¬«§ª³¤³¨ª§©¤©£©¨©½¬´¯®©£ ®²£¤¤¥¤¨ª¥©¡ ¥©©
}~
¢~rzy~|iw|zupq~iyd`hcs
zmgy]^UBWzlTaPRYKKMpt]HZ[gYEVfPC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=<F[@*±¨¥¤¡«¤·²²¤¨°§¬¸Á½µ°£¹¬¨¨°ÃÉÉÌÁ·½Àµ·¿ºÈ¶Ãµ´³µ²½¹º½¶¹¶¿¢³¦««¯µ¸´ªº»¨²¿²º ¯´¶©¬°¢¥¨©£¤±¦° ª©§¢ª£¨ ¼¨®°®¡«¢£®¬¦¡££©¢££¡¦¬{|
£|yl}vyxb{zrppsxjtjgdhaosmbjp`oA\xkU^NPQJILSZWM\^mWDW`O^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdO)=3Q\=#«§¤¢¨¤¸¯®¢¯¯©«¸Âº²¸¯«¨´ºÇÊÇ¿·Â¾°´¾·Ä¶Ã²¯º²³Àµ»¾¸©¹¸¾«¤µ§¨ª°¹°©¹¼£®¿´´¡®¸µ§¦§°³ ¤¦§¡¥¨© ª¯§ ¦£© °¸¤±¯¡«¡¬¤¦¦©£©¦§¡ª}~||¡y
}
{sp|qst`yxjopqpjsczlifdaf`[rjqLMiXZMPLJHPRQIM[_oTDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0\Z5(¥ ¡¤¡·«°£´´©¨¹Å¶²® ·¬¬°µÅÇÀ·¿Âº±µ½·¿»¿¯¬¾°´¿²½Ã¹©»»¸§¨µ¨§«°¬³°¦¼¶¤«»µ®±¸°©¥§¯²¡¤ £¤¡°¦¡¢§¯¢ ¢£¥¢·°¡¦±«¬¢®ª¤¨¤¥©¤¢©¡z}yz
~zzpqvoot_xwemlljinfrilfi]ds`[kuiZI}][XOOKHGRUF29]^mPDWVYeMHIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139dm84GAf[HTDU]hD.<2cV,2¢¡ª¤¡¢ ¸ª® º¸¦¬½Å³°¯£µ°¯´Ãü³¿º¸±³¹¸º¸º¯®À³´¹°¿Á¸¬½»µ¦¢³ª§©²«±¡Àµ¤§µµ¨²¼©¨¦©¯¬£§£¦¡²¥£¨©¢ ¤ ¤¸¨¤§®¦¥ ¨¨¢¡ ¡ª¡£¨¤y{}z
{w~{ltqllsaxthhjggpghidfij`jbjg[e{c`SsT\[SLJGIOS@!*h]jLCVU^`KIGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB379gO'2£££§£µ¦ª¹·§¬ÃÁ¶°¬£µ®§®¯·À¿¼±Á¶±®²¶¶¸·¶ª½´¯²±½¿¸®¼¼±¥¶«¥¥´©ª®Á«¨¥°²©¬µ»©ª«±¥ª¦¤§¢¤©¡¢ §¶¥¯ª¯¡¡¡ ¦¡ ¥«¡¨ y
w|
{
s}}fxokjlguskcgddvbeffejjdkqZ^Y]mdaNhWZ`VJGHKMRX>9_liHBTS\[IHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3BhH%5£¬¡ ¥´±¡±½·¡±Æ¼º±±¤·¬«®©¹¼»º¿±¯®®¶¯³¸³¨¬º±¯®´¶º¶¯¹¾¦µ« °¤«¯¢À ±£®°®·®µ¯¬¢§©¥¨¥¤¢© ¬¯¥º¨®¢¡£¤ ¨ª§©§|s
|
p~fymhkjgqrk\hdcsafhjnlgkjhm\lktqaTbhdeZIFLMOXQQVaeT@VSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JfC'4¡°¡©²¯¸¿¶ ´Â»½¹±¦¶°¨®¥·¸··¬º®ª«·ª´¹®¦³µ²®©±·¶±³µº§©¶©©¢©§¾£®¯µµ¬±¯©¢£«¨§£©¢¤ ¤«ª©»§¤ ¡k¡q£u©§¡xnj~vql}o^cagkuw~ghuifW\hsnNPjdgrg_dfnmj^`a
eNKD8FTg^JGPPTUKHSaoteFZQUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:176Yl16Ok[N\K[fb>G1Qd=+.¤°¡ªª£½Ä¯©·Â¸½¼§¶°¥«¤·³±³°¸ª§¬´¦°µ£¨¸¶µ¨§¬·³®´³¢ª´«¡¤¦§«º¦¥¯²·®¤©®«¬¥¡ §§¡¥¥§§¨ª£µ¯££££¡¡ ¥¦ªrx
¡vif}rx¡p~|¡ {tvlmheczlqbTmcliqYjqoX^i[kk[qnzrgZ^FM?G_MFRVVQQRWUg^MWIRSOEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa70(¦«ªª§©¾Ã®²º¼·À¿ª¤·°©¬¦³´®®³¶«©¥±¥µ´®¶¶´¥§©³±²¨¯«¡²© ££¡£³£¤¥¶¼§¬§«ª¬¨¥¡ ¦£¦£¤¤©£¤¥¦¡·££ ¤®©¢
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Å{r¶¦»{l±«°xhkX±®nei¼¼nhznrØ~Sjb¶²~rt¡ªWOWaOVNFT[XQPR\W\P@\DQNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦¦©¥²¨°Â½²µÀµ·¿Â«¦³¬¬©§¯³©¯¶³¨¨¦µ¦§¸¯³²¶ª¥¤¨±®®±¦ª§¤±¤¡ ®«¡´º£ª©¢®¥¢¡§¨ §§§¡¦¢ °¢£
¯jjª~gdp¥q®¡¤~x»}k¡v±_j´[¥f`fzfjxk©d¾rg¦v±j|±xtcmm§n[ EhgEu`~g|¤§Y_«ixyj§7J¯\WSmc[KNW_\WV;NOWW/ITSIDEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¡¬§¥£¥ª²¸¬´½¾¯¶Ä²·ºÂ¦¨°«®©©°®£±º¯¤¥®³£©¹¨³²°£¥ ª¯¬¯¦§£¢°¢¬¥¡´³¢«¢ ¢¨¤¡§¤£ ª¦¦ ¡
µµx
©µw³·~¨~k¦{x«gk±[«{tqx °vwqkkl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¢o[Skh`LK[dX\ZB>±xWXA#MhECDA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50³¦¦¡®©§³¬ª»¶Â°»Â¸·Áª¬®®¦®²©¡¯¼ª¡§´¤«µ¤¦²³§£¡¨ª²¨°¨¥¯¬¢¤¨´¯¢©©¨ª ¥§¢ £¥£¢ª¥¢ Õ¹p°Â~Æ|Ö»|¤¤{£¥z¬yV¯z~j¹Z¹w|¦|zªy{±nt¼
oP¯§ÅQ zc`©ctrm`Sµ´È|c¤3Bv]PjidP@XgZdaJHMlK[ROYfYCD>E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ72%¡±¨¨¥³ª¥µ¨¤¼·Á°¹À±µ´»³µ§±°£°²¦®¶¨¨¹®£¯± ³´° ¤¨ª±©´©¤ª ©¨°©£¬¢¨¡¥¡¢¡¡¡¢¢§¡¦ §¡²nhµq«o¦r´sr¶{£¢~¡¥~°vÒÑv\®{
¤oª¦k|}{±sy³etofRÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjdfXAOk_lhOUGI9=VR[XXIC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥°¤ª¼¦µ¥§¶»¼²º¿·¶´ºº³¥´³¡±±¢¬¯¤¦º®¤±±´¸ª¦¢ª¤²¨¬ª¤¨¢§¥«°¦¢¥¡¤¦¥¦¡£ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}x
}w¯x³aelZ°XKuyf`_wwhk^¯wxl5yÈ®²_BTo^g`EPm_pmVUM.eciSYQ;BDAL:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I988 ¸°´Á¨³¨©²º·³¸¿¹·²µ¼µ¥·³´¬¨«§¶«¨±±«´¤© ¨¡¶§¦ª£¥¡¢¥¦¬¯¦ ©¢¢¨¥ ¥¨¤¡ ¡¢ ¦©}}¥x¡ªp§¡£ª|yo±Z¨ ytØvs§¤|{²^d ~l\«[Zhgªdr{ks]¬Z koeOJC¡\[Lt]bfM[a_rt_JV6JXHE=HFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>002144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C1?8¡¿«´Â®«©¦´°·°µ¿¹¹²°·¼©º´°¤¥§§ª°©°©µ¬«¯¡¡ ¦¥¤º¢£« ¢ ¨¯¯¦¨¦¤¨«§©§ £¤¡¡¡ ¡«®mr´r©v¦s´xs³¤¢¤w¸o{¢kk¶Z
ei¡¢§mr´t²j
ku³af¢oj\`M¡|Rs£mz~oq\¯V<weTon.\§OcRkebmZc]`p{cTZQ>>mo3BB@?M9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;<010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¥º¡²À®««§·©¸¯µÀµ¼°¯¹¸«Á¶©ª ¦¤¡ªª¨¶£²¨¯ª § ¤«¸£¥£¡«µ°§¬ª¥¥¢ª±£ §«°¡£¢¡ª«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~tª}¾ns¼t²uxnqn¤t½^w}[ay¼kZV[jz^jafgbmwoY[YCA@r?CG+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-6A9§¡¼¢±Ã°ªª¬±§¸¯¶Å±º±®»°®Á²¬¤¢£¡©¤ª²¤µ¦¤ª¦¬¸£®¡¥ £¯¹±¬£§§¤¤ ¨«©£³£¥§¢¢£° ª
µ·xµwmknsnytÁ»½{²¨pt¸|{|¤»¹½uz´£tvut°ufi¶trpw¶^z}hynyc¬pu
Y[§jEdYSf`c]cQgfqmuBMPMD;ZM>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbV8*O]]=+:VV'>;<§ ¿¥´Ã´¬«§¬«©»®°Æ¯µ³®·§´¸©¢¡¥ «¤ª¦µ¨§ £¬¤¾§¡ª¢¢¨¡²µ·£¤¢¦¦«¨¤¥¡¨¦§£©¡¤°¨§¢j~i¦xs}tzez½¾Àºoq_rjZ^ack`cmwbke^`cqir}gj~rtx}}b[wthP\n}{kXl{sIJopNuMEW]f`L[Xgc_O[muiqRPDEN<HI=L?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P^L(3=[O'?2>¨¨¡Á£´º¶£¬¥®§¨µ±¬È¬¯³«µ£¾±²§ ¢©¢¬¦®¤¥µ©¥¡§©¾¨©¦ ¤©¨°²¿¬§§¢©©¤« ££§¬£«¢°§ ±¤¡¨££¦¢gm}qw
µª ¢¡z¥lj||tqxyvv{kstudw}wkp{m`c]pgMYYfj`WZpznlfSOFS9OZMRO(+:KB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<.@³ ³¢¿¡£±²· ©¥²§¥°µªÉ«¬±¥µ¦À¨´¡¤¥£ ª¦¬££·«ª¦Á¬¤¢¢¦¨§²Ä¯«ª©« ¬¡¢¤¯§¢¥¨®§¡° ¢¦ ¡£ |ª¨{
£~f¡³¯
vz|vyzofzkuyrhszvktdyf`jecdfkYk{pij\SLPD_UE@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¾¬«®²² ª¦±¢¬³°Å°ª¬£³®¼¤´¥¢¡¨¥©¦¤¥³µ°¦®¾ ¬¢¡¨©«¢³È³ª£ª§¨¤« ©¯ª¦£«¢ ¡¤¯£¨¤¨e|e~cylhkz¤«ke~g
eeih{¡kh£xkj£slnzzXe^
^lv\hswwnxxsmytw{iY^ktd]sij|qlc^RNWJdXAJ4=F7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³°ª¥¨°§®°½±©§¤¯°£¡§«£¥¨©²®£¢¯¦·¹¥®£¡ ¥{¥¬¢¨´Ä¸¤¡§®£££ª¨¡ ª°ª«£ª ©¦¨¡¬¡¥°¤«¡¥ª~½r´rhx¹Ä¸q¢£{¦sª|ËÀÀ»q¢}À½ÂÁ{{ÃÀ}j¥±ooÊzwvzyqzqx
ymwcf_xd`ec^tgmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP/#F[3PY/UAB;/8£¸Ãµ°¯À©¨£¯©°®¦²µ¯©¥¦¦°« «¢ª§¢¬£¥¨¥¤´¤¢¦®«¸³§¯¢¥ ¡¦«¤«ÀÀ° ©¯©¢¡£ª£ ¡®©¬¦££§¡¥¦©¤©©ª¬¡¥¡£Îxz¤y_®^§¢ |§t«¯^cªz§
t³c« ³j®t}¸aY£Ínu{Ú{p~v~e{vvk}n~
~m`qkpg`_yd\qhjcf`RTRW^KOC5AHED9>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1¿¿µ´°·¤ª¨³«¥²¬¬«¤«§¯ª §¤¢¯ ¨§£¥¡°¬§®±ª¨¬ ¥¥§£¤ª°¨ÀƳ¨©±®¢©ª¡¯§«©§¨¤¢«´¦¢ª©£¦¥¡° § q
t¨q±|q¬~¡¥wª}r~«vz|~ª¢~«{{VÄzoÁ}mupmeveoawnromeptup`gme`oiinfcWS]aYRSC9JI@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´£££¡¬¯¶®©±§¨ª§««§¢£¢ ¦«¡¥ ¨¨¢°¬¨§¯¬¨§©£¢¡¦£¯¬£«´ªºÍ²¦®¬¢®¬ ©²©ªª¬«¤£¬°±¢¨¬®¥¦ª©©±¢£¥¤j¤uz©tz²p¥q ¤``R«®v®¦z{f£¤
£}©~®_|¨U¢z¢{ïÅs¯³³¹qb©¯Âthmpnyxwolfeerpf|ib]W`iXXULMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799674,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÖÕ¿¡«§¡¯¢°´°¯©¢§¦ª««©¤¦ ¥¦§¦£¬¢¬¡¤¯¢ª¤µ°® ©§¤¢¨ ¥±¦£§±¬¶È²µª¬ª¢ ¥³ §¬«¤®ª£¢«¢³®¢ª³±¡©¨®¯¶££§|ªlu«y|°o¤Ò¸´¸É²__©¤ yxªÉt£§©ÆÆxe¡¥s}¯^pµc±uK£m§Gd|pq{u}{n[fjsqfj_aYdm\^YINMKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),4ENPPMFKJVF*L0/>-5OTQ;<F2,$§¤ÁƸ©²¬¥¢²¹¬ª¡¦¨¥ª«ª§ ¦¥ª£®«¦ ¬©¥§¶¢¨ª¶²¬¦ ¥¬§£©¦®¡£§©°´Â²³ª¨¤¡£¯¦¡¥¦«°®¨¦¬£·¡²¹¯®§²³³¤§£Nxz£}¤§¸{|y¹~ÌÆÂ¶x¡}v¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu¤|}uzs
q\moxrjoZd_hncd]KMQTBIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@882.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¸«¯ ¡¬³³¦ ¦®®ª§¦¦£§ ²®¢©¦² ª¤£¶¢¢¢©´¸¤¢¢¡±§¥¡¢¯®¤¨¡¶²Ã±©©§¢¤¥¦¤©¯¢®¥¦¯¥¼¡··µ²¸°³¦¯¡£
ѵ÷y
¦x¢w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{}n©a£qqbs²¸hx¦~x}ymixjysnt]ddnmfg`J[YX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUVVTQOQ[U%!2AH$)%s¿¿»ºµ§¤µ¡££©§®ª«¦¢¦¡ µ§£©§°£¬£¤£ª´´¤¤¨® ¦£§´¡ª£¶«Ã°©«©¡¡ ¦¢¦¤¦¬¨®£¥§¾¬½°¬¢°²¹«³§¨±¤§z¨}|°w¤¥m²o¡|¡¨¬
®
© ¡{~«ªx y¯]£|¦§d|tk¯]¥kp
]`[ m§{{klc~umz`geqnhghCZa[=KT3U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI8052.*,ATVVVTTUUUUTTUTSTVVWXVUUQHFIJ#((½©ÆÂ¶Á´¬ ®¸¥£¤¢°¯ª¤¸ £« ¯©®¡«©¤®°¬§§¬¬¢¡¥¡¤¨¦¶©À¯¥©¤¦¦¤¤©¬¬¤¥ ª¨¿¥Ã¬ª¢¡«²¹ª®§ ³®¨©v¯~
|º®e°e}¡¦¬°
¥¤¡¡
[lj³`{{±lgo±[}´[¤kÈ¢e{»YvµZ²}R¯z¬X¡n¨|y~ds~bxt|ajgqmfeeOUd\BU_>J(>9=4!",%2. *1/045799<ACFHJLNPPRTWZ^`_`ab^_\[XUPNJFC553./@UZXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Á³£¬¦¥¶¨ ³³©£µ ³¨ª«¯¬¯©¢¯¬¨§¢§®¨¢¥£¢¥£ª²©½¯¥¨} © ¡¨®§¦¦£¥©» Ƨ¥©¡«´µ¬®¦»¬¬©£¯¤¸Ãº§¬¯¦¥ª~սªb£¿½}~£×º¸µ
½¾j£o«mz²°Çj«°½¬xw¢¾¼t§zzc}{dgy{`kekjbPa[Sj\@UaCN*=:4/$%2 $(0496677;>ACFGJKMNNQTW]a\__a^`[\YTQMHC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»³´±¿¹±½²¢®¦¥²¦¥¿ª¸±¨¡¿¦¦²±¹¨¯¥§°¬®¦£¬¡¤©£¦§ ¨¢ ¬ª¹®¨£{¦© ©©¡ª§¡¢«»©Å£ ¯£ª³´ª¯© º§®®suª¤·e pgmox¤u®pq¨£®¤rmmmexomqzjqigqiigpd]cjoY]g~w¦`bqofd¢}vfxhkyydlcflbKdWJlY:QeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV]WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^©³©¹¹²³ª©¡®£²©¾²ÃȾ¶ªÀ«¬£ §¬º£¤¬¦®©
¦«¡££ ¤§¨£© ¦¦¨¯º¬¬{¥¨©£±§£¬º°Á§¤³¦¬°±ª«§¸£· ¨¥¶¢©ª³£« ±¡¡¢ ¤¡«§
¤}gtvtq§m{¡¢riwpxw|zjldcodU`X@i[HcaOZ+F=+'!740.!%2(*699469;>?ABDFJKKMPPQXUVY^`ac\^UQJED>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥µ¶®®¢°¤ µ±¬Æ½Ä»¸ª¢¥¦°¨£¶§©µ¦¨¬¢§¬¥ §£¨¨¦¡£¨¡µ»¨«|¡¥ª ¶£¨¬·§®Á®£·§¯¯°¬©©²¸ ®¼¥¤¦¶¢¦©£¬¯¡£°¨¯£ £©«¡ª
}fuvysj}¡¢zrszr|jod^pja[_YncP`ePZ:GGE>2=>7/+&+)&&406658:==?AACIJGJKLMSSSUZ``i`eUPJACB:9EMV[^^[Z\[[[\]]__]^_`aabaaa`bbbdb\[c¤¨£°³¬®£©§ §µª¥³»¯¬¬¢£z¢±¤¥°©¸¦£ª£®£§ ®ª¨§¨¹¶¥¦y¢©¸¤¯µ¢°¯u¤¾£² wy ª±»u¬¤ªd\bv ¤~n³£§ª£esyp¨l¢¨e¥wjvq|aiZvhhrz¦eyxjoykqe_vplkh\febbpS\>NNNSG>@TC:1/&4:316678<;>@ABFHBGFIKMTTUY]`hfgWQJ<DG;8UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡¯±¬«©¥©®£§¥«¶°²¦ª§«s°¨«§¹ ¤«¢§¡
u®¦¨¤º´¨ uw §²µ³¼§ ~§¢z¢®·¦±©¯£y¬¢§©§
w¥z¦{±z
cympyq
txht t}¡k
lx{qqgdxojlj[ekjft\_ITLQ@E5.YUU7)!09=>643568;:=>>@DI@JEJKGSXZY[a`hfYQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨±¦§ª¥®È¾°¡¦©µ¬§¢ ¾ }¬¡ ¨¢£º²§
pu ¤¬´´Êª®·
¯°®©¥|¨r{w§h¤y´¦¨Â«¡q¤}
±¡|¡ |
ms
zr|uÅf©£k¢
q
hwt|whhuqghk^dpmgmXhG]RM2E46Nac7&3<DGD964658;8>==>BL?NIJLCPZ]\Wa]jl\QE=KM@JdY]cfhgbbbbcc`_babccceiicbbbecafcbbi¢°¨©¨¥« ¤¹±ª«¦ £¤ª£¥ª·£¯¡§¥½¡y«¡
v¤£¹®¤~bm ¡¡¨~¡§
ª®£©~¢uk¬uM«x¨§©«}¡{z§ikg¶}n`dY{dhr}yl]{m_Sp\_ky`Ye}p§ªk£nr¥pif m[n|fZ`bWPowfmtrkjo^jpmljXiO]XF9A4GD_k4,ICQMN=84859;6@;;=AO>QRLMBJ\]_W^^bv`MD:MOMTb\\ffiibbdbddbab`cdcacikdbddgdbgeach ¹¡ª£¦¬¡¶¼¬®£ ¢¥¬¡®µ£¨¡ ¦´u¦
¬¤©¦±§¢in¢ ¢¥£¡ w§¡§©¬¥x|}¢ps{ym¨{¢sv¦f~v¤_z}s¢n·´ºtµ¨dƸ{p·q¤cs¬«`}j³~n|q£lr£s¤`³q|´ts[²jbotvrhoXklssf]i^bKE=D5QAZr2=SG_JR=<395::6D;;@IQ?UMNQ@E_^[YX``|dHC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¸« ¤·µ® ¢££¦±¬¡¡¤«xp¡}¨ £©¨¥~k{} w¢r¡¨¥§ª~~z z£xt} ¦¢d¡|lhn{§}rht«tªh]
vhªj¸f\¨pa^§vvhunm§]©~x»k~ª[]´g\nryxki\qjyyc`fXbAQEO7VCRn4KZZ_NZD@151;;7H?:CHU?YRY]>Db^V`Qac}iEB9N[]XdfXfgnmbbe_ba__``ec^bdoq_deekecihgkiªµ§c«º²°¬¦¨®°¨¬¤¡ £jr{z£©£ iy{¢ ¡rhp©¢§§|¯£¢¸w£³¢¤y{«¢q¡|
¯µ}k¡x~´££«¨|}~tªZ]o{xbL~zz
cyBLY¢jq|mux±³§vns}osk¤]vHec`sq~nf`liv{debR^W]UW@YFQgDSW[bX^ID=B8?A:IE8LEWAVQ[VDFb\Z`K`m~qEC<U_bZejVghmobfg^aa\]^ahb_ecvl^egfkdflihki±T^ ¦³¹³³©¢«©¡«¤¢¨ w
ny
|r¡s
©|l
q¡x
|£¡¢®}µ{¥z© |§hwm~t¡sq|p®}¤¦£o^¨gu£co¥aÓ|{xrsc¢
~£s£uk³`sª²¨¼wm~¾¦©´^n}qns¢r]¤gs¦ah¦mÔ}
pyzk{xsn©¤g`eypkgfdnvwg`cS[fQQbIWIT`WS[ej\eQFCKMJKBJE8P@QNWRYOSQ`feiScwywIFEc^eZhiTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh±«T\K~©¯±´°³£
¨ ¤¤¨ © {p}h}wol|¤ª
ywnw¢{¢¤³¡¢¶z¬§¤®¥p¨
{¤¡r£®¯¤®¡vµµµÉ¡s`©my u¡w ~oLf£pr¤{ytak~ kqd`r~tizi³µ´Æ¦s~zk«umuwizurPE}´^jvkyfjhbtupnV^TYiPShIULYSU]hknVgWMKAJMKHJNAQKPecimeussy|nu{{TPNl^h[kiRjhilglfce_\]\^ibdik{_]dhcjfomeile¡¯¦f?¡³«¯¯¶¢¢©¢¢¥¥§¦yjye yui
z¦©z}yp¡y ¥¨fnxl¢d|q¥wpg¦{¤zrv¹n¢b}¡mri«ju mn¦_ihu¢}`tobh e~iuocfmr¢Z_[c¡m]o{~srd¥mw¢dg§hso¢oSo _e¨T^TnmskrmpikyskoRYWWfZSmIXO]IXihsjYkVQREV\LXRaUhj_wtz}p||r{svv^QrbgbpgPjhhklnhdg_]^]`kcjivu]\cicjjslfkmc¤¦zetm§®¤©°±¦«¥¢¡¢¢{qh|st}{d|¨¢¬~sh¥} ª§¦x¤²¯¥wy©t¤n¤¢»n}¥¯|¥zq¨ f~o«cw¨l©¢uw«¦j°kv³©kmma«ªv¥v}¤ jw¬g¶tw¾¤Y¦«aurtp|tqcj~nhlSV[Vab]kM]R]I]mmv`[qY\`Zgtenoqcqt`xz~yrys~{{vbxdcmsdRkgholrjfia_^\bkbml{o\\bibljwmglnb¥ª¤©ª¨§®¤«¤¥©
tzo~ttrm|{
¦¥¦
vol©«£ u~y®£q
x~{r¦q}}zx{~~v z}k
[yxrzphn~qtq
e^wusuoynnm
^vhxe
©}t|jov}vmmgsy{x
[kXyinwrqoxxp]lnjgVZ`W]ekcVaU_Q_pxylkvejkjv|qrtsaoubt{xuzvx
}{mldxn^Wnghukxjijd\`ZcjelqunZ[bkdllymhloa¸¨¦¡¢¦¤¥«¢¡¬¡¦©~r|}~
{srp
{}
x~¤|§¡
wr
©¨ ª~~¨¦woyo}¨
p}qkp}hm]sqtkvtYrn}~j]jdz
_ixz{ugwkaprv_r¦
fnwqzpfgd{z[\jgnv[{ywunssf\mklcYY^[Ylq\_aZ^]ft~{uotckkj{}r{xtdmthm|~vz||zz~o{}s~ysiT\qiluougkhd]aXkhlkqrmW[emlgsyohjm`©°¡£¡¨£¢~¢¥{|s}v
qor~z §¢x
z¡«¢¢££ª¡§¦ {w§~²¦²¥k|wxe|
w|yt¡~}ups
w¦
}wl}zjrhatp}zwvovt]^oho`^Z\]ShrUc\\alhu||sopdkji|nyqipplf{rx}
{m|zx|}zyNdvjrmpzdkebb`[tfpfrqmU]ltmiyzqgike¹¢¡¤¡|« }y{nxr~mk~z}«r}zª¦¢¦ ¥v{¥{|ª¡ª~ow
qua~u
~
mxut¢
t|}rr{{x¦w|ok~|nhlmg^zh}{vtvu{w\`p}nu`c[]^QgnTe[^akivz~qlldkjhlslltoyo
ymv~
vq~{{|{`i{juhiejc`i\duhobtmlUcqyepzzrejmm·¡¤{x§¥yz
|n|xs
}}kh}|~}§p¡¡
|¨x£ ¡£¡£~
x }|¤ ¡¦}~tspv`}r|q
hwqx~r||qy{zz¥|
vzer|xzqljf^~sh|uvt|sj^`tvpxdcY_^RkhTeY_ahjvxqfkdlhfkn~hoqk~xzks~tv~|z}jrnsibhlb_qVtomn`xhmWjtvcu{zrbkoy²¤¥¡|v¥¡¢x{~q{tv
~xgc}x}y ~o¦¦
w¡¡z~¤y
w~s£¡¢~|vq}nzd|
pleuo{|x{|{q~w
y¢ww|v`xx}t~xgldaijwstu}q|bcasnusmaZa^[leRcX`aikvyqbjcmei}lhuhloi}ymqt|~z~|mvttmeljbcuViqn`xglbjvpfy{yq_rl
®¦¨}xªzy{}|{xtyzs}d^}
u}~}¤¡r{§ s¦sk
zo£|zqykul{}~m
wp}~dri{~sx~vx}|¤yt}tvna{uzq}oaocd{bnovsxwstau_oluno\[_^^k^P]Xcahmt{k_jfjciwnflhjlh}{wos}tz}z}}rzxxnlkh_irbhrofvgnlayik}{xpaxmª £¨}w®}w~{|{vwptt{o
}~|a\~szz¥~}¤n¢¡nf
z
p¢}{srukqnt{tn
qt{|dplx}}tsyo}|
¨{|~
x~qpchytup|b^p`kt^pj{yxlspex]mlsmsXZ^_bkZPWXecgqqf]ihgbgqndigdihzwuo
t{u
w
|x
zw{{rxjk_phtkromqgole|cnyvqlww~¢¡¨ ¦uª¡t{v
xyrs{
krpzmvnq[Y~vu ¡x
m¡
i£f
~w~||nuplmop{
ispwtxfrou|zyvtp{
z£|vxxol^rsrqpxZ^p`pj^oj}zpmmjlv`pojrmZXaabnXQTZfgcupb]kmdbfkn`ff_gkurspuxux
ww
|{vjqc|c|oqmtjholvx_qy{tut~¤¦
u zrxtpr
tqukomumv~mnUQ«xwsz x{¤|s
h
g
qx{z||kvjnkklzaz~vzx|ygslt~{qzpvzz}
||w}wqjlz`xomlrtV^obr`_lnyphoffsthpkawe]Vf``rSQN\fe]yp|_\hrbbefj_hd[gp~pkpt}v|
tuy{xs
~{yxfrj`~ook{`jntu_t}xxts
|x °¥
vtwspo
tpqpjivnn}|musRMßÈÖ|puvw{s
¡~wz~zvgl£cq{{z
|~l{erojkyy\yz}~zzhsjs
}k~n~|z|vxysmgqmjtohjtnS^odpY_krxfkjbfxropc_w``Vk_^wPNKagc]zqt\\ev`aeed`ebXissnkqv}tyuv~s{~r|~vesn|e~opkZlnyysavz{vswwy¯
w~}
twpyqnomn~rddxq}my}jhlc¤ÁÜ®ï¡sluv¢
o q£
~zuxvvn}£
^m|}
v
}}k}dxuinxsXzy~
~xfsj
kvn~ztsxusqguzbtmpbjvgR`qglU_ntyarc_h}prn[cr`bWnZ\xNMLdga^vsm\\dy^`df
`cb^Yjrknkrw~twxw{q}~{t~~shuqylzntqWqzvyqewyiwr§£}pxy
¡{{rwpsjokim|t^`xw{qu{gae|ëÚµÉÃÜsltwiq
|{
vxrup¡ai}}q~qwhvriswlZ|}uask~}mlx|}oqzulqlry`tin]kv`RerifS_pvt`o`]hprjWghbiXmV\uMKLeg^brs
i[\ey^^dg{`d_\Yknfoisx~ss~zvzs
}vw{vlwuyxtnx{}Yzqogxwdv
q
¡¢torw}|xqsnodr~iflwx[^y{{qqjagaÕ¶§xoqw|qj{i|{~
zt{zpuv~a
g}~~m|tkmvtsvukb
~|~~o_rp
{|~zpfy|~noz~unokl{~chkjYnvZRirjbQbrxlbe]Zjmsa[g_dl_nT[pNHOge\gnql[[cs`\clwde]]Zllbmjtwqo||txx
}uy|vpwy{om|w^tmiztsgs|r vv~mv~|v}vqoljau|gbiuzZ_x|zmqedhgW^qs¼Åvq~rtk{|}|u
vv}quqt{e}r}g}{y}i}vfoxxsvslj
xj^qxz}
{~rix
y|}nl{}wtoih}we]qcXosSSnsiaNftxf`]\XnnsYeb]jm`pOYlRDThaZknm{oZ[^mcZbowcf\]`kjclisvqn~{tuz|
v~xtryy~oo|qiyz~mm|vkjxtl
n}vjxyozspljd`szi`er{Z`r|ygpzaee±²wJbZ¤ÚÐr{x~
olzy|xxoqt~ziy
¥o~vx
p{}oxh
xr|e}~vcpshxpot
{vxyj\p}r
}zrnqsxxnn~w{ehj}r`YwZYqnNXrsg`Jlvta][[Yt}roWg]fjp_oNWiR?Yf_Zpkgyq[[XkeYcpy_h\^elhfliqwol}upzv
qq{|zytjzko~t}or|{onxg¡gphz~
|ixrklf_aoxm_boy\dlzaqv_eeÔê¾2:>ry
v~nl
v}
|xnvwnku{tfy§}ntvy
~{xlri~xm|{xayqdqh~mtqu
~sv}ro[l~tx{|xzqlry~tmkvuv]iixqYW|SZqeL[rre[Jpwo\[ZY]t~thYb[genciMWfQ=^f\]ve_tp[YUodYepyZh^_gmgjlipx}liyn{}zu
pnw~{{h{~jt{r{sw}yx~|kl~ki{~}kuqghc[bgro_alsahpzast^cd n\5Y¯µuj}vtwpm
uyx}zsgv~~op}hvymey
¥~n~u||q{}
|i~mk{zjzvr`w~qdrgumu{
|owy|t~lWo~vswuzxrn
r~}~znnimun]hftrR[{N\q\O\rpcVKsxjWYYZaqt`]]`gdhifNZhNAad[`va\tmXXStaZdnrWj^ahkgmlipw|kh|}p~~{zwr{oqw{j~{nwyvw}x~zm£{vzkmy}{~prpcf^Yg_pp``gpfjouato[adjv{¾¦£È¸q
s}xtrrp{tutwyyqcwzirufwvcj|}rsxx{lxy~uhzikysizv}h`w}jkth{iv~z~~p{v{s~bUv|rr|pwxpp~}y~|u
uiqilrp^hcsnKeuL^oUTYsnbPOsxaRWX\aps[a\hedcjdP[qIDda\dq^]whUWVw^\enhVk^ajgeooipw{niy~s{~x|v}pvrnw~p|xyztxyvo~}
zw|htz|vgom_d\XeYmra`aqlkhn`siY^dmw©Ú©Ç²qxpu{zutu~wpqm
txul`zyfqogun[m}y}x{mus
{
muvnhwem{vmjvv|abxzhtuc}zgu{tuqz|lYVs}ot~xksykt}z}x{r|rgtemmt[k_ueHnnL[bWWVxmbOStvXPUX^aqo\`cmdc]nbT]rGCf_]fh]ZzcRV\u[[gkaVj_`nffkqhpvxtkuvx~w{t~oqtqu~{wx||
x|}~
{~svyzvuy^~yt
wzbnl[b[[aVjsc`[gnograqfW]ck|Êι¢jmmlqq|~{
zytyuu{jmucvwpg^}yeqkjqcXl{sw~{nqq
{y~qqo}ghrbnxqjlqx}|z]eywiuxfvgt|rio~xm|]Xq~ms{nnqvgwv|qzt|yrfsanlsXk_w\IokNWV^TU{kaOTurQQTV^bt
h\`kjfbYnaXbpGAh]`f^]U{^OVdpY[jh]Wg`_rfkgrgpswxntzx~yus
pp{wwuzz|u~}
~~}|xuyw}muydso
ztcnjY_[]]Tgse`YdrrgsbkeWZ`iw¾®{·nbsht|rzz}xxsvo{vejnausjb^~xyfq}hjkZVox£
qqxumr
}yurohyajm`mvjgklzwzw[g}|xer}nteu
ofkztltb\o|kt|zft}mqhu~x}r|lzzzwpelbm~mnVk`wVKjkOROhNY|hbNUujLPTU^fvf]aphg`Wi][khJEjZbdWYUyZNWnjY]le\Yec^tfmdqfrptwpv~x|
}usnsxzzss
x}v}{~{w|wwziw~|l
rq~oflgW][\[Tdpe_XcsuiupdecW\\hporsdex~itvss
xywtunk{pbhkgtnf]_}o{}hlwfidUWrp§||vs|s{ym{zv|}uprmgu]mh_ludgfizo{rYgwtgpxubw
|njmzpere`lyfrv{}auvikqtzpyxr}f~xvnceam|mkVkcqSLikPLNpG^{faMUtcJNSW`jw}e]gsie_VcWap]LKkXcaUTUsWMXudZ_k`\Zce_wfmbpisor~ttwx~z}v~
nrt{ztq
zut}
|~z~v{£¥y
lu|{uzn
sz
}unjheV][[ZSbne[Xat{jhmh_bW_[ijkoglahyykttto
z}vunzhjyj_enhwgeXbwi~zoioff]UXoh§vz|yuo~oruywt
ujrvgho\me^ms_gajxh{m[mssio~ywawxsqoyqbph[nvdps{xarpgjxsqkwvtwc{~wvpdccn|}kkUjcgSKlhPGRlEaxeaMSr]JMTYekwze^mpid]V_UnnWKShXf^XMUlUK\y_[_k]][be`zhlaoounowuz}wzzyz~qtt~zwt
}}ls{
}~{v¬zlrzvuno|sjomddX_ZZZUbjg[Z_ui^ml\aV\\kfrt}ij]kvvhtwrn{~}yvrmzhiwf]drgzwccTeofwvfhi`WVYhd§n~xzpp|fxnyzvq}~ndvsdhh]lb]oo[g_muezh]torkq{~uubt
zwru~taplYprbqq{udrlalzojhywtrf
uzzuqdadns~jlTi_^TLscQGWbGbve`KTpXJLXXgkvzdenpfcZX]XveTJ\cXhXYIWeQHbxZ]_l[^\bd^ij_otymonvyr}}vvx}suuyzz}~jt{}~
yz~|sq®{{~frzt}}vrol{~lzbpoae^eVYYWcfk`]]siXpm[_W[\l{cpwvlb[mstguvqm
yywnoteite[gtfvvz_]Rffjt}aci\TX^bc¥hyt
xmnygwm{ztrx|xhevm`fa_j`]tkYe]oobze[w|knnpxxttdr~zvoq}rawdZnoapq|seqd^nvicfyztmnus}sqb^fno}eiTiYYTNx_RJZYHbtc`ITmTILZVilr{bllsbaYZ[av[SKd]XiSWHY`NGiuX^am[[_bc]
ihanxylokvxm~vutsqvvw|}~~~px}yxy~ssp¢{zyduysxvlto~ly|pr^pn`gblTZZWhcme\\rfRrm[ZXX`lvdiujj^Zmsqltttk|~|wonldiqc[krdtvs[WTd`r~r\ac]SZ`\derq
tljylooz{{qvrzzzdeug^b[ah\^whWb]ohawa[|vjirowtsthp~vrjp{lfvW\jmbprzseo~[`pqb^ip|llt~rqxkp`\elm{agTgUWRPv[SPZRHcsb`GVkQIPZUkkk|emoq`[ZXYlpWRPfWWhSTFZ\OHruX_cmcXa`a^jcdmyxkoiuy{k}
|y}nqowz|t|tx
utpuo¢t{{fxon{ofxpzlsvsk^tnagekS][Ugbll[\qdNom\VXUgithbtee]Znunpuuzl||wscekoa\nmcsxkZTVccw||p
\c_cT[`Zccnp
sjhznervs{kytuoz~u_frc[^WbdYaufU_`mdaq]]~phisqspuukm{
qrfn|oqnSZejeqsvsblvUbqk[^ne|elu|rrrjm`Ydjjx^fTeUVPUnXQWTPHer_aFWjOHXTVmid|ikwkaW\U[tcSRWiQYfTSHZ[PNxw[_fliZb`^^nbfkyunoivv~m~{krgt{u}r}
{ss}un¥swxn{`d|qfzsylmqvgd|lcfghS__Tg`lo\^nhMil`UVSofskexde]Yptmr{xsm{w{zlaelm^`njepy~gZVX`kx{{o^b^gVY`Xdbkq}wkjwl[vqkyiurmo{rXjm_Y]VbdXeqcT^aibblZ`~lfksunmwvkh
zmqeo{lqlbX_hhosts^imSepeUbnaybpu{ukolj_Xaghu]eVbVSNYfSO]OOHeo]cGYiMI_KXmd_xhn}d`U^T]t[TR`fN]aTSJ\ZQZuu]_fmhXba[^qcgjwqsnhvsys{~|zntlst
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|}~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDEB1/0000.\pnmnnqI,00//,I
}}{{z}~||~}}}~}}~~~~~
-hS7¤¤¤¤¤¤£r]____aR4555553Sjggggk<;|}zzz|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~
~wxz{zz|||{}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{{|}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{z{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz{{|}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}||}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{|}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{~~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~zrtx|||{||}}~~~~~~}~~~~wwxrvy|}|z}|}}~~~~~~~~nzussvx}~|y}|}}~~~}~~hvu
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~iwuu{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
hmqs
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvuuvwuh`g`dinghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhf_kl`jhigccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsvyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z\ctmeqpe]ZY_[XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROMRhplapukTPQTPPNNOMKMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMNTflncosrWNNNOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKFBEIMahkqqonYLNRVPOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEAKOGHNahfpokhc^chWHHJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>>@T^Y]hminmljjllVFBDEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;<<EYfikojmmjjklWBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprtusqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;;<NinokmliilU@?CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:87IiompnkkW<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;===<Jgrwsl\?==>?@A@??A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquttusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;]n@>DE?>G[yrT@<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mvH8;:=>@=g\9<=<8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YQ<==ILEFvvM788:<??SU9;=<::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;]y|wV<=?=>?BU[:;=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAHrykb}]>@C@@?>Zc>;=AEABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot}~}
uLACE@??PrvL?CEIJIIMMKEDFGHFGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBAEeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
qBDEDCWuXGHJMLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAUtWHLMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHHGHFFFHJIIIIH]ooqrtvwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Ul
|PKLKHGFFDECC@ACCCCFFEB@=>@AA@BD?>?DFHDEGIJIIHHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJU
uIIFB??@??><<<>::<AA@><998<<=;>;9:?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLLSlpqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIe
fBB>88::9878896479;<:8567789787688;;;=@;999=<>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIj~T:8656766646763568:876565676778:77789;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBf
H6764688745784676:9766765:9:;:;898987779:98878589;A=>>BA?AKLOQPQOOORWkqrttuwy{z{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=qz>988;<=>9:;;89;9:;:99;:9===>;;<=:>;9;;<;<<99<8::;:999<?<<ABDIJMKIKLWorsutvx{{||{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
l<;>ACEEAAAB>@B@@>==>@???@?@==?B?AA?A@=@@@>?A=><;:;99;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
^>CGIKJIFGGDFHGEB@@CECBABCB?@DHDCEDEEBFEFDEFD@B?<@>=?@>???>?>>:;=<`qqttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFX
WGLMMKNIIKIIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDB@ACBDCCDDC@=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A?BBGGIY
PMONLNKJLJIIHJFDGHHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@98<;;=:?@>?@CFIIP_
rNQONLLKLJHGEJIDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIGCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADHJLUq
_RRPMNMKJGFBGJGLJFKNKJJJMMLOPNHIKLOQQPQOOJHJJMJLFGHGFGHFEEBABB\orwxyzyyyzz{|~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|XVRRTROLKJDEFKONOWUQPOQSRMSTOMRLPSUVRSQPLJMMMKNGGJFFIJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGHGGHF>@B=?==B?CCFVNFNOPTX{
hWVkaERQQPI;;QSR`u]UVTVYYRYXRZfPUWZ]RTWQPNRQPPQKLKHHJHEFIIIHIirvyyzyz{{|z{|}|}~}}}}}}~~~SHJIIGFFE??AAEBCGEDELXRMTUVX[|
}al[dU:XXXSQ?@VUY\d`VYbr]]V]ZVEQYZ[Y_TZgRVVXUTVTOOMJLKIILMKOMSosvxyxwzyz{z{|}|~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~ynpXZ[ZRTRVVTZZuYU}`\X]_WIV]][[_YIYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
nfYY\YSUTWRQWVcQerXZW_gP`f[[X\gaGOZhg\[\]]WSNSPPQVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOMKfy[]TYUV]ZLTZTST^ZXWWWzkX[[\^TQQPINOWVX[Zdqsvvttvxyy{{|}}}~}}}~}}~~~{xwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKMNKMKHJDFHEC>TcURQQNKRTQMOYQMNQSUUMQSRPOMLHCIHRTUZ\mruvuttw{zz{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRVTbs{|}{{
u_]KC?CCCCB?DPBC@C>BHGV@HNMG]iQHFOFDEFHGHCDHGHKGDBADAOQMSdstvustvz|z{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OOOLQSQUYSUQQTROV`klrv{{xytrnstsyx~~lMG>?;;>@@??>jQKaEFHIEB?GLMGMQUIBE??<=<==?=?ACC@?<=B>JMGUnuuustvxz|{}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNKLQRQTUTWQQWUPX[b]agmmlokg`nrjmlqu{z}{xz||xwxeC@@B=:BCAADB\]O{NONNKLMOOQLKLWMHG@A<977599=;;;8989?;BH?\stuvuvxz|||}||}}}~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIHPRQOMPQNQRTVXSRYTNYZ[WY]^^_e`]^qvk^`gkwooljonnlfbYHFFHBAGIEEFDMROaWRWQPSSRU[OOQWPMIDF>:96587979:366795<B=estvxwyz{}}||{|}}~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXRLXYZVXXVXY]WXXhsk]Vaskaa_^da_^YUQMONLIHJKIHFCQPS[WTTNQSYS\eUOSTQNKIHC?A9988978857578599Gmqtxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOTVXXYSVTLKTUUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLPRROMMNNNLJFQPUYSTNJOOUST\VRUSROMLIHHF?>=:787659967675Wppswyz{|}}}}|}}|}}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpofedc\^RTZVWUTWTRXXYYYRUOIGOPOOMRJOPPPNNOTLMIPOSTU2=XMIAQ=caQSQPNPQPNNMQNTRPRMILKOQPRRSTQROLLKLLHCBA=::876;B4566:doquwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWUQSFFAFGGHFJDHJHGEHLHKIFLMPMG/E_R>3@>joaRRQ@FUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;==<9=G6677Dmptvy{{||}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWWVYYVQQQO@>;=?ABAC@BEDA@GHGHFFHJMKEGCORC8ENS]fSQSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Spruy{{{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpknqmimcLOOMQSLTVTWWULLKI=987;?@><=A@B=>EHGCFFIGJJ@FAA@FHEJOHPRb\QPRNSOOPLLOMKMLMON[WKMQOGIHCIJLLJFFFE?BC><BF?B?Adptw{z{{|{zzw|wy}~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;?B@@>ADIECHGIFIEBB?>=CBAGJEMObeQMNNWKLMKLMMMLKNNSdMJLRIIIEAHJLMNJGIFBAB@?EFEHDKnovyyy{{z{zwtxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHKE?B=999:?B?<@BBADEGKFCHIGGHCC?B??@A>DECKNQTLJIMTGIIJLJKLIJLMOPRPKGCLGCBJJLMOMIJIGCCCDHJMLIYrmwyxz{{y|vrpurtyyvxjqnkllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHJCGHHGJKIJKDGB=>=:::;@B?=BBBCHFJLJDIIFGGCC;A@B>@@CDCIMPGIKGHKDHIKMHJLHIJKJM]RHHDNFACKKMMPNKMJKFGGJMNQNLbmivvw{y{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKDFEGEFFGEGBC@=<=9:::@C@>BCDEIFJJLFHIGFFDB;BCC>@DDCEGLNHKNHDHEILNMHILGFGIILNKJHENIBFMLOMOMNNMKIHIORQRNRfffqosxu{z|lhjnfkpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJCEFEBCBE@DB>@?:;;=:=>CA>ACEGJFIHKHGGGFEC@=EEB>BDCCEGHIGMPJFFGKNOKFHIFEDEIJHKIGHPKDIMLPMONOONKJHMRUUROWd`amgproryzgehhdilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerLHDEGCB@BD=BA>@=::=?;>>@B>ABDGKFIFIHFFGECCAAFFCBCBDEEGGHFLQLIOJJLLIGHEFEDCIIHKJGKRMBNOMPOOONOOKKKOUWVUTX_^\iaminhrsbefedihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGGFHBB@DE<A@@C<89=>9?<?B@@@DFHEHFFHGEEDCECDIFCFEBEGEFGGEJMKHQMJKHHIEFHIFCIJIKMKPSNDQRPQRNOMNPMLMSWVWXVX]Z]d`hbjigk_eefcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqiozMHGHHBBBFE<@BBD<7:>=:>:@B>??CEFDFDDHFDECDEEGJEEJGCGHFHGECFJJGMJLKHJLFIIKHEKKLLOORTOISUSQSPQMNQNMPWZVZYVZ]ZXa```^hec`dfhgiihjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmsunprsyNIIGIDACHE<@EBE=8:>>=<<AB=?>ABFCEBCHECEEFGGGIFHKHCIHGIHFDHKIGKHMLJKLHLKMKJNLONPRUVOKUWTQTQRLOQPOTYZZ\ZY\^^^`c^\ackb`dghr
hgjfjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvpuMIKHJFBEGE<@GCD@:<>@?>?BB<@>AAFCEDDIEFEGEHHFHGIKJFJHHKHFFLHHHJGLLLLLIMKMMMOLPPQUVWOKVVUSSRQLORRQV[[]^[\^__a`ad]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwovJKLJLGBEDE<@FDDC;??A@@@DA?B?ACHBFEFHFIFFDIHGIHJMHHJJILJFJKHIJJGKKMMJJMLNNNPKOPRUXVMNTVTSRQPLNTSRW[^^_]]`_`aa_acebchbdijgvlkigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvowKMLLMGCCAD<?EEEC=AACBBCEABDAAEGCGHGGFJGCGJGGJFILHIJMKMLGKIHKKNQKRQMSMKNNOPPOTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBBEGCCIFCHJJIIKGDKJGHJIIKHJJNLNLILHJLKZfJd\KlSHON_nUks[qpbwcRPavuhucav`Xnqbdvinzf[lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJKJFB?@B?=DEFDCCBEEDFBEFHCDJEEJLMKLLGGMIGIKHKKIKJNLMMLLILML[sbdp^lmUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemxmkvmnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED@AB?>BFGBFCEDEEDCHHGDEKGGLMNKMMGJNHJKJILKJJKLMNNMMJMMM[roonpplkMPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\_rkqjUuyxpc^kfbgppjiopprspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryJKGHEEEBBB=@@FGBGDIEEDBFIHHEGKJGMMNKMNGLMILKIJMIJJJKOPONMKNML\hdu]lqWlNPQmUZk^klvaldtTecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIDEECAB<B@BFDGFLHECCHKHHFJLLFNKLSRLGLLHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEEEA@>CDBGCHIMIFCFJLIGFJMLFOJKWRKGKJJNIHJLIKJIHJMMMLIKKKSkbZi^_icrrZ_Yjo_eeUk_c[aaQ`lh]j\ojid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFIDEDFA@AEEDGBHJLHFDGKLIEFJOLIPIL[QJFHHKMIHJIKKIHIGKKLLFHKKLLLKIKLNT[\TPTLPONOOVQOOQNOQJINPQeriTYW\[\UYZ]X]\\cfaaebce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusHCEGFFAEC?CHDFGDIKLHFDGKLHDGHPKLOKLWLIFEHIJHIKILJHFGGIGHIEFLIJKNLIO\W^P\[`^OXYS\\b^MYZMXaRJYaZS`d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBEIEGGFKJKHEEJJJGEHHPJMMJMSIHFAHFJIKLILJHFEIGDFGEEJHCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN^\^S[^c^Z]`c`Y_b[`^[TXWY^]cbcacfiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCGGEHGHKIIIDFKKKFFIJNKNLHLNHHF>GGLIKLJKKIGEIDCDDBGJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa^^ca`bbbcceZQYVU\Z]c`__cebhomnllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKFCGEBEHIFGHHFFJGHFHKILDDKJMMLLHJJHJG?GFNJKKMKKKIGGCD@DAHIB?IJHO]aZ[d]_TQRX]\\\_ZKW\LR\YIN^QO\_acdccb\dcbdcfXQUTR[XZa_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCEKJFFFHGGIFFFILJNEDKJLNJLIKJHIFBHHQMKKOMKKIHGED?ECIHAAGFET]Y^X_Y_[]UXXP]]QKJV^X^[]VY`RQ__aba`bb`cbaddbXOQQQ[S[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAGFDGMRHCQJFHHHEFKJMPEGIJKNLLILKIIGDHKQOMMPLMKKHICDAEDHGBAGECWUE\T^SV_XNTUNZ[MJKT`a[_X^^a]OYb\``_bcb]abW__TPNOPXR][[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPCV^IGGHDFMJPPEIIKKNLKKMLJJGEJMQQNOPMNLNHKADACDFDCAEFBMHBKLPONLFMFGIJHGLLMOPILOPOSPLQSRUZYWYXXdWOSTPPNMOUT[YY[]\`adecgcklpsszy{z~{}{
}KIEEGFGDKM]LGGXMGHJHGMLQQILKLKNNUNOKKLGGKPTSNPONONOHKF`ED_LDfcEM[I^[rmOMUmYLCP`UlWgJ]WU^DLQULMTVQRTXWTXUT\UPfZhhdXSkSVVU[\[``aaab`fhfnlhrz|}~}|zr{z{
~z{LIEFFHEEKOSIKF`THJOJIOMRQKMLLORUROOJLNGHMQ[YOPPNOPOIJQQI|YYrsXPmHqnoaVPqqsPCksmqtpSo_[nX]V\XUkhU]VcZ`Y[`VUWjtuu__v_Xa\\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMNBDLLFJLFRVLKNIKRXWQNOOMQTNOQPKKNGMPS[ZTQROPPPJHZx]TxehYRTQvgtlpbnfjQrOMwmjrpsrqrpoo]fzuxqqzq~s}ku}bRg|essosr{|o}yor_``baZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJPNMMJNV^YULQSNYZMSSRNLOIQRTYWWPTPPPQKHgxlcxrmZKMUypumubnvPdeJfvqmwojfxxiWrRi{lijzz}lxzphoXvvjuup`rg}ilx|o^__ba[]bdgijdgbcdllppstsssyqrxblugry{ssuy~suzn|}yxrnNKStNCBEPPHJKJLQOOOMPZ`ZXKTWPa^RVQYSLOISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTKhx}x`y{sna^mocRgqunmypwlvttqlm\t~zkmy|ktm|kpvux^__b^]_ddighee^abiiijknokqnmjpacfdowxompsy~nqpj{ztromLL[VHGEGRPILMKLQQQPPQW\YUMUYUfXRRY^TMNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhe|ir|]TKl`vukiv|{m~xk|p]^^b[_bddgeeebZccikkrsrwgmihdg`alagsrlgmmr|kmhk{tmmkmOHJKHIIHQPLNOLKSSSOSRWRVTPW[VVTTTa`PNNKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXXQNPUTXXX[[URSW[WXWZOSUWWXR]YW]VTOYRWWWXY^[gr^[[Y\]_cZ_ccdfdccbZccfffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilQIKLLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYXPOLMVTQNUSNOMLQPKJRRKQMKKORURQQSSIHLNOQRQQQTVRXW\WSSPQUVVSZQOSRWVTYVTYUTRUTTTWXW]Z^a]\ZZ\\`c\]bcdfdedaY`acabhhincad^_c]Zd\bma^fefmsdihkkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXTQPKOWSPNUPNQNKSPMOVTNQNMNQTPUQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[TOTUXUUZUWYURRXVUW[YZ_]UY^\^]\]`a^[bbcgfddbX_ab^`hefda^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTOOSQOQZYXWXZZXYV\jdVXYZWVTTPKOVTPOTPPPNMQQPRXTQQOMOSVNWRTUUONMQSUUTTRTXVZ]\ZVWQRWXV[[WQTVVVVYTWXUSRXVUZ]Y]_^V^]^`\\`___ZbbdhgddaYb`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQPU\ZZW[[\YZ[dqmhd_[YVVXRLMVSMNROQROLPSRUZUSPPLPWVRWSSSXMOPRTXUUUSUYX[^][[VROUVV[[WRTWVWXVTX[TSRZWV\^Z^_`Ua\aa]`b`]`]cacghdf`Yc`a__ed_`c[Z\[\YZXYW\Y\[`^_[^^a`_b\Y`ZQNONVQPTROUTSPW\]\X^\_W\^jqwyc\[VVYQNOVSNQQPRTRKQTTYZWUORNSXWTSTRRZOQSSV[VVWTVZX]^\\^VSNTUV\\VRTVVXYSTY\TSS]XZ]^\```Vb[cb^ac_]bab_dfidf^[d`a`ace_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUURQWRTP[]^^[`\`U\]ijr}slg\UXWQORZSRQTRTUTKQWV[ZZSOSRVVVTOVRSZRTUTX]WXXSX\X^]YZ]TUNVWW_[XRUUYYYUWY[TSV^Y]]`]bb^Y`[eb_dd_^cca]efidf]^da`abcd_b^XZ_[\[XXXXW[Z\`\[[\[XZ[^V^Y]POORZPZTUVVTTT^^`_^b\`U]^bkyum}lZUYUQQS\TUTUTVYWLRZW]Z\ROUSXVVTPXRSWSVUU[]X[YUZ^X_^Y\YRWRYXY_ZZTUVZYZWXY\VTZ^\^`a_dc\^]]eabfd^_dc`\gdhedb_da_a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]_T]_beev{hXYYSVSV\WWWVVW]XPU]Z^]]TSXSWVTSTXRSVTXXX]^X][V]_X__X]VQYTYZZaY\UVX[Z[YYZZXV]^_^cbadd\b\`fadfd_`dbb[fchecfaf__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNTZVS\TVWYWV\`abcac^_V[`da_zuohY\ZUWUW[ZY\YXY`WPV^\`a\TUXPUWUSWVRSUWZZ\_^Z_\V__Z]^Y^VSYWYZ]bZ^VW[\[\[[YZYY^_``dbceebdZbfcgfe^ab`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXUXWX]_badad`^YYadb`kfh^\][VWXY\\\_[Y[bVTX^]ac\RVYQWVWVWVTVTX]\^``]a\Wa^[^\[^XVXX[[_`\_XY]\]]^\Z\X[_a^`dcdfffbYceehgd^c``ec]fidei_g^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNRWYVWZX[\XWY^`baeada]^Ybcb_a`a^\\\WW[[]]__\Z]cXZX]`cd_RXYPXWXYYWVXV]]^`a`_b^Ya]]^Y]^YXVW[\`^]_ZZ^]^^a\[[Z\`b^bdcefefbZdfgigc_c^afdZiibfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxLWW\YW\[\]ZW\]_`bdbba]`Xbcb`cab][\[XW[\_]`_][`d\\XZcec`R\YOXXZ[ZZWZY`]`bb`ac_\b]_][^^YYUX]^_`__\Z^^`bc\\W\^`bbcedgeefd\efhifcbb\cg`\iibhife`baca_`_]][Y\YXWXYXW\[ZWWXPXZ]acffrkJYW][Z_\[^\X][^_acbaa]b[bdb`ccb\[[ZWXiq`\`_]\ac_^YYdedaS_ZQYX\]\[Z[[c`cbc`bda`c^`\^^_ZXV[_^]aa_][`abeb_]T\``cddfdgfefe^efhhgdd`[fg^ahhchhfc`b`cb___]]\Z[YXXXVZV\ZZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{{{{z{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{|{zzzzzz{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½°Á¾¾¾¾Á¢~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊ»ÎËËÌÌϪ}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxyxxxxwwwwwwwxyyyyyzwopppppprrrrrrrwzyyzzz~||||||}}}}}}|||}}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvuuyvvvz{x{xwvx{xyyz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{zzzzzyyyyzz|{|||{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy|{{{y|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwwy|z{x{zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww|yy{w|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz{y{y|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy|{yyyyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd_t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`w|{{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbu}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrrqpopqqqstsssrqqpponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxopprrrrqqppqqqrrssssqqrpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnnnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrsrrrq
soopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqppqrrz{qqxqooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqrp~qoroppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqpv¤{nvopppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqpvªo¡zoqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrpv«q¢}prqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssssssstz«¢{¢}rtsssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~~|vvwwvuxzxxxxxxxxx²¥¤«§~{{yzyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~}|||}¦¦¢²¤¨z{{zxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}}}~¨£«~||}}}}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~£ ¡~~~~~~
~~}~~~}}}~~~~~~®}~}~~~~
|||{|}||~~~~~~~~~~¥¢
|}||}}~¤®¦¢ §©¡¡
}||~~
©°°¤¢¡¢£
}}}
¡
¡
~~
}}~~
~~~~
~
~~}|}
~}}}}{
~~}~
¡
}~
~}}
~}~~
~}~
~
~~
~{z
~}}}}~}|{|
~}~~~~~~~}~}}}
~}}~~~~}|}}|y|
}~}~~}}}}{zz~~
~~~~~~}}~~}}}}~}|zzz~~}~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~}~~~~~~~}|~~~~~~
~|~}~~~}~~~}}}|{{|zzyyy{~~~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~~}{|~~
~~}}}~~}}}}}}}}}{zyyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
}}|}~}}}}}}}}}}}}}|{{|z|yxy}~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~}~~{||}~
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}}|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}|~}~}}}}||}~}~~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z}x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}|~}~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}~|{|||{{z}~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~~|~~}}}{{}}|z||~||}{||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~~|||||}|~~{|{||||}|}|~|}|{{{|z{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}|}~|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{{yzyxy{~
~~{zy{}}x|zr}{{}||~~}}
}}~|~~}|}}~}}|~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~~}~~|}||~~~~}|}}{}}}|||||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qyx{xyuu}
~}}~~~~~}}|}}~~~~~~~}}~~
~~~~}{z{z|{z
~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|z|z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||~}}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vwvst
}~}}}~~~}}~~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~}~~}~}~~}~
~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}||~~~}~~~~}~~~~}~~}~~~|}||{|uxyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~~~~}}|~~~~}|~~|}}}~~~
~}}{{||zw|ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~}}~~~}}|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}z}{yvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~
~||}|x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{~~}y|zzz}||}z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
|||}zz|~}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwm{snym}rsvsvmnwlpylu}|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}~{~|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozks|nv~~}}z}{|}}~}~~}~}~|}~~
}w}~{|{~{||}~}|~~}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~}}|}~~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}|||~}|}}|~{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~{{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{{{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}}}}}}||}}|
~|~~
}~~~~{}|}}~}~~}}~{~{{zy{zyzz{yzzz{{|z{|||~~}|}||}~
~~}~|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{zzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{}|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<C:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA>;A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖ××××××××ÖÖÖÖÖ×ÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILN@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸ºÑÔÔÔÔÔÔÔÔÔÔÔÔÕÉ»½½½½½½½½½½½¾´½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVM<::77>C>8>:??A=?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¢§ÏÓÒÒÒÒÒÒÒÒÒÒÒÔ¿¨ªªªªªªªªªªª¬SRSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤£¨ÏÓÒÒÒÒÒÒÒÒÒÒÒÔÁ©«««««««««««®XWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©¬ÏÓÒÒÒÒÒÒÒÓÓÓÓÕ¯¯¯¯¯¯¯¯¯¯¯±¡babbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÔÕÕÕÕÕÕÕÕÔÓÓÓÔÓÒÒÒÒÒÒÒÒÒÒÒÓÓÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<7@A<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÓÔÐÏÐÔÒÏÏÏÓÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÖÕÖÖÖÖÖÖÖÖÖ×ÖÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎЦÅÓȧÒÑÇ«ÑÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒª¬É¬°Ñ¬²ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>@98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐÉ
¦§ÄÎÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@B9647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѤ°½¢ÀÉżɯÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8E@?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÐÕ¹¦ÖÎÑ ÎÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÐÑ»³ÃÚ£¿ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÕ§¤ ÓÍÇËÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÒÀ¢ÈÕÍÛ¥³ÐÛ£µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÔ¤ ¸È§ §»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÈƦ½§¥¨ ¯§¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ Ôʨ¡ºÕ¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÔ¯°³ÒÔ¹ÇÕÓÓ¹ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÔÖÖÖÒÒÕÔÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EIKAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDI;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsnupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸¸·······¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨§¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¥££¢¢¢¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¦¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡ ¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤¤£¢¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::78:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢£££¤¤¤¢¡¡¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¡¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡¢ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ± ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¤¢£¬¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ©££ ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq ¦¢t£¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢£¡d¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡¡£\ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡¢£xZ¢ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¢¡q[
¥¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ obv
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v~thi
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{z
vjd}
§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s|z
sj`y}|¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}zz{~wog[
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~vl
~hcX¨®²¯°µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWMO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¡¢¡¡sl~e`Y ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJDPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©©§¢¥¨©¬ª©¯ ¦|{rb_¡¤¤§¤©«®¬¥¤¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®«ª¬¤¡¢¥©§§¨¨©x{xpm¡¡¨§ ¢¢®««ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPOSe\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¦¨©§©¨¤§¦¤¦¢¡ ¤¦zfa
cps¢¢ ¡¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]\PUOXO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦§¦¦zfVN~{yN_jx ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_[UYQUW[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«¯©¨ª¨¢ ¡¨ª®±³®«¢¡¬kQJIwtoEQak£¤¢¢¡ ¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocmjib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£ ¢ªª§¯·¶µµ¶³®«¯«\HCGrifCFXf~¢§¥§©£¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ ª²¸½½¼»º¿´®±¼qPWMDoa_HDO`o£«¨¶¢£¤«¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhvlphiibZSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µ¶¼ÁÈÀ»½Æº¹¸¼aYrCl`_NRWZf¢¤¨§ º¦ª«µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`ftotitdidb[LK>:9898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÄÇÃù½ÃÔÖÇÀ¼»ººV{ªNnngQ[d]\¬¨§¬¢µ¦«´¼°µ¶¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`b_^kcbnxuvnm[bRV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÂÕàÚʵ¼¼ÀÀPÀ¿a}y]JipSz³¸¨o°£¦±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|~ifhaklgnuqruqg^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÄ¿ÃÂËÛÙʳÁ¼ÀÆ¥U¢¢p
|EwUk«°zcq«´¦ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|~tklndomiqxnyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄÍÏý¸¸¾Å¯ct{k·W{]k
raZ·µ¬®¥¤£¨¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyy{wnkiguZfrxsyff]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÅË«©²·pqm\¤¸hgrhhje^Wh¤ºµ³¬©¢¡©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijg]jonxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÎÏÌÃÇÆÈÉÈÈÉÇÅË˯vpc`ªªp`dga]\XU»¼º¼¬¦ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvhiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÂËËÈÇÎÃyg_M`¡se`^XWXUg´ÉÀ¼¾´°°°Á¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuntb]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÊ´~qj]QPB\}of[XTUUTÂÀÀºº½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfefcjdbjmno^Y]VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÈÃÅÄÀÃÂÁ^RMHKAUvinsohg]XTVS`©À¸¹»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbacccjbgc[ZZ\YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÏÁ»¿À¼»Æ¯nIFDH@MdY`gfbhdYSR[¿¿º·»¾¹µ¸´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qdabchjfgiei^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»Â׺¾ºÃµ¹Ç·`A@E;J\SXaa`gh\RS~´Å¼Á¿¼Ä·¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zyqmeefoielhXXNKKKRJLHD9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÐÄuªË½Ç¸¹··P@A8LXSS]_^eh]Sa¡ÁÈÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgqksfbm`\TIKJDJCCG>9;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼»À·ª¤®°¸»²½¾»Ä¶µ¸µ·¿¾Ä¼ÂÄ׬r½ÈÏÂÀ·µ}O?8MURS^`[ab^U¸½ÇËÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qflintnxcgb\cQKTHEECGB<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹¼ÆÉÊÂÇÉÒnr®ÒÑÌÊĵº¿®L<LWOT_`YZ[Vo·½ÀÃÌÊÇÅÆÀ¹¾¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_c^`aNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»Åк¾¼Ä¾·¼À¿ÉÏÇÈÊÊÁpr¦ÌÌËÍÊÆÂÂɾuGG^PRZbVQR\¢Â¿ÅÀÊÉÂÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw|`qc[^__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼·»¹Û¾¶¾À¾¾º¦ª³·ÄÀ¥vtwÄÆËÈÁÃÀ¿É˦lK]RPVfNJYÄÀÀÁ¿ÊÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxshp][^]YRFDCMIAD=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Å´m¯Î½¶¹À¼ª}nhnmtpw|¾¿ÆÀ¸¿¼½Äü¨tfXVcpM[Àļ½¿¿Ã¾¾Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸··½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vlu{pni[__YSPAFHGK@ECH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀͰu´½µµÁ¤iY^`NS[\orv ¸·Âº³º·º¼¾º½±nfto¿Ä½»¾ºº¸µÁµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾ºº»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_f][TJ=??GF=GCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹ÂÉ¥x¢°µjfgUY_IIMQTlu¦°·¾¹²µ±»¸»µ¹À¯vy½ÃÅÃÀ¼¿¹³®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_cb\^OIB?=IDFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Æ§{v¡_SCYUHbjUNDId¡¬¯¶ºµ³±«»¸¸´¸Á»»u·¼ÁÆÂ¾¹¹µ¥¬³±¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²º¶»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ovrnc]gX]]SOMA>JBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿³ymMJ@eYBPxgLB]°µ³µ²´¯¬»¹¸¶¹¿Â·u®µº»¸µ²±¬¤¦§£¥©®¹¬««¥¨¤«®¯§°¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuil][jT]\PNHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³¸µ
{WEBQXIJXxa@V¤¹³´³°±°¹¸¶»·º¾±¬ª¤®¸®©ª¬«£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndUacW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²»©gL?TyqNIIKh~XEX³»±¬³¯®¬¶¶²´µ®¨¢§§¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vzcwln]QhTPNGPMLBPQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Áª¥½fES¡PWIK_IX`ef¯µª²´®ª«¯°²³¥¡ £¤¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uv}mk{dhURdMJHGORNJNH<E@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© ¬Æ¿ËNAunOmJMcfvt`]bs²¯®³µª¦¬«¢¡¡¤¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¥¢¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wx|dyy`bSU`HIJKSTIRQM9?B67<65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥ÇÆVRKf£Xf}or[Qkc\gb`l´°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´ª²®£¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZZMQJOOULSMB7>B78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£xTjqwvodwvXWb`di[[Vg®¬¯§¢ ¡£¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸²´¤ ¥¬¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xujwu]mZQ`HRUHFUVJCMG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ £~np`cWL[RZLLQYRHOMG¬ª©¤¦ ¨¥±ª§®£«®¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§ § §§¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmivmhm\X\CWNJGMGCFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£aW^e`WMQF=?@CD?>BQw©©ª¥¢£
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÄ½Ã¼·³ª³ª³µ¯³®ª¯£«§¶²¢°¦ £¯±®°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤{trkktrqhV\QFTIDJPI?EA4FH95<>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ |_^e`PFE;B>F<>96N~ª³§££¡ ¥«¥xm ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÄÊÉÃÁƾºµº»µ»·°µ²ªº²®»·¿»º«¸«ª¸ºµ¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkchoxkeZ[FKLEDSMDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡}riaWNE>IZ|oaA=\®¬ wrqmp¦®´¹Å»ÍÇË¿ÂÌÍÍÌÇÉÑÌÍÌÇÉÅÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÂÅÆÆÊÈοÈÑÌÇÅÇżÃÁ¿¿¿¶¾³®¿ÀÃÃÇÄÇÄ®¿¸²¸¼Äº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLDEPIDC@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £if\TID@?J¤ ²£yqroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ò×ÒÕÖÓÔÈÌÆÌÍÉÒÍÎÓÍÅÈÊÊÁÇÌÇÉÈÆ¿Ã³³ÈÄËËËÏÇÊ¿¾¿½ÁÇÅÍÌÈÉÀÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡aSLJDC?CT±Ñ½²¯¦ ¤¡}wpkebhqoq{
upnqtp
³Ã¾ÅÑÐ×ÖÖÒÖÎÔÖ×ÔÓÑÓÔÔÓÏÒÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÖ×ÓרÎÒÊÏÑÌÏÐÌÓпÈÇÊÄÌÌÌÎÏÅÆÇ¶¿Ê¿ÒÍÌÐÆÉÈÀÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨|xsvpc`drb]R\IJGAEIJ>;A8=5586;85:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢ YI@ADAFQw²¯§ wic`__`_^__]blutppolrquÄÈÆÔÖ×××ÓÖÐÕÔÚÔÔÎÏÕÔÔÑÑÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ×רÑ×ÒØÙÔÖÌÏÏÊÍÒËÎÐÀÆÂÈÆÎÎÑÑÒÈËÍÀÊÌÆÓÏÌÎÈÅÊÇÇÈÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>43:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¥®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£ªeC8=>DXª¨}pecb__a_^a`_``_`fmppnkorwwÌÁÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÑÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØ××ËÈÎÄÉÏÌÊÌÀÉÀÈÊÍÎÐËÐÍÎÌÎÏÈËÐÐËÎÊÂÉÇÉÌËÌÒÓÍÓÑÑÐÐʽȹ°®»¹µ«¶°¨¸³¾»±
zvopokadnpaW\ZIFFDMXE;@=33<<87865;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¥¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©¤±yHFB;W¡k^^^adb```a``a^__^\bmroostvvy¤¿ÌÕÑÖÔÓØÖÎÎÓËÎÎÅÎÊÒÒÏÇÎÍÍÔÌÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÌÂÈÉÃÌÃÅÈÊËÏÊÍÍÐÎÓÌÆÉÏÍÈÇËÅÆÁÆÊÌÍÐÑÆÐÎÎÍÌÐÅÇÁ¸¹½Ã½ù²²¾±»Ãõª¥¡yqrkmg``phYXhVMGLIPQB;C>;68:8::57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨xlpr{|eabb`]^acb`__`aa`_][]grqqrspmry¥ÇÓÏËÐÐÓÔÊÅÉÉÆÆ¿ÃÅÏÎÇÅÇÍÊÒÈËÎÎÆÑÒÐÍÌÔÊÇËÎÏÇÇÏÒËÐÏÆºÄ¿ÆÉ½ÂÇÉÎÄÂÇÀÇÍÈÄÌÊÌÏÈÄÄÐÈÆÂÆÈÄ¿ÁÇÌÌÌÏÂÊËÉÇËÐÄÅÇ»ÇÃÉÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ½¹ÍÌÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»£¶}h
¤«
}~s_[^^^`^`cdc_\]^_``_[Z\akrrookloo}¹ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈËÍÉÄÂÊÉÁÁËÐÅËÈ¿¹Á»ÆÇ¾¿ÆÏËÿûÉÇÉ»ÈÇÅÊÀ¾ÂËÆÅľƽ¼ÀÃÅÌÅżÀÉÃÅÇÒÅÁÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¦£ {wrtfiZanmZ\XRDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾±¯¶l^y}¢z
vxurp_Z[]``bcdded`[\]]_^`[YZ\borokilposǽÊÅËÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÃÉ¿ÁÉ»·»»ÆÃ¿¼ÁÍÃÆ¾¾µÁ½Ã»½Æ»Ãº³¼ÅÄÂ÷¿µ¶¾¿»ÌüµºÈº¿¾ËÃÁÆÂÅÉÇÉÆÐÆÂÌDzÇÉÃÎÌÁÅÿ½²·°²§¨¨¹°¥°ª¬zvwjdg`hocV^YJFJEGKAEBFJ@9:647854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÎÅÉÅÇÁ¹Å½«¥_dux~{ttc\\]^``bcaadeb]\[\^\^]Z[\^hsqmggnory½ÌÀúÀ¸°±§ª¬§¸´¶´³³´»µ¾±¶°µ¯²¼Â¼ÁļÀ»µ²º¾À¸Ç¹´»¶Á½·¼ÆÁüµ®²µº¿´Ä·»µ«¸½¾À½±º¶°¶º³Å¼¶®»¿µ·´Å¼¾ÂÅÀÃÅÆÇËÅÀÅÆ»ÇËÀÏÉÇÃÆÁ÷ý½¶¹¾Ç¿¬µ»µ·¶ytxggebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÐÍÒÏÍÅÇÁÆÀ¿º·É¶ª°[ho
zx~ww|sh]]]]_`_`da^cec__\[^\]^Z[[]_lpnhfknnr|¤ÇÀ¸¸µ°«§¢©§ª¬³ª¬©´®·±³©®¦¬³¼º¶Ã¹ºº±«µ¹»³Âº°À±¾¼¼¶¼Ç¹Â·ª¨°²À¶¸½°±¨±³µ»¼«®µ¦®¶¯»²°ª¹°»®»¸»ÀÀ¾¹Ã¿ÆÃÅÁ¼ÆÂÈʸÅÇÅ¿ÇÃÃºÄÆÂ»ÆÉÌ˳¹Â½»³svvkiablhYWW[ALKMJEAC?FA:9:995754::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÏÇÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³´µÃ®©°[j{x}
z{wn^]\\]_`__dcbdcb`_]Z[ZZ]ZZYZ\enohfgiknrº°µ®¥¤§§ ¤ ¥«¤¨¢«ª¬«°£¦ªµ¶±½¹¯·°¨®¸´´¼¸´¼¯¸¹µ²¼À²À¯¥¨£«±²³¨½ª«¨«¬´³¦¨®¡¤¯©²¦§¨®¥¨·±²·ºº»²¼¾¾¾Ä¿µÂÁÇÈ·¾¿Å·Äÿ»¿Ä¾ÄÈÌÊ¿¿ÃÀÀ©strji]aocWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁ˾»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ»¨«dmz}~xt~|swe_]\\^_`^_ccab`a_^]\ZXY[[YXZ\_fkfdgehjor
ª¥¬¥¡¤¤¡£©££¥¦§¦ ¤¦¬²°¶·§±¨ªµ«´¹±¶¶®¶¹²°ºº±¶¥ ¤¦±§«¨¹ª¤§§¨§² §¦¤¦¬§£ ¡±¬²´³´°µ½¶»ÁÀ²º¾ÃÁ±¹¹Â³Á¾Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ xplbf_ko`UY^HNgOTGFKF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7776788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÂÆ¸¶ÇÀÌ¿¸É·»Å¸³Ä¸³¿À¬µ¼²¬¥¯³¡£ir
|xusomjjipi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggkmo©¡¢¡¢§ ¤¥¢§£ «°±µ¤©ªª¬¬¤´¸·°¬³µ®³µ®°ª£¢²¤¦©¸¢¦¦ ¨¬« ¥£°©«§««¬°²¸¯¸¹º°¶¼»º«³²¹³¾´¶²±¶µ¿¶¾À½Ã»º½zsk_e^ddXTW]IW\KPGJJGA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÃÃϾºÇ¸¸¿·²Â´±»¼«¹º±¢©«§m~
xrmomkb^aff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bddeffhikq¨¡¢¡¨¥§¢¥ ¡¯®®¯²¡¥£®«§¢µ°²²¬¨¯³§º³¦¶ ¢£¡£¢ª¶«££¦¥¦£ ¢«§¤£¦«²³ªµ°²«²¹´¯ª¯²²³¸³®©¬®²¸°º¶º½À¸³±
zuf^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿²¥£¥±Âµ¶½´¸ÂÌÈÆ¿Å¶ÁÀÆÎ·ÀĽ³¹¹³¿¶±¹»¬²´¯¤ª xxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¡ ¡ ¡©¤©«§¯°«£¤¸ª¡ ®¨¶ª§§±¤¸°¤· ¢ª¦¡¬¹¯¢¡¤¢ ¡ª©¤¢£ªª°¨´«ª§³°¥«®³±°°®¯§¨¨²±´°¼´º¸®£zvd^aVYXSRSKM^LOKGGLLE=A><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§¢ª»À½À¹®´¸ÁÌÇÅÂýŸÈ˲ÁÂÁ¼»µ»¼µ¹¹°¯°ª¡©|wqilrtphhedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbcdfi §¦¤¦§ ¦ ª¯¦¢£·¨¡¡¢¨³¢¥¨¥°¥°®¬´¡©¡¢±±££¡§§¡¢¤¥¥«¤¥°§¥£««¦©®¯¯«¨ªª³¦¦¬¯´±®¼µ±¯¯ zwrea\Z]XNLQGQaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥¦¬¸»¼Áź±¹µÄÉÉÀÃÆÅǶÅIJ¿ū··½¶½ººµ²«¨£t~vncafihfgifjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVURTRU``_`a_aacei£ ¥¢¦¥¥£¤£ª«¥¥±ª ¡¥ª¨¢¬©©®¢¢¢¢«©°¢¡£¤¡¢ ¡¤¥£«¥¢¤ª£«®¥®²©¦¥¦¦´¦©¨³µ´¹º°ª¬rpo`[WVURFQNHY[ORITKSLEFID8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±¾ÃȬ±¸Áµ¼À»´´ª¬¦r{tiijlgjkmkjle]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURRNQY]\]]^___bdm£¡©©«¨¬§©¦¤¥¯¥¥¯© ¯«³ ¥¦£¤¡©ª¡ ¢ ££ £¡¡¨££¨« «°¤·¦£¤¢¬ª¨«¯³·³¾µ³«¯
tsh[XYSUREXLQ[XMTNPLPQINIB=??A?=75799<<977:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»ÂȰ¸¿·¼½»³µ¥© ztvwnmhmmmpggifd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_`d}~¢ «ª¦¯¬¨°¥© ¤©§®¨ª¥¡§ª¥ ¡¤¡¢¥¥¨¨¨ ±°¦±½¨£¬´ª®§°µ°¹µÀ±®±ª~rsbVTUNRJGVPRQLLWMJLNRGMKACFDC>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¥±·ª¥¢±«ª§©²±¤¶Æ´¹º³ÊŹºÁËÐʱ¶·¼½Áñ¯±·´´»³´¢£vkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajyt© «¦¦¬¨ ¦£
££¢¤§ ¢¢¦¤¦¨¦¡ ´²§²·¡¢¶¬©¤²²¦µ¼µ««±£ysn]NQQLOCMNNPKFNNJJMNQHMJAGKHHC>858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤¶°¥§¤ª¥ ¨¦¥³ª¢²Ãµµ²³ÆÆ¶ºÃÊÌÆ³¬¹½´·À¯©°¦®º¯®{n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]anquo¡£¢¤¥¢s~{£
~~sz££ ¡£¤¢´¯¬¯¥¸¦¦±¡°®°¼ª©¯ªwscVMROPNCSNLPLBPQHIMRMHJJDJLFJK=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-02764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ¬Ã§¡¦¦¶¬£ ~x~fWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUVY[]ijqk~{sNXr_;Vo|s
y{}xqp
}¡ §®©¨¨³¢¦¬«¨´¢©£~tn_[NSRWLDTJPLLFNOIELQMKOJILPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £®¡¦¦ª §©§£©°¨§´Â¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©£±¢}su]PLQUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`lnhztOB?}y`JQnx}
n~xuvxoQ{~xvgw~¤£¨©¥¤°ª¡¤¤¦ª¢ª¢¦¨umf^[HQQSMIUMSILKOIHFJNLMTKQPOFIC<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶£§¡¯¡§¨¥§¨¯ªµ¼¶··³Á»¶¨ºÈ¸¶¨¨µ¶ª²½¦¨~}xpnXMKMMNLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZnsu~ih\Tt|
{vxsovptz~«y{hv{prmxxz{vsrwhu
{|© ©¥§¤ ¤rha]]JWPRHKXROJLMRJJJLPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().12721987:8775:<;7v®£¡´©¯©¥¬°±ª½´²»¸¶º´±·º²ª¬©¨²°¡vx|vooiXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^t{xfv}gyvx}q|w{ok~}t{|ufv|
logs|lyq}qmvqhq~pC
wwz}{u}£¡¤womfbZXXUQJSUTOPNPVKNKNOJQOHNPLFD<;79;::?=9<:99??;8<=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©±¯±«¼¸¬»¾¸³¬§°§¬¥©¤
yuq{mupjmjXKFGEA@CDHLLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX]eprl§ªÀ~tyb{xo|yz}omytyjjq~Inhx~midly
ksl|nr|inps{}~{vott
yyp|nioooXVXTRQYORTTRXULNHMJMNKCHMGE@:89;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥°£ª¨µ¯®¬´¿«¼Ã¿¥¢¤¡¡sztotkpldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\_§bisye~pmzvtlts|jjMy
g1vsl~~tfeu
filukq|hqq|n|s}|qpnum~wyujyywkkoheXQZWYY[MPUVYXNHHEJJHGB@GDCG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,4775478iO8;5n£¨®²§º¯«²°Â±»ÃÇyqtyprpoodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ q{xl}lq
zyr¡txsu5q¨¡¡¢vq||tggbjnrmpuipXupwlz}mrnp{svnbv
ux~}{rppl`[]^\YX`_RN[ZXWLHIFJG>BABH?CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´©®±®Á²»ÁÆ}nul{txxlwnwci^JPG>@7449;;;=>@BEHLLLLNPQRTUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lw|~
~u¢y~
aªzw~sz]drtz|wmhjbyoznwtzptyxkni]v||
}q}uw{|wpstfg`[[^T\f^WPTX[UGJKDKG?F@DC>AA=;97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ ª ±¨¯À±ºÅºz
vk}xs ||p~zgvkRWL@E211367688:<>AEGFGJKMOQQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJh{y|q|z}~v¡¥¬ªH®¯¯©tm}}hghyn
qGlwryvhmk_v}yzuv|xmow}ttrl[^][ccXge\UPPVYPDLKFNICFCC@@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`XpY\^i
~
¡¡¦»±§»Çè¡¥|qv
ihouq
w{v
}nvuf¡«¢zzyogkx~z~sle^Z[]j]af_YOKNWRQIPJDNGCJDBADDA;:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯°¡xw|~
mpj]B@4--//./02234778;=?BDHJNQRSRSSTRPOHDB<87/9D><<63.lMPHIKKKNV_cggmu £ª¥£¬©¶¢¨Áîǯxº|¡
¡
lpuwqm
r ¤µ©¢}kjk|sb^d_[gk\ll^WKGORQNLLFIPCDMFACEFB=:97=<:;:987767;:6=:785456344566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212467;?CENPRTPPQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¥¢¡¢§¨«¨¬©ª¶«¾«¶ÈÈ·ÉÑϾ pi«©
¡§¢wz~¡{w«²}¤¢¦µ°¨lsr|}qh_]a_agd`gf[QEJKPOIILFFLCHLFFCBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n|aw}{ªªBD}x|
v^bP460-1/,.00//..0015>AAMQRSQRSTRNSLEE@<>=GG@A@8662<9;FHGIJNOQYm
w£§ª´½¸¤®¬¬§¨´«°¶²²»±³½³Ã¬»É˷ÿ¸¥£°²¬ª£
¦¦ £¦¢«¨¤
¤¡ ª ¤©±£§·º £°¢££¡«¯¬²µ¢¤ªyz}
hah\eb]dc^gf_ZODIHSNFHLFJGEFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjoXz
v
ÚÈsV|z
pna@E64<2/110-,+-1.-3?CAMUQRSUUVUN[PGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÀÇê³Å¶¬³¿³¸¾¶¿´Á¶»º£¸Å¨¶Éǵ¾¹´¨£´±±§¯«¥v¤¡¬²³ª¨®¶»²º¬¯µ¢±¬±µ»·µ®µ §§£¨©¯²¹·¸§¶©¥xuZbdVfaac_`f_[TIDDLUQHIJDIGEA@@JDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQbcWyuq}u
{¿»£¼´y
zxn]V@EM<6:46AB764//6CHCQ\OQUWU\VO^UIKJA@>GKFED;>@7D7?BJJEFWTP^¤£±´Â¶¸ÁÌɶ»Ä½³³À··Áµ¾¯·t±³¥ºÅ£°Æ¹±³±´¨¤µ¶ª± ¢¢¥°¦«§¤ ¬´»¢©²º´»¾Ì¿Å޽³Â·º¸¾·º·¹¬¬°¦°ª½°½»Â¬º¨®«}}kWcbYjejeW[cYVSIGFLQGCHIAHD>?BBK@@MC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWSYUZvjp~nzsyb¸¡£{z||}wyueO\dGEL:Qca[^SF?;HPD[cQRYXZgYT``MSPEA?IJHEFA@C<E6B>HGJLSZT]¯¸µº¸É¿º½ÉÌ»¼À¼·µ»»¶½´º±Æ`u²¥±ª½ª¥¨«ª£¢²µ¡«¨®¥§¦¥£¢§±´§²³½¶Á¾ÓÉÉÓÆÂÅÌÂÊÃÀ¾½¿»¼·´¯¸·¶ÃºÆ½ÃȰ¹©¡«¤§¶r`bb^Xa_igRX`VQUIEENKA>GD=KA=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRKQ]glkp
slrrsÕÀµ }x{{yt}zkepuY]\Peeb`ed][XW\MemURmm_n_XgeUYUJDBKKHFHHHGBI9D?HKTTV\Z[¹À¸½·ÆÀ»¹Êʺ¶º¶¸¹²·µ´®¶¶du¨p^¡ ¢¤ª¥ ¨¥¤¬¥ª°·°½¹ÔÑÏ×ÏÉÌÒÌÏÎÊÆÀ¿ÂʽÁ¼ÁÀÄÄÅÊ¿È㤻°´¯«¸¼zl^a\Y]aZccQ\`SPKCBEFE<@E>AHA@D=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODQ\Yh_onlouu³¬¡¡
~|s{
{ts{xkmu{hreilifjih`fihlZnt¤¼g[oh]ZZTHKNOJKPKSQHLAJFKP_^bfib·Ç°¸³»½µ±ÄƵ°¹°°»«²±§ª·¬µ§§O¦¥¡§¬¯¨°§³´ÔÔÔÖÒËÐÔÕÍÓÏÍÅÂÉоÊÉÊÉÑÇÌÍÂÐÒ¸°Ã¼Ä¹¥¶ºÃ¢od]]^Y`XYeZQ]WOOBBGDBH;AC>AG??A8;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeVshqoyy ª¥}{p{r}qxukqx~q{mxslipmcimpxiw|~Ë¿Âß§ncwoc[a`JPRUNY^P]\NPNTQUT[nmvq¸¬³§°¶ª¬¼À°«µ¦¤¸¦«® «´£±¦«¬¤§¢¬ÏÒÕÑÍÌÒÓÓÐÔÑÎÈÃÔÑÇÍÒÓÓ×ÍÒÑÅÒÖÅÀÎÇǨ¾·Ïzof^b^W_S]ZOPTPNH>@FABE<@B>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMN[u
wlwp}~¡ y
{r~yu
ovrks||w{swqksripqzyrz¾Ë~²vrwhaj]CZZ[VecXdjSX]\`d^cwz~©¤¤¡ ¨¥ª°¸ª¥´£¡¡£¡§±¦j¢
}§°¡ ¡¥¤¨ÈÎÏÈÂËÑÔÑÔÓÎÓÍÆÖÓÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÃÃËsoc`_XTYS\PKGJJJ@;:;DAD<BC>HB>BB;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
w~xs{}wznxpmuvx}t
|ymvtn}vux|µ<AÅ¥~|ieVICfcecgjdnx[_fhknin £¤¦²£¤³ ¡¥ © ¢±~
z~©£}«³§§½Ãƹ¶ÆÍÒÐÒÐËÒËÉÔÎÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÕ¾ËÌ´xwoe]ZRVQZWFGJIEE=:79@AB9GD@ECADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTknnpbpqt|~
|x
zyqz{uz
zp|oozq|qnzuw}|u{°tX©Â¶pnb=^hrpqpnxveioruxqz ª ¡¥«}
~my{®ª§®µ½©½ÆËÈÉÌËÏÉÃÑÊÔ×Ùר×ÔÛ×ÓÙÛÖÏÛÚÑÖÉÔËz{ih\ZPST]HCEIH>A==7:=?;=G=?AAADA>>:86DB755479.566435532323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<::D?CGRk_mdbfkvqz~~||~wyn{{uz vutu}toot|
zv{·Æ¥ÂɸwpeNfczw¢xyv{{um¥ £«
z|¡¼¡©¦¥®¨¶¿ÀÀ¹ÇÉÍÎÅÍÊÑÖÕÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÚØÎÜÆ|zhie`TXVUMLDNC;=<<9:<>9=@6=?@<?><9867CA6455=80665547745613854564567HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz{~~|
{~
z{u}tm|}~s~|~x}ynt
}
{}z©Ã ¼£}}r~s¦
{hGp ¤
~¥
¥¸¢§¡£¯¶ºµ¬ÀÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¸yyymjfW`\TPOHCLB==>99::99;<6?>><=9:;;37D?8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqry{z|{z|{~u
yszsm~}w
¡n¨
z |}£¢¤®
Wr«[¢
¢¢
¤³¡¡§²¸¬¦½ÂÇÎÇÆÏÌÐÌÎ×ÐÑÔ®ÖÕØÚØÚÚ×ÖÙÙq~uhg^]XTWXC@HC>>>:49:;7:;:3;;?<>7;9:1:H>:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbxmb~omwxyz|{{wsp
zuvvt
}¦£¥¢¨r±§
¢ ¢©¯n·
ÄȲ¡¥²d¤ÍÇ
ª££¥©¡¢³´¥£¼À¾ÈÅÅÉÈÉÂÊÓÍÍÔ©ÒÑÖÖÖØÚÔÓÚÏsid_^^NKTZBAGC;A=837;<:8=649:<:82?9:2:I:=67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFu||l}xz~z~vv|lny|xx|}£³§£ª²¡§¥¤®¢·³¡ ¤¯¢¤§¨¯¤ À£É¸«¢¦²
¨¢
t²¤¡} ¡±®£¤·½´ÅÇĽÃÿÆÎÊÉÒ§ÎÍÓÒÐÖØÒÏØ»s{w^aVaWQIIOEABE5>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89567=:JFDGN[\YIf`;Hzzm
z|x
}px|}|orz}{x
§»¨²½¯¤³³¨£¢°¬´£¸¤¬¤©·¦¤£©©£¯°ª»»É i¶¸«°£«½£^ª²|}³«¢¡ ¥¯¨¢¥³·«ÂÈĵº½»ÅÈÇÂÑ¡ÆÉÍÍÄÖÖÐËÔ¢q|i^[T_RPFD><CAA8?874>F<<6<35355454B3::BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeGb`bpI@s}um}}|pww{ªÂÀ¯½Æ»²´Á¼´«³¶¨²®®½ª»¤¨¹·«¦¦¢¢££©¯²±ª¤¢¥¥£¹®¨¿»¬²¹¥£¦}½°z§±« £¬ ¡§§¤¢¤°²¦ÁÇ𰺶ÅľͧÇÃÇüÕÐÍÄÊtsc]Z`[NKBK@DF>A?B;:4>A==5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\fF`igZ][{uo~|q~zz§´ÆÉ¿ÂÌÁùǼº¯«¹»²¶º²À®¥À¤ª¯»»ª«¢¢§«¯µ°ªª¡¯³§¢º¹µÁ»«¨²¤£¨
©ÃĤz¡¦ ®ª¡ ³ ¡¤ ¦¤¦§¤¯¥ÀÄ®¨·µÉþ¶Î²Å¾Ä¼³ÑÉÈÁµuym]Y\jSMICLKJJ@A=BD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBf[Me\fTcjyr|xy¡¨º¾ÇÈÊÂÒÈÊÂͽÁ³¬»¾§º¿½»Ã¸¬Á©¬³»½ª°ª£¥£¬´¶µ ®¦¢£³¼©¨¼Á£¶¶¯«¯¬ª«©¦¥¥uy
££©¥}£ ¢µ¦¥¤£¥¦¥£©¨¢²¬¨¼Àᥳ·ÌÀ¹®Ã³»¾Â¸¬ÂÂÁÀnzbYW][LKMJGDCIBBACK:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>kI_XaZddVw
~¡®¦£Â½ÈÃÈÅÓÌÎÍ˻·¯º½´¼Ê¼ÃÁ¶¶¼³¿¹¼®¯¨ ©§¶®©²·¢¨¡ª··©¤¯¾Ã±½¹³§©³³¬¤«§ ±Å§|}ª¥¡£¢Z¥f£³¥¢¬«§¦¡¤¨¦¶«©º»Äµ¥´¶ËÁ¸©¶¬³»¸®¨¸º½¸no[XUVOFKSNK?AHEDHFG85FM;>7>AJ.32025B55OVN;LFKRLOGGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBrFiIRebLF¥¡©¥¢¯¾®¡Æ½ÅÄÇÆÎÎÎÒʾ»¶±º»¼¾Î¶Ä½·¸·²²µ³·³¬¦««¸ª¨§¯°£®¤§¤¤´À°ª¬³¾Â¹À¹³§·³·²®¤¬®®¤¡tÁ}±¦£ ¨¡ `J¥T°¯¥¯¯¬¥¡¥ §¢´©ª³¼¼»«°²ÇÀ¹¥««±±£¡²²´¤qof\[OQLEPPPQ;GKHFHBC>9KT?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=QEWRsbWFH« ¢¨¯§
£¤µÈ´©ÆºÃÃÈÊÈÇÌÎÆ¾º²®¹¸ÀÁ͵ȺÀ¹µ¹±¯¯²´§£ª´´ª©¦®¬¤®¥¥¨¬º¿¨«¶¶¾Á¿¾¸²²Â°¸¼«£®´¬¸¥¦v¾ ¯¡¡©¨ ©¡§nv¢¢²£«©ª«®¥¤ ¤¨¢±§©«º¶¾³²½¹¶ £§¨¥§¬©©dfa_RKLGGNJVL=MDMIKACD<PU<AABDO18=77?B75UXN?HNQXRPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..SaMUHe^HE«¡»®ªª¢¤££¶Æ½´ÁºÁÂÇÈÅÂÎÈÁ½¹²¯¹´ÀÂʶƱÁ¼´º«¨¬¯£¢ª´»¦©¦«ª¨¯§¤ªª½¼§¬¼³·½Æ¼¶µ·À¯½¿³¨´¶«¾¥¢¢¼ ·©¥£¡¨¥³¡¥¨©¤¡¢ ´¯¥¥°««¬¤£© ©¥¢¡´´ºµ¨´²²¢¦ª¡wa^`^JIFHMQINEFFBRKIADG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCobGE§¤Ã¬¤©ª§¦¬¢«¶Ä»¾·ÁÂÀÇľÍÇ»½¹²°¸³¿Ãȵ¿¯¼¶º·¦¤««¬ ª«Ä¢¥¨«¦«¯«¢©¨¾¸¦½°·¶Ç¶µ¹¸¾°¾Á¶´²´¯½££®¡¢¥££½¥©©¬¡¦½¢£¢©«¡¤ µ¬¦²§°§ª ¡¥¤¬±¶²ª¥©¬ ¡©idZa]OJGKOLHEDIA=OHA;GIH[ROK=HOU4BF9>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxecWL¢£Å¬¡¬®£¤ §©«¶°£ª²µÄ½¿¶À»È¾Êȶ¸µ´±³´·Áƶ¾°¸´¹µ¦¬ª«¥¤Á¥ © ¤©¯¢¦§½µ¥±¼·µµÃ²³·¹¾±ÃÀ··³´µ¢¤ ¡¨©«¢Ã©¬¦ ½¡¤«««¦¡W¥¡ ¸ª§¶£³¡ ¯¢¤¥®²«©¢¢¥¥¤be[d`LIJJOFEAFK>=JB99JKN]QQI=LV\9FI=DMI8Hc\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\KN¡Ã§¥¢³ ²§«¤ £©¬»°¨¬µ±ÈÃÁ³ÂĽÆÃ¼Åʼ°°¶®°µ¯¿Åµ¹°°ºµ¬¨°©©¦¡§Â¬°ª¢®°©¤§½·¦¶º¼®¶Ã³³Â¿±Æ³º¶«´µ©¡¥£«¡¨«°®¯»²¦ ©©¢¤¸ ¡¤®¯¬¥¦¡£§´¦§´£¯®¡¡¦¬°¥¦¢
bf[heKILJSBC@HG;;F?99NMU^RSJ>O^^=HPBLLI9Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤ ¨£ª²¡£µ©²«§¢¥²¬®©»²¬°µ´Æ¿ÄĵÀľÊĶÀȵ«µ¨°¸¬ÀÄ´·®¬¶¹¥«²«ª¦»µ¨°®´±§ªº²§¹³·²¸Àª·²Â¼³Å§¾®·´©§«¡¥¤¢¢¤®¸±µ¶ ¨¤£ ·¢¤¥±²¥ª¦¡¨¢¯²¢¦®¥¬¥
©©ª¢§ ydi]liNPMNT=CAMC::I@77QO]^RVQAW`\BJSHVKH:Ud]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05JpiVCWFyfC;¤£¡¦¿¦§¯¯ ©µª¹¯«£ª´·±°¹·¯¶¸·Ä½Ãǽ¼ÃÁÇÀ¹ÁÆÁºª¶¥»Á÷¸ª²»¢°²¥§«¹ª §°ª°´²ª©¶µ¬»¬²²¹·¬¹°Âº½¾¦Âª°·¯©ª«¦ª¡¡ °¯³«°¹©¦ ¶©¥¢¢¯±³«±§« ¥¡£³°¥¡©¢©¨§£~
kimamnXQQZTACET@;;HA7:XPd^PVWDY^^MLRN^KJ>Zd^NHPN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1647gY`F(?8l}h[V:{cC=§¡©½¡ª°ª£±¸©¥´³«¡µ½¯³¸¼º½¶¶À¿ÉĸÄÂÀÀ¸Ä½Á¸¯¶¨«·²¼¿¿´©®±·«¨§©§»¥³«¢±°³¬©¶³µ¼¯±µ¬°µ±ÀºÄ¶«¼¯±¸«¬©¢±¥¤©£²ª³©ª³§ ¦¤´®§¡¬¬±§²¬²©¤¨£¡¨µ©¡¬¦¥£
{flrhpr_GYfVDCNXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b`PKMNXWXPJVVWL=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'_^aU150=`V^8)C3YU\gK5zfL@¤ ¤¬·¤¬©¥®®¶©¯³¹¦¦°·Å·±¶¾Áµ´ºÅ¾ÌŹÃÀº¿ºÄ¸Á¹²µ¬ªº·ºº¾µª±¶§«ª«¬««¼¬®±£ª°³®®¶±¹¶©®°§µ¯³»¼É²ªµ´±´¯®¦ ³¨ ¥±£¥¯¡¤¢¥§²©¡¦±«©µ¥®°µ¯£§«¸£¡¬¥£¢ {
{knxnu|aF`jYIHYZ={JGE6AbTiZM\aJ[]ZRRRb`LKE_a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`Va.5(C^Q\.*B/JGP[H3cYUKD °¨±©¬¥£®®µ©·´¸£«´·Ê»´»º¿¾´´·ÃÁÍǻý·¾¿À¸¿½±½®§º¹··Â·«±¹¦®«§£²©¯»¤²±§§¢²³°²°´±·²¨®«±¦¸¯µ³ÃŶ¨´µ«°©§¢¶¦± ¤±§©©¢¥¥¥·§¢±³«§±§¬°µ¬¤ ¬¨ª¸¢¦¡¨¤ v|
nqxv|]Kel\KOc\?b{GI8GgWe[L^bMXYWTXTi]POHa^_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANIg27'FaLV%-B.=EMQ<3rkJDC¤¤«§¤°²³ª·°¶«µ¹É¹®Á»Â·³²µÂÃÏÄÀÁ¾µ½À¿º¿½³Ä¨ª¹°¶·¿½¯«³³ §°¥¦°¥²µ«²°¬©¨´¹¬´²µ¬³¬©¬¨¬©¹±°Ç¾·¤¹¯©¥¨°¥££®£©¯¢£¢£¬£¡ª¦¦¸¥«´´¤©«¨«¯¶®¢£¨ª ¤´¢
§ w~
}|}qtr~}~\Rdo^NZf]FD[G:NmXa[M`aNVWVWTYg^QRLcZ[TKGOTSNGIVS\N;P^JBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Cd;6*HdHJ+:I?3BIS,>k=GH©ª¡©¯¤¨¤³´±´µ±±¡«¼Ëº®À»Ç±´´ÂÃÑÅÆ¾À²¾Á¼¿¸¼Å¨·¬³¸¼À°«² ¤§©¨¤°£ª±ª¯¬°®¯«³º¦¶°²©²©«¥¥£º¬ª±Â¹´«¹¨¨¨©¨±¥©¤¢®ª¨¢¢¬¤«¡§©¡¬¥¢¬«·±± ¨¢ª®°¬¦§¨£ §¡¤
}w
tsrvl_Y`ncQsr\K;|F?WuX`YNc\MUVUWP\b^SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<^J0.IgDF8<B05EKX1@[?MF¬§¢ª²©©°¶¬¸µ®ª¥«ª½É»°¾·Â¯±³ÄÃÎÎÿ¿´ÀÃĺÀ´ÉĬ¯·®²¹À¿³«¥§ª°©§¨±¥´«°®±¯³¬³º¤¸³¬¬®§«£°·«ªº¶¤µµ¤©§¬¬ª¡¨¦¦±²¤¦¥¡¡«© ¦¤¢ª¤¬¢¦±·¬¬¢¤¢¨ª©¡¥¤£
£¢|{t~tx¤yk^`ngWfdN@gLDbyWbXReUMVUUTO\]aUKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06XZ.0JgAA<<C+:JO^4D@HHD¯¤¢ª°ª©µ«¶±«¤«ª©¼ÀÀ¸¹³¼µ¦³¯ÄÉËѾÁ»¹À¿Â¹ÁºÂÄ®±µ²³»Á¾³±®«¬§¶ª¥¯«¹¯¨±±®±«µª¶µ§´¶«¬¤©ª£³³¨¨¤´´ µ¡©¨«©¬§ «¬¨¹¶©ª©©¡©¨¡ ¤¢¦¢©¦´®§¥©¢£¤¦§©¢¤£~
¢txu{x~oqggqx\atiO]VHmxUdVQbOLUTUQOX[bVHPjTVTGPYUI>IHOQPxLNV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Rc02?f=NX?C,>LT_/Ik6QE;¯ ¥ª«¤¯³´®ª¥¯©©º¾»À±¯¸®¢¶°ÉÇÈÐÀ¿½»¼Ã¾ºÃÁÀ¿¯²³²µ½¼Â²²³«³©¥µ©¥³³¹¯£®¶±¯±¹ª¸®ª®¶¬ªª«£ ¶¨¡¯³¡´ª¨§ª£ª¡¡¬¨½¯¬®¬¡§§«¯¢¡ ¨§§ª°¨¢¬¡¡¡¢£¦¨¥|
¤
xt}uxzzttzi£ui^elug}RWp^JxsSdSQ^MMRZgNLVYeXGSiRQ>BNQaQ:IHLSIqPLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Mh:38_=ad?F1CP[[+HO:VB4±¤¦«£¦¤¬¦´³°©£°§ª¸¾À¼°¨¹ª§®°ÉÆÈÑýÀ¾¹¾¿¼É¼Â¹°°µ²º¼¹Á³´»¹£µ¦§¬±¶¹²§§ºµµ¼¯¼¥µ«©¯£¥¬ª§ª³¤³¨ª§©¤©£©¨©½¬´¯®©£ ®²£¤¤¥¤¨ª¥©¡ ¤©©
}~
¢~rzy~|iw}zuqq}hyd`hcs
zmgy]^UBWzlTaPRYKKMpt]HZ[gYEVfPC>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KI1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=;EZ?*°¨¥¤¡«¤·²²¤¨°§¬¸Á½µ°£¹¬¨¨°ÃÉÉÌÁ·½Àµ·¿ºÈ¶Ãµ´³µ²½¹º¾·¹¶¿¢³¦ª«¯µ¸´ª»»¨²¿²º ¯´¶©«°¢¥¨©¢¤±¦° ª©§¢ª£¨ ¼¨®°®¡«¢£®¬¦¡££©¢££¡¦¬{|
£|yl}vyxb{zqppsxitjgdhaosmbjp`oA\xkU^NPQJILSZWM]^mWDW`O^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*L>*49&'.34.0+/4&,:$40AhZ13S=e_DL6KVdO)<2P[=#«§¤¢¨¤¸¯®¢¯¯©«¸Âº²¸¯«¨´ºÇËÇ¿·Â¾°´¾·Ä¶Ã²¯º²³À¶»¾¸©¹¸¾«¤µ§¨ª°¹°©º¼¤®¿´´¡®·µ§¦§°² ¤¦§ ¥¨¨ ª¯§ ¦£©°¸¤±¯¡«¡¬¤¦¦©£©¦§¡ª}~||¡y
}
{sp|qst`yxiopqojsczlifdaf`[rjqLMiXZMPLJHPRQIN\_oTDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*?0ZZ5(¥ ¡¤¡·«°£´´©¨¹Å¶²® ·¬¬°µÆÈÀ·¿Âº±µ½·¿»¿¯¬½°´¿²½Ãº©»»¸§¨¶¨§«°¬³°¦¼·¤«»µ®°¸¯©¥¦¯±¡¤ ££¡°¦¡¢§¯¢ ¢£¥¢·°¡¦±«¬¢®ª¤¨¤¥©¤¢©¡
z}yz
~zzpqvoot_xwellljinfrilfi]ds`[kuiZI}][XOOKHGRUF29^^mPDWVYeMHIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<"8R=*113>D5,-'42*;+139cl84GAf[HTDU]hD.<2bV,2¢¡ª¤¡¢ ·ª® º¸¦¬½Å³°¯£µ°¯µÄļ³¿º¸±³¹¸º¸º¯®À³´¸°¿Á¸¬½ºµ¦¢³ª§©²«±¡À¶¤§µµ¨²¼©¨¦¨¯¬£§£¦¢²¥£¨©¢ ¤ ¤¸¨¤§®¦¥ ¨¨¢¡ ¡ª¡£¨¤
y{}z
{w~{ltqllsaxthijgfoghidfij`ibjg[e{c`SsT\[SKJGIOS@!*i^jLCVU^`KIGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,?0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB379fO'2£££§£µ¦ª¹·§¬ÃÁ¶°¬£µ®§®¯·ÀÀ¼²Á·±®²·¶¸·¶ª½³¯²±½¿¸®¼¼±¥¶«¥¥³©ª®Á«¨¥°²©¬µ»©ª«±¥ª¦¤§¢¤©¡¢ §¶¦¯ª¯¡¡¡ ¥¡ ¥«¡¨ y
w|
{
s}}fxokjlguskcgedubeffejjdkqZ^Y]mdaNhWZ`VJGIKMRX>9_liHBTS\[IHFFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685]yN2>HiZLZJVbf@:3AfH%5£¬¡ ¥³±¡±½·¡±Æ¼º±±¤¶««®©¹½»»®À²¯®¶¯³¸³¨«¹±¯®´¶º¶°¹¾¦µ« °¤«®£Á ±£®°®·®µ¯¬¢§©¤¨¥¤¢¨ ¬°¦¹¨®¢¡£¤ ¨ª§©§{s
|
p~fxmhkjgqrk\hccsafhjnlgkjgm\lktqaTbhdeZIFLMOXQQVadT@VSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JeC'4¡°¡©²¯¸¿¶ ´Â»½¹±¦¶°¨®¤·¸··»¯ª«·ª´¹®¦³µ²®©±·¶±³µº§©¶©©¢©¬¨¿£®¯µµ±¯©¢£«¨§£©¢¤ £«ª©»§¤ k¡q£u©§¡xnj~vql}o^cagkuw~ghuifW\hsnNPjcgrg_dfnlj^`a
eNKD8FTg^JGPPTUKHSaoteF[QUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:176Xl16Ok[N\K[fb>G1Qd=+/£°¡ªª£½Ä¯©·Â¸½¼§¶°¥«¤¸³²³±¹ª§¬´¦°µ£¨¸¶µ¨§¬·³®´³£ª´«¡¤¦§¬»¦¥¯²·®¥©«¬¥¡ §¦¡¥¥§§§ª£µ¯££££¡¡ ¥¦ªrx
¡vif}rx¡o~|¡ {tvlmheczlqaTmcliqXjpoX^i[kk[qnzrgZ^FM?G_MFRVVQQRWUg^MXJRROEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(¦«ªª§©¾Ã®²º¼·À¿ª¤·°©¬¦²µ®¯³¶«©¥±¥µ³µ¶´¥§©³±²¨¯«¡²© £¢¡¢®´£¤¥¶¼¦§«ª¬¨¥¡ ¦£¦¢¤¤©£¤¥¦¡·££ ¤®©¢
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Å{r¶¦»{l±«°yhkX±®nei¼¼nhznrØ~Sjb¶²~rt¡ªWOWaOVNFT[XQPR\W\P@\DQNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¥¦©¥²¨°Â½²µÀµ·¿Â«¦³¬¬©§¯³©¯¶³¨¨¦µ¦§¸¯³²¶ª¥¤¨±®®±¦ª§¤±¤¡ ®¬¡´º¢ª¨¡®¥¢¡§§ §§§¡¦¢ °¢£
¯jjª~gdp¥q®¡¤~x»}k¡v±_j´[¥f`fzfjxk©d¾rg¦v±j|±xtcmm§m[ EhgEu`}g|¤§Y_«ixyj§7J¯\WSmc[KNW_\WV;NOWW/ITSIDEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¡¬§¥£¥ª²·¬´½¾¯¶Ä²·ºÂ¦¨°«®©©°®£±º¯¤¥®³£©¹¨³²°£¥ ª¯¬¯¦§£¢°¢¥¡´³¡«¢ ¡¨¤¡§¤¢ ª¦¦ ¡
µµx
©µw³·~¨~k¦zx«gk±[«{tqx °vwqkkl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¢o[Skh`LK[dX\ZB>±xWXA#MhECDA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J8aU50³¦¦¡®©§³¬©º¶Â°»Â¸·Áª¬®®¦®²©¡¯¼ª¡§´¤«µ¤¦²³§£¡¨ª²¨°¨¥¯¬¡£¨´®¢©©¨ª ¤§¢ £¥£¢ª¥¢ Õ¹p°Â~Æ|Ö»|¤¤{¤¥z¬yV¯z~j¹Z¹w|¦|zªy{±nt¼
oP¯§ÅQ zc`ªbsrm`Sµ´È|c¤3Bv]PihdP@XgZdaJHMlK[ROYfYCD>E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ72%¢±¨¨¥´ª¥µ¨¤»·Á°¹À±µ´»³µ§±°£°²¦®¶¨¨¹®£¯± ³´° ¤¨ª±©´©¤ª ©§°¨£¬¢¨¡¥¡¢¡¡¡¢¢§¡¦ §¡²nhµq«o¦r´sr¶{£¢~ ¥~°vÒÑv\®{
¤oª¦k|}{±sy³etofRÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdSQjcfXAOk_lhOUGI9=VR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥°¤ª»¦µ¥§¶»¼²º¿·¶´ºº³¥´³¡±±¢¬¯¤¦º®¤±±´¸ª¦¡ª¤²¨¬ª¤¨¢§¥«¯¦¢¬¥ ¤¦¥¦¡£¡¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}w}w¯x³aelZ°XKuyf`^wwhk^¯wxl5yÈ®²_ATo^g`EPl_pmVUM.eciSYQ:AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I988 ¸°´Á¨³¨©²º¸´¸¿¹·²µ¼µ¥·³´¬¨«§¶«¨±±«´¤© ¨¡¶§¦ª£¥¡¢¥¦¬®¦¡©¢¢¨¥ ¥¨¤¡ ¢ ¦©}}¥x¡ªp§¡£ª|yo±Z¨ ytØvs§¤|{²^d ~l\«[Zhgªdr{ks]¬Z koeOJC¡\ZLt]bfM[a_rt_JV6JXHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>002144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C1?8¡¿«´Â®«©¥´°·±µ¿¹¹²°·¼©º´°¤¥§§ª°©°©µ¬«¯¡¡ ¦¥¤º¢£« ¢ ¨¯¯¦§¦¤§ª§©§ £¤¡¡¡ ¡«®mr´r©v¦s´xs³¤¢¤w¸o{¢kk¶Z
ei¡¢§mr´t²j
ku³af¢oj\`M¡|Rs£mz~oq\¯V<weTon.\§ObRkeblZc]`p{cTZQ>>mo3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;<010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¥º¡²À®««§·©¸¯µÀµ¼°¯¹¸«Á¶©ª ¦¤¡ªª¨¶£²¨¯ª § ¤«¸£¥£ «µ¯§¬©¥¤¬¢ª±£ §«±¡£¢¡ª«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxnqn¤t½^w}[ay¼kZV[jz^jafgbmwoY[YCA@r?CG+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-6A9§¡¼¢±Ã°ªª¬±§¸¯¶Å±º±®»°®Á±«¤¢£¡©¤ª²¤µ¦¤ª¦¬¸£®¡¥ £¯¹±¬£§§¤£¬ ¨«©£³£¥§¢¢£° ©
µ·xµwmknsnytÁ»½{²¨pt¸|{|¤»¹½uz´£tvut°ufiµtrpw¶^z}hymyc¬pu
Y[§jDdYSf`c]cQgfqmuBMPMD;ZM>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbV8*O]]=+:VV'=;<§ ¿¥´Ã´¬«§¬«©»®°Æ¯µ³®·§´¸©¢¡¥ «¤ª¦µ¨§ £¬¤½¦¡ª¢¢¨¢²µ¶£¤¢¦¥ª¨¤¥¡©§§£©¡¤°¨§¡j~i¦xs}tzez½¾Àºoq_rjZ^ack`cmwbke^`cqir}gj~rtx}}b[wthP\n}{kXlzsIJopNtMEW]f`L[Xfc_O[muiqRODEM<HI=L?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P^L(3=[O'?2>¨¨¡Á£´º¶£¬¥®§¨µ±¬È¬¯³«µ£¾±²§ ¢©¢¬¦®¤¥µ©¥¡§©¾§©¦ ¥©¨°²¿¬§§¢©¨£« ££§£«¢°§ ±¤¡§££¦¢gm}qw
µª ¢¡z¥lj||tqxyvv|kstudw}wkpzm`c]pgMYYfi`WZpznlfSOFS9OZMRO(+:JB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³ ³¢¿¡£±²· ©¥²§¥°µªÉ«¬±¥µ¦À§´¡¤¥£ ª¦¬££·«©¥Á«¤¢¢§¨§²Ã¯«ª©ª ¬¡¢¥°§¢¥¨®§¡° ¢¦ ¡£ |ª¨{
£~f¡³¯
vz|vyzofzkuyrhszvktdyf`jecdfkYk{pij\RLPD_UE@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¾¬«®²² ª¦±¢¬³°Å°ª¬£³®¼¤´¥¢¡¨¥©¦¤¥³µ°¦¾ ¬¢¡¨©«¢³È³ª£ª§¨¤« ª¯ª¦£«¢ ¡¤¯£¨¤¨e|e~cylhkz¤«ke~g
eeih{¡kh¢wkj£slnzzXe^
^lv\hswwnxxsmytw{iY^ktd]sij|qlc]RNXJdXAJ4=F7?FD71<=?AD;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³°ª¥¨°§®°½±©§¤¯°£¡§«£¥¨©²®£¢¯¦·¹¥®£¡ ¤{¥¬¢¨³Ã·¤¡§®£££ª¨¡ ª±ª«£ª ©¦¨¡¬¡¥°¤ª¡¥ª~½r´rhx¹Ä¸q¢£{¦sª|ËÀÀ»q¢}À½ÂÁ{{ÃÀ}j¥±ooÊzwvzyqzqx
ymvcf_xd`ec^tgmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP/#F[3PY/UAB;/8£¸Ãµ°¯À©¨£¯©°®¦²µ¯©¥¦¦°««¢ª§¢¬£¥¨¥¤´¤¢¦®«¸³§¯¢¥ ¡¦«¤«¿À± ©¯©¢¡£ª£ ¡¯©¬¦££§¡¥¦©¤©©ª¬¡¥¡£Îxz¤y_®^§¢ |§t«¯^cªz§
t³c« ³j®t}¸aY£Ínu{Ú{p~v~e{vvk}n~
~m`qkpg`_yd\qhjcf`RTRW^KOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1¿¿µ´°·¤ª¨³«¥²¬¬«¤«§¯ª §¤¢¯ ¨§£¥¡°¬§®±ª¨¬ ¥¥§£¤ª°¨ÀƳ¨©±®¢©ª¡®°¨«©§§¤¢«´¦¢ª©£§¥¡° § q
t¨q±|q¬~¡¥wª}r~«vz|~ª¢~«{{VÄzoÁ}mupmeveoawnromeptup`gme_oiinfcWS]aYRSC9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´£££¡¬¯¶®©±§¨ª§««§¢£¢ ¦«¡¥ ¨¨¢°¬¨§¯¬¨§©£¢¡¦£¯¬£«´ªºÍ±¦®«¢®¬ ª³©ªª«ª¤£¬°±¢¨¬®¥¦ª©©±¢£¥¤j¤uz©tz²p¥q ¤``R«®v®¦z{f£¤
£}©~®^|©U¢z¢{ïÅs¯³³¹qb©¯Âthmpnyxwolfeerpf|ib]W`iXXUMMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799674,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÖÕ¿¡«§¡¯¢°´°¯©¢§¦ª««©¤¦ ¥¦§¦£¬¢¬¡¤¯¢ª¤µ°® ©¦£¢¨ ¥±¦£§±¬¶È²µª¬©¢ ¥³ §¬¬¤®¬ª£¢«¢³®¢ª³±¡ª¨®¯¶££§|ªlu«y|°o¤Ò¸´¸É²__©¤ yxªÉt£§©ÆÆxe¡¥s}¯^pµc±uK£m§Gd|pq{u}{n[ejsqfj_aYdm\^YIMLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/>-5OTQ;<F2,$§¤ÁƸ©²¬¥¢²¹¬ª¡¦¨¥ª«ª§ ¦¥ª£®«¦ ¬©¥§¶¢¨ª¶²¬¦ ¥¬§£©¦®¡£§©°´Â±³ª¨¤¡£¯¦¡¥¦«°¨§¬£·¡²¹¯¯§³³³¤§£Nxz£}¤§¸{|y¹~ÌÆÂ¶x¡}v¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu¤|}uzs
q\moxrjoZd_hncd]KMQTBIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¸«¯ ¡¬³³¦ ¦®®ª§¦¦£§ ²®¢©¦² ª¤£¶¢¢¢©´¸¤¢¢¡±§¥¡¢¯®¤¨¡¶²Ã±®©©§¢¤¥¦¤©¯¢®¥¦¯¥¼¡··µ²¸°³¦¯¡£
ѵ÷y
¦x¢w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{}n©a£qqbs²¸hx¦~x}ymixiysnt]ddnmfg`J[XX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUVVTQOQ[U%!2AH$)%s¿¿»ºµ§¤µ¡££©§®ª«¦¢¦¡ µ§£©§°£¬£¤£ª´´¤¤© ¦£§´¡ª£¶«Ã¯©«©¡¡ ¦¢§¥¦¬¨®£¥®§¾¬½°¬¢°³¹«´§¨±¤§z¨}|°w¤¥m²o¡|¡§¬
®
© ¡{~«ªx y¯]£|¦§d|tk®]¥kp
]`[ m§{{klb~tmz`geqnhghCZa[=KT2U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI7052.*,ATVVVTTUUUUTTUTSTVVWXVUUQHFIJ#((½©ÆÂ¶Á´¬ ¸¥£¤¢°¯ª¤¸ £« ¯©®¡«©¤®°¬¦§¬¬¢¡¥¡¤¨¦¶©À¯¥©£¦¦¥¤©¬¬£¤ ª¨¿¤Ã¬ª¢¡«²¹ª®§ ³®¨©v¯~
|º®e°e}¡¦¬°
¥¤¡¡
[lj³`{{±lgo°[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡n¨|y~ds~bxt|ajgqmfeeOUd\AT_>J(>9=4!",%2. *1/045799<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UZXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Á³£¬¦¥¶¨ ³³©£µ ³¨ª«¯¬¯¨¢¯¬¨§¢§®¨¢¥£¢¥£©²¨¼¯¥¨} © ¡¨®§¥¦£¥©» Ƨ¥©¡«´µ¬®¦»¬¬©£¯¤¸Ãº§¬¯¦¥ª~սªb£¿½}~£×º¸µ
½¾j£o«mz²°Çj«°½¬xw¢¾¼t§zzc}{dgy{`kekjbPa[Sj\@UaCN*=:4/$%2 $(0496677;>ACFGJKMNNQTW]a\__a^`[\YTQMHC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³´±¿¹±½²¢®¦¥²¦¥¿ª¸±¨¡¿¦¦²±¹¨¯¥§°«®¦£¬¡¤©£¦§ ¨¢ ¬ª¹®¨£{¦© ©©¡ª§¡¢«»©Å£ ¯£ª³´ª¯© º§®®suª¤·e pgmox¤u®pq¨£®¤rmmmexomqyiqigqhigpd]cjoY]g~w¦`bqoed¢}vfxhkyydlcflbKdWJlY:QeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV]WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³©¹¹²³ª©¡®£²©¾²ÃȾ¶ªÀ«¬£ §¬º£¤¬¦®©
¦ª¡££ ¤§¨£© ¥¦§¯º«¬{¥¨©£±§£¬º°Á§¤³¦¬°±ª«§¸£· ¨¥¶¢©ª³£« ±¡¡¢ ¤¡«§
¤}gtvtp§m{¡¢riwpxw|zjlddodU`X@i[HcaOZ+F=+'!740.!%2(*699469;>?ABDFJKKMPPQXUVY^`ac\^UQJED>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¦©ª¥µ¶®®¢°¤ µ±¬Æ½Ä»¸ª¢¥¦°¨£¶§©µ¦¨¬¢§¬¤ §£¨¨¦¡£¨¡µº§«| ¥ª ¶£§¬·§®Á®£·§¯¯°¬©©²¸ ®¼¥¤¦¶¢¦©£¬¯¡£°¨¯£ £©«¡ª
}fuvysj}¡¢zrszr|jod^pj`[_YncP`eP[:GGE>2==7/+&+)&&406658:==?AACIJGJKLMSSSUZ``i`eVPJACB:9EMV[^^[Z\[[[\]]__]^_`aabaaa`bbbdb\[c¤¨£°³¬®£©§ §µª¥³»¯¬¬¢£z¢±¤¥°©¸¦£ª£®£§ ®ª¨§¨¹¶¤¥y¢©¸¤¯µ¢°¯u¤¾£² wy ª±»u¬¤ªd\bv ¤~n³£§ª£esyp¨l¢¨e¥wjvq|aiZuhhrz¦eyxjoykqe_vplkh\febbpS\>MNNSG>@TC:1/&4:316678<;>@ABFHBGFIKMTTUY]`hfgWPJ<DG;8UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡¯±¬«©¥©®£§¥«¶°²¦ª§«s°¨«§¹ ¤¬¢§¡u®¦¨¤º´§ uw §²µ³¼§ ~§¢z¢®·¦±©¯£y¬¢§©§
w¥z¦{±z
cympyq
txht t}¡~k
lx{qqgdxnjlj[ekjft\_HTLQ@E5.YUU7)!09=>643568;:=>>@DI@JEJKGSX[Y[a`hfYQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨±¦§ª¥®È¾°¡¦©µ¬§¢ ¾ }¬¡ ¨¢£º²§
pu ¤¬´´Êª®·
¯°®©¥|¨r{w§h¤y´¦¨Â«¡q¤}
±¡|¡ |
ms
zr|uÅf©£k¢
p
hwt|whhuqghk^domgmXhG]RM2E46Nac7&3<DGD964658;8>==>BL?NIJLCPZ]\Wa]jl\QE=KM@JdY]cfhgbbbbcc`_babccceiicbbbecafcbbi¢°¨©¨¥« ¤¹±ª«¦ £¤ª£¥ª·£¯¡§¥½¡y«¡
v¤¢¹®¤~bm ¡¡¨~¡§
ª®£©~¢vk¬uM«x¨§©«}¡{z§ikg¶}n`dY{dhr}yl]{m_Sp\_ky`Ye}p§ªk£nr¥piel[n|fZ`bWPowfmtrkjo^jpmljXiO]XF9A4GD_k4,ICQMN=84859;6@;;=AO>QRLMBJ\]_W^^bv`MD:MOMTb\\ffiibbdbddbab`cdcacikdbddgdbgeach ¹¡ª£¦¬¡¶¼¬®£ ¢¥¬¡®µ¢¨¡ ¦´u¦
¬¤¨¥±§¢in¢ ¢¥£¡ w§¡§©¬¥x|}¢pr{ym¨{¢sv¦f~v¤_z}s¢n·´ºtµ¨dƸ{p·q¤cs¬«`}j³~n|q£lr£s¤`³q|´ts[²jbotvrhoXklssf]i^bKE=D5QAZr2=SG_JR=<395::6D;;@IQ?UMNQ@E_^[YX``|dHC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¸« ¤·µ® ¢££¦±¬¡¡¤«xp¡}¨ ¢¨¨¥~k{} w¢r¡¨¥§ª~~z z£xt} ¦¢d¡|lhn{§}rht«tªg]
vhªj¸f\¨pa^§vvhunm§]¨~x»k~ª[]´g\nryxki\qjyyc`fXbAQEN7VCRn4KZZ_NZD@151;;7H?:CHU?YRY]>Db^V`Qac}iEB9N[]XdfXfgnmbbe_aa__``ec^bdoq_deekecihgkiªµ§c«º²°¬¦¨®°¨¬¤¡ £jr{z£
¨£ iy{¢ ¡rhp©¢§§|¯£¢¸w£³¢¤y{«¢q¡|
¯µ}k¡x~´££«¨|}~tªZ]o{xbL~zz
cyBLY¢jq|mux±³§vmr}osj¤]vHec`sq~nf`liv{debR^W]UV@YFQgDSW[bX^ID=B8?A:IE8LEWAVQ[VDFb\Z`K`m~qEC<U_bZejVghmobfg^aa\]^ahb_ecvl^egfkdflihki±T^ ¦³¹³³©¢«©¡«¤¡¨ w
ny
|r¡s©|l
q¡x
|£¡¢®}µ{¥z© |§hwm~t¡sq|p®}¤¦£o^¨gu£co¥aÓ|{xrsc¢
~£s£uk³`sª²¨¼wm~¾¦©´^n}qns¢r]¤gs¦ah¦mÔ}oxzk{wsm©¤g`eypkgfdnvwg`cS[fQQaHWIT`WS[ej\eQFCKMJKBJE8P@QNWRYOSQ`feiScwywIFEc^eZhiTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh±«T\K~©¯±´°³£
¨ ¤¤¨ © {p}h}wol|£ª
yvnw¢z¢¤³¡¢¶z¬§¤®¥p¨
{¤¡r£®¯¤®¡v´µµÉ¡s`©my u¡w ~oLf£pr¤{ytak~ kqd`r~tizi³µ´Æ¦s~zk«umuwizuqPE}´^jvkyfjhbtupnV^TYiPShIULYSU]hknVgWMJAJMKHJNAQKPecimeussy|nu{{TPNl^h[kiRjhilglfce_\]\^ibdik{_]dhcjfomeile¡¯¦f?¡²«¯¯¶¢¢©¢¢¥¥§¦yjye yui
z¥©z}yp¡y ¥¨fnxl¢d|q¥wpg¦{¤zrv¹n¢b}¡mri«ju mn¦_ihu¢}`
tobh e~iuocfmr¢Z_[c¡m]o{~srd¥mw¢dg§hso¢oSo _e§T^TnmskrmpikyskoRYWWfZSmIXO]IXihsjYkVQREV\LXRaUhj_wtz}p||r{svv^QrbgbpgPjhhklnhdg_]^]`kcjivu]\cicjjslfkmc¤¦zetm§®¤©°±¦«¥¢¡¢¢{qh|st}{d|§¡¬
}sh¥} ª§¦x¤²¯¥wy©t¤n¤¢»n}¥¯ |¥zq¨ f~o«cw¨l©¢uw«¦j°kv³©kmma«ªv¥v}¤ jw¬g¶tw¾¤Y¦«aurtp|tqcj~nhlSV[Vab]kM]R]I]mmv`[qY[`Zgtenoqcqt`xz~yrys~{{vbxdcmsdRkgholrjfia_^\bkbmlzo\\bibljwmglnb¥ª¤©ª¨§®¤«¤¥©
tzo~ttrm|{
¥¥¦
vol©«£ u~y®£q
x~{r¦q}}zx{~~v z}k
[yxrzphn~qtq
e^wusuoynnm
^vhxe
©}t|jov}vmmgsy{x[kXyinwrqoxxp]lnjgVZ`W]ekcVaU_Q_pxylkvejkjv|qrtsaoubt{xuzvx
}{mldxn^Wnghukxjijd\`ZcjelqunZ[bkdllymhloa¸¨¦¡¢¦¤¤«¢¡¬¡¦©~r|}~
{srp
{}
x~£{§¡
wr
©¨ ª~~¨¦woyo}¨
p}qkp}hm]sqtkvtYrn}~j]jdz
_ixz{vgwkaprv_r¦
fnwqzpfgd{z[\jgnv[{ywunssf\mklcYY^[Ylq\_aZ^]ft~{uotckkj{}r{xtdmthm|~vz||zz~o{}s~ysiT\qiluougkhd]aXkhlkqrmW[emlgsyohjm`©°¡£¡¨£¢~¢¥{|s}v
qor~z§¡x
z¡«¢¢££ª¡§¦ {w§~±¦²¥k|wxe|
w|yt¡~}ups
w¦
}wl}zjrhatp}zwvovt]^oho`^Z\]ShrUc\\alhu||sopdkji|nyqipplf{rx}
{m
|zx|}zyNdvjrmpzdkebb`[tfpfrqmU]ltmiyzqgike¹¢¡¤¡|« }y{nxr~mk~z|ªr}zª¦¢¦ ¥v{¥{|ª¡«~ow
qua~u~
mxut¢
t|}rr{{x¦w|ok~|nhlmg^zh|{vtvu{w\`p}nu`c[]^QgnTe[^akivz~qlldkjglskltoyoymv}vq~{{|{`i{juhiejc`i\duhobtmlUcqyepzzreimm·¡£{x¦¥yz
|n|xs
}}kh}|}
|§p¡¡
|¨x£ ¡£¡£~x }|¤ ¡§}~tspv`}r|q
hwqx~r|}px{zz¥|
vzer|xzqljf^~sh|uvt|sj^`tvpxdcY_^RkhTeY_ahjvxqfkclhekm}hoqk}xzks~tv~|z}jrnsiahlb_qVtomn`xhmWjtvcu{zrbjny²¥¥¡|v¤ ¢x{~q{tv
~xgc}x}y ~o¦¦
w¡¡z~¤y
w~s¢¢¢~|vq}nzd|
pleuo{|x{|{q~w
y¢ww|
v`xx}t~xgldaijwstu}q|bcasnusmaZa^[leRcX`aikvyqbjcmeh}lhthloi|ymqt|~z~|mvttmeljbcuViqn`xglbjvpfy{yq_rl
®¦¨}xªzy{}|{xtxzs}d^}~
t}~}£¡r{§ s¦sk
zo£|yqykul{}~m
wp}~dri{~sx~ux}|¤yt}tvna{uzq}oaocd{bnovsxwstau_oluno\[_^^k^P]Xcahmt{k_jejchwnflhjlh|{wos}sz}z}}rzxxnlkh_irbhroevgnlayhk}{xpawmª £¨}w®}w~{|{vwpts{o
}|a\~szz¥~}¤n¢¡nf
z
p¢|{srukqnt{tn
qt{|dplx}}tsyo}|
¨{|~
x~qp
chytup|b^p`kt^pj{yxkspex]mlsmsXZ^_bkZPWXecgqqf]ihgbgqodigdihzwtn
t{u
w
|x
zw{{ryjk_phtkromqgole|cnyvqlww~¢¡¨ ¦uª t{v
wxrs{
krpzmvnq[X~vu ¡x
m¡
j£f
~w~{|nuplmop{
ispwtxfrou|zyvtp{
z£|vxxok^rsrqpxZ^p`pj^oi|zpmmjlv`pojrmZXaabnXQTZfgcupb]kmdbfkm`ff_gkuqrpuxux
ww
{{vjqc|c|oqmtjholvw_qy{tut~¤¦
uzrxtpr
tqukomumv~mnUQ«xvry x{¤|r
~h
g
qx{z||kvjnkklzaz~vzx|ygslt~{qzpvz{}
||w}wqjly`xomlrtV^obr`_lnypgpffsthpkawe]Vf``rSQN\fe]yp|_\hrbbefj_hd[gp~pkps}v|
tuy{xs
~{yxgrj`~ookz`jntt_t}xxts
|x °¥
vtvspo
spqpjivnn}|musRMßÈÖ|puu w{s
¡~wz~zvgl£cq{{y
{~l{erojkyy\yz}~zyhsjs
}k~~n~}z|vxysmfpmjtohjtnS^odpY_krxfkjbfxropc_x``Vk_^vPNK`gc]zqt\\ev`aeed`eaXissmjqv|tyuv~s{~r|~vesn|e~opkYlnyysavz{vswwy¯
w~}
twpyqnomn~rddxq}my}jhlc¤ÁÜ®ï¡skuu¢
o q£
~zuxvvn}£
^m|}
v
}}k}dxuinxsXzy~
~xesj
kvnztsxusqguzbtmpbjvgR`qglU_ntyarc_h}prn[crabWnZ\xMMLdga^vsm\\dy^`df
`cb^Yjrknksw}twxw{q}~{t~~shuqylzntpWqzvyqewyiwr§£}pxy
¡{{rwpsjokim|t^`xw{qu{gae|ëÚµÉÃÜsltviq
|{
vxrup¡ai}}q~qwhvriswlZ|}uask~}mlx}}oqzulqlrx_tin]kv`RerifS_pvt`o`]hprjWghciXmV\uLKLeg^brs
i[\ey^^dg{`d_\Yknfnitw~ss~zvzs
|vw{vlwuyxtnxz}Xy
qogxwdv
q
¡¢torw}|xqsmodr~iflwx[^y{{qqjagaÕ¶¦xnqw{pj
{i|{~
zt{zpuv~a
g}~~m|tkmvtsvukb
~|~o_rp
{|~zpfy|~noy~unoklz}chkjYnvZRirjbQbrxlbe]Zjmsa[g_dl_nT[pNHOge\gnql[[cs`\clwde]]Zllbmjsvqo||txx
}uy|vpwy{om|w^tmiztsgs|r vv~mv~|v}vqoljau|gbiuzZ_x|zmqedhgW^qr¼Ävq~rsk{|}|u
vv}quqt{e}r}g}{y|i}vfoxxsvslj
xj^qxz}
{~rix
x|}nm{}wtohh}vd\qcXosSSnsiaNftxf`]\XnnsYeb]jm`pOYlRDThaZknm{oZ[^mcZbowcf\]`kjclisvqn~{tuz|
v~xtryy~oo|qiyz~mm|vkjxtl
n}vjxyozspljd`szh_er{Z`r|ygpzaee±²wJbZ¤ÙÐq{x}
olzy|xxoqt~ziy
¥o~vx
p{}oxh
xr|e}~vcpshxpot
{vxyj\p}r
}zrnqsxxnn~w{ehj}q`YwZYqnNXrsg`Klvta][[Yt}roWg]fjp_oNWiR?Yf_Zpkgyq[[XkeYcpy_h\^elhflipwnl}upzv
qq{|zytjzko~t}or|{onxg¡gphz~
|hxrklf_aoxm_boy\dlzaqv_eeÔê¾2:>ry
v~nl
v}
|xnvwnlu{tfy§}ntvy
~{xlri~xm|{xayqdqh~mtqu
~sv}so[l~tx{|xzqlry~tmkvuv]iixpYW|SZqeL[rre[Jpwo\[ZY]t~thYb[genciMWfQ=^f\]vf_tp[YTodYepyZh^_gmgjliow}li~yn{|zu
pnw~{{h{}jt{r{sw}yx}|kl~ki{~}kuqghc[bgro`alsahpzast^cd n\5Y¯µuj}vtwpm
uyx}zsgv~~op}hvymey¥~n~u||q{}|i~mk{zjzvr`w~qdrgumu{
|owy|t~lWo~vtwuzxrn
r~}~znnimun]hftrR[{N\q\O\rpcVKsxjWYYZaqt`]]`gdhifNZhN@ad[`va\tmXWStaZdnrWj^ahkgmlipw|kh||p~~{zwq{oqw{j~{nwyvw}x~~zm£{vzkmy}{~prpcf^Yg_pp``gpfjouato[adjv{¾¦£È¸q
s}xtrrp{tutwyyqcwzirufwvcj|}r~sxxzlxyuh{ikysizv}h`w}jkth{iv~z~~p{v{s~bUv|rs}pwxpp~}y~|u
uiqilrp^hcsnKeuL^oUTYsnbPOsxaRWX\aps[a\hedcjdP[qIDda\cq^]whUWUw][enhVk^ajgeooipv{niy}r{~x|v}pvrnw~p|xyztxzuo~}
zw|htz|vgom_d\XeYmra`aqlkhn`siY^dmw©Ú©Ç²qxpu{zutu~wpqmtxul`zyfqogun[m}y}x{mus
{
muvnhwem{vmjvv|abxzhtuc}zgu{tuqz|lYVs}otyksykt}z}x{r|rgtemmt[k_ueHnnL[bWWVxmbOStvXPUX^aqo\`cmdc]nbT]rGCf_]fh]ZzcRU\u[[gkaVj_`nffkqhpuxtkuvx~w{t~oqtqu~{wx||
x|}~
{~svyzvuy^~yt
wzbnl[b[[aVjsc`[gnograqfW]ck|Êι¢jmmlqq|~{
zytyuu{jmucuwpg^}yeqkjqcXl{sw~{nqq
{y~qqo~ghrbnxqjlqw}|z]eywiuxfvgt|rio~xm|]Xq~ms|noqvgwv|qzt|yrfsanlsXk_w\IokNWV^TU{kaOTurQQTV^bt
h\`kjfbYnaXbpGAh]`f^]U{^OVdpY[jh]Wg`_rfkgrgprwxntzw~yus
pp{wwuzz|u~}
~~}|xvyw}muydso
ztcnjY_[]]Tgse`YdrrgsbkeWZ`iw¾®{·nbsht|rzz}xxsvo{vejn`usjb^~xyfq}hjkZVox¤
qqxumr
}ytrohzajm`mvjgkkywzw[g}|xer}nteu
ofkztltb\o|kt{{fu}mqgu~x}r|lzzzwpelbm~mnVk`wVKjkOROhNY|hbNUujLPTU^fvf]aphg`Wi][khJEkZbdWYUyZNVmjY]le\Yec^tfmdqfrotwp
v~w|
}usnsxzzss
x}v|{~{w|wwziw~|l
rq~oflgW][\[Tdpe_XcsuivpeebW\\hporsdex~itvss
xywtunk{qagkgtnf]_}o{}hlwfidUWrp¦||vs|s{ym{zv|}uprlgu]mh_ludgfizo{rYgwugpxubw
|njmzpere`lyfrw{~buvikqtzpyxr}f~xvnceam|mkVkcqSLikPLOpG^{faMUtcJNSW`jv}e]gsie_VcWap]LKkXcaUTTsWLXudZ_k`\Zce_wfmbpisnq~ttww~z}u~
nrt{ztq
zut}
|~z~v{£¥y
lu|{uzn
sz
}unjheV][ZZSbne[Xat{jhmi_bW_Zijkoglahyyktttn
z}vunzhjyj_eniwgeXbwi~zoioff]UXoh§vz|yuo~oruywt
ujrvgho\me^ms_gaixh{m[mrsio~ywawxsqoyqbph[nwdps|ybspgjxsrkwvtwc{~wvpdccn|}klVjcgSKlhPGRlEaxfaMSq]IMTYekwze^mpid]V_UnnWKShXf^XMUlUJ\y_[_k]]Zbe`zhlaoounowuz}wzzyz~qtt~zvt
}}ls{
}~{v¬zlrzvuno|sjomddX_ZYZUbjg[Z_ui^ml\aV\\kfrt}ij]kvvhtwqm{~}yvrlzhiwf]dshzwccTeofwvfhi`WVYhd§n~xzpp|fxny{vq}~ndvsdhh]kb]oo[g_luezh]torkq{~uubt
zwru~taplYpsbqr
|tdrlalzojhywtqf
uzzupdadns~jlUj^^TLscQGWbGbvfaKToWJLXXgkvzdenpfcZX]XveTJ\cXhXYHWeQHbxZ]_l[^\ad^ij`otxmonvyr}}vvx}suuxzz}~jt{}~
yz~|sq®{{~frzt}}vrol{~lzbpoae^eVYYWcfk_]]s
hYpnZ^WZ\l{cpwvlb[mstguupm
yywnoteite[gufvvz_]Rffjs}aci\TX^bc¥hyt
xmnygwm{zurx|xhevm`fa_j`]tkYe]oobze[w{knnpxxttdr~zvoq}rawdZnpapq|sfrd^nvicfyztmnus|sqb^fno}ejTiYYTNx_RJZYHbtcaITmSILZVilr{bllsbaYZ[av\SKd]XiSWGY`NGiuX^am[[_bb]
hhanxylnjvyn~vttsqwvw|}~~~px}yxy~ssp¢{zyduysxvlto~ly|pr^pn`gblTZYWhcme\\qeSrn[ZXX`lvdiujj^Zmsqltstj|~|wonldiqc[jrdtvs[VSd`q~q\ac]SZ`\cerq
tljylooz{zqv~rzzzdeug^bZag\^whWb]ohawa[{vjirowtsthp~vrjp{lfvW[jmbpszsfo~[`pqb^ip|lks~rqxkp`\elm{ahTgUWRPv[SPZRHcsb`GUjPHOZUkkk|emoq`[ZXYlpWRPfWWiSTFZ\OHruX_cmcXa`a]icdmyxkniuy{k}|y}nqowz|t|tx
utpuo¢t{{fxon{ofxpzlsvsk^tnagekR][Ugbll[\qdOon]VXUgithbtee]Znunpuuzk||wscekoa\nmcsxkZTVbcw||p
\c_cT[`Yccnp
sjhznervs{lztuoz~u_frc[^WbdYaueU_`mdaq]]~phisqspuukm{
qrfn|oqnSZejeqtvsbmvUbqk[^ne|elu|rrrjm`Ydjjx_gTeUVPUnXQWTPHer_aFWiNHXTVmid|ikwkaW\U[tcSRWhQYfTSHZZPNxw[_fliZb`^^nbfkyunohvv~m~{krgt{u}r}
{ss}un¥swxnz`d|qfzsylmqvgd|lcfghS_^Tg`lo\^nhNim`TVSofskexde]Yptmrzxsm{w{zkaelm^`ojepy~gZVX`kw{{o^b^gVY`Wdbkq}wkjwl[vqkyiurmo{rXjm_Y]VbcXeqcS^aibblZ`~lfksunmwvkh
zmqeo{lqlbX_hhotsr^imSepeUbnaybpv{ukolj_Xaghu]eVbVSNYfSO]OOHeo]cGYiMI_KXmd_xhn}d`U^T]t[TR`fN]aTSJ\ZQYuu]_fmhXba[^qcgjwqsmhvtysz~|zntlst
z}|rstwqn~zz}~~}}~~}~~~~~~~}z{|}~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDEB1/000/,¤ £cggggfo
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR4555553~©¤¤¤¤§|\____^j|}zzz|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~}ssvx}~|y}|}}~~~}~~{v
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~ss
{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
np
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvuuvwuqfmjqsoghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhglgifrnhgcbbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z^\ef^rl]^ZY_[XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPRONPSabYkdTQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPYhhbibQOONOPPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKKFCFJMcrkgpjUNMLMOOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEB@?@BPlsmisq_OKKRLHHJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>=BIB<OipmdrtfEJ^TFBDEEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;;AYQ>Efmi`pqiRafEEFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprtusqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979:G[SScjjnqmjhmT>CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:Mcciljromklc@=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C;=>]mopmqnlklO;>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;]m?>CKfrqopnjk]<:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???BFD><<=@=8:;mvH8<9KkropnkgG;8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@YQ<==ILEFuvM7898JlrrpmS;<::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyI;]y{wV<>?==JfwmR==>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAHrykb}]>@C@A>EtV;<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot}~}uMACE@@ANvjH@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
pBDEDCXu~XGIJLLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqruvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{w
lAAVtWHLMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrsvwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Ul|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIIHHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJU
uIIFB??@???<<<>::<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIe
fBB=88::9878896479;<:8567789787688;;;=@;999=<>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIj~T;8656766645763468:876565676778:77789;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBf
H676468874578467699766765:9:;:;898977779:98878589;A=>>BA?AKLOQPQOOORWkqrttuwy{z{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=qz>988;<=>9:;<89;9:;:99;:9===>;;<=:>;9;;<;<<99<8::;:999<?<=ABDIJMKIKLWorsutvx{{||{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?>H~
l<;>BCEEAAAB>@B@@>==>@???@?@==?B?AA?A@=@@@>?A=><;:;99;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
^>CGIKJIFGGDFHGEB@@CECCABCB?@DHDCEDEEAFEFDEFD@B?<@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFX
WGLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A?BBGGIY
PMPMKNKJLJIIHJFDGHHIEEHFFELLMIJGGHIJNMNLLNKGFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@98<;<=:?@>?@CFIIP_
rNQOMLLKLJHHEJIDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADHJLUq
_RRPMNMKJGFBGJGLJFKNKKJJMMLOPNHIKLOQQPQOOJHJJLJKFGHGEGHFEEBABB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|XVRRTROLKJDEFKONOWUQPOQSRMSTOMSLPSUVRSQPLJMMMKNGGJFFIJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?CBFVNFNPPTX{
hVUkaERQQPI;;QSR`u]UVTVYYRYXRZfPUWZ]RTWQPNRPPPQKKKHHJHEFIIIHIirvyyzyz{{|z{|}|}~}}}}}}~~~SHJIIGFFE??AAEBCGEDELXRMTUVX[|
}al[dU:XXXSQ?@VUY\d`VYbr]]V]ZVEQYZ[Y_TZgRUVXTTVTOOMJLJIILMKOMSosvxyxwzyz{z{|}|~~}~}}}~}~~~~VJJIHGEDDBA?HMIMPKIKPTSSXZZ\\x
g;~znpXZ[ZRTRVVTZZuYU}`\X]_WIV]][[_YIYXY[]XXYWRQMPQMMOSQQURassvwwvxxxz{z|}}}~}~}}}~~xy}YNKIIHFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\YSUTWRQWVcQerXZW_gP`f[[X\gaGOZhg\[\]]WSNSPPQVVVVYZnrtwvvuxxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOMKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ[\^TQQPINOWVXZZdqsvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKMNKMKHJDFHEC>ScURQQNKRTQMOYQMNQSUUMQSRPOMLHCIHRTUZ\mruvutsw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRVTbs{|}{{
u_]KC?CCCCB?DPBC@C>BHGV@HNMG]iQHFOFDEFHGHBCHGHKGDBADAOPMSdstvustvz|z{{{||}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kLG??;;>@@??>jQKaEFHIEB?GLMGMQUIBE??<=<==?=?ACC@?<=B>JMFUnuuustvxz|z}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^JJPQNKLQRQTUUWQQWVPX[b]agmmlokg`nrjmlqu{z}{xz||xwxdB@@B=:BCAADB\]O{NONNKLMOOQLKLWMHG@B<977599=;;;8989?;BH?\stuvuvxz|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIHPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbXGFFHBAGIEEFDMRPaWRWQPSSRU[OOQWPMIDF>:96587979:366795<B=essvwwyz{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKTTSQQUOLRSTWXTTXRLWYZVXXVXY]WWXhsk]Vaskaa_^da_^YUPMONLIHJKIHFCQPSZWTTNQSYS\eUOSTQNKIHC?A9988978857578599Gnqtwxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLPRROMMNNNLJFQPUYSTNJOOUST\VRUSROMKIHHF?>=:787659967675Wppswyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOIGOPOOMRJOPPPNNOTLMIPOSTU2<XMIAQ=caQSQPNPQPNNMQNTRPRMILKORPRRSTQROLLKLLHCBA=::876;B4566:doquwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFFAFGGHFJDHJHGEHLHKHFLMPMG/E_R>3@>joaRRQ@FUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6677Dmptvy{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknaePSTRSTOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHEFHJMKEGCORC8ENS]fSQSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Sprtx{z{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTWWULLKH=987;?@><=A@B=>EHGCFFIGJJ@FAA@FHEJOHPRa\QPRNSOOPLLOMKMLMON[WKMQOGIHCIJLLJFFFD?BC><BF?B?Adpswzz{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;?B@@>ADIECGGIFIEBB?>=CBAGJEMObeQMNNWKLMKLMMMLKNNSdMJLRIIIEAHJLMNJGIFBAB@?EFEHDKnovyyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHKE?B=999:?B?<@BBADEGKFCIIGGHCC?B??@A>DECKNQTLJIMTFIIJLJKLIJLMOPRPKGCKGCBJJLMOMIJIGCCCDIJMLIYrmwyxz{{y|vrpurtyyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHKCGHHGJKIJKDGB=>=:::;@B?=BBBCHFJLJDIIFGGCC;A@B>@@CDCIMPGIKGHKDHIKMHJLHIJKJM]RHHDMGADKKMMPNKMJKFGGJMNQNLbmivvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKDFEGEFFGEGBC@><=9:::@C@>BCDEIFJJLFIIGFFDB;BCC>@DDCEGLNHKNHDHEILNMHILGFGIILNKJHENIBFMLOMOMNNMKIHIORQRNRfffqosxu{z|lhjnekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJCEFEBCBE@DB>@>:;;=:=>CA>ACEGJFIHKHGGGFEC@=EEB>BDCCEGHIGMPJFFGKNOKFHJFEDEIJHKIFHPKDIMLPMONOONKJHMRUTROWd`amgproryzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutwljuumrvqlnlerMHDEGCB@BD=BA>A=::=?;>>@B>@BDGKFIFIHFFGECBAAFFCBCBDEEGGHFLQLIOJJLLIGHEFEDCIIHKJGKRMBNOMPOOONOOKKKOUWVUTX_^\iaminhrsbefedihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwujsunutsqrjksMGGFHBB@DE<A@@C<89=>9?<?B@@@DFHEHFFGFEEDCECDIFCFEBEGEFGGEJMKHQMJKHHIEFHIFCIJIKMKOSNDQRPQRNOMNPMLMSWVWXVX]Z]d`hbjigk_eefcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxmouorsuqqiozMHGHHBBBFE<?BBD<7:>>:>:@B>??CEFDFDDGEDECDEFGJEEIGCGHFHGECFJJGMJLKHJLFIIKHEKKLLOORTOHSUSQSPQMNQNMPWZVZYVZ]ZXa```^hec`dfhgjihjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprryNIHGIDACHE<@EBE=8:>>=<<AB<?>ABFCEBCIECEEFGGGIFGKHCHHGIGFDHKIGKHMKJKLHLKMKJNLONPRUVOKUWTQTQRLOQPOTYZY\ZY[^^^`c^\ackb`dghr
hgjfjmnponsrjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvpuMIKHJEBEGE<@GCD@:<>@?>?CB<@>AAFCEDDIEFEGEHHFHGIKIFJHHKHFFLHHHJGLLLLLIMKMMMOLPPQUVWOKVVUSSRQLORRPV[[]^[\^__a`ad]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwovJKLJLGBEDE<@FDDB;??A@@@CA?B?ACHBFEFHFIFFDIHGIHJLHHJJILJFJKHIJJGKKMMJJMLNNNOKOPRUXVMNTVTSRQPLNTSRW[^^_]]`_`aa_acebchbdijgvljigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvowKMLLMGCCAD<?EEEC=AACBBCEABDAAEGCGHGGFJGCHIGGJFILHIJMKMLGKIHLKNQKRQMSMKNNOPPOTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^`b^`eaacingbihhnxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLNLLLGEA@D>>DEFC@CAEDDFBBEGCCIFCHJJIIKGDKJGHJIIKHJJNLNLILHJMKZfJd\KlSHON_nUks[qpbwcRPavuhucav`Xnqbdvinzf[lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyLNJKJFC?@B?=DEFDCDBEEEFBEFHCDJEEJLMKLLGGMJGIKHKKIKJNLMMLLILML[sbdp^lmUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemxmlvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?BB?>BFGBFCEDEEDCHHGDEKGGLMNKMMGJNHJKJILKJJKMMNNMMJMMM[roonpplkMPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\_rkqjUuyxpc^kfbgppjioppsspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryJKGHEEEBBB=@@FGBGDIEEDBFIHHEGKJGMMNKMNGLNILKIJMIJJJKOPONMKNML\hdu]lqWlNPQmUZk^klvaldtTecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIDEECAB<B@BFDGFLHECCHKHHFJLLFNKLSRLGLMHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nnooqronusttj[^tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyxtukoumtonssvsHKHIBEEEA@>CDBGCHIMIFCFJLIGFJMLFOJKWRKGKJJNIHJLIKJIHJMMMLIKKKSkbZi^_icrrZ_Yjo_eeUk_c[aaQ`lh]j\ojid[pfdp\Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFIDEDFA@AEEDGBHJLHFDGKLIEFJOLIPIL[QJFHHKMIHJIKKIHIGKKLLFHKKLLLKIKLNT[\TPTLPONOOVQOOQNOQJINPQeriTYW[[\UYZ]X]\\cfaaebce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusHCEGFFAEC?CHDFGCIKLHFDGKLHDGHPKLOKLWLIEEHIJHIKILJHFGGIGHIEFLIJKNLIO\W^P\[`^OXYS\\b^MYZMXaRJYaZS`d\aX[ddVVX\YZX\VY\]b^d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBEIEGGFKJKHEEJJJGEHHPJMMJMSIHFAHFJIKLILJHFEIGDFGEEJHCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN^\^S[^c^Z]`c`Y_b[`^[TXWY^]cbcacfiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCGGEHGHKIIIDFKKKFFIJNKNLHLNHHF>GGLIKKJKKIGEIDCDDBFJD@JLJO[cY_^a_RTRW_`\]Y^QY\MV_WKQY[PZ_aa^^ca`bbbcceZQYVU\Z]c`__cebhomnllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKFCGEBEHIFGHHFFJGHFHKILDDKJNMLKHJJHJG?GFNJKKMKKKIGGCD@DAHIB?IJHO]aZ[d]_TQRX]\\\_ZKW\LR\YIN^QO\_acdccb\dcbdcfXQUTR[XZa_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCEKJFFFHGGIFFFILJNEDKJLNJLIKJHIFBHHQMKKOMKKIHGED?ECHHAAGFET]Y^X_Y_[]UXXP]]QKJV^X^[]VY`RQ__aba`bb`cbaddbXOQQQ[S[]]]]^__dhgljnnp{{|~{
srw
|x\SKCAGFDGMRHCQJFHHHEFKJMPEGHJKNLLILKIIGDHKQOMMPLMKKHICDAEDHGBAGECWUE\T^SV_XNTUNZ[MJKT`a[_X^^a]OYb\``_bcb]abW__TPNOPXR][[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPCV^IGGHDFMJPPEIIJKNLKKMLJJGDJMQQNNOMNLNHKADACDFDCAEFBMHBKLPONLFMFGIJHGLLMOPILOPOSPLQSRUZYWYXXdWOSTPPNMOUT[YY[]\`adecgcklpsszy{z~{}{
}KIEEGFGDKM]LGGXMGHJHGMLQQILKKKNNUNOKKLGFKPSSNPONONOHKE`ED_LDfcEM[I^[rmOMUmYLCP`UlWgJ]WU^DLQULMTVQRTXWTXUT\UPfZhhdXSkSVVU[\[``aaab`fhfnlhrz|}~}|zr{z{
~z{LIEFFHEEKOSIKF`THJOJIOMRQKMLLORUROOJLNGHMQ[YOPPNOPOIJPQI|YYrsXPmHqnoaVPqqsPCksmqtpSo_[nX]V\XUkhU]VcZ`Y[`VUWjtuu__v_Xa\\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMNBDLLFJLFQVLKNIKRXWQNOOMQTNOQPKKNGMPS[ZTQROPPPJHZx]TxehYRTQvgtlpbnfjQrOMwmjrpsrqrpoo]fzuxqqzq~s}ku}bRg|essosr{|o}yor_``baZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJPNMMJNV^YULQSNYZMSSRNLOIQRTYWWPTPPPQKGfxlcxrmZKMUypumubnvPdeJfvqmwojfxxiWrRi{lijzz}lxzogoXvvjuup`rg}ilx|o^__ba[]bdgijdgbcdllppstsssyqrxblugry{ssuy~suzn|}yxrnNKStNCBEPPHJKJLQOOOMPZ`ZXKTWPa^RVQYSLOISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTKhx}x`y{sna^mocRgqunmypwlvttqlm\t~zkmy|ktm|kpvux^__b^]_ddighee^abiiijknokqnmjpacfdowxompsy~nqpj{ztromLL[VHGEGRPILMKLQQQPPQW\YUMUYUfXRRY^TMNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhe|ir|]TKl`vukiv|{m~xk|p]^^b[_bddgeeebZccikkrsrwgmihdg`alagsrlgmmr|kmhk{tmmkmOHJKHIIHQPLNOLKSSSOSRWRVTPW[VVTTTa`PNNKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXXQNPUTXXX[[URSW[WXWZOSUWWXR]YW]VTOYRWWWXY^[gr^[[Y\]_cZ_ccdfdccbZccfffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilQIKLLMKJSQMQPOLVUTPTUXUYUQZ]VUTWUYXPOLMVTQNUSNOMLQPKJQRKQMKKORTRQQSSIHLNOQRQQQTVRXW\WSSPQUUVSZQOSRWVTYVTYUTRUTTTWXW]Z^a]\ZZ\\`c\]bcdfdedaY`acabhhincad^_c]Zd\bma^fefmsdihkkedcfhPJKLOOLMSPNSQQMXWUTUWWWZUS\`VWVYUXTQPKOWSPNUPNQNKSPMOUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[TOTUXUUZUWYURRXVUW[YZ_]UY^\^]\]`a^[bbcgfddbX_`b]`hefda^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTOOSQOQZYXWXZZXYV\jdVXYZWVTTPKOVTPOTPPPNMQQPRXTQQOMOSVNWRTUUONMQSUUTTRTXVZ]\ZVWQRWXV[[WQTVVVVYTXWTSRXVUZ]Y]_^V^]^`\\`___ZbbdhgddaYb`b^^fcc`b]\\\\YZ[X[a[^]\_b__bdebd__`\PMNNRQMRROSTQPU\ZZW[[\YZ[dqmhd_[YVVXQLMVSMNROQROLPSRUZUSPPLPWVRWSSSXMOPRTXUUUSUYX[^][[VROUVV[[WQTWVWXVTXZTSRZWV\^Z^_`Ua\aa]`b`]`]cacghdf`Yc`a__ed_`c[Z\[\YZXYW\Y\[`^_[^^a`_b\Y`ZQNONVQPTROUTSPW\]\X^\_W\^jqwyc\[VVXQNOVSNQQPRTRKQTTYZWUORNSXWTSTRRZOQSSV[VVWTVZX]^\\^VSNTUV\\VRTVVXYSTY\TSS]XZ]^\```Vb[cb^ac_]bab_dfidf^[d`a`ace_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUURQWRTP[]^^[`\`U\]ijr}slg\UXWQORZSRQTRTUTKQWV[YZSOSRVVVTOVRSZRTUTX]WXXSX\X^]YZ]TUNVWW_[XQTUYYYUWY[TSV^Y]]`]bb^Y`[eb_dd_^cca]efidf]^da`abcd_b^XZ_[\[XXXXW[Z\`\[[\[XZ[^V^Y]POORZPZTUVVTTT^^`_^b\`U]^bkyum}lZUYUQQS\TUTUTVYWLRZW][\ROUSXVVTPXRSWSVUU[]X[YUZ^X_^Y\YRWRYXY_ZZSTVZYZVXY\VTZ^\^`a_dc\^]]eabfd^_dc`\gdhedb_da_a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]_T]^beev{hXYYSVSV\WWWVVW]XPU]Z^]]TRXSWVTSTXRSVTXXX]^X][V]_X__X]VQYTYZZaY\UVX[Z[XYYZXV]^_^cbadd\b\`fadfd_`dbb[fchecfaf__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNTZVS\TVWYWV\`abcac^_V[`da_zuohY\ZUWUW[ZY\YXY`WPV^\`a\TUXPUWUSWVRSUVZZ\_^Z_\V__Z]^Y^VSYWYZ]bZ^VW[\[\[[YZYY^_``dbceebdZbfcgfe^ab`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXUXWX]_badad`^YYadb`kfh^\][VWXY\\\_[Y[bVTX^]ac\RVXQWVWVWVSVTX\\^``]a\Wa^[^\[^XVXX[[_`\_XY]\]]^\Z\X[_a^`dcdfffbYceehgd^c``ec]fidei_g^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNRWYVWZX[\XWY^`baeada]^Yacb_a`a^\\\WW[[]]__\Z]cXZX]`cd_RXYPXWXYYWVXV]]^`a`_b^Ya]]^Y]^YXVW[\`_]_ZZ^]^^a\[[Z\`a^bdcefefbZdfgigc_c^afdZiibfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxLWW\YW\[\]ZW\]_`bdbba]`Xbcb`cab][\[XW[\_]`_][`d\\XZcec`R\YOXXZ[ZYXZY`]`bb`ac_\b]_][^^YYUX]^_`__\Z^^`bc\\X[^`bacedgeefd\efhifcbb\cg`\iibhife`baca_`_]][Y\YXWXYXW\[ZWWXPXZ]acffrkJYW]ZZ_\[^\X][^_acbaa]b[bdb`ccb\[[ZWXiq`\`_]\ac_^YYcedaS_ZQYX\]\[Z[[c`cbc`bda`c^`\^^_ZXV[_^]aa_][`abeb_]T\``cddfdgfefe^efhhgdd`[fg^ahhchhfc`b`cb___]]\Z[YXXXVZV\ZZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{||||{|{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{|}}|||}|zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½F(****"ÛÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääèÊ;ïååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyyyzxopppppprrrrrrrwzyyzzz~||||||}}}}}}}}vssssss}
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvx{xzyy}zyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{zzz|}}}}}}{zzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy||{}z|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwwy|{~y|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwww|yy|z|{wxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz{{|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy|{zzy{yxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqpponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrpppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqppqqrrqqqpppooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpurppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqzqovoppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqqssxpqqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrrqp{v prrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrst{¤qttsssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz~|~~|vvwwvuxzxxxxwwwwx§¦w|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{{|}~©¥z{{{yxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}}|||«¢}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~¯¨§§~~~~~~
~~}~~~}}}~~~~~~
¬¦¥¯¦~~~~~~
|||{|}||~~~~~~~~~~~©¢ª£~|}||}}~¡¤
}||~~
ª
}}}
®
¥ª¬©£¥¤¢
~~¦¨¡
}}~~~
~~~~
~~}|}
~}}}}{
~~}~
¡
}~
~~}
~}~~
~}~
~
~~
~{z
~}}}}~~|{|
~}~~~~~~~}~}}}
~}}~~~~}|}}|y|
}~}~~}}}}{zz~~
~~~~~}}}~~}}}}~}|zzz~~}~~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~~~}~~~~}~~}|~~~~~~
~|~}~~~}~~~}}}}{{|zzyyy{~~~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~~}{|~~
~~}}}~~}}}}}}}}}{zyyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}~}~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}~|{|||{{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}{||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~}~|||||}|~~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}}}|}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{{yzyyy{~
~~{zy{}}x|zr}{{}||~~}}
}~~|~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~}~~|}}|~~~~}|}}{}}}|||||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~~}}|}}~~~~~~~}}~~
~~~}{z{z|{z
~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||~|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~~|~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}||~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~~}}}~~~~~}}~~~|~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~~~~}}|~~~~}|~~|}~}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqsoxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}{||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}||{||||}}}||}|~}~~~}|z||{|}{yzzzyytuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}z}{yvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~
~||}|x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{~~}y|zzz}||}z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwm{snym}rsvsvmnwlpylu}|~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}~{~|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrioyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozls|nv~~}}z}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~~}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~}}|}~~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}|||~}|}}|~{||{||}}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~{{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{|}}}}}}||}}|
~|~~
}~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z{|||~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{zzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zyzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÔÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÕÕÕÔÔÔÔÕÕÕÕÕÕÕÖ××××××××ÖÖÖÖÖÖÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌͲâÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸ºÑÓÓÓÓÓÓÓÓÓÔÔÔÕÉ»½½½½½½½½½½½¼¿ÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A=>@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎnPSSSSSTTTTTSL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¢§ÏÓÒÒÒÒÒÒÒÒÒÒÒÔ¿¨ªªªªªªªªªªª¨°ÒÒÒÒÒÒÒÒÒÒÒÒÒÑàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÎqTXWWWXXXXXXWP¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤£¨ÏÓÒÒÒÒÒÒÒÒÒÒÒÔÁ©«««««««««««ª±ÑÒÒÒÒÒÒÒÒÒÒÒÒÑßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;<<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÎx^a````aaaa``Z¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©¬ÏÓÒÒÒÒÒÒÒÓÓÓÓÕ¯¯¯¯¯¯¯¯¯¯¯®¶ÒÒÒÒÒÒÒÒÒÒÒÒÒÒßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÇÅÅÅÅÅÅÅÅÅÅÅÅÄËÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÏÎÏÏÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÔÕÕÕÕÕÕÕÕÔÓÓÓÔÓÒÒÒÒÒÒÒÒÒÒÒÓÓÒÕÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÓÔÐÎÑÔÔÓÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÖÕÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎЦÅÔÏÒ¤¡ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@=:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒª¬Ã¼¸´³¡©ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐÉ
¦¨ÅÈÐÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<=:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѤ°½£¬Öº¢°²ÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÐÕ¹«¥²¯³ªÕÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÐÑ ¥¤§¤ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ×××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÕ§¤ Õ¤´« ©
¤ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÒÀ¢È×ÊÙÁ¼¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÔ¤ ¹Ã¡¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÈƦ½¨«¢Ã «¤ÑÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKLA>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ Ôʪ«¬ØÂ¼ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÔ¯°³ÐÖÀ¿ÖÒÕÅÄÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÔÖÖÖÒÒÕÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;877797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98868975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¥¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¦¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ {jfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<:;<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢£££££¤¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?;:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¡¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡ ¦
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{~
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}{z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z|z
i
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~_
¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¢¡¬{Y ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«ª©¯¡ ¬¡vY ¡¤¥§¤©«¯¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®¯ªª«¤¡¢¤©§¦©¨¢¦¤
§£t[s ¡¢©§ ¢¢®¬«ª§¯¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¥§©§©¨£§¦¤¦¢¡¡¡¡¥¡¢rcf¢¢ ¡¡¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]\PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§¬©¤¢ ¢¦¡¦®¦¦¥~qh_¢¡ ¡ £¤¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«°©¨ª¨¡ §©°²¯¬£¢¦¡®|~¥oj\¤¥¢ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[Z`_Z\V\hdncnjib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¹w}²¦liX~¥¢£¢¨¥¡£¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvyjb[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´¸zrq°¯gfT¥¤ª¦¦¡¤£¤«¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhukqhiiaYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µµ¼¼¾¼¼¾Æº¸·º½´®wne¬·k`R¥¥¤¤§¨¤®¤««µµ¯³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÂù½¿ÀÀ½¿Ä½¼º½¾¶©~ui¢¶u`Vµ®®ªª§¬§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^kcbnwuvnl[bQV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾·¦~}£mjª¼¬¯¯´©ª¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhakmfnuqruqg^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ãɰ{y¡¸°°®¬¤°´§ª©¨ª¬©¦¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tklndomiqxnyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿¼»¾Ä¾ÅÈÆÆÄÄĹ´À·´»ÅËxfv|l|¦¶ª¢·°¦°»µ¬®¥¤£¨¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrxsyff]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÉÅ¿ÃÀËÍÏÊÇÄÃÄÂľ¸½Ê½naSb}~iUgp³ª¦´³¬²Àµ³¬©£¡©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh]konxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÎÏÏÌÃÇÆÈÉÈÇÊÎÊÉÇÈÇ¿ÆË¤y^NHTwu^DYby§·À¾¾¹¬¹Áº¼¬¦ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvhjitmxl]d[V`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÎÇÌÉÂÂÇÁÌÕ×ÍËÊÎÅɼkPE?NphX=N\lÄÌÆÆ°ºÄ»¾´°°°Á¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuntb]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËɼ¼ÈÆÉÕÛÕÍÉÉÅɧvZLWEJh]V=IVc{¼Ðư¹Â»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfefcjdbjmno^Y\VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÉÃËÙÓÈÃÂÁÆ¢iLbjHaVXAMU^i¯Ö½v
¼º»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbacddjcgc[ZZ\YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶¸´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÑÁ½ÏÓ¼´¼½½®lF¾J`WZDT_[_¢Æ£{h÷»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bchjggifi]VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÂÖº¿ÂÙ¹¡¥¯´¸wI«LhecBUs`Wle¨Æ¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxqmeefoielhXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÐÄs©Ë¾ÜÍ¢°Mq~pWxqNVeUxvkcnÁÆÅ¾Æ¸µ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksfbm`\TIKJDJBCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°¸»²½¾»Ä¶µ¸µ·À¾Ä¼ÂÄØ«p¼ÈÔÞ²
}UcfVr~nUtcZcba\
ÒÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rflintnxcgb\cQKTHEECHC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸¹½ÇÊÊÃÇÉÒlqÑÐÛÔv|t^b]N¥T]]\YYXaªÒÉÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_c^`aNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»ÆÓú¾¼Ä¾·¼À¿ÉÐÇÈÊÊÀno£ËËÏà¸sjkg``WU¨¡^XYVQURyÆËÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[^__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶»¹ªÛþ¶¾À¾¾·¢¦¯³ÂÀ£trtÄÇÊÖ×WUQOPE[ygZTONOVÉËÆÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxsgp][^]YREDCMIAE=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Æµl«Í¼µ¹À¼§zlgnjrmtw½¿ÆÁÕ¨UB@>B9Z}qi[SLLNv·ÀÁ¾¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y}vlu{pni[__ZSPAFHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹Àαv²¼µ¶Á¡
iZ__LR[[mnr}¸·Â¸½»sD5594Rrjjspd_WLK\ Àº¹·¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsuvwnq`_f][TJ=??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Âʦw¡¯´hcfUY`JJMPTjs£¯·¾¹³¶h7053F]U^db`b]OLv´¿¸²®²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³»·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_cb[^OHB?=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Æ§{v¡^SBYTHblWPFIcª¯¶ºµ´²P311APFQWXX``P\¹º´¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc]gX\]RNNA>JBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸¿³ykNJ@hXBOwlLBW~°´³µ²´¯®wL00?E;EVWQX]Q|°²±¬¬¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmtil][jT]\PMHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³¸µyVFARWJJVva?U§¸³´²°±°¹¤{@->Z{§¢sUZ«¬«£§ ¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndUacW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²»©hM@VznOIILfWEU¯»±¬³¯®¬µ· fg©§ w§©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦££¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vzcwln\QhTPNGPMLBOQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Áª¦½dEU¢PYIKaJXcff¬µª²´®ªª®°«°§ £¤¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uv}mk{dhUQcMJHGORMJNG<E@<2@859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© ¬ÆÀÊNBwnOoKNbfur`_ft°¯®³µª¦«ª¢¢¡¤¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wx|dyy`bRU`HIJKSTIRPL9?A67<65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥ÆÆWRKf¢^i~rvYRkc]ifej´°°¸¬¦ ¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´ª²®¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZZMQJOOULSLA7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yUlruumburXY`_di]`Xb¬®¬¯§¡¡£¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸²´¤ ¥¬¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xujwu]lZR`HRUHFUVJBLG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ £~on`dWM[RXKKQWQIROC¬ª©¤¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§ § §§¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmivmhm\X\CWNJGMGCFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£aW_f`VMOE<>?CC>=BQw¨©ª¥¢£
«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÄ½Ã¼·³©³ª³µ¯³®ª¯£«§¶±¢°¦¡£¯±°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤{trkktrqhV\QFTHDJPI?EA4FH95;>6;<>=<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ {`^e_PEE:D@F<>96N~ª³§££¡ ¥«¥xm £¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÄÊÉÃÁƾº´ººµ»·°µ²ªº²®»·¿»º«¸«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkchoxkeZ[FKLEDSMDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡{ri`UND>J\}pbA=\®¬ wrqmp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÅÌÑÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÂÅÆÆÊÈοÈÑÌÇÆÇÅÁ¼ÃÁ¿¿¿¶¾³®¿ÀÃÃÇÄÇÄ®¿¸²¸¼Ãº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLDEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £hd[SHD@?L¡© ²£yqroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ò×ÒÕÖÓÔÈÌÆÌÍÉÒÍÎÓÍÅÈÊÊÁÆËÇÉÈÆ¿Ã³³ÈÄËËËÏÇÊ¿¾¿½ÁÇÄÌÌÈÉÀÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡bSKIDB?DV³Ò½²°¦ ¤¡}wpkebhqoq{
upnqtp
³Ã¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÖ×ÓרÎÒÊÏÑÌÏÐÍÓпÈÇÊÄÌÌÌÎÏÅÆÇ¶¿Ê¿ÒÍÌÐÆÉÈÀÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨|xsvpc`drb]R\IJGAEIJ>;A8=4586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢ YI@AD@GQy²®§ wic`__`_^__]blutppolrquÄÈÆÔÖ×××ÓÖÐÕÔÚÔÔÎÏÕÔÔÑÑÌÑÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ×רÑ×ÒØÙÔÖÌÏÏÊÍÒËÎÐÁÆÃÈÆÎÍÑÑÒÉÌÍÀÊÌÆÓÏÌÎÈÅÊÇÇÈÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£«eC8=>EXª¨}pecb__a__a`_``_`fnppnkorwwÌÁÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØ××ËÈÎÄÉÏÍÊÌÀÊÀÈÊÍÎÐËÐÎÎÌÎÏÈËÐÐËÎÊÂÉÇÉÌËÌÒÓÍÓÑÑÐÐʽȹ°®»¸µª¶°¨¸³¾»±
zvopokadnpaW\ZIFFDMXE;@=33<=87855;>@=9<<8;>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©¤±zJHC=X¡k^^^adb``aa``a^__^\bmroostvvy¤¿ÌÕÑÖÔÓØÖÎÎÔËÎÎÅÎÊÒÒÏÇÎÍÍÔËÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÔÒÕÕÊÀÊÂÅÌÂÈÉÃÌÃÅÈÊÊÏÊÍÌÐÎÓÌÆÈÏÌÈÇËÅÆÁÆÊÌÍÐÑÆÐÎÍÍÌÏÅÇÁ¸¹½Ãýù²²¾±»Ãõª¥¡yqrkmg``phYXhVLFLIPPB;C>;67:8::57==A<:<<9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨®xosu|eabb`]^acb`__`aa`_][]grrqrspmry¥ÇÓÏËÐÏÓÔÊÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÎÆÑÒÐÍÌÔÊÇËÎÏÈÇÏÒËÑÏÆºÄ¿ÆÉ½ÂÇÉÎÅÂÈÀÇÍÈÄÌÊÌÏÈÄÄÐÈÆÂÆÈÄ¿ÁÇÌÌÌÏÂÊËÈÇËÐÄÅÇ»ÇÃÈÉÂÏÁ½¼¿°ÁÉÆ¹½ª±²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»£¶}h¥«
}~s`[^^^`^`cdc_\]^_``_[Z\`krrooklop}¹ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈËÉÈÊÈÁÅÌÆÈËÍÉÄÂÊÉÁÂÌÐÅËÈ¿¹Á»ÆÈ¾¿ÆÏËÿûÉÇÈ»ÈÆÅÊÀ½ÂËÆÅľƽ¼ÀÃÅÌÅżÀÊÂÅÇÒÅÀÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {wrtfiZanlZ\XRDLFBGDLDFS@54334?=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾±¯µl_z~¤z
vxurp_[[]``bcdded`[\]]_^`[YZ\borokilposǽÉÅÌÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÁÉ»·»»ÆÃ¿¼ÁÍÃÆ¾¾µÁ½Ãº½Æ»Ãº³¼ÅÄ·¿µ¶¾¿»ÌüµºÈº¿¾ËÄÁÆÂÅÉÆÉÆÐÆÂÌDzÇÉÃÎÌÁÅÃÀ½³·°²§¨¨¹°¥°ª¬zvwjdg`hocW^YJFJFHJAEBEI@9:648854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÁ¹Å½«¥_eux~{ttc\\]^``bcaadeb]\[\^\^]Z[\^hsqmggnpry½ÌÀúÀ¸®°±§ª¬§¸´·´³³´»µ¾²·°µ¯²¼Â¼ÁļÀ»µ²º¾À¸Ç¹´»¶Á¼¸½ÆÁûµ¯²¶º¿´Ä·»µ«¸½½À½±º¶°¶º³Å¼¶®»¿µ·´Å¼¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÇËÀÏÉÇÃÆÂ÷ý½¶¹¾Ç¿¬µºµ·¶ytxggebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÐÍÒÏÍÅÇÁÅÀ¿º·É¶ª°[iq
zx~ww|sh]]]]_`_`da^cec__\[^\]^Z[[]_lpnhfknnr|¤Ç¿¹¸µ°«§¢©§«³ª¬©´®·±³©®¦¬³¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶»Ç¹Â¶ª¨°²À¶¸½°±¨²³µ»¼«®µ¦®¶¯»²°ª¹°»®»¸»ÀÀ¾¹Â¿ÇÃÅÀ¼ÆÂÈʸÅÇÅ¿ÇÄÃºÄÆÂ»ÆÉÌ˳¹Â½»³svvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>=9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÐÇÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Âº³´µÃ®©°[j{x}
z{wn^]\\]_`__dcadcb`_]Z[ZZ]ZZZZ\enohfgiknr¹°µ®¥¤§§ ¤¡¥¬®¤¨¢«ª«°£¦ªµ¶±½¹¯·¯¨®¸´´¼¸´¼¯¸¹µ²¼Á²À®¥©£«±²³¨½ª«¨«´³¦¨¡¤¯©²¦§¨®¦¨·¬±²·ºº¼±¼½¾¾Ä¿µÂÁÇÈ·¿ÀÅ·Äÿ»¿Ä¾ÄÈÌÊ¿¿ÄÀÀ©strji]aocWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?B;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁʾ»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ»¨«em{}~xt~|swe_]\\^_`^_ccab`a_]]\ZXY[[YXZ\_fkfdgehjor
©¥«¥¡¥¥¡£ª££ ¥¦§¦ ¤¦¬²°¶·§°¬¨ª´«´º±¶¶®¶¹²¯ºº±¶¥ ¤¦±§«¨¹ª¤§§¨§² §¦¤¦¬§¤ ¡±¬²´³´°µ¼¶»ÁÀ²º¾ÃÁ²¹¹Ã³Á½Àµ¸¼½¾¼ÂÇÄÃÄ¿ÀÄ xplbf_ko`UY^HNgOTHEKF<=?=:;;8255369:8;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7776788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÂÆ¸¶ÇÀÌ¿¸É·»Å¸³Ä¸³¿À¬µ¼²¬¥¯³¡£iq
|yusomjjipi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggjmo¨¡£¡£§ ¤¥¢§£ «°±¶£©ªª¬¬¤´¹·°¬³µ®³µ®°ª£¢²¤¦©¸¢¦¦ ¨¬« ¥£¯©«§ª¬¬±²¸¯¸¹»°¶¼¼º«³³¹³¾´¶²±¶µ¿¶¾À½Ã»º½zsl_e^ddXTW]IW\KPGIJGA<??@;?<04535:;9:899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÃÃϾºÇ¸¸¿·²Â´±»¼«¹º±¢©«§m~
xrmomkb^aff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bddeffhikq§¢¢¢¨¥§¢¥ ¡¯®®®² ¦¢®«§¢µ±²²¬¨¯³§º³¦¶ ¢£¡£¢ªµª¢£¦¥¦£ ¢«§¤¤¦«³´ªµ°³«²¹´¯ª¯²²³¸³®©¬®²¸°»¶º½À¸³±
yuf^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÂÌÈÆ¿Å¶ÁÀÆÎ·ÀĽ³¹¹³¿¶±¹»¬²´¯¤©xxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¡ ¡ ¡©¤©«§¯°«£¤¸ª¡ ®¨¶ª§§±¤¸°¤· ¢ª¦¡¬¸¯¢¡¤¢ ¡ª©¤¢£ªª°®¨´«ª§³°¥«®³±°°®¯§¨¨²±´°¼´º¸®£yud^aVYXSRTKM^LOKGGLLE=A><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§¨£ª»À½À¹®´¸ÁÌÇÅÂýŸÈ˲ÁÂÁ¼»µ»¼µ¹¹°¯°ª¡¨|wqilrtphhedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bccbcbcdfi §¦¤¦§ ¦ ª¯¦¢¤·¨¡¡¢¨´¢¥¨¥°¥±®¬´¡©¡¢±±¢£¡§§¡¢¤¥¥«¤¥°§¥£««¦©®¯®«¨ªª³¦¦¬¯´±¯¼µ±¯¯ zwrea\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±¸¬¥§·»¼Áź±¹µÄÉÉÀÃÆÅǶÅIJ¿ū··½¶½ººµ²«¨£t~vncafihfgifjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVUSURU``_`a_aabej¤ ¥¢¦¥¥£¤£ª«¥¥±ª ¡¥«¨¢¬©©®¢¢¢£«©° ¢¡£¤¡¢ ¢¤¦£«¥¢¤ª£«®¥®²©¦¥¦¦´¦©¨³µ´¹º¯ª¬rqo`[WVVRGQOHZ[ORITKSLEFID8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9578452121..1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±¾ÃȬ±¸Áµ»À»´´ª¬¦r{tiijlgjkmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^^___bdm£¡¨©«¨¬§©¦¤¥¯¥¥¯ª ¯«³ ¥¦£¤¡©ª ¡ ¢ ££ £¡¢¨£¢¨« «°¤·¥£¤¢ª¨«¯³·³¾µ³«¯
tsh[YYSUREXLQ[XMTNPLPQINIB=??A?=75799<<987:79:;<=>;7;;:=67:;8976989:6:=99577570141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»ÂȰ¸¿·¼½»³µ¥© ztvwnmhmmmpggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_`d~¢ ¬ª¦¯¬¨°¥© ¤©¨®¨ª¥¡§ª¥ ¡¤¡¢¥¥§¨¨ ±±¦±¼§¢¬µ«®§°µ°¸µÀ±±«~rsbVTUNRJGVPRQLLWMJLNRGMKACFDC>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576761320-*.102877;99;8948;8@9³¬¥±·ª¥¢±«ª§©²±¤¶Æ´¹º³ÊŹºÁËÐʱ¶¸»½Áñ¯±·´³»³´¢£wkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzu© «¦¦¬¨ ¦£
££¢¤§ ¢¢¦¤¦¨¦¡ ´²§²·¡¢·¬ª®¤²²¦µ¼µ¬«±£ysm]NQQLOCMNNPKFNNJJMNQHMJAGKHHC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤¶°¤§¤ª¥ ¨¦¥³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬º½´·À¯©°¦º¯®{n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]aosvp¡£¢¤¥¢t~{£
~~tz££ ¡£¤¢´¯¬¯¥¸¦¦±¡°®°»ª©¯ªwscVMROPNCSNLQLBPQHIMRMHJJDJLFJJ=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764789::65:87A7x·¡£´¨¦¥¨£¦¥§¦§³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ«Ã§¡¦¦¶¬£ ~x~eWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNSSSTUUVY[]ilrl
|tNXr_;Wo|s
y{}xqp
}¡ §®©©¨³¢¦¬«¨³¢©£~rn`[NSRWLDTJPLLFNOIELQMKOJILPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©¨£ª°¨§´Á¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©£±¢}su]PLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`moi{tQB@}y`JQnx}
n~xuvxoQ{~xvgw}¤£¨©¥¤°«¡¤¤¦ª¢ª¢¦¨umf^[HQQSMIUMSILKOIHFJNLMTKQPOFIC<768:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶£§¡¯¡§¨¥§¨°ª¶¼¶··³Á»¶§ºÈ¸¶¨¨µ¶ª²¼¦¨~}xpnXMKMMNKMQW[\ZXZUUVVVWYYXXYYXYYYZXXVVWUSPMJE@@kssIMJDDDINOhYNQSTUZnsv~ji\Ut|
{vxsovqtz~«
yzhv{prmxxz{vrrwhu
{|© ©¥§¤¡ ¤rha\]JWPRGJXROJLMRJJJLPILQLRTMEHA<78;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().1272198798775:<;7v®£¢´©¯©¥¬°²ª½´²»¸¶º´±·º²ª¬©¨²¯¡vx|vooiXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^t{xfw}hyvx}r|w{ok~|s{}tfv|lohs}lyq}qmvqhq~pC
wwz
}{u~£¡¤womebZXXUQJSUTOPNPVKNKNOJQNHOOLFD<;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©±¯±«¼¸¬»¾¹³¬§°§¬¥©¤
yuq|mupjmjXKFGEA@CDILLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX]eprl§ªÀ~uyc|xo|yz}omytxjjq~Inhw~licly
ksl|nr{imps{}~{vots
yyp|ojnonXVXTRQYORTTSXUMNHNKMNKCHNGE?:89;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥°£¬ª¨µ¯®¬´¿«¼Â¿¦¢¤¡¡sztotkqldljYNDFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\`§bitze~pmzvtlts|jkMy
g1vsl~~tfet~
filukq|hqq|n|s}|qpnvmwyujyywkkoheXQZWYY[MPUVYXNIHEJJHGB@FDCG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,5775478iO8;5n¤¨®²§»¯«²°Â±»ÃÇyqtzprpoodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ r|xm}lq
zyr¡txsu5q¨¡¡¢vp||sggbjnrmpuioXupwlz}mrnpzsvnbv~
ux~}{rppl`[\^\YXa_RN[ZXWLHJFJG>BABG>CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µª®±®Á²»ÁÆ}n
ul{txxlwnwci^JPG>@7449;;;=>@BEHLLLLNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lw|~
~v¢y~
aªzw~sz]drtz|wmhjbyoznwtzptywkni]w||
}q}uw{|wpsteg_[[^T\g^WQUX[UGJJDLG?F@DC>AA=:97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡}}p~zgvkRWL@E211367688:<>AEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z}~v¡¥¬©H®¯¯¨tm|}hghxn
qGlwryvhmk_w}
zzuv|xmow}ttrl[]][ccXgf\UOPVYPDLKFNICFCCA@CA=988:::;;:888::?>6;>7595773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¡¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¡¥»±§»Çè¡¥|qv
ihotq
w{v
}nvuf¡ª¢zzyogkx~z~rjd^ZZ]j]af`YOKNWRQHPJDNGCJDB@DDA<:87=<:<:88778:==8<=68756623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.320O_4?;nupfx{¤¡¬¦«¯°¡xw|mpj]BA4--//./02234779;=?BDHJNQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¡
lpuwqm
r¡¥µ©¢}kjk|sa]c^Zfk\lk^WKGORQNMLFIPCDMFACEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212457;?CENPRTPQQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¥¢¡¢¨¨« ¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢xz~¡{w«³}¤¢¦¶°¨lsr||qh`\`^bgc`hg[REJKPOIJLFFMCHLFFCBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}{ªªBD}x|
w_bP460-1/,.00//..0015>AAMQRSPRSURNSLEE@<>=GG@A@8662<9;FHGIJNOQYmw£§ª´½¸¤®¬¬§¨´«°¶²²»±³¾³Ã¬»É˷ÿ¸¥£°²¬ª£
¦¦ £¦¢ª¨¤
¤¡ ª¡¤©±£§·» £°££¤¢«¯³µ¢¤ªyz~
~g`h\eb]dc_ff_ZODIHSOFHLFJGEFHAKECFGA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1.-3?DAMUQRSUUWUN[PGGE<>>FHCD@8;<5C;=FKIGHROPW ®£³ª±ÁÇê³Å¶¬³¿³¸¾¶¿´Á¶»»¤¸Æ¨¶Éǵ¾¹´¨£´±±¨¯«¥v¤¡«±³ª¨®¶»²º¬¯µ¢±¬±µ¼·µ®µ §§£¨©°²º¸¸§¶©¥xuYadVeaac`af_[TIDDLUQHIJDIGEA@@JDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQcdWyuq}
v
{¿»£¼´y
zxn]V@EM<6:46AB764//6CHCQ[OQUWU\VO^UIKJA@>GKFED;>@7D7?BJJEFWTP^¥®£±´Ã¶¸ÁÌɶ»Ä½³³À··Áµ¿°·t±³¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°®¦«§¤ ¬³º¢©²º´»¾Ì¿Å޽³Â·º¸¿·º·¹¬¬°¦°ª¾°½»Â¬º¨®«}|jWbaWjejeW[dYVSIGFLQGCGIAHD>?BBK@@MC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYUZvjpnzsyb¸¡¢{z||}xzueO\dGEL:Qca[^SF?;HPDZcQQYXZgYT``MSPEA?IJHEFA@C<E6B>HGJLSZT]¯¸µº¸É¿º½ÉÌ»¼Á¼·µ»»·½´º±Æau²¥±ª½ª¥¨«ª£¢²µ¡«¨®¥§¦¥£¢¦±´§²²½¶Á½ÓÉÊÓÆÂÅËÁÊÃÀ¾½¿»¼·´¯¸·¶ÃºÅ½ÃȰ¹ª¢«¥¨¶r_ab]Wa_hfRXaVRUIEENKA>GD=KB=B@=F=;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]gllq
slrrsÕÀµ }x{{yt}zkepuY]\Peeb`ed][XW\MdmURmm_n_XgeUYUKDAKKHFIHHGBI9D?HKTTV\Z[¹À¸½·ÆÀ»¹Êʺ·º¶¸¹²·µ´®¶¶du¨p^¡ ¢¤ª¥ ¨¥¤¬¥ª°¬·°½¹ÔÑÏ×ÏÉÌÑÌÏÎÊÆÀ¾ÂʽÁ¼ÁÀÄÄÅÊ¿È䤻°´¯«¹¼zl]`\Y^aYccQ\`SPKCBEGE<@E>AHA@D=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi_polouu³¬¡¡
~|s{{ts{xkmu{hreilifjih`fihlZnt¤¼g[oh]ZZTHKNOJKQKTQHLAJGKP_^bfia·Ç°¸³»½µ±Äǵ°¹°°»«²±§ª·¬¶§§O ¦¥¡¦¬¯¨¯§³´ÔÔÔÖÒËÏÔÕÎÓÏÍÅÂÉпÊÉÊÉÑÇÌÍÂÐÒ¸°Ã¼Ä¹¥¶ºÄ¢oc\\^XaXYeZQ]WOOBBHEBI;AC>AG??A8;D>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeWshqoyy ª¦}|p{r~qxukqx~q{mxslipmcinpxiw|~Ë¿Âß§mcxnc[a`JPRUNY^P^]MPNTQUT\nnvr¸¬³§°¶ª¬¼À±«µ¦¤¸¦«®¡«´£±®§«¬¤§¡¬ÏÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÍÒÓÓ×ÍÒÑÅÒÖÅÀÎÇÇè¾·Ðzof]b]W`S][OPTPNH>AFABE<@B>ED>??:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMO[u
wlwp}~¡¡
y
{r~yu
ovrks|{w|swqksrhoqzyr{¾Ë~²vrvhaj]CZZ[WfdXekSX]]`d^cx{~ª¤¤¡ ¨¥ª°¸ª¥´£¡¡£¢§±¦k¢
}
§°¡ ¡¤¤¨ÈÎÏÈÂËÑÔÑÔÓÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÄÃËsoc`_XTZS\PJGIJJ@;:;EBD<BC>HB>BB;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznxpmuvx~t
|ymvtn}vuy{¶<AÆ¥~|ieVICfcechjdox[_fiknin £¤¦²¤¤³ ¡¥ © ¢±~
z~©£}ª³§§½Ãƹ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÚÚÒÕ¿ËÌ´xvoe]YRVQZVFGJIEE=:79@AB9GD@ECADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTlnopaqqs|~
|x
zxqz{uz
zp|oozq|qnzuw}|u|°tY©Â¶pnb=^hrpqpnxweioruxrz ª ¡¥¬}
~my{®ª§®µ½©½ÆËÈÉÌËÏÈÃÑÊÔ֨ר×ÕÛ×ÓÙÛÖÐÛÚÑÖÉÔËy{ii[ZPRT^HBEII>A==7:=?;=G=?AAADA>>:86DB755479.566435532323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqz~~||~wyn{{uz vutu}toot|
zv{·Æ¥ÂÉ·wpeNfczw¢xyw{|un¥ £«
z|¡¼¡©¦¥®¨µ¾ÀÀ¹ÇÉÍÎÅÍÉÑÖÖÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÜÆzzhid`TWVUMJDND;=<<9:<>9=@6=?@<?><9867CA6455=80665547745613854564567HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz|~~|
{~
z{u}tm|}~s~|~x}ynt
~
|~z©Ã ¼£}}s~s¦
{hGp ¤
¡~¥¥¸¢§¡£®¶ºµ«¿ÆÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Ü·xxxljdW`[TPNGCLB==>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqry{z|{{|{~uyszsm~}w
¡n¨
z |~£¢¤®
Wr«[¢¢¢¡
¤³¡¡§±¸¬¥¼ÂÇÍÇÆÏÌÐÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚo|uhg\]XSWXC@ID>>>:49:;7:;:3;;?<>7;9:19G=:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxmb~omwxyz||{wsp
zuvvt
}¦£¥¢¨r±§
¢ ¡©¯n·
ÄȲ¡¥²d¤ÍÇ
ª££¥©¡£³´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎrhc_]^NJTZBAGD;A=837;<:8=649:<:82?9:29I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:>:EMFHRWSRBcFu}|m~xz~z~vv|lny|xx|}£³§£ª²¡§¥¤®¢¸³¡ ¥¯£¤§§¯¤ À¤É¸«¢¦²
¨¢
t²¤¡} ¡±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ§ÎÍÓÒÐÖØÓÐØ»ryv\`U_WPHINEBCE6>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89566=:JFDGN[\YIf`;Hzzm
z|x
~px|}|orz}{x
§»¨²½¯¥³³¨£¢°¬µ£¸¤¤©·¦¤£©©£¯°ª»»É i¶¸«°£«¾£^ª²|}´« ¡¡ ¥¯¨¡¥³¸«ÂÈĵº½»ÅÇÇÂÑ¡ÆÉÍÍÄ×ÖÑËÓ¡pzh]YS^ROFD><CAB8?874>F<<6<35355454B3::BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeGb`bpI@~s}um}}|pww{ªÂÀ¯½Æ»³´Á¼´«³¶¨²®®¼ª»¤¨¹¸«¦¦¢¡££¨¯²±«¤¢¥¥£¹®¨¿¼¬²¹¥£§}½°z§±¬ £¬ ¡§§¤¢¤°²¦ÁÇ𰺶ÅľͧÇÃÇüÕÑÍÄÊtsb\Z`[MJBL@EG?A?B;:4>A<=5=6>333241A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\fF`igZ][{uo~|q~zz§´ÆÉ¿ÂÌÁùǼº¯«¹»²¶º²À®¥À¤«¯»¼ª«¢¢§ª®´°ªª¡°´§¢º¹µÁ»«©²¥¤¨
©ÃĤz¡¦ ®ª¡ ² ¡¤ ¦¤¦§¤¯¥ÀÄµÉþ¶Î²Ä¾Ä¼³ÑÊȵtym\X\jSMHDLKKJAA=CD<5AD;:3=8B332263A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBfZMe\fTcjyr|xy¡¨º¾ÈÈÊÁÒÉÊÂ̽Á³¬»¾§º¿½¼Ä·¬Á©¬²»½ª°©£¥£¬³¶µ ¯¥¢£´¼©¨¼Á£¶¶¯«¯¬«¬©¦¥¥uy
££©¥}£ ¢µ¦¥¤£¥¦¥£©¨¢²¬¨¼Àᥳ·ÌÀ¹®Ä³»¾Â¸¬ÂÃÂÀmyaXW\[KKMJFDDIBBACK:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddVw
¡®¦£Â½ÈÃÇÅÓÍÎÍ˻·¯º½´¼Ê¼ÃÁµ¶¼³¿¹¼®¯¨ ¨§¶©±·¢§¡«··©¥¯¾Ã±½¹³§ª´³®¤«§ ±Å§|}ª¥¡£¢Z¥e£²¥¢¬«§¦¡¤©¦¶«©º¼Äµ¥´¶ËÁ¸©¶¬²º¸®¨¸º½¸lnZWTUNFJSNK?BHEDHGG95FM;>7>AJ.32025B55PVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBqFiIRebLF¥¡©¦¢¯¾®¡Æ½ÅÄÆÆÎÎÎÒʾ»¶±º»¼¾Î¶Ä½·¹·²²µ³¸³¬¦««¸ª¨§¯°£®¤§¤¤´À°ª¬³¾Â¹À¹³§¸´¸²®¤¬®®¤¡tÁ}±¦£¨¡ `J¥T°¯¥¯¯¬¦¡¦ §¢´©ª³¼¼»«°²ÇÀ¸¥««±±£¡²²´¤qnf\ZNPKDPPPQ;GJIGHBC>9KU?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=QEWRsbWFHª ¢¨¯§
£¤µÈ´©ÆºÃÃÇÊÈÈÌÍÆ¾º²®¹¸ÀÁͶȺÁ¹¶º±¯®²´§£ª³´ª¨¦¬¤®¥¤¨¬º¿¨«¶¶¾Á¿¾¸²²Ã±¹½¬£®´¬¸¥¦v¾ ®¡¡©¨ ©¢§nv¢¢²£«¨ª«®¥¤¥©¢±¦©«º¶¾³²½¹¶ £§¨¥§¬©©cea_RKMGHNIUL=MDNJKBCD<QU=AABDO18=77?B75UXN?HNQYSPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..R`MUHe^HE«¡»¯ª«¢¤££¶Æ½´ÁºÂÂÇÈÅÁÍÈÁ½¹²¯¹´ÀÂʵƱÁ¼µº«¨¬°£¢ª´º¦©¦«ª¨¯§£ªª½¼§¬¼³·½Æ¼·µ¸À°½À³¨´¶«¾¥¢¢¼ ·©¥£¡¨¥³¡¥¨ª¥¢¢ ´¯¥¥°««¬¤£© ©¤¢¡´µ»µ¨µ²³¢¥ª¡wa]`]JIFHMQIMEFGBRLIAEG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCpbGE§¤Ã¬¤©ª§¦¡«¶Ä»¾·ÁÂÀÇýÍÇ»½¹²¯¸³¿Ãȵ¿¯¼¶º·¦£ª¬ ªªÄ¢¥¨«¦«¯¬¢©¨¾¸¦½°·¶Ç¶µ¹¸¿°¾Á¶´²´¯½££®¡¢¥££½¥©©¬¡¦½¢£¢©«¡¤ µ¬¦²§°§ª ¡¥¤¬±¶²ª¥ª¬ ©hcZb]NIHKOLHEDIA=PIA<GIH[ROK=HOU4BF9>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxecWM¢£Å¬¡¬®£¥ §©«¶°¢ª²µÄ½¿¶À»È½Êȶ¸µ´°³´·Áƶ¾°¸´¹µ¦¬ª«¥£Á¥ © ¤©¯¢¦§½µ¥±¼·¶µÃ²³·º¾±ÃÀ··³´µ¢¤ ¡¨©«¢Ã©¬¦ ½¡¤««¬¦¡W¥¡ ¸ª§¶£³¡ ¯¢¤¥®²«©¢¢¦¥¤be[d`LIJKOFEAFK>=JB99JKN]QQI=LV\9FI=DMI8Hc\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\KN¡Ã§¥¢³ ²§«¤ ¤©¬»°¨¬µ±ÇÃÁ³ÂĽÆÃ¼Äʼ¯±¶°µ¯¿Åµ¹±°ºµ¬¨°©©¥¡§Â¬°ª¢®°©¤§½·¦¶º¼®¶Ã³³Â¿±Æ³º¶«´µ©¡¥£«¡¨«°®¯»²¦ ©©¢¤¸ ¡¤®¯¬¥§¡¢§´¦§´£¯®¡¡¦¬°¥§¢¡
bf[hfJILJSBC@IG;;G?99NMU^RSJ>O^]=HPBLLI9Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤ 褪²¡£µ©²«§¢¤²¬®©»²¬°µ´Æ¿ÄĵÀĽÈöÀȵ«µ¨°¸¬ÀÄ´·®¬¶¹¥«±«ª¦»µ¨°®´±§ªº²§¹³·²¸Àª·²Â¼³Å§¾®·´©§«¡¥¤¢¢¤®¸±µ¶ ¨¤¤ ·¢¤¥®²²¦ª¦¡¨¡¯²¢¦®¥¬¥
©©ª¢§ ydi]kjMPNNT=CANC::I@77QO]^RVQAW`\BJSHVKH:Ue]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05JpiVCWFyfC;¤¤¡¦¿¦¨¯¯ ©µª¹¯«£ª´·±°¹·¯¶¸¸Å½Ãǽ¼ÃÁÆÀ¹ÁÆÁºª¶¤»Áø¸ª²»¢°²¥§ª¹ª §°ª °´²ª©¶µ¬»¬²²¹·¬¹°Âº½¾¦Âª°·¯©ª«¦ª¡¡ °¯³«°¹© ¦¡·©¥¢¢¯±´«²¨« ¥¡£³°¥¡©¢©¨§£~
kimalnWPRZTACET@;;IA7:XPd^PVWDY^]MLRN^KJ>Zd^NHPN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1647gY`F(?8l}h[V;{cC=§¢©½¡ª°ª£±¸©¥´³«¡µ½¯³¸¼º½¶¶À¿ÉĸÄ¿À¸Ä¾Á·¯µ¨«·²¼¿¿µ©®±·«¨§¨§»¥³«¢±°³¬©¶³µ½¯±µ¬°µ±ÀºÄ¶«¼¯±¸«¬©¢±¥¤©£²ª³©ª³§ ¦¤´®§¡¬¬±§³²©£¨£ ¨µ©¡¬¦¥£
{flrgpr_GYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b`PKMNXWXPJVVWM=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aU150=`V^8)C3YU\gK5zfL@¤ ¤¬·¤¬©¥®®¶©¯³¹¦¦°·Å·±·¾Áµ´ºÅ¾ÌŸ¿º¿ºÄ¸Á¹²µ¬ªº·ºº¾´ª®°µ§«ª«¬««¼¬®±£ª°³®®¶±¹·©®±§µ¯³»¼É²ªµ´±´¯®¦ ³¨ ¥±£¥¯¡¤¢¥§²©¡¦±«©µ¥¯±µ¯£§¬¸£¡¬¥¡¡ {{knxnv|aFajYIHY[={JGE6AbTiZM\aJ[]ZRRRb`LKE_a`PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C^Q\.*B/JGP[H3cYUKD °¨±©¬¥£®®µ©·´¸£«´·É»´»»¿¾´´·ÃÁÍǻü¶¾¿À¸¿¼±½®§º¹··Á¶«±¸¦®«§£²©¯»¤²±§§¢²³°²°´±¸³©®«²§¸¯µ³ÃŶ¨´µ«°©§¢¶¦± ¤±§©©¢¥¥¥·§¢±³«§±¨®°µ¬¤ ¬¨©¸¢¦¡§£ v{
nqwv|]Lel\KNc\?b{GI8GgWe[L^bMXYWTXTi]OOHa^_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'FaLV%-B.=EMQ<3rkJDC¥®¤«§¤°²³ª·°¶«µ¹É¹®Á¼Â·³²µÂÃÏÄ¿Á½´½À¿º¿¼³Ä¨©¹°¶¶¿¼¯¬³² §°¥¦°¥²µ«²°¬©¨´¹¬´²µ´¬©«¨¬©¹±°Ç¾·¤¹¯©¥¨°¥££®£©¯¢£¢£¬£¡ª¥¦¹¥«´´¤©«©¬¯¶®¢£¨ª¤´¢
¦w~
||}rtr~}~\Sdo^NZf]FD[H;NmXa[M`aNVWVWTYg^QRLcZ[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HdHJ+:I?3BIS,>k=HHªª¢©¯¤¨£²´±´µ±±¡«¼Ëº®À»Ç±´´ÂÃÑÅžÀ²¾Á¼¿·¼Ä§·¬³¸¼À°«² ¤§©¨¤°£ª±ª¯¬°®¯«³º¦¶°²©²©«¦¥£º¬ª±Â¹´«¹¨¨¨©¨±¥©¤¢®ª¨¢¢¬¤«¡§©¡¬¥£¬·±± ¨¢ «®°¬§¨©¤ §¡ ¤|w
tsrvl_Y`ncQsq\K;|F>WuX`YNc\MUVUWP\b^SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<]J0.IgDF8<B05EKX1@[?MF§¢ª²©¨¯¶¬¸µ®ª¥«ª½É»°¾¸Ã¯±³ÄÃÎÎþ¿´ÀÃĺÀ´ÉĬ¯·®²¹À¿´®®«¥§ª°©§¨±¥´«°®±¯³¬³º¤¸³¬¬®§« ¢°·«ªº¶¤µµ¤©§¬¬ª¡¨¦¦±²¤¦¥¡¡«© ¦¤¢ª¤¬¢§±·¬¬¢¤¢©ª©¢¥¤¤
¤¢|zt~tw¤yk^`ngWedN@gLDbyWbXReUMVUUTO\]aUKNiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D@HHD¯¤£ª°ª¨¬µ«¶±«¤«ª©¼ÀÀ¸¹³¼µ¦³¯ÄÉËÑ¿Á»¹À¿Ã¹ÁºÁÄ®±µ²³»Á¾³±®¬««¨¶ª¥¯«¹¯¨±±®±«µª¶µ§´¶«¬¤©ª£³³¨¨¤´´ µ¡©¨«©¬§ «¬¨¹¶©ª©©¡©¨¡ ¤¢¦¢©¦´®§¥©¢£¤¦¦©¢¤£~
£txu{xoqggqx\`sjO]VHmxUdVQbOLUTUPOX[bUHPjTVTGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Qc02?f=NX?C,>LT_/Jk6PE;° ¥ª«¤¬®³´®ª¥¯©©º¾»À±¯¸®¢¶°ÉÇÈÐÀ¾½»¼Â½ºÃÁÀ¿®²²²µ½¼Â²²³ª³¨¤µ¨¤¬³³¹¯£®¶±¯±¹ª¸®ª®¶¬«ª¬£ ¶¨¡¯³¡´ª¨§ª¤ª¡¡¬¨½¯¬®¬¡§§«¯¢¢ ¨§§ª°©£¬¢¡¢¢£¦©¥}¤
xt}uxy{tszi£ui^elug}RXp^JxsSdSQ^MMRYfNLVYeYFSiRR?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Lh:48_=ad?F1CP[[+HO:VB4± ¤¦«£¦¤¬¦´³°©£°§ª¸¾À¼°¨¹ª§®°ÉÆÈѽ¿¾¹¾¿¼É¼Â¹°°´±º»¹Á³´»¬¸¬£µ¦¦«±¶¹²§§ºµµ¼¯¼¥µ«©¯£¥¬ª§ª³¤³¨ª§©¤©£©¨©½¬´¯®©£ ®²£¤¤¥¤¨«¥ª¡ ¤©©
}}
¢~qzy~|iw|zuqq}hxd`hcr
zmgy]^VBWzmTaPRYKKNqt]HZ[gYEUfPD>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=;EZ?*±¨¥¤¡«¤·²²¤¨°§¬¸Á½µ°£¹¬¨¨°ÃÉÉÌÁ¶½¿µ·¿ºÈ¶Ãµ´³µ±½¸º¾·¹µ¿¡³¦©ª¯µ¸´ª»»¨²¿²º ¯´¶©¬®°¢¥¨©¢¤±¦¯ ª©¨¢ª£¨ ¼¨®°®¡«¢£®¬¦¡££ª¢¤¤¡¦¬{|~
£|yk}vyxb{zqpqsxisjgdhaosmbjp`pA\xkV^NPQJJMSYVM]^mWDX`O^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*K>*49&'.34.0+/4&,:$40BhY13S=e_DL6KWeO)<3P[=#¬§¤¢¨¤¸¯®¢¯¯©«¸Âº²¸¯«¨´ºÇËÇ¿·Á¾¯´¾·Ä¶Ã±®¹²²Àµ»¾¸©¹·½«¤µ§§©°¹°©º¼¤®¿´´¡®·µ§§§°³ ¤¦§ ¥§¨ ©®§ ¦£©°¸¤±¯¡«¡¬¤¦¦©£©¦¨¡ª}~||¡y}{so}qst`yxiopqojrdzlifdaf`[sjrMMiXZMPLJHPRPIN\_oTDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZhH*?0ZY5(¥ ¡¤¡·«°£´´©¨¹Å¶²® ·¬¬°µÆÈÀ·¿Á¹°´½·¿»¿¯«½°´¿±½Ãº©»º·§¨¶¨¦ª°¬³°¦¼·¤«»µ®°¸¯©¦§¯±¡¤ ££¡¯¦¡¢§¯¢ ¢£¥¢·°¡¦±«¬¢®ª¤¨¤¦ª¤¢©¡
z}yy~zzprwoot_xwdllljinfsikfi]ds`[kuiZI}^[XOOKHGRUF29^^mPDXVYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42*;+139cl84GAf[HTDU]hE.<2bU,2£¡ª¤¡¢ ·ª® º¸¦¬½Å³°¯£µ°¯µÄļ³¿º·°³¹¸º¸º®¿³´¸¯¿Á¸¬½ºµ¦¢³ª¦¨²«±¡Àµ¤§µµ¨²¼ª¨¦©¯¬£§£¦¢²¤¤¨©¢ ¤ ¤¸¨¤§®¦¥ ¨¨¢¡ ¡ª¡£¨¤
y{}y{w~{ltrllsaxthhjgfo
ghicfij`ibjg[e{c`SsT[[SKJGIOS@!*i^jLCVU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,>0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB379eO'2£££§£µ¦ª¹·§¬ÃÁ¶°¬£µ®§®¯·ÀÀ¼²Á¶±®²¶¶¸·¶¬©½³¯²±½¿¸®»¼±¥¶«¥¤´©«®Â«¨¥°²©¬´»©ª«±¥ª¦¤¦¢¤©¡¢ §¶¦¯ª¯¡ ¡ ¥¡ ¥¬¢¨ y
w|
{
s}}fxokjlguskcgddubeffejjdkqZ^Y]mdaNhWZ`VJGIKMRX>9_liHBTS\[IHFEA.<?9A89RG@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLYJVbfA:3AgH%5£¬¡ ¥³±¢±½·¡±Æ»¹±±¤¶««®©¹½»»®À²¯®¶¯³¸³¨«¹±¯´¶º¶°¹¾¦µ« °¥«®¤Â ²£®°®·µ¯¬¢§©¤¨¥¥£¨ °¦¹¨®¢ £¤ ¨ª§©§|t
|pfynhkjgqrk\hccsafhjnlgkjgm\lluqaTbhdeZIFLMOXQQVaeT@VSYTFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JeC'4 °¡©²°¸À¶ ´Â»½¹±¦¶°¨®¤·¸··»¯ª«·ª´¹®¥³µ±®©±·¶±³µº§©¶©©£ª©À£®¯µµ±¯©¢£«¨§£©¢¤ £«ª©»¨¤¡k¢q¤u©§¡xnj~wql}o^c`gkuw~ghuifW\hsnNPjcgrg_dfnlj^``gOKD8FTg^JGQPUUKHSaoteF[QUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:176Xl16Ok[N\K[fb>G1Qd=+/£°¡ª«£½Å¯©·Â¸½½§¶°¥«¤¸³²³±¹ª§¬´¦°µ£¨¸¶µ¨§¬·³®´³£ª´«¡¤§§¬»¦¥¯²·®¥¨®«¬¥¡ §¦¡¥¥§§¨ª£µ¯££££¡¡¡¥¦ªrx
¡vif}sx¡o~|¡ {tvllheczlqbTmcliqXjpoX^i[kk[qnzrhZ^FM?G_MFRVVQQRWTg^MXJRROEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(¦«ªª§©¿Ã®±º¼·À¿ª¥·°©¬¦²µ®¯³¶«©¥±¥µ³µ¶´¦§©³±²¨¯«¡²© ££¢£®µ¤¤¥¶¼¦¬§ªª¬¨¥¡ ¦£¦£¤¤©¢¤¥¦ ¶££ £®©¢
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Å{r¶§ºzl±«°yhkX±®nei¼¼nhznrØ~Sjb¶²ru¡ªWOWaOVNFT[XQPR\W\P@\DQNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦¦©¥²¨°Â½²µÀµ·¿Â«¦³¬¬©§¯³ª¯¶³¨¨¦µ¦§¸¯³²¶ª¥¤§±®®±¦ª§¤±¤¡ ¯¡´º¢ª¨¡®¥¢¡§§ §§§¡¦¢ ¯¢£
¯jjª~gdp¥q®¡¤~x»}k¡v±_j´[¥f`fzfjxj©e¾rg¦v²j|±xtcmm§m[ EhgEu`}h|¤§Y_«ixzj§7J¯[WSmc[KOX_\WV;NOWW/ITSIDEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¢¬§¥£¥ª²·¬´½¾°¶Ä²¸»Â§©°«®©©°®¤°º¯¤¥®³£©¹©³²°£¥ ª¯¬°¦§£¢°¢¦¡´³¡«¢ ¡¨¤ ¡§¤£ «¦¦¡
µµx
©µw³·~¨~k¦zw«gk±[¬{tqx °vwqkkl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¢n[Skh`LK\dX\ZB>°xWXA#MhECDA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gW7J9aU50³¦¦¡®©§³¬©»¶Â°»Â¸·Áª¬®®¦®²©¡¯¼ª¡§´¤«µ¥¦²³§£¢¨ª²¨°¨¥¯¢£¨´®¡©©¨ª ¤§£ £¥£¢ª¦¢ Õ¹p°Â~Æ|Ö»|¤¤{¤¥z¬yV¯{~j¹Z¹w|¦|zªy{±mt¼
oP¯§ÅQ zc`ªbsrm`Sµ´È|c¤3Bv]QjhdP@XgZdaJHMlK[SOYfZCD?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K]O_fT7G:aQ72%¢±¨¨¥´ª¥´¨¤¼·Á°¹À±¶µ¼³µ§±°£°²¦®¶¨¨¹®£¯± ³´° ¤¨ª±©´©¤ª¡«§°¨£¬¢¨¡¥¡¡¡¢¡¢¢§¡¦ §¡²nhµq«o¦r´sr¶{£¢~¡¥~°vÒÑv\®|¤oª¦k|}{±sy³etofRÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjcfXAOk_lhOUGI9=WR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BOT_eP5G=aM620¡¥°¤ª»¦´¥§¶»¼²º¿·¶µºº³¥´´¡±±¢¬°¤¦º®¤±±´¸ª¦¢ª¥²¨ª¤¨£¨ ¥«¯¦¢¥¡¤¦¦¦¡£ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}w}w¯x³aelZ°XKuyf`^wwhk^¯wxl5yÈ®²_ATo^g`EPl_pmVUM.eciSYQ:AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@>V_cN6GC`I988 ¸°´Á¨²¨ª²º¸´¸¿¹·²¶¼µ¤·³´¬¨«§¶«¨±±«®´¤© ¨¡¶§¦ª£¥¡¢¥¦¬®¦ ©¢¢¨¥ ¥¨¤¡ ¢ ¦©}}¥x¡ªp§¡£ª|yo±Z¨ ytØvt§¤|{²^d ~l\«[Zhgªdr{ks]¬Z kneOJC¡\ZLt^bfMZa_rt_JV6JYHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>002144+*05/7,&21($$6671<PeeA&Uf[?2U_bL7FI_C1?8¡¿«´Â®«©¥´°¸±µ¿¹º³±·¼©º´°¤¥§§ª±©°©µ¬«¯¡¡ ¦¤¤º¢£« ¢ ¨¯¯¦¨¦¤§ª§©§ £¤¡¡¡ ¡«®mr´r©v¦s´xs³¤¢¤w¸o{¢kk¶Z
ei¡¢§mr´t²j
ku³af¢oj\`M¡|Rs£mz~oq\¯V<wfTon.\§ObRkeamYb\ap{cTZQ>>mp3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;<010/75,+,426/#00,,289/9N`eD'UdY>/U^aL5FM^81C8¥º¡²À®««§·©¸¯µÀµ¼±¯¹¸ªÀµ©ª ¦£¡ªª¨¶£²¨®ª § ¥«¸£¥£ «µ¯§¬ª¥¤¬¢ª²¤ §«°¡£¢ ¡ª«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxnqn¤t½]w}[ay¼kZV[jz^j`dfbmwoY[YCA@r?CG+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¡¼¢±Ã°ªª¬±§¹¯¶Ä±º²®»°®À±¬¤¢£¡©¤ª²¤µ¦¤ª¦¬¸¢®¡¥ £¯¹±¬£§§¤£¬ ¨«¨¢³¢¥§¢¡¤° ª
µ·xµwmknsnytÁ»½{²¨pt¸|{|¤»¹½uz´£tvut°ufiµtrpw¶^z}hymyb¬pu
Y[§jDdYSf`c]cPgfqmuBNPLD;ZL>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbV8*O]]=+:VV'=;<§ ¿¥³Ã´¬«§¬«©»®°Æ¯µ³®·§´¸©¢¡¥ «¤ª¦µ¨§ £¬¤¾¦¡«¢¢¨¢²µ¶£¤¢¦¥ª¨¤¥¡¨¥¦£©¡£°©§¡j~i¦xs~tzez½¾Àºoq_rjZ^ack`cmvbke^`cqir}gj~rtx}}b[wthP\n|{kXlzrIJo
pMtMEW]f`L[Xgc^O[muiqQODEM;HI<L?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P^L(3=[O'?2>¨¨¡Á£´º¶£¥®§¨µ±¬È¬°³«µ£¾±²§ ¢©¢¬¦®¤¥µ©¥¡§¨¾§©¦ ¥©§°²¿¬§§¢©¨¤« ££¦¬¢ª¢°¦ ±¥¡§££¦¢gm}qw
µª ¢¡z¥
lj||tqxyvv{jstucw}vkp{m`c]pgMYYej_WZpznmfSOFS9OZNRO(+:JB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³ ³¢¿¢¤±²· ª¥²§¥°µªÉ«±¥µ¦À§´¡¤¥£ ª¦¬££·«©¥À«¤¢¢§¨§²Ã¯«ª©ª ¡¢¤¯¦¡¤¨¦¡° ¢¦ ¡£ |ª¨{
¤f¡³¯
vz|vyzogykuyrhszvktdyf`idbdfjYk{pij\SLPD_UF@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¾¬«®²² ª¦±¢¬³°Å°ª¬£³®¼¤´¥¢¡¨¥©¦¤¥³µ°¦®¾ «£¡¨©«¢³È³ª£ª§¨£« ª®©¥£«¡ ¡¥°¤¨¤¨f|e~cylhkz¤«ke~g
eeih{¡kh¢wkj£slnzzXe^
^lv\hswwnxxsmytw{jY^ktd]sij|qlc]QMWJdX@J4=F7?FD71<=?AD<<DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³±ª¥¨®°¦®°½±©§¤¯°£¡§«£¥¨©²®£¢¯¦¶¹¥®£¡ ¤{¥¬¢¨³Ã·¤¡§®££¢©©¡ ª¯ª«£ª¨¦¨¡¬¡¥°¤ª¡¥ª~¾r´rhx¹Ä¸q¢£{¦sª|ËÀÀ»q¢|À½ÂÁ{{ÃÀ}k¥±ooÊzwvzyqzqx
ymwbf_xd_ec^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP/#F[3PY/UAB;/8£¸Ãµ°¯À©¨£¯©°®¦²µ¯ª¥¦¦°««¢ª§¢¬£¥¨¥¤´¤¢¦¬·³§¯¢¥ ¡¦«¤«¿À± ©¯©¢¡¢©£ ¡®¨¬¦£¢§ ¥¥©¤©ªª¬¡¥¡£Îxz¤y_®^§¢ |§t«¯^cªz§
t³c«¡³j®t}¸aY£Ínu{Ú{p~v~e{vvk}n~
~m`qkpg`_yd\qhjdf`RTRW^KOC5AHED8>6;@?A;=7@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1ÂÀ¿µ´°·¤ª¨³«¦²¬¬¤«§°ª §¥¢¯ ¨§£¦¡°¬§®±ª¨¬ ¥¥¨£¤ª°¨ÀƳ¨©±®¢¨ª ®¯§ª©§§¤¡«¬´¦¢ª©£§¥¡°¡§ q
t¨q±|q¬~¡¥w«}r~«vz|~ª¢~«{{VÄzoÁ}mupmeveoawnromdotup`gme_oiinfcWS]aYRSC9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´£££¡¬¯¶®¨°§©ª¨®««§¢¤¢¦«¡¥ ¨¨¢°¬¨§¯¬¨§©£¢¡¦£¯¬£«´ªºÍ±¦®«¢¬¬ ©±©©©«©£¢¬¯±¢¨¬®¥¦ª©©±¢£¥¤j¤uz©tz²p¥q ¤``R¬®v®¦z{f£¤£}©~®^|©U¢z¢{ïÅs¯³³¹qb©¯Âthmomyxwolfeeqpf|ib]W`iXXUMMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799674,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÃÉÖÕÀ¡«¨¡¯¢°´°¯©¬£¨¦ªª«©¤¦ ¤¥§¦£¬¢¬¡¤¯¢ª¤µ°® ©§£¢¨ ¦±¦£§±¬¶È²µª¬©¢¤³ §««£®¬©¢¡ª£³¢ª³±¡ª¨®¯¶££§|ªlu«y|°o¤Ò¸´¸É²__©¤ yxªÉt£§©ÆÆxe¡¥s}¯^pµc±uK£m§Gd|pp{u}{n[ejrqfj_aYdm\^YIMLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/>-5OTQ;<F2,$§¤Áƹ©²¬¥¢²¹¬ª¡¦¨¦ª¬©¦ ¦¥«£®«¦ ¬©¥§¶¢¨ª¶²¬¦ ¥¦¢ ª¦®¡£§©°´Â±³ª¨¤ ¢®¦¡¥¦«¯¨¦¬£·¬¡²¹¯¯§³³³¥§£Nxz£}¤§¸{|y¹~ÌÆÂ¶x¡}v¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu¤{}uzs
q\mnwrjoZd_hncd]KMQTBIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©«¤«¸«¯ ¡¬³³¦ ¥®®ª§¦¦£§¡²®¢©¦² ©¤£¶¢¢¢©´¸¤¢£¡±¦¤¡¢¯®¤¨¡¶²Ã±®©©§¢¢¥¥¤¨®¡®¥¦°¥¼¡··µ²¸°³§¯¡£
ѵ÷y
¦x¢w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{}n©a¢qqbs²¸hx¦~x}ymixixsnt]ddnmfg`J[XX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUVVTQOQ[U%!2AH$)%s¿¿»ºµ¨¤µ¡££©§®ª«¥¢¥ µ¦¢©§°£¬£¥£ª´´¤¤©® ¦£§´¡ª£¶«Ã¯©«©¡¡ ¥¡¦¤¦«§¢¤§¾¬½°¬¢°³¹«´§©±¤§z¨}|°w¤¥m²o¡|¡¨¬
®
© ¡{~«ªx y¯]£|¦§d|tk®]¥kq
]`[ m§{{klb}tmz`geqnhghCZa[=KT2U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI7052.*,ATVVVUTUUUUTTUTSTVVWXVUUQHFIJ#((½©ÆÂ¶Á´¬ ®¸¥¤¤£ ¯¯ª¤¸ £« ¯ª®¡ª©¤®°¬§§¬¢¡¥¡¤¨¦¶©À¯¥©£¦¥£¤¨¬¬£¤ª¨¾¤Ã¬ª¢¡¬²º«®§ ³®¨©v¯~
|º®e°e}¡¦¬°
¥¤¡¡
[lj³`{{±lgn°[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m¨{y~ds~bwt|ajfqmfeeOUd\BT^>I(>9=4!"-%2. *1/045799<ACFHJLNPPRTWZ^`_`ab^_\[XUPNJGC553//@UZXWWWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Â³£¬¦¥¶¨¡ ³³©£ µ ³¨ª«¯®«¯¨¢¯¬©§¢§®¨¢¥£¢¥£©²¨¼¯¥¨} ¨¡¨®§¦¦£¥©» Ƨ¥©¡«´¶®¦»¬¬©£¯¤¸Ãº§¬¯¦¥ª~սªb£¿½}~£×º¸µ
½¾j£o«mz²°Çj«°½¬xw¢¾»t¦yzc}{dfy{`kekjbPb[Sj\@TaBN)=:4/$%2 $(0496677;>ADFGJKMNNQTW]a\__a^`[\YTQMIC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³´±¿¹²½²¢®¦¥³¦¥¾©·±¨¡¿¦¦²±¹¨¯¦§°¬®¦£¡¤ª £§§ ¨¢ ¬ª¹®¨£{¦¨ ©©¡ª§¡£«»©Å£ ¯£«³µ«¯© º§®®suª¤·e pgmow¤u®pq¨£®¤rmmmexomqyiqigqhigpd]cjoY]g~w¦`bqofd¢|vfxhjy~ydlcflbKeXJlY:QeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV]WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³ªº¹²³ª©¡®¤²©½²ÄȾ¶ªÀ«¬£¡§¬º£¤¬¦®©
¦ª¢££ ¤§¨£© ¥¦§¯º«¬{¥§©£±§£¬º°Á§¤³¦¬±²««§¸£·¡¨¥¶¢©ª³£« ±¡¡ ¢ ¤¡«¦¤~gtvtq§m{¡¢riwpwv|zjlddocU`Y@i[HcaOZ+F=+&!740.!%2(*699469;>?ABDFJKKMOPQXTVY^_ac]^UQJED>9=@ASX[\YWXXXXXYXXZZ[\^__`^^^__```_YY`¦©ª¥µ·®®¢°¤ µ±«Æ½Äº¸ª¢¥¦±©£¶§©µ§¨¬¢¨¬¤¡§£¨¨¦¡£¨¡µº¨«| ¥ª ¶£§¬·§¯Á®£·¦¯¯°©©²¸ ®¼¦£¦¶¢¦©£¬¯¡£±¨¯£ £©«¡ª
~fuvysj}¡¢zrszq{jnd_pi`[`ZmcP`dP[:GGD=2==7.*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB:9EMV[^^[Z\[[[\]]__]^_`aacaaa`bbbdb\[c¤¨£°³¬®£©§ ¨µª¦´»¯¬¬¢£z¢±¤¥°©¹§£ª£®£¨ ¡¯ª¨§¨¹¶¤¥y¢©¸¤¯µ¢°¯t¤¾£² xz ª±»u¬¤ª~d\bv ¤~n³£§®ª£esyp¨l¢¨e¥
wkvq|ai[vghr{¦eyxjnykpe`vokkh\febboS\>NNNRG=@TB91/&4:316678<;>@ABFHBFFIKMTTUY\_hfgWQJ<DG;8UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥¨£§¤«¶°²¦ª§«s°¨«§¹ ¤«£§¢
u®¦¨¤º´¨ uw §³µ³¼§¡~§¢z¢®·¦
±©¯£y¬¢§©§
w¥z¦{±z
cympyq
txht t}¡~k
kx{qpgdwnilj[ekjes\^ITLQ@E5.YTU6)!09=>643568;:=>>@DH?IEJKGSXZY[aahfYQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°¦§©¥®Ç¾°¡¦©µ¬§¢ ¾ }«¢ ¨¢£º²§
pu¡¤¬´´Êª®·
°°®©¦|¨r{w§h¤y´¦¨Â«¡q¤}
±¡|¡ |
ms
zr|t
Åf©£k¢
p
hwt{vghupggl^colgmXhG]QL2E46M`c7&3<DGD:64658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@JdY]cfhgbbbbdc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹°ª«¦ ¤¥«£¥ª·£¯¡§¥½¡y«¡
w ¤¢¹®¤bm ¡¡¨~¡§ ® ª®¤ª~¢vk¬uM«x¨§ª«}¡{z§ikg¶}n`dY{dhr}yl]{m_Sp\_ly`Ye}q§ªk£nr¥pjel[n|fZ_bWPovemtqjjo^jomljXiO]XE9A4GC^k4,ICQMN=84859;6@;;>BO>QRLMBJ\]_W^_cv`MD:MOMTb\\ffiibbdbddbab`cdcabikdbddgdbgeach ¹¡ª£¦¬¡¶¼«®¢ ¢¦¡®µ¢¨¡ ¦´u¦
¬¤©¥±§¢in¡ ¢¥£¡ w§¡§©¬¥y}}¢pr{ym¨|¢sv¦f~v¤_z}s¢n·´ºtµ¨dƸ{p·q¤cs¬«`}j³~n}q£ls¤s¤`³q|´ts[²jbotuqhoXklrsf]i^bKD=D5QAYq3=SG_JR=<395::6D;;@IP?TMNQ@E_^[ZW``|dHC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¸« ¤¸µ® ¢££¦±¬¡¡¤«xp }¨ ¢¨¨¥~k{~} w¢ r¢©¦§ª~®}z z£xt} ¦¢d¡|lhn{§}rht«tªg]
vhªj¸f\¨pa^§vuhunm§]¨~x»k~ª[]´g\nqzxki[qjxyc`fXbAPEN7VBRn4KZZ_NZC@151;;7H?:CGT?YRY]>Db^V`Qac}iEB9N[]XdfXfgnmbbe_aa__``ec^bdoq_deekecihgkiªµ§c¬º²°¬¦¨®°¨¬¤¡ £jr{z¤
¨£ ix{£ ¢rhq©£§§|°£¢¸w£³¢¤y{«¢q¡|
¯µ}k¡x~´££«¨|}~tªZ]o{xbL~zz
cyBMY¢jq|muy±³§unr}osj¤]vHec`sq~~ne`lhv|debR^W]TV@YEQgDSW[bX^ID=B8?B:IE8LDWAVQ[VDFb\Z`K`m~qEC<U_bZejVghmobff^aa\]^ahb_edvl^egfkdflihki±T_ §³¹³³©¢«©¡«¤¡¨ w
ny
|r¡s©|l
q x
|£¡£®}µ{¥z© |§hvm~t¡sq|p®}¤¦£o^¨gu£co¥aÓ|zxrsc¢
~£s£uk³`sª²¨¼wm~¾¦©´^n}qos¢r]£gt¦ah¦mÔ|oxzk{wrm©¤g`eypkgfdmuxg`cT[fQQbIWIT_WS[ej\dPECKMJKBJE8P?PMWSXORR`feiRcwywIFEc]dZhiTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh±«T\K~©¯±´°³£
¨ £¤¨ © {p}h}wol}£ª
yvnx¢z¢¤ ³¡¢¶z¬§¤®¥p©|¤¢r£®¤®¢vµµµÉ¡s`©myu¡w ~oLf£pr¤{ytal~ kqd`rti{i³µ´Æ¦s~{j«ultwizurPD}³^jvkyfjgbttqnV^TYhOQhIULYSU]hknVgWMJAJMKHJNAQJPdcimetrs~y{nu{{TPOl^h[kiRjhilglgce_\]\^ibdhk{_]dhcjfomeile¡°§f?¡²«¯¯¶¢¢©¢¢¥¥§¦yjye yui
z¥©z}xp¡y ¥¨gnxl¢d|q¥wpg§{¥zrv¹n¢b}¢mri«ju mn¦`ihu¢}`
tobh e~iuocfnr¢Z_[c¡n]o{srd¥mw¢dg§hsn¡oSo _e§T]TmmskrlphkxskoRXWVfYRmIXO]IXihsjYkVQREV\LXRaThj^wuz|p||r{rvv^QrbgbpgPjhhklngdg_]^]`kcjivu]\cicjjslfkmc¥¦zetm§®¤©°±¦«¥¢¡¢¢{qh|st}|d|§¢¬
}sh¦} ª§¦x~¥²¯¥xz©t¥n¤¢»n}¥¯|¥zq¨ g~o«cw¨l©¢uw«¦k°kv³©knma«ªv¦w}
¥ iv¬g·sw¾¤Y¦«aurtp|tqbj~nhmSV[Uaa\kM]R]I]mmv`[qY[`Zgsenoqcqt`wz~yrys{{vbxdcmsdRlgholrifia_^\bkbmlzo\\bibljwmglnb¦ª¤©ª¨§®¤«¤¥©
tzo~ttrm|{
¥¥¦
vol©«£ u~y®£q
y{r¦q}}zx{~~v z}l
[yxqyphn~qtq
e_wusuoynnm^wixf©~t|jov}vmlgsy{x[kXyhnwrqoxxo]lnigVZ`W\ekcVaU_Q_pxylkvejkjv|qrtsaoubs{xuyux
}{mldxn^Wnghukxjijd\`ZcjelpunZ[bkdllymhloa¹©§¡¢¦¤¤«¢¡¬ ¦©~r|}~
{trp
{}
x~£{§¡
vr
ª¨ «~~¨¦wozo~¨
p}qkp|hm]sqtkvsYrn}~j]jd{
_ix{{vhykaqrw_s§fnwqzoegdzz[\jgnv[{xwunssf\mklbYY^ZXlr\_aZ^]ft~{uotckkj{|r{xtdmtgl{~vz|{zz~o{}s~ysiT\qiluougkhd]aXkhkjqrmW[enlgsyohjm`ª±¢£¡¨£¢~¢¥{|s}v
qor~z¦¡xz¡« ¢¢££ª¡§¦ {x§~±¦²¥k|vwe{
w|yu¡
~vptx¦
}vl|yjrhatp}zwvovt]^ohn_^Z\]ShrVc\\alhu||sopdkji{mxqioplf{rx}zm|zx|}zyNdvksmpzdkebb`[tfpfrrmU]ltmiyzqgikeº¢¡¤ {«
}y{nxr~mk~z|ªr}{ª§ ¢¦ ¦v|¥{|ª¡«~ox
qt`u~
nxut¡
t||rr{{y§w|ok~{nhlmg^zh|{vtvu{w\`p}nu`cZ]^QgmSe[^akivz~qlldkjglslltoxnynv}vq~{{|{`i{juhidjc`i\duhobumlTcqyepzzreimm·¡£{x¦¤yz
|m|xs
}}kh}|~|§p¡¡
|¨x£¡¡£¡¤~x }|¤ ¡§}~utpv`}r|r
hwqx~r|}px{zz¦|
vzer{yzqljf^~sh|uvt|sj^`tvpxdcY_^SkhTdY_ahjvxqfkclhejm~hnqk}wzks}tv~|{}jrnsiahlb_qVtomn`xhmWjtvcu{{rbjny²¥¥ |v¤ ¢x{~q{tv
~xgc}x}y ~o¦¦
v¡¡z~¤y
w~s¢¢¢~|vq}nzd|
pleuo|}x{|{q~w
y¢ww|v_xw}t~xgldaijwstu}q|bcasnusmaZa^[kdRbX`aikvyqcjcmeh|lhthloh|ymqt|~z~|mvttmeljacuViqn`yglbjvpfy|zq`rl
¦¨}xªzy{}|{xtxzs}d^}
t}~}£¡r{§¡ t§sk
zo£|zqykul{}~n
wo}~drj{tx~ux}|
¤y
t}tvn`{uzq}oaocd{bnovsxwstav_oluno\\_^^j^O]Xcahmt{k_jejchwmflhilh|zwos}sz}z}}rzxxnlkh_iqchqoewhnlayhk}{xpawmª ¤¨}w®~w~{}{vxpts{o}|a\~szz¥~|¤n¢¡nfz
p¢|{tsukqnt{tn
qt{|dqly}}tsyo}|
¨{}~
x~qp
chxtup|b^p`kt^qjzxxkspex]mlsmsYZ^`bjZPWXecgqqf]ihgbgqodigejhzwtn
t{u
w
|x
zw{zryjk_phtkromqgole|cnyvqlww¢¢¨¡¦uª t|v
wxrs{
kroznvnq[Y~vu ¡x
m¡i£f
~w~|}nvplmop{
ispwtxfsov|zyvtp{
z£|wxxok]rsqppxZ^p`pj^oi|zpmmjlv`pojrmZXaabnXQSZfgcupb]jmdbfkm`ff_hjuqrpuxux
ww
{{vjqc|b|oqltjholvw_qy{tut~¤§
uzrxtpr
tqulolumw~mnUQ«xvry x{¤
|r
h
g qx{z||kvjnkklzay~vzw|ygtlt{qzpvz{}
}|x}wqjly_womlrsV^obr`_lnypgpffsthqkawe]Vfa`rSPN\fe]yp|_]hrbbefi_hd[gp~pkps}v|
tuy{xs
~{ywfrj`~ookz`jntt_t}yxts
|x °¥vtvspo
spqpkivnn}|musRNßÈÖ|otv w{s
¡~xz~yvgl£cq{{y
{~l{erokkyy\yz}~zyhsks
}k~~n~}z}wxysmgpmjtohjtnS^odpY_krxfkjbfxrppc_x``Vk_^vONL`gc]yqt\\ev`aeed`faXissnkqv|tyuv~s{~r|~vesm|e~oplZlnyysavz{vswwy®
w~}
twpyqnomn~rddxq}mz}jhlc¤ÁÜ®ï¡skuv
¢
o q£
{uxvvn}£
^m|}
v
}}k}dxujnxsXz
z~
~xesj
kvnzutxusqguzbtmobivgR`qglU_ntyarc_h}prn[crabWnZ\wMMLdga^vsm\\dy^`df
`cb^Yjrknkrv}twxw{q}~{t~~shuqymzntpXqzvyqewyiwr§£|pxy
¡{{rwpsjokil|t^`xw{qu{gae|ëÚµÉÃÜslswiq
|{vxrvp¡ai}}q~qwhvriswlZ|
|uatl~}mlx}}orzulqlrx_sin\kv`RdrifS_pvt`o`]hqsjWghciXmV[uLJLeg^brs
i[\ey^^dg{`d_\Ykneojsw~ss~zvzs
|vw{vlvuyxtnxz}Xy
qogywdv
q
¡¢sorw}|xqsnodr~hflww[_y{{qqiagaÕ¶¦xnqw{pj
{i||~
zu{zpuv~a
g}~~m|tkmvtsvukb
~|~p_sq
{|~zpfy|~npzunoklz}bhjiXmvZRirjbQbrxlbe]Yjmsb\g_dl_nT[oNHOge\gnql[\cs`\clwde]]Zllbmjsvqo||txx
}uy|vowy{pm|w^tmi{ssgs|r vv~mv~|v}vqoljat|gbiuzZ_x|zmqedhhW^qr¼Ãuq~rsk{|}|u
vw}quru{e}r}g}{y|i|vfoxxsvslj
xk^rxz}
{~rix
x|}nm{}wuohh}vd\pbWpsSSnsiaNftxf`]\XnosYeb]jm`pOYkQDSgaZknm{oZ[^mcZbowcf\]`ljcmjsvqn~{tuz|
v~xtrxy~oo|qiyz~mm|vkjxtl
n}vjxyozspljd`tzh`eqzZar}ygpzaee±²wJbZ¤ÙÐq{x}
olzy|xxpqt}ziy
¥o~vw
p{}oxh
xr{e}~udpshxpou
{vxyk\q}r
}zrnqsxxnow{ehj}q`YwZXqnNWrsg`Klvta][[Yt}roWg]fjq_oNWhQ?Yf_Zpkgyq[[XkeYcpy_h\^emhfliqwol}upzv
qq{|yyujzko~t}or|{onxg¡gohz~
|ixrklf_aoym_boy\dkzaqv_efÔê¾2:>ry
v~nl
v}
|xnvwo
lu{tfy§}ntvy~{xlri~xm|{wayqdqh~mtqu
~ru}ro[m~tx{|xzqlrytnkwuu\iiwpYW|SZqeL[rre[Jpwo\[ZY]t~uhYb[gfnciLWfQ=^f\]ue_tp[YUodYdqyZh^_gmgjkipw}li~yn{|zu
pnx~z{h{~kt{r{sw}yx}|kl~kh~{~}kuqghc[bgro`altahpybst^cd n\5Y¯µuj}vtwpm
uyx}zsgv~~oq~hvymey¥~n~u}|q{}|i~mk{zjzvr`w~qdrgumt{
|nwy|t~lXovtwuzxsn
r~}~znnjnun]gfsqQ[{N\q\O\rpdVKsxjWYYZaqt`]]`gdhifNYhM@ad[`va\tmXXStaZdorWj^ahkgmlipw|kh||p~~{zwq{oqw{j~{nwyvw}x~~zm
£{uykly}{~prpcf^Yg_pp``gpfjotato[adjv{¾¦£È¸q
s}xtrrp{tutwyyqcwzirvfwvcj|}r~syxzlxyuh{ikysizv}h`w}jkth{iv~z~~p{v{s~bVw}rs|pwxpp~}y~|uviqimrp]hcsnJeuL^oVTYsnbQOsxaRXX]bps[a]hedcjdQZpIDda[cp^]whUWVw^\enhVk^ajgeoohpvzniy}r{~x|v}pvrnw~p|xyzuxzuo~}
zw{gt
z|vgon_d\XeYmra`aqlkhn`siY^dmw©Ú©Ç²qxpu{zutu~wpqmtxul`zyfqogvn[m}x}x{mus
{
muvnhwem{vmjvw|`bxzhtuc~zgt
{tuqz|lYVt}otxksxku}z}x{r}sgtenmt[j_udHnnL[bWWVxmbPStvXPUX^aqo\`cmec^nbT\rGBf_]fh]ZzcRV\u[[gkaVj_`offkqhpuxtkuvx~w{t~oqtqu~
{wx||
x|}~{~svyzvty^}
yt
w{bnl[b[[aVjsc`\gnofqaqfW]ck|Êι¢jmmlqr|~{
zytyuu{jlucuwpg^}zerkjqcXl{sw~{nqq
{y~qqo~ghrbnxqjkqw||y\eywiuxfvgt|rio~xm|]Xq~ls|nnqvhwv|qzt|zrfsanlsXk_w[InkMVU^TU{kaOTurQQTV^bt
h\`ljfcYnaXbpGAh]`f_]U{^OVdpZ[jh]Wg_^rfkgrgprv
xntzx~yus
pp{xvtyz|u~}
~~}|xvyw|mvycso
ztcnjY_[]]Tgse`YdrrfsbkeW[`iw¾®{ ·mbsht|rzz}xxsvo{vejn`usjb^~xyfq~hjkZVox¤
qqxumr
}ytrohzajm`mvkgjkywzw[g}|xer}nteu
ofkztltb\o{jt{{et}mqgu~x}r|lzzzxpflbn~mnVk`wUJjkOROhNY|hbNUvjLPTU_gvf]`qhgaWi][khJEkZbdWYUyZNWnjY]le\Zdb^tfmdqgrotwp
v~w|
}usnsxzyrr
y}v|{~{w|wwziw}|lrq~oflgW][\[Tdpe_XcsuivpeebW\\hporteex~itvssxywtunk{pagkgtnf]_}p{~imwfidUWrp¦||vs|s{ym{{v|}uprlgu]mh_ludgfizo{rYgwugpwubw
|njmzpere`myfrw{~buvikqtzpyxr}f~ywncebn|mkVjbpSKikOLOpG^{faMUtcJNSWajv~e\gsie`VcWbp]LKkXcaUTUsWLYudZ_ka\[cd_wfmbpisnq~ttww~
z}u~
nrt{ztp
zut}
}~{~v{£¥y
lu|{uzn
sz}unjheV][ZZSbne[Xbs{jhmi_bW_Zijkohlahyxktttn
{}vumzhjyj_enhvgeXbwi~{oiogf]UXoh§vz|yuo~oruxwt
vjrvgho\me^ms_gaixh{m[mrsio~ywawxsqoyqbph\owdqs|xbspgjxsrkwvtwc{wvodccn|}klUibfSKmhOGRlEaxfaMSr]IMTYekwze^mpid\V_UnnWKThXf^XMUlTJ\y_[_k]]Zbe`zhlaoounowuz}wzzyz~qtt~zvt
}}ls|
}~{v¬zlrzvuno|sjomddX_ZYZUbjg[Z^ui^ml\aV\\kfrt}jj]kvvgtwqm
{}}yvrlzhixf]dshzwccTepg
wwfhj`WVYhd§n~xzpp|fxny{vq}~ndvsdhh]kb]oo[g_luezh]torkq{}uubt
zwru~taplYqtbqr
|tdrlalzojhywtqf
uzzupdadns~ilTi^]TKscQGWbGbvfaKToWJLXXglvzdenpfcZW]XveTJ\cXhXYIWeQHbxZ]_l[^\ad^ij`otxmonvyr}}uvx}suuxzz}~jt{}~
zz~|sq®{{~frzt||vrol{~lzbpoae]eVYYVcfk`]\s
iYpnZ^WZ\l{cpwvlb[mstguupmx~ywnnteite[gufvvz_]Refjt}bci\TX^bc¥hyt
xmnygwm{zurx|xhevm`fa_j`]tkYe]oobze[w{knnpwxstdr~zvor}rawd[opbpq|sfqd^nvicfyztmnut}sqb^fno}djShXYTMw_QJZYHbtcaITmSILZWilr{bllsbaYZ[av[SKd]XiSWHY`NGiuX^am[[_bb]
hhanxylnjvyn~vttsqwvw|}~~~px}yxy}tsp¢{zyduysxulto~ly|pr^pn`gblT[ZWhcmf\\qeSrn[ZXX`mwdiujj^Zmsqmtstj
|~|wnnldiqc[jrdtvs[WSdarr]bc]SZ`[cerq
tljylooz{zqv~rzzzdfvg^bZag\^whWb^ohawa[{vjirnwssthp~vsjp|lfvW\kmbpszsfo~[`oqb_ip|lks~rqxkp`[elmzagSgUWRPv[RPZRHcsb`GUjPHOZVklk|emoq`[ZXYlpWRPfWWiSTFZ\OHruX_cmcXa`a]jcdmyxkniuy{k}|y}nqowz|t|tx
uspuo¢t{{fxon{ofxpzlsvrk^tnagekR][VgbllZ\qdOon]VXUgjuhbtee]Znunquuzk||wsddkna\nmcsxkZTVbcx}}q
]c_cT[`Yccnp
sjhznervs{lztuoz~u_frc[^WbdYaueU_`mdaq]]~phisqspuukm{
qrfn|oqnS[fjfqtvsblvUbqj[_ne|elu|rrsjm`Ydjjw^fTdUVPTmWQWTPHer_aFWiNHXTVnid|ikwkaW\U[tdSRWhQYfTSHZZPMxw[_eliZb`^^nbfkyunohvvm~{krgt{u}r}
{ss}vn¥swxnz`d|pfzsylmqvgd{lcfghS^^Tg`lo[^nhNim`TVSogtlexde]Yptmrzxsm{v{zkaelm^`ojepy~gZVX`kx|{p_b^gVY`Wdbkq}wkjwl[vqkyiurmo{rXjn_Y]VbcXeqcS^aibblZ`~lfksunmwvkh
zmqfp|lqlcY`hiotsr^ilReqdTbnaybpv{ukpmk_Xaght\eVaVSNXeRO\OOHeo]cGYiMI_KXmd`xhn}d`U^T]t[TR`fN]aTSJ\YPYuv]_fmhXca[^pcgjwqsmhvtzsz~|zntlst
z}|sstxqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z||}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDEB1/////,¤ ¥^*///0,H
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR4555553~©¤¤¤¤ªV:|}z{z|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~~~~~rtx|||{||}}~~~~~~}~~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvtuvwurpqklrpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhgmejfhehgcbbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z^\]^bi`]^ZY_[XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROMPP\W^lWURQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPP`W]rUOOONOPPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKLcT[tVKPMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCGfTUuSJPLIIJHHJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>><ED=?Jc[UpKDFHGFGBDDDFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL=>Udb^gOAEEFDFFDFIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprtusqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;;><Hbmhfl`FC?LCCFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqusurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::7==89UlrkjpkN5JX>@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqsusurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?C@OB<Xnqnlsq[CcU=?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;]m?RYJRkokgrrf_jH;>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CFD><<=@=8:;nvGAb]\inhcqnklf>9;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@ZQ<<=KNHHvvM8WjhknjoqnmlV::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@CsyH<_z{wV;C`strouqno`A?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCE@Hryke}]>?GhxurspmlL>EBBBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqprutwz|{|{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Fot~~}uLBCCOlwx{zq_EEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEhs}|~y
rCDEECd
^FIJLLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{x
mAAWu
WHLMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Um|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIIHHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJV
uIIFB??@???<<<>::<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMKGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIf
fBB=88::9878896479;<:8567789787688;;;=@;999=<>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIi~T:8656766645763468:876565676778:77789;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBf
H676468874578467699766765:::::;898987779:98878589;A=>>BA?AKLOQPQOOORWkqrttuwy{z{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=rz>988;<=>9:;<89;9:;:99;:9===?;;<=:>;9;;<;<<9:<8::;:999<?<=ABDIJMKIKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989:::;?>H~
l<;>BCEEAAAB>@B@@>=>>@???@?@==?B?AA?A?=@@@>?A=><;:;99;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
^>DGIKJIFGGDFHGEB@@CECCABCB?@DHECEDEEAFEFDEFD@B?<@>=?@>???>?>>:;=<`qrttvwzyz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CCFX
WHLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}}~~~~}~OA>=?DLK@BBA98<>;<;>@?A?BBGGJY
PMOMKNKJLJIIHJFDGHHIEEHFFELLMIJGGHIJOMNLLNKGGGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@88<;<=:?A>@@CFIJQ`
qMQOMLLKLJHGEJHDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGHFCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGGB?8?@8:<8=>;=A>?@DHJLUq
_RRPMNMKJGFBGJGLJFKOLKJJMMLOPNHIKLOQPPQOOJIJJLJLFGHGEGIFEEB@BB\orwxyzyyyzz{|~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPVy
|WVRRTROLKJDEFKONOWVQPOQSRMSTOMSLPSUWRSQPLJMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?CCFVNFNPPTX{
gVUkaERQQPI;;QSR`u]UVTVYYRYXRZfPUWZ]RTWQPNRPPPQKKKHHJHEFIHIHIirvyyzyz{{|z{|}|}~}}}}}}~~~SHJIIGGFE??AAEBCGEDELXRMTUVX[|
}al[dU:XXXSQ?@VUY\d`VYbr^]V]ZVEQYZ[Y_TZgRUVXTTVTOOMJLJIILMKOMSosvxyxwzyz{z{|}|~~}~}}}~}~~~~VJJIHGFDDBA?HMIMPKIKPTSSXZZ\\x
g;~ynpXZ[ZRTRVVTZZuYU}a\X]^WIV]][[_YIYXY[]XXYWRQNPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTXXYZ[n
nfYY\YSUTWRQWVcQerXZW_hP`f[[X\gaGOZhg\[\]]WROSPPQVVVVYZnrtwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[SSQORRRUSVTW_ux
}{\PUXTRTRQQLOMKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ[\^TQQPINOWVXZZdqsvvttvxyy{{|}}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKMNKMKHJDFHEC>ScURQQMKRTQMOYQMNQSUUMQSRPOMLHCIHRTUZ\mruvussw{zz{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRVUbs{|}{{
u_]KC?CCCCB?DPBD@C>BHGV@HNMG]iQHGOFDEFHGHBCHGHKGDAAD@OPMSdstuustuz|z{{{|}}|{~}}}~~||}}vt{mh|gnqfiedb[XSQPURsWe[OONLQSQUYSUQQTSOV`klrv{{xytrnstsyx~~kLG??;;>@@??>kQKaEFHIEB?GLMGMQUIBE?><=<==?=?ACC?><=B>JMFUnuuustvxz|{}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljjf`[QRZ\Y^IJPQNKLQRQTVTWRQWVPX[b]agmmlokh`nrjmlqu{z}{xz||xwxdB@@B=:BCAADB\]O{NOONKLMOOQLKLWNHG@B<977599=;;;8989?;BH?\ttuvuvxz|||}||}}~~|~}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbXGFFHBAGIEEFDMRPaWRXQPSSRU[OOQWPMJCF>::6487979:366795<B=essvwwyz{}}||{|}~~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXQLXYZVXXVXY]WWXhsk]Vaskaa_]da_^YUPMONLIHJKIHFCQPSZWTTNQSYS\eUOSTQNLIHC?A9988978857578599Gnrtxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLPRROMMNNNLJFQPUYSTNJOOTST\VRUSROMKIHHF??=:787659967665Wpqtwyz{|}~}}|}}|}}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpofedc\^RTZVWUTWTRXXYYYRUOIGOPOOMRJOPPPNNOTLMIPOSTU2<XMIAQ=caQSQPNPQPNNMQNTRPRMILKOQPRRSTQROLMKLLHCBA=::876;B4566;eprvwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFFAFGGHFJDHJHGEHLHKHFLMPMG/E_R>3@>joaRRQ@FUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6676Dnquwz{{||}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHEFHJNKEGCORC8ENS]fSQSAGUPOQQPMMNMKLKLNOOQMOOMHLLIKKLKHFFED<AA>;@E;<89Tqrty{{{}||{y|zz~~|{utvrvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpknqmimcLOOMQSLTUTWWULLKH=987;?@><=@@B=>EHGDFFIGKJ@FAA@FHEJOHPRa\QPRNSOOPLLOMKMLMON[WKMQOGIHCIJLLJFFFE?BC><BF?B?Adquw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;?A@@>ADIECHHIGIEBB?>=CBAHJEMObeQMNNWKLMKLMMMLKNNSdMJLRIIIEAHJLMNJGIFBAB@?EFEHDKopwzyy{{z{zwtxux||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHKE?B=999:?B?<@BAADEGKFCIIGGHCC?B??@A>DECKNQTLJIMTGIIJLJKLIJLMOPRPKGCKGCBJJLMOMIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqokllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKDGHHGJKIJKDGB=>=:::;@B?=BBBCHFJLJDIIFGGCC;A@B>@@CDCIMPGIKGHKDHIKMHJLHIJLKM]RIHDMGADKKNMPNKMJKFGGJMNQNLcniwvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKDFEGEFFGEGBC@><=9:::@D@>BCDEIFJJLFIIGFFDB;BCC>@DDCEGLNHKNHDHEILNMHILGFGIILNKJHENIBFMLOMOMNNMKHHJORQRNRfgfrosxu{z|lhjnekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJCEFEBCBE@DB>@>:;;=:=>CA>ACEGJFIHKHGGGFEC@=EEB>BCCCEGHIGMPJFFGKNOKFHJFEDEIIHKIFHPKDIMLPMONOONJJIMRUTROWd`amgproryzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCB@BD<BA>A=::=?;>>@B>@BDGKFIFIHFFGECBAAFFCBCBDEEGGHFLQLIOJJLLIGHEFEDCIHHKJGKRMCNOMQOOONOOKKKOUWVUTX`^\iaminhrsbefedihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqrjksMGGFHBB@DE<AA@C<89=>9?<?B@@@DFHEHFFGFEEDCECDIECFEBEGEFGGEJMKHQMJKHHIEFHIFCIIJKMKOSNDQRPQRNOMNPMLNSWVWXVX]Z]d`hbjigk_eefcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqiozMHGHHBBBFE<@BBD<7:>>:>:@B>??CEFDFDDGEDECDEFGJEEIGCGHFHGECFJJGMJLKHJLFIIKHEKKLMOORTOISUTQSPQMNQNMQWZVZYVZ]ZXa```^hec`dfhgjhhjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmsunprsyNIHGIDACHE<@EBE=8:>>=<<AB=?>ABFCEBCIECEEFGGGIFGKHCHHGIGFDHKIGKHMKJKLHLKMKJNLONPRUVOKUVTQTQRLOQPOTYZZ\ZY[^_^`b^\ackb`dghr
hgifjmnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvquMIKHJEBEGE<@GCD@:<>@?>?BB<@>AAFCEDDIEFEGEHHFHGIKIFJHHKHFFLHHHJGLLLLLIMKMMMOLPPQUVWOKVVUSSRQLORRQV[[]^[\^__a`ad]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvovJKLJLGBEDE<@FDDB;??A@@@DA?B?ACHBFEFHFIFFDIIGIHJLHHJJILJFJKHIJJGKKMMJJNLNNNPKOPRUXVMNTVUSRQPLNTSRW[^^_]]`_aaa`bdeachbdijgvlkigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuueqskpqjrvowJMLLMGDDAD<?EEEC=AACBBCEBBDAAEGCGHHGFJGCGIGGJFILHIJMKMLGKIHLKNQKRQLSMKNNOPPOTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^`b^`eaabhmgbihhmxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLMLLLGEA@D>>DEFC@CAEDDFCCEGCCIFCHJJIIKGEKJGHJIIKHJJNKNLILHJMKZfJd\KlSHON_nUks[qpbwcRPbvuhucav`Xnqbdvinzf[lt`ljT`wuhjgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyKNJKJFC?@B?=DEFDCCBEEEFBFFHCDJEEJMMKLLGGMIGIKHKKIKJNLMMLLILLL[sbdp^lmUMNfs]feqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemymkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED@BB?>CFGBFCEDEEDCHHGDEKGGLMNKMMGJNHJKJILKJJKMMNNMMJMMM[roonpplkMPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\_rkqjUuyxpc^kfbgqpjioppsspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryJKGHEEEBBB=@@FGBGDIEEDBFIHHEGKJGMMNKMNGLNILKIJMIKJJKOPONMKNML\hdu]lqWlNPQmUZk^klvaldtTecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ggadjuyknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIDEDCAB<BABGDGFLHECCHKHHFJLLFNKLSRLGLLHNJHHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nnooqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvsHKHIBEEEA@>CDBGCHIMIFCFJLIGFKMLFOJKWRKGKJJNIHJLIKJIHJMMMMIKKKSkbZi^_icrrZ_Yjo_eeUk_c[abQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunvqrutwrHHFIDEDFA@AEEDGBHJLHFDGKLIEFJOLIOIL[QJFHHKMIHJIKKIHIGKKLKFHKKLLLKIKLNT[\TPTLPONOOVQOOQOOQJINPQdqiTYW[[\UYZ]X]\\cfaafbce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusHDEGFFAEC?CHDFGCIKLHFDGKLHDGHPKLOKLWLIEEHIJHIKHLJHFHGJGHIEFLIJKNLIO\W^P\[`^OXYS\\b^MYZMXaRJYaZS`d\aX[ddVVX\YZX\VY\]b_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMACDBDIEGGFKJKHEEJJJGEHHPJMMJMSIHFAHFJIKLILJHFEJGDFGEFJHCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN^\^S[^c^Z]`c`Y_b[`^[TXXY^]cbbaceiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIDBBCFGEGGIKJIIDFKKKFFIJNJNLHLNHHF>GGLIKKJLKIGEIDCCEAFJD@JLJO[cY_^a_RTSW_`\]Y^QY\MV_WKQY[PZ_aa^^ca`bbbcceZQYVU\Y]c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKGCGEBEGHFGHIFGJGHFHKILDDKKNMLLHJJHJG?GFNKKKMKKKIGGCD@DAHIB?IJHO]aZ[d]_TQSX]\\\_ZKW\LR\YIM^PO\_acdccb\dcbdcfXQUTS[XZa^^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKIFFGIGGIFFFILJNEDKJLNJLIKJHIGBHHQMKKOLKKIHGED?ECHHAAGFET]Y^X_Y_[]UXXP]]QKJW^X^[]VZ`RQ__bba`bb`cbaddbXOQQR[S[]]]]___dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHCRKFHHHEFKJMPEGIJKNLLILKIIHDHKQOMMPLMKKHICDAEDHGBAGECWUE\T]SV_XNTUNZ[MJKU`a[_X_^a]OYb]``_bcb]abW__TPNPQXR][[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPDW_IGGHDFMJPPFJIJKNLKKMLJJGEJMQQNNOMNLNHKADACDFDCAEFBMHCLLPOOLFMFGIJHGLLMOPILOPPSPLPTSUZYWYXXdWOSTPPONPUT[XYZ]\`adecgcklpsszy{z~{}{
}KIEEGFGDKM]LGHYMGHJHGNLQQILJKKNNUNOKKLGGKPSSNPONONOHKE`ED_LDfcEM[I_\smOMVmYLCP`UlWgJ]WU^DMQULMTVQSTXWTXUT\UPfZhhdXSkSVVU[\[``abbb`fhfnlhrz|}~}|zr{z{
~z{LIEFFHEEKOSIKF`THJOJIOMRQKLKLORUROOJLNGHMQ[YOPPNOPOIJPQI|YYrsXPmHqnpaVPqqsPBksmqspSo_[nX]V\XUkhU]VcZ`Y[`VUWjtuu_`w`Xa\\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMMBDLLFJLFQVLKOIKRXWQNNNLQTNOQPKLOGMPS[ZTQQOPPPJHZx]TxehYRTQvgtlpbnfjQrOMwmjrpsrqrpop]fzuxqqzq~s}ku}bRg|essoss|}o}yor_``bbZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJPOMMJNV^YULQSNXZLSSRNLPIQRTYWWQTPPPQKHfxlcxrmZKMUypumubnvPdeIfvqmwojfxxiXsRi{mijzz~lxzogoXvvjuup`sh|ilx|o___cbZ^cdfijdgbcdllppstsssyqrxblugry{ssuy~suzn|}yxrnNKStNCBEPPHJKJLQOOOMPZ`ZXKTWPa^RVQYSMPISTUXWWOUPONRJKrouuquqdibWnLqp^FhyWvTLhx}x`y{sna^modRgrunmypwlvttqlm\t~zkmy|lum|kpvux^__b^]_edighfe^abiiijknokqnmjpacfdowxompsy~nqpj{ztromLL[VHGEGRPJLMKLQQQPPQW\YUNVYUfXRRY^TMNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhe|ir{]TKl`vukiu{{m~xk|p]^^b[^bddgeeebZccikkrsrwgmihdg`alagsrkhmmr|kmhk{tmmkmOHJKHIIHRPLNOLKSSSOSRWRVTPWZVVTTTa`QONKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXXQNPUTXXX[[URSW[WXWZOSUWWXR]YW]VTOYRWWWXY_[gr^[[Y\]_cZ_ccdfdccbZccfffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilQIKKLMKJSQMQPOLVVTPTUXUYURZ]VUTWUYXPOLMVTQNUSNOMLQOJIQRKQMKKORTRQQSSIHLNOQRQQQTVRXW\WSSQRUUVSZQOSRWVTYVTYUTRUTTTWXW]Z^a]\ZZ\\`c\]bcdgeedaY`acabhhincad^_c]Zd\bma^ffgmsdihkkeddfhPJKLOOLMTPNSQQMXXUTUWWWZVT\`VWVYUXTQPKOWSPNUPNQNKSPLNUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YRURTWWWY[TOTUXUUZUWYURRXVUW[YZ_]UY^\^]\]`a^[bbchfedbX_`b]`hefda^_]]^ZZ_Z_g`^]]chkagfhfd`bcaPKMLPQLOTOOSQOQ[ZXWXZZXXV]jdVXYZWVTTOKOVTPOTPPPNMQQOQXTRQOMOSVNWRTUUONMQSUUTTRTXVZ]\ZVVQRWXV[[WQTVVVVYTXWTSRXVUZ]Y]_^V^]^`\\`___ZbbdhhedaYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRROSTQPU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROLPSQUZUTPPLPWVRWSSSXMOPRTXUUUSUYX[^][[VROUVV[[WQTWVWXVTXZTSRZWV\^Z__`Ua\aa]`b_\`]cacgide`Yc`a__ee_`c[Z\[\YZYYW\Y\[`^`[^^a`_b\Y`ZQNONVQPTQOUTSPW\\\X^\_W\^jqwyc\[VVXRNOWSNQQPRTRKQTTYZWUORNSXVTSTRRZOQSSV[VVWTVZX]^\\^VSNTUV\\VRTVVXYSTY\TRR]XZ]^\`a`Wb[cb^ac_\bab_dgjdf^[d`a`ace_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUURRWRTP[]^][`\`U\]ijr}slg\UYWQOR[SRQTRTUTKQWV[YZSOSRVVUSOVRSZRTUTX]WXXSX\X^]YZ]UUNVWW^[XQTUYYYUWY[TSV^Y]]`]bc_Y`[eb_dd^^cca]egjdf^^da`abcd_b^XZ_[\[XXXXW[Z\`][[\[XZ[^V^Y]POORZPZTUVVSTT^^`^^b\aU]^bkytl}lZUZUQQS\TUTVTVYWLRZV][\ROUSXWVSPXRSWSVUU[]X[YUZ^X_^Y\YRWRYXY_ZZSTVZYZVXY\VUZ^\^`a_dd]^]]eabfd^^dc`\gehedb_da`a`bb_`^WX^Z\\ZYYWV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]`U]^beeuzhXYZTVSV\XWWVVW]XPU\Y^]]TRXRWVTRTXRSVTXXX]^X][U^_X__X]VQYTYZZaY\UVX[ZZXYYZXV]^_^cbaee\b\`fbdfd__dbb[fchecfaf__aaaa`_^VU]Y[\[Y[YY][[[XXY[YZZ]_]TY]UNSZVS\TVWYWV\`abcad__V[`da_zuohY\ZUWUW[ZY\YXY`WPU^[`a\TUXPUWUSVVRSUVZZ\_^Z_\V__Z]^Y^VSYWYZ]bZ^VW[\[\[[YZYY^_``dbceebdZbfcgfe^ab`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXUXWX]_badada^YYadb`lfh^\][VWXY\\\_[Y[bVTW^]ac\RVXQWVWVVVSVTX\\^``]a]Wa^[^\[^XVXX[[_`\_XY]\]^^\Z\X[_a^`dcdfffbYceehgd^c`_ec]fidei_f^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNRWYVWZY[\YWY^`badada]^Yacb_a`a_\\]XW[[]]__\Z]cXZX]`cd_RXYPWVXYYWVWV\]^`a`_b^Ya]]^Y]]YXVW[\`_]_ZZ^]^^a\[[Z[_a^bdcefefbZdfgigc_c^afeZiibfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxLWW\YW]\\]ZW\]_`bdbba]`Xbcb`cab^\\\XW[]_]`_][`d\\XZcec`R\YOXWY[ZYXZY`]`bb`ac_\b]_][^^YYUX]^_`__\Z^^`bc\\X[]`bacedgeefd\efhifcbb\cg`\iibhife`baca_`_]][Y\YXWXYXW\[ZWWXPXZ]acffrkJYW]ZZ_]\^\Y][^_acbaa]b[bdb`ccb]\[ZWXiq`\`_]\ac_^YYcedaS_ZQXW\]\[Z[[c`cbc`bda`c^`\^^_ZXV[_^]aa_][`abeb_]T\_`cddfdgfefe^efhhgdd`[fg^ahhchhfc`b`cb___]]\Z[YXXXVZV\ZZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{||||||{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{|}}}}|||{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½F(+++*%c~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊ;]}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyyy{xnoooppprrrrrrrwzyyzzz~||||||}}}}}}}}vssssssy}}}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwtvwz{x{xwvx{y{zy}yxxyxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{zzz|}}}}}}|{{{{{||||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy|}~z{}{wwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwwy}||}~|wxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywww|yy{}~|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz{|||~{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy|{{zy|xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqpponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrsrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrsusstvstsssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwwvz|~~|vvwwvuxzxxxxwwwvx}zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxxxyyyxzzzzzz{{{|}~|{{z{|{y{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}||{~}|
~}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~¢
~~~~~~
~~}~~~}}}~~~~~~~~¦¢~~~~}~~~
|||{|}||~~~~~~~~~~¨£~~~~|}||}}~
©¢~
}||~~
«£¡
}}}
¬©«°¥
¨¥ª
~~
¤ ¢¡
}}~~
~~~~© ¦¡
«©¡«
¢ £
~~}|}
~}}}}|
~}~
¡
}
~~}
~
~~
~
~{z
~}}}}~|{|
~}~~~~~~~}~}}}
}|}~~~~}|}}|y|
}}}~~}}}}{zz~~
~~~~~}}}~~}}}}}}|zzz~~}~}}~
|}}~}}~}~}~}}~~}}}|{{{zzzz~~~}~~~~~~~}|~~~~~~
~|~~}~~~}~~~}}}|{{|zzyyy{~~~~~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zzyyy}~~~~~~~~}~~}{|~~
~~}}}~~}}}}}}}}}{zyyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~}~~{||}
}
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}~|{|||z{z}~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~~~|||||}|~~{|{||||}|}|~|}|{{{|y{|{|}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~}~|z|}}~}}~~}}~|{}}}|}|}}}|}~|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||~}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~}|}}~}}|~|}}|}}~~}~|}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~}~~|}}|~~~~}|}}{}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~~~~}|~~~~}}z{{|||~}}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z~y|yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~~|~}~~}~}~~~~~
~}||||{yvyyzywyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy}wxxtuuxrwwtv
~~}}}}||}~~}~~~~}~~~~}~~}~~
~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~~}}}~~~~~}}~~~|~~~~~~|}||{}xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxry
}~~}|~}|~~~~}}|~~~~}|~~|}~}~~~
~}}{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqroxwq{
~~}|~}}~~}~|}~~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~}~~}~~}}~|||~{{~yz{z{~xwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yy{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||xxvxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{~~}y|zzz}||~z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uy~
}y|~{
}}~~~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r~}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyspvxqvtturstvinrotvnulwm{snym}rsvsvmnwlpylu}}~}}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}{~|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}|}~}}~~}~~~
xyrz{pp
x
xyks~y{krz|m{yyt~vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}z}{|}}}}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}|{|~{||}~||~}}~~}}|}~~~~~|}}~{|||{{~
~|{}~{|{~~}{|~}~~}~}}~~}}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|~{||{|||}{{{}|{~|{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}{{{z{|||{{{~{|}{z{~||||}~}{z|z||
|
~~~~~||}}{}}|}zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{}}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}~{
~{}}~}~~~~}}{|{zyzzyz{|yzzz{{|z{{{{}~}}}}||}}|
~|~~
~}~~~~{||}}~|~~}}~{~|{zyzzyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{zzzyzzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÔÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕØØ×××ר×××××Ö×ÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸ºÑÓÓÓÓÓÓÓÓÓÔÔÔÕÇ·¹¹¸¸¸¸¸¸¸¸¸¹°½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A=>@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¢§ÏÓÒÒÒÒÒÒÒÒÒÒÒÔ½ £££££££££££¥SRSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤£¨ÏÓÒÒÒÒÒÒÒÒÒÒÒÕ¾¢¥¥¤¤¤¤¤¤¤¤¤¦WWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;<<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©¬ÏÓÒÒÒÒÒÒÒÓÓÓÓÕÀ¦¨¨©©©©©©©©©«babbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÏÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÔÕÕÕÕÕÕÕÕÔÓÓÓÔÓÒÒÒÒÒÒÒÒÒÒÒÒÒÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÓÔÐÏÎÐÓÐÎÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÖÖÖÖÖÖÖÖÖÖÖ××ÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎЦÅÑÒ¹¾ÔÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@=:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒª¬ÍÁ°±¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐÉ
¥°¦ Ã}~¯°ÑÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<=:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѤ°½ºÔÒÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÐÕ¹ ÒÓÀ ÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÐÑ ¡¬¯¡¹×¯¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÕ§¤£»©Ø£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÒÀ¢ËŦŢÑÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÔ¤ ¸ËÇ¡ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÈƦ½ª©«¤Å´¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKLA>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ Ôʧϧ׹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÔ¯°³ÐÕ˽ÕÒÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÔÖÖÖÓÒÓÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢£££££¤¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¡¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¢¡ ¤£ ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«ª©¯¡¡££ ¡¤¥§¤©«¯¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®¯ªª«¤¡¢¤©§¦©¨£¢¤¡¥¨£ ¡¢©§ ¢¢®¬«ª§¯¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¥§©§©¨£§¦¤¦¢¡¡¡¡ ¦¦£¢¢¢ ¡¡¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]\PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§¬©¤¢ ¢¦¡¦®¦¦ ªª¤¡¤¡ ¡ £¤¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«°©¨ª¨¡ §©°²¯¬£¢¦¡ª²¡¤¢£«¢¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[Z`_Z\V\hdncnjib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«·µ¤²±°¢§¢££¢¨¥¡£¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvyjb[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ³¸²¶´¹ª¤¢ ¤ª¦¦¡¤£¤«¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhukqhiiaYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µµ¼¼¾¼¼¾Æº¸·º½´°¬±»¹k¸²ª¦¦¤¤§¨¤®¤««µµ¯³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÂù½¿ÀÀ½¿Ä½¼º½¾³©¥®Á·az¾À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^kcbnwuvnl[bQV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾°¯¼²^i¶Ãº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhakmfnuqruqg^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ãµ»}ªµ¥^a ¼»± ±¯¬¤¬®´§ª©¨ª¬©¦¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tklndomiqxnyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿¼»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹Á{³Å¢aa¹»¶¬£·°¦¬´µ¬®¥¤£¨¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrxsyff]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÉÅ¿ÃÀËÍÏÊÆÄÃÃÁľ¸¾ÁÃÁº}|¿Õ¦dbr±³´ª§´²®«¸µ³¬©£¡©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh]konxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÎÏÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÅÇÄDztv½×¤ecf®´··À¾¾º½º¼º¼¬¦ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvhjitmxl]d[V`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÎÇÌÉÂÂÇÂËËÈÆÌÊÎÅÆÅÃȪlp²×cc^µÄÁÈÌÆÄÁÄÇÁ¼¾´°°°Á¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuntb]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËɼ¼ÈÇÉÍÈÃÈÉÉÅÅãeiÒ`a^¾ÏÇËÎÄ·¿¿ÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfefcjdbjmno^Y\VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÈÉÃÅÄÀÃÁÂÁÃÂÃÁdcÇ[^cÄÍÅÈÐÁ®½¾¸¹»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbacddjbgc[ZZ\YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶¸´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ÊÒÀ»ÀÁ¼»Å½»ÁÄÄ£idx½£[\kÆÅÀÀÉ¿°Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bchjggiei^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»Áٲ»õºÇ·¶¹»À¦vrw¦hiÆÀ¿»Á¾¹Æ¼ÂÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxqmeefoielhXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÑÆv ̽Ƿ¹¸®·µ¾±
{ÅÀ¿¾½¼¿ÉÂÇȾƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksfbm`\TIKJDJBCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°¸»²½¾»Ä¶µ¸µ·À¾Ä¼ÂÄØr{¶ÉÏÂÀ¸¯µ¾¿ }°Â¿¾½¼ÇÆËÊÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rflintnxcgb\cQKTHEECHC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹½¼²¼¾¼Å¸±¸º½ÇÊÉÂÈÉÒop©ÒÑÌÊĵ»É¯xpe}y
osµÄ¾Á¼À¿·ÊÉÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_c^`aNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´»ÇÒ¹¾¼Ä¾·¼Á¿ÈÏÆÈÊÊÀpr¢ÍËËÍÊÆÅÁpbYOls{WXhr¿ÁÀ¿Ä¨¤ÈÄÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[^__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶»¸®Ü¾¶¾À¾½´¢«¯¿¾£vtw¢ÐÉËÈÁÃæx\MFA_opIEXa}ªÅ¿Á²ÈÃÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxsgp][^]YRFDCMIAE=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»Èl±Í½µ¹À¼¤vjglho|nty¢ÑÆÈÁ¸¿½bLBA:ThdE:NXhÃÀ´rȾ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y}vlu{pni[_`YSPAFHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÀЩr´½¶µ¿hY_^KQZZkor}£Í¾º¹´½´xP@Qe@K\YG9GS\{¼¹ri¬¼µÁµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsuvwnq`_f][TJ=??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹ÂË v¢°³f`eUY_KJMOSls¥Ç»¢£¸°E@pQERQK:JRUlª¡dr¶¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³»·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca[^OHB?=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·¿Å¢yu¢[RAXTGamYSGIc£ªÃÆ£°¥BG{_BPQN9SZRai_·¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc]fX\]RNNA>JBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¸Â°xhNIAkWBOu
pMCV}°»Ñ®zv¡¦FHhwXBXX[<VcRZoh`_¡³¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmtil][jT]\PMHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³¸³wUE@TVJJSub@Y©¹²ÇÏglKFSUId©{QV^\Wr¯§¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²º§hL?`jNIIMgVGYº±¯Òºr[adQEPp©¥TPSS¯§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦££¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vzcwln\QhTPNGPMLBOQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬¨½Á©¦½aB\£}OZIKaK[fms¯µ©¼ÒUOOPn¢°§¢SI\¥¤¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uv}mk{dhUQcMJHGORMJNG<E@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡© «ÅÀÉNBvkQqLPagwp_`k°°®Æº]>`¥¦Pr ¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wx|dyy`bRU`HIJKSTIRPL9?A67<65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¤ÆÆWRMd^n}uyWQkc^jglx´¯´Â¡¡£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´ª²®¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZZMQJOOULSLA7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢ª£yWsurti_rnXY]^dgYb_h¬®«°¨£¢ ¡¥¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸²´¤ ¥¬¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xujwu]lZR`HRUHFUVJBLG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ ¢~o{i`cWM[RUHJOUPGRSJ¬ª©¤¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§ § §§¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmivmhm\X\CWNJGMGCFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£_V_f_ULLD:>>BC>>CSx©©ª¥¢£
«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÄ½Ã¼·³©³ª³µ¯³®ª¯£«§¶±¢°¦¡£¯±°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤{trkktrqhV\QFTHDJPI?EA4FH95;>6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ {``f^NDE<JEH<?:6N~ª³§££¡ ¥«¥xm ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÄÊÉÃÁƾº´ººµ»·°µ²ªº²®»·¿»ºª¸«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkchoxkeZ[FKLEDSMDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡{ri_TLD>K`seB=\®¬ wrqmp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÅÌÑÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÂÅÆÆÊÈοÈÑÌÇÆÇÅÁ¼ÃÁ¿¿¿¶¾³®¿ÀÃÃÇÄÇÄ®¿¸²¸¼Ãº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLDEPIDC@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £hd[SHC@@M§° ²£yqroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÖÓÔÈÌÆÌÍÉÒÍÎÓÍÅÈÊÊÁÆËÇÉÈÆ¿Ã³³ÈÄËËËÏÆÊ¿¾¿½ÁÇÄÌÌÈÉÀÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡`RKHDC@FX¶Ò¼²¯¦ ¤¡}wpkebhqoq{
upnqtp
³Ã¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÕ×ÓרÎÒÊÏÑÌÏÐÍÓпÈÇÊÄÌÌÌÎÏÅÆÇ¶¿Ê¿ÒÍÌÏÆÉÈ¿ÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨|xsvpc`drb]R\IJGAEIJ>;A8=4586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥¢¡YI?ACAIS|²¦ wic`__`_^__]blutppolrquÄÈÆÔÖ×××ÓÖÐÕÔÚÔÔÎÏÕÔÔÑÑÌÑÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ×רÑ×ÒØÙÔÖÌÏÏÊÍÒËÎÐÁÆÃÈÆÎÍÑÑÒÉÌÍÀÊÌÆÓÏÌÎÈÄÊÇÇÈÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£«gC9=>GZ«§}pecb__a__a`_``_`fnppnkorwwÌÁÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØ××ËÈÎÄÉÏÍÊÌÀÊÀÈÊÍÎÐËÐÎÎÌÎÏÈËÐÐËÎÊÂÉÇÉÌËÌÒÓÍÓÑÑÐÐʽȹ°®»¸µª¶°¨¸³¾»±
zvopokadnpaW\ZIFFDMXE;@=33<<87865;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©¤°zKJE?Z¡k^^^adb```a``a^__^\bmroostvvy¤¾ÌÕÑÖÔÓØÖÎÎÔËÎÎÅÎÊÒÒÏÇÎÍÍÔËÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÌÂÈÉÃÌÃÅÈÊÊÏÊÍÌÐÍÓËÆÈÏÌÈÇËÅÆÁÆÊÌÍÐÑÆÐÎÍÍÌÏÅÇÁ¸¹½Ãýù²²¾±»Ãĵª¥¢yqrkmg``phYXhVLFLIPQB;C>;67:8::57==@;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨ ®xrv{|eabb`]^acb`__`aa`_][]grrqrspmry¤ÆÓÏËÐÏÓÔÊÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÎÆÑÒÐÍÌÔÊÇËÎÏÈÇÏÒËÑÏÆºÄ¿ÆÉ½ÂÇÉÎÅÂÈÀÇÍÈÄÌÊËÏÈÄÄÐÈÆÂÆÈÄ¿ÁÇÌÌÌÏÂÊËÈÇËÐÄÅÇ»ÇÃÈÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»£¶|f§¬
}~s`[^^^`^`cdc_\]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈËÉÈÊÈÁÅÌÆÈËÍÉÄÂÊÉÁÂÌÐÅËÈ¿¹Á»ÆÈ¾¿ÆÏËÿûÉÇÈ»ÈÆÅÊÀ½ÂËÆÅľƽ¼ÀÃÅÌÅżÀÊÂÅÇÒÅÀÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÄÊ·¿¼º´©¬¤¥¬£¡¥£ {wrtfiZanlZ\XRDLFBGDLDFS@54334?=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾±¯µk_y¦z
vxurp_[[]``bcdded`[\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÁÉ»·»»ÆÃ¿¼ÁÍÃÆ¾¾µÁ½Ãº½Æ»Âº³¼ÅÄ·¿µ¶¾¿»ÌüµºÈº¿¾ËÄÁÆÂÅÉÆÉÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½³·°²§¨¨¹°¥°ª¬zvwjdg`hocV^YJFJFHJAEBEI@9:648854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÁ¹Å½«¤_etx~{ttc\\]^``bcaadeb]\[\^\^]Z[\^hsqmggnory½ÌÀúÀ¸®°±§ª¬§¸´·´³³´»µ¾²·°µ¯²¼Â¼ÁļÀ»µ²º¾À¸Ç¹´»¶Á¼¸½ÆÁûµ¯²¶º¿´Ä·»´«¸½½À½±º¶°¶º³Å¼¶®»¿µ·´Å¼¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÇËÀÏÊÇÃÆÂ÷ý½¶¹¾Ç¿¬µºµ·¶ytxggebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÐÍÒÏÍÅÇÁÅÀ¿º·É¶ª°[hq
zx~ww|sh]]]]_`_`da^cec__\[^\]^Z\[]_lpnhfkmnr|¤Ç¿¹¸µ°«§£ª§«³ª¬©´®·±³©®¦¬³¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶»Ç¹Â¶ª¨°²À¶¸½°°§²³µ»¼«®µ¦®¶¯»²°ª¹°»®»¸»ÀÀ¾¹Â¿ÇÃÅÀ¼ÆÂÈʸÅÇÆ¿ÇÄÃºÄÆÂ»ÆÉÌ˳¹Â½»³svvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÐÇÍÁÃÆ¿ÄÄÃÃÊÂÉÊ¿À¼Áº³´µÃ®©°\j~{x}
z{wn^]\\]_`__dcadcb`_]Z[ZZ]ZZZZ\enohfgiknq¹°µ®¦¥¨§ ¥¡¥¬®¤¨¢«ª«°¤¦ªµ¶±½¹¯·¯¨®¸´´¼¸´¼¯¸¹µ²¼Á²À®¥©£«±²³¨½ª«¨«´³¦¨¡¤¯©²¦§¨®¦¨·¬±²·ºº¼±¼½¾¾Ä¿µÂÁÇÈ·¿ÀÅ·Äÿ»¿Ä¾ÄÈÌÊ¿¾ÄÀÀ©strji]aocWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁʾ»É¶½Ã¾ºÊ·ÁÃÁ´¶¼¶±¯µ»¨«el{}~xt~|swe_]\\^_`^_ccab`a_]]\ZXY[[YXZ\_fkfdgehjor
©¥«¥ ¢¥¥¡£ª££ ¥¦§¦ ¤¦²°¶·§°¬¨ª´«´º±¶¶®¶º²¯ºº±¶¥ ¤ ¦±§«¨¹ª¤§§¨§² §¦¤¦¬§¤ ¡±¬²´³´°µ¼¶»ÁÀ²º¾ÃÁ²¹¹Ã³Á½¿µ¸¼½¿¼ÂÇÄÃþÀÄ xplbf_ko`UY^HNgOTGEKF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:6676788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÂÆ¸¶ÇÀÌ¿¸É·»Å¸³Ä¸³¿À¬µ¼²¬¥¯³¡£iq
|yusomjjipi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggjmo© ¢£¡£§ ¤¥¢§£ «°±¶£©ªª¬¬¤´¹·°¬³µ®³µ®°ª¤¢²¤¦©¸¢¦¦ ¨¬« ¥£¯©«§ª¬¬±²¸¯¸¹»°¶¼¼º«³³¹³¾´¶²±¶µ¿¶¾À½ÃÁ»»½zsl_e^ddXTW]IW\KPGIJGA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÃÃϾºÇ¸¸¿·²Â´±»¼«¹º±¢©«§m~
xrmomkb^aff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bddeffhikq§¢¢¢¨¥§¢¥ ¡®®®®² ¦¢®«§¢µ±²²¬¨¯³§º³¦¶ ¢£¡£¢ªµª¢£¦¥¦£ ¢«§¤¤¦«³´ªµ°³«²¹´¯ª¯²²³¸³®©¬®²¸±»¶º½¿·³±
yuf^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÂÌÈÆ¿Å¶ÁÀÆÎ·ÀĽ³¹¹³¿¶±¹»¬²´¤©xxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¡ ¡ ¡©¤©«§¯°«£¤¸ª¡ ®¨¶ª§§±¤¸°¤· £ª¦¡¬¸¯¢¡¤¢ ¡ª©¤¢£ªª°®¨´«ª§³°¥«®³±°¯®¯¦¨¨²±´°¼´¹·®£yud^aVYXSRTKM^LOKGGLLE=A><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§¨£ª»À½À¹®´¸ÁÌÇÅÂýŸÈ˲ÁÂÁ¼»µ»¼µ¹¹°¯°©¡¨|wqilrtphhedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbcdfi §¦¤¦§¦ ª¯¦¢¤·¨¡¡¢¨´¢¥¨¥°¥±®¬´¡©¡¢±±¢£¡§§¡¢¤¥¥«¤¥°§¥£««¦©®¯®«¨ª©³¦¦¬¯´±¯¼µ±¯¯ zwrea\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±¸¬¥§·»¼Áź±¹µÄÉÉÀÃÆÅǶÅIJ¿ū··½¶½ººµ²«¬§£t~vncafihfgifjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVUSURU``_`a_aacej¤ ¥¢¦¥¥££¢ª«¥¥±ª ¡¥«¨¢¬©©®¢¢¢£«©° ¢¡£¤¡¢ ¢¤¦£«¥¢¤ª£«®¥®²©¦¥¦¦´¦©¨³µ´¹º¯©¬rqo`[WVVRGQOHZ[ORJTKSLEFID8;;=<8667:9;:976977:;:=<<6;<8>598:88659:<<97?<9678452121..1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±¾ÃȬ±¸Áµ»À»´´ª¬¦r{tiijlgjkmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]]^___bdm£¡©©«¨¬§©¦¤¥¯¥¥¯ª ¯«³ ¥¦£¤¡©ª¡ ¢ ££ £¡¢¨£¢¨« «°¤·¥£¤¢ª¨«¯³·³¾µ²«¯
tsh[YYSUREXLQ[XMTNPLPQINIB=??A?=75799<<987:79:;<=>;7;;:=67:;8976989:6:=99576570141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»ÂȰ¸¿·¼½»³µ¦© ztvwnmhmmmpggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_`d~¢ «ª¦¯¬¨°¥© ¤©¨®¨ª¥¡§ª¥ ¡¤¡¢¥¥§¨¨ ±±¦±¼§£¬µ«®§°µ°¸µÀ±±«~rsbVTUNRJGVPRQLLWMJLNRGMKACFDC>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¥±·ª¥¢±«ª§©²±¤¶Æ´¹º³ÊŹºÁËÐʱ¶¸»½Áñ¯±·´³»³³¢£wkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzu© «¦¦¬¨ ¦£
££¢¤§ ¢¢¦¤¦¨¦¡ ´²§²·¡¢·¬ª¤²²¦µ¼µ¬«±£ysm]NQQLOCMNNPKFNNJJNMQHMJAGKHHC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤¶°¤§¤ª¥ ¨¦¥³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬º½´·À¯©°¦º¯{n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]aosvp¡£¢¤¥¢s~{£
~~tz££ ¡£¤¢´¯¬¯¥¸¦¦±¡°®°»ª©¯ªwscVMROPNCSNLQLBPQHINRMHJJDJLFJJ=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764789::65:87A7x·¡£´¨¦¥¨£¦¥§¦§³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ«Ã§¡¦¦¶¬£~x~eWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUVY[]ilrl
|tNXr_;Wo|s
y{}xqp
}¡ §®©©¨³¢¦¬«¨³¢©£~rn`[NSRWLDTJPLLFNOIELQMKOJILPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©¨£ª°¨§´Á¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©£°¢}su]PLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`moi{tQB@}y`JQnx}
n~xuvxoQ{~xvgw}¤£¨©¥¤°«¡¤¤¦ª¢ª¢¦¨umf^[HQQSMIUMSILKOIHFJNLMTKQPOFIC<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶£§¡¯¡§¨¥§¨°ª¶¼¶··³Á»¶§ºÈ¸¶¨¨µ¶ª²¼¦¨~}xpnXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji\Ut|
{vxsovptz~«
yzhv{prmxxz{vrrwhu
{|© ©¥§¤¡ ¤rha\]JWPRHJXROJLMRJJJLPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().1272198798775:<;7v®£¢´©¯©¥¬°²ª½´²»¸¶º´±·º²ª¬©¨²¯¡vx|vooiXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u|xfw}hyvx}r|w{ok~|s{}tfv|lohs}lyq}qmvqhq~pC
wwz
}{u~£¡¤womebZXXUQJSUTOPNPVKNKNOJQNHOOLFD<;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©±¯±«¼¸¬»¾¹³¬§°§¬¥©¤
yuq|mupjmjXKFGEA@CDILLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX]eprm§ªÀ~uyc|xo|yz}omytxjjq~Inhw~licly
ksl|nr{imps{}~{vots
yyp|ojnonXVXTRQYORTTSXUMNHNKMNKCHNGE?:89;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥°£¬ª¨µ¯®¬´¿«¼Â¿¦¢¤¡¡sz
totkqldljYNEFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\`§bitzepmzvtlts|jkMy
g1vsl~~tfet~
filukq|hqq|n|s}|qpnvmwyujyywkkoheXQZWYY[MPUVYXNIHEJJHGB@FDCG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,5775478iO8;5n¤¨®²§»¯«²°Â±»ÃÇyqtzprpoodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ r|xl}mr
zyr¡txsu5q¨¡¡¢vp||sggbjnrmpuioXupwlz}mrnpzsvnbv~
ux~}{rppl`[\^\YXa_RN[ZXWLHJFJG>BABG>CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µª®±®Á²»ÁÆ}n
ul{txxlwnwci^IPG>@7449;;;=>@BEHLLLLNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|~
~v¢y~
aªzw~sz]drtz|wmhjbyoznwtzptywkni]w||
}q}uw{|wpsteg_[[^T\g^WQUX[UGJJDLG?F@DC>AA=:97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡}}p~zgvkRWL@E211367688:<>AEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|r|z}~v¡¥¬©H®¯¯¨tm|}hghxn
qGlwryvhmk_w}
zzuv|xmow}ttrl[]][ccXgf\UOPVYPDLKFNICFCCA@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¡¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¡¥»±§»Çè¡¥|qv
ihotq
w{v
}nvuf¡ª¢zzyogkx~z~rjd^ZZ]j]af`YOKNWRQHPJDNGCJDB@DDA<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯°¡xw|mpj]BA4--//./02234778;=?BDHJNQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¡
lpuwqm
r¡¥µ©¢}kjk|sa]c^Zfk\lk^WKGOSQNMLFIPCDMFACEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212457;?CENPRTPQQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¥¢¡¢¨¨« ¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢xz~¡{w«³}¤¢¦¶°¨lsr||qh`\`^bgc`hg[REJKPOIJLFFMCHLFFCBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}{ªªBD}x|
w_bP460-1/,.00//..0015>AAMQRSPRSURNSLEE@<>=GG@A@8662<9;FHGIJNOQYmw£§ª´½¸¤®¬¬§¨´«°¶²²»±³¾³Ã¬»É˷ÿ¸¥£°²¬ª£
¦¦ £¦¢ª¨¤
¤¡ ª¡¤©±£§·» £°££¤¢«¯³µ¢¤ªyz~
~g`h\eb]dc_ff_ZOCIHTOFHLFJGEFHAKFCFFA:87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1.-3?DAMUQRSUUWUN[PGGE<>>FHCD@8;<5C;=FKIGHROPW ®£³ª±ÁÇê³Å¶¬³¿³¸¾¶¿´Á¶»»¤¸Æ¨¶Éǵ¾¹´¨£´±±¨¯«¥v¤¡«±³ª¨®¶»²º¬¯µ¢±¬±µ¼·µ®µ §§£¨©°²º¸¸§¶©¥xuYadVeaac`af_[TJDELUQHIJDIGEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQcdWyuq}
v
{¿»£¼´y
zxn]V@EM<6:46AB764//6CHCQ[OQUWU\VO^UIKJA@>GKFED;>@7D7?BJJEFWTP^¥®£±´Ã¶¸ÁÌɶ»Ä½³³À··Áµ¿°·t±³¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¡¢¥°®¦«§¤ ¬³º¢©²º´»¾Ì¿Å޽³Â·º¸¿·º·¹¬¬°¦±ª¾°½»Â¬º¨®«}|jWbaWjejeW[dYVTIGGLQGCHIAHD>?BBK@@MC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYUZvjpnzsyb¸¡£{z||}xzueO\dGEL:Qca[^SF?;HPDZcQQYXZgYT``MSPEA?IJHEFA@C<E6B>HGJLSZT]¯¸µº¹É¿º½ÉÌ»¼Á¼·µ»»·½´º±Æau²¥±ª½ª¥¨«ª£¢²µ¡«¨®¥§¦¥£¢¦±´§²²½¶Á½ÓÉÊÓÆÂÅËÁÊÃÀ¾½¿»¼·´°¹·¶ÃºÅ½ÃȰ¹ª¢«¥¨¶q_bb]Wa_hfRXaVRUIEENKA>GD=KB=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]gllq
slrrsÕÀµ }x{{yt}zkepuY]\Peeb`ed][XW\MdmURmm_n_XgeUYUKDAKKHFIHHGBI9D?HKTTV\Z[¹À¹½·ÆÀº¸Ê˺·º¶¸¹²·µ´®¶¶du¨p^¡ ¢¤ª¥ ¨¥¤¬¥ª°¬·°½¹ÔÑÏ×ÏÉÌÑÌÏÎÊÆÀ¾ÂʽÁ¼ÁÀÄÄÅÊ¿È䤻°´¯«¹¼yl]`\Y^aYccQ\`SPKCBEGE<@E>BHB@D=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi_polouu³¬¡¡
~|s{
{ts{xkmu{hreilifjih`fihlZnt¤¼g[oh]ZZTHKNOJKQKTQHLAJGKP_^bfia·Ç°¹³»¾µ±Äǵ°¹°°»«²±§ª·¬¶§§O ¦¥¡¦¬¯¨¯§³´ÔÔÔÖÒËÏÔÕÎÓÏÍÅÂÉпÊÉÊÉÒÇÌÍÂÐÒ¸°Ã¼Ä¹¥¶ºÄ¢nc\\^XaXYeZQ]WOOBBHEBI;AD>AG??B7;C>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeWshqoyy ª¦}
|p{r~qxukqx~q{mxslipmcinpxiw|~Ë¿Âß§mcxnc[a`JPRUNY^P^]MPNTQUT\nnvr¸¬´§°¶«¬¼À±«µ¦¤¸¦«®¡«´£±®§«¬¤§¡¬ÏÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÍÒÓÓ×ÍÒÑÅÒÖÅÀÎÇÇè¾·Ðzne]b]W`S][OPTPNH>AFABE<@B>ED>@?:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMO[u
wlwp}~¡¡
y
{r~yu
ovrks|{w|swqksrhoqzyr{¾Ë~²vrvhaj]CZZ[WfdXekSX]]`d^cx{~ª¤¤¡ ¡¨¦ª°¸ª¥´£¡¡£¢§±¦k¢
}
§°¡ ¡¤¤¨ÈÎÏÈÂËÑÔÑÔÓÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÄÃËsob`_XTZS\PJGIIJ@;:;EBD<BD>HB?BC;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznxpmuvx~t
|ymvtn}vuy{¶<AÆ¥~|ieVICfcechjdox[_fiknin £¤¦²¤¤³ ¡¥ © ¢±~
z~©£}ª³§§½Ãƹ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÚÚÒÕ¿ËÌ´xvnd]YRVQZVFGJJEE=:79@AB:HD@ECADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTlnopaqqs|~
|x
zyqz{uz
zp|oozq|qnzuw}|u|°tY©Â¶pnb=^hrpqpnxweioruxr{ ª ¡¥¬}
~my{®ª§®µ½©½ÆËÈÉÌËÏÈÃÑÊÔÖÙר×ÔÛ×ÓÙÛÖÏÛÚÑÖÉÔËy{hh[YPRT^HCEII>A>=7:=?;>H=?AAADA>>:86DB755479.566435532323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqz~~||~wyn{{uz vutu}toot|
zv{·Æ¥ÂÉ·wpeNfczw¢xyw{|vn¦ £«
z|¡¼¡©¦¥®¨µ¾ÀÀ¹ÇÉÍÎÅÍÊÑÖÖÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÜÆzyghe`TWVUMKDND;<=<9:<>9=@6=?@<?><9867CA6455=80665547745613854564567HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz|~~|
{~
z{u}tn|}~t~|~x}ynt
~
|~z©Ã ¼£}}s~s¦
{hGq¡¤
¡~¦¥¸¢§¡£®¶ºµ«¿ÆÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Ü·xxwkidW`[TPOHDLB==>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqry{z|{{|{~uyszsm~
}w
¡n¨
z |~£¢¤®
Wr«\¢££¡
¤³¡¡§±¸¬¥¼ÂÇÍÇÆÏÌÏÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚo|tgg\]XSWXC@ID>>>:49:;7:;:3;;?=>7;9:19G=:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxmb~omwxyz||{wsp
zuvvt
}¦£¥¢¨r²§
¢ ¡©¯n·
ÄȲ¡¥²d¤ÍÇ
ª¤£¥©¡£³´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎrhc_]^NJTZBAGD;A=837;<:8=649:<:82?9:29I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:>:EMFHRWSRBcFu}|m~xz~z~vv|lny|xx|}£³§£ª²¡§¥¤®¢¸³¡ ¥¯£¤§§¯¤ À¤É¸«¢¦²
¨¢
t³¥¡} ¡±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ§ÎÍÓÒÐÖØÓÐØ»ryv\`U_WPHINEBCE5>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89566=:JFDGN[\YIf`;Hzzn
z|x
~px|}|orz}{x§»¨²½¯¥³³¨£¢°¬´£¸¤¤©·¦¤£©©£¯°ª»»É¡i¶¸«°£«¾£^ª²|}´« ¡¡ ¥¯¨¡¥³¸«ÂÈĵº½»ÅÇÈÂÑ¡ÆÉÍÍÄ×ÖÑËÓ¡pzh]YS^ROFD><CAB8?874>F<<6<35345454B3::BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeGb`bpI@~s}um}}|pww{ªÂÀ¯½Æ»³´Á¼´«³¶¨²®®¼ª»¤¨¹¸«¦¦¢¡££¨¯²±«¤¢¥¥£¹®¨À»¬²¹¥¤§}¬½°z§±¬ £¬ ¡§§¤¢¤°²¦ÁÇï°º¶ÅľͧÇÃÇüÕÑÍÄÊtsb\Y_[MJBL@EG?A?B;:4>A<=5=6>333241A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\fF`igZ][{uo~|q~zz§´ÆÉ¿ÂÌÁùǼº¯«¹»²¶º²À®¥À¤«¯»¼ª«¢¢§ª®´°ªª¡°´§¢ººµÁ»«©²¥¤¨
ªÃĤz¡¦ ®ª¡ ² ¡¤ ¦¤¦§¤¯¥ÀÄµÉþ¶Î²Ä¾Ä¼³ÑÊȵtym\X\iSLHDLKKJAA=CD<5AD;:3=8B332263A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBfZMe\fTcjyr|xy¡¨º¾ÈÈÊÁÒÉÊÂ̼Á³»¾§º¿½¼Ä·¬Á©¬²»½ª°©£¥£¬³¶µ ¯¥¢£´¼©¨¼Á£¶¶¯«°«¬ª¦¥¥uy
££ª¥|£ ¢µ¦¥¤£¥¦¥£©¨¢²¬¨¼Àᥳ·ÌÀ¹®Ä³»¾Â¸¬ÂÃÂÀmyaXW\[KKMJFDDIBBACK:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddVw
¡®¦£Â½ÈÃÇÅÓÍÎÍË»Á·¯º½´¼Ê¼ÃÁµ¶¼³¿¹¼®¯¨ ¨§¶©±·¢§¡«··©¥¯¾Ã±½¹³§ª´³®¥¬¨ ±Å§|}©¥¡£¢Z¥e£²¥¢¬«§¦¡¤©¦¶«©º¼Äµ¥´µËÁ¸©¶¬²º¸®¨¸º½¸lnZWTUNFJSNK?BHEDHGG95FM;>7>AJ.32025B55PVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBqFiIRebLF¥¡©¦¢¯¾®¡Æ½ÅÄÆÆÎÎÎÒʾ»µ±º»¼¾Î¶Ä½·¹·²²µ³¸³¬¦««¸ª¨§¯°£®¤§¤¤´À°ª¬´¾Â¹À¹³§¸´¸²®¥¯®¥¡tÁ~
±¦£©¡ `J¥T°¯¥¯¯¬¦¡¦ §¢´©ª³¼¼»«°²ÇÀ¸¥««±±£¡²²´¤qnf\ZNPKDPPPQ;GJIGHBC>9KU?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=QEWRsbWFHª ¢¨¯§
£¤µÈ´©ÆºÃÃÇÊÈÈÌÍÆ¾º³®¹¸ÀÁͶȺÁ¹¶º±¯®²´§£ª³´ª¨¦¬¤®¥¤¨¬º¿¨«¶·¿Á¿¾¸²²Ã±¹½¬£®µ¬¹¦¦v¿
®¡¡©¨ ª¢§nv¢¢²£«¨ª«®¥¤¥©¢±¦©«º¶¾³²¾¹¶ £§¨¥§¬©©cea_RKMGHNIUL=MDNJKBCD<QU=AABDO18=77?B75UXN?HNQYSPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..R`MUHe^HE«¡»¯ª«¢¤££¶Æ½´ÁºÂÂÇÈÅÂÍȽ¹²¯¹´ÀÂʵƱÁ¼´º«¨¬°£¢ª´º¦©¦«ª¨¯§£ªª¾¼§¬¼³·½Æ¼·µ¸À±½À³©µ·«¾¥£¢¼ ·©¥£¡¨¥³¡¦¨ª¥¢¢ ´¯¥¥°««¬¤£© ©¤¢¡´µ»µ¨µ²³¢¥ª¡wa\_]JHFGMQIMEFGBRLIAEG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCpbGE§¤Ã¬¤©ª§¦¡«¶Ä»¾·ÁÂÀÇľÍÇ»½¹²¯¸³¿Ãȵ¿¯¼¶¹·¦£ª¬ ªªÄ¡¤¨«¦«¯¬¢©¨¿¸¦½°·¶Ç¶µ¹¸¿±¿Á¶´³´¯¾££ ¡¢¥££¾¥©©¬¡¦½¢£¢©«¡
¤ µ¬¦²§°¨ª ¡¥¤¬±¶²ª¥ª¬ ©hcYa]NIGJNKHEDIA=PIA<GIH[ROK=HOU4BF9>HG5Cb[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxecWL¢£Å¬¡¬® £¥ §©«¶°¢ª²µÄýÀ¶¿Â»È¾Êȶ¸µ´°³³·Áƶ¾°¸´¹µ¦¬ª«¥£Á¥ © ¤©¯¢¦§½¶¦±¼·¶µÃ²³·¹¾²ÃÀ·¸®³µµ£¤ ¢©¨«£Ã©¬¦ ½¢¥««¬¦¡W¥¡ ¸ª§¶£³¡ ¯¢¤¦®³«©¢¢¦¥¤beZc`LHJJNFEAFK>=JB99JKN]QQI=LV\9FI=DMI8Hc\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\KN¡Ã§¥¢³ ²§ª¤ ¤©¬»°¨¬µ±ÇÄÁ³ÂüÆÃ¼Äʽ¯±¶°´¯¿Åµ¹±°¹µ¬¨°©©¥¡§Â¬¬±ª¢®°©¤§½·¦·º¼®¶Ã³³Â¿²Æ³º·¬´¶ª¢¦£¬¢¨«°¯¯¼²¦ ©©¢¤¸ ¡¤¯¯¬¥§¡¢§´¦§´£¯®¡¡¦¬°¥§¢¡
bf[geJILJRAC@IG;;G?99NMU^RSJ>O^]=HPBLLI9Nd]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤ 褪²¡£µ©²«¦¢¤²¬®©»²¬°µ´Æ¿ÄĵÀĽÉĵÀȵ«µ¨°¸¬ÀÄ´·®¬¶¹¥«±«ª¦»´¨°®´²§ªº³§º³·²¸Àª·²Â¼´Å§¾®·µª¨¬¡¦¥¢£¥¯¸®²µ¶ ¨¤¤ ·¢¥¦®²²¦ª¦¡¨ ¡¯²¢¦®¥¬¥
©©ª¢§ ydi]kjMPMNT=CANC::I@77QO]^RVQAW`\BJSHVKH:Ue]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05JpiVCWFyfC;¤¤¡¦¿¦¨¯¯ ©µª¹¯ª£ª´·±°¹·¯¶¸¸Å½Ãǽ¼ÃÁÆÀ¸ÁÆÁºª¶¤»Áø¸ª±»¢°²¥§ª¹© §°ª °´²ª©¶µ¬¼¬²²¹·¬¹°Âº½¾¦Ã«°·¯©««¦«¢¢ ¡±¯³«±º© ¦¡·©¥£¢¯±´«²¨« ¥¢£³°¥¡©¢©¨§£~
kimalnWPQZTACET@;;IA7:XPd^PVWDY^]MLRN^KJ>Zd^NHPN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1647gY`F(?8l}h[V;{cC=§¢©½¡ª°ª£±¸©¥´²«¡µ½¯³¸¼º½¶¶À¿ÉĹÄÁÀÀ¸Ä½Á·¯µ¨«·²¼¿¿µ©®±¶«¨§¨§»¤³«¢±°³¬©¶´µ½¯±µ¬°µ±ÀºÄ¶«¼¯±¸«ª£±¦¤ª ¤³ª³ª«³§ ¦¤´®§¢®±§³²©¤¨¤¡¨µ©¡¬
¦¥£
{flrgpr_FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b`PKMNXWXPJVVWM=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aU150=`V^8)C3YU\gK5zfL@¤ ¤¬·¤¬©¥®®¶©¯³¹¦¦°·Å·±·¾ÀÁµ´ºÅ¾ÌŹ¿º¿¹Ä¸Á¹²µ¬ªº¶»¹¾µª±¶§«ª«¬««½¬®±£ª°³®®¶±¹·©®±¨µ¯³»¼É²ªµ´±´¯®§¡³ ¨ ¥²£ ¦¯¡¤¢¥§²©¢§²¬ª¶¥¯±µ¯¤§¬¸£¡¬¥¢¢ z{knxnv{`EajYIHY[={JGE6AbTi[M\aJ[]ZRRRb`LKE_``PLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C^Q\.*B/JGP[H3cYUKD °¨²©¥£®®µ©·´¸£«´·É»´»»¿¾´´·ÃÀÌȻü¶¾¾À¸¿¼±½®§º¹·¶Ã·«²¹¦®«§£±ª¯»¤²²§§¢²³°±±µ±¸³©®«±§¸¯µ´ÃŶ©´µ«°ª§£¶§² ¤²§ ª©£¥¥¥·§¢²´¬§±§°µ¬¥ ¬¨©¸¢¦¡¨¤ v{
nqwv|~\Kel\KNc\?b{GI8GgWe[L^bMXYWTXTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'FaLV%-B.=EMQ<3rkJDC¥®¥®«§¤°²³ª·°¶«µ¹É¹®Á¼Â·³±µÂÃÎÅ¿Á½´½¿¿º¿¼³Ä¨©¹°¶¶À½¯«³³ §°¥¦°¥²¶«²°¬©¨´¹¬´²µ´¬©¬¨¬©¹®±±Ç¿¸¤¹¯©¦¨°¦¤¤®£©°¢£¢£¬¤ ¢ª¦¦¹¥¬µµ¤©«©¬¯¶¯££¨ª ¤´¢
§ w~
||}rtr~}}[Rdo^NZf]FD[H;NmXa[M`bNVWVWTYg^QRLcZ[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HdHJ+:I?3BIS,>k=HHªª¢ª°¤¨¤³´±´µ±±¡«¼Ëº®À»Ç±´´ÂÂÑÅžÀ²¾Á¼¿·¼Ä§¬·¬³¸¼À°«² ¤§©¨¤°£«±ª¯¬°®¯®«³º§¶°²©²©«¥¥¤¯º¬ª±Â¹µ«¹¨¨¨¬ª¨±¥ª¤¢®ª¨¢¢¬¤¬¢§©¢¦£¬·±² ©¢ «®°¬§¨©¤ §¡ ¤~|w
tsrvl_Y`ncQsq\K;|F>WuX`ZOc\NUVUWP\b^SONhXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<]J0.IgDF8<B05EKX1@[?MF§¢ª²©©°¶¬¸µ®ª¥«ª½É»°¾·Â¯°¬³ÄÃÎÎþ¿´ÀÂĺÁ´ÉĬ¯·²¸¿¾³®«¥§ª°©§¨±¥´®«°®±°³¬³º¤¸³¬¬®§«¢±¸«ªº·¥µµ£©§¬¬ª¡©§¦±²£¦¥¡¡¬ª¡ ¦¤¢«¤£§±·£¥¢©ª®©¢¥¤¤
¤¢|zt~tw¤yk^`ngWedN@gLDbyWbXReUMVUUTO\]aUKMiWVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D@HHD¯¤£ª°«©µ«¶±«¤«ª©¼ÀÀ¸¹³»µ¥²¯ÄÉËÑ¿Á»¹À¿Â¹ÁºÁÄ®²µ±³»À¾³±®¬««¨¶ª¥°«¹°©±±¯²¶ª¶µ§´¶¬¬¤©ª£µ³¨¨¤´´ µ¡©¨«©«§ ««¨¹¶©ª©©¢© ©¡ ¤¢¦£ª¦µ®¨¦ª¢£¥§§ª¢¤£~
£txu{xoqggqx\`sjO]VHmxUdVRcPMUTUPOX[bUHPiTVTGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Qc02?f=NX?C,>LT_/Jk6PE;° ¥««¥®³´¯ª¥¯©©º¾»À±®¸®¡µ¯ÉÇÈÑÀ¾½»¼Â½ºÃÁ¿¿®²²±µ½¼Â±²³ª³¨¤µ©¥³³¹°£¶²¯²¹ª¸®ª®µ««ª¬£ ¶¨¡¯³¡´ª¨§ª¤«¡¢¬¨½¯¬®¡§¨«¯¡¢¡¨§¨ª°©£¬¢¡¢££§¨¥}
¤
xt}uxy{tszi¤ui^elug}RXp^JxsSdSQ^MMRYfNLVYeYFSiRR?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Lh:48_=ad?F1CP[[+HO:VB4± ¤¦«£¦¤¬¦´³±ª¤°§ª¸¾À¼¯¦¸ª§®°ÉÆÈÑý¿¾¹¾¿¼É¼Á¸°°´±º»¹Á³´»¬¸¬¢´¦§¬²¶¹³§¦»µµ¼¯¼¦¬µ«©¯¤ ¥¬ª§ª³¤³¨ª§©¤©£©¨©½¬´¯®©¤ ®²£¤¤¥¤¨«¥ª¡¡¥©©
~}
¢~qzy~|iw|zuqq}hy
d`hcr
zmgy]^VBWzmTaORXKLNqt]HZ[gYEUfPD>KNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=;EZ?*±©¥¤¡«¤·²²¥©°§¬¸Á½µ¯¢¹¨¨°ÃÉÉÌÁ¶½¿µ·¿ºÈ¶Ãµ´³µ±½¸º¾·¹µ¿¡³¦ª«°µ¸´ª»¼¨²¿²¹ ¯³µª¬®°£¥¨©¢¥±¦¯ ª©¨¢ª¤© ¼¨®°®¡«£¤®¦¡££ª¢¤¤¢¦¬z|~£|yk}vyxb{zqpqsxitkgdhaosmbjp`pA\xkV^NQQJJMSYVM]^mWDX`O^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*K>*49&'.34.0+/4&,:$40BhY13S=e_DL6KWeO)<3P[=#¬§¤¢¨¤¸¯®¢¯¯¨ª¸Â¹²¹¯«¨´ºÇÊÈ¿·Á¾¯´¾·Ä¶Ã±¯º²²Àµ»¾¸©¹·½«¤´§¨ª°®¹±ªº½¤¯¿´´ ®·µ¦§§°³ ¤¦§¡¥§¨ ©®§¡§£© °¸¤±¯¡¬ ¬¤¦§©£©¦¨¡ª}|{¡y
}{so}qst`yxiopqojsd{lifdaf`[sjrMMiXZMPLJHPRQIN\_nSDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZhH*?0ZY5(¥ ¡¤¡·«°¤´³¨¨¹Äµ±® ·¬®°µÆÈÀ·¿Á¹°´½·¿»¿¯«½°´¿±½Ãº©»º·§¨µ¨§«°³±§¼·¤«»¶¯±·°©¥§¯²¡¤ £¤¡¯¦¡¢§¯¢ ¢¤¥¢·°¡¦±«¬¢®ª¥©¥¦ª¤¢©¡z~yy
~zzprwnot_xwdllljinfsikfi]ds`[kuiZI}^[XOOJHHRUF29_^lPDXVYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42*;+139cl84GAf[HTDU]hE.<2bU,2£¡ª¥¡¢ ·ª® º¸¥«½Å²¯®£µ¯¬¯µÄļ³¿º·°³¹¸º¸»®À³´¸¯¿Á¸¬½ºµ¦¢³ª§ª³«²¢À¶¥§´µ©²»©§¦©¯¬¢§£¦¢²¤¤¨©¢ ¥ ¤¸¨¤§®§¥ §©¢¡ ¡«¡£¨¤y|
}y
{w~{ltrllsaxthhjgfo
ghicfij`ibjg[e{c`SsT[[SLIGIOS@!*i^jLCVU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,>0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB379eO'2££¤§£µ¦ªº·¦«ÃÁ¶¯¬£µ®§¯¯·ÀÀ¼²Á¶±®²¶¶¸·µ¬©½³¯²±½¿¸®»»±¥¶«¥¥´©«® «¨¥¯³ª¬µ»¨ª«±¥ª¦¤¦¢¤©¡¢ §µ¦¯ª®¡¡¡ ¦¡ ¥¬¢© y
w|
{r}}fxokjlguskcgedubeffejjdkqZ^Y]mdaNhWZ`VJGIKMRX>9`liGBTS\[IIGFA.<?9A89RG@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLYJVbfA:3AfH%5£¬¡ ¥´±¢±½¶ °Æ»¹±±¤·¬ª®©¹½»»À²¯®¶¯³·²¦ª¹±¯´¶º¶°¸½¦µª °¥«®¤Â ²¤®±¯·µ¯®¢¨ª¥¨¥¥£¨ ¬¯¥¹§¢¡£¤ ¨ª§¨§|t
|ofynhkjgqrk\hccsaehjnlgkjgm\lluqaTbhdeZIFLMOXQQVaeT@VSYUFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1JeC'4 °¡©²°¸Àµ³Â»½¹±¦¶¯¨®¥·¸··¬»¯ª«·ª´¸¤±µ±®©±·¶±³µº§¨¶©©£ª©À¤®°¶µ±°ª¢¤¬¨§£©¢¤ £ª©©»¦¤ ¡k¢q¤u©§ ynj~wql}o^c`gkuw~fhuifW\isnNPjcgrg_dfnlj^``gOKD8ETg^JGQPUUKHSaoteF[QUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:176Xl16Ok[N\K[fb>G1Qd=+/£° ª«£½Å¯¨¶Â¸½½§¶°¥«¤¸³²³°¹ª§¬´¦°´¢§·µµ¨§¬·³®´³¢©´«¡¤§§¬»¦¥¯³¸®¥¨®«¬¥¡¡§¦¡¦¥§§¨©¢µ¯£¢££¡¡¡¥¦ªrx¡vif}sx¡o~{¡ {tvlmheczlqbTmcliqXjpoX^i[kk[qnzrhZ^FN>F_MFRVVQQRWTg^LXJRRPEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(¦«ªª§©¿Ã®±º¼·À¿ª¥·°©¬¦²µ®¯³¶«©¥±¥µ²¬´¶´¦§©³±²§¯ª ²© ¤£¢£®µ¤¥¦¶½§§ªª¬¨¦¢ §£¦£¤¤©¢¤¥¦ ¶£¤ £®©¢
±£¬yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Å{r¶§ºzl±«°yhkX±®oei¼¼nhznrØ~Sjb¶²ru¡ªWOWaOVNFT[XQPR\W\P@\DPNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦¦©¥²©°Â½²µÀµ·¿Â«¦´©§¯³ª¯¶´¨¨¦µ¦§¸²°µª¥¤§±®®±¦ª§¤±¤¢¡ ¯¢´º£«©¡®¥¢¢¨¨ §§§¡¦¢ ¯¢£
¯jjª~gdp¦q®¡¤~w»|k¡v±_j´[¥f`fzfjxj©e¾rg¦v²j|±xtcmm§m[ EigEu`}g{¤§Y_«ixzj§7J¯[WTlc[KOX_\WV;NOWV/HSSJDEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¢¬§¥£¥ª²¸¬´½¾°¶Ä²·ºÂ§©°«¯©©°®¤°º°¤¥®³£©¸¨²±°£¥ ª¯¬°¦§£¢°£¦¢´³¡¬¢ ¢©¤ ¡§¤£ «¦¦¡
µµx
©µw³·~©~k¦z
w«gk±[¬{tpx °vwqkkl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¡n[Tkg`LK\dX\ZB>°xWXA#LhECDA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gW7J9aU50³¦¦¡®©§³¬©»¶Â°¼Â¸·Áª¬®®¦®²©¡¯¼ª¡§´¤«µ¥¦²²§£¢¨ª²¨°¨¥®¢¤¨µ¯¡©©¨ª ¥¨£ £¥£¢ª¦¢ Õ¹p°Â~Æ|Ö»|¤¤{¤¥z¬yV¯{~j¹Z¹w}¦|zªy{±mt¼
oP¯§ÅQ zc`ªbsrm`Sµ´È|c¤3Bv]QjhcP@XfZdaJHMlK[SOYfZCD?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K\P_fT7G:aQ72%¢±§¨¥³ª¥´¨¤¼·Á°ºÀ±µµ¼³µ§±°£°²¦®¶¨¨¹®£¯± ³³¯ ¤§©°¨´©¤ª¡ª¨°©£¬¢§¡¥¡¡¡¢¡¢¢§¡¦ §¡²nhµq«o¦r´sr¶{£¢~ ¥~°vÒÑv\®|¤oª¦k
}}{±sx³etofRÈZÂ\yb__vsb^YÊo¿uMKµSUÆdTQjcfXAOj_liOUGI9=WR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BNT_eP5G=aM62/¡¥¯¬¤ª»¦´¥§¶»¼²º¿·¶µºº³¥´´¡±±¢¬°¤¦º®¤±±´·¨¦¢ª¤±§¬©¤¨£¨ ¦«°¦¢¥¡¤¦ ¦¦¡£ ¡¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}w
w¯w´aelZ°XKuyf`^vwhk^¯wxl5yÈ®²_ATo^g`EPl_qmVUM.eciSYQ:AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:88 ¸°´Á¨²¨©²º¸´¸¿¹·²¶½µ¥¸³´¬¨«§¶«¨±²«´£© ¨¡µ¦¦ª£¥¡¢¥§¬¯¦ ©¢¢¨¦ ¥¨¤¡ ¢ ¦©}}¥x¡ªp§¡£ª|yo±Z¨ ytØvt§¤|{²^d ~l\«[Zhgªcr{kr]¬Z kneOJC¡\ZLt^beMZa_rs_JV6JYHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>002144+*05/7,&21($$6671<PeeA&Uf[?1U_bL7FI_C1>8¡¾«´Â®«©¥´°¸±µ¿¹º³±·¼ª»´°¤¥§§ª±©°ªµ¬«¯¡¡ ¦¤£¹¢£« ¢ ©°¯¦¨¦¤¨«§©§ £¤¡¡¡ ¡«®mr´r©v¦s´xs³¤¢¤w¸o{¢kk¶Z
ei¡¢§mr´t²j
ku³af¢oj\`M¡|Rs£ly~oq\¯V<wfTon.\§ObRkealYb\`p{cTZQ>>mp3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;<010/75,+,426/#00,,289/9N`eD'UdY>/U_aL5FM^81B8¥º¡²À®««§·©¸¯´Àµ¼±¯¹¸«Á¶©ª ¦¤¡ªª§¶£²¨®ª § ¥«¹£¥£¡«¶¯§¬ª¥¥¬£ª²¤ §«°¡£¢ ¡ª«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxnqn¤t½]w}[ay¼kZV[jz^j`dfbmwoY[YCA@r?CG+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¡¼¢±Ã°ªª¬±§¹¯¶Å±º²®»°®Á²¬¤¢£¡ª¤ª²¤´¦¤ª¦¬¸¢®¡¥ £¯¹±¬£¨§¤¤ ¨«©£³¢¥§¢¡¤° ª
¶·xµwnknsnysÁ»½{²¨pt¸|{|¤»¹½uz´£tvut°ufiµtrpw¶^y}hymyb¬pu
Y[§jDdYSf`c]cQgfqluBNPLD;ZL>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbV8*O]]=+:VV'=;<§ ¿¥´Ã´¬«§¬«©»®°Æ¯µ³®·§µ¸©£¡¥ ¬¤ª¦µ¨¨ £¬¤¾¦¡«¢¢¨¢²µ¶¤¤¢¦¥«¨¤¥¡©¦§£©¡£°©§¢j~i¦xs~tzez¾¾Àºnq_rjZ^adk`cmvbke^`cqir}gj~rtx}}b[wthP\n|{kXlzrIJo
pMtMEW]f`L[Xgc^O[muiqQODEM;HI<L?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P^L(3=[O'?2>¨¨¡Á£´º¶£¥®§¨µ±¬È¬°³¬µ£¾±²¦ ¢©¢¬§®¤¤µ©¥¡§¨¾§©¦ ¥©§°²¿¬¦§¢©¨¤«££§¢ª¢°¦ ±¥¢¨££¦¢gm}qw
µª ¢¡z¥
lj||tqxyvv{jstucw}vkp{m`c]pgMYYej_WZozmmfSOFS9OZNRO(+:JB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@³ ³¢¿¢¤±²· ª¥²§¥°µªÉ«±¥µ¦À¨´¡¤¥£ «¦¬££¶¬ ©¥À«¤¢¢§¨§²Ã¯««©ª ¬¡¢¥¯¦¡¤¨¦¡° ¢¦ ¡£ |ª¨{
¤f¡³¯
vz|vyzogykuyrhszvktdyf`idbdfjYk{pij\SLPD_UF@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¾¬«®²² ª¦±¢¬³°Å°ª£³®¼¤´§£¡¨¦©¦¤¦³µ°¦®¾ «£¡©©¬¢³È³ª¤«§¨¤« ª®©¥£«¡ ¡¥°¤¨¥¨f|e~cylhkz¤«ke~g
eeihz¡kh¢wkj£slnzzXe^
^lv\hswwnxxsmytw{jY^ktd]sij|qlc]QMWJdX@J4=F7?FD71<=?AD<<DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³±ª¥¨®°¦®°½±©¨¤¯±¤¡¦«¬£¦¨©²®£¢¯¦¶¹¥®£¡ ¥{¥¬¢¨³Ã·¤¢§¯£££ª¨¡ ª¯ª«£ª¨¦¨¡¬¡¥°¤ª¡¥ª~¾r´rhx¹Ä¸q¢£{¦sª|ËÀÀ»q¢|À½ÂÁ{{ÃÀ}k¥±ooÊzwvzyqzqx
ymwbf_xd_ec^thmdbXLVIQZHOE2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP/#F[3PY/UAB;/8£¸Ãµ°¯À©¨£¯©°¯¦²µ¯ª¦¦¦±««£ ª§¢«¢¥¨¥¤´£¢¦¬·³§¯¢¥ ¡§«¤«¿À°¡©¯©¢¢£ª£ ¡®¨¬¦££§¡¥¥©¤©ªª¬¡¥¡£Îyz¤y_®^§¢ |§t«¯^c©z§
t³c«¡³j®t}¸aY£Ínu{Ú{p~v~e{vvk}n~
~m`qkpg`_yd[phjdf`RTRW^KOC5AHED8>6;@?A;=7@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1ÂÀ¿µ´°¸¤ª¨´«¦²¬¬¤«§°ª §¥¢¯ ¨§£¦¡°¬§®±ª¨¬ ¥¥¨£®¤«°¨ÀƳ¨©±®¢©ª¡®¯§ª©§§¤¢«¬´¦¢«ª£§¦¡° § p
t¨q±|q¬~¡¥w«}r~«vz|~ª¢~«{{VÄzoÁ}mupmeveoawnromeotup`gmd_oiinfcWS\aZQQB9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´£££¡¯¶®¨°§©ª¨®««§¢¤¢¦«¢¥ ¨¨¢°¬¨§¯¬¨§©£¢¡¦£¯¬£¬µªºÍ±§®¬¢®¬ ©±©©©«ª¤£¬¯±¢¨¬®¦¦«ªª±¢£¤¤j¤uz©tz²q¥q ¤``R¬®v®¦z{f£¤£}©~®^|©U¢z¢{ïÅs¯³³¹qb©¯Âthmpnywwolfdeqpf{hc]W`jXXTKMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799674,&$" ('"+-"$.!3-&@DWH,G+66*1PKL# A9D4,'ÃÉÖÕÀ¡«¨¡¯¢°µ°¯©¬£¨¦ªª«©¤¦ ¤¥§¦£¬¢¬¡¤¯¢ª¤µ°® ©§£¢¨ ¦±¦£§±¬¶È²µª¬©¢ ¥³¡§««£®¬ª£¢«£³¢ª³±¡ª¨¯°¶££§|ªlu«y|°o¤Ò¸´¸É²__©¤ yxªÉt£§©ÆÆxe¡¥s}¯^pµc±uK£m§Gd|ppzt|{m[fjrqfj^bYcm\^XHMLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/>-5OTQ;<F2,$§¤Áƹ©³®¬¥¢²¹¬ª¡¦¨¦ª¬©¦ ¦¥«£®«¥ ¬©¥¦µ¢¨ª¶²¬¦ ¥§£ ª§®¢£§ª°´Â²³ª¨¥¡£®¦¡¥¦«¯¨§¬£·¬¡²¹¯¯§³´³¤¨¤Nxz£|¤§¸{|y¹~ÌÆÂ¶x¡}v¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu¤|~tzs~p[mnwrjoZd_hncd]KMQTBIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©¬¤«¹«¯ ¡¬³³¦ ¥®®ª§¦¦£§¡²®¢¨¦² ©¤¢µ¢£¢©´¸¤¢£¡±§¦¡¢¯®¤¨¢µ²Ã±ªª§£¤¥¦¤¨®¡®¥¦°¥¼¡··µ²¹±³§°¢¤
ѵ÷y
¦x¢w ¥qª´nrj£{s¯¥¢¦mp²\¥szl{}n©a¢qqbs²¸hx¦~w|ymixixsnt]ddnmfh`J[XX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUVVTQOQ[U%!2AH$)%s¿¿»ºµ¨¤µ¡££©§®ª«¥¢¥ µ¦¢¨§°£«£¤£ª´´¤¤©® ¦¤§µ ª£µ«Ã°©«©¢¢¡¦¢¦¤¦«§£¥§¾¬¾°£°³º¬´§©±¥§z¨}|°w¤¥l±o¡|¡¨¬
®
© ¡{~«ªx y¯]£|¦§d|tk®]¥kq
]`[ m§zz~klb}tmz`geqohghCY`[=KT2U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI7052.*,ATVVVTTUUUUTTUTSTVVWXVUUQHFIJ#((½©ÆÂ·Á´ ®¸¥¤¤£ ¯¯ª¤¹ ¢ª ¯ª¡ª¨¤®°¬§§¬¢¡¥¢¥¨¦¶©À¯¥ª¤¦¦¤¤¨¬¬£¤ ª¨¾¤Ã¬ª¢¡¬²º«®§ ³¯©ªv¯~
}ºd°e}¡¦¬°
¥¤¡¡ [lj³`{{±lgn°[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m¨{x~ds~bwt|ajfqnfeeOUc[BT^>I(>9=4!"-%2. *1/045799<ACFHJLNPPRTWZ^```ab^_\[XUPNJGC553./@UZXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Â³£¬¦¥¶¨¡ ³³©£ µ ³¨ª«¯®«¯¨¢¯¬©§¢§®¨¢¥££¥£©²¨¼¯¥¨} ©¡¨®§¥¦£¥©» Ƨ¥©¡«´¶®§¼¬©£¯¤¸Ãº§¬¯¦¥©~սªb£¿½}~£×º¸µ
½¾j£o«mz²°Çj«°½xw¢¾»t¦zzc}{dfy{`kekjbPb[Sj\@TaBN)=:4/$%2 $(0496677;>ACFGJKMNNQTW]a\__a^`[\YTQMIC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³´±¿¹²½³¢®¦¥³¦¥¾©·±¨¡¿¦¦²±¹¨¯¦§°¬®¦£¬¡¤ª¡£§§¡¨¢ ¬ª¹®¨£{¦ª ©©¡ª§¡£«»©Å£ ¯£«³µ«°ª »¨¯¯suª¤·epgmow¤u®pq¨££rmmmexomqyipigqhigpd]cjoY]g~w¦`bqofd¢}vfxhjy~ydlcflbKdXJkY:QeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV]WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³ªº¹²³«©¢®¤²©½±ÃȾ¶ªÀ«¬£¡§¬º£¤¬¦®©
¦ª¢££ ¤§©£ª ¥¦§¯º«¬{¥¨©£±§£¬º°Á§¤³¦¬±²«®¬¨¹¤®¸¡¨¥¶¢©ª³£« ±¡¡ ¢ ¤¡ª¦¤~gtvtq§l{ ¡qiwpwv|zjlddocU`X@i[HcaOZ+F=+&!740.!%2(*699469;>?ABDFJKKMOPQXUVY^_ac]^UQJED>9=@ASX[\YWXXXXXYXXZZ[\^__`^^^__```_YY`¥©ª¥µ·®®¢°¤ µ±«Å¼Ä»¸ª¢¥¦±©£¶§©µ§¨¬¢§¬¤¡§£¨©¦¡£¨¡µº¨«| ¥ª ¶£§¬·§¯Á®£·¦¯¯°ªª³¹¡¯½¦£¦¶¢¦©£¬¯¡£±¨¯£ £©«¡ª
~fuvysj}¡ zrsyq{jnd_pi`[`YmcP`dP[:GGD=2==7.*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB:9EMV[^^[Z\[[[\]]__]^_`aabaaa`bbbdb\[c¤¨£°³¬®£©§ ¨µª¤³»¯¬¬¢£z¢±¤¥°¨¸§£ª£®£¨ ¡®«¨§¨¹¶¤¥y¢©¸¤¯µ¢°¯t¤¾£² xz ª²»v¤ª~d\bv¤~n³£§®ª£esyp¨l¢¨e¥
wkvq|ai[vghr{¥dyxinykpe`vokkh[febboS\>NNNRG=@TB91/&4:316678<;>@ABFHBFFIKMTTUY\_hfgWQJ<DG;8UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥¨£§¤«µ¯²¦ª¦«s°¨ª¦¹ ¤«£§¢
u®¦¨¤º´¨ uw §³µ³¼§¡~§¢z£¯·¦
±©¯£y¬¢§©§
w¥z¦{±z
cympyq
txht t| ~j
kx{qpgdwnilk[ekjes\^ITLQ@E5.YTU6)!09=>643568;:=>>@DH?IEJKGSXZY[aahfYQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°¦§©¥®Æ½°¡¦©µ¬§¢ ¾ }
«¢ ¡¨¢£º²§
pu ¤¬´´Êª®·
°±®©¦|¨r{w§h¤y´¦¨Â«¡q¤}
±¡|¡ |
ms
zr|t
Åf©£k¡p
hwt{vghupggl^colgmXgG]QL2E46M`c7&3<DGD:64658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@JdY]cfhgbbbbdc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹°ª«¦ £¤ª¤¥©¶£¯¡§¥½¡y«¢
w ¤¢¹®¥bm ¡¡¨~¡§ ® «¯¤ª~¢vj¬uM«x¨§ª«}¡{z§ikg¶}n`dY{dhr}yl]{m_Sp\_ly`Ye}q§ªk£nr¥piel[m{eY_bWPovemtrjjo^jomljXiO]WE9A4GC^k4,ICQMN=84859;6@;;>BO>QRLMBJ\]_W^_cv`MD:MOMTb\\ffiibbdbddbab`cdcabikdbddgdbgeach ¹¡ª£¦¬¡¶¼«®¢ ¡¥¡µ¢¨¡ ¦´u¦
¬¤©¥±§¢in¢ ¢¥£¡ w§¡§©
¥y}}¢pr{ym¨|¢sv¦f~v¤_z}s¢n·´ºtµ¨dƸ{p·q¤cs¬«`}j³~n}q£ls¤s¤`³p|´ts[²jbosuqhoXklrsf]i^bKD=D5QAYq3=SG_JR=<395::6D;;@IP?TMNQ@E_^[ZW``|dHC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¹« ¤¸µ® ¢££¦®±¬¡¡¤«x
p }¨ ¢¨¨¥~k{} w¢ r¢©¦¨«®}z z£xs} ¦¢d¡|lhn{§}rht«tªg]
vhªj¸f\¨pa^§vuhunm§]¨~w»k~ª[]´g\nqywki[qjxyc`fXbAPEN7VBRn4KZZ_NZC@151;;7H?:CGT?YRY]>Db^V`Qac}iEB9N[]XdfXfgnmbbe_aa__``ec^bdoq_deekecihgkiª¶¨c¬º²°¬¦¨®°¨«¤¡ £jq{z¤
¨£ iy{£ ¢rhq©£¨ ¨}°£¢¸w£³¢£y{«¢q¡|
¯µ}k¡x~´££«¨|}~tªZ]o{xbL~zz
cyBMY¢jq|muy±³§unr|orj¤]vHec`sp}}ne`lhv|ddaQ^V]TV@YEQgDSW[bX^ID=B8?B:IE8LDWAVQ[VDFb\Z`K`m~qEC<U_bZejVghmobff^aa\]^ahb_edvl^egfkdflihki±®S_ §³¹³³©¢«©¡«¤¡¨ w
ny
|r¡s©|l
q¡x
|¤¡£®}µ{¥z©¡}§hvm~t¡sq|
p®}¤¦£o^¨gu£co¥aÒ|zxrsc¢
~£s£uk³`sª²¨¼wm~¾¦©´^n}qos¢r]£gt¦ah¦mÔ|oxykzwrm©¤g`eypkgfdmuwg`bS[eQQaIWIT_WS[ej\dPECKMJKBJE8P?PMWSXORR`feiRcwywIFEc]dZhiTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh±«T\K~©¯±´°³£
¨ £¤¨ © {p}h}wol}£ª
yvnw¢z£¥³¡¢¶z¬§¤®¥p©
|¤¢r¢®¤¡vµµµÉ¡s`©myu¡w ~oLf£pr¤{ytal~ kqd`rti{j´µ´Æ¦s~{j«ultwizurPD}³^jvkxfjgbttqnV^TYhORhIULYSU]hknVgWMJAJMKHJNAQJPdcimetrs~y{nu{{TPOl^h[kiRjhilglfce_\]\^ibdhk{_]dhcjfomeile¡°§f?¡²«¯¯µ¢£©¢¢¥¥§¥yjye yui
z¥©z}yp¡y ¦©gnxl¢d|q¥wpg§{¥zrv¹n¢b}¡mri«ju mn¦`hhu¢}`
tobh e~iuocfnr¢Z_[c¡n]o{srd¥mw¢dg§hsn¡oSo _e§T]TmmskqmphkxskoRXWVfYSmIXO]HXihsjYkVQREV\LXRaThj^wuz|p||r{rvv^QrbgbpgPjhhklngdg_]^]`kcjivu]\cicjjslfkmc¥¦zetm§®¤©°±¦«¥¢¡¢¢{qh|st}|d|§¢¬
}sh¦} «§¦x¥²¯¥xz©t¥n¤¢¼n|¥¯
|¥zq¨ g}n«cw¨l©¢uw«¦k°kv³©knma«ªv¦w}
¥ iv¬g·sw¾¤Y¦«aurso{tqbj~nhmSV[Uaa\kM]R]I^mmv`[qY[`Zgsenoqcqt`wz~yrys{{vbxdcmsdRlgholrifia_^\bkbmlzo\\bibljwmglnb¦ª¤©ª¨§®¤«¤¥©
tzo~ttrm|{
¥¥¦
vol©«¤ uy®£qy{r¦q}}zx{~~v z}l
[yxqyqhn~qtq
e_wusuoynnm^wixf©~t|jov}
vmlgsy{x[kXyhnwrqowxo]lnigVZ`W\ekcUaU_R_pxylkvejkjv|qrtsaoubs{xuyux
}{mldxn^Wnghukxjijd\`ZcjelpunZ[bkdllynhloa¹©§¡¢¦¤¤«£¡¬ ¦¨~r|}~
{trp
{}
x~£{§¡
wr
ª¨ «~¨¦xozo~¨
p}qkp|hm]sqtkvsYrn}~j]jd{
_ix{{vhykaqrw_s§fnwq
yoegdzz[\jgnv[{xwtmsrf\mklbYY^ZXlq[_aZ^]ft~{uotckkj{|r{xtdmtgl{~vz|{zz~o{}s~ysiT\qiluougkhd]aXkhkjqrmW[enlgszohjm`ª±¡£¡¨£¢~¢¥{|s}v
qor~z¦¡x
z¡« ¢¢££ª¡§¦ |x§~±¦²¥k|vwe{
w|yu¡
~vptx¦
}vl|yjrhatp}zwvowt]^ohn_^Z\]ShqUc\\aliu||sopdkji{mxqioplf{rx}zm|zx|}zyNdvksmpzdkebb`[tfpfrrmU]ltmhyzqgikeº¢¡¤ {«
}y{nxr~ml~z|ªr}{ª§ ¢¦ ¦w|¥{|©¡«~ox
qt`u~
nyut¢
t||rr{{y§w|ok~{mhlmg^yh|{vtuu{w\`p}nu`cZ]^QfmSeZ^akivz~qlldkjglslltoxnynv}vr~{{|{`i{juhidjc`i\duhobunlTcqyepzzseimm·¢¤{x¦¤yz
|m|xs
}}kh}|~|§p¡¡
|¨x£¡¡£¡¤
y }|¤ ¦~~utpv`}r|r
hwqx~s||py{z{¦|
vzer{~xzpljf^}sh|uus|rj^`tvpxdcY_^SkhTdY_agjvxqfkclhejm~hnqk}wzks}tv~|{}jrnsiahlb_qVtomn`xhmWjtvcu{{rbjny²¦¥ |v¤ ¢x{~~q{tv
~xgc}x}y ~o¦¦
v¡¡z~¤zx
~s¢¡¢~|vq}nzd|
pleuo|}x||{q~x
y
¢ww|v_xw}s}wflda~ijwstt}q|bcasnusmaZa^[kdRbW`ahkvyqbjcmeh|lhthloh|ymqs|~z~|mvttmeljacuViqn`yglbjvpfy|zq`rl
®¦¨}xªyy{}|{xtyzs}d^}
t}~}£¡r{§¡ t§tlzo£|zqykul{}~n
wo}~drj{ty~ux}|
¤y
t}tvn`{uzq|oance{bnovrwwstav_oluno\\_^^j^O]Wcahmt{k_jejchwmflhilh|zwos}sz}z}}rzxxnlkh_iqchqoewhnlayhk}{xpawmª £¨}w®}w~{}|vwput{o}|a\~szz¥~|¤n¢¡ogz
p¡|{tsukqnu{tn
qt{|dqly}}ttyo~|
¨{}~
x~qp
chxtvp{b^paku^qjzxxlrpex]mlsmsYZ^`bjZPWWecgqqf]ihgbgqodigejhzwtn
t{u
w
|x
zw{zryjk_phtkromqgole|cnyvqlww¢¢¨ ¦uª t|v
wxrs{
kspznvnq[Y~vu ¡x
m¡j
£g~w~||nvplmnp{
ispwtxfsov|zzwtp{z£|wxxok]rsqqqxZ^p`qk^oi|ypmmjlv`pojrmZXaabnXQSZfgcupb]jmdbfkm`ff_hjuqrpuxux
ww
{{vjqc|b|oqltjholvw_qy{tut~¤¦
u
zrxtprsqulpmumw~mnUQ«xvry x{¤
|r
ig¡qw{z||kvjnkklz~ay~vzw|ygtlt{qzpwzz~
}|x}wqjly_womlrsV^obra_lnypgpffsthqkawe]Wfa`rSPN\fe]xp|_\hrbbefi_hd[gp~pkps}v|
tuy{xs
~{ywfrj`~ookz`jntt_t}yxts
|x °¥vtvspo
spqokivmn}|musRNßÈÖ|otv w{s
¡~xz~zvhl£
cq{zy
{~l{erokkyy\yz}~zyhsks
}k~~n}{|wxysmfpljtohjtmS^odpY`kqwfkjbfxrppc_x``Vk_^vONK`fc]yqt\\ev`aeed`faXissnkqv|tyuv~s{~r|~vesm|e~oplZlnyysavz{vswwy®
w~|
twpyqnomn~rddxp|mz}jhlc¤ÁÜ®ï¡skuv
¢
o q£
{uxwvn}£
^l|}
v
}}k}dxujnxsXz
z~
~xesj
kvn
{utxusqguybtmobivgR`qglU_nty`rc_h}prn[crabWnZ\wMMLdfa^vsm\\dy^`df
`cb^Yjrknkrv}twxw{q}~{t~~shuqymzntpXqzvyqewyiwr§£|pxy
¡{{rwpsjokil|t^`xv{pu{gae|ëÚµÉÃÜslswiq
|{vxrwp
¢ai}}q~qwhvriswlZ}
|uatl~}mlx}~orzulqkrx_sin\kv`RdrifS_pvt`o`]hqsjWghciXmW[uLJLeg_brs
i[\ey^^dg{`d_\Ykneojsw~ss~zvzs
|vw{vlvuyxtnxz}Xy
qogywdv
q
¡¢sorw}|xqsnodr~hflww[_y{zqqiagaÕ¶¦xnqw{pj
{i||~
zu{zpuv~a
g}~~m|tkmvtsvukb
~|~p_sq
||zpfy|~npzunojlz}bhjiXluZRirjbQbrxlae]Zjmsb\g_dl_nT[oNHOge\gnqlZ[cs`\clwde]]Zllbmjsvqo||txx
}uy|vowy{pm|w^tmi{ssgs|r vv~mv~|v}vqoljat|gbiuzZ_w|zmqedhhW^qr¼Ãuq~rsk{|}|u
vw}quru|e}
r}g~{x~|i|vfoxxsvslj
xk^rxz~
{~rixx|}nm{}wuohg|vc\pbWorSSnsiaNftxe`]\XnosYeb]jm`pOYkQDSgaZknm{oZ[^mcZbowdf\]`ljcmjsvqn~{tuz|
v~xtrxy~oo|qiyz~mm|vkjxtl
n}vjxyozspljd`t{h`eqzZar}ygqzaee±²wJbZ¤ÙÐq{x~
olzy|xxoqt}ziy
¥o~vy
p{}nxhxr{e}~udpshxpou
{vxyk\q}r
}zrnq
sxxnow{ehj}p_YwZXqmNWrsg`Klvt`][[Yt}roWg]fjq_oNWhQ?Yg_[pjgyq[[XkeYcpy_h\^emhfliqwol}upz~v
qq{|yyujzko~t}or|{onxg¡gogz~
|ixrklf_aoym_boy\dkzaqv_efÔê¾2:>ry
v~nl
v}
|xnvwo
ku{tfy§}ntvy~{xlri~xm|{wbyqdqh~mtqu
~ru}rp[m~tx{|xzqlrytnkwuu\ihwpYW|SZpeLZrre[Jpwo\ZZY]t~uhYb[gfnciLWfQ=^f\]ue_toZYTodYdqyZh^_gmgjlipw}li~yn{}zu
pnx~z{h{}jt{r{sw}yx}|kl~kh~{~}kuqghc[bgro`altahpybst^cd n\5Y¯µuj}v
swpm
uyx}zsgv~~oq~hvymey¥~n~v||q{}|i~mk{zizvr`w~qdrgumt{
|nwy|t~mXovtwvzxsn
r~}~znnjnun\gfsqQ[{N\p\O[rpdVKsxjWYYZaqt`]]`gdhifNYhM@ad[`va\tlWWStaZdorWj^ahkgmlipw|kh||p~~{zwq{oqw{j~{nwyvw}x~~zm
£{uyklx}{~prpcf^Yg_pp``gpfjotato[adjv{¾¦£È¸q
s}xsrrp{tutwyyqcwzirvfwvcj|}r~syx{lyyuh{ikysizv}h`w}jkth{iv~z~~p{v{t~bVw}rs|qwxpp}y~}vviqimrp]hcsnJeuL^nUTYsnbQOsxaRXX]bps[a]hedcjdQZpIDda[cp^]wgTVVw][enhVk^ajgeoohpvzniy}r{~x|v}pvrnw~p{wyzuxzuo~}
zw{gt
z{vgon_d\XeYmra`aqlkhn`siY^dmw©Ú©Ç²qxpu{zutu~wpqmtxul`zyfqogvn[m}x}x{mut
{
luvmhwem{vmjvw|`bxzhtuc~zgt
{tuqz|mYVt~ouyltxku}{}x{r}sgtenmt[j_udHnnL[bWVUxmbPStvXPUX^aqo\`cmec^nbT\rGBf_]fh]ZzbQU\u[[gkaVj_`nffkqhpuxtkuvx~w{t~oqtqu~
{wx||
x|}~{~svyzvty^}
yt
w{bnl[b[[aVjsc`\gnofqaqfW]ck|Êι¢jmmlqr|
{
zytyuu{jlucuwpg^}zerkjqcXl{sw~{nqq
{y~qqo}fhrbnxqjkqw||y\eywiuxfvgt|rio~yn|]Xrmt|ooqvhwv}qzt|zrfsanlsXk_w[InkMVU^TU{kaOTurQQTV^bt
h\`ljfcYnaXbpGAh]`f_]U{^OVdpY[jh]Wh`_rfkhrgprwxntzx~yus
pp{xwuyz|u~}
~~}|xvyw|mvycso
ztcnjY_[]]Tgse`YdrrfsbkeW[`iw¾®{ ·mbsht|rz{}xxsvo{vejn`usjb^~xyfq~hjkZVox¤
qqxums
}xtrnhy`jm`mvkgjkywzw[g}|xer}nteu
ofkzumtb\o|ku||fu}mqgu~x~r}lzzzxpflbn~mnVk`wUJjkORNhNY|hbNUvjLPTU_gvf]`qhgaWi][khJEkZbdWYUyZNVmjY]le\Zec^tfmdqgrouwp
v~w|
}usnsxzzss
y}v|{~{w|wwziw}|lrq
~oflfW][\[Tdqe_XcsuiupeecW\\hporteex~itvss
xywtunk{pagkgtnf]_}p{~imwfidUWrp¦||vs{s|zn{{
v||tprlgu\mh_ltdgfizo{rYgwtgpwubw
|njmzqfse`mzgsw|~buvikqtzpyys}f~ywncfbn|mkVjbpSKikOLNpG^{faMUtcJNSWajv~e\gsif`VcWbp]LKkXcaUTUsVLXudZ_ka\[ce_wfmbpisnrttww~
z}u~
nrt{zuq
zut}
}~{~v{£¥y
lu|{uzn
sz}unjheV][ZZTbnd[Xbs{ihmi`bW_Zijkohlahyxktttn
{}vumzhjyj_enhvgeXbwi~{oiogf]UXoh§vz|yuo~osuywt
vjrvghn[ld]ls_gaixh{mZmrsio~ywawxrqoyrcqh\owdqs|xbspgjxsrlxwuwd{wvoddcn|}klUibfSKmhOGRkEaxgaMSq]IMTYekw{e^mqid]V_UnnWKThXf^XNUlTJ\y_[_k]]Zbe`zhlaoounowuz}wzzxz~qtt~zvt
}}ls|
}~{v¬zlrzvuno|sjomddX_ZYZUbjg[Z^ui^nl\bV\\kfrt}ij]kvvgtwqm
{}}yvrlzhixf]dshzwccTepg
wwfhj`WVYhd§n~xzpp|fyoz{vq}~ndvsdhh\kb]oo[g_ludzh]torkq{}uubt
zwruuaplYqtbqr
|udrlalzojizxurf
uzzupdadns~ilTi^]TKscQGVaGbvfaKToWJLXXglvzdenqfcZW]XveTJ\cXhXYIWeQHbxZ]_l[^\ad^ij`otxmonvyr|}uvx}tuuxzz}~jt{}~
zz~|sq®{{~frzt||vrol{~lzbpobe]eVYYWdfk`]\s
hXqnZ^WZ\l{cpwvlb[mstguupmx~ywnnteite[gufvvz_]Refjt}bci\TX^bc¥hyt
xmnygxm|
{urx|xhevm`f`^j_]skYe]oobze[w{knnpwxstdr~zvor}rbxd[opbqq|sfqd^nvidgyztnout}sqb_fno}djShXYTMw_QJYYHbtdaITmSILZWilr{bllscaZZ[av[SKd]XiSWGY`NGiuX^am[[_bb]
hhanxylnjvyn~vtttrwvw|}~~~px}yxy}tsp¢{zyduysxulto~ly|pr^po`gblT[ZWhcmf\\qeRrn[ZXX`lwdiujj^Zmsqmtstj
|~|wnnldiqc[jrdtvs[WSdarr]bc]SZ`[cerq
tljylopz|{qwrzzzdfvg]bZag[^whWb^ohaw`[{vjirnwssthp~vrjp|mfwW\kmbqszsfo~[`oqb_jq}llt~sqxkpa\ellzagSgUWRPv[RPYRIcsb`GUjPHOZVklk|fmoqa\ZXYlpWRPfWWiSTFZ\OHruX_cmcXa`a]jcdmyxkniuy{k}|y}nqowz|t|tx
uspuo¢t{{fxon{ofxpzlsvrk^tnagekR][VgbllZ\qdOon]VXUgjthbtee]Znunquuyk||wsddkna\nmcsxkZTVbcx}}q
]c_cT[`Yccnp
sjhznesvs|lztuoz~u_frc[^VbdXaueU_`mdaq]]~phisqspuukm{qrfn}proS[fjfqtwsblvUbqj[_ne|emv|srsjm`Zdjjw^fTdUVPTmWQWSPHer_aFXiNHXTVnid|ikxkbW\U[tdSRWhQYfTSHZZPMxw[_eliZb`^^nbfkyunohvvl}{krgt{u}r}
{ss}vn¥swxnz`d|pfzsylmqvgd{lcfghS^^Tg`lo[^nhNjm`TVSogtkexde]Yptmrzxsm{v{zkaelm^`ojepy~gZVX`kx|{p_b^gVY`Wdbkq}wkkxl[vqlzivsno{rXjn_Y]UacWdqcS^aibblZ`~lfksunmwvkh
zmqfp|mrmcY`hiottr^ilReqdTbnbzcqv{ukpmk_Xaght\eVaVSNXeRO\OOHep]cFYiMI_KXmd`xhn~d`U^T]t[TR`fN]aTSJ\YPYuv]_fmhXca[^pcgjwqsmhvtzsz~|zntlst
z}|sstxqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z||}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDEB1//000/>DDDDDCXhggggfo
}}{{z}~||~}}}~}}~~~~~
-h
S7¤¤¤¤¤¤£r]____aR4555553.755554Ma____^j|}z{z|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvtuvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhgmgjghehgcbbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z^]YY^ba^^ZY_[XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROMPQQQQRVVRQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQONMOOONOPPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKJNINNLMOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCESBUPHKOKIIJHHJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>><ED=?FYC[V>EEGGGGBDDDFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL==C]D^a>ADDFCFFDFIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprtusqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;<>=:C`>\kCAB?A@CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqusurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::69:99:Fg@\m?98<<=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@===?D;>=>;FiK\m>:<>=??@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@A?@;]pB>DF?MdX]e>==;<>>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CFD><<=@=8::nwJ7<9EZc``dI;<=D:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@[Q<<=LPIHvwO789Thmghl`A;NQ9;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@EuyH<az{w\F=AertlmrmOFfO:=>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCEAIsykf}`XQFbqrqouq``iJ@BBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{|{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Gpt}~}tJSfXaqrtv|tkmcIJIIMMKECFGHEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEis}|~yqBHdmlvtkVIMLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`{x
m@Os
gJLMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLN[|
Vl|QKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIIHHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJV
uIIFB??@???<<<>::<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIf
fBB=88::9878896479;<:8567789787688;;;=@;999=<>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIj~T;8656766645763468:876565676778:77789;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBf
H676468874578467699766765:9:::;898987779:98868589;A=>>BA?AKLOQPQOOORWkqrttuwy{z{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=rz>:88;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<<9:<8::;:999<?<=ABDIJMKIKLWorsutux{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?>H~
l<;>BCEEAAAB>@B@@>=>>@???@?@==?B?AA?A?=@@@>?A=><;:;99;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BR
^>DGIKJIFGGDFHGEBA@CECCABCB?@DHECEDEEAFEFDEFD@B?<@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CCFX
WHLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A?BBGGJY
PMPMKNKJLJIIHJFDGHHIEEHFFELLMIJGGHIJOMNLLNKGGGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?EGG=<@@88<;<=:?A>@@CFIJQ`
qMQOMLLKLJHHEJIDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIGCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@8:<8=>;=A>?@EHJLWr
_RRPMNMKJGFBGJGLJFKOLKJJMMLOPNHIKLOQQQQOOJIJJLJLFGHGEGIFEEB@BB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAHKLPWy
|WVRRTROLKJDEFKONOWVQPOQSRMSTOMSLPSUWRSQPLJMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?CBFVNFOPPTY|
gVUkaERQQPI;;QSR`u]UVTVYYRYXRZfPUWZ]RTWQPNRPPPQKKKHHJHEFIHIHIirvyyzyz{{|z{|}|}~}}}}}}~~~SHJIIGGFE??AAEBCGEDELXRMTVVX[|
}al[dU:XXXSQ?@VUY\d`VYbr^]V]ZVEQYZ[Y_TZgRUVXTTVTOOMJLJIILMKOMSosvxyxwzzz{z{|}|~~}~}}}~}~~~~VJJIHGFDDBA?HMIMPKIKPTSSXZZ\\y
g;~znpXZ[ZRTRVVTZZuYU}a\X]^WIV]][[_YIYXY[]XXYWRQNPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\YSUTWRQWVcQerXZW_hP`f[[X\gaGOZhg\[\]]WROSPPQVVVVYZnrtwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOMKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ[\^TQQPINOWVXZZdqsvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKMNKMKHJDFHEC>ScURQQNKRTQMOYQMNQSUUMQSRPOMLHCIHRTUZ\mruvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRVUbs{|}{{
u_]KC?CCCCB?DPBD@C>BHGV@HNMG]iQHFOFDEFHGHBCHGHKGCBAD@OPMSdstuustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfiedb[XSQPURsWe[OONLQSQUYSUQQTSOV`klrv{{xytrnstsyx~~kLG??;;>@@??>kQKaEFHIEB?GLMGMQUIBE?><=<==?=?ACC?><=B>JMFUnuuustvxz|z}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrjmlqu{z}{xz||xwxdB@@B=:BCAADB\]O{NOONKLMOOQLKLWMHG@B<977599=;;;8989?;BH?\ttuvuvxz|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbXGFFHBAGIEEFDMRPaWRXQPSSRU[OOQWPMJCF>::6487979:366795<B=essvwwyz{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXQLXYZVXXVXY]WWXhsk]Vaskaa_]da_^YUPMONLHHJKIHFCQPSZWTTNQSYS\eUOSTQNKIHC?A9988978847578599Gnqtwxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLPRROMMNNNLJFPPUYSTNJOOTST\VRUSROMKIHHF??=:787659967665Wppswyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOIGOPOOMRJOPPPNNOTLMIPOSTU2<XMIAQ=caQSQPNPQPNNMPNTRPRMILKOQPQRSTQROLMKLLHCBA=::876;B4566;epqtwx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFFAFGGHFJDHJHGEHLHKHFLMPMG/E_R>3@>joaRRQ@FUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6676Dnqtvy{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHEFHJNKEGCORC8ENS]fSQSAGUPOQQPMMNLJLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Tqsuy{{{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTWWULLKH=987;?@><=A@B=>EHGDFFIGJJ@FAA@FHEJOHPRa\QPRNSOOPLLOMKMLMON[WKMQOGIHCIJLLKFFFD?BC><BF?B?Adqux{z{{|{zzw|wy}~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;?B@@>ADIECHGIGIEBB?>=CBAGIDMObeQMONWKLMKLMMLLKNNSdMJLRIIIEAHJLMNJGIFBAB@?EFEHDKopwzyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHKE?B=999:?B?<@BBADEGKFDIIGGHCC?B??@A>CECKNQTLJIMTFIIJLJKKIILMOPRPKGCKGCBJJLMOMIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKDGHHGJKIJKDGB=>=:::;@B?=BBCCGFJLJEIIFGHCC;A@B>@@CEDIMPGIKGHKDHIKMHJLHHJLKM]RIHDMFADKKNMPNKMJKFGGJMNQNLcnivvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKDFEGDEEGEGBC@><=:;::@D@>BCDEIFJJLFIIGFFDB;BCC>@CCCEGLNHKNHDHEILNMHILGEFIILNKJHENHCGMLOMOMNNMLIHJORQRNRfgfrosxu{z|lhjnekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFEBBBE@DB>?>:;;=:=>CA?ACEGJFIILHGGGFEC@=EEB>BDCCEGHIGMPJFFGKNOKFHJFEDEIIHKIFHPKDIMLPMONOONJJIMRUTROWd`amgproryzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCBABD<BA>A=::=?;>>@B?@BDGKFIGIHFFGECBAAFFCBCBDEDGGHFLQLIOJJLKIGHEFEDCIHHKJGKRMBNOMQOOONOOKKKPUWVUTX`^\iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqrjksMGGFHBB@DE<AA@C<89=>9?<?B?@@DFHEHFFGFEEDCECDIFCFEBEGEEFGEJMKHQMJKHHIEFHIECIIJKMKOSNDQRPQRNOMNPMLNSWVWXVX]Z]d`hbjigk_eegcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqiozMHGHHBBBFE<@BBD<7:=>:>:@B>??CEFDFDDGECECDEFGJEEIGCGHFHFECFJJGMJLKIJLFIIKHEKKLMNORTOISUTQSPQMNQNMQWZVZYVZ]ZXa```^hec`dehgjihjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprsyNIHGIDACHE<@EBE=8:>>=<<AB<?>ABFCEBCHDCEEFGGGIFGKHCHHGIGFDHKIGKHMKJKLHLKMKIMLONORUVOKUVTQTQRLOQPOTYZY\ZY[^_^`b^\ackb`dghr
hgifjmnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvquMIKHJEBEGE<@GDD@:<>@?>?CB<@>AAFCEDDHDFDGEHHFHGIKJFJHHKHFFLHHHJGLLLLLIMKMMMOLPPQUVWOKVVUSSRQLOSRQV[[]^[\^__a`ad]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvovJKLJLGBEDE<@FDDB;??A@@@DA?B?ACHBFEFGEIEFDIIGIHJMHHJJILJFJKHIJJGKKMMJJNLNNNOKOPRUXVMNTVUSRQPLNTSRW[^^_]]`_aaa`bceachbdijgvlkigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvowJMLLMGDDAD<?EEEC=AACBBCEBBDAAEGCHHHGFJFCGIGGJFILHJJMKMLGKIHLKNQKRQLSMKNNOPPOTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^`b^`eaabgnhbihhmxvlhjmosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLMLLLGEA@D>>DEFC@CAEDDFCCEGCCIFCHJJIIKFDKJGHJIIKGJJNKNLILHJMKZfJd\KlSHON_nUks[qpbwcRPbvuhucav`Xnqbdvinzf[lt`ljT`wuijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyKNJKJFC?@B?=DEFDCDBEEEFBFFHCDJEEJLMKLMGGMIHIKHKJIKJNLMMLLILML[sbdp^lmUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemymkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?BB?=CFGBFCEDEEDCHHGDEKGGLMMKMMGJNHJKJILKJJKMMNNMMJMMM[roonpplkMPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\_rkqjUuyxpc^kfbgqpjioppsspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryJKGHEEEBBB=?@FGBGDIEEDBFIHHEGKJGMMNLMNHLMILKHJMIKJJKOPONMKNML\hdu]lqWlNPQmUZk^klvaldtTecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ghadjuyknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtwIMGIDEECAB<BABFDGFLHECCHKHHFJLLFNKLSRLHLLHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nopoqronusttj[]tcwxrjnzhaacgbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtHKHIBEEEA@>CCBGCHIMIFCFJLIGFJMLFOJKWRKGKJJNIHJLIKJIHJMMMMIKKKSkbZi^_jcrrZ_Yjo_eeUk_c[abQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFIDEDFA@AEDDGBHJLHFDGKLIEFJOLIOIL[QJFHHKMIHJJKKIHIGKKLKFHKKLLLKIKLNT[\TPTLPONOOVQOOQOOQJINPQdqiTYW[[\UYZ]X]\\cfaafbce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusHCEGFFAEC?CGCEGCIKLHFDGKLHDGHPKLOKLWLIEEHIJHIKILJHFHGJGHIEFLIIKNLIO\W^O\[`^OXYS\\b^MYZMXaRJYaZS`d\aX[ddVVX\YZX\VY\]b_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBDIDGGFKJKHEEJJJGEHHPJMMJMSIHFAGFJIKKILJIFEJGDFGEEJHCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN^\^S[^c^Z]`c`Y_b[`^[TXXY^]ccbaceiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKKKFFIJNJNLHLNGHF>GGLIKKJKKIGEIDCCEAFJD@JLJO[cY^^a_RTSW_`\]Y^QY\MV_WKQY[PZ_aa^^ca`bbbcceZQYVU\Y^d`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKGCGEBEGHFGHIFGJGHFHKILDDKKNMLLHJJHJG?GFNJKKMKKKIGGCD@DAHIA?IJHO]aZ[d]_TQSX]\\\_ZKW\LR\YIM^PO\_acdccb\dcbdcfXQUTS[XZa^^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKIFFGHGGIFFFILJNEDKJLNJLIKJHIGBHHQMKKOMKKIHGED?ECHHAAGFET]Y^X_Y_[]UXXP]]QKJW^X^[]VZ`RQ__bba`bb`cbbddbXOQQR[S[^]]]^__dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHCRKFHHHEFKJMPEGIJKNLLILKIIHDHKQOMMPLMKKHICDAEDHGBAGECWUE\T]SV_XNTUNZ[MJKU`a[_X_^a]OYb]``_bcb]bbW__TPNPQXR]\[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPDW_IGGHDFMJPPFJIJKNLKKLKJJGEJMQQNNOMNLNHKADACDFDCAEFBMHCLLPOOLFMFGIJHGLLMOPILOPPSPLPTSUZYWYXXdVOSTPPONPUT\YYZ]\`adecgcklpsszy{z~{}{
}KIEEGFGDKM]LGHYMGHJHGNLQQIKKKKNNUNOKKLGGKPSSNPONONOHKE`ED_LDfcEM[I_\smOMVmYLCP`UlWgJ]WU^DLQULMTVQSTXWTXUT\TPfZhhdXSkTWVU[\[``abbb`fhfnlhrz|}~}|zr{z{
~z{LIEFFHEEKOSIKG`THJOJIOMRQKLKLORUROOJLNGHMQ[YOPPNOPOIJPQI|YYrsWPmHqnpaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[`VUWjtuu_`w`Xa\\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMMBDLLFJLFRVLKNIKRXWQNNNLQTNOQPKLOGMPS[ZTQROPPPJHZx]TxehYRTQvgtlpbnfjQrOMwmjrpsrqrpop]fzuxqqzq~s}ku}bRg|essoss|}o}yor_``bbZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJPNMMJNV^YULQSNXZLSSRNLPIQRTYWWPTPPPQKGfxlcxrmZKLUypumubnvPdeIfvqmwojfxxiXsRi{mijzz}lxzogoXvvjuup`sh|ilx|o^__cbZ]bdgijegbcdllppstsssyqrxblugry{ssuy~suzn|}yxrnNKStNCBEPPHJKJLPOOPMPZ`ZXKTWPa^RVQYSMPISTUXWWPUPONRJKrouuquqdibWnLqp^FhyWvTLhx}x`y{sna^modRgrunmypwlvttqlm\t~zkmy|lum|kpvux^__b^]_edighfe^abiiijknokqnmjpacfdowxompsy~nqpj{ztromLL[VHGEGRPJLMKLQQQQPQW\YUNVYUfXRRY^TMNITTVWYWOSNNNQHRmHiwK`dvvVXlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhe|ir{]TKl`vukiu{{m~xk|p]^^b[^bddgeeebZccikkrsrwgmihdg`alagsrkhmmr|kmhk{tmmkmOHJKHIIHRQLNOMLTSSOTRWRVTPWZVVTTTa`QONKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXXQNPUTXXX[[URSW[WXWZOSUWWXR]YW]VTOYRWWWXY_[gr^[[Y\]_cZ_ccdfdccbZccfffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilQIKLLMKJSQMQPOLVVTPTUXUYURZ]VUTWUYXPOLMVTQNUSNOMLQPKJQRKQMKKORTRQQSSIHLNOQRQQQTVRXW\WSSQRUUVSZQOSRWUTYVTYUTRUTTTWXW]Z^a]\ZZ\\`c\]bcdgeedaY`acabhhincad^_c]Zd\bma^ffgmsdihkkedcfhPJKLOOLMTPNSQQMXXUTUWWWZVT\`VWVYUXTQPKOWSPNUPNQNKSPMOUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[TOTUXUTYUWYURRXVUW[YZ_]UX_]^]\]aa^[bbchfedbX_`b]`hefda^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTOOSQOQ[ZXWXZZXYV]jdVXYZWVTTOKOVTPOTPPPNMQQPRXTRQOMOSUOWRTUUONMQSUUTTRTXVZ]\ZVVQRWXV[[WQTVVUVXTWWTSRXVUZ]Y]_^V^]^`\\``__ZbbdhhedaYb`b^^fdc`b]\\\\YZ[X[a[^]\_b__bddbd__`\PMNNRQMRROSTQPU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROLPSRUZUTPPLPWVRWSSSXMOPRTXUUUSUYX[^]\[VROUVV[[WQTWUWXVTXZTSQZWV\^Z__`Ua\`a]`b_\`]cacghdf`Yc`a__ee_`c[Z\[\ZZYYW\Y\[`^`[^^a`_b\Y`ZQNONVQPTROUTSPW\\\X^\_W\^jqwyc\[VVXRNOWSNQQPRTRKQTTYZWUORNSXVTSTRRZOQSSV[VVWTVZX]^\\^VSNTUV\\VRTVVXYSTY\TRR\WZ]^]aa`Wb[cb^ac_\bab_dfidf^[d`a`ace_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTP[]^][`\`U\]ijr}slg\UYWQOR[SRQTRTUTKQWV[YZSOSRVVUSOVRSZRTUTX\WXXSX\X^]YZ]TUNVWW^[XQTUXYYUWY[TSV]Y]]`]bc^Y`[eb_dd^^cca]efidf]^da`abcd_b^XZ_[\[XXXXW[Z\`][[\[XZ[^V^Y]POORZPZUUVVTTT^^`^^b\aU]^bkytl}lZUZUQQS\TUTUTVYWLRZV][\ROUSXWVSPXRSWSWVU[]X[YUZ^X_^Y\YRWRYXY_ZZSTVZYZVXY\VUZ]\^aa_dd]^]]eabfd^^dc`\gdhedb_da_a`bb_`^WX^Z\\ZYZWV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]`U]^beeuzhXYZTVSV\XWWVVW]XPU\Y^]]TRXRWVTRTXRSVTYXY]^X][U^_X__X]VQYTYZZaY\UVX[ZZXYYZXV]^_^cbaee]b\`fbdfd__dbb[fchecfaf__aaaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNSZVS\TVWYWV\`abcad__V[`da_zuohY\ZVXUW[ZY\YXY`WPU^[`a\TUXPUVUSVVRSUW[Z\_^Z_\V__Z]^Y^VSYWYZ]bZ^VW[\[\[[Y[YY^_``dbceebdZbfcgfe^ab`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXVXWX]_badada^YYadb`lfh^\][WXXY\\\_[Y[bVTW^]ac\RVXQWVVVVVSVTX\\_``]`]Wa^[^\[^XVXX[[_`\_XY]\]]^\Z\X[_a^`dcdfffbYceehgd^c`_ec]fidei_g^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNRWYVWZY[\YWY^`baeada]^Yacb_a`a_\\]XW[[]]__\Z]cXZX]`cd_RXYPXWXYYWVXV]]^`aa_b^Ya]]^Y]^YXVW[\`_]_YY^]^^a\[ZY\_b_bdcefefbZdfgigc_c^afdZiibfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxLWW\YW]\\]ZW\]_`bdbba]`Xbcb`cab^\\\XW[]_]`_][`d\\XZcec`R\YOXWY[ZYXZY`]`bb`ac_\b]_][^^ZYUX]]_`__[Z^^`bc\\W[]`bacedgeefd\efhifcbb\cg`\iibhife`baca_`_]][Y\YXWXYXW\[ZWWXPXZ]acffrkJYW]ZZ_]\^\Y][^_acbaa]b[bdb`ccb]\[ZWXiq`\`_]\ac_^YYcedaS_ZQYW\]\[Z[[c`cbc`bda`c^`\]^_ZXV[_^]aa_][`abeb_]S\_`cddfdgfefe^efhhgdd`[fg^ahhchhfc`b`cb___]]\Z[YXXXVZV\ZZVVUMXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{|{{{{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{|||{{{|||{{{{{zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½³ÖÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊ¿éååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxwxwwwwwwwxyyyyyywopppppprrrrrrrwzyyzzz~||||||}}}}}}}}||||||{
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuyvvvz{x{xwvx{xyzz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{zzzz{{{{{{zzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy||}zy|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwwy}~}y{zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywww|z||z|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz~{}}z|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy|zz{yyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxxyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqpponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{{yxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}||{~|}~~~~~~}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~~
~~}~~~}}}~~~~~~~~~~~~}~~~
|||{|}||~~~~~~~~~~~~~~
~~~~|}||}}~~
}||~~
}}}
¡
£
~~£
}}~£~~
~~~~
¦©¨
§«¬
¥¡¥£
~~}|}
~}}}~|¡¡¡
~}¨¥
}¡¢~~
~{z
~}}}}~|{|
~}~~~~~~~}~}}}
}|}~~~~}|}}|y|
}}}~~}|}}{zz~~
~~~~~}}}~~}}}}~}|zzz~~}~}}~
|}}~}}~}~}~}}~~}}}|{{{zzyz~~~}~~~~~~~}|~~~~~~
~|~~}~~~}~~~}}}}{{|zzyyy{~~~~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~~}{|~~
~~}}}~~}}}}}}}}}{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~|}|}||~~|{{}~}~~}{{{}|z{{{
~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~~~|||||}|~~{|{||||}|}|~|}|{{{|y{|{{}z}~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}}}|}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}||~~~}}~}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~}~~|}}|~~~~}|}}{}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||~|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst}~}~}~|~~}~~}~}~~~~~~}||||{yvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}||}~~}~~~~}~~~~}~~~~~~|}||{|uxyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~~}}}~~~~~}}~~~|~~~~~~|}||{}xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxry
}~~}|~}|~~~~}}|~~~~}|~~|}~}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqroxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||xxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{~~}y|zzz}||}z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~~~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}}~~~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyspvxqvtturstvinrotvnulwm{snym}rsvsvmnwlpylu}}~}}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpur~ozyymonzoomw}xpqzprtfu~n{ysoy}}{}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyrjoyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{zyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}z}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~}}|}~~~~~||}~{|||{{~
~|{}~{|{~~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||~}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|~{||{||}}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}{{{z{|||{{{~{{}{z{~||||}~}{z|z||
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~|}}}~~~~~}}{|{zyzzyzz|yzz{{{|z{{{{}~}}}}||}}|
~|~~
}~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>:=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<:<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÔÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÔÔÔÔÔÔÓÒÓÓÓÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕØØ×××ר××××××ÖÓÒÒÓÓÔÔÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¸ºÑÓÓÓÓÓÓÓÓÓÔÔÔÕÇ·¹¹¸¸¸¸¸¸¸¸¸·½ÓÒÒÓÓÒÒÒÒÒÒÓÓÓÛâáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A=>@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¢§ÏÓÒÒÒÒÒÒÒÒÒÒÒÔ½ £££££££££££¡«ÒÒÒÓÒÒÒÒÒÒÒÒÒÐßëëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>?;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤£¨ÏÓÒÒÒÒÒÒÒÒÒÒÒÕ¾¢¥¥¤¤¤¤¤¤¤¤¤£ÒÒÒÒÒÒÒÒÒÒÒÓÒÐßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;<<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©©¬ÏÓÒÒÒÒÒÒÒÓÓÓÓÕÀ¦¨¨©©©©©©©©©¨°ÒÒÒÒÒÒÒÒÒÒÒÓÓÑßêééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÒÔÕÕÕÕÕÕÕÕÔÓÓÓÔÓÒÒÒÒÒÒÒÒÒÒÒÒÒÓÔÕÖÖÖÖÖÖÖÖÖÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÓÔÐÏÏÓÓÏÏÏÓÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎЦÅÒСËÓÇ«ÑÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@=:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÒª¬Î¨ «Ï¬²ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐÉ
¦¤¡´ÎÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<=:6?B@B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѤ°½ §´¿ÉÆÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÐÕ¹¥ ÄÒ ÎÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÏÐѽÅÉÙ£¿ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÐÕ§¤¢Æ£»ÍÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÒÀ¢Í²®³¥ÐÛ£µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÓÔ¤ »¬¡§»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÈƦ½¡©¢¨¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKLA>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ Ôʪ³¥Ô¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÔ¯°³ÑÖÀ½ÖÔÓ¹ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÔÖÖÖÒÒÔÕÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢£££££¤¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¡¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9<<>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¢¡ ¤£ ¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«ª©¯¡¡££ ¡¤¥§¤©«¯¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®¯ªª«¤¡¢¤©§¦©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§¯¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¥§©§©¨£§¦¤¦¢¡¡¡¡ ¡¤¤¢ ¢¢ ¡¡¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]\PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§¬©¤¢ ¢¦¡¦®¦¦¡ ¡¤¡ ¡ £¤¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvxb_\UYQUW[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯««¬¨¨«°©¨ª¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[Z`_Z\V\hdncnjib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvyjb[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhukqhiiaYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µµ¼¼¾¼¼¾Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ¯³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÂù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^kcbnwuvnl[bQV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhakmfnuqruqg^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¦¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tklndomiqxnyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿¼»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦¬´µ¬®¥¤£¨¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrxsyff]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÉÅ¿ÃÀËÍÏÊÆÄÃÃÁľ¸¾ÁÃÀÄ¿ÁÏÏÎÇ«¯¶´µ« §´³®«¸µ³¬©£¡©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuuefijh]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÎÏÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÅÇÄÄÉÌÊÒÏÓμ¸¶´¸¸Á¾¾º½º¼º¼¬¦ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocagvhjitmxl]d[V`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÎÇÌÉÂÂÇÂËËÈÆÌÊÎÅÆÅÃÅÊÇÊÐÍÐÌÇÄÀÃÂÉÍÇÅÁÄÇÁ¼¾´°°°Á¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuntb]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËɼ»ÈÆÈÍÈÃÈÉÉÅÅÃÂÀŵÂÉÊȾÅÇÈÍÆËÏÅ·ÀÀÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfefcjdajmno^Y\VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ãº¸¹¼¾ÁÇÁÆ»¹ÇÐÊÄÄÀÃÁÂÁÃÂþ¿¡·ÁÁÁ ºÇÌËÅÈѰ¾¾¸º»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbacdcjbgc[ZZ\YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶¸´´µ¿»½¿¹¾ºº´À¸µ·²®º»·À·¼ËÔ·»ÀÁ¼»Å½»ÁÄ¿¿§½Â»z©ÀÉÄÀÀÊÀ±Á¿»·»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bchjgfiei^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¹¿»ÁÞ~ɼõºÇ·¶¹»½½½Æ¶`ÀÅÀ¿¼Á¾¸Æ¼Â¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxqmeefoiekhXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹º»¿¼ÐË}¸ÄÇ·¹¸®·µ¸½µ½È¬V|ÀÆÀÀ¿½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksfam`\TIKJDJBCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»²½¾»Ä¶µ¸µ·À¾Ä¼ÂÄÖªtwÆÏÂÀ¸¯µµ»Ãªy¿ÉUfµËÿ¿¾½ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢rflintnxcgb[cQKTHEECHC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£±¹¼½²¼¾¼Å¸±·¹¾ÊÊÈÃÆËÎstÌÑÌÊĵºÀÄÎq
ÁÇXZÎÆÂ¿Â¼ÀÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`bNIM?E@?DC;;::;:8;<:9<>::>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ï̼º¾¼Ä¾·½¼°¯¿½ÁËɱzuzÆÌËÍÊÆÂÄËÓm¿¾^XzÊÆÄÁÁ¿ÅÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶À¸Ëؽ¾¶¿À¿¯
vo{v´qy{¿ÇËÈÁÃÁÀÉËsi{¹´|aWhÆÆÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxsgp][^]YREDCMIAE=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶»»År|Á̼¶¹Ãg[c^P[_pov|º¿ÆÀ¹À¼¾ÆÂear³uaVaÁÇÃü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y}vlu{pni[_`YSPAFHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÅÊtgµ½¶¶njgU_[ILQS^os¸¸Âº³»·»¾½aZd ´w]TgÂÃÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ°µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsuvwnq`_f][TJ=??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´µ·ÇÆ|ti
¥¶bSE_QMieSLHPqx¡°·¾¹²µ²¼º»gUW¼~SPrÁÄÆÄÀ½¿¹³¯±¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³»·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca[^OHB?=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·Ã¹
znn oOIBkRC\{[FW¦§°¶ºµ´²¬¼ººtUP
·LT¿ÁÇÿ¹ºµ¥¶±¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc]fX\]RNNA>JBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸º½wr
~WFBWQKNa}~QCOº²³µ²´¯¬»ººf[x\q¹»½¸¶²±« ®¨£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmtil][jT]\PMHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ²¿¡}fL@UzpLJLN«oV?s¾¹³´²°±°º·«t
¥©©©®¸¯ª«¬£¨¬´§¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯µªcEVyRWHQaI|ccw®¹²¬³¯®¬·©¤©¤§¨ ¨¨¡©·±¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦££¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vzcwln\QhTPNGPMLBOQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬ª¹²¢µQAzwXkJUcivudjz²´ª²´®ª«©«¯§ ¡ ¤¥§© ¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ ¤ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uv}mk{dhUQcMJHGORMJNG<E@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡¨ °Á¹½|OKlª\j~qvS^oa`mh±¯®³µª§¡¡£¢¢ª ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wx|dyy`bRU`HIJKSTIRPL9?A67<65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¡ÃÁUVfp}vmfzrT_bdjlblp´°°¸¬¦¡£v¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´ª²®¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZZMQJNOULSLA7>C78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢±¥{mpbeWQ\UWKNUZTO_Yl´³«¯§¢ ¡¤lu¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸²´¤ ¥¬¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xujwu]lZR`HRUHFUVJBLG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡¡¢dZ_iaVNPF??ADEBGRLO¨¶ª©¤ya¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§ § §§¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmivmhm\X\CWNJGMGBFM<>L>4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£_^f`REE<K<F<B?>@AMz©©ª¥¢£}t¢«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã¼·³©³ª³µ¯³®ª¯£«§¶±¢°¦¡£¯±°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤{trkktrqhV\QFTHDJPI?EA4FH95;>7;<?<<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ vjaWND?L_~l_C<35K{ª²§££¡ ¥«¥xo¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÄÉÉÃÁƾº´ººµ»·°µ²ªº²®»·¿»ºª¸«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkchoxkeZ[FKLEDSMDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡qj`UIE@AR¤PG^®¬¡wrqmq¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÅÌÑÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÂÅÆÆÊÈοÈÑÌÇÅÇÅÁ¼ÃÁ¿¿¿¶¾³®¿ÀÃÃÇÄÇÄ®¿¸²¸¼Ãº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLDEPIDC@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £eXPLEDAF^¾Ö㣳®£yqroly¤¶º¹½ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÖÓÔÈÌÆÌÍÉÒÍÎÓÍÅÈÉÊÁÆËÇÉÈÆ¿Ã³³ÈÄËËËÏÆÊ¿¾¿½ÁÇÄÌÌÈÉÀÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡\LCDFDKUxº¸«¯¯¦ ¤¡}wpkebhqoq{
upnqtp
³Â½ÄÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÕ×ÓרÎÒÊÏÑÌÏÐÍÓпÈÇÊÄÌÌÌÎÏÅÆÇ¶¿Ê¿ÒÍÌÏÆÉÈ¿ÄÃÈÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨|xsvpc`drb]R\IJGAEIJ>;A8=4586;86:<@>;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥¢£^E;ABIZl®¬¨ wic`____^__]blutppolrquÄÇÅÔÖ×××ÓÖÐÕÔÚÔÔÎÏÕÔÔÑÑÌÑÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ×רÑ×ÒØÙÔÖÌÏÏÊÍÒËÎÐÀÆÃÈÆÎÍÑÑÒÉÌÍÀÊÌÆÓÏÌÎÈÄÊÇÇÈÌÊÔÔÑÕÏÒÌÓ¹ű¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£°sD@A?Sm°¨}pecb__a__a`_``_`fnppnkorwwËÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØ××ËÈÎÄÉÏÍÊÌÀÉÀÈÊÍÎÐËÐÎÎÌÎÏÈËÐÑËÎÊÂÉÇÉÌËÌÒÓÍÓÑÑÐÐʽȹ°®»¸µª¶°¨¸³¾»±
zvopokadnpaW\ZIFFDMXE;@=33<<87865;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©¥ªbgbik^^^adb```a``a^`_^\bmroostvvy¤½ËÕÑÖÔÓØÖÎÎÔËÎÎÅÎÊÒÒÏÇÎÍÍÔËÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÌÂÈÉÃÌÃÅÈÊÊÏÊÍÌÐÍÓËÆÈÏÍÈÇËÅÆÁÆÊÌÍÐÑÆÐÎÍÍÌÏÅÇÁ¸¹½Ãýù²²¾±»Ãĵª¥¢yqrkmg``phYXhVLFLIPQB;C>;67:8::57==A<:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨s¡Ãª|eabb`]^acb``_`aa`_][]grrqrspmry¤ÆÓÏËÐÏÓÔÊÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÎÆÑÒÐÍÌÔÊÇËÎÏÈÇÏÒËÑÏÆºÄ¿ÆÉ½ÂÇÉÎÅÂÈÀÇÍÈÄÌÊËÏÈÄÄÐÈÆÂÆÈÄ¿ÁÇÌÌÌÏÂÊËÈÇËÐÄÅÇ»ÇÃÈÉÂÏÁ½¼¿°ÁÉÆ¹½ª°²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»¤µsc¶¬
}~s`[^^^`^`cdc_]]^_``_[Z\akrrooklop}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈËÉÈÊÈÁÅÌÆÈËÍÉÄÂÊÉÁÂÌÐÅËÈ¿¹Á»ÆÈ¾¿ÆÏËÿûÉÇÈ»ÈÆÅÊÀ½ÂËÆÅľƽ¼ÀÃÅÌÅżÀÊÂÅÇÒÅÀÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÄÊ·¿¼º´©¬¤¥¬£¡¥£ {wrtfiZanlZ\XRDLFBGDLDFS@54334?=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾±°±eez¶z
vxurp_[[]``bcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÁÉ»·»»ÆÃ¿¼ÁÍÃÆ¾¾µÁ½Ãº½Æ»Âº³¼ÅÄ·¿µ¶¾¿»ÌüµºÈº¿¾ËÄÁÆÂÅÉÆÉÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½³·°²§¨¨¹°¥°ª¬zvwjdg`hocW^YJFJFHJAEBEI@9:648854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÀ¹Å½«¯\irx~{ttc\\]^``bcbbeeb]\[\^\^]Z[\^hsqmggnpry½ÌÀúÀ¸®°±§ª¬§¸´·´³³´»µ¾²·°µ¯²¼Â¼ÁļÀ»µ²º¾À¸Ç¹´»¶Á¼¸½ÆÁûµ¯²¶º¿´Ä·»´«¸½½À½±»¶°¶º³Å¼¶®»¿µ·´Å¼¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÇËÀÏÊÇÃÆÂ÷ý½¶¹¾Ç¿¬µºµ·¶ytxggebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÐÍÒÏÍÅÇÁÅ¿¾¹·É¶ª±\muzx~ww|sh]]]]_`_`da_dec__\[^\]^Z\[]_lpnhfkmnr|¤Ç¿¹¸µ°«§£ª§«³ª¬©´®·±³©®¦¬³¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶»Ç¹Â¶ª¨°²À¶¸½°°§²³µ»¼«®µ¦®¶¯»²°ª¹°»®»¸»ÀÀ¾¹Â¿ÇÃÅÀ¼ÆÂÈʸÅÇÆ¿ÇÄÃºÄÆÂ»ÆÉÌ˳¹Â½»³svvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÐÇÍÁÃÆ¿ÄÄÃÃÊÂÉʾÀ¼Áº²´´Ã®©°_o{x}
z{wn^]\\]_`__dbbccb`_^Z[ZZ]ZZZZ\enohfgiknq¹°µ®¦¤§§ ¥¡¥«®¤¨¢¬ª«°¤¦ªµ¶±½¹¯·¯©®¸´´¼¸´¼¯¸¹µ²¼Á²À®¥©£«±²³¨½ª«¨«´³¦¨®¡¤¯©²¦§¨®¦¨·¬±²·ºº¼±¼½¾¾Ä¿µÂÁÇÈ·¿ÀÅ·Äÿ»¿Ä¾ÄÈÌÊ¿¾ÄÀÀ©strji]aocWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?B;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁʾ»É¶½Ã¾ºÊ·ÁÃÁ´µ»µ°®´»§ªii{}~xt~|swe_]\\^_`^_ccab`a_^]\ZXY[[YXZ\_fkfdgehjor
©¥«¥ ¡¥¥¡£ª££ ¦¥¨¥ ¤¦¬²°¶·§°¬¨ª´«´º±¶¶®¶¹²°ºº±¶¥ ¤ ¦±§«¨¹ª¤§§¨§² §¦¤¦¬§¤ ¡±¬²´³´°µ¼¶»ÁÀ²º¾ÃÁ²¹¹Ã³Á½¿µ¸¼½¿¼ÂÇÄÃþÀÄ xplbf_ko`UY^HNgOTGEKF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½¶ ¡¦º¶«³³»³ÄÏÉËÂÆ¸¶ÇÀÌ¿¸É·»Å¸³Ä¸³¾À«µ»±«¤®³¡gl|yusomjjipi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggjmo© ¡£¡£§ ¤¦¢§¢«°±¶£©ªª¬¬¤´¹·°¬³µ®³µ®°ª¤¢²¤¦©¸¢¦¦ ¨¬« ¥£¯©«§ª¬¬±²¸¯¸¹»°¶¼¼º«³³¹³¾´¶²±¶µ¿¶¾À½ÃÁ»»½zsl_e^ddXTW]IW\KPGIJGA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÃÃϾºÇ¸¸¿·²Â´±»»«¸¹°¡¨«§k}xrmomkb^aff]]^]]]\]_`abccba_\[[ZZYXXWWXXXXZ^bddeffhikq¨¢¢¢¨¥¦¢¥ ®®®®² ¦¢®«§¢µ±²²¬¨¯²§º³¦¶ ¢£¡£¢ªµª¢£¦¥¦£ ¢«§¤¤¦«³´ªµ°³«²¹´¯ª¯²²³¸³®©¬®²¸±»¶º½¿·³±
yuf^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÂÌÈÆ¿Å¶ÁÀÆÎ·ÀĽ³¹¹³¿¶±¸º¬±´®£©txoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¡ ¡¡¡©¤¨«§¯°«£¤¸ª¡ ®¨¶ª¦§°¤¸°¤· £ª¦¡¬¸¯¢¡¤¢ ¡ª©¤¢£ªª°®¨´«ª§³°¥«®³±°¯®¯¦¨¨²±´°¼´¹·®£yud^aVYXSRTKM^LOKGGLLE=A><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾·½®§¨£ª»À½À¹®´¸ÁÌÇÅÂýŸÈ˲ÁÂÁ¼»µ»¼µ¸¹¯®¯© ¨}wqilrtphhedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bccbcbcdfi ¡ ¦¦¤¦§¦ ª¯¦¢¤·¨¡¡¢¨´¢¥¨¥°¥±®¬´¡©¡¢±±¢£¡§§¡¢¤¥¥«¤¥°§¥£««¦©®¯®«¨ª©³¦¦¬¯´±¯¼µ±¯¯ zwrea\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±¸¬¥§·»¼Áź±¹µÄÉÉÀÃÆÅǶÅIJ¿ū··½¶½ººµ²«¬§£swncafihfgifjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVUSURU``_`a_aacej¤ ¡¥¡¦¤¤££¢ª«¥¥±ª ¡¥«¨¡¬©©®¢¢¢£«©° ¢¡£¤¡¢ ¢¤¦£«¥¢¤ª£«®¥®²©¦¥¦¦´¦©¨³µ´¹º¯©¬rqo`[WVVRGQOHZ[ORJTKSLEFID8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±¾ÃȬ±¸Áµ»À»´³©«¦r{tiijlgjkmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]]^___bdm£¡©©«¨¬§¨¦¤¥¯¥¥¯ª ¯«³ ¥¦£¤¡©ª¡ ¢ ££ £¡¢¨£¢¨« «°¤·¥£¤¢ª¨«¯³·³¾µ²«¯
tsh[YYSUREXLQ[XMTNPLPQINIB=??A?=75799<<987:79:;<=>;7;;:=67:;8976989:6:=99576571141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»ÂȰ¸¿·¼½º²´¥© ztvwnmhmmmpggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_`d~¢ «ª¦®¬¨°¤© ¤©¨®¨ª¥¡§ª¥ ¡¤¡¢¥¥§¨¨ ±±¦±¼§£¬µ«®§°µ°¸µÀ±±«~rsbVTUNRJGVPRQLLWMJLNRGMKACFDC>A75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¥±·ª¥¢±«ª§©²±¤¶Æ´¹º³ÊŹºÁËÐʱ¶¸»½Áñ¯±·´³º²²¡¢wkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv© ª¦¥¬¨ ¦£
££¢¤§ ¢¢¦¤¦¨¦¡ ´²§²·¡¢·¬ª¤²²¦µ¼µ¬«±£ysm]NQQLOCMNNPKFNNJJNMQHMJAGKHHC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤¶°¤§¤ª¥ ¨¦¥³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬º½´·À¯©°¦º¯¬{n__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]aosvq
¡£¢¤¥¢s~{£
~~tz££ ¡£¤¢´¯¬¯¥¸¦¦±¡°®°»ª©¯ªwscVMROPNCSNLQLBPQHINRMHJJDJLFJJ=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764789::65:87A7x·¡£´¨¦¥¨£¦¥§¦§³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ«Ã§¢¦¦¶¢~x~eWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUVY[]ilrm
|tNXr_;Wo|s
y{}xqp
}¡ §®©©¨³¢¦¬«¨³¢©£~rn`[NSRWLDTJPLLFNOIELQMKOJILPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©¨£ª°¨§´Á¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©£°¢
}su]PLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tQB@}y`JQnx}
n~xuvxoQ{~xvgw}¤£¨©¥¤°«¡¤¤¦ª¢ª¢¦¨umf^[HQQSMIUMSILKOIHFJNLMTKQPOFIC<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶£§¡¯¡§¨¥§¨°ª¶¼¶··³Á»¶§ºÈ¸¶¨¨µ¶ª²¼¦¨}|wpnXMKMNOLMQW[\ZXZUUVVVWYYXXYYXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji\Ut|
{vxsovqtz~«
yzhv{prmxxz{vrrwhu
{|© ©¥§¤¡ ¤rha\]JWPRHJXROJLMRJJJLPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().1272198798775:<;7v®£¢´©¯©¥¬°²ª½´²»¸¶º´±·º²ª¬©¨²¯¡~v
w{unniYKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u|xfw}hyvx}r|w{ok~|s{}tfv|lohs}lyq}qmvqhq~pC
wwz
}{u}£¡¤womebZXXUQJSUTOPNPVKNKNOJQNHOOLFD<;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©±¯±«¼¸¬»¾¹³¬§°§¬¥©¤
zup{mtpiljXKFGEA@CDILLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX]eprm§ªÀ~uyc|xo|yz}omytxjjq~Inhw~licly
ksl|nr{imps{}~{vots
yxp|ninonXVXTRQYORTTSXUMNHNKMNKCHNGE?:89;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥°£¬ª¨µ¯®¬´¿«¼Â¿¦¢¤¡¡sz
tntkpldkjYNEFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\`§bitzepmzvtlts|jkMy
g1vsl~~tfet~
filukq|hqq|n|s}|qpnumwyujyyvjjoheXQZWYY[MPUVYXNIHEJJHGB@FDCG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,5775478iO8;5n¤¨®²§»¯«²°Â±»ÃÇyqt
zorpnodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ r|xl}mr
zyr¡txsu5q¨¡¡¢vp||sggbjnrlpuioXupwl{}mqmpzsunbv~
ux~}zqpok`[\^\YXa_RN[ZXWLHJFJG>BABG>CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µª®±®Á²»ÁÆ}n
ul{txxlwnwci^IPG>@7449;;;=>@BEHLLLLNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|~
~v¢y~aªzw~sz]drtz{wmhjbyoznwtzptywkni]w||
}q}uw{|vpsteg_[[^T\g^WQUX[UGJJDLG?F@DC>AA=:97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡}}~p~zgvkRWL@E211367688:<>AEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|r|z}~v¡¥¬©H®¯¯¨tm|}hghxn
q
Glwryvhmk_w}
zzuv|xmow}ssrl[]][ccXgf\UOPVYPDLKFNICFCCA@CA=988:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¡¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJLNQSTUTTVUSQNGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¡¥»±§»Çè¡¥|qv
ihotq
w{v
}nvuf¡ª¢zzyogkx~z~rjd^ZZ]j]af`YOKNWRQHPJDNGCJDB@DDA<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯°¡xw|mpj]BA4--//./02234778;=?BDHJNQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¡
lpuwqm
r¡¥µ©¢}kjk|sa]c^Zfk\lk^WKGOSQNMLFIPCDMFACEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212457;?CENPRTPQQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¥¢¡¢¨¨« ¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢xz~¡{w«³}¤¢¦¶°¨lsr||qh`\`^bgc`hg[REJKPOIJLFFMCHLFFCBGEA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}{ªªBD}x|
w_bP460-1/,.00//..0015>AAMQRSPRSURNSLEE@<>=GG@A@8662<9;FHGIJNOQYmw£§ª´½¸¤®¬¬§¨´«°¶²²»±³¾³Ã¬»É˷ÿ¸¥£°²¬ª£
¦¦ £¦¢ª¨¤
¤¡ ª¡¤©±£§·» £°¢£¤¢«¯³µ¢¤ªyz~
~g`h\eb]dc_ff_ZOCIHTOFHLFJGEFHAKFCFGA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1.-3?DAMUQRSUUWUN[PGGE<>>FHCD@8;<5C;=FKIGHROPW ®£³ª±ÁÇê³Å¶¬³¿³¸¾¶¿´Á¶»»¤¸Æ¨¶Éǵ¾¹´¨£´±±¨¯«¥v¤¡«±³ª¨®¶»²º¬¯µ¢±¬±µ¼·µ®µ §§£¨©°²º¸¸§¶©¥xuYadVeaac`af_[TJDELUQHIJDIGEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQcdWyuq}
v
{¿»£¼´y
zxn]V@EM<6:46AB764//6CHCQ[OQUWU\VO^UIKJA@>GKFED;>@7D7?BJJEFWTP^¥®£±´Ã¶¸ÁÌɶ»Ä½³³À··Áµ¿°·t±³¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¡¢¥°®¦«§¤ ¬³º¢©²º´»¾Ì¿Å޽³Â·º¸¿·º·¹¬¬°¦±ª¾°½»Â¬º¨®«}|jWbaXjejeW[dYVTIGGLQGCHIAHD>?BBK@@MC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYUZvjpnzsyb¸¡£{z||}xzueO\dGEL:Qca[^SF?;HPDZcQQYXZgYT``MSOEA?IJHEFA@C<E6B>HGJLSZT]¯¸µº¹É¿º½ÉÌ»¼Á¼·µ»»·½´º±Æau²¥±ª½ª¥¨«ª£¢²µ¡«¨®¥§¦¥£¢¦±´§²²½¶Á½ÓÉÊÓÆÂÅËÁÊÃÀ¾½¿»¼·´°¹·¶ÃºÅ½ÃȰ¹ª¢«¥¨¶q_ab]Wa_hfRXaVRUIEENKA>GD=KB=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]gllq
slrrsÕÀµ }x{{yt}zkepuY]\Peeb`ed][XW\MdmURmm_n_XgeUYTJDAKKHFIHHGBI9D?HKTTV\Z[¹À¹½·ÆÀº¸Ê˺·º¶¸¹²¸µ´®¶¶du¨p^¡ ¢¤«¥ ¨¥¤¬¥ª°¬·°½¹ÔÑÏ×ÏÉÌÑÌÏÎÊÆÀ¿ÂʽÁ¼ÁÀÄÄÅÊ¿È䤻°´¯«¹¼yl]_\X]`YccQ\`SPKCBEGE<@E>BHB@D=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi_polouu³¬¡¡
~|s{
{ts{xkmu{hreilifjih`fihlZnt¤¼g[oh]ZYTHKNOJKQKTQHLAJGKP_^bfia·Ç°¹³»¾µ±Äǵ°¹°°»«³±§ª·¬¶§§O ¦¥¡¦¬¯¨¯§³´ÔÔÔÖÒËÏÔÕÎÓÏÍÅÂÉпÊÉÊÉÒÇÌÍÂÐÒ¸°Ã¼Ä¹¥¶ºÄ¢nc\\]X`WXfZQ]WOOBBHEBI;AD>AG??B7;C>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeWshqoyy ª¦}
|p{r~qxukqx~q{mxslipmcinpxiw|~Ë¿Âß§mcxnc[a`JPRUNY^P^]MPNTQUU\nnvr¸¬´§°¶«¬¼À±«µ¦¥¸§¬®¡«´£±®§«¬¤§¡¬ÏÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÍÒÓÓ×ÍÒÑÅÒÖÅÀÎÇÇè¾·Ðzne]b\V`R][OPTPNH>AFABE<@B>ED>@?:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMO[u
wlwp}~¡¡
y
{r~yu
ovrks|{w|swqksrhoqzyr{¾Ë~²vrvhaj]CZZ[WfdXekSX]]`d^cx{~ª¤¤¡ ¡¨¦ª°¸ª¥´£¡¢£¢§±¦k¢
}
§°¡ ¡¤¤¨ÈÎÏÈÂËÑÔÑÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÄÃËsob`_XTYR\PJGIIJ@;:;EBD<BD>HB?BC;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xt{}wznxpmuvx~t
|ymvtn}vuy{¶<AÆ¥~|ieVICfcechjdox[_fiknin £¤¦²¤¤³ ¡¥¡© ¢±~
z~©£}ª³§§½Ãƹ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÚÚÒÕ¿ËÌ´xvnd]YRUPZVFGJJEE=:79@AB:HD@ECADB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTlnopaqqs|~
|x
zyqz{uz
zp|oozq|qnzuw}|u|°tY©Â¶pnb=^hrpqpnxweioruxr{ ª ¢¥¬}
~my{®ª§®µ½©½ÆËÈÉËËÏÈÃÑÊÔ֨ר×ÔÛ×ÓÙÛÖÏÛÚÑÖÉÔËy{hh[YPRS^HCEII>A>=7:=?;>H=?AAAD@>>:86DB755479.566435532323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqz~~||~wyn{{uz vutu}toot|
zv|·Æ¥ÂÉ·wpeNfczw¢xyw{|vm¦ £«
z|¡¼¡©¦¦®¨µ¾ÀÀ¹ÇÉÍÎÅÍÊÑÖÖÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÜÆzyghe`TWVUMKDNC;<=<9:<>9=@6=?@<?><9867CA6455=80665547745613854564567HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz|~}
{~
z{u}tn|}~t~|~x}ynt
~
|~z©Ã ¼£}}s~s¦
{hGp ¤
¡~¦¥¸¢§¡£®¶ºµ«¿ÆÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Ü·xxwkidW`[TPOHDMB==>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqry{z}|z|{~uyszsm~
}w
¡n¨
z |~£¢¤®
Wr«\¢££¡
¤³¡¡§±¸¬¥¼ÂÇÍÇÆÏÌÏÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚo|tgg\]XSWXC@ID>>>:49:;7:;:3;;?=>7;9:19G=:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxmb~nmwxyz||{wsp
zuvvt
}¦£¥¢¨r²§
¢ ¡©¯n·
ÄȲ¡¥²d¤ÍÇ
ª¤£¥©¡£³´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎrhc_]^NJTZBAGD;A=837;<:8=649:<:82?9:29I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:>:EMFHRWSRBcFu}|m~xz~z~vv|lny|xx|}£³§£ª³¡§¥¤®¢¸³¡ ¥¯£¤§§¯¤ À¤É¸«¢¦²
¨¢
t³¥¡} ¡±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ§ÎÍÓÒÐÖØÓÐØ»ryv\`U_WPHINEBCE5>:76:?;<7=42669774=5<5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89566=:JFDGN[\YIf`;Hz{n
z|x
~px|}}osz}{x§»¬¨²½¯¥³³¨£¢°¬´£¸¤¤©·¦¤£©©£¯°ª»»É¡i¶¸«°£«¾£^ª²|}´« ¡¡ ¥¯¨¡¥³¸«ÂÈĵº½»ÅÇÈÂÑ¡ÆÉÍÍÄ×ÖÑËÓ¡pzh]YS^ROFD><CAA8?874>F<<6<35355454B3::BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeGb`bpI@~s}um}}|pww{ªÂÀ¯½Æ»³´Á¼´«³·¨²®®¼ª»¤¨¹¸«¦¦¢¡££¨¯²±«¤¢¥¥£¹®¨À»¬²¹¥¤§}¬½°z§±¬ £¬ ¡§¦¤¢¤°²¦ÁÇï°º¶ÅľͧÇÃÇüÕÑÍÄÊtsb\Y_[MJBL@EG?A?B;:4>A<=5=6>333241A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\fF`igZ][{uo~|q~zz§´ÆÉ¿ÂÌÁùǼº¯«¹»²¶º²À®¥À¤«¯»¼ª«¢¢§ª®´°ªª¡°´§¢ººµÁ»«©²¥¤¨
ªÃĤz¡¦ ¯ª¡ ² ¡¤ ¦¤¦¦¤¯¥ÀÄµÉþ¶Î²Ä¾Ä¼³ÑÊȵtym\X\iSLHDLKKJAA=CD<5AD;:3=8B332263A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBfZMe\fTcjyr|xy¡¨º¾ÈÈÊÁÒÉÊÂ̼Á³»¾§º¿½¼Ä·¬Á©¬²»½ª°©£¥£¬³¶µ ¯¥¢£´¼©¨¼Á£¶¶¯«°«¬ª¦¥¥uz
££ª¥|£ ¢µ¦¥¤£¥¦¥£¨§¢²¬¨¼Àᥳ·ÌÀ¹®Ä³»¾Â¸¬ÂÃÂÀmyaXW\[KKMJFDDIBBACK:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddVw
¡®¦£Â½ÈÃÇÅÓÍÎÍË»Á·¯º¼´¼Ë¼ÃÁµ¶¼³¿¹¼®¯¨ ¨§¶©±·¢§¡«··©¥¯¾Ã±½¹³§ªµ³®¥¬¨ ±Å§|}ª¥¡£¢Z¥e£²¥¢¬¬«§¦¡¤¨¦¶«©º¼Äµ¥´µËÁ¸©¶¬²º¸®¨¸º½¸lnZWTUNFJSNK?AGDDHFG95FM;>7>AJ.32025B55PVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBqFiIRebLF¥¡©¦¢¯¾®¡Æ½ÅÄÆÆÎÎÎÒʾ»µ±º»¼¾Ï¶Ä½·¹·²±µ³¸³¬¦««¸ª¨§¯°£¯¤§¤¤´À°ª¬´¾Â¹À¹³§¹µ¸²®¥¯®¥¡tÁ~
±¥£©¡ `J¥T°¯¥¯®¬¦ ¥§¢´©ª³¼¼»«°²ÇÀ¸¥««±±£¡²²´¤qnf\ZNPKDPPPQ;GJIGHBD>9KU?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=QEWRsbWFHª ¢¨¯§
£¤µÈ´©ÆºÃÃÇÊÈÈÌÍÆ¾º³®¹¸ÁÁͶȺÁ¸µº±¯®²´§£ª³´ª¨¦¬¤®¥¤¨¬º¿¨«¶·¿Á¿¾¸²²Ã±¹½¬£®µ¬º¦¦v¿
¯¡¡©¨ ª¢§nv¢¢²£«¨ªª®¥¤¥©¢±¦©«º¶¾³²¾¹¶ £§¨¥§¬©©cea_RKMGHNIUL=LDNJKBCD<QU=AABDO18=77?B75UXN?HNQYSPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..R`MUHe^HE«¡»¯ª«¢¤££¶Æ½´ÁºÂÂÇÈÅÂÍȽ¹²¯¹´ÁÂʵƱÁ¼´º«¨¬°£¢ª´º¦©¦«ª¨¯§£ªª¾¼§¬¼³·½Æ¼·µ¸À±½À³©µ·«¿¥£¢ ¼ ·©¥£¡¨¥³¡¦¨ª¥¢¢ ´¯¥¥°««¬££© ©¤¢¡´´ºµ¨µ²³¢¥ª¡w`\_]JHFGMQIMEFFBRLJAEG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCpbGE§¤Ã¬¤©ª¨¦¡«¶Ä»¾·ÁÂÀÇľÍÇ»½¹²¯¸³¿Ãȵ¿¯¼¶¹·¦£ª¬ ªªÄ¡¤¨«¦«¯¬¢©¨¿¸¦½°·¶Ç¶µ¹¸¿±¿Á¶´³´¯¾£¤® ¡¢¥££¾¥©¨¬¡¦½¢£¢©«¡
¤ µ¬¦²§¯¨© ¡¥¤¬±¶±ª¥ª¬ ¨hbYa]NIGJNKHEDIA=PIA<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxecWL¢£Å¬¡¬® £¥ §©«¶±£ª²µÄýÀ¶¿Â»È¾Êȶ¸µ´°³³·Áƶ¾°¸´¹µ¦¬ª«¥£Á¥ ©¤©¯¢¦§½¶¦±¼·¶µÃ²³·¹¾²ÃÀ·¸®³µµ£¥¡® ¢©¨«£Ã©¬¦ ½¢¥««¬¦¡W¥¡ ¸ª§¶£²¡ ®¢¤¦²«©¡¢¥¥¤adZc`LHJJNFEAFK>=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWsHE6=ue\KN¡Ã§¥¢³¡³§ª¤ ¤©¬»°¨¬µ±ÇÄÁ³ÂüÆÃ¼Äʽ¯±¶°´¯¿Åµ¹±°¹µ¬¨°©©¥¡§Â¬¬±ª¢®°©¤§½·¦·º¼®¶Ã³³Â¿²Æ³º·¬´¶ª¢¦¤¬¢¨«°¯¯¼²¦ ©©¢¤¸ ¡¤¯¯¬¥§¡¢§´¦§´£¯®¡¡¦¬°¥¦¡
ae[geJILJRAC@IG;;G?99NMU^RSJ>O^]=HPBLLI9Mc]LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4¤ 褪²¡¤µ©²¬§¢¤²¬®©»²¬°µ´Æ¿ÄĵÀĽÉĵÀȵ«µ¨°¸¬ÀÄ´·®¬¶¹¥«±«ª¦»´¨°®´²§ªº³§º³·²¸Àª·²Â¼´Å§¾®·µª¨¬¡¦¥¢£¥¯¸®²µ¶ ¨¤¤ ·¢¥¦®²²¦ª¦¡¨ ¡¯²¢¦®¥«¤
©©ª¢§ xch]kjMPMNT=CANC::I@77QO]^RVQAW`\BJSHVKH:Td]NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05JpiVCWFyfC;¤¤¡¦¿¦¨¯¯¡©µª¹°«£ª´·±°¹·¯¶¸¸Å½Ãǽ¼ÃÁÆÀ¸ÁÆÁºª¶¤»Áø¸ª±»¢°²¥§ª¹© §°ª °´²ª©¶µ¬¼¬²²¹·¬¹°Âº½¾¦Ã«°·¯©««§«¢¢ ¡±¯³«±º© ¦¡·©¥£¢¯±´«²¨« ¥¢£³°¥ ¨¡©¨§£~
jhlalnWPQZTACET@;;IA7:XPd^PVWDY^]MLRN^KJ>Zd^NHPN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1647gY`F(?8l}h[V;{cC=§¢©½¡ª¯«£±¸©¥µ³¬¡µ½®³¸¼º½¶¶À¿ÉĹÄÁÀÀ¸Ä½Á·¯µ¨«·²¼¿¿´©®±¶«¨§¨§»¤³«¢±°³¬©¶´µ½¯±µ¬°µ±ÀºÄ·«¼¯±¸«ª£±¦¥ª ¤³ª³ª«³§ ¦¤´®§¢®±§³²©¤¨¤¡¨µ© «
¦¥¢
{elrgpr_FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWM=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aU150=`V^8)C3YU\gK5zfL@¤ ¤¬·¤¬©¦®®¶©¯´º§¦°·Å·±¶¾ÀÁµ´ºÅ¾ÌŹ¿º¿¹Ä¸Á¹²µ¬ªº¶»¹½´ª°µ§«ª«¬««½«®±£« ±³®®¶±¹·©®±¨µ¯³»¼É²ªµ´±´¯®§¡³ ¨ ¥²£ ¦¯¡¤¢¥§²©¢§²¬ª¶¥¯±µ¯¤§¬¸£¡«¥¡¡ z
{knxnu{`EajYIHY[={JGE6AbTi[M\`J[]ZRRRb`LKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C^Q\.*B/JGP[H3cYUKD °¨²©¥¤®®µ©·´¸¤«´·É»´ºº¿¾´´·ÃÀÌȻü¶¾¾À¸¿¼±½®§º¹·¶Á¶«±¸¦®«§£±ª¯»¤¬²²§¨£²³°±±µ±¸³¨®«±§¸¯µ´ÃŶ©´µ«°ª§£¶§² ¤²§ ª©£¥¥¥·§¢²´¬§±§®°µ¬¥ ¬¨©¸¢¥ §£ v{
mqwu|~\Kel\KNc\?b{GI8GgWe[M^bMXYWTXTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'FaLV%-B.=EMQ<3rkJDC¥®¥®«§¤°²³ª·°¶«µ¹É¹®Á¼Â·³±µÂÃÎÅ¿Á½´½¿¿º¿¼³Ä¨©¹°¶¶¿¼¯«³² §°¥¥°¥²µ¬«²°¬©¨´¹¬´²µ¬´©¬¨«©¹±±Ç¿¸¤¹¯©¦¨°¦¤¤®£©°¢£££¬¤ ¢ª¦¦¹¥¬µµ¥ª«¨¬¯¶¯££¨ª ¤´¢ ¦w~
||}qtr~}}\Sdo^NZf]FD[H;NmXa[M`bNVWVWTYg^QRLcZ[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HdHJ+:I?3BIS,>k=HHªª¢ª°¤¨¤³´±´µ±±¡«½Ëº®À»Ç±´´ÂÂÑÅžÀ²¾Á¼¿·¼Ä§¬·¬³¸»À°«² ¤§©¨¤°£ª±ª¯¬°®®¬³»§¶°²©²©«¥¥£º¬ª±Â¹µ«¹¨¨¨¬ª¨±¥ª¤¢®ª¨¢£¬¤¬¢§©¢¦£¬¸±²¡©¢ «®°¬§¨©¤ §
¤~|w
tsqvl_Y`ncQsq\K;|F>WuXaYNc[NUVUWP\b^SONhXWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<]J0.IgDF8<B05EKX1@[>MF§¢ª²©©¯¶¬¸µ®ª¥«ª½È»°½·Â¯°¬³ÄÃÎÎþ¿´ÀÂĺÁ´ÉĬ¯·²¸¿¾³®«¥§ª°©§¨±¥´®«°®±¯²³»¤¸³¬¬®§«¢°·«ªº¶¥µµ£©§¬¬ª¡©§¦±²¤¦¦¡¡¬ª¡ ¦¤¢«¤£§±·£¥¢©ª®©¢¥¤¤
£¢|zt~tw¤yk^`ngWedN@gLDbyWbXReTMVUUTO\]aUKMiWUWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D@HHD¯¤£ª°«©µ«¶±«¥¬ª©¼ÀÀ¸¸³»µ¥²¯ÄÉËÑ¿Á»¹À¿Â¹ÁºÁÄ®²µ±³»À¾³±®¬««¨¶ª¥¯«¹°¨±±¯±«µª¶µ§´¶¬¬¤©ª£³³¨¨¤´´ µ¡©¨«¨«§ ««¨¹¶©ªªª¢© ©¡ ¤¢¦£ª¦µ®¨¦ª¢£¥§§ª¢¤£~¢txu{x~oqggqx\`sjO]VHmxUdVRbPMUTUPOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Qc02?f=NX?C,>LT_/Ik7PE;° ¥ª«¥¬®³´¯ª¥¯©¨º¾¼À°®¸®¡µ¯ÉÇÈÑÀ¾½»¼Â½ºÃÁ¿¿®²²±µ¼¼Â±²³ª³¨¤µ©¥³³¹°£®¶±¯²º«¹®ª®µ«ª©«¢ ¶¨¡¯³¡´ª¨§ª£ª¡¢¬¨½®¬®¡§¨«¯¡¢¡¨§¨ª°©£¬¢¡¢££§¨¥}
¤
xt}uxy{ttzi£ui^elug|RXp^JxsSdSQ^MMRYfNLVYeYFSiRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,52#2)',%.;.&1.0-14%,0Lh:48_=ad?F1CP[[+HO:VB4± ¤¦«£¦¤¬¦´³±ª¤°§ª¸¾Á»¯§¹ª§®°ÉÆÈѼ¿¾¹¾¿¼É¼Á¸°°´±º»¸À²³»¬¸¬¢´¦§¬²¶¹³§§»µ¶½°¼¦¬µ«©¯£¥¬ª§ª³¤³¨ª§©¤©£©§©½ª³¯®©¤ ®²£¤¤¥¤¨«¥ª¡¡¥©©
~}
¢~qzy~|iw|zuqq}hxd`hcr
zmgy]^VBWzmTaORXKLNqt]HZ[gYEUfPD>JNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH1%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=;EZ?*±©¥¤¡«¤·²²¥¨±§¬¸Á½µ°£¹¨¨°ÃÉÉÌÁ¶½¿µ·¿ºÈ¶Ãµ´³µ±½¸º¾¶¹µ¿¡³¦ª«°µ¸´«¼¼¨²À³º ¯³µª¬®°£¥¨©¢¥±¦¯ ª©¨¢©¤¨ »§°®¡«£¤®¦¡££ª¢¤¤¢¦¬{|~£|yk}vyxb{zqpqsxisjgdhaosmbip`pA\xkV^NQQJJMSYVM]^mWDX`O^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*K>*49&'.34.0+/4&,:$40BhY13S=e_DL6KWeO*<2P[=#¬§¤¢§£¸¯®¢¯¯©«¸Âº³¹¯«¨´ºÇÊÈ¿·Á¾¯´¾·Ä¶Ã±¯º²²Àµ»¾·©¹·½«¤´§¨ª°®¹±ª»½¤°Àµ´¡®·µ¦§§±³ ¤¦§¡¥§¨ ©®§ ¦£¨ °¸¢±¯¡¬¡¬¤¦§©£©¦¨¡ª}}|¡y
}{so}qst`yxiopqojrczlifdaf`[rjrMMiXZMPLJHPRQIN\_nSDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZhH*>/ZY5(¥ ¡¤¡·«±¤´´©¨¹Äµ²® ·¬®°µÆÈÀ·¿Á¹°´½·¿»¿¯«½°´¿±½Ã¹©»º·§¨µ¨§«°³±§½·¤¼¶¯±·°¨¥§¯± ¤ £¤¡¯¦¡¢§¯¢ ¢¤¤£·°¡¦±«¬£¯ª¥©¥¦ª¤£©¡z~zy
~zzprwnot_xwdllljimerikfi]ds_ZkuiZI}^[XOOJHHRUF29_^lPDXVYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42*;+139cl84GAf[HTDU]hE.;2bU,2£¡ª¥¡¢ ·ª® º¸¦¬½Å³¯®¢µ¯¬¯´Ãļ³¿º·°³¹¸º¸»®À³´¸¯¿Á¸¬¼ºµ¦¢³ª§©³«²¢Á¶¥¨µµ©²»ª§¦©¯¬¢§£¦¢²¤¤¨©¢ ¥ ¤¹¨¤§®§¥¡¨©¢¡ ¡«¡£¨¤y|
}y
{w~{ltrllsaxthhjgfo
gghcfij`ibifZe{c`SsT[[SLIGIOS@!*i^jLCVU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,>0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB379eO'2¤£¤§£µ¬§ª¹·§¬ÃÁ¶°¬¢µ®§¯¯·ÀÀ¼²Á¶±®²¶¶¸·¶¬ª½³¯²±½¿·®»»±¥¶«¥¥´©«® «¨¥°³ª¬µ»¨ª«±¥ª¦¤¦¢¤©¡¢ §¶¦¯ª®¡¡¡ ¦¡ ¥¬¢© y
w|{r}}fxokjlguskcgdduadffejjcjqY^X^mdaNhWZ`VIGHKMRX>9`liGBTS\[IIGEA.<?9A89RG@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3AfH%5¤¡ ¤´±¢±½·¡±Æ»¹°±£·¬ª®©¹½»»À²¯®¶¯³¸³¨«¹±¯®´¶»¶¯¸½¦µ« ¡°¥«®¤Â ²¤®±¯·µ¯®¢¨ª¥¨¥¥£¨ °¦¹¨®£¡£¤ ¨ª§¨§|t
|ofynhkjgqrk\hcbraehjnlgjifl\lmuqaTbhdeYIFLMOXQQVaeT@VSYUFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1IeC'4¢°¡©²°¸À¶ ´Â»½¹±¥¶¯¨®¥·¸··¬»¯ª«·ª´¹®¥³µ±®©±¶¶°²µº§¨¶©©¢ª©À¤®°¶µ±°ª¢£¬¨§£©¢¤ £«ª©»¨¤ ¡k¢q¤v©§ ynj~wql}o^c`gkuw~fhuifW\isnNPjcfqg_dfnli^__gOKD8ETg^JGPPUUKHSaoteF[QUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:176Xl16Ok[N\K[fb>G1Pd=+/¤° ª®«£½Å¯©·Â¸½¼¦¶°¥«¤¸³²³°¹ª§¬´¦°µ£¨¸¶µ¨§¬¶²®´³¢©´«¢¤§¨¬»¦¥¯³¸®¥¨®«¬¥¡ §¦¡¦¥§§ ¨ª£µ°££££¡¡¡¥¦ªrx¡vif}sx¡o~{¡ {tvlmheczlqbTmcliqXjonX^i[kj[pmyrhZ^FN>F^MERVVQQRWTg^LXJRRPEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Wa7/(¦¬ªª§©¿Ã®±º¼·À¾ª¤·°©¬¦²µ®¯³¶«©¥±¥µ³µ¶´¦§©³±²§¯ª ²¨¤£¡£®µ¤¥¦¶½¦¬§ªª¬¨¦¢ §£¦£¤¤©¢£¥¦ ·¤¤ £®©¢
±¤¬yÔ¨ÁÇyw±¥·dÀ¿yy|Êq¼Å{r¶§ºzl±«°yhkX±®oei¼¼nhymrØ~Sjc¶²qu¡ªWOWaOVNFT[XQPR\W\P@]EQNEGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1\]41!¦¦©¥¬²¨°Â½²µÀµ·¾Â«¦´©§¯³ª¯¶´¨¨¦µ¦§¸¯³²¶ª¥¤§±®±¦ª§¤±¤¢¡ ¯¢´º¢ª¨¡®¥¢¢¨¨ §§§¡§¢ °££
¯jjª~geq¥q®¡¤~w»|k¡v±_j´[¥f`fzfjxj©e¾rg¦v²j|±xtcmm§m[ EigEu`}g{¤§Y_«ixzj§7J¯[WTlc[KNW_\WV;NOWV/ITTJDEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¢¬§¥£¤©±·¬³½¾°·Ä²¸ºÂ§©°«¯©©°¯¤°º°¤¥®³£©¹©³²°£¥ ª¯«¯¦§£¢°£¦¡´³¡«¢ ¢©¤ ¡§¤£¡¬¦§ ¡
µµx
©µw³·~¨~k¦z
w«gk±[¬{tpx °vwqkkl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¡n[Tkg`LK[dX\ZB>°xWXA#MiECDA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J9aU50³¥¦¡®©§³¬©»¶Â°¼Â¸·Áª¬®®¦®²©¡¯¼ª¡§´¤«µ¥¦²³§£¢¨ª²¨°§¥¯¢¤¨µ¯¡©©¨ª ¥¨£ £¥££«¦¢ Õ¹p°Â~Æ|Ö»|¥¤{¤¥z¬yV¯{~j¹Z¹w}¦|zªy{±mt¼
oP¯§ÅQ zc`ªbsrl`Sµ´È|c¤3Bv]QjhcP@XfZdaJHMlK[SOYfZCD?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DC./0483+-).323971#%5*>3==Qwj6*Yi[K\P_fT7G:aQ72%¢±§¨¥³ª¥´¨¤»·Á°ºÀ±µµ¼³µ§±°£°³¦®¶¨¨¹®£¯± ³´° ¤§©°¨´©¤ª¡«¨°©£¬¢§¡¥¡¡¡¢¡¢¢§¡¦ §¡²nhµq«o¦r´sr¶{¤¢~ ¥~°vÒÑv\®|¤oª¦k
}}{±sx³etofRÈZÂ\yb__vsb^YÊo¿uMKµSUÆdTQjcfXAOj_liOUFI9=WR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746A>/.24252-).26,742&60;5:=Pqh9'Wi\BNT_eP5G=aM62/¡¥¯¬¤ª»¦´¥§¶»¼²º¿·¶µºº³¥´´¡±²£¬°¤¦º®¤±±´¸ª¦¢ª¤±§¬©¤¨£¨ ¦ª±¦¢¥¡¤¦¦¦¡£ ¢¥¢
¬{w¨v£©o§¡¢®
³\r³R®}¤q×}w
w¯w´aelZ°XKuyf`^vwgk^¯wxl5yÈ®²_ATo^g`EPl_qmVUM.eciSYQ:AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:88 ¸°´Á¨³¨©²º¸³¸¿¹·²¶½µ¥¸³´¬ ¨«§¶«¨±²«®´¤© ¨¡µ¦¦ª£¥¡¢¥§¬¯¦ ©¢¢¨¥¥¨¥¬¡ ¢ ¦©}}¥x¡ªp§ ¡£ª|yo±Z¨ ytØvt§¤|{²^d ~l\«[Zhgªcr{kq]¬Z kneOJC¡\ZLt^beMZa_rs_JU6JYHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.;>002144+*05/7,&21($$6671<PeeA&Uf[?1U_bL7FI_C1>8¡¾«´Â®«©¥´°¸±µ¿¹º³±·¼ª»´°¤¥§§ª±©°ªµ¬«¯¡¡ ¦¤£¹¢£« ¢ ©°¯¦¨¦¤¨ª¦©§¡£¤¡¡¡ ¡«®mr´r©v¦s´xs³¤¢¤w¸o{¢kk¶Z
ei¡¢§mr´t²j
ju³af¢oj\`M¡|Rs£ly~op\¯V<wfTon.\§ObRkealYb\`p{cSYQ>>mp3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;<010/75,+,426/#00,,289/9N`eD'UdY>/U_aL5FM^81B8¥º¡²À®««§·©¸¯´Àµ¼±¯¹¸«Á¶©ª ¦¤¡ªª§¶£²¨®ª § ¥«¹£¥£¡«¶¯§¬ª¥¥¬¡ª²¤ ¨«°¡£¢ ¡ª«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxnqn¤t½]w}[ay¼kZV[jz^j`dfbmwoY[YCA@r?CG+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¡¼¢±Ã°ªª«±§¹¯¶Ä±º²®»°®Á²¬¥¢£¡ª¤ª²¤´§¤ª¦¬¸¢®¡¥ £¯¹°«£¨§¤¤¬ ¨«©£³¢¥§¢¡¤° ª
¶¸xµwnknsnysÁ»½{²¨pt¸|{|¤»¹½uz´£tvut°ufiµtrpw¶^y}hymyb¬pu
Y[§jDdYSf`c]cQgfqluBNPLD;ZL>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbV8*O]]=+:VV'=;<§ ¿¥´Ã´¬«§¬«©»®°Æ¯µ³®·§µ¸©£¢¦ ¬¤ª¦µ¨¨ £¬¤¾¦¡«¢¢¨¢²µ¶¤¤¢¦¥«¨¤¥¡©¦§£©¡£°©§¢j~i§xs~tzez¾¾Àºnq_rjZ^adk`cmvbke^`cqir}gj~rtx}}b[wthP\n|{kXlzrIJo
pMtMEW\f`L[Xgc^O[muiqRODEM;HI<L?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P^L(3=[O'?2>¨¨¡Á£´º¶£¥®§¨µ±¬È¬°³¬µ£¾±²¦ £©£¬§®¤¤µ©¥¡§¨¾§©¦ ¥©§°²¿¬¦§¢©¨¤«££§¢ª¢°¦ °¥¢¨£¤§£gm}qw
µª ¢¡z¥
lj||tqxyvv{jstucw}vkp{m`c\pgMYYej_WZozmmfSOFS9OZNRO(+:JB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@² ³¢¿¢¤±²· ª¥²§¥°µªÉ«±¥µ¦À¨´ ¤¥¤ «¦¬££¶¬ ©¥À«¤¢¢§¨§²Ã¯««©ª ¬¡¢¥¯¦¡¤¨¦¡° ¢¦ ¢£ |ª¨{
¤f¡³¯
vz|vyzogykuyrhszvktcyf`idbdfjYk{pij\SLPD_UF@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¾¬«®²² ª¦±¢¬³°Å°ª£³®¼¤´ ¦¢¡¨¦©¦¤¦³µ°¦®¾ «£¡©©¬¢³È³ª¤«§¨¤« ª®©¥£«¡ ¡¥¯£¨¥©f|e~cylhkz¤«ke~g
eeihz¡kh¢wkj£slnzzXe^
^lv\hswwnxxsmytw{j
Y^ktd]shj|qlc]QMWJdX@J4=F7?FD71<=?AC;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯¬³±ª¥¨®°¦®°½±©¨¤¯±£¡¦«¬£¦¨©²®£¢¯¦¶¹¥®£¡ ¥{¥¬¢¨³Ã·¤¢§¯£££©¨¡ ª¯ª«£ª¨¦¨¡¬¡¥°¤ª¡¥«~¾r´rhx¹Ä¸q¢£{¦sª|ËÀÀ»q¢|À½ÂÁ{{ÃÀ}k¥±ooÊzwwzyqzqx
ymvbf_xd_db^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP/#F[3PY/UAB;/8£¸Ãµ°¯À©¨£¯©°¯¦²µ¯ª¦¦¦±««¢ ª§¢«¢¥¨¥¤´£¢¦¬·³§¯¢¥ ¡§«¤«¿À°¡©¯©¢¢£ª£ ¡®¨¬¦£¢§ ¥¥©¤©ªª¬¡¥¡£Îyz¤y_®^§¢ |§t«¯^c©z§
t³c«¡³j®t}¸aY£Ínu{Ú{p~ve{vvk}n~
~m`qkpg`_xd[phjdf`RTRW^KOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1ÂÀ¿µ´°¸¤ª¨´«¦²¬¬¤«§°ª §¥¢¯ ¨§£¥¡°¬§®±«¨¬ ¥¥¨£®¤«°¨ÀƳ¨©±®¢ ©ª¡®¯§ª©§§¤¡«´¦¢«ª£§¦¡° §¡ p
u¨q±|q¬~¡¥w«}r~«vz|~ª¢~«{{VÄzoÁ}mupmeveoawnromdotup`gmd_oiinfcWS\aZRSC9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+°ÔÆÆ²´£££¡¯¶®¨°§©ª¨®««§¢¤¢¦«¢¥ ¨¨¢°¬¨§¯¬¨§©£¢¡¦£¯¬£¬µªºÍ±§®¬¢®¬ ©±©©©«©£¢¬¯±¢¨¬®¦¦«ªª±¢£¥
¤j¤uz©tz²p¥q ¤``R¬®v®¦z{f£¤£}©~®^|©U¢z¢{ïÅs¯³³¹qb©¯Âthmomywwolfdeqpf{hc]W`jXXUMMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799674,&$" ('"+-"$.!3-&@DWH,G+66*1PKL# A9D4,'ÃÉÖÕÀ¡«¨¡¯¢°µ°¯©¬£¨¦ªª«©¤¦ ¤¥§¦£¬¢«¡¤¯¢ª¤µ°¯ ©§£¢¨ ¦±¦£§±¬¶È²µª¬ª¡¥³¡§««£®¬©¢¡ª£³¢ª³±¢ª¨¯°¶£¤§|ªlu«y|°o¤Ò¸´¸É²__©¤ yxªÉt£§©ÆÆxe¡¥s}¯^pµc±uK£m§Gd|ppzt|{m[fjrqfj^bYcm\^YIMLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/>-5OTQ;<F2,$§¤Áƹ©³®¬¥¢²¹¬ª¡¦¨¦ª¬©¦ ¦¥«£®«¥ ¬¨¥¦µ¢¨ª¶²¬¥ ¥§£ ª§®¢£§ª°´Â²³ª¨¤¡£®¦¡¥¦«¯¨¦¬£·¬¡²¹¯¯§³´³¥§£Nxz£|¤§¸{|y¹~ÌÆÂ¶x¡}v¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu£|~tzs~p[mnwrjoZd_hnbd]KMQTBIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©¬¤«¹«¯ ¡¬³³¦ ¥®®ª§¦¦£§¡²®¢¨¦² ©¤¢µ¢£¡©´¹¤££¡²§¦¡¢¯®¤¨¢µ²Ã±ªª¦£¤¥¥¤¨®¡®¥¦°¥¼¡··µ²¹±³§¯¡£ÑµÃ·y
¦x¢w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{}n©a¢qqbs²¸hx¦~w|ymixixsnt]ddnmfh`JZXX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUVVTQOQ[U%!2AH$)%s¿¿»ºµ¨¤µ¡££©§®ª«¥¢¥ µ¦¢¨§°£«£¤£ª´´¤¥©® §¤§µ ª£¶«Ã°©«©¢¡ ¦¢¦¤¦«§¢¥§¾¬¾°£°³º¬´§¨±¤§z¨}|°w¤¥m²o¡|¡¨¬
®
© ¡{~«ªx y¯]£|¦§d|tk¯]¥kq
]`[ n¦zzklb}tmz`geqohghCY`[=KT2U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa^][ZWSPONI7052.*,ATVVVUTUUUUTTUTSTVVWXVUUQHFIJ#((½©ÆÂ·Á´®¸¥¤¤£ ¯¯ª¤¹ ¢ª ¯©¡ª¨¤®°¬¦§¬¢¡¦¢¥¨¦¶©À¯¥ª¤ ¦¥££¨««£¤©¨¾¤Ã¬ª¢¡¬²º«®§ ³¯©ªv¯~
}ºe°e}¡¦¬°
¥¤¡¡
[lj³`{{±lgn°[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m¨{x}ds}bwt|ajfqnfeeOUc[BT^>I(>9=4!",%2. *1/045799<ACFHJLNPPRTWZ^_``ab^_\[XUPNJGC553./@UZXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Á³£¦¥¶¨¡ ³³©£ ´ ³¨ª«¯«¯©¢¯¬©§¢§®¨¢¥££¥£©²¨¼¯¥¨|¡ ¨ ¨§¥¥£¥©» Ƨ¥©¡«´¶®§¼¬©£¯¤¸Ãº
§¬¯¦¥ª~սªb£¿½}~£×º¸µ
½¾j£o«mz²°Çj«°½xw¢¾»t¦yyc}zdfy{`kekjbPb[Sj\@TaBN)=:4/$%2 $(0496677;>ACFGJKMNNQTW]a\__a^`[\YTQMIC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³´±¿¹²½³¢®¦¥³¦¥¾©·±¨¡¿¦¦²±¹¨®¥¦°¬®¦£¬¡¤ª¡£§¨¡©¢ «©¹®¨£{¦©©¨ ª¦¡£«»©Å£ ¯£«³µ«°ª »¨¯¯suª¤·epgmow¤u®pq§£®¤rmmmexomqyiqigqhigpd]cjoY]g~w¦`bqofd¢|ufwhjy~ydlcflbKdXJkY:QeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³ªº¹²³«©¢®£²©½±ÃȾ¶ªÀ«¬£ §¬º£¤¬¬¦®©
¦ª¢££ ¤§©£ª ¥¥§¯º«¬{¥§¨¢°¦¢¬º°Á§¤³¦¬±²««§¹¤®¸¡¨¥¶¢©ª³£« ²¢¡ ¢ ¤¡«¦¤~gtvtq§l{ phvpwv|zjlddocU`X@i[HcaOZ+F=+&!740.!%2(*699469;>?ABDFJKKMPPQWTVY^_ac]^UQJED>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥µ·®®¢°¤ µ±«Å¼Ä»¸ª¢¥¥°©£¶§©´¦§¬¢§¬¤¡§£¨©¦¡£§¡µº¨«|¡¥¨¶£§¬·§¯Á®£·¦¯¯°©©³¹¡¯½¦£¦¶¢¦©£¬¯¡£±¨¯¤ £©«¡ª
~fuvysj}¡ yqryq{jnd_pi`[`YmcP`dP[:GGD=2==7.*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]__]^_`aacaaa`bbbdb\[c¤¨£°³¬®£©§ ¨µª¤³»¯¬¬¢£z¢±¤¥°¨¸¦¢ª£®£¨ ¡®«¨¨¨¹¶¤¥y¢¨¸¤¯µ¢°¯t¤¾£² xz©²»v¤ª~d\bv¤~n³£§®«¢esyp¨l¢§e¥
wkvq|ai[vghr{¥dywinykpe`vokkh[febboS[>NNNRG=@TB91/&4:316678<;>@ABFHBFFIKLSTUY\_hfgWQJ<DG;8UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥¨£§¤«µ¯±¦ª¦«s¯¨ª¦¸ £«£§¢
u®¦§£º´¨ uw ¦²µ³¼§¡~§¢z¢®·¦
±©¯£y¬¢§©¨v¥z¦{±z
cympyq
txht t} ~j
kx{qpgdwnilk[ekjes[^ITLQ@E5.YTU6)!09=>643568;:=>>@DH?IEJKGRXZY[aahfYQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°¦§©¥®Æ½°¡¦¨µ«¦¡¾ }
«¢ ¡¨¢£¹²§
pu¤¬´´Êª®·
°±®©¦|¨r{w¦h¤y´¦¨Â«¡q¤}
±¡|¡ |
ms
zr|t
Åf©£k¡p
hwt{vghupggl^colglXgG]QL2E46M`c7&3<DGD:64658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@JdY]cfhgbbbbdc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹°ª«¦ £¤ª£¤©¶£¯ §¥¼ y«¢
w ¤¢¸¥bm¡¡¨~¡§ ® «¯¤ª~¢vj«uM«x¨§ª«}¡{z§ikg¶}n`dY~{dhr}yl]{m_Sp\_ly`Ye}q§ªk£nr¥piel[m{eY_bWPovemtrjjo^jomliXiO]WE9A4GC^k4,ICQMN=84859;6@;;>BO>QRLMBJ\]_W^_cv`MD:MOMTb\\ffiibbdbddbab`cdcabikdbddgdbgeach ¹¡ª£¦¬¡¶¼«®¢ ¡¥ µ¢¨ ¦´u¦
¬¤¨¥°¦¢in¢ ¢¥£¡ w§¡§©
¥y}}¢przym¨|¢sv¦f~v¤_z}s¢n·´ºsµ¨dƸ{p·q¤cs¬«`}j³~n}q£ls¤s¤_³p|´ts[²jbosuqhoXklrsf\i^bKD=D5QAYq3=SG_JR=<395::6D;;@IP?TMNQ@E_^[ZW``|dHC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¹« ¤¸µ® ¢££¥®±¬ ¤«x
p }¨ ¢¨¨¤~k{} w¢ r¢©¦¨«®}z z£xs} ¦¢d¡|lhn{§}rhs©sªg]
vhªj¸f\¨pa^§vuhunl§\¨~w»k~ª[]´g\nqywki[qjxyb_fXbAPEN7VBRn4KZZ_NZC@151;;7H?:CGT?YRY]>Db^V`Qac}iEB9N[]XdfXfgnmbbe_aa__``ec^bdoq_deekecihgkiª¶¨c¬º²°¬¦¨®°¨«¢¡ £jq{z¤
¨£ iy{¢ ¢rhp©£¨ ¨}°£¢¸w£³¢£xz«¢q¡|
¯µ}k¡x~´££«¨||~sªZ]o{xbL~zz
cyBMY¢jq|muy±³§umq|orj¤]vHec`sp}}ne`lhv|cdaQ^V]TV@YEQgDSW[bX^ID=B8?B:IE8LDWAVQ[VDFb\Z`K`m~qEC<U_bZejVghmobff^aa\]^ahb_edvl^egfkdflihki±®S_ §³¹³³©¢«©¡«¤¡¨¡w
ny
|r¡s¨|l
q¡x
|¤¡£®}µ{¥z©¡}§hvm~t¡sq|
o®}¤¦£o^¨gu£co¥aÓ|zxrsc£
~¢r¢uk³`sª²¨¼wm~¾¦©´^n}qos¢r]£gt¦ah¦mÔ|owykzwsm©¤g`eypkgfdmuxg`bS[eQQbIWIT_WS[ej\dPECKMJKBJE8P?PMWSXORR`feiRcwywIFEc]dZhiTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh±«T\K~©¯±´°³£
¨ £¤¨ ©
{p}h}wol}£ª
yvnw¢y¢¤³¡¢¶z¬§¤®¥p©
|¤¢r¢®¤®¢vµ¶µÉ¡s`©myu¡w ~oLf£pr¤{ytal~ kqd`rti{i³µ´Æ¦s~{j«ultwizurPD}³^jvkxfjgbttqnV^TYhORhIULYRU]hknVgWMJAJMKHJNAQJPdcimetrs~y{nu{{TPOl^h[kiRjhilglfce_\]\^ibdhk{_]dhcjfomeile¡°§f?¡²«¯¯µ¢£©¢¢¥¥§¥yjye~ yui
z¥¨z}xp¡y ¥¨gnxl¢d|q¥wpg§{¥zrv¹n¢b}¢mri«ju mn¦`ihu¢}`
uobh e~iuocfnr¢Z_[c¡n]o{srd¥mw¢dg§hsn¡oSo _e§T]TmmskqmphkxskoRXWVfYSmIXO]HXihsjYkVQREV\LXRaThj^wuz|p||r{rvv^QrbgbpgPjhhklngdg_]^]`kcjivu]\cicjjslfkmc¥¦zetm§®¤©°±¦«¥¢¡¢¢{qh{st}{d|
¦¡«
}sh¦} ª§¦x~¥²¯¥xz©t¥n¤¢¼n|¥¯|¥zq¨ g~o«cw¨l©¢uw«¦k°kv³©knma«ªv¦w}
¥ iv¬g·sw¾¤Y¦«aurso{tqbj~nhmSV[Uaa\kM\R]I]mmw`[qY[`Zgsenoqcqt`wz~yrys{{vbxdcmsdRlgholrifia_^\bkbmlzo\\bibljwmglnb¦ª¤©ª¨§®£«¤¥©
tzo}ttrm|{
¤¥¥uol©«£ u~y®£qy{r¦q}}zx{~~v z}l
[yxqyphn~qtq
e_wusuoynnm^wixf©~t|jpv|
vmlgsy{x[kXyhnwrqowxo]lnigVZ`W\ekcUaU_Q_pxylkvejkjv|qrtsaoubs{xuyux
}{mldxn^Wnghukxjijd\`ZcjelpunZ[bkdllynhloa¹©§¡¢¦¤¤«¢ ¬ ¦¨~r|}~ztrp
{}
x~¢{¦
wr
ª¨ «~~¨¦xp{o~¨
p}qkp|hm]sqtkvsYrn}~j]jd{
_ix{{vhykaqrw_s§fnwp
yoegdzz[\jgnv[{xwtmsrf\mklbYY^ZXlq[_`Z^]ft~{uotckkj{|r{xtdmtgl{~vz|{zz~o{}s~ysiT\qiluougkhd]aXkhkjqrmW[enlgszohjm`ª±¢£¡¨¢¡}¢¥{|r|v
qor~z¦ xz¡« ¢¢££ª¡§¦ |x§~±¦²¥k|vwe
|
w|yu¡
~vptx¦
|vl|yjrhatp}zwvowt]^ohn_^Z\]ShqUc[\alhu||sopdkji{mxqioplf{rx}zm|zx|}zyNdvksmpzdkebb`[tfpfrrmU]ltmhyzqgikeº¢¡¤ {«
|x{mxr~ml~z|©r
}{ª§ ¢¦ ¦w|¥{|©¡ª~ox
qt`~u~
nyut¢
t||rr{{y§w
|ok~{mhlmg^yh|{vtuu{w\`p}nu`cZ]^QfmSeZ]ajivy~qkldkjglslltoxnynv}vr~{{|{`i{juhidjc`i\duhobunlTcqyepzzseimm·¡£{x¦¤xz
{m|~xs
}|kh}|~|¦p ¡
|¨x£¡¡£¡¤~
y }|¤ ¦~~utpv`}r|r
hwqx~s||py{
z{¦|
uzer{~xzpljf^}sh|uus|rj^`tvpxdcY_^RkhTdY_agjvxqfkclhejm~hnqk}wzks}tv~|{}jrnsiahlb_qVtomn`xhmWjtvcu{{rbjny²¥¥ |v¤ ¢x{~~qztu
~xgc}x}y}o¦¦
v¡¡z~¤z
x~s¢¡¢~|vq}nzd|
pleuo|}x||{q~xy
¢w
v{v_xw}s}wflda~ijwstt}q|bcasnusmaZ`^[kdRbW`ahkuxpbjcmeh|lhthloh|ymqs|~z~|mvttmeljacuViqn`yglbjvpfy|zq`rl
¦¨}wªyy{}|{xtxzs}d^}
t}}}£ ~rz§ t§tlzo£|zqykul{}~n
wo}~drj{ty~ux}}
¤x
t}sun`{uzq|oancd{bnovrwwstav_oluno\[_]^j^O]Wcahmszk_jejchwmflhilh|zwos}sz}z}}rzxxnlkh_iqchqoewhnlayhk}{xpawmª ¤¨}w®}w}{||vwptszo
|~|`\~szz¤}{¤n¢¡ogz
p¡|{tsukqnu{tn
qt{|dqly}}ttyo~|
¨{}~
w~po
chxtuo{b^p`jt^qjzxxlrpex]mlsmsXZ^_ajZPWWecgqqf]ihgbgqodigejhzwtn
t{u
w
|x
zw{zryjk_phtkromqgole|cnyvqlww¢¢¨¡¦tª t{v
wxrs{
kroymvnq[Y~vu w~
m¡
j
£g~w~||nvplmnp{
ispwtxfsov|zzwtp{{£|wxxnj]rsqpoxZ^p`pj^oi|ypmmjlv`pojrmYXaaanXQSZfgcupb]jmdbfkm`ff_hjuqrpuxux
ww
{{vjqc|b|oqltjholvw_qy{tut~¤§
uzrxtprsqulolumv}mnUQ«xvry xz¤
|r
ig¡qw{z||kvjnkklz~ay~vzw|ygtlt{qzpwz{~
}|x}vpiky_womkqsV^obqa_lnypgpffsthqkawe]Vfa`rSPN\fe]xp|_\hrbbefi_hd[gp~pkps}v|
tuy{xs
~{ywfrj`~ookz`jntt_t}yxts
|x °¥vtvspo
spqokivmn}|mtsRNßÈÖ|ptuw{r
¡~xz~yvhl£
cq{zy
{~l{erojkyy[yz}~zyhsks
}l~o}y|wxysmfpljtohismS^odpY`kqwfkjbfxrppc_x``Vk_]vPNK`fc]yqt]\ev`aeed`faXissnkqv|tyuv~s{~r|~vesm{e~oplZlnyysavz{vrwwy®
w~|
uwpyqnomn~rddxp|mz}jhlc¤ÁÜ®ï¡skuu¢
np
£
{uxvvn}£
^l|}
v
}}k}dwujmxsWz
z~
~xesj
kun
yutxusqguybtmobhugR`qglU_nty`rc_h}prn[crabWnY\wMMLdfa^vsm\\dy^`df
`cb^Xjrknkrv}twxw{q}~{t~~shupxlzntpXqzvyqewyivr§£|pxy
¡{{rwpsjokil|t^`xv{pu{g`e|ëÚµÉÃÜslsvip
|{vxrvp
¢ai}}q~qwhuriswkZ}
|uatl~}nly}|orzulpkrx_sin\jv`RdrifS_pvt`o`]hqsjWghciXmW[uLJLeg_brs
i[\ey^^dg{`d_\Ykneojsw~ss~zvzs
|vw{vlvuxxtnxz}Xy
qogywdv
q
¡¢sorw}{xqsnodr~hflww[_y{zqqiagaÕ¶¦xnqw{pj
{h||~
zu{zpuv~ag}~~m|tkmvtsvukc
~|~p_sq
||zqfz|
}npzumnjlz}bhjiXluZRirjbQbrxlae]Zjmsb\g_dl_nTZoNHOge\gnqkZ[cs`\clwde]\Zllbmjsvqo||txx
}uy|vowy{pm|w^tmi{ssgr}r vv~mv}|v}vqoljat|gbiuzZ_w|zmq~echhW^qr¼Ãuq~rrj{|}|u
vw}quru|f}
r}g~{x~|i|veoxxrvslj
xk^rxz~
{~riyy|}nm{}wtnhg|vc\pbWorSSnsiaNftxe`]\XnosYeb]jm`pOYkQDSgaZknm{nY[^mcZcowdf\]`ljcljsvqn~{tu{|
v~xtrxy~oo|qiyz~mm|vkjwtl
n}vjx~yozspljd`t{h_eqzZ`r}ygqzaee±²wJbZ¤ÙÐq{w}
nk
zy|xxoqt}ziy
¥o~vy
p{}nxh
xr{e}~ucprhxpou
{vxyk\q}r
}zrnq
sxxnovzehj}p_YwZXqmNWrsg`Klvt`][[Yt}roWg]fjq_nNWhQ?Yg_[pjgxpZZYkeYcpy_h\^emhfliqwol}uo{~v
qq{|yyujzlo~t}or|{onxf¡gogz~
|ixrklf_aoxm_box\dkzaqv_eeÔê¾2:>qy
v~ml
v}
|xnvwo
ku{tfy§}ntvy~{wlri~xm|{wbyqdqh~mtqu
~ru}rp[m~tx{|xzqlrytnkvuu\ihwpYW|SZpeLZrre[Jpwn\ZZY]t~uhYb[gfnciLWfQ=^f\]ue_tpZYTodYdqyZh^_gmgjlipw}li~yn|}zu
pnx~z{h{}jt{r{sw}yx}|kl~kh~{~}kuqghc[bgrn`aksahpyast^cd n\5Y¯µti|v
swpm
uyx}zsgv~~oq~hvymey¥~n~v||p{}{h~mk{zizvr`w~qdrgumt{
|nwy|t~mXovtwvzxsn
r~}~znnjmun]gfsqQ[{N\p\O[rpdVKsxiWYYZaqt`]]`gdhifNYhM@ad[`va]umXWStaZdorWj^ahkgmlipw|kh||p~~{zwq{oqw{j~{nwyvw}x~~zm
£{uyklx}{~prpcf^Yg_op``gpfjotato[adjv{¾¦£È¸q
s|xsrrp{tutwyyqcwzirvfwvcj|}r~syx{kxy~ugzhkysizv}h`w}jkth{iv~z~~p{v{t~bVw}rs|qwxpp}y~}vviqilrp]hcsnJeuL^nUTYsnbQOsx`RXX]bps[a]hedcjdQZpIDda[cp^]whUWUw][enhVk^ajgeoohpvzniy}r{~x|v}pvrnw~p{wyztxzuo~}
zw{gt
z{vgon_d\XeYmr```plkhn`siY^dmw©Ú©Ç²qxou{zutu~wpqmtxul`zyfqogvn[m}x}x{mut
{
ltvmgwem{umjvw|`bxzhtuc~zgt
{tuqz|mYVt~ouyltxku}{}x{s}sgtemmt[j_udHnnL[bWVUxmbPStvWPUX^aqo\`cmed^nbT\rGBf^]fh^[{bQU\u[[gkaVj_`nffkqhpuxtkuvx~w{t~oqtqu~
{wx||
x|}~{~svyzvty^}
yt
w{bnl[b[[aVjsc`[gnofqaqfW]ck|Êι¢jmmlqq|~{yytyuu{jlucuwpg^}zerkjqcXl{sw~{nqq
{y~qqo}fhqbmxqjkqw||y\eywiuxfvgt|rio~yn|]Xrmt|ooqvhww}qzt|zrfsanlsXk_w[InkMVU^TU{kaOTurPQTV^bt
h\`ljfcYnaXbpGAh\_e_]V{^OVdpY[jh]Wh`_rfkhrgprwxntzx~yus
pp{xwuyz|u~}
~~}|xvyw|mvycso
ztcnjY_[]]Tgse`YdqqfsbkeW[`iw¾®{ ·mbshs{qy
{}~wxsvo{vejn`usjb^~xyfq~hjkZVox¤
qqxums
}xtrnhy`jm`mvjgjkywzw[g}|xer}ntdu
ofkzumtb\o|ku||fu}mqgu~x~r}kzzzxpflbn~mnVk`wUJjkORNhNY|hbNUujLPTU_gvf]`qhgaWi][khJEkYacWYUyZNVmjY]le\Zec^tfmdqgrouwp
v~w|
}usnsxzzss
y}v|{~{w|wwziw}|lrq
~oflfW][\[Tdpd_WcruiupeecW\\hportddx~itussxyvtunk{pagkgtnf]_}p{~imwfidUWrp¦||vs{s|zn{{
v||tprlgu\mh_ltdgfizo{rYgwugpwubw|njmzqfse`mzgsw|~buvikqtzqyys}f~ywncfbn|mkVjbpSKikOLNpG^{faMUtcJNSWajv~e\gsif`VcWbp]LKkXcaUTUsVLXudZ_ka\[ce_wfmbpisnq~ttww~
z}u~
nrt{zuq
zut}
}~{~v{£¥y
ku|{uzn
sy}unjheV][ZZTcne[Xbs{ihmi`bW_Zijkohlahyxjsttm{}vumzhjyj_enhvgeXbwi~{oiogf]UXoh§vz|yuo~osuywt
vjrvghn[ld]ls_gaixh{mZmrsio~yw`wxrqoyrcqh\owdqs|xbspgjxsrlxwuwd{wvoddcn|}klUibfSKmhOGRkEaxgaMSq\IMTYekw{e^mqid]V_UnnWKThWf^XNUlTJ\y_[_k]]Zbe`zhlaooumovuz}wzzxz~qtt~zvt
}}ks|
}~{v¬zkrzvuno|sjomddX_ZYZUbjg[Z^ui^nl\aV\\kfrt}ij]kvugtwql
{}}yvrlzhixf]dshzwccTepg
wwfhj`WVYhd§n~xzpp|fyoz{vq}~ndvsdhh\kb]oo[g_ludzh]torkq{}uuat
zwruuaplYqtbqr
|udrlalzojizxurf
uzzupdadns~ilTi^]TKscQGVaGbvfaKToWJLWXgkvzdenqfcZW]XveTJ\cWhXYIWeQHbxZ]_l[^\ad^ij`otxmomvyr|}uvx}tuuxzz}~js{}~
zz~|sq®{{}erzt||vrol{}lzbpobe]eVYYWdfk`]\s
hXqnZ^WZ\l{cpwvlb[lrsgtuply~ywnnteite[gufvvz_]Refjt}bci\TX^bc¥hyt
xmnygxm|
{urx|xhevm`f`^j_]skYe]oobze[w{knnpwxstdr~zvor}rbxd[opaqq|sfqd^nvidgyztnout}sqb_fno}djShXYTMw_QJYYHbtdaITmSILZWilq{bllscaZZ[av[SKd^XiSWGY`NGiuX^am[[_bb]
hhanxylojvym~vtttrwvw|}~~~px}yxy}tsp¢{{xduysxulto~ly|pr^po`gblT[ZWhcmf\\qeRrn[ZXX`lwdiujj^Zmsqlsssj
|~|wnnldiqc[jrdtvs[WSdarr]bc]SZ`[cerq
tljylopz|{qvrzzzdfvg]bZag[^whWb]ohaw`[{vjirnwssthp~vrjp|mfwW\kmbqszsfo~[`oqb_jq}llt~sqxkpa\ellzagSgUWRPv[RPYRIcsb`GUjPHPZUkkk|emoqa\ZXYlpWRPfVWiSTFZ\OHrtX_cmcXa`a]jcdmyxkoiuy{k}|y}nqowz|t|tw
uspuo¢t{{exon{ofxpzlsvrk^tnagekR][VgbllZ\qdOon]VXUgjthbtee]Ymtmpuuyj||wsddkna\nmcsxkZTVbcx}}q
]c_cT[`Yccnp
sjhznesvs|lztuoz~u_frc[^VbdXaueU_`mdaq]]~phisqspuujm{qrfn}proS[fjfqtwsblvUbqj[_ne|emv|srsjm`Zdjjw^fTdUVPTmWQWSPHer_aFXiNHWTVmhd|ikxkbW\U[tdSRWhQYfTSHZZPMxw[_eliZb`^^nbfkyunohvvl}{krgt{u}s|
{ss}vn¥svwmz`d|pfzsylmqvgd{lcfghS^^Tg`lo[^nhNjm`TVSogskexde]Xotlrzwrl{v{zkaelm^`ojepy~gZVX`kx|{p_b^gVY`Wdbkq}wkkxl[vqlziusno{rXjn_Y]UacWdqcS^aiablZ`~lfksunmwvkh
zmqfp|mrmcYahiottr^ilReqdTbnbzcqv{ukpmk_Xaght\eVaVSNXeRO\OOHep]cFYiMI_KXmd_xhn~d`U^T]t[TR`fN]aTSJ\YPYuv]_fmhXca[^pcgjwqsngvtzrz~|zntlst
y~|sstxqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z||}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDEB1////0/>DDDDDE8.//00,H
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR4555553.755556':|}z{z|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvtuvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhgmgjghehgcbbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z^]YY^ba^^ZY_[XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROMPQQQQQVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOPPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHHJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:;>><ED=?EA?@A@DEGGGGBDDDFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL==A@@CD=ADDFCFFDFIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprtusqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<979;<>=;<;8:@@AB?A@CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqusurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::69:9:;<?7=;::8<<=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;<=?@===?Q>===<AL;LB9;<>=>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCD@=<>@A?A;ZyO=CE>DX<YN;<<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CFD><;=@=9::owY7;:<G^=`\9;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pqrrrtuvz{}}}~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABAC_I<;Fcg_WwwX7888MbBeh<;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@O|tFFu|wY<=?<SjGgk>;=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCE@Uvzpv}Y>@C>SoLdh=;=AEABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{|{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Pts||
mFBCDBRidsrI@CEHIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EGls}y
}sFCDDMg}~XGHQPLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG`z|
l@@VwXR^NLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKN\|
Vl
~iVKKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIIHHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJZ
{KIFB??@???<<<>::<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIh
fBB=88::9878896479;<:8567789787588;;;=@;999=<>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIi
T:8656766645763468:876565676778:77789;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBh
H676468874578467699766765:::::;898987779:98878589;A=>>BA?AKLOQPQOOORWkqrttuwy{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:>vz>:88;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<<9:<8::;:999<?<=ABDIJMKIKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?=J
l<;>BCEEAAAB>@B@@>=>>@???@?@==?B?AA?A?=@@@>?A=><;:;99;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BU
^>DGIKJIFGGDFHGEBA@CECCABCB?@DHECEDEEAFEFDEFD@B?<@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CCEZ
WHLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttvwzx{||}}~~~}}}}~~~~}~OA>=?DLK@BBA98<>;<;>@?A?BCGGJ[
PMOMKNKJLIIIHJFDGHHIEEHFFELLMIJGGHIJOMNLLNKGGGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@88<;<=:?A>@@CFIJQ`
qMQOMLLKLJHHEJIDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIGCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@8:<8=>;=A>?@EIKMVr
_RRPMNMKJGFBGJGLJFKOLKJJMMLOPNHIKLOQQQQOOJIJJLJLFGHGEGIFEEB@BB\orwxyzyyyzz{|~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAHLMQWy
|WVRRTROLKJDEFKONOWVQPOQSRMSTOMSLPSUWRSQPLJMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BCGVNFOQQUY|
gVUkaERQQPJ;;QSR`u]UVTVYYRYXRZfPUWZ]RTWQPNRPPPQKKKHHJHEFIHIHIirvyyzyz{{|z{|}|}~}}}}}}~~~SHJIIGGFE??AAEBCGEDELXRMTVVX[|
}al[dU:XXXSP>@VUY\d`VYbr^]V]ZVEQYZ[Y_TZgRUVXTTVTOOMJLJIILMKOMSosvxyxwzzz{z{|}|~~}~}}}~}~~~~VJJIHGFDDBA?HMIMPKIKPTSSXZZ\\x
g;~znpXZ[ZRSRVVTZZuYU}a\X]^WIV]][[_YIYXY[]XXYWRQNPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\YSVTWRQWVcQerXZW_hP`f[[X\gaGOZhg\[\]]WROSPPQVVVVYZnrtwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOMKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ[\^TQQPINOWVXZZdqsvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKMNKMKHJDFHEC>ScURQQNKRTQMOYQMNQSUUMQSRPOMLHCIHRTUZ\mruvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRVUbs{|}{{
u_]KC?CCCCB?DPBD@C>BHGV@HNMG]iQHFOFDEFHGHBCHGHKGCBAD@OPMSdstuustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfiedb[XSQPURsWe[OOOLQSQUYSUQQTSOV`klrv{{xytrnstsyx~~kLG??;;>@@??>kQKaEFHIEB?GLMGMQUIBE?><=<==?=?ACC?><=B>JMFUnuuustvxz|z}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrjmlqu{z}{xz||xwxdB@@B=:BCAADB\]O{NOONKLMOOQLKLWMHG@B<977599=;;;8989?;BH?\ttuvuvxz|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbXGFFHBAFIEEFDMRPaWRXQPSSRU[OOQWPMJCF>::6486979:366795<B=essvwwyz{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXQLXYZVXXVXY]WWXhsk]Vaskaa_]da_^YUPMONLHHJKIHFCQPSZWTTNQSYS\eUOSTQNKIHC?A9988978857578599Gnqtxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY_[VY;DVXT[fJLPRROMMNNNLJFPPUYSTNJOOTST\VRUSROMKIHHF??=:787659967665Wppsxyz{|}}}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOJHOPOOMRJOPPPNNOTLMIPOSTU2<XMIAQ=caQSQPNPQPNNMPNTRPRMILKOQPQRSTQROLMKLLHCBA=::876;B4566;epquxx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFFBFGGHFJDHJHGEHLHKHFLMPMG/E_R>3@>joaRRQ@FUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6676Dnqtvz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHEFHJNKEGCORC8ENS]fSQSAGUPOQQPMMNLJLKLNOOQMOOMHLLIKKLKHFFED<AA>;@E;<89Tqsuy{{{}||{y|{z~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTWWULLKH=987;?@><=@@B=>EHGDFFIGJJ@FAA@FHEJOHPRa\QPRNSOOPLLOMKMLMON[WKMQOGIHCIJLLJFFFD?BC><BF?B?Adqux{z{{|{zzw|xy}~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;?A@@>ADIECHHIGIEBB?>=CAAGIDMObeQMONWKLMKLMMLLKNNSdMJLRIIIEAHJLMNJGIFBAB@?EFEHDKopwzyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHKE?B=999:?B?<@BAADEGKFDIIGGHCC?B??@A>CECKMQTLJIMTFIIJLJKKIILMOPRPKGCKGCBJJLMOMIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqojllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKDGHHGJKIJKDGB=>=:::;@B?=BBCCGFJLJEIIFGHCC;A@B>@@CECIMPGIKFHKDHIKMHJLHHJLKM]RIHDMFADKJNMPNKMJKFGGJMNQNLcnivvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKDFEGDEEGEGBC@><=:;::@D@>BCDEIFJJLFIIGFFDB;BCC>?CCCEGLNHKNHDHEILNMHILGEFIILNKJHENHCGMLOMOMNNMLIHJORQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFEBBBE@DB>?>:;;=:=>CA?ACEGJFJILHGGGFEC@=EEB>ACCCEGIIGMPIFFGKNOKFHJFEDEIIHKIFHPKDIMLPMONOONJJIMRUTROWd`amgproryzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCBABD=BA>A=::=?;>>@B?@BDGKFIGIHFFGECBAAFFCBCBDEDGGHFLQLIOJJLKIGHEFEDCIHHKJGKRMCNOMQOOONOOKKKPUWVUTX`^\iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqrjksMGGFHBBADD<AA@C<89=>9?<?B?@@DFHEHFFGFFEDCECDIFCFEBEGEEFGEJMKHQMJKHHIEFHHECIIJKMKOSNDQRPQQNOMNPMLNSWVWXVX]Z]d`hbjigk_eegcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqiozMHGHHBBBFE<@BBD<7:=>:>:@B>??CEFDFDDGECEDDEFGJEEIGCGHFHFECFJJGMJLKHJLFIIKHEKKLMNORTOISUTQSPQMNQNMQWZVZYVZ]ZXa```^hec`dehgjihjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmsunorsyNIHGIDACHE<@EBE=8:>>=<<AB<?>ABFCEBBGDCEEFGGGIFGKHCHHGIGFDHKIGKHMKJKLHLKMKIMLONORUVOKUVTQTQRLOQPOTYZY\ZY[^_^`c^\ackb`dghr
hgifjmnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvquMIKHJEBEGE<@GCD@9<>@?>?CB<@>AAFCEDCHDFDGEHHFHGIKJFJHHKHFFLHHHJGLLLLLIMKMMMOLPPQUVWOKVVUSSRQLORRQV[[]^[\^__a`ad]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvovJKLJLGBEDE<@FDDB;??A@@@DA?B?ACHBEDFHEIEFDIHFIHJLHHJJILJFJKHIJJGKKMMJJNLNNNPLOPRUXVMNTVUSRQPLNTSRW[^^_]]`_aaa`bdeachbdijgvlkigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvowJMLLLGDCAD<?EEEC=AACBBCEBBDAAEGCHGHGFJFCGIGGJFILHJJMKMLGKIHLKNQKRQLSMKNNOPPOTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^`b^`eaabgnhbihhmxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLMLKLGEA@D>>DEFC@CAEDDFCCEGCBIFCHJIHIKFDKJGHJIIKGJJNKNLILHJMKZfJd\KlSHON_nUks[qpbwcRPbvuhucav`Xnqbdvinzf[lt`ljT`wuijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyKNJKJFC?@B?=DEFDCDBEEEFBFFHDDJEEJLLJLMGGMIHIKHKJIKJNLMMLLILLL[sbdp^lmUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemymkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED@BB?=CFGBFCEDEEDCHHGDEKGGLMMKMMGJNHJKJILKJJKMMNNMMJMMM[roonpplkMPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\_rkqjUuyxpc^kfbgqpjioppsspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryJKGGEEEBBB=?@FGBGDIEEDBFIHHEGKJGMMNKMNHLMILKHJMIKJJKOPONMKNML\hdu]lqWlNPQmUZk^klvaldtTecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ghadjuyknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtwIMGIDEDCAB<BABFDGFLHECCHKHHFJLLFNKLSRLGLLHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nopoqronusttj[]tcwxrjnzhaacgbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtHKHIBEEEA@>CCBGCHIMIFCFJLIGFKMLFOJKWRKGKJJNIHJLIKJIHJLMMMIKJKSkbZi^_jcrrZ_Yjo_eeUk_c[abQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFIDEDFA@AEDDGBHJLHFDGKLIEFJOLIOIL[QJFHHKMIHJJKKIHIGKKLKFHJJLLLKIKLNT[\TPTLPONOOVQOOQOOQJINPQdqiTYW[[\UY[]X]\\cfaafbce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusHDEGFFAEC?CGCEGCIKLHFDGKLHDGHPKLOKLWLIEEHIJHIKILJHFHGJGHIEFLHIKNLIO\W^O\[`^OXYS\\b^MYZMXaRJYaZS`d\aX[ddVVY\YZX\VY\]b_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtPBCDLMBCDBDIDGGFKJKHEEJJJFEHHPJLMJMSIHFAGFJIKKJLJIFEJGDFGEEJGCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN^\^S[^c^Z]`c`Y_b[`^[TXXY^]ccbaceiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKKKEEHINJNLHLNGHF>GGLIKKJKKIGEIDCCEAFJD@JKIO[cY^^a_RTSW_`\]Y^QY\MV_WKQY[PZ_aa^^ca`bbbcceZQYVU\Y^d`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQKGCGEBEGHFGHIFGJGHFHKILDDKKNMLLHJJHJG?GFNKKKMKKKIGGCD@DAHIA?IJGO]aZ[d]_TQSX]\\\_ZKW\LR\YIM^PO\_acdccb\dcbdcfXQUTS[XZa^^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKIFFGHGGJFFFILJNEDKJLNJLIKJHIGBHHQMKKOMKKIHGED?ECHHAAGFET]Y^X_Y_[]UXXP]]QKJW^X^[]VZ`RQ__bba`bb`cbbddbXOQQR[S[^]]]^__dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHCRKFHHHEFKJMPEGIJKNLLILKIIGDHKQOMMPLMKKHICDAEDHGBAFEDWUE\T]SV_XNTUNZ[MJKU`a[_X_^a]OYb]``_bcb]bbW__TPNPQXR]\[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPDW_IGGHDFMJPPFJIJKNLKKLKJJGEJMQQNOPMNLNHKADACDFDCADFBMHCLLPOOLFMFGIJHGLLMOPILOPPSPLPTSUZYWYXXdVOSTPPONPUT\YYZ]\`adechcklpsszy{z~{}{
}KIEEGFGDKM]LGHYMGHJHGNLQQIKKKKNNUNOKKLGGKPSSNPONONOHKE`ED_LDfcDM[I_\smOMVmYLCP`UlWgJ]WU^DMQULMTVQSTXWTXUT\TPfZhhdXTkTWVU[\[``abbb`fhfnlhrz|}~}|zr{z{
~z{LIEFFHEEKOSIKG`THJOJIOMRQKLKLORUROOJLNGHMQ[YOPPNOPOIJPQI|YYrsWPmHqnpaVPqqsPBksmqspSo_[nX]V\XUkhU]VcZ`Y[`VUWjtuu_`w`Xa\\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMMBDLLFJLFRVLKOIKRXWQNNNLQTNOQPKLOGMPS[ZTQROPPPJHZx]TxehYRTQvgtlpbnfjQrOMwmjrpsrqrpop]ezuxqqzq~s}ku}bRg|essoss|}o}yor_``bbZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKJHJPNMMJNV^YULQSNXZLSSRNLPIQRTYWWPTPPPQKGfxlcxrmZJLUypumubnvPdeJfvqmwojfxxiXsQhzmijzz~lxzogoXvvjuup`sh|ilx|o^__cb[]bdgijdgbcdllppstsssyqrxblugry{ssuy~suzn|}yxrnNKStNCBEPPHJKJLPOOPMPZ`ZXKTWPa^RVQYSMPISTVXWWPUPONRJKrouuquqdh`VnLqp^FhyWvTLhx}x`y{sna^modRgrunmypwlvttqlm\t~zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsy~nqpj{ztromLL[VHGEGRPJLMKLQQQQPQW\YUNVYUfXRRY^TMNITTWWYWOSNNNQHRmHiwK`dvvUWlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhe|ir{]TKl`vukiu{{m~xk|p]^^b[^bddgeeebZccikkrsrwgmihdg`alagsrkhlmr|kmhk{tmmkmOHJKHIIHRPLNOMLTSSOTRWRVTPWZVVTTTa`QONKTTSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXXQNPUTXXX[[URSW[WXWZOSUWWXR]YW]VTOYRWWWXY_[gr^[[Z\]_cZ_ccdfdccbZccfffmnmuffgc`f_]g`dlhfgkhozhggkujhgilQIKKLMKJSQMQPOLVVTPTUXUYURZ]VUTWUYXPOLMVTQNUSNOMLQPKJQRKQMKKORTRQQSSIHLNOQRQQQTVRXW\WSSQRUUVSZQOSRWUTYVTYUSRUSTTXYW]Z_a]\ZZ\\`c\]bcdgeddaY`acabhhincad^_c]Zd\bma^ffgmsdihkkedcfhPJKLOOLMTPNSQQMXWUTUWWWZVT\`VWVYUXTQPKOWSPNUPNQNKSPMOUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[TOTUXUTYUWYTRRWUUW\Z[_]VY_]^]\]aa^[bbchfedbX_`b]`hefda^_]]^ZZ_Z_g`^]]chkagfhfd`bcaPKMLPQLOTOOSQOQZYXWXZZXYV]jdVXYZWVTTOKOVTPOTPPPNMQQPRXTRQOMOSUOWRTUUONMQSUUTTRTXVZ]\ZVVQRWXV[[WQTVVVVYTWWTRRXVUZ_Z]__W_]^`\\``__ZbbdhhedaYb`b^^fdd`b]\\\\YZ[X[a[^]\_b__bddbd__`\PMNNRQMRROSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROLPSRUZUTPPLPWVRWSSSXMOPRTXUUUSUYX[^]\[VROUVV[\WQTWUVXVTXZTSQZWV\^[__`Vb\`a]`b_\`]cacgidf`Yc`a__ee_`c[Z\[\ZZYYW\Y\[`^`[^^a`_b\Y`ZQNONVQPTROUTSPW\\\X^\_W\^jqwyc\[VVXRNOWSNQQPRTRKQTSYZWUORNSXVTSTRRZOQSSV[VVWTVZX]^\\^VSNTUV\\VRTVVXYSTY\TRR\WZ]^]aa`Wb[cb^ac_\bab_dgidf^[d`a`ace_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTP[]^][`\`U\]ijr}slg\UYWQOR[SRQTRTUTKRVU[YZSOSRVVUSOVRSZRTUTX\WXXSX\X^]YZ]UUNVWW^[XQTUXXXUWY[TSV]Y]]`]bc^Y`[eb_dd^^cca]efidf^]da`aacd_b^XZ_[\[XXXXW[Z\`][[\[XY[^V^Y]POORZPZUUVVTTT^^`^^b\`U]^bkytl}lZUZUQQS\TUTVTVYWLRZV][\ROUSXWVSPXRSWSVVU[]X[YUZ^X_^Y\YRWRYXY_ZZSTVZYZVXY\VUZ]\^`a_dd]^]]eabfd^^dc`\gdhedb_da_a`bb_`^WX^Z\\ZYZXV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]`U]^beeuzhXYZTVSV\WWWVVW]XPU\Y^]]TRXRWVTRTXRSVTYXY]^X][U^_X__X]VQYTYZZaY\UVX[ZZXYZZXV]^_^cbaee]b\`fbdfd__dbb[fchecfaf__aaaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNSZVS\TVWYWV\`abcad__V[`da_zuohY\ZVXUW[ZY\YXY`WPU^[`a\TUXPUVUSVVRSUW[Z\_^Z_\V__Z]^Y^VSYWYZ]bZ^VW[\[\[[Y[YY^_``dbceebdZbfcgfe^ab`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXUXWX]_badada^YYadb`lfh^\][WXXY\\\_[Y[bVTW^]ac\RVXQWVVVVVSVTX\\_``]a]Wa^[^\[^XVXX[[_`\_XY]\]^^\Z\X[_a^`dcdfffbYceehgd^c`_ec]fidei_g^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bNRWYVWZY[\YWY^`baeada]^Yacb_a`a_\\]XW[[]]__\Z]cXZX]`cd_RXYPXWXYYWVXV]]^`aa_b^Ya]]^Y]^YXVW[\`_]_YY^]^^a\[ZY\_a_bdcefefbZdfgigc_c^afdZiibfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxLWW\YW]\\]ZW\]_`bdbba]`Xbcb`cab^\\\XW[]_]`_][`d\\XZcec`R\YOXWY[ZYXZY`]`bb`ac_\b]_][^^ZYUX]]____[Z^^`bc\\W[]`bacedgeefd\efhifcab\cg`\iibhife`baca_`_]]\Y\YXWXYXW\[ZWWXOXZ]acffrkJYW]ZZ_]\^\X][^_acbaa]b[bdb`ccb]\[ZWXiq`\`_]\ac_^YYcedaS_ZQYW\]\[Z[[c`cbc`bda`c^`\]^_ZXV[_^]aa_][`abeb_]S\_`cddfdgfefe^efhhgdd`[fg^ahhchhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{|{{{{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{|||{{{{z{{{{{{|||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääèÊ}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyyyzxooooppprrrrrrrwzyyzzz~||||||}}}}}}}}||||||||}}}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvyvvvz{x{xwvx{xzzy}yxxyxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{zzzz{{{{{{{{{{{{{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy||}}z|{wwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwwy|}}y|zwxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywww|z||z|{wxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz~|}|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy|{zzy{yxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqpponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}||{~|}~~~~~}|||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~~~
~~}~~~}}}~~~~~~~~~~~~~}~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~
~~||{{
~
}}|
~}~ ¡
~
~}}
~
|~
~~~
~~~
~{y
~}}}}~|{|
~}~~~~~~}|~}}}
}|}~~~}|}}|y|
}}}~~}}}}{zz~~
~~~~~~}}~~}}}}}}|zzz~~}~}}~
|}}~}}~}~}~}}~~}}}|{{{zzyz~~~}~~~~~~~}|~~~~~~
~|~~}~~~}~~~}}}}{{|zzyyy{~~~~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~~}{|~~
~~}}}~~}}}}}}}}}{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
}
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~|||
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}}}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{||||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{
~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~~|||||}|~~{|{||||}|}|~|}|{{{|y{|{|}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}}}|}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}||~~~}}~}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~~|~~|}}|~~~~}|}}{}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~~~~}|~~~~}}z{{|||}|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~~|~~~
~~~~
}}}|{||yz{z~y|yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzswvst}~}~}~~|~~}~~}~}~~~~~
~}||||zyvyyzywyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy}wxxtuuxrwwtv
~~}}}}||}~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~~}}}~~~~~}}~~~|~~~~~~|}||{}xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxry
}~~}|~}|~~~~}}|~~~~}|~~|}}}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzzzzxswuqqrpxwq{
~~}|~}}~~}~|}~~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~}~~}}~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxqvv
~~~}~}~}~~{}|}{||xxuxxy{||}|{|||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}{}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{~~}y|zzz}||~z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uz~
}y|~{
}}~~~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyspvxqvtturstvinrotvnulwm{snym}rsvsvmnwlpylu}}~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}{}|~~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{zyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}z}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~}}|}~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~}~}}~~}}||~~|}|||}|||~z{{|~
{{~}|||}}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|~{||{||}}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}{{{z{|||{{{~{{}{z{~||||}~}{z|z|}
|
~~~~~||}}{}}|}zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}~{
~|}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{{}~}}}}||}}|
~|~~
}~~~~{||}}~|~~}}~{~{{zyzzyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÕÔÔÔÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9>CE?<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÜÛÛÛÛÜÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌͲâÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A=?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎnPSSSSSTTTTTSL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤ZUVVVVVVVVVVVWNCCCCCDDCCCDDCFSSSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÎqTXWWWXXXXXXWP¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥_YZZZZZZZZZZZ[SHHHHHHHHHHHHGJWWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÎx^a````aaaa``Z¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª£hdeeeeeeeeddee]STTTTTUTTTTUTV`bbbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÇÅÅÅÅÅÅÅÅÅÅÅÅÄËÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÎÏÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌËËËËËËËËËÊËÌËËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÐÔÒÏÏÎÒÔÏÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××Ö×××××ÖÖÖÖÖÖÖ××××××××××רØ×ØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÏÊ¥ÑÏÒ¨ ÐÏѤ¡ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏϪ¬Ö²£§Ö¯¡©ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐËÈÀÈÐÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѽȬ¡´¢°²ÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÒ¢¹¯³ªÕÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÓ³Ä x¤ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:<?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÑΣ¨y©
¤ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑËÚ¨¹¯¦½¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ¥ ¥¦¥§»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡Ê»¡¦§Í «¤Ð«¤ÑÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓ¶×Å·×¼ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFGKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÒºÄÕÑÔÇÃÕÑÕÅÄÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÕÔÒÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJC<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@AB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢¡ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;<;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢£££££¤¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¡¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VQQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
¢¡ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«ª©¯¡¡££ ¡¤¥§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdWOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®¯ªª«¤¡¢¤©§¦©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨§¥§©§©¨£§¦¤¦¢¡¡¡¡ ¡¤¤¢ ¢¢ ¡¡¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]\PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§¬©¤¢ ¢¦¡¦®¦¦¡ ¡¤¡ ¡ £¤¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwb_\UYQUW[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;>=@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯ªª¬¨¨«°©¨ª¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[Z`_Z\V\hdncnjib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶¯³°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¡¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvyjb[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¦¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhukqhiiaYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µµ¼¼¾¼¼¾Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ¯³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTai`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÂù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^kcbnwuvnl[bQV\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAA;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhakmfnuqruqg^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¦¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tklndomiqxnyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦¬´µ¬®¥¤£¨¤ ¥ª´±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrxsyfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÃÁľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³¬©£¡©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijg]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬¦ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqocaguhjitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÌÐÍÇÌÉÂÂÇÁËËÈÆÌÊÎÅÆÅÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÀ»¾´°°°Á¾¾ÁÆ¿¾¸¶Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuntb]bTWUSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÂÿ¿¾ÄËÈÊËɼ¼ÈÈÉÍÈÃÈÉÉÅÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·À¿ÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfefcjdajmno^Y\VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ã¹¸¹¼½ÁÇÁÆ»¸ÎÝÎÃÄÀÃÁÂÁÃÂþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾¾¸º»»¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbacdcjbgc[ZZ\YQOE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶¸´´µ¿»½¿¹¾ºº´À¸µ·²®º»¶À·ÀÞ¿Á¼»Å½»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjgfiei^VVTYOSLF8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¹¿¼¼·´·¯®·´·¿ºÐÃ}ʾõºÇ·¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ¼Â¿¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxqmeefoiekhXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹¹¹¿¿×w©ÄÇ·¹¸®·µ¸º´·³»ÅÆËÁ¼ÆÀÀ¿½¼¿ÈÃÅžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksfam`\TIKJDJBCG?:;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¾»Ä¶µ¸·ºÃ¿Å¼ÁÎÄwyÆÏÂÀ¸¯µµ¼¾¸º²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½»»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qflintnxcgb[cQKTHEECHC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°¹¾¾²¼¾¼Ä·²º°£§¹³½ÇÌ¢tyzÏÑÌÊĵºÀÄÈ¿¿µ¿Á¿ÆÆ¿ËÆÃ¿Â¼ÀÃÌÊÇÅÆÀ¹½¼Ä¿¿¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`bNIM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±³ÀÜÛŹ¾¼Ä¾¸ wkoqk¸s~ÊÌËÍÊÆÂÄËÍÅ¿¹½¹¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]__TI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸µ¼¶ÁØÄ¾¶À¾}dZgRNX\v|t~ÃÆËÈÁÃÁÀÉÊÈÁ»»°³½½ÀÅÆÅÄ¿ÀÁ¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxsgp][^]YRFDCMIAE=H;;59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯··²µ³·¹¼»¶ºÀ·en¦ÉÀ¶·b`fTd]NNQTht{¤¾¿ÆÀ¹À¼¾ÅÄÀµº²°¿¹¿ÃÇÃý½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y}vlu{pni[_`YSPAFHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¸Ëµmgoµ¸YNFfLOtj`OMXtz¬¸·Âº³»·»½Áµ½®°°¶³¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsuvwnq`_f][TJ=??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¸Í¶yues¢^NGUzLHf~[Cu«±·¾¹²µ²¼¹¿ª¼³³·¨¸½ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtwrl_ca[^OHB?=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³¶Ç³yqlvQEGtMNO_pFR~¦´°¶ºµ´²¬¼¹¾w¹¼¹·v½¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc]fX\]RNNA>JBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³·½¹zzydKG{|aMIQe§¥aNJp®»°³µ²´¯¬»¸ÁoŸ\v¹¶¼¼¸¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmtil][jT]\PMHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³¿ZDvr[ZI^`Rqnm Á¸³´²°±°¹¸¿rg ²°§¥±®¹®ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯¶©¨OJ}³ljq]k^uqccn±¹±³¯®¬¶·´]¥«¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦¢£¦¢ ¥¢¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vzcwln\QhTPNGPMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬©³³¢LTr¦st}sNnmeppn¨¶ª²´®ª«¯°°¡±¦ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uv}mk{dhUQcMJHGORMJNG<E@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡¨ Á¿¨WZxunqZ_db\Y[ilbfs²¯®³µª¦¬«£ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}wx|dyy`bRU`HIJKSTIRPL9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¿·xcr|fgeWZZQJGKOPLUb_²°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´ª²®¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZZMQJNOULSLA7>B78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢©§aXfh\NJFD>@BEBCLVO}±¬¯§¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸²´¤ ¥¬¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HRUHFUVJBLG=KH8F<77;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡ cefXJBIOfRKAC>@FIH_£ªª©¤¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§ § §§¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vrmivmhm\X\CWNJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£ wk_RKCDVhF=::98Q
ª©ª¥¢£¡«¤¬²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã¼·³©³ª³µ¯³®ª¯£«§¶±¢¯¦¡£¯±°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{trkktrqhV\QFTHDJPI?EA4FG95;>7;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ui^TJFDFg³ÄÁ]PIBO{ª²§££¡ ¥«¥xm ¤¢««³¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÄÉÉÃÁƾº´ººµ»·°µ²ªº²®»·¿»ºª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkchoxkeZ[FKLEDSMDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡jWNKIHHS}ÑË´¯¡wsqnq¥¬°¹½Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÅÌÑÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÍÓÐÓÓÌÊÂÅÆÆÊÈοÈÑÌÇÅÇÅÁ¼ÃÁ¿¿¿¶¾³®¿ÀÃÃÇÄÇÄ®¿¸²¸¼Ãº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLDEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £\MCFIIYfº¬´¹±¬£yrrplx¦ÁÊÊÅÊÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÖÓÔÈÌÆÌÍÉÒÍÎÓÍÅÈÉÊÁÆËÇÉÉÆ¿Ã³³ÈÄËËËÏÆÊ¿¾¿½ÁÇÄÌÌÈÉÀÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22A<E<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡^H>DEWf¬¡«£ ¤¡}wpkebhqoq{
vpnqsoÃÏÍÈÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÕ×ÓרÎÒÊÏÑÌÏÐÌÓпÈÇÊÄÌÌÌÎÏÅÆÇ¶¿Ê¿ÒÍËÏÆÉÈ¿ÄÃÇÎÍÐÑÏÍÊÈ͸·»¨¥«§£ª¥©¨¨|xsvpc`drb]R\IJGAEIJ>;A8=4586;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¡©pGEEHb¼Äª«ª wic`__`_^__]blusqpolrqu½ÉÅÔÖ×××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÑÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐ×רÑ×ÒØÙÔÖÌÏÏÊÍÑËÎÐÀÆÃÈÆÎÍÑÑÑÈÌÍÀÊÌÆÓÎÌÎÈÄÊÇÇÈÌÊÔÔÑÕÏÒÌÓÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡£¯bkjz¿®¨}pecb__a_^a`_``_`fmppnkorwwÊ¿ÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØ××ËÈÎÄÉÏÍÊÌÀÉÀÈÊÍÎÐËÐÍÎÌÎÏÈËÐÐËÎÊÂÉÇÉÌÊËÒÓÍÓÑÑÐÐʽȹ°®»¸µª¶°¨¸³¾»±
zvopokadnpaW\ZIFFDMXE;@=33<<87865;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©§{©Íαk^^^adb``aa``a^__^]bmroostuvy¤½ËÕÐÕÓÓØÖÎÎÔËÍÎÅÎÊÒÒÏÇÎÍÍÔËÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÊÂÅÌÂÈÉÃÌÃÅÈÊÊÏÊÍÌÐÍÓËÆÈÏÍÈÇËÅÆÁÆÊÌÍÐÑÆÐÎÍÍÌÏÅÇÁ¸¹½Ãýø²²¾±»Ãõª¥¢yqrkmg``phXXhVLFLIPQB;C>;67:8::57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨ ®xeºÎª|eabb`]^aca``_`aa`_][]grqqrsqnry£ÅÒÎËÐÏÓÔÊÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÎÆÑÒÐÍÌÔÊÇËÎÏÈÇÏÒËÑÏÆºÄ¿ÆÉ½ÂÇÉÎÅÂÈÀÇÍÈÄÌÊËÏÈÄÄÐÈÆÂÆÈÄ¿ÁÇÌÌÌÏÂÊËÈÇËÐÄÅÇ»ÇÃÈÉÂÏÀ½¼¿°ÁÉÆ¹½ª°²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355==48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»¤°ff|Ñ«}~s`[^^^`^`cdc_]]^_``_[Z\akrrookloo}·ÐÇÉÊÎËÍĺÀû»ºº¾ÉÆÂÃÀÃÈËÉÈÊÈÁÅÌÆÈËÍÉÄÂÊÉÁÂÌÐÅËÈ¿¹Á»ÆÈ¾¿ÆÏËÿûÉÇÈ»ÈÆÅÊÀ½ÂËÆÅľƼ¼ÀÃÅÌÅżÀÊÂÅÇÒÅÀÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {wrtfiZanlZ[XRDLFBGDLDFS@54334?=3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²²¤]js¦¸z
vxurp_[[]``bcdded`\\]]_^`[YZ\borokikporżÉÄË¿ÆÁ°¶º²²³²±Â¼¼¼º¸ÁÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÁÉ»·»»ÆÃ¿¼ÁÍÃÆ¾¾µÁ½Ãº½Æ»Âº³¼ÅĶ¿µµ¾¿»ÌüµºÈº¿¾ËÄÁÆÂÅÉÆÉÆÐÆÂÌDzÇÉÃÎÍÀÅÃÀ½³·°²§¨¨¹°¥°ª¬zvwjdg`hocV^YJFJFHJAEBEI@9:648854;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÒÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÀ¹Å½«¯]nv¨
x~{ttc\\]^``bcbbeeb]\[\^\^]Z[\^hsqmggnorx¼Ë¿ÂºÀ·®°±§ª¬§¸µ·´³³´»µ¾²·°µ¯²¼Â¼ÁļÀ»µ²º¾À¸Ç¹´»¶Á¼¸½ÆÁûµ¯²¶º¿´Ä·»´«¸½½À½±º¶°¶º³Å¼¶®»¿µ·´Å¼¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÇË¿ÏÉÇÃÆÂ÷ý½¶¹¾Ç¿¬µºµ·¶ytxggebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÐÍÒÏÍÅÇÁÅÀ¾¹·É¶ª°^q
{x~vw|sh]]]]_`_`da_cec__\[^\]^Z\[]_kpnifjmnr{¤Æ¾¸·´¯«¬§¢ª§«³ª¬©´®·±²©®¦¬³¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶»Ç¹Â¶ª¨°²À¶¸½°°§²³µ»¼«®µ¦®¶¯»²°ª¹°»®»¸»ÀÀ¾¹Â¿ÇÃÅÀ¼ÆÁÇʸÅÇÅ¿ÇÄÃºÄÆÂ»ÆÉÌ˳¹Â½»³svvki`blhYWW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÐÇÍÁÃÆ¿ÄÄÃÃÊÁÉʾ¿¼Àº²´´Ã®©°hl{x~
z{wn^]\\]_`__dcbccb`_]Z[ZZ]ZZZZ\dnohghiknq¬¸¯´¥¤§§ ¥¡¥«®¤¨¢¬ªª°¤¦ªµ¶±½¹¯·¯©®¸´´¼¸´¼¯¸¹µ²»Á²À®¥©£«±²³¨½ª«¨«´³¦¨®¡¤¯©²¦§¨®¦¨·¬±²·ºº¼±¼½¾¾Ä¿µÂÁÇÈ·¿ÀÅ·Äÿ»¿Ä¾ÄÈÌÊ¿¾ÄÀÀ©strji\aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁʾ»É¶½Ã¾ºÉ·ÁÃÁ´µ»µ°®´»§©i`{}~xt~|swe_]\\^_`^_ccab`a_^]\ZXY[[YXZ\_fkfegehjor
©¤ª¥¡¥¤¡£ª££ ¦¥¨¥ ¤¦¬²°¶·§°¬¨ª´«´º±¶¶®¶¹²¯ºº±¶¤ ¤ ¦±§«¨¹ª¤§§¨§² §¦¤¦¬§£ ¡±¬²´³´°µ¼¶»ÁÁ²º¾ÃÁ²¹¹Ã³Á½¿µ¸¼½¾¼ÂÇÄÂþÀÄ xqlaf_ko`TY^HNgOTGEKF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½µ ¡¦º¶«³³»³ÄÏÈËÂÆ¸¶ÇÀÌ¿¸É·»Å¸³Ä¸³¾À«µ»±«¤®²¬ ¡do
|yusomjjipi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggjmo¨¡¢¡£§ ¤¦¢§¢«°±¶£©ªª¬¬¤´¹·°¬³µ®²µ®°ª¤¢²¤¦©¸¢¦¦ ¨¬« ¥£¯©«§ª¬¬±²¸¯¸¹»°¶¼¼º«³³¹³¾´¶²±¶µ¿¶½À½ÃÁ»»½zsl_e^ddXTW]IW\KPGIJGA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÃÃϾºÇ¸·¾·²Á´±»»«¸¹°¡¨ª¦f~
xrmomkb^aff]]^]]]\]_aabccba_\[[ZZYXXWWWXXXZ^bddeffhikq§¢¢¢©¥¦¢¥ ®®®®² ¦¢®«§¢µ±²²¬¨¯²§º³¦µ ¢£¡£¢ªµª¢£¦¥¦£ ¢«§¤¤¦«³´ªµ°³«²¹´¯ª¯²²³¸³®©¬®²¸±º¶º½¿·³±
yuf^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÂÌÈÆ¿Å¶ÁÀÆÎ·ÀĽ³¹¹²¿¶±¸º¬±´£¨nxoqtqhechdc\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¡ ¡¡¡©¤¨«§¯°«£¤¸ª¡ ®¨¶ª¦§°¤¸°¤· ¢ª¦¡¬¸¯¢¡¤¢ ¡ª©¤¢£ªª°®¨´«ª§³°¥«®³±°¯®¯¦§§²±´°¼´¹·®£yud^aVYWSRTKM^LOKGGLLE=A><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§¨£ª»À½À¹®´¸ÁÌÇÅÂýŸÈ˲ÁÂÁ¼»´»¼´¸¹¯®¯¨ §||wqilrtphhedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbcdfi ¡ ¦¦¤¦§¦ ª¯¦¢¤·¨¡¡¢¨´¢¥¨¥°¥±®¬µ ©¡¢±±¢£¡§§¡¢£¥¥«¤¥°§¥£««¦©®¯®«¨ª©³¥¦¬¯´±¯¼µ±¯¯ zwrea\Z]XNLRGRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847763321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥§·»¼Áź±¹µÄÉÉÀÃÆÅǶÅIJ¿Ū··½¶½ººµ²«¬¦¡s
~vncafihfgifjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVUSTRU``_`a_aabdj¤ ¡¥¡¦¤¤££¢ª«¥¥±ª ¡¥«¨¡¬©©®¢¡¢£«©° ¢¡£¤ ¢ ¢¤¦£«¥¢¤ª£«®¥®²©¦¥¦¦´¦©¨³µ´¹º¯©¬rqo`[WVURGQOHY[ORITKSLEFID8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´´»²¯«±¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±¾ÃȬ±¸Áµ»À»´³©ª¤q{tiijlgjkmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]]^^__bdm£¡©©«¨¬§¨¦¤¤¯¥¥¯ª ¯«³ ¥¦¢£¡©©¬¡ ¡ ££ £¡¢¨£¢¨« «°¤·¥£¤¢ª¨«¯³·³¾µ²«¯
tsh[XYSUREXLQ[XMTNPLPQINIB<??A?=75799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³§³¶®¨¨¯®©¨¬·¶«¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»ÂȰ¸¿·¼½º²´¥¨ytvwnmhmmmpggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]\\^_`d~¢ «ª¦®¬¨°¤© ¤¨§®¨ª¥ §ª¥ ¡£¡¢¥¥§¨¨ ±±¦±¼§£¬µ«®§°µ°¸µÀ±±«~rsbVTUNRJGVPRQLLWMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¥±·ª¥¢±«ª§©²±¤¶Æ´¹º³ÊŹºÁËÐʱ¶¸»½Áñ¯±·´³º²²¡¢~vkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv© ª¦¥¬¨ ¦£
££¢¤§ ¢¢¦¤¦¨¦¡ ´²§²·¡¢·¬ª¤²²¦µ¼µ¬«±£ysm]NQQLOCMNNPKFNNJJNMQHMJAGLHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶¦¤¶°¤§¤ª¥ ¨¥¥³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬º½´·À¯©°¦¹®¬zm__frpuqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXXX[]aosvq
¡£¢¤¥¢s~{£
~~tz¢£ ¡£¤¢´¯¬¯¥¸¦¦±¡°®°»ª©¯ªwscVMROPNCSNLQLBPQHINRMHJJDJLFKJ=749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764789::65:87A7x·¡£´¨¦¥¨£¦¥¦¦¦³§¥´Á¸°´°ÉÄ·¹ÁÎÆ½³¬ºÁ«Ã§¢¦¦µ«¢}v}eWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUVY[]ilrm
|tNXr_;Vo|s
y{}xqp
}¡ §®©©¨³¢¦¬«¨³¢©£~rn`[NSRWLDTJPLLFNOIELQMKOJIMPFII=7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §¨¨£ª°¨§´Á¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©¢¯¡
|ru]QLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tQB@}y`JQnx}
n~wuvxoQ{~xvgw}¤£¨©¥¤°«¡¤¤¦ª¢ª¢¦¨umf^[HQQSMIUMSILKOIHFJNLMTKQQOFIC=769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶£§¡¯¡§¨¥§¨¯ªµ¼¶··³Á»¶§¹È¸¶¨¨µ¶ª²¼¦¨}|wpnXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji\Ut|
{vxsnuptz~«
yzhv{prmxxz{vrrwhu
{|© ©¥§¤¡ ¤rha\]JVORGJXROJLMRJJJLPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().1272198798775:<;7v®£¢´©¯©¥¬«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¡~v
w{unnhXKHIHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u|xfw}hyvx}q|w{ok~|s{}tfv|lohs}lyq}qmvqhq~pC
wwz
}{u}£¡¤womebZXXUQJSUTOPNPVKNKNOJQNHOOLFD<;79;::?=9<:99??;8;=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©±¯±«¼¸¬»¾¹³¬§°§¬¥©¤ yup{mtpiliWKFGEA@CDILLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX]eprm§ªÀ~uyc|xo|yz}omytxjjq~Inhw~licly
ksl|nr{imps{}~{vots
yxp|ninonXUXTRQYORTTSXUMNHNKMNKCHNGE?:89;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥°£¬ª¨µ¯®¬´¿«¼Â¿¦¢¤¡¡sz
tntkpldkjXNEFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\`§bitzepmzvtlts|jkMy
g1vsl~~tfet~
filukq|hqq|n|s}|qpnumwyujyyvjjoheXQYWYY[MPUVYXNIHEJJHGB@FDCG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,5775478iO8;5n¤¨®²§»¯«²°Â±»ÃÇyqs
zorpnodpf_TFIC?<;9:?@ADCEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ r|xl}mr
zyr¡txsu5q¨¡¡¢vp||sgfbjnrlpuioXupwl{}mqmpzsunbv~
ux~}zqpok`[\^\YX`_RN[ZXWLHJFJG>BABG>CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µª®±®Á²»ÁÆ}n
ul{txxlwnwci^IPG>@7449;;;=>@BEHLLLLNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|~
~v¢y~aªzw~sz]dqtz{wmhjbyo
znwtzptywkni]w||
}q}uw{|vpsteg_[[]T\g^WQUX[UGJJDLG?F@DC>AA=:97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡}|~p~zgvkRWL@E211367688:<>AEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z}~v¡¥¬©H®¯¯¨tm|}hghx~n
q
Glwryvhmk_w}
zzuv|xmow}ssrl[]][ccXgf\UOPVYPDLKFNICFCCA@CA=977:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|}
¡¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cWKB60./23123668:=>?BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¡¥»±§»Çè¡¥|qv
ihotq
w{v
}nvuf¡ª¢zzyogkx~z~rjd^ZZ]j]af`YOKNWRQHPJDNGCJDB@DDA<987=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯°¡xw|mpj]BA4--//./02234778;=?BDHJNQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¡
lpuwql
r¡¥µ©¢}kjk|sa]c^Zfk\lk^WKGOSQNMLFIPCDMFACEFB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ©ge¤~y}
xx~gMR>/..,/.-/000212457;?CENPRTPQQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¥¢¡¢¨¨« ¨¬©ªµ«¾«¶ÈÈ·ÉÑϾ pi«©
¡§¢xz~¡{v«²}¤¢¦¶°¨lsr||qh`\`^bgc`hg[REJKPOIJLFFMCHLFFCBGD@:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}{ªªBD}x|
w_bP460-1/,.00//..0015>AAMQRSPRSURNSLEE@<>=GG@A@8662<9;FHGIJNOQYmw£§ª´½¸¤®¬¬§¨´«°¶²²»±³¾³Ã¬»É˷ÿ¸¥£°²¬ª£
¦¦ ¢¦¢ª¨¤
¤¡ ª¡¤©±£§·» £°¢£¤¢«¯³µ¢¤ªyz~
~g`h\eb]dc_ff_ZOCIHTOFHLFJGEFHAKFCFFA:86=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1.-3?DAMUQRSUUWUN[PGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª±ÁÇê³Å¶¬³¿³¸¾¶¿´Á¶»»£·Å¨¶Éǵ¾¹´¨£´±±§¯«¥v¤¡«±³ª¨®¶»²º¬¯µ¢±«±µ»·´®µ §§£¨©°²º¸¸§¶©¥xuYadVeaac`af_[TJDELUQHIJDIGEA@@KDAMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AFWQJL[ZQcdWyuq}v
{¿»£¼´y
zxn]V@EM<6:46AB764//6CHCQ[OQUWU\VO^UIKJA@>GKFED;>@7D7?BJJEFWTP^¥£±´Ã¶¸ÁÌɶ»Ä½³³À··Áµ¿°·t±³¦ºÅ¤¯Æ¹±³±´¨¤µ¶ª± ¡¢¥°®¦«§¤ ¬³º¢©²º´»¾Ì¿Å޽³Â·º¸¾·º·¹¬¬°¦±ª¾°½»Â¬º¨®«}|jWbaXjejeW[dYVTIGGLQGCHIAHD>?BBK@@MC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYUZvjpnzsyb¸¡£{z||}xzueO\dGEL:Qca[^SF?;HPDZcQQYXYgYT``MSOEA?IJHEFA@C<E6B>HGJLSZT]¯¸µº¹É¿º½ÉÌ»¼À¼·µ»»·½´º±Æ`u²¥±ª½ª¥¨«ª£¢²µ¡«¨®¥§¦¥£¢¦±´§²²½¶Á½ÓÉÊÓÆÂÅËÁÊÃÀ¾½¿»¼·´°¹·¶ÃºÅ½ÃȰ¹ª¢«¥¨¶q_bb]Wa_hfRXaVRVIEENKA>GD=KB=B@=F>;H@796379>489:57045/26389374426?8@>GKRTSQPOQQPJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]gllq
slrrsÕÀµ }xz{yt}zkepuY]\Peeb`ed][XW\MdmURmm_n_XgeUYTJDAKKHFIHHGBI9D?HKTTV\Z[¹À¹½·ÆÀº¸Ê˺·¹¶¸¹²·µ´®¶¶du¨p^¡ ¢¤«¥ ¨¥¤¬¥ª°¬·°½¹ÔÑÏ×ÏÉÌÑÌÏÎÊÆÀ¿ÂʽÁ¼ÁÀÄÄÅÊ¿È䤻°´¯«¹¼yl]_\X]`YccQ\`SPKCAEFD<@E>BHB@D=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOI;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi_polouu³¬¡¡
~|s{
{ts{xkmu{hreilifjih`fihlZnt¤¼g[oh]ZYTHKNOJKQKTQHLAJGKP_^bfia·Ç°¹³»¾µ±Äǵ¯¹°°»«²±§ª·¬¶§§O ¦¥¡¦¬¯¨¯§³´ÔÔÔÖÒËÏÔÕÎÓÏÍÅÂÉпÊÉÊÉÒÇÌÍÂÐÒ¸°Ã¼Ä¹¥¶ºÄ¢nc\\]X`WXfZQ]WOOBBHEBI;AD>AG??B7;C>@H=46655;:687654/10146278875367C5B8?-0-1349=97,.,1;FK=),(.0007K?-46TW0DwC;B>EBACJM?UYSeWshqoyy ª¦}
|p{r~qxukqx~q{mxslipmcinpxiw|~Ë¿Âß§mcxnc[a`JPRUNY^P^]MPNTQUT\nnvr¸¬´§°¶«¬¼À±«µ¦¥¸§¬®¡«´£±®¦«¬¤§¡¬ÏÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÍÒÓÓ×ÍÒÑÅÒÖÅÀÎÇÇè¾·Ðzne]b\V`R][OPTPNH>AFABE<@B>ED>@?:==<<JA45465<888664412/03526768533;=<E=@11+/249>5901022-2DN3)/3.32=N238C}_2AtD:==I>@CFH<VRMO[u
wlwp}~¡¡
y
{r~yu
ovrks||v|swqksrhoqzyr{¾Ë~²vrvhaj]CZZ[WedXekSX]\`c]cx{~ª¤¤¡ ¡¨¦ª°¸ª¥´£¡¢£¢§±¦j¢
}
§°¡ ¡¤¤¨ÈÍÏÈÂËÑÔÑÔÒÎÓÍÆÖÒÌÔØÖÖØÔ×ÕÉÔÚÍÉ××ÑʬÄÃËsob`_XTYR\PJGIIJ@;:;EAD<BD>HB?BC;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/--;R017/532FD28>nb5=tM99@I<AD?A;PLFKYpu}hsxr
x~xs{}wznxpmuvx}s
|ymvtn}vuy{µ<AÆ¥~|ieVICfcechjdox[_fhknin £¤¦²¤¤³ ¡¥¡© £±~
z~©£}ª³§§½ÃƸ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÚÚÒÕ¿ËÌ´xvnd]YRUPZVFGJJEE=:79@AB:HD@ECACB;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BS39254/7K75<`bA<svV87AH:?C><9QECJTlnopaqqs|~
|x
zyqz{uz
zp|oozq{qnztw||u|°tX©Â¶pnb=^hrpqpnxweioruxr{ ª ¢¥¬}
~my{®ª¦®µ½©½ÆËÈÉËËÏÈÃÑÊÔÖÙר×ÔÛ×ÓÙÛÖÏÛÚÑÖÉÔËy{hh[YPRS^HCEII>A>=7:=?;>H=?AAADA>>:86DB755479.566435532323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865434BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqz~~||~wyn{{ty vutu}toot|
zv|·Æ¥ÂÉ·wpeNfczw¢xyw{|vm¦ £«
z|¡¼¡§¥¥®¨µ¾ÀÀ¹ÇÉÍÎÅÍÊÑÖÖÕÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÜÆzyghe`TWVUMKDNC;<=<9:<>9=@6=?@<?><9867CA6455=80665547745613854564567HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz|~}
{~
z{u}tn|}~t~|~x}ynt
~
|~z©Â ¼£}}s~s¦
{hGp ¤
¡~¥¥¸¡¦ £®¶ºµ«¿ÆÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Ü·xxwkidW`[TPOHDMB==>99::99;=6?>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqry{z}|z|{~tyszsm~
}w
¡n¨
z |~£¢¤®
Wr«\¢
££¡
¤³¡ §±¸¬¥¼ÂÇÍÇÆÏÌÏÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚo|tgg\]XSWXC@ID>>>:49:;7:;:3;;?=>7;9:19G=:37=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxmb~nmwxy~z||{wsp
zuvvt}¦£¥¢¨r²§¢ ¡©¯n·
ÄȲ¡¥²d¤ÍÇ
ª¤£¥¨¡¢³´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎrhc_]^NJTZBAGD;A=837;<:8=649:<:82?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:>:EMFHRWSRBcFu}|m~xz~z~vv|lny|xx|}£³§£ª³¡§¥¤®¢¸³¡ ¤¯£¤§§¯¤ À¤É¸«¢¦²
¨¢
t³¥¡} ¡±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ§ÎÍÓÒÐÖØÓÐØ»ryv\`U_WPHINEBCE5>:76:?;<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=89566=:JFDGN[\YIf`;Hz{n
z|x
~px|}}osz}{x§»¬¨²½¯¥³³¨£¢°¬µ£¸¤¤©·¦¤¢©©£¯°©»»É¡i¶¸«°£«¾£^ª²|}´« ¡¡ ¥¯¨¡¥³¸«ÂÈĵº½»ÅÇÈÂÑ¡ÆÉÍÍÄ×ÖÑËÓ¡pzh]YS^ROFD><CAA8?874>F<<6<35355454B39:BM:A;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPeGb`bpI@~s}um}}|pww{ªÂÀ¯½Æ»³´Á¼´«³¶§²®®¼ª»¤¨¹¸«¦¦¢¡££¨¯²±ª¤¢¥¥£¹®¨À»¬²¹¥¤§}¬½°z§±¬ £¬ ¡§¦¤¢¤°²¦ÁÇï°º¶ÅľͧÇÃÇüÕÑÍÄÊtsb\Y_[MJBL@EG?A?B;:4>A<=5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\fF`igZ][{uo~|q~zz§³ÆÉ¿ÂÌÁùǼº¯«¹»²¶º²À®¥À¤«¯»¼ª«¢¢§ª®´°ªª¡°´§¢ººµÁ»«©²¥¤¨
ªÃĤz¡¦ ¯ª¡ ² ¡¤ ¦¤¦¦¤¯¥ÀĨ·µÉþ¶Î²Ä¾Ä¼³ÑÊȵtym\X\iSLHDLKKJAA=CD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBfZMe\fTcjyr|xy¡¨º½ÈÈÊÁÒÉÊÂ̼Á³»¾§¹¿½¼Ä·¬Á©¬²»½ª°©£¥£¬³¶µ ®¥¢£´¼©¨¼Á£¶¶¯«°«¬ª¦¥¥uz
££ª¥|£ ¢µ¦¥¤£¥¦¥£¨§¢²¬¨¼Àᥳ·ÌÀ¹®Ä³»¾Á¸¬ÂÃÂÀmyaXW\[KKMJFDDIBBACK:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQF7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddVw
¡®¦£Â¾ÈÃÇÅÓÍÎÍË»Á·¯¹¼´¼Ë¼ÃÁµ¶¼³¿¹¼®¯¨ ¨§¶©±·¢§¡«··©¥¯¾Ã±½¹³§ªµ³®¥¬¨ ±Å§}}ª¥¡£¢Z¥e£²¥¢¬¬«§¦¡¤¨¦¶«©º¼Ã´¦³µËÁ¸©¶¬²º¸®¨·º½¸lnZWTUNFJSNK?AGDDHFG95FM;>7>AJ.32025B55PVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|hW;=@BFBqFiIRebLF¥¡©¦¢¯¾®¡Æ¼ÅÄÆÆÎÎÎÒʾ»µ±º»¼¾Ï¶Ä½·¹·²±µ³¸³¬¦««¸ª¨§¯°£¯¤§¤¤´À°ª¬´¾Â¹À¹³§¹µ¸²®¥¯®¥¡tÁ~
±¥£©¡ `J¥T°¯¥¯®¬¦ ¥§¢´©ª³¼¼»ª°²ÇÀ¸¥««±±£¡±²´¤qnf\ZNPKDPPPQ;GJIGHBD>9KU?A:=EM07544:B34NWO<JKOUNQJOHHJOB<>MR;>=8:<CR>DHRIBWNI@CAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}iX;:BC@=QEWRsbWFHª ¢¨¯§
£¤µÈ´©ÆºÃÃÇÊÈÈÌÍÆ¾º³®¹¸ÁÁ̶ȺÁ¸µº±¯®²´§£ª³´ª¨¦¬¤®¥¤¨¬º¿¨«¶·¿Á¿¾¸²²Ã±¹½¬£®µ¬º¦¦v¿
¯¡¡©¨ ª¢§nv¢¢²£«¨ªª®¥¤¥©¢±¦©«º¶¾³²®¾¹¶ £§¨¥§¬©©cea_RKMGHNIUL=LDNJKBCD<QU=AABDO18=77?B75UXN?HNQYSPQTJQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..R`MUHe^HE«¡»¯ª«¢¤££¶Æ½´ÀºÂÂÇÈÅÂÍȽ¹²¯¹´ÀÂʵƱÁ¼´º«¨¬°£¢ª´º¦©¦«ª¨¯§£ªª¾»§¬¼³·½Æ¼·µ¸À±½À³©µ·«¿¥£¢ ¼ ·©¥£¡¨¥³¡¦¨ª¥¢¢ ´¯¥¥°««¬££© ©¤¢¡´´ºµ¨µ²³¢¥ª¡w`\_]JHFGMQIMEFFBRLJAEG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCpbGD§¤Ã¬¤©ª¨¦¡«¶Ä»¾¶ÁÂÀÇľÍÇ»½¹²¯¸³¿Ãȵ¿¯¼¶¹·¦£ª¬ ªªÄ¡¤¨«¦«¯¬¢©¨¿·¦½°·¶Ç¶µ¹¸¿±¿Á¶´³´¯¾££® ¡¢¥££¾¥©¨¬¡¦½¢£¢©«¡
¤ µ¬¦²§¯¨© ¡¥¤¬±¶±ª¥ª¬ ¨hbYa]NIGJNKHEDIA=PIA<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,0Mv\4KZ5,MnW<-=)#zbQ5CKQ9oRF<KxebVL¢£Å¬¡¬® £¥ ¦©«¶±£ª²µÄý¿µ¿Â»È¾Êȶ¸µ´°³³·Áƶ½°¸´¹µ¦¬ª«¥£Á¥ ©¤©¯¢¦§½µ¦±¼·¶µÃ²³·¹¾²ÃÀ·¸®³µµ£¤¡® ¢©¨«£Ã©¬¦ ½¢¥««¬¦¡W¥¡ ¸ª§¶£²¡ ®¢¤¦²«©¡¢¥¥¤adZc`LHJJNFEAFK>=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrHE6=ue\KM¡Ã§¥¢³¡²§ª¤ ¤¬©¬»°¨¬µ±ÇÄÁ³ÂüÆÃ¼Äʽ¯±¶°´¯¿Äµ¹°°¹µ¬¨°©©¥¡§Â¬¬±ª¢®°©¤§½¶¦·º¼®¶Ã³³Â¿²Æ³º·¬´¶ª¢¦¤¬¢¨«°¯¯¼²¦ ©©¢¤¸ ¡¤¯¯¬¥§¡¢§´¦§´£¯®¡¡¦¬°¥¦¡
ae[geJILJRAC@IG;;G?99NMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[U^fr@8<HweA4£ 褪²¡£´©²¬§¢¤²«®©»²¬°µ´Æ¿ÄõÀĽÉĵÀȵ«µ¨°¸¬ÀÄ´·®¬¶¹¥«±«ª¦»´¨°®´±§ªº²§º³·²¸Àª·²Â¼´Å§¾®·µª¨¬¡¦¥¢£¥¯¸®²µ¶ ¨¤¤ ·¢¥¦®²²¦ª¦¡¨ ¡¯²¢¦®¥«¤
©©ª¢§
xch]kjMPMNT=CANC::I@77QO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHNP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05JphVCWFyfC;¤£¡¦¿¦¨¯°¡©µª¹°«£ª´¶±°¹·¯¶¸¸Ä½Ãǽ¼ÃÁÆÀ¸ÁÆÁºª¶¤»À··ª¬±»¢°²¥§ª¹© §°ª °´²ª©¶µ¬¼¬²²¹·¬¹°Âº½¾¦Ã«°·¯©««§«¢¢ ¡±¯³«±º© ¦¡·©¥£¢¯±´«²¨« ¥¢£³°¥ ¨¡©¨§£}
jhlalnWPQZTACET@;;IA7:XPd^PVWDY^]MLRN^KJ>Zc^NHPN[UYPKSWZI?DXPDF>N?=IGGQPB=CFBM?:2D?77547?=95E4+75/251.-.,1>*'+=\p=>1.1e[d@1647gY`F(?8l}h[V;{cC=§¢©½¡ª°«£±¸©¥µ³¬ ¬´½®³¸¼º½¶¶À¿ÈĹÄÁÀÀ¸Ä½Á·¯µ¨«·²¼¾¿´©®±¶«¨§¨§»¤³«¢±°³¬©¶´µ½¯±µ¬°µ±ÀºÄ·«¼¯±¸¬ª£±¦¥ª ¤³ª³ª«³§ ¦¤´®§¢®±§³²ª¤¨¤¡¨µ© «
¦¥¢
zelrgpq_FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWM=EUJEDAM?AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,+%2+*5K1.'__aU150=`V^8)C3YU\gK5zfL@¤ ¤¬·£¬©¥®®¶©¯´º§¦°·Å·±¶¾ÀÁµ´ºÅ¾ÌŹ¿º¿¹Ä¸Á¹²µ¬ªº¶»¹¾´ª°µ§«ª«¬««½«®±£« ±³®®¶±¹·©®±¨µ¯³»¼É²ªµ´±µ°¯§¡³ ¨ ¥²£ ¦¯¡¤¢¥§²©¢§²¬ª¶¥¯±µ¯¤§¬¸¢¡«¥¡¡ z
{knxmu{`EajYIHY[={JGE6AbTi[M\`J[]ZRRRb`LKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C^Q\.*B/JGP[H3cYTJD °¨±©¥¤®®µ¨·´¸¤«´·É»´ºº¿¾´´·ÃÀÌȻü¶¾¾À¸¿¼±½®§º¹·¶Á¶«±¸¦®«§¢±ª¯»¤¬²²§¨£²³°±±µ±¸³¨®«±§¸¯µ´ÃŶ©´µ¬±®ª§£¶§² ¤²§ ª©£¥¥¥·§¢²´¬§±§®°µ¬¥ ¬¨©¸¢¥ §£ v{
mqwu{~\Kel\KNc\?b{GI8GgWe[M^bMXYWTXTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'FaLV%-B.=EMQ<3rjJCC¥®¥®«§¤°²³ª·°¶ «µ¹É¹®Á¼Â·³±µÂÃÎÅ¿Á½´½¿¿º¿¼³Ä¨©¹°¶¶¿¼¯«³² §°¥¥°¥²µ¬«²°¬©¨´¹¬´²µ¬´©¬¨«©¹±±Ç¿¸¤¹°©¦¨°¦¤¤®£©¯¢£££¬¤ ¢ª¥¦¹¥¬µµ¥ª«¨¬¯¶®££¨ª ¤´¢ ¦w~
||}qtr~}}\Sdo^NZf]FDZG;NmXa[M`bNVWVWTYg^QRLcZ[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HdHJ+:I?3BIS,>k<GHªª¢©°¤¨¤³´±´µ±±¡«½Ëº®À»Ç±´´ÂÂÑÅžÀ²¾Á¼¿·¼Ä§¬·¬³¸»À°«² ¤§©¨¤°£ª±ª¯¬°®¯®¬³»§¶°²©²©«¥¥£º¬ª±Â¹µ«¹¨¨¨ª¨±¥ª¤¢®ª¨¢£¬¤¬¢§©¢¬¥£¬¸±² ©¢ «®°¬§¨©¤ §
¤~|w
tsqul_Y`ncQsq\K;|F>WuXaYNc[NUVUWP\b^SONhXWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<]J0.IgDF8<B05EKX1@Z>LE§¢ª²©©¯¶¬¸µ®ª¥«ª½È»°½·Â¯°¬³ÄÃÎÎþ¿´ÀÂĺÁ´ÉĬ¯·²¸¿¾³®«¥§ª°©§¨±¥´®«°®±°³³»¤¸³¬¬®§«¢°·«ªº¶¥µµ£©§¬¬ª¡©§¦±²£¦¥¡¡¬ª¡ ¦¤¢«¤¬¢§±·£¥¢©ª®©¢¥¤¤
£¢|zt~tw£xj^`ngWedN@gLDbyWbXReTMVUUTO\]aUKMiWUWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D?HFD¯¤£ª°«©µ«¶±«¥«ª©¼ÀÀ¸¸³»µ¥²¯ÄÉËÑ¿Á»¹À¿Â¹ÁºÁÄ®²µ±³»À¾³±®¬««¨¶ª¦¯«¹°¨±±¯²¬¶ª¶µ§´¶¬¬¤©ª£³³¨¨¤´´ µ ©¨«¨«§ ««¨¹¶©ªª©¢© ¬©¡ ¤¢¦£©¦µ®¨¦©¢£¥§§ª¢¤£~¢txu{x~oqggqx\`sjO]VHmxUdVRbPMUTUPOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,)*(/*&)%3;,$2)2021%/2Qb02?f=NX?C,>LT_/Jj6OD;° ¥««¥¬®³´¯ª¥¯©¨º¾¼À°®¸®¡µ¯ÉÇÈÑÀ¾½»¼Â½ºÃÁ¿¿®²²±µ¼¼Â±²³ª³¨¤µ©¥³³¹°£®¶±¯²º«¹®ª®µ«ª©«¢ ¶¨¡¯³¡´ª¨§ª£ª¡¢¬¨½¯¬®¡§¨«¯¡¢¡¨§¨ª°©£¬¢¡¢££§¨¥}
¤
xt}uxy{tszi£ui^ekug|RXp^JxsSdSQ^MMRYfNLVYeYFSiRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<>H73CB15:93-5::)-31--6)(+-,42#2)',%.;.&1.0-14%,0Lh:38_=ad?F1CP[[+HN9UA4±¤¦«£¦¤¬¦´²±ª¤°§ª¸¾Á»¯§¹ª§®°ÉÆÈѼ¿¾¹¾¿¼É¼Á¸°°´±º»¸À²³»¬¸¬¢´¦§¬²¶¹³§§»µ¶½°¼¦¬µ«©¯£¥¬ª§ª³¤³¨ª§©¤©£©§©¾«´¯®©¤ ®²£¤¤¥¤¨«¥ª¡¡¥©©
~}
¢~qzy~|iw|zupp}h
xd`gcr
zmgy]^VBWzmTaORXKLNqt]HZ[gYEUfPD>JNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH0%90%,,09/,,+6'17#-/GjI14X=fbAJ7GS`U*=;DX>*±©¥¤¡«¤·²²¥¨±§¬¸Á½µ°£¹¨¨°ÃÉÉÌÁ¶½¿µ·¿ºÈ¶Ãµ´³µ±½¸º¾¶¹µ¿¡³¦ª«°µ¸´«¼¼¨²À³º ¯³µª¬®°£¥¨©¢¥±¦¯ ª©¨¢©¤¨ ¼¨®°®¡«£¤®¦¡££ª¢¤¤¢¦¬{|~£|yk}vyxb{zqpqrxhsjgdhansmbip`pA\xkV^NQQJJMSYVM]^mWDX`O^PHMDF;7HEKO<rhJK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*K>*49&'.34.0+/4&,:$40BhY13S=e_DL6KWeO*<2OZ="¬§¤¢§£¸¯®¢¯°©«¸Âº³¹¯«¨´ºÇÊÈ¿·Á¾¯´¾·Ä¶Ã±¯º²²Àµ»¾·©¹·½«¤´§¨ª°®¹±ª»½¤°Àµ´¡®·µ¦§§±³ ¤¦§¡¥§¨ ©®§ ¦£¨ °¸£±¯¡¬¡¬¤¦¦¨£©¦¨¡ª}||¡y
}{so}qst`yxioppoi~qczliecaf`[rjrMMiXZMPLJHPRQIN\_nSDXZRgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZhH*>/YX5(¥¬ ¡¤¡·«±¤´´ª¨¹Äµ²® ·¬®°µÆÈÀ·¿Á¹°´½·¿»¿¯«½°´¿±½Ã¹©»º·§¨µ¨§«°³±§½·¤¼¶¯±·°¨¥§¯± ¤ £¤¡¯¦¡¢§¯¢ ¢¤¤£·°¡¦±«¬£¯ª¥©¥¦ª¥£©¡z~zy
~zzprwnot_xwdllkihmfrikeh\cs_ZkuiZI}^[XOOJHHRUF29_^lPDXVYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42*;+139cl84GAf[HTDU]hE.;2aT,2£¡ª¥¡¢ ·ª® º¹¦¬½Ä³°®¢µ¯¬¯´Ãļ³¿º·°³¹¸º¸»®À³´¸¯¿Á¸¬¼ºµ¦¢³ª§©³«²¢Á¶¥¨µµ©²»ª§¦©¯¬¢§£¦¢²¤¤¨©¢ ¥ ¤¹¨¤§®§¥¡¨©¢¡ ¡«¡£¨¤y|
}y
{w~{ltrllsaxthhjgeogghcfhj_hbifZe{c`SsT[[SLIGIOS@!*i^jLCVU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,>0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB378dN'2¤£¤¦£µ¬§ª¹·¨¬ÃÀ¶°¬¢µ®§¯¯·ÀÀ¼²Á¶±®²¶¶¸·¶¬ª½³¯²±½¿·®»»±¥¶«¥¥´©«® «¨¥°³ª¬µ»¨ª«±¥ª¦¤¦¢¤©¡¢ §¶¦¯ª®¡¡¡ ¦¡ ¥¬¢© y
w|{r}}fxokjlguskcgdctadefeijcjqY^X^mdaNhWZ`VIGHKMRX>9`liGBTS\[IIGFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3AfH%5¤¡ ¤´±¢±½·¡±Æ»¹°±£·¬ª®©¹½»»À²¯®¶¯³¸³¨«¹±¯®´¶»¶¯¸½¦µ« ¡°¥«®¤Ã ²¤®±¯·µ¯®¢¨ª¥¨¥¥£¨ °¦¹¨®£¡£¤ ¨«¨¨§|t
|ofxnhkjgqrk\hcbr`dgjmlgjifl\lmuqaTbhdeYIFLMOXQQVaeT@VSYUFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]19Kj[M[KXdd@A1IeC'4¢°¡©²°¸À¶ ´Â»½¹±¥¶¯¨®¥·¸··¬»¯ª«·ª´¹®¥³µ±®©±¶¶°²µº§¨¶©©¢ª©À¤®°¶µ±°ª¢£¬¨§£©¢¤ £«ª©»¨¤ k¢q¤uª§ ynj~wql}o^c`gkuw~fhuifW\isnNPjcfqf^dfnli^__gOKD8ETg^JGPPUUKHSaoteF[QUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/568,#1'214:176Xl16Ok[N\K[fb>G1Pd=+/¤° ª®«£½Å¯©·Â¸½¼¦¶°¥«¤¸³²³°¹ª§¬´¦°µ£¨¸¶µ¨§¬¶²®´³¢©´«¢¤§¨¬¼¦¥¯³¸®¥¨®«¬¥¡ §¦¡¦¥§§ ¨ª£µ°££££¡¡¡¥§«rx¡vif}sx¡o~{¡ {tvlmheczlqbTmcliqXjonW^i[kj[pmyrhZ^FN>F^MERVVQQRWTg^LXJRROEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Va7/(¦¬ªª§©¿Ã®±º¼·À¾ª¤·°©¬¦²µ®¯³¶«©¥±¥µ³µ¶´¦§©³±²§¯ª ²¨¤£¡£®µ¤¥¦¶½¦¬§ªª¬¨¦¢ §£¦£¤¤©¢£¥¦ ·¤¤ £®©¢
±¤yÔ¨ÁÇyw±¥·dÀ¿yy|Êq¼Å{r¶§ºzl±«°yhkX±®oei¼¼nhymrØ~Rkc¶²qu¡ªWOWaOVNFT[XQPR\W\P@]EQNDGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦¦©¥¬²¨°Â½²µÀµ·¾Â«¦´©§¯³ª¯¶´¨¨¦µ¦§¸¯³²¶ª¥¤§±®±¦ª§¤±¤¢¡ ¯¢´º¢ª¨¡®¥¢¢¨¨ §§§¡§¢ °££
¯jjª~gep¦q®¡¤~w»|k¡v±_j´[¥f`fzfjxj©e¾rg¦v²j|±xtcmm§m[ EifEu`}g{¤§Y_«ixzj§7J¯[WTlc[KNW_\WV;NOWV/ITTICEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:5/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¢¬§¥£¤©±·¬³½¾°·Ä²·ºÂ§©°«¯©©°¯¤°º°¤¥®³£©¸©³²°£¥ ª¯«¯¦§£¢°£¦¢´³¡«¢ ¢©¤ ¡§¤£¡¬¦§ ¡
µµx
©µw³·©~k¦z
w«gk±[¬{tpx °vwqkkl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¡n[Tkg`LK\dX\ZB>°xWXA#MiEBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNG:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J9aU50³¥¦¡®©§³¬©»¶Â°¼Â¸·Áª¬®®¦®²©¡¯¼ª¡§´¤«µ¥¦²³§£¢§ª²¨°§¥¯¢¤¨µ¯¡©©¨ª ¥¨£ £¤££«¦¢ Õ¹p°Â~Æ|Ö»|¥¤{£¥z¬yU¯{~j¹Z¹w|¦|zªy{±mt¼
oP¯§ÅQ zc`ªbsrl`Sµ´È|c¤3Bv]QjhcP@XfZdaJHMlK[SOYfZCD?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[K\P_fT7G:aQ72%¢±§¨¥³ª¥´¨¤»·Á°ºÀ±µµ¼³µ§±°£°³¦®¶¨¨¹®£¯± ³´° ¤§©°¨´©¤«¡«¨°©£¬¢§¡¥¡¡¡¢¡¢¢§¡¦ §¡²nhµq«o¦r´sr¶{¤¢~ ¥~°vÒÑu[®|¤oª¦k|}{±sx³etofRÈZÂ\yb__vsb^YÊo¿uMKµSUÆdTQjcfXAOj_liOUFI9=WR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>HI91746@>/.24252-).26,742&60;5:=Pqh9'Wi\BNT_eP5G=aM62/¡¥¯¬¤ª»¦´¥§¶»¼²º¿·¶µºº³¥´´¡±²£¬°¤¦º®¤±±´¸ª¦¡ª¤±§¬©¤©£¨ ¦ª±¦¢¥¡¤¦¦¦¡£¬¡¢¥¢
¬{w¨v£©o¨¡¢®
³\r³R®~¤q×}w}w¯w´aelZ°XKuyf`^vwgk^¯wxl5yÈ®²_ATo^g`EPl_qmVUM.eciSYQ:AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:88 ¸°´Á¨³¨©²º¸³¸¿¹·²¶½µ¥¸³´¬ ¨«§¶«¨±²«®´¤© ¨¡µ¦¦ª£¥¡¢¥§¬¯¦ ©¢¢¨¦ ¥¨¤¬¡ ¢ ¦©}}¥x¡ªp§ ¡£ª|yo±Z§ ytØvt§¤|{²^d ~l\«[Zhgªcr{kq]¬Z kneOJC¡\ZLt^beMZa_rs_JU6JYHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJEAH6KIN@IK@EN::@4.:>102144+*05/7,&21($$6671<PeeA&Uf[?1U_bL7FI_C1>8¡¾«´Â®«©¥´°¸±µ¿¹º³±·¼ª»´°¤¥§§ª±©°ªµ¬«¯¡¡ ¦¤£¹¢£« ¢ ©°¯¦¨¦¤¨«§©§¡£¬¤¡¡¡ «®mr´r©v¦s´yt³¤¢¤v¸o{¢kk¶Y¡ei¡¢§mr´t²j
ku³af¢oj\`M¡|Rs£ly~op\¯V<wfTon.\§ObRkealYb\`p{cSYQ>>mp3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBI6IJP?HNCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U_aL5FM^81B8¥º¡²À®««§·©¸¯´Àµ¼±¯¹¸«Á¶©ª ¦¤¡ªª§¶£²¨®ª § ¤«¹£¥£¡«¶¯§¬ª¥¥¬£ª²£ §«°¡£¢ ¡©«Ô»s°ÃÃ~Õ¸x§z£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxnqn¤t½]w}[ay¼kZV[jz^j`dfbmwoY[YCA@r?CG+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9§¡¼¢±Ã°©ª«±§¹¯¶Å±º²®»°®Á²¬¥¢£¡ª¤ª²¤´¦¤ª¦¬¸¢¡¥ £¯¹±«£¨§¤¤ ¨«©£²£¥§¢¡¤° ª
µ¸xµwnlnsnysÁ»¼{²¨pt¸|{|¤»¹½uz³£tvut°ufiµtrpw¶^y}gymyb¬pu
Y[§jDdYSf`c]cQgfqluBNPLD;ZL>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbV8*O]]=+:VV'=;<§ ¿¥´Ã´¬ª§¬«©»®°Å¯µ³®·§µ¸©£¢¦ ¬¤ª¦µ¨¨ £«¤¾¦¡ª¢¢¨¢²µ¶¤¤¢¦¥«¨¤¥¡©¦§£©¡£°©§¢j~i§xs~tzez½¾Àºnq`rjZ^adk`cmvbke^`cqhr}gj~qtx}}b[wthP\n|{jXkzrIJo
pMtMEW\f`L[Xgc^O[muiqRODEM;HI<L?2,2A?8/5?C<9;@;=C>RVVWYZ[\\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7JR_I'S`V4)P^L(3=[O'?2>¨ ¨¡Á£´º¶¢¬¥®§¨µ±¬È¬°³¬µ£¾±²¦ £©£¬§®¤¤µ©¥¡§¬¨¾§©¦ ¥©§°²¿¬¦§¢©¨¤«££§¢ª¢°¦ °¥¢¨£¤§£hn}qw
µª ¢ z¥ki||tqxyvv{jstucw}vkp{m`c\pgMYYej_WZozmmfSOFS9OZNRO(+:JB635=@A9:C><ENSSTVWXYZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J&R^S10T^:+=8\K,<-@² ³¡¿¢¤±²· ©¥²§¥°µªÉ«±¥µ¦À¨´ ¤¥¤ «¦¬££¶¬ ©¥À«¤¢¢§©§²Ã¯««©ª ¬¡¢¥¯¦¡¤¨¦¡° ¢¦ ¢£ |ª¨{
£f¡³®vz|vyzogykuyrhszvktcyf`idbdfjYk{pij\SLPD_UF@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMMD/T]Q05M[17E4\G5<,@´ ¹¯¾¬«®²² ª¦±¢¬³°Å°ª£³®¼¤´ ¦¢¡¨¥©¦¤¦³µ°¦®¾ «£¡©©¬¢´È³ª¤«§¨¤«ª®©¥£«¡ ¡¥¯£¨¥©f|e~cylhkz¤«ke~g
eeihz¡kh¢wkj£slnzyXe]
^lv\hswwnwxsmytw{j
Y^ktd]sij|qlc]QMWJdX@J4=F7?FD71<=?AC;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AJ[J/7ZO6)EY/DO1YC;?.=¥º¼¹¯«³°ª¥¨®°¦®°½±©¨¤¯±£¡¦«¬£¦¨©²®£¢¯¦¶¹¥®£¡ ¥{¥¬¢¨³Ã·¤¢§¯£££©¨ ª¯ª«£ª¨¦§ ¬¡¥°¤ª¡¥«~¾r´rhx¹Ä¸q¢£{¦sª|ËÀÀ»q¢|À½ÁÁ{{¿}k¥±ooÊzwvyyqzqx
ymvbf_xd_ec^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>I[L*#BP/#F[3PY/UAB;/8£¸Ãµ°¯À©¨£¯©°¯¦²µ¯ª¦¦¦±««¢ ª§¢«¢¥¨¥¤´£¢¦¬·³§¯¢¥ ¡§«¤«¿À°¡©¯©¢¢£ª£ ¡®¨¬¦£¢§ ¥¥©¤©ªª¬¡¥¡£Îyz¤y_®^§¡ |§t«¯^cªz§
t³c«¡³i®t}¸aY£Ínu{Ú{p~ue{vvk}n~
~m`qkpg`_yd[phjdf`RTRW^KOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\;L-!P@F4.1¿¿µ´°·¤ª¨´«¦²¬¬¤«§°ª §¥¢¯ ¨§£¥¡°¬§®±«¨¬ ¥¥¨£®¤ª°¨¿Æ³¨©±®¢ ©ª ®¯§ª©§§¤¡«´¥£ªª£§¦¡° §¡ p
u
¨q°|r¬~¡¥w«}r~«vz|~ª¢~«{{VÄzoÁ}mupmeveoawnromdotup`gmd_oiinfcWS\aZRSC9II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7=WJ-<'>1)3V@F!G:C1.+¯ÔÆÆ²´£££¡¬¯¶®¨°§©ª¨®««§¢¤¢¦ª¢¥¨¨¢°¬¨§®¬¨§©£¢¡¦£¯¬£¬´©¹Í±§®¬¢®¬ ©±©©©«©£¢¬¯±¢¨¬®¦¦«ªª±¢£¥
¤j¤uz©tz²p¥p ¤``R¬®v®¦z{f£¤£}©~®^|©U¢z¢{ïÅs¯³³¹qb©¯Âthmomywwolfdeqpf{hc]W_iXXUMMQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799674,&$" ('"+-"$.!3-&@DWH,G+66*1PKL# A9D4,'ÂÉÕÕÀ¡«¨¡¯¢°µ°¯©¬£¨¦ªª«©¤¦ ¤¥§¦£¬¢«¡¤¯¢ª¤µ°¯ ©§£¢¨ ¦±¦£¨±¬¶È²µª¬©¢¥³ §««£®¬©¢¡ª£³¢ª³±¡ª¨¯°¶£¤§|ªlu«y|°o¤Ò¸´¸É²^_©¤ yxªÉt£§©ÆÆxe¡¥s}¯^oµc±uK£m§Gd|ppzt|{m[fjrqfj^bXcm\^YIMLKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75685/)(%&%$&),4ENPPMFKJVF*L0/>-5OTQ;<F2,$§¤Àƹ¨²®¬¥¢²¹¬ª¡¦¨¦ª¬©¦ ¦¥«£®«¥ ¬¨¥¦µ¢¨ª¶²¬¥ ¥§£ ª§®¢£§©°´Â±²ª¨¤¡£®¥¡¥¦«¯¨¦¬£·¬¡±¹¯¯§³´³¤¨¤Nxz£|¤¦¸{|y¹~ÌŶx¡}v¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu£|~tzs~p[mnwrjoZd_hnbd]KMQTBIHFI:9K>B108866877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E3:P[T6?H,- ©¬¤«¹«¯ ¡¬³³¦ ¥®®ª§¦¦£§¡²®¢¨¦² ©¤¢µ¢£¡©´¹¤££¡²§¦¡¢¯®¤¨¡µ±Ã±ª©¦£¤¥¥¤¨®¡®¥¦°¥¼¡··µ²¹±³§°¢¤ÑµÃ·y
¦x¢w ¥qª´nrj£|s¯¥¢¦mp²\¥szl{}n©a¢qqbs²¸hx¦~w|ymixixsnt]ddnmeh`JZXX<HG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``][ZZXURRQF:2230/++(@QRTUTSTVWWXXWUVVTQOQ[U%!2AH$)%s¿¿»ºµ¨¤µ¡££©§®ª«¥¢¥ µ¦¢¨§°£«£¤£ª´´¤¥©® §¤§µ ª£µ«Â°©«©¡¡ ¦¢¦¤¦«§¢¥§¾¬½°¬£°³º¬´§©²¥¨z¨}|°w¤¥m²o¡|¡§¬
®
¨ ¡{~«ªx y¯]£|¦§d|tk®]¥kq
]`[ n¦zzklb}tmz`geqogghCY`[=KT2U8BBC7$$3+''3, /6674359@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI7052.*,ATVVVTTUUUUTTUTSTVVWXVUUQHFIJ#((¼©ÆÂ·Á´®¸¥¤¤£ ¯¯ª¤¹ ¢ª ¯©¡ª©¤®°¬¦§¬¢¡¦¢¥¨¥¶¨¿¯¥©¤ ¦¥££¨««£¤©¨¾¤Ã¬ª£¡¬²º«®§ ³¯©ªv¯~
}ºd°e} ¦¬°
¥¤¡¡
[lj³`{{±lgn°[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m¨{x}ds}bwt|ajfqmfeeOUc[BT^>I(>9=4!",%2. *1/045799<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UZXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Á³£¦¥¶¨¡ ³³©£ ´ ³¨ª«¯«®¨¢¯«¨¦¢§®¨¡¥££¥£©²¨¼¯¤¨|¡ ¨ ¨§¥¥£¥©» Ƨ¥©¡«´¶®§¼®¬©£¯¤¸Ãº
§¬¯¦¥ª~սªb£¿½|~£×º¸µ
½¾j£o«mz²°Çj«°½xw¢¾»t¦yyc}zdfy{`kekjbPb[Sj\@TaBN)=:4/$%2 $(0496677;>ACFGJKMNNQTW]a\__a^`[\YTQMIC?<A?5=SYXXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼³´±¿¹²½³¢®¦¥³¦¥¾©·±¨¡¿¦¦±±¹¨®¥¦¯¬®¦£¬¡¤ª¡£¦¨¡©¢ «©¹¨£{¦©©¨ ª¦¡£«»©Å£ ¯£«³µ«°ª »¨¯¯suª¤·epg¬mow¤u®pq§£®¤rmmmewnmqyiqigqhigpd]cjoY]g~w¦`bqofd¢|ufwhjy~ydlcflbKdXJkY:QeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXZZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³ªº¹²³«©¢®£²©½±ÃȾ¶ªÀ¬¬£ §¬º£¤¬¬¦©
¬¥ª¡££ ¤§©£ª ¥¥§¯º«¬{¥§¨¢°¦¢¬º°Á¨¤³¦¬±²«®¬¨¹£®¸¡¨¥¶¢©ª³£« ²¢¡ ¢ ¤¡«¦¤~gtvtq§l{ phvpwv|zjlddocU`X@i[HcaOZ+F=+&!740.!%2(*699469;>?ABDFJKKMPPQWTVY^_ac]^UQJED>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥µ·®®¢°¤ µ±«Å¼Ä»¸ª¢¥¥°©£¶§©´¦§¬¢§«¤¡§£¨©¦¡£§¡µº¨ª|¡¥¨¶£§¬·¨®Á®£·§¯¯°ªª³¹¡¯½¦£¦¶¢¦©£¬¯¡£±¨¯¤ £©«¡ª
~fuvysj}¡ yqryq{jnd_pi`[`YmcP`dP[:GGD=2==7.*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]__]^_`aabaaa`bbbdb\[c¤§£°³¬®£©§ ¨µª¤³»¯¬¬¢£z¢±¤¥°¨¸¦¢©¢®£§¡®«¨¨¨¹¶¤¥y¢¨¸¤¯µ¢¯¯u¤¾£² xz «²»w¤ª~d\bv¤~n³£§®«¢esyp¨l¢§e¥
wkvq|ai[vghr{¥dywinykpe`vokkh[febboS[>NNNRG=@TB91/&4:316678<;>@ABFHBGFIKLSTUY\_hfgWQJ<DG;8UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥¨£§¤«µ¯±¦ª¦«s¯¨ª¦¸ £~«£§¢
u®¦§£º´§ tv ¦²µ³¼§¡~§¢z£¯·§
±©¯¢y¬¢§©¨v¥z¦{±z
cympyq
txht t| ~j
kx{qpgdwnilk[ekjes[^ITLQ@E5.YTU6)!09=>643568;:=>>@DH?IEJKGRXZY[aahfYQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®«¨¬ ¨°¦§©¥®Æ½°¡¦¨µ«¦¡¾ }
«¢ ¨¢£¹²§
pu¤¬´´Êª®·
°±®©¦|¨r{w¦h¤y´¦¨Â«¡q¤}
±¡|¡ |
ms
zr|t
Åf©¢k¡p
hwt{vghupggl^colglXgG]QL2E46M`c7&3<DGD:64658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@JdY]cfhgbbbbdc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹°ª«¦ £¤ª£¤©¶£¯ §¥¼ y«¡
w ¤¢¸¥bm¡¡¨~¡§ ® «¯¤ª~¢vj«uM«x¨§ª«}¡{z§ikg¶}n`dY~{dhr}yl]{m_Sp\_ly`Ye}q§ªk£nr¥piel[m{eY_bWPovemtrjjo^jomliXiO]WE9A4GC^k4,ICQMN=84859;6@;;>BO>QRLMBJ\]_W^_cv`MD:MOMTb\\ffiibbdbddbab`cdcabikdbddgdbgeach ¹¡ª£¦¬¡¶¼«®¢ ¡¥ µ¢¨ ¦´u¦
¬¤¨¥°¦¢hn¢ ¢¥£¡ w§¡§©
¥y}}¢przym¨{¢sv¦f~v¤_z}s¢n·´ºsµ¨dƸ{p·q¤cs¬«`}j³~n}q£ls¤s¤_³p|´ts[²jbosuqhoXklrsf\i^bKD=D5QAYq3=SG_JR=<395::6D;;@IP?TMNQ@E_^[ZW``|dHC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¸« ¤¸µ® ¢££¥®±¬ ¤«x
p }¨ ¢¨¨¤~kz} w¢ r¢©¦¨«®}z z£xs} ¦¢d¡|lhn{§}rhs©sªg]
vhªj¸f\¨pa^§vuhunl§\¨~w»k~ª[]´g\nqywki[qjxyb_fXbAPEN7VBRn4KZZ_NZC@151;;7H?:CGT?YRY]>Db^V`Qac}iEB9N[]XdfXfgnmbbe_aa__``ec^bdoq_deekecihgkiª¶¨c¬º²°¬¦¨®°¨«¢¡ £jq{z£
¨£ iy{¢ ¢rhp©£¨ ¨}°£¢¸v£³¢£xz«¢q¡|
¯µ}k¡x~´££«¨||~sªZ]o{xbL~zz
cyBMY¢jq|muy±³§umq|orj¤]vHec`sp}}ne`lhv|cdaQ^V]TV@YEQgDSW[bX^ID=B8?B:IE8LDWAVQ[VDFb\Z`K`m~qEC<U_bZejVghmobff^aa\]^ahb_edvl^egfldflhhki±®S_ §³¹³³©¢«©¡«¤¡¨¡w
ny
|r s¨|l
q¡x
|¤¡£®}µ{¥y©¡}§hvm~s sq|
o®}¤¦£o^¨gu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²¨¼wm~¾¦©´^n}qos¢r]£gt¦ah¦mÔ|owykzwsm©¤g`eypkgfdmuxg`bS[eQQaIWIT_WS[ej\dPECKMJKBJE8P?PMWSXORR`feiRcwywIFEc]dZgiTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°«T\K~©¯±´°³£
¨ £¤¨ ©
{p}h}wol}£ª
yvnw¢y¢¤³¡¢¶z¬§¤®¥p©
|¤¢r¢®¤®¢v´µµÉ¡s`©myu¡w ~oLf£pr¤{ytal~ kqd`rti{i³µ´Æ¦s~{j«ultwiztqPD}³^jvkxfjgbttqnV^TYhORhIULYRU\gknVgWMJAJMKHJNAQJPdcimetrs~y{nu{{TPOm]h[kiRjhilglfce_\]\^ibdhk{_]dhcjfomeile¡¯§f?¡²«¯¯µ¢£©¢¢¥¥§¥yjye~ yui
z¥¨z}xp¡y ¥¨gnxl¢d|q¥wpg§{¥zrv¹n¢b}¢mri«ju ln¦`ihu¢}`
uobh e~iuocfnr¢Z_[c¡n]o{srd¥mw¢dg§hsn¡oSo _d§T]TmmskqmphkxskoRXWVfYSmIXO]HXihsjYkVQREV\LXRaThj^wuz|p||r{rvv^QsagbpgPjhhklngdg_]^]`kcjivu]\cicjjslfkmc¥¦zetm§®¤©°±¦«¥¢¡¢¢{qh{st}{d|
¦¡«
}sh¥} ª§¦x~¥²¯¥xz©t¥n¤¢¼n|¥¯|¥zq¨ g~o«cw¨l©¢uw«¦k°kv³©knma«ªv¦w}
¥ iv¬g·sw¾¤Y¦«aurso{tqbj~nhmSV[Uaa\kM\R]I]mmv`[qY[`Zgsenoqcqt`wz~yrys{{vbxdcnsdRlgholrifia_^\bkbmlzo\\bibljwmglnb¦ª¤©ª¨§®£«¤¥©
tzo}ttrm|{
¤¥¥uol©«£ u~y®£qx{r¦q}}zx{~~v z}k
[yxqyphn~qtq
e_wusuoynnm
^wixf©~t|jpv|
vmlfsy{x[jXyhnwrqowxo]lnigVZ`W\ekcUaU_Q_pwyljvejkjv|qrtsaoubs{xuyux
}{mldyn^Wnghukxjijd\`ZcjelpunZ[bkdllynhloa¹©§¡¢¦¤¤«¢ ¬ ¦¨~r|}~ztrp
{}
x~¢{¦
wr
ª¨ «~~¨¦xp{o~¨
p}qkp|hm]sqtkvsYrn}~i]id{
_ix{{vhykaqrw_s§fnwp
yoefcyz[\ifnv[{xwtmsrf\mklbYY^ZXlq[_`Z^]ft}{tosckkj{|r{xtdmtgl{~vz|{zz~o{}s~ysiT\qiluougkhd]aXkhkjqrmW[enlgszohjm`ª±¢£¡¨¢¡}¢¥{|r|v
qor~z¦ xz¡« ¢¢££ª¡§¦ |x§~±¦²¥k|vwe
|
w|yu¡
~vptx¦
|vk|yjrh`sp}zwvowt]^ohn_^Z\]ShqUc[\alhu{|rnpdkji{mxqioplf{rx}zm|zx|~zxNdvksmpzdkebb`[tfpfrrmU]ltmhyzqgikeº¢¡¤ {«
|x{mxr~mk~z|©r
}{ª§ ¢¦ ¦w|¥{|©¡ª~ox
qt`~u~
myut¢
t||rr{{y§w
|nk}{mhlmg^yh|{vtuu{w\`p}nu`cZ]^QfmSeZ]ajivz~pkldkjglslltoxnynv}vr~{{|{`i{juhidjc`i\duhobunlTcqyepzzseimm·¡£{x¦¤xz
{m|~xs
}|kh}|~|¦p ¡
|¨x£¡¡£¡¤~
y }|¤ ¦~~utpv`}r|r
hwqx~s||py{
z{¦|
uzer{xzpljf^}sh|uus|rj^`tvpxdcY_^RkhTdY_agjvxqfkclhejm~hnqk}wzks}tv~|{}jrnsiahlb_qVtomn`xhmWjtvcu{{rbjny²¥¥ |v¤ ¢x{~~qztu
~xgc}x}y}o¦¦
v¡¡z~¤zx~s¢¡¢~|vq}mzd|
pleuo|}x||{q~xy
¢w
v{v_xw}s}wflda~ijwstt}q|bcasnusmaZ`^[kdRbW`ahkuxpbjcmeh|lhthloh|xmqs|~z~|mvttmeljacuViqn`yglbjvpfy|zq`rl
¦¨}wªyy{}|{xtxzs}d^}
t}}}£ ~rz§ t§tlzo£|zqykul{}~n
wo}~drj{ty~ux}}
¤x
t}sun`{uzq|oancd{bnovrwwstav_oluno\[_]^j^O]Wcahmszk_iejchwmflhilh|zwns}sz}z}|rzxxnlkh_iqchqoewhnlayhk}{xpawmª ¤¨}w®}w}{||vwptszo
|~|`\~szz¤}{¤n¢¡ogz
p¡|{tsukqnu{tn
qt{|dqly}}ttyo~|
¨{}~
w~po
chxtuo{b^p`jt^qjzxxlrpex]mlsmsXZ^_ajZPWWecgqqf]ihgbgqodigejhzwtn
t{u
w
|x
zw{zryjk_phtkromqgole|cnyvqlww¢¢¨¡¦tª t{v
wxrs{
kroymvnq[Y~vu w~
m¡
j
£g~w~||nvolmnp{
ispwtxfsov|zzwtp{{£|wxxnj]rsqpoxZ^p`pj^oi|ypmmjlv`pokrmYXaaanXQSZfgcupb]jmdbfkm`ff_hjuqrpuxux
ww{{vjqc|b|oqltjholvw_qy{tut~¤§
uyrxtprsqulolumv}mnUQ«xvry xz¤
|r
ig¡qw{z||kvjnkklz~ay~vzw|xgtlt{qzpwz{~
}|x}vpiky_womkqsV]obq`_lnypgpffsthqlawe]Vfa`rSPN\fe]xp|^\hrbbefi_hd[gp~pkps}v|
tuy{xs~{ywfrj`~ookz`jntt_t}yxts
|x °¥vtvspo
spqokivmn}|mtsRNßÈÖ|ptuw{r
¡~xz~yvhl£
cq{zy
{~l{erojkyy[yz}~zyhsks
}l~o}z|wxysmfpljtohismS^odpY_kqwfkjbfxrppc_w``Vk_]vONK`fc]yqt\[ev`aeecafaXissnkqv|tyuv~s{~r|~vesm|e~npkZlnyysavz{vrwwy®
w~|
twpyqnomn~rddxp|mz}jhlc¤ÁÜ®ï¡skuu¢
np
£
{uwvvn}£
^l|}
v
}}k}dwujmxsWz
z~
~xesj
kun
zutxusqguybtmobhugR`qgkU_nty`rc_h}prn[crabWnY\wMMLdfa^vsm[\dx^`de
_cb^Xjrknkrv}swxw{q}~{t~~shuqymzntpXqzvyqewyivr§£|pxy
¡{{rwpsjokil|t^`xv{pu{g`e|ëÚµÉÃÜslsvip
|{vxrvp
¢ai}}q~qwhuriswkZ}
|uatl~}nly}}orzulpkrx_sin\jv`RdqhfS_pvt`o`]hqsjWghciXmW[uLJLeg_brs
h[\ey^^dg{`d_\Ykneojsw~sr~zvzs
|vw{vlvuyxtnxz}Xy
qogywdv
q
¡¢sorw}{xqsnodr~hflww[_y{zqqiagaÕ¶¦xnqw{pj
{h||~
zu{{puv~ag}~~m|tkmvtsvukc
~|~p_sq||zqfz|
~npzumnjlz}bhjiXluZRiribQbrxlae]Zjmsb[g_el_nTZoNHOge\gnqlZ[cr_\ckwde]\Zllcmjsvqo||txx
}uy|vowy{pm{w^tmi{ssgr}r vv~mv}|v}vqoljat|gbiuzZ_w|zmq~echhW^qr¼Ãuq~rrj{|}|u
vw}qu
ru|f}
r}g~{x~|i|veoxxrvslj
xk^rxz}
{~riyy|}nm{}wtnhg|vc\pbWorSSnshaNftxe`]\XnosYea^jn`pOYkQDSgaZknm|nZ[^lbZcovcf\]`licljsvqn~{tu{|
v~xtrxy~oo|qiyz~mm|vkjwtl
n}vjx~yozspljd`t{h_eqzZ`r}ygqzaee±²wJbZ¤ÙÐq{w}
nk
zy|xxoqt}zix
¥o~vy
p{}nxh
xr{e}~ucprhxpou
{vxyk\q}r
}zrnq
syxnovzehj}p_YwZXqmNWrsg`Klvt`][[Yt}roWg]fjq_nNWhQ?Yg_[pjgyqZZYkeYcpy_h\^emhfliqwol}uo{~v
qq{|yyujzko~t}or|{onxf¡gogz~
|ixrklf_aoxm_box\dkzaqv_eeÔê¾2:>qy
v~ml
v}
|xnvwo
ku{tey§}ntvy~{wlri~xm|{wbyqdqh~mtqt
~ru}rp[m~tx{|xzqlrytnkwuu\ihwpYW|SZpeLZrre[Jpwn\ZZY]t~uhYb[genciLWfQ=^f\]ue_tpZYTodYdqyZh^_gmgjlipw}li~yn|}zu
pnx~z{h{}jt{r{sw}yx}|kl~kh~{~}kuqghc[bgrn`aksahpyast^cd n\5Y¯µti|v
svpl
uyx|zsgv~~oq~hvymey¤~n~v||p{}{h~mk{zizvr`w~qdrfumt{
|nwy|t~mXovtwvzxsn
r~}~znnjnun]gfsqQ[{N\p\O[rpdUKsxiWYYZaqt`]]`gdhifNYhM@ad[`va]umXWStaZdorWj^ahkgmlipw|kh||p~~{zwq{oqw{j~{nwyvw}x~~zm
£{uyklx}{~prpcf^Yg_op``gpfjotato[adjv{¾¦£È¸q
s|xsrro{tutwyyqcwzirvfwucj|}r~syx{kxy~ugzhkysizv}h`w}jktg{iv~z~~p{v{t~bVw}rs|qwxpp}y~}vviqimrp]hcsnJeuL^nUTYsnbQOsx`RXX]bps[a]hedcjdQZpIDda[cp^]whUWUw][enhVk^ajgeoohpvzniy}r{~x|v}pvrnw~p{wyztxzuo~}
zw{gt
z{vgon_d\XeYmr```plkhn`siY^dmw©Ú©Ç²qxou{zutt~wpqmtxtk`zyfqogvm[m}y}x{mut
{
ltvmgwem{umjvw|`bxzhtub}zgt
{tuqz|mYVt~ouyltxku}{}x{s}sgtenms[j_udHnnL[bWVUxmbPRtvWPUX^aqo\`cmdc^nbT\rGBf_]fh^[{bQU\u[[gkaVj_`nffkqhpuxtku~vx~w{s~oqtqu~
{wx||
x|}~{~svyzvty^}
yt
w{bnl[b[[aVjsc`[gnofqaqfW]ck|Êι¢jmmlqq|~{
zysyuu{jlucuwof^}zerkjqcXl{
sw~{nqq
{y~qqo}fhqbmxqjkqw||y\eywiuxfvgt|qio~yn|]Xrmt|ooqvhww}qzt|zrfsanlrXk_w[InkMVU^TU{kaOTurPQTV^bt
h\`ljfcYnaXbpGAh]`f_]V{^OVdpY[jh]Wh`_rfkhrgprwxntzx~yur
pp{xwuyz|u~}
~~}|xvyw|mvycso
ytcnjY_[]]Tgse`YdqqfsbkeW[`iw¾®{ ·mbshs{qy
{}wxrvo{vejn`usjb^~xyfq~hjkZVox£qqxums}xtrnhy`jm`mvjgjkywzw[g}|xer}mteu
ofkzumtb\o|ku||fu}mqgu~x~r}kzz{xpflbn~mmVk`wUJjkORNhNY|hbNUujLPTU_gvf]`qhgaWi][khJEkZbdWYUyZNVmjY]le\Zec^tfmdqgrouwp
v~w|
}usnsxzzss
y}v|{~{w|wwziw}|lrq
~oflfW][\[Tdpd_WcruiupeecW\\hportddx~itussxyvsunkzpagkgtnf]_}p{~imwfidUVro¦|{vs{s|zn{{
v||tprlgu\mh_ltdgfizo{rYgwugpwubw|nimzqfse`mzgsw|~buvikqtzqyys}f~xwncfbn|mkVjbpSKikOLNpG^{faMUtcJNSWajv~e\gsif`VcWbp]LKkXcaUTUsVLXudZ_ka\[ce_wfmbpisnrttww~z}u~
nrt{zuq
zut|
}~{~v{£¥y
lu|{uzn
sy}unjheV][ZZSbnd[Xbs{ihmi`bW_Zijkogkahyxjsttm{}vum{hjyj_enhvgeXbwi~{oiogf]UXoh¨wz|yuo~osuywt
ujrvghn[ld]lr_gaixh{mZmrsio~yw`wxrqoyrcqh\owdqs|xbspgjxsrlxwuwd{wvoddcn|}klUibfSKmhOGRkEaxgaMSq\IMTYekw{e^mqid]V_UnnWKThWf^XNUlTJ\y_[_k]]Zbe`zhlaoounpwuz}wzzxz~qtt~zvt
}}ks{
}~{v¬zlrzvuno|sjomddX_ZYZUbjg\Z^ui^nl\aV\\kfqt}ii]kvugtwql
{}}yvrlzhixf]dshzwccTepg
wwfhj`WVYgc§n~wzpp|fyoz{vq}~ndusdhh\kb]oo[g_ludzh]torkq{}uuat
zwruuaplYqtbqr
|udrlalzojizxurf
uzzupdadns~ilTi^]TKscQGVaGbvfaKToWJLWXgkvzdenqfcZW]XveTJ\cWhXYIWeQHbxZ]_l[^\ad^ij`otxmpnvyr|~uuy}tuuxzz}~jsz}~
zz~|sq®{{~frzt||vrol{}lzbpobe]eVYYVcfk`]\s
hXqnZ^WZ\l{cpwvlb[lrsgtuply~ywnnteite[gufvvz_]Refjt}bci\TX]bc¥hxt
xmnygxm|
{urx|xhevl`f`^j_]skYe]oobze[w{knnpwxstdr~zuor}rbxd[opaqq|sfqd^nvidgyztnout}sqb_fno}djShXYTMw_QJYYHbtdaITmSILZWilq{bllscaZZ[av[SKd^XiSWGY`NGiuX^am[[_bb]
hhanxylokvym~vtttrwvw|}~~~px|yxy}tsp¢{{xduysxulto~ly|pr^po`gblT[ZWhcmf\\qeRrn[ZXX`lwciujj^Zmsqlsssj
|~|wnnldiqc[jrdtvs[WSdarr]bc]SZ`[cerq
tljylopz|{qvrzyydeuh]bZag[^whWb]ohaw`[{vjirnwssthp~urjp|mfwW\kmbqszsfo~[`oqb_jq}llt~sqxkpa\ellzagSgUWRPv[RPYRIcsb`GUjPHPZUkkk|emoqa\ZXYlpWRPfVWiSTFZ\OHrtX_cmcXa`a]jcdmyxkoiuy{k}|y}nqowz|t|tw
uspuo¢t{{exnn{ofxpzlsvrk^tnagekR][VgbllZ\qdOon]VXUgjtgbtee]Ymtmpuuyj||wsddkna\nmcsxkZTVbcx}}q
]c_cTZ`Yccnp
sjhznesvs|lztuoy~u^frc[^VbdXaueU_`mdaq]]~phisqspuujm{qrfn}proS[fjfqtwsblvUbqj[_ne|emv|srsjm`Zdjjw^fTdUVPTmWQWSPHer_aFXiNHWTVmhd|ikxkbW\U[tdSRWhQYfTSHZZPMxw[_eliZb`^^nbfkyunohvvl}{~krgt{u}s|
{ss}vn¥svwmz`d|pfzsylmqvgd{lcfghS^^Tg`lo[^nhNjm`TVSogskewde]Xotlrzwrl{v{zkaelm^`ojepx~gZVX`kx|{p_b^gVX_Wdbkq}wkkxl[vqlziusno{rXjn_Y]UacWdqcS^aiablZ`~lfksunmwvkh
zmpfp|mrmcYahiottr^ilReqdTbnbzcqv{ukpmk_Xaght\eVaVSNXeRO\OOHep]cFYiMI_KXmd_xhn~d`U^T]t[TR`fN]aTSJ\YPYuv]_fmhXca[^pcgjwqsngvtzrz~|yntlst
y~|sstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBN¥¯®°knnnnojfggggfo
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR455553A©¶´´´´·|ehggghc_____^j|}z{z|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{{|}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxz}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvtuvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkiffggghhgmgjghehgcbbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__ac_\_]`]^Z^]YY^ba^^ZY_[XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSTPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTtsuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOPPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHHJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AE@>:;>><ED=?EA?@A@DEGGGGBDDDFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;<<<HL==AA?BC=ADDFCFFDFIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprtusqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<98:<<>=;;:8:@@AB?A@CFDCCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqusurqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::979::78:9:;;8789;:8<<=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==?@==;Ke@==>=<<<;;:;<>=>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?=>@?=?=kxT=CE?>@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CFD?<<=@MLFHwuY7<:==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAAB@InP;=d~uzvS788:<>??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC?W{yRe|xR<=?=BFAD?;<=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCE@Ytw{|{L?@C?JR=MG<<=AEABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{|{}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA?Rus~{{~b@CCE>O[LmhI@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKLIGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EFku~y
}JDFDBc~
~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJG]xjABVt
WILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLLX
}Sm|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIJIIHHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJ^
uIIFB??@???<<<>::<AA@><998<<=;>;9;?AB@ACCB@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJIj
fDC=88::9878896479;<:8567789787588;;;=@;999=<>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIg
^?7656766645763468:876565676778:77789;7578979876:<@GFIFIFEFOSRSSROPPRTepqsttwy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECBj
H676468874578467699766765:9:::;898977779:98878589;A=>>BA?AKLOQPQOOORWkqrttuwy{{{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B9A{z>:88;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<<99<8::;:999<?<=ABDIJMKIKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?=P
l<;>ACEEAAAB>@B@@>=>>@???@?@==?B?AA?A?=@@@>?A=><;:;99;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@BY
^>DGIKJIFGGDFHGEB@@CECCABCB?@DHECEDEEAFEFDEFD@B?<@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@DDE^
WHLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A?BCHHJ]
PMPMKNKJLIIIHJFDGHHIEEHFFELLMIJGGHIJOMNLLMKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<;<=:?@>@@CFJJQc
qMQOMLLKLJHHEJIDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnpuwwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@8:<8=>;=A>?@EIKMVr
_QQPMNMKJGFBGJGLJFKOLKJJMMLOPNHIKLOQQQQOOJIJJLJLFGHGEGIFEEB@BB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAHLMQWy
|WUQRTROLKJDEFKONOWVQPOQSRMSTOMSLPSUWRSQPLJMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BCGVNFOQQUY|
gVUkaERQQPJ;;QSR`u]UVTVYYRXXRZfPUWZ]RTWQPMRPPPQKKKHHJHEFIHIHIirvyyzyz{{|z{|}|}~}}}}}}~~~SHJIIGGFE??AAEBCGEDELXRMTVVX[|
}al[dU:XXXSP>@VUY[c`VYbr^]V]ZVEQYZ[Y_TYgRUVXTTVTOOMJLJIILMKOMSosvxyxwzzz{zz|}|~~}~}}}~}~~~~VJJIHGFDDBA?HMIMPKIKPTSSXZZ\\x
g;~znpXZ[ZRSRVVTZZtYU}a\X]^WIV]][[_YHYXY[]XXYWRQNPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\XSVTWRQWUbQerXZW_hP`f[[X\gaGOZhg\[\]]WROSPPQVVVVYZnrtwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PUXTRTRQQLOLKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ[\^TQQPINOWVXZZdqsvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUTROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKMNKMKHJDFHEC>ScURQQNKRTQMOYQMNQSUUMQSRPOMLHCIHRTUZ\mruvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVPLILIaltPQSNQRQR[RSRQRUUbs{|}{{
u_]KC?CCCCB?DPBC@C>BHGV@HNMG]iQHFOFDEFHGHBCHGHKGCBAD@OPMSdstuustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfiedb[XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kLG??;;>@???>kQJaEFHIEB?GLMGMQUIBE?><=<==?=?ACC?><=B>JMFUnuuustvx{|z}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QRZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrjmlqu{z}{xz||xwxdB@@B=:BCAADB\]O{NOONKLMOOQLKLWMHG@B<977599=;;;8989?;BH?\ttuvuvwy|||}||}}~~|}}}}~}xuvz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbXGFFHBAFIEEFDMRPaWRXQPSSRU[OOQWPMJCF>::6486979:366795<B=ettvwwyy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXQLXYZVXXVXY]WWXhsk]Vaskaa_]d`_^YUPMONLHHJKIHFCQPSZWTTMQSYS\eUOSTQNKIHC?A9988978847578599Gnruxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY_[VY;DUWT[fJLPRROMMNNNLJFPPUYSTNJOOTST\VRUSROMKIHHF??=:787659967665Wppsxyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxrvuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOJHOPOOMRJOPPPNNOTLMIPOSTU2<XMIAQ=caQSQPNPQPNNMPNTRPRMILKOQPQRSTQROLMKLLHCBA=::876;B4566;epquxx{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEBFGGHFJDHJHGEHLHKHFLMPMG/E_R>3@>joaRRQ@FUQPQPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;=<<9=G6676Dnqtvz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHEFHJNKEGCORC8ENS]fSQSAGUPOQQPMMNLJLKLNOOQMOOMHLLIKKLKGFFED<AA>;@E;<89Tqsuy{{{}||{y}{z~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLOOMQSLTUTWWULLKH=987;?@><=A@B=>EHGDFFIGJJ@FAA@FHEJOHPRa\QPRNSOOOLLOMKMLMON[WKMQOGIHCIJLLJFFFD?BC><BF?B?Adqux{z{{|{zzw|xy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;?B@@>ADIECHGIGIEBB?>=CBAGIDMOaeQMONWKLMKLMMLLKNNSdMJLRIIIEAHJLMNJGIFBAB@?EFEHDKopwzyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHKE?B=999:?B?<@BBADEGKFDIIGGHCC?B??@A>CECKMQTLJIMTFIIJLJKKIILMOPRPKGCKGCBJJLMOMIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqnjllnttmtu{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKDGHHGJKIJKDGB=>=:::;@B?=BBCCGFJLJEIIFGGCC;A@B>@@CECIMOGHKFHKDHIKMHJLHHJLJM]RIHDMFADKJNMPNKMJKFGGJMNQNLcnivvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKDFEGDEEFEGBC@><=:;::@D@>BCDEIFJJLFIIGFFDB;BCC>?CCCEGLNGKNHDHDILNMHILGEFIILNKJHENHCGMLOMOMNNMLIHJORQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGJDFFEBBBE@DB>?>:;;=:=>CA?ACEGJGIILHGGGFEC@=EEB>ACCCEGHIGMPIFFFKNOKFHJFEDDIIHKIFHPKDIMLPMONOONJJIMRUTROWd`amgproryzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCBABD=BA>A=::=?;>>@B?@BDGJFJGIHFFGECBAAFFCBCBDEDGGHFLQKIOJJLKIGHEFEDCIHHKJGKRMCNOMQOOONOOKKKPUWVUTX`^\iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqrjksMGGFHBBADD<AA@C<89=>9?<?B?@@DFHEHFFGFEEDCECDIFCFEBEGEEFGEJMKHQMJKHHIEFHHECIIJKMKOSNDQRPQQNOMNPMLNSWVWXVX]Z]d`hbjigk_eegcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqiozMHGHHBBBFE<@BBD<7:=>:>:@B>??CEFDFDDGECECDEFGJEEIGCGHFHFECFJJGMJLKIJLFIIKHEKKLMNORTOISUTQSPQMNQNMQWZVZYVZ]ZXa```^hec`dehgjihjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmstnprsyNHHGIDACHE<@EBE=8:>>=<<AB<?>ABFCEBBGDCEEFGGGIFGKHCHHGIGFDHKIGKHMKJKLHLKMKINLONORUVOKUVTQTQRLOQPOTYZY\ZY[^_^`b]\ackb`dghr
hgifjmnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqvquMIKHJEBEGE<@GCD@9<>@?>?CB<@>AAFCEDCHDFDGEHHFHGIKJFJHHKHFFLHHHJGLLLLLIMKNMMOLPPQUVWOKVVUSSRQLORRQV[[]^[\^__a`ad]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrvovJKLILGBEDE<@FDDB;??A@@@DA?B?ACHBEDFGEIEFDIHFIHJLHHJJILJFJKHIJJGKKMMJJMLNNNPKOPRUXVMNTVUSRQPLNTSRW[^^_]]`_aaa`bceachbdijgvlkigmosqpqppryvruutsmmssmqrotutrpswtuuwvuuteqskpqjrvowJMLLLGDCAD<?EEEC=AACBBCEBBDAAEGCHGHGEJFCGIGGJFILHJJMKMLGKIHLKNQKRQLSMKNNOPPOTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^`b^`eaabgnhbihhmxvlhimosrpqrrrvtsusssnksqmprotvrqquvuswywutucmtkopjqtowLMLKLGEA@D>>DEFC@CAEDDFCCEGCBIFCHJJHIKFDKJGHJIIKGJJNKNLILHJMKZfJd\KlSHON_nUks[qpbwcRPbvuhucav`Xnqbdvinzf[lt`ljT`wuijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqrqyKNJKJFC?@B?=DEFDCDBEEEFBFFHCDJEEJLLJLMGGMIHIKHKJIKJNLMMLLILML[sbdp^lmUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\ougpMJryvkb`keemymkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?BB?=CFGBFCEDEEDCHHGDEKGGLMMKMMGJNHJKJILJJJKLMNNMMJMMM[roonpplkMPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\_rkqjUuyxpc^kfbgqpjioppsspqpqqrrqqrrtlmrmnnorutqtrtuutuuzvutenukpolsrryJKGGEEEBBB=?@FGBGDIEEDBFIHHEGKJGMMNLMNHLMILKHJMIKJJJOPONMKNML\hdu]lqWlNPQmUZk^klvaldtTecNmYl\tpkilxjwuhp]^rkhWbcw|oc`ghadjuyknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtwIMGIDEECAB<BABFDGFLHECCHKHHFJLLFMKLSRLGMLHNJIHNHJJIHNOMNLJMMJZsppoqqmlOQRnYqkgooqqomt^nXat_nopoqronusttj[]tcwxrjnzhaacgbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtHKHIBEEEA@>CCBGCHIMIFCFJLIGFJMLFOJKWRKGKJJNIHJLIKJIHJLMMMIKJKSkbZi^_jcrrZ_Yjo_eeUk_c[abQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFIDEDFA@AEDDGBHJLHFDGKLIEFJOLIOIL[QJFHHKMIHJJKKIHIGKKKKFHJJLLLKIKLNT[\TPTLPONOOVQOOQOOQJINPQdqiTYW[[\UY[]X]\\cfaafbce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusHCEGFFAEC?CGCEGCIKLHFDGKLHDGHPKLOKLWLIEEHIJHIKILJHFHGJGGIEFLHIKNLIO\W^O\[`^OXYS\\b^MYZMXaRJYaZS`d\aX[ddVVX\YZX\VY\]b_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBDIDGGFKJKHEEJJJGEHHPJLMJMSIHEAHFJIKKILJIFEJGDFGEEJGCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN^\^S[^c^Z]`c`Y_b[`^[TXXY^]ccbaceiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKKKFEHINJNLHLNGHF>GGLIKKJKKIGEIDCCEAFJD@JKIO[cY^^a_RTSW_`\]Y^QY\MV_WKQY[PZ_aa]^ca`bbbcceZQYVU\Y^d`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFDGEBEGHFGHIFGJGHFHKILDDKJNMLLHJJHJG?GFNJKKMKKKIGGCD@DAHIA?IJGO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^PO\_accccb\dcbdcfXQUTS[XZa^^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMC@IFCEKIFFGHGGIFFFILJNEDKJLNJLIKJHIGBHHQMKKOLKKIHGED?EBHHAAGFDT]Y^X_Y_[]UXXP]]QKJW^X^[]VZ`RQ__bb``bb`cbbddbXOQQR[S[^]]]^__dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHCRKFHHHEFKJMPEGIJKNLLILKIIGDHKQOMLPLMKKHICDAECHGBAFEBVUE\T]SV_XNTUNZ[MJKU`a[_X_^a]OYb]``_bcb]bbW__TPNPQXR]\[\\^`bffelfoow|{{}
zo
~INFDEFGDIRbPDW_IGGHDFMJPPEJIJKNLKKLKJJGEJMQQNOPMNLNHKADACDFDCADFALHCLLPOOLFMFGIJHGLLMOPILOPPSPLPTSUZYWYXXdVOSTPPONPUT\YYZ]\`adechcklpsszy{z~{}{
}KIEEGFGDKM]LGHYMGHJHGNLQQIKJKKNNUNOKKLGGKPSSNPONNNOHKE`ED_LDfcDM[H^\smOMVmYLCP`UlWgJ]WU^DLQULMTVQSTXWTXUT\TPfZhhdXSkTWVU[\[``abbb`fhfnlhrz|}~}|zr{z{
~z{LIEFFHEEKOSIKG`THJOJIOMRQKLKLORUROOJLNGHMQ[YOPPNOPOIJPQI|YYrsWPmHqnpaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`Y[`VUWjtuu_`w`Xa\\f[_aaaa^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMMBDLLFJLFRVLKOIKRXWQNNNLQTNOQPKLOGMPS[ZTQROPPPJHZx]TxehYRTQvgtlpbnfjQrOMwmjrpsrqrpop]ezuxqqzq~s}ku}bRg|essoss|}o}yor_``bbZ``gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKJHJPNMMJNV^YULQSNYYLSSRNLPIQRTYWWQTPPPQKGfxlcxrmZJLUypumubnvPdeJfvqmwojfxxiWsQhzmijzz}lxzogoXvvjuup`sh|ilx|o^__cb[]bdgijdgbcdllppstsssyqrxblugry{ssuy~suzn|}yxrnMJStNCBEPPHJKJLPOOPMPZ`ZXKTWPa^RVQYSMPISTVXWWPUPONRJKrouuquqdh`VnLqp^FhyWvTKhx}x`y{sna^modRgrunmypwlvttqlm\t~zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsy~nqpj{ztromKK[VHGEGRPJLMKLQQQQPQW\YUNVYUfXRRY^TMNITTWWYWOSNNNQHRmHiwK`dvvUWlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhe|ir{]TKl`vukiu{{m~xk|p]^^b[^bddgeeebZccikkrsrwgmihdg`alagsrkhlmr|kmhk{tmmkmOHJKHIIHRPLNOMLTSSOTRWRVTPWZVVTTTa`QONKTTSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXXQNPUTXXX[[URSW[WXWZOSUWWXR]YW]VTOYRWWWXY_[gr^[[Y\]_cZ_ccdfdccbZccfffmnmuffgc`f_]g`dlhfgkhozhggkujhgilQIKLLMKJSQMQPOLVVTPTUXUYURZ]VUTWUYXPOLMVTQNUSNOMLQPKJQRKQMKKORTRQQSSIHLNOQRQQQTVRXW\WSSQQUUVSZQOSRWUTYVTYUSRUSTTWXW]Z^a]\ZZ\\`c\]bcdgeddaY`acabhhincad^_c]Zd\bma^ffgmsdihkkedcfhPJKLOOLMTPNSQQMXWUTUWWWZVT\`VWVYUXTQPKOWSPNUPNQNKSPMOUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[TOTUXUTYUWYTRRWUUW[YZ_]UX_]^]\]aa^[bbchfedbX_`b]`hefda^_]]^ZZ_Z_g`^]]chkagfhfd`bcaPKMLPQLOTOOSQOQZYXWXZZXYV]jdVXYZWVTTOKOVTPOTPPPNMQQPRXTQQOMOSUOWRTUUONMQSUUTTRTXVZ]\ZVVQRWXV[[WQTVVUVXTWWTRRXVUZ]Y]_^V^]^`\\``__ZbbdhhedaYb`b^^fdc`b]\\\\YZ[X[a[^]\_b__bddbd__`\PMNNRQMRROSTQPU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROLPSRUZUTPPLPWVRWSSSXMOPRTXUUUSUYX[^]\[VROUVV[\WQTWUWXUSXZTSQZWV\^Z__`Ua\`a]`b_\`]cacghdf`Yc`a__ee_`c[Z\[\ZZYYW\Y\[`^`[^^a`_b\Y`ZQNONVQPTROUTSPW\\\X^\_W\^jqwyc\[VVXRNOWSNQQPRTRKQTSXZWUORNSXVTSTRRZOQSSV[VVWTVZX]^\\^VSNTUV\\VRTVVXYRSY\TRR\WZ]^]aa`Wb[cb^ac_\bab_dfidf^[d`a`ace_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTP[]^][`\`U\]ijr}slg\UYWQOR[SRQTRTUTKRVU[YZSOSRVVUSOVRSZRTUTX\WXXSX\X^]YZ]TUNVWW^[XQTUXXXTVX[TSV]Y]]`]bc^Y`[eb_dd^^cca]efidf]^da`aacd_b^XZ_[\[XXXXW[Z\`][[\[XZ[^V^Y]POORZPZUUVVTTT^^`^^b\`U]^bkytl}lZUZUQQS\TTTUTVYWLRZV][\ROUSXWVSPXRSWSVVU[]X[YUZ^X_^Y\YRWRYXY_ZZSTVZYZVWY\VUZ]\^aa_dd]^]]eabfd^^dc`\gdhedb_da_a`bb_`^WX^Z\\ZYZWV]Z]^ZY[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]`U]^beeuzhXYZTVSV\XWWVVW]XPU\Y^]]TRXRWVTRTXRSVTYXY]^X][U^_X__X]VQYTYZZaY\UVX[ZZXYYZXV]^_^cbaee]b\`fbdfd__dbb[fchecfaf__aaaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNSZVS\TVWYWV\`abcad__V[`da_zuohY\ZVXUW[ZY[YXY`WPU^[`a\TUXPUVUSVVRSUW[Z\_^Z_\V__Z]^Y^VSYWYZ]bZ^VW[\[\[[Y[YY^_``dbceebdZbfcgfe^ab`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWYXW\[\`]V]]SPVZVVZUXVXWX]_badada^YYadb`lfh^\][WXXY\\\_[Y[bVTW^]ac\RVXQWVVVVVTVTX\\_``]`]Wa^[^\[^XVXX[Z_`\_XY]\]]^\Z\X[_a^`dcdfffbYceehgd^c`_ec]fidei_g^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bMRWYVWZX[\YWY^`baeada]^Yacb_a`a_\\]XW[[]]__\Z]cXZX]`cd_RXYPXWXXXWVXV]]^`aa_b^Ya]]^Y]^YXVW[[`_]_YY^]^^a\[ZY\_b_bdcefefbZdfgigc_c^afdZiibfice^bbca``_]]ZW[YYXXZXWZ[ZYWXVU[]]]``bbxKWW\YW\\\]ZW\]_`bdbba]`Xbcb`cab^\\\XW[]_]`_][`d\\XZcec`R\YOXWY[ZYXZY`]`bb`ac_\b]_][^^ZYUX]]_`__[Z^^`bc\\W[]`bacedgeefd\efhifcab\cg`\iibhife`baca_`_]]\Y\YXWXYXW\[ZWWXOXZ]acffrkJYW]ZZ_\\^[X][^_acbaa]b[bda_ccb]\[ZWXiq`\`_]\ac_^YYcedaS_ZQYW\]\[Z[[c`cbc`bda`c^`\]^_ZXV[_]\aa_][`abeb_]S\_`cddfdgfefe^efhhgdd`[fg^ahhchhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{zzz{{{{{{{zzzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{zzz{zzzzzzzzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½±µ´´´³³»¾¾¾¾¾½ÊÓÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊ»À¿ÀÀ¿¿ÉÌÌÌÌÌËÛæååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyzzzxooppppprrrrrrrwzyyzzz~||||||}
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwtvwz{x{xwvx{wzzy}zyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{zzzzzyzyyyyyyzzzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy|{|}{}|xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww||}}}~}xxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywwwz|}{}~|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz}|||{~{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{xzzy|xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqpponnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{{yxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}||{~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~~~
~~}~~~}}}~~~~~~~~~~~~~}~~~
|||{|}||~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~~
~~~~
~}|
~
~|}}~{
~~}~
}
}
~~
}}}
~}~~
~}
~
~~
~{z
~}}}}~|z|
~}~~~~~~}}~}}~
}|}~~~}|}}|y|
}}}~~}}}}{zz~~
~~~~~~}}~~}}}}~}|zzz~~}~~}}~
|}}~}}~}~}~}}~~}}}|{{{zzyz~~~~}~~~~}~~}|~~~~~~
~|~}~~~}~~~}}}}{{|zzyyy{~~~~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}}{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}|}~}~~~}||~}}}}|{}|~~~~~}}}~~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{
~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}z|}}|z||~||}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~~||||||{~~{|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}}}}}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{}}}}}zx
~}~~}~}~~~}~}}
}~}~~}}||~~~}}~}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~~~~}~~~|~~|}}|~~~~}|}}{}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxtt
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||~|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
}~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}||}~~}~~~~}~~~~}~~}~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~~}}}~~~~~}}~~~|~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxry
}~~}|~}|~~~~}}|~~~~}|~~|}~}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqrpxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{||{zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{|}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{~~}y|zzz}||}z||}}|z{~~~}}|}}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}}~~~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|r}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyyrpvxqvtturstvinrotvnulwm{snzm}rsvsvmnwlpylu}}~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}{}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}|}~}}~~~~~
xyrz{pp
x
xyks~y{krz|mzyyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}z}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~}}|}~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||}}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|~{||{|||}{{{}|{~|{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}{{{z{|||{{{~{{}{z{~||||}~}{z|z|}
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~|}}}~~~~~}}{|{zyzzyzz|yzz{{{|z{{{{}~}}}}||}}|
~|~~
}~~~~{||}}~}~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}}~~|~~|~||~~|~}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÔÕÔÔÔÕÔÔÔÔÔÔÓÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÜÛÛÛÛÜÛÛÛÛÚÓÒÓÓÓÓÓÔÔÔÔÔÔÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´ÓÒÒÒÒÒÒÓÓÓÒÓÓÒÝãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤ZUVVVVVVVVVVVWNCCCCCDDCCCDD@\ÒÓÒÒÒÒÒÒÒÒÒÒÒÐàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>>;=B?8<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥_YZZZZZZZZZZZ[SHHHHHHHHHHHHD`ÑÓÒÒÒÒÒÒÒÒÒÒÒÐßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª£hdeeeeeeeeddee]STTTTTUTTTTUQkÒÓÒÒÒÒÒÒÒÒÒÒÒÒÞéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÎÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌËËËËËËËËËÊËÌËÍÔÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÐÔÒÏÏÏÑÓÏÏÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××Ö×××××ÖÖÖÖÖÖÖ××××××××××רØ×ÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÏÊ¥ÑÏÒ¸ÑÑÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏϪղ¸º¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐËÌ£¨±Ñ}~¯°ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѽÈÂŶÕÓÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÒË×¥µÔÓÀ ÐÏÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÓ³ÄÔÕ¢µÔÔ¯¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÑÎÂ×¢µÔÓ£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑËÚ¨¯Ú¢¶ÔÎÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ¥´Ù£µ×áÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡Ê»¡¦§Ë×¢´Ù²¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓ¶ÖÕ²ÆÖ¹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÒºÄÕÒÒÑÄÕÑÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??>>AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÕÔÒÒÒÓÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<=9;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8:87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9768579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<:;<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?;:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡ ¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;A>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=:F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¤©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©ª©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§©§©¨£§¦¤¦¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§¬©¤¢ ¢¦¡¦®¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯ªª¨¨«°©¨ª¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocniib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9><B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶¯³°«±²±¢¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¤¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__amhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µ¶¼¼¾¼¼¾Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÂù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCCDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndomhqxoyjia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÃÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³±¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrwsyfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÃÁľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ³¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijg]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬§ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÇÁËËÈÆÌÊÍÅÆÅÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuotb]bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<9>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÂÿ¿¾ÄËÈÊËɼºÕÖÉÌÈÃÈÉÉÅÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegdjeajmno^Y\VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ã¹¸¹¼½ÁÇÁƹÊÊÁÆÃÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·½Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbgc[ZZ\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶¸´´µ¿»½À¹¾ºº´À¸µ·²®º»¶À¹Ú~¼Â¾À¼»Ä¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾ºµ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޾ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ §¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjgfiei]VVTYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ¸½ÉʥǺõºÇ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¡¢¡¡£¢ £ ¢¦zxqmeefoiekhXXNKKKRILHC9=8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<97>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ··¹·º»º»¿Ñ©{º¿Ç·¹¸·µ¸º´¸³»ÅÆËÁ¼ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤¯°¶¹²½¾»Ä¶··¦§¦§¶ÄÈy~
¹ÉÏÂÀ¸®µµ¼¾¸º²¾ÄÄÊÅÁÊÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qflintnxcgb[cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?@=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼ªª£°ºÑÓ´»¾¼Åº´nhpcky¬{{
»ÑÑÌÊĵºÀÃÈ¿¾µ¿Á¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÀ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`aNHM?E@?DC<;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED<AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±³Ä²ÆÙ¼½»ÇxcbjNRZ`~y
¼ÊÌËÍÊÆÂÄËμ¹½¹¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸µ¼¸½iw½Î¿¸¯oYbdSlgSQQ[s}»ÃÇËÈÁÃÁÀÉÊÂÀ»º°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²²¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¤¤©§¯§© « ¢¢¢¤¡¦§¯©±{}znsxsgp][^\YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»ÁÀti}«¾¶pVJVjIZwsTPf|
¼½¿ÆÀ¹À¼¾ÅĽ½¹²°®¸·¿ÃÇÃü½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y}vluzpni[__YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BCBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹É¿zwi©VOJwtMQly{PT¡·¸·Âº³»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬£¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_f]ZTJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¸ÈÀ~sqlOH\hOOO®}]Kx¤¨±²·¾¹²µ²¼¹¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvql_ca[]OHA>=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·Ä»{x~aI`j^QO^®^PN{¶¶°¶ºµ´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc]fX\]RNMA>IBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸ºÁ
~SMxjZVl^unoz¥¼¶±´µ²´¯¬»º¸¶ºÀö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³¼ªLU½d{gb{jbmv ¾¸²´³°±°¹¸¶¾¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²°¤¤L`~yly}cajktym¤·²³¯®¬®¶¶³¼µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦¢£¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGPMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¤¬©´¿³³oa
oiiWc]^STYca\q{¢¶ª²´®ª«¯°²µ¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMJHGORMJNG<E@=2?759;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡¨¡¦ÃÃUunfofW[QHEGILKNae{³¯¯³µª¦¬«¢ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dyy`bRU`IIJKSTIRPL9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥»²}a_maTHFQKIDIGEJUY\¥²°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²±´ª²¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNOULSLA7>B68=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢£§¡gh_TGIV}~hSGCBFLPS±®¬¯§¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸²´¤ ¥¬¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HRUHFUVJBLG=KH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡¡wj[QJFLq § lNEB@?BT «ª©¤¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§ § §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BWNJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦¤ yg\RMKJRÙÙÀudVIDS¬¨©ª¥¡¢
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã¼·³©³ª³´¯³®ª¯£«§¶±¢°¦¡£¯±°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{trkkurphW[QETHDJPI?EA4FH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ nVNLNMVg¡Ð» ¸¦®¸®§££¡ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÉÉÂÁƾº´ºº´»·°µ²ªº²®»·¿»ºª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkchoxjdZ[FKLEDSLDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¢`NFJLVk~§¸ªÔÖÆ¿·¨wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÔÍÓÐÓÓÌÊÂÆÆÇÊÈοÈÑÌÇÅÇÅÁ¼ÃÁ¾¿¾µ¾³®¿¿ÂÃÇÄÇÄ®¿¸²¸¼ÃÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £\JBHLhy©¸¡±Ë»¯©¢yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÖÓÓÈÌÇÌÍÉÒÍÎÓÍÅÈÉÊÁÆËÇÈÉÆ¿Ã³³ÈÄËÊËÏÆÊ¿¾¿½ÁÇÄÌÌÈɿÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢ ¢lJJLUu¢ÍÒ»¡¤³ª£ ¤ |wpkebhqoq{
vpnqtp
³Â¾ÅÑÐÖÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÒÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÖÖÙÕ×ÓÖØÎÒÊÏÑÌÎÐÌÒÏ¿ÈÇÊÃÌÌÌÎÏÅÆÇ¶¿Ê¿ÑÍËÏÆÉÈ¿ÃÃÈÎÌÏÐÏÍÊÇ͸·»¨¥«§£ª¥©¨¨|xsvpc`drb]R\IJGAEHI>;A8=4585;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¡¬erv³ÑÛѽ¯© wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑØÒ×ÙÕÖÌÏÏÊÍÒËÎÐÀÆÂÇÅÎÍÑÑÑÈÌÍÀÊÌÅÓÎËÎÈÄÊÇÆÈÌÊÓÓÑÕÏÒÌÓÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim^VP_JJCFCRM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡¥¡´ÒÒÕ¦ }qecc__a__a`_``_`fnppnkorwwÌÁÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÎÄÉÏÌÊÌÀÉ¿ÇÉÍÎÏËÐÍÎÌÎÏÈËÐÐÊÎÊÂÉÇÉÌÊËÑÒÌÓÑÑÏÐʽȹ°®»¸µª¶°¨¸³¿»±
zvopokadnpaW\ZIFFDMWE;@=33<=87865;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©§lÀÕ̰k^^^adb``aa``a^__^]bmroortvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÇÎÍÍÔÌÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊ¿ÉÁÅÌÂÈÉÂÌÃÅÈÊÊÏÊÍÌÐÍÓËÆÈÏÍÈÇËÅÆÁÅÊÌÍÏÑÆÐÎÍÍÌÏÅÇÁ¸¹½Ãýù³²¾±»Ãĵª¥¢
ypqkmg``phXXhVLFLIPPB;C>;67:89:57==@;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨ ¬jh~ÖЪ|eabb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÐÎÌÔÊÇËÎÏÇÇÏÒËÑÏźĿÆÉ½ÂÇÉÎÅÂÈÀÇÍÈÄÌÊËÏÈÄÄÐÈÆÂÆÈľÀÇÌËËÎÂËËÈÇËÐÄÅÈ»ÇÃÉÈÂÏÁ½¼¿°ÁÉǹ½ª°²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»¥¥_mwªÔª~
s`[^^^`^`cdc_]]^_``_[Z\`krrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÁÂÌÐÅÌÈ¿¹Á»ÆÇ¾¿ÆÏËÿûÉÇÈ»ÈÆÅÊÀ½ÂËÆÅľƼ¼ÀÃÅÌÅÅ»ÀÊÂÅÇÒÅÁÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {vstfiZanlZ[XRDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²²^pw¸´{
vxurp_[[]``bcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ±¶º²²³²±Â¼¼¼º¸ÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅÿ¼ÁÍÃÆ½½µÁ½Ãº½Æ»Âº³¼ÅÄÁ¶¿¶µ½¿»ÌüµºÈº¿¾ËÄÁÆÂÆÉÆÈÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½³·°²§¨¨¹°¥°ª¬yvwjdg`hocV^YJFJFHJAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÑÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÁ¹Å½«¯`s°
y~|ttc[\]^``bcbbeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸µ·´³³´¼¶½±·°µ¯²»Â¼Áļ¿ºµ³º¾À¸Ç¹´»¶Á¼¸½ÆÁûµ®²¶º¿´Ä·»µ«¸½½À½±º¶¯¶º³Å¼·®»¿µ·´Å¼¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÈË¿ÏÊÇÃÆÂ÷ý½¶¹¾Ç¿¬µºµ·¶ytxfgebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÐÍÒÏÍÅÇÁÅÀ¾º¸Éµ©±hs{y~wx}ti^]]]_`_`da_dec__\[^\]^Z[[]_lpmhfjmnr|¤Ç¿¸¸µ°«¬§¢ª§«³ª¬©´¯·°²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶»Ç¹Â¶ª¨°²À¶¸½°°§²³µ»¼«®µ¥®µ®»²°©¹°»®»¸»ÀÀ½¹Â¿ÇÃÅÁ¼ÆÂÈ˸ÅÇÅ¿ÆÃÃºÄÆÂ»ÆÉÌ˳¹Â¼»³svvkiablhYWW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÏÇÎÁÃÆ¿ÄÄÃÃÊÁÉʾ¿¼Àº²´´Ã®©¯kc|x~
z{wn^]\]]_`__dbaccb`_][[ZZ]ZZZZ\enohfgiknr¹°µ®¦¥§§ ¥¡¥«®¤¨¢¬ª¬ª°£¦ªµ¶±½¹¯·¯©®¸´´¼¸´¼¯¸¹µ²»Á²À®¥©¢«±²³¨½ª«¨«¬´³¦¨¡¤¯©²¦§¨®¦¨·¬±²·ºº»²¼½¾¾Ä¿µÂÁÇÈ·¿ÀÅ·Ä¿»¿Ä¾ÄÈÌÊ¿¾ÄÀÀ©strji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁ˾»É¶½Ã¾ºÉ·ÁÃÁ´µ»µ°®´»¨¨cg{~~xt|swe_]\\^_`^_ccab``_]]\ZXZ[[YXZ\_fkfegeikor
ª¥¬¥ ¢¥¤¡£ª¤¢¦¥¨¥ ¥¦¬²¯¶·§°«¨ª´«´º±¶µ®¶¹²¯ºº±¶¤ ¤¦±§«¨¹ª¤¦§¨§² §¦¤¦¬§£ ¡±¬²´³´°µ¼¶»ÁÁ²º¾ÃÁ²¹¹Ã³À½¿µ¸»½¾¼ÂÇÄÂþÀÄ xpkaf_ko`TY^HNgOTHEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;È´µ½¸ºÀº½µ ¡¦º¶«³³»³ÄÏÈËÂÆ¸·ÇÁÌ¿¸É·»Å¸³Ä¸³¾À«µ»±«¤®²¬ ¢a{|yutomkjjqi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggjmo© ¡¢¡£§ ¤¦¢¨¢«°¬±¶£©ªª¬¬¤´¹·°¬³µ®²µ®°ª¤¢²¤¦©¸¢¦¦¨¬« ¥£¯©«§ª¬¬±²¸¯¸¹»°¶»»º«³³º³½´¶±±µ´¿¶½À½ÃÁ»»½{sk_e^ddXTW]IW\KPGIIFA<??@;?<04536:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÄÃϾ¹Ç¸·¾·²Á´±»»«¸¹°¡¨ª¦e
xrnpnkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWXXXXZ^bdeeffhikr§¢¢¢¨¥¦¢¦ ®®®² ¥¢®«§¢µ±²²¬¨¯²§º³¦µ ¢£¡£¢ªµª¢£¦¦¦£ ¡«§¤¤¦«³´ªµ°³«²¹´¯ª¯²²³·³®©¬®²¸°º¶º½¿·³±
yue^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿²¥¤¥±Âµ¶½´¸ÂÌÈÆ¿Å¶Á¿ÇηÀĽ³¹¹²¿¶±¸º¬±´£¨}hxoqtqifdhec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¢ ¡¡¢©¤©«§¯°ª£¤¸ª¡ ®¨¶ª¦§°¤¸°¤· ¢ª¦¡¬¸°¢¡¤¢¡ªª¤¢£ªª°®¨´«ª§²°¥«®³±°°®¯¦§§²®±´°¼´¹·®£yud^aVYWSRTKM^LOKGGLLE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸½®§¨£ª»À½À¹®´¸ÁÌÇÅÂýŷÈ̲ÁÂÁ¼»´»¼´¸¹¯®¯¨ §t{|wqilrtpihedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbcdfj ¡ §¦¤¦§¦ ª¯¦¢¤·¨¡¡¢¨´¢¥¨¥°¥°«´ ©¡¢±±¢£¡§§¡¢£¥¥«¤¥°§¥£««¦©®¯®«¨ª©³¥¦¬¯´±¯¼µ±¯® zvrda\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847863321./2556;:8;7876<;:;;A8x»»±µ½°»±¸¬¥§·»¼Áź±¹µÄÉÉÀÃÆÆÇ¶ÆÄ³Â¿Åª··½¶½ººµ²«¬¦¢r}~vncbfihfhjgjm`]\[ZZZZ\]\[\^_\ZY[YYY[WUXWUTVUSTRU``_`a_`acdi¤ ¡¦¢¦¤¤££¢ª«¥¥±ª ¡¥«§¡¬©©¬¡¢¢£«©°¢¡£¤ ¢ ¢¤¦£«¥¢¤ª¤«®¥®²©¦¥¦¦´¦©¨³µ´¹º¯©¬rpo`[WVURGPOHZ[ORITKSLEFIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121.-1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɽ±¾Äɬ±¸Áµ»À»´³¨©¤~p{tiiilgjkmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^^___bdm£¡©©«¨¬§¨¦¤¥®¤¥¯© ®«³ ¥¦¢£¡©ª ¡ ¡ ££ £¡¢¨£¢¨« «¯£·¥££¢¬ª¨«¯³·³¾µ³«¯tsh[XXSUQEXLQ[XMTNPLPQINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571140-+/434988::8::748=8?9~³¨³¶®©§¯®©¨«·¶¬»Ê»¶¿¬ËÆÅ¸ÁÎÏȳĻ·»Ãȱ¸¿·¼½º²³£§xsvwnmhmnmpggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_`d~¢ «ª¦®¬¨¯¤©¬ ¤¨§®¨ª¥ §«¥ ¡£¡¢¥¥§¨¨ ±°¦±¼§£¬´«®§°µ°¹µÀ±±«}rsbVSVNRIFVPRQLLWMJLNRGMJACFDC>@65889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¦±·ª¦¢°«ª§©²±¥¶Æ´¹º³ÊŹºÁËÐ˱¶¸¼¾Áñ°²·´³º²±¡¡~vkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYX\\]ajzv© ª¦¥«¨¡¥£
££¢¤§ ¢¢¦¤¦¨¦¡´²¨²·¡¢·¬ª¤²²¦µ¼µ¬«±£xsm]NQQLOCMNNPKFNNJJNMQIMJAGLHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301*)-/12876:999984988A7w¶§¤¶±¥§£©¥ ¨¥¥³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬º½´·À¯©°¦¹®«
zm__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXYX[]aosvq
¡£¡£¥¢s~{£
~~tz¢£ ¡¤¤¢´¯¬¯¬¥¸¦¦±¡±®°¼ª©¯ªwscVMROPMCSNLQMBPQHINRMHJJCJLFKK<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¦´Á¸°´°ÉÄ·¹ÁΞ³¬ºÁ«Ã¨¢¦¦µ«¡|v}eWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo|s
yz
}xqp
}¡ §¯©¨¨³¢¦®¬«¨´¢©£}rn`[NSRVLDTJPMLFNOIELQMKOJIMOFII<7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//((++-3854779<:79;86A9y· £¡¦¦ª §©¨£ª°¨§´Á¹±µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©£®
{rt\QLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tPB@}y`JQnx}
n~wuuwpQ{~xvhw}¤£¨©¥¤°ª¡¤¤¦ª¢ª¢¦¨tmg^[HQQRMIUMSILKOIHFJNLMTKQPOFIC<768:8:;;8:;8>?99>=8;<6;;478;7775344696/3/.125221/,')+*,4833979:99::::?9w¶£§¢¯¡§¨¥§¨¯¬ªµ¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼¦§}|vomXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut|
{vxsnuptz~«
yzhv{prmxxz{vrrwgu{|© ©¥§¤¡¤rha\]JVORGJXROJLMRJJJLPILQLRTLEHA<77;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().1272198798775:<;7v®£¢´©¯©¥¬«°±ª½´²»¸¶º´±·º²ª¬©¨²¯¡~v
w{uonhXKHHHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u|xfw}hyvx}q|w{ok~}s{}tfv|lohs|lyq}pmuqiq~pC
wwz
}{u~£¢¥womebZXWTQJSUTOPNPVKNKNOJQNHNOKEC<;79;::?=9<:99??;8<=7<9999266856633511224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©±¯±«¼¸¬»¾¹³¬§°§¬¥©¤ yup{mtpiliWKFGEA@CDILLMQRPQSTTTUVWWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyc|xo|yz}omytxjjq~Inhw~licly
ksl|nr{impsz}~{vots
yxp|ninonXUWTRQYORTTSXUMNHNKMNKCHNGE?;99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥°¢¬ª¨µ¯®¬´¿«¼Â¿¦¢¤¡¡sz
tntkpldkjXNEFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\`§bitzepmzvtlts|jkMy
g1vsl~~tfet~
filukq|gqq{n{s}|qpnumxyujyyvjjoheXQZWYY[MPUVYXNIHEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,5775478iO8;5n¤¨®²§»¯«²°Â±»ÃÇ
yqs
zorpnodpf_TFIC?<;9:?@ADDEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ r|xl}mr
zyr¡txsu5q¨¡¡¢
vp||sgfbjnrmpuioXupwl{}mqmpzsvncv~
ux~~zqpok`[\^[YX`_RN[ZXWLHJFJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))+**)(*)+/3DM2166643<vR7=7b¤§¯¥µª®±®Á²»ÁÆ}n
ul{txxlwnwci^IPG>@7449;;<=>@BEHLLLLNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|~
~v¢y~
aªzw~sz]dqtz{wlgjbyo
znwtzptzwkni^w}|
}q}uw{|vpsteg_[[]S[f^WQUX[UGJJDLG?F@DC>AA=:97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡}}~p~zgvkRWL@E211367688:<>AEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z}~v¡¥¬©H®¯¯¨sm|}hghx~n
q
Gkwryvhmk_w}
zzuv|xmow~ssrl[]][ccXfe\UPPVYPDLKFNICFCCA@CA=988:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¡¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cWKB60./23133668:=?@BEGHJLNQTTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¥»±§»Çè¡¥{qv
ihouqw{v
}nvug¡«¡zzzogkx~z~rjd^ZZ]j\af_YOKNWRQHPJDNGCJDB@DDA<:87=<:<:88778:==8<=68656623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯°¡xw|mpj]BA4--//./02234779;=?BEHJNQRSRSTTRPOHDB<87/9D><<63.lMPHJLKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¡
lpuvql
r¡¥µ©¢}kjk|sa]c^Zfk\kk^WKGOSQNMLFIPCDMFACEGB>997=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªge¤~y}
xx~gMR>/..,/.-/000212557;?CENPRTPQQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©¡§¢xz~¡{v«³ }¤¢¦¶°¨lsr||qh`\`^bgc`gg\QEJKPOIJLFFMCHLFFCBGDA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}|ªªBD}x|
w_bP460-1/,.00./..0015>AAMQRSPRSURNSLEE@<>=GG@A@8662<9;FHGIJMOQYmw£§ª´½¸¥®¬¬§¨´«°·²²»±³¾³Ä¬»É˸Ŀ¸¥£°²¬«¤
¦¦ ¢¦¢ª¨¤
¤¡ ª¡¤©±£§·» £°££¤¢«¯³µ¢¥ªzz~
~g`h\eb]dc_ff^[OCIHTOFHLFJGEFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1/-4?DAMUQRSUUWUN[PGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇë³Æ¶¬³¿³¸¾¶¿´Á¶»»¤¸Æ©¶Éǵ¾¹´¨£´±±§¯«¤v¤¡«±³ª®¨®¶»²º¬¯µ¢±¬±µ¼·µ®µ §¨£¨©°²º¸¸§¶©¤ xuYadVeaac`ae_ZUJDELUQHIJDIGEA@@KDAMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL[ZQcdWzuq}
v
~{¿»£¼´y
zxn]V@EM<6:46AB7650/6CHCQ\OQUWU\VO^UIKJA@?GKFED;>@7D7?BJJEGWTP^¥£±´Ã¶¸ÁÌɶ¼Å½³³À·¸Âµ¿°¸t²´¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥°®¥¬§¤ ¬³º¢©²ºµ»¾Ì¿Å޽³Â·º¸¿·º·¹¬°¦±ª¾°½»Â¬º¨®«~|jWbaXjejeW[cYVTIGGLQGCHIAHD>?BBK@@MC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm7?FQLALRWTYUZwjp
nzryb¸¡£{z||}wyueO\dGEL:Qda[^SF?;HPDZcQQYXYgYT``MSOEA?IJHEFA@C=E6B>HGKLSZT]¯¸µº¹ÉÀ»½ÉÌ»¼À¼·µ¼»·¾µº²Æ`u³¥±«½ª¥¨«ª£¢²µ¡«¨ ®¥§§¥¤¢§±´§²²¼¶Á½ÓÉÊÓÆÂÅÌÂÊÃÀ¾½¿»¼·´°¹··ÃºÆ½Ãɰ¹ª¢¬¥¨·q_aa\Wa_hfRXaVRUIEFNKA>GD=KB=B@=F=;H@796379>489:57045/26389373526?8@>GKRTTRPPQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]hllq
tmsrsÕÀµ }xz{yt}zkepuY]\Peeb`ed][XW\MdmURmm_n_XgeUYTJDAKJHFHHHHBI9D?HKTTV\Z[¹À¹½·ÆÀ»¹Ê˺·¹¶¸¹³¸µ´®¶¶du¨p^¢¬¡£¤«¥ ¨¦¤¬¥ª°·°½¹ÔÑÏ×ÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊ¿È䤻°µ°¬¹½yl]_[X]aYccQ[`SQKCAEFD<@E>BHB@C=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi_polouu³¬¡¡
~|s{|ts{xlmu{hreilifjih`fihmZmt¤¼g[oh]ZYTHJNPJKQLTQILAJGKP__bfia·Ç°¹³»¾¶²Äǵ¯¹°°»¬³±§ª·¬¶§§O ¦¥¡¦¬¯¨¯§³´ÔÔÕÖÒËÏÓÕÎÓÏÍÅÂÉпÊÉËÉÒÈÍÍÂÐÒ¸°Ä¼Äº¦¶»Ä£nc\\]X`WXfZQ]WNPCBHEBI;AD>AH??B7;D>@H=46655;:687654/10146278875367C5B8?-0,1349=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSeWshqoyy ª¦}
|p{r}qxulqx~q{mxslipmcimpyiw}~Ë¿Âß§mcxnc[a`JPRUNY^P]]NQNTQUT\nnwr®¸¬´§°¶«½À±«µ¦¥¸§¬®¡¬´£±®¦«¬¤§¡¬¬ÎÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÍÒÓÓ×ÍÒÑÅÒÖÆÀÎÇÈ鿸Ðyne]b\V_R][OPTPNH>AFABE<@B>EE>??:==<<JA45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[u
wmwp}~¡¡y
{r~z
u
ovsls|{v|swqksrioqzyr{¾Ë~²vrvhaj]CZZ[VfdXekTX]\`c]cx{ª¤¤¡ ¡©¦ª±¸ª¥´£¢¢£¢§±¦k¢
~
§°¡ ¡¤¤¨ÇÍÏÈÂËÐÓÑÔÒÎÓÍÆÖÒÌÔØÖÖØÕ×ÕÉÔÚÍÉ×ÖÑÊÄÃÌrob`_XSYR\PJGIIJ@;:;EAD<BD>HB?BB;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu}hsyr
w~xs{}w{nwpmuvx}s
|ymvto}vuy{µ<AÆ¥~|ieVICecfchjdoy[_fhknin ££¦²¤¤³ ¢¥¡© ¢±~
z~©£}«³§§½ÃƸ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÌ´wvnd]YRUPYVFGJJEE=:79@AB:HD@ECADA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopaqqs|~
|x
zyqz{uz
zp|opzr|qnztw}|u|°tX©Â¶pnb=^hrpqpnxweioruxr{ ª ¢¥¬
} ~my{®ª¦®¶½¨½ÆËÈÉËËÐÉÃÑÊÔ֨ר×ÕÛ×ÓÙÛÖÏÛÚÑÖÈÕËy{hh[YPSS]HCEII>A>=7:=?;>H=@AAADA>>:86DB755479.566435542323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865433BF4=W_hLux^8;?F<<B<99D?CGRk_mdbfkvqy~
||~wyn{{tz¡vutu}toot|
zv{·Æ¤ÂɸwpeNfczw¢yyw{|vm¦ £«
{|¡¼¡¨¦¥®§µ¾ÀÀ¹ÇÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔÖÙÚÛ×ÛÚÙØÎÛÆzyfhd_TWVUMKDMC;==<9:<>9>A6>?@=?><9867CA6455=80665547745613854564567HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C==@:6:>>@EQ_Yea][htzylwvz|~}
z~
z
{u}tn|}~t|~x}xnt
~
|~z©Ã ¼¤}}s~s¦
{hGq¡¤
¡~¦
¥¸¡§ £®¶ºµ«¿ÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Ü·xxwjidV`[SONHDLB==>99::99<=6@>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqrx{{}|z|{~uyszsm~}w¡n¨
z |~£¢ ¤¯
Wr¬\¢££¡
¤³¡¡§±¸¬¥¼ÁÇÍÇÆÏÌÏÌÏ×ÏÑÔ®ÖÕØÚÙÚÚ×ÖÙÚo|tgf\]XSVWC@ID>?>:49:;7:;:3;<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxlb~nmwxy~z}|{vsp
{vvut
}~¦£¦¢¨r²§¢ ¢©¯n·ÄȲ¢¥²c¤ÍÈ
ª¤£
¥¨¡¢²´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎrhb^]]NITYABGD;A=837;<:8=649:<:82?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFv}|m~xz~z~vv|lnz|xx|~£³§£ª³¡§¥£®¢¸³¡¡¤¯£¤§§¬¯¤ À£É¹«£¦²
¨¢
t³¥¡} ±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ¦ÎÍÓÒÐÖØÓÐØ»ryv]`U_VOHJNDBCE5>:77:?;<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:IENED:6A@BS>9DO323565=v\<R\tiZM]S<=88567=:JFDGN[\YJf`;Hz{n
z|x
~px|~}orz}|x§»¬¨²½¯¤³³¨£¢°¬´£¸¤¤©·¦¤£©©£¯°© »»®Ê¡j¶¸«°£«¾£^ª²|}´«¡¡ ¥¯¨¡¤³¸«ÂÈĵº½»ÅÇÇÂÑ ÆÉÍÍÄ×ÖÑËÔ¡pzh\ZS^QOEC><CAB8?875>F<<5<35345454B39:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAE@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdGb`bpJ@s}um}}|pww{ªÂÀ¯½Æ»³´Á¼´«³¶§²®¼ª»¤¨¹¸«¦¦¢¡££¨¯²±ª¤¢¥¥¤º®©À¼²¹¥¤§}¬½°z§±¬ £¬ ¡§¦¤¢¤°²¦ÁÆÃ¯°º¶ÅľͦÇÃÇüÕÑÍÄÊtsb\Y_[MJBL@EG>A?B;:4>A<=5=6>333241A17@BN>G@CNCA=C=;86CB5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\eG`igZ]\{uo~{q~zz§³ÆÉ¿ÂÌÁùǼº¯«¹º²¶º²À®¥À¤«¯»¼ª«¢¢§ª®´°ªª¡°´§£ºº¶Á¼¬¨²¥¤¨
ªÃĤz¡¦ ¯ª¡ ² ¤ ¦¤¦¦¤¯¥ÀÄ®¨·µÉþ¶Î²Ä¾Ä¼³ÑÊȵuym\X\iSLHDLKKJAA=CD<5AD;:3=8B332263A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBfZNe\fTcjyr|xy¡¨º½ÇÈÉÁÒÉÊÂͼÁ³»¾§º¿½¼Ä·¬Á©¬³»¾ª°©£¥£¬³¶µ ®¥¢£´¼©¨½Á£··°«°«¬ª¦¥¥vz
££ª¥|£ ¢µ¦¥£¢¥¦¥£¨§¢²¬¨¼Àᥳ·ÌÀ¹®Ä³»¾Á¸¬ÂÃÂÀmyaXW\[KKMJFDDIBBADL:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddV x
¡®¦£Â¾ÇÃÇÅÓÍÎÍ˼·°¹¼³¼Ë¼ÃÁµ¶»³¿¹¼®¯¨ ¨§¶©±·¢§¡«··©¥°¿Ä±¾¹³§ªµ³®¥¬¨ ±Å§}}ª¥¡£¢Z¥e£²¥¢¬¬ª§¦¡¤¨¦¶«©º¼Ãµ¦³µËÁ¸©¶¬²º¸®¨·º½¸lnZWTUNFJSNK?AGDDHGG95FM;>7=@J.32025B55PVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;=@BFBqFiIRebLF¥¡©¦¢¯¾®¡Æ¼ÅÄÆÆÎÎÎÒʾ»¶±º»»¾Ï¶Ä½·¸·²±µ³¸³«¦««¸ª¨§¯°£¯¤§¤¤µÀ°ª¬´¿ÃºÀº³§¹µ¸²®¥¯¯¥¡tÁ~
±¥£©¡ `J¥T°¯¥¯®¬¥ ¥§¢´©ª³¼¼¼ª°²ÇÀ¸¥««±±£¡±²´¤pnf\ZNPKDPPPQ;GJIGHCC>:KU?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯§
£¤µÈ´©ÆºÂÃÇÉÈÈÌÍÆ¾»³®¹¸ÀÁͶȺÁ¸µº°¯¯³´¦£ª³´ª¨¦¬¤®¥¤§¬º¿¨«µ·¿Á¿¾¹³²Ä±¹½¬£®µ¬º¦¦v¿
¯¡¡©¨ ª¢§nv¢¢®²¢«¨ªª®¥¤¥¨¢±¦©«º¶¾³²®¾¹¶ £§¨¥§¬©©bea_RKMGHNIUL=LDNJKBCD<QU=AABDO18=77?B75UXN?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..R`MUHe^HE«¡»¯ª«¢¤££¶Æ½´ÁºÂÂÇÈÅÂÍÈÁ½¹²¯¹´ÀÂʵűÁ¼´ºª¨°¢¢ª´»¦©¦«ª¨¯§£ªª¾»§¼´·½Ç¼·µ¸Á±½À³©µ·«¿¥£¢ ¼ ·©¥£¡¨¥³¡¦¨ª¥¢¢ ´¯¥¥°«««¤£¨ ©¤¢¡´´ºµ¨µ²³¢¥ª¡w`\_]JHFGMQIMEFFBRLJBEG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCpbGE§¤Ã¤©ª§¦¡«¶Ä»¾·ÁÂÀÇÄ¾ÍÆ»½¹²¯¸³¿Âȵ¿¯»¶¸¶¦¤ª¬ ªªÄ¢¥¨«¦«¯¬¢©¨¿·¦½°·¶Ç¶µ¸¸¿±¿Á¶´³´¯¾££® ¢¢¥££¾¥©¨« ¦½¢£¢©«¡
¤¡µ¬¥²§¯§© ¥¤«±µ±ª¥ª¬ ¨hbYa]OIGJNLHEDIA=PIA<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC<C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ:nRF<KxebWL¢£Å¬¡¬® £¥ ¦©«¶±£ª²µÄĽ¿¶¿Â»È¾Êȶ¸µµ°³³·Áƶ¾°¸´¸µ¦¬ª¬¥£Á¥ ª¤©¯¢¦§½µ¥±¼¸¶¶Ã²³·¹¾²ÃÀ·¸®³µµ£¥¡® ¢©¨«£Ã©¬¦¡½¢¥««¬¦¡W¦¡ ¸ª§¶£²¡ ®¢¤¦®²«©¡¢¥¥¤adYc`LHJJNFEAFK>=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrHE6=ue\KN¡Ã¨¥¢³¡²¨«¤ ¤©¬»°¨¬µ±ÈÅÁ³ÂüÆÃ¼Äʼ¯°¶°´¯¿Ä´¹±°¹´¬¨°©©¥¡§Â¬±ª¢®°©¤§½¶¦·»½¯·Ã¬³³Â¿²Æ³º·¬´¶ª¢¦¤¬¢¨«°¯¯¼²¦ ©¨¢¤¸ ¡¤¯¯¬¥§¡£§³¦¦´£®®¡¡¦¬°¥¦¡
ae[geJILJRBC@IG;;G?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 褪²¡£´ª³¬§¢¤²¬®©»²¬°µ´ÆÀÄõÀĽÉĵÀÈÁ´«µ¨¯¸¬¿Ä´·®¬¶¹¥«±«ª¦»´¨°®´±§ª¹²§º³·²¹Àª·²Â¼´Å§¾¯·µª¨¬¡¦¥¢£¥¯¸®²µ¶ ©¤¤ ·£¤¦®²²§«¦¡¨ ¢¯²¢¦®¥«¤
©©ª¡§
xch]kjMPMNT=CANC::I@77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05IphVCWFyfC;¤£¡¦¿¦¨¯°¡©µ«¹°«£ª´¶±°¹·¯¶¸¸Å¾Ãǽ¼ÄÁÆÀ¸ÀÆÀº©¶¤¬»¬À··©¬±º¢°²¥§ª¹© §°ª °´²ª©¶¶»¬³³º·¬¹°Âº½¾¦Ã«°·¯©««§«¢¢ ¡±¯³«±º© ¦¡·©¥£¢°±´«²¨« ¥¢£³°¥ ¨¢©¨¦¢}
jhlalnWPQZTACET@;;IA7:XPd^PVWDY^]MLRN^KJ>Zc^NHPN[UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251.-.,1=*'+=\p=>1.1e[d@1647gY`F(?8l}h[V;{cC=§¡©½¡ª¯«£±¸©¥µ³¬ µ½®³¸¼º½¶¶ÀÿÈĹÄÁÀÀ¸Ä½À·¯µ§«·±»¾¿´©®±¶«¨§¨§»¤³«¢±°³¬©¶´µ½¯±µ¬°µ±ÀºÅ·«¼¯±¸¬ª£±¦¥ª ¤ ³ª³ª«³§ ¦¤´®§¢®±§³²ª¤¨¤¡¨µ© «
¦¤¢
{elrgpq_FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;GDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__aU150=`V^8)C3YT\gK6zfL@¤¡¤¬¶¤©¥¯®¶ª¯µº§¦°·Å·±·¿ÀÁµ´ºÅ¾ÌŹ¿º¿¹Ã·À¸±´«©º¶º¹¾´ª±µ§¬ª«¬««½«®±£« ±³®®¶²¹·ª®±¨µ¯³»½Ê²ª¶µ±´¯®§¡³ ¨ ¥²£ ¦¯¡¤¢¥§²©¢§²¬ª¶¥®±µ¯¤§¬¸£¡«¤¡¡ z
{knxmu{`EajYIHYZ={JFD6AbTi[M\`J[]ZRRRb`LKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C_Q\.*B/JGP[H3cYTKD ±¨±ª¦¤¯®µ©·´¹¤«´·Éº´º»¿¾´´·ÃÀÌȻü¶½¿¿·¾»°¼§º¸·¶Â¶«±·¦®«§£±ª¯»¤¬²²§¨£²³°±±µ±¸³©®«±§¸¯µ´ÃŶ©µ¶¬°©§£¶ §± ¤±§ ª©£¥¥¥·§¢²´¬§²§°µ¬¥ ¬¨ª¸¢¥¡¦£ v{
mqwu{~\Kel\KNc\>b{GI8GgWf[L^bMXYWTXTi]OOHa]_PJHQVURKIWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'GbLV%-B.=ELQ<3rkJCC¥®¥®«§¥±²³ª·±· «µ¹È¸®Á¼Ã·³±µÂÂÎÅ¿Á½´½¿¿º¾»±Ã§©¸°¶¶¿¼¯«³²§±¦¥°¥²µ¬«²°¬©¨´¹¬´²µ¬´ª¬¨«©¸±°Ç¿¸¥¹°©¥¨°¦¤¤¯¤©¯££¢£¬¤ ¢ª¥¦¹¥¬µµ¥ª«¨¬¯¶®££©ª ¤´¢
¦w~
||}qtr~}}\Sdo^NYf\FD[G;NmXb[M`bNVWVWTYg^QRLcZ[TKGOTSNGIWS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HeHJ+:I?3BIS,>k<GHª«¢©±¤©¥³´±´µ²²¡«½Ëº®À»Ç±´´ÂÂÑÅžÀ²½À¼¿·¼Ä§¬·¬³¸¼À°«± £§ª¨¤°£ª±ª¯¬°®¯®¬³»§¶°²©²©«¥¥£º¬ª±Â¹µ¬º¨©¨ª¨±¥ª¤£®ª¨¢£¬¥¬¡§©¢¬¥£¬¸±² ©¢ «¯°¬§¨©¤ §
¤~~
|w
tsquk_Y`ncQsq\K;|F>WtX`ZNc[NUVUWP\b^SONhXWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<]J0.JgDF8<B05EKX1@Z>LE¨¡ª³ªª°¶¸µ®«¥ªª½È»±½·Â¯°¬³ÄÃÎÎþ¿´ÀÂúÀ³ÈĬ®·²¸À¾³®«¤§ª°©§¨±¥´®«°®±°³³»¤¸³¬¬®§« ¢°·ªªº¶¥¶µ£ª§¬¬ª¡©§¦²²¤¦¦¡¡¬ª¡ ¦¤¢«¤¬¢§±·£¥¢ª«®©¢¥¤¤
£¢|zt~tw¤xj^`ngWecN?gLEbyWbXReTMVUUTO\]aUKMiWUWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D>HFD°¥£ª±«ªµ«¶±«¥¬ª©¼ÀÀ¸¸³»µ¥²¯ÄÉËÑ¿Á»¹¿¿Á¹ÁºÁÄ®±µ±³ºÀ¾³±®««¨¶ª¦®¯«¹°¨±±¯²¬¶ª¶µ§´¶¬¬¤©«£´²¨¨¤´´ ¶ ©¨«©«§ «¬©¹¶©ªªª¢© ¬©¡ ¤¢¦£©¦µ®¨¦©¢£¥¦§ª¢¤£
¢txu{xoqggqx\`sjO^VHmxUdVQbPMUTUQOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Jj6OD;° ¥«®¬¥®³´¯«¥¯©¨º¾¼À°®¸¡¶¯ÉÇÈÑÀ¾½º¼Â½ºÃÁ¿¿®²²±µ¼¼Â±±³«³¨¤µ©¥³³¹°£®¶±¯²º«¹®ª®¶¬ª©¬¢ ¶¨¡¯³¡´ª¨§ª£«¡¢¬¨½¯¬®¡§¨«¯¡¢¡¨§¨ª±©£¢¡¢££§©¥}
¤
xt}uxy{tszi£ui^ekug}SXp^JxsSdSQ^MMRYfNLVYeYFSiRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--6)(+-,42#2)',%.;.&1.0-14%,0Lh:48_=ad?F1CP[[+HN9UA4±¤¦¬¤§¤¬¦´²±ª¤°§ª¸¾Á»¯§¹ª¦®°ÉÇÈÑü¿¾¸¾¿¼É¼Á¸°°µ±º»¸À²³»¸¢´¦§¬²¶¹³§§»µ¶½°¼¦¬µ«©¯£¥¬«§ª³¤³¨ª§©¤©£©§©¾«´¯®©¤ ®²£¤¤¥¤¨«¥ª¡¡¥©¨
~}
¢~qzy~|ix|zupp}h
xdahcr
zmgy]^VBWzmTaPRXKKNqu]HZ[gYEUfPD>JNDCA9HGKS?jaJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH0%90%,,09/,,+6'17#-/GjI14X=fcBJ7GS`U*=;DX?*± ©¥¤¡«¤·²²¦©±§¬¸Á½µ°£¹¬¨¨±ÃÉÉÍÁ¶½¿µ·¿¹È¶Ãµ´³µ±½¸º¾¶¹¶¿¡³¦ª«°µ¸µ«¼¼¨²À³º ¯³µª¬®°£¥¨©£¥±¦¯ ª©¨¢ª¤¨ ¼¨®°®¡«£¤®¦¡£¢ª£¤¤¢¦«{|~£|yk}vyxc{zqpqrxhtjgdhansmbip`pA\xlU^OQQJJMTYWM]^mWDX`O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*K>*49&'.34.0+/4&,:$40BhY13S=e_DL6KWeO*<3OY=#¬§¤¢§£¸¯®£¯°©«¸Âº³¸¯«¨´»ÈËÈ¿·Â¾¯´½·Ä·Ã±¯º²³Àµ»¾·©¹¸½«¤´§¨ª°®¹±ª»½¤°Àµ´¡®·µ¦§§±³ ¤¦§¡¥§¨ ©®§ §¤¨ °¸£±¯¡¬¡¬¤¦§©£©¦¨¡©}||¡y
|{so}qst`yxioqpoi~qczliec`f`[rjrMM~hXZMPLJHPRPIN\_nTDX[RgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZhH*>/YX5(¥ ¡¤¡·«±¤³´ª¨¹Äµ²® ·¬®°µÆÈÁ·¿Á¹°´¼·¿»¿¯«½°´¿±½Ã¹©»º·§¨µ¨§«°³±§½·¤¼¶¯±·°¨¥§°² ¤ ¤¤¡¯¦¡¢§¯¢ ¢¤¤£·°¡¦±«¬£¯ª¥©¥¦«¥£¨¡z
~zy
~yzprwoot_ywdllkihmerjkeh\cs_ZkuiZI}][XOOJHHRUF29_^lPDXVYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84GAf[HTDU]hE.;2`T,2£¡©¥¡¢ ·ª¯ º¹¦¬½Ä³°®¢µ¯¬®¯´ÄĽ³¿º·°³¹¸º¸»®®À³´¸¯¿Á¸¬½ºµ¦¢³ª§©³«®²¢Á¶¥¨µµ©²»ª§¦©°¬¢§¤¦¢²¤¤¨©¢ ¥ ¤¹¨¤§®§¥¡¨©¢¡ ¢«¡£§¤y|
}y
{w~{ltrlltbxuhhjgeoghhdfij`hbifZe{c`SsT[[SLIGIOS@!*i^jLCVU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB378cN'2¤£¤¦£µ§ªº·¨¬ÃÀ¶°¬¢µ§¯¯¸ÀÀ½±Á·±®²·¶¸·¶¬ª½³¯²±½¿·®»»±¥¶«¥¥´©«® «¨¥°³ª¬´º¨ª«±¥ª¦¤¦¢¤©¡¢ §¶¦¯ª®¡¡¡ ¦¢ ¥£¨ y
w|
{s~}fxokklhuskcgdctbdefeijciqY^X]mdaNhWZ`VIGHKMRX?9`liGBUS\[IIGEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLYJVbfA;3AfH%5¤ ¡ ¥´±¢±¾·¡±Æ»¹°±£¶««®©¹½¼»À²¯®¶¯³¸³¨«¸±®®´¶»¶¯¸½¦µ« ¡±¥«¯¤Ã ²¤®±¯·µ¯®£§ª¥¨¥¥¢§ °¦¹¨®£¢£¤¡¨¬©©§{t
|
ofynhkjgqrk\hdbr`dgjmlgjifl\lmuqaTbhceYIFLMOXQPUaeT@VSYUFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24:6#3*)6.55465Z|]19Kj[M[KXdd@A1IeC'4¢°¡©²°¸À¶ ´Â»½¹±¥¶¯©®¥·¹·¸¬»¯ª«·ª´¹®¥²µ±®©±¶¶°²µº§¨¶©ª¢ª©À¤®°¶µ¬¬±°ª¢£¬¨§£©¢£ £«ª©»§¤ ¡k¢q¤v«¨ ymi~wql}o^c`gkuw~fhuifW\isnNPjdfqf^dfnli^__hOKD8ETg^JGPPUUKGS`oteE[QUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G601.*.*/668,#1'214:176Xl16Ok[N\K[fb>G1Pd=+/¤° ª«£½Å¯©·Â¸½¼§¶°¦«¤¸´²³°¹ª§¬´¦°µ£¨¸¶µ¨§¬¶²®´³¢©´«¢¤§¨¬¼¦¥¯³¸¤¨®«¬¥¡ ¨§¡¦¥§§ ¨ª£µ°££££¡¡¡¥§«rx¡vif}sx¡o~{¡ {tvlmheczlqbTmcmiqXjpnW^i[kj[pmyrhZ^FN>F^MERVWQQRWTg^LYKRROEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Va7/(¦¬«ª¨ª¿Ã®±º¼·À¾ª¤·±ª¬¦³µ®¯³¶«©¥±¥µ³µ¶´¥§¨³±²§¯ª ²¨¤£¢¤®µ¤¥¦¶½¦¬§©ª¬¨¦¢ ¦£¦£¤¤©¢£¥¦¡·¤¤ ¤®©£
±¤yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«°yhkX±®oei¼¼nhzmrØ~Sjc¶²qu¡ªWOWaOVNFT[XQPS\W[P@\EQNDGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦¦©¥²©±Â½²µÀµ·¾Â«¦´©¨¯´ª¯¶´¨§¦µ¦§¸¯³±µª¥¤§±®±¦ª§¤±¤¢¡ ¯¢´º¢©¨ ®¥¢¡¨¨ §§§¡§£ °£ £
°kjª~geq¦q®¡¤~w»|k¡v±_j´[¥f`fzfjxj©e¾rg¦v±j|±xtcmm§n[ EigEu`~g{£§Y_«ixzj§7J¯[WTlc[KNW_\WV;NOWV/ITSICEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¢¬§¥£¤ª±·´½¾°·Ä²¸ºÂ§©°¬¯©©±¯¤°º°¤¥®³£©¸©³²°£¥ ª¯«¯¦§£¢°£¦¢´³¡ª¡ ¢©¤ ¡§¤£¡¬¦¦ ¡µµx
©µw³·©~k¦z
w«gj±[¬{tpx
°vwqkjl|N¤XHcc~ch¦`yruS^P©mcq~b.Q¢n[Tkg`LK\dX\ZB>°xWXA#MhEBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFB@AD<FD;0201;F,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J9aU50³¦¦¡®©§³¬ª»¶Â°¼Â¸·Áª¬®¯¦®²©¡¯¼ª¡§µ£«µ¥¦²³§£¢§ª²¨°§¥ ¯¢¤¨µ¯¡©©¨© ¥¨£ ¢¥££«¦¢ Õ¹p°Â~Æ|Ö»|¥¤z£¥z¬yU¯{~j¹Z¹w}¦|zªy{±nt»
oO¯§ÅQ zc`ªbsrl_Sµ´È|c¤3Bv]QjhdP@XfZdaJHMlKZSOYfZCC?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<9;DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[K\P_fT7G:aQ82%¡±¨¨¥³ª¥´¨¥¼·Á°ºÀ±µµ¼³¶§±±£±³¦®¶¨¨º®¢¯± ³´° ¤§©°¨´©¥«¡ª¨°©£¬¢§¡¥¡¢¡¢¡¢¢§ ¦ §¡²nhµq«p¦r´sr¶{¤¢~ ¥~°vÒÑu[®|¤oª¦k
}}{±sx³et
nfRÈZÂ\yb_`wsb^YÊo¿uMKµSUÆdTQjcfXAOj_liPUFI9=WR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\BNT_eP5G=aM62/¢¤¯¬¤ª»¦´¥¨¶»¼²»¿·¶´»»³¥µ´¢²²£¬°¤¦º®¤±°´¸ª ¦¡ª¤±§¬ª¥©¢§ ¦ª±¦¡¬¥¡¤¦¦§¡£ ¢¥¢
¬{w¨v£©o¨¢¢~®
³\r³R®~¤q×}w~w¯w´aelZ°XKuyf`^wwgj]¯wxl5yÈ®²_ATo^h`EPl_pmVUM/eciSYQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:88 ¸°´Á¨²§ª²º¸´¸¿º¸³¶½µ¥¸´ ´¬ ¨«§¶¬¨°±«´¤© ¨¡µ¦¦ª£¥¡£¥§¬¯¦ ©¢¢¨¦ ¦©¤¬ ¢ §©}}¥y¡ªp§ ¡£ª|yo±Z¨ ytØvt§¤|{²^d }l\«[Zhgªds{kq]¬Z kneOJC¡\ZLt^cfMZa_st_JU5JYHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.:>102154+*05/7,&21($$6671<PeeA&Uf[?1U_bL7FI_C1>8¡¾¬´Â®«©¦´°¸±µ¿ºº³±·¼ª»µ ±¤¥§§ª±©¯ªµ¬«¯¡¡ ¦¤£¹¢£«¡¢ ©°¯¦§¦¤¨«§ª¨ ££ ¡¡ ¡«®mr´t©w¦s´yt³¤£¤v¸o{¢kk¶Z¡ei ¢§mr´t²jku³af¢nj\`M¡|Rs£ly~no\¯V<wfTon.\§ObRkebmYb\`q|cSYP>>mo3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,426/#00,,289/9N`eD'UdY>/U_aL5FM^81B8¥»¢²À®««§·©¸¯µÀµ¼±¯¹¸«Á·ªª ¦¤¡«ª§µ£²¨®ª ¨ ¤«¹£¥£¡«¶¯§¬©¥¥¬£«²¤ ¨«°¡¢¢ ¡©«Ô»t±ÄÃ}Õ¸x§y£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxnpm¤t½]w}[ay¼kZV[jz^i`dfbmxoY[YCA@r?CF+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.97-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7A9¦¢¼¢±Ã°©ª¬±§¸¯¶Ä±»²®»°®Á²¬¥¢£¡ª¤ª²¤µ§¤ª¦¬¸¢®¡¥ £¯¹°«£¨§¥¤ ¨« ©¤³¢¤§¢¡¤° ª
µ¸xµwnlnsnysÁ»¼{²¨pt¹|{|¤»¹½uz³£tvut°ufi¶trpw¶^z}gymyb¬pu
Y[§jEdZTf`c]bQggqmuBMPLD;ZL?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITAKNGEOF?G<7>7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbV8*O]]=+;VV'=;<¦ ¡¿¥´Ã´¬ª§¬«©»®°Æ¯µ´¯¸§µ¸©£¢¦ ¬¤ª¦µ¨¨ £¬¤¾¦¡ª¢¡¨¢²µ¶¤¤¢¦¥«¨¤¥¢©¦¦£¨ ¢°©§¢j~i§xs~uze{½¾Àºnq_rjZ^adk`cmvbke^`cqhr}gj~qty}|b[wthP\n|{jXlyrIJo
pMtMEW]faL[Xgc^O[muiqRODEN;HI<M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEKOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7IR_I'S`V4)P^L(3>[O'?2>¨¨¡Á£´º¶£¬¥®§¨µ²¬È¬°³¬µ£¾±²¦ £©£¬§®¤¤µª¥¢¦¨¾§©¦ ¥©§°²¿¬¦§¢ª¨¤«££§¢ª¡°¦ °¥¢¨£¤§£hn|qv´© ¢ z¤
kj||tqxyvv{jstudw}vkp{m`c\phMYYej_WYozmmfSOFS9OZNRO(+;JB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J'R^S10T^:+=8]K,<-@² ³¡¿¢¤±²· ©¥²§¥°µªÉ«±¦µ¦À¨´ ¤¥¤ «¦¬££·¬ ª¥À«¤¢¢§¨§²Ã¯««©ª ¬¡¢¥¯¦¢¤§¦¡° ¢§ ¢£ {©¨
{
£~f¢³®
vz}vyzogykuyrhtzvktcyf`idcdfjXk{pij\RLPD_UF@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^]]^]XVJKLBIOMRJ;<:786/2964.(&$-1./)+*7%+<(6CMLD/T]Q05M[17E4\G5<,@´ ¹¯¾«®²² ª¦²¢¬³°Å°ª¬£³¯½¤´ ¦¢¡¨¥¨¦¤¦³µ¯¦®¾ «£¡©
©¬¢³È´ ª¤«§¨¤« ª®©¥¢ª¡¡¥¯¤¨¥©f|e~cxlhkz£«ke~g
eeihz¡kh¢wkj£slnzyXe]
^kv[hswwnxxsmytw{j
X^ktd]sij|qlc]QNWIdX@J3=F7?FD71<=?AC;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%/*+'6*$;'/AI[I/7ZO6)EY/DO1YC;?.=¥º¼¹¯«³°«¥¨®°¦®®°½±©¨¤°±£¡¦ª¬£¦¨©³®£¢¯¦¶¹¥®£¡ ¥{¥¬¢¨³Ã¸¤¢§¯£££©¨¡ ª¯ª«¢©¨¥§ ¬¡¥°¤«¡¥«~¾r´r
hx¹Ä¸q¡£{¦sª|ËÀÀ»q¢|À½ÁÁ{z¿}k¥±ooÊzwvyyqzqx
ymvbf_xc_eb^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>H[L*#CP/#F[3PY/UAB;/8£¸Ãµ°¯À©©£¯©°¯¦²µ¯«¦¦¦±««¢ ª§¢«¢¥¨¤¤´¤£¦®¬·³§¯¢¥ ¡¦«¤«¿À°¡©¯©¢¢£ª£ ¡®©¬¥£¢¦ ¤¥©¤©ªª¬¢¥¡£Îyz¥y_®^§¡¡}§t«¯^d©z§
t³c«¡³i®t|¸aY£Ínu{Û{p~ue{vvk}n~
~m`qkpf`_xd[phjcf`RTRW]JOC5AHED8>6;@?A;=8@>>?BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+--J0';\:L-!P@F4.1ÂÀÀµ´°·¤ª¨´«¦²¬¬¬¤¬¦°ª §¦¢°¡¨§£¦¡°¬¦®±«¨¬ ¥¥¨£®¤«°¨¿Æ³¨©±®¢ ©ª ¯§ª©§¦£¡«´¦¢«ª£§¦¡°¡§¡ p
u
¨q±|q¬~¡¥w«}r~«vz|~ª¢~«{ zVÄzoÁ}mupmfveoawnromeotvo`fmd_oiinfcWS\aZRRC8II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^]\^_a_^^][ZRC>;91478452&# 1' 1' '45-&7>WJ-='>1)3V@F!G:C1.+¯ÔÆÇ²´£££¡¬®¶¯©°§©ª¨®««§¢£¢¦«¢¥¨¨¢°¬¨§¯¨§©£¢¡¦£®¬£¬µ©¹Í²¦®¬¢®¬©±©©©«©£¢«¯±¢¨¬®¦¦«ªª±££¥
¤j¤uz©tz²p¥p ¤_`R«®v®§z
{f£¤£}©~®^|¨U¢z¢{ïÅs¯³³¹qb©¯Âthmonyxwnlfedqpf{hc]W_iXXTLLQLCCAB;CA@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799674,&$" ('"+-"$.!3-&@DWH,G+66*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°µ°¯©¬£¨¦ª««©¤¦ ¥¥§¦£¬¢«¡¤¯¢ª¤¶°® ©§£¢¨ ¦°¦£¨±¬¶È²µª¬ª¢¥³ §««£®¬¨¢¡ª¢³¢ª³±¡ª¨¯¯¶£¤§|ªlu«y|°o¤Ò¸´¸É²^_©¤ zxªÉt£§©~ÆÆwe¡¥s}¯^oµc±uK£m§Gd|p~p{u}zm\fjrqfj^bXcm\^YIMMKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNOPMFLJVF*L0/>-4OTQ;<F2,$¨¤Áƹ¨²®¬¥¢²¹¬ª¡¦¨¦ª¬©§ ¦¥ª£®«¦ ¬©¥¦µ¢§ªµ²¬¦ ¥§£ ª§®¡£§©°´Â²³ª¨¤¡£®¤¡¥¦«¯¨¦¬£·¬¡²¹¯¯§³´³¥¨¤Nxz£|¤§¸||y¹~ÌŶx¡~v¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu£|~uzs~p\mnwrjoZd_hnbd]KLQTAHGFI:9K>B108856877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E2:P[T6?H,- ©¬¤«¹«¯ ¡¬³´¦ ¥®®®©¦¦¦£§¡²®¡©¦² ¨¤¢µ¢£¡©´¹¤££¡²§¦¡¢¯¤¨¢µ±Ã±ª©¦£¤¤¥¤¨®¡¥¦¯¥¼¢··µ²¹²³§°¢¤ÑµÃ·y
¦x¢w ¥q«´nrj£|s¯¥¢¦mp²\¥szl{}n©a¢qqbs²¸hx¦~x}ymiwixsnt]ddnmeh`JZWX<GG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUVVTQOQ[U%!2AH$)%s®¿¿»»µ¨¤¶¡¢£©§®©«¥¡¥ µ§¢©§°£«£¤£©³´¤¦©® §¤§µ ª£¶«Â°©«ª¡¡ ¦¢¦¤¦«§¢¥§¾¬¾°£°³º¬´§©²¥¨z¨}|°w¤¥m²o¡|¡¨¬®
© ¢
{~«ªx y¯]£|¦§d|tk®]¥kq
]`[ n¦zz~km~b}tnz`geqogghCY`[=JS2U8BBC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa]][ZXSPONI7052.*,ATVVVUTUUUUTTUTSTWWWXVUUQHFIJ#((¼©ÆÃ¶Á´ ®¸¥¤¤£ ¯¯ª£¹ ¢« ¯ª¡ª©¤®°¬¦§¬¬¢¡¦¢¥¨¦¶¨¿¯¥©¤ ¦¥¤£¨««£¤©¨¾¤Ã¬ª£¢¬³º¬¯§¡´°©ªv¯~
}º®e°e}¡§¬°
¥¤¡¢ [lj³`{{±lgn±[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m¨{x}ds}bwt|ajfpmfeeOUc[AT^>I(>9=4!"-%2. *1/04579:<ACFHJLNPPRTWZ^`_`ab^_\[XUPMJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Á³£¦¥¶¨¡ ³³©¢´ ³¨ª«°®«®©¢¯¬¨¦¢§®¨¡¥££¥¢©²¨¼¯¤¨|¡ ¨¡¨§¥¥£¥©» Ƨ¥©¢«´¶®§ ½®©£¯¤¸Ãº
§¬¯¦¥ª~սªb£¿½|~£×º¸µ
½¾j£o«nz²°Çj«°½xw¢¾»t¦yyb|zdfy{`kekjbPb[Sj\@TaBN)=:4/$%2 $(0496678;>ACFGJKMNNQTW]a\__a^`[\YTQMIC?<A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼´´±¿¹²½³¢®¦¥³¦¥¿ª·±¨¡¿¦¦±±¹¨®¥¦¯¬¯¦£¬¡¤ª¡£¦§¡¨¢ «©¹¨£{¦©©¨ ª¦¡£«»©Å£ ¯£«³µ«°ª¡¼¨°°tuª¤·epgmow¤u®pq§£®¤rmmmewnmqyiqigqhi
gpd^cjoY]g~w¦`bqofd¢|uewhjy~ydlcflbKdXJkY:PeER'K:+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\``a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³ªº¹²³ª©¢®¤²©½±ÃȾ¶ªÀ«¬£ ¦«º£¤¬¬¦ª
¥ª¡££ ¤§©£ª ¥¥§¯º«¬{¥§¨¢°¦¢¬º°Â¨¤³¦¬±²«®¬¨¹¤¯¸¡¨¥¶¢©ª³£¬ ²¢ ¢ ¤¡«¦¤~gtvtq§m| phvpwv|zjlddocU`Y@iZGb`OZ+F=+&!740.!%2(*799469;>?ABDFJKKMOPQWTVY^_ac]^UQJED>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥µ¸¯®¢°¤ µ±«Å¼Ä»¸ª¢¥¦°¨£¶§©´¦§¬£§«¤¡§£¨©¦¡¤§¡µº¨ª|¡¥¨¶£§¬·§®Â®£·¦¯¯°ªª´º¢¯½¦£¦¶£¦©£¬¯¡£±¨¯¤ ¤ª«¡ª
~fuvysj}¡ yqryq{jnd_pi`[`YmbP`cP[:GGD=2==7.*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV\^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤§£°³¬®£©§ ¨µª¥³»¯¬¬¡¢z¢°¤¥±©¸¦¢©¢®£§¡®«¨¨¨¹¶¤¥y¢¨¸¤¯µ¢°¯t¤¾£² xz «³¼v®¤ª~d\bv¤~n³£¨®«¢e syp¨l¢§e¥
xkvq|ai[vghrz¤dywinykpe_vokkh[fcbboS[>NNNRG=@TB91/&4:316678<;>@ABFHBGFIKLSTUY\_hfgWQJ<DG;8UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥¨£§¤«µ¯±¦ª¦«s¯¨ª§¸ ¤~«£§¢
u®¦¨£º´§ tv ¦²µ´½§¡~§¢z£¯¸§
±©¯£y¬¢§ª¨w¥z¦{±z
cynqyqt
xht t|~jkx{qpgdwnilk[ejier[^ITLQ@E5-YTT6)!09=>643568;:=>>@DI@IEJKGRXZY[aahfZQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°§§ª¥®Æ½° ¥¨µ«¦¡¾ }
«¢ ¨¢£¹²§
pu¤¬´´®Ê«®·
°±¯©§|¨r{w¦h¤y´¦¨Â«¡q¤}
±¡| |
ms{r
}
t
Åf©¢j ogwt{vghupggl^cnlflXhG\QL2E46M`c6&4<DGD:64658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@JdY]cfhgbbbbdc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹±ª«¦ £¤ª¢£©¶£¯ §¥¼ y«¡
w ¤¢¸¥bm¡¡¨~¡§ ® «¯¤ª~£vk«uM«x¨§ª«}¡{z§ikg¶}m`cX{dgs}yl]|n_Sq\`ly`Ye}q§ªk£nr¥phdlZlzeY_~aWPoventrjjo^jolkhWiO]WE9A4GC^k4+ICQMN=84859;6@;;>BO>QRLMBJ\]_W^_bv`MD:MOMTb\\ffiibbdbddbab`cdcabikdbddgdbgeach ¹¡ª£¦¬¡¶¼«®¢ ¡¥¬¬µ£¨ ¦´u¦
¬¤¨¥°¦¢hn¢ ¢¥£¡ w§¡§ª®
¥y}}¢ps{ym¨|¢sv¦f~w¤_z|s¢n·´ºt¶¨dƸ{p·q¤cs¬«`}j³~n}q£ls¤s¤^³o{³tr[²ibotuqhoXklrre\i^bKD=D5QAYq2<RF_JR=<395::6D;;@IP?TMNQ@D_^[ZX``|dHC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¹¬ ¤¸µ® ¢££¤¬±¬ ¤«x
p }¨¡¢¨¨¤}jz} w¢ r¢©§¨«®}z z£xs}¦£d¡|lhnz§}rgsªsªg]
vhªj¸f\©pa^§vuhunk¦\¨~w»j}©Z]³g\nqywki[qixyc_eWbAPEN7VBRm4JZZ_NZC@151;;7H?:CGT?YRY]>Db^V`Qad}iEB9N[]XdfXfgnmbbe_aa__``ec^bdoq_deekecihgkiª¶¨c¬º²°¬¦§°¨«¢¡ £iq{z£
¨£ iyz¢ ¢rh p©£© ¨}°¤¢¸v£³¢£xz«~¢r¡|
¯µ}k¡x~´££«¨{|~sªZ]o{xbM{{
czBMY¢jr|muy±³¦tmq|ori£]vHec`sp}~ne`lhv|dc`Q^V]TV@YEQgDRW[bX^ID=B8@B:IE8LDWAVQ[VDFb\Z`K`m~rEC<U_bZejVghlnbff^aa\]^ahb_edvl^egfkdflhhki±®S_ §³¹³³©¢©¨¡«¤¡¨¡w
ny
}r r¨{k
q w
|¤¡£®}µ{¦z©¡~§hwm~s sq|
o®}£¦£p^©gu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²¨¼wm¿¦ª´^o~qos¢r]£gt¦ah¦mÓ{nwykzvrl©¥g_eypkgfdmvxh_aR[eQQbIWIT_WS[ej\dPFCKLJKBJE8P?PMWSXORR`feiRdxywIFEc]dYhjTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°¬T\K~©¯²µ°³£
§ £¤¨ ©
{p}h}wpl|£ª
yunw¢y¢¤³¡¢¶z¬§¤®¥p©
}¤¢r¢¬®¤®¢vµ¶µÉ¡sa©myu¡w }oLf¢ps¤{ytal~ lrd`rti{i³µ´Æ¦s~{j«umtwiytqPE|³^jujxfjgbttqnV^TYhPRhIULXRV\gknVgWMJAJMJHJNAQJPecimetrs~y{nu{{TPOm]h[kiRjhilglgce_\]\^ibdhk{_]dgcjfomeime¢¯§
f?¡³«¯¯µ¢¢¨¢¢¤¥§¥yjye~ yui
z¥©y|yp¡y ¥¨gnxl¢d|q¥wpg§{¥z rv¹n¢b}¢nri«ju ln¦`ihu¢}_
uobh¡eiuocfnr¢Z_[d¡n^o{srd¥nx¢dg§hsn¡oSo ^d§T]SmmrjqmphkxskpRXWWfYSmIXO\HXihsjYkVQREV\LXRaUhj^wuz|p||r{rvv^QsagbpgPjhhklngdg_]^]`kbjivu]\chcjjslfkmc¥¦zetm§®¥ª°±¦ª¥¢¡¢¢{qh|st}{e|
¦¢«
}si¥|
ª§¦x~¥²¯¥xz©t¥n¥¢¼n|¥¯
|¥zq¨ g~o¬cw¨l©¢vw«¦k°kv³©knma«ªv§w}
¤ iv¬g¶sw¾¤Y¦«auqso{tqbj~nhlSV[Uaa\kM\R]I]mmv`[qY[`Zgsenorcqt`w{~yrys{{vbxdcnsdRlgholrifia_^\bkbllzo\\bibljwmglnb¦ª¤©ª¨§®£ª¤¥©
t
zo}ttrm}{¤¥¥uol©«¤ u~y®£qx
{r§q}}zx{~}v z}l
[yyryqhn~qtq
e_wusuoyonm_wixfª~t}jov|
vmlgsx{w[jXxhmwqpowxo]lnigVZ`W\ekcUaU^Q_pwyljvejjju|qrtsaoubs{xuyux
}{mldyn^Wnghukxjijd\`ZcjelpunZ[bkdllymhloaº©§¡¢¦¤¤«¢ « ¦¨~r|}~ztrp
{}
x~¢{§¡
wr
ª¨ «~~¨§xp{o~©
p}qjo|hm]sqtkvsYrn}~i]icz
_ix{|vhykaqsw`s§fnvp
yoefcyzZ\ifnv[zywtmsrf\mklbYY^ZYlq[_`Y^]ft}{tosckki{|q{xtdmthl|~uy|{zz~o{}s~ysiT\qiluougkhd]aXkhkjqrmW[enlgszohjm`«±¢£¡©£¡}«¢¥{|r}v
qor~z¦ x
z¡« ¢¢££ª¡§¦ |y¨~°¥²¦k|vwe|w|zu¢
~vqt
x¦|vk{yirh`sp}zvuowt]^ohn__Z\]ShqUc[[alhu{|rnpdkjh{mxqioplf{rx}zm|zx|~zxNdvksmpzdkebb`[tfpfrqlU]ltmhyzqgikeº¢¡¤ {ª
|y{mxr~mk~z~}ªq
}{ª§ ¢¦ ¦w}
¥{|ª¡«~ox
qt`u~
nyut¢
t}|rs{{y§v
{nk}{mhklg^y~g|{vsuu{w\`p}nu`c[\^QfmSeZ]akivz~qkldkjglslltoxnynv}vq~{{|{`i{juhidjc`i[cuhobumlTbqyepzzsejmm¸¡£{x¥¤yz
|m|xr
}|kh}|~|§p ¡
|¨w£¡¡£¡¤y¡~|¤ ¦~~utpv`}r|r
hwqx~s||qyz
z{¦|
uydr{~xypljf^}rh|uus|rj^`tvpxdcY^^RkhTdX^agjvxqfkclhejm~hnqk}wykr}tv~|{}jrnsiahlb_qUtomn`xhmWjtvcu{{rbjoz²¥¥ |v¤ ¢x{~~p{tu
~xgc}x}y }o¥¦
v¡¡z¤z
x
~s¢¡¢~|vq}mzd|
pleuo|}x|||rxy
¢wv{
t^xw|s}wfkd`~ijvstt}q|ccasnusmaY`^[ldRbW_`hkuypbjcmeh|lhthloh|xmqt|~z~|mvttmeljacuViqn`yglbjvpfy|zq`rl®¦¨ }w©yy|}|{xsxzs}d^}~t}~}£¡~r{¦ t§tlzo£|zqyjul{~~n
wo}~drj{ty~vx}}
¤y
t}sum`zuyp{oanbd{anovrwwstbv`oluno][^]^j^O]Wbahmszk_iejchwmflhjmh|zwns}tz}z}|rzxxnlkh_irchqoewhnlazhk}{xpawmª ¤¨}v}w~{|{vwptszo
}~|`\~szz¤}|¤
n¢¡ogz
p¡|{tsukqnu|tn
qt{|dqly}}ttyn}}
¨{}~
w}po
chwstnzb^o`jt^pjzxxlrpey]mlsmsXZ^_ajZPWXdcgqqf]ihgbgqodigejhzwtn
s{u
w
|x
zw{zryjk_phtkqnmqgole{bnyvqlww£¢¨¡¦t© t{v
xxrs{
kroymvnq[Y~vu w~n¡
k
£gw~||nvokmop{
ispwtxfsov|zzwtp{{£|wxxnj]rrpoowZ^p`oj^oi|ypmmjmv`pokrmYXaabnXQSYefcupb]jmdbfkm`ff_hkurrptxvx
ww{{vjqc|b|opltjholvw_qy{tut¥§
u
zrxtpr
squlomumw}mnUQ«xvry xz¤
|s
ih¡qw{z||kvjmkklz~ay~vzw|ygtlt{qzpwz{~
|}x}vpiky_wnlkqrU]nbq`_mnypgpfgsuhpkawe]Vf``rSPN\fe]xp|_]hrbbefj_hd[gp~pkqs}v|
tuy{xs~{ywfrj`~ookz`jntt_t}yxts
|x °¥vtvspo
spqojivmn}|musRNᐙ|ptu w{r
¡~xz~ywhl¤
cq{zy
{~l{erojkyy[yz}~zzhsks
}l~o}z|wxysmfplitnghsmS^ndpY_kqwfkjbfxsopc_w``Vk_^vPNL`fc]yqt\[ev`aeecafaXissnkqv|tzuv~sz~r|~vesn|e~npkZlnyys`vz{vrwwy®
w}
uwpyqnomn~rddxp|mz}jhlc¤ÁÜ®ï¡skuu¡
np
£
{uxvwo}¤
^l|}
v
}}k}dwujmxsWz
z~
~yesj
kun
zttxutqguybtmoahufR`pgkU_nty`rc_h}qrmZbrabWnY\wMMLcfa^vsm[\dy^`df_cc^Xjrknkrw}swxw{q}~{t~~shuqymzntpXqzvyqdwyivr§£}pxy
¡|{rwpsjokil|t^`xv{pu{g`e|ëÚµÉÃÜslsvip
|{vxrvq
¢ai}}q~qwhuriswkZ}
|vbtl~}nly}}nrzulqkrx_tin\ju`RdqhfS_pvt`o`]hqriWghciXmW[uLJLef^brs
h[\ey^^dgzad_\Ykneojtw~ss~zvzs
|vw{vlwuyytnxz}Xy
qogxwdv
q
¡¢sorw}{xqsnodr~hflww[_y{zqqiagaÕ¶¦xnqw{pj{h||~
zu{zquw~ag}~~m|tkmvtsvukc
~|p_sq
||zqfz|
~npyumnjkz}bhjiXkuZRiribPbrxlae]Zjmsb[g_dl_nTZoNHOfd\gnqlZ[cr_\clwde]\Zllbmisvqn||txx
|uy|voxy{pm{w^tmizssgr}r vvmv}|v}vqoljat|gbiuzZ_x|zmq~echhW^qr¼Ãuq~rrj{|}|uvv}qu
ru
|f}
r}g~{x~|i|veoxxsvslj
xk^rxz~
{~riyy|}nm{}wtnhg|vc\qbWnrSSnshaMftxe`]\XnosYea^jm`pOYkQDSg`Zknm|nZ[^lcZbowdg\]`ljckisvpm~|tu{|
v~xtryx~oo|qiyz~ml|vkjwtl
n}vjx~yozspljd`t{h_eqzZar}ygqzaee±²wJbZ¤ÙÐq{w}
nk
zy|xxpqt}ziy
¥owy
p{}nxhxr{e}~ucprhxpou{vxyk\q}r
}zrnq
syxno~wzehj|p_YwZXplNWqsg`Jlvt`][[Yt}roWg]fjq_nNWhQ?Yf^ZokgyqZZYkeYcqy_h\^emhekhqwnk~uo{~v
qq{|yyujzlo~t}or{{onxf¡gohz}|ixrklf_aoxm_box\dlzaqv_eeÔê¾2:>qy
v~ml
u}
|xnvwo
ku{tfy§}nuwy~{wlrh~xm|{wayqdqh~mtqt
~ru}sp[m~tx{|xzqlrztnkwuu\ihwpXV{SYodLZrre[Ipwn\ZZY]u~thYb[genciLWfQ=^e\]ue_tpZYTodYdqyZh^`gmgilipw}li~yn||zu
pnx~{{h{~kt{r{sw}yx}|kl~kh~z~~}kuqghc[bgrn`aksahpzbst^cd n\5Y¯µti|v
svpm
tyx|zsgv~~oq~hvymey¤~n~v||p{}{h~lj{zizvr`w~qdrfumu{|nwy|tmXovtwvzxsn
s}znnjnun]gfsqQZzMZo\N[rpdUKsxiWYYZaqt`]]`fdhifNYhM@ad[`ua\tmXWStaZdorWj^bhkgmlipw|li||p~~{zwq{oqw{j~{nwyww}x~~zm
£{uyklx}{~prpcf^Yg_op``gpfjotato[adjv{¾¦£È¸q
s|xsrrp{sutwyyqcwzirvfwvcj|}rt
yx{kxy~ugzhlysizv}h`w}jktg{iv~z~~p{v{t~bVw}rs|qwxpp}y~}vviqimrp]hcsnJduK]nUSYsnbQOsx`RXX\aos[a\heecjdQZpIDcaZcp^]whUVUw^[enhVk^ajgeoohpvzniy}r{~y|v}pwrnv}p|xyztxzuo~}
zw{gt
z~{
vgon_d\XeYmr```plkhn`siY^dmw©Ú©Ç²qxou{zutu~woqmtxtk`zyfqogvn[m}y}y{mvt
{
ltvmgvem{umjvw|`bx
yhtub}{gt{tuqz|mYVt~ouyltxku}{}y{s}sgtenms[j_udHnnLZaWVUxmbPRtvWPUX^aqo\`cmdd^nbT\rGBf_]fh]ZzbQU\u[[gkaVj_`nffkqhpuxtkuvx}w{s}oqtqu~
{wx||x|}~{~svy zvty^}
yt
w{bnl[b[[aVjsc`[gnofqaqfW\ck|Êι¡jmmlqq|~{
zysyuu{jlucuwof^}zerkjqcXl{sw|mqq
{y~qqp}fhqbmxqjkqw||y\dywiuxfvgt|qio~yn|]Xrmt|ooqvhwv}r{u|zrfsanlrXk_w[InkMUT^TU{kaOTurPQTV^bt
i\`kjfcYnaXbpGAh\`f_]U{]OUdpZ[jh]Wh`_rfkhrgprwxntzx~xur
pp{xwuz
z|u~}~~}|xvyx }mvyc
so
ztcnjY_[]]Tgse`YdqrfsbkeW[`ix¾®{ ·mbshs{qy
{}wxrvo{vejn`usjb^~xyfq~hjkZVow£qqytms
}xtrnhy`jm`mvjgjkywzw[g}|xer}mteu
ofkzumtb\o|ku||fu}mqgu~x~r}l{{zxpflbn~mmVk`wUJjkOQNhMY|hbNUujLPTU^fuf]`phgaWi][khJEkZadWYUyYNVmjY]le\Zec^tfmdqgrouxp
v~w|
}usnsxzzss
x}v|{~{w|wwziw}|lrp
~oflgW][\[Tdpd_WbruiupeebW\\hporsddx~itussxyvsunkzpagkgtnf]_}p{~imwfidUVro¦|{vt|s|zm{{
v||tprlgt\lh^ltdgfizo{rYgvugpwubw|njmzqfse`mzgsw|~buvikqtzpzys~f~ywndfbn|mkVjbpSKhjOKNpG^{faMUtcJNSWajv~e\gsie`VcWbp]LKkXcbUUUsVLXudZ_ka\Zce_wfmbpisnrutww~
z|u~
nrt|ztq
yut|
}~{~v{£¥yku|zuyn
sy}unjheV][ZZSbnd[Xas{ihmi`bW_[jikogkahyxjsttnz}uunzhjyj_enhvgeXbwi~{oiogf]UXog¨wz|yuo~oruywt
ujrvghn[ld]ms_gajxh{mZmrsio~yw`wwrqoyrcqi\owdqt|xbspgjxsrlxwuxd{xvpdccn|}klUibfSKkgOGRkEaxgaMSq\JMTYekw{e^mqid]V`UnnWKShWf^XNUlTJ\y_[_k]][ce`zhlaoounoxuz}wzzyz~qttyvt
}|ks{
~}{v¬zkryusnn|sjomddX_ZYZUbjg[Z^ui^ml\aV\\leqt}ii]kvvgtwrm
{}}yurlyhixf]dshzwccTepg
wwfhj`WVYgc§n~wzpp|fxoz|vq}~ndvsdhh\kb]oo[g_mudzh]torkq{}uuat
zwruuapmYqtbqr
|udrlalzoji{yvrf
v{zuqeaems~ilTi^]TKrbPFVaGbvgaKToWJLWXgkvzdenqfcZW]YveUJ\cWhXYIWeQHbxZ]_l[^\ad^ij`otxnonvyr|~uuy}suuyzz}~isz}~
zz|sq®{{}eqys||uqn
l{~lzbpobe]eVYYVcfk`]\s
hXpnZ^WZ\l{bpvvlb[lssguuply~ywnnteite[gufvvz_]Rffkt}bci\TX]bc¥hxt
xmnygwm|
{urx|xhevm`f`^j_]skYe]oobze[w{knnowxstdr~zvor}sbxd[opaqq|sfqd^nvidgy{unout}sqb_fno}djShXYTMw_QJYXHbudaITmSJLZWilq{bllscaYY[av[SLc]XiSWHYaNGiuX^am[[_bb]
hhanxylojvxm~vttsqwuw|}~~~pw|yxy~tsp¢{zxduxsxuksn~ly|pr^po`gblT[ZWhcmf\\qeSrn[ZXX`lvciujj^Zmsqlsssj
|~|vnnldiqc[jrdtvs[WSearr]bc]SZ`[cerq
tljzmop{||qwrzyydeuh]bZ`g[^vhWb]phaw`[{vjirnwsrthp~vrjp}mfwW\kmbqszsfo~[`oqb_jq~llu~sqxkpa\ellzagSgUWRPu[QOYRIctb`GUjPIPZUkkk|emoqa[ZXYlpWSOfWWiSTFZ\OHruX_cmcX``a]jcdmyxkoiuy{k}|y}nqowz}t|tw
usquo¢t{{ewnn{ofwpzlsvrk^tnagekR][UgallZ\pdOon]VXUgjtgbtee]Yntnpuuyk||vsddkna\nmcsxkZTVcdx}}q
\c_cTZ`Yccnp
sjh{ofsws|lztuoy~u^frc[^VadYateU_`mdaq]]~phisqsptujm{
qrfn}proT[fjfqtwsblvUbqj[_of}fmw}sssjm`Zdjjw^fTdUVPTmWQVSPHds_aFXiNHWTVmhd|ikxkbW\U[tdSRWhQYfTSHZZPMxw[_eliYb`^^nbfkyunohvvl}{~krgt{u}r|
{ss}vn¥svwmz`d|pfxrylmqvgd{lcfghS_^Ug_lo[^nhNim`TVSogslfwde]Xptlrzwrm{vzykaelm^`ojepx~gZVX`lx|{p_b^gVX_Wdbkq}wkkym\wqlzivsno{rXjn_Y]UbcXdqbS^ahbblZ`~lfksunmwvkh
~zmqep}mrmcYahiottr^ilReqdTbnbzcqw{vkpmk_Xaght\eVaVSNXeRO\OOHep]cFYiMI_KXmd_xhn~d`T^T]u\TS`fN]aTSJ\YPYuv]_fmhXca[^pcgjwqsngvtzry~|zntlst
y~|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBN¥¯®°knnnnqJ,00//,I
}}{{z}~||~}}}~}}~~~~~
-h
S7¤¤¤¤¤¤£r]____aR455553A©¶´´´´·|ehgggk=;|}z{z|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz||||}~~}}~~
zy}{{{z||||~~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~~~~~rtx|||{||}}~~~~~~}~~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{}|}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHIGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvtuvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfggghhgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsvyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMKKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQQVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKJHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AE@>:;>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL==AA?BC=ADDFCFFDGIHC?@?@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;=;78;<>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsusqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::97::@?8:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==??>==ji>===<<<<;<:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLKIIIIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AB?=?BDD?>=>>@@<JxsL=CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CFEJ?<;RomgexsH8<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIGHHHJIJKJJNLII_pqrrrtuvz{}}|~~~~~~~~vMNNMNNLLNPNL>A<<=?>BC??AAAB@Mzc=W
yrF888:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHJJJLJFFgpoqqtvuw{|}}|~~}}}~~~~~{NIKKLLLEILNM<?<<=>@@AA;BCBC?Vw{g}~~vG==?>=>CD?;<=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hlopoqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABECE@Wut}y
rD@@C@@?@@>=<=AEABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{|}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Ntr~}x
_=CCE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKMJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEfw
KCEDCWu~XGHJLLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHFHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJGXs
e?AVtWILMLMMLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLJX
|Tl
|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsstvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJc
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJJl
fBB=88::9878896479;<:8567789787689;;<>@;999==><<=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIhT:8656766645763468:876565676778:77789;7589989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECEr
H676468874578467699766765:9:::<898977779:98878589;A=>>BA?AKLOQPQOOPRWkqrttuwy{{{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B9F
z>988;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<;9:<8::;:999<?<=ABDIJMKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?=T
l<;>BCEEAAAB>@B@@?=>>@?>?@?@==?B?AA?A?=@@@??A=><;:;:9;?=;;==AACABCAXqqtttvy{{|}{}~~}}}~~~~~~~REBAGJNOLIGK:8:;9::<=:;;==?@B]
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHECEDEEAFEFEFFD@B?=@>=?@>???>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@DDEa
WHLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A?BCHHJ_
PMPMKNKJLIIIHJFDGHHIEEHFFELLMIJGGHIJOMNLLMKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~}}}}~~~~~QA?>?FGG=<@@88<;<=:?@>@@CFJJPg
qMQOMLLKLJHGEJHDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnquvwy{xyzz||}~~~~}~}~~~~~TDAABGGB?8?@8:<8=>;=A>?@EIKMVs
^QQPMNMKJGFCGJGLJFKOLKJJMMLOPNHIKLOQPPQOOJIJJLJLFGHGFGIFEEB@BB\orwxyzyyyzz{|~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAHLMQWy
|WURRTROLKJEEFKONOWVQPOQSRMSTOMSLPSUWRSQPLKMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BCFVNFOQQUY|
gVVkaERQQPJ;:QSR`u]UVTVYYRXXRZfPUWZ]RTWQPNRPPPQKLKGHIHEFIHIHIjrvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??AAEBCGEDELXRMTVVX[|
}al[dU:XXXSP>@VUY\d`VYbr^]V]ZVEQYZ[Y_TYgRUVXUTVTOOMJLJIILMKOMSosvxyxwyyz{z{|}|~~}~}}}~}~~~~VJJIHGFDDBA?HMIMPKIKPTSSXZZ\\x
g;~ynpXZ[ZRSRVVTZZuYU}a\X]^WIV]][[_YHYXY\]YXYWRQMPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\XSVTWRQWVcQerXZW_hP`fZ[X\hbGOZig\[\]]WSNSPPQVVVVYZnrtwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^SPPPINOWVXZZdqsvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kqy^[VUSROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURPQMKRTRMOYQMNQSUUMQSRPNLLHCIHRTUZ\mrvvussw{zz{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVQLILIaltPQSNQRQR[RSRQRUUbs{|}{{
u_]KC>CCCCB?DPBD@C>BHGV@HNMG]iPHFOFDEFHGHBCHGHJGCBAD@OPMRdsuvustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kLG>>:;>@@??>kPKaEFHIEB?GLNGMQUIBE?><=<==?=?ACB?><=B>JMFUnuuustvx{|z}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljjf`[QRZ\Y^IJPQNKLQRQTVTWQQWVPX[b]agmmlokh`nrjmlqu{z}zxz||xwxdB@@A=:BCAADB[\O{NOONKLMOOQLKLWMHG@A<977599=;;;8989?;AH?\tuuvuvwy|||}||}}}~|~}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbYGFFHBAFIEEFDLQOaWRXQPSSRU[OOQVPMJCF>:96486979:366796<B=ftuvwwyy{}}||{|}}~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXRLXYZVXXVXY]WWXhsk]Vaskaa_]d`_^YUPMONLIHJKIHFCPOSZWTTMQSYS\eUOSTRNKIHC?A9988978847578589Gnsuxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY_[VY;DUWT[fJLPRROMMNNNLJFPPUYSTNJNOUST\VRUSRNMLIHHF??=:787659967665Wqqtwyz{|}}}~|}}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpofedc\^RTZVWUTWTRXXYYYRUOJHOPOOMRJOPPPNNOTLMIPOSTU2<XMIAQ=c`QSQPNPQPNNMPNTRPRMILKOQPQRSTQROLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEBFGGHFJDHJHGEHLHKIGLMPMG/E_R>3@>joaRRQ@FTQPQPQNQOPOLJLLOPNNPQQNQOJLMMKGEEDB;==<9=G6677Dnquwz|{||}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLEGCORC8ENS]gSQSAGUPOQQPMMNLJLKLNOOQMONMIMLIKLLKGFFED<AA>;@E;<89Tqruy{{{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpknqmimcLONMQSLTUTWWULLKH=987;?A?<=A@B=>EHGDFFIGKJ@FAA@FHEJOHQRa\QPRNSOOOLLOMKMLMON[WKMQOHJHCIKMLJFFFE?BC><BF?B?Adqux{z{{|{zzw|wy}~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;>A@@>ADIECHGIGIEBB?><CAAGIDMOaeQMONWKLMKLMMLLKNNSdMJLRIIIEAHKMMNKGIFBAB@?EFEHDKopwzyy{{z{zwtxux||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOHKE?B=999:?B?<ABBADDGKFDIIGGHCC?B??@A>CECKNQTLJIMTFIIJLJKKIILMOPRPKGCKGCBJJLMONIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqokllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKCFHHGJKIJKDGB=>=:::;AB?=BCCCHFJLJEIIFGGCC;A@B>@@CECIMPGHKFHKDHIKMHJLHHJLKM]RIHDMFBEKKNMPNKMJKFGGJMNQNLcniwvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKCFEGDEEFEGBC@><=:;::@D@>BCEEIFJJLFIIGFFCB;BCC>?CCCEGLNHKNHDHEIMNMGILGEFIILNKJHENHCGMLNMPMNNMLIHJORQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGICEFEBCBE@DB>?>:;;=:=?CA?ACFGJGIILHGGGFEC@=EEB>ACCCEGHIGMPIFFGKNOKFHIFEDDIIHKIGHPKDJMLPNPNOONJJIMRUTROWdaamgprosyzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCBABD=BA>A=::=?:>?@B?@BEGJFJGIHFFGECBAAFFCBBBDEDGGHFLQLIOJJLKIGHEFEDCIHHKJHKRMCOONQPPONOOLKKPUWVUSX`^]iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqrkksMFFEHBBADD<AA@C<89=>:?<?B?@@DFHEHFFGFEEDCECDIFCFEBEGEEFGEJMKHQMJKHHIEFIHECIIJKMKPSNDQSQQROPMNPMLNSWVWXVX^[]d`hbjigk_eegcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMHGGHBBBFE<@CBD<7:=>;>:@B>??CEFDFDDGECECDEFGJEEIGCGHFHFECFJJGMJLKIJLFIHKHEKKLMNOSTOISUTQTPQMNQNMQWZVZYVZ^ZXa```^hec`dehgjhhjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvxplupmsunossyNIHGIDACHE<@ECE=8:>>>==AB=?>ABFCEBCGDCEEFGGGIFHJHCHHGIGFDHKIGKHMKJKLHLJMKINLONORUVOKUVTQTQRLOQPOTYZY\ZY\__^`c]\ackb`dghr
hgifjmnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxrhuqkrtlqwquMIKHJEBEGE<@GDD@9<>@@??BB<@>AAFCEDCHDFDGEHHFHGIKJFJHHKHFFLHHHJGLLLLLIMKMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[\^`_a`bd]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwovJKLJLGBEDE<@FDDB;??AAA@DA@B?ACHBEDFGEIEFDIHFIHJLHHJJILJFJKHIJJGKKMMJJMLNONOLOPRUXVMNTVUSRQPLNTSRW[^^_]]``aaa`bdebcibdijgvlkigmosqpqpprywruutsmmssmqrotutspsvtuuwvuuueqskpqjrvowJMLLMGDCAD<?EEEC=AACBACEACDAAEGCHGHGEJFCGJGGJFILHIJMJMLGKIHLKNQKRQLSMKNNOPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da_`b_`eaacinhbihhmxvlhimosrpqrrrvtsusssnksqmprotvrrquvuswywutucmtkopjqtpwLMLKLGDA@D>>DEFC@CAEDDFCBEGCBIFCHJJHIKFDKJGHIIIKGJJOKNLILHJMKZfJd\KlRHON_nUls[qpbwcRPbvuhucav`Xnqbdvinzf\lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?=DEFDCCBEEEFBFFGCDJEEJLLJLMGGMJHJJHKJIKJNLMMLLILML[sbdp^llUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\pugpMJryvkb`keemxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvttbmukpplrrqzKLIIGED@AB?=BFGBFCEDEEDCHHGDEKGGLMMJMMFJNHIKJILJJJKMMNNMMKNMM[roonpplkNPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\`slqjUuyxpc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGHEEEBBB=?@FGBGDIEEDBFIHHEGKJGMMNKMNHLNILKIJMIKIJKOPONMLNML\hdu]lqWlNOQmUZk^klvaldtTecNmYl\tpkilxjwuhp]_skhWbcw|oc`ghadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtwIMGIDEDCAB<B@BFDGFLHECCHKHHFJLLFMKLRRLGMMHNJIHNHJJIHNOMNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nopoqronusttj[]tcwxrjnzhaacgbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtHKHIBEEEA@>CCBGCHIMIFCFJLIGFJMLFNJKWRKGKJJNIHJLIKJIHJLMMMIKKKSkbZi^_jcrrZ_Yjo_eeUk_c[abQ`mh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunvqrutwsHHFIDEDFA@AEDDGBHJLHFDGKLIEFJOLIOIL[QJFHHKMIHJJKKIHIGKKKKFHJJLLLKIKLNT[\TPTMPONOOVQOOQOOQJJOPQdqiTYW[[\UY[]X]\\cfaafbce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyxxuvqruovrtsuusGCEGFFAEC?CGDEGCIKLHFDGKLHDGIPKLOKLWMIEEHIJHIKILJHFHGJGGIEFLHIKNLIO\W^O\[`^OXYS\\b^MYZMXaRKYaZS`d]bX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMACDBDIEGGFKJKHEEJJJFEHHPJLMJMSIHEAHFJIKKILJIFEJHEFGEEJGCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^c_Z]`c`Y_b[`^[TXXZ_^dbbaceiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIDBBCFGEGGIJJIIDFKKKEFHINJNLHLNGHF>GGLIKKJKKIGEIEDDEAFJD@JKIO[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_aa]^ca`bbbcceZRYVU\[^c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFCGEBEGHFGHIFGJGHFHKILDCKKNMLLHJJHJG?GFNJKKLKKKIGHDD@DAHIA?IJGO]aZ[d]_TQRW]\\\_ZKW\LR\YIM^PP]_accccb\dcbdcfXQUTS\X[a_^^aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMB@IFCFKIFFFHGGJFFFILJNECKJLNJLIKJHIGBHHQMKKOLKKIHGED?DBHHAAGFDT]Y^X_Y_[]UXXP]]QKJW^X^[]VZ`RQ__bb``bb`cbbddbXOQQR[S\^]]]___dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHCQJFHHHEFKJMPEGIJKNLLILKIIGDHKQOMLPLMKKHICE@DCHGBAFEBVUE\T^SV_XNTUNZ[MJKU`a[_X_^a]OYb\``_bcb]bbW__TPOPQXR]\[\^_`affelfoow|{{}
zo
~INFDFFGDIRcPDV^IGGHDFMJPPFJIJKNLKKLKJJGEJMQQNOPMNLNHKAD@BCFDCADEALHCLLPOOLFMFGIJHGLLMOQILOPPSPLQSRUZYWYXXdVOSTPPONPUT\YYZ^^aaefchdklpsszy{z~{}{
}KIEEGFGDKM^LGGXMHHJHGNLQQILKKKNNUNOKKLGGKPSSNPONONOHKE`DC_LDfcDM[H^\smOMVmYLCP`UlWgJ]XV^DLQULMTVQRTXWTXUT\TPfZhhdYTkTWVU[\\``abbb`fhfnlhrz|}~}|zr{z{
~z{LIEFFHEEKOTIKGaTHJOJIOMRQKMKLORUROOJLNGHMQ[YOPPNOPOIJPQI|YYrsXPmHqnoaVPqqsPBksmqspSo_[nX]V\XUkhU]VcZ`YZ_VUWjtuu_av_Xb\\f[_aaab^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMMBDLLGILFRVLKOIKRXWQNOOLQTNOQPKLOGMPRZZTQQOPPPJHZx]TxdhYRTQvgtlpbnfkQrOMwmjrpsrqrpop]ezuxqqzq~s}ku}bRh|essoss|}o~yor```bbZa`gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJPOMMJNV^YULQSNYYLSSRNLPIQRTYWWPTPPPQKGfxlcxqmZJLUypumubnvPdeIfvqmwojfxxiWrQhzmijzz}lxzpgoXvvjvupash}ilx|o___cb[^cdgijdgbcdllppstsssyqrxblugry{ssuy~svzn|}yxrnNJStNDBEPPIKKJLPOOOMPZ`ZXKTWPa^RVQYSMPISTUXWWPUPONRJKrouuquqdhaVnLqp^FhyWvTLhx}x`y{sna^modRgrunmypwlvstqlm\s~zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsy~nqpj{ztromKK[VHGEGRPJLMKLQQPPPQW\YUNVYUfXRRY^TMNITTVWYWOSNNNQHRmHiwK`dvvUWlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhd|ir{]TKl_vukiu{{m~xk|p]^^b[^bdegeeebZccikkrsrwgmihdg`alagsrkhmmr|kmhk{tmmkmOGJKHJHHRQLNPMLTSROSSWRVTPWZVVTTTa`QONKTSSQUVNNLMOPJHQNPULKKSTSRTPVUQQNQQXXQOPUTXXX[[USSW[WXWZOSUWWXQ]XV]USOXRWWWXZ`[gr^[\[]]_cZ_ccefdccbYccfffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilQIKKLMKJTRMQQPLVVTPTUXUYURZ]VUTWUYXPOLNWTQNUSNPMLQPKJQRKQMKKORTRQQSSIHMNOQRQQQTVRXW\WSSQRUUVSZQNSRXUTYVTYUSRUSTUXYW^Z_a]\[Z\\`c\]bcdgeddaY`acabihincad^_c]Zd\bma^ffgmsdihkkeddfhPJKLOOLMTQOTQQMXWUTUWWWZVT\`VWVYUXTQPKOXSPNUPNQNKSPMOUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[TOTUXUTYUWYTRRWUUW\Y[`^VY_]^]\]aa^[bbchfedbX``b]`hefda^_]]^ZZ_Z_g`^]]chkagfhfd`bcaPKMLPQLOTPPSQOQZYXWXZZXXV]jdVXYZWVTTOKOVTPOTPPQNMQQPRXTRQOMOSUNWRTUUONNQSUUTTRTXVZ]\ZVVQRWXV[[WQTVVUVYTWWTRRXVUZ_Z^`_V^]^`\\``__ZbbdhhedbYb`b^_fdd`b]\\\\YZ[X[a[^]\_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROLPSRUZUTPPLPWVQWSSSXMOPRTXUUUSUYX[^][[VROUWV[\WQTWUWXVTXZTSQYWV\^[__`Ua\`a]`b_\`]cacgidf`Zc`a__ee_`c[Z\[\YZYYW\Y\[`^_[^^a`_b\Y`ZQNONVQPUSPUTSPW\\\X^\_W\^jqwyc\[VVXRNOWSNQQPRTRLQTSYZWUORNSXVTSTRRZOQSSV[VVWTVZX]^\\^VSNTVV\\VRTVVXYSTY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgidf^[d`a`ace_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTP[]^][`\`U\]ijr}slg\UYWQOR[SRQTRTUTKRVU[YZSOSRVVUSOVRSZRTUTX\WXXSX\X^]Y[^UUNVWW^[XQUUXXXUWY[TSV]Y]]a^cc^Y`[eb_dd^^cca]efidf^^da`abcd_b^XZ_[\[XXXXW[Z\`][[\[XY[^V^Y]POORZPZUUWVSTT^^`^^b\`U]^bkytl}lZUZUQQS\TUTUTVYWLRZV][\ROUSXVVSPXRSWSWVV[]X[YUZ^X_^Y\ZRWRYXY_ZYSTVZYZVXY\VUZ]\^`a_ed]^]]eabfd^_dc`\gdhedb_da_a`bb_`^WX^Z\\ZYZXV]Z]^[Z[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]`U]^beeuzhXYZTVSV\WWWVVW]XPU\Y^]]TSXRXVSRTXRSVSYXX]^X][U^_X__X\VRYTYZZ`X[TVX[ZZXYZZXV]^_^cbaee]b\`fbdfd_`dbb[fchecfaf__aaaa`_^VU]Z[\[Y\YY][[[XXY[YZZ]_]TY]UNTZVS\TVWYWV\`abcad__V[`da_zuohY\ZVXUW[ZY\YXY`WPU^[`a\TUXPUVUSVVRSUW[Z\_^Z_\V__Z]^Y^VSYWYZ]bY]UV[\[\[[Y[YY^_``dbceebdZbfcgfe^ac`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWZXW\[\`]V]]SPVZVVZUYUXWX]_badada^YYadb`lfh^\][WXXY\\\_[Y[bVTW^]ac\SVYPVVVVVVTVTX\\_``]`]W`^[^\[^XVXX[[__[^WX]\]^^\Z\X[_a^`dcdfffbYceehgd^ca`ec]fidei_f^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bMRWYVWZY[\YWY^`badada]^Yacb_a`a_\\]XW[[]]__\Z]cXYX]`cd_RXYPXWXXXWVWV]]^`aa_b^Ya]]^Y]^YXVW[\`_]_YY^]^^a][ZY\_a_bddefggbZdfgigc_c^afeZhicfice^bbca``_]]ZW[YYXXZYWZ[ZYWXVU[]]]``bbxKWW\XW]\\]ZW\]_`bdbba]`Xbcb`cab^\\\XW[]_]`_][`d\\XZcecaR\YOXWY[ZYXZY`]`bb`ac_\b]_][_^ZYUX]]_`__[Z^^`bc\[W[]`bbcedgfegd\efhifcab\cg`\iibhife`baca_`_]]\Y\YXWXYYW\[ZWWXOXZ]acffrkJYW]ZZ_]\^\X]\^_acbaa]b[bda_ccb]\[ZWXjq`\`_]\ac_^YYcedaT_ZQYW\]\[Z[[c`cbc`bda`c^`\^^_ZXV[_]\aa_][`abeb_]S\_`cddfegfefe^efhhgdd`[fg^ahhbhhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{zzz{{{{{{z{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{zzz{zzzz{z{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½±µ´´´³³»¾¾¾¾¾Á¡~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊ»À¿ÀÀ¿¿ÉÌÌÌÌÌϪ}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxxxwwwwwwwxyyyzzzwopppppprrrrrrrwzyyzzz~||||||}|||}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuyvvvz{x{xwvx{wzyz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{zzzzzyzyyyyzzz{|{{||{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy|z|{y|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww|{y{x|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywwwz{y{w|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz}{y|x|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{xyyyyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrrqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmmmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|~}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~}~~~~~|}||}}~
}||~~
}}}
~~
}}~
~~~~
~
}}}{
~}~~~~
~~~
¡
}
~~}}
}}}
}}{~~~
}}~
~{z
~|}}}~|{|
~}}~~~~~}|~}}}
}|}~~~}|}}|z|
}}}~~}|}}zzz~~
~~~~~~}}~~~}}}}~}|zzz~~}~}}~
|}}~}~~}~}~}}~~}}}|{{{zzzz~~~~}~~~~}~~}|~~~~~
~|~~}~~~}~~~}}}|{{|zzyyy{~~}~~~|~~~~}|~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zzyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}}{zyyyyy~~}|~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}}}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{||||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~
}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||}~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}|||||}{}{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~~~||||||{~~z|{||||}|}|~|}|{{{|y{|{{}z}~~
|{zzy{}z|~~y|yxxt|||||||~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}~{}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}~~}~|}}{|}~||{|}zzyyyy{{~~
~~~~z{y}}zzz}q~z{|}}}}zx
~}~~}}~~~}~}}
}~~}~~}}||~~~}}~}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv~
~~~~~}~~~~|~~|}}|~~~~}|}}{}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxut
~~~~}~}}}~~~~}}}}|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||~}}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~~|~~~
~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzswvst
|~}~}~~|~~}~~}~}~~~~~
~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}||}~~}~~~~}~~~~}~~}~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|{~}~~~}}}~~~~~}}~~~|~~~~~~|}||{|xx{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxry
}~~}|~}|~~~~}}|~~~~}|~~|}}}~~~
~}|{{||yw|ywxwwx{{{{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzzzzxswuqqrpxwq{
~~}|~}}~~~~|}~~}|~}}}~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}{|}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|}}~~~}|z||{}}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyxstunsqpxruz
~}~~}~~~}~}{~~{{}{z|{{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}|||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz|}||}{|}}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}{}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~
~||||x|yzyz|}|{||}}}||~{{|zzzupxwyvu|uv|
~
{~~}y|zzz}}|}z||}}|z{~~~}}||}|vrvxyvtvu}
}
~
|||}zz{}~||z|~}}}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~||}}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uy~
}y|~{
}~~~~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s~}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}|}~}}~~}~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}z}{|}}}}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~}}|}~~~~|}}~{|||{{~
~|{}~{|{}~}{|~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||}}|||}}|}|~}|}}}|||}|~}{|}|}|}|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}|{{~||||}~}{z|z|}
|
~~~}~||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~{{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}~{
~|}}~~~~~~}}{|{zyzzyzz|yzzz{{|z{{{|}~}}}}||}}|
~|~~
~~~~~~{||}}}|~~}}~{~|{zy{zyzz{yzzz{{|z{||{~~}|}||}~
~~}|}~~
~}}~~|~~|~||~}|}}|||{{zzzzy{zzzyyzz{|y{}{{~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{}|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÛÛÛÛÛÛÛÛÛÛÛÛÛÛØÖ×××××××ÖÖÖÖÖ×ÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´¢¿¼½½½½½½½½½½¾´½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤ZUVVVVVVVVVVVR|®ªªªªªªªªªªª¬SRSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>>;=B?8<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥_YZZZZZZZZZZZV¯«««««««««««®XWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª£hdeeeeeeeeddda²¯¯¯¯¯¯¯¯¯¯¯±¡babbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÎÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌÌÌÌËÏÓÓÒÒÒÒÒÒÒÒÒÓÓÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÐÔÒÏÏÐÔÒÏÏÏÓÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××Ö×××××ÖÖÖÖÖÖÕÕÖÕÖÖÖÖÖÖÖÖ×ÖÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÏÊ¥ÑÑȧÒÑÇ«ÑÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏϪѬ°Ñ¬²ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐËÄÄÎÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѽÈ¿ÉżɯÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÒÌÒÎÑ ÎÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÓ³ÄÙ¯ÂÚ£¿ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÑÎÃÎÇËÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑËÚ¨¯ÏÛ¥³ÐÛ¢µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:979;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ¥ «§ ¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;547<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡Ê»¡¦§±¤¤¨ ¯§¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓ¶ÖºÕ¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÒºÄÕÓÓ¹ÇÖÓÓ¸ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÕÔÒÒÒÕÔÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGJB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¤©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§©§©¨£§¦¤¦¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§¬©¤¢ ¢¦¡¦®¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯ªª¬¨¨«°©¨ª¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocniib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶¯³°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__amhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µ¶¼¼¾¼¼¾Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÂù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndomhqxoyjia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÃÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrwsyfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÃÁľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijg]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬§ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÎÃÊÊÈÆÌÊÍÅÆÅÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuotb]bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÂÿ¿¾ÄËÈÊËɺÎÓÈÈÍÈÃÈÉÉÅÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegdjeajmno^Y\VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ã¹¸¹»¾ÁÇÁÅÃÓ©ÏÄÄÁÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·½Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbgc[ZZ\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶¸´´µ¿»½À¹¾ºº´À¸µ·³®º»¶¾Ì¶Ò¼¿Á¼»Ä¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾ºµ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޾ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ §¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjgfiei]VVTYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¹¿¼¼·´·°®·µ¸¿ÏµÁºÃµºÇ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¡¢¡¡£¢ £ ¢¦zxpmeefoiekhXXNKKKRILHC9=8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ·¸´¸²¶½ÅÅľǷ¹¸·µ¸º´¸³»ÅÆËÁ¼ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??==97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤¯±¶º±½¾»Ä¶·~wtÁ¬{ÉÆÏÂÀ¸®µµ¼¾¸º²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnxcgb[cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼««£°»ÔÚ»º¾¼Æ²wcldP[a}z
ËÎÑÌÊĵºÀÃÈ¿¾µ¿Á¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÀ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`aNHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED<AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±³Ä¢²Û¿¼½º}do``s[TUXl|ÈÈÌËÍÊÆÂÄËμ¹½¹¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸µ¼·Áoo°ÍÁ´zZJdcKp~n`QYx ÅÂÇËÈÁÃÁÀÉÊÂÀ»º°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²²¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^\YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»¿Ç}ov¤¿UROgO\|lFk¬Ã½¿ÆÀ¹À¼¾ÅĽ½¹²°®¸·¿ÃÇÃļ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni[__YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÇÈn¥sQLb_QQUvNe®¸¸¸Âº³»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_f]ZTJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¸ÇÈxtaLbq\OVd°ºwVP~¯°²±·¾¹²µ²¼¹¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvql_ca[]OHA>=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·ÃÃyVQkmVepg~qm^¼³°¶ºµ´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc]fX\]RNMA>IBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¹Ã¢~J^Ãt]v|ijt´»µ±´µ²´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ²»¯Lbvpzcjls~zsº¹²´³°±°¹¸¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²´¦ªWonj\h_]VY^gci¸²³¯®¬®¶¶²´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦¢£¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGPMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬©±À·¯hxxkshY^PJHJLQOZkn¢¶ª²´®ª«¯°²³®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMJHGORMJNG<E@=2?759;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡¨¡¥ÄÃ`ecrcTLF]IPFMKKS^]|¶¯¯³µª§¬«¢ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dyy`bRU`IIJKSTIRPL9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¹±
zgjcVHP^{lSKGGNTTd«²°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²±´ª²¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNOULSLA7>B68=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢£§}l]TLIUª±hPFCCGM^°¬¯§¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸²´¤ ¥¬¡¡¢ ¤¡ ¤¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HRUHFUVJBLG=KH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡¡n`UPNO\«àÚºubSHBM«ª©¤¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§ § §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BWNJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦¤ tYRORR]u¸Òº ©¹y®Ä£¨©ª¥¡¢
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã¼·³©³ª³´¯³®ª¯£«§¶±¢°¦¡£¯±°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{tqkkurphW[QETHDJPI?EA4FH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ fPINP]u²½©¢ÜÖÎÔÙÈ´®§££¡ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÇÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÉÉÂÁƾº´ºº´»·°µ²ªº²®»·¿»ºª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkdhoxjdZ[FKLEDSLDBE7:?;549978>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¢]KELSu
³¶¤ÅãÜÑĵ¦wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÅÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÔÍÓÐÓÓÌÊÂÆÆÇÊÈοÈÑÌÇÅÇÅÁ¼ÃÁ¾¿¾µ¾³®¿¿ÂÃÇÄÇÄ®¿¸²¸¼ÃÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £cJIM\~ªÑж ³Ó̺¯¨¢yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÖÓÓÈÌÇÌÍÉÒÍÎÓÍÅÈÉÊÁÆËÇÈÉÆ¿Ã³³ÈÄËÊËÏÆÊ¿¾¿½ÁÇÄÌÌÈɿÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢ ¥w]gh°ÒÚÚÖʺ²ª£¡¥ |wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÖÖÙÕ×ÓÖØÎÒÊÏÑÌÎÐÌÒÏ¿ÈÇÊÃÌÌÌÎÏÅÆÇ¶¿Ê¿ÑÍËÏÆÉÈ¿ÃÃÈÎÌÏÐÏÍÊÇ͸·»¨¥«§£ª¥©¨¨|xsvpc`erb]R\IJGAEHI>;A8=4585;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¡ª¯ÎÔÙÚϼ¯¨ ¡¢wic`____^_`^blusqpolrquÄÇÆÔÕ×××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÐÍÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑØÒ×ÙÕÖÌÏÏÊÍÒËÎÐÀÆÂÇÅÎÍÑÑÑÈÌÍÀÊÌÅÓÎËÎÈÄÊÇÆÈÌÊÓÓÑÕÏÒÌÓÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡¦{ÅÖÒÕ¦¡ }qecc__a__a`_``_`fnppnkorwwÌÁÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÎÄÉÏÌÊÌÀÉ¿ÇÉÍÎÏËÐÍÎÌÎÏÈËÐÐÊÎÊÂÉÇÉÌÊËÑÒÌÓÑÑÏÐʽȹ°®»¸µª¶°¨¸³¿»±
zvopokadnpaW\ZIFFDMWE;@=33<=87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©¦viÓÖͰk^^^adb``aa``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÇÎÍÍÔÌÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÉÁÅÌÂÈÉÂÌÃÅÈÊÊÏÊÍÌÐÍÓËÆÈÏÍÈÇËÅÆÁÅÊËÌÏÑÆÐÎÍÍÌÏÅÇÁ¸¹½Ãýù³²¾±»Ãĵª¥¢
ypqkmg``phXXhVLFLIPPB;C>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨¡¨do|¨ÙЪ|eabb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÐÎÌÔÊÇËÎÏÇÇÏÒËÐÏźĿÆÉ½ÂÇÉÎÅÂÈÀÇÍÈÄÌÊËÏÈÄÄÐÈÆÂÆÈľÀÇËËËÎÂËËÈÇËÐÄÅÈ»ÇÃÉÈÂÏÁ½¼¿°ÁÉǹ½ª°²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»¦^owºÐ«~
s`[^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÁÂÌÐÅËÈ¿¹Á»ÆÇ¾¿ÆÏËÿûÉÇÈ»ÈÆÅÊÀ½ÂËÆÅľƼ¼ÀÃÄËÅÅ»ÀÊÂÅÇÒÅÁÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {vstfiZanlZ[XRDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÀ´Ã¾²²`r¿°{
vxurp_[[]``bcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ±¶º²²³²±Â¼¼¼º¸ÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅÿ¼ÁÍÃÆ½½µÁ½Ãº½Æ»Âº³¼ÅÄÁ¶¿¶µ½¿ºËüµºÈº¿¾ËÄÁÆÂÆÉÆÈÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½³·°²§¨¨¹°¥°ª¬yvwjdg`hocV^YJFJFHJAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÑÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÀ¸Å½«¯~duµ
y~|ttc[\]^``bcabeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸µ·´³³´¼¶½±·°µ¯²»Â¼Áļ¿ºµ³º¾À¸Ç¹´»¶Á¼¸½ÆÁûµ®²¶º¿´Ä·»µ«¸½½À½±º¶¯¶º³Å¼·®»¿µ·´Å¼¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÈË¿ÏÊÇÃÆÂ÷ý½¶¹¾Ç¿¬µºµ·¶ytxfgebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÐÍÒÏÍÅÇÁÅÀ¾¸·Éµ©°mq{y~wx}ti^]]]_`_`da^dec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¸¸µ°«¬§¢ª§«³©¬©´¯·°²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶»Ç¹Â¶ª¨°²À¶¸½°°§²³µ»¼«®µ¥®µ¯»²°©¹°»®»¸»ÀÀ½¹Â¿ÇÃÅÁ¼ÆÂÈ˸ÅÇÅ¿ÆÃÃºÄÆÂ»ÆÉÌ˳¹Â¼»³svvkiablhYWW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÏÇÍÁÃÆ¿ÄÄÃÃÊÁÉʾ¿¼Àº²³´Ã®©®hd|x~
z{wn^]\]]_`__dcbccb`_][[ZZ]ZZZZ\dnohfgiknr¹°µ®¦¥§§ ¥¡¥«®¤¨¢¬ª¬ª°£¦ªµ¶±½¹¯·¯©®¸´´¼¸´¼¯·¹µ²»Á²À®¥©¢«±²³¨½ª«¨«¬´³¦¨®¡¤¯©²¦§¨®¦¨·¬±²·ºº»²¼½¾¾Ä¿µÂÁÇÈ·¿ÀÅ·Ä¿»¿Ä¾ÄÈÌÊ¿¾ÄÀÀ©strji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁ˾»É¶½Ã¾ºÉ·ÁÃÁ´µ»µ°®´»¨§_q{~~xt|swe_]\\^_`^_ccab``_]]\ZXZ[[YXZ\_fkfegeikor
ª¥¬¥ ¢¥¥¡£ª¤¢¦¥¨¥ ¥¦¬²¯¶·§°«¨ª´«´º±¶µ®¶¹±¯ºº±¶¤ ¤¦±§«¨¹ª¤§¨¨§² §¦¤¦¬§£ ¡±¬²´³´°µ¼¶»ÁÁ²º¾ÃÁ²¹¹Ã³À½¿µ¸»½¾¼ÂÇÄÂþÀÄ xpkaf_ko`TY^HNgOTGEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;È´µ½¸ºÀº½µ ¡¦º¶«³³»³ÄÏÈËÂÆ¸·ÇÁÌ¿¸É·»Å¸³Ä¸³¾À«µ»±«¤®²¬¢a|yutomkjjqi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggjmo© ¢£¡£§ ¤¦¢¨¢«°¬±¶£©ªª¬¬¤´¹·°¬³µ®²µ®°ª¤¢²¤¦©¸¢¦¦¨¬« ¥£¯©«§ª¬¬±²¸¯¸¹»°¶¼¼º«³³º³½´¶±±µ´¿¶½À½ÃÁ»»½{sk_e^ddXTW]IW\KPGIIFA<??@;?<04536:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÄÃϾ¹Ç¸·¾·²Á´±»»«¸¹°¡¨ª¦e
xrnpnkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWXXXXZ^bddeffhikr§¢¢¢¨¥¦¢¦ ®®®² ¥¢®«§¢µ±²²¬¨¯²§º³¦µ ¢£¡£¢ªµª¢£¦¦¦£ ¡«§¤¤¦«³´ªµ°³«²¹´¯ª¯²²³·³®©¬®²¸°º¶º½¿·³±
yue^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿²¥£¥±Âµ¶½´¸ÂÌÈÆ¿Å¶Á¿ÇηÀĽ³¹¹²¿¶±¸º¬±´£¨wixoqtqifdhec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¢ ¡¡¢©¤©«§¯°ª£¤¸ª¡ ®¨¶ª¦§°¤·°¤· ¢ª¦¡¬¸°¢¡¤¢¡ªª¤¢£ªª°®¨´«ª§³°¥«®³±°°®¯¦§§²®±´°¼´¹·®£yud^aVYWSRTKM^LOKGGLLE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸½®§¨£ª»À½À¹®´¸ÁÌÇÅÂýŷÈ̲ÁÂÁ¼»´»¼´¸¹¯¯¯§§pz|wqilrtpihedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbcdfj ¡ §¦¤¦§¦ ª¯¦¢¤·¨¡¡¢¨´¢¥¨¥°¥°«´ ©¡¢±±¢£¡§§¡¢£¥¥«¤¥°§¥£««¦©®¯®«¨ª©³¥¦¬¯´±¯¼µ±¯® zvrda\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847863321./2556;:8;7876<;:;;A8x»»±µ½°»±¸¬¥§·»¼Áź±¹µÄÉÉÀÃÆÆÇ¶ÆÄ³Â¿Åª··½¶½ººµ²««¥¡q|~vncafihfhjgjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWUTVUSTRU``_`a_`acdi¤ ¡¦¢¦¤¤££¢ª«¥¥±ª ¥«§¢¬©©¬¡¢¢£«©°¢¡£¤ ¢ ¢¤¦£«¥¢¤ª¤«®¥®²©¦¥¦¦´¦©¨³µ´¹º¯©¬rpo`[WVURGQOHZ[ORJTKSLEFIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:<<97?<9678452121..1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɽ±¾Äɬ±¸Áµ»À»´³¨©¤~p{tiijlgjkmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]]^^__bdm£¡©©«¨¬§¨¥¤¥®¤¥¯© ®«³ ¥¦¢£¡©ª¡ ¡ ££¡£¡¢¨£¢¨« «¯£·¥££¢¬ª¨«¯³·³¾µ³«¯tsh[XXRUQEXLQ[XMTNPLPQINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³¨³¶®©§¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĻ·»Ãȱ¸¿·¼½º²³£§
xsvwnmhmnmpggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]\\^_`d~¢ «ª¦®¬¨¯¤¨¬ ¤¨§®¨ª¥ §«¥ ¡£¡¢¥¥§¨¨ ±°¦±¼§£¬´«®§°µ°¹µÀ±±«}rsbVSVNRIFVPRQLLWMJLNRGMJACFDC>@65889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¦±·ª¦¢°«ª§©²±¥¶Æ´¹º³ÊŹºÁËÐ˱¶¸¼¾Áñ°²·´³º²±¡¡~vkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv© ª¦¥«¨¡¥£
££¢¤§ ¢¢¦¤¦¨¦¡´²¨²·¡¢·¬ª¤²²¦µ¼µ¬«±£xsm]NQQLOCMNNPKFNNJJNMQIMJAGLHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶§¤¶±¥§£©¥ ¨¥¤³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬º½´·À¯©°¦¹®«
zm__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXYX[]aosvq
¡£¡£¥¢s~{£
~~ty¢£ ¡¤¤¢´¯¬¯¬¥¸¦¦±¡±®°¼ª©¯ªwscVMROPMCSNLQMBPQHINRMHJJCJLFKK<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¦´Á¸°´°ÉÄ·¹ÁΞ³¬ºÁ«Ã¨¢¦¦µ«¡|v}eWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo|s
yz
}xqo
}¡ §¯©¨¨³¢¦®¬«¨´¢©£}rn`[NSRVLDTJPMLFNOIELQMKOJIMOFII<7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©§£©°¨§´Á¹±µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©£®
{rt\QLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tPB@}y`JQnx}
n~wuuwpQ{~xvhw~¤£¨©¥¤°ª¡¤¤¦ª¢ª¢¦¨tmg^[HQQRMIUMSILKOIHFJNLMTKQPOFIC<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶£§¢¯¡§¨¥§¨¯ªµ¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼¦§}|vomXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut|
{vxsnuptz~«
yzhv{prmxxz{vrrwgu{|© ©¥§¤¡¤sh`\\JVORGJXROJLMRJJJLPILQLRTLEHA<77;99>=:;<98@?::>=7==79937785675251472/2.,//200/-+(().1272198798775:<;7v®£¢´©¯©¥¬°±ª½´²»¸¶º´±·º²ª¬©¨²¯¡~v
w{uonhXKHHHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u|xfw}hyvx}q|w{ok~}s{}tfv|lohs|lyq}pmuqiq~pC
wwz
~{u~£¢¥womebZWWTQJSUTOPNPVKNKNOJQNHNOKEC<;79;::?=9<:99??;8<=7<9999266856633611224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©°¯±«¼¸¬»¾¹³¬§°§¬¥©¤ yup{mtpiliWKFGEA@CDILLMQRPQSTTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX]eprm§ªÀ~uyc|xo|yz}omytxjjq~Inhw~licly
ksl|nr{impsz}~{vots
yxp|~ninnnWUWTRQYORTTSXUMNHNKMNKCHNGE?;99;99:><9<;::=>:8:<9?868727565541432/024*+**-.+-*(*(',-1250,5567485HA895w¥°¢¬ª¨µ¯®¬´¿«¼Â¿¦¢¤¡¡sz
tntkpldkjXNEFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZQY\`§bitzepmzvtlts|jkMy
g1vsl~~tfet~
filukq|gqq{n{s}|qpnumxyujyyvjjohdWQZWYY[MPUVYXNIHEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715234533645031.**+),,++)(+'),,226,,5775478iO8;5n¤¨®²¦º¯«²°Â±»ÃÇ
yqs
zorpnodpf_TFIC?<;9:?@ADDEGILOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ r|xl}mr
zyr¡txsu5q¨¡¡¢
vp||sgfbjnrmpuioXupwl{}mqmpzsvncv~
ux~~{rpol`[\][YX`_RN[ZXWLHJFJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121253474531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µª®±®Á²»ÁÆ}n
ul{txxlwnwci^IPG>@7449;;<=>@BEHLLLLNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|~
~v¢y~
aªzw~sz]dqtz{wlgjbyo
znwtzptzwkni^w}|
}q}uw{|vprsfg_[[]S[f^WQUX[UGJJDLG?F@DC>AA=:97<;;=<::99;;=>79>9985653244004645554-,)+('''&(())((+++/00Uq=23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡}}~p~zgvkRWL@E211367688:<>AEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z}~v¡¥¬©H®¯¯¨sm|}hghx~n
q
Gkwryvhmk_w}
zzuv|xmow~ssqk[^][ccXfe\UPPVYPDLKFNICFCCA@CA=988:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¡¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cWKB60./23123668:=?@BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¥»±§»Çè¡¥{rv
jhouqw{v
}nvug¡«¡{zzogkx~y~rjd^[[]i\af_YOKNWRQIPJDNGCJDB@DDA<:87=<:<:88778:==8<=68656623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯°¡xw|mpj]BA4--//./02234779;=?BEHJNQRSRSTTRPOHDB<87/9D><<63.lMPHJLKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¢
lpuvql
r¡¥µ©¢}kjk|sa]c_Zfj\kk^WKGOSQNMLFIPCDMFACEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªge¤~y}
xx~gMR>/..,/.-/000212557;?CENPRTPQRSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢wz~¡{v«³ }¤¢¦¶°¨lss|~zqh`\a_afc`gg\QEJKPOIJLFFMCHLFFCBGDA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}|ªªBD}x|
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=GG@A@8662<9;FHGIJMOQYmw£§ª´½¸¥®¬¬¨©´«°·²²»±³¾³Ä¬»É˸Ŀ¸¥£°²¬«¤
¦¦ ¢¦¢ª¨¤
¤¡ ª¡¤©±£§·» £°££¤¢«¯³µ¢¥«z{~}f`h\eb]cc^ff^[OCIHTOFHLFJGEFHAKFCFFA:87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1/-4?DAMUQRSUUWUN[PGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇë³Æ¶´¿³¸¾¶¿´Á¶»»¤¸Æ©¶Éǵ¾¹´¨£´±±§¯«¤v¤¡«±³ª¨®¶»²º¬¯µ¢±¬±µ¼·µ®µ §¨£¨©°²º¸¸§·©¥ ytXadVea`b_`e_ZUJDELUQHJJDIGEA@@KDAMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL[ZQcdWzuq}
v
~{¿»£¼´y
zxn]V@EM<6:46AB7650/6CHCQ\OQUWU\WP_UIKJA@?GKFED;>@7D7?BJJEGWTP^¥£±´Ã¶¸ÁÌɶ¼Å½´´À·¸Âµ¿°¸t²´¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥±®¥¬§¤ ¬³º¢©²ºµ»¾Ì¿Å޽³Â·º¸¿·º·¹¬°¦±ª¾°½»Â¬º¨®«~zjWbaXjdhdVZcYVTIGGLQGCHIAHD>?BBK@@MC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FQLALRWTYUZwjp
nzryb¸¡£{z||}wyueO\dGEL:Qda[^SF?;HPDZcQQYXYgZT``MSOEA?IJHEFA@C=E6B>HGKLSZT]¯¸µº¹ÉÀ»½ÉÌ»½À»·µ¼»·¾µº²Æ`u³¥±«½ª¥¨«ª£¢²µ¡«§ ®¥§§¥¤¢§±´§²²¼¶Á½ÓÉÊÓÆÂÅÌÂÊÃÀ¾½¿»¼·´°¹··ÃºÆ½Ãɰ¹ª¢¬¥¨·~q_aa\Wa_hfRXaVRUIEENKA>GD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPPQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]hllq
tmsrsÕÀµ }xz{yt}zkepuY]\Peeb`ed][XW\MdmURmm^o_XgeUYTJDAKKHFHHHHBI9D?HKTTV\Z[¹À¹½·ÆÀ»¹Ê˺¶º¶¸¹³¸µ´®¶¶du¨p^¢¬¡£¤«¥¨¦¤¬¥ª°·°½¹ÔÑÏ×ÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊ¿È䤻°µ°¬¹½yl]`[X]aZcbQ[`SQKCAEFD<@E>BHB@C=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi_polouu³¬¡¡
~|s{|ts{xlmu{hreilifjih`fihmZmt¤¼g[oh]ZYTHJNPJKQLTQILAJGKP__bfia·Ç°¹³»¾¶²ÄǶ°¹±°»¬³±§ª·¬¶§§O ¦¥¡¦¬¯¨¯§³´ÔÔÕÖÒËÏÓÕÎÓÏÍÅÂÉпÊÉËÉÒÈÍÍÂÐÒ¸°Ä¼Äº¦¶»Ä£nc\\]X`WZfZP\WNPCBHEBI;AD>AH??B7;D>@H=46655;:687654/10146278875367C5B8?-0,1349=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSeWshqoyy ª¦}
|p{r}qxulqx~q{mxslhpmcimpyiw}~Ë¿Âß§mcxnc[a`JPRUNY^P]]NQNTQUT\nnwr®¸¬´§°¶«½À±«µ¦¥¸§¬®¡¬´£±®¦«¬¤§¡¬¬ÎÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÍÒÓÓ×ÍÒÑÅÒÖÆÀÎÇÈ鿸Ðyne]b\V_R][NOSPNH>AFABE<@B>EE>??:===<JA45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[u
wmwp}~¡¡y
{r~z
u
ovsls|{v|swqjrrioqzyr{¾Ë~±vrvhaj]CZZ[VfdXekTX]\`c]cx{ª¤¤¡ ¡©¦ª±¹ª¦´£¢¢£¢§±¦k¢
~
§°¡ ¡¤¤¨ÇÍÏÈÂËÐÓÑÔÒÎÓÍÆÖÒÌÔØÖÖØÕ×ÕÉÔÚÍÉ×ÖÑÊÄÃÌrob`_XSYR[OJGIIJ@;:;EAD<BD>HB?BB;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu}hsyr
w~xs{}w{nwpmuvx}s
|ylvto}vuy{µ<AÆ¥~|ieVICecfchjdoy[_fhknin ££¦²¤¤³ ¢¥¡© ¢±~
z~©£}«³§§½ÃƸ¶ÆÍÒÐÒÐÌÒËÉÔÎÐÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÌ´wvnd]YRUPYVEFJIEE=:79@AB:HD@ECADA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopaqqs|~
|x
zyqz{uz
zp|opzr|qnzuw}|u|°tX©Â¶pnb=^hrpqpnxweioruxr{ ª¡¢¥¬
}
~my{®ª¦®¶½¨½ÆËÈÉËËÏÉÃÑÊÔ֨ר×ÔÛ×ÓÙÛÖÏÛÚÑÖÈÕËyzhh[YPSS]HBEII>A>=7:=?;>H=@AAADA>?:87DB755479.566435542323647553457EBDCEB56<FNSM[nfcnskaV>,4LG865433BF4=W_hLux^8;?F<<B<99D?CGRk_mdbfkvqy~
||~wyn{{tz¡vutu}toot|
zv{·Æ¤ÂɸxpeNfczw¢yyw{|vm¦ £«
{|¡¼¡¨¦¥®§µ¾ÀÀ¹ÇÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆzyfhd_TWVUMKDMC;==<9:<>9>A6>?@<?><9867CA6455=80665547745613854564567HH=DJE7925;H>;::7IP]ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yea][htzylwvz|~}
z~
z
{u}tn|}~t|~x}xnt
~
|~z©Ã ¼£}}s~s¦
{hGq¡¤
¡~¦
¥¸¡§ £®¶ºµ«¿ÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Ü·xywjidV`[SONHDLB==>99::99<=6@>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqrx{{}|z|{~uyszsm~}w¡n¨
z |~£¢ ¤¯
Wr¬\¢££¡
¤³¡¡§±¸¬¥¼ÁÇÍÇÆÏÌÏÌÏ×ÏÑÔ®ÖÕØÚÙÚÚ×ÖÙÚo|tgf\]XSVWC@ID>?>:49:;7:;:3;;?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxmb~nmwxy~z}|{vsp
{vvut
}~¦£¦¢¨r²¦¢ ¢©¯n·ÄȲ¢¥²c¤ÍÈ
ª¤£
¥¨¡¢²´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎrhb^]]NITYABGD;A=837;<:8=649:<:82?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF><88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFv}|m~xz~z~vv|lnz|xx|~£³§£ª³¡§¥£®¢¸²¡¡¤¯£¤§§¬¯¤ À£É¹«£¦²
¨¢
t²¥¡} ±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ¦ÎÍÓÒÐÖØÓÐØ»ryv]`U_VOHJNDBCE5>:77:?;<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:IENED:6A@BS>9DO323565=v\<R\tiZM]S<=88567=:JFDGN[\YIf`;Hz{n
z|x
~px|~}orz}|x§»¬¨²½¯¤³³¨£¢°¬´¢¸¤¤©·¦¤£©©£¯°ª »»®Ê¡j¶¸«°£«¾£^ª²|}´«¡¡ ¥¯¨¡¤³¸«ÂÈĵº½»ÅÇÇÂÑ ÆÉÍÍÄ×ÖÑËÔ¡pzh\ZS^QOED><CAA8?875?F<<5<35345454B39:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdGb`bpJ@s}um}}|pww{ªÂÀ¯½Æ»³´Á¼´«³¶§²½ª»¤¨¹¸«¦¦¡¢££¨¯²±ª¤¢¦¥¤º®©À¼²¹¥¤§~½°z¨±¬ £¬ ¡§¦¤¢¤°³§ÁÆÃ¯°º¶ÅľͦÇÄÇüÕÑÍÄÊtra[Y_[MJBL@FG>A?B;:4>A<=5=6>333241A17@BN>G@CNCA=C=;86CB5BIB:878;5B>79VKDWOF8=4K@C>4EJHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\eG`igZ]\{uo~{q~zz§³ÆÉ¿ÂÌÁùǼº¯«¹»²·º²À®¥À¤«¯»¼ª«££§ª®´°ª ª¡°´§£ºº¶Á¼¬¨²¥¤¨
ªÄĤz¡¦ ®ª¡ ²¡¤ ¥£¦¦¤¯®¥¿Ä®¨·µÉþ¶Î²Ä¿Ä¼³ÑÉȵtxl\X[iRLHDLKKJAA=CD<5AD;:3=8B332263A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBfZNe\fTcjyr|xz¡¨º½ÇÈÉÁÒÉÊÂͼÁ³»¾§ºÀ¾¼Ä·¬Á©¬³»¾ª°©¤¥£¬³¶µ ®¥¢£³½©¨½Á£··°«°«¬ª§¥¥vz
££©¥|£ ¢µ¦¤£¢¥¦¤£¨§¢²¬¨¼Àᥳ·ÌÀ¹®Ä³»¾Â¸ÂÃÂÀmyaXW[[KKMJFDDIBBADL:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddV x
¡®¦£Â¾ÇÃÇÅÓÍÎÍ˼·°¹¼´¼Ë¼ÃÁµ¶»³¿¹¼®¯¨ ¨§¶©²·¬¢§¡«·¸©¤°¿Ä±¾¹³§ªµ³®¥¬¨ ±Å§}}ª¥¡£¢Z¤e£²¥¢¬¬ª§¦ £¨¥¶«©¹¼Ãµ¦³µËÀ¸ª¶¬²º¸®¨¸º½¸knZWTTNFJSNK?BHDDHGG95FM;>7=@J.32025B55PVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;=@BFBqFiIRebLF¥¡©¦¢¯¾®¡Æ¼ÅÄÆÆÎÎÎÒʾ»¶±º»¼¿Ï¶Ä½¸¸·²±µ³¸³«¦««¸ª¨§¯°£®¤§¤¤µÀ°«¬´¿ÃºÀº³§¹µ¸²®¥¯¯¥¡tÁ~
±¥£©¡ `J¥T°¯¥¯®«¥ ¥¦¢´©ª³¼¼¼ª°²ÇÀ¸¥««±±£¡²²´¤pmf\ZNPKEPPPQ;HJIGICC>:KU?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯§
¡£¤µÈ´©ÆºÂÃÇÊÈÈÌÍÆ¾»³®¹¸ÁÁ͵ǺÁ¸µº°¯¯³´¦£ª´´ª¨¦®¬¤¥¤§¬º¿¨«¶·¾Á¿¾¹³²Ä±¹½¬£®µ¬º¦¦v¿
¯¡¡©¨ ª¡§nv¢¢®²¢«¨ªª££¥¨¢±§©«º¶¾³²¾¹· £§¨¥§©©be`_QKMGHNIUL=MDNJKBCD<QU=AABDO18=77?B75UXN?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..R`MUHe^HE«¡»¯««¢¤££¶Æ½´ÁºÂÂÇÈÅÂÍÈÁ½¹²¯¹´ÀÂʵűÁ¼´ºª¨°¢£ª´»¦©¦«ª¨¯§£ªª¾¼§¼´¸½Ç¼·µ·Á±½À³©µ·«¿¥£¢ ¼ ·©¥£¡¨¥³¡¦¨ª¥¢¢ ´¯¥¥°«««¤£¨ ©¤¡¡´´ºµ¨µ²³¢¥ª¡w`\_]JHFGMQIMEFGBRLJBEG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCpbGE§¤Ã¥©ª§¦¡«¶Ä»¾·ÁÂÀÇÄ¾ÍÆ»½¹²¯¸³¿Âȵ¿¯»¶¸¶¦¤ª« «ªÄ¢¥¨«¦«¯¬¢©¨¿·¦¾±¸¶Ç¶µ¹¸¿²¿Á·µ³´¯¾££® ¢¢¥££½¤©¨« ¦½¢£¢©«¡
¤¡µ¬¦²§¯§© ¥¤«±µ±ª¥ª¬ ¨hbYa]OIGJNLHEDIA=PIA<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC<C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ:nRF<KxebWL¢£Å¬¡¬® £¥ ¦©«·±£ª³µÄĽ¿¶¿Â»È¾Êȶ¸µµ°³³·Áƶ¾°¸´¸µ¦¬ª¬¥¤Á¥ ª¤©¯¢¦§½µ¥±¼¹·¶Ã²³·¹¿²ÄÀ¸¸®³µµ£¥¡® ¢©¨«£Â©¬¦¡½¢¥««¬¦¡W¦¡ ¸ª§µ£²¡ ®¢¤¦®²«©¡¢¥¥¤adYc`LHJJNFEAFK>=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrHE6=ue\KN¡Ã¨¥¢´¢²¨«¤ ¤©¬¼±¨¬µ±ÈÅÁ³ÂüÆÃ¼Äʼ¯°¶°´¯¿Ä´¹±°¹´¬¨°©©¥¡§Â¬±ª¢®°©¤§½¶¦·»½¯·Ã³²ÂÀ²Ç³º·¬´¶ª¢¦¤¬¢¨«°¯¯»²¦ ©¨¢¤¸ ¡¤¯¯¬¥§¡£§³¦¦´£®¡¡¦¬°¥¦¡
ae[geJILJRBC@IG;;G?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 褪²¡£´ª³¬§¢¤²¬®©»²¬°´´ÆÀÄõÀĽÉĵÀÈÁ´«µ¨¯¸¬¿Ä´·®¬¶¹¥«±«ª¦»´¨°®´²§ª¹²§º³·²¹Àª·±Ã½´Æ§¾¯·µª¨¬¡¦¥¢£¥¯¸®²µ¶ ¨¤¤ ·£¤¦®²²§«¦¡¨ ¢¯²¢¦®¥«¤
©©ª¡§
xch]kjMPMNT=CANC::I@77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05IphVCWFyfC;¤£¡¦¿¦¨¯¯¡©´«¹°«£ª´¶±°¹·°·¸¸Ä½Ãǽ¼ÄÁÆÀ¸ÀÆÀº©¶¤¬»¬À··©¬±º¢°²¥§ª¹© §°ª ¯´³ª©¶¶»¬³³º·¬¸°Ãº¾¿¦Ã«°·¯©««§«¢¢ ¡±¯³«°¹© ¦¡·©¥£¢°±´«²¨« ¥¢£³°¥ ¨¢¨¨¦£}
jhlalnWPQZTACET@;;IA7:XPd^PVWDY^]MLRN^KJ>Zc^NHPN[UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251.-.,1=*'+=\p=>1.1e[d@1647gY`F(?8l}h[V;{cC=§¢©½¡«°«£±¸©¥µ³¬ µ¼®³¸¼º½¶¶À¿ÈĹÄÁÀÀ¸Ä½À·¯¶§«·±»¾¿´©®±¶«¨§¨§»¤³«¢±°³¬©¶´µ½¯±µ¬°´±ÁºÅ·«¼¯±¸¬ª£±¦¥ª ¤ ³ª³ªª³§ ¦¤´®§¢¬®±§³²ª¤¨¤¡¨µ© «
¦¥¢
{elrgpq_FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;GDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__aU150=`V^8)C3YT\gK6zfL@¤ ¤¬¶¤©¥¯®¶ª¯µº§¦°·Å·±·¾Á´´ºÅ¾ÌŹÂÀ¹¾¹Ã·À¹²µ¬ªº¶º¹¾´ª±µ§¬ª««««½«®±£« °³®®¶²¹·ª®®²¨µ¯³»½Ê²ª¶µ±´¯®§¡³ ¨ ¥²£ ¦¯¡¤£¥§³©¡¦²¬ª¶¥®±µ¯¤§¬¸£¡«¥¢¡ z
{knxmu{`EajYIHYZ={JFD6AbTi[M\`J\]ZRSRbaLKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C_Q\.*B/JGP[H3cYTKD ±¨±ª¦¤¯®µ©·´¹¤¬³·Êº´ºº¿¾´³·ÃÀÌȼü¶½¿¿·¿¼±½®§º¸·¶Â¶«±·¦®«§£°ª¯»¤¬±²§¨£±´°±±µ±¸³©®«²§·¯µ´ÃŶ©µ¶¬°©§£¶ §± ¤±§ ª©£¦¦¥¸§¢±´¬§²§°¶¬¤ ¬¨ª¸¢¥¡§£ v{
mqwu{~\Kel\KNc\>b{GI8GgWf[L^bMXYWTXTi]OOHa]_PJHQVURKIWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'GbLV%-B.=ELQ<3rkJCC¥®¥®«§¥±²³ª·±· «µ¹É¸®Á»Â·²±µÂÂÎÅÀÁ½´¼¿¿º¿¼²Ä¨©¸°¶¶¿¼®«³²§±¦¥¯¥²µ¬«±±©¨´º¬´²µ¬´ª¬¨¬©¸±°Ç¿¸¥¹°©¥¨°¦¤¤¯¤©¯££¢£¬£ ¢ª¦¦¹¥¬µµ¤ª«¨¬¯¶®££©ª ¤´¢ §w~
}||qtr~}}\Sdo^NYf\FD[G;NmXb[M`bNVWVWTXg^QRLcZ[TKGOTSNGIWS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HeHJ+:I?3BIS,>k<GHª«¢©±¤©¥³´±´µ²²¡«¼Ìº®À»Ç±´¬´ÂÂÑÅÆ¾À²½À¼¿·¼Ä§¬·¬³¸»À°«± £§ª¨¤°£ª±ª¯¬°¯°¯«³»§¶±²©²©«¦¥£º¬ª±Â¹µ¬º¨©¨ª¨±¥ª¤£®ª¨¢£¬¥¬¢§©¢¬¦£¬¸±² ©¢ «¯±¬§¨©£ § ¤~~
|w~
tsquk_Y`ncQsq\K;|F>WtX`ZNc[NUVUWQ\b^SONhXWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<]J0.JgDF8<B05EKX1@Z>LE¨¡ª³ªª°¶¸µ®«¥ªª½É¼±½·Â¯±¬³ÄÃÎÎþ¿³ÀÂúÀ³ÈĬ®·²¸À¾³®«¤§ª°©§¨±¦´®ª°®±°´´»¤¸³¬¬®§« ¢¯·ªªº¶¥¶µ£ª§¬¬ª¡©§¦²²¤¦¦¡¡¬ª¡ ¦¤¢ª¥¢§±·®£¥¢ª«©¡¥¤¤
£¢|zt~tw£xj^`ngWecN?gLEbyWbXReTMVUUTO\]aUKMiWUWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D>HFD°¥£ª±«ªµ«¶±«¥¬ª©¼ÀÀ¸¸³»µ¥²°ÄÉËÑ¿Á»¸¿¿Á¹ÁºÁÄ®±µ±³ºÀ¾³±®««¨¶ª¦®¯ª¹°¨±±¯²¶ª·¶§´·¬¬¤©«£³³¨¨¤´´ ¶ ©¨«©«§ «¬©¹¶©ªªª¢© ¬©¡ ¤¢¦£ª§µ®¨¦ª¢£¥¦§ª¢¤£
¢tytzxoqggqx\`skO^VHmxUdVQbPMUTUPOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Jj6OD;°¡¦«®¬¥®³´¯«¥°ª©º¾»À°®¸¡¶¯ÉÇÈÑÀ¾¼º¼Â½ºÃÁ¿¿®²²±µ¼»Â±±³«³¨¤µ©¥³²¹°£®·²¯²¹«¹¯©¶¬ª©¬¢ µ¨¡¯²¢´ª¨§ª£«¡¢¬¨½¯¬®¢¨¨ ¬¯¡¢ ¨§¨ª°©£¢¡¢££§©¥}£
xt|uxy{tszi£ui^ekuf}RXp]JxsSdSQ^MMRYfNLVYdXFSiRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--6)(+-,42#2)',%.;.&1.0-14%,/Kg:48_=ad?F1CP[[+HN9UA4² ¤¦¬¤§¤¬¦´²±ª¤±¨ª¸¾Á»¯§¹ª¦®°ÉÇÈÑü¿¾¸¾¿¼É¼Á¸°°µ±º»¸À²³»¸¢´§§¬²¶¹³¨¨¼µµ¼°½¦¬¬µ«©¯£¤«ª§ª²¤³¨ª§©¤©£©§©½«´¯®©¤ ®²£¤¥¥¤©«¥ª¡¡¥©¨
~~
¡~r{y}|hw|zupp}h
xdahcr
ylfx]]UAVzmTaPRXKKNqu]HZ[gYEUfPD>JNDCA9HGKS?jaJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH0%90%,,09/,,+6'17#-/FjI14X=fcBJ7GS`U*=;DX?*± ©¥¤¡«¤·²²¦©±§¬¸Á½µ°£¹¬¨¨±ÃÉÉÍÁ¶½¿µ·¿¹È¶Ãµ´²µ±½¸º¾¶¹¶¿¡³§ª«°µ¸µ«½¼©²¿³» ¯³µ©¬®°£¤¨ª¢¤°¦° «©¨¢ª¤¨ »§®°® «£¤®¦¡££ª£¤¤¢¦«{|£|yl}vxxc{zqpqrxhtjgdhanslaio_o?[xlU^OQQJJMTYWM]^lWDX`O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*K>*49&'.34.0+/4&,:$40AhY13S=e_DL6KWeO*<3OY=#¬§¤¢§£¸¯®£¯°ª«¸Âº³¸¯«¨´»ÈËÈ¿·Â¾¯´½·Ä·Ã±¯º²³Àµ»¾·©¹¸½«¤´¨©ª°®¹±ª»½¤°¿µµ¡®¶µ¦§§±³ ¤¦§¡¥¬¨© ª¯§¡§¤¨ °¸¤±¯ «¡¬¤¦§©£©¦¨¡©}}| x
|
{sp}qst`yxioqpoi~qczliec`f
~_ZsjqKL~hXZMPLJHPRPIN\_nSDX[RgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%52<fd24M?e]FO=RZhH*>/YX5(¦ ¡¤¡·«±¤³´ª¨¹Åµ²® ·¬®°µÆÈÁ·¿Á¹°´¼·¿»¿¯«½°´¿±½Ã¹©»º·§¨µ¨¨«°³°§¾·¥¼µ¯°·°¨¥§°² ¤ ¤¤¡¯¦¡¢§¯¢ ¢¤¤£·°¡¦±«¬£¯ª¥©¥¦ª¥£¨¡z
~zx
~y{prwoot_ywdllkihmerjkeh\cs_ZlviZH}][XOOJHHRUF29^^lPDXVYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84GAf[HTDU]hE.;2`T,2£¡©¥¡¢ ·ª¯ º¹¦¬½Å³°®¢µ¯¬®¯´ÄĽ³¿º·°³¹¸º¸º®®À³´¸¯¿Á¸¬½ºµ¦¢³«¨©³«®²£Â¶¦©¶´©²»©¦¦©°¬¢§¤¦¡²¥¤©©¢ ¥ ¤¹¨¤§®§¥¡¨©¢¡ ¢«¡£§¤y|
|x
{w~{ltrllsaxuhhjgeoghhdfij`hbifZezcaRsT[[SLIGIOS@!)i^jLCVU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB378cN'2¤£¤¦£µ§ªº·¨¬ÃÁ·°¬¢´§¯¯·ÀÀ½±Á·±®²·¶¸·¶¬ª½³¯²±½À·®¼¼±¥¶¬¦¥´©«® 쩦°³«¬´º¨ª«±¥ª§¥¦¢¤©¡¢ §¶¥¯ª®¡¡¡ ¦¢ ¦£¨ y
w{~
{s~}fxokjlguskcgdctbdefeijcipY^X]ldaMhWZ`VIGHKMRX>9_liGBUS\[IIGFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA;3AeH%5¤ ® ¥´±¢±¾·¡±Æ¼¹°±£¶««®©¹½¼»À²¯®¶¯³¸³¨«¹²¯´¶»¶¯¸½¦µ« ¡±¥«¯¥Ã ²£®±¯·µ¯¬®£§ª¥¨¥¥£© °¦¹¨®£¢£¤¡¨¬©©§{t
|
ofymhkjgqrk\hdbr`dgjmlgjhfl\lmuqaTbhceYIFLMOXQPUaeT@VSYUFHFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24:6#3*)6.55465Z|]19Kj[M[KXdd@A1IeC'4¢±¡©²°¸À¶¡´Â¼½¹±¥¶¯©®¥·¹·¸¬»¯ª«·ª´¹®¥³¶²¯©±¶¶±²µº¨©¶©ª¢ªªÁ®¤®°¶µ¬¬±¯ª££¬¨§£©£¥ £«ª©»§¤ ¡k¢q¤v«¨ ymi~wpl}o^c`gkuw~fhuifW\isnNPjdfqf^dfnli^^_
hOKD8ETg^JGPPUUKGS`oteE[QUPFHFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,+08>G701.*.*/668,#1'214:276Xl16Ok[N\K[fb>G1Pd=+/¤± ª«£½Å¯©·Ã¸½¼§¶°¦«¤¸´²³±¹ª§´¦°µ£¨¸·¶©§¬¶³®´³¢©´«¢¤§¨¼§¥¯³·¤¨®ª«¦¡ ¨§¡¦¥§§ §ª£µ°££££¡¡¡¥§«rx¡vif}sx o~|¡ {tvlmheczlqbTmcmiqXjpnW^i[kj[pmyriZ^FN>F^MERVWQQRWTg^LYKRRPEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82).1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1Va7/(¦««ª¨ª¿Ã¯²º½·À¾ª¤·¯ª¬¦³µ®¯³¶«©¥±¥µ³µ·µ¦§¨³±²¨¯ª¡³© ¤¤¢¤¯¶¤¦¦¶¼¦¬§©ª¬§¦¢ ¦£¦£¤¤©¢¢¥¦¡·¤¤ ¤®©£
±¤yÔ¨ÁÇyx±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«°yhkX±®oei¼¼nhzmrØ~Sjc¶²qu¡ªWOWaOVNFT[XQPS\W[P@\EQNDGI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[]41!¦¦©¥²©±Â½²µÀµ·¾Â«¦³¬¬©¨¯´ª¯¶³¨§¦µ¦§¸®³²¶«¦¤§²®±¦ª§¤²¤¢¢ °£´¹¢©¨¡®¤¢¡¨¨¡§§§¡¦¢ °£ £
°kjª~geq¦q®¡¤~w»|k¡v±_j´[¥e`fzfjxj©e¾rg¦v±j|±xtcmm§n[ EigEu`~g{£§Y_«ixzj§7J¯[WTlc[KNW_\WV;NOWV/ITSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¢¬¦¥£¤ª±·´½¾°·Å²¸ºÂ§©¯«®©©±®¤°º°¤¤®³£©¹©³³±¤¥ ª°¬¯¦¨£¢±¤®§¡´²¡ª¡ ¢©¤¡¡§¤£ «¦§ ¡µµx
©µw³·©~k¦z
w«gj±[¬{tpx
°vwqkjl|N¤XHcc~ch¦`yruR^P©mcq}b.Q¢n[Tkg`LK\dX\ZB>°xWXA#MhFCDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFB@AD<FD;0201;F,0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_gX7J9aU50³¦¦¢®©§³¬ª»¶Â°¼Â¸·Áª¬®®¦®²©¡¯¼ª¡§µ£«µ¤¥³³§£¢§ª²¨°¨¥ ¯®£¤¨´®¡©©¨© ¥©£ ¢¥£¢ª¥¢ Õ¹p°Â~Æ|Ö»|¥¤z£¥z¬yU¯{~j¹Z¹w}¦|zªy{±nt»
oO¯§ÅQ zc`ªbsrl_Sµ´È|c¤3Bv]QjhdP@XfZdaJHMlKZSOYfZCC?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<9;DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[K\P_fT7G:aQ82%¡±¨¨¥³ª¥´¨¥¼·Á°ºÀ±µµ¼³¶§±±£±³¦¯¶¨¨º®¢¯± ³´° ¤§©°©´©¥«¢«¨°¨£¬¢§¡¦¢¢¡¢¡¢¢§ ¦ §¡²nhµq«p¦r´sr¶{¤¢~ ¥~°vÒÑu[®|¤oª¦k
}}{±sx³et
nfRÈZÂ\yb_`wsb^YÊo¿uMKµSUÆdTQjcfXAOj_liPUFI9=WR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\BNT_eP5G=aM62/¢¤¯¬¤ª»¦´¥¨¶»¼²»¿·¶´»»³¥µ´¢²²£ ¬°¤¦º®¤±°´¸© ¦¡ª¥²¨¬ª¥©£© ¦«°¥¢¬¥¡¥§ ¦§¡£ ¢¥¢
¬{w¨v£©o¨¢¢~®
³\r³R®~¤q×}w~w¯w´aelZ°XKuyf`^wwgj]¯wxl5yÈ®²_BTo^h`EPl_pmVUM/eciSYQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:88 ¸°´Á¨²§ª²º¸´¸¿º¸³¶½µ¥¸´ µ ©«§¶¬¨°±«´¤© ¨¢µ§¦ª£¥¡£¦§¬¯¥¡©¢¢©¦¡¦©¤¬ ¢ §©}}¥y¡ªp§ ¡£ª|yo±Z¨ ytØvt§¤|{²^d }l\«[Zhgªds{kq]¬Z kneOJC¡\ZMt]cfMZa_st_JU5JYHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<PeeA&Uf[?1U_bL7FI_C1>8¡¾¬´Â®«©¦´°¸±µ¿ºº³±·¼ª»µ ±¥¥§§ª±©¯ªµ¬ª®¡¡ ¦¤¤º¢£«¡¢ ©°¯¦§¦¤¨«¨ª¨ ££ ¡¡ ¡«®mr´t©w¦s´yt³¤£¤v¸o{¢kk¶Z¡ei ¢§mr´t²jku³af¢nj\`M¡|Rs£ly~no\¯V<wfTon.[§ObSkebmYb\`q|cSYP>>mo3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;<000/75,+,426/#00,,289/9N`eD'UdY>/U_aL5FM^81B9¤»¢²À®««§·©¸¯µÀµ¼±¯¹¸«Á·ª«¡§¤¢«ª§µ£²¨®ª¡¨ ¤«¹£¥£¡«¶¯§¬©¦¥£«²£ ¨«° ¢¢¡©«Ô»t±ÄÃ}Õ¸x§y£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxnpm¤t½]w}[ay¼j[V[iy^i`dfbmxoY[YCA@r?CF+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.97-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7@9§¢¼¢±Ã°©ª¬±§¸¯¶Ä±»²®»°®Á²¬¥£¤¡ª¤ª²¤µ§¤ª¦¬¹£®¡¥ £¯¹°«£¨§¥¤ ¨« ©¤²£¥¦¢¡¤° ª
µ¸xµwnlnsnysÁ»¼{²¨pt¹|{|¤»¹½uz³£tvut°ufi¶trpw¶^z}gymyb¬pu
X[§jDeZTf`c]bQgfqmuBMPLD;ZL>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITAKNGEOF?G<7>7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbV8*O]]=+;VV'=;<§¡¡¿¥³Ã´¬ª§¬«©»®°Æ¯µ´¯¸§µ¸©£¢¦ ¬¤ª¦µ¨¨ £¬¤¾¦¡ª¢¡¨¢²µ¶¤¤¢¦¥«©¥¦¢©¦¦£©¡£°©§¢j~i§xs~uze{½¾Àºnq_rjZ^adk`cmvbke^`cqhr}gj~qty}|b[wthP\n}{jXlyrIJo
pMtMEW]faL[Xgc^O[mvjrRODEN;HI<M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEKOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7IR_I'S`V4)P^L(3>[O'?2>¨ ¨¡Á£´º¶£¬¥®§¨µ²¬È¬°³¬µ£¾±²¦ £©£¬§®¤¥µª¥¢¦©¿¨©¦ ¥©§°²¿¬§§¢ª¨¤¬ ££§¬¢ª¢°¦°¥¢¨£¤§£hn|qv´© ¢ z¤
kj||tqxyvv{jstudw}vkpzm`c\phMYYej_WYpznnfSOFS9OZNRO(+:JB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J'R^S10T^:+=8]K,<-@² ³¡¿¢¤±²· ©¥²§¥°µªÉ«±¦µ¦À¨´ ¥¥¤ «§¬££·¬ ª¦Á¬¤¢¢§¨§²Ã¯««©« ¡¢¥¯¦¡¤¨¦ ° ¢§ ¢£ {©¨
{
£~f¢³®
vz}vyzogykuyrhtyuktcyf`idcdfjXk{pjj\RLPD_UF@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^]]^]XVJKLBIOMRJ;<:786/2964.(&$-1..)+*7%+<(6CMLD/T]Q05M[17E4\G5<,@³ ¹¯¾«®²² ª¦²¢¬³°Å°ª¬£³¯½¤´ §¢¡¨¦©¦¤¦³µ¯¦®¾ «£¡©
©¬¢³È´ ª¤«§© ¤« ª®©¦£«¢ ¡¥¯¤¨¥©f|e~cxlhkz£«ke~g
eeihz¡kh¢wkj£slnzyXe]
^kv[hswwnxxsmysv{j
X^ktd]sik|qlc]QNWIdX@J4>F7?FD71<=?AC;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[I/7ZO6)EY/DO1YC;?.=¥º¼¹¯«³°«¥¨®°¦®®°½±©¨¤°± ¤¡¦«¬£¦¨©³®£¢¯¦¶¹¥®£¡ ¥{¥¬¢¨³Ã¸¥¢§¯£¤¤ª¨¡ ª¯ª«£ª ¨¦¨¡¬¡¥°¤«¡¥«~¾r´r
hx¹Ä¸q¡£{¦sª|ËÀÀ»q¢|À½ÁÁ{z¿}k¥±ooÊzxvyyqzow
ymvbf_xc_eb^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___^\SMPGUNA??=6468276*&%#)*&.+*)109*#>H[L*#CP/#F[3PY/UAB;/8£¸Ãµ°¯À©©£¯©°¯¦²µ¯«¦¦¦±««¢ ª§¢«¢¥©¥¤´¤£¦®¬¸´§¯¢¥ ¡¦«¤«¿À±¡ª¯ª¢¢¤ª£ ¡®©¬¦££¦ ¥¥®©¤©ªª¬¢¥¡£Îyz¥y_^§¡ |§t«¯^d©z§
t³c«¡³j®t|¸aY£Ínu{Û{q~ue{vvk}n}
~m`qkpf`_xd[qhjcf`RTRW]JOC5AHED8>6;@?A;=8@>>?BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+--J0';\:L-!P@F4.1ÂÀÀµ´°·¤ª©´ª¥²¬¬¬¤¬¦°ª §¦¢° ¨§£¦¡°¬¦®±«¨¬ ¥¥¨£®¤«°¨¿Æ³¨©±®¢ ©ª¡®¯§ª©§¦£¡«³¦£«ª£§¦¡°¡§¡ p
u¨q°|r¬~¡¥w«}r~«vz|~ª¢~«{ zVÄzoÁ}mupmfveoawnromeosuo`fmd_niinfcWT\aZRRC8II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1''45-&7>WJ-='>1)3V@F!G:C1.+¯ÔÆÇ²´£££¢®¶®¨±§©ª¨®««§¢£¢¦«¢¥¨¨¢°¬¨§¯¨§©¤¢¡¦£®¬£¬µ©¹Í²¦®¬¢®¬¡©±©©©«©£¢«¯±¢¨¬®¦¦«ªª±££¥
¤j¤uz©tz²q¥p ¤_`R«®u®§z
{f£¤£}©~®^|¨U¢z¢{ïÅs¯³³¹qb©¯Âthmonxwwnlfedqpf{ic\W_iXXTLLQLCCAB;CA@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^aa`_^]\][SIB6799674,&$" ('"+-"$.!3-&@DWH,G+66*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°µ°®©¬£¨¦ª««©¤¦ ¥¥§¦£¬¢«¡¤¯¢ª¤¶°® ©§¤¡¨ ¦°¦£¨±¬¶È²µª¬ª¢¥³¡¦««£®¬¨¢¡ª¢³¢ª³²¢ª¨¯¯¶£¤§|ªlu«y|°n¤ Ò¸´¸É²^_©¤ zxªÉs£¨©~ÆÆwe¡¥s}¯^oµc±uK£m§Gd{p~pzt|zm\fjrqfi^aXcm\^YIMMKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4OTQ;<F2,$¨¤Áƹ¨²®¬¥¢²¹¬ª¡¥¨¦ª¬©§ ¦¥ª£®«¦ ¬©¥§µ¢¨«¶²¬¦ ¦§£ ª§®¡¢¦©°´Â²³ª¨¥¢£¯¥¡¥¥«¯¨¦¬£·¬¡±¹°¯§³´³¥¨¤ Nxz£|¤¦¸||y¹~ÌŶx ~u¤¤¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu£{}uyr~p[lnwrjnZc_hnbd]KLQTAHGFI:9K>B108856877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E2:P[T6?H,- ©¬¤«¹«¯ ¡¬³´¦ ¥®®®©¦¦¦£§¡²®¡©¦² ¨¤¢µ¢£¡©µ¹¤££¢±§¦¡¢¯®£§¢µ±Ã±ªª§£¤¥¥£¨®¡¥¦¯¥¼¢··®µ²¹²³§°¢¤ÑµÃ·y
¦x¢w ¥q«´nri£|r®¥¢¦mp²\¥szl{}n©a¢qqbs²¸hx¦}x|xlhwixsnt\ddnmeh`JZWX<GG@U3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUVVTQOQ[U%!2AH$)%s®¿¿»»µ¨¤¶¡¢£©§®©«¥¡¥ µ§¢©§°£«£¤£ª´´¤¦©® §¤§µ©£¶«Â°©«©¢¢¡¦£¥¤¦«§¢¥§¾¬¾°£°³º¬´§©²¥¨z¨}|°w¤¥m²o¡|¡¨¬®
¨ ¢
{}«ªx y¯]£|¦§d|tk®]¥kq
]`[ n§zyjl~b}tny`feqohghCY`[=JS2U8BBC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI7052.*,ATVVVUTUUUUTTUTSTWWWXVUUQHFIJ#((¼©ÆÃ¶Á´ ®¸¥¤¤£ ¯¯ª£¹ ¢« ¯ª¡ª©¤®±¬¦¨¢¡¥¢¥¨¦¶¨¿¯¥©¤ ¦¥££¨««£¤©¨¾¤Ã¬ª£¢¬³º¬¯§¡´°©«v¯~
}ºd°e} ¦¬°
¥¤¡¢ [lj³`{{±lgn±[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m¨zx}ds}axs|aifpmfeeOUc[AT^=I(>9=4!",%2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UYXWXWWXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Á³£¦¥¶¨¡ ³³©¢´ ³¨ª«°«®©¢¯¬¨¦£¨®©¡¥££¥¢©²¨¼¯¥¨|¡ ¨¡¨§¥¥£¥©» Ƨ¥©¢«´¶®§ ½®©£¯¤¸Ãº
§¬¯¦¥ª~սªb£¿½|~£×º¸µ
½¾j£o«nz²±Çj«°½xw¢¾»t¦yyb}zcgx{`kekjbPb[Sj\@TaBM)<:4/$%2 $(0496678;>ACFGJKMNNQTW]a\__a^`[\YTQMIC?<A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼´´±¿¹²½³¢®¦¥³¦¥¿ª·±¨¡¿¦¦±±¹¨¯¥§¯¬¯¦£¬¡¥ª¡£¦§¡¨¢ «©¹®¨¤{¦©©¨ ª¦¡£«»©Å£ ¯£«³µ«°ª¡¼¨°°tuª¤·epg¬mow¤u®pq§£®¤rmmmewnmqyiqigqhi
gpd^cjpY]g~w¦`bqofd¢|uewhjx~ydlcflbKdXJkY:PeEQ'K9+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³ªº¹²³ª©¢®¤²©½±ÃȽµ©À«¬£ ¦«º£¤¬¬¦ª
¥ª¢££ ¥§¨£ª ¥¥§¯º«¬{¥§¨¢°¦¢º ±Â¨¤´¦¬±²«®¬¨¹¤¯¸¡¨¥¶¢©ª³¢« ²¢ ¢ ¤¡«¦¤~gtvtq§m| phvowv|zilddocU`Y@iZGb`NY*E=+&"740.!%2(*799469;>?ABDFJKKMPPQWUVY^_ac]^UQJED>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥µ¸¯®¢°¤ µ±«Å¼Äº·ª¡¥¦°¨£¶§©´¦§¬£§¬¤¡§£©¨§¡¤§¡µº¨«|¡¥¨¶£§¸¨°Â®£¸§¯¯°ªª´º¢¯½¦£¦¶£¦©£¬¯¡¢°¨¯¤ ¤ª«¡ª
~fuvysj}¡ yqrxq{~jnd_pi`[`YmbP`dPZ:GFE=3==7.*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV\^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤§£°³¬®£©§ ¨µª¥³º®««¡¢z¢°¤¥±©¸¦£©¢®¤¨ ¡®ª¨¨¨¹¶¤¥y¢¨¸¤°¶£±°t¤¿¤² xz «³¼v®¤ª~d\bv¤~n³£§«¢e syp¨l¢§e¥
xkvq|ai[vghrz¤exwinykpe_uokkh\fcbboR[>MNNRG=@TB91/&4:316678<;>@ABFHBGFIKLTUUY\_hfgWQJ<DG;8UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥©£§¤«µ¯±¥ª¦«s¯¨«§¸ £~«£§¢
u¦¨£º´¨ uv ¦²µµ½¨¡~§¢z£¯¸§
±©¯¢y¬¢§©¨w¥z¦{±z
cynqzqt
xht t|~jjx{qpgdwnilj[ejier[^HSLQ@E5-YTT6)!09=>643568;:=>>@DI@IEJKGRXZX[aahfYQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°§§ª¥®Æ½°¡§¨µ«§¢ ¾ }
«¢ ¡§¢£¹²§
pu¤¬´´®Ê«®·
°±¯©§|¨r{w¦h¤y´¦¨Â«¡q¤}
±¡| |
ms{r
}
t
Åf©¢jogwt{vghupggk^bnlflXhG\QL2E46M`c6&4<DGD:64658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@JdY]cfhgbbbbcc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹±ª«¦ £¤ª¢¥©¶£¯ §¥½ y«¡
w¤¢¸¥bm¡¡¨~¡§ ® «¯¤ª~£vk«uM«x¨§ª«}¡{z§ikg¶}m`cX{dgs}yl]|n_Sq\`ly`Ye}q§ªk£nr¥pgdlZlzeY_~aWPoventrjjo^jolkhWiO]WE9A4GC^k4+ICQMN=84859;6@;;>BO>QRLMBJ\]_W^_bv`MD:MOMTb\\ffiibbdbddbab`cdcabikdbddgdbgeach ¹¡ª£¦¬¢¶¼«®¢ ¡¥¬¬ ®µ£¨ ¦´u¦~
¬¤¨¥°¦¢in¢ ¢¥£¡ w§¡§ª®
¥y}}¢ps{ym¨|¢sv¦f~w¤_z|s¢n·´ºt¶¨dƸ{p·q¤cs¬«`}j³~n}q£ls¤s~£^³o{³tr[²ibotuqhnYklsre\i^bKD=D5QAYq2<RF_JS=<395::6D;;@IP?TMNQ@E_^[ZX``|dHC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¹¬ ¥¸µ® ¢££¥±¬ ¤«x
p }¨¡¢¨¨¤~k{~} w¢ r¢©§¨«®}z z£xs}¦£d¡|lhnz§}rgsªsªg]
vhªj¸f\©pa^§vuhunk¦\¨~w»j}©Z]³g\nqywjh[pjyyb_fXbAPEN7VBRm4JZZ_NZD@151;;7H?:CGT?YRY]>Db]V`Qad}iEB9N[]XdfXfgnmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬º²°¬¦§®°¨«¢¡ £iq{y£
¨£ ix{¢ ¢rh p©£© ¨}°¤¢¸v£³¢£xz«~¢r¡|
¯µ}k¡x~´££«¨{|~sªZ]o{xbM{{
czBMY¢jr|muy±³¦tmq|ori£]vHec`sp}}md_kiw|ddaR^V]TV@YEQgDRW[bX_ID=B8@B:IE8LDWAVQ[VDFa\Z`K`m~rEC<U_bZejVghlnbff^aa\]^ahb_edvl^egfldelhhki±®S_¡§´º³³©¢©©¡«¤¡¨¡w
ny
}r r¨|l
q¡x
|¤ £®}µ{¦z©¡}§hwm~s sq|
o®}£¦£p^©gu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²¨¼wm¿¦ª´^o~qos¢r]£gt¦ah¦mÓ{nwykzvrl©¥g_eypjffcnvxh`cS[eQQbIWIT_WS[ej\eQECKLJKBJD8P?PMWSXORQ`eeiRdxywIFEc]dYhjTihjocjg`c`\]]_hbahe|d^dgdkdjmghlh°¬T\K~©°²µ°³£
¦ £¤¨ ©
{p}h}wpl|£ª
yvnw¢y¢¤³¡¢¶z¬§¤®¥p©
}¤¢r¢¬®¤®¢vµ¶µÉ¡sa©myu¡w }oLf¢ps¤{ytal~ lrd`rti{i³µ´Æ¦s~{j«umtwiytqPE|³^jvkxfjgbtuqnV^TYhPRhIULXRV]gknVgWMJAJMJHJNAQJPecimetrs~x{nu{{TPOm]h[kiRjhilglfce_\\\^ibdhk{_]dgcjfoleile¢¯§
f?¡³«¯¯µ¢¢¨¢¢¤¥§¥yjye~ yui
z¥©z}xp¡y ¥¨gnxl¢d|q¥wpg§{¥z rv¹n¢b}¢nri«ju ln¦`ihu¢}_
uobh¡eiupdfnr¢Z_[d¡n^o{srd¥nx¢dg§hsn¡oSo ^d§T]SmmskqmphkxskoRXWWfYSmIXO\HXihsjYkVQREV\LXRaUhj^wuz|p||r{rvv^QsagbpgPjhhklngdg_]^]`kbjivu]\chcjjslfkmc¥¦zetm§®¥ª°±¦ª¥¢¡¢¢{qh|st}{e|
¦¢¬
}si¥} ª§¦x~¥²¯¥xz©t¥n¥¢¼n|¥¯
|¥zq¨ g~o¬cw¨l©¢vw«¦k°kv³©lnma«ªv§w}
¤ iv¬g¶sw¾¤Y¦«aurso{tqbj~nhlSV[Uaa]kM]R]I]lmv`[qY[`Zgsenorcqt`w{~yrys~{{vbxdcnsdRlgholrifia_^\bkbllzo\\bibljwmglnb¦ª¤©ª¨§®£ª¤¥©
tzo}ttrm}{¤¥¥uol¨«£ u~y®£qx
{r§q}}zx{~}v z}l
[yyryqhn~qtq
e_wusuozonm_wixfª~t}jov|
vmlgsx{w[jXxhmwrqowxo]lnigVZ`W\dkdUaU^Q_pwykjvejjju|qrtsaoubs{xuyux
}{mldyn^Wnghukxjiid\`ZcjelpunZ[bkdllymhloa¹¨¦¡¢¦¤¤«¢ « ¦¨~r|}~ztrp
{}
x~¢{§¡
wr©
¨ «~~¨§xp{o~©
p}qjo|hm]sqtkvsYrn}~i]icz
_ix{|viykaqsw`s§fnvp
yoefcyzZ\ifnv[zywtmsrf\mklbYY^ZYkq[^`Y^]fs}{sosckki{|q{wtdmthl|~uy|{zyo{}s~ysiT\qiluougkgd]aXkhkjqrmW[enlgszohjm`ª°¡£¡©£¡}«¢¥{|r}v
qor~z¦ xz¬¡« ¢¢££ª¡§¦ |y¨~°¥²¦k|vwe|w|zu¢~vqt
x¦|vk{yirh`sp}zwvowt]^ohn__Z\]SgqUc[[alht{|rnpdkjh{mxqioplf{rw}zm|zx|~zxNdvksmpzdkebb`[tfpfrqlU]ltmhyzqgikeº¢¡¤ {ª
|y{mxr~mk~y~}ªr
}z©§ ¢¦ ¦w}
¥{|ª¡ª~ox
qt`t~
nyuu¢
t}}rs{{y§v
|nk}{mhklg^y~g|{vtuu{w\`p}nu`cZ\^QfmSeZ]akivy~pkldkiglslltoxnynv}
vq~{z|{`i{kuhidjc`i[cuhobumlTbqyepzzrejmm¸¡¤zw¥¤yz
|m{xr
}|kh||~|§p ¡
|§w£¡¡£¡¤
y¡~|¤ ¦~~utpv`}
q|r~
hxry~r|}qz|
z{¥|
uzeqzyzpljf^}rh|uus|rj^`tvpxdcY^^RkhTdX^agjvxqfkclhejm~hoqk}wzkr}tv~|z}jrnsiahlb_qUtomn`xhmWjtvbuz{qbjoz²¥¥ |u£ ¢x{~~p{tu
~xgc|
x}y }o¦¥v¡¡z¤zx
~s¢¡¢~|vq}mzd|
pleuo|}x|}|ryy
¢wv{
u`ww}t}wfkd`~ijvstt}q|ccasnusmaY`^[ldRbW_`hkuypcjcmfh|lhthloh|xmqt|~z~|muttmeljacuViqn`xflbjvpfy{yq`rl
®¦¨ |w©yy|}|{xsxzs}d^|~t}~}£¡~r{§ t§tlzo£{zqyjul{~~m
wp}~drj|
ty~vx~}
¤y
t}stmaztzq|oancd{anovrwwstbv`oluno][^]^j^O]Wbahmszk_jejchwmflhjmh|zwns}tz}z}}ryyxnlkh_irchqofvgmlazhj|zxpawmª ¤©}v}w~{|{vwptszo
}~|`\~szz¤}|¤
n¢¡o
gz
p¡|{tsukqnu|tnqt{|eqmy~}
ttyo~}
¨{}~
w}po
chwsupzb^pajt^pjzxxlrpey]mlsmsXZ^_ajZPWXdcgqqf]ihfbgqndigejhzwtn
s{u
x|w
zw|{ryjk_phtkqnmqgole{bmyvqlww£¢¨¡§t© t{v
xxrs{
kroymvnq[Y~vu w~n¡
k¤gw~||ovokmop{
isqwtyftov|
zzwtp|{£|wxxnj]rrqppxZ^qaoj^oi|ypmmjmv`pokrmYXaabnXQSYefcupb]kmdbfkm`gf_hkurrptxvy
wv
|{vjqc|b|opltjholvw_q~y{tut¥§
u
zrxtpr
squlomumw}mnUQ«xvry xz¤
|s
ih¡qw{z||kvjmkklz~ay~vzw|ygtlt{qz
px{{~
|}x}vpikx_womkqrU^pbq`_mnypgpfgsuhpkawe]Ve``rSPN\ed]xp|_\hrbbefj_hd[gp~pkqs}v|
tuy{
xs
~{ywfrj`~ookz`jmtt_t}xxts
|y¡±¦vtvspo
spqojivmn}|musRNßÉÖ|ptuw{r¡~xz~ywhl¤
cq{{y
{~l{erojkyy[yz~~zzhsks
}l~o~{|wxysmfplhtoghslS^oepY_kqxfkjbfxsopc_w``Vk_^vPNL`fc]yqt\[ev`aeecafaXissnkqv|tzuv~s{r|~uesn|eoplZlnyys`vz{vrwwy¯
w}
uwpyqnomn~rddxp|mz}jhlc¤ÁÜ®ï¡skuu¡
nq£
{uxvwo~¤
^l{}
v
}}k}cxuimxsWz
z~
~yesjlvn
zttxutqguyasloahufR`qgkU^msy`rc_h}qrmZbrabWnZ\wMMLcfa^vsm[\dy^`df_cc^Xjrknkrw}swww|q}~{t~~rguqym{otpXqzvyqdwyivr¨£}pxy
¡|{swpsjokil|t^`xv{pu{g`e|ëÚµÉÃÜslsviq |{vxrvq¢ai}}q~qwgvriswkZ}
|vbtl~}nly}~nrzulqkrx_rhn\ju`QerifS_ovt_o`]hqriWghciXmW[uLJLef^brs
h[\ey^^dgzad_\Yknenjtw~ss~zvzs
|wv{tkwuyyuoxz}Xy
qogxwdv
q
¡¢sorw}{yrsnodr~iflww[_y{zqqiagaÕ¶¦xnqw{qjzh||~
zu{zquw~af}~~m|tkmvtsvukc
~|p_sq
||zqf{|
~npyumnjkz}bgiiXkuZRiribPbrxlae]Zjmsb[g_dl_nTZoNHOfd\gnqlZ[cr_\clwde]\Zlkbmjsvqo||tx
x
|uy|voxy{on|w^tmizssgr}r vvmv}|v~wqoljat|gbiuzZ_x|zmq~echhW^qr¼Ävq~rrj{|}|uvv}qu
ru
|f}
r}f~{y~|i|vfoxxsvslj
x
k^rxz}|~riy
y}}nm{}wtnhg|vc[pbWnrSSnshaMftxe`]\XnosYea^jm`pOYkQDSg`Zknm|nZ[^lcZbowdg\]`liclisvqn~|tuz|
v~xtryx~on|qiyz~ml{ukjwtl
n}vjx~yozspljd`szh`eqzZar}ygqzaee±²wJbZ¤ÙÐr{w}
nlzy|xxpqt}ziy
¥owy
p{}nwh
xr{e}~ucprhxpou|vxyk\q~r
~{rnq
szxno~wzehj|p_XvZXplNWqsg`Jlvt`][[Yt}roWg]fjp`oNWhQ?Yf^ZokgyqZZYkeYcqy_h\^emhekiqwol~uo{~v
qq{|yyujzlo~t}or{{onxf¡gphz}~|ixrklf_anxm_box\dlzaqv_eeÔê¾2:>qx
v~ml
v}
|xnvwo
ku{tfy§}ntvz~{wlrh~xm|{wbyqdqh~mtqt
~su}sp[muy{|xzqlrztnkwuu\ihwpXV{SZpdL[rre[Ipxo\ZZY]u~thYb[genciLWfQ=^e\]ue_tpZYTodYdqyZh^`gmgilipw}li~yn||zu
pnw~{{h{~jt{r{sw}yx}|kl~kh~z~~}kuqghc[bgrn`alsahpzbst^cd n\5Y¯µti|u
svpl
uyx|z~sgv~~oq~hvymey¤~n~u}|p{}{h~lj{zizvr`w~qdrfumu{|nwy|tmXowuxvzxsns}znnjnun]gesqQZzN\o\O\spdUKsxiWYYZaqt`]]`fdhifNZhN@ad[`ua\tmXWStaZdorWj^bhkgmlipw|li||p~~{zwq{oqw{j~{nwyww}x~~zm
£{vyklx}{~prpcf^Yg_op``gpfjotato[adjv{¾¦£È¸q
r|xsrro{tutwyyqcwzirvfwucj|}rsyx{kxy~ugzhlysizv}h`w}jktg{iv~z}~p{v{t~bVw~ss}qwxqp~y~}vviqimrp]hbrnJduL^nUTZsnbQOsx`RXX\aos[a\heeckdQ[pIDcaZcp^]whUVUw^[enhVk^ajgeoohpvznix}r{~y|v}pwrnw}p|xyztxzuo~}
zw{gt
z~{
vgon_d\XeYmr```plkhn`siY^dmw©Ú©Ç²qwou{zutt~wpqmt
xtk`zyfqogvn[m}y~y{lvt
{luvmgvem{umjwv|`bx
yhtub}{gt{tuqz|mYVt~pu
yltylu~{}y{s|sgtenms[j_udHnnLZaWVVxmbPRtvWPUX^aqo\`cmdd^obT]rGBf_]fh]ZzbQU\u[[gkaVj_`nefkqhpuxtku~vx}w{s}oqtqu
{wx||x|}~{~svy zvuy^}
yt
w{bnm\b[[aVjsc`[gnofqaqfW\ck|Êι¡jmmlqq|~{
yysyuu{jlucuvof^}zerkjqcXmztx|mqr{x}qqp}fhqbmxqjkqx}|z\dywiuxfvgt|qjn}yn|]Xrmt|ooqvhww}q{u|zrfsanlrXk_w[InkMUT^TU{kaOTurPQTV^bt
i\`kjfcYnaXbpGAh\`f_]U{]OUdpZ[jh]Wh`_rejhrgprwxntzw~xur
pp{xwuz
z|u~}~~}|xvyx }mvyc
so
ztcnkZ_[]]Tgse`YdrrfsbkeW[`ix¾®{ ·mbshs{qy
{}wxrvo{vejn`urib^xyfq~hjkZVow£rrytnt
}xtrnhy`jm`mvjgjkywzw[g}|xer}mteu
ofjzumtb\o|ku}|fu}nqhux~s}l{{zxpflbn~mmVk`wUJjkOQNhMY|hbNUujLPTU^fuf]`phgaWi][khJDjZadWYUyYNVmjY]le\Zec^teldqgrouxp
v~w|
}usnsy{zss
x}v|{~{w|wwziw}|lrp
~oflgX][\[Tdpd_WbruiuoeebW\\hporsddx~itusrxywtunkzqbgkgtmf^_}p{~imwfidUWro§||vt|s|zn|{
w}
}tprlgt\lh^ltdgfizo{rYgvtgpwubw
|njmzqfse`mzgsx|~bvvjkqt{qzyt}f~ywndfbn|mkVjbpSKijOKNpG^{faMUtcJNSWajv~e\gsie`VcWbp]LKkXcbUUUsVLXudZ_ka\Zce_wfmbpisnrttwwz|u~
nrt|ztq
yut|
}~{~v{£¥yku|{uzo
sy}unjheV][ZZSbnd[Xarzihlh_bW_[jikogk`hyxjsttnz}uunzhjyj_enhvfeXbwi~{oiogf]UXoh©wz|yuppruyxu
ujrvghn[ld]ms_gajxh{mZmrsjo~ywawwrqoyrcqi\pxdqt|xbspgjxsrlxwuxd{xvpdccn|}klUibfSKlhOGRkEaxgaMSq\JMTYekw{e^mqid]V`VnnWKShWf^XNUlTJ\y_[_k]][ce`zhlaoounoxuz}wz
zyz~qttyvt}|ks{
~}{v¬zkrzvunn|sjomddX_ZYZUbjg[Z^ti^mk\aV\\leqt}ii\kvvgtwrm
{}}yurlyhixf]dshzwbbTepg
wwfhj`WVYgc¨o~wzpq~hxoy{wr}~ndvsdhh\kb]oo[g_mudzh]toqkq{}uuat
zwruuapmZrtbqr
|uerlalzoji{yvrf
v{zuqeaems~ilTi^]TKscPGVaGbvgaKToWJLWXgkvzdenqfcZW]YveUJ\cWhXYIWeQHbxZ]_l[^\ad^ij`otxnonvyr|
}uuy}suuyzz}~isz}~
zz|sq®{{}erzt}|vro
l{~lzbpobe]eVYYVcfk`]\rhXomZ^WZ\l{bpwvmbZlssguuply~ywnnteite[gufvvy^]Rffkt}bci\TX]bc¥hxt
xmozhxm{{usx|xhevm`f`^j_]skYe]oobze[w{knnowxstdr~zvor}sbxd[oqbqq|sgrd^nvidgy{unout}sqb_fno}djShXYTMw_QJYXHbudaITmSJLZWilq{bllscaYY[av[SLc]XiSWHYaNGiuX^am[[_bb]
hhanxylojvxm~vttsqwuw|}~~~pw|yxy~tsp¢{zxduysxulto~ly|pr^po`gblT[ZWhcmf\\qeSqmZZXX`lvciuji^Ymsqlsssj
|~|vnnldiqc[jrdtvs[WSearr]bc]SZ`[cerq
tlkzmop{||qwrzyydeuh]bZ`g[^vhWb]phaw`[{viirnwsrthp~vrjp}mfwW\knbqszsgo~[`oqb_jq~llu~sqxkpa\ellzagSgUWRPu[RPYRHctb`GUjPIPZUkkk|emoqa[ZXYlpWSOfWWiSTFZ\OHruX_cmcX``a]jcdmyxkoiuy{k}|y}nqowz}t|tw
usquo¢t{{exon{ofxpzlsvrk^tnagekR][UgallZ\pdOnm\VXUgjtgbtee]Yntnpuuyk||vsddkna\nmcsxkZTVcdx}}q
\c_cTZ`Yccnp
sjh{ofsws|lztuoy~u^frc[^VadYateU_`mdaq]]~ohisqsptujm{
qrfn}proT[fkfqtwsclvUbqj[_of}fmw}sssjm`Zdjjw^fTdUVPTmWQWSPHds_aFXiNHWTVmhd|ikxkbW\U[tdSRWhQYfTSHZZPMxw[_eliYb`^^nbflyunohvvl}{~krgt{u|r|
{ss}vn¥svwmz`e|pfzsylmqvgd{lcfghS_^Ug_lo[^nhNil_TVSogslfxdd\Xptlrzwrm{vzykaelm^`ojepx~gZVX`lx|{p_b^gVX_Wdbkq}wkkxm\wql{jvsno{rXjn_Y]UbcXdqbS^ahbblZ`}kfksunmwvkh
~zmqep}mrmcYaiiotts_ilSeqdTbnbzcqw{vkpmk_Xaght\eVaVSNXeRO\OOHep]cFYiMI_KXmd_xhn~d`T^T]u\TS`fN]aTSJ\YPYuv]_fmhXca[^pcgjwqsngvtzry~|zntlsty~|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBN¥¯®¤ £cggggfo
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR455553A©¶´´´´µ¨£¤¤¤¤§|\____^j|}z{z|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvtuvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfggghhgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AE@>:;>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;<:68;<>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsusqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::989:N?8:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==>>=;Fy_;===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLKIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CDD?>==@IHCXyoC>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CFEN@:@e~~xrwo>9<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~~~~~~vMNNMNNLLNPNL>A<<=?>BC??AAAB@M{f@kzp?988:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC?Uuyq|rB==?==>CD?;<=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCE@Uut||
hAA@C@@?@@>=<=AEABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{|}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Lss}
_>CCE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKMJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEfw
KDEDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJGXt
c@BUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLJ[}Wl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLIe
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJJl
fBB=88::9878896479;<:8567789787689;;<>@;999==><<=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIi
~T;8656766645763468:876565676778:77789;7589989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECEv
H676468874578467699766765:9:::<898977779:98878589;A=>>BA?AKLOQPQOOORWkrrttuwy{{{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B9H
z>:88;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<<9;<8::;:999<?<=ABDIJMKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?<W
l<;>BCEEAAAB>@B@@?=>>@?>?@?@==?B?AA?A?=@@@??A=><;:;:9;?=;;==AACABCAXqqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@B`
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHECEDEEAFEFEFFD@B?=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@DDEc
WHLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@?A?BCHHJ`
PMPMKNKJLIIIHJFDGHHIEEHFFELLMIJGGHIJOMNLLMKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<;<=:?@>@@CFJJPh
qMQOMLLKLJHGEJIDJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnquvwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@8:<8=>;=A>?@EIKMVs
^QQPMNMKJGFCGJGLJGKOLKJJMMLOPNHIKLOQQPQOOJIJJLJLFGHGFGIFEEB@BB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAHLMQWy
|WURRTROLKJEEFKONOWVQPOQSRMSTOMSLPSUWRSQPLKMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BCFVNFOQQUY|
gVVkaERQQPJ;:QSR`u]UVTVYYRXXRZfPUWZ]RTWQPNRPPPQKKKGHIHEFIHIHIjrvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??AAEBCGEDELXRMTVVX[|
}al[dU:XXXSP>@VUY\d`VYbr^]V]ZVEQYZ[Y_TYgRUVXUTVTOOMJLJIILMKOMSosvxyxwzzz{z{|}|~~}~}}}~}~~~~VJJIHGFDDBA?HMIMPKIKPTSSXZZ\\x
g;~znpXZ[ZRSRVVTZZuYU}a\X]^WIV]][[_YHYXY\]YXYWRQMPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\XSVTWRQWVcQerXZW_hP`fZ[X\hbGOZig\[\]]WSNSPPQVVVVYZnrtwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^SPPPINOWVXZZdqsvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRTRMOYQMNQSUUMQSRPNLLHCIHRTUZ\mrvvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YVQLILIaltPQSNQRQR[RSRQRUUbs{|}{{
u_]KC>CCCCB?DPBD@C>BHGV@HNMG]iPHFOFDEFHGHBCHGHJGCBAD@OPMRdsuvustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kLG>>:;>@???>kQKaEFHIEB?GLNGMQUIBE?><=<==?=?ACB?><=B>JMFUnuuustvx{|z}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrjmlqu{z}zxz||xwxdB@@A=:BCAADB\]O{NOONKLMOOQMKLWMHG@B<977599=;;;8989?;AH?\tuuvuvwy|||}||}}~~|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbYGFFHBAFIEEFDMRPaWRXQPSSRU[OOQVPMJCF>::6486979:366796<B=ftuvwwyy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXQLXYZVXXVXY]WWXhsk]V`tkaa_]d`_^YUPMONLIGJKIHFCQPSZWTTMQSYS\eUOSTRNKIHC?A9988978847578588Gnsuxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNNNLJFPPUYSTNJOOUST\VRUSRNMLIHHF??=:787659967665Wqqtwyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOJGOPOOMRJOPPPNNOTLMIPPSTU2<XMIAQ=c`QSQPNPQPNNMPNTRPRLILKOQPQRSTQROLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqptuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEBFGGHFJDHJHGEHLHKIGLMPMG/E_R>3@>joaRRQ@FTQPQPQNQOPOLJLLOPNNPQQNQOJLMMKGEEDB;=<<9=G6676Dnquwz|{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8ENS]gSQSAGUPOQQPMMNMKLKLNOOQMOOMIMLILKLKGFFED<AA>;@E;<89Tqsuy{{{}||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A?==A@B=>EHGDFFIGKJ@FAA@FHEJOHQRa\QPRNSOOOLLOMKMLMON[VKMQOHJHCIJLLKFFFD?BC><BF?B?Adqtw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;?A@@>ADIECHGIGIEBB?><CBAGIDMOaeQMONWKLMKLMMMLKNNSdMJLRIIIEAHJLMNKGIFBAB@?EFEHDKopwzyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPPHKE?B=999:?B?<ABBADDGKFDIIGGHCC?B??@A>CECKNQTLJIMTFIIJLJKLIILMOPRPKGCLGCCJJLMONIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqnjllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKCFHHGJKIJLDGB=>=:::;AB?=BBCCHFJLJEIIFGGCC;A@B>@@CECIMPGHKFHKDHIKMHJLHHJLKM]RIHDNGBEKKNMPNKMJKFGGJMNQNLcniwvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKCFEGDEEFEGCC@><=:;::@D@>BCEEIFJJLFIIGFFDB;BCC>@CCCEGLNHKNHDHEILNMGILGEFIILNKJHEOICGMLNMPMNNMLIHIORQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGICEFEBCBE@DB>?>:;;=:=?CA?ACFGJGIILHGGGFEC@=EEB>ADCCEGHIGMPIFFGKNOKFHJFEDDIIHKIGHPKDJMLPNONOONJJHMRUTROWdaamgprosyzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCBABD=BA>A=::=?:>>@B?@BEGJFJGIGFFFEDBAAFFCBBBDEDGGHFLQLIOJJLKIGHEFEDCIHHKJHKRMCOONQPOONOOKKKPUWVUTX`^]iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqrkksMFFEHBBADD<AA@C<89=>:?=?B?@@DFHEHFFGFFEDCECDIFCFEBEGEEFGEJMKHQMJKHHIEFIHECIIJKMKPSNDQSQQRNOMNPMLNSWVWXVX^[]d`hbjigk_eegcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBFE<@CBD<7:=>;>:@B>??CEFDFDDGECECDEFFJEEIGCGHFHFECFJJGMJLKIJLFIHKHEKKLMNORTOISUTQTPQMNQNMQWZVZYVZ^ZXa```_hec`dehgjihjfhnllnmqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunorsyMHHGIDACHE<@ECE=8:>><<<AB<?>ABFCEBBHDCDEFFGGIFGKHCHHGIGFDHKIGKHMKJKLHLJMKINLONORUVOKUVTQTQRLOQPOTYZY\ZY\__^`c^\ackb`dghr
hgifjmnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIKHJEBEGE<@GDD@9<>@?>?CB<@>AAFCEDCHDFDGFHHFHHIKJEJHHKHFFLHHHJGLLLLLIMKMNMOLPPQUVWOJVVUSSRQLORRQV[[]^[\^`_a`bd]d`ef`ehjcssfjhglprqossnswwquvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwovIJLILGBEDE<@FDDB;??A@@@DA@B?ACHBEDFHEIEFEIHFIHJLHHJJILJFJKHIJJGKKMMJJMLNONOLOPRUXVMNTVUSRQPMNTSRW[^^_]]``aaa`bdebchbdijgvlkigmosqpqpprywruutsmmssmqrotutspsvtuuwvuuteqskpqjrvowJMLKMGDCAD<?EEEC=AACBBCFBCDAAEGCHGHGFJFCGJGGJFILHIJMKMLGKIHLKNQKRQLSMKNNOPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da_`b_`eaacinhbihhmxvlhimosrpqrrrvtsusssnksqmprotvrrquvuswywutucmtkopjqtpwLMLLLGDA@D>>DEFC@CAEDDFCCEGCBIEBHJJHIKFDKJGHIIIKGJJOKNLILHJMKZfJd\KlRHON_nUls[qpbwcRPbvuhucav`Xnqbdvinzf\lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?=DEFDCDBEEDGBFFGCDJDEJLLJLMGGMJHJJHKJIKJNLMMLLILML[sbdp^llUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\pugpMJryvkb`keemxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?BB?=BFGBFCEDEEDCHHGDEKGGLMMJMLFJNHIKJILJJJKMMNMMMKNMM[roonpplkMPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\`slqjUuyxpc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGHEEEBBB=??FGBGDIEEDBFIHHEGKJGMMNKMNGLNILKIJMIKJJKOPNNMLNML\hdu]lqWlNOQmUZk^klvaldtTecNmYl\tpkilxjwuhp]_skhWbcw|oc`ghadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtwIMGIDEECAB<B@BFDGFLHECCHKHHFJLLFMKLRRLGMMHNJIHNHJJIHNONNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nopoqronusttj[]tcwxrjnzhaacgbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtHKHIBEEEA@>CCBGCHIMIFCFJLIGFJMLFOJKWRKGKJJNIHJLIKJIHJLMMLIKKKSkbZi^_jcrrZ_Yjo_eeUk_c[abQ`lh]j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwsHHFIDEDFA@AEDDGBHJLHFDGKLIEFJOLIOIL[QJFHHKMIHJIKKIHJGKKKKGHJJLLLKIKLNT[\TPTMPONOOVQOOQOOQJJOPQdqiTYW[[\UY[]X]\\cfaafbce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusGCEGFFAEC?CGDEGCIKLHFDGKLHDGIPKLOKLWMIEEHIJHIKHLJHFHHJGGIEFLHIKNLIO\W^O\[`^OXYS\\b^MYZMXaRKYaZS`d]bX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstxyyxyxwxtqxrxsqrurtOBCDLMBCDBDIEGGFKJKHEEJJJGEHHPJLMJMSIHEAHFJIKKILJHFEJHEFGEEJGCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^c_Z]`c`Y_b[`^[TXXZ_^dbbaceiekrpoppnow
{
uqprrsvyyzyyxxxvryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKKKEFHINJNLHLNGHF>GGLIKKJKKIGEIEDDEAFJD@JKIO[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_aa]^ca`bbbcceZRYVU\[^c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFCGEBEGHFGHIFGJGHFHKILDCKJNMLLHJJHJG?GFNJKKMKKKIGHDD@DAHIA?IJGO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^PP]_accccb\dcbdcfXQUTS\X[a_^_aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMB@IFCFKIFFGHGGJFFFILJNECKJLNJLIKJHIGBHHQMKKOMKKIHGED?EBHHAAGFDT]Y^X_Y_[]UXXP]]QKJW^X^[]VZ`RQ__bb``bb`cbbddbXOQQR[S\^]^^___dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHCRKFHHHEFKJMPEGIIKNLLILKIIGDHKQOMLPLMKKHICEAECHGBAFEBVUE\T^SV_XNTUNZ[MJKU`a[_X_^a]OYb\``_bcb]bbW__TPOPQXR]\\]^_`affelfoow|{{}
zo
~INFDFFGDIRcPDW_IGGHDFMJPPFJIJKNLKKLKJJGEJMQQNOPMNLNHKADACDFDCADEALHCLLPOOLFMFGIJHGLLMOQILOPPSPLQSRUZYWYXXdVOSTPPONPUT\YY[^^aaefchckmqsszy{z~{}{
}KIEEGFGDKM^LGHYMGHJHGNLQQILJKKNNUNOKKLGGKPSSNPONONOHKE`ED_LDfcDM[H^\smOMVmYLCP`UlWgJ]XV^DLQULMTVQRTXWTXUT\TPfZhhdYTkTWVU[\\``abbb`gignlhrz|}~}}zr{z{
~z{LIEFFHEEKOTIKG`TGJOJIOMRQKMKLORUROOJLNGHMQ[YOPPNOPOIJPQI|YYrsXPmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`YZ_VUWjtuu_av_Xb\\f[_aaab^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMMBDLLGILFRVLKOIKRXWQNOOMQTNOQPKLOGMPS[ZTQROPPPJHZx]TxdhYRTQvgtlpbnfkQrOMwmjrpsrqrpop]ezuxqqzq~s}ku}bRh|essoss|}o~yor```baZa`gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJPOMMJNV^YULQSNYYLSSRNLPIQRTYWWQTPPPQKGfxlcxqmZJLUypumubnvPdeJfvqmwojfxxiWrQhzmijzz}lxzpgoXvvjvupash}ilx|o___cb[^bdgijdgbcdllppstsssyqrxblugry{ssuy~svzn|}yxrnNJStNCBEPPIKKJLPOOOMPZ`ZXKTWPa^RVQYSMPISTUXWWPUPONRJKrouuquqdhaVnLqp^FhyWvTKhx}x`y{sna^modRgrunmypwlvstqlm\s~zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsynqpj{ztromKK[VHGEGRPJLMKLQQPPPQW\YUNVYUfXRRY^TMNITTVWYWOSNNNQHRmHiwK`dvvUWlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhd|ir{]TKl_vukiu{{m~xk|p]^^b[^bdegeeebZccikkrsrwgmihdg`alagsrkhlmr|kmhk{tmmkmOGJKHJHHRQLNPMLTSROSSWRVTPWZVVTTTa`QONKTSSQVVONLMOPJHQNPULKKSTSRTPVUQQNQQXXQNPUTXXX[[USSW[WXWZPSUWWXQ]XV]USOXRWWWXZ`[gr^[\[]^_cZ_cdefdccbYccfffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilQIKKLMKJTRMQQPLVUTPTUXUYURZ]VUTWUYXPOLNWTQNUSNPMLQPKJQRKQMKKORTRQQSSIHMNOQRQQQTVRXW\WSSPQUUVTZQNSRWUTYVTYUSRUSTUXYW^Z_a]\[Z\\`c\]bcdgeddaY`acabihincad^_c]Zd\bma^ffgmsdihkkedcfhPJKKNOLMTQOTQQMXWUTUWWWZVT\`VWVYUXTQPKOXSPNUPMRNKSPMOUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[SOSUWUTYUWYTRRWUUW\YZ`]VY_]^]\]aa^[bbchfedbX``b]`hefda^_]]^ZZ_Z_g`^]]bhkagfhfd`bcaPKMLPQLOTPPSQOQZYXWXZZXYV]jdVXYZWVTTOKOVTPOTPPQNMQQPRXTRQOMOSUNWRTUUONNQSUUTTRTXVZ]\ZVVQRWXV[[VPSVUUVXTWWTRRXVUZ_Z^`^V^]^`\\``__ZbbdhhedbYb`b^_fdc`b]\\\\YZ[X[a[^]\_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROLPSRUZUTPPLPWVQWSSSXMOPRTXUUUSUYX[^]\[VROUVV[[WQSWUVXUSXZTSQYWV\^[__`Ua\`a^`b_\`]cacgide`Zc`a__ee_`c[Z\[\ZZYYW\Y\[`^_[^^a`_b\Y`ZQNONVQPUSPUTSPW\\\X^\_W\^jqwyc\[VVXRNOWSNQQPRTRLQTSYZWUORNSXVTSTRRZOQSSV[VVWTVZX]^\\^VSNTVV\\VQTVVXYRSY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgidf^[d`a`ace_b_YZ^[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTPZ]^][`\`U\]ijr}slh\UYWQOR[SRQTRTUTKRVU[YZSOSRVVUSOVRSZRTUTX\WXXSX\X^]Y[^TUNVWW^[XQTUXXXTVX[TSV]Y]]a^cc^Y`[eb_dd^^cca]efidf]^da`abcd_b^XZ_[\[XXXXW[Z\`][\\[XZ[^V^Y]POORZPZUUWVTTT^^`^^b\`U]^bkytl}lZUZUQQS\TTTUTVYWLRZV][\ROUSXVVSPXRSWSWVV[]X[YUZ^W_^Y\ZRWRYXY_ZYSTVZYZVWY\VTZ]\^`a`ed]^]]eabfd^_dc`\gdhedb_da_a`bb_`^WX^Z\\ZYZWV]Z]^[Z[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]`U]^beeuzhXYZTVSV\XWWVVW]XPU\Y^]]TSXRXVSRTXRSVTXXX]^X][U^_X__X\VRYUYZZaY\UWWZZZXYZZXV]^_^cbbee]b\`fbefd_`dbb[fchecfaf__aaaa`_^VU]Z[\[Y\YY][[[XXY[YZZ]_]TY]UNTZVT\TVWYWV\`abcad__V[`da_zuohZ\ZVXUW[ZY[ZXY`WPU^[`a\TUXPUVUSVVRSUWZZ\_^Z_\V__Z]^Y^VSYXYZ]bZ^VWZ[[[Z[Y[YY^_``dcdeebdZbfcgfe^ac`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWZXW\[\`]V]]SPVZWVZUXUXWX]_badada^YYadb`lfh^\][WXXY\\\_[Y[bVTW^]ac\SVXPVVVVVVSVTX\\_``]a]W`^[^\[^XVXX[[_`\_XX]\]]^\Z\X[_a^`dcdfffbYceehgd^ca`ec]fideh_g^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bMRWYVWZY[\YWY^`baeada]^Ybcb_a`a_\\]XW[[]]__\Z]cXYX]`cd_RXYPXWXXXWVWV]]^`aa_b^Ya]]^Y]^YXVW[\`_]_YY^]^^a][ZY\_b_bddefggbZdfgigc_c^afdZhicfice^bbca``_]]ZW[YYXXZYWZ[ZYWXVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbba]`Xcdb`cac^\\\XW[]_]`_][`d\\XZcecaR\YOXWY[ZYWZZ`]`bb`ac_\b]_][_^YYUX]]_`__[Z^^`bc\[W[]`bbcedgfegd\efhifcab\cg`\iibhife`baca_`_]]\Y\YXWXYYW\[ZWWXPXZ]acffrkJYW]ZZ_]\^\Y]\^_acbaa]b[bda_cbb]\[ZWXjq`\`_]\ac_^YYcedaT_ZQYW\]\[Z[[c`cbc`bda`c^`\^__ZXV[_]\aa_][`abeb_]S\_`cddfegfefe^efhhgdd`[fg^ahhbhhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{zzz{||||{|{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{zz{}}}}|}|zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½±µ´´´´¸Q&+++*"ÛÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääèÊ»À¿ÀÀ¿ÄIïååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyyyzxopppppprrrrrrrwzyyzzz~||||||}wssssss}
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvyvvvz{x{xwvx{xzyy}zyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{zzzzzyz|}}}}}}{zzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy|z{}z|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww|{z}y|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywwwz{y|z{zwxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz}||}{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{x{zy{xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~
}}|
~||}~
~|~
~~
¡
~
~~}}
}}}
}}|~~~
~
~
~{z
~|}}}~|{|
~}}~~~~~}}~}}}
}|}~~~}|}}|z|
}}}~~}}}}zzz~~
~~~~~}}}~~~}}}}~}|zzz~~}~}}~
|}}~}~~}~}~}}~~}}}|{{{zzyz~~~~|~~~~}~~}|~~~~~
~|~~}~~~}~~~}}}}{{|zzyyy{~~~}~~~|~~~~}|~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}}{zzyyyy~~}|~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~
}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~~~||||||{~~{|{||||}|}|~|}|{{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv~
~~~~~}~~~|~~|}}|~~~~}|}}{}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|~
~~~~~~~~~z{z}}uqz|zqz~}yxut
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||~|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}||}~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~||~}~~}}}~~~~~}}~~~|~~~~~~|}||{|xx{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxry
}~~}|~}|~~~~}}|~~~~}|~~|}~}~~~
~~|{{||yw|ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqrpxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|{{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~|z}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
~
{~~}y|zzz}}|}z||}}|z{~~~}}||}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}}}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~||}}}~~~}}~~~}}}~}}~~|}
~
}}}||||~~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~}}|}~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~}~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||}}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~}{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}|{{~||||}~}{z|z|}
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~|}}}~~~~~}}{|{zyzzyzz|yzz{{{|z{{{{}~}}}}||}}|
~|~~
}~~~~{||}}}}~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}}~~|~~|~||~}|~}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÛÛÛÛÛÛÛÛÛÛÛÛÛÛØÖ×××××××ÖÖÖÖÖÖÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌͲâÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´¢¿¼½½½½½½½½½½¼¿ÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎnPSSSSSTTTTTSL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤ZUVVVVVVVVVVVR|®ªªªªªªªªªªª¨°ÒÒÒÒÒÒÒÒÒÒÒÒÒÑàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÎqTXWWWXXXXXXWP¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥_YZZZZZZZZZZZV¯«««««««««««ª±ÑÒÒÒÒÒÒÒÒÒÒÒÒÑßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÎx^a````aaaa``Z¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª£hdeeeeeeeeddda²¯¯¯¯¯¯¯¯¯¯¯®¶ÒÒÒÓÒÒÒÒÒÒÒÒÒÒßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÇÅÅÅÅÅÅÅÅÅÅÅÅÄËÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÏÎÎÏÏÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌÌÌÌËÏÓÓÒÒÒÒÒÒÒÒÒÓÓÒÔÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÐÔÒÏÎÑÕÔÓÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××Ö×××××ÖÖÖÖÖÖÕÕÖÕÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÏÊ¥ÑÓÏÒ¤¡ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏϪ˺¸µ³¡©ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐ˼¢ÅÈÐÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѽȬ ¬Öº¡°²ÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÒ¢±¨¦²¯³ªÕÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÓ³ÄÁ¢§¤ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÑÎħ´« ©
¤ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑËÚ¨°ÎÚÁ¼¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:979;::;8@?:<<9<>=;;:?9?:;9=>=><;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ¥ §¡ ¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;547<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡Ê»¡¦§·¤«£Ã «¤ÑÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓ¶Ù§¬ØÂ¼ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÒºÄÕÒÕ¿¿ÖÒÕÅÄÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÕÔÒÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEHIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGHNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥¤¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤¤¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXO[\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¤©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§©§©¨£§¦¤¦¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§¬©¤¢ ¢¦¡¦®¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^s_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯ªª¬¨¨«°©¨ª¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocniib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶¯³°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__amhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µ¶¼¼¾¼¼¾Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÂù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCCDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndomhqxoyjia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÃÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrwsyfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÃÁľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijg]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÈÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÓÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬§ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÂÉÁÊÊÈÆÌÊÍÅÆÅÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuotb]bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÂÿ¿¾ÄËÈÊËǽÔÓÇÈÍÈÃÈÉÉÅÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegdjeajmno^Y\VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ã¹¸¹»½ÁÇÁÄÍ¿ËÆÅÄÁÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·½Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbgc[ZZ\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶¸´´µ¿»½À¹¾ºº´À¸µ¸³®º»¶¿ÑÀλ¿Á¼»Ä¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾ºµ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޾ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjgfiei]VVTYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA@C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¹¿¼¼·´·°·¶¸ÄË
Ƚ»ÃµºÇ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¡¢¡¡£¢ £ ¢¦zxpmeefoiekhXXNKKKRILHC9=8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿¾¼²¯¬±°·¼·»½ÁĹ·¹¸°º´¹¼Éº
µÄ¾Ç·¹¸·µ¸º´¸³»ÅÆËÁ¼ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·¹±½¾»Ä¶¸¥{Å£|
±ËÆÏÂÀ¸®µµ¼¾¸º²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnxcgb[cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼««£°¸ÉÓ¶º¾¼Æ´¢xereU`f}ªÎÎÑÌÊĵºÀÃÈ¿¾µ¿Á¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÀ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`aNHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED<AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±³¿ËÈÛ¾½½¼jv`gv^WV\s¨ÌÈÌËÍÊÆÂÄËμ¹½¹¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸µ¼µÆqÁÓÀ´}[LoaP|ubV`~©ÆÂÇËÈÁÃÁÀÉÊÂÀ»º°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²²¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^\YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»ÒrµÂXTVbRd
mIr´Â½¿ÆÀ¹À¼¾ÅĽ½¹²°®¸·¿ÃÇÃļ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°´·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni[_`YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG>CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹Â×r®vROlZRUZwLn¢´¸¸¸Âº³»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_f]ZTJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹ÃÕ}x`Nju]Q]lºµuTW¸µ²±·¾¹²µ²¼¹¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvql_ca[]OHA>=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·ÀÊ}XXgq`wrzwnk_½³°¶ºµ´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc]fX\]RNMA>IBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸¹Å«xLf Ã}]yluy±ºµ±´µ²´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³»· Mhvoyrhikvwx¥¼¸²´³°±°¹¸¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬ª¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²·¦¨Xpsmdk_YWX[b_l¹²³¯®¬®¶¶²´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨««¦¢£¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGPMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬©°À±³|xvrteWVOIIKNOO\kp¦µª²´®ª«¯°²³®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMJHGORNJNG<E@=2?759;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡¦ÇĦafir`ROJpUVJOJLT^]·¯¯³µª§¬«¢ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dyy`bRU`IIJKSTIRPL9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥»¼}oijaTJWpzYLFGNTTh®²°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²±´ª²¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJOOULSLA7>B68=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢©«}k]TMM\ÄË©oYLECGMa°¬¯§¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸²´¤ ¥¬¡¡¢ ¤¡ ¤¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HRUHFUVJBLG=KH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡£o_URQUiÀãÒ´oYJET«ª©¤¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§ § §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BWNJGMGCFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£¢wYRQTVhÀ̳±È°¹Å¢©©ª¥¡¢
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶º»ÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã¼·³©³ª³´¯³®ª¯£«§¶±¢°¦¡£¯±°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{tqkkurphW[QETHDJPH?EA4FH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ¡hPKPQiµº§³àÛÖÛÚÈ´®§££¡ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÉÉÂÁƾº´ºº´»·°µ²ªº²®»·¿»ºª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkdhoxjdZ[FKLEDSLDBE7:?;549978>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¢]LGNX~À¸¤ÕäÛÑÄ´¦wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÆÌÑÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÔÍÓÐÓÓÌÊÂÆÆÇÊÈοÈÑÌÇÅÇÅÁ¼ÃÁ¾¿¾µ¾³®¿¿ÂÃÇÄÇÄ®¿¸²¸¼ÃÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £aJJNfº×Ó¿¯ÀÔ˹®¨¢yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÖØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÖÓÓÈÌÇÌÍÉÒÍÎÓÍÅÈÉÊÁÆËÇÈÉÆ¿Ã³³ÈÄËÊËÏÆÊ¿¾¿½ÁÇÄÌÌÈɿÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<A?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢ ¤u]gm¼ØÜÚÖ˺²ª£¡¥ |wpkebhqoq{
vpnqtp
³Â¾ÅÑÐÖÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÒÊÒÖÖÙÕ×ÓÖØÎÒÊÏÑÌÎÐÌÒÏ¿ÈÇÊÃÌÌÌÎÏÅÆÇ¶¿Ê¿ÑÍËÏÆÉÈ¿ÃÃÈÎÌÏÐÏÍÊÇ͸·»¨¥«§£ª¥©¨¨|xsvpc`erb]R\IJGAEHI>;A8=4585;86:<@>;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥£¬³ÒÕÚÚϼ®¨ ¡¢wic`____^_`^blusqpolrquÄÇÆÔÕ×××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÑÍÔ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑØÒ×ÙÕÖÌÏÏÊÍÒËÎÐÀÆÂÇÅÎÍÑÑÑÈÌÍÀÊÌÅÓÎËÎÈÄÊÇÆÈÌÊÓÓÑÕÏÒÌÓÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¡¥ÇØÓÖ¦¡ }qecc__a__a`_``_`fnppnkorwwÌÁÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÆÑÔÊÑÔÕÖÎÒÐØØØ×ËÈÎÄÉÏÌÊÌÀÉ¿ÇÉÍÎÏËÐÍÎÌÎÏÈËÐÐÊÎÊÂÉÇÉÌÊËÑÒÌÓÑÑÏÐʽȹ°®»¸µª¶°¨¸³¿»±
zvopokadnpaW\ZIFFDMWE;@=33<=87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©§lÓÖͰk^^^adb``aa``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÇÎÍÍÔÌÎÓÍË×ÖÐÌÑÔËÌÐÒÓÊÎÑÕÒÕÕÊÀÉÁÅÌÂÈÉÂÌÃÅÈÊÊÏÊÍÌÐÍÓËÆÈÏÍÈÇËÅÆÁÅÊÌÍÏÑÆÐÎÍÍÌÏÅÇÁ¸¹½Ãýù³²¾±»Ãĵª¥¢
ypqkmg``phXXhVLFLIPPB;C>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨ ªho}§ÙЪ|eabb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÐÎÌÔÊÇËÎÏÇÇÏÒËÐÏźĿÆÉ½ÂÇÉÎÅÂÈÀÇÍÈÄÌÊËÏÈÄÄÐÈÆÂÆÈľÀÇÌÌËÎÂËËÈÇËÐÄÅÈ»ÇÃÉÈÂÏÁ½¼¿°ÁÉǹ½ª°²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»¥¢_ox¹Ð«~
s`[^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÁÂÌÐÅËÈ¿¹Á»ÆÇ¾¿ÆÏËÿûÉÇÈ»ÈÆÅÊÀ½ÂËÆÅľƼ¼ÀÃÅÌÅÅ»ÀÊÂÅÇÒÅÁÉ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {vstfiZanlZ[XRDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾²²_r¾°{
vxurp_[[]``bcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ±¶º²²³²±Â¼¼¼º¸ÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅÿ¼ÁÍÃÆ½½µÁ½Ãº½Æ»Âº³¼ÅÄÁ¶¿¶µ½¿»ÌüµºÈº¿¾ËÄÁÆÂÆÉÆÈÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½³·°²§¨¨¹°¥°ª¬yvwjdg`hocV^YJFJFHJAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÑÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÁ¹Å½«¯cuµ
y~|ttc[\]^``bcabeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸µ·´³³´¼¶½±·°µ¯²»Â¼Áļ¿ºµ³º¾À¸Ç¹´»¶Á¼¸½ÆÁûµ®²¶º¿´Ä·»µ«¸½½À½±º¶¯¶º³Å¼·®»¿µ·´Å¼¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÈË¿ÏÊÇÃÆÂ÷ý½¶¹¾Ç¿¬µºµ·¶ytxfgebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÏÍÒÏÍÅÇÁÅÀ¾º¸É¶ª°kr{y~wx}ti^]]]_`_`da^cec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¸¸µ°«¬§¢ª§«³©¬©´¯·°²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶»Ç¹Â¶ª¨°±À¶¸½°°§²³µ»¼«®µ¥®µ®»²°©¹°»®»¸»ÀÀ½¹Â¿ÇÃÅÁ¼ÆÂÈ˸ÅÇÅ¿ÆÃÃºÄÆÂ»ÆÉÌ˳¹Â¼»³svvkiablhYWW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÏÇÍÁÃÆ¿ÄÄÃÃÊÂÉʾ¿¼Àº²´´Ã®©®kd|x~
z{wn^]\]]_`__dcbccb`_^[[ZZ]ZZZZ\dnohggiknr¹°µ®¦¥§§ ¥¡¥«®¤¨¢¬ª¬ª¯£¦ªµ¶±½¹¯·¯©®¸´´¼¸´¼¯·¹µ²»Á²À®¥©¢«±²´¨½ª«¨«¬´³¦¨®¡¤¯©²¦§¨®¦¨·¬±²·ºº»²¼½¾¾Ä¿µÂÁÇÈ·¿ÀÄ·Ä¿»¿Ä¾ÄÈÌÊ¿¾ÄÀÀ©strji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁ˾»É¶½Ã¾ºÊ·ÁÃÁ´µ»µ°®´»¨§`m{~~xt|swe_]\\^_`^_ccab``_^]\ZXZ[[YXZ\_fkfegeikor
ª¥¬¥ ¢¥¥¡£ª¤¢¥¥§¥ ¥¦¬²¯¶·§°«¨ª´«´º±¶µ®¶¹±¯ºº±¶¤ ¤¦±¨«¨¹ª¤§¨¨§² §¦¤¦¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹¹Ã³À½¿µ¸»½¾¼ÂÇÄÂþÀÄ xpkaf_ko`TY^HNgOTGEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½µ ¡¦º¶«³³»³ÄÏÉËÂÆ¸·ÇÁÌ¿¸É·»Å¸³Ä¸´¾À«µ»±«¤®²¬¡a|yutomkjjqi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggjmo© ¢£¡£§£¥¢¨¢«°¬±¶£©ªª¬¬¤´¹·°¬³µ®²µ®°ª¤¢²¥¦©¸¢¦¦¨¬« ¥£¯©«§ª«¬±²¸¯¸¹»°¶¼¼º«³³¹³½´¶±±µ´¿¶½À½ÃÁ»»½{sk_e^ddXTW]IW\KPGIIFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÄÃϾ¹Ç¸·¾·²Á´±»»«¸¹°¡¨ª¦
f
xrnpnkb^bff]]^]]]\]_aabccba_\[[ZZYXXWWXXXXZ^bddeffhikr§¢£¢¨¥¦¢¦ ®®®² ¥¢®¬§¢µ±²²¬¨¯²§º³¦µ ¢£¢£¢ªµª¢£¦¦¦£ ¬¡«§£¤¦«³´ªµ°³«²¹´¯©¯²²³·³®©¬®²¸°º¶º½¿·³±
yue^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿²¥£¥±Âµ¶½´¸ÂÌÈÆÀŶÁ¿ÇηÀĽ³¹¹²¿¶±¸º¬±´£¨zixoqtqifdiec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¢ ¡¡¡¢©¤©«§¯°ª£¤¸ª¡ ®¨¶ª¦§°¤·°¤· ¢ª¦¡¬¸°¢¡¤¢¡©©£¡£ªª°®¨´«ª§³°¥«®²±°°®¯¦§§²®±´°¼´¹·®£yud^aVYWSRTKM^LOKGGLLE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸½®§¨£ª»À½À¹®´¸ÁÌÇÅÂýŷÈ̲ÁÂÁ®¼»µ»¼µ¸¹¯¯¯§§rz|wqilrtpihedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bccbcbcdfj ¡ ¦¥¤¦§¦ ª¯¦¢¤·¨¡¡¢¨´¢¥¨¥°¥°«´ ª¡¢±±¢£¡¦§¡¢£¥¥«¤¥°§¥£««¦¨®¯®«¨ª©³¥¦¬¯´±¯¼µ±¯® zvrda\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8847863321./2556;:8;7876<;:;;A8x»»±µ½°»±¸¬¥§·»¼Áź±¹µÄÉÉÀÃÆÆÇ¶ÆÄ³Â¿Å«··½¶½»ºµ²««¥¡q{~vncafihfgjgjm`]\[ZZZZ\]\[\^_\ZY[ZYZ[WUXWTTVUSTRU``_`a_`acdi¤ ¥¢¦¤¤££¢ª«¥¥±ª ¡¥«§¢¬©©¬¡¢¢£«©°¢¡¢¤ ¡ ¢¤¦£«¥¢¤ª¤«®¥²©¦¥¦¦´¦©¨³µ´¹º¯©¬rpo`[WVURGQOHZ[ORJTKSLEFIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɽ±¾Äɬ±¸Áµ»À»´³¨©¤~p{tiijlgjkmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]]^___bdm£ ¨©«¨¬§¨¥¤¥®¤¥¯© ®«³ ¥¦¢£¡©ª¡ ¡ ££¡£¡¢¨£¢¨« «¯£·¥££¢¬ª¨«¯³·³¾µ³«¯tsh[XXRUQEXLQ[XMTNPLPQINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³¨³¶®©§¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĻ·»Ãȱ¸¿·¼½º²³£§
xsvwnmhmnmpggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]]\^_`d~¢ ¬ª¦®¬¨¯¤¨¬ ¤¨§®¨ª¥ §«¥ ¡£¡¢¥¥§¨¨ ±°¦±¼§£¬´«®§°µ°¹µÀ±±«}rsbVSVNRIFVPRQLLWMJLNRGMJACFDC>@65889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¦±·ª¦¢°«ª§©²±¥¶Æ´¹º³ÊŹºÁËÐ˱¶¸¼¾Áñ°²·´³º²±¡¡~vkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv© ª¦¥«¨¡¥£
££¢¤§ ¢¢¦¤¦¨¦¡´²¨²·¡¢·¬ª¤²²¦µ¼¶¬«±£xsm]NQQLOCMNNPKFNNJJNMQIMJAGLHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶§¤¶±¥§£©¥ ¨¥¤³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬º½´·À¯©°¦¹®«
zm__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXYX[]aosvq
¡£¡£¥¢s~{£
~~ty¢£ ¡¤¤¢´¯¬¯¬¥¸¦¦±¡±®°¼ª©¯ªwscVMROPMCSNLQMBPQHINRMHJJCJLFKK<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¦´Á¸°´°ÉÄ·¹ÁΞ³¬ºÁ«Ã¨¢¦¦µ«¡|v}eWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo|s
yz
}xqo
}¡ §¯©¨¨³¢¦®¬«¨´¢©£}rn`[NSRVLDTJPMLFNOIELQMKOJIMOFII<7599999:7:;:>>8:==7:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©§£©°¨§´Á¹±µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©£® {rt\QLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tPB@}y`JQnx}
n~wuuwpQ{~xvhw~¤£¨©¥¤°ª¡¤¤¦ª¢ª¢¦¨tmg^[HQQRMIUMSILKOIHFJNLMTKQPOFIC<768:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶£§¢¯¡§¨¥§¨¯ªµ¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼¦§}|vomXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut|
{vxsnuptz~«
yzhv{prmxxz{vrrwgu{|© ©¥§¤¡¤rh`\\JVORGJXROJLMRJJJLPILQLRTLEHA<77;99>=:;<98@?::>=7==79947795676252572/2.,//200/-+(().1272198798775:<;7v®£¢´©¯©¥¬°±ª½´²»¸¶º´±·º²ª¬©¨²¯¡~v
x{uonhXKHHHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u}ygw}hyvx}q|w{ok~}s{}tfv|lohs|lyq}pmuqiq~pC
wwz
~{u~£¢¥vnmebZWWTQJSUTOPNPVKNKNOJQNHNOKEC<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©°¯±«¼¸¬»¾¹³¬§°§¬¥©¤ zvq}ntpiliWKFGEA@CDILLMQRPQSUTTUVWWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyc|xo|yz}omytxjjq~Inhw~licly
ksl|nr{impsz}~{vots
yxp|~mhmnnWUWTRQYORTTSXUMNHNKMNKCHNGE?;99;99:><9<;::=>:8:<9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¥°¢¬ª¨µ¯®¬´¿«¼Â¿¦¢¤¡¡sz
uoulpldkjXNEFC@<>>AFFGKKKMPRRRTUTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZRY\`§bitzepmzvtlts|jkMy
g1vsl~~tfet~
filukq|gqq{n{s}|qpnumxyujyyvjjngdWQZWYY[MPUVYXNIHEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226,,5775478iO8;5n¤¨®²¦º¯«²°Â±»ÃÇ
yqt
ypsqnodpf_TFIC?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ r|xl}mr
zyr¡txsu5q¨¡¡¢
vp||sgfbjnrmpuioXupwl{}mqmpzsvncv~
ux~~zqpok_Z\][YX`_RN[ZXWLHJFJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µª®±®Á²»ÁÆ}n
ul{uxxlwnwci^IPG>@7449;;<=>@BEHLLLLNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|~
~v¢y~
aªzw~sz]dqtz{wlgjbyo
znwtzptzwkni^w}|
}q|uw{}uorsef_[[]S[f^WQUX[UGJKEKG?F@DC>AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Ur=23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡}}p~zgvkRWL@E211367688:<>BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z}~v¡¥¬©H®¯¯¨sm|}hghx~n
q
Gkwryvhmk_w}
zzuv|wmow~srqjZ]\[ccXfe\UPPVYPDLKFNICFCCA@CA=988:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"&'+)++,/00+nu22420L\5=<^t|~
¡¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cVKB60./23133668:=?@BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¥»±§»Çè¡¥{rv
jhouqw{v
}nvug¡«¡{zzogkx~x}qjc]ZZ]i\af_YOKNWRQIPJDNGCKDC@DDA<:87=<:<:88778:==8<=68656623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯°¡xw|lpj]BA4--//./02234779;=?BDHJOQRSRSTTRPOHDB<87/9D><<63.lMPHJLKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¢
lpuvql
r¡¥µ©¢}kjk|ra\b^Yfj\kk^WKGOSQNMLFIPCDNFBCEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªge¤~y}
xxgMR>/..,/.-/000212557;?CFNPRTPQRSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢wz~¡{v«³ }¤¢¦¶°¨lss|~zpg`[_^afc`gg\QEJKPOIJLFFMCHLFFCBGDA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}|ªªBD}x{
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=GG@A@8662<9;FHGIIMOQYmw£§ª´½¸¥®¬¬§¨´¬°·²²»±³¾³Ä¬»É˸Ŀ¸¥£°²¬«¤
¦¦ ¢¦¢ª¨¤
¤¡ ª¡¤©±£§·» £°££¤¢«¯³µ¢¥«z{~}f_g[da]cc^ff^[OCIHTOFHLFJGEFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1/-4?DAMUQRSUUWUN[PGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇë³Æ¶¬³À³¹¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´±±§¯«¤v¤¡«±³ª¨®¶»²º¬¯µ¢±¬±µ¼·µ®µ §¨£¨©°²º¸¸§·©¥ ytX`cUea`b_`e_ZUJDELUQHJJDIGEA@@KDAMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL[ZQcdWzuq}
v
~{¿»£¼´y
zxn]V@EM<6:46AB7650/6CHCQ[OQUWU\WP_UIKJA@?GKFED;>@7D7?BJJEGWTP^¥£±´Ã¶¸ÁÌɶ¼Å½³³À·¸Âµ¿°¸t²´¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥±®¦¬§¤ ¬³º¢©²ºµ»¾Ì¿Å޽³Â·º¸¿·º·¹¬°¦±ª¾°½»Â¬º¨®«~ziVa`WidhdVZcYVTIGGLQGCHIAHD>?BBK@@MC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FQLALRWTYUZwjp
nzryb¸¡£{z||}wyueO\dGEL:Qda[^SF?;HPDZdQQYXYgZT``MSOEA?IJHEFA@C=E6B>HGKLSZT]¯¸µº¹ÉÀ»½ÉÌ»½À¼·µ¼»·¾µº²Æ`u³¥±«½ª¥¨«ª£¢²µ¡«§®¥§§¥¤¢§°³§²²¼¶Á½ÓÉÊÓÆÂÅÌÂÊÃÀ¾½¿¼¼·´°¹··ÃºÆ½Ãɰ¹ª¢¬¥¨·~q^aa\Va^geRXaVRUIEENKA>GD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPPQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]hllq
slsrsÕÀµ }xz{yt}zkepuY]\Peeb`ed][XW\MdmURmm^o_XgeUYTJDAKKHFHHHHBI9D?HKTTV\Z[¹À¹½·ÆÀ»¹Ê˺¶º¶¸¹³¸µ´®¶¶du¨p^¢¬¡£¤«¥¨¥¤¬¤ª°·°½¹ÔÑÏ×ÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊ¿ÈÏ´¤»°µ°¬¹½~xk\_\Y]aYbbQ[`SQKCBEFE<@E>BHB@C=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi_pnlouu³¬¡¡
~|s{|ts{xlmu{hreilifjih`fihmZmt¤¼g[oh]ZYTHJNPJKQLTQILAJGKP__bfia·Ç°¹³»¾¶²ÄǶ°¹±°»¬³±§ª·¬¶§§O ¦¥¡¦¬¯¨¯§³´ÔÔÕÖÒËÏÓÕÎÓÏÍÅÂÊпÊÉËÉÒÈÍÍÂÐÒ¸°Ä¼Äº¦¶»Ä¢mb[\]X`WYeYP\WNQCBHEBH;AD>AH??B7;D>@H=46655;:687654/10146278875367C5B8?-0,1349=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSeWshqoyy ª¦}
|p{r}qxulqx~q{mxslhpmcimpyiw}~Ë¿Âß§mcxnc[a`JPRUNY^P]]NQNTQUT\nnwr®¸¬´§°¶«½À±«µ¦¥¸§¬®¡¬´£±®¦«¬¤§¡¬¬ÎÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÍÒÓÓ×ÍÒÑÅÒÖÆÀÎÇÈ鿸Ðxmd\a\V_R]ZNOSPNH>AFBBE<@B?EE>??:===<JA45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[u
wmwp}~¡¡y
{r~z
u
ovsls|{v|swqjrrioqzyr{¾Ë~±vrvhaj]CZZ[VfdXekTX]\`c]cx{ª¤¤¡ ¡©¦ª±¹ª¦´£¢¢£¢§±¦k¢
~¬
§°¡ ¤¤¨ÇÍÏÈÂËÐÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÉÔÚÍÉ×ÖÑÊÄÃËqnb__WSYR[OJGIIJ@;:;EBD<BD>HB?BB;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu}hsyr
w~xs{}w{nwpmuvx}s
|ylvto}vuy{µ<AÆ¥~|ieVICecfchjdoy[_fhknin ££¦²¤¤³ ¢¥¡© ¢±~
z~©£}«³§§½ÃƸ¶ÆÍÒÐÒÐÌÒËÉÔÏÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÌ´vumc\YRUPYVEFJIEE=:7:@AC:GE@ECADA;?;;7DC75655;0689443341014558754449@>DBC<33.6FTWOQJAJF?1*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopaqqs|~
|x
zyqz{uz
zp|opzr|qnzuw}|u|°tX©Â¶pnb=^hrpqpnxweioruxr{ ª¡¢¥¬
}
~my{®«¦®¶½¨½ÆËÈÉËËÏÉÄÒÊÔ֨ר×ÔÛ×ÓÙÛÖÐÛÚÑÖÈÕÌxzhgZYORS]HBEII>A>=7:=?;>H=@AAADA>>:87DB755479.566435542323646553457EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqy~
||~wyn{{tz¡vutu}toot|
zv{·Æ¤ÂÉ·xpeNeczw¢yyw{|vm¦ £«
{|¡¼¡¨¦¥®§µ¾ÀÀ¹ÇÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆ
yxehc_SVVUMKDMC;==<9:<>9>A6>?@<?><9867CA6455=80665547745613855564557HH=DJE7925;H>;::7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yea][htzylwvz|~}
z~
z
{u}tn|}~t|}x}xnt
~
|~z©Ã »£}}r~s¦
{hGq¡¤
¡~¦
¤¸¡§ £®¶ºµ«¿ÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Ü·wwviidV_ZSONHDLB==>99;:99<=6@>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqrx{{}|z|{~uyszsm~}w n¨
z |~£¢£®
Wr¬\¢££
¤
³¡¡§±¸¬¥¼ÁÇÍÇÆÏÌÏÌÏ×ÏÑÔ®ÖÕØÚÙÚÚ×ÖÙÙn{sfe[\WRVWC@ID>?>:49:;7:;:3;;?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxmb~nmwxy~z}|{vsp
{vvut
}~¦£¥¢¨r²¦¢ ¡¨¯n·ÄȲ¢¥²c¤ÍÈ
ª¤£
¤¨¡¢²´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎq~gb]]\NITYABGD;A=837;<:8=649:<:82?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFv}|m~xz~z~vv|lnz|xx|~£³§£ª³¡§¥£®¢¸²¡¡¤¯£¤§§¬¯¤ À£É¹«£¦²
¨¢
t²¥¡} ±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ¦ÎÍÓÒÐÖØÓÐØºqxu\_T_UOHJNDBCE5>:77:?;<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGN[\YJf`;Hz{n
z|x
~px|~}orz}|x§»¬¨²½¯¤²³¨£¢°¬´¢¸¤¤©·¦¤£©©£¯°© »»®Ê¡j¶¸«°£«½£^ª²|}´«¡¡ ¥¯¨¡¤³¸«ÂÈĵº½»ÅÇÇÂÑ ÆÉÍÍÄ×ÖÑËÔ¡oyg[YS^POEC><CAB8?875?F<<5<35355454B39:BM:B;AHB;:@<746<B9?@B874:96>=47TKCUQJ7<:IAE@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdGb`bpJ@s}um}}|pww{ªÂÀ¯½Æ»³³À¼´«³¶§²½ª»¤¨¹¸«¦¦¡¢££¨¯²±ª¤¢¦¥¤º®©À¼²¹¦¤§~½°z¨±¬ £¬ ¡§¦¤¢¤°³§ÁÆÃ¯°º¶ÅÄ¿ͦÇÄÇüÕÑÍÄÊrr`ZY^ZLJBL@FG>A?B;:4>A<=5=6>333242A17@BN>G@CNCA=C=;86CB5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\eG`igZ]\{uo~{q~zz§³ÆÉ¿ÂÌÁùǼº¯«¹º²¶º²À®¥À¤«¯»¼ª«££§ª®´°ª ª¡°´§£ºº¶Á¼¬¨³¥¤©
©ÄĤz¡ ¦ ®ª¡ ²¡¤ ¥£¦¦¤¯®¥¿Ä®¨·µÉþ¶Ï²Ä¿Ä¼³ÑÉȵswk[W[iQLHDLJKJAA=CD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBfZNe\fTcjyr|xz¡¨º½ÇÈÉÁÒÉÊÂͼÁ³»¾§º¿¾¼Ä·¬Á©¬³»¾ª°©¤¥£«³¶µ ®¥¢£³½©¨½Á£··°«±«¬©§¥¥vz
££©¥|£ ¢µ¥¤£¢¥¦¤£¨§¢²¬¨¼À沈·ÌÀ¹¯Ä³»¿Â¸ÂÃÂÀlx`WVZZJKMJFDDHBBADL:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddV x
¡®¦£Â¾ÇÃÇÅÓÍÎÍ˻·°¹¼³¼Ë¼ÃÁµ¶»³¿¹¼®¯¨ ¨§¶©²·¬¢§¡«·¸©¤°¿Ä±¾¹³§ªµ´®®¥¬¨ ±Å§}}ª¥¡£¢Z¤e£²¤¡¬¬ª§¦ £¨¥¶«©¹»Ã´¥³µËÀ¸ª¶¬²»¸®¨¸º½¸kmYVTTMEJSNK?BHEDHGG95FM;>7=@J.32025B55PVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;=@BFBqFiIRebLF¥¡©¦¢¯¾®¡Æ¼ÅÄÆÆÎÎÎÒʾ»¶±º»»¾Ï¶Ä½¸¸·²±µ³¸³«¦««¹ª¨§¯¯£®¤§¤¤µÀ°«¬´¿ÃºÀº³§¹µ¸³¯¥®®¥¡tÁ~
±¥£ ©¡ `J¥T°®¤¯®«¥ ¥¦¢´©ª³¼»»ª°²Ç¿¹¦¬¬±±£¡²²´¤ole[YNOKEOPPQ;HJHGICC>:KU?A:=EM07544:B34NWO<JKNUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯§
¡£¤µÈ´©ÆºÂÃÇÊÈÇÌÍÆ¾»³®¹¸ÀÁ̵ǺÁ¸µº°¯¯³´¦£ª´´©¨¦¬¤¥¤¨¬º¿¨«¶·¾Á¿¾¹³²Ä²¹½¬£®µ¬¹¦¦v¿
¯¡¡©¨ ª¡§nv¢¢®²¢ª¨ªª££¥¨¢±§©«º¶½³²¾¹· £§¨¥§©©bd_^QJLFHNIUL=MDNJKBCD<QU=AABDO18=77?B75UXN?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..R`MUHe^HE«¡»¯««¢£££¶Æ½´ÁºÂÂÇÈÅÂÍÈÁ½¹²¯¹´ÀÂʵűÁ¼´ºª¨¬°¢£ª´»¥©¦¬ª¨¯§£ªª¾¼§¼´¸½Ç¼·µ·Á±¾À´©µ·«¿¥£¢ ¼ ·©¥£¡¨¥³¡¦¨ª¥¢¢ ´¯¥¤¯«««¤£¨ ©¤¡¡´´ºµ¨µ²³£¥ª¡v^[_]JHFGMQIMEFGBRLJBEG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCpbGE§¤Ã¥©ª§¦¡«¶Ä»¾·ÁÂÀÇÄ¾ÍÆ»½¹²¯¸³¿Âȵ¿¯»¶¸¶¦¤ª« «ªÄ¢¥¨«¦«¯¬¡¨¨¿·¦¾±¸¶Ç¶µ¹¸¿²¿Á·´³´¯¾££® ¢¢¥££½¤©¨« ¦½¢£¢©«¡
¤¡µ¬¥±§¯§© ¥¤«±µ±ª¥ª¬ ¨gbX`]NHGJNKHEDIA>PH@<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ:nRF<KxebWL¢£Å¬¡¬® £¥ ¦©«¶±£ª³µÄĽ¿¶¿Â»È¾Êȶ¸µµ°³³·Áƶ¾°¸´¸µ¦¬ª«¥¤Á¥ ª¤©¬¯¢¦§½µ¥±¼¹·¶Ã²³·¹¿²ÄÀ¸¸®³µµ£¥¡® ¢©¨«£Â©¬¦¡½¢¥««¬¦¡W¦¡ ¸ª¦µ£²¡ ®¢¤¦®²«©¡¢¥¥¤`dYc`KHJJNFEAFJ>=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H@5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrHE6=ue\KN¡Ã¨¥¢´¢²¨«¤ ¤©¬»°¨¬µ±ÈÅÁ³ÂüÆÃ¼Äʼ¯°¶°´¯¿Ä´¹±°¹´¬¨°©©¥¡§Â¬±©£°©¤§½¶¦·»½¯·Ã³²ÂÀ²Ç³º·¬´¶®ª¢¦¤¬¢¨«°¯¯»²¦ ©¨¢¤¸ ¡¤¯¯¬¥§¡£§³¦¦³£®¡¡¦¬°¥¦¡
`eZgeJILJRBC@IG;;G?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKN>;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 褪²¡£´ª³¬§¢¤²¬®©»²¬°´´ÆÀÄõÀĽÉĵÀÈÁ´«µ¨¯¸¬¿Ä´·®¬¶¹¥«±«ª¦»´¨°´²§ª¹²¨º³·²¹Àª·±Ã½´Æ§¾¯·µ©¨¬¡¦¥¢£¥¯¸®²µ¶ ¨¤¤ ·£¤¦¯²²§«¦¡¨ ¢¯²¢¦®¤«¤©©ª¡§
xch\jjMPMNT=CANC::I?77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05IphVCWFyfC;¤£¡¦¿¦¨¯¯¡©´«¹°«£ª´¶±°¹·°·¸¸Ä½Ãǽ¼ÄÁÆÀ¸ÀÆÀº©¶¤¬»¬À··©¬±º¢°²¥§ª¹© §°ª ¯´³ª©¶¶»¬³³º·¬¸°Ãº¾¿¦Ã«°·®©««¦«¢¢ ¡±¯³«°¹© ¦¡·©¥££°±´«²¨« ¥¢£³°¥ ©¢¨¨¦£}
jhl`lnWPQZTACET@;;HA7:XPd^PVWDY^]MLRN^KJ>Zc^NHPN[UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251.-.,1=*'+=\p=>1.1e[d@1647gY`F(?8l}h[V;{cC=§¢©½¡«°ª£±¸ª¥µ³¬ µ¼®³¸¼º½¶¶À¿ÈĹÄÁÀÀ¸Ä½À·¯¶§«·±»¾¿´¨®±¶«¨§¨§»¤³«¢°°³«©¶´µ½¯±µ¬°´±ÁºÅ·«¼¯±¸¬ª£±¦¥© ¤ ³ª³ªª³§ ¦¤´®§¢®±§³²ª¤¨£¡¨µ© «
¦¥¢
{elrgoq^FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__aU150=`V^8)C3YT\gK6zfL@¤ ¤¬¶¤©¥®®¶ª¯µº§¦°·Å·±·¾Á´´ºÅ¾ÌŹÂÀ¹¾¹Ã·À¹²´«©º¶º¹½´©°µ§¬ª««««½«®±£« °³®¶²¹·ª®®²¨µ¯³»½Ê²ª¶µ±´¯®§¡³ ¨ ¥²£ ¦¯¡¤£¥§³©¡¦²¬ª¶¥®±µ¯¤§«·¢¡«¥¢¡ z
{jmxmu{`EajYIHYZ={JFD6AbTi[M\`J\]ZRSRbaLKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C_Q\.*B/JGP[H3cYTKD ±¨±ª¦¤¯®µ©·´¹¤¬³·Êº´ºº¿¾´³·ÃÀÌȼü¶½¿¿·¿¼±½§º¸·¶Á¶ª¬±·¦®«§£°ª¯»¤¬±²§¨£±´°±°µ±¸³©®«²§·¯µ´ÃŶ©µ¶¬°©¨£¶ §± ¤±§ ª©£¦¦¥¸§¢±´¬§²§°¶¬¤ ¬¨©¸¢¥ §£ v{
mpwu{~\Kel\KNc\>b{GI8GgWf\M^bMXYWTXTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'GbLV%-B.=ELQ<3rkJCC¥®¥®«§¤°²³ª·±· «µ¹É¸®Á»Â·²±µÂÂÎÅÀÁ½´¼¿¿º¾¼²Ä§©¸°¶¶¿¼®ª³²§±¦¥¯¥²µ¬«±±©¨´º¬³²µ¬´ª¬¨¬©¸±°Ç¿¸¥º°©¥¨°¦¤¤¯¤©¯££¢£¬£ ¢ª¦¦¹¥¬µµ¤ª«¨¬¯¶®££¨ª ¤³¢ §w~
}||psq~}}\Sdo^NYf\FD[G;NmXb[L_bNVWVWTXg^QRLcZ[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HeHJ+:I?3BIS,>k<GHª«¢©±¤©¥³´²´µ²²¡«¼Ìº®À»Ç±´¬´ÂÂÑÅÆ¾À²½À¼¿·»Ä§¬·¬³¸»¿¯ª± £§ª¨¤°£ª±ª¯¬°¯°¯«³»§¶°²©²©«¦¥£º¬ª±Â¹µ¬º¨¨¨ª¨±¥©¤£®ª¨¢£¬¥¬¢§©¢¬¦£¬¸±² ©¢ «¯±¬§§©£ §
¤~~
|w~
trquk_Y`ncQsq\K;|F>WtX`ZNc\NUVUWQ\b^SONhXWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<]J0.JgDF8<B05EKX1@Z>LE¨¡ª³ªª°µ¸µ®«¥ªª½É¼±¾·Â¯±¬³ÄÃÎÎþ¿³ÀÂúÀ³Èë®·²¸¿¾²«¤§ª°©§¨±¦´®ª°®±°´´»¤·²«¬®§« ¢¯·ªªº¶¥¶µ£ª§¬¬ª¡©§¦²²¤¦¦¡¡¬ª¡ ¦¤¢ª¥¢§±·®£¥¢ª«©¡¥¤¤
£¢|zt}sv£xj^`ngWecN?gLEbyWbXReTMVUUTO\]aUKMiWUWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D>HFD°¥£ª±«ª¶«¶±«¥¬ª©¼ÀÀ¸¸³»µ¥²°ÄÉËÑ¿Á»¸¿¿Á¹Á¹Àıµ±³º¿½²°®«ª¨¶ª¦®¯ª¹¯¨±±¯²¶ª··¦³µ«¬¤©«£³³¨¨¤´´ ¶ ª¨«©¬§ «¬©¹¶©ªªª¢© ¬©¡ ¤£¦£ª§µ®¨¦ª¢£¥¦§ª¢¤£~
¢tytzw~oqggqx\`skO^VHmxUdVRbOMUTUPOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Jj6OD;°¡¦«®¬¥¯³µ¯«¥°ª©º¾¼À±®¸¡¶¯ÉÇÈÑÀ¾¼º¼Â½ºÃÀ¾¿®±²±µ¼ºÁ±±²«³¨¤µ©¥³²¹°£¶±°³º«¹¯©µ«ª©¬¢ µ¨¡¯²¢´ª¨§ª¤ª¡¢¬¨½¯¬®¢¨¨ ¬°¡¢ §§¨ª°©£¢¡¢££§©¥}¤
xt|uxy{tszh£ui^ekug}SXp^JxsSdSQ^MMRYfNLVYdXFSiRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--6)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[*HM9UA4² ¤¦¬¤§¤¬§´²±ª¤±¨ª¸¾Á¼¯¨¹ª¦®°ÉÇÉÑü¿¾¸¾¿¼É»À¸°¯´±º»·À²³»¬¸¬¢´§§¬²¶¹³§¨¼µ®¶½°½¦¬¬µ«©¯£¤«ª§ª²¤³¨ª§ª¤©£©§©½«´¯®©¤ ®³£¤¥¥¤©«¥ª¡¡¥©¨
~
~}
¡~r{y}|hw|zupp}h
xdahcr
zmfx]^VBWzmTaPRXKKNqu]HZ[gYEUfPD>JNDCA9HGKS?jaJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH0%90%,,09/,,+6'17#-0GjI14X=fcBJ7GS`U*=:DX?*± ©¥¥¡«¥·²²¦©±§¬¸Á½µ°£¹¬¨¨±ÃÉÉÍÁ¶½¿µ·¿¹È¶Ãµ³±µ±½·¹½µ¹µ¾¡³§ª«°µ¸´«½¼©³À³» ¯³µ©«°£¤¨ª£¥°¦° «©¨¢ª¤¨ »§®°® «£¤®¦¡££ª£¤¤¢¦«{{~
£|yl}vxxc{zqpqrxhtjgdhansmaip`pA\xlU^OQQJJMTYWM]^lWDX`O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*K>*49&'.34.0+/4&,:$41BhY13S=e_DL6KWeO);2OY=#¬§¤£¨¤¸¯®£¯°ª«¸Âº³®¸¯«¨´»ÈËÈ¿·Â¾¯´½·Ä¶Ã±®¹±³À´º½·©¹¸½«¤´¨©ª°®¹±ª»½¤°Àµµ¡®¶µ¦¦§±³ ¤¦§¡¥¬¨© ª¯§¡¦£¨ °¸£±® «¡¬¤¦§©£©¦ ¨¡©}}|¡x
|
{sp}qst`yxioqpoi~qczliec`f_ZskrLL~hXZMPLJHPRPIN\_nSDX[RgOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*>/YX5(¦ ¡¤¡·«±¤³´ª¨¹Å¶³® ·¬®°µÆÈÁ·¿Á¹°´¼·¿»¾¯«½¯´¿°¼Â¸©»º·§¨µ¨¨«°¬³°§¾·¥¼¶°°·°¨¥§¯± ¤ ¤¤¡¯¦¡¢§¯¢ ¢¤¤£·°¡¦±ª¬£¯ª¥©¥¦ª¥£¨¡z
~zx
~y{prwoot_ywdllkihmerjkeh\cs_ZlviZH}][XOOJHHRUF2:_^lPDXVYeMIIEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84GAf[HTDU]hE.;1`T,2£¡©¥¡£¡·ª¯ º¹¦¬½Å³°¯£µ¯¬®¯´ÄĽ³¿º·°³¹¸º¸º®¿³´¸¯¿Á¸¬½º´¦¢³«¨©³«®±£Á¶¦©¶µª²»©¦¦¨°¬¢§¤¦¡²¥¤©©¢ ¥¤¹¨¤§¦¥¡¨©¡¡ ¢«¡£§¤
y|
|x
{w~{ltrllsaxuhhjgeoghhdfij_hbifZezcaRsT[[SLIGIOS@!+j^jLCVU^`KIHEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB378cN'2¤£¤¦¤µ¬§ªº·¨¬ÃÁ·°¬¢´§¯¯·ÀÀ½±Á·±®±¶¶¸·µ¬ª¼³¯²±½À·®¼¼±¥¶¬¦¥´©«® 멦°³«¬´º¨ªª±¦ª§¥¦¢¤ª¡¢ §¶¥¯ª® ¡¡ ¦¡ ¦£§x
w{~{s~}fxokjlguskcgdctadefeijcipY^X]ldaMhWZ`VIGHKMRX?9`liGBUS\[IHFFA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=++,0A*JK./*+3722(57$+7.72685]yN2>HiZLZJVbfA:3AeH%5¤ ® ¥´±¢±¾·¡±Æ¼¹°±£¶««®©¹½¼»À²¯®¶¯³¸³§«¹°®®´¶»¶¯¸½¦µ« ¡°¥«¯¥Ã¡³¥¯±¯·µ¯¬®£§ª¥¨¥ ¥£© ¬°¥¹§¢¡£¥¡¨¬©¨¦{t
|ofymhkjgqrk\hcar`dgjmlgjhfl\lmuqaTbhceYIFLMOXQPUaeT@VSYTFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24:6#3*)6.55465Z|]19Kj[M[KXdd@A1IdB'4¢±¡©²°¸À¶¡´Â¼½¹±¦¶¯©®¥·¹·¸¬»¯ª«·ª´¸¥³µ±®©±¶¶±²µº¨©¶©ª¢ªªÁ®¥¯°¶µ¬¬±¯ª££¬¨§¤©£¥ £«ª©º¦¤ ¡k¢q¤v«¨ x
mi~wpl}o]d`gkuw~fhuifW\itnNPjdfqf^dfnli^^_
hOKD8ETg^JGPPUUKGS`oteE[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl16Ok[N\K[fb>G1Pb<+/¤± ª«£½Å¯©·Ã¸½¼§¶°¦«¤¸´²³±¹ª§¬´¦°µ£§·¶µ¨§¬¶³®´³¢©´«¢¥§¨®½§¦¯³·¤¨®ª«¦¡ ¨§¡¦¦§§ §ª£´¯£¢££¡¡¡¥§«rx vif}sx o~|¡ {tvlmheczlqbTmcmiqXjpnW^i[kj[pmyriZ^FN>F^MFRVWQQRWTg^LYKRRPEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1V`7/(¦¬«ª¨ª¿Ã¯²º½·À¾ª¤·±ª¬¦³µ®¯³¶«©¥±¥µ³¬µ¶´¥§¨³±²¨¯ª¡³©¤£¢£¯¶¤¦¦¶¼¦¬§©ª¬§¦¢ §¤¦£¤¤ª¢¢¥¦ ¶¤£ £®©£
±¤yÔ¨ÀÇyx±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«°xhkX±®oei¼¼nhzmqØ~Sjc¶²qu¡ªWOWaOVNFT[XQPS\W[P@\EQNDFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[\41!¦§ª¥²©±Â½²µÀµ·¾Â«¦´©¨¯´ª¯¶³¨§¦µ¥§¸®²±µª¥¤§²®±¦ª§¤²¤¡¡ °£´¹¢©¨¡®¤¢¢© ¨¡¨§§¡¦¢ °££
°kjª~geq¦q®¡¤~wº|k¡v±_j´[¥e`fzfjxj©e¾rg¦v±j|±xtcmm§m[ EigEu`}f{£§Y_«ixzj§7J¯[WTlcZKOW_\WV;NOWV/ITSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¢§¥£¤ª±·´½¾°·Å²¸ºÂ§©°¬¯©©±®¤°º°¤¤®³£©¹©³³°£¥ ª°¬¯¦§£¢±£®§¡´²¡ª¡ ¢ª¤¡¡§¤£ «¥¦ ¡
µµx
©µw³·©~k¦z
w«gj±[¬{tpx
°vwqkjl|N¤XHcc~ch¦`yruR^P©mcq}b.Q¢n[Tkg`LK\dX\ZB>°xWXA#MhFCDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFB@AD<FD;0201;F,0.840,.(/2,>831/2-D1<<S}n3+Xj\OXM_gW7J9aU50³¦¦¢®©§³¬ª»¶Â°¼Â¸·Áª¬®¯¦®²©¡¯¼ª¡§µ£«µ¤¦³³§£¢§ª²¨°§¥ ° ®£¤¨´®¡©©¨© ¥©£ £¥£¢ª¥¢ Õ¹p°Â~Æ|Ö»|¥¤z£¥z¬yU¯{~j¹Z¹w}¦|zªy{±nt»
oO¯§ÅQ zc`ªbsrl_Sµ´È|c¤3Bv]QjhdP@XfZdaJHMlKZSOYfZCC?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<9;DHCBCD<EF81211DB./0483+-(.323971#%5*>3==Qwj6*Yi[K\P_fT7G:aQ82%¡±¨¨¥³ª¥´¨¥¼·Á°ºÀ±µµ¼³¶§±±£±³¦¯¶¨¨º®¢¯± ³´° ¤§©°©´©¥«¢«¨°¨£¬¢§¡¦¢¢¡¢¡¢¢§ ¦ § ²nhµq«p¦r´sr¶{¤¢~ ¥~°vÒÑu[®|¤oª¦k
}}{±sx³et
nfRÈZÂ\yb_`wsb^YÊo¿uMKµSUÆdTQjceXAOj_liPUFI9=WR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\BNT_eP5G=aM62/¢¤¯¬¤ª»¦´¥¨¶»¼²»¿·¶´»»³¥µ´¢²²£ ¬¯¤¦º®¤±°´¸© ¦¡ª¥²¨¬ª¥©£© ¦«°¥¢¬¥¡¥§ ¦§¡£ ¢¥¢
¬{w¨v£©o¨¢¢~®
³\r³R®~¤q×}w~w¯w´aelZ°XKuyf`^wwgj]¯wxl5yÈ®²_BTo^g`EOk_pmVUM/eciSYQ;AD@L:5?91=<16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK96<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:88 ¸°´Á¨²§ª²º¸´¸¿º¸³¶½µ¥¸´ µ ©«§¶¬¨°±«´¤© ¨¢µ§¦ª£¥¢£¦§¬¯¥¡©¢¢©¦¡¦©¤¬ ¡ §©}}¥y¡ªp§ ¡£ª|yo±Z¨ ytØvt§¤|{²^d }l\«[Zhgªds{kq]¬Z kneOJC¡\ZMt]bfMZa_st_JU5JYHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<PeeA&Uf[?1U_bL7FI_C1>8¡¾¬´Â®«©¦´°¸±µ¿ºº³±·¼ª»µ ±¥¥§§ª±©¯ªµ¬ª®¡¡ ¦¤¤º¢£«¡¢ ©°¯¦§¦¤¨«¨ª¨ ££ ¡¡ ¡«®mr´t©w¦s´yt³¤£¤v¸o{¢kk¶Z¡ei ¢§mr´t²jku³af¢nj\`M¡|Rs£ly~no\¯V<wfTon.[§ObSkeblZb\`q|cSYP>>mo3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;<000/75,+,426/#00,,289/9N`eD'UdY>/U_aL5FM^81B9¥»¢²À®««§·©¸¯µÀµ¼±¯¹¸«Á·ª«¡§¤¢«ª§µ£²¨®ª¡¨ ¤«¹£¥£¡«¶¯§¬©¦¥¤«²¤ ¨«°¡¢¢ ¡©«Ô»t±ÄÃ}Õ¸x§y£¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxnpm¤t½]w}[ay¼jZV[iy^i`dfbmxoY[YCA@r?CF+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-7@9¦¢¼¢±Ã°©ª¬±§¸¯¶Ä±»³®»°®Á²¬¥£¤¡ª¤ª²¤µ§¤ª¦¬¹£®¡¦ £¯¹°«£§§¥¤ ¨« ©¤²¢¤¦¡¡¤° ª
µ¸xµwnlnsnysÁ»¼z²¨pt¹|{|¤»¹½uy³£tvut°ufi¶trpw¶^z}gymyb¬pu
X[§jDdZTf_c]bPgfqmuBMPLD;ZL>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITAKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7LT_G'SbV8*O]]=+;VV'=;<¦ ¡¿¦³Ã´¬ª§¬«©»®°Æ¯µ´¯¸§µ¸ª£¢¦ ¬¤ª¦µ¨¨ £¬¤¾¦¡ª¢¡¨¢²µ¶¤¤¢¦¥«©¥¦¢©§¦£¨ ¬£°©§¢j~i§xs~uze{½¾Àºnq_rjZ]adk`cmvbke^`cqhr}fj~qty}|b[wthP\n}{jXlyrIJo
pMtMEW\faL[Wfc^OZmvjrRODEN;HI<M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7IR_I'S`V4)P^L(3>[O'?2>¨¨¡Á£´º¶£¬¥®§¨µ²¬È¬°´¬µ£¾±²§ £©£¬§®¤¥µª¥¢¦©¿¨©¦ ¥©¨°²¿¬§§¡ª©¤¬ ££§¬¢ª¡¯¦°¥¢¨£¤§£hn|qv´©
¡ z¤
li||tqxyvv{jstudw}vkpzm`c[ohMXXej_WYpzonfSOFS9OZNRO(+:JB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J'R^S10T^:+=8]K,<-@² ³¡¿¢¤±²· ©¥³§¥°µªÉ«±¦µ¦À¨´¡¥¥¤ «§¬££·¬ ª¦Á¬¤¢£§¨§²Ã¯««©« ¡¢¥¯¦¡¤§¬¦¡° ¢§ ¢£ {©¨
{
£~e¡³®
vz}vyzogykuyrhtzvktcxf_hdcdfjXk{qjj\RLPD_UF@??,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^]]^]XVJKLBIOMRJ;<:786/2964.(&$-1..)+*7%+<(6CMLD/T]Q05M[17E4\G5<,@´ ¹¯¾«®²² ª¦²¢¬³°Å°ª¬£³¯½¤´ §¢¡¨¦©¦¤¦³µ¯¦®¾ «£¡©
©¬¢³È´©¤ª§© ¤« ª®©¥¢ª¡¬ ¥¯¤¨¥©f|e~cxlhkz£«kd~g
eeihz¡kg¢wkj¢slnz
yXe]
^kv[hswwnxxsmytw{hX]jsd]sij|qlc]QNWIdX@J4>F7?FD71<=?AC;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[I/7ZO6)EY/DO1YC;?.=¥º¼¹¯«³°«¥¨®°§®®°½±©¨¤°± ¤¡¦«¬£¦¨©³®£¢¯¦¶¹¥®£¡ ¦{¥¬¢¨³Ã¸¥¢§¯£¤¤ª¨¡ ª¯©ª¢©§¦§ ¬¡¥°¤«¡¥«~¾r´r
hx¹Ä¸q¡£{¦sª|ËÀÀ»q¢|À½ÁÁ{z¿}k¥±ooÊzxvyyqzpx
ylube^xd_eb^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>H[L*#CP/#F[3PY/UAB;/8£¸Ãµ°¯À©©£¯©°¯¦²µ¯«¦¦¦±« «¢ ª§¢«¢¥©¥¤´¤£¦®¬¸´§¯¢¥ ¡ ¦«¤«¿À±¡ª®ª¢¢¤ª£ ¡¬®©«¥£¢¥ ¤¥©¤¨®ªª¬¢¥¡£Îyz¥z_^§¡ |§t«¯^d©z§
t³c« ²j®t|¸aY£Ínu{Û{q~ue{vvk}n~
~l_pjof`_xd\qhjcf`RTRW]JOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5577164('$!',&&/(&+360$7;SL+-.J0';\:L-!P@F4.1ÂÀÀµ´°·¤ª©´«¦²¬¬¤¬¦°ª §¦¢° ¨§£¦¡°¬¦®±«¨¬ ¥¥¨£®¤«°¨¿Æ³¨©±®¢ ©ª¡®¯§ª¨¦¦£ ª³¦£«ª£§¦¡°¡§¡ p
u¨q°|r¬~¡¥w«}r~«vz|~ª¡~«{ zVÄzoÁ}mupmfveoawnrnmdnsuo`fmd_niinfcWT\aZRRC8II@D<><@EDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1''45-&7>WJ-<(=1)3V@F!G:C1.+¯ÔÆÇ²´£££¢®¶¯©°§©ª¨®««§¢£¢¦«¢¥¨¨¢°¨§¯¨§©¤¢¡§£®¬£¬µ©¹Í²¦®¬¢®¬¡©±©©¨ª¨£¡«¯±¢¨¬®¦¦«ªª±££¥
¤j¤uz©tz²q¥p ¤_`R«®u®§z
{f£¤£}©~®^|¨U¢z¢{ïÅs¯³³¹qb©¯Âuhlnmxwwnlfedqpf{ic\W_iXXTLLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°µ°¯©¬£¨¦ª««©¤¦ ¥¥§¦£¬¢«¡¤¯£ª¤¶°® ©§¤¢¨ ¦°¦£¨±¬¶È²µª¬ª¢¥³¡¦««¢«¨¡¡©¢³¢ª³²¢ª¨¯¯¶£¤§|ªlu«y|°n¤Ò·´¸É²^_©¤ zxªÉs£§©~ÆÆwe¡¥s}¯^oµc±uK£m§Gc{p}ozt|zm\fjrqfi^aXcm\^YIMMKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNOPMFLJVF*L0/>-4OTQ;<F2,$¨¤Áƹ¨²®¬¥¢²¹¬ª¡¦¨¦ª¬©§ ¦¥ª£®«¦ ¬©¥§µ¢¨«¶²¬¦ ¦¦¢ ª§®¡£§©°´Â²³ª¨¥¢£¯¥¡¥¥«®¬§¥«£·¬¡±¹°¯§³´³¥¨¤ Nxz£|¤¦¸{|y¹~ÌŶx ~u¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUu£{}szr~p[lnwrjnZc_hnbd]KLQTAHHFI:9K>B108856877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E2:P[T6?H,- ©¬¤«¹«¯ ¡¬³´¦ ¥®®®©¦¦¦£§¡²®¡©¦² ¨¤¢µ¢£¡©µ¹¤££¢±¦¤¡¢¯¤¨¢µ±Ã±ªª§£¤¥¥£¨¡¬¤¥¯¥¼¢··®µ²¹²³§°¢¤ÑµÃ·y
¦x¢w ¥q«´nri£|r®¥¢¦mp²\¥szl{}n©a¢qqbs²¸hx¥}w|xlhwixsnt\ddnmeh`JZWX<GG@T3@F><*(63.013)&4:;<=?@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s®¿¿»»µ¨¤¶¡££©§®©«¥¡¥ µ§¢©§°£«£¤£ª´´¤¦©® ¥£§µ ª£¶«Â°©«©¢¢¡¦£¥¤¦ª¦¬¡¤¬§¾¬¾°£°³º¬´§©²¥¨z¨}|°w¤¥m²o |¡¨¬®
¨ ¢
{}«ªx y¯]£|¦§d|tk¯]¥kq
]`[ n¦yyjl~b}tny`feqohghCY`[=JT2T8BBC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI7052.*,ATVVVTTUUUUTTUTSSVWWXVUUQHFIJ#((¼©ÆÃ¶Á´ ®¸¥¤¤£ ¯®©£¹ ¢« ¯ª¡ª©¤®°¬¦¨¢¡¥¡¥¨¦¶¨¿¯¥©¤ ¦¤££¨««¢£©¨¾¤Ã¬ª£¢¬³º¬¯§¡´°©«v¯~
|ºd°e} §¬°
¥¤¡¢ [lj³`{{±lgn±[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m¨yw}cr}axs|aifpmfeeOUc[AT^=I(>9=4!",%2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UYXWXWWXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Á³£¦¥¶©¡ ³²¨¢´ ³¨ª«°¬®©¢¯¨¦£¨®©¡¥££¥¢©²¨»¯¥¨|¡ §¡¨¦¤¤¢¤©» Ƨ¥©¢«´¶®§ ½®©£®¤¸Ãº§¬¯¦¥ª~սªb£¿½|~£×º¸µ
½¾j£o«nz²±Çj«°½xw¢¾»t¦xyb|zcgx{`kekjbPb[Sj\@TaBM)<:4/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMIC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼´´±¿¹²½³¢®¦¦³¦¥¿ª·°§ ¿¦¦±±¹¨¯¥§¯¬¯¦£¬¡¥ª £¦§¡¨¢ «©¹®¨¤{¦¨©¨©¦¡¢ª»©Å£ ¯£«³µ«°ª¡¼¨°°tuª¤·
eog¬mow¤u¯pq§£®¤rmmmewnmqyipigqhi
gpd^cjpY]g~w¦`bqofd¢{tewhjx~ydlcflbKdXJkY:PeEQ'K9+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³ªº¹²³ª©¢®¤³ª½±ÃȽµ©À«¬£ ¦«º£¤¬¬¦ª
¥ª¢¤¤ ¥§¨£ª ¥¦§¯¹«¬{¦§¨¢¯¦¢¬¹°Á¨¤³¦¬±²«®¬¨¹¤¯¸¡¨¥¶¡©ª³£¬¡³¢ ¢ ¤¡«¦
¤}gtvtq§m| pgvowv|zilddocU`Y@iZGb`NY*E=+&"740.!%2(*799469;>?ABDFJKKMPPQWUVY^_ac]^UQJEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¥µ¸¯®¢°¤ ¡¶±«Ä»Äº·ª¡¥¦°¨£¶§©´¦§¬£§¬¤¡§£©¨§¡¤§¡µº¨«|¡¥¨µ£¦«·¨®Â®£·¦¯¯°ªª´º¢¯½¦£¦µ¢¦©£¬¯¡£±©°¤¡¤ª«¡ª
~fuvysj}
xqrxq{~jnd_pi`[`YmbP`dPZ:GFE=3==7.*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV\^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤§£°³¬®£©§ ¨µª£²º®««¡¢z¢°¤¥±©¸¦£©¢®¤¨ ¡®ª¨¨¨¹¶¤¥y¡¨·£¯µ¢°¯t¤¾£² xz «³¼v®¤ª~d[av¤~n³£¨®«£e syp¨l¢§e¥
wkvq|ai[vghqz£dxvhnykpe_vokkh\fcbboR[>MNNRG=@TB91.&4:316678<;>@ABFHBGFIKLTUUY\_hfgWQJ<DG<9VR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥©£§¥ª´®±¥©¦«s¯¨«§¸ ¤~«¤§¢
u®¦¨£º´¨ uv¦²µ´½§¡~§¢z£¯¸§
°©¯¢y¬¢¨ª¨w¥z¦{±z
bynqzqt
xht t|
~ijx{qpgdwmilj[ejier[^HSLQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aahfYQH9DK<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°§§ª¥Æ¼°¡¥¨´«§¢ ¾ }
«£ ¡¨¢£¹²§
pu£¬´´®Ê«®·
°±¯©§|¨r{w¦h¤y´§©Â«¡q¤}
±¡| |
ms
{r
}
t
Åf©¢jogwt{vghupfgk^bnlflXfF\PL2E46M`c6&4<DGD:64658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@JdX]cfhgbbbbcc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹±ª«¦¢¤ª¢£©¶¢¯ ¦¥½ y«¡
w ¤¢¸¥bm ¡¨~¡§ ® «°¤ª~£vk«tM«x©¨ª«}¡{z§ikg¶}m`cX{dgs}yl]|n_Sq
\`ly`Ye}q§ªk£nr¥pgdlZlzeY_~aWPovemtqjjo^jolkhWhN]WE9A4GC^k4+ICQMN=84859;6@;;>BO>QRLMBJ\]_W^_bv`MD:MOMTb\[ffiibbdaddbab`bdcabikdbddgdbgeach ¹¡ª£¦¬¢¶¼«®¢¡¥¬¬´¢§ ¦´u¦
¬¤¨¥°¦¢in¡¢¥£¡ w§¡§ª®
¥y}}¢ps{ym©|¢sv¦f~w¤_z|s¢n·´ºt¶¨dƸ{p·q¤ct¬«`}j³~n}q£ls¤s~£^³o{³tr[²ibosuqhoYklrre\h]bKD=D5QAYq2<RF_JS=<395::6D;;@IP?TMNQ@E_^[ZX``|dIC8LWUVbaZefkkbbeadc`ab`cc_`cknccddhdbgfchh£¹¬ ¥¸µ® ¢££¤¬±¬« ¤«x
p }¨¡£¨¨¤~k{~} w¢ r¢©§¨¬®}z z£xs}¦£d¡|lhnz§}rgsªsªg]
vhªj¸f\©pa^§vuhunk¦\¨~w»j}©Z]³g\mqxwki[pixxb^eWbAPDO7VBRm4JZZ_NZD@151;;7H?:CHU?XRY]>Db]V`Qad}iEB9N[^YdfXfgnmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬º²°¬¦§°§«¢¡ £iq{z£¨£ ix{~£ ¢rh p©£©¡¨}°¤¢¸v£³¢£xz«~¢r¡|
¯µ}k¡x~´££«¨{|~sªZ]o{xbM{{
czBMY¢jr|muy±³¦tmq|ori£]vHec`sp|}ne`khv{bc`Q^V\TV@YEQgDRW[bX_ID=B8@B:IE8LEXAVQ[VDFa\Z`K`m~rEC<U_bZejVghlnbff^aa\]^`hb_ecvl^egfldelhhki±®S_¡§´º³³©¢©¨¡«£ §¡w
ny
}r r¨|l
q¡x
|¤ £®}µ{¦z©¡}§hwm~s sq|
o®}£¦£p^©gu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²¨¼wm¿¦ª´^o~qos¢r]£gt¦ah¦mÓznwykzvrl©¥g_dyp~kgfcmvwf_aR[eQQbIWIT_WS[ej\eQECKLJKBJD8P@QNWSXORQ`eeiRdxywIFEc]eZhjSihjocjg`b_\]]_hbahe{d^dgdkdjlfhlh°¬T\K~©°²µ°³£
¦ ¢¤¨¨
{p}h}wpl|£ª
yvnw¡y¢£ ³¡¢¶z¬§¤®¥p©
}¤¢r¢¬®¤®¢vµ¶µÉ¡ta©mxu¡w }oLf¢ps¤{ytal~ lrd`rti{i³µ´Æ¦s~{j«tmswiytqPE|³^jujxfjgbttpmU]SYhPRhIULXRV]gknVgWMJAJMJHJNAQJPecimetrs~x{nu{{TPOm]h[kiRjhilglfce_\\\^ibdhk{_]dgcjfnmeile¢¯§
f?¢³«¯¯µ¢¢¨¢¡£¤¦¥yjye~ yui
z¥©z}yp¡y¥§gnxl¢d|q¥wpg§{¥z rv¹n¢b}¢nriªku ln¦`ihu¢}_
uobh¡eiupdfnr¢Z_[d¡n^o{srd¥nx¢dg§hrn¡oRo ^d§T]SmmrjqlphkxskoQWVVfYSmIXO\HXihsjYkVQREV\LXRaUhj^wuz|p||r{rvv^QsagbpgPjhhklngdg_]]]`jbjivu]\chcjirlfkmc¥¦zetm§®¥ª°±¦ª¤¡¡¡¡{qh|st}{e|
¦¢«
}si¥}
ª¦¦x~¥²¯¥xz©t¥n¥¢¼n|¥¯
}¦zq¨ g~o«bw¨l©¢vw«¦k°kv³©lnma~«ªv§w}
¤ iu«f¶sw¾¤Y¦«auqso{tpbj~nhlRUZU`a]kM]R]I]lmv`[qY[`Zgsenorcqt`w{~yrys~{{vbxdcnsdRlgholrifia_^\ajbllzo\\bibmiwmglnb¦ª¤©ª¨§®£ª£¥¨
t
zo}ttrm}{¤¥¥uol¨ª£ u~y®£qx
{r§q}}zx{~}v¡{}k
[yyryphn}qtq
e_wusuozonm_whxfª~t}jou|umlfsx{w[jXxhmwqpowwo]lmigVY_W\dkdUaU^Q_pwykjwejjju|qqtsaoubs{xuyux
}{mldyn^Wnghukxjiid\`ZcielpunZ[bkdkkymhloaº©§¡¢¦¤¤«¢ « ¦¨~r|}~ztrp
{}
x~¢{§¡
wr©
§ «~~¨§xp{o~©
p}qjo|hm]sqtkvsYrn}~i]icz
_ix{|viykaqsw`s§fnvoxndfcyzZ\ifnv[zywtmsrf\mkkbYY]ZXkq[^`Y^]fs}{sotcjji{|qzwtdmthl|~uy|{zyo{}s~ysiT\qilvpugkgd]aYjhkjqrmW[enlgsynhjm`«±¢£¡©£¡}«¢¤{|r}v
qor~z¦ x
z¬¡ª¢¢££ª¡§¦ |y¨~°¥²¦ k|vwe|w|zu¢~vqt
x¦|uk{yirh`sp}zvuowt\^ohn_^Z[\SgqUc[[alht{|rnpcjih{mx~qhoplf{rw}{m|zx|~zxNdvjsnp{ekebb`[sfpfrqlU]ltmiyzpgikeº¢¡¤ {ª
|x{mxr~ml~z~}ªq
}z©¦ ¢¦¦w}
¥{|©¡ªox
qt`~
t~
nyuu¢
t}}rs{{y§u{nj}{mhklg^y~g|{vsuuzv\`p}mt`bZ\^QfmSeZ]akivy~pklckjgkrlktoxnynv}
vr~{z|{`i{kuhiejc`i[cuhobumlTbqydpzzrejmm¸¡¤zw¥¤yy
|m|xr
}}kh}|~|§p ¡
|§w£ ¡¢¡£
y¡~|¤ ¦~~utpv`}
q|q~
hxry~r|}qz|
{{¥|
uydqz~xypljf^}rh|uus|sj^`svpwdcY^^RjhTdX^agjvxqfkclhejm~hopj}w
zkr}tv~|z}jrnsiailb_qUtomn`xhmWjtvbuz{qbkoz³¥¥ |u£ ¢x{~~p{tu
~xgc}x}y}o¥¥v¡¡z¤zx
~s¢ ¢|vq}mzd|
pkeuo|}x|}|ryy
¢wvzt_ww|s}wfkd`~ijvsst}p{cc`smurmaY`^[ldRbW_`hkuypcjclfh|khthloh|ymqt|~z~|muttmeljacuViqn`xflbjvpfy{yq`rl
®¦¨|w©yx{}|{xsxzs}d^}~t}~}¢ ~r{¦ t¦tlzo¢{zqyjul{}}m
wo}~drj|
ty~vx~}
¤y
t}rtl`ztyp{oanbd{anovrwwssav_nkuno][^]^j]O]Wbahmszk_jejchwmflhjlg|zwos}tz}z}}ryyxnlkh_irchqofvgmlazhj|zxpawmª ¤©}v}w}{|{vwptszo
}}{a\~szz¤}|¤
n¡ o
gz
p¡}{tsukqnu{tnqt{|eqmy~}
ttyo~}
¨{}~
w}pnbgwstnzb^o`jt^pjzxxlrpex]mlsmsXZ^_ajZOWXdcgqqf]ihfbgqndigeihzwuo
s{u
x|w
zw|{ryjk_phtkqnmqgole{bmyvqlww£¢¨¡§tª t{vwxrs{
kroymvmp[Y~vu w~n
k¤gw~|}ovokmopz
ispwtyftov|
zzwtp|{£|wxxni\qrqoowZ^p`oj^oi|zpmmjmv`pojqmYXaabmWQSYefcupb]kmdbfkm`ff_gkuqrptxvy
wv
|{vjqc|c|opltjholvw_q~y{tut¥§
u
zrwtpr
squlomumw}lmUQ«xvry xz¤
}s
ih¡qw{{||kvjmkklz~ay}vzw|ygulu{qz
px{{~
|}x}vphkw^vomkprU]nbq`_mnypgpfgsuhpkawe]Ve``rSPN[fe]xp|_\hrbbefi_hd[gp~okqs}v}
tuy{
xs
~{yxfrj`~ookz`intt_t}xxtr
|y¡±¦~vtvspo
spqojivmn}|musRNᐙ|ptu w{r
¡
~xz~ywhl¤
cq{{z
{~l{erojkyy[yz}~zzhtkt
}l~o~z|wxxrlepkhtoghslS^ndpY_kqxfkjbfxsopc_w``Vk_^vPNL`fc]yqt\[ev`aeecafaXissnkqv|tyuv~szr|~vesn|eoplZlnyys`vz{vrwwy¯
w}
uwpyqnomn~rddxp|mz}jhlc¤ÁÜ®ï¡skuu¡
np
£
{uxvwo~¤
^l{}
v
}}k}cxuimxsWzy~
~yftjlvn
zttxuspftyasloahufR`pgkU^msy`rc_h}qrmZbrabWnZ\wMMLcfa^vsm[\dy^`df_cc^Xjrknkrw}swxw|q}~{t~~shuqyl{ntpXqzvyqdwyivr¨£}pxy |{swpsjokil|t^`xv{pu{g`e|ëÚµÉÃÜslsvip
|{vxrvq¢a
i}}q~qwgvriswkZ}|vbtl}nly}~nrzulpjqw^shn\ju`RdqhfS_ovt_o`]hqriWghciXmW[uLJLef^brs
h[\ey^^dgzad_\Yknenjtw~ss~zvzs
|wv
{vlwuyyunxz}Xyqogxwdv
q
¡¢sorw}{yrsnodr~iflww[_xzzqqiagaÕ¶¦xnqw{qj{h||~
zu{zq
uw~af}~m|tkmvtsvukc~|p`sq||zqf{|
~npy~umnijy|agiiXkuZRiribPbrxlae]Zjmsb[g_dl_nTZoNHOfd\gnqkZ[cr_\clwde]\Zlkbmjsvqo||tx
x
|uy|vpxy{om{w^tmizssgr}r vvmv}|v~wqoljat|gbiuzZ_x|ymq~echhW^qr¼Ävq~rrj{||{uvv}qu
ru
|f}
q}f~{y~}i|vfoxxsvslj
x
k_ry{~|~riy
y}}nm{}wtngf{ub[pbWnrSSnshaMftxe`]\XnosYea^jm`pOYkQDSg`Zknm|nZ[^lcZbowdg\]`liclisvqn~|tuz|
v~xtryx~oo{qiyz~ml{ukjwtl
n}vjx~yozspljd`szh`eqzZar}ygqzaee±²wJbZ¤ÙÐr{w~
nk
zy|xxpqt}ziy
¤~owy
p{}nwh
xr|e}~ucprhxpou
|vxyk\q~s
~{rnq
szxno~vzdgi{o^XvZXplNWqsg`Jlvt`][[Yt}roWg]fjp`oNWhQ?Yf^ZojgzqZZYkeYcqy_h\^emhekiqwol~uo{v
qq{|yyujzlo~u}or{{onxf¡gpgz}~|ixrklf_anxm_box\dlzaqv_eeÔê¾2:>qx
v~ml
v}
|xnvwo
lu{tfy¦}nuwz~{wkrh~xm||wbyqdqh~mtqt~
~su}so[mux{|xzqlrztmkwuu\hgvoXV{RYodLZrre[Ipxo\ZZY]u~thYb[genciLWfQ=^e\]ue`upZYTodYdqyZh^`gmgilipw}li~yn||zu
pnw~{{h{}jt{r{sw}yx}|kl~kh~z~~}kuqghc[bgrn`aksahpzbst^cd n\5Y¯µti|u
svpl
uyx|z~sgv~~pq~hvymey¤~n~v}|p{}{h~lj{zizvr`w~qdrfumu{|nwy|tmXpwuxvzxsns}znmjnun]gdrpQZzMZo\N[rpdUKsxiWYYZaqt`]]`fdhifNZhN@ad[`ua]umXWStaZdorWj]ahkgmlipw|li||p~~{zwq{oqw{j~{mwxvw}x~~zm
£{uyklx}{~prqcf^Yg_op``gpfjotato[adjv{¾¦£È¸q
r|xsrro{tutwyyqcwzirvgwucj|}rt
zy{kxy~ugzhlysizv}h`w}jjsg{iv~z}~p{v{t~bVw}rs}qwxqp~y~}vviqimrp]gaqmJeuK]nUSYsnbQOsx`RXX\aos[a\heeckdQ[pIDcaZcp^]xhUVUw^[enhVk^ajgeoohpvznix}r{~y|v}pwrnw}p{xyztxzuo~}
zw{gt
z~{
vgon_d\XeYmr```plkhn`siY^dmw©Ú©Ç²qwou{zutu~wpqmtxuk`zyfqpgvn[m|y}y{mwt
{luvmgvem{umjwv|`bx
yhtub}{gt{tuqz|mYVtpu
yltylu~{}y{s|sgtenms[j^tdGmmLZaWVUxmbPRtvWPUX^aqo\`cmdd^obT]rGBf_]fh][{bQU\u[ZgkaVj_`nefkqhpuxtku~vx}w{s}oqtqu
{wx{|
x|}~{~svy zvty^}
yt
w{bnm\b[[aVjsc`[gnofqaqfW\ck|Êι¡jmmlqq|~{
yysyuu|jlucuwof^}zfrkjqcXmz
sw|nrr
{x}qqp}fhqbmxqjkqx}|z\dywiuxevgt|qjn}yn|]Xrnt|ooqvhww}q{u|zrfsanlrXj]v[HmjMUT^TU{kaOTurPQTV^bt
i\`kjfcYnaXbpGAh\`f^]V{]OUdpZ[jh]Wh`_rejhrgprwxntzw~xur
pp{xwuz
z|t~}~~}|xvyx }muyc
so
ztcnjY_[]]Tgse`YdqrfsbkeW[`ix¾®{ ·mbshs{qy
{}wxrvo{vejn`usjb^xygq~hkkZVow£qqyuns
}xtrnhy`jm`mvjgjkywzw[g}|xer}mteu
ofjzumtb\p}lu}|fu}nqhux~s}l{{zxqflbn~mnVj_vUJijOQNhMY|hbNUujLPTU^fuf]`phgaWi][khJDjZadWYUyYNVmjY]le\Yec^teldqgrouxp
v~w|
}usnsy{zss
x}u~|{~{w|wwziv}|lrp
~oflgW][\[Tdpd_WbruiupeebW\\hporsddx~itusrxywtumkzqbgkgtnf]_}p{~imxfidUWro¦|{vt|s}{n||
w|}tprlgt\lh^ltdgfizo{rYgvtgpwubw
|njmzqfsean{gsx|~bvvjkqu{qzzt}f~ywndfbn
|mjViaoRJhjOKNpG^{faMUtcJNSWajv~e\gsie`VcWbp]LKkXcaUTUsVLXudZ_ka\Zce_wfmbpisnrutwwz|u~
nrt|ztq
zut|
}~{~v{£¥yku|zuyo
sy}unjheV][ZZSbnd[Xas{ihmi`bW_[jikogk`hyxjsttnz}uunzhjyj_enhvgeXbwi~{oipgf]UXog¨wz|yuppsvzxu
vjrvghn[ld]ms_gajxh{mZmrsjo~ywawwrqoyqcph\pxdqt|xcspgjytrlxwvxd{xvpdccn||kkUhaeSJkgOGRkEaxgaMSq\JMTYekw{e_mqid]V`VnnWKShWe^XNUlTJ\y_[_k]][ce`zhkaoounoxuz}wz
zyz~qttyvt}|ks{
~}{v¬zkryutnn|sjomddX_ZYZUbjg[Z^ui^ml\aV\\leqt}ii\kvugtwrm
{}}yurlyhixf]eshzwccTepg
wwgij`WVYgc§n~wzpq}hzoz|wr}ndusdhh\kb]oo[g_mudzh]toqkq{}uuat
zwruuapmZrtbqr
|uerlal{oji{yvrf
v{zuqdaems~ilTh^\TKrbPFVaGbvgaKToWJLWXgkvzdenqfcZW]YveUJ\cWgXYIWeQHbxZ]_l[^\ad^ij_ntxnonvyr|
}uuy}suuyzz}~isz}~
zz|sq®{{}eqys|{uro
l{~lzbpobe]eVYYVcfk`]\s
hXpnZ^WZ\l{bpwvmbZlssgtuply~ywnnteite[hufvvz_]Rffkt}bci\TX]bc¥hxt
xmozhxn|
{usx|xhevm`f`^j_]skYe]oobze[w{knnowxstdr~zvor}sbwd[oqbqq|sgre^nvidgy{unout}sqb_fno}diSgXXTMw_QJYXHbudaITmSJLZWilr{bllscaYY[av[SLc]XiSWHYaNGiuX^am[[_bb]
hganxylojvxm~vttsqwuw|}~~~pw|yxy~tsp¢{zxduxswulto~ly|pr^po`gblT[ZWhcmf\\qeSrn[ZXX`lvciuji^Ymsqlsssj
|~|vnnldiqc[krdtvs[WSearr]bc^SZ`[cerq
tlkzmop{||qwszzzdeuh]bZ`g[^vhWb]phaw`[{viirnwsrthp~vrjp}mfwW\knbqszsgo~[`pqa_jq~llu~sqxkpa\ellzagSfTWQOu[QOYRHctb`FUjPIPZUkkk|emoqa[ZXYlpWSOfWWhSTFZ\OHrtX_cmcX``a]jcdmyxkoiuy{k}|y}nqowz}t|tw
usquo¢t{{ewnnznfxpzksvrk^tnagekR][UgallZ\pdOon]VXUgjtgbtee]Yntmpuuyk||vsddkna\nmcsxkZTVcdx}}q
\c_cTZ`Yccnp
sjh{ofsws|lztuoz~u^frc[^VadYateU_`mdaq]]~ohisqsptujm{
qrfn}proS[fkfqtwsclvUbrkZ_of}fmw}sssjm`Zdjjw^fTdTUPTmWQVSPHds_aEXiNHWTVmhd|ikxkbW\U[tdSRWhQYeTSHZZPMxvZ_eliYb`^^naflyunohvvl}{~krgt{u|r|
{ss}vn¥svwmz`d{pfzsxlmqvgd{lcfghS_^Ug_lo[^nhNim`TVSogslfxdd\Xptlqzxrm{vzykaelm^`ojeqx~gZVX`lx|{p_b^gWX_Wdbkq}wkkxm\wql{jvsno{rXjn_Y]UbcXdqbS^ahbblZ`}kfksunmwvkh
~zmqep}mrmcYaiiotts_ilSeqdUbnbzcqw{vkpmj_Xaght\eUaURNXeRO\OOHep]cFYiMI_KXmd_xhn~d`T^T]u\TS`fN]aTSJ\YPYuu]_emhXca[^qbgjwqsngvtzry~|zntlsty~|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~~~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBN¥¯®¤ ¥^*///0,H
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR455553A©¶´´´´µ¨£¤¤¤¤ªV:|}z{z|}{|~}~}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvtuvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfggghhgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AE@>:;>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;<<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;=:7:<<>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqususqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::989;K;9:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>><==>>=:MzR:===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLKIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCDA?>=@HG@^zi=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJKKLKIKJJHVpoqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CEDH?;@c|{usxl99<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pqrrrtuvz{}}}~~~~~~~~vMNNMNNLLNPNL>A<<=?>BC??AAAB@Esb?k
yl;988:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHJJJLJFFgpoqqtvuw{|}}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC?Mtzm{~p@==?>=>CD?<<=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hmoppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCE@Nsu~{|hAA@C@@?@@>=<=AEABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{|}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@Irs~}
]>CCE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEGFFJNNKJIGGHKMJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EDfv
JDEDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJGYy
a@BUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLL`{Wl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLId
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJJl
fBB=88::9878896479;<:8567789787689;;<>@;999==><<=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGIIi
~T;8656766645763468:876565676778:77789;7589989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECEu
H676468874578467699766765:9:::<898977779:98878589;A=>>BA?AKLOQPQOOORWkrrttuwy{{{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B9G
z>:88;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<<9;<8::;:999<?<=ABDIJMKJLLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?<V
l<;>BCEEAAAB>@B@@?=>>@?>?@?@==?B?AA?A?=@@@??A=><;:;:9;?=;;==AACABCAXqqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@B`
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHECEDEEAFEFEFFD@B?=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@DDEd
WHLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@@A?BCHHJ`
PMPMKNKJLIIIHJFDGHHIEEHFFELLMIJGGHIJOMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@98<;<=:?@>@@CFJJPh
qMQOMLLKLJHGEJIDJHGLJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnquvwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?@EIKMVs
^QQPMNMKJGFCGJGLJGKOLKJJMMLOPNHIKLOQQPQOOJIJJLJLFGHGFGIFEEB@BB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAHLMQWy
|WURRTROLKJEEFKONOWVQPOQSRMSTOMSLPSUWRSQPLKMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BCFVNFOQQUY|
gVVkaERQQPJ;:QSR`u]UVTVYYRXXRZfPUWZ]RTWQPNRPPPQKKKGHIHEFIHIHIjrvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??AAEBCGEDELXRMTVVX[|
}al[dU:XXXSP>@VUY\d`VYbr^]V]ZVEQYZ[Y_TYgRUVXUTVTOOMJLJIILMKOMTptvxyxwzzz{z{|}|~~}~}}}~}~~~~VJJIHGFDDBA?HMIMPKIKPTSSXZZ\\x
g;~znpXZ[ZRSRVVTZZuYU}a\X]^WIV]][[_YHYXY\]YXYWRQMPQMMOSQQURbtsvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTXXYZ[n
n~fYY\XSVTWRQWVcQerXZW_hP`fZ[X\hbGOZig\[\]]WSNSPPQVVVVYZostwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRRUSVTW_ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^SPPPINOWVXZZdqtvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRTRMOYQMNQSUUMQSRPNLLHCIHRTUZ\mrvvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YUQLILIaltPQSNQRQR[RSRQRUUbs{|}{{
u_]KC>CCCCB?DPBD@C>BHGV@HNMG]iPHFOFDEFHGHBCHGHJGCBAD@OPMRdsuvustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xytrnstsyx~~kLG>>:;>@@??>kQKaEFHIEB?GLMGMQUIBE?><=<==?=?ACB?><=B>JMFUnuuustvx{|z}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrjmlqu{z}zxz||xwxdB@@A=:BCAADB\]O{NOONKLMOOQLKLWNHG@B<977599=;;;8989?;AG>\tuuvuvwy|||}||}}~~|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbYGFFHBAFIEEFDMRPaWRXQPSSRU[OOQVPMICF>::6486979:366796<B=ftuvwwyy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXRLXYZVXXVXY]WWXhsk]V`tkaa_]d`_^YUPMONLIGJKIHFCQPSZWTTMQSYS\eUOSTQNLIHC?A9988978847578588Gnruxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNNNLJFPPUYSTNJOOTST\VRUSRNMLIHHF??=:787659967665Wqqtwyz{|}~}~|}}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOJGPPOOMRJOPPPNNOTLMIPPSTU2<XMIAQ=c`QSQPNPQPNNMPNTRPRLILKOQPQRSTQROLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJHGEHLHKIGLMPMG/E_R>3@>joaRRQ@FTQPQPQNQOPOLJLLOPNNPQQNQOJLMMKGEEDB;=<<9=G6677Dnquwz|{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8ENS]gSQSAGUPOQQPMMNLJLKLNOOQMOOMIMLILKLKGFFED<AA>;@E;<89Tqsux{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A?<=A@B=>EHGDFFIGKJ@FAA@FHEJOHQRa\QPRNSOOPLLOLJMLMON[VKMQOHJHCIJLLKFFFD?BC><BF?B?Adqtwzz{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;>A@@>ADIECHGIGIEBB?><CBAGIDMOaeQMONWKLNKLMLLLKNNSdMJLRIIIEAHJLMNKGIFBAB@?EFEHDKopwzyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsoutlpprooorvvrVVnqglyjmqrnnjhoHJCGLMIMPMPOGKE?B=999:?B?<ABBADDGKFDIIGGHCC?B??@A>CECKNQTLJIMTFIIJLJJKIILMOPRPKGCLGCCJJLMOMIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqnjllnttmsu{stxronqnvsnporpopstyjN`gsjt|ygosqjqheqHKCFHHGJKIJLDGB=>=:::;AB?=BBCCHFJLJEIIFGGCC;A@B>@@CECIMOGHKFHKDHIKMHJLHHJLKM]RIHDNGBEKKNMPNKMJKFGGJMNQNLcniwvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKCFEGDEEFEGCC@><=:;::@D@>BCEEIFJJLFIIGFFCB;BCC>@CCCEGLNHKNHDHEIMNMGILGEFIILNKJHEOICGMMNMPNOOMLIHIORQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGICEFEBCBE@DB>?>:;;=;=?CA?ACFGJGJILHGGGFEC@=EEB>ADCCEGHIGMPIFFGKNOKFHJFEDDIIHKIFHPKDJMLPNONOPNJJHMRUTROWdaamgprosyzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCBABD=BA>A=::=?;>>@B?@BEGJFIGIGFFFEDBAAFFCBBBDEDGGHFLQLIOJJLKIGHEFEDCIHHKJGKRMCOONQPOONOOKKKPUWVUSX`^]iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqrkksMFFEHBBADD<AA@C<89=>:?=?B?@@DFHEHFFGFFECCECDIFCFEBEGEEFGEJMKHQMJKHHIEFIHECIIJKMKPSNDQSQQRNOMNPMLNSWVWXVX^[]d`hbjigk_defcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBFE<@CBD<7:=>;>:@B>??CEFDFDDGECECDEFFJEEIGCGHFHFECFJJGMJLKHJLFIHKHEKKLMNORTOISUTQTPQMNQNMQWZVZYVZ^ZXa```_hec`deggjihjfhnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunorsyMHHGIDACHE<@ECE=8:>><<<AB=?>ABFCEBBHCCDEFFGGIFGKHCHHGIGFDHKIGKHMKJKLHLJMKINLONORUVOKUVTQTQRLOQPOTYZY\ZY\__^`c^\ackb`dghr
hgifjmnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIKHJEBEGE<@GDD@9<>@?>?CB<@>AAFCEECHDFDGFHHFHHIKJEJHHKHFFLHHHJHLLLLLIMKMNMOLPPQUVWOJVVUSSRQLORRQV[[]^[\^`_a`bd]d`ef`ehjcssfjhglprqossnswwpuvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwovIJLILGBEDE<@FDDB;??A@@@DA@B?ACHBEEFGEIEFEIHFIHJLHHJJILJFJKHIJJGKKMMJJMLNONOLOPRUXVMNTVUSRQPMNTSRW[^^_]]``aaa`bdebchbdijgvlkigmosqpqpprywruutsmmssmqrotutspsvtuuwvuuteqskpqjrvowJMLKMGDCAD<?EEEC=AACBBCEACDAAEGCHGHGFJFCGJGGJFILHIJMKMLGKIHLKNQKRQLSMKNNOPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da_`b_`eaacinhbihhmxvlhimosrpqrrrvtsusssnksqmprotvrrquvuswywutucmtkopjqtpwLMLLLGDA@D>>DEFC@CAEDDFCCEGCBIEBHJIHHKFDKJGHIIIKGJJOKNLILHJMKZfJd\KlRHON_nUls[qpbwcRPbvuhucav`Xnqbdvinzf\lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?=DEFDCDBEEDFBFFGCDJDEJLLJLMGGMJHJJHKJIKJNLMMLLILML[sbdp^llUMNfs]geqlntgpi_aYnnbppbkjjgoqtetno\pugpMJryvkb`keemxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?BB?=BFGBFCEDEEDCHHGDEKGGLMMJMLFJNHIKJILJJJKMMNMMMKNMM[roonpplkMPQlWNibtrpamov\YlQ\mmZqmkomxxtsip\`slqjUuyxpc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGHEEEBBB=??FGBGDIEEDBFIHHEGKJGMMNKMNGLNILKIJMIKJJKOPNNMLNML\hdu]lqWlNOQmUZk^klvaldtTecNmYl\tpkilxjwuhp]_skhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtwIMGIDEECAB<B@BFDGFKGECCHKHHFJLLFNKLRRLGMMHNJIHNHJJIHNONNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtHKHIBEEEA@>CCBGCHIMIFCFJLIGFJMLFOJKWRKGKJJNIHJLIKJIHJLMMLIKKKSkbZi^_jcrrZ_Yjo_eeUk_c[abQ`mh\j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwsHHFIDEDFA@AEDDGBHJLGFDGKLIEFJOLIOIL[QJFHHKMIHJIKKIHJGKKKKGHJJLLLKIKLNT[\TPTMPONOOVQOOQOOQJJNPQdqiTYW[[\UY[]X]\\cfaafbce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusGCEGFFAEC?CGDEGCIKLHFDGKLHDGIPKLOKLWMIEEHIJHIKHLJHFHHJGGIEFLHIKNLIO\W^O\[`^OXYS\\b^MYZMXaRKYaZS`d]bX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstxyyxyxwxtqxrxsqrurtOBCDLMBCDBDIEGGFKJKHEEJJJGEHHPJLMJMSIHEAHFJIKKILJHFEJHEFGEEJGCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^c_Z]`c`Y_b[`^[TXXZ_^dbbaceiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKKKEFHINJNLHLNGHF>GGLIKKJKKIGEIEDDEAFJD@JKIO[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_aa]^ca`bbbcceZRYVU\[^c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFCGEBEGHFGHIFGJGHFHKILDCKJMMLLHJJHJG?GFNJKKMKKKIGHDD@DAHIA?HIGO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^PP]_accccb\dcbdcfXQUTS\X[a_^_aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMB@IFCFKIFFGHGGJFFFILJNECKJLNJLIKJHIGBHHQMKKOMKKIHGED?EBHHAAFEDT]Y^X_Y_[]UXXP]]QKJW^X^[]VZ`RQ__bb``bb`cbbddbXOQRR[S\^]^^___dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHCRKFHHHEFKJMPEGIIKNLLILKIIGDHKQOMLPLLKKHICEAECHGBAFEBVUE\T]SV_XNTUNZ[MJKU`a[_X_^a]OYb\``_bcb]bbW__TPOPQXR]\\]^_`affelfoow|{{}
zo
~INFDFFGDIRcPDW_IGGHDFMJPPFJIJKNLKKLKJJGEJMQQNOOMNLNHKADACDFDCADEALHCLLPOOLFMFGIJHGLLMOQILOPPSPLQSRUZYWYXXdVOSTPPONPUT\YY[^^aaefchckmqsszy{z~{}{
}KIEEGFGDKM^LGHYMHHJHGNLQQILJKKNNUNOKKLGGKPSSOPONONOHKE`ED_LDfcDM[H^\smOMVmYLCP_UlWgJ]XV^DLQULMTVQRTXWTXUT\TPfZhhdYTkTWVU[\\``abbb`fignlhrz|}~}}zr{z{
~z{LIEFFHEEKOTIKG`THJOJIOMRQKMKLORUROOJLNGHMQ[YOPPNOPPJKPQI|YYrsXPmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`YZ_VUWjtuu_av_Xb\\f[_aaab^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMMBDLLGILFRVLKOIKRXWQNOOMQTNOQPKLOGMPS[ZTQROPPPKHZx]TxdhYRTQvgtlpbnfkQrOMwmjrpsrqrpop]ezuxqqzq~s}ku}bRh|essoss|}o~yor_``baZa`gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJPOMMJNV^YULQSNYYLSSRNLPIQRTYWWPTPPPQKGfxlcxqmZJLUypumubnvPdeJfvqmwojfxxiWrQhzmijzz}lxzpgoXvvjvupash}ilx|o___cb[^bdgijdgbcdllppstsssyqrxbltgry{ssuy~suzn|}yxrnNJStNCBEPPIKKJLQOOOMPZ`ZXKTWPa^RVQYSMPISTUXWWPUPONRJLrouuquqdhaVnLqp^FhyWvTKhx}x`y{sna^modRgrunmypwlvstqlm\s~zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsynqpj{ztromKK[VHGEGRPJLMKLQQPPPQW\YUNVYUfXRRY^TMNITTVWYWOSNNNQHRmHiwK`dvvUWlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhd|ir{]TKl_vukiu{{m~xk|p]^^b[^bdegeeebZccikkrsrwgmihdg`alagsrkhlmr|kmhk{tmmkmOGJKHJHHRQLNPMLSSROSSWRVTPWZVVTTTa`QONKTSSQVVONLMOPJHQNPULKKSTSRTPVUQQNQQXXQNPUTXXX[[USSW[WXWZPSUWWXQ]XV]USOXRWWWXZ`[gr^[\[]^_cZ_ccefdccbYccfffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilQIKKLMKJTRMQQPLVVTPTUXUYURZ]VUTWUYXPOLNWTQNUSNPMLQPKJQQKQMKKORTRQQSSIHMNOQRQQQTVRXW\WSSPRUUVTZQNSRWUTYVTYUSRUSTUXYW^Z_a]\[Z\\`c\]bcdgeddaY`acabihincad^_c]Zd\bma^ffgmsdihkkedcfhPJKKNOLMTQOTQQMXWUTUWWWZVT\`VWVYUXTQPKOXSPNUPMRNKSPMNUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[SOSUWUTYUWYTRRWUUW\YZ`]VY_]^]\]`a^[bbchfedbX``b]`hefda^_]]^ZZ_Z_g`^]]chkagfhfd`bcaPKMLPQLOTPPSQOQZYXWXZZXXV]jdVXYZWVTTPKOVTPOTPPQNMQQORXTRQOMOSUNWRTUUONNQSUUTTRTXVZ]\ZVVQRWXV[[VPSVUUVXTWWTRRXVUZ_Z^`^V^]^`]\``__ZbbdhhedbYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROLPSRUZUTPPLPWVQWRSSXMOPRTXUUUSUYX[^]\[VROUWV[[WPSWUVXUSXZTSQYWV\^[__`Ua\`a^`b_\`]cachief`Zc`a__ee_`c[Z\[\ZZYYW\Y\[`^_[^^a`_b\Y`ZQNONVQPUSPUTSPW\\\X^\_W\^jqwyc\[VVXRNOWSNQQPRTRLQTSYZWUORNSXVTRTRRZOQSSV[VVWTVZX]^\\^VSNTVV\\VQTVVXYRSY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgidh^\d`a`ace_b_YZ^[\[YXYWWZ[Za\][]\\Z]`W[[ZPOOOYPUUSRWRTPZ]^][`\`U\]ijr}slh\UYWQOR[SRQTRTUTKRVU[YZSOSRVVUSNVRSZRTUTX\WXXSX\X^]Y[^TUNVWW^[XQTUXXXTVX[TSV]Y]]a^cc^Y`[eb_dd^^cca]efieg^]da`abcd_b^XZ_[\[XXXXW[Z\`][[\[XZ[^V^Y]POORZPZUUWVTTT^^`^^b\`U]^bkytl}lZUZUQQS\TTTUTVYWLRZV][\ROUSXVVSPWRSWSWUV[]X[YUZ^W_^Y\ZRWRYXY_ZZSTVZYZVWY\VTZ]\^`a`ed]^]]eabfd^_dc`\gdheeb_da_a`bb_`^WX^Z\\ZYZWV]Z]^[Z[\[WY\]VXW]SOPWYP]UVYWWUX_`aa`c]`U]^beeuzhXYZTVSV\XWWVVW]XPU\Y^]]TSXRXVSRTXRSVTXXX]^X][U^_X__X\VRYUYZZaX\UWWZZZXYZZXV]^_^cbbee]b\`fbefd_`dbb[fchecfaf__aaaa`_^VU]Z[\[Y\YY][[[XXY[YZZ]_]TY]UNTZVT\TVWYWV\`abcad__V[`da_zuohZ\ZVXUW[ZY[YXY`WPU^[`a\TUXPUVUSVVRSUWZZ\_^Z_\V__Z]^Y^VSYXYZ]bY^VWZ[[[Z[Y[YY^_``dcdeebdZafcgfe^ac`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWZXW\[\`]V]]SPVZWVZUYUXWX^`badada^YYadb`lfh^\][WXXY\\\_[Y[bVTW^]ac\SVYPVVVVVVSVTX]\_``]a]W`^[^\[^XVXX[[_`[^XX]\]]^\Z\X[_a^`dcdfffbYceehgd^ca`ec]fideh_f^cbcaa`__[XY[YZZXYXW[[Z[WXZTY]\Z`\U^bMRWYVWZY[\YWY^`badada]^Yacb_a`a_\\]XW[[]]__\Z]cXYX]`dd_RXYPXVXXXWVWV]^^`aa_b^Ya]]^Y]^YXVW[\`_]_YY^]^^a][ZY\_b_bddefggbZeggigc_c^afdZhicfice^bbca``_]]ZW[YYXXZYWZ[ZYWXVU[]]]``bbxKWW\XW]\\]ZW\]_`bdbba]`Xbcb`cac^\]\XW[]_]`_][`d\\XZbecaR\YOXWY[ZYWZY`^abb`ac_\b]_][_^YYUX]]_`__[Z^^`bc\[W[]`bbcedgfegd\fhhifcab\cg`\iibhife`baca_`_]]\Y\YXWXYYW\[ZWWXPXZ]acffrkJYW]ZZ_]\^\X]\^_acbaa]b[bda_cbb]\[ZWXjq`\`_]\ac_^YYcedaT_ZQYW\]\[Z[[dacbc`bda`c^`\^__ZXV[_]\aa_][`abeb_]S\_`cddfegfefe_fgihgdd`[fg^ahhbhhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{zzz{||||||{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{zz{}}}}|||{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½±µ´´´´¸Q&+++*%b~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊ»À¿ÀÀ¿ÄI]}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyzz{xnoooppprrrrrrrwzyyzzz~||||||}wrssssry}}}~~}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwtvwz{x{xwvx{x{zy}yxxyxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{zzzzzyz|}}}}}}|{{{{{||||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy|{}z{}{wwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww||||}~|wxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywwwz|z{}~|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz}||||~{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{xzzy|xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~
~~~~~
~}}
~||}~
}~~
¢
~~~
}}}}
}}}
}}}~~~
~
~{z
~|}}}~|{|
~}}~~~~~}}~}}}
}|}~~~}|}}|z|
}}}~~}}}}zzz~~
~~~~~}}}~~~}}}}~}|zzz~~}~}}~
|}}~}~~}~}~}}~~}}}|{{{zzyz~~~~|~~~~}~~}|~~~~~
~|~~}~~~}~~~}}}}{{|zzyyy{~~~}~~~|~~~~}|~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}}{zzyyyy~~}|~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~
}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}|||||}|~{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~~~||||||{~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}~|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||~}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~{zy{}}x|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv~
~~}~~}~~~~|~~|}}|~~~~}|}}{}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxut
~~~~}~}}}~~~~}}}}|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~~~~}|~~~~}}z{{|||}|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}||}~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~|}||{|xx{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxry
}~~}|~}|~~~~}}|~~~~}|~~|}~}~~~
~~|{{||yw|ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqrpxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|{{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~
~||||x|yzyz|}|{||}}}||~{{|zzzupxwyvu|uv|
~
{~~}y|zzz}}|~z||}}|z{~~~}}||}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|}}}}~~~}}~~~}}}~}}~~|}
~
}}}||||~~}}{|}}}}}~~~}|~~~~~}}
~
~~|~~}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uy~
}y|~{
}}~}~}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~}~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~~}}|}~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~|~}}~~|}||~~|}}||}|||~z{{|~
{{~~|||}}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}~{
~{}}}~~~~~}}{|{zyzzyz{|yzz{{{|z{{{{}~}}}}||}}|
~|~~
}~~~~{||}}}|~~}}~{~{{zyzzyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}}~~|~~|~||~}|}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFK=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÙ××××××ר×Ö××Ö×ÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´ º¸¸¸¸¸¸¸¸¸¸¸¹°½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤ZUVVVVVVVVVVVRy§£££££££££££¥SRSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥_YZZZZZZZZZZZW|¨¤¤¤¤¤¤¤¤¤¤¤¦WWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª£hdeeeeeeeeddda¬©©©©©©©©©©©«babbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÏÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌÌÌÌËÎÒÒÒÒÒÒÒÒÒÒÒÒÒÐÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÐÔÒÏÏÎÐÓÐÎÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××Ö×××××ÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÖÖ××ÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÏÊ¥ÑÏÒ¹¾ÔÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏϪ¬ÕÀ°±¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐËΣ Ã}~¯°ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@B:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѽȻºÔÒÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÒ ¾ ÒÓÀ ÐÏÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏӳľ©¯¡¹×¯¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÑΡ¬ ©Ø£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑËÚ¨ ¦Å¢ÑÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:979;::;8@?:<<9<>=;;:?9?:;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ¥¯Ç¡ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;547<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡Ê»¡¦§Ï¦«¤Å´¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓ¶Ö˧׹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÒºÄÕÑÔ˽ÕÒÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÕÔÒÒÒÓÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;9889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEEC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjcmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µ¶¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>F@BC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXO[\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUUbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¤©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¦¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦®¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯ªª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocniib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶¯³°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨¨«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__amhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µ¶¼¼¾¼¼¾Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÂù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndomhqxnyjia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÃÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrwsxfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÊÆÄÃÃÁľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijg]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÉÈÈÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬§ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÇÁÊÊÈÆÌÊÍÅÆÅÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieuosb]bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÂÿ¿¾ÄËÈÊËÈ»ºÈÇÉÍÈÃÈÉÉÅÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegdjeajmno^Y\VVNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÂ¹»Ã¹¸¹»½ÁÇÁÄÈÆÇÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfcZZZ\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶¸´´µ¿»½À¹¾ºº´À¸µ·²®º¼¶ÇԹ˾Á»¿Á¼»Ä¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjgfiei]VVTYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¹¿¼¼·´·¯®·µ·ÓÀÔ»¿¼»ÃµºÇ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekhXXNKKKRILHC9=8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼·»½ÁĹ··¶µ¹¹¹ºÒ´¸Ã¾Ƿ¹¸·µ¸º´¸³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤¯°¸»²½¾»Ä¶µ¸¶¸ÀÀŻͨÂËÉÆÏÂÀ¸®µµ¼¾¸º²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnxcgb[cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?>??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼««£±¹½¾²º¾¼Å¸±¸¸¶Ã¹¿ÃĹÊÌÎÑÌÊĵºÀÃÈ¿¾µ¿Á¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÀ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`aNHM?E@?DC<;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Â½ÍĽ»Ä¿¹±z
®ÆÉÈÌËÍÊÆÂÄËμ¹½¹¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA??ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸µ¼¶º¼ÆÈÛµ¿¼°jqqXbfx¨ÁÆÂÇËÈÁÃÁÀÉÊÂÀ»º°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^\YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»¼½ºÒ²Áɶ´tyhb~i[Z\p©»Á½¾ÆÀ¹À¼¾ÅĽ½¹²°®¸·¿ÃÇÃļ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni[_`YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·Ð¶¦Æ¶gRnnOsw^Y~±¹·¸·Âº³»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_e]ZTJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿¶É´±¡gXUpS]zMhµ¶²²·¾¹²µ²¼¹¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvql^b`[]OHA>=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»Æ²
XSgfRWW©~XZ§Ã¹³°¶ºµ´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc\fX\]RNMA>IBAJI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º¯¼³¸º·»Ï¹rRe|fTbm¥½cSv»¶±´µ²´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFNF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹º¶¹»µµ³µ¹Ç¾ dRrzyrupum¢Á¸³´³°±°¹¸¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£¤£¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²²À¾¬V^Äfuuv~}¯¿¸±¬³¯®¬®¶¶²´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¦¢£¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGOMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬ª§½Éµ¤Vd
~itlgcfkuqp®³³ª²´®ª«¯°²³®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¥©±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMJHGNRNJNG<E@=2?759;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¢´ÏÀ¬]xuxtdiYPOSRWW`w©µ®¯³µª¦¬«¢ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dyy`bRU`IIJKSTIRPL9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥©ÍÍozvtcSMTHPIPMLUdgµ°°°¸¬¦¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´©±¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNNTLSLA7>B68=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¤Ê°hjksbRSU
ujSOJJQVYc§¯¬¯§¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸¬²´¤ ¥¬¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HRUHFUVJBLG=KH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¡¬xnk`TLXzª° lRHEGLQV«ªª©¤¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼¶½³³µ¢¬¢©¨²©«¨§¨ª§§ §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BWNJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦¤ m`UPQ[¢ÝàÃp[KD@Da°©ª¥¡¢
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã»·³©³ª³´¯³®ª®£«§¶²¬¢°¦¡£¯±°¤¥¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{tqkkurphW[QETHDIOH>EA4FH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ sbWSTYm³Üư«¬mU[¬°¦££¡ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ¾ÇÆÂ·ÃÉÉÂÁƾº´ºº´»·°µ²ªº²®»·¿ººª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}yqkdhoxjdZ[FKLEDSLDBE7:?;549978>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ²²¸§¡¡«ª¡¡¡_SQUYnµÅ³ØÊ¬£°¬ wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÍÓÐÓÓÌÊÂÅÆÆÊÈοÈÑÌÇÅÇÅÁ¼ÃÁ¾¿¾µ¾³¿¿ÂÃÇÄÇÄ®¾¸²¸¼ÃÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
xtsebgrof^ZYCNLCEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¤¨¬ª £|SJORg¢¶²¥Ì»±¬£yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÒ×Ñ×ÒÔÖÓÓÈÌÇÌÍÉÒÍÎÓÍÅÈÉÊÁÆËÇÈÉÆ¿Ã³³ÈÄËÊËÎÅÊ¿¾¿½ÁÇÄÌÌÈɿÿ¯³¨¢ª£¦©¬¤¥¦
zrtvhcgvidVWQDMF@IQB=B<:22@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢¡¥qNEMUwÅÊ®£±©¢ ¤ |wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÑÉÒÕÖÙÕ×ÓÖØÎÒÉÏÑÌÎÐÌÒÏ¿ÈÇÊÃÌÌÌÎÏÅÆÇ¶¿Ê¿ÑÍËÏÅÉÈ¿ÃÃÈÎÌÏÐÏÍÊÇ͸·»¨¥«§£ª¥©¨¨|xsvoc`erb]R\IJGAEHI>;A8=4585;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥¡¬xMIN^·ÛÕ¸ª ¡wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÐÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÇÐØ×ØÑØÒ×ÙÕÖÌÏÏÉÍÒËÎÐÀÆÂÇÅÎÍÑÑÑÈËÍÀÊÌÅÓÎÌÎÈÄÉÆÆÈÌÊÓÓÑÕÏÒÌÓÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCRM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎп¼Ìɶ¾®¦ª¨¢£³[em·×Ư¦ }qecc__a__a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÆÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÎÄÉÏÌÊÌÀÉ¿ÇÉÍÎÏËÐÍÎËÎÎÇËÐÐÊÎÊÂÉÆÉÌÊËÑÒÌÓÑÑÏÐʽȹ°®»¸µª¶°¨¸³¿»±
zuopnkadnpaW\ZIFFDMWE;@=33<=87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ°©¬©£³x§ÎÔ³k^^^adb``aa``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÕÊ¿ÉÁÅÌÂÈÉÂÌÃÅÈÊÊÏÊÍÌÐÍÓËÆÈÏÌÈÇËÄÆÁÅÊÌÍÏÑÆÐÎÍÍÌÏÅÇÀ¸¹½Ãýù³²¾±»Ãĵª¥¢
yprkmg``phXXhVLFLIPPB;C>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÄÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ¯´¨ «£¸Ô¬|eabb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÏÎÌÔÊÇËÎÏÇÇÏÒËÐÏźĿÆÉ½ÂÇÉÎÅÂÈÀÇÍÈÄÌÊËÏÈÄÄÐÈÆÂÆÈľÀÇÌÌËÎÂËËÈÇÌÐÄÅÇ»ÇÃÉÈÂÏÁ½¼¿°ÁÉǹ½ª°²§¥¢£wotdk`^fpa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓȶ»»£µhÄ®~
s`[^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÁÂËÐÄËÈ¿¹Á»ÆÇ¾¿ÆÏËÿûÉÇÈ»ÈÆÅÊÀ½ÂËÆÅľż¼ÀÃÅÌÅÅ»ÀÊÂÅÇÒÄÀÈ¿ÊÉÆÈÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {vstfiZanlZ[XRDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÃ¾±¯¹b~¶z
vxurp_[[]``bcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁľ½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅÿ¼ÁÍÃÆ½½µÁ½Ãº½Æ»Âº³¼ÅÄÁ¶¿µµ½¿»ÌüµºÈº¿¾ËÃÁÅÂÆÉÆÈÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½³·°²§¨¨¹°¥°ª¬yvwjdg`hocV^YJFJFHJAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÅÂÄÈÎÑÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÁ¹Å½«¬®oev
y~|ttc[\]^``bcabeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸µ·´³³´º´½±·°µ¯²»Â¼Áļ¿ºµ³º¾À¸Ç¹´»¶Á¼¸½ÆÁûµ®²¶º¿´Ä·»µ«¸½½¿½±º¶¯¶º³Å¼·®»¿µ·´Å¼¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÇË¿ÏÊÇÃÆÂ÷ý½¶¹¾Ç¿¬µºµ·¶ytxfgebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÍÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÏÍÒÏÍÅÇÁÅÀ¾¹¸É¶ª¯£eiu{x~wx}ti^]]]_`_`da^cec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¸¸µ°«¬§¢ª§«³©«©´®¶°²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°À±¾¼»¶»Ç¹Â¶ª¨°±À¶¸½¯°§²³´»¼«µ¦®µ¯»²°©¹°»®»¸»À¿½¹Â¿ÇÃÅÁ¼ÆÁÇ˸ÅÇÅ¿ÆÃÃºÄÆÂ»ÆÉÌ˳¹Â¼»³svvkiablhYWW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÏÇÍÁÃÆ¿ÄÄÃÃÊÁÉʾÀ¼Áº²´µÄ¯ª¯al{x~z{wn^]\]]_`^_dcbccb`_][[ZZ]ZZZZ\dnohfgiknr¹°µ®¦¥§§ ¤ ¥«®£§¢«ª¬ª°£¦ªµ¶±½¹¯·¯©®·´´¼¸´¼¯·¹µ²»Á²À®¥©¢«±²³¨½ª«¨«¬´³¦¨¡¤¯©²¦§¨®¥¨·¬±²·ºº»²¼½¿¾Ä¿µÂÀÇÈ·¿ÀÄ·Ä¿»¿Ä¾ÄÈÌÊ¿¾ÃÀÀ©strji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁ˾»É¶½Ã¾¹Ê·ÁÃÁ´¶¼¶±¯µ¼®¨©eo{~~xt|swe_]\\^_`^_ccab``_^]\ZXZ[[YXZ\_fkfegeikor
ª¥¬¥ ¢¥¤¡£ª¤¢¥¥§¥ ¤¦¬²¯¶·§°«¨ª´ª´º±¶µ®¶¹±¯ºº±¶¤ ¤¦±§«¨¹ª¤§¨¨§² §¦¤¦¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹¹Ã³À½¿µ¸»½¾¼ÂÇÄÂþÀÄ xpkaf_ko`TY^HNgOTGEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½µ ¡¦º¶«³³»³ÄÏÉËÂÆ¸·ÇÁÌ¿¸É·»Å¸³Ä·³¿À¬¶¼²¬¥¯´ ¢lx
|yusomkjiqi^`]\\\^__acb````]\[\\XYXXXVX[^_dcbegggjmo© ¡¢¡£§£¥¢¨¢«°¬±¶£©ª©¬¬¤´¹·°¬³µ®²µ®°ª¤¢²¤¦©¸¢¦¦¨¬ª ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«³³¹³½´¶±±µ´¿¶½À½ÃÁ»»½{sk_e^ddXTW]IW\KPGIIFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÄÃϾ¹Ç¸·¾·²Á´±»»¬ºº±¢©«§q
xrnpnkb^bff\]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bdeeffhikr§¢¢¢¨¥¦¢¦ ®®®² ¥¢«§¡µ±²²¬¨¯²§º³¦µ ¢£¢£¢©µª¢£¦¦¦£ ¬¡«§£¤¦«³³ª´°²ª²¹´¯©¯²²³·³®©¬®²¸°º¶¹½¿·³±
yue^e^[YVSZUK[QKIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿²¥£¥±Âµ¶½´¸ÂÌÈÆÀŶÁ¿ÇηÀĽ³¹¹²¿¶±¸º²µ¯£ª¡yxoqtqhfdhec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¢ ¡¡¢©¤©«§¯°ª£¤¸© ®¨¶ª¦§°¤·°¤· ¢ª¦ ¬¸°¢¡¤¢¡©©£¡£ªª°¨´«ª¦²°¥ª®²±°¯®¯¦§§²®±´¯¼´¹·®£yud^aVYWSRTKM^LOKGGLLE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸½®§§£ª»À½À¹®´¸ÁÌÇÅÂýŷÈ̲ÁÂÁ¼»µ»¼µ¹¹°°±ª¡©|wqilrtphhedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[bcbbcbcdfj ¡ ¦¥¤¦§¦ ª¯¦¢¤·¨¡¡¢¨´¢¥¨¥°¥°«´ ª¡¡±±¢£¡¦§¡¢£¥¥«¤¥°§¥£««¦¨®¯®«¨ª©³¥¦¬¯´±®¼µ±¯® zvrda\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»±¸¬¥§·»¼Áź±¹µÄÉÉÀÃÆÆÇ¶ÆÄ³Â¿Å«··½¶½»»¶³¨£s~vncafihfhjgjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVURTRU``_`a_`acdi¤ ¥¡¦¤¤££¢ª«¥¥±ª ¥«§¢¬©©¬¡¢¢£«©°¢¡¢¤ ¡ ¡¤¦£«¥¢¤ª¤«®¥²©¦¥¦¦´¦©¨³µ´¹º¯©¬rpo`[WVURGQOHZ[ORITKSLEFIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´´»²°«²¨§¯¹¹³ÀȺµÀ¯ÅÈ̺ÁÊÌȵɼ±½Äɬ±¸Âµ¼Á¼´µ«¬¦r{tiijlgjkmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]]^^__bdm£ ¨©«¨¬§¨¥£¤®¤¥¯© ®«³ ¥¦¢£¡©©¡ ¡ ££¡£¡¡¨£¢¨« «¯£·¥££¢¬ª¨«¯²·²½µ³«¯ssh[XXRUQEXLQ[XMTNPLPQINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³¨³¶®©§¯®©¨¬·¶¬¼Ê»¶¿¬ËÆÅ¸ÁÎÏȳĺ·»Ãȱ¬¸¿·¼¾»´·§ª
ytvwnmhmnmpggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUSSNPQYZZZ]\\^_`d~¢ «ª¦®¬¨¯£¨¬¡¤¨§®¨ª¥ §ª¥ ¡£¡¢¥¥§¨¨ ±°¦±¼§£¬´«®§°µ°¹µÀ±±«}qrbVSVNRIFVPRQLLWMJLNRGMJACFDC>@65889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¦±·ª¦¢°«ª§©²±¥¶Æ´¹º³ÊŹºÁËÐ˱¶·¼¾Áñ°²¸´´»´¶¥¤~vkglnqnqjpkdege^ZYZYZZZZZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv© ª¦¥«§ ¥£
££¢¤§ ¢¢¦¤¦¨¦¡´²¨²·¡¢·¬ª¤²²¥µ¼µ««±£xrm]NQQLOCMNNPKFNNJJNMQIMJAGLHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12876:999984988A7w¶§¤¶±¥§£©¥ ¨¥¤³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³¬¹½´·À¯©±¦®º°°¡zm__frpvqinieghj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXYX[]aosvq
¡£¡£¥¢s~{¢
~~ty¢£ ¡££¢´¯¬¯¬¥¸¦¦±¡±®°»ª©¯ªvrbUMROPMCSNLQMBPQHINRMHJJCJLFKK<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-11764789::65:87A7x·¡£´©¦¥¨£¦¥¦¦¦³§¦´Á¸¯´°ÉÄ·¹ÁΞ³¬ºÁ«Ã¨¢§¦·®¥¢}w}eWV_gfighncjhgb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo|s
yz
}xqo
}¡ §¯©¨¨³¢¦®¬«§´¢©£~rm_[NSRVLDTJPMLFNOIELQMKOJIMOFII<7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©§£©°¨§´Á¹°µ°Ç·³½Ï¿¹¯®µÂ§ªÅ©£±¤|su]QLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tPB@}
y`JQnx}
n~wuuwpQ{~xvhw~¤£¨©¥¤°ª¡¤¤¦ª¡©¢¦¨ule^[HQQRMIUMSILKOIHFJNLMTKQPOFIC<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶¢§¢¯¡§¨¥§¨¯ªµ¼¶¸·³Á»¶§¹È¸¶¨¨µ¶ª²¼¦©}wqnXMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut|
{vxsnuptz~«
yzhv{prmxxz{vrrwgu{{© ©¥§¤ ¤rh`\\JVORGJXROJLMRJJJLPHLQLRTLEHA<77;99>=:;<98@?::>=7==79937795675252572/2.,//200/-+(().1272198798775:<;7v®£¡´©¯©¥¬°±ª½´²»¸¶º´±·º²ª¬©¨²¯¡xz}wppiXKHHHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u}ygw}hyvx}r|w{ok~}s{}tfv|lohs|lyq}pmuqiq~pC
wwz
}{u~£¢¥vnmebZWWTQJSUTOPNPVKNKNOJQNHNOKEC<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©°¯±«¼¸¬»¾¹³¬§°§¬¥©¤
zxrovqlnkXKFGEA@CDILLMQRPQSUTTUVVWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNOQTX^eprm§ªÀ~uyc|xo|yz}omytxjjq~Inhw~licly
ksl|nr{impsz}~{vots
yxp|~mhmnnWUWTRQYORTTSXUMNHNJMNJCHNGE?:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¥°¢¬ª¨µ¯®¬´¿ª»Â¿¦¢¤¡¡szvpvmqmflkYNEFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZRY\`§bitzepmzvtlts|jkMy
g1vsl~~tfet~
filukq|gqq{n{s}|qpnum~wyujyyvjjngdWQZWYY[MPUVYXNIHEJJHFBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226,+5775478iO8;5n¤¨®²¦º¯«²°Â±»ÃÇ
yqt{qsqopfqg_TFIC?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ r|xl}mr
zyr sxsu5q¨¡¡¢
vp||sgfbjnrmpuioXupwl{}mqmpzsuncv~
ux~~zqpok_Z\][YX`^RN[ZXWLHJEJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µª®±®Á²»ÁÆ}n
ul|uxxmwnwdi^IPG>@7448;;<=>@BEHLLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|~
~v¢y~
aªzw~sz]dqtz{wlgjbyo
znwtzpszwkni^w}|
}q|uw{}uorsef_[[]S[f^WQUX[UGJJDKG?F@DC>AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡}}p~zhvkRWL@E211267688:<>BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z}~v¡¥¬©H®¯¯¨sm|}hghx~n
q
Gkwqyvhmk_v}
zzuv|wmow~srqjZ]\[ccXfe[UOPVYPDLKFNICFCCA@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¡¬¡¦¸¯³¼³}tp~}}~¤
x~sx_cVKB60./23123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¥»±§»Çè¡¥{rv
jhouqw{v
}nvug¡«¡{zzogkx~x}qjc]ZZ]i\af_YOKNWRQIPJDNGCKDCADCA<:87=<:<:88778:==8<=68656623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupfx{¤¡¬¦«¯°¡xw|lpj]BA4--//./02234779;=?BDHJOQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¢
lpuvql
r¡¥µ©¢}kjk|ra\b^Yfj\kk^WKGOSQNMLFIPCDNFBCEGB>997=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªge¤~y}
xxgMR>/..,/.-/000212457;?CFNPRTPQRSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©¡§¢wz~¡{v«³ }¤¢¦¶°¨lss|~zpg`[_^afc`gg\QEJKPOIJLFFMCHLFFCBGD@:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Ppu`n}aw}|ªªBD}x{
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=GG@A@8662<9;FHGIIMOQYmw£§ª´½¸¥®¬¬§¨´¬°·²²»±³¾³Ä¬»É˸Ŀ¸¥£°²¬«¤
¦¦ ¢¦¢ª¨¤
£¡ ª ¤©±£§·» £°££¤¢«¯³µ¢¥ªz{~}f_g[da]cc^ff^[OCIHTOFHLFJGEFHAKFCFFA:87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXzv
ÚÈsV|z
qna@E64<2/110-,+-1/-4?DAMUQRSUUWUN[PGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇë³Å¶¬³À³¹¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´±±§¯ª¤v¤¡«±³ª¨®µ»²º¬¯µ¢±¬±µ¼·µ®µ §¨£¨©°²º¸¸§·©¥ ytX`cUea`b_`e_ZUJDELUQHJJDIGEA@@KDAMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL[ZQcdWzuq}
v
~{¿»£¼´y
zxn]V@EM<6:46AB764//6CHCQ[OQUWU\WP_UIKJA@?GKFED;>@7D7?BJJEGWTP^¥£±´Ã¶¸ÁÌɶ»Ä½³³À·¸Âµ¿°¸t²´¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥±¥¬§¤ ¬³º¢©²ºµ»¾Ì¿Å޽³Â·º¸¿·º·¹¬°¦±ª¾°½»Â¬º¨®ª~{jVa`WidhdVZcYVTIGGLQGCHIAHD>?BBK@@LC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FQLALRWTYUZwjp
nzryb¸¡£{z||}wyueO\dGEL:Qda[^SF>;HPDZdQQYXYgZT``MSOEA?IJHEFA@C=E6B>HGKLSZT]¯¸µº¹ÉÀ»½ÉÌ»½À»·µ¼»·¾µº²Æ`u³¥±«½ª¥¨«ª£¢²µ¡«§®¥§§¥¤¢§°³§²²¼¶Á½ÓÉÊÓÆÂÅÌÂÊÃÀ¾½¿»¼·´°¹··ÃºÆ½Ãɰ¹ª¢¬¥¨·~q^a`\Va^geRXaVRUIEENKA>GD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTSQPOQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]hllq
slsrsÕÀµ }xz{yt}zkepuY]\Peeb`ed][XW\MdmURmm^o_XgeUYTJDAKKHFHHHHBI9D?HKTTV\Z[¹À¹½·ÆÀ»¹Ê˺¶º¶¸¹³¸µ´®¶¶du¨p^¢¬¡¢¤«¥¨¥¤¬¤ª°·°½¹ÔÐÏ×ÏÉÌÒÌÏÎÊÇ¿¿ÂʽÁ½ÂÀÅÄÅÊ¿ÈÏ´¤»°µ°¬¹½~xk\_[X]`YbbQ[`SQKCBEFE<@E>BHB@C=:E>=J?47535;=468977022/24169775555D3ELM>51/006:477@IOJ;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi_pnlouu³¬¡¡
~|s{|ts{xlmu{hreilifjih`fihmZmt¤¼g[oh]ZYTHJNPJKQLTQILAJGKP__bfia·Ç°¹³»¾¶²ÄǶ°¹±°»¬³±§ª·¬¶§§N ¦¥¡¦¬¯¨¯§³´ÔÔÔÖÑËÏÓÕÎÓÏÌÅÂÊпÊÉËÉÒÈÍÍÂÐÒ¸°Ä¼Äº¦¶»Ä¢mb[[]W_WYeYP\WNQCBHEBH;AD>AH??B7;D>@H=46655;:687654/10146278875367C5B8?-0,1348=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSeWshqoyy ª¦}
|p{r}qxulqx~q{mxslhpmcimpyiw}~Ë¿Âß§mcxnc[a`JPRUNY^P]]NQNTQUT\nnwr®¸¬´§°¶«½À±«µ¦¥¸§¬®¡¬´£±®¦«¬¤§¡¬¬ÎÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÎÒÓÓ×ÍÒÑÅÒÖÆÀÎÇÈ鿸Ðxmd\a\U^Q]ZNOSPNH>AFBBE<@B?EE>??:===<JA45465<888664412/03526768533;=<E=@11+/349>5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[u
wmwp}~¡¡y
{r~z
u
ovsls||v|swqjrrioqzyr{¾Ë~±vrvhaj]CZZ[VfdXekTX]\`c]cx{ª¤¤¡ ¡©¦ª±¹ª¦´£¢¢£¢§±¦k¢
~¬
§°¡ ¤¤¨ÈÍÏÇÁËÐÓÑÔÓÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÉÔÚÍÉ×ÖÑÊÄÃËqnb__WRXR[OJGIIJ@;:;EBD<BD>HB?BB;;9<:GB46544<5687543250/2546745544<>=E?A62/-15;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu}hsyr
w~xs{}w{nwpmuvx}s
|ylvto}vuy{µ<AÆ¥~|ieVICecfchjdoy[_fhknin ££¦²¤¤³ ¢¥¡© ¢±~
z~©£}«³§§½ÃƸ¶ÆÍÒÐÒÐËÒËÉÔÏÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÌ´vumc\YRUPYUEFJIEE=:79@AC:GE@ECADA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTVOQJAJF?1*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopaqqs|~
|x
zyqz{uz
zp|opzq|qnzuw}|u|°tX©Â¶pnb=^hrpqpnxweioruxr{ ª¡¢¥¬
}
~my
{®ª¦®µ¼¨½ÆËÈÉËËÏÈÄÒÊÔ֨ר×ÔÛ×ÓÙÛÖÏÛÚÑÖÈÕÌxzhgZYORS]HBEII>A>=7:=?;>H=@AAADA>>:87DB755479.566435532323647553457EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqy~
||~wyn{{tz¡vutu}toot|
zv{·Æ¤ÂÉ·xpeNeczw¢yyw{|vm¦ £«
{|¡¼¡¨¦¥®§µ¾ÀÀ¹ÇÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆ
yxehc_RVVUMKDMC;==<9:<>9>A6>?@<?><9867CA6455=80665547745613854564557HH=DJE7925;H>;::7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yea][htzylwvz|~}
z~
z
{u}tn|}~t|}x}ynt
~
|~z©Ã »£}}r~s¦
{hGq¡¤
¡~¦
¤¸¡§ £®¶ºµ«¿ÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Ü·wwviidV_ZSONHDLB==>99::99<=6@>><=9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqrx{{}|z|{~uyszsm~}w n¨
z |~£¢£®
Wr¬[¢£¢
¤
³¡¡§±¸¬¥¼ÁÇÍÇÆÏÌÏÌÏ×ÏÑÔ®ÖÕØÚÙÚÚ×ÖÙÙn{sfe[\WRVWC@ID>?>:48:;7:;:3;;?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxlb~nmwxy~z}|{vsp
{vvut
}~¦£¥¢¨r²¦¢ ¡¨¯n·ÄȲ¢¥²c¤ÍÈ
ª¤£
¤¨¡¢²´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎq~gb]]\NITYABGD;A=837;<:8=649:<:82?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFv}|m~xz~z~vv|lnz|xx|~£³§£ª³¡§¥£®¡¸²¡¡¤¯£¤§§¬¯¤ À£É¹«£¦²
¨¢
t²¤¡} ±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ¦ÎÍÓÒÐÖØÓÐØºqxu\_T_UOHJNDBCE5>:77:?;<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGN[\YJf`;Hz{n
z|x
~px|~}orz}|x§»¬¨²½¯¤²³¨£¢°¬µ¢¸¤¤©·¦¤£©©£¯°© »»®Ê¡j¶¸«°£«½£^ª²|}´«¡¡ ¥¯¨¡¤³¸«ÂÈĵº½»ÅÇÇÂÑ ÆÉÍÍÄ×ÖÑËÔ¡oyg[YS^PNEC><CAA8?875?F<<5<35355454B39:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdGb`bpJ@s}um}}|pww{ªÂÀ¯½Æ»³³À¼³¬«³¶§²½ª»¤¨¹¸«¦¦¡¢££¨¯²±ª¤¢¦¥¤º®©À¼²¹¦¤¨~½°z¨±¬ £¬ ¡§¦¤¢¤°³§ÁÆÃ¯°º¶ÅÄ¿ͦÇÄÇüÕÑÍÄÊrr`ZY^ZLJBK@FG>A?B;:4>A<=5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GE?CF\eG`igZ]\{uo~{q~zz§³ÆÉ¿ÂÌÁùǼº¯«¹º²¶º²À®¥À¤«¯»¼ª«££§ª®´°ª ª¡°´§£ºº¶Á¼¬¨²¥¤¨
©ÄĤz¡¦ ®ª¡ ²¡¤ ¥£¦¦¤¯®¥¿Ä®¨·µÉþ¶Ï²Ä¿Ä¼³ÑÉȵswk[W[iQLHCLJKJAA=CD<5AD;:3=8B332262A05IEM>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBfZNe\fTcjyr{xz¡¨º½ÇÈÉÁÒÉÊÂ̼Á²»¾§º¿¾¼Ä·¬Á©¬³»¾ª°©¤¥£«³¶µ ®¥¢£³½©¨½Á£··°«±¬«¬©§¥¥vz
££©¥|£ ¢µ¥¤£¢¥¦¤£¨§¢²¬¨¼À沈·ÌÀ¹¯Ä³»¾Â¸ÂÃÂÀlx`WVZZJKMJFDDHBBADL:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddV x
¡®¦£Â¾ÇÃÇÅÓÍÎÍË»Á·°¹¼³¼Ë¼ÃÁµ¶»³¿¹¼®¯¨ ¨§¶©²·¬¢§¡«·¸©¤°¿Ä±¾¹³§ªµ³®¥¬¨ ±Å§}}ª¥¡£¢Z¤e£²¤¡¬¬ª§¦ £¨¥¶«©¹»Ã´¥³µËÀ¸ª¶¬²º¸®¨·º½¸kmYVTTMEJSNK?AHEDHGG95FM;>7=@J.32025B55PVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;=@BFBqFiIRebLF¥¡©¦¢¯¾®¡Æ¼ÅÄÆÆÎÎÎÒʾ»¶±º»»¾Ï¶Ä½¸¸·²±µ³¸³«¦««¹ª¨§¯¯£®¤§¤¤µÀ°«¬´¿ÃºÀº³§¹µ¸³¯¥®®¥¡tÁ}
±¥£©¡ `J¥T°®¤¯®«¥ ¥¦¢´©ª³¼»»ª°²Ç¿¹¦¬«±±£¡±²´¤ole[YNOKEOPPQ;GJHGICC>:KU?A:=EM07544:B34NWO<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯§
¡£¤µÈ´©ÆºÂÃÇÊÈÇÌÍÆ¾»³®¹¸ÀÁ̵ǺÁ¸µº°¯¯³´¦£ª´´©©¦¬¤¥¤¨¬º¿¨«¶·¾Á¿¾¹³²Ä²¹½¬£®µ¬¹¦¦v¿¯¡¡©§ ª¡§nv¢¢®²¢ª¨ªª££¥¨¢±§©«º¶½³²¾¹· £§¨¥§¬©©bd_^QJLFHNIUL=MDNJKBCD<QU=AABDO18=77?B75UXN?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=..R`MUHe^HE«¡º¯««¢£££¶Æ½´ÁºÂÁÆÈÅÂÍÈÁ½¹²¯¸´ÀÂʵűÁ¼´ºª¨¬°¢£ª´»¥¨¦«ª¨¯§£ªª¾¼§¼´¸½Ç¼·µ·Á±¾À´©µ·«¿¥¢¢ ¼ ·©¥¢¡¨¥³¡¥¨ª¤¢¢ ´¯¥¤¯««ª¤£¨©¤¡¡´´ºµ¨µ²³¢¥ª¡v^[_]JHEFMQIMEFGBRLJBEG@VRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C?5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-1:g\FCCpbGE§¤Ã¥©ª§¦¡«¶Ä»¾·ÀÂÀÇÄ¾ÍÆ»½¹²¯¸³¿Âȵ¿¯»¶¸¶¦¤ª« «ªÄ¢¤¨«¦«¯¬¡¨¨¿·¦¾±¸¶Ç¶µ¹¸¿²¿Á·´³´¯¾££® ¢¢¥££½¤©¨« ¦½¢£¢©«¡¤ µ¬¥±§®¦© ¥¤«±µ±ª¥ª¬ ¨gbX`]NHGJNKHEDIA>PH@<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUH@8QQPM:G@4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ:nRF<KxebVL¢£Å¬¡¬® £¥¦©«¶±£ª³µÄĽ¿¶¿Â»È¾Êȶ¸µµ°³³·Áƶ¾°¸´¸µ¦¬ª«¥¤Á¤©¤©¬¯¢¦§½µ¥±¼¹·¶Ã²³·¹¿²ÄÀ¸¸®³µµ£¥¡® ¢©¨«£Â©¬¦¡½¡¤««¬¦¡W¦¡ ¸ª¦µ£± ®¢¤¦®²«©¡¢¥¥¤`dYc`KHJJNEEAFJ>=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrHE6=ue\KN¡Ã¨¥¢´¢²¨«¤ £©¬»°¨¬µ±ÈÅÁ³ÂüÆÃ¼Äʼ¯°¶°´¯¿Ä´¹±°¹´¬¨°©©¥¡§Â¬¬°©£°©¤§½¶¦·»½¯·Ã³²ÂÀ²Ç³º·¬´¶®ª¢¦¤¬¢¨«°¯¯»²¦ ©¨¢¤¸ ¡¤¯¯¬¥§¡¢§³¦¦³£®¡¡¦¬°¥¦¡
`eZgeJILJRBC@IG;;G?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 褪²¡£´ª³¬§¢¤²¬®©»²¬°´´ÆÀÄõ¿Ä½ÉĵÀÈÁ´«µ¨¯¸¬¿Ã³·®¬¶¹¥«±«ª¦»´§°´²§ª¹²¨º³·²¹Àª·±Ã½´Æ§¾¯·µ©¨«¡¦¥¢¢¥¯¸®²µ¶ ¨¤¤ ·¢¤¥¯±²§ª¦¡¨¡¯²¢¦®¤ª¤©©ª¡§
xch\jjMPMNT=CANC::I?77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05IphVCWFyfC;¤£¡¦¿¦¨¯¯¡©´«¹°«£ª´¶±°¹·°·¸¸Ä½Ãǽ¼ÄÁÆÀ¸ÀÆÀº©¶¤¬»¬À··©¬±º¢°²¥§ª¹© ¦°ª ¯´³ª©¶¶»¬³³º·¬¸°Ãº¾¿¦Ã«°·®©««§«¢¢ ¡±¯³«°¹© ¦¡·©¥£¢°±´«²¨« ¥¡£³°¥¨¢¨¨¦£}
jhl`lnWPQZTACET@;;HA7:XPd^PVWDY^]MLRN^KJ>Zc^NHPN[UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251.-.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}h[V;{cC=§¢©½¡«°«£±¸ª¥µ³¬ µ¼®³¸¼º½¶¶À¿ÈĹÄÁ¿¿¸Ä½À·¯¶§«·±»¾¿´¨®±¶«¨§¨§»¤¬³«¢°°³«©µ´µ½¯±µ¬°´±ÁºÅ·«¼¯±¸¬ª£±¦¤©¤³ª³ªª³§ ¦¤´®§¡¬®±§³±ª¤¨£¡¨µ©ª¦¥¢
{elrgoq^FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__aU150=`V^8)C3YT\gK6zfL@¤ ¤¬¶¤©¥®®¶ª¯µº§¦°·Å·±¶¾Á´´ºÅ¾ÌŹÂÀ¹¾¹Ã·À¹²´«©º¶º¹½´©°µ§«ª««««½«®±£« °³®¶²¹·ª®®²¨µ¯³»½Ê²ª¶µ±´¯®§¡³ ¨ ¥²£ ¦¯¡¤¢¥§²©¡¦²¬ª¶¥®±µ¯¤§«·¢¡«¥¢¡ z
{jmxmu{aE`jYIHYZ={JFD6AbTi[M\`J[]ZRSRbaLKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C_Q\.*B/JGP[H3cYTKD ±¨±ª¦¤¯®µ©·´¹¤¬³·Êº´ºº¿¾´³·ÃÀÌȼü¶½¿¿·¿¼±½§º¸·¶Á¶ª¬±·¦®«§£°ª¯»¤¬±²§¨£±´°±°µ±¸²©®«²§·¯µ´ÃŶ©µ¶¬°©¨£¶ §± ¤±§ ª©£¦¥¥·§¢±´¬§²§°¶¬¤ ¬¨©¸¢¥§£ v{
mpwt{~\Kel\KNc\>b{GI8GgWf\M^bMXYWTXTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'GbLV%-B.=ELQ<3rkJCC¥®¥®«§¤°²³ª·±· «µ¹É¸®À»Ã·²±µÂÂÎÅÀÁ½´¼¿¿º¾¼²Ä§©¸°¶¶¿¼®ª³² §°¦¥¯¥²µ¬«±±©¨´º¬´²µ¬´¬ª¬¨¬©¸±°Ç¿¸¥º°©¥¨°¦¤¤¯£©¯££¢£¬£ ¢ª¥¦¹¥¬µµ¤ª«¨¬¯¶®££¨ª ¤³¢ §v~
}||psq}|}\Sdn^NYf\FD[G;NmXb[L_bNVWVWTXg^QRLcZ[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HeHJ+:I?3BIS,>k<GHª«¢©±¤©¥³´²´µ²²¡«½Ìº®À»Ç±´¬´ÂÂÑÅÆ¾À²½À¼¿·»Ä§¬·¬³¸»¿¯ª± £§ª¨¤°£ª±ª¯¬°¯°¯«³»¦¶±²©²©«¦¥£º¬ª±Â¹µ¬º¨¨¨ª¨±¥©¤¢®ª¨¢£¬¥¬¢§©¢¬¦£¬¸±² ©¢ «¯±¬§§©£ §
¤~~
|w~
trquk_Y`ncQsq\K;|F>WtX`ZNc\NUVUWQ\b^SONhXWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*35>10485(5/*,.30;),,'%234$,2-860)(1<]J0.JgDF8<B05EKX1@Z>LE¨¡ª³ªª°µ¸µ®«¥ªª½É¼±½·Â¯±¬³ÄÃÎÎþ¿³ÀÂúÀ³Èë®·²¸¿¾²«¤§©°©§¨±¦´®ª°®±°´´»¤¸³¬¬®§« ¢¯·ªªº¶¥¶µ£ª§¬«ª¡¨¦¦±²¤¦¦¡¡¬ª¡ ¦¤¢ª¥¢§±·®£¥¢ª«©¡¥¤¤
£¢|zt}sv£xj^`nfWecN?gLEbyWbXReTMVUUTO\]aUKMiWUWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*49?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<C+:JO^4D>HFD°¥£ª±«ª¶«¶±«¥¬ª©¼ÀÀ¸¸³»µ¥²°ÄÉËÑ¿Á»¸¿¿Á¹Á¹Àıµ±³º¿½²°®««¨¶ª¦¯ª¹¯¨±±¯²¶ª··¦´·«¬¤©ª£³³¨¨¤´´ ¶ ª¨«¨«§ ««¨¹¶©ªªª¢© ¬©¡ ¤£¦£ª§µ®¨¦ª¢£¥¦§ª¢¤£~
¢tytzw~oqggpx\`skO^VHmxUdVRbOMUTUPOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX?C,>LT_/Jj6OD;°¡¦«®¬¥¯³µ¯«¥°ª©º¾¼À°®¸¡¶¯ÉÇÈÐÀ¾¼º¼Â½ºÃÀ¾¿®±²±µ¼ºÁ±±²«³¨¤µ©¥³³¹°£¶±°³º«¹¯©¶¬ª©¬¢ µ§¡¯²¢´ª¨§ª£ª¡¢¬¨½¯¬®¢¨¨ ¬°¡¢ §§¨ª°©£¢¡¢¢£§©¥}¤
xt|uxyztsyh£ui^ektg}SXp^JxsSdSQ^MMRYfNLVYdXFSiRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--6)(+-,42#2)',%.;.&1.0-14%,0Lg:38_=ad?F1CP[[*HM9UA4² ¤¦¬¤§¤¬§´²±ª¤±¨ª¸¾Á¼¯§¹ª¦®°ÉÇÈÑü¿¾¸¾¿¼É»À¸°¯´±º»·À²³»¬¸¬¢´§§¬²¶¹³§¨¼µ®¶½°½¦¬¬µ«©¯£¤«ª§ª²¤³¨ª§©£©£©§©½«´¯®©¤ ®³£¤¥¥¤©«¥ª¡¡¤©¨
~
~}
¡~r{y}|hw|ztpp|gxdagcq
zmfx]^VBWzmTaPRXKKNqu]HZ[gYEUfPD>JNDCA9HGKS?jbJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH0%90%,,09/,,+6'17#-0GjI14X=fcAJ7GS`U*=:DW>*± ©¥¥¡«¥·²²¦©±§¬¸Á½µ°£¹¨¨±ÃÉÉÍÁ¶½¿µ·¿¹È¶Ãµ³±µ±½·¹½µ¹µ¾¡³§ª«°µ¸´«½¼©³À³» ¯³µ©«°£¤¨ª£¤°¦° «©§¢ª¤¨ »§®°® «£¤®¦¡££ª£¤¤¡¦«{{~
£|yl}vxxc{{qpprwgsjgdg`msmaip`pA\xlU^OQQJJMTYWM]^lWDX`O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-78;2(09/,5..=-*K>*49&'.34.0+/3&,:$41BhY13S=e_DL6KVdO);2OX=#¬§¤£¨¤¸¯®£¯°ª«¸Âº³¸¯«¨´ºÈËÈ¿·Â¾¯´½·Ä¶Ã±®¹±³À´º½·©¹¸½«¤´¨©ª°®¹±ª»½¤°Àµµ¡®¶µ¦¦§±³ ¤¦§¡¥¬¨© ª®§ ¦£¨°¸£±® «¡¬¤¦§©£©¦ ¨¡©}~}|¡x
|
{sp}qst`yxinppnh}qczliec_e
_ZskrLL~hXZMPLJHPRPIN\_nSDWZRgOHLEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-6**<%53=fd24M?e]FO=RZgH*>/XW5(¦ ¡¤¡·«±¤³´ª¨¹Äµ³®·¬®°µÆÈÀ·¿Á¹°´¼·¿»¾¯«½¯´¿°¼Â¸©»º·§¨µ¨¨«°¬³°§¾·¥¼¶°°·°¨¥§¯± ¤ ¤¤¡¯¦¡¢§¯¡ ¢¤¤¢·¯¡¦±ª¬£¯ª¥©¥¦ª¥£¨¡
z~zx
~yzprwoot_ywdllkihmerjkdh[bs_ZlviZH}][XOOJHHRUF2:_^lPCWVYeMHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84GAf[HTCT]hE.;1_S,2£¡©¥¡£¡·ª¯ º¹¦¬½Ä³°¯¢´¯¬®¯´Äļ³¿º·°³¹¸º¸º®¿³´¸¯¿Á¸¬½º´¦¢³«¨©³«®±£Á¶¦©¶µª²»©¦¦¨°¬¢§¤¦¡²¥¤©©¢ ¥¤¹¨¤§¦¥¡¨©¡¡ ¢«¡£§¤
y|
|x
{w~{ltrllsaxuhgigenghhdfhj_gbifZezcaRsT[[SLIGIOS@!+j^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@K=>93)8><:9*6@3.E4(+,>0-N?.+-7,1195,&.5-80576`tB3CDg[KWGU`hB378bN'2¤£¤¦¤µ¬§ªº·¨¬ÃÀ·°¬¢´§¯¯·ÀÀ½±Á·±®±¶¶¸·µ¬ª¼³¯²±½À·®»»±¥¶¬¦¥´©«® 멦°³«¬´º¨ªª±¦ª§¤¦¢¤ª¡¢ §¶¥¯ª® ¡¡ ¦¡ ¦£§x
w{~{s~}fxokjlguskbgdctbdefeijchpY^X]ldaMhWZ`VIGHKMRX?9`liGBUS\[HHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A=-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3@dG%5¤ ® ¥´±¢±¾·¡±Æ»¹°±¢¶««®©¸½¼»À²¯®¶¯³¸³§«¹°®®´¶»¶¯¸½¬¦µ« ¡°¥«¯¥Ã¡³¥¯±¯·µ¯¬®£§ª¥¨¥¤£©¬°¥¹§¢¡£¥¡¨¬©¨¦{t
|ofymhkjgqrk\hdbr`dgjmlgjhfl\lmuqaTbhceYIFLMOXQPUaeT@VSYTFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24:6#3*)6.55465Z|]19Kj[M[KXdd@A1IdB'4¢±¡©²¯¸À¶ ´Á»½¹±¥¶¯©®¥·¹·¸¬»¯ª«·ª´¸¥³µ±®©±¶¶±²µº§©¶©ª¢ªªÁ®¥¯°¶µ¬¬±¯ª££¬¨§¤©£¥ £«ª©º¦¤ ¡k¢q¤v«¨ x
mi~wpl}o]d`gkuw~fhuifW\itnNPjdfqf^dfnli^]_
hOKD8ETg^JGPPUUKGS`oteE[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl16Ok[N\K[fb>G1Ob<+/¤± ª«£½Å¯©·Â¸½½§¶°¦«¤·´²³±¹ª§¬´¦°µ£§·¶µ¨§¬¶³®´³¢©´«¢¥§¨®½§¦¯³·¤¨®ª«¦¡ ¨§¡¦¦§§ §ª£´¯£¢££¡¡¡¥§«rx vif}sx o~|¡ {tvlmheczlqbTmcmiqXjpnW^i[kj[pmyriZ^FN>F^MFRVWQQRWTg^LYKRRPEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*/(-4583%&2115>1<8Xu25Rk[N\L\g_=K1V`7/(¦¬«ª¨ª¿Ã¯²¹¼·À¿ª¤·±ª¬¦³µ®¯³¶«©¥±¥µ³¬µ¶´¥§¨³±²¨¯ª¡³©¤£¢£¯¶¤¦¦¶¼¦¬§©ª¬§¦¢ §¤¦£¤¤©¢¢¥¦ ¶¤£ £®©£
±¤yÔ¨ÀÇyx±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«°xhkX±®oei¼¼nhzmqØ~Sjc¶²~qu¡ªWOWaOVNFT[XQPS\W[P@\EQNDFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww21Tk\O[M^g\>L1[\41!¥§ª¥²©±Â½²µ¿µ·¾Â«¦´©¨¯´ª¯¶³¨§¦µ¥§¸®²±µª¥¤§²®±¦ª§¤²¤¡¡ °£´¹¢©¨¡®¤¢¢© ¨¡§§§¡¦¢ °££
°kjª~geq¦q®¡¤~wº|k¡v±_j´[¥e`fzfjxj©e¾rg¦v±j|±xtcmm§m[ EigEu`}f{£§Y_«ixzj§7J¯[WTlcZKOW_\WV;NOWV/ITSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5_Y31¡¬§¥£¤ª±·´½¾°·Å²¸ºÂ§¨°¬¯©©±®¤°º¯¤¤®³£©¹©³³°£¥ ª°¬¯¦¨£¢±£®§¡´²¡ª¡ ¢ª¤¡¡§¤£ «¥¦ ¡
µµx
©µw³·©~k¦z
w«gj±[¬{tpx
°vwqkjl|N¤XHcc~ch¦`yruR^P©mcq}b.Q¢n[Tkg`LK\dX\ZB>°xWXA#MhFCDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFB@AD<FD;0201;F,0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_fW7J9aU50³¦¦¢®©§³¬ª»¶Â°¼Â¸·Áª¬®¯¦®²©¡¯»ª¡§µ£«µ¤¦³³§£¡§ª²¨°¨¥ ° ®£¤¨´®¡©©¨© ¥©£ ¢¥£¢ª¥¢ Õ¹p°Â~Æ|Ö»|¥¤z¢¥z¬yU¯{~j¹Z¹w}¦|zªy{±mt»
oO¯§ÅQ zc`ªbsrl_Sµ´È|c¤3Bv]QihdP@XfZdaJHMlKZSOYfZCC?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<9;DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[K\P_fT7G:aP72%¡±¨¨¥³ª¥´¨¥¼·Á°ºÀ±µµ¼³¶§±±£±³¦¯¶¨¨º®¢¯± ³´° £§©°©´©¥«¢«¨°¨£¬¢§¡¦¢¢¡¢¡¢¢§ ¦ § ²nhµq«p¦r´sr¶{¤¢~¤~°vÒÑu[®|
¤oª¦k
}}{±sx³et
nfRÈZÂ\yb_`vsb^YÊo¿uMKµSUÆdTQjceXAOj_liPUFI9=WR[WXHC?J<2?;5=<46>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\BNT_eP5G=aM62.¢¤¯¬¤ª»¦´¥¨¶»¼²»¿·¶´»»³¥´´¢²²£ ¬¯¤¦º®¤±°´¸© ¥¡ª¥±¨¬ª¥©£© ¦«°¥¢¬¥¡¤§ ¦§¢£ ¢¥¢
¬{w¨v£©o¨¢¢~®
³\r³R®}¤q×}w~w¯w´aelZ°XKuyf`^wwgj]¯wxl5yÈ®²_BTo]h`EOk_qmVUM/eciSYQ;AD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK96<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:77 ¸°³Á¨²§ª²º¸´¸¿º¸³¶½µ¥¸´ µ ©«§¶¬¨°±«´¤©¨¡µ§¦ª£¥¢£¦§¬¯¥¡©¢¢©¦¡¦©¤¬ ¡ §©}}¥y¡ªp§ ¡£ª|yo±Z¨ ytØvt§¤|{²^d }l\«[Zhgªcr{kq]¬Z kneOJC¡\ZMt]cfMZa_st_JU5JYHE=HFAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<PeeA&Uf[?1U_bL7FI_C1=7¡¾¬´Â®«©¦´°¸±µ¿ºº³±·¼©»µ ±¥¥§§ª±©¯ªµ¬ª®¡¡ ¦¤¤¹¢£«¡¢ ©°¯¦§¦¤¨«¨ª¨ ££ ¡¡ ¡«®mr´t©w¦s´yt³¤£¤u¸o{¢kk¶Z¡ei ¢§mr´t²jku³af¢nj\`M¡|Rs£ly~no\¯V<wfTon.[§ObRkeblZb\`q|cSYP>>mo3BB@?L9!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;<000/75,+,426/#00,,289/9N`eD'UdY>/U_aL5FM^91A8¥»¢²À®««§·©¸¯µÀµ¼±¯¹¸«Á·ª«¡§¤¢«ª§µ£²¨®ª¡¨ ¤«¹£¥£¡«¶¯§¬©¦¥¤«³¤ ¨«°¡¢¢ ¡©«Ô»t±ÄÃ}Õ¸x§y¢¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxmpm¤t½]w}[ay¼jZV[iy^i`dfbmxoY[YCA@r?CF+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-6@9¦¢¼¢±Â°©ª¬±§¸¯¶Ä±º²®»°®Á²¬¥£¤¡ª¤ª²¤µ§¤ª¦¬¹£®¡¦ £¯¹°«£§§¥¤¡¨« ©¤²¢¤¦¡¡¤° ª
µ¸xµwnlnsnyrÁ»¼z²¨pt¹|{|¤»¹½uy³£tvut°ufi¶trpw¶^y}gymyb¬pu
X[§jDdZTf_c]bPgfqmuBMPLD;ZL?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦ ¡¿¥³Â´¬ª§¬«©»®°Æ¯µ´¯¸§µ¸ª£¢¦ ¬¥ª¦µ¨¨ £¬¤¾¦¡ª¢¡¨¡²µ¶¤¤¢¦¥«©¥¦¢©§¦£¨ ¬£°©§¢j~i§xs~uze{½¾Àºnq
_rjZ]adk`cmvbke^`cqhr}fj~qsy}|b[wthP\n|{jXlyrIJo
pMtMEW\faL[Wfc^OZmvjrRODEN;HI<M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEJOHFPIIH;8=51:.0;:.0-76=5&"/*2,%;8-7IR_I'S_V4)P^L(3>[O'?2>¨¨¡Á£´º¶£¬¥®§¨µ²¬È¬°³¬µ£¾±²¦ £©£¬§®¤¥µª¤¢¦©¿¨©¦ ¥©¨°²¿¬§§¡ª¨¤¬ ££§¬¢ª¡¯¦°¥¢¨£¤§£hn|qv´©
¡ z¤
li||tqxyvv{jstudw}vkpzm`c[ohMXXej_WYpzonfSOFS9OZNRO(+;JB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;389,2;820)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¡¿¢¤±±· ©¥³§¥°µªÉ«±¦µ¦À¨´¡¥¥¤ «§¬££·¬ ª¦Á¬¤¢£§¨§²Ã¯««©« ¡¢¥¯¦¡¤§¬¦¡° ¢§ ¢£ {©¨
{
£~e¡³®vz}vyzogykuyrhtzvktcxf_hdcdfjXk{qjj\RLPD_UF@?>,4@F;45;>A;<?>>HNNOPSUVVXZ\_aca_^]]^]XVJKLBIOMRJ;<:786/2964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@´ ¹¯¾«±² ª¦²¢¬³°Å°ª¬£²¯¼¤´ §¢¡¨¦©¦¤¥³µ¯¦®¾ «£¡©
©¬¢³Ç³©¤ª§© ¤« ª®©¥¢ª¡¬ ¥¯¤¨¥©f|e~cxlhjz£«kd~g
eeihz¡kg¢wkj¢slnz
yXe]
^kv[hswwnxxsmytw{hX]jsd]sij|qlc]QNWIdX@J3=F7?FD71<=?AC;;DGHHILNPRRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[I.6ZO6)EY/DO1YC;?.=¥º¼¹¯«³°«¥¨®°§®®°½±©¨¤°° ¤¡¦«¬£¦¨©³®£¢¯¦¶¹¥®£¡ ¦{¥¬¢¨³Ã¸¥¢§¯£¤¤ª¨¡ ª¯©ª¢©§¦§ ¬¡¥°¤«¡¥«~¾r´r
hw¹Ä¸q¡£{¦sª|ËÀÀ»q¢|À½ÁÁ{z¿}k¥±ooÊzxvyyqzpx
ylube^xd_eb^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA??=6468276*&%#)*&.+*)109*#>H[L*#CP/#F[3PY/UAB;/8£¸Ã´°¯¿©©£¯©°¯¦²¶¯ª¦¦¦±« «¢ ª§¢«¢¥©¥¤´¤£¦®¬¸´§¯¢¥¡ ¦«¤«¿À±¡ª®ª¢¢¤ª£ ¡¬®©«¥£¢¥ ¤¥©¤¨®ªª¬¢¥¡£Îyz¥y_]§¡ |§t«¯^d©z§
t³c« ²j®t|¸aY£Ínu{Û{q~ue{vvk}n~
~l_pjof`_xd[qhjcf`RTRW]JOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\:L-!P@F4.1ÂÀÀµ´°·¤ª©´«¦²¬¤¬¦°ª §¦¢° ¨§£¦¡°¬¦®±«¨¬ ¥¥¨£®¤«°¨¿Æ³¨©±®¢ ©ª¡®¯§ª¨¦¦£ ª¬³¦¢ªª£§¦¡°¡§¡ p
u¨q°|r¬~¡¥w«}r~«vz|~ª¡~«{ zVÄzoÁ}mupmfveoawnrnmdnsuo`fmd_niinfcWS\`ZRRC8II@D<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1''45-&7=WJ-<'=1)3V@F!G;C1-+¯ÔÆÇ²´£££¢®¶¯©±§©ª¨®««§¢£¢¦«¢¥¨¨¢°¨§¯¨§©¤¢¡§£®¬£¬µ©¹Í²¦®¬¢®¬¡©±©©¨ª¨£¡«¯±¢¨«®¦¦«ªª±££¥
¤j¤uz©tz²q¥p ¤_`R«®u®¦z
{f£¤£}©~®^|¨U¢z£{ïÅs¯³³¹qb©¯Âuhlnmxwwnlfedqpf{ic]V_iXXTLLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°µ°¯©£¨§ª««©¤¦ ¥¥§¦¤¬¢«¡¤¯£ª¤¶°® ©§¤¡¨ ¦°¦£¨±¬¶È²µª¬ª¢¥³¡¦««¢«¨¡¡©¢²¢ª²²¡ª¨¯¯¶£¤§|ªlu«y|°n¤Ò·´¸É²^_©¤ zxªÉs£§©~ÆÆwe¡¥s }¯^oµc±uK£m§Gc{p}ozt|zm\fjrqfi^aXcm\^YIMMKEDAB>A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4OTQ;<F2,$¨¤Áƹ¨²®¬¥¢²¹¬ª¡¦¨¦«¬©§ ¦¥ª£®«¦ ¬©¥§µ¢¨«¶²¬¦ ¦§£ ª§®¡£§©¯´Â²³ª¨¥¢£¯¥¡¥¥«®¬§¥«£·¬ ±¸°¯§³´³¥¨¤ Nxz£|¤¦¸{|y¹~ÌŶx ~u¤£¨~°
¬}a¥l£p
}r¬`¤sq`¼}RUt£{}szr~p[lnwrjnZc_hnbd]KLQTAHHFI:9K>B108856877-*5==?BDGILNPTVXYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOUF<E2:P[T6?H,- ©¬¤«¹«¯ ¡¬³´¦ ¥¯®®©¦¦¦£§¡²®¡©¦² ¨¤¢µ¢£¡©µ¹¤££¢±§¥¡¢¯¤¨¢µ±Ã±ªª§£¤¥¥£¨¡¬¤¥®¥»¬¡··®¶³¹±³§°¢¤ÑµÃ·y
¦x¢w ¥q«´nri£|r®¥¢¦mp²\¥szl{}n©a¢qqbs²¸hw¥}w|xlhwixsnt\ddmmeh`JZWX<GG@T3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^__]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$)%s®¿¿¼»µ¨¤¶¡££©§®©«¥¡¥ µ§¢©§°£«£¤£ª´´¤¦©® ¦¤§µ ª£µ«Â°©«©¢¢¡¦£¥¤¦ª¦¬¡¤¬¦½¬½°£°³º¬´§©²¥¨z¨}|°w¤¥m²o |¡¨¬®
¨ ¢
{}«ªxy¯]£|¦§d|tk®]¥kq
]`[ m¦yyjl~b}tny_feqngghCY`[=JT2T8BBC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI7052.*,ATVVVTTUUUUTTUTSSVWWXVUUQHFIJ#((¼©ÆÃ¶Á´ ®¸¥¤¤£ ¯®©£¹ ¢« ¯ª¡ª©¤®±¬¦¨¢¡¥¡¥¨¦¶¨¿¯¥©¤ ¦¤££§ª«¢£©¨¾¤Ã¬ª£¢«³º¬¯§¡´°©«v¯~
|ºd°e} §¬°
¥¤¡¢ [lj³`{{±lgn±[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m¨yw}cr}axs|`ifpmfeeOUc\AT^=I(>9=4!",%2. *1/04579:<ACFHJLNPPRTWZ^````b^_\[XUPMJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³²·½»´Á³£¦¥¶©¡ ³²¨¢´ ³¨ª«°¬®©¢¯¨¦£¨®©¡¥££¥¢©²¨»¯¥¨|¡ § §¬¦¤¤¢¤©» Ƨ¥©¢«´¶®§ ½®©£®¤¸Ãº§¬¯¦¥ª~սªb£¿½|~£×º¸µ
½¾j£o«nz²±Çj«°½xw¢¾»t¦xyb|zcgx{`kekjbPb[Si\@TaBM)<:4/$%2 $(0496678;>ACFGJKMNNQTW]a\__a^`[\YTQMIC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ¼´´±¿¹²½³¢®¦¦³¦¥¿ª·°§ ¿¦¦±±¹¨®¥§¯¬¯¦£¬¡¥ª £¦§¡¨¢ «©¹®¨¤{¦¨¨¨©¦¡¢ª»©Å£ ¯£«³µ«°ª¡¼¨°°tuª¤·
eog¬mow¤u¯pq§£®¤rmmmewnmqyipigqhi
gpd^cjpY]g~w¦`bqofd¢{tewhjx~xdlcflbKdXJkY:PeEQ'K9+# #,)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨³©º¹²³ª©¢®¤³ª½±ÃȽµ©À«¬£ ¦«º£¤¬¬¥ª
¥ª¢¤¤ ¥§¨£ª ¥¦§¯¹«¬{¦§§¢¯¦¢¬¹°Á¨¤³¦¬±±«®¬¨¹¤¯¸¡¨¥¶¡©ª³£¬¡³¢ ¢ ¤¡«¦
¤}gtvtq§m| pgvowv|yikddocU`Y@iZGb`NY*E=+&"740.!%2(*799469;>?ABDFJKKMPPQWUVY^_ac]^UQJEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¤µ¸®®¢°¤ ¡¶±«Ä»Äº·ª¡¥¦°¨£¶§©´¦§¬£§¬¤¡§£©¨§¡¤§¡µº¨«{¡¥¨µ£¦«·¨®Â®£·¦¯¯°ªª´º¢¯½¦£¦µ¢¦©£¬¯¡£±©°¤¡¤ª«¡ª
~fuvysj}
xqrxq{~ind_pi`[_YmbP`dPZ:GFE=3==7.*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤§£°³¬®£©§ ¨µª£²º®««¡¢z¢°¤¥±©¸¦£©¢®¤¨ ¡®ª¨¨¨¹¶¤¥y¡§¸£¯µ¢°¯t¤¾£² xz «³¼v®¤ª~d[av¤~n³£¨®«£e syp¨l¢§e¥
wkvq|ai[vghqz£dxvhnx~jpe_uokkh\ecbboR[>MNNRG=@TB91.&4:316678<;>@ABFHBGFIKLTUUY\_hfgWQJ<DG<9VR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥©£§¥ª´®±¥©¦«s¯¨«§¸ £~«¤§¢
u®¦¨£º´¨ uv¦²µ´½§¡~§¢z£¯¸§
°©¯¢y¬¢¨ª¨w¥z¦{±z
bynqzqt
xht t|
~ikxzppgdwmilj[djier[^HSLQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aahfYQH9DK<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°§§ª¥Æ¼°¡¥¨´«§¢ ¾ }
«£ ¡¨¢£¹²§
pu£¬´´®Ê«®·
°±¯©§|¨r{w¦h¤y´§©Â«¡q¤}
±¡| |
ms
{r
}
t
Åf©¢jogwt{vghupfgk^bnlflXfF\PL2E46M`c6&4<DGD:63658;8>==>BL?NIJKCPZ]\Wb^jl\QE=KM@JdX]cfhgbbbbcc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¸±ª«¦¢¤ª¢£©¶¢¯ ¦¥½ y«¡
w ¤¢¸¥bm ¡¨~¡§ ® «¯¤ª~¢uk«tM«x©¨ª«}¡{z§ikg¶}m`cX{dgs}yk]|n_Sq
\`ly`Ye}q§ªk£nr¥pgdlZlzeY_~aWPovemtqjjo^jolkhWhN]WE9A4GC^k4+ICQMN=84859;6@;;>BO>QRLMBJ\]_W^_bv`MD:MOMTb\[ffiibbdaddbab`bdcabikdbddgdbgeach ¹¡ª£¦¬¡¶¼«®¢¡¥¬¬´¢§ ¦´u¦
¬¤©¥°¦¢in¡¢¥£¡ w§¡§ª®
¥y}}¢pr{ym©|¢sv¦f~w¤_z|s¢n·´ºt¶¨dƸ{p¶q¤ct¬«`}j³~n}q£ls¤s~£^³o{³tr[²ibosuqhoYklrre\h]bKD=D5QAYq2<RF_JS=<395::6D;;@IP?TMNQ@E_^[ZX``|dIC8LWUVbaZefkkbbeadc`ab`cc_`cknccddhdbgfchh£¹¬ ¥¸µ® ¢££¤¬±¬« ¤«x
p }¨¡£¨§¤~k{~} w¢ r¢©§¨¬®}z y£xs}¦£d¡|lhnz§}rgsªsªg]
vhªj¸f\©pa^§vuhunk¦\¨~w»j}©Z]³g\mqxwki[pixxb^eWbAPDO7VBRm4JZZ_NZD@151;;7H?:CHU?XRY]>Db]V`Qad}iEB9N[^YdfXfgnmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬º²°¬¦§°§«¢¡ £iq{z£¨¢ ix{~¡ ¢rh p©£©¡¨}°¤¢¸v£³¢£xz«~¢r¡|
¯µ}k¡x~´££«¨{|~sªZ]o{xbL{{
czBMY¢jr|muy±³¦tmq|ori£]vHec`sp|}ne`khv{bc`Q^V\TV@YEQgDRW[bX_ID=B8@B:IE8LEXAVQ[VDFa\Z`K`m~rEC<U^bZejVghlnbff^aa\]^`hb_ecvl^egfldelhhki±®S^¡§´º³³©¢©¨¡«£ §¡w
ny
}r r¨|l
q¡x
|£ £®}µ{¦z©¡}§hwm~s sq|
o®}£¦£p^©gu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²§¼wm¿¦ª´^o~qos¢r]£gt¦ah¦mÓznwykzvrl©¥g_dyp~kgfcmvwf_aR[eQQaIWIT_WS[ej[eQECKLJKBJD8P@QNWSXORQ`eeiRdxywIFEc]eZhjSihjocjg`b_\]]_hbahe{d^dgdkdjlfhlh°¬T\K~©¯²µ°³£
¦ ¢¤¨¨
{p}h}xpl|£ª
yvnw¡y¢£ ³¡¢¶z¬§¤®¥p©
}¤¢q¢¬®¤®¢vµ¶µÉ¡ta©mxu¡w }oLf¢ps¤{ytal~ lrd`rti{i³µ´Æ¦s~{j«tmswiytqPE|³^jujxfjgbttpmU]SYhPRhIULXRV]gknVgWMJAJMJHJNAQJPecimetrs~x{nu{{TQOl^h[kiRjhilglfce_\\\^ibdhk{_]dgcjfnmeile¢¯§
f?¡³«¯¯µ¢¢¨¢¡£¤¦¥yjye~ yui
z¥©z}yp¡y¥§gnxl¢d|q¥wpg§{¥z rv¹n¢b}¢nriªku ln¦`ihu¢}_
uobh¡eiupdfnr¢Z_[d¡n^o{srd¥nx¢dg§hrn¡oRo ^d§T]SmmrjqlphkxskoQWVVfYSmIXO\HXihsjYkVQREV\LXRaUhj^wuz|p||r{rvv^QsagbpgPjhhklngdg_]]]`jbjivu]\chcjirlfkmc¥¦zetm§®¥ª°±¦ª¤¡¡¡¡{qh|su}{e|¦¢«
}si¥}
ª¦¦x~¥²¯¥xz©t¥n¥¢¼n|¥¯
}¦zq¨ g~o«bw¨l©¢vw«¦k°kv³©lnma~«ªv§w}
¤ iu«f¶sw¾¤Y¦«auqso{tpbj~nhlRUZU`a]kM]R]I]lmv`[qY[`Zgsenorcqt`wz~yrys~{{vbxdcnsdRlgholrifia_^\ajbllzo\\bibmiwmglnb¦ª¤©ª¨§®£ª£¥¨
t
zo}turm}{
¥¥¥uol¨ª£ u~y®£qx
{r§q}}zx{~}v¡{}k
[yyryphn}qtq
e_wusuozonm_whxfª~t}jou|umlfsx{w[jXxhmwqpowwo]lmigVY_W\dkdUaU^Q_pwykjwejjju|qqtsaoubs{xuyux
}{nldyn^Wnghukxjiid\`ZcielpunZ[bkdkkymhloaº©§¡¢¦¤¤«¢ « ¦¨~r|}~ztsp
{}
x~£{§¡
wr©
§ «~~¨§xp{o~©
p}qjo|hm]sqtkvsXrn}~i]icz
_ix{|viykaqsw`s§fnvoxndfcyzZ\ifnv[zywtmsrf\mkkbYY]ZXkq[^`Y^]fs}{sotcjji{|qzwtdmthl|~uy|{zyo{}t~yrhT\qilvpugkgd]aYjhkjqrmW[enlgsynhjm`«±¢£¡©£¡}«¢¤{|r}v
ror~z¦ x
z¬¡ª¢¢££ª¡§¦ |x¨~°¥²¦ k|vwe|w|zu¢~vqt
x¦|uk{yirh`sp}zvuowt\^ohn_^Z[\SgqUc[[alht{|rnpcjih{mx~qhoplf{rw}{m
|zx|}zxNdvjsnp{ekebb`[sfpfrqlU]ltmiyzpgikeº¢¡¤ {ª
|x{mxr}mk~z~}ªq
}z©¦ ¢¦¦w}
¥{|©¡ª~ox
qt`~
t~
nyuu¢
t}}rs{{y§u{nj}{mhklg^y~g|{vsuuzv\`p}mt`bZ\^QfmSeZ]akiuy~pklckjgkrlktnxnynv}
vq}{z|{`i{kuhiejc`i[cuhobumlTbqydpzzrejmm¸¡¤zw¥¤xz
|m|xr
}}kh}|~|§p ¡
|§w£ ¡¢¡£
y¡~|¤ ¦~~utpv`}
q|q~
hxry~r|}qz|
z{¥|
uydqz~xypljf^}rh{uus|sj^`svpwdcY^^RjhTdX^agjvxqfkclhejm}gnpj}w
zkr}tv~|z}jrnsiailb_qUtomn`xhmWjtvbuz{qbkoz³¥¥ |u£ ¢x{~~p{tu
~xgc}x}y}o¥¥v¡¡z¤zx
~s¢ ¢|vq}mzd|
pkeuo|}x|}|rxy
¢wvzt_ww|s}wfkd`~ijvrst}p{cc`smurmaY`^[ldRbW_`hkuypcjclfh|khthloh|xmqt|~z~|muttmeljacuViqn`xflbjvpfy{yq`rl
®¦¨|w©yx{}|{xsxzs}d^}~t}~}¢ ~r{¦ t¦tlzo¢{zqyjul{}}m
wo}~drj|
ty~vx~}
¤y
t}rtl`ztyp{oanbd{annurwwssav_nkuno][^]^j]O]Wbahmszk_jejchwmelhilg|zwos}tz}z}}ryyxnlkh_iqchqoevgmlazhj|zxpawmª ¤©}v}v}{|{vwptszo
}~|a\~szz¤}|¤
n¡ o
gz
p¡}{tsukqnu{tnqt{|eqmy~}
ttyo}
¨{}~
w}pnbgwstnzb^o`jt^pizxxlrpex]mlsmsXZ^_ajZOWXdcgqqe]ihfbgqndigdihzwuos{u
x|w
zw|{ryjk_phtkqnmqgole{bmyvqlww¢¢¨¡§tª s{vwxrs{
kroymvnp[Y~vu w~n
k¤gw~|}ovokmopz
ispwtyftov|
zzwtp|{£|wxxni\qrqoowZ^p`oj^oi|ypmmjmv`pojqmYXaabmWQSYefcupb]kmdbfkm`ff_gkuqrptxvy
wv
|{vjqc|b|opltjholvw_q~y{tut~¥§
t
zrwtpr
squlomumw}mnUQ«xvry xz¤
}s
ih¡qw{z||kvjmkklz~ay}vzw|ygulu{qz
px{{~
|}x}vphkw^vomkprU]nbq`_mmypgpfgsuhpkawe]Ve``rSPN[fd]xp|^\hrbbefi_gdZhp~okqs}v}
tuy{xs
~{yxfrj`~ookz`imtt_t|xxsr
|y¡±¦~vsvspo
spqojivmn}|mtsRNᐙ|ptu w{r
¡
~xz~ywhl¤
cq{{z
{~l{erojkyy[yz}~zzhtkt
}l~o~z|wxxrlepkhtoghslS^ndpY_kpxfkjbfxsopc_w``Vk_]vOMK`fc]yqt\[eu`aeecafaXissnkqv|tyuv~s{r|~vesn|eopkYknyys`vz{vrwwy¯
w~|
uwpyqnomn~rddxp|mz|jhlc¤ÁÜ®ï¡skuu¡
np
£
{uxvwo}¤
^l{}
v
}}k}cxuimxsWzy~
~yftjkvn
zttxuspftyasloahufR`pgkU^msy`rc_h}qrmZbrabWnZ\wMMLcfa^vsm[\dx^`df_cc^Xjrknkrw}swxw|q}~{t~~shuqyl{ntpXpzvyqdwyivr¨£}pxy |{swpsjokil|t^`xv{ptzg`e|ëÚµÉÃÜslsvip
|{vxrvp¢a
i}}q~qwgvriswkZ}|vbtl}nly
}~nrzulpjqw^shn\ju`RdqhfS_ovt_o`]hqriWghciXmW[uLJKef^brs
h[\ey^^dgzad_\Yknenjtw~ss~zvzs
|wv
{vlwuyyunxz}Xyqogxwdv
q
¡¢sorv}{yrsnodr~iflww[_xzzqqiagaÕ¶¦xnqw{qj{h||~
zu{zq
uwaf}~~m|tkmvtsvukc~|p`sq||zqf{|
~npy~umnijy|agiiXkuZRiribPbrxlae]Zjmsb[g_dl_nTZoNHNfd\gnqkZ[cr_\clwde]\Zlkbmjsvqo||tx
x
|uy|vpxy{om{w^tmizssgr}r vvmv}|v~wqoljat|gbiuzZ_x|ymq~echhW^qr¼Äuq~rrj{||{uvv}qu
qu
|f}
q}f~{y~}i|vfoxxsvslj
x
k_ry{~|~riy
y}}nm{}wtngf{ub[pbWnrSSnshaMftxe`]\XnosYea^jm`pOYkQDSg`Zknm|nY[^lcZbowdf[]`liclisvqn~|tuz|
v~xtryx~oo{qixz~ml{ukjwtl
n}vix~yozspljd`szh_eqzZ`r}ygqzaee±²wJbZ¤ÙÐr{w}
nk
zy|xxpqt}ziy
¤~owy
p{}nwh
xr|e}~ucprhxpou
|vxyk\qs
~{rnq
szxno~vzdgi{o^XvZXplNWqsg`Jlvt`][[Yt}roWg]fjp`oNWhQ?Yf^ZojgzqZZYkeYcqy_h\^emhekiqwol~uo{~v
qq{|yyujzlo~t}or{{onxf¡
gpgz}~|ixrklf_anxm_box\dlzaqv_eeÔê¾2:>qx
v~ml
v}
|xnvwn
lu{tfy¦}nuwz{wkrh~xm|{wbyqdqh~mtqt~
~su}so[mux{|xzqlrztmkwuu\hgvoXV{RYodLZrre[Ipxo\ZZY]u~thYb[genciMWfQ=^e\]ue`upZYTodYdqyZh^`gmgjkipw}li~yn||zu
pnw~{{h{}jt{r{sw}yx}|kl~kh~z~~}kuqghb[bgrn`aksahpzbst^cd n\5Y¯µti|u
svpl
uyx|z~sgv~~oq~hvymey¤~n~v}|p{}{h~lj{zizvr`w~qdrfumu{|nwy|t~lXpwuxvzxsns}znmjnun\gdrpQZzMZo\N[rpdUKsxiWYYZaqt`]]`fdhieNZhN@ad[`ua]umXWStaZdorWj]ahkgmlipw|li||p~~{zwq{oqw{j~{mwxvw}x~~zm
£{uyklx}{~prqcf^Yf_op``gpfjotato[adjv{¾¦£È¸q
r|xsrro{tutwyyqcwzirvgwucj|}rt
zy{kxy~ugzhlysizv}h`w}jjsg{iv~z}~p{v{t~bVw}rs}qwxqp~y~}vviqimro]gaqmJeuK]nUSYsnbQOsx`RXX\aos[a\heeckcP[pIDcaZcp^]whUVUw^[enhVk^ajgeoohpvznix}r{~y|v}
pwrnw}p{xyztxzuo~}
zw{gt
z~{
vgon_d\XeYmr```plkhn`siY^dmw©Ú©Ç²qwou{zutu~wpqmtxuk`zyfrpgvn[m|y}y{mwt
{luvmgvem{umjwv|`bx
yhtub}{gt{tuqz|mYVtpu
yltylu~{}y{s|sgtenmsZi^tdGmmLZaWVUxmbPRtvWPUX^aqo\`cmdd^obT]rGBf_]fh][{bQU\u[ZgkaVj_`nefkqhpuxtku~vx}w{s}oqtqu
{wx{|
x|}~{~svy zvty^}
yt
w{bnm\b[[aVisc`[gnofqaqfW\ck|Êι¡jmmlqq|~{
yysyuu|jlucuwof^}zfrkjqcXmz
sw|nrr
{x}qqp}fhqbmxqjkqx}|z\dywiuxevgt|qjn}yn|]Xrnt|ooqvhww}q{u|zrfsankrWj]v[HmjMUT^TU{kaOTurPQTV^bt
i\`kjfcYnaXbpGAh\`f^]V{]OUdpZ[jh]Wh`_rejgrgprwxntzw~xur
pp{xwuz
z|t~}~~}|xvyx |muyc
so
ztcnjY_[]]Tgse`YdqrfsbkeW[`ix¾®{ ·mbshs{qy
{}wxrvo{vejn`usjb^xygq~hjkZVow£qqyuns
}xtrnhy`jm`mvjgjkywzvZg}|xer}mteu
ofjzumub\p}lu}|fu}nqhux~s}l{{zxqflbn~lmVi_vUJijOQNhMY|hbNUujLPTU^fuf]`phgaWi][khJDjZadWYUyYNVmjY]le\Yec^teldqgrouxp
v~w|
}usnsy{zss
x}u~|{~{w|wwziv}|lrp
~oflgW][\[Tdpd_WbruiupeebW\\hporsddx~isusrxywtumkzqbgkgtnf]_}p{~imxfidUWro¦|{vt|s}{n||w|}tprlgt\lh^ltdgfizo{rYgvtgpwubw
|njmzqfseanzgsx|~bvvjkqu{qzyt}f~ywndfbn
|mjUiaoRJhjOKNpG^{faMUtcJNSWajv~e\gsie`VcWbp]LKkXcaUTUsVLXudZ_ka\Zce_vfmbpisnrutwwz|u~
nrt|ztq
yut|
}~{~v{£¥yku|zuyo
sy}unjheV][ZZSbnd[Xas{ihmi`bW_[jikogk`hyxjsstnz}uunzhjyj_enhv
geXbwi~{oipgf]UXog¨wz|yuppsvzxu
vjrvghn[ld]ms_gajxh{m[mrsjo~ywawwrqoyqcph\pxdqt|ybspgjytrlxwvxd{xvpdccn|}kkUhaeSJkgOGQkE`xgaMSq\JMTYekwze_mqid]V`VnnWKShWe^XMUkTJ\y_[_k]][ce`yhkaoounoxuz}wz
zxy~qttyvt}|ks{
~}{v¬zkryutnn|sjomddX_ZYZUbjg[Z^ui^ml\aV\\leqt}ii\kvugtwrl
{}}yurlyhixf]erhzwccTepg
wwfhj`WVYgc§n~wzpq}hzoz|wr}ndusdhh\kb]oo[g_mudzh]toqkq{}uuat
zwruuapmZrtbqr
|terlal{oji{yvrf
v{zuqdaems~ilTh^\TKrbPFVaGbvgaKToWJLWXgkvzdenqfcZW]YveUJ\cWgXYHWePHbxZ]_l[^\ac^ij_ntxnonvyr|
~uu
x}suuyzz}~isz}~
zz|sq®{{}eqys|{urnl{~lzbpobe]eVYYVcfk`]\s
hXpnZ^WZ\l{bpwvmbZlssgtuply~ywnnteite[gtfvvz_]Refkt}bci\TX]bc¥hxt
xmozhxn|
{usx|xhevm`f`^j_]skYe]oobze\w{knnowxstdr~zvor}sbwd[opbqq|sgrd^nvidgy{unout}sqb_fno}diSgXXTMw_QJYXHbudaITmSJLZVilr{bllscaYY[av[SLc]XiSWGY`NGiuX^am[[_bb]
hganxylojvxm~vttsqwuw|}~~~pw|yxy~tsp¢{zxduxswuksn~ly|pr^po`gblT[ZWhcmf\\qeSrn[ZXX`lvciuji^Ymsqlsssi
|~|vnnldiqc[krdtvs[WSearr]bc]SZ`[cerq
tlkzmop{||qwszzzdeuh]bZ`g[^vhWb]phaw`[{viirnwsrthp~vrjp}mfwW\knbqszsfo~[`pqa_jq~llu~sqxkpa\ellzagSfTWQOu[QOXQHctb`FUjPIPZUjkk|emnqa[ZXYlpWSOfWWhSTFZ\NHrtX_cmcX``b]jcdmyxkoiuy{k}|y|mqowz}t|tw
usquo¢t{{ewnnznfwpzksvrk^tnagekR][UgallZ\pdOon]VXUgjtgbtee]Yntmpuuxj||vsddkna\nmcsxkZTVcdx}}q
\c_cTZ`Yccnp
sjh{ofsws|lztuoz~u^frc[^VadYateU_`mdaq]]~ohisqsptujm{
qrfn}proS[fkfqtvsclvUbrkZ^of}fmw}sssjm`Zdjjw^fTdTUPTmWQVSOGds_aEXiNHWTVmhd|ikwkbW\U[tdSRWhQYeTSHZZPMxvZ_eliYb`^^naflyunohvvl}{~krgt{u|r|
{ss}vn¥svwmz`d{pfyrxlmqvgd{lcfghS_^Ug_lo[^nhNim`TVSogslfxdd\Xptlqzxrl{vzykaelm^`ojeqy~gZVX`lx|{p_b^gWX_Wdbkq}wkkxm\wql{jvsno{rXjn_Y]UbcXdqbS^ahbblZ`}kfksunmwvkh
~zmqep}mrmcYaiiotts^ilSeqdUbnbzcqw{vkpmj_Xaght\eUaURNXeRO\OOHdp]cFYiMI_KXmd_xhn}d`T^T]u\TS`fN]aTSJ\YPYuu]_emhXca[^pcgjwqsngvtzry~|yntlsty~|rstwqn~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBN¥¯®±a@DDDDCXhggggfo
}}{{z}~||~}}}~}}~~~~~
-h
S7¤¤¤¤¤¤£r]____aR455553A©¶´´´´¸Y055554Ma____^j|}z{z|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvtuvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfggghhgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AE@>:;>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;99:88;=979;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqususqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<:79::9899988:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;==?@><ML9<===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CDDA>=>@A?>joB=?CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CFD@<<=@DDEmyI6:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@AX@>[x|{yyS7:88:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBCA?FxXc{_;>=?>=>CD?;<=>?==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy|||||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCDA?Jtx{h?A@C@@?@@>=<=AEABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{{|}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AAA@Ls|{~
Y>CCE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEFFFJNNKJIGGHKMJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EEJp}}
hAEEDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJHMr
UAAUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCFIKKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLLLgpNm|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsrtvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLLJS
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABDDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHJJJ]
fBB=88::9878896479;<:8567789787689;;<>@;999==><<=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGII`~T;8656766645773468:876565676778:77789;7579989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{{{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECB^
H676468874578467699766765:9:::<898977779:98878589;A=>>BA?AKLOQPQOOOQWkrrttuwy{{{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:<jz>:88;<=>9::;89;9:;:99;:9===?;;;=:>;9;;<;<<9;<8::;:999<?<=ABDIJMKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989:::;?>Ez
l<;>BCEEAA@B>@B@@?=>>@?>?@?@==?B?AA?A?=@@@??A=><;:;:9;?=;;==AACABCAXqqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;==?@CP
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHECEDEEAFEFEFFD@B><@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A@CDFV
WGLMMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIJKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@@A?BBGGJY
PMPMKNKJLIIIHJFDGHHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@98<;<=:?@>@@CFIIP`
qMQOMLLKLJHGEJIDJHGLJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnquvwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@9:<8=>;=A>?ADGJLVr
^QQPMNMKJGFCGJGLJGKOLKJJMMLOPNHIKLOQQPQOOJIJJLJLFGHGFGIFEEB@BB\orwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAGKLPWy
|WURRTROLKJEEFKONOWVQPOQSRMSTOMSLPSUWRSQPLKMMMKNGGJFFHJDDEEBDCcpuyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B?BCFVNFMOPTY|
gVVkaERQQPJ;:QSR`u]UVTVYYRXXRZfPUWZ]RTWQPNRPPPQKKKGHIHEFIHIHIjrvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??AAEBCGEDELXRMTUVX[|
}al[dU:XXXSP>@VUY\d`VYbr^]V]ZVEQYZ[Y_TYgRUVXTTVSOOMJLJIILMKOMSosvxyxwzzz{z{|}|~~}~}}}~}~~~~VJJIHGFDDBA?HMIMPKIKPTSSWZZ\\x
g;~znpXZ[ZRSRVVTZZuYU}a\X]^WIV]][[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTWXXZ[n
n~fYY\XSVTWRQWVcQerXZW_hP`fZ[X\hbGOZig\[\]]WSNSPPQVVVVYZnrtwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRQUSUTW_ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^SPPPINOWVX[Zdqsvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRTRMOYQMNQSUUMQSRPNLLHCIHRSTZ\mrvvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YUQLILIaltPQSNQRQR[RSRQRUUbs{|}{{
u_]KC>CCCCB?DPBD@C>BHGV@HNMG]iPHFOFDEFHGHBCHGHJGCBAD@OPMSdsuvustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQSQUYSUQQTROV`klrv{{xyurnstsyx~~kLG>>:;>@???>kQKaEFHIEB?GLMGMQUIBE?><=<==?=?ACB?><=B>JMFUnuuustvx{|z}||}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrjmlqu{z}zxz||xwxdB@@A=:BCAADB\]O{NOONKLMOOQLKLWMHG@B<977599=;;;8989?;AG>\tuuvuvwy|||}||}}~~|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRTVXSRYTNYZ[WY]^^`e`]^qvk^`gkwooljonnlfbYGFFHBAFIEEFDMRPaWRXQPSSRU[OOQVPMICF>::6486979:366796<B=ftuvwwyy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMLTTSQQUOLRSTWXTTXQLXYZVXXVXY]WWXhsk]V`tkaa_]d`_^YUPMONLIGJKIHFCQPSZWTTMQSYS\eUOSTQNKIHC?A9988978847578588Gnruxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPXVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNNNLJFPPUYSTNJNOTST\VRUSRNMLIHHF??=:787659967665Wqqtwyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWUTWTRXXYYYRUOJGPPOOMRJOPPPNNOTLMIPPSTU2<XMIAQ=c`QSQPNPQPNNMPNTRPRLILKOQPQRSTQROLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUWURWVUZYXWUQSFEAFGGHFJDHJHGEHLHKIGLMPMG/E_R>3@>joaRRQ@FTQPQPQNQOPOLJLLOPNNPQQNQOJLMMKGEEDB;=<<9=G6676Dnquwz|{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8ENS]fRQSAGUPOQQPMMNMKLKLNOOQMOOMIMLILKLKGFFED<AA>;@E;<89Tqsux{z{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?@?<=A@B=>EHGDFFIGKJ@FAA@FHEJOHPQa\QPRNSOOPLLOMKMLMON[VKMQOHJHCIJLLKFFFD?BC><BG?B?Adqtwzz{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B>;>A@@>ADIECHGIGIEBB?><CBAGIDMOaePLNNWKLNKLMMMLKNNSdMJLRIIIEAHJLMNKGIFBAB@?EFEHDKopwzyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOGKE?B=999:?B?<ABBADDGKFDIIGGHCC?B??@A>CECKNQTKJHMTFIIJLJKLIILMOPRPKGCLGCCJJLMONIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqnjllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKCFHHGJKIJLDGB=>=:::;AB?=BBCCHFJLJEIIFGGCC;A@B>@@CECIMOGHKGHKDHIKMHJLHHJLKM]RIHDNGBEKKNMPNKMJKFGGJMNQNLcniwvw{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdoFKCFEGDEEFEGCC@><=:;::@D@>BCEEIFJJLFIIGFFDB;BCC>@CCCEFKMHKNHDHEILNMGILGEFIILNKJHEOICGMMNMPNOOMLIHIORQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGICEFEBCBE@DB>?>:;;=;=?CA?ACFGJGIILHGGGFEC@=DEB>ADCCEGHIGMPIFFGKNOKFHJFEDDIIHKIFHPKDJMLPNONOPNJJHMRUTROWdaamgprosyzgehhcilgqlflmgiklslpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCBABD=BA>A=::=?;>>@B?@BEGJFJGIGFFFEDBAAFFCBBBDEDGGHFLPLIOJJLKIGHEFEDCIHHKJGKRMCOONQPOONOOKKKPUWVUTX`^]iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqrkksMFFEHBBADD<AA@C<89=>:?=?B?@@DFHEHFFGFFECCEBDIFCFEBEGEEFGEIMKHQMJKHHIEFIHECIIJKMKPSNDQSQQRNOMNPMLNSWVWXVX^[]d`hbjigk_defcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBFE<@CBD<7:=>;>:@B>??CEFDFDDGECECDEFFJEEIGCGHFHFECFJJGMJLKIJLFIHKHEKKLMNORTOISUTQTPQMNQNMQWZVZYVZ^ZXa```_hec`deggjihjfhnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunorsyMHHGIDACHE<@ECE=8:>><<<AB<?>ABFCEBBHCCDEFFGGIFGKHCHHGIGFDHKIGKHMKJKLHLJMKINLONORUVOKUVTQTQRLOQPOTYZY\ZY[__^`c^\ackb`dghr
hgifjmnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIKHJEBEGE<@GDD@9<>@?>?CB<@>AAFCEECHDFDGFHHFHHIKJEJHHKHFFLHHHJHLLLLLIMKMMMOLPPQUVWOJVVUSSRQLORRQVZ[]^[\^``a`ad]d`ef`ehjcssfjhglprqossnswwpuvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwowIJLILGBEDE<@FDDB;??A@@@DA@B?ACHBEEFGEIEFEIHFIHJLHHJJILJFJKHIJJGKKMMJJMLNNNOLOPRUWVMNTVUSRQPMNTSRW[^^_]]``aaa`bdebchbdijgvlkigmosqpqpprywruutsmmssmqrotutspsvtuuwvuuteqskpqjrvowJLLKMGDCAD<?EEEC=AACBBCEACDAAEGCHGHGFJFCGJGGJFILHIJMKMLGKIHLKNQKRQLSMKNNOPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da_`b_`eaacinhbihhmxvlhimosrpqrrrvtsusssnksqmprotvrrquvuswywutucmtkopjqtpwLMLLLGDA@D>>DEFC@CAEDDFCCEGCBIEBHJIHHKFDKJGHIIIKGJJOKNLILHJMKZfJd\KlRHNN_nUls[qpbwcRPbvuhucav`Xnqbdvinzf\lt`ljT_wvijgifglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?=DEFDCDBEEDFBFFGCDJEEJLLJLMGGMJHJJHKJIKJNLMMLLILML[sbdp^llUMNfs]geqlntgpi_aYnmbppbkjjgoqtetno\pugpMJryvkb`keemxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?BB?=BEFBFCEDEEDCHHGDEKGGLMMJMLFJNHIKJIKJJJKMMNMMMKNMM[roonpplkMPQlWNibtrpamov\YlP[mmZqmkomxxtsip\`slqjUuyxpc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGHEEEBBB=??EGBGDIEEDBFIHHEGKJGMMNKMNGLNILKHIMIKJJKOPNNMLNML\hdu]lqWlNOQmUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ggadityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIDEECAB<B@BFCGFKGECCHKHHFJLLFNKLRRLGMMHNJGHNHJJIHNONNLJNMJZsppoqqmlOQRnYqkgooqqomt^nXat_nopoqronusttj[]tcwxrjnzhaacfbbjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtHKHIBEEEA@>CCAECHIMIFCFJLIGFJMKFOJKWRKGKJJNIHJLIKJIHJLMMLIKKKSkbZi^_jcrrZ_Yjo_eeUk_c[abQ`mh\j\niid[pfdp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFIDEDFA@AEDCFBHJLGFCFKLIEFJOLIOIL[QJFHHKMIHJIKKIHJGKKKKGHJJLLLKIKLNT[\TPTMPONOOVQOOQOOQJJNPQdqiTYW[[\UY[]X]\\cfaafbce__fkmhmtyrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusGCEGFFAEC?CGDEGCIKLHFDGJLHDGIPKLOKLWMIEEHIJHIKHLJHFHHJGGIEFLHIKNLIO\W^O\[`^OXYS\\b^MYZMXaRKYaZS`d]bX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBDIEGGFKJKHEEJJJGEHHPJLMJMSIHEAHFJIKKILJHFEJHEFGEEJGCJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^c_Z]`c`Y_b[`^[TXXZ_^dbbaceiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKKKEFHINJNLHLNGHF>GGLIKKJKKIGEIEDDEBFJD@JKIO[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_aa^^ca`bbbcceZRYVU\[^c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFCGEBEGHFGHIFGJGHFHKILDCKJMMLLHJJHJG?GFNJKKMKKKIGHDD@DAHIA?HIGO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^PP]_acdccb\dcbdcfXQUTS\X[a_^_aa_dlkmjjlnv~uz|
zrsuu{
~xpzwvx\RMB@IFCFKIFFGHGGJFFFILJNECKJLNJLIKJHIGBHHQMKKOMKKIHGED?EBHHAAFFDT]Y^X_Y_[]UXXP]]QKJW^X^[]VZ`RQ__aba`bb`cbbddbXOQRR[S\^]^^___dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHCRKFHHHEFKJMPEGIIKNLLILKIIGDHKQOMLPLLKKHICEAECHGBAFEBVUE\T]SV_XNTUNZ[MJKU`a[_X_^a]OYb\``_bcb]bbW__TPOPQXR]\\]^_`affelfoow|{{}
zo
~INFDFFGDIRcPDW_IGGHDFMJPPFJIJKNLKKLKJJGEJMQQNOOMNLNHKADACDFDCADEALHCLLPOOLFMFGIJHGLLMOQILOPPSPLQSRUZYWYXXdVOSTPPONPUT\YY[^^aaefchckmqsszy{z~{}{
}KIEEGFGDKM^LGHYMGHJHGNLQQILJKKNNUNOKKLGGKPSSNPONONOHKE`ED_LDfcDM[H^\smOMVmYLCP_UlWgJ]XV^DLQULMTVQRTXWTXUT\TPfZhhdYTkTWVU[\\``abbb`gignlhrz|}~}}zr{z{
~z{LIEFFHEEKOTIKG`THJOJIOMRQKMKLORUROOJLMGHMQ[YOPPNOPPJKPQI|YYrsXPmHqnoaVPqqsPCksmqspSo_[nX]V\XUkhU]VcZ`YZ_VUWjtuu_av_Xb\\f[_aaab^`bgmpl`pwtx}~vxzlv~tx~|~|z~wwNIEHMMBDLLGILFRVLKOIKRXWQNOOMQTNOQPKKNGMPS[ZTQROPPPKHZx]TxdhYRTQvgtlpbnfkQrOMwmjrpsrqrpop]ezuxqqzq~s}ku}bRh|essoss|}o~yor_``baZa`gknkblfgmw~~{xwtvzir~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJPOMMJNV^YULQSNYYLSSRNLPIQRTYWWQTPPPQKGfxlcxqmZJLUypumubnvPdeJfvqmwojfxxiWrQhzmijzz}lxzpgoXvvjvupash}ilx|o___cb[^bdgijdgbcdllppstsssyqrxbltgry{ssuy~suzn|}yxrnNJRtNCBEPPIKKJLQOOOMPZ`ZXKTWPa^RVQYSMPISTUXWWPUPONRJLrouuquqdhaVnLqp^FhyWvTKhx}x`y{sna^modRgrunmypwlvstqlm\s~zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsynqpj{ztromKKZVHGEGRPJLMKLQQPPPQW\YUNVYUfXRRY^TMNITTVWYWOSNNNQHRmHiwK`dvvUWlOnl{sajgvUKWkh}lmlx`[pz{^`zscroxqhd|ir{]TKl_vukiu{{m~xk|p]^^b[^bdegeeebZccikkrsrwgmihdg`alagsrkhlmr|kmhk{tmmkmOGJKHJHHRQLNPMLSSROSSWRVTPWZVVTTTa`QONKTSSQVVONLMOPJHQNPULKKSTRRTPVUQQNQQXXQNPUTXXX[[USSW[WXWZPSUWWXQ]XV]USOXRWWWXZ`[gr^[\[]^_cZ_ccefdccbZccfffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilQIKKLMKJTRMQQPLVUTPTUXUYURZ]VUTWUYXPOLNWTQNUSNPMLQPKJQRKQMKKOQTRQQSSIHMNOQRQQQTVRXW\WSSPQUUVTZQNSRWUTYVTYUSRUSTUXYW^Z_a]\[Z\\`c\]bbdgeddaY`acabhhincad^_c]Zd\bma^ffgmsdihkkedcfhPJKKNOLMTQOTQQMXWUTUWWWZVT\`VWVYUXTQPKOXSPNUPMRNKSPMNUTNQNMNQSPTQSTUNKMOQTTRRQVWUYZ[YSURTWWWY[SOSUWUTYUVYTRRWUUW\YZ`]VY_]^]\]`a^[bbchfedbX``b]`hefda^_]]^ZZ_Z_g`^]]chkagfhfd`bcaPKMLPQLOTPPSQOQZYXWXZZXYV]jdVXYZWVTTOKOVTPOTPPQNMQQORXTRQOMOSUNWRTUUONNQSUUTTRTXVZ]\ZVVQRWXV[\VPSVUUVXTWWTRRXVUZ_Z^`^V^]^`]\``__ZbbdhhedbYb`b^^fdc`b]\\\\YZ[X[a[^]\_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROLPSRUZUTPPLPWVQWSSSXMOPRTXUUUSUYX[^]\[VROUVV[[WQSWUVXUSXZTSQYWV\^[__`Ua\`a^`b_\`]cacgide`Zc`a__ee_`c[Z\[\ZZYYW\Y\[`^_[^^a`_b\Y`ZQNONVQPUSPUTSPW\\\X^\_W\^jpwyc\[VVXRNOWSNQQPRTRLQTSYZWUORNSWVTRTRRZOQSSV[VVWTVZX]^\\^VSNTVV[[VQTVVXYRSY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgidf^\d`a`acd_b_YZ^[\[YXYWWZ[Za\][]\\Z]`W[[ZPOOOYPUUSRWRTPZ]^][`\`U\]hjr}rlh\UYWQOR[SRQTRTUTKRVU[YZSOSRVUUSNVRSZRTUTX\WXXSX\X^]Y[^TUNVWW^ZWQTUXXXTVX[TSV]Y]]a^cc^Y`[eb_dd^^cca]efidf]^da`abcd_b^XZ_[\[XXXXW[Z\`][[\[XZ[^V^Y]POORZPZUUWVTTT^^`^^b\`U]^bkytl}lZUZUQQS\TTTUTVYWLRZV][\ROUSXVUSPWRSWSWUV[]X[YUZ^W_^Y\ZRWRYXY_ZYSTVZYZVWY\VTZ]\^`a`ed]^]]eabfd^_dc`\gdhedb_da_a`bb_`^WX^Z\\ZYZWV]Z]^[Z[\[WY\]VXW]SOPWYP]UVYWWUX_`aa`c]`U]^beeuzhXYZTVSV\XWWVVW]XPU\Y^]]TSXRXVSRTXRSVTXXX]^X][U^_X__X\VRYUYZZaX\UWWZZZXYYZXV]^_^cbbee]b\`fbefd_`dbb[fchecfaf__aaaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNSZVT\TVWYWV\`abcad__V[`da_zuohZ\ZVXUW[ZY[YXY`WPU^[`a\TUXPUVUSVVRSUWZZ\_^Z_\V__Z]^Y^VSYXYZ]bY^VWZ[[[ZZY[YY^_``dcdeebdZbfcgfe^ac`c^cciddg_g^bbcaa`^_XTZZZ[[X[XX\[Z[WWZXW\[\`]V]]SPVZVVZUXUXWX^`badada^YYadb`lfh^\][WXXY\\\_[Y[bVTW^]ac\SVXPVVVVVVSUTX]\_``]`]W`^[^\[^XVXX[[__[_XX]\]]^\Z\X[_a^`dcdfffbYceehgd^ca`ec]fideh_g^cbcaa`__[XY[YZZXYXW[\Z[WXZTY]\Z`\U^bMRWYVWZY[\YWY^`baeada]^Yacb_a`a_\\]XW[[]]__\Z]cXYX]`cd_RXYPXVWXXWVWV]]^`aa_b^Ya]]^Y]^YXVW[\`^\_YZ^]^^a][ZY\_b_bddefggbZdfgigc_c^afdZhicfice^bbca``_]]ZW[YYXXZYWZ[ZYWXVU[]]]``bbxKWW\XW]\\]ZW\]_`bdbba]`Xbcb`cac^\\\XW[]_]`_][`d\\XZcecaR\YOXWY[ZYWZZ`]`bb`ac_\b]_][_^YYUX]]__^_[Z^^`bc\[W[]`bbcedgfegd\efhifcab\cg`\iibhife`baca_`_]]\Y\YXWXYYW\[ZWWXPXZ]acffrkJYW]ZZ_]\^\Y][^_acbaa]b[bda_cbb]\[ZWXjq`\`_]\ac_^YYcedaT_ZQYW\]\[Z[[c`cbc`bda`c^`\^__ZXV[_]\aa_][`abeb^\S\_`cddfegfefe^efhhgdd`[fg^ahhbhhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{zzz{{{|{{{{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{zz{{|{{{{{zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½±µ´´´³µ³ÖÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊ»À¿¿¿¿Á¿éååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxxxwwwwwwwxyyyzyywopppppprrrrrrrwzyyzzz~||||||}~||||}|
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuxvvvz{x{xwvx{wyzz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{zzzzzyzz{{{{{{zzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy|{|zy|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww||}}y{zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywwwz|||z|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz}||}z|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{xz{yyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxxyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~
~|
~
~|~
~}
}~
}}}
~}
~~~
~}}~
~~
~{z
~|}}}~|{|
~}}~~~~~}}~}}}
}|}~~~}|}}|z|
}}}~~}}}}zzz~~
~~~~~}}}~~~}}}}~}|zzz~~}~}}~
|}}~}~~}~}~}}~~}}}|{{{zzyz~~~~~|~~~~}~~}|~~~~~
~|~~}~~~}~~~}}}}{{|zzyyy{~~~}~~~|~~~~}|~~~~}~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}}{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
~}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
~}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
~}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~
}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~~~~||||||{~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv~
~~}~~}~~~|~~|}}|~~~~}|}}{}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|}
~~~~~~~~~z{z}}uqz|zqz~}yxut
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xyuu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyutz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{|||}|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{||||}}~}z~}}x~|||~~~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}||}~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvpxyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}|{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~~}}|~~~~}|~~|}~}~~~
~~|{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqrpxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z|{{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}xwvyyy|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~~~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{
~~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
}
{~~}y|zzz}}|}z||}}|z{~~~}}||}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~}}~||~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}}~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~}}|}~~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~|~}}~~|}||~~|}|||}|||~z{{|~
{{~}|||}}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~|}}}~~~~~}}{|{zyzzyzz|yzz{{{|z{{{{}~}}}}||}}|
~|~~
}~~~~{||}}}}~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}}~~|~~|~||~}|~}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~|}~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÙ××××××ר×Ö×××ÖÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´ º¸¸¸¸¸¸¸¸¸¸¸·½ÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜâáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::87>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¤ZUVVVVVVVVVVVRy§£££££££££££¡«ÒÒÒÒÒÒÒÒÒÒÒÒÒÑßêêëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¥_YZZZZZZZZZZZW|¨¤¤¤¤¤¤¤¤¤¤¤£¬ÒÒÒÒÒÒÒÒÒÒÒÒÒÑÞêêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©ª£hdeeeeeeeeddda¬©©©©©©©©©©©¨°ÒÒÒÓÒÒÒÒÒÒÒÒÒÑÞéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÏÏÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÍÌÌÌÌÌÌÌÌÌÌÌÌËÎÒÒÒÒÒÒÒÒÒÒÒÒÒÒÔÔÔÕÕÕÕÕÕÖÕÖÖÖØÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÐÔÒÏÎÏÓÓÏÎÐÔÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××Ö×××××ÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÖÖ××ÖÕÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÏÊ¥ÑÏÏ¢ÊÒÆ«ÑÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏϪ¬×¨ « γÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÐË¡³ÎÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏѽȫ§´ÀÉÆÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÏÒ Ã¢ ÅÓ ÎÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÓ³ÄÚÅÉØ¬£¿ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ×××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÑÎ ¶ ¡»ÍÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑËÚ¨¯³¥ÐÛ¢µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:96:;::;8@?:<<9<>=;;:?9?:;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ¥£¢¢¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:8:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡Ê»¡¦§¾© ¢©¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;97:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÓ¶Ù®¥Ô¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÒºÄÕÒÕÁ½ÖÓÓ¸ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>776;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÕÔÒÒÒÔÕÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>787977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ×ØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>=<=>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@???@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKIRXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPEMISWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\T`MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©©¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¦¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦®¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦¦¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¡¢¤¦£¤±®²§¦¬£§ £¢¯ªª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤ ¥¨¬§¦¥¥££§¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wp}yf[[`_Z\V\hdocniib^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶¯³°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬£§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥¡¡¨¦¦¥£¡¤¢ ¡¥ vxxxc[RYT__blhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶´º±ª®´±°±´µ¶¼½¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¥§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±°§¼¼¾ÅÄÆÉÇÅÆ»ÄÁÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎÌÌÇÁÃÇÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABBA=@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆÀÅÇËÈÔËÊÇÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vxz{vnkiguZfrwsxff]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂľ·¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijg]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬§ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËËÇÆÌÉÍÅÆÅÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieunsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÅÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrpfegdjebjmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfcZYY\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹½ºº´¿¸µ·²¯»¼·À·½Â¿Á»¿Á¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾ºµ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjgfiei]VUSYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´µ±°µ·µ»Á¸¾¸¿¼½·µ·°®¸¶¹¿»À¿·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekhXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···µº¹º»À¾ÃÀºÄ¾Ǹ¹¸·µ¸º´¸³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·¿¿Ä¼ÂÒÊÆÇÊÉÆÏÂÁ¸®µµ¼¾¸º²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcgb\cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼««£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÂÍÙÈËÉÈÌÎÑÌÊĵºÀÃÈ¿¾µ¿Á¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÀ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_c^aaNHM?E@?DC<;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED<AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÆ×Ç«ÔÅÄÊÈÌÌÍÊÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÄùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶º½Á¼»¿¶¿Á¿¼¾ºÀÊÂÆÓÀÂÿÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²²¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^\YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·¼¶¹Áºº¸¸µÄÁÄɹ¼¹Á½¿ÇÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni\_`YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸À¶µÀ³µ²²ª®¦·¹¯¯¶¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§¬¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_e]ZUJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<:;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º¶¶ÑÀ²À·°~w¥µ³²·¾¹³µ²¼¹¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvrl^b`[]OHA>=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¹Ò̰¿¬¡l}m`giz¥·³°¶ºµ´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ournc\fX\]RNMA>IB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º®¬¼²¸¹·»¿¼¾ÕŲ©x~_ljc^az©½¶±´¶²´¯»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFMF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹ºµ¹»µµ³µ»¼¿Âͽ dZ]V
|a[¯Æ¹´´³°±°¹¸¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;=<<::@=<<;@>B@A?>958;<FBCD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²²º¸ÈųcYk\WdxyJ·Æ¹²³°¯¬®¶¶²´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥££¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGOMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥ª¨µ¯ËǦsW]WVaf²¥vPh·¾¶³ª²´®ª«¯°²³®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRNJNG;E@=2?759;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@CAD>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¢ ¨ÂÆbZvedzu¯£vf_w¯´®¯³µª§¬£ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxy`bRU_HIIKSTIRPL9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥¤½ÃVhto~u}yz¢ª³±°°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´©±¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNNULRLA7>B68=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¡¡ÂÈQs¥´xipq{x¨©°®®¬°§ ¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸¬±´¤ ¥¬¡¡¢ ¤¡ ¤¡¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HQUHFUVJBLG=KH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¢ÇÍTvsoj`[]\^ean ª¨ª¬ª¥¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©ª¨§¨ª§¦ §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£ ÆÑa|zyh`WLIKNPOQ\kª¯®©ª¦ ¡¢
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã»·³©³ª³´¯³®ª®£«§¶±¬¢¯¦¡£¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{tqkkurphW[QETHDIOH>EA4EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<<;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ÄÈqxvgVRRnWWNMDGa¬®¦££¢ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÉÉÂÀƾº´ºº´»·°¶²ªº²®»·¾ººª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkdhoxjeZ[FKLEDSLDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¡¡¢³klphUP\|¦yRMg®¬ wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÍÓÐÓÓÌÊÂÅÆÇÊÈοÈÑÌÇÅÇÅÁ¼ÃÀ¾¾¾µ¾³¿¿ÂÂÆÄÇÄ®¾¸²¸¼ÄÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A?<@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¥¨¬ª £¬rmcWNRh´ÓÓ¤¤³®¤yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÒ×Ñ×ÒÔÖÓÓÈÌÇÍÍÉÒÍÎÓÌÅÇÉÊÁÆËÆÈÈſó³ÈÄËÊÊÎÅÊ¿¾¿½ÁÇÄÌÌÈɿÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬³·¬®££¢ ¤¬zfXSRXwÓ׿²¯§ ¤ |wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÑÉÒÕÖÙÕ×ÓÖØÎÒÊÏÑÌÎÐÌÒÏ¿ÇÆÊÃÌÌËÎÏÅÆÇ¶¿Ê¿ÑÌËÏÅÉÇ¿ÃÃÈÎÌÏÐÏÍÊÇ͸·»¨¥«§£ª¥©¨¨|xsvpc`erb]R\IJGAEHI>;@8=4585;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÁűµ¨¡¤¥ ¢«µgZTUVh¹®¤ ¡wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÐÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÇÐØ×ØÑØÒ×ÙÕÖÌÏÏÊÍÒËÎÏ¿ÅÂÇÅÎÍÑÐÑÈËÍÀÊÌÅÓÎËÎÈÄÉÆÆÈÌÊÓÓÑÕÏÒÌÓÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCQM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®·¨«·×ÔÕÙÙÑÎÐÀ¼Ìɶ¾®¦ª¨¡¤±´UPSRe¦ }qecc__a__a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÆÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÍÄÉÏÌÊ˿ɿÇÉÍÎÏËÐÍÎËÎÎÇËÏÐÊÎÊÂÉÆÉÌÊËÑÒÌÓÑÑÏÏʽȹ°®»¸µª¶°¨¸³¿»±
zvopokadnpaW\ZIFFDMWE;@<33<=87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6==?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¤¬®¾´°ÀØÒ×ÚÜÖÎÍÊÃÒÏÁÀ±ª¬ª¥±©mMJNX k^^^adb```a``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÕÊÀÊÁÅÌÂÈÉÂÌÃÅÈÊÊÎÊÍÌÐÍÓËÅÈÏÌÈÇÊÄÆÀÅÊËÍÏÑÆÐÎÍÍÌÏÅÇÀ¸¹½Ãýù³²¾±»Ãĵª¥¢
xpqkmg``phXXhVLFLIPPB;D>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;776?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÂÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÌÏÈÖÕĵ°µ¨¡«ªaHDQ|ebbb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÏÎÌÔÊÇËÎÏÇÇÏÒËÐÏźľÆÉ½ÂÇÉÎÄÂÈÀÇÍÇÃËÊËÏÇÃÄÐÈÆÁÅÇľÀÇËËËÎÂÊËÈÇÌÐÄÅÇ»ÇÃÈÈÂÏÁ½¼¿°ÁÉǹ½ª°²§¥¢£wntdk`^fpa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ¼ºÍÍÆÐÕÕÙÚÛØÐÉÏÏÑÓÈ·¼¼®¥³§³dIK~
s`\^^^`^`cdc_]]^_``_[Z\`krrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÈÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÁÂËÐÄËÈ¿¹Á»Åǽ¿ÆÏËÃ¿Ã»ÉÆÈ»ÈÆÄÊ¿½ÂËÆÅľż¼¿ÃÄËÅļÀÉÂÅÇÒÄÀÈ¿ÊÉÆÇÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {vstfiZanlZ[XRDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ËÏÑÌÇÂÃÆÍÎÎÌÕÏÕÙØÙÏËÒÍÍÎÈÁµÄ¿³±·«¹uWyz
vxurp_Z[]``bcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ°¶º²²³²±Â¼¼¼º¸ÁÁÁÅ¿½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅþ¼ÁÍÃÆ½½µÁ½Ãº¼Æ»Â¹³¼ÅĶ¿µµ½¿ºËüµºÈº¿½ËÃÁÅÂÅÈÆÈÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½²·°²§¨¨¹°¥°«¬yvwjdg`hocV^YJFJFHJAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÃÄÈÎÑÊÊÊÇÍÍÎÑÈÐÆÕÔÖ×ÍÊÏÅÉÅÇÁºÇ¾®²®°x
x~|ttc[\]^``bcabeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸µ·´³³´ºµ¾²·°µ¯²»Â¼Áļ¿ºµ³º¾À¸Ç¹´»¶À¼¸½ÆÁûµ®²¶º¾´Ä·»µ«¸½½¿½°º¶¯¶º²Å¼¶®»¿´¶´Å½¾ÂÅÀÃÅÆÈËÅÀÆÆ»ÇË¿ÏÊÇÃÆÂöý½¶¹¾Ç¿¬µºµ·¶xtxfgebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÎÈÅÈÍÌÐÌÍÈÊÈÊÉÊÄÏÍÒÏÍÅÇÁÅÁÀ»¹Ë¸°±¯{x~wx}ti^]]]_`_`da^dec__\[^\]^Z[[]_lpmhfjmnr|¤Ç¿¸¸µ°«¬§¢ª§«³©«©´¶±²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°¿±½¼»¶¼Ç¹Â¶ª¨°±¿µ·¼¯°§²³´»¼«µ¥®¶®º±°ª¸°»®»¸»À¿½¹Â¿ÇÃÅÁ¼ÆÁÇ˸ÅÇÅ¿ÆÃÃ¹ÄÆÂ»ÆÉÌ˳¹Â¼º²rvvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÅÎÒËÃÅÁÅÏÇÍÁÃÆ¿ÅÅÃÃÊÂÉÊ¿À½Â»´¶¶Å±«°®ª|v|x~
z{wo^]\]]_`^_dcbccb`_][[ZZ]ZZZZ\enohfgiknr¹°µ®¦¥§§ ¤ ¥«®£§¢«ª¬ª°£¦ª´¶±½¹¯·¯¨®·´´¼¸³¼¯¸¹´±¼Á±À®¥¨¢«±²³§¼ª«¨«¬´³¥¨¡¤¯©²¥§¨¥¨·¬°²·ºº»±»½¾¾Ä¿µÂÀÇÈ·¿ÀÄ·Ä¿»¿Ä¾ÄÈÌÊ¿¾ÃÀÀ©rtrji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÐÏÌÃȺºËÁ˾»Ê·¾Ä¿»Ê¸Á͏¾·²°¶¾°ªªªn{~~xt|swf_]\]^_`^_ccab``_^]\ZXZ[[YXZ\_fkfegeikor
ª¥¬¦ ¡¥¤¡£ª£¢¥¥¨¦® ¤¥«²¯¶·§°¬§ª´ª´º±¶µ®¶¹±¯º¹±·¤£¦±§«¨¹ª¤§§¨§² §¦¤¦¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹¹Â³À½¿µ¸»½¾¼ÂÇÄÂÿ¿Ä wpkaf_ko`TY^HNgOTHEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676778666;::;9;;<859<:>>@;ȵµ½¸ºÀº½µ ¡¦º¶«³³»³ÄÏÉËÂÆ¸·ÇÁÌ¿¸Ê¸¼Æ¹´Å¸´À®¸¾´®§±·±££¦t|yutomkjjqi^`]\\\^`_acb````]\[\\XYXXXVX[^_dcbegggjmo© ¡¢¡¢¦£¥¢¨¢ª°±µ¢©ª©««¤´¹·°¬³µ®²µ®°ª£¢²¤¦©¸¢¦¦¨¬ª ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«³³¹³½´¶±±µ´¿¶½À½ÃÁº»½zrk_e^ddXTW]IW\KPGIIFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÏÈÈÀÆ»»ÄÃϾ¹È¹¹¿¸³Âµ²½½®¼¼´¤¡«®« xrnpnkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bdeeffhikr¨¡¡¢¨¥¦¢¦ ®®² ¥¢«¦¡´°±±¬¨¯²§º³¦¶¡¢£¡£¡©µª¢£¦¥¦£ ¬¡«¦£¤¦«³³ª´°²ª²¹´¯©¯²²³·³®©¬®²¸°º¶¹½¿·²±
yue^e^[YVSZUK\QLIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÂÌÈÆÀÅ·ÂÀÇηÀľ´ºº³À·³º¼¯µ·±¡§£xoqtqifdhec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXWVWadecdeddhjv¢¡¡¡¨£©«§¯°«££·ª ®¨¶©¦§°¤·°¤·¢ª¦¡¬¸°¢¡¤¢ ¡©©£¡£ªª°®¨´«ª¦²°¥ª®²±°¯®¯¦§§²®±´¯¼´º·®£yud^aVYWSRTKM^LPKGGLLE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§£ª»À½À¹®´¸ÁÌÇÅÂýƸÈ̲Áî½¼¶¼½¶º»³³´¬¤¬
}wqilrtpihedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[cccbcbcdfj ¦¥¤¦§¦ ª¯¦¢£¶¨ ¡¢¨´¡¥¨¥°¥°¬µ ©¡¢±±¢£¡¦§¡¢£¥¥«¤¥°§¥£««¦¨®¯®«¨ª©³¥¦¬¯´±®¼µ±¯¯ zvrda\Z]XNLRHRaMWPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¥§·»¼Áź±¹µÄÉÉÀÃÆÆÈ¶ÆÄ³ÂÀƬ¸¸¾·¾¼½¸¶°°«£¦vuncbfihfhjgjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTVURURU``_`a_`acdi£ ¥¡¦¤¤¢£¢ª«¥¥±© ¥«§¡©©®¡¡¢£«©°¢¡¢¤ ¡ ¡¤¦£«¥¢¤ª¤«®¥²©¦¥¦¦´¦©¨³µ´¹º¯ª¬rpo`[WVVRGPOHZ\ORITKSLEFIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:86:8698989;9@9{µ´´»²¯«±¨§¯¹¹³ÀȺµÀ¯ÆÉÍ»ÁÊÌȵʽ±¾ÄÊ®²¹Ã·½Â¾··®°©
u{tiiilgjlmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^^^__bdm¢ §¨ª¨ª¦¨¥£¤®¤¥¯© ®ª³¥¦¢£¡©©¡ ¡ £¢ ¢ ¢¨£¢¨« «¯¤®·¥£¤¢¬ª¨«¯²·²½µ³«¯ssh[XXSUQEXLQ[YMUNPLPQINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³®¨³¶®©§¯©¨¬·¶¬»Ê»¶¿¬ÌÇÆ¹ÁÎÏȴż·»Äɲ®¹Á¸¾À½¶¹ª®¤wvwnmhmnmphgigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]\\^_`d~¢ ª©¦®ª§¯£§¬ ¤¨§®§ª¥¡§ª¥ £ ¢¥¥§¨¨ ±°¦±¼§ £¬´«®§°µ°¹µÀ±±«}qrbVSVNRIFVPRRLLXMJLNRGMJACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¦±·ª¦¢°«ª§©²±¤¶Æ´¹º³Ëƺ»ÂËÐ˱¸¸¼¾ÁIJ±³¹®¶¶½¶¹§¨¡¢
yjglnqnqjpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv¨©¥¤ª§ ¥¢
£¢¢¤§¡¢¢¥¤¦¨¦¡´²¨²·¡¢·¬ª¤²²¥µ»µ««±£xrm]NQQLOCMNNPKFNNJJNMQIMJAGLHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12776:999984988A7w¶§¤¶°¤§£©¥ ©¥¤³ª¢²Ãµµ²³ÆÆ·ºÃÊÌÆ³»¾µ¸Á°®ª²¨°½²²¤ ¥p^_frpvqiniehhj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXYX[]aosvq
¢¡£¤¡s}
{¢~~ty¢£ ¡££¢´¯¬¯¬¥¸¦¦±¡±®°»ª©¯ªvrbUMROPMCSNLQMBPQHINSMHJJCJLFKK<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-11764789::65:87A7x·¢£´¨¥¦¨£¦¥¦¦¦³§¥´Á¸¯´°ÉÄ·¹ÁΞ³»Â¬®Ä®©£¨¨¹°¨¥}gWV_gfighncjigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo{syz
}xro
}¡ §¯©¨¨³¢¦®¬«§´¢©£~rm_[NSRVLDTJPMLFNOIFLQMKOJIMPFII<7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©§¢©°¨§´Á¹°µ°Ç·³½Ï¿¹¯¯¶Ã¨«Æª¤´¦x{^PLRUYZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tPBA}
x`JQnx}
n~wuuwpQ|~xvhw~¤£¨©¥¤°ª¡¤¤¦ª¡©¢¦¨ule^[HQQRMIUMSILKOIHGKNLMTKQQOFIC<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶¢§¡®¡§¨¥§¨¯ª¶¼¶¸·³Â»¶¨ºÈ¸¶¨¨µ¶ª³¾¨«}vtZMKMNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut|
{uxsnupty}ª
yzhv{prmxxz{vrrwhu{{© ©¥§¤ ¤rg`\\JVOQGJXROJMMRJJJMPHLQLRTLEHA<77;99>=:;<98@?::>=7==79937795675252572/2.,//200/-+(().1272198798775:<;7v®£¡´©¯©¥¬°±ª½´²»¸¶»µ² ·º²ª¬©¨³°¢{|vunZKHHHGEHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u}ygw}gyvx|r|v{ok~|s{}tfv|lohs|lyq}pmuqiq~pC
wwz
}zu~£¢¥vnlebZWWTQJSUTOPNPVKNKNOJQNHNOKEC<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©°¯±«¼¸¬»¾¹³¨°§¬¥©¥¡zzurzvpqoZKFGEA@CDILLMQRPQSUTTUVWWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{xn|yy|
omxsxjjr}Inhw~licly
ksl|nr{impsz}~{vots
ywp|~mhmnnWUWTRQYORTTSXUMNHNJMNKCHNGE?:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,4567485HA895w¥°¢¬ª¨µ¯®¬´¿«¼Â¿¦¢¤¡¡tzxsyoupjnn[NEFC@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZRY\`§bitze~pmzvtlts{jkMy
g1vsl~~tfet~
filukq|gqq{n{s}|qpnum~wytiyyvjjngdWQZWYY[MPUVYXNIHEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226,+5775478iO8;5n¤¨®²¦º®«²°Â±»ÃÇ
yqt|surqqhrjaTFIC?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ q|xm}lr
zyr txsu5q¨¡¡¢
vp||shfbinrmpuioXupwl{}mqmpzsvmbv
ux~~zqpok^Z\][YX`^RN[ZXWLHJEJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µ©±®Á²»ÁÆ}n
ul}wyynxpxfj^IPG>@7448;;<=>@BEILLLMNPQSUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|}
~v¢y~
aªzw~s{\dqtz{wlgjbyo
znwtzptywkni]w}|
}q|uw{}uorsef_[Z]S[f^WQUX[UGJJDKG?F@DC>AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk}xs¡
~~p~ziwkRWL@E211267688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z|~v¡¥¬©H®¯¯¨sl|}hghx~n
q
Gkwryvhmk_v}
z{uv|wmow~rrqkZ\\[ccXfe[UOPVYPDLKFNICFCCA@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¡¬¡¦¸¯³½³}tp~}}~¤
x~sx_cVKB60./23123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?94.]ps£UFIKMNPW`YpZ\^j
~
¡¡¥»±§»Çè¡¥{rv
ihotqw{v
}nvug¡«¢{zzogkx~x}qjc]ZZ]i\af_YOKNWRQIPKDNGCKDCADCA<:87=<:<:88778:==8<=68656623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupgx{¤¡¬¦«¯°¡xw|lpj]CA4--//./02234779;=?BDHJOQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¢
lpuvql
r¡¥µ©¢~kjk|r`\b^Yfj\kk^WKGOSQNMLFIPDDNFBCEGB>997=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<unhYppuqv~§ ªge¤~y}
xxgMR>/..,/.-/000212457;?CFNPRTPQRSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©¡§¢wz~¡{v«³ }¤¢¦¶°¨lss|~zog_[_^afc`gg\QEJKPOIJLFFMCHLFFCBGD@:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Pqu`n}bw}|ªªBD}x{
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=GG@A@8662<9;FHGIIMOQYmw£§ª´½¸¥®¬¬§¨´¬±·²²»±³¾³Ä¬»É˸Ŀ¸¥£°²¬«¤
¦¦ ¢¦¢ª¨¤
£ ª ¤©±£§·» £°££¤¢«¯³µ¢¥«z{~}f_g[da]cc^ff^[OCIHTOFHLFKHEFHAKFCFFA:87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicXjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1/-4?DAMUQRTUUWUM[PGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇë³Å¶¬³À³¸¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´±±§¯ª¤v¤¡«±³©¨®µ»²º¬¯µ¢±¬±µ¼·µ®µ §§£¨©°²º¸¸§·©¥ ytX`cUea`b_`e_ZUJDELUQIJJDJHEA@@KDAMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL[ZQcdWzuq}
v~{¿»£¼´y
zyn]V@EM<6:46AB764//6CHCQ[OQUWU\WO_UIKJA@?GKFED;>@7D7?BJJEGWTP^¥£±´Ã¶¸ÁÌɶ»Ä½³´Á·¸Âµ¿°·t±´¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥±¥¬§¤ ¬²º¢¨²¹µ»¾Ì¿Å޽³Â·º¸¿·º·¹±¦±ª¾°½»Â¬»¨ª~ziWa`WidhdVZcYVTIGGLQGDIJAHD>?BBK@@LC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FQLALRWTZVZwjp
nzsxb¸¡£{z|}}xyueO\dGEL:Qda[^SF>;HPDZdQQYXZgZT`aMSOEA?IJHEFA@C=E6B>HGKMSZT^¯¸µº¹ÉÀ»½ÉÌ»½À»·µ¼»·¾µº²Æ`u²¥±«¾ª¥¨«ª£¢²µ¡«§®¥§¦¥¤¢§°³¨²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÃÀ¾½¿»¼·´°¹··ÃºÆ¾Ãɰºª¢¬¥¨¶~q^a`\Va^geRXaVRUIEENK@>GD=KB=B@=F>;H@796379>489:57045/26389373526?8@>GKRTTRPOQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]gmlq
smsrsÕÀµ }x{{yt}zkepvY]\Peeb`ed][XW\MdmURmn_o_XgeUYTJDAKKHFHHHHBI9D?HKTTV]Z\¹À¹½·ÆÀ»¹ÊË»·º¶¸¹³¸µµ®¶¶du©p^¢¡¢¤«¥¨¥¤¬¤ª°·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊ¿ÉÏ´¤»±µ°¬¹½~xj\_[X]`YbbQ[`SQKCBEFE<@E>BHB@C=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi`onlotu³¬¡¡
~|s{
|ts{xlmu|iseilifjji`fihmZmt¤¼g[oh]ZYTHJNPJKQLTQHLAJGKP__bgjb·Ç°¹³»¾¶²ÄǶ°¹±°»¬³±§«·¬¶§§N ¦¥¡¦¬¯¨¯§³³ÓÔÔÖÑËÏÓÕÎÓÏÌÆÃÊпÊÉËÉÒÈÍÍÃÑÒ¸°Ä½Äº¦·»Ä¢mb[[\W_WYeYP\WNQCBHEBH;AD>AH??B7;D>@H=46655;:687654/10146278875367C5B8?-0,1349=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshqoyy ª¦}
|p{r}qxulpxr{nxslipmcimpyiw}~Ë¿Âß§mcxod[a`JPRUNY^P]]NPNTQUT\nnwr®¸¬´¨°¶«½À±«µ¦¥¸§¬® ¬´¤±®¦«¬¤§¡¬¬ÎÒÕÑÍÌÒÓÔÐÔÑÎÈÃÔÑÈÎÒÓÓÖÍÒÑÅÒÖÆÀÎÈÈ鿸Ðxld\a\U^Q]ZNOSPNH>AFBBE<@B?EE>??:===<JA45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwmwp}~¡¡
y{r~z
v
ovsls||w|sxqkrrioqzyr{¾Ë~±vr
whaj]CZZ[WfdXekTX]\`c]cx{ª¤¤¢ ¡©¦ª±¹«¦´£¢¢£¡§±¦k¢~¬
§°¢ ¤¤¨ÇÍÏÇÁËÐÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÉÔÚÍÉ×ÖÑÊÄÃÌqmb_^WRXR[OJGIIJ@;:;EBD<BD>HB?BB;;9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu~isyr
x~xs{}w{nwpmuvx}t|ylvuo}vuy{µ<AÆ¥~|jeWICecfchjdoy[_fhknin ££¦²¤¥³ ¢¥¡¨¢±~
z~ª£}«³§§½ÃʶÅÍÒÐÑÏËÒËÉÔÏÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿Ì͵vumc\XQUPYUEFJIEE=:7:@AC:GE@ECADA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopbqqs|~
}y
zyqz{vzzp|opzr{qnzuw}|u|°tY©Â¶pnc=^hrpqpnxweioruxr{ ª¡¢¥¬
}
~my{®«¦®µ¼¨½ÆËÈÉËËÏÉÃÑÊÔ֨ר×ÕÛ×ÓÚÛÖÐÛÚÑÖÉÕÌwyggZYORS]HBEII>A>=7:=?;>H=@BAADA>?:87DB755479.566435532323647553457EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqy~~|}~wyn{{tz¡vutu}toot|
zv|¸Æ¥ÃÉ·xpeNeczw¢yyw{|vm¦ £«
{|¡¼¡¨¦¥®§µ¾ÀÀ¹ÇÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÇ
ywehc_SVVUMKDND;==<9:<>9>A6>?@=@><9867CA6455=80665547745613854564557HH=DJE7925;H>;::7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yea][htzylwvz|~|
{~
z
{u}um}}~t|}x~yot}
|~{©Ã ¼£}}rs¦
{iGq¡¤
¡~¦
¤¸¡§ £®¶ºµ«¿ÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û·wwviidV^ZSONHDLB==>99;:99<=6@>>==9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqsx{{}{{}{~uysztm~}w¡n©
z |~£¢£®
Wr¬\¢£¢
¤
³¡¡§±¸¬¥¼ÁÇÍÇÆÏÌÏÌÏ×ÏÑÔ®ÖÕØÚÙÚÚ×ÖÙÙn{sfe[\WRUWC@ID??>:49:;7:;:3;<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxlb~omwxz{}|{v
sp
{vwvt
}¦¢¦¢§r²§£ ¡¨¯n·ÄȲ¢¥²d¤ÍÈ
ª¤£
¥¨¡¢²´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎq}gb]]\NITYABGD;A=837;<:8=649:<:72?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcFv}|m~xz~{vv|mnz|xx|~£³§£ª³¡§¥¤®¢¸³¡¡¤°£¤§§¬¯¤¡À£É¹«£¦²
¨¢
u²¤¡} ±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ¦ÎÍÓÒÑÖØÓÐØºqxt[_T_UOHJNDBCE5>:77:?<<7=42669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGN[\YJf`;Hzzn
z|y~px|~}orz}|x§»¬¨²½¯¤³³¨£¡°¬µ¢¸¥¤©¸§¤£©©£¯°© »»®Ê¡j¶¸«°£¬½£^ª²|}´«¡¡ ¥¯¨¡¤³¸«ÂÈĵº½»ÅÇÇÂÑ ÆÉÍÍÅ×ÖÑËÔ¡oyg[YS]POEC><CAB8?875?G=<6<35345454B39:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdGb`bpJ@s}um|}}pww{ªÂÀ¯½Æ»³´À¼´«³¶¨²½«»¤¨¹¸«¦¦¢¢¤¢©¯²±ª¤¢¦¥¤º¯©À¼²¹¦¤¨~¼°z¨±¬ £¬ ¡§¦¤¢£°³§ÁÆÃ¯°º¶ÅÄ¿ͦÇÄÇüÕÑÍÅÊrq`ZX^ZLJBK@FG>A?B;:4>A==5<6>333241A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GD?CF\eG`igZ]\{uo~{q~{z§³ÆÉ¿ÂÌÂùǼ»¯«¹»²·º²À®¥À¤«¯»¼ª«££§«®´°© ª¡°µ§£º»¶Á¼¬¨²¥¤¨
©Ääz¢¦ ®ª¡ ²¡¤ ¥£¦¦¤¯®¥¿Ä¶Éþ¶Ï²Ä¿Ä¼³ÑÉȵswk[VZhQLHCLKKJAA=CD<5AD;;3=8B332263A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeYNe\fTcjyr|xz¡¨º¾ÇÈÉÁÒÉÊÂͽ³»¾§º¿½»Ã·¬Á©¬³»¾ª°ª¤¥¤¬®³¶µ ®¥¢£³½©¨½Á¤··°«±¬«¬©§¥¥vz
££ª¥|£ ¢µ¥¤£¢¥¦¤£©§¢²¬¨¼Àᥲ·ÌÀ¹¯Ä³»¾Â¸ÂÃÂÀkx`WVZZJKMJFDDHBBADL:4DH9;4<7E.12352B26SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddV x
¡®¦¤Â½ÇÃÇÅÓÍÎÍ˼·°¹¼´¼Ë¼ÃÁ¶¶»³¿¹¼®¯¨ ©¨¶®©²·¬¢§¡«·¸ª¥°¿Å±½¹³§ªµ³®¥¬¨ ²Å§}}ª¥¡£¢Z¤e£³¥¡¬¬ª§¦ ¤¨¥¶«©¹»Ã´¥³µËÀ¸ª¶¬²º¸®¨¸º½¸jmYVSTMEJRNK?AHEDHGG95FM;>8=@J.32025B55PWN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;=@BFBpEiIRebLF¥¢©¦¢¯¾¯¡Æ¼ÅÄÆÆÎÎÎÒʾ»¶±º»¼¿ÏµÃ½¸¸·²±µ³¸³«¦«¬¹ª©§¯¯£®¤§¤¥µÀ°«¬´¿ÃºÀº³§¹µ¸³¯¥®®¤¡tÁ}±¥£ ©¡ `J¥T°¯¤¯®«¥ ¥ §¢´©ª³¼»»ª°²Ç¿¹¦¬«±±£¡±²´¤old[YNOKEOPQQ;GJHGICC>:KU?A:=EM07544:B34NWO<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯§
¡£¤µÈµ©ÆºÂÃÇÊÈÈÌÍÆ¾»³®¹¸ÁÁ͵ǺÁ¸µº°®¯³´¦¤ª´µª©¦¬¤¥¤¨¬º¿¨«¶·¾Â¿¾¹³²Ä²¹½¬£®µ¬¹¦¦v¿®¡¡©§ª¡§nv¢¢®²¢ª¨ªª££¥¨¢±§©«º¶½³²¾¹· £§¨¥§¬©©ad`^QJLFHMIVL=MDNJKBCD<QV=AABDO18=77?B75UXN?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUHe^HE«¡»¯««¢¤££¶Æ¾´ÀºÂÂÇÈÅÂÍÈÁ½¹²¯¸´ÀÂʵŲÁ¼´ºª¨°££ª´»¦©¦«ª©®§£ª«¾¼¨¼´¸¾Ç¼·¶¸Á±¾Á´©µ·«¾¥¢¢ ¼ ·©¥¢¡¨¥³¡¦¨ª¤¢¢ µ¯¥¤¯««ª¤£¨©¤¡¡´´ºµ¨µ²³¢¥ª¡v_[_]JHEFMQHMEFGBRLIBEGAVRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19g\FCCpbGE§¤Ã¥©ª§¦¬¢«¶Ä¼¾·ÁÂÀÇÄ¾ÍÆ»½¹²°¸³¿Âȵ¿°¼¶¸¶¦¤«¬¡¡ªªÅ¢¤©«¦¬¯«¢©¨¿·¦¾±¸¶Ç¶µ¹¸À³¿Â·µ³´¯¾££® ¡£¥££½¤©¨« ¦½¢£¢©«¡¤ µ¬¥±§®¦© ¥¤«±µ±«¥ª¬ ¨gbX`]NHGJNKHEDIA>PH@<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA46@9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ:nRF<KxebVL¢£Å¬¡¬® £¥¦ª¬¶±£ª³¶ÄĽ¿µ¿Â»È¾Êȶ¸µ´°³³·ÁŶ¾±¸µ¸µ¦¬ª¬¥¤Á¤ª ¤©¯¢¦¨½µ¥±¼¹¶¶Ä²´¸º¿³ÄÁ¸¸®³µµ£¥¡® ¢¨¨«£Â©¬¦¡¾¡¤««¬¦¢W¦¡ ¸ª¦µ£± ®¢£¦®²«©¡¢¥¥¤`cYc`KHJJNEEAFJ>=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrGE6=ue\KN¡Ã¨¥¢´¢²¨«¥ £©¬»°¨¬¶±ÈÅÁ²ÂýÆÃ¼Äʼ¯°¶°´¯¿Ä´¹±°¹´¬¨°©ª¥¡¨Á¬¬°ª£®±©¤¨½¶¦·»¾¯·Ä´³ÃÀ³Ç´»·¬´¶ª¢¦¤¬¢¨«°¯¯»²¦ ©¨¢¤¹ ¡¤¯¯¬¥§¡¢§´¦¦³£®¡¡¦¬°¥¦¡
`eZgeJILJRBC@IG;;G?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 餪²¡£´ª³¬§¢¤²¬®©»±°µ´ÆÀÄõÀĽÉĵÀÈÁ´«µ¨¯¸¬¿Ã³·®¬¶¹¥«²«ª¦»´§° ®´²§«¹²§º³¸²¹Àª·²Ä¾µÆ¨¿¯·µ©§¬¡¦¥¢¢¥¯¸®²µ¶ ¨¤¤ ·¢¤¥¯±²§ª¦¢¨ ¡¯²¢¦®¤ª¤
©©ª¡§
xbh\jjMPMNT=CANC::I?77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05IphVCWFyfC;££¡¦¿§¨¯¯¡©µ«º±«£ª´¶±°¹·°·¸¸Ä½Ãǽ¼ÄÁÆÀ¸ÀÆÀ¹©¶¤¬»¬À··ª¬±º¢±²¥§ª¹©¦°« °´³ªª¶¶»¬³³¹·¬¸°Ã»¾¿¦Ã«°·®©««¦«¢¢¡¡±¯³¬°¹© ¦¡·©¥£¢°±´«³¨¬ ¥¢£³°¥¨¢¨¨¦£}
jhl`lnWPQZTACET@;;HA7:XPd^PVWEY_]MLRN^KJ>Zc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251.-.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=§¢©½¢«°«£±¸ª¥¶´¬ µ½®³¸»º½¶¶À¿ÈĹÄÂÀÀ¸Ä½Á·¯µ§«·±»¾¿´©®±¶«®¨®¦¨§»¤¬³¬¢±°³¬ª¶´µ½®°±µ¬°µ²Á»Å·«½¯±¸¬ª£±¦¥©¤³ª³«ª³§ ¦¥´®§¡®±§´²ª¤¨£¢¨µ©ª¦¥¢
{elrgoq^FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8)C3YT\gK6zfL@¤¡¤¬¶¤ª¦¯®·ª¯µº§§±·Å·±·½Áµ´ºÅ¾ÌŹÂÀº¾¹Ä·À¹²´«©º¶»¹¾´©°µ§¬ª¬«««½«®²£«°´®¶²¹¸ª®¯²¨µ¯´¼½Ê³ª¶µ±´°¯§¡³ ¨ ¦²£ ¥¯¡¤£¥§³©¡¦³¬©µ¥¯±µ¯¤§«·¢¡«¥¢¡ z
{jmxmu{aE`jYIHYZ={JFD6AbTi[M\aJ[]ZRRRbaLKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C_Q\.*B/JGP[H3cYUKD¡±¨±ª¦¤¯®¶©·´¹¤¬´·É»´ºº¿¿´³·ÃÀÌȼü·½¿¿·¿¼±½§º¹·¶Â¶ª¬±·¦®«¨£°ª¯º£¬±³§¨£²´±±°µ±¸´ª®«²§·¯¶´Äƶ©¶¶¬°©§£¶ §±¡¤±§ ª¨£¦¦¥¸§¢²µ¬§±§®°¶¬¤ ¬¨©¸¢¥§£ v{
mpwt{~\Kel\KNc\>b{GI8GgWf\L^bMXYWTWTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'GbLV%-B-=ELQ<3rkICC¥®¥®«§¥±³´ª·±· «µ¹É¹®À»Â¸³±µÂÂÎÅÀÁ½´½¿¿º¾¼²Ä§©¹°¶¶¿¼®«³² §±¦¥¯¥²µ«ª±²ª©´»´²µ¬´ª¬¨©¹²±ÈÀ¸¥º°©¥¨®°¦¥£¯¤©¯££¢£¬£ ¢ª¦¦¹¥¬µ¶¥ª«¨¯¶®££©ª ¤³¡ §v}
|||psq}|}\Sdn^NYf\FD[G;NmXb[L`bNVWVWTYg]QRLcZ[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HeHJ+;H?3BHS,>k;GHª«¢©±¤©¥³´±´µ²²¡¬®½Ìº®ÀºÇ±´´ÂÂÑÅÆ¾À²½À¼¿·»Ä§¬·¬³¸»À¯«± £§ª¨¤°¤«²ª¯¬°¯°®«³¼§¶±²©²©«¦¥£º¬ª±Ãº¶»©¨¨ª©³¥©¤£®ª¨¢¤¬¥¬¢¨ª¢¬¦£¬¸±²¡©¢ ¬¯±¬§¨©¤ §
¤~}
|w~
srquk_Y`ncQsq\K;|F?WtXaZNc[NVVUWQ\b_SONhXWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1<]J0.JgDF8<B05EKX1@Z>LE¨¡ª³ªª°¶¸µ®«¥«ª½É»°½·Â¯±¬³ÄÃÎÏÿ¾³¿ÂúÀ³Èë®·²¸¿¾²«¤§ª°©§¨±¦´¯ª°®²±´¬´»¤¸³¬¬®§« £°·«ª»·¥·¶¤ª§¬¬«®¡©§¦±²¤§¦¢¢¬ª¡ ¦¤¢«¥¢§±·®£¦¢ª«©¢¥¤¤
£¢|
zt}sv£xj^`nfWecN?gLEbyWbYReTMVUVTO\]aUKMiWVWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<B+:JO^4D>HFD°¥£ª±«ª¶¬¶±«¥¬ª©¼ÀÀ¸¸³»µ¦²¯ÄÉËÑ¿Áº¸¿¿Â¹Á¹Àıµ±³º¿½²°®««§¶ª¦¯ª¹°¨±²®²·ª··¦´·«¬¤©ª£³³¨¨¤´µ ·® ª¨«©¬¨ «¬©¹¶©ª©ª£© ¬ª¡ ¤£¦£ª§µ®¨¦ª££¥§§ª£¤£
¢t~xtzw~oqggqx\`skO^VHmxUdVQcOMUTUPOX[bUHPiUVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;97*4:=+-331*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Ji5OD;°¡¦«®«¥¬°´µ¯«¦°ª©º¾»À°®¹®¡·¯ÉÇÈÐÁ¾½»¼Â½ºÃÀ¾¿®²²±µ¼ºÁ±±²«³¨¤´¨¥³²¹°£¶±°²»«º¯©¶¬ªª¬£ ¶¨¡¯²¢´ª¨§ª£ª¡¢¬¨½¯¬®¢¨¨ ¬°¢¢ §§§ª±©£ ¢¡£££§©¥}£
xt|uxyztsyh¤ui^dktg}SXp^KxsSeSQ^MMRYfNLVYdXFSiRQ?CNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31.-5)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[+HM9UA4² ¤§¬¤§£¬§µ³±«¥±¨ª¸¾À¼¯§¹ª¦¯°ÉÇÈÑü¿¾¹¾¿¼É»Á¸°¯´±º»·À²³»¬¸¬¢´§§¬²¶¹³§¨¼µ®¶¾°½¦¬¬µ«©¯¤ ¥«§ª²¤³¨«§©£©¤©¨©½¬´¯®©¤ ®³£¤¥¥¤©«¦ª¢¡¥©©
~
~}
¡~r{z~|hx|zupp|gxdagbr
zmgx]]VAWzmTaPRXKLNqu]HZ[gYEUfPD>JNDCA9HGKS?jaJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11&/>KH0%90%,,09/,,+6'17#-0GjI14X=fcAJ7GS`U*=9DW>*± ©¦¥ ª¥¸³³¦©±§¸Á½µ¯¢¸¨¨°ÂÉÉÌÁ¶½Àµ·¿¹ÈµÃµ³±µ±½·¹½µ¹¶¿¡³§««°µ¸µ«½¼©³Á´¼ ¯³µª«°£¥¨ª£¤°¦° «©¨¡©¤¨¡»¨®°® «£¤®¦¡£ ¤ª£¥¥¢¦¬{{~
¢|yl~vyxc{{qpprwhsjgeg`mslaio`o@[xkU^OQQJJMTYWM]^lWDX`O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-78;2(09/,4/.=-*K>*49&'.34.0+/4&,:$41BhY13S=e_DL6KVdO*;2NX=#¬ §¤£§¤¸°¯¤¯°ª«¸Âº³¸¯«¨´ºÈËÈ¿·Â¾°´½·Ä¶Ã±®¹±³À´º½·©¹¸½«¤´¨©ª°®¹±ª»½¤°Áµ¶¡®¶µ¦§§±³ ¤¦§¡¥¬¨© ª¯§ ¦£© ±¹£±® «¡¬¤¦§©£©¦ ¨¡ª}}| x
|
{sp}qtt`yxinppnh}qc{miec_e
~_ZskrLL~hXZNPLJHPRPIN\_nSDWZRhOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23/:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*>0XV5(¦¬ ¡¤¢¸«²¥´´ª©¹Äµ³·®°µÆÈÁ·¿Â¹±´¼¶¿»¾¯«½¯´¿°¼Â¸©»º·§¨µ©¨«°³°§¾·¥¼·²°·°¨¥§¯±¡¤ ¤¤¡¯¦¡£¨¯¡ ¡¤¤¢·°¡¦±ª¬£¯ª¥©¥§«¥¢¨¢
z~zx
~yzprwoot_ywdllkihmerkkehZbs^ZlviZH}][XOOJHHRUF2:_^lPCWVYeLHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84GBg[HTCT]hE.;1_T,2£¡©¦¡£¡¸ª¯¡»¹¦¬½Ä³¯®¢µ¯¯´ÄĽ³¿º·±³¹¸º¸º®¿³´¸¯¿Á¸¬½º´¦¢³«¨ª³«®²£Á¶¥©··«²»©¦¥¨¯«¢§¥¦¡²¥¤ª©¡ ¥¤¹¨¤§¦¥¡¨©¢¡¡ ¢«¡£§¤y|
|x
{w~{lurmlsbyuhgigengghdfhj_fbifZezc`RsT[[SLIGIOS@!+j^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB378bM'2¤£¥¦¤µ¨ªº·¨¬ÃÀ·¯¬¡µ®§¯¯·ÁÀ½²Á·±®²¶µ¸·µ¬ª¼³¯²±½À·®¼¼±¥¶¬¦¦´©«®¡ ì©§±´¬¬´º¨ª«±¥ª¨¥¦¢¤ª¡¢ §¶¦°ª® ¡¡ ¦¢ ¦¢§ x
w{~{r~}gypkjlguskbgdctadefeijchoY^X]ldaMhW[`VIGHKLRX>9`liGBUS][IHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=++,0A*JK./*+3722(57$+7.72785\yN2>HiZLZJVbfA:3@eG%5¤ ® ¥´²£²¾·¡±Å»¹°±¢¶««¯©¹¾½¼À²¯®®¶¯³¸²§«¹±®®´¶»¶°¸½¦µ« ¡±¥«¯¥Ä¡³¥¯²¯·µ¯¬®¢§ª¥¨¦ ¤£©°¦º¨¢¡¤¥¡¨©§§{t
|
ofynhkjgqrk\hcbr`dgjmlgjgdl\lmvqaTbhceZIFLMOXQPUaeT@VSYUFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]1:Kj[M[KXdd@A1IdC'4¢±¡©²°¹À¶ ´Á»½¹±¥¶¯©®¥·¹¸¹»¯ª«·ª´¹¥²µ±®©±·¶±³µº¨©¶©ª¢ªªÂ¯¥¯±¶µ¬¬±¯ª¢¤¬¨§¤©£¥ £«ª©»¦¤ ¢k¢q¤v«¨¡x
mi~wpl}o]d`gkuwfhvifX]itnNPjdfqf^dfnli^]^
hOKD8ETg^JHPPUUKHS`oteE[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl15Ok[N\K[fb>G1Ob<+/¤± ª«£½Å¯©·Â¸½½§¶°¦«¤¸´³´±¹ª§¬´¦°µ¢§¸¶µ¨§¬¶³®´³¢©´«¢¤§¨®½¨§°´¸¤¨®ª«¦¢¡¨§¡¦¦§§ ¨ª£µ°£¢£¤¡¡¡¥§¬rx uif}sx o~|¡ {tvlmied{mrbTmcmiqXjpnW^i[kj[pmyriZ^FN>F^MERVVQPRWTg^LYKRRPEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*/(-4583%&2115>1<8Xt15Rk[N\L\g_=K1U`7/(¦¬«ª¨ª¿Ã¯²¹¼·À¿ª¤·±ª¬¦³µ®¯³¶«©¥±¥µ³¬µ¶´¥§¨³±²¨¯ª¡³© ¤¤¢¤°·¥¦§¶½¦¬§©ª¬§¦¢ ¨¤¦£¥¥©¢£¦¦ ¶¤£ £®©¤±¤yÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«°yhlX±®oei¼¼nhzmqØ~Sjc¶²~qu¡ªWOXaOVNFT[XQPS\W[P@\EQNDFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww11Tk\O[M^g\>L1Z\41!¦§ª¥²©±Â½²µ¿µ¸¿Â«¦´©¨¯´ª¯¶³¨§¦¶¥§¸¯²²µª¥¤§²¯®±¦ª§¤²¤¢¢ ±®£ ´º¢©¨¡®¥¢¢ª ¨¡¨¨§¢§£ °££
°kjª~g
eq§q®¡¤~wº|k¡v±_j´[¥e`fzfixj©e¾rg¦v±j|±xucmm§n\ EigEu`}f{£§Y_«ixzj¨8J¯[WTmc[LOX_\WV;NOWV/ITSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5^Y31¢¬§¥£¤ª±·´½¾°·Å²¸ºÂ§¨°¬¯©©±¯¤±º°¤¤¯³£©¹©³²°£¥ ª°¬¯¦¨£¢±¤¯¨¢´³¡«¡ £ª¤¡¡§¤£¡¬¥¦ ¡µµx
©µw³·«~k¦z
w«gj±[¬{tpx
°vwqkjl|O¥XHcc~ch¦`yquR^P©mcq}a/R¢n[Tkg`LK\cX\ZB>°xWXA#MhFCDA@A19>89:84;:9<9:A:E::;6:CB8=?KNH:5:AFBAAD<FD;0202;F,0.840,.(/2,>831/2-D1<<S}n3+Xj\OXM_fW7J8aU50 ³¦¦¢®©¨³¬ª»¶Â°¼Â¸·Áª¬¯®§®³ª¢¯¼ª¡§µ£«µ¤¥²³¨£¡§ª²¨°¨¦ ° ¯£¤¨µ®¡©©§© ¥©£ ¢¥£¢ª¥¢ Õ¹q°ÂÆ|Ö»|¦¤z¢¥z¬yV¯{~j¹Z¹w}¦|zªy{±nt»
nP¯§ÅQ zc`ªbsrl_Sµ´È
|c¤3Bu]PjhdP@XfZdaJHMkJZSOYfZCC?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[K\P_fT7G:aP72%¢±¨¨¥³ª¥´§¤¼·Á±ºÀ²¶´¼³¶§²±£±³¦ ¯µ¨¨º®¢¯± ²´±¡¤¨©°©´©¥¬¢¬©°¨£¬¢§¡¦¢¢¡£¡¢¢§ ¥ § ²nhµq«p¦r´ts¶{¤¢~¤~°uÒÑu[®|
¤oª¦k
}}{±sx³et
nfRÉZÂ\yb__vsb^YÊo¿uMKµSUÆdTQjcfXAOj_liPUFI8=WR[VYIC?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCEE>II:1746@>/.24252-).26,742&60;5:=Prh9'Wi\BNT_eP5G=aM62.¢¥¯¬¤ª»¬¦µ¥§¶»¼²»¿¸·µ»»´¦µ´¢²²£ ¬¯¤¦º®¤±°´¸ª ¥¡ª¥²¨¬ª¥©£ª¡§«°¥¢¬¥¡¤§ §§¢£ ¡¥¢
¬{w¨v£©o§¢¢~®
³\r³R®}¤q×}w~w¯w´ael[°WKuyf`^vwgj]¯wxl5yÈ®²_BTo]g`EPl`qmVUM.ebhSYP;BD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:77 ¸°³Á¬¨²§ª²º¸´¹¾¹¸³¶½¶¦¸´ µ ©«§¶¬¨°±«´¤© ¨¢µ§¦ª¤¥¢£¦§¯¥¡©¢¢©¦¡¦©¤¬ ¡¡ ¦©}}¥y¡ªp¦ ¢£ª{yo±Z¨ ytØvt§¤|{²^d }m\«\[hgªcr{jq]«Z kneOJC¡\ZMt]bfMZa_rt_JU5JXHE=HFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<PeeA&Uf[?1U_bL7FI_C1=7¢¿¬´Â®«¨¦´°¸±¶¿¹º³±¸½ª»µ ±¥¦§§ª±©¯ªµª¯¡¡ ¦¤¤º¢£¬¡£ ©°¯¦¨¦¤¨«¨©¨ ££ ¡ ¡«®nr´t©w¦s´yt´¥£¤u¸o{¢kk¶Z¡ei ¢§mr´t²jku³af¢nk\`N¡|Rs£ly~np\¯V<wfTon.[§ObRkeblZb\`p|cSYQ>>mo2BB@?M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U_aL5FM^91A8¥»¢²À®««§·©¸¯µÁµ½±¯º¹¬Á¶ª«¡§¤¢«ª§µ£²¨®ª¡¨ ¥«¹£¥£¡«¶¯§¬©¦¥£«²¤ ¨«°¡¢¡ ¡©ªÓ»t±ÄÃ}Õ¸y§y¢¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¢~t«}¾ns¼t²uxmqm¤t½]w}[ay¼jZV[iy^iadfbmyoY[YCA@r?CF+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-6@9¦¢¼¢±Â°©ª¬±§¸¯·Å±»²®¼°®Á²¬¥£¤¡ª¤ª²¤µ§¤ª¦¬¹£®¡¦ £¯¹°«£§§¥¤ ¨« ©¤²¢¤¦¡¡¤° ©
µ¸xµwnlosnysÁ»¼z²¨pt¹|{|¤»¹½uy³£tvut°ufi¶trqw¶^y}gymyb¬pt
X[§jDdYTf_c]cQggqmuBMPMD;ZL?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7>7070/9:.,/-*8/%&2(4$(>7/7KT_G'SaW8*O]]=+;VV'=:<¦ ¡¿¦³Â´«ª¨¬«©»®±Æ¯µ´®¸§µ¹©££§ ¬¤ª¦µ¨¨ £¬¥¾§¡ª¢¡¨¡²µ¶¬¤¤¢¦¥«©¥¦ ¨§¦£¨ ¬£°©§¢j~i§xs~uze{¾¿Àºnq
_rjZ]adk`cmvbke^_cqhr|fj~qty~}b[xthP\n|{jXlyrIJo
pNsMEW\faL[Wfc^OZmvjrRODEM<HI<M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEJOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR_I'S_V4)P^L(3>[O'?2>¨¨¡Á¤´º¶£¬¦®§¨µ²¬È¬°³¬¶¤¾²³¦ ¤ª£¬§®¤¥µª¤¢¦©¿¨©¦ ¥©§°²¾¬§§¢ª¨¤¬ ¤¢§¬¢©¡¯¦±¥¢¨£¤§£hn}qv´©
¡z¤
li{}urxyvv{jstudw}vkpzm`c[ogLXYej_WYpzonfSOFR9OZNRO(+;JB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¡¿¢¤±±· ©¦³§¥°µªÉ«²¦µ¦À¨´¡¥¦¥ «§¬££·¬ ª¦Á¬¤¢£¨¨§²Ã¯«ª©« ¡¢¥¯¦¡¤§¬¦¡°¡¢§ ¢£¡{©¨
{
£~e¡³®w{}wyzogykuyrisyuktcxf_hdcdfjXk{pjk\SLPD_UF@?>,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_]]]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@´ ¹¯¾¬«±² ª¦²¢¬³°Æ°«¤³¯¼¤´ §¢¡¨¦©¦¤¥³µ¯¦®¾ ¬£¡©
©¬¢´Ç³©¤ª§© ¤« ª®¨¦£«¡¬ ¤°¤¨¥©f|e~cxlhjz£«kd~g
eeihz¡kh¢wkj¢slnzyXe]
^lv[hswwnxxsmysw{i
X]jsd]sik|qmc]QNWIdX@J3=F7?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[I.6ZO6)EY/DO1YB;?.=¥º¼¹¯«³°«¥¨®°§®°½±ª¨¥°° ¤¢§¬¬£¦¨©³®£¢¯¦¶¹¥®£¡ ¦{¥¬¢¨³Ã·¥¢§¯£¤¤ª¨¡ ª¯ªª£ª§¦§ ¬¡¥±¤«¡¥«~¾r´r
hw¹Ä¸q¡£{¦sª|ËÀÀ»q£|À½ÁÀ{z¿}k¥²ooÊzwvyyq{px
ylvbe^xd_eb^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__a_^^^^___]\SMPGUNA@?=6468266*&%#)*&.+*)109*#>H[L*#CP/#F[3PY/UAB;/8£¸Ã´°¯¿©©£¯©°¯¦²µ¯ª¦§¥±««¢ ª§¢«¢¥©¥¤´¤£¦®¬¸´§¯¢¥ ¡ ¦ª¤«¿¿±¡©®©¢¢¤ª£ ¡¬®¨¬¦£¢¥ ¤¥¨¤©ªª¢¥¡£Îyz¥z_]¨ ¡|§t«¯^d©z¨
t³c« ³j®t|¸aY£Ínu{Û{q~ue{vvl}n}
~l_pjof`_xd\qhjcf`RTSW^JOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\:L-!P@F4.1ÂÀÀµ´°·£ª©´«¦²¬¤¬¦°ª §¦¢¯¡¨§£¦¡°¬¦®°«¨¬ ¥¥¨£®¤«°¨¿Æ³¨©±®¢¡ªª¡®§ª¨¦¥£¡ª¬³¥¢ªª¤¨¦¡±¢§ p
u¨q°|r¬} ¥w«}r~«v{|~ª¡~«{ zVÄzoÁ}mupmfweoawnrnmdnsuo`fmd_ohjnfcWS\`ZRRC9II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;92478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1-+¯ÔÆÇ²´££¢¢®¶¯©±§©«¨®««¦¢££¦«¢¦ ¨¨¢°¬¨¨¯¬¨§©¤¢¡§£®¬£¬µ©¹Í²¦®¬¢®¬¡©°¨©¨ª¨£¢«¯±¢¨¬¯¦§¬ªª²££¥¤j¤uz©uz²q¥p¤_`R«®u®§z
{f£¤£}©®^|¨U¢z£{ïÅs¯´³¹qb©¯Âuhlnmxwwnkfddqpf{ic]V_iXXTLLQLCCAB;CA@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°µ°¯ª£¨§ª««©¤¦ ¥¦§¦¤¬¢«¡¤¯¢ª¤¶°® ©§¤¡¨ ¦°¦£¨±¬¶È²µ©¬ª¢ ¥´¡¦ª«¢«§¡¡ª¢³¢ª³²¢«©¯¯·¤£§|ªlu«y|°n¤Ò·´¸É²^_©¤ zxªÉs£¨©~ÆÆwe¡¥s}¯^oµc±uK£m§Gd{p}ozt|zm[ejrqfi^aXcm\^YILLKEDBB=A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4NTQ;<F2,$¨¤Áƹ©³®¬¥¢²¹¬ª¡¦¨¦«¬©¦ ¦¥ª£®¬¦¡¬©¥§µ £¨«¶²¬¦ ¦§£ ª¦®¡£§©°´Â±²ª¨¥¢¤®¥¡¥¥ª®¬¦¥¬£·¬ ²¹°¯§³´´¦¨¤ Nxz£|¤¦¸{|y¹ÌÆÃ¶w¡~v¤¤¨~°
¬}a¥l£p
}r¬`¤rq`¼}RUu£{|szr}p\lnwrjnZc_hnbd]LLQSAHGFI99K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,- ©¬¤«¹«¯ ¡¬³´¦¡¦¯®®©¦¦¦£§¡²®¢©§² ¨¤¢µ£¤¢ªµ¹¤££¢±¦¥¡¢¯¤¨¢µ±Ã±ªª§£¤¥¥£¨¡¬¤¥¯¥»¬¡··®µ²¹²´¨°¢¤ÑµÃ·y
¦x¢w
¥q«
´nri£|s®¥¢¦mp²\¥szl{~n©a¢qqbs²¸hw¤}w|xlhwixsnt\ddmmeh`JZWX<HF?T3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]ZZZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH#)%r®¿¿¼»µ¨¤¶¡¢£©§®©«¥¡¥¡ µ§¢©§°£«£¤¤ª´´¤¦©® ¦¤§µ ª£µ«Â¯©«©¢¢ ¦£¦£¦ª¦¬¡¤¦½¬¾°£°³º¬µ¨©²¥©z§}|°w¤¥m²o {¡¨¬
®
¨¡¢
{~««x y¯]£|¦§d|tk®]¥kq
]`[ m¥yy~jl}b}tmy_fepngghBY_[=JS2T8BBC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZWSPONI7052.*,ATVVVTTUUUUTTUTSSVWWXVVUQHFIJ#((¼©ÆÃ¶Á´ ®¸¥£¤£ ¯®©£¹ ¢« ¯ª ª©¥®°¬¦ ¨¢¡¥¡¤¨¥¶¨¿®¤©£¦¤££§ª«¢£©¨¾¤Ã¬«£¢¬³º¬¯¨¢´°ª«v¯~
|ºd°e}¡§°
¦¤¡¢ [lj³`{{²lgn±[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m§zx|cs|axs|`ifpmfeeOUc\AT^=H(>9=4!!-$2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPNJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·½»´Á³£¦¥¶© ³±¨¢´ ³¨ª«°«®¨¢¯¬©§£¨¯©¡¥£¢¥£©²¨¼¯¥¨|¡ ¨ §¬¦¤¤¢¤©» Ƨ¥©¢«´¶¯¨ ½¯®®©£®¤¸Ãº§¬¯¦¥ª~սªb£¿½|~£×º·µ
½¾j£o«nz²±Çk«°½¬xw¢¾»t¥xyb|zcgx{`kekjbPb[Si\@T`BL)<:5/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´±¿º²½³¢®¦¥³¦¥¿©¶°§¡¿¦¦±±¹¨®¥§¯¬®¦£¬¢¥ª £¦§ ¨¢ ¬¬©¸§£{¦¨¨¨©¦¡¢«»©Å£ ¯£«³µ«±«¢½©°°tvª¤¶
eog¬mow¤ u°pr§£®¤rmmlexnmqzipifqhi
gpd]cioY]g~x¦`brofd¡|tewgjx~xdlcflbKdXJkY:PdDP'J:+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´ª»º²³ª©¢®¤³ª½±ÃȾ´©¿«¬£ ¦«º£¤¬¥ª
¥ª¢¤¤ ¥§©£ª ¥¦§¯¹ª«{¦¦§¢°¦¢¬¹ °Â¨¤³¦¬±²«¯©º¥°¹¡©¥¶¡©ª³£¬¡³£¡¡¢ ¤¡«¦¤~gtvtq§m| pgvnwu|yikddocU`Y@iZGb`NX+E=+&!640/!%2(*799469;>?ABDFJKKMPPQWUVY^_ac]^TQJEC>9=@ASX[\YWXXXXXYXXZZ[\^__`^^^__```_YY`¥©©¥¶¸®®¢°¥ ¶±ªÄ»Åº·©¡¥¥°¨£¶§©µ¦§¬£§¬¤¢¨£¨©¦¡¤§¡´¹§ª{¡¤¨µ£¦¬·¨¯Â®£·¦¯¯°ª«µ»¢±¾¦¤¦µ¢¦©£¬°¡¤²©°¥¡¤««¢ª
~fuvytj}
xqrx~q{~ind_pi`[_YmbP`dOY9GFE=2<=8/*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤§£±´¬®£©§ ¨µª£²»®ª«¡¢z¢°¤¥±©¸¦£©¢®¤¨ ¡®ª¨¨¨¸¶£¥y¡§¸£¯µ¢°¯t¤¾£² xz¡¬³½w®¥ ª~d[av¤~n³£¨¯«£e tzp¨l~¢¨e¥
wkvq|ai[vghry¢ewvhny~jpe_vokkh[ecaaoRZ=MMNRF=@TB91/&4:306678<;>@ABFHBGFIKLTUUY]`hggXQI<DG<9VR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥©£§¥ª´®±¥©¦ªs¯¨«§¸ ¤~¬¤¨¢
t®¥¨£¹³§ uv¥²µ´½§¡~§¢z¤°¹§
°©¯¢y¬¢¨ª¨w¥z¦{²zcynqzqt
xht t|
}ijxzppgdxnilj[diier[]HTLQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aahfYQH9DK<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°§§ª¥Æ¼¯ ¥¨´«§¢ ¾¡|
¬£¡¡¨¢£¹±§
pu£¬´´®Ê«¯·
°±¯©§|¨r{w¦h¤y´¦¨Â«¡q¥}
±¡| |
ms{r}
uÅf©¢jogwt{vghupghk^bnlfkXgG\QL2E46Mac7&4<DGD:63658;8>=<>BL?NIJKCPZ]\Wb^jl\QE=KM@JdX]cghgbbbbcc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹±ª«§¢¤ª¢¤©¶¢¯ ¦¥¼ y«¢
w ¤¢¸¬¥bm ¡¨~¡§ ® ¬¯¤ª~¢uk«tM«x¨¨ª«~¡{z§ilgµ}m`cX{dgs}yk]|n_Sq
\`ly`Ye~q§ªk£nr¥pgdlZlzeY_~aWPovemtqjjn^jolkhWhN]XE9@4GD^k4+ICQMN=84859;6@;;>BO>QRLMBJ[]_W^_bv`ME:MOMTb\[fgiibbdaddbab`bdcabikdbddgdbgeach ¹ ª£¦¬¡¶¼«¯¢¡¥¬«´¢§ ¦´u¦
¬£©¥°¦¢in¡¢¥£¡ w§¢¨ª
¥y}}¢pr{ym©|¢sv¦f~w¤^{}s¢n·´ºs¶¨dƸ{p¶q¤ct¬«`}j³~n}q£ls¤s}£^³o{³tr[²ibosuqhnXklrrd\h]aKD=D5QAZq2<RF_JS=<395::6D;;@IP?TMNQ@E_^[YX``|dIC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¹« ¥¸¶® ¢££¤«±¬« ¤«x
p¡}¨ ¢¨§¤~k{~} w¢ r¢©§©«®}z y£xs}§£d¡}lhnz§}rgsªsªg]
vhªj¸f\©pa^§vvhumj¦\¨~w»j}©Z]³g\nqxwki[pjyxa^dVaAPEO7VBRn4JZY^NZD@151;;7H?:CGU?XRX]>Db]V`Qac}jEB9N[^YdfXfgmmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬º²°¬¦§¬°§«¢¡ £iq{z£¨¢iy{¡ ¢rh p© ¤ª¡¨}°¤¢¸v£³¢£xzª~¢r¡}
°µ}k¡x~´££«¨{|~sªZ]o{xbL{{
dzBMY¢jr|nuy±³~¦t~mq|ori£]vHec`sp}}nf_khv{bc_P]V\TV@YEQgERV\aX_ID=B8@A:IE8LEXAVQZVDFa\Z`K`m}rEC<U^bZejVhhmobff^a`\]^`hb_ecvl^egfldelhhki±®S_¡§´º³³©¢©§ «£ §¡w
ny
}r r¨|l
q¡x
|£ £®}µ{¦z©¢}§hwm~s sq|
o®}£§¤p^©hu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²§¼wm¿¦ª´^o~ros¢r]£gt¦`h¦lÓznwykyvrl©¥g_dypkgfcnvwf_aQZePQaHWIT_WS[dj[eQFCKLJKBJD8P@PMXSXORQ`eeiRdxywJFEc]eZhjSihjocjf`c_\]]_hbahe{d^dgdkdjlfhlh°¬T\K~©¯²µ°³£¦ £¤§¨
{p}h}wpl|£ª
yvnw
¡y¢£ ³¡¢¶z¬§¤®¥p©|¤¢q¢®¤®¢vµ¶µÉ¡ta©myu¡w }oLf£ps¥{ytbl~ lrd`rtj{i³µ´Æ¦s~zj«tmswiytqPD}³^jujxfkgbttpmV]SXgORhIULXRV]gknVgWMJAJMJHJNAQJPdcimetrs~x{nu{{TQNl^h[kiRjhilgmfce_\\\_ibdhk{_]dgcjfnmeile¢¯§
f?¡²¬¯¯µ¢¢§¢¡£¤¦¥yjye~yui
z¥©y|yp y¥§gnxl¢d|q¥xph§|¥z rv¹n¢b}¢nriªku mo¦`iiu¢}_
uobh¡eiupdgns¢Z_[d¡n]o{srd¥nx¢df§hrn¡oRn ^d§T]TmmrjqmphkxskoQXVUeYSmIXO\HXihsjYkVQREV\LXRaUhj^wuz|p||r{svv^QsagbpgPjhhklohdg_]]]`jbjivu]\chcjirlfkmc¥¦zetm§®¥ª±±¦ª¤¡¡¡¡{qh|st}{e|¦¢«
}si¥}
ª¦¦x~¥²¯¥yy©t¥n¥¢¼n}¥¯ }¦zq¨ g~o¬cw¨l©¢vw«¦k°kv³©lnnb«ªw§w}
¤ iu«f¶sv¾¤Y¦«auqso{tqbj~nhlSVZU``\jL\R]I^lmv`[qY[`Zgsenoqcqt`wz~yryr~{{vbxdcnsdRlghomrifia_^\ajbllzo\\biamiwmglnb¦ª¤ªª¨§®£ª£¤¨
t
zo}surm}{
¥¥¥uol¨ª£ t~y¯¤qy{r§q}}zx{~~w ¡{}k
[yysypin~qtq
e_xvtuo{onn_wixfª~t}jou|umlfsw{w[jXyhnwqpowxo]lmigVZ_W\dkdUaU^Q_pwykjwejjju|pqtsaoubs{xuzuy
}{mldyn^Wnghukxjiid\`ZcielpunZ[bkdkkymhloaº©§¡¢¦¤¤«¢ ª ¦¨~r|}~ztrp
{}
x~£{§¡
wqª
¨ «~¨§xq{o~©
p}qjo|hm]sqtkvtYrn}~i]icz
_ix{|viykbqsw_r§fnwoxndfcyzZ\ifnv[zxwtmsrf\mkkbZY]YXkq[^`Y^]fs}{sotcjji{|rzwtdmthl{~uz|{yyp{}s~yrhT\qilvpugkgd]aYjhkjqrmW[enlgryohjm`«±¡£¡©£¡}«¡¤{|r}v
ror~z¦ x
z¬¡«¢¢££ª¢¨§¡|y¨~±¥²¦ k|vwe|
w|{u£~vqt
x¦{uk{yirh`tp}zvuowt]]ohn__Z[\RgqUc[[alht{|rnpdjih{mx~phoolf{rw}{m|zx|~zxNdvjsnq{ekebb`[sfpfrqlU]ltmhxzpgikeº¢¡¤ {©
|x{mxr~mk~z~}©q
}z©¦ ¢¦ ¦w}¥{|
ª ª~oxqua~t~
nyvu£
u}}ss|{y§u
{nj}{mhklg^y~g|{vtuuzw\`p}mt`cZ[^QfmSeZ]ajiuy~pllcjjgkrkjsnxnynv}
vq~{z|{`i{kuhiejc`i[cuhobumkTbqyeoyzrejmm¸¡¤{w¥¤xy
|l{xr
}|kh}|~|¦p ¡
|§w£ ¡¢¡£~
z ~|¤ ¦~}utpv`}q|q~
hxry~s}}rz|
{z¥
|
u
ydqz~xyplif^}sh|uus|rj^`tvpwdcX]^RjhTdX^`gjvxqfkclgejm}gmpj}wzkr}tv|z}irntibilb_qUtomn`xhlWjtvbuz{qbkoy³¥¥ |u£¡x{~~p~ztu
~wgc}x}y}o¥¥v¡¡z¤zy
}r¢ ¢{vq}mzc|
pkfvo}~x}}|ryz¢wv{t_ww|s}wfkc`~ijvstu}q|ccasnurmaY_]ZkdRbW_`hkuypbjclfh|khthloh|xmqt|~z~|muttmeljbcuVipn`xglajvpfy{yq_ql
®§¨
}v¨yx{}|{xsxys}d^}~
t}~~£ ~q{¦ t¦tmzo¢{yqyjul{~m
wo}~esj}
tz~vx~}
¤y
t}rt
l`ztyp|oanbd{anovswwssav`okuno][^]]j]O]Wbahmszk_iejchwmflhilg|zwos}tz}z}}ryyxnlkh_irchqoevgmlazhk|{xpawmª¡¤©}v¬|v}{|{vwotszo
}~|a\~szz¤}|£
n¡ o
gz
p¡}{ssukqnu|tnqt||eqmz~~
ttzo}
¨{}~
w~pn~bgwstnzb]o`jt^pjzxxlrpey]mlsmsXZ]_ajZOWWdcfqqe]ihgbgqndigdihzwuos{u
x
|w
zw{{ryjk_phskqnmqgoke{bnyvpkvw£¢¨¡§t© s{vwxrs{
kroymvnq[Y~vu w~n k
¤g~w~|}nvokmop{isqwtygtov}
zzwuq|{£|vxxnj~\qrqooxZ]o`oj^oi|zpmmjmw`pojqmYX`aamWQSYefbupb]kmdcfkm`ff_gkuqrptxvywv
|{vjqb|b
|opltjhnlvw_q~y{tus~¥§
~t
zrwtor
squlnlumw}mnUQ«yvry wz£
|s
ih qw{{||kvimkllzby}vzw|yhumu{rz
qx{{~
}}x}wphkw^womkqrV]naqa_mnypgpfftuhqkawe]Ve``rSPN[ed]xp|^\hqbbefi_gd[hp~okqs}v}
tuy{xs
~|yxfqj_~ookz`imtt_t|xwss
|y¡±¥~vtvspo
spqojiumn}|musRNᐙ|otuv{r
¡
}xzywim¤
cpz|z
|~m|erokkyy[yz~~zzhtlu
}l~o~{|wxxslepkitoghsmS^ndpZ_kqxfkkbgxsoqc_w``Vk_^vOMK`fc]yqt\[ev`aeec`fbXirsmkqv|tyuv~s{r}~vesn}eopkZknyys`vz{vrwwy¯
x~|
twpypnomn~rcdxp|nz|jhlc¤ÁÜ®ï¡skuu¡np
£~{ux
uwp~¥
^l|}
v
~~k}cxtimxsWz
y~
~yftklvn
{ttxusqftyasmoahufR`pgkU^msy`rc`i}qrnZbrabWnZ\wMMLcfa^vsm[\dx^`df_cc^Yirknkrw}swxw|q}}{tshuqym{ntpWpyvyqdvxivr§£|pxy|{rwpsjokil|t^`xv{ptzg`e|ëÚµÉÃÜslsvip
|zwxruq£a
h}}q~rwgvrhswkZ}
|vbtm}nly}~nrz
tlpjqw^shn\iu_RdqhfS_ovt_o`]hqrjWghciXmW[uLJLef^brs
h[\ey^^dgzad_]Yknenjtw~sr~zvzs
|wv
{vlwvyxunxz}Xy
qogxvdv
q¡¢sorv}{xqtnodr~hflww[_x{zqqiagaÕ¶¦xnqw{qj{h{{~
zu{{quw ~af}~~m|tkmwusvukc
~|p`sr|}zqf{|
npy~tlnijy|agiiXkuZRiribPbrxlbe^Zjnsb[g_dm_nTZoNHNfd\gnqkZ[cs_\clwde]]Zllbmjsvqo||tx
x
|uy|vpxy{om{v^tmizssgr}r uu~mv}|v~vqoljat|gbiuyZ`w{ymq~echhW^qr¼Ävq}qrj{|
|{uvw}ru
ru
|f}~r}f~|y}i}vfoyxsvslk
x
k_ry{~|~riy
y}}nm{}vsngf{ub[pbWnqSSnshaNftxe`^]YoosYea^jn`pOYkQDSg`Zknm|nY[^mcZbowdg\]`kicljsvpm|tuz|
v~xtryy~oo{qixz~ml{ukjxtl
n}vjx~yozsplid`szh_eqzZ`r|ygqzaee±²wJbZ¤ÙÐq{w}
nk
zy|xwoqu~zjy
¥ovyp{|nwhxr|e}~vcpshxpou|vxyk\qs~{rnq
s
zxno~vydgi{p^XvZXplNWqsg`Klvt`]\ZYt}soWg]fjq`oNWhR?Yf^ZojgzqZZYkeZcqy_h\^elhekiqwnl~uo{~v
qq{|zyujzko~t}or{zpoxg¡
fogy}~|ixrkkf_aoym_box\dkzaqv_eeÔê½2:>qx
v~ml
u}
|xnvwn
lu{tfy§}nuw
z{wkrh~xm||wayqdqh~muqu
su~so\nuy{|xzqlrztmkwtt\hgvoXV{RYpdLZrre[Ipxo\[[Y]t~thYb[genciMWfQ=^e\]uf`upZYTodYdqyZh]_fmgikipw}li~yn||zupnw}{{h{}js{r{sw~zx}|kl}kh~z~~~}kuqghb[bgso_aks`hpzbst^cd n\5Z¯µti|v
svpl
tyx|z~rgu~~oq~hvynfy¤~nv~|p{}{h~lk{zizvr`w~qdrftmu{|owz}u~lYpwuxvzxsns}znmjntm\gdrpQZzM[o\O\rodUKsxiWYZZaqt`]]`fdhifNZhM@`c[`va]umXWStaZdorWj^bhkgmlipw|li||p~~{zwq{oqw{j~{mwxvw}x~~zm£zuxklx}z~prqcf^Yf_oo_`gpfjotato[adjv{¿¦¤È¸q
r|xsqrozsutwyypcwzirvgwucj|}st
zy{kxy~tgzhlysizv}h`w}jktgziv~z~~p|w|t~bVx~ss}qwxqp~y~}v
viqimpo]gaqmJeuK]mUTZsnbQOsx`RXX]aos[a\heeckdQ[pICc`[cp^]xhUVUw^[enhVk^aigennhpvznix}r{~y|v}pwrmw}p{wyztxzuo~}
zw
{gt
y~{
vgpn_d[XeYmra``plkhnatiY^dnw©ÚªÇ²qwou{ztst~woqmtxuk`zyfqpgvn[m|y}x{nw
t
{ltv~mgvem{umjwv|abx
yhuub}{gu{tvq{}mYWupu
yltylu~{}y{s}sgtenksZi^tdGmmLZaWVVwmbPRtvWPVX^aqo\`cmdd^ocU^rFBe_]fh][zbQU\u[ZgkaVj_`nefkqhpuxtku~vx}w{s}ortqu~
{ww{|
x|}~{~svy zvtx^}
xt
w{bnm[aZ[aVisc`[gnofqaqfW\ck|Êι¡jmmlqq|~zyxsyuu|jlucuwof^}zerkjqcXmz
sv~|oqr
{x}qqo|fhqbmxqjkqx}|z]eywivxfwgt{qjo~yn|]Ysnt|ooqvhww}q{u}zrfsanjrWj^v[HmjMVT^SU{kaOTurPQTW^bt
i]`kjfcYnaYdpG@g\`f_\Uz]OUdpZ[jh]Wh`^rfkgqgprwxntzw~xur
pp{xvuz
z|t~}~~}|xvyx|muxd
so
ztcnjY_Z]]Tgrd`XdqrfsbkeW[`jx¾®{ ¶nbshs{qyz}~wwrvo{vejn`usjb^xyfqhkkZVow£qqyvns
}xtrnhx`jm`mvjgjkywzvZg}|xer~nteu
~ogkzumtb]q}lu}{fu}nqhux~s}l{{{xoelbn}kmVi_vUJijOQNhMX{haNUujLPTU_fuf^`phgaWi]\lhJDjYadWYTxYNVmjY]kd\Yec^tfldqgrouxp
v~w|
}usnsy{zsr
x}u~|{~{w|wwziv}{lqp
~pflgW]Z\[Sdpd^WbruiupeebW\\iporsddx~itutrwyvsumkzqbgkgtnf]_}p{imxgjdUWro¦|{vt|s}|n||w|}tpqlgt\lh^ltdgfizo{rYgvuhpxvbw
|njm{qfseanzgsx|~bvvjkqu{qzzt}f~ywncfbn|ljUiboRJhjOKNoG^{faMUtcJNSWajv~e]gsie`VcWcp]LKjXcaUTTsVLXudZ^k`\Zce_vgmbpisnrutwwz|t~
nrt|ztq
yut|
}~{~v{£¥yku|zuznsy}unjheV][ZZSbmd[Xas{ihmi`bW_[jikpgk`hyxjsttnz|uunzhjyj_enhvgeXbwj~{oipgf]UXog¨wz|yuppsvzxu
vjqughn[ld]mr_gajxh{m[nrtjo~yxaw
x
sroyrcqi\qxdrt|ybspgjytqlxxuxd{ywqddcn|}kkUhaeRJkgOGQkEaxgaMSr]JMTZekvze_mqid]V`VnnWKShWe^XNUlTJ\y_[_k]][ce`yhl`oounoxuz}wzzxy~qttyvt}|ks{
~}{v«zkryutnn|sjomddX_ZYZTajg[Z^ti^ml\aV\\leqt}ii\kvugsvrm
{}|xurlygixf]erhzwccTepg
wwghj`WVYgc§n~w{pq~hzoz|wr}ndurdhh\ka\oo\g_mudzh]torkq{}uvbt
{xruuapm[rtcqs
}uerlal{oji{zurf
v{{vqebems~ilTg]\TKrbPFVaGbwgaKToWJLXXgkuzdenqfdZW]XvfUJ\cWgXYIWePHbxZ]_l[^\ac^~ij_ntxnonvyr|~uuy}suuyzz}~isz}~
zz|sq{{}eqys|{urn
l{~lzbpobe]eVYYVcfk_]\r
hXpn[^WZ\l{bpwvmbZlssgtuplx~xwnntdite[gtfvvy_]Rffjt~bci\TX^bc¤hxtxmo{ixn|
{usx|xhdvl`f`^j_\skYe]oobze[w|knnowxstds~{vpr~sbxd\ppbqr}tgre^nvidfy|unout}trb_fno}diSgXWSMw_QJYXHbudaITmSJMZWilq{bllscbZZ[aw\SLc]XiSWHY`MFiuX^`l[[_bb\iganxylojvxm~vstsqwuw|}~~~pw|yxz~ttp¢{zxduxsxuksn~kx|pr^po`gblT[ZWhcmf\[qeSrn[ZXX`lvciuji^Ymsplsssi|~~{vonldiqc[krdtvs[WSearr]bc]SZ`\ceqq
tll{nop{||qwszzzceuh]bZ`g[^vhWb]ohaw`[{vijrnwsruhq}vsjq}nfwX]lncrsztgo~[`pqa_jq}llu~sqxkpa\ellzagSfTVQPu[QOXQHctb`FUkPIPZUkkj|emnq`[ZXYlqWSOfWWhSTFY\NHruX_cmcX``a]jcdmyxkoiuy{k}|y|nqowz}t|tw
utquo¢s{{ewnmznfwpzksvrk^tnagekR][VgalkZ\pdOon]VXUgjtgbtee]Ymtmoutxj|{vsddkna]nmcsxkZTVcdx}}q]c_cTZ`Ybcnp
tkh|pfsws|lztuoz~u^erc[^VadXateU_`mdaq]]~phisqsptvkmzqsgo~qsoT\gkfqtwsclvUbrkZ^of}emw}ssskm`Zdjjw^fTdTUPTmWQVSOGds_aEXiOHWTVmhd|ikwjaW]U[tdSRWhQYeTSHZZPMxvZ_eliYb`^^nafkyunohvvl}{~krgt{u}r|
{ss~vn¥rvwmz`d{pfxrxlmqvgd{lcfghS_^Ug_ln[^mhNim`TVSogslfxdd\Xoslqzwrl{vzykaelm^`ojeqy~gZVX`lx|{p_b^gWX_Wdbkp}xlkyn\wql{jvsno{rXim^Y]UbcWdpcS^ahablZ`~kfksunmwvli
ymqfq}nsncZaiiotts_ilSeqdUbnbzcqw{vkpmk`Yaght\eUaURNXeRO\OOHdp]cFYiMI_KXmd_xhn}c_T_T]u\TS`fN]aTSJ\YPYtu]_elhXca[^qcgjxqsngvtzrz~|yntlst
y~|
sstxro~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDBN¥¯®±a@DDDDE8.////+H
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR455553A©¶´´´´¸Y055557':|}z{z|}{}~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}|}}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}~~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~xuwyz{{{z{}}}}~~~~}~~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvy}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvttvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfgggihgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtttwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AE@>:<>><ED>?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrrtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;899;;:@;;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNMMMNONNMKKNNNMNNLTnpprtusqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;:;;89:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsusqsxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<979:9988::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;<<>?=<=;:<===<<<<;;:;<>=>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmqquutusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCC@><=?A@?<;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuy{{{}~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@?<;KG88:<9==@=:<;;<;8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pqrrrtuvz{}}|~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@=<=;>>97dl;8:88:;=??<;;<;:;;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{|}}|~~}}}~~~~~{NIKKLLLEILNM<?<<=>@@AA;BCBCA@?@@==FIJkyM<>=?==>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}|}~~}~~~~~~~~}QHKMMMKJKLOQ@?>>AA@@AGABECDB@@C[AQt}}{\?@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@?@A?@CFECBBC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vpoqprutwz|{||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AAAB@Aoc
~i?BCE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGDEFFFJNNKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@EFCJv{
tDDEDCWu~XGIJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJIIQv|pDCAUtWILMLMNLJGGGGDGGGGFHFHECCDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKJUx~UNl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIKIIGHIGIIIJIHFJJJJIJIJJJFILLJJKKfopssuvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKLKJX}}
uIIFB??@??><<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDBCFHIHHHLMLGIJMMNMJJKKJLMSlortsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHIIKQv~
fBB=88::9878896479;<:8567789787689;;<>@;999==>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGILHq
~T;8656766645773468:876565676778:77789;7689989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=ECDK{
H676468874578467699766765:::::<898977779:98878589;A=>>BA?AKLOQPQOOOQWkrrttuwz{{{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897;B:=M~z>:88;<=>9::;89;9:;:99;:9===?;;;=:>;9;;<;<;9;<8::;;999<?<<ABDIJMKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<;89989::9;??AJ}
l<;>BCEEAA@B>@B@@?=>>@?>?@?@==?B?AA?A?=@@@>?A<><;:;:9;?=;;==AACABCAXqqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;=<>@DCU
^>DGIKIIFGHDFHGEC@@CECB@BCB?@DHECEDEEAFEFDFFD@B>=@>=?@>???>?>>:;=<`qrttuwzyz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???=A?BCGEh
WGLLMKNJIKHIJJIECDFGFDCEFDBHIKHGGFGGEKIKIKKJCFCCDBAACBDCCDDCA=;=@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA98<>;<;>@@A?BBFFKJu
PMPMKNKJLIIIHJFDGHHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@98<;<=:?@>@@CDHHP[
qMQOMLLKLJIGEJHDJHGKJHJGGGKLNLLHHIJMPNONMOKIGIJHIDIHHFFGGIFCBACUnquvwy{xyzz||}~~~~}~}~~~~~TDAABGGB?8?@9:<8=>;=A>?ACFHJTq
^RRPMNMKJGFCGJGLJGKOLKJJMMLOPNHIKLOQPPQOOJIJJLJLFGHGFGIFEEB@BB\prwxyzyyyzz{|~~~~~}}}}~~~~UECEEGGED;?A;=<9@>>@BGGAFIINTx
|WVRRTROLKJEEFKONOWVQPOQSRNSTOMSLPSUVRSRPLKMMMKNGGJFFHJDDEEBDCcquyyzzz{z{z{|~}}~}}}}|}~~UFEGGGGHF>@B=?==B?BCFVNELNMQV{
gVVkaERQQPJ;;QSR`u]UVTVYYSYXRZfPUWZ]RTWQPNRPPPQKLKGHIHEFIHIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??A@EBCGEDELXRMSTSVX|
}al[dU:XXXSP?@VUY\d`VYbr^]W]ZVEQYZ\Y_TYgRUVXTTVSOOMJLJIILMKOMSotvxyxwzyz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HMIMPKIKPTSSWYXZYx
g;~znpXZ[ZRSRWVTZZuYU}a\X]^WIV]][[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxxxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTTWXXYZn
nfYY\YSVTWRQWVcQerXZW_hP`fZ[X\hbGOZig\[\]]WSNSPPQVVVVYZosuwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRQURUSW_ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ\\^SPPPINOWVX[Zdqtvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^\VUSROKFCDAM^lVRSNOQOQURSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURPQNKRTQMOYQMNQSUUMQSRPNLLHCIHRSTZ]mrvvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YUQLILIaltPQSNQRQR[RSRQRUUbs{|}{{
u_]KC>CCCCB?DPCC@C>BHGV@HNMG]iQHFOFDEFHGHBCHGHJGDBAC@OPMRdtuvustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQSQUYSUQQTROV`klsvz{xyurnstsyx~~kLG>>:;>@??>>jPKaEFHIEB?GLMGMQUIBE?><=<==?=?ACB??<=B>JMFUouuvstvx{|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrjmlqu{z}zxz||xwxdB@@A=:BCAACA[\O{NOONKLMOOQLKLWMHG@B<977599=;;;8989?;AG>\tuuvuvwy|||}||}}}~|~}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRSVXSRYTNYZ[WY\__`e`]^qwk^`gkwooljonnlfbYGFFHBAFIEEFCLQOaWRXQPSSRU[OOQVPMICF>::6486979:365795<B=fttvwwyy{}}||{|}}~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKTTSPQUOLRSTWYTTXQLXYYVXXVXY]WWXhsk]V`tkaa_]d`_^YUPMONLIGJKIHFCPOSZWTTMQSYS\eUOSTRNLIHC?A:988978847578589Gnruxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVXXYSUTLKTUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNNNLJFPPUYSTNJNOTST\VRUSSOMLIHHF??=:787659967665Wqqtwzz{|}~}~|}}|}}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpofedc\^RTZVWTSVTRXXYYYRUOJGPPOOMRJOPPPNNOTLMIPPSTU2<XMIAQ=c`QSQPNPQPNNMPNTRPRLILKOQPQRSTQSOLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWUQSFEAFGGHFJDHJHGEHLHKIGLMPMG/E_R>3@>joaRRQ@FTQOPPQNQOPOLJLLOPNNPQQNPOJMMMKGEEDB;==<9=G6677Dnquwz{{||}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8ENS]gSQSAGUPORQPMMNLJLKLNOOQMOOMIMLILKLKGFFED<AA>;@E;<89Tqsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpknqmimcLONMQSLTUTWWULLKH=987;?A?==A@B=>EHFDFFIGKJ@FAA@FHEJOHQRa\QPRNSOOPLLOMKMLMON[VKMQOHJHCIJLLKFFFE?CC>=BG?B>Adqtw{z{{|{zzw|wy}~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;?A@@>ADIECHGIGIEBB?><CBAGIDMOaePMONWKLNKLMMLLKNNSdMJLRHIJFAIJLMNKGIFBAB@?EFEHDLopwzzy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLLIMPMPOGKE?B=999:?B?<ABBADDGKFDIIGGHCC?B??@A>CECKNQTKJIMTFIIJLJKKIJLMOPRPKGCLHDCJJLMOMIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqnjllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHKCFGGGJKIJLDGB=>=:::;AB?=BBCCHFJLJEIIFGGCC;A@B>@@CECIMOGHKFHKDHIKMHJLHIJLJM]RIHDNGBEKKNMPNKMJKFGGJMNQNLcniwvv{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdpFKCFEFDEEFEGCC@><=:;::@D@>BCEEIFJJLFIIGFFCB;BCC>@CCCEGLNHKNHDHEILNMGILGFFIILNKJHEOICGMMNMPNOOMLIHIOSQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGICEEDBCBE@DB>?>:;;=;=?CA?ACFGJGJILHGGGFEC@=EEB>ADCCEGIIGMPIFFGKNOKFHIFEDDIIHKIFHPKDJMLPNONOPNJJIMRUUROWdaamgprosyzgehhcilgqlflmgiklsmpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCAABD<BA>A=::=?;>?@B?@BEGJFIGIGFFFEDCAAFFCBBBDEEGGHFLPLIOJJLKIGHEFEDCIHHKJGKRMCOONQPOONOOKKKPUWVUSX_^]iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsprkksMFGEGBBADD<AA@C<89=>:?=?B?@@DFHEHFFHFEECCEBCIFCGEAEGEFFGEJMKHQMJKHHIEFHHECIIJKMKPSNDRSQQRNONNPMLNSWVWXVX]Z]d`hbjigk_defcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBFE<@CBD<7:=>;>:@B>??CEFDFDDGECECDEFFJEEIGBGHFGFECFJJGMKLKHJLFIHJHEKKLLNOSTOITUTQTPQMNQNMQWZVZYWZ]ZXa```_hec`deggjhhjfhnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGIDBCHE<@EBD<8:>><<=BB=?>ABFCEBBHCCDEFFGGIFGJHCIHGIGFDHKIGKIMKJKLHLJMKINLNNORUVOLVVTQTQRLOQPOTYZY\ZZ\__^`c^\ackb`dghr
hgifjnnponsqjtuxrsstrnpqvrqtruus~y}uuvvvvxriuqkrtlqwquKIKHJEBEGE<@GDD@9<>@?>?CB<@>AAFCEDCHDFDFFHHFHGIKJEJHHKHFFLHHHJHMLLLLIMKMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[]^``a`be]d`eg`ehjcssfjhglprqossnswwpuvtsmoruorspurvrtwuuuwvuwsgtrkqrkrwowIJLIKGBEDE<@FDDB;??A@@@DA@B?ACHBEDFGEIEFEIHFIHJLHHJJIKJFJKHIJJGKKMMJJMLMNNOLOPRUWVMNTVUSRQPMNTSRW[^^_]^``aaa`cdebcicdijgvlkihmosqpqpprywruutsmmssmqrotutspswtuuwvuuueqskpqjrvpwJMLLMGCCAD<?EEEC=AACBBCEACDAAEGCHGHGFJFDGJGGJFILHIJMJMLGKIHKKNQKRQLSMKNMNPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da_`b_`ebacinicihhmxvlhimosrpqrrrvtsusssnksqmprotvrrquvuswywutucmtkopjqtpwLMLLLGEA@D>>DEFC?CAECDFCCEGCBIEBHJIHHKFDKJGHJHIKGJJNKNLILHJMKZfJd\KlRHOM_nUls[qpbwcRPbvuhucav`Xnqbdvinzf\lt`lkU_wvijhhfglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?=DEFCCCBEEDFBFFGDDJEEJLLJLMGGMJHJKGKJIJJNLMMLLILML[sbdp^llUMNfs^gfqlntgpi_aYnmbppbkjjgoqtetno\ougpMKryvkbakeelxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?AB?=BEGBFCEDEEDCHHGDEKHGKMMJMLFJNHJKJIKJJJKMMNMMMKNMM[roonpplkNPQlXNibtrpamov\YlP[mmZqmkomxxtsip\`slqjUuyxoc^kfbgppjiopprspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGHFEEBAB=??EGBGDIEEDBFIHHEGKJGMMNKMNGLNIMKHIMIKJJKNONNMLNML\hdu]lqWlNPQnUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ghaditykonqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIEEDCAB<B@BFCGFKGECCHKHHFJLKFMKLRRLGMMHNJHHNHJJIHNONNLJMMJZsppoqqmlOQSoYqkgooqqomt^nXat_nopoqroousttj[^tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtontsvtHKHJCEEE@@>CCAFCHJMIFCFJLIGFKMLFOJKWRKGKJJNIHJLIKJIHJLMMLIKKKSkbZi^_jcrrZ_Zjo`eeUk_c[abQ`mh\j\niid[pfdp]Z\k[mqcpsldgcdg``knppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunvqrutwrHHFJDEDFA@AEDCGBHJLGFCFKLIEFJOLIOIL[QJFHHKMIHJIKKIHIGKKKKGHJJLLLKIKLNT[]TPUMQPNOOURPOQOOQJJNPQdqiTYW[[\UY[]X]\\cfaafbcf__fkmhmtyrtroppt
zpmmlkqsttrtvtuzyxuvqruovrtsuusGCEGFFAEC?CGDEGCIKLHFDGJLHDGIPKLOKLWMIFEHIJHIKHLJHFHHJGGIEFKHIKNLIO\W^O\\`^OXYS\\b^MYZMXaRKYaZS`d]bX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBDIEGGFKJKHEEJJJFEHHPJLMJMRIHEAHFJIKKILJHFEJHEFGEEJGBJMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^c_Z]`c`Y_b[`^[TYXZ_^dbbacfiekrpoppnnw
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKKKEFIINJNLHLNGHF>GGLIKKJKKIGEIEDDEBFJD@JKJO[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_aa]^ca`bbbcceZRXVV\[^c`__cebhommllllu
yu|
}wrrtwyyxy~}yuyvvrnzwvxXQJFCGEBEGHFGHIFGJGHFHKILDDJJMMLLHJJHJG?GFNKKKMKKKIGHDD@DAHIA?IJGP]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QQ]_accccb\dcbdcfXQVUS\X[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMB@IFCFKIFFGIGGJFFFILJNEDJJLNJLIKJIIGBHHQMKKOLKKIHGED?EBHHAAGFDT]Y^X_X_[]UXXP]]QKJW^X^[]VZaRR__bb``bb`cbbddbXORQS\S\^]^^__`dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHDRKFHHHDFKJMPEGIJKNLLILKIIGDHKQOMLPLLKKHICEAECHGBAFEBVUE\T]SV`XNTUNZ[MJKU`a[_X_^b]OYb\``_bcb]bbW__TPOPQYS^\\]]^`bffelfoow|{{}
zo
~INFDFFGDIRcQDW_IGGHDFMJPPFJIJKNLLKMKJJGEJNQQNOOMNMNHKADACDFDCADEALHCLLPOOMFMFFHJHGLLMOPILOPPSPLQSRUZYWYXXdVOSTPPONQUT\YY[]\aaefchdklqsszy{z~{}{
}KIEEGFGDKM^MGHYMHHJHGMLQQILJKKNMUNOKKLGGKPSSNPONOOOHLF`ED_LDfcDM[H^\smOMVmYLCP_UlWgJ]WU^DLQULMSVQRTXWTXUT\TPfZhhdYTkTXWU[\[``abbb`gignlhrz|}~}}zr{z{
~z{LIEFFHEEKOTJKG`THJOJIOMRQKMKLORUROOJLMGHMQ[YOPPNOPPJKQQI|YYrsWPmHqnoaVPqqtOBksnqtpSo_[nX]V\XUkhU]VcY`YZ_VUWjtuu_av_Yc\\f[_aaab^`bgmpl`pwtx}~vxzmv~tx~|~|z~wwNIEHMMBDLLGJLFRVLLOHKRXWQNOOLQTNOQPKKNGMPS[ZTQROPPPKHZx]TxdhYRSPvgtlpbnfkRrOLwmjrpsrqrpop]fzuxqqzq~r}ku}bRh|essoss|}p~yor_``bb[a`hknkblfgmw~~{xwtvzhr~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHKQOMNJNV^YULQSNYYLSSRNLPIQRTYWWQTPPQRKGgxlcxqmZKLTypumubnvPdeIevqmwojfxxiXrRi{mijzz~lxzpgoXvvjvupash}ilx|o___cb\_defijdgbcdllppstsssyqrxbltgry{ssuy~suzn|}yxrnNJRtNCBEPPHKLJLQOOOMPZ`ZXKTWPa^RVQYSMPJSTUXWWPUPONSJKrouuquqdhaVnLqp^GhyWvTKhy}x`y{sna^modSgrunmypwlvstqlm\s~zkmy|lum|kpvux^__b^]_edjhhee^bbiiijknokqnmjpacfdowxompsynqpj{ztromLKZVHGEGRPKLNKLQQPPPQW\YUNVYUfXRRY^TMNJTTVWYWOSONNQIRmHiwK`dvuUWlOnl{rajgvUKWkh}lmlx`[pz{_`zscroxqhd|ir{]TKl_vukiu{{m~xk|p]^^b[^bdehfeebZccikkrsrwgmihdg`alagsrkhmmr|kmhk{tmmkmOGJKHJHHRQMOPMLSSROSRWRVTPWZVVTTTa`QONKTSSQVVOOMNOPJHQNPULKKRSRRTPVUQQORRXXQNPUTXXX[[USSW[WXWZPSUWWXQ]XV]USOXRVWWXZ`[gr^[\[]]_cZ_ccegeccbZccgffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilPIKKLMKJTRMRQPLVVTPTUXUZURZ]VUTWUYXPOLNWUQNUSNPNLQPKIQQKQMKKOQTRQQSSIIMNOQRQQQTVRXW\WSSPRUUVTZQNSRWUTYVTYUSRUSTUXXW^Z_a]\[Z]]`c\]bbdgeeebY`acabhhincad^_c]Zd\bma^ffgmsdihkkeddfhQJKKNOLMTQOTQQMXWUTVXWWZVT\`VWVYUXTQPKOXTQNUPNQNKSPMNUSNRNMNQSPTQSTUNLNOQTTRRQVWUYZ[YSURTXWWY[SOSUWUTYUVYTRRWUVX\Y[`]VY_]^]\]`a^[bbchfeebX``b]`hefda^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLOTPPTQOQZYXWYZZXYV]jdVXYZWVTTOKOWUPOTPPQNMQQORXSRQOMOSUNWQTUUONNQSUUTTRTXVZ]\ZVVQRWXV[\VPSVUUVYTWWTRRXVV[_Z^`_V_]^`\\``__ZbbdhheebYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSNNRPRROLPSRUZUTPPLPWUQVRSSXMOPQTXUUUSUYX[^]\[VROUVV[[WQSWUVXUSXZTSQYWW]_[__`Vb\`a^`b_\`]cacgiegaZc`a__ee_`c[Z\[\ZZYYW\Y\[`^_[^^a`_c\Y`ZQNONVQPUSPUTSPW\\\Y^\_W\^jpwyc\[VVYRNOWSNQRQSTRLQTSY[WUORNSXVSRTRRZOQSSV[VVVTVZX]^\\^VSNTVV[\VQTVVXYRSY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgidh^\e`a`acd_b_YZ_[\[YXYWWZ[Za]][]\\Z]`W[[ZPOOOYPUUSRWRTPZ]^]\`\`U\]hjr}rlh\UYWQOR[SRQTSUUTKRVUZZZSOSRUUUSNVRSZRTUTX]WXXSX\X^]Y[^UUNVWW^ZWQUUXXXTVX[TRV]Y]]a^cc_Y`[eb_dd^^cca^efieg^]daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POORZP[UUWVTTT^^`_^b\`U]^bkytl}lZUZVQQT\TTTUUVYWLRZV\Z\RPUSWUUSOWRSWSWVV[]X[YUZ^X_^Y\ZRWRYXY`ZYSUVZYZVWY\UTZ]\^`a`ed]^]]eabfd^_dc`\gdhfeb_da_aabb_`^WX^Z\\ZYZWV]Z]^[Z[\[WY\]VXW]SOPWYP]UVYWWUX_`aa`c]`U]^beev{hXYZTVTV\XWWVVW]XOU\Y^]]TSXRWUSRSXRSVTYXX]^X][U^_X__X\VQYUYZZaX\UVWZZZXYYZXV]^_^cbbee]b\`fbefd_`dbb[fbhfcfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNSZWT\UVWYWV\`abcac__V[`da_zuohZ\ZVXVX[ZY\ZXY`VOT][`a\UUYPTVTRVVRSUW[[\_^Z_\V__Z]^Y^VSYXZY]bY^VWZ[[[ZZY[YY__``dcdeebdZbfcgfe^ac`c^cciedg_g^bbcaa`^_XTZZZ[[X\XX\[Z[WWZXW\[\`]V]]SOVZVVZVYUXWX^`badada^YYadb`kfh^\][WWYZ\\\_[Y[bVSW^]ac\SVYPVUUUVVSVTX]]_``]a]W`^[^\[^XVXX[Z__[_XX]\]]][Z\XZ_a^`dcdfffbYcfehgd^ca_ec]fidei_g^cbcaa`__[XY[YZZXZXW[[Z[WXZTY]\Z`\U^bMRWYVWZY[\YWY^`baeada]^Ybcb_a`a_]]]XW[[]]__\Z]cXYX]`cd_RYYPWVWXXWVWV]]^`aa_b^Ya]]^Y]^YXUW[[`^]_YY^]^^`[ZZY[_a_bddefggbZdfgigc_c^`feZhicficf_bbca``_]]ZW[YYXXZYWZ[ZYWXVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XW[]_]`_][`d\\XZcecaR\YOXVY[ZYWZZ`^abb`ac_\b]_][_^YYTX]]__^_[Z^^`bb\\W[]`bbcedgfegd\efhifcab\cg`\iibhife`baca_`_]]\Y\YXWXYYW\[ZWVXPXZ]acffrkJYW][Z_]\^\Y][^_acbaa]b[bda_cbb]\[ZWXjq`\`_]\ac_^YYcedbT_ZQYW\]\[Z[[c`cbc`bda`c^`\^__ZXV[_]\aa_][`abeb^\S\_`cddfegfefe_ffhhgdd`[fg^ahhbhhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{zzz{{{|{{{{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{{{{{zz{{|{{{{{{zz{{{|||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½±µ´´´³µ~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääèÊ»À¿¿¿¿Á}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyzyzxooooppprrrrrrrwzyyzzz~||||||}~||||||}}}}~~}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvx{wzzz~yxxyxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{zzzzzyzz{{{{{{{{{{{{{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwwy|{||z}zwwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwww|{|}y}ywxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|ywwwz|||z{zwxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzz||}|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{xzzy{yxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegefgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~~{
~~}
}}}
~~~~
~~
~
~~~
~{z
~|}}}~|{|
~}}~~~~~}}~}}}
}|}~~~}|}}|z|
}}}~~}}}}zzz~~
~~~~}~}}~~}}}}~}|zzz~~}}}~
|}}~}~~}~}~}}~~~}}}|{{{zzzz~~~~}~~~~~~~}|~~~~~
~|~~~~~~}~~~}}}}{{|zzyyy{~~~}~~~|~~~~}|~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zzyyy}~~~~~~~~~}~}}{|~~
~}}}~~}}}}}}}}|{zyyyyy~~||~}~~~
}}}}}}~~}}}}}}|}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~
}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
}
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}|}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{||||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}||}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~
}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}||{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~~~~||||||{~~{|{||||}|}|~|}||{{|y{|{|}z}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv~
~~~~~}~~~|~~|}}|~~~~}|}}|}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz}}yxut
~~~~}~}}}~~~~}}}}|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyvtz
}}}~}~~}~|}}~~|{|z|{|~~~}~~}}}~}~{{zx|vyy{qtxwvxury
~|}}~~~~}|~~~~}}z{{||}}|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}}x~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzswvst
|~}~}~~|~~}~~}~}~~~~~
~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}|}}~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqxyrx
~~~~~}~|~|~}~~}}}~~~~~}}~~~|~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~}}|~~~~}|~~|}~}~~~
~}}{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzzzzxswuqqrpxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~~}~zz|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{}}{yzzzyysuuooqpwst}
~~~|~~}~~}}~|||~{{~yz{z{~wwy||{}||||{}|}}}}|}|~~~~|{|}{}}{yz{zyxstunsqpxruz
~}~~}~~~}~}{~~{|}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}|||xxuxxy{||}{||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}xwvyyz|}}|}{||}}~~~}~|~}}~|w{zz{zytqunwpuzrvy
~~~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{zspxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~z{|zzzupxwyvu|uv|
}
{~~}y|zzz}}|~z||}}|z{~~~}}||}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}}}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~||}}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~~|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uz
}y|~{
~~~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqspurstv{}uvy
hzrss|s~}}~~}~|}~}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}~}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwgwznpur~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}}}~~}~}~|}~~
}w
}~{|{~{||}~}|~~}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~~}}|}~~~~~~|}}~{|||{{}
~|{}~{|{}~}{|~}~~|~}}~~}}||~~|}|||}|||~z{{}~
{{~}|||}}|||}}|}|~}|}}||||}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~~||}}{}}|}zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~{}}}}~~}}}}{|{zyzzyzz|yzzz{{|z{{{|}~}}}}||}}|
~}~~
}}~~~{||}}}|~~}}~{~{{zy{zyzz{yzzz{{|z{||{}~}|}||}~
~~}|}~~
~}|~~|~~|~||~}|~}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~||~}|~}{}|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÕÔÕÔÔÔÔÕÔÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××רÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÛÜÛÛÛÛÜÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌͲâÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹³xsssssssssssssz½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎnPSSSSSTTTTTSL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¥2)+++++++++++)5ECCCDCCCDCCCCFSSSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;?C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÎqTXWWWXXXXXXWP¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦8/00000000000/;IHHHHHHHHHHHGJWWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÎx^a````aaaa``Z¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©« E=>>>>>>>>>>>=HUTTTTUTTTTUUTV`bbbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB>;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÇÅÅÅÅÅÅÅÅÅÅÅÅÄËÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÏÎÏÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÊÊÊÊÊÊÊÊÉÉÉÉÉÉÊËËËËËËËËËËËÌÌËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÎÏÑÎÎÒÔÏÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖØ×××××ר×Ö××××Ö××××××××××רØ×ØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÎÑÁ§ÑÒ¨ ÐÏѤ¡ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÎÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÏÏÑÅ´£§Ö¯¡©ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÏÓº¯ª¸ÀÈÐÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÏÓ±¨¡´¢°²ÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÑÀ¹¯³ªÕÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÔ£¢ x¤ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÑÄ{
¨y©
¤ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÕ«¯¼ÀÓv´°¦½¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:96:;::;8@?:<<9<>=;;:?9?:;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ
¦¥§»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÆÓÓÕ¢«¤Ð«¤ÑÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÒÑÒ×¨ÎÆ·×¼ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÒÏÅÔÔÇÃÕÑÕÅÄÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÓÔÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiiixsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptywt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¦¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocnihb^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´µ¶¼½¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrwsxfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijg]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬§ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËËÇÆÌÉÍÅÆÆÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlieunsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÆÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegdjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÂÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfcZYY\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹½ºº´¿¸µ¸³¯»¼·À·½Â¿Á»¿Á¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾ºµ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjgfiei]VUSYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»À¿·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmedfoiekhXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···µº¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8><7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·¿¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸®µµ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcgb\cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼«ª£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊĵºÀÃÈ¿¿µ¿Á¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_c^aaNHM?E@?DC<;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED<AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍÊÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶º½Á¼»¿¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼¿ÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²²¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^\YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA=>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÂû¸³´ºÁ½¿ÇÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni\_`YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀøÀ°¯µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§¬¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_e]ZUJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁ¾ØÀ´±´²·¾¹³µ²¼¹¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvrl^b`[]OHA>=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÃÐÒ´È´´°¶ºµ´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ournc\fX\]RNMA>IB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³²¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÉÕÉÎÄ´²´¶²´¯»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFMF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±»Å¼ÁËͧɹ´´³°±°¹¸¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<;:@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²²ºº··¸¸»´¯´¬°¯¤°¶·µº²³°¯¬®¶¶²´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥££¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGOMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬ª¨µ²±¯½Ê²¦¨vp
¡·´«²´®ª«¯°²³®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRNJNG;E@=2?759;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¥½Ô«¢ltacer·µ¯¯³µª§¬£ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxy`bRU_HIIKSTIRPL9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥¦¤ÀÏ©|w^kuoe_n ¾´±±°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´©±¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNNULRLA7>B68=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¡£ÂÇxca\WlR©Ã³¬°§ ¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸¬±´¤ ¥¬¡¡¢ ¤¡ ¤¡¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HQUHFUVJBLG=KH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¢ §É¹aZvZXam~Nt´Æ³§ª¬ª¥¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§¦ §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·¤°¦£®ÑªsYdX[oi·vZY º³®®©«¦ ¡¢
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã¼·³©³ª³´¯³®ª®£«§¶±¬¢¯¦¡£¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{tqkkurphW[QETHDIOH>EA4EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ¡ ¬Î`_wx
urrs°®§¤¤¢ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÉÉÂÀž¹´¹º´»·°µ²ªº±®»·¾ººª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zqkdhoxjeZ[FKLEDSLDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;?>=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ÉVoykzz¦²ª wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÌÓÐÓÓÌÊÂÅÆÇÊÇοÈÑÌÇÅÆÄÁ»ÃÀ¾¾¾µ½³¿¿ÂÂÆÄÇÄ®¾¸²¸¼ÄÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A?<@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª£¢¬®¦¥±ªÅÆÌÎÍ¿°Á¨¥¨¬ª¡£¦·ÌTy ¤z{nfo©±¬¤ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÒ×Ñ×ÒÔÖÓÓÈÌÇÍÍÉÒÌÎÓÌÅÇÉÊÁÅËÆÈÈž²³ÈÄËÊÊÎÅÊ¿¾¿½ÁÇÄÌÌÈɿÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤ªÃÎXznhq®¯¥¡¥¡}wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÒÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÑÉÒÕÖÙÕ×ÓÖØÎÒÊÏÑÌÎÐÌÒÏ¿ÇÆÊÃÌÌËÎÏÅÆÇ¶ÀÊ¿ÑÌËÏÅÉÇ¿ÃÂÈÎÌÏÐÏÍÊÈθ·»¨¥«§£ª¥©¨¨|xsvpc`erb]R\IJGAEHI>;@8=4585;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÂű¶¨¢¥¦¡¢«µÏÏd{}on ¡¢wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÐÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÇÐØ×ØÑØÒ×ÙÕÖÌÏÏÉÍÑËÎÏ¿ÅÂÇÅÎÍÑÐÑÈËÌÀÊËÅÓÎËÎÈÄÉÆÆÈÌÊÓÓÑÕÏÒÌÒÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCQM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯ªª«¦®¸¨«·×ÔÕÙÙÑÎÐÀ¼ÌÉ·¿¯§«©£¤±´ÑÇovq©¬¡¡}qecb__a`_a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÆÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÍÃÈÎÌÊ˿ɿÇÈÍÎÏËÐÍÎËÎÎÇËÏÐÊÎÊÂÉÆÉÌÊËÑÒÌÓÑÑÏÐʽȹ°®»¸µª¶°¨¸³¿»±
zvopokadnpaW\ZIFFDMWE;@<33<=87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¬¥®¾´°ÀØÒ×ÚÜÖÏÍËÄÓÐÂÁ±ª®«¥²±Ä¡mln¡k^^^adb```a``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÕÊ¿ÊÁÅÌÂÈÉÂÌÃÅÈÊÊÎÊÍÌÐÍÓËÅÈÏÌÈÇÊÄÆÀÅÊËÍÏÑÆÐÎÍÍÌÏÅÇÀ·¹½Ãýù³²¾±»Ãĵª¥¢
xpqkmg``qhYXhVLFLIPPB;D>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?;<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±Ç¸ËÕÕÙÚÛØÌÍÏÈÖÕÅ÷°µ©¢¬¸¼¡om|ebbb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÏÎÌÔÊÇËÎÏÇÇÏÒËÐÏźľÆÉ½ÂÇÉÎÄÁÇÀÇÍÇÃËÊËÏÇÃÄÐÈÆÁÅÇľÀÇËËËÎÂÊËÈÇÌÐÄÅÇ»ÇÃÈÈÂÏÁ½¼¿°ÁÉǹ½ª°²§¥¢£wntdk`^fqa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ½ºÍÍÆÐÕÕÙÚÛØÐÊÏÐÒÔÉĸ¼¼®¥¶ª¾º¡w~
t`\^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÉÆÂÃÀÃÇÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÁÂËÐÄËÈ¿¹Á»Åǽ¿ÆÏËÃ¿Ã»ÉÆÈ»ÈÆÄÊ¿½ÂËÆÅľż¼¿ÃÄËÅļÀÉÂÅÇÒÄÀÈ¿ÊÉÆÇÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {vstfiZanmZ[XRDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ËÏÑÌÇÂÃÇÍÎÎÌÕÏÕÙØÙÐÌÓÎÎÐÊöĿ´²º¯¾¶}z
vxurq_Z[]``bddded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ°¶º²²³²±Â¼¼¼º¸ÀÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅþ¼ÁÍÃÆ¾¾µÁ½Ãº¼Æ»Â¹³¼ÅĶ¿µµ½¿ºËüµºÈº¿½ËÃÁÅÂÅÈÆÈÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½²·°²§¨¨¹°¥°«¬yvwjdg`hocV^YJFJFHJAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÃÄÈÎÒËÊÊÇÍÎÏÒÉÐÆÕÔÖ×ÎÌÐÆËÇÉļȿ®°¶´·¯
x~|tud\\]^``bcabeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸µ·´²³´ºµ¾±·°µ¯²»Â¼Áļ¿ºµ³º¾À¸Ç¹´»¶À¼¸½ÆÁûµ®²¶º¾´Ä·»µ«¸½½¿½°º¶¯¶º²Å¼¶®»¿´¶´Å½¾ÂÅÀÃÅÆÈËÅÀÆÆ»ÈË¿ÏÊÇÃÆÂöý½¶¹¾Ç¿¬µºµ·¶xtxfgebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÌÎÈÊÉËÉÊÄÏÍÒÏÏÆÉÄÉľ»Ìº®²·´²«{x~wx}th^]]]_`_`da^dec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¸¸µ°«¬§¢ª§«³©«©´¶°²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°¿±½¼»¶¼Ç¹Â¶ª¨°±¿µ·¼¯°§²³´»¼«µ¥®¶®º±°ª¸°»®»¸»À¿½¹Â¿ÇÃÅÁ¼ÆÁÈ˸ÅÇÅ¿ÆÃÃ¹ÄÆÂ»ÆÉÌ˳¹Â¼º²rvvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÎÒËÃÆÂÅÐÇÎÂÄÆÀÅÅÃÃÊÂÉËÁ¿ž·¹¹Ç³¯´¶¯¦|x~
z{wo^]\]]_`^_dcbccb`_][[ZZ]ZZZZ\dnohfgiknr¹°µ®¦¥§§ ¤ ¥«®£§¢«ª¬ª°¤¦ªµ¶±½¹¯·¯¨®·´´¼¸´¼¯¸¹´±¼Á±À®¥¨¢«±²³§¼ª«¨«¬´³¥¨¡¤®©²¥§¨¥¨·¬°²·ºº»±»½¾¾Ä¿µÁÀÇÈ·¿ÀÄ·Ä¿»¿Ä¾ÄÈÌÊ¿¾ÃÀÀ©rtrji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÑÐÍÄȺºÌÂÌ¿¼Ê·¾Ä¿»Ë¸ÂÄ÷ºÀºµ³¹Âµ±²³§©|~~xt|swf_]\]^_`^_ccab``_]]\ZXZ[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥¤¡£ª£¢¥¥§¥¬¤¦¬²¯¶·§°¬§ª´ª´º±¶µ¶¹±¯º¹±·¤¤¦±§«¨¹ª¤§¨¨§² §¦¤¥¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹¹Â³À½¿µ¸»½¾¼ÂÇÄÂÿ¿Ä wpkaf_ko`TY^HNgOTGEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;ȵµ½¸ºÀº½µ ¡¦º¶«³³»³ÄÐÉËÃǹ¸ÉÂÍÀ¹Ë¸¼Æ¹µÆ¹µÀðºÁ·²«´»¶ª¬®¥}zutomkjjqi^`]\\\^`_acb````]\[\\XYXXXVX[^_dcbegggjmo© ¡¢¡¢¦£¥¡§¢ª°±µ¢©ª©««¤´¹·°¬²µ®²µ®°ª£¢²¤¦©¸¢¦¦¨¬ª ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«³³¹³½´¶±±µ´¿¶½À½ÃÁº»½zrk_e^ddXTW]IW\KPGIIFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÈÈÁǼ¼ÅÄÏ¿ºÈ¹¹À¹´Ã¶²½¾°¾¿¸¨¤°´±¡¨©xsnpnkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bddeffhikr¨¡¡¢¨¥¦¡¥ ®®² ¥¢«¦¡´°±±¬¨¯²§º³¦¶¡¢£¡£¡©µª¢£¦¥¦£¬¡«¦£¤¦«³³ª´°²ª²¹´¯©¯²²³·³®©¬®²¸°º¶¹½¿·²±
yue^e^[YVSZUK\QLIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÂÍÈÇÀÆ·ÁÀÈϸž´»»´À¸´»½±·ºµ¥¡¬³ª §¤|yprtqifdhec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXXXXVWadecdeddhjv¢¡¡¡¨£©ª¦¯°«££·ª ®¨¶©¦§°£·°¤·¢ª¦¡¬¸°¢¡¤¢ ¡©©£¡£ªª°®¨´«ª¦²°¥ª®²±°°®¯¦§§²®±´¯¼´º·®£yud^aVYWSRTKM^LPKGGLLE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§£ª»À½À¹®´¸ÂÍÉÆÃľƸÉ̳Âï½½·½¾·»¼µµ·±¢¡ª³|xrjmrtpihedfb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[ccbbcbcdfj ¦¥¤¦§¥ª¯¦¢£¶¨ ¡¢¨´¡¥§¤¯¥°¬µ ©¡¢¬±±¢£¡¦¦¡¢£¥¥«¤¥°§¥£««¦¨®¯®«¨ª©³¥¦«¯´±®¼µ±¯¯ zvrda\Z]XNLRHRaMWPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¤§·»¼Áź±¹µÅÊËÁÄÇÇÈ·ÆÅ´ÃÀǬ¸¹¿¸¿½¾¹¸²´¯ ªundbgihfhjgjm`]\[ZZZZ\]\[\^_\ZY[YYY[WUXWTTWVSTRU``_`a_`acdi£ ¥¡¥¤£¢£¡ª«¥¥±© ¥«§¡¬©¨®¢¡¢£ª¨°¢¡¢¤ ¡ ¡¤¦£«¥¢¤ª¤«®¥²©¦¥¦¦´¦©¨³µ´¹º¯ª¬rpo`[WVVRGQOHZ\ORITKSLEGIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:<<97?<9678452121..1426:86:8698989;9@9{µ´´»²¯«±§§¯¹¹³ÀȺµÀ¯ÆÉÍ»ÂËÌȶʾ²¿ÅÊ®³ºÄ¸¾Ã¿¹¹°´¯£¨§}|uiiilgjlmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]]^^__bdm¢ §¨ª¨ª¦¨¥£¤®¤¥¯© ¯ª³¥¦££¡¨©¬¡ ¡ £¢ ¢ ¢¨£¢¨« «¯¤®·¥£¤¢¬ª¨«®²·²½µ³«¯ssh[XXRUREXLQ[YMUNPLPQINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³®¨³¶®©§¯©¨¬·¶¬¼Ê»¶¿¬ÌÇÆ¹ÂÏÏǴż¸¼Äʲ®ºÂ¹¿Á¿¸»¬²©¢¦¢}wxonhmnmphgigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]\\^_`d~¢ ª©¦®ª§¯£§¬ ¤¨§®§ª¥¡§ª¤ £ ¢¥¥§¨¨ ±°¦±¼§ £¬´«®§°´°¹µÀ±±«}qrbVTVNRIGVQRRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¦±·ª¦¢°«ª§©²±¤¶Æ´¹º³Ëƺ»ÂËÐʲ¸¹½¿Âų²´º¯··¿¸»ª¬§ª¦¦¡kgmnrnqjpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv¨©¥¤ª§ ¥¢
£¢¢£¦¡¢¢¥¤¦¨¦¡´²¨²·¡¢·¬ª¤²²¦µ»µ««±£xrm]NQQLOCMNNPKFNNJJNMQIMJAGLHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12776:999984988A7w¶§¤¶°¤§£©¥ ©¥¤³ª¢²Ãµµ²³ÇƸ»ÄÊÍÆ´»¾¶¹Á±¯«³©±¾´µ§£¥¬¦¦v_`gsqvqiniehhj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXYX[]aosvq
¢¡£¤¡s}
{¢~~tz¢£ ¡££¢´¯¬¯¬¥¸¦¦°¡°®°»ª©¯ªvrbUMROPMCSNLQMBPQHINSMHJJCJLFKK<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-11764789::65:87A7x·¢£´¨¥¦¨£¦¥¦¦¦³§¥´Á¸¯´°ÊŸºÁÏÆ¾³»Â¯Å¯ª¤© ©º²ª¨ ¥¤¡lWW_hgighncjigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo{
syz
}xro
~¡ §¯©¨¨³¢¦¬«§´¢©£~rm_[NSRVLDTJPMLFNOIFLQMKOJIMPFII<7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©§¢©°¨§´Á¹°µ°Èø´¾ÏÀ¹¯¯¶Ã¨¬Ç«¥µ¨¡ cQMRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tPBA}
x`JQnx}
n~wuuwpQ|~xvhw~¤£¨©¥¤°ª¡¤¤¥ª¡©¢¦¨ule^[HQQRMIUMSILKOIHGKNLMTKQQOFIC<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶¢§¡®¡§¨¥§¨¯ª¶¼¶¸·³Â¼·¨ºÉ¹¶¨©¶·«³¾¨ ¬_MLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut|
{uxsnupty}ª
yzhv{prmxxz{vsrwgu{{© ©¥§¤ ¤rg`\\JVORGKXROJMMRJJJMPHLQLRTLEHA<77;99>=:;<98@?::>=7==79937795675252572/2.,//200/-+(().1272198798775:<;7v®£¡´©¯©¥¬°±ª½´²»¸¶»µ² ·»³«ªª´°£~~~x`KIIHGFHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQQSV^u}ygw}gyvx|r|v{ok~|s{}tfv|lohs|lyq}pmuqiq~pC
wwz
}zu~£¢¥vnlebZWWTQJSUTOPNQVKNKNOJQNHNOKEC<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©°¯±«¼¸¬»¾¹³¨±§¦ª¥¢{|wv|xyx`KFGFA@CDILLMQRPQSUTTUVWWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX]eprm§ªÀ~uyb{xn|yy|
omxsxjjr}Inhw~licly
ksl|nr{impsz}~{vots
ywp|~mhmnnWUWTRQYORUUSXUMNHNJMNKCHNGE?:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¥°¢¬ª¨µ¯®¬´¿«¼Â¿¦¢¥
¢¢t{yu{qztptvaOEGD@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZRY\`§bitze~pmzvtlts{jkMy
g1vsl~~tfet~
filukq|gqq{n{s}|qpnum~wytiyyvjjngdWQZWYY[MPUVYYNIHEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226,+5775478iO8;5n¤¨®²¦º®«²°Â±»ÃÇz
rv}tusutlvneUFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOOQVLAIQIb¯³ q|xm}lr
zyr txsu5q¨¡¡¢
vp||shfbinrmpuioXupwl{}mqmpzsvmbv
ux~~zqpok`[\][YX`_SN[ZYXLHJEJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µ©±®Á²»ÁÆ}nv
m~xyzpzr{im^JPG>@7448;;<=>@BEILLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|}
~v¢y~
aªzw~s{\dqtz{wlgjbyo
znwtzptywkni]w}|
}q|uw{}uorseg_[Z]S[f^WQUY\VGJJDKG?F@DC>AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk~yt¢
~~r|kxkSWL@E211267688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z|~v¡¥¬©H®¯¯¨sl|}hghx~n
q
Gkwryvhmk_v}
z{uv|wmow~rrqk[]\[ccXge\UPPWYPDLKFNICFCCA@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¡¬¡¦¸¯³½³}tp}}~¥yux_cVKB60./23123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?94.]ps£UFIKMNPW`YpZ\^j
~
¡¡¥»±§»Çè¡¥{r~v
ihotqw{v
}nvug¡«¢{zzogkx~x}qjc]ZZ]i\af_ZOLNXRQIPKDNGCKDCADCA<:87=<:<:88778:==8<=68656623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupgx{¤¡¬¦«¯°¡xw}lpj]CA4--//./02234779;=?BDHJOQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¡
lpuvql
r¡¥µ©¢~kjk|r`\c^Yfj\lk^XKHOSQNMLFIPDDNFBCEGB>997=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<unhYppuqv~§ ªge¤~z}
xxgMR>/..,/.-/000212457;?CFNPRTPQRSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢wz~¡{v«³ }¤¢¦¶°¨lss|~zog_[`^afc`gg\REKKPOIJLFFMCHLFFCBGD@:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Pqu`n}bw}|ªªBD}x{
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=GGAA@8662<9;FHGIIMOQYmw£§ªµ½¸¥®¬¬§¨´¬±·²²»±³¾³Ä¬»É˸Ŀ¸¥£°²¬ª£
¦¦ ¢¦¢ª¨¤
£ ª ¤©±£§·» £°££¤¢«¯³µ¢¥«z{~}f_g[da]cc^ff_[ODJHTOFHLFKHEFHAKFCFFA:87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicXjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1/-4?DAMUQRTUUWUM[PGGD<>>FHCD@7;<5C;=FKIGHROPW ®£³ª²ÁÈÄ«³Å¶¬³À³¸¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´±±§¯ª¤v¤¡«±³©¨®µ»²º¬¯µ¢±¬±µ¼·µ®µ §§£¨©°²º¸¸§·©¥ ytX`cUeaab_`f_[TJDELVQIJJDJHEA@@KDAMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL[ZQcdWzuq}
v~{¿»£¼´y
zyn]V@EN<6:46AB764//6CHCQ[OQUWU\WO_UIKJA@?GKFEC;>@7D7?BJJEGWTP^¥£±´Ã¶¸ÁÌʶ»Ä½³´Á·¸Âµ¿°·t±´¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥±¥«§¤ ¬³º¢¨²¹µ»¾Ì¿Å޽³Â·º¸¿·º·¹±¦±ª¾°½»Â¬»¨ª~{iVa`WididV[cYVTIHGLQGDIJAHD>?BBK@@LC99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FQLALRWTZVZwjp
nzsxb¸¡£{z|}}xzueO\dGEL:Qda[^SF>;HPDZdQQYXZgZT`aMSOEA?IJHEFA@C=E6B>HGKMSZT^¯¸µº¹ÉÀ»½ÊÌ»½À»·µ¼»·¾µº²Æ`u²¥±«¾ª¥¨«ª¤¢²µ¡«§®¥§¦¥¤¢§°³¨²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÃÀ¾½¿»¼·´°¹··ÃºÆ¾Ãɰºª¢¬¥¨¶}q^a`\Va^geRXaVRVIEFMK@>HD=KB=B@=F=;H@796379>489:57045/26389374526?8@>GKRTTRPOQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]gmlq
slsrsÕÀµ }x{{yt}zlepvY]\Peeb`ed][XW\MdmURmn_o_XgeUYTJDAKKHFHHHHBI9D?HKTTV]Z\¹À¹½·ÆÁ»¹ÊË»·º¶¸¹³¸µµ®¶¶du©p^¢¡¢¤«¥¨¥¤¬¤ª°·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊ¿ÉÏ´¤»±µ°¬¹½~xj\_[X]`YbbQ[`SQKCBEFE<@F>BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi`onlotu³¬¡¡
|s{
|ts{ylmu|iseilifjji`fihmZmt¤¼g[oh]ZYTHJNPJKQLTQHLAJGKP__bgjb·Ç°¹³»¾¶±ÄǶ°¹±°»¬³±§«·¬¶§§N §¥¡¦¬¯¨¯§³³ÓÔÔÖÑËÏÓÔÎÓÏÌÆÃÊпÊÉËÉÒÈÍÍÃÑÒ¸¯Ä¼Äº¦·»Ä¢mb[[\W_WYeYP\WNQCBIECI;AD>AH??A7;D>@I=46655;:687654/10146278875367C5B8?-0,1349=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshqoyy ª¦}
|p{r~qyulpxr{nxslipmcimpyiw}~Ë¿Âß§mcxod[a`JPRUNY^P]]NPNTQUT\nnwr®¸¬´¨°¶«½Á±«µ¦¥¸§¬®¡¬´¤±®§«¬¤§¡¬¬ÎÒÕÑÍÌÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓÖÍÒÑÅÒÖÆÁÏÈÈ鿸Ðxld\a\U^Q]ZOOTPNH>AGBCF<AB?FE>@?:===<JA45465<888664412/03526768533;=<E=@11+/249?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwmwp}~¡¡
y
{r~z
v
pwsls||w|sxqkrrioqzys{¾Ë~±vr
whaj]CZZ[WfdXekTX]\`c]cx{ª¤¤¢ ¡¨§ª±¹«¦´£¢¢£®¢§±¦k¢~
§°¢ ¤¤¨ÇÍÏÇÁËÐÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÉÔÚÍÊØÖÑÊÄÃÌqmb_^WRXR[PJGJIJ@;:;ECD<CD>HC?CB;;9<9GC46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu~isyr
x~xs{}w{oxpmuvx}t|ylvun}vuy{µ<AÆ¥~|jeWICecfchjdoy[_fhknin ¤¤¦²¤¥³ ¢¥¡© ¢±~
z~ª£}«³§§½ÃʶÅÍÑÐÑÏËÒËÉÔÏÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿Ì͵vumc\XRUPYUFFJIEE=:7:@AB:GE@EDBDA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopbqqs|~
}y
zyqz{vzzp}opzr{qnzuw}|u|°tYªÂ·pnc=^hrpqpnxweioruxr{ ª¡¢¦¬
}
~my{®ª¦®µ¼¨½ÆËÈÉËËÏÈÃÑÊÔ֨ר×ÕÛ×ÓÚÛÖÐÚÚÑÖÈÕÌwygfZYORS]HBEII>A>=8:=?;>H=@BAADA>?:87DB755479.566435532323647553457EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqy~
|}~wyn{{tz¡vvtu}toou|
zv|¸Æ¥ÃʸxpeNeczw¢yyw{|vm¦ £«
{|¡¼¡¨¦¥§µ¾À¿¸ÇÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÇ
ywegc^RVVUMKDND;==<9:<>9>A7>?@=@><9867CA6455=80665547745613854564557HH=DJE7925;H>;::7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa][htzylwvz|~}
{~
z
{u}um}}~t|}x~yot}
|~{©Ã ½¤~}rs¦
{iGq¡¤
¡~¦
¤¸¢§ £®¶º´«¿ÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û·wwviicU^ZSONHDLB==>99;:99<=6@>>==9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqsx{{}|{}{~uysztm~}w¡n©
z |~£¢¤¯ Wr¬\¢£¢
¤
³¡¡§±¸¬¤¼ÁÇÍÇÆÏÌÏÌÏ×ÏÑÔ®ÖÕØÚÙÚÚ×ÖÙÙn{see[[VRUWC@ID??>:49:;7:;:3<<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxlb~omwxz{}|{v
sp
{vwvt
}¦¢¦¢§r²§
£ ¢©° n·ÄȲ¢¥²d¤ÍÈ
ª¤£
¥©¡¢²´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎq}fa\\]NITYABGD;A>837;<:8=64::<:72?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcGv}|m~xz~{vv|mnz|xx|~£³§£ª³¢§¥¤®¢¸³¡¡¥°£¤§¨¬¯¤¡À£É¹«£¦²
¨¢
u²¤¡} ±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ¦ÎÍÓÒÑÖØÓÐØºqxt[_T_UOHJNDBCE5>:77:?<<7=43669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGN[\YJf`;Hzzn
z|y~px|~}orz~|x§»¬¨²½¯¥³³¨£¡°¬µ¢¸¥¤©¸§¥£©©£¯°ª »»®Ê¡j¶¸«°£¬½£^ª²|}´«¡¡ ¥¯¨¡¥³¸«ÂÈĵº½»ÅÇÇÂÑ ÆÉÍÍÅ×ÖÑËÔ¡oyg[YR]POEC><CAB8?885?G=<6<35345454B39:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdGb`bpJ?s}um|}}pww{ªÂÀ¯½Æ»³´À¼´«³¶¨³½«»¤¨¹¸«§¦¢¢¤¢©¯²±«¤¢¦¥¤º¯©À¼²¹¥¥¨~¼°z¨±¬ ¤¬¡ ¡§¦¤¢¤°³§ÁÆÃ¯°º¶ÅÄ¿ͦÇÄÇüÕÑÍÅÊrq`ZX^ZLJBK@FG>A?B;:5>A==5<6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GD?CF\eG`igZ]\{uo~{q~{z§³ÆÉ¿ÂÌÂùǼ»¯«¹»³·º²À®¥Á¤«°¼½«®«££§«®´°ª ª¡°µ§£º»¶Á¼¬©²¥¤©
©Ääz¢¦ ®ª¡ ² ¤ ¥£¦¦¤¯®¥ÀÄ¶Éþ¶Ï²Ä¿Ä¼³ÑÉȵswk[VZhQLHCLKKJAA=CD<5AD;;3=8B332262A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeYNe\fTcjyr|xz¡¨º¾ÇÈÉÁÒÉÊÂͽ³¼¾¨º¿½»Ã·¬Â©¬³¼¾ª°ª¤¥¤¬®³¶µ ¯¥¢£³½©¨½Á¤¶·°¬±¬©§¥¥vz
££ª¥|£¡µ¥¥£¢¥¦¤£©§¢²¬¨¼Àᥲ·ÌÀ¹¯Ä³»¾Â¸ÂÃÂÀkx`WVZZJKMJFDDHCBADL:4DH9;4<7E.12352B25SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddV x
¡®¦¤Â½ÇÃÇÅÓÍÎÍ˼·°¹¼´½Ë¼ÃÁ¶·¼³Àº¼®¯¨ ©¨¶®©²·¢§¡«·¸ª¥°¿Å±½¹´¨ªµ´®¯¥¬¨ ²Å§}}ª¥¡£¢Z¥e£³¥¡¬¬ª§¦ ¤¨¥¶«ªº»Ã´¥³µËÀ¸ª¶¬²º¸®¨¸º½¸jmYVSTMEJRNK?AHEDHHH95FM;>8=@J.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;=@BFBpEiIRebLF¥¢©¦¢¯¾¯¡Æ¼ÅÄÆÆÎÎÎÒʾ»¶±º»»¾ÏµÃ½¸¹·²±µ³¸³«¦«¬¹ª©§¯¯£¯¤§¤¥µÀ°«¬´¿ÃºÀº´¨¹µ¹³¯¥®®¤¡tÁ}±¥£ ©¡ `J¥U°¯¤¯®¬¥ ¥ §¢´©ª³¼»»ª°²Ç¿¹¦¬«±±£¡±²´¤old[YNOKEOPQQ;HJIGICC>:KU?A:=EM07544:B44MWO<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯¨
¡£¤µÈµ©ÆºÂÃÇÊÉÈÌÍÆ¾»³®¹¹ÁÁ̵ǺÁ¹µº°¯¯³µ§¤ª´µª©¦¬¤®¥¤¨¬º¿¨«¶·¾Â¿¾¹´³Ä²¹½¬£¯µ¬¹¦¦v¿®¡¡©§ª¡§nv¢¢®²¢ª¨ªª®¤¤¥¨¢±§©«º¶½³²¾¹· £§¨¥§¬©©ad`^QJLFHMIVL=MENKLBCD<QV=AABDO18=77?B75UXN?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUHe^HE«¡»¯««¢¤££¶Æ¾´ÀºÂÂÇÈÅÂÍÈÁ¾¹²¯¸´ÀÂʵŲÁ¼´ºª©°££ª´»¦©¦«ª©¯§£ª«¾¼¨½´¸¾Ç¼·¶¸Á²¾Á´©µ·«¾¥¢¢¼ ·©¥¢¡¨¥³¡¦¨ª¤¢¢¡µ¯¥¤¯««ª¤£¨©¤¡¡´´ºµ¨µ²³¢¥ª¡v_[_]JHEFMQIMEFGCSLJBEGAVRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJD@JJNO9C@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19g\FCCpbGE§¤Ã¥©ª§¦¬¢«¶Ä¼¾·ÁÂÀÇÃ¿ÍÆ»½¹²°¸³¿Âȵ¿°¼¶¸¶¦¤«¬¡¡ªªÅ¢¤©«¦¬¯«¢©¨¿¸§¾±¸¶Ç¶µ¹¸À²¿Â·µ³´¯¾££® ¡£¥££½¤©¨« ¦½¢£¢©«¡¤ µ¬¥±§®¦© ¥¤«±µ±«¥ª¬ ¨gbX`]NHGJNKHEDI@>QIA<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA46@9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ:nRF<KxebVL¢£Å¬¡¬® £¥¦ª¬¶±£ª³¶ÄĽ¿µ¿Â»È¾Êǵ¸µ´°³³·ÁŶ¾±¸µ¸µ¦¬ª¬¥¤Á¤ª ¤©¯¢¦¨½µ¥±½¹¶¶Ä²´¸º¿³ÄÁ¸¸®³µµ£¥¡® ¢¨¨«£Â©¬¦ ¾¡¤««¬¦¢W¦¡ ¸ª¦µ£± ®¢£¦®²«©¡¢¥¥¤`cYc`KHJJNEEAFJ>=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrGE6=ue\KN¡Ã¨¥¢´¢²¨«¥ £©¬»°¨¬¶±ÈÅÁ²ÂýÆÃ¼Äɼ¯°¶°´¯¿Ä´¹±°º´¬¨°©ª¥¡¨Á¬¬°ª£®±©¤¨½¶§·»¾¯·Ä´³ÃÀ³Ç´»·¬´¶ª¢¦¤¬¢¨«°¯¯»²¦ ©¨¢¤¹ ¡¤¯¯¬¥§¡¢§´¦¦³£®¡¡¦¬°¥¦¡
`eZgeJILJRBC@IG;;G?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 餪³¡¤´ª³¬§¢¤²¬®©»±°µ´ÆÀÄõÀĽÉĵ¿È´«µ¨¯¸¬¿Ã³·®¬·º¥«²«ª¦»´§° ®´²§«¹³¨º´¸²¹Àª·²Ä¾µÆ¨¿¯·µ©§¬¡¦¥¢¢¥¯¸®²µ¶ ¨¤¤ ·¢¤¥¯±²§ª¦¢¨ ¡¯²¢¦®¤ª¤
©©ª¡§
xbh\jjMPMNT=CANC::I?77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05IphVCWFyfC;¤¤¢¦¿§¨¯°¡©µ«º±«£ª´¶±°¹·°·¸¸Ä½Ãǽ¼ÄÁÆÀ¸ÀÅÀº©¶¤¬»¬À··ª¬²»¢±²¥§ª¹©¦°« °´³ª©¶¶¼³³¹·¬¸°Ã»¾¿¦Ã«°·®©««§«¡¢¡¡±¯³¬°¹© ¦¡·©¥£¢°±´«³¨¬ ¥¢£³°¥¨¢¨¨¦£}
jhl`lnWPQZTACDT@;;HA7:XPd^PVWEY_]MLRN^KJ>Zc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251.-.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=¨¢ª½¢«°«£±¸ª¥¶´¬ µ½®³¸»º½¶¶À¿ÈĹÄÂÀÀ¸Ä½Á·¯µ§«·±»¾¿´©®±·«®¨®¦¨§»¤¬³¬¢±°³¬ª¶´µ¾®°±µ¬°µ²Á»Å·«½¯±¸¬ª£±¦¥ª¤³ª³«ª³§ ¦¥´®§¡®±§´²ª¤¨£¢¨µ©ª¦¥¢
{elrgoq^FYfVDCMXDZ9HB6>]Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8)C3YT\gK6zfL@¤¡¤¬¶¥ª¦¯®·ª¯µ»¨§±·Å·±·½Áµ´ºÅ¾ÌƹÂÀº¾¹Ã·À¹²´«©º¶»¹¾´©°µ§¬ª¬«««¾¬®²£«°³®®¶²¹¸ª®¯²¨µ¯´¼½Ê³ª¶µ±´°¯¨¢³ ¨ ¦²¢ ¥¯¡¤£¦¨³©¡¦³¬ª¶¥¯±µ¯¤§«·¢¡«¥¢¡ y
{jmxmu{aE`jYIHZZ={JFD6AbTi[M\aJ[]ZRRRbaLKE^``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C_Q\.*B/JGP[H3cYUKD¡±¨±ª¦¤¯®¶©·µº¤¬´·É»´ºº¿¿´³·ÃÀÌȼü·½¿¿·¿¼±½§º¹·¶Â¶ª¬±·¦®«¨£°ª¯»¤±³§¨£²´±²±µ±¸³©®«²§·¯¶´Äƶ©¶¶¬°ª©¤¶ §±¡¤±§ ª©£¦¦¥¸§£²µ¬¨²§®±¶¬¥ ¬¨©¸¢¥ §£ u{
mpwt{~\Kel\KNc\?b{GI8GgWf\L^bMXYWTWTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'GbLV%-B-=ELQ<3rkICC¥®¥¯«¨¥±³´«·²· «µ¹É¹®À»Â¸³±µÂÃÎÅÀÁ½´½¿¿º¾¼²Ä§©¹°¶¶¿¼®«³² §±¦¥¯¥²µ¬«±²ª©´»¬µ³µ´¬ª¬¨©¹²±ÈÀ¸¥º°©¥©®°¦¥£¯¤©¯££¢£¬£ ¢ª¦¦¹¤¬µ¶¥«¬¨¯¶®££©ª ¤³¡ §v}
|||psq}|}\Sdn^NYf\FD[G;NmXb[L`bNVWVWTYg]QRLcZ[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HeHJ+;H?3BHS,>k;GHª«¢ª±¤©¥³´±µµ²²¢«®½Ìº®ÀºÇ±´´ÂÂÑÅÆ¾À²½À¼¿·»Ä§¬·¬³¸»À¯«± £§ª¨¤°¤«²ª¯¬°¯°®«³¼§·±²©³«¬¦¥£º¬ª±Ãº¶»©¨¨ª©³¥©¤£®ª¨¢¤¥¬¢¨ª¢¦¤«¸²²¡©¢ ¬¯±¬ §¨©¤ §¤~~
|w~
srquk_Y`ncQsq\K;|F?WtXaZNc[NVVUWQ\b_SONgXWWKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1<]J0.JgDF8<B05EKX1@Z>LE¨¢«³ªª°¶¹¶¯«¦«ª½É»°½·Â¯±¬³ÄÃÎÏÿ¿´ÀÂúÀ³Èë®·²¸¿¾²«¤§ª°©§¨±¦´¯ª°®²±´¬´¼¤¸³¬®¨¬ £°·«ª»·¥·¶¤ª§¬¬«®¡©§¦±²¤§¦¢¢¬ª¡ ¦¤¢«¥£§±¸®®£¦¢ª«®©¢¥¤¤
£¢|zt}sv£xj^`nfWecN?gLEbyWbYReTMVUVTO\]aUKMhVVWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<B+:JO^4D>HFD°¥£«±«ª¶¬¶²¬¦¬ª©¼ÀÀ¸¸³»µ¦²¯ÄÉËÒ¿Á»¹À¿Â¹Á¹Àıµ±³º¿½²°®««§¶ª¦¯ª¹°¨±²®²·ª··§´·«¬¤ª«£³³¨¨¤´µ ·® ª¨«©¬¨ «¬©¹¶©ª©ª£ª ª¡ ¤¢¦£ª§´¯¨¦ª¢£¥§§ª£¤£
¢t~xtzw~oqggqx\askO^VHmxUdVQcOMUTUPOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Ji5OD;±¡¦«®¬¥°´µ¯«¦°ª©º¾»À°®¹®¡·¯ÉÇÈÑÀ¾½»¼Â½ºÃÀ¾¿®²²±µ¼ºÁ±±²«³¨¤´¨¥³³¹°£®·²°²»«º¯ª®¶¬ªª¬£ ¶¨¡¯³¢µª¨§ª£ª¡¢¬¨½¯¬®¢¨¨ ¬°¢¢ §¨§ª±ª£ ¢¡£££§©¥}¤ xt|uxyztsyh¤ui^dktg}SXp^JxsSeSQ^MMRZfNLVYdXFSiRQ?CNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[*HM9UA4²¡¤¦¬¤§¤§µ³±«¥±¨ª¸¾À¼¯§¹ª¦¯°ÉÇÈÑü¿¾¹¾¿¼É»Á¸°°´±º»·À²³»¬¸¬¢´§§¬²¶¹³¨¨½¶®¶¾°½§¬µ¬©¯¤ ¥«§«³¥´¨«§©£©¤©¨©½¬´¯®ª¤ ®³£¤¥¥¤©«¦ª¢¡¥©©
~
~}
¡~r{z~|hx|zupp|gxdagbr
zmgx]]U@WzmTaPRXKLNru]HZ[gYEUfPD>JNDCA9HGKS?jaJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GjI14X=fcAJ7GS`U*=9DW>*² ©¦¥¡«¥¸³³¦©±§¸Á½µ¯¢¸¨¨°ÂÉÉÌÁ¶½Àµ·¿¹ÈµÃµ³²µ²¼·¹½µ¹¶¿¡³§««°µ¸µ¬¾½ª³Á´¼¡¯³µª«°£¥¨ª£¥±§° «©¨¡©¤¨¡»¨®±® «£¤®¦¡£ ¤ª£¥¤¢¦¬{{~
¢|yl~vyxc{{qpprwhsjgeg`mslaio`o>ZxkU^OQQJIMTYWM]^lWDX`O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>*49&'.34.0+/4&,:$41BhY13S=e_DL6KVdO*;2NX=# §¤£¨¤¸°¯¤¯°ª«¸Âº³¸¯«¨´ºÈËÈ¿·Â¾°´½·Ä¶Ã±®¹²³¿´º½·©¹¸½«¤´¨©ª±®º±«¼½¥°Áµ¶¢¯·µ¦§§±³ ¤¥§¡¥¬¨© ª¯§ ¦£© ±¹£±¯¡¬¡¬¤¦§©¤ª§ ©¡ª}}|¡x
|
{sp}qtt`yxinppnh}qc{miec_e
~_ZskrKKhXZNPLJHPRPIN\_nSDXZRhOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53=fd24M?e]FO=RZgH*>0XV5(§¬ ¡¤¢¸«²¥´´ª©¹Äµ³·®°µÆÈÁ·¿Â¹±´¼¶¿»¾¯«½°³¾±¼Â¸©»º·§¨µ©¨«±³±¨¾·¦¼·²±¸°¨¥§¯±¡¤ ¤¤¡¯§¡£¨¯¡ ¡¤¤¢·°¡¦±«¬£¯ª¥©¥§¬¦¢¨¢
z~zx
~yzprwoot_ywdllkihmerkkehZbs^ZlvjZH}][XOOJHHRUF2:_^lPDXVYeLHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84GBg[HTCT]hE.;1_T,2£¢©¦¡£¡¸ª¯¡»¹¦¬½Ä³¯®¢µ¯¯´ÄĽ³¿º·±³¹¸º¸º®¿³´¸¯¿Á¸¬½º´¦¢³«¨ª³«®²£Â¶¦©··«²»©¦¥¨¯«¢§¥¦¡³¦¥ª©¡ ¥¤¹¨¤§¦¥¡¨©¢¡¡¡ £¬¢£§¤y|
}x
{w~{lurmlsbyuhgigengghdfhj_fbifZf{caRsT[[SLIGIOS@!+j^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB378bM'2¤¤¥¦¤µ¨ªº·¨¬ÃÀ·¯¬¡µ®§®¯·ÁÀ½²Á·±¯²¶µ¸·µ¬ª¼´¯²±½À·®¼¼±¥¶¬¦¦µ©«¯¡ Ĭª§±´«¬´º¨ª«±¥ª¨¥¦®£¤ª¡¢ §¶¦¯ª®¡¡¡ ¦¢ ¦®£§ x
w{~{r~}gypkjlguskbgdbtbdefeijcgoY^X]mdaMhW[`VIGHKLRX>9`liGBUS\[IHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3AdG%5¤ ® ¥´²£²¾·¡±Å»¹°±£¶¬«®©¹¾½¼À²¯¯®¶¯³¹²§«¹±¯®³¶»¶°¹¾¬¥µ« ¡±¥«¯¥Ä¡³¥¯²¯·µ¯¬®¢§ª¥¨¦ ¤£©°¦¹§¢¡¤¥¡¨©§§{t
|
ofynhkjgqrk\hcar`dgjnlfjgdl\lmvqaTbhceZIFLMOXQPUaeT@VSYUFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]1:Kj[M[KXdc@A1IdB'4¢±¡©²°¹À¶ ´Á»½¹±¦¶°©®¥·¹¸¹»¯««·ª´¹¥²µ±¯©±·¶±³¶»§©¶©ª£ªªÂ¯¥¯±¶µ¬¬±¯ª¢¤¬¨§¤©£¥ £«ª©º¦¤ ¢k¢q¤v«¨¡x
mi~wrl}o]d`gkuwfhvifX]itnNPjcfqf^dfnli^]^
hOKD8ETg^JHPPUUKHS`oteE[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl15Ok[N\K[fb>G1Ob<+/¤± ª«£½Å¯©·Â¸½¼§¶±¦«¤¸´³´±¹®ª§¬´¥°µ¢§¸¶µ¨§¬¶³®´®³¢©´«¢¥§¨®½¨§°´¸®¤¨®ª«¦¢¡¨§¡¦¦§§ ¨ª£´¯£¢£¤¡¡¡¥§¬rx uif~sy o~|¡ {tvlmied{mrbTmcmiqXipnW]i[kj[pmyriZ^FN>F^MERVVQPRWTg^LYKRRPEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*/(-4583%&2115>1<8Xt15Rk[N\L[g_=K1U`7/(¦¬«ª¨ª¿Ã¯²¹¼·À¿ª¤·±ª¬¦³µ®¯³¶«©¥±¥µ³¬µ¶´¦§¨³±²¨®ª¡³© ¤¤¢¤°·¥¦§¶½¦¬§©ª¬§¦¢ ¨¤¦£¥¥©¢£¦¦¡¶¤£ £®©£±¤®yÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«°yhlX±®oei¼¼nhzmpØ~Skb¶²~qu¡ªWOXaOVNFT[XQPS\W[P@\EQNDFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww11Tk\O[M^g\>L1Z\41!¦§ª¥²©±Â½²µ¿µ¸¿Â«¦´©¨¯´ª¯¶´¨¨¦¶¥¨¹¯²²¶ª¥¤§²¯®±¦«§¤²¤¢¡¡ ±®£ ´º¢ª¨¡®¥¢¢ª ¨¡¨§§¢§£ °££
°kjª~g
eq§q®¡¤~wº|k¡v±_j´[¥e`fzfixj©e¾rg¦v±j|±xucmm§n\ EigEu`}f{£¦Y_«ixzj¨8J¯[WTmcZLOX_\WV;NOWV/ITSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5^Y31¢¬§¥£¤ª±·´½¾°·Å²¸ºÃ§©°¬¯©©±¯¤±º°¤¥¯³£©¹©³²°£¥ ª°¬¯¦¨£¢±£¯¨¢´³¡«¡ £ª¤¡¡§¤£¡ ¬¦¦ ¡µµx
©µw³·«~k¦z
w«gj±[¬{tpx
°vwqkjl|O¥XHcc~ch¥_yquR^P©mcq}a/R¢n[Tkg`LK\cX\ZB>°xWXA#MhFCDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFBAAD<FD;0201;F,0.840,.(/2,>831/2-D1<<S}n3+Xj\OXM_fW7J8aU50 ³¦¦¢®©¨³¬ª»¶Â°¼Â¸·Â«¬¯®§®³ª¢¯¼«¢§µ£«¶¥¥²³¨£¡§ª²¨°¨¦ ° ¯£¤¨µ®¡©©¨ª ¦©£ £¥££«¥¢ Õ¹q°ÂÆ|Ö»|§¤z¢¥z¬yV¯{~j¹Z¹w}¦|zªy{±nt»
nP¯§ÅQ zc`ªbsrl_Sµ´È
|c¤3Bu]PjhdP@XfZdaJHMkJZSOYfZCC?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB.00483+-(.323971#%5*>3==Qwj6*Yi[J[P_fT7G:aP72%¢±¨©¥³ª¥´¨¤¼·Á±ºÀ²¶µ½´¶¨²±£±³¦ ¯¶©¨º®£°²¡²´±¡¤§©±©´©¥¬¢¬©°¨£¬¢¨¡§¢¢¡£¡¢¢§ ¦¡§ ²nhµq«p¦r´ts¶{¦¢~¤~°uÒÑu[®|
¤oª¦k
}}{±sx³et
nfRÉZÂ\yb__vsb^YÊo¿uMKµSUÆdTQjcfXAOj_liPUFI8=WR[VYIC?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Prh9'Wi\ANT_eP5G=aM62.¢¥°¥ª»§µ¥§¶»¼²»¿¸·µ»»´¦µ´¢²²£ ¬°¥§º®¤²±´¸ª ¥¡ª¤²¨¬ª¥©£ª¡§«°¥¢¬¦¡¥§ §§¢£®¡¢¥¢
¬{w¨v£©o§£¢~®
³\r³R®}¤q×}w~w¯w´ael[°WKuyf`^vwgj]¯wxl5yÈ®²_BTo]g`EPl`qmVUM.ebhSYP;BD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/03333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:77 ¸±³Á¨²§ª²º¸´¹¾¹¸³¶¾¶¦¸´ µ ©¬ §¶¬¨±²«´¤© ¨¢µ§¦ª¤¥¢£¦§¯¥¡©¢¢©¦¡¦©¤¡ ¡¡ ¦©}}¥y¡ªp¦¡¢£ª{yo±Z¨ ytØvt§¤|{²^d }m\«\[hgªcr{jq]«Z kneOJC¡\ZMt]bfMZa_rt_JU5JXHE=HFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<PeeA&Uf[?1T_bL7FI_C1=7¢¿¬´Â®«¨¦´°¸±¶¿¹º³±¸¼ª»µ ±¥¦§§ª±©°ª¶ª¯¡¡ ¦¤¤º¢£«¡£ ©°¯¦§¦¤¨¬¨©¨ ¤£¡¡¡ ¡«®nr´t©w¦s´yt´¥£¤u¸o{¢kk¶Z¡ei ¢§mr´t²jku³af¢nk\`N¡|Rs£ly~np\¯V<wfTon.[§ObRkeblZb\`p|cSYQ>>mo2BB@?M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U^aL5FM^91A8¥»¢²À®««§·©¸¯µÁµ½²°º¸«Á¶ª«¡§¤¢««§¶£³¨®ª¡¨ ¥«¹£¥£¡«¶¯§¬©¦¥£«²¤ ¨«°¡¢¢ ¡©ªÓ»t±ÄÃ}Õ¸y§y¢¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¢~t«}¾ns¼t²uxmqm¤t½]w}[ay¼jZV[iy^iadfbmyoY[YCA@r?CF+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-6@9§¢¼¢±Â°©ª¬±¨¹¯·Å²¼³¯¼°®Á²¦£¤¡ª¥ª²¤µ§¤ ª¦¬¹£®¡¦ £¯¹°«£§§¥¤ ¨«©¤²¢¤§¢¡¤° ©
¶¸xµwnlnsoysÁ»¼z²¨pt¹|{|¤»¹½uy³£uvut°ufi¶trqw¶^y}gymyb¬pt
X[§jDdYTf_c]cQffqmuBMPMD;ZL?J3<0 8>;.3=A99?=;<C6BSYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7>7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿¦³Â´«ª¨«ª»¯±Æ°¶´¯¸§µ¹®«¤¢§ ¬¤ª¦µ¨¨ £¬¥¾§¡ª¢¡¨¢²µ¶¤¤¢¦¥«©¥¦¢©§¦£¨¡¬¢°©§¢k~i¨ys~uze{¾¿Àºnq
_rjZ]adk`cmvbke^_cqhs|fj~qty~}b[xthP\n|{jXlyrIJo
pNsMEW\faL[Wfc^OZmvjrRODEM<HI<M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEJOHFPIIH;8=51:.1;:.0-76=5&"/*2,%;8-7IR_I'S_V4)P^L(3>[O'?2>¨¨¡Á¤´º¶£¬¦®§¨µ²¬È±´¶¤¾±³§¡¤ª£¬§®¤¥µª¤¢¦©¿¨©¥ ¥©¨°²¿¬§§¢ª¨¤¬££§¬¢ª¢®¦ ±¥¢¨£¥§£hn}qv´©
¡ z¤
li{}urxyvu{jstudw}vkpzm`c[ogLXYej_WYpzonfSOFR9OZNRO(+;JB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;810)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¢¿¢¤±±· ©¦³§¥°µªÉ¬®²¦µ¦À¨´¡¥¦¥ «§¬££·¬ ª¦Á¬¤¢£¨¨§²Ã°«ª©«¡¡¢¥¯¥¡¤¨«¦¡°¡¢§¡£¤¡{©¨
{
£~e¡³®w{}wyzogykuyrisyuktcxf_hdcdfjXk{pjk\SLPD_UF@?>,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_]]]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@´ ¹¯¾¬«±² ª¦²¢¬³°Æ±¬¤³¯¼¤´ §¢¡¨¦©¦¤¥³µ¯¦®¾ ¬£¡©
©¬¢´Ç³©¤ª§© ¥« ª®¨¤£«¡¬ ¥°¤¨¥©f|e~cxlhjz£«kd~g
eeihz¡kh¢wkj¢slnzyXe]
^lv[hswwnxxsmysw{i
X]jsd]sik|qmc]QNWIdX@J3=F7?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[I.6ZO6)EY/DO1YB;?.=¥º¼¹¯«³°«¥¨®°§®°½²«¨¥°° ¤¢§¬¬£¦¨©³®£¢¯¦¶¹¥®£¡ ¦{¥¬¢¨´Ã¸¥¢§¯££¤ª¨¡ ª¯©©£ª§¦§ ¬¡¥±¤«¡¥«~¾r´r
hw¹Ä¸q¡£{¦sª|ËÀÀ»q£|À½ÁÀ{z¿}k¥²ooÊzwvyyq{px
ylvbe^xd_eb^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA@?=6468266*&%#)*&.+*)109*#>H[L*#CP/#F[3PY/UAB;/8£¸Ã´°¯¿©©£¯©°¯¦²¶°«¦§¥±« «¢ ª§¢«¢¥©¥¥´¤£¦®¬¸´§¯£¥ ¡ ¦«¤«¿À±¡©®©¢£¤ª£ ¡¬®§«¦£¡¥¤¤©¤©ª«¢¦¢¤Îyz¥z_]¨ ¡|§t«¯^d©z¨
t³c« ³j®s|¸aY£Ínu{Û{q~ue{vvl}n}
~l_pjof`_xd\qhjcf`RTSW^JOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5478164('$!',&&/(&+360$7;SL+,-J0';[:L-!P@F4.1ÂÀÀµ´°·£ª©´«¦²¬¤¬¦°ª¡§¦¢¯¡¨§£¦¡°¬¦®°«¨¬ ¥¥¨£®¤«°¨¿Æ³¨©±®¢¡ªª¡®¦©¨¦¦£ ª¬³¥¢ªª¤§§¢±¢§¡ p
u¨q°|r¬} ¥w«}r~«v{|~ª¡~«z zVÄzoÁ}mupmfweoawnrnldmsuo`fmd_ohjnfcWS\`ZRRC9II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;92478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1-+¯ÔÆÇ²´££¢¢®¶¯©±§©«¨®««¦¢££¦«¢¦ ¨¨¢°¬¨¨¯¬¨§©£¢¡§£®¬£¬µ©¹Í²¦®¬¢®¬¡©°§©©ª¨£¡«¯±¢¨¬¯¦¦«ª«²¤¤¦
¤j¤uz©uz²q¥p¤_`R«®u®§z
{f£¤£}©®^|¨U¢z£{ïÅs¯´³¹qb©¯Âthlnlxxwnkfddqpf{ic\V_iXXTLLQLCCAB;CA@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°µ°¯©£¨§ª««©¤¦¥¦§¦¤¬¢«¡¤¯¢ª¤¶°® ©¦£¢¨ ¦°¦£¨±¬¶È²µ©¬ª¢ ¥´¡¦ªª¢ª¨¡¡©¢³¢ª³²¢ª¨°°·¥¤¨|ªlu«y|°n¤Ò·´¸É²^_©¤ zxªÉs£¨©~ÆÆwe¡¥s}¯^oµc±uK£m§Gd{o}nyt|zm[ejrqfj^aXcm\^YILLKEDBB=A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4NTQ;<F2,$¨¤Áƹ©³®¬¥¢²¹¬ª¡¦¨¦«¬©¦ ¦¤«£®¬¦¡¬©¥§µ £¨«¶²¬¦ ¦§£ ª¦¡£§©°´Â±²ª¨¥¢¤®¥¡¥¥©®¬§¥«£·¬ ²¹°¯¨´´´¦©¤¡Nxz£|¤¦¸{|y¹ÌÆÃ¶w¡~v¤¤¨~°
¬}a¥l£p
}r¬`¤rq`¼}RUu£{|ryr}p\lnwrjoZc_hnbd]LLQSAHGFI99K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,- ©¬¤«¹«¯ ¡¬³´¦¡¦¯®®©¦¥¥£§¡²®¢©§² ¨¤¢µ£¤¢ªµ¹¤££¡²¦¥¡¢®¬¤¨¢µ±Ã±ªª§£¤¥¥£§¡¬¤¥®¥»¬¡··®µ³¹²´¨±¢¥ÑµÃ·y
¦x¢w
¥q«
´nri£|s®¥¢¦mp²\¥szl{~n©a¢qqbs²¸hw¤}v{xlhwixsnu]ddmmeh`JZWX<HF?T3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH#)%r®¿¿¼»µ¨¤¶¡¢£©§®©«¥¡¦¡ µ§¢©§°£«£¤¤ª´´¤¦©® ¦¤§´¡ª£µ«Â¯©«©¢¢ ¦£¦£¥©¦¬¡¤¬¦½¬¾°£°´»¬µ¨ª³¥©{¨}|°w¤¥m²o {¡¨¬
®
¨¡¢
{~«ªx y¯]£|¦§d|tk®]¥kq
]`[ m¥xy~jl}b}tmz`gepngghBY_[=JS2T8BBC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZWSPONI7052.*,ATVVVTTUUUUTTUTSSVWWXVUVQHFIJ#((¼©ÆÃ¶Á´ ®¸¥£¤£ ¯®©£¹ ¢« ¯ª ª©¥®°¬¦ ¨¢¡¥¡¥ ¨¥¶¨¿®¤©£¦¤££§ªª¢£©¨¾¤Ã¬«£¢¬³»¬°¨¢µ±ª¬v¯~
}ºd°e}¡§°
¦£¡¢
[lj³`{{²lgn±[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m§yx|cs|axs|aifpmfeeOUc\AT^=H(>9=4!!,$2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPNJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·½»´Á³£¦¥¶© ³±¨¢´ ³¨ª«°«®¨¢¯¬©§£¨¯©¡¥¤£¥£©²¨¼¯¥¨|¡ ¨§¬¥¤¤¢¤©» Ƨ¥©¢¬µ·®¯¨ ½¯®®©£®¤¸Ãº§¬¯§¥«~սªb£¿½|~£×º·µ
½¾j£o«nz²±Çk«°½¬xw¢¾»t¥wyb|zcgx{`kekjaPb[Si\@T`BL)<:5/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´±¿º²½³¢®¦¥³¦¥¿©¶°§¡¿¦¦±±¹¨®¥§¯¬®¦£¬¢¥ª £¦§¡¨¢ ¬¬©¸§£{¦¨¨§©¦¡¢«»©Å£ ¯£«´µ«±«¢¼©°°tvª¤¶
epg¬mow¤ u°pr¨£®¤rlmlexnmqzipifqhi
gpd]cioY]g~x¦`brofd¡{tewgjx~xdlcflbKeWJkY:PdDP'J:+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´ª»º²³ª©¢®¤³ª½±Ãǽ´©¿«¬£ ¦«º£¤¬¥ª
¥ª¢¤¤ ¥§©£ª ¥¦§¯¹ª«{¦¦§¡°¦¢¬¹ °Â¨¤³¦¬±²«¯©º¥°¹¡©¥¶¢©ª³£¬¡´£¡¡¢¡¤¡«§¤~gtvtq§m|pgvnwu|yikddocU`X@iZGb`NX+E=+&!640/!%2(*799469;>?ABDFJKKMPPQWUVY^_ac]^TQJEC>9=@ASX[\YWXXXXXYXXZZ[\^__`^^^__```_YY`¥©©¥¶¸®®¢°¥ ¶±ªÄ»Ä¹·©¡¥¥°¨£¶§©µ¦§¬£§¬¤¢¨£¨©§¡¤§¡´¹§ª{¡¤§µ£¦¬·¨¯Â®£·§°¯±®ª«µ»¢±¾¦¤¦µ¢¦©£¬°¡¤²ª±¥¡¤ª¬¢ª
~fuvytj}
xqrx~q{~ind_pi`[_YmbP`dOY9GFE=2<=8/*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤§£±´¬®£©§ ¨µª£²ºª«¡¢z¢°¤¥±©¸¦£©¢®¤¨ ¡®ª¨¨¨¸¶£¥y¡§·£¯µ¢°¯t¤¾£² x{¡¬³½w®¥ ª~d\bv¤~n³£¨¯«¤e tzq©l£¨e¥
wkvq|ai[vghqz£dwvhny~jpe_vokkg\ecaaoRZ=MMNRF=@TB91/&4:306678<;>@ABFHBGFIKLTUUY]`hggXQI<DG<9VR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥©¤§¥ª´®±¥©¦ªs¯¨«§¸ ¤~¬¤¨¢
t®¦¨£¹³§ uv¥²µ´½§¡~§¢{¤°¹§
±©¯¢y¬¢¨«©w¥z§{²zcynqzqt
xht t{}ijxzppgdwmilj\diier[\HTLQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aahfYQH9DK<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°§§ª¥Å¼¯ ¥¨´«¦¢ ¾¡|
¬£¡¡¨¢£¹±§
pu£¬´´®Ê«¯·
°²°
©§|¨r{w¦h¤y´§©Â«¡q¥}
²¡} |
ms{r}
uÅf©¢jogwt{vghupghk^bnlflXfF\QL2E46Mac7&4<DGD:63658;8>==>BL?NIJKCPZ]\Wb^jl\QE=KM@JdX]cghgbbbbcc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹±ª«§¢¤ª¢¤©¶¢¯ ¦¥½ y«¢
w ¤¢¸¬¥bm ¨~¡§ ® ¬±¤«~¢uk«tM«x©©ª«~¡{z§ilg¶~n`cX{dgs}yk]|n_Sq
\`ly`Ye~q§ªk£nr¥pgdlZlzeY_~aWPovemtqjjn^jolkhWgN]XE9@4GD^k4+ICQMN=84859;6@;;>BO>QRLMBJ[]_W^_bv`ME:MOMTb\[fgiibbdaddbab`bdcabjkdbddgdbgeach ¹ ª£¦¬¡¶¼«¯¢ ¥««´¢§ ¦´u¦
¬£©¥°¦¢in ¡¥£¡ w§¢¨«¯¥z}}¢pr{ym©|¢sv¦f~w¤^{}s¢n·´ºs¶¨dƸ{p¶q¤ct¬«`}j³~n}q£ls¤s}£^³o{³tr[²ibosuqhnXkkrrd[h]bLD=D5QAZq2<RF_JS=<395::6D;;@IP?TMNQ@E_^[YX``|dIC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¹« ¥¸¶® ¡¢£¤«±¬« ¤«x
p¡}¨ ¢¨§¤~k{~} w¢ r¢©§©¬®}z y£xs}§£d¡}lhn{§}rgsªsªg]
vhªj¸f\©pa^§vvhumj¦\¨~w»j}©Z]³g\nqxwki[piwxa_fWbBPEO7VBRn4JZY^NZD@151;;7H?:CGU?XRX]>Db]V`Qac}jEB9N[^YdfXfgmmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬º²°¬¦§¬°§«¢¡ £iq{z£¨¢iy{~¡ ¢rh p© ¤©¢©}°¤¢¸v£³¢£xz«~¢r¡}
°µ}k¡x~´££«¨{|~sªZ]o{xbL{{
dzBMY¢jr|nvy±³~¦t~mq|ori£]vHec`sp}}nf_khu{bc`Q^W\TV@YEQgERV\aX_ID=B8@A:IE8LEXAVQZVDFa\Z`K`m}rEC<U^bZejVhhmobff^a`\]^`hb_edvl^egfldelhhki±®S_¡§´º³³©¢©§ «£ §¡w
ny
}r r¨|l
q¡x
{¢£®}µ{¦z©¢~§hwm~s sq|
o®}£§¤p^©hu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²§¼wm¿¦ª´^o~ros¢r^¤gt¦`h¦lÓznwykyvrl©¥g_dypkgfcmuwf_aR[fPQaHWIT_WS[dj[eQFCKLJKBJE8P@PMXSXORQ`eeiRdxywJFEc]eZhjSihjocjf`c_\]]_hbahe|d^dgdkdjlfhlh°¬T\K~©¯²µ°³£¦ £¤§¨
{p}h}wpl|£ª
ywnw
y¢£ ³¡¢¶z¬§¤®¥p©}¤¢q¢®¤¯¢vµ¶µÉ¢ta©myu¡w }oLf£ps¥{ytbl~ lrd`rtk{j´µ´Æ¦s~zj«tmswiytqPD}³^jujxfkgbttpmV]SYhORhIULXRV\gknUgWMJAJMJHJNAQJPdcimetrs~x{nu{{TQOm^h[kiRjhilgmfce_\\\_ibdhk{_]dgcjfnmeile¢¯§
f?¡²¬¯¯µ¢¢§¢¡£¤¦¥yjye~yui
z¥©z}yp y¥§gnxl¢d|q¥xph§|¥z rv¹n¢b}¢nsj«ku mo¦`iiu¢}_
uobh¡eiupdgns¢Z_[d¡n]p{trd¥nx¢df§hrn¡oRn ^d§T]TmmrjqmphkxskoQXVVfYSmIXO\HXhhsjYkVQREV\LXRaUhj^wuz|p||r{svv^QsagbqgPkhhklohdg_]]]`jbiivu]\chcjirlfkmc¥¦zetm§®¥ª±±¦ª¤¡¡¡¡{qh|st}|e|¦¢«
}si¥}
ª¦¦x~¥²¯¥yz©t¦n¥¢¼n}¥¯¡}¦{r¨ g~o¬cw¨l©¢vw«¦k°kv³©lnnb«ªw§w}
¤ iu¬f¶sv¾¤Y¦«auqso{tqbj~nhlSVZVa`\jL\R]I]lmv`[qY[`Zgsenoqcqt`wz~yryr~{{vbyddnsdRlggomrifia_^\ajbllzo\\biamiwmglnb¦ª¤ªª¨§®£ª£¤¨
t
zo}surn}{
¥¥¥uol¨ª£ t~y¯¤qy
{r§q}}zx{~~w ¡{~k
[yysypin~qtq
e_xvtuo{onn_wixfªt}jou|umlfsw{w[jXyhnwrqowxo]lmigVZ_W\dkdUaU^Q_owykjwejjju|pqtsaoubs{xuzuy
}{mldyn^Wnghukxjiid\`ZcielqunZ[bkdkkymhloaº©§¡¢¦¤¤«¢ ª ¦¨~r|}~ztrp{}
x~£{§¡
wqª
¨ «~¨§xq{p©p}qjo|hn] sqtkvtYrn}~i]icz
_ix{|viykbqsw_r¨gnwowndfcyzZ\ifnv[zxwtmsrf\mkkbZY]YXkq[^`Y^]fr}ztotcjji{|rzwtdmthl{~uz|{yyp{}s~zrhT\rilvpugkgd]aYjhkjqrmW[enlgryohjm`«±¡£¡©£¡}«¡¤{|r}v
ror~z¦ xz¬¡«¢¢££ª¢¨§¡|y
¨~~±¥±¦ k|vwe|
w|{u£~vqt
x§{
uk{yirh`tp}zwvovs]]ogn__Z[\RgqUc[[alht{|rnpdjih{mx~phoplf{rw}{m|zx|~zxNdvjsnq{ekebb`[sfpfrqlU]ltmhxzpgikeº¢¡¤ {©
|x{mxr}mk~z~}©q
}z©
¦ ¢¦ ¦x}
¦||
ª ªpxqta~u~
nyvu£
u}}ss|{y
¨u{nj}{mhklg^y~g|{vtuuzw\`p}mu`cZ[^QfmSeZ]akiuz~pkmckigkrkjsnxnynv}
vr~{z|{`i{kuhiejc`i[cuhobumkTbqyeoyzrejmm¸¡¤{w¥¤xy
|l{xr||kh}|~|¦p ¡
|§v£ ¡¢¢¤z
¡~|¤ ¦~~vtpv`}r|q~
hxrys}}rz|
{{¦|
tydqz~xypljf^}sh|uus|sj^`tvpwdcX]^RjhTdX^ahjvxqfkclhejm}gmpj}w
zkr}tv|z}jrntibilb_qUtomn`xhlWjtvbuz{qbkoy³¥¥ |u£¡x{~~p~ztu}wgc}x}y}o¥¦v¡¡z¤{x~s¢ ¢|wr~n{d|pk
fvo}~y}}|ryz
£wvzt_ww|s}wfkc`~ijvstu}q|ccasnurmaY_]ZkdRbW_`iluypcjclfh|khthloh|xmqt|~z~|muttmeljacuVipn`xglajvpfy{yq_ql
®§¨
}v¨yx{}|{xsxys}d^}~
t}~~£ ~q{¦ t§um{o¢|zrzkul{~n
wo~~esj}
tz~vx~}¥y
t}rtl`ztyp|oanbd{anovswwssav`oluno][^]]j]O]Wbahmszk_jejchwmflhilg|zwos}tz}z}}ryyxnlkh_jrchqoevgmlazhk|{xpawmª¡¤©}v¬|v}{|{vwotszo
}~|a\~szz¤||£
n¢¡p
gz
p¡}{
tsvkqnu|tnqt||eqmz~~
utzo}
ª{}~
w}pnbgwstnzb^pajt^pjzxxlrpey]mlsmsXZ]_ajZOWWdcfqqe]ihgbgqndigeigzwuos|u
x
|w
zw{{ryjj_qiskqnmqgoke{bnyvpkvw£¢¨¡§t© s{v
wxrs{
kroymvnq[Y~vu w~
n¡l¥
g~w~~|}ovplmop{ispwuygsov}
{zwuq|{
¤|vwxmi\qrqooxZ^paoj^oi|zpmmjmw`pokqmYX`aamWQSYefbupb]kmdcfkm`ff_gktqrptyvywv
{{vjqc}c
|opltjhnlvw_q~y{tus~¥§
~t
zrwtpr
squlnlumw}mnUQ«yvry wz¤
}s
ih¡qw{{||kwjnklmzby~vzw|zhumu{rz
qx{{~}}x}wphkw^womkqrU^obqa_mnypgpfftuhqlawe]Ve``rSPN[ed\xp|^\iqbbefi_gd[go~okqs}v}
uvy{xs
~|yxfqk`~ookz`imtt_t|xwss
|y¡±¥~vtvspo
spqojiumn}|musRNᐙ|otuv{r
¡
}xzzwim¤
cpz|z
|m|esoklzy\y{}~{ziukt}lp~{}wxysleo~kitoghsmS^ndpZ_krygkkbgxsoqd_w`aVk_^vOMK`ec\yqt\[eu`aeec`fbXirsmkqv|tyvw~s{r}~vesn}eopkZknyys`vz{vrwwy¯
x~|
twpypnomn~rcdxp|nz|jhlc¤ÁÜ®ï¢skuu¡
np
£~{ux
vwp~¥
^l|}
v
~~k}cxtjoxsXz
z
~zftjlwo
{utxvsqftxasmoahufR`pgkU^mtzarc`i}qrn[cracWnZ\wMMLcea]vsm[\dx^`df_cc^Yirknkrw}swxx|q}}{tshuqym{ntpWpyvyqdvxivr§£|pxy|{rwpsjokil|t^`xv{ptzg`e|ëÚµÉÃÜslsvip
|zwxrvq£a
h}}
q~rwgvritwlZ}
}vbum~nmz
}~orzulpjqw^shn\iu_RdqhfS_owu`o`]hqrjWgiciXmW[uLJLef^ars
h[\ey^^dgzad_]Yknenjtw~sr~{vzt
|wv
{vlwvyxunxz}Xy
qogxvdv
q¡¢sorv}{xqtnodr~hflww[_x{zqqiagaÕ¶§xnqw{qj{h{{~
zu{{qux af}~m|tkmwutwvkc|
~p`tr}}zqg{
|
opytmnijx|agiiXkuZRiribPbrymbe^Zjnsb\g_em_nTZoNHNfd\fnrkZ[cs_\clwde]]Zllbmjsvqo|}txx
|uy|vpxy{om{v^tmizssgr}r uu~mv}|v~vqoljat|gbiuyZ`w{ymq~echhW_rs¼Ävq~rrj{|
|{uvw}ru
rv
|f}~r}f~|y}i}vfoyxswslk
x
k_sy{~|~siz
y}~nm{}vsngf{ub[pbWnqSSnshaNftyf`^]YoosYeb]jn`pOYkQDSg`Zjnm|nY[^mcZbowdg\]`kicljsvpm|tuz|
v~xtryy~oo{qixz~ml{ukjxtl
n}vjx~yozsplid`szh_eqzZ`r|ygqzaee±²wKbZ¥ÚÐq{x}
nk
zy|xwoqu~zjy
¥owy
p{|nwhxr|e}ucpsiypou|vx
zj\rs~{rnr
szxno~vydgi{p^XvZXplNWqsg`Klvua^\ZYt}soWg]fjr`oNWhR?Yf^Zpkhzq[ZYkeZcqy_h\^elhekiqwol~uo{v
qq{|zyujzko~t}or{zpoxg¡
fogy}~|ixrkkf_`oym_box\dkzaqv_eeÔê½2:>qx
v~ml
u|
|xnvwn
lu{tfy§~nuw
z{w~krh~xm||wayrdqh~nuqu
su~so\nuy{}y{rm
sztmkwtt\hgvoWV{RYpdLZrre[Iqxo\[[Y]t~thYb[gfnciMWfQ=^e\]ue_toZYTodYdqyZh]_fmgikipw}mi~yn||zupnw}{{h{}js{r{sw~zx}|ll}kh~z~~~}kuqghb[bgso_aks`hpzbst^cd n\5Z¯µti|u
svpl
uyx|z~rgu~~oq~hvynfy¤~nv~
|pz}{h~lj{zjzwr`vrdrgvmu{|owz|umYpwuxv{ytos~zonjntn]gdrpPZzM[o\O\rodUKsxiWYYZaqt`]]`gdhifNZhM@`c[`va\tlXWStaZdorWj^bhkgmlhpw|lh||p~{zwq{oqw{j~{mwxvw|x~~zm£zuxklx}z~prqcf^Yf_oo_`gpfjotato[adjv{¿¦¤È¸q
r|xsqro{tttwyypcwzirvgwucj|}st
zz{kxy~tgzhkysizv}h`w~kjth{iv~z~~p|v|tbVx~ss
}qxyqqz~}vviqimqo]gaqmIduK]mUTZsnbQOtxaRXX]aos[a]heedkdQ[pICc`[cp^\vgUVUw^[enhVk^aigennhpwzmiy}r{~y|v}pwrmw~p{wyztxzuo~}
zw
{gt
y~{
vgpn_d\XeYmra``plkhnatiY^dnw©ÚªÇ²qwou{ztst~wpqmtxuk`zyfqpgvn[m|y~y|nw
u
{ltv~mgvdm{umiwv|abx
zhuub}{gu{tvq{}mZWupv
zmtzlv
|~y|t~shtenlsZi^tdGmmKZaWVVwmbPRtvXPVX^aqo\`cmdd^ocU^rFBe_]fh][zbQU\u[ZgkaVj_`nefkqhpvxtku~vx~w{s}ortqu~
{wx{|
x|}~{~svy zvtx^}
xt
wzbnm\b[[aVisc`[gnofqaqfW]cl|Êι¡jmmlqq|~{yxsyuu{jlvcuwof^}zerkjqcXmz
sx}ors{y}ppo|fhqbmxqjkqx}|z]eywivxfwgt}rjo~yn}]Ysnu|opqwixw~s{u}{sgsankrXj^v[GmjLVT^SU{kaOTurPQTW^bt
i]`ljfcYnaYdpG@g\`f^]V{^OUdpZ[jh]Wh`^rfkgqgpswxntzx~yur
pp{xvuz
z|t~}~~}|xvxx|muxd
so
ztcnjY_[\]Tgrd`XdqrfsbkeW[`jw¾®{ ¶nbshs{qy{~~wwrvo{vejo`usjb^xyfqhkkZVow£qryvot
}xtqnhx_jl_mvjgjkywzvZg}|xer~nteu
pgkzunub]q}lu}|fv}nqivys~m{|{yqflbm}lnWj_vUJijNQNhMX{haNUvkLQTU_fuf^aqhgbWi]\lhJDjYadWYUyYMVmjY]kd\Yec^tfldqgrpuxp
v~w|
}usnsy{zsr
y~u~|{~{v{wwziv}{lqp
~pflgX][\[Sdpd^WbruiupeebW\\hporsddx~itusrwyvsunkzqbgkgtnf]_}p{imygjdUWro¦|{vt}s}{o}|x}}uoqlgt\lg^ltdgeizo{rYgvuhpxvbw
|ojm{qgsfanzgsx|~bwwjlrv{q{zt~gywodfbn
|lkViboRJhjOKNoG^{faMUtcJNSWajv~e]gsif`VcWcp]LKjXcaUTUsVLXudZ^k`\Zce_vgmbpisorutww
z}t~
nst|ztq
zvt|
}~{~v{£¥yku|zuznsy}unjheV][ZZSbmd[Xas{ihmi`bW_[jjkpgk`hyxjstsmz|uunzhjyj_enhvgeXbwj~{ojpgf]UXog¨wz|yvqptwzyu
vjquggn[lc]mr_gajxh{m[nrtjo~zwaw
x
sroyrcqi\qxdrt|yctqhjzurmyxvyd|ywqddcn|}kkUhaeRJlgOGQkEaxgaMSq]JMTZekvze_mqid]V`VnnWKShWe^XNUlTJ\y_[_k]][ce`yhl`oounpxuz}wzzxy~rutyvt}|ks{
~}{v«zkryutnn|sjomddX_ZYZTajg[Z^ti^ml\aW\\lert}ii\kvugsvql{}|xurlygixf]eshzwccTepg
wwgij`WVYgc§o~w{qr~hzp{}xr}ndurdgg\ja\oo\g_mudzh]torkr|~uvbt
{xruuapm[rtcqs
|uesmam{pkj{yvsfv{{vqebemr~jlTh]\TKrbPFVaGbwgaKToWJLXXgkuzdenqfdZW]XveTJ\bWgXYIWePHbxZ]_l[^\ac^~ij_ntxmpnvyr|~uuy}tvuyzz}~isz}~
zz|sq{{}eqys|{urn
l{~lzbpobe]eVYYWcfk_]\r
hXpn[^XZ\l{cpwvmbZlssgtuolx~xwnntdite[gufvvy_]Rffjt~bdi\TX^bc¤hxtynp{iyn||vsx|xhdvl`f_^i^\skYe]oobze[w|knnoxysuds~{vpr~sbxd\ppbqr}tgre^nwiehz|unout}trb_fnn}eiTgXWSMw_QJYXHbudaITmSJMZWilq{bllscbZZ[aw\SLd]XiSWHY`MFiuX^`l[[_bb\iganxylojvxm~vsttrwvw|}~~~pw|yxz~ttp¢{zxduxsxuksn~kx|pr^po`gblTZZWhcmf\[qeSrn[ZXX`lvciuji^Ymsplsssi||vonldiqc[krduvs[WSearr]bc]SZ`\cerq
tll{npq{}}rxszzzceuh]bY`gZ^vhWb]ohaw`[{vijrnxsruhq~vsjq}nfwX]lncrsztgo~[`prb`kr~mmusqxkpa\ellzagTfTVQPu[QOXQHctb`FUkPIPZUkkj|emnqb[ZXYlqWRPgWWhSTFY\NHruX_cmcX``a]jcdmyxkpiuy{k}|y|nqnwz}t|tw
utquo¢s{{ewnmznfwpzksvrk^tnagekR][UgalkZ\pdOon]VXUgithbtee]Ymtmoutxj||vsddkna\nmcsxkZTVcdx}}q]c_cTZ`Yccnp
tkh|pftxu}mzuvoz~u^erc[]VacXateU_`mdaq]]~phisqtpuvkm{
qsgo~qsoT\gkfqtwscmvVbrl[_pg~fmw~ssskm`Zdjjw_gTdTUPTmWQVSOGds_aEXiOHWTVmhd|ikwkbW]U[tdSRWiRYfTSHZZPMxvZ_eliYb`^^nafkyunoivvl}{~krgt{u}r|
{ss~vn¥rvwmz`d{pfxrxlmqvgd{lcfghS_^Ug_ln[^mhNim`TVSngtkexdd\Xoslqzwrl{wzykaelm^`ojeqy~gZVX`lx|{p_b^gVX_Wdbkq}xlkyn\wsm{jvtoo{rXim^X\UabWdpcS^ahablZ`~kfksvomwwli
{mqfq}nsncZaiiotts^imSeqeUcoc{drw|wkpmk`Yaght]eVaURNXeRO\OOHdp]cFYiMI_KXmd_xhn}d`U_T]u\TS`gO]aUSJ\YPYtu]_elhXca[^qcgjxqsnhvtzrz~|yntlst
y~|
sstxro~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDARÌÚØØØØÜinnnnojfggggfo
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR455552FØêççççëbgggghc_____^j|}z{z|}{|~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}|}}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvttvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfgggihgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtttwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrrtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@:;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;89:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsusqsxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<979::989::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsusrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;<<>?=<=;:<===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?BCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuyz{{}~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}|~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@=<=;>=:::<:8:88:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~{NIKKLLLEILNM<?<<=>@@AA;BCBC@???@=?@?=>A@=>=?==>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABECDA?@@@?=@@<CcD@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBBC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>:>=><<G{[>CCE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEFFFJNNKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDFHD@><;>@DED@AFBQenpyqEDDDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJHIGUea~
zTAAUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKKJ^z|~cNl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIKIIGHIGIIIJIHFJJJJIJIJJJFILLJJKKfopssuvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKKd~}{
uIIFB??@???<<<>::<AA@><998<<=;>;9;?AB@ACCC@ABEDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHHIHKKf~}
fBB=88::9878896479;<:8567789787689;;<>@;999==>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz|{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@CGHKGjT;8656766655763468:876565677778:77789;7689989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=EBDEf
H676468874578467699766765::;::<898977779:98878588;A=>>BA?AKLOQPQOOOQWkrrttuwz{{{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897:A:=CSz>:88;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<;9;<8::;:999<?<=ABDIJMKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989999:?>A?Y
l<;>BCEEAAAB>@B@@?=>>@?>?@?@==?B?AA?A?=@@@>?A<><;:;:9;?=;;==AACABCAXqqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<=:;;<;=?CB@g
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHECEDFEAFEFDFFD@B>=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>???<@>A@EBN~
WGLLMKNJIKHIJJIECDFGFDCEFDBHIKHGGFHGEKIKIKKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97<>;<;>@?A>A@DDHCj
PMPMKNKJLIIJHKGEGHHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<;<=:?@>??BCFELW~
qMQOMLLKLJIHFJJEJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnquvwy{xyzz||}~~~~}~}~~~~~TDAABGHB?8?@8:;8<=;=A=>@BDFGQo
^RRPMNMKJGFCGJGLJGKOLKJJMMLOPNHIKLOQQPQOOJIJJLJLFGHGFGIFEEB@BB\prwxyzyyyzz{|~~~~~}}}}~~~~UECEEGGED;?A;=<9?==@BGF@EGEJQw|WVRRTROLKJEEFKONOWVQPOQSRNSTOMSLPSUWRSRPLKMMMKNGGJFFHJDDEEBDCcquyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B>BBFVMDKLINRz
gVVkaERQQPJ;;QSR`u]UVTVYYSYXRZfPUWZ]RTWQPNRPPPQKLKGHIHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??A@EBCFEDELXRLRRPSUz
}al[dU:XXXSP?@VUY\d`VYbr^]W]ZVEQYZ\Y_TYgRUVXTTVSOOMJLJIILMKOMSotvxyxwzzz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HMIMPKIKPTSRVXVXWw
g;~znpXZ[ZRSRWVTZZuYU}a\X]^WIV]][[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxyxz{{|}}}~}~}}}~~xy}YNKIIIFBD@A:PQQWXPPOQSTSVWWWYm
n~fYY\YSVTWRQWVcQerXZW_hP`fZ[X\hbGOZig\[\]]WSNSPPQVVVVYZosuwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZ[RSQORRQURUSV_ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ\\^SPPPINOWVX[Zdqtvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^\VUSROKFCDAM^lVRSNOQOQVRSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRTQMOYQMNQSUUMQSRPNLLHCIHRSTZ]mrvvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YUQLILIaltPQSNQRQR[RSRQRUUbs{|}{{
u_]KC>CCCCB?DPCC@C>BHGV@INMG]iQHFOFDEFHGHBCHGHJGDBAC@OPMRdtuvustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQSQUYSUQQTROV`klsvz{xyurnstsyx~~kLG>>:;>@??>>kQKaEFHIEB?HMMGMQUJBE?><=<==?=?ACB??<=B>JMFUouuvstvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrjmlqu{z}zxz||xwxdB@@A=:BCAACB\]O{NOONKLMOOPLKLWNIG@B<977599=;;;8989?;AG>\tuuvuvwy|||}||}}~~|~}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRSVXSRYTNYZ[WY\__`e`]^qwk^`gkwooljonnlfbYGFFHBAFIEEFCMRPaWRXQPSSRU[OOQVPMICF>:96586979:365795<B=ftuvwwyy{}}||{|}}~~{~~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKTTSPQUOLRSTWXTTXQLWYYVXXVXY]WWXhsk]V`tkaa_]d`_^YUPMONLIGJKIHFCQPSZWTTNQSYS\eUOSTQNKIHC?A9988978847578598Gnruxxz{{}~}}|{}|~~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVXXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNNNLJFPPUYSTNJNOTST\VRUSSOMLIHHF??=:787659967665Wqqtwzz{|}~}~|}}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXXYYYRUOJGOPOOMRJOPPPNNOTLMIPPSTU2<XMIAQ=c`QSQPNPQPNNMPNTRPRLILKOQPQRSTQSOLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWUQSFEAFGGHFJDHJHGEHLHKIGLMPMG/E_R>3@>joaRRQ@FTQOPPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;==<9=G6676Dnquwz|{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8ENS]gSQSAGUPORQPMMNLJLKLNOOQMOOMHLKIKKLKGFFED<AA>;@E;<89Tqsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A>==A@B=>EHFDFFIGKJ@FAA@FHEJOHQRa\QPRNSOOPLLOMKMLMON[VKMQOGIHDIJLLKFFFD?CC>=BG?B>Adqtw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;>A@@>ADIECHGIGIEBB?><CBAGIDMOaePMONWKLNKLMMLLKNNSdNJLRIIIEAIJLMNKGIFBAB@?EFEHDLopwzzy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOGKE?B=999:?B?<ABBADDGKFDIIGGHCC?B??@A>DECKNQTKJIMTFIIJLJKKIJLMOPRPKGCLGCCJJLMONIJIGCCCDIJMLIZsmxyxz{{y|vrpurtyyvxjqnjllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHKCFHHGJKIJLDGB=>=:::;AB?=BBCCHFJLJEIIFGGCC;A@B>@@CECIMOGHKFHKDHIKMHJLHIJLJM]RIHDNGBEKKNMPNKMJKFGGJMNQNLcniwvv{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdpFKCFEGDEEFEGCC@=<=:;::@D@>BCEEIFJJLFIIGFFCB;BCC>@CCCEGLNHKNHDHEILNMGILGFFIILNKJHEOICGMMNMPNOOMLIHIOSQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGICEFEBBAE@DB>?>:;;=;=?CA?ACFGJGJILHGGGFEC?=EEB>ACCCEGHIGMPIFFGKNOKFHIFEDDIIHKIFHPKDJMLPNONOPNJJHMRUUROWdaamgprosyzgehhcilgqlflmgiklsmpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCA@AD<BA>A=::=?;>?@B?@BEGJFJGIGFFFEDCAAFFCBBBDEEGGHFLPLIOJJLKIFHEFEDCIHHKJGKRMCOONQPOONOOKKKPUWVUTY`_]iaminhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsprkksMFGEGAB@CD<AA@C<89=>:?=?B?@@DFHEHFFHFEECCDBDIFCGEAEGEFFGEJMKHQMJKHHIEFHHECIIJKMKPSNDRSQQRNONNPMLNSWVWXVX^[]d`hbjigk_defcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBEE<@CBD<7:=>;>:@B>??CEFDFDDGECECDEFFJEEIGBGHFGFECFJJGMKLKHJKFIHJHEKKLLNORTOITUTQTPQMNQNMQWZVZYWZ^[Xa```_hec`deggjhhjfhnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGIDBCHE<@EBD<8:>><<=BB<?>ABFCEBBHCCDEFFGGIFGKHCIHGIGFDHKIGKIMKJKLHLJMKINLNNORUVOLVVTQTRRLOQPOTYZY\ZZ\__^`c^\ackb`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIKHJEBEGE<@GDD@9<>@?>?CB<@>AAFCEDCHDFDFFHHFHGIKJEJHHKHFFLHHHJHMLLLLIMKMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[]^``a`be]d`fg`ehjcssfjhglprqossnswwpuvtsmoruorspurvrtwuuuwvuwsgtrkqrkrwowIJLIKGBEDE<@FDDB;??A@@@DA@B?ACHBEDFHEIEFEIHFIHJLHHJJIKJFJKHIJJGKKMMJJMLMNNOLOPRUWVNNTVUSRQPMNTSRW[^^_]^``aaa`cdebdicdijgvlkihmosqpqpprywruutsmmssmqrotutspswtuuwvuuueqskpqjrvpwJLLLMGCCAD<?EEEC=AACBBCEACDAAEGCGGGFEJFDGJGGJFILHIJMKMLGKIHKKNQKRQLSMKNMNPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da_`b_`fbacinicihhmxvmhimosrpqrrrvtsusssnksqmprotvrrquvuswywutucmtkopjqtpwLMLLLGEA@D>>DEFC?CAECDFCCEGCBHEBHIIHHKFDKJGHJHIKGJJNKNLILHJMKZfJd\KlRHOM_nUls[qpbwcRPbvuhucav`Xnqbdvinzf\lt`lkU_wvijhhfglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?=DEFDCCBEEDFBFFGDDKEEJLLJLMGGNJHJKGKJIKKNLMMLLILML[sbdp^llUMNes^gfqlntgpi_aYnmbppbkjjgoqtetno\pugqMKryvkbakeelxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvttbmukpplrrqzKLIIGED?AB?=BEGBFCEDEEDBHHGDEKHGKMMJMLFJNHJKJIKJJIJLMNMMMKNMM[roonpplkNPQlXMibtrpamov\YlP[mmZqmkomxxtsip\`slqjUuyxoc^kfbgppjiopprspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGHEEEBAB=?@EGBGDIEEDBFIHHEGKJGMMNKMNGLNIMKHJMIKIJJNONNMLNML\hdu]lqWlNOQnUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ghaditykonqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIEEDCAB<B@BFCGFKGECCHKHHFJLKFMKLRRLGMMHNJIHNHJJHHNONNLJMMJZsppoqqmlOQSoYskgooqqomt^nXat_nopoqroousttj[]tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtIKHJCEEE@@>CCAFCHIMHFCFJLIGFKMLFOJKWRKGKJJNIIJLIKJIHJLMMLIKKKSkbZi^_jcrrZ_Zko`eeUk_c[abQ`mh\j\niid[pfdp]Z\k[mqcpsldgcdg``knppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunvqrutwrIHFJDEDFA@AEDCGBHJLGFDGKLIEFJNKIOIL[QJFHHKMIHJJKKIHJGKKKKGHJJLLLKIKLNT[]TPUMQPNOOURPOQOOQJJNPQdqiTYW[[\UY[]X]\\cfaafbcf_^fkmhmtyrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusHCEGFFAEC?CGDEGCIKLHFDGKLHDGHPKLOKLWMIFEHIJHIKHLJIFHHJGGIEFKHIKNLIO\W^O\\`^OXYS\\b^MYZMXaRKYaZS`d]aX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMACDBDIEGGFKJKHEEJJJGEHHPJLMJMRIHEAHFJIKKILJIGEJHEFGEEJGBIMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^c_Z]`c_Y_b[`^[TYXZ_^dbbacfiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIDBBCFGEGGIJJIIDFKKKFFIINJNLHLNGHF>GGLIKKJKKIGEIEDDEBFJD?IKHN[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_aa]^ca`bbbcceZRXVV\[^c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFCGEBEGHFGHIFGJGHFHKILDDJJMMLLHJJHJG?GFNJKKMKKKIGHDD@DAHIA>HIFO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QQ]_accccb\dcbdcfXQVUS\X[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMB@IFCFKIFFGIGGJFFFILJNEDJJLNJLIKJHIGBHHQMKKOMKKIHHED?EBHHA@FEDT]Y^X_X_[]UXXP]]QKJW^X^[]VZaRR__bb``bb`cbbddbXORRS\S\^]^^__`dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHDRKFHHHDFKIMPEGIJKNLLILKIIGDHKQOMLPLLKKIIDEAECHFA@FEBVUE\T^SV`XNTUNZ[MJKU`a[_X_^b]OYb\``_bcb]bbW__TPOQRYS^\\]^_`bffelfoow|{{}
zo
~INFDFFGDIRcQDW_IGGHDFMJPPFJIJKNLLKMKJJGEINQQNOOMNMNHKADACDFDBADEALHCLLPOOMFMFFHJHGLLMOPILOPPSPLQSRUZYWYXXdVOSTPPONQUT\YY[^^aaefchdklqsszy{z~{}{
}KIEEGFGDKM^MGHYMGHJHGNLQQILJKKNMUNOKKLGGKOSSNPONOOOHKF`ED_LDfcDM[H^\smOMVmYLCP_UlWgJ]WU^DLQULMSVQRTXWTXUT\TPfZhhdYTkTXWU[\\``abbb`gignlhrz|}~}}zr{z{
~z{LIEFFHEEKOTJKG`TGJOJIOMRQKMKLORUROOJLMGHMQ[YOPPNOPPJKQQI|YYrsWPmHqnoaVPqqtOBksnqtpSo_[nX]V\XUkhU]VcY`YZ_VUWituu_av_Yb\\f[_aaab^`bgmpl`pwtx}~vxzmv~tx~|~|z~wwNIEHMMBDLLGJLFRVLLOHLRXWQNOOMQTNOQPKKNGMPS[ZTQROPPQKIZx]TxdhYRSPvgtlpbnfkRrNLwmjrpsrqrpop]fzuxqqzq~r}ku}bRg|essoss|}p~yor_``bb[a`hknkblfgmw~~{xwtvzhr~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHKQOMNJNW^YULQSNYYLSSRNLOIQRTYWWQTPPQSLHgxlcxqmZKLTypumubnvPdeIevqmwojfxxiWrRi{mijzz}lxzpgoXuujvupash}ilx|o___cb\_defijdgbcdllppstsssyqrxbltgry{ssuy~svzn|}yxrnNJRtNCBEPPIKLJLQOOOMPZ`ZXKTWPa^RVQYSMPJSTUXWWPUPONSJKrouuquqdhaVnLqp^GhyWvTKhx}x`y{sna^modSgrunmypwlvstqlm\s}zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsynqpj{ztromLKZVHGEGRPKLNKLQQPPPQW\YUNVYUfXRRY^TMNJTTVWYWOSOONQIRmHiwK`dvuUWlNnl{rajgvUKWkh}lmlx`[pz{_`zscroxqhd|ir{]TKl_vukiu{{m~xk|p]^^b[^bdegeeebZccikkrsrwgmihdg`alagsrkhmmr|kmhk{tmmkmOGJKHJHHRQMOPMLSSROSRWRVTPWZVVTTTa`QONKTSSQVVOOMNOQJHQNPULKKRSRRROVUQQORRXXQNPUTXXX[[USSW[WXWZPSUWWXQ]XV]USOXRVWWXZ`[gr^[\[]]_cZ_ccefdccbZccgffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilPIKKLMKJTRMRQPLVUTPTUXUZURZ]VUTWUYXPOLNWTPNUSNPNLQPKJQQKQMJKOQTRQQSRIIMNOQRQQQTVRXW\WSSQQUUVTZQNSQWUTYVTYUSRUSTUXYX^Z_a]\[Z]]`c\]bbdgeddaY`acabhhincad^_c]Zd\bma^ffgmsdihkkedcfhQJKKNOLMTQOTQQMXWUTVXWWZVT\`VWVYUXTQPKOXSPNUQNRNLSPMNUSNQNMNQSPTQSTTNLNOQTTRRQVWUYZ[YSURTXWWY[SOSTWUTYUVYTRRWUVX\Z[`]VY_]^]\]`a^[bbchfedbX``b]`hefda^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLOTPPTQOQZYXWYZZXYV]jdVXYZWVTTOKOVTPOTPPQNMQQORXSQQOMOSUNWQTTUONNQTUUTTRTXVZ]\ZVVQRWXV[\VPSUUUVYTWWTRRXVV[_[^`_V_]^`\\``__ZbbdhhedbYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROMPSRUZUSPPLPWUQVRSSXMOPQTXUUUSUYX[^]\[VROUVU[[VQSVUVXUSXZTSQYWW\_[`_`Vb\`a^`b_\`]cacgief`Zc`a__ee_`c[Z\[\ZZYYW\Y\[`^`[^^a`_c\Y`ZQNONVQPUSPUTSPW\\\Y^\_W\^jpwyc\[VVYRNOWSNQQPRTRLQTSY[WUORNSXUSRTRRZOQSSV[VVVTVZX]^\\^VSNTVV[[UQSTVXXRSY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgidg^\e`a`acd_b_YZ_[\[YXYWWZ[Za]][]\\Z]`W[[ZPOOOYPUUSRWRTPZ]^]\`\`U\]hjr}slh\UYWQOR[SRQTRTUTKRVUZZZSOSQUUUSNVRSZRTUTX]WXXSX\X^]YZ]UUNVVW^ZXQTTXXXSVY\TRV]Y]]a^cc_Y`[eb_dd^^cca^efief]^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POORZP[UUWVTTT^^`_^b\`U]^bkyum}lZUZVQQT\TTTUTVYWLRZV\Z\RPUSWUUSOWRSWSWUV[]X[YUZ^X_^Y\YRWRYXY_YYSUUZYYUWY\UTZ]\^`a`ed]^]]eabfd^_dc`\gdhfdb_da_a`bb_`^WY^Z\\ZYZWV]Z]^[Z[\[WY\]VXW]SOPWYP]UVYWWUX_`aa`c]`U]^beev{hXYZTVTV\XWWVVW]XOU\Y^]]TSXRWUSRSXRSVTXXX]^X][U^_X__X\VQYUYZZaX\UWWZZZXYZZWV]^_^cbbee]b\`fbefd_`dba[fchfcfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNSZWT\UVWYWV\`aacac__V[`da_zuohZ\ZVXVX[ZY[YXY`VOT][`a\UUYPTVTRVVRSUW[[\_^Z_\V__Z]^Y^VSYXYZ]bY^VWZ[[[[[YZXY__``dcdeebdZbfcgfe^ab`c^cciedg_g^bbcaa`^_XTZZZ[[X\XX\[Z[WWZXW\[\`]V]]SOVZVVZVYUXWX^`badada^YYadb`kfh^\][WWYZ\\\_[Y[bVSW^]ac\SVYPVUUUVVSUTX]]_``]a]W`^[^\[^XVXX[Z__[_XX\\]]^[Z\WZ_a^`eddfffbYcfehgd^c`_ec]fideh_g^cbcaa`__[XY[YZZXZXW[\Z[WXZTY]\Z`\U^bMRWYVWZY[\YWY^`baeada]^Yacb_a`a_\\]XW[[]]__\Z]cXYX]_cd_RYYPWVWXWWVWV]]^aba_b^Ya]]^Y]^YXUW[[`^\_YY]]^^`\ZZY[_b_bedefggbZdfgigc_c^`feZiicficf_bbca``_]]ZX[YYXXZYWZ[ZYWXVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\\]XW[]_]`_][`d\\XZbecaR\YOXVYZYYWZZ`^abc`ac_\b]_][_^YYTX]]__^_[Z^^`bb\\W[]`bbcedgfegd\efhifcab\cg`\iichife`baca_`_]]\Y\YXWXYYW\[ZWWXPXZ]acffrkJYW][Z_]\^\Y][^_bcbaa]b[bda_cbb]\[[XXjq`\`_]\ac_^YYcedbT_ZQYW\]\[Z[[c`ccc`bda`c^`\^__ZXV[_]\aa_][`abeb^\S\_`cddfegfefe_ffhhgdd`[fg^ahhbhhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{{{{{zzzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{|{{{{|{zz{zzzzzzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½sqrrrqo©Á¾¾¾¾¾ÊÓÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊroooool²ÐÌÌÌÌÌÛæååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyzyzxooooppprrrrrrrwzyyzzz~|||||||zzzzyyy
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwuvwz{x{xwvvxxyyy}yxxyxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{{{{zyyyyyzzzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwww|{{|{}{wwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwy~||}}~|wxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|yww{~}}|}~|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx{|||{~{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyywxzzzy|xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegefgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~
~
}}}~
~}~}
~~~~~
~
~
~{z
~|}}}~|{|
~}~~~~~~}|~}}}
}|}~~~}|}}|z|
~}}}~~}|}}zzz~~
~~~~~}}~}~~}}}}~}|zzz~~}~}}~
|}}~}~~}~}~}}~~~}}}|{{{zzzz~~~~}~~~~}~~}|~~~~~
~|~~~~~~~~}~~~}}}}{{|zzyyy{~}~~~|~~~~}|~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zzyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}|{zyyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
}}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~
}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}{z{{{
~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{}|zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~~~~||||||{~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}~|}|}|}}~|~}}}}|{{{|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv~
~~~~~}~~~|~~|}}|~~~~}|}}|}}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz}}yxut
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyvtz
~}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~|}}~}~~}|~~~~}}z{{||}}|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}}x~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}||}~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqxyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~~}}|~~~~}|~~~|}~}~~~
~}|{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzzzzxswuqqrpxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~~}~zz|}|{}y{zzxyxy|||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~}~~}}~|||~{{~yz{z{~wwy||{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyxstunsqpxruz
~}~~}~~~}~}{~~{|}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}|||wxuxxy{||}{||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}xwvyyz|}}||{||}}~~~}~|~}}~|w{zz{yytqunwpuzqvy
~}~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{zz{ztpxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~z{{zzzupxwyvu|uv|
}
{~~}y|zzz}}|}z||}}|z{~~~}}||}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}}}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~||}}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uy~
}y|~{
~~~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}~}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~~}}|}~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~|~}}~}|}||~~|}}||}|||~z{{}~
{{~}|||}}|||}}|}|~}|}}|||}}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}~{
~~|}}}~~~}}}}{|{zyzzyzz|yzz{{{|z{{{{}~}}}}||}}|
~}~~
~}}~~~{||}}}}~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}|~~|~~|~||~}|~}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÕÔÕÔÔÔÔÕÔÔÔÔÔÕÕÔÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××רÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÛÜÛÛÛÛÜÛÛÛÛÛÜÚÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹³xssssssssssssszÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::87>C?8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¥2)+++++++++++)5ECCCDCCCDCCC?\ÓÓÒÒÒÒÒÒÒÒÒÒÒÑàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;@C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦8/00000000000/;IHHHHHHHHHHHC`ÒÓÒÒÒÒÒÒÒÒÒÒÒÑßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;?@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©« E=>>>>>>>>>>>=HUTTTTUTTTTUUQjÒÓÒÒÒÒÒÒÒÒÒÒÒÒßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB?;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÏÏÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÊÊÊÊÊÊÊÊÉÉÉÉÉÉÊËËËËËËËËËËËÌÌÌÓÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÎÏÑÎÎÐÒÎÏÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖØ×××××ר×Ö××××Ö××××××××××רØ×ÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÎÑÁ§ÑѸ ÐÑÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏÏÏÑijºº¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D?A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÏÓº¯ª¼£¨²Ñ}~¯°ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÏÓ±¿Ç´ÕÓÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÑÀ½Ú£µÔÓÀ ÐÏÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÔ£¢Àס´ÓÓ¯¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÑÄ{«Ø¡´ÓÓ£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÕ«¯¼ÀÏÓ¡µÔÍÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:96:;::;8@?:<<9<>=;;:?9?:;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ
¤Ù¢µ×à ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÆÓÓտס³Ù²¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÒÑÒרËÖ±ÅÖ¹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÒÏÅÔÑÐÃÔÑÒÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÓÔÒÒÒÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEK>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiihxsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptyvt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®wpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@BD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_^]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¦¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocnihb^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·®©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´µ¶¼½¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎÌËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABB@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrwsxfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAACB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÉÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijh]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬§ª»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËËÇÆÌÉÍÅÆÆÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlietnsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÆÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»º½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegdjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÂÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfcZYY\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹½ºº´¿¸µ¸³¯»¼·À·½Â¿Á»¿Á¼»Å¾»ÁÄÀ¾¾¹¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾ºµ·³¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjffiei]VUSYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=96<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»À¿·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekgXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<97>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···µº¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8=<7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·¿¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸®µµ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcgb\cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼«ª£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊĵºÀÃÈ¿¿µ¿À¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^aaNHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍÊÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶º½Á¼»¿¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼¿ÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²²¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^\YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÂû¹³´ºÁ½¿ÆÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni\_`YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀ÷·°µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§¬¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_e\ZUJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<:;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁù·³²²´²¸¾¹³µ²¼¹¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvrl^b`[]OHA>=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÄû»¶´´°¶ºµ´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ournc\fX\]RNMA>IB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³±¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÊȾÀ¸¸¶²´¶²´¯»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶¯ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFMF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹½µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±ºÃ¼ÂÊÅ¿»¾¿¹´´³°±°¹¸¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;=<<;:@=<<;?>B@A?>958;<FBCD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²²ºº··µµ¼³¯´«¶º¸ÀÄÁº»¿½·²³°¯¬®¶¶²´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥££¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGOMLBOQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;?@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬ª¨µ²±°®¯²§¦°¤¯®µÁºµ¹Õǵ³´«²´®ª«¯°²³®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRNJNG;E@=2?759;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@CAD>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¦©¤©¤¥®¥¬¬´¼·¬¹Ù³»µ¯¯³µª§¬£ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxy`bRU_HIIKSTIRPL9?B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥¦¤¡¢¦ ¢¯«¬µ²·¦µÔÁ·²±±°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´©±¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNNULRLA7>B68=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¡£ ¢ ¢¯¯¬°±ª¨ª²É¦È°®¬°§ ¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸¬±´¤ ¥¬¡¡¢ ¤¡ ¤¡¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HQUHFUVJBLG=KH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¢ ¡¤®©¬£
{±µ¯¨ª¬ª¥ ¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§¦ §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·£°¦££¦Î£¥ vsbhk}¡³®®©«§ ¡¢
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã¼·³©³ª³´¯³®ª®£«§¶±¬¢¯¦¡£¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{trkkurphW[QETHDIOH>EA4EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<<;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥¡ ¢°Ñ«bqlb]`x ±¯§¤¤£ ¥«¦ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÉÉÂÀž¹´¹º´»·°µ²ªº±®»·¾ººª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zrkdhoxjeZ[FKLEDSLDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ ºÎ¢nc_W°ª¡wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÌÓÐÓÓÌÊÂÅÆÇÊÇοÈÑÌÇÅÆÄÁ»ÃÀ¾¾¾µ½³¿¿ÂÂÆÄÇÄ®¾¸²¸¼ÄÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª££¬®¦¥±ªÅÆÌÎÍ¿°Á¨¥¨¬ª¡£©ÆÂk\j[Tq°³¤ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÒ×Ñ×ÒÔÖÓÓÈÌÇÍÍÉÒÌÎÓÌÅÇÉÊÁÅËÆÈÈž²³ÈÄËÊÊÎÅÊ¿¾¿½ÁÇÄÌÌÈɿÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤¬Ï´Z\}k®®¥¡¥¡}wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÒÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÑÉÒÕÖÙÕ×ÓÖØÎÒÊÏÑÌÎÐÌÒÏ¿ÇÆÊÃÌÌËÎÏÅÆÇ¶ÀÊ¿ÑÌËÏÅÉÇ¿ÃÂÈÎÌÏÐÏÍÊÈθ·»¨¥«§£ª¥©¨¨|xsvpc`erb]R\IJGAEHI>;@8=4585;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÂű¶¨¢¥¦¡¢«µ¥¥Ò¨jZu£ ¡¢wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÐÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÇÐØ×ØÑØÒ×ÙÕÖÌÏÏÉÍÑËÎÏ¿ÅÂÇÅÎÍÑÐÑÈËÌÀÊËÅÓÎËÎÈÄÉÆÆÈÌÊÓÓÑÕÏÒÌÒÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
|zqstmacim_VP_JJCFCQM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯®ªª«¦®¸¨«·×ÔÕÙÙÑÎÐÀ¼ÌÉ·¿¯§«©£¤±µ±¯Í¡Zd«¢¡~recb__a`_a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÆÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÍÃÈÎÌÊ˿ɿÇÈÍÎÏËÐÍÎËÎÎÇÊÏÐÊÎÊÂÉÆÉÌÊËÑÒÌÓÑÑÏÐʽȹ°®»¸µª¶°¨¸³¿»±
zvopokadnpaW\ZIFFDMWE;@<33<=87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6==?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¥®¾´°ÀØÒ×ÚÜÖÏÍËÄÓÐÂÁ±ª®«¥²±¶¾ÌZ¢k^^^adb``aa``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÕÊÀÊÁÅÌÂÈÉÂÌÃÅÇÊÊÎÊÍÌÐÍÓËÅÈÏÌÈÇÊÄÆÀÅÊËÍÏÑÆÐÎÍÍÌÏÅÇÀ·¸½Ãýù³²¾±»Ãĵª¥¢
xpqkmg``qhXXhVLFLIPPB;D>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;776?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±Ç¸ËÕÖÙÚÛØÌÍÏÈÖÕÅ÷±µª£¬¸·ÉÍ|fbbb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÏÎÌÔÊÇËÎÏÇÇÏÒËÐÏźľÆÉ½ÂÇÉÎÄÁÇÀÇÍÇÃËÊËÏÇÃÃÐÈÆÁÅÇľÀÇËËËÎÂÊËÈÇÌÐÄÅÇ»ÇÃÈÈÂÏÁ½¼¿°ÁÉǹ½ª°²§¥¢£wntdk`^fqa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ½ºÍÍÇÐÕÕÙÚÛØÐÊÏÐÒÔÉĹ½¾¯§·ª½¹ÎÉ¡~
t`\^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÈÆÂÃÀÃÇÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÁÂËÐÄËÈ¿¹Á»Åǽ¿ÆÏËÃ¿Ã»ÉÆÈ»ÈÆÄÊÀ½ÁËÆÅľż¼¿ÃÄËÅļÀÉÂÅÇÒÄÀÈ¿ÊÉÆÇÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {vstfiZanmZ[XRDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ËÏÑÌÇÂÃÇÍÏÏÌÕÐÖÙØÙÐÌÓÎÏÐÊ÷ÆÀµµ»°¿¶Ò³z
vxurq_Z[]``bddded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ°¶º²²³²±Â¼¼¼º¸ÀÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅþ¼ÁÍÃÆ¾¾µÁ½Ãº¼Æ»Â¹³¼ÅÄÁ¶¿µµ½¿ºËüµºÈº¿½ËÃÁÅÂÅÈÆÈÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½²·°²§¨¨¹°¥°«¬yvwjdg`hocV^YJFJFHJAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÃÄÈÎÒËÊÊÇÍÎÏÒÉÑÆÖÔÖØÎÌÐÇÌÈÊĽÉÁ±´¹¶¹´»
y~|tud\\]^``bcabeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸´·´²³´ºµ¾±·°µ¯²»Â¼Áļ¿ºµ³º¾À¸Ç¹´»¶À¼¸½ÆÁûµ®²¶º¾´Ä·»µ«¸½½¿½°º¶¯¶º²Å¼¶®»¿´¶´Å½¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÈË¿ÏÊÇÃÆÂöý½¶¹¾Ç¿¬µºµ·¶xtxfgebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÌÎÈËÉËÊËÅÑÎÓÐÏÇÉÅÉÄÿ¼Ï¼²·»¸µ´{y~wx}th^]]]_`_`da^dec__\[^\]^Z[[]_lpmhfjmnr|¤Ç¿¸¸µ°«¬§¢ª§«¬³©«©´¶°²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°¿±½¼»¶¼Ç¹Â¶ª¨°±¿µ·¼¯°§±³´»¼«µ¥®¶®º±°ª¸°»®»¸»¿¿½¹Â¿ÇÃÅÁ¼ÆÁÈ˸ÅÇÅ¿ÆÃÃ¹ÄÆÂ»ÆÉÌ˳¹Â¼º²rvvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÎÒÌÃÆÂÅÐÇÎÂÄÇÀÆÆÄÄËÂÊËÁÃÀÆ¿¸ººÉ¶³¹º³±©|y~z{
wo^]\]]_`^_dcbccb`_][[ZZ]ZZZZ\dnohfgiknr¹°µ®¦¥§§ ¤ ¥«®£§¢«ª¬ª°¤¦ªµ¶±½¹¯·¯¨®·´´¼¸´¼¯¸¹´±¼Á±À®¥¨¢«±²³§¼ª«¨«¬´³¥¨¡¤®©²¥§¨¥¨·¬°²·¹º»±»½¾¾Ä¿µÁÀÇÈ·¿ÀÄ·Ä¿»¿Ä¾ÄÈÌÊ¿¾ÃÀÀ©rtrji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÅÑÐÍÄȺºÌÂÌÀ¼Ê¸¿ÅÀ»Ë¹ÂÅĸ»Á»·µ»Ã¶³µ¶©|~~xt|swf_]\]^_`^_ccab``_^]\ZXZ[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥¤¡£ª£¢¥¥§¥¬¤¦¬²¯¶·§°¬§ª´ª´º±¶µ¶¹±¯º¹±·¤£¦±§«¨¹ª¤§¨¨§² §¦¤¥¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹¹Â³À½¿µ¸»½¾¼ÂÇÄÂÿ¿Ä wpkaf_ko`UY^HNgOTGEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676778666;::;9;;<859<:>>@;ȵµ½¸ºÀº½µ ¡¦º¶«³³»³ÄÐÉËÃǹ¸ÉÂÍÀ¹Ë¹¼Ç»µÇºµÂı»Ã¹³¶½¸¬¯±©}zvtomkjjqi^`]\\\^`_acb````]\[\\XYXXXVX[^_dcbegggjmo© ¡¢¡¢¦£¥¡§¢ª°±µ¢©ª©««¤´¹·°¬²µ®²µ®°ª£¢²¤¦©¸¢¦¦¨¬ª ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«³³¹³½´¶±±µ´¿¶½À½ÃÁº»½zrk_e^ddXTX]IW\KPGIIFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÈÉÁǼ¼ÅÄÏ¿»ÉººÁº´Ä·³¾¿±¿Á¹ª¦±¶³¤¬£ysnpnkb^bff]]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bddeffhikr¨¡¡¢¨¥¦¡¥ ®®² ¥¢«¦¡´°±±¬¨¯²§º³¦¶¡¢£¡£¡©µª¢£¦¥¦£¬¡«¦£¤¦«³³ª´°²ª²¹´¯©¯²²³·³®©¬®²¸°º¶¹½¿·²±
yue^e^[YVSZUK[QLIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿³¥£¥±Âµ¶½´¸ÂÍÈÇÁƸÂÁÈÏ¸ÂÆ¿µ¼¼µÁ¹µ¼¾³¸¼·¦£¶£«¨}
yprtqifdhec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXXXXVWadecdeddhjv¢¡¡¡¨£©ª¦¯°«££·ª ®¨¶©¦§°£·°¤·¢ª¦¡¬¸°¢¡¤¢ ¡©©£¡£ªª°®¨´«ª¦²°¥ª®²±°°®¯¦§§²®±´¯¼´º·®£yud^aVYWSRTKM^LPKGGLLE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§£ª»À½À¹®´¸ÂÍÉÆÃľǹÉÍ´ÃÄ𾾸¾¿¸½½··¹³¤£·¡¢}yrjmrtphhedgb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWV[ccbbcbcdfj ¦¥¤¦§¥ª¯¦¢£¶¨ ¡¢¨´¡¥§¤¯¥°¬µ ©¡¢¬±±¢£¡¦¦¡¢£¥¥«¤¥°§¥£««¦¨®¯®«¨ª©³¥¦«¯´±®¼µ±¯¯ zvrda\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»±·¬¤§·»¼Áź±¹µÅÊËÁÄÇÇÈ·ÇÅ´ÄÁÈ®¹ºÀºÀ¾¿»¹´¶²¢£±wodbgihfhjgjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTWVSTRU``_`a_`acdi£ ¥¡¥¤£¢£¡ª«¥¥±© ¥«§¡¬©¨®¢¡¢£ª¨°¢¡¢¤ ¡ ¡¤¦£«¥¢¤ª¤«®¥²©¦¥¦¦´¦©¨³µ´¹º¯ª¬rpo`[WVVRGQOHZ\ORITKSLEGIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698698989;9@9{µ´´»²¯«±§§¯¹¹³ÀȺµÀ¯ÆÉÍ»ÂËÍÈ·Ë¿³ÀÆË¯´»Å¹¿ÅÁº»³¶± ¦«©|ujjjlhjlmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^^^__bdm¢ §¨ª¨ª¦¨¥£¤®¤¥¯© ¯ª³¥¦££¡©ª¡ ¡ £¢ ¢ ¢¨£¢¨« «¯¤®·¥£¤¢¬ª¨«®²·²½µ³«¯ssh[XXRUREXLQ[YMUNPLPQINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³®¨³¶®©§¯©¨¬·¶¬¼Ê»¶¿¬ÌÇÆ¹ÂÏÐȵƽ¹¾Å˳¯»ÃºÀÂÀº¾¯´«¡¥©¦wxoninnnphgigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]\\^_`d~¢ ª©¦®ª§¯£§¬ ¤¨§®§ª¥¡§«¥ £ ¢¥¥§¨¨ ±°¦±¼§ £¬´ª®§°´°¹µÀ±±«}qrbVTVNRIGVQRRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661321-*.102877;99;8948;8@8³¦±·ª¦¢°«ª§©²±¤¶Æ´¹º³Ëƺ»ÂËÑ̳¸º¾ÀÄÆ´²µ»°¸¹Áº½¯©¬¨ª¥kgmnroqkpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv¨©¥¤ª§ ¥¢
£¢¢¤§¡¢¢¥¤¦¨¦¡ ´²§³·¡¢·¬©¤²²¦µ»µ««±£xql]NQQLOCMNNPKFNNJJNMQIMJAGKHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301*)-/12776:999984988A7w¶§¤¶°¤§£©¥ ©¥¤³ª¢²Ãµµ²³ÇƸ»ÄÊÍǵ¯»¿·ºÃ²±¬´¡ª²À¶·©¦§¯©ªy_`gsqvqjniehhj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXYX[]aosvq
¢¡£¤¡s}
{¢~~tz¢£ ¡££¢´¯¬¯¬¥¸¦¥°¡°®°»ª©¯ªvrbUMROPMCSNLQMBPQHINSMHJJCJLFKK<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-11764789::65:87A7x·¢£´¨¥¦¨£¦¥¦¦¦³§¥´Á¸¯´°ÊŸºÁÏÆ¿´®¼Ã®°Æ°«¥ª¡«¼´¬«£¨§¥oWW`hgihincjigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo{
syz
}xro
~¡ §¯©¨¨³¢¦¬«§´¢©£}rm_[NSRVLDTJPMLFNOIFLQMKOJIMPFII<7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//((++-3854779<:79;86A9y· £¡¦¦ª §©§¢©°¨§´Á¹°µ°Èø´¾ÏÀº°°·ÄªÈ¬¥
·ª££¡ fQMRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`mpi{tPBA}
x`JQnx}
n~wuuwpQ|~xvhw
~¤£¨©¥¤°ª¡¤¤¥ª¡©¢¦¨tle^[HQQRMIUMSILKOIHGJNLMTKQQOFHC<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')**,4833979:99::::?9w¶¢§¡®¡§¨¥§¨¯ª¶¼¶¸·³Â¼·¨ºÉ¹¶¨©¶·¬´¿© ®
bMLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut|
{uxsnupty}ª
yzhv{prmxxz{vsrwgu{{© ©¥§¤ ¤rg`\\JVORGKXROJMMRJJJMPHLQLRTMEHA<77;99>=:;<98@?::>=7==79947795675252572/2.,//200/-+(().1372198798775:<;7v®£¡´©¯©¥¬°±ª½´²»¸¶»µ² ·»³«ªª³°£¡
}bKIIHGFHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQRSV^u}ygw}gyvx|r|v{ok~|s{}tfv|lohs|lyq}pmuqhq~pC
wwz
}zu~£¢¥vnlebZWWTQJSUTOPNQVKNKNOJQNHNOKFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«§©±¯±«¼¸¬»¾¹³¨±§¦ª¥¢}}yx~{{|bKFGFA@CDILLMQRPQSUTTUVWWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{xn|yy|
omxsxjjr}Inhx~licly
ksl|nr{hmps
z}~{vots
ywp|~mhmnnWUWTRQYORUUSXUMNHNJMNKCHNGE@:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,4567485HA895w¥°¢¬ª¨µ¯®¬´¿«¼Â¿¦¢¥
¢¢u}zv|r{vrvydOEGD@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZRY\`§bitze~pmzvtlts{jkMy
g1vsl~~tfet~
filukp|gpp{n{s}|qpnum~wytiyyvjjngdWQZWYY[MPUVYYNIHEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226,+5775478iO8;5n¤¨®²¦º®«²°Â±»ÃÇz
sw~uvtvumwqgUFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯³ q|xm}lr
zyr txsu5q¨¡¡¢vp||shfbinrmpuioXupvl{}mqmpzsvmbv
ux~~zqpok^Z\][YX`_SN[ZYXLHJEJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µ©±®Á²»ÁÆ}nv
nyz{q{s|jn^JPG>@7448;;<=>@BEILLLMNPQSUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|}
~v¢y~
aªzv~s{\dqtz{wlgiayo
znwtzptywkni]w}|
}q|uw{}uorsef_[Z]S[f^WQUX\VGJJDKG?F@DC>AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk~yt¢s|kylSWL@E211267688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z|~v¡¥¬©H®¯¯¨sl|}hfgx~n
q
Gkwryvhmk_v}
z{uv|wmow~rrqjZ\\[ccXge\UPPWYPDLKFNICFCCA@CA=988:::;;:888::?>6;>7585773344236756768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^
t|~
¬¡¦¸¯³½³}tp}}¥yuy_cVKB60./23123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?94.]ps£UFIKMNPW`YpZ\^j
~
¡¡¥»±§»Çè¡¥{r~v
ihotqw{v
}nvug¡«¢{zzogkx}x|qic]ZY]i\af_ZOLNXRQIPKDNGCKDCADDA<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupgx{¤¡¬¦«¯°¡xw}lpj]CA4--//./02234779;=?BDHJOQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¡
lpuvql
r¡¥µ©¢~kjk|~~q_\b^Yfj\lk^XKHOSQNMLFIPCDNFBCEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<unhYppuqv~§ ªge¤~
z}
xxgMR>/..,/.-/000212457;?CFNPRTPQRSQNPIED>;<:CF?><852<?R5HHHLLMNR^o|s} ¨¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢wz~¡{v«³ }¤¢¦¶°¨lss{}zof^[_^`fc`gg\REKKPOIJLFFMCGMFFCBGDA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Pqu`n}bw}|ªªBD}x{
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=GGAA@8662<9;FHGIIMOQYmw£§ªµ½¸¥®¬¬§¨´¬±·²²»±³¾³Ä¬»É˸Ŀ¸¥£°²¬ª£
¦¦ ¢¦¢ª¨¤
£ ª ¤©±£§·» £°££¤¢«¯³µ¢¥ªz{~|e_f[d`]bc^ff_[ODJHTOFHLFKHEFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicXjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1/-4?DAMUQRTUUWUM[PGGD<>>FHCD@7;<5C;=FKIGHROPW ®£³ª²ÁÈÄ«³Å¶¬³À³¸¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´°±§¯ª¤v¤¡«±³©¨®µ»²º¬¯µ¢±¬±µ¼·µ®µ §§£¨©°²º¸¸§·©¥ ysW`bTe``b__e_[TJDELVQIJJDJHEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL[ZQcdWzuq}
v{¿»£¼´y
zyn]V@EN<6:46AB764//6CHCQ[OQUWU\WO_UIKJA@?GKFEC;>@7D7?BJJEGWTP^¥£±´Ã¶¸ÁÌʶ»Ä½³´Á·¸Âµ¿°·t±´¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥±¥«§¤ ¬³º¢¨²¹µ»¾Ì¿Å޽³Â·º¸¿·º·¹±¦±ª¾°½»Â¬»¨ª~yiVa_WicidU[cYVTIHGLQGDIJAHD>?BBK@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FQLALRWTZVZwjp
nzsxb¸¡£{z|}}xzueO\dGEL:Qda[^SF>;HPDZdQQYXZgZT`aMSOEA?IJHEFA@C=E6B>HGKMSZT^¯¸µº¹ÉÀ»½ÊÌ»½À»·µ¼¼·¾µº²Æ`u²¥±«¾ª¥¨«ª¤¢²µ «¨®¥§¦¥¤¢§°³¨²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÃÀ¾½¿»¼·´°¹··ÃºÆ¾Ãɰºª¢¬¥¨¶}p^``\V`]geRXaVRVIEFNK@>HD=KB=B@=F>;H@796379>489:57045/26389373526?8@>GKRTTRPOQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]gmlq
slsrsÕÀµ }x{{yt}zlepvY]\Peeb`ed][XW\MdmURmn_o_XgeUYTJDAKKHFHHHHBI9D?HKTTV]Z\¹À¹½·ÆÀ»¹ÊË»·º¶¸¹³¸µµ®¶¶du©p^¢¡¢¤«¥¨¥¤¬¤ª°·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊ¿ÉÏ´¤»±µ°¬¹½~xj\_[X]`XabQ[`SQKCBEFE<@F>BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi`onlotu³¬¡¡
|s{
{ts{ylmu|iseilifjji`fihmZmt¤¼g[oh]ZYTHJNPJKQLTQHLAJGKP__bgjb·Ç°¹³»¾¶±ÄǶ°¹±°»¬³±§«·¬¶§§N §¥¡¦¬¯¨¯§³³ÓÔÔÖÑËÏÓÔÎÓÏÌÆÃÊпÊÉËÉÒÈÍÍÃÑÒ¸¯Ä¼Äº¦·»Ä¢mb[[\X_WXdYO\WNQCBIECI;AD>AH??B8;D>@I=46655;:687654/10146278875367C5B8?-0,1349=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshqoyy ª¦}
|p{r~qyulpxr{nxslipmcimpyiw}~Ë¿Âß§mcxod[a`JPRUNY^P]]NPNTQUT\nnwr®¸¬´¨°¶«½Á±«µ¦¥¹§¬®¡¬´¤±®§«¬¤§¡¬¬ÎÒÕÑÍÌÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓÖÍÒÑÅÒÖÆÁÏÈÈ鿸Ðwmd[`\U^Q]ZOOTPNH>AGBCF<AB?FE>@?:===<JA45465<888664412/03526768533;=<E=@11+/359?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwmwp}~¡¡
y
{r~z
v
pwsls||w|sxqkrrioqzys{¾Ë~±vr
whaj]CZZ[WfdXekTX]]`c^cx{ª¤¤¢ ¡¨§ª±¹«¦´£¢®¢¤®¢§±¦k¢~
§°¢ ¤¤¨ÇÍÏÇÁËÐÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÉÔÚÍÊØÖÑÊÄÃÌqna^]WRXR[OJGJIJ@;:;ECD<CD>HC?CB;;9<9GC46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu~isyr
x~xs{}w{oxpmuvx}t|ylvun}vuy{µ<AÆ¥~|jeWICecfchjdoy[_fhknin ¤¤¦²¤¥³ ¢¥¡© ¢±~
z~ª£}«³§§½ÃʶÅÍÑÐÑÏËÒËÉÔÏÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÍ´utmc[WQTPXUEFJIEE=:7:@AB:GE@EDBDA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopbqqs|~
}y
zyqz{uzzp}opzr{qnzuw}|u|°tYªÂ·pnc=^hrpqpnxweioruxr{ ª¡¢¦¬
}
~my{®ª¦®µ¼¨½ÆËÈÉËËÏÈÃÑÊÔ֨ר×ÕÛ×ÓÙÛÖÏÛÚÑÖÈÕÌvxgfYXORS\GBEII>A>=8:=?;>H=@BAADA>?:87DB755479.566435532323647553457EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqy~
|}~wyn{{tz¡vvtu}toou|
zv|¸Æ¥ÃʸxpeNeczw¢yyw{|vm¦ £«
{|¡¼¡¨¦¥§µ¾À¿¸ÇÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÜÆ
xwegc^SVVTLKDMD;==<9:<>9>A7>?@=@><9867CA6455=80665547745613854564557HH=DJE7925;H>;::7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa][htzylwvz|~}
{~
z
{u}um}}~t|}x~yot}
|~{©Ã ½¤~}rs¦
{iGq¡¤
¡~¦
¤¸¢§ £®¶º´«¿ÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û·wvuihdU_ZRONHCLC==>99;:99<=6@>>==9::;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^UXfmmmiqsx{{}|{}{~uzsztm~}w¡n©
z |~£¢¤¯ Wr¬\¢£¢
¤
³¡¡§±¸¬¤¼ÁÇÍÇÆÏÌÏÌÏ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÙmzree[[VRUVC@ID??>:49:;7:;:3<<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:<@;BQKKSYPTcbxlb~omwxz{}|{v
sp
{uwvt
}¦¢¦¢§r²§
£ ¢©° n·ÄȲ¢¥²d¤ÍÈ
ª¤£
¥©¡¢²´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎp|e`[\\MISXABGD;A>837;<:8=64::<:72?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcGv}|m~xz~{vv|mnz|xx|~£³§£ª³¢§¥¤®¢¸³¡¡¥°£¤§¨¬¯¤¡À£É¹«£¦²
¨¢
u²¤¡} ±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ¦ÎÍÓÒÑÖØÓÐØºpwsZ^S^TOHIMEBCD5>:77:?<<7=43669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGN[\YJf`;Hzzn
z|y~px|~}orz~|x§»¬¨²½¯¥³³¨£¡°¬µ¢¸¥¤©¸§¥£©©£¯°ª »»®Ê¡j¶¸«°£¬½£^ª²|}´«¡¡ ¥¯¨¡¥³¸«ÂÈĵº½»ÅÇÇÂÑ ÆÉÍÍÄ×ÖÑËÓ nxfZXQ\PNEC><CAB8?885?G=<6<35345454B39:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdGb`bpJ?~s}um|}}pww{ªÂÀ¯½Æ»³´À¼´«³¶¨³½«»¤¨¹¸«§¦¢¢¤¢©¯²±«¤¢¦¥¤º¯©À¼²¹¥¥¨~¼°z¨±¬ ¤¬¡¡§¦¤¢¤°³§ÁÆÃ¯°º¶ÅÄ¿ͦÇÄÇüÖÑÍÄÊrp_YW]YLJAK@FG>A?B;:5>A==5<6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GD?CF\eG`igZ]\{uo~{q~{z§³ÆÉ¿ÂÌÂùǼ»¯«¹»³·º²À®¥Á¤«°¼½«®«££§«®´°ª ª¡°µ§£º»¶Á¼¬©²¥¤©
©Ääz¢¦ ®ª¡ ² ¤ ¥£¦¦¤¯®¥ÀÄµÉ¾¶Ï²Ä¿Ä¼³ÑÉÈ´rvjYVYhPLHBLKKJAA=CD<5AD;;3=8B332262A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeYNe\fTcjyr|xz¡¨º½ÇÈÉÁÒÉÊÂͽ³¼¾¨º¿½»Ã·¬Â©¬³¼¾ª°ª¤¥¤¬®³¶µ ¯¥¢£³½©¨½Á¤¶·°¬±¬©§¥¥vz
££ª¥|£¡µ¥¥£¢¥¦¤£©§¢²¬¨¼Àᥲ·Ì¿¹¯Ä³»¾Â¸ÂÃÂÀjw`VUZYIJLIFDDHCBADL:4DH9;4<7E.12352B25SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddV x
¡®¦¤Â½ÇÃÇÅÓÍÎÍ˼·°¹¼´½Ë¼ÃÁ¶·¼³Àº¼®¯¨ ©¨¶®©²·¢§¡«·¸ª¥°¿Å±½¹´¨ªµ´®¯¥¬¨ ²Å§}}ª¥¡£¢Z¥e£³¥¡¬¬©§¦ ¤¨¥¶«ªº»Ã´¥³µËÀ¸ª¶¬²»¹®¨¸º½¸ilXUSSMDJRMK?AHEDHHH95EM;>8=@J.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;=@BFBpEiIRebLF¥¢©¦¢¯¾¯¡Æ¼ÄÄÆÆÎÎÎÒʾ»¶±º»»¾ÏµÃ½¸¹·²±µ³¸³«¦«¬¹ª©§¯¯£¯¤§¤¥µÀ°¬¬´¿ÃºÀº´¨¹µ¹³¯¥®®¤¡tÁ}±¥£ ©¡ `J¥U°¯¤¯®«¥ ¥ §¢´©ª³»»»ª°²Ç¿¹¦¬«²²£¡²²´¤nkcZXMOJDOOPQ;HKIGICC>:KT?A:=EM07544:B44MWO<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯¨
¡£¤µÈµ©Æ¹ÂÃÇÊÉÈÌÍÆ¾»³®¹¹ÁÁ̵ǺÁ¹µº°¯¯³µ§¤ª´µª©¦¬¤®¥¤¨¬º¿¨¬¶·¾Â¿¾¹´³Ä²¹½¬£¯µ¬¹¦¦v¿®¡ ¡¨§ª¡§nv¢¢®²¢ª¨ªª££¤¨¢±§©«¹¶½³²®¾¹· £§¨¥¦©©`c^^PIKFGMIVL=MENKLBCD<QV=AABDO18=77?B75TWN?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUHe^HE«¡»¯««¢¤££¶Æ¾´ÀºÂÂÇÈÅÂÍÈÁ¾¹²¯¸´ÀÂʵŲÁ¼µºª©°££ª´»¦©¦«ª©¯§£ª«¾¼¨½´¸¾Ç¼·¶¸Á²¾Á´©µ·«¾¥¢¢¼ ·©¥¢¡¨¤³¡¦¨©¤¢¢¡µ¯¥¤¯««ª££¨©¤¡¡³´ºµ¨µ²³¢¥ª¡u^Z]\IGEFMPHMEGGCSLJBEGAVRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJE@JJNO9C@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19f\FCCpbGE§¤Ã¥©ª§¦¬¢«¶Ä¼¾·ÁÂÀÇÃ¿ÍÆ»½¹²°¸³¿Âȵ¿°¼·¹·¥¤«¬¡¡ªªÅ¢¤©«¦¬¯«¢©¨¿¸§¾±¸¶Ç¶µ¹¸À²¿Â·µ³´¯¾££® ¡£¥££½¤©¨« ¥½¢£¢©«¡¤ µ¬¥±§¯¦ª ¥¤«±µ±ª¥ª¬ ¨f`X_\NHGJNKHEDIA>QIA<GIH[ROK=HOU4BF9>HG5Ca[KCNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA46@9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ:mRF<KxebVL¢£Å¬¡¬® £¥¦ª¬¶±£ª³¶ÄĽ¿µ¿Â»È¾Êǵ¸µ´°³³·ÁŶ¾±¸µ¸´¦¬ª¬¥¤Á¤ª ¤©¯¢¦¨½µ¥±½¹¶¶Ä²´¸º¿³ÄÁ¸¸®³µµ£¥¡® ¢¨¨«£Â©¬¦ ½¡¤««¬¦¢W¥¡ ¸ª¦µ£± ®¢£¦®²«©¡¡¥¥¤_bXb_KHJJNEEAGK>=JB99JJN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrGE6=ue\KN¡Ã¨¥¢´¢²¨«¥ £©¬»°¨¬¶±ÈÅÁ²ÂýÆÃ¼Äɼ¯°¶°´¯¿Ä´¹±°¹´¬¨°©ª¥¡¨Á¬¬°ª£®±©¤¨½¶§·»¾¯·Ä´³ÃÀ³Ç´»·«³¶ª¢¦¤¬¢¨«°¯¯»²¦ ©¨¢¤¸ ¡¤¯¯¬¥§¡¢§´¦¦³£®¬¡¡¦¬¯¥¦¡
_dZfdJILJRBC@IH;;G?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 餫³¡¤´ª³¬§¢¤²¬®©»±°µ´ÆÀÄõÀĽÉĵ¿È´«µ¨¯¸¬¿Ã³·®¬¶¹¥ª²«ª¦»´§° ®´²§«¹³¨º´¸²¹Àª·²Ä¾µÆ¨¿¯¶µ©§¬¡¦¥¢¢¥¯¸®²µ¶ ¨¤¤ ·¢¤¥¯±²§ª¦¢¨ ¡¯²¢¦®¤ª¤
¨©ª¡§
wbg\jiLOMNT=CANC::I?77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05IphVCWFyfC;¤£¢¦¿§¨¯°¡©µ«º±«£ª´¶±°¹·°·¸¸Ä½Ãǽ¼ÄÁÆÀ¸ÀÅÀº©¶¤¬»¬À··©¬±º¡±²¥§ª¹©¦°« °´³ª©¶¶¼³³¹·¬¸°Ã»¾¿¦Ã«°·®©««§«¡¢¡¡±¯³¬°¹© ¦¡¶©¥£¢°±´«³¨¬ ¥¢£³°¥¨¢¨¨¦£}
igk`lmWPQZTABET@;;HA7:XPd^PVWEY_]MLRN^KJ>Zc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251.-.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=¨¢ª½¢«°«£±¸ª¥¶´¬ µ½®³¸»º½¶¶À¿ÈĹÄÂÀÀ¸Ä½Á·¯µ§«·±»¾¾´¨®±¶«®¨®¦¨§»¤¬³¬¢±°³¬ª¶´µ¾®°±µ¬°µ²Á»Å·«½¯±¸¬ª£±¦¥ª¤³ª³«ª³§ ¦¥´®§¡®±§´²ª¤¨£¡¨µ©«¦¥¢
{dkqgoq^FYfVDBMXDZ9HB6>\Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8)C3YT\gK6zfL@¤¡¤¬¶¥ª¦¯®·ª¯µ»§¦±·Å·±·½Áµ´ºÄ¾ÌƹÂÀº¾¹Ã·À¹±´«©º¶»¹¾´©°µ§¬ª¬«««¾¬®²£«°³®®¶²¹¸ª®®±¨µ¯´¼½Ê³ª¶µ±´°¯§¡³ ¨ ¦²¢ ¥¯¡¤£¦¨³©¡¦³¬ª¶¥¯±µ¯¤§«·¢¡«¥¢¡ y
{jmwmu{aE`kYIHZZ={JFD6AbTi[M\aJ[]ZRRRbaLKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C_Q\.*B/JGP[H3cYUKD¡±¨±ª¦¤¯®¶©·µº¤¬´·É»´ºº¿¿´³·ÃÀÌȼü·¾¾¿·¾¼±¼§º¹·¶Â¶ª¬°·§®«¨£°ª¯»¤±³§¨£²´±²±µ±¸³©®«²§·¯¶´Äƶ©¶¶¬°©§£¶ §±¡¤±§ ª©¢¦¦¥¸§£²µ¬¨²§®±¶¬¥ ¬¨©¸¢¥ §£ u{lovt{~\Kem\KNc\?b{GI8GgWe\L^bMXYWTWTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'GbLV%-B-=ELQ<3rkICC¥®¥¯«¨¥±³´«·²· «µ¹É¹®À»Â¸³±µÂÃÎÅÀÁ½´½¿¿º¾¼²Ä§©¹°¶¶¿¼®«²± §±¦¥¯¥²µ¬«±²ª©´»¬µ³µ´¬ª«¨¬©¹²±ÈÀ¸¥º°©¥¨®°¦¥£¯¤©¯££¢£¬£ ¢ª¦¦¹¤¬µ¶¥«¬¨¯¶®££©ª ¤³¡ §v}
|{{prq}|}\Sdo^NYf\FD[G;NmXb[L`bNVVUWTYg]QRLcZZTKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc;6*HeHJ+;H?3BHS,>k;GHª«¢ª±¤©¥³´±µµ²²¢«®½Ìº®ÀºÇ±´´ÂÃÑÅÆ¾À³¾Á»¾·»Ä§¬·¬³¸¼À¯«±¬£§ª¨¤°¤ª²ª¯¬°¯°®«³¼§·±²©³©«¥¥£º¬ª²Ãº¶»©¨¨©¨²¥©¤£®ª¨¢£¥¬¢§©¢¦¤«¸²²¡©¢ ¬¯±¬ §¨©¤ ¦¤~~
|w~
rqpuk_Z`ncQsq\K;|F?WtXaZNc[NVVUWQ\b_SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1<]J0.JgDF8<B05EKX1@Z>LE¨¢«³ªª°¶¹¶¯«¦«ª½É»°½·Â¯±¬³ÄÃÎÏÿ¿´ÀÂú¿³Èë®·²¸¿¾²«¤§ª°©§¨±¥´®ª°®²±´¬´¼¥¸³¬®§«£°·«ª»·¥·¶¤ª§¬«ª¡©§¦±²¤§¥¡¡¬ª¡ ¦¤¢ª¤£§±¸®®£¦¢ª«®©¢¥¤¤
££|zt|ru¤xj^`nfWecN?gLEbyWbYReTMVUUTO\]aUKMhVUWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<B+:JO^4D>HFD°¥£«±«ª¶¬¶²¬¦¬ª©¼ÀÀ¸¸³»µ¦²¯ÄÉËÑ¿Á»¹¿¾Á¸Á¹Àıµ±³º¿½²°¬ª«§¶ª¦¯ª¹°¨±²®²·ª··§´·«¬¤©ª£³³¨¨¤´µ ·® ª¨«¨«§ «¬©¹¶©ª©©¢ª ª¡ ¤¢¦£ª§´¯¨¦ª¢£¥§§ª£¤£ ~
¢t~xt~yv~oqggqx\askO^VHmxUdVQcOMUTTPOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Ji5OD;±¡¦«®¬¥°´µ°¬¦°ª©º¾»À°®¹®¡·¯ÈÇÈÑÀ¾½»¼Â½ºÃÀ¾¿®²²±µ¼»Á±±²«³¨¤´¨¥³³¹±£®·²°²»«º¯ª®¶¬ªª¬£ ¶¨¡°³¢µª¨§ª£ª¡¢¬¨½¯¬®¬¢¨¨ ¬°¢¢ §§§ª±ª£ ¢¡£££§©¥}£
xt|uxyzssyg¤ui^dktg}SXp^JxsSeSQ^MMRZfNLVYdXFSiRQ?CNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[*HM9UA4²¡¤¦¬¤§¤§µ³±«¥°§ª¸¾À¼¯§¹ª¦¯°ÉÇÈѼ¿¾¹¾¿¼ÉºÀ¸°¯´±º»·À²³»¬¸¬¢´§§¬²¶¹³¨¨½¶®¶¾°½§¬µ¬©¯¤ ¥«§«³¥´¨«§©£©¤©¨©½¬´¯ª¤¡®³£¤¥¥¤©«¦ª¢¡¥©©
~
~}
¡~r{z~|hx|ztop{gxdagaqzmgx]]U@WzmTaPRXKLNru]HZ[gYEUfPD>JNDCA9HGKS?jaJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GjI14X=fcAJ7GS`U*=9DW>*² ©¦¥¡«¥¸³³¦ª±§¸Á½µ¯¢¸¨¨°ÂÉÉÌÁ¶½Àµ·¿¹ÈµÂµ³²µ²¼·¹½µ¹¶¿¡³§««°µ¸µ¬¾½ª³Á´¼¡¯³µª«°£¥¨ª£¥±§° «©¨¡©¤¨¡»¨®° «£¤¯¦¡£¤ª£¥¤¢¦¬{|~¢|yl~vyxc{zqooqvgsjgdg_lrlaio`o>ZxkU^OQQJIMTYWM]^lWDX`O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>*49&'.34.0+/4&,:$41AhY13S=e_DL6KVdO*;2NX=# §¤£¨¤¸°¯£¯°ª«¸Á¹³¸¯«¨´ºÈËÈ¿¶Â¾°´½·Ä¶Ã±®¹²³¿´»¾·©¹¸½«¤´¨©ª±®º±«¼½¥°Áµ¶¢¯·µ¦§§±³ ¤¥§¡¥¬¨© ª¯§ ¦£© ±¹£°¯¡¬¡¤¦§©¤©¦ ©¡ª}~}| x
}
{sp}qtt`yxhnppnh}qc{mieb^d
~_ZrjqKJhXZNPLJHPRPIN\_nSDXZRhOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53<fd24M?e]FO=QZgH*>0XV5(§¬ ¡¤¢¸«²¥´´ª©¹Ãµ³·®°µÆÈÁ·¾Á¹±´¼¶¿»¾¯ª½°³¾±¼Â¹©»º·§¨µ©¨«±³±¨¾¸¦¼·²±¸°¨¥§¯±¡¤ ¤¤ ¯§¡£¨¯¡ ¡¤¤¢·°¡¦°«¬£¯ª¥©¥¦«¦¢¨¢
z~zx
~yzprwoot_ywdklkhgmerkkehYas^ZkuiYG}][XOOJHHRUF2:_^lPDXVYeLHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84GBg[HTCT]hE.;1_T,2£¢©¥¡£¡¸ª°¡»¹¦¬½Ä³°®¢µ¯¯´ÄĽ³¾º·±³¹¸º¸º®¿³´¸¯¿Á¸¬½º´¦¢³«¨ª³¬®²£Â¶¦©··«²»©¦¥¨¯«¢§¥¦¡²¦¥©©¡ ¥¤¹¨¤§¦¥¡¨©¢¡¡¡ ¢«¢£§¤y|
}x
{w~{lurmlsbyuhgigemgghdfhi^fbifZezb`QsT[[SLIGIOS@!+j^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB378bM'2¤¤¥¦¤µ¨ªº·§¬ÃÀ·¯¬¡µ®§®¯·ÁÀ½±Á·°¯²¶µ¸·µ¬ª¼´¯²±½À·®¼¼±¥¶¬¦¦µª«¯¡ Ĭª§±´«¬´º¨©«±¥ª¨¥¦®£¥ª¡¢ §¶¦¯ª®¡¡¡ ¦¢ ¦¢§ x
w{~{s}gypkjlguskbgdbtadefeiibgoY^X]md`MhW[`VIGHKLRX>9`liGBUS][IHFEA.<?9A89RF@7:B037=7692:<97:9DN=B<0*<@;A<-5B37=+*,0A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3AdG%5¤ ® ¥´²£²¾·¡±Å»¹°±£¶¬«®©¹¾¼»À²¯¯®¶¯³¹²§«¹±¯®³¶»¶°¹¾¬¥µ« ¡±¥«¯¥Ä¡³¥¯²°·µ¬®¬®¢§ª¥§¦ ¤£© °¦¹§¢¡£¥¡¨©§§{t
|
ofynhkjgqrk[hcar`dgjnkfjfdl\lmvqaTbhceZIFLMOXQPUaeT@VSYUFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24;6#3*)6.55465Z|]1:Kj[M[KXdc@A1IdB'4¢±¡©²°¹À¶ ´Á»½¹±¦¶°©®¥·¹·¸¬»¯««·ª´¹¥²µ±¯©±·¶±³¶»§©¶©ª£ªªÂ¯¥¯±¶µ¬¬±¯ª¢¤¬©§¤©£¥ £«ª©º¦¤ ¡k¢q¤v«¨¡x
mi~wrl}o]d`gkuwfhvifX]itnNPjcfqf^dfnki]]^
hOKD8ETg^JHPPUUKHS`oteE[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl15Ok[N\K[fb>G1Ob<+/¤± ª«£½Å¯©·Â¸½¼§¶±¦«¤¸´²³°¹®ª§¬´¥°µ¢§¸¶µ¨§¬¶³®´®³¢©´«¢¥§¨®½¨§°´¸®¤¨ª«¦¡¡¨¨¡¦¦§¨ ¨ª£´¯£¢££¡¡¡¥§¬rx uif~sy o~|¡ {tvlnied{mrbTmcmiqXipnW]i[kjZpmyriZ^FN>F^MERVVQPRWTg]LYKRRPEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*/(-4583%&2115>1<8Xt15Rk[N\L[g_=K1U`7/(¦¬«ª¨ª¿Ã¯²¹¼·À¿ª¤·±ª¬¦³µ®¯³¶«©¥±¥µ³¬µ¶´¦§¨³±²¨®ª¡³© ¤¤¢¤°·¥¦§·½¦¬§©ª«§¦¢ ¨¤§£¤¥ª£¤¦¦¡¶¤£ £®©£±¤yÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«°yhlX±®oei¼¼nhzmpØ~Skb¶²~qu¡ªWOXaOVNFT[XQPR\W[P@\EQNDFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww11Tk\O[M^g\>L1Z\41!¦§ª¥²©±Â½²µ¿µ¸¿Â«¦´©¨¯´ª¯¶´¨¨¦¶¥¨¹¯²²¶ª¥¤§²¯®±¦«§¤²¤¢¡¡ ±®£ ´º¢ª¨ ¬¤¢¢ª © ¨¨§¢§£¡°££
°kjª~g
eq§q®¡¤~wº|k¡v±_j´[¥e`fzfixj©e¾rg¦v±j|±xucmm§n\ EigEu`}f{£¦Y_«ixzj¨8J¯[WTmcZLOX_\WV;NOVV/ITSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5^Y31¢§¥£¤ª±·´½¾°·Å²¸ºÃ§©°¬¯©©±¯¤±º°¤¥¯³£©¹©³²°£¥¡ª°¬¯¦¨£¢±£¯¨¢´³¡ª¡¬¬ £ª¥¡¡§¤£¡ ¬¦¦ ¡µµy
©µw³·«~k¦z
w«gj±[¬{tpx
°vwqkjl|O¥XHcc~ch¥_yquR^P©mcq}a/R¢n[Tkg`LK\cX\ZB>°wWXA#MhFCDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFB@AD<FD;0201;F,0.840,.(/2,>831/2-D1<<S}n3+Xj\OXM_fW7J8aU50³¦¦¡®©¨³¬ª»¶Â°¼Â¸·Â«¬¯®§®³ª¢¯¼«¢§µ£«¶¥¥²³¨£¡§ª²¨°¨¦ ° ¯£¤¨µ®¡©©§© ¦©£ £¥££«¥¢ Õ¹q°ÂÆ|Ö»|¦¤z¢¥z¬yV¯{~j¹Z¹w}¦|zªy{±mt»
nP¯§ÅQ zc`ªbsrl_Sµ´È
|c¤3Bu]PjhdP@XfYdaJHMkJZSOYfZCC?E?0<<59;74<<8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB.00483+-).323971#%5*>3==Qwj6*Yi\J[P_fT7G:aP72%¢±¨©¥³ª¥´§¤¼·Á±ºÀ²¶µ½´¶§²±£±³¦ ¯¶©¨º®£°²¡²´±¡¤§©±©´©¥¬¢¬©°¨£¬¢§¡¦¢¢¡£¡¢¢§ ¦¡¦ ²nhµq«p¦r´ts¶{¥¢~¤~°uÒÑu[®|
¤oª¦k
}}{±sx³et
nfRÉZÂ\yb__vsb^YÊo¿uMKµSUÆdTQjceXAOj_liPUFI9=WR[VYHB?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCEE>II:1746@>/.24252-).26,742&60;5:=Prh9'Wi\ANT_eP5G=aM62.¢¥¯¬¥©º¬¦µ¥§¶»¼²»¿¸·µ»»´¦µ´¢²²£ ¬°¥§º®¤²±´¸ª ¥¡ª¤²¨¬ª¥©£ª¡§«°¥¢¬¥¡¤§ §§¢£®¡¢¥¢
¬{w¨v£©o§¢¢~®
³\r³R®}¤q×}w~w¯w´ael[°WKuyf`^vwgj]¯wxl5yÈ®²_BTo]g`EPl_pmVUM.ebhSYP;AD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:77 ¸±³Á¬¨²§ª²º¸´¹¾¹¸³¶¾¶¦¸´ µ ©¬ §¶¬¨±±«´¤© ¨¢µ§¦ª¤¥¢£§§¯¥¡©¢¢©¦¡¦©¤¡ ¡ ¦©}}¥y¡ªp¦ ¢£ª{yo±Z¨ ytØvt§¤|{²^d }m\«\[hgªcr{jq]«Z kneOJC¡\ZMt]bfMZa_rt_JU5JXHE=HFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<PeeA&Uf[?1T_bL7FI_C1=7¢¿¬³Â®«¨¦´°¸±¶¿¹º³²¸¼ª»µ ±¥¦§§ª±©°ª¶ª¯¡¡ ¦¤¤º¢£«¡£ ©°¯¦§¦¤¨¬¨©¨ ¤£¡¡¡ ¡«®nr´t©w¦s´yt´¥£¤u¸o{¢kk¶Z¡ei ¢§mr´t²jku³af¢nk\`N¡|Rs£ly~np\¯V<wfTon.[§ObRkeblZb\`p|cSYQ>>mo2BB@?M9!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U^aL5FM^91A8¥»¢±¿®««§·©¸¯µÁµ½²°»¸«Á¶ª«¡§¤¢««§¶£³¨®ª¡¨ ¥«¹£¥£¡«¶¯§¬©¦¥£«²¤ ¨«°¡¢¢ ¡©ªÓ»t±ÄÃ}Õ¸y§y¢¶u}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¢~t«}¾ns¼t²uxmqm¤t½]w}[ay¼jZV[iz^iadfbmyoY[YCA@r?CG*5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,<:08LXaF'TcX</T^`K5;L[-6@9§¢¼¢±Â°©ª¬±¨¹¯·Å±»³¯¼°®Á²¦£¤¡ª¥ª²¤µ§¤ «§¬¹£®¡¦ £¯¹°«£§§¥¤ ¨«©¤²¢¤§¢¡¤° ©
¶¸xµwnlnsoysÁ»¼z²¨pt¹|{|¤»¹½uy³£tvut°ufi¶trpw¶^y}gymyb¬pt
X[§iDdYTf_c]cQffqmuBMPMD;ZL?J3<0 8>;.3=A99?=;<C6BSYZZ[[Z[^`b`]SGGH4DITAKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿¦³Â´«ª¨«ª»¯±Æ¯µ´¯¸§µ¹®«¤¢§ ¬¤®ª¦¶¨¨ £¬¤¾§¡ª¢¡¨¡²µ¶¬¤¤¢¦¥«©¥¦¢©§¦£¨¡¬¢°©§¢k~i¨ys~uze{¾¿Àºnq
_rjZ]adk`cmvbke^_cqhr|fj~qty~}b[xthP\n|{jXlyrIJo
pNsMDV\faL[Wfc^OZmvjrRODEM<HI<M?2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEJOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR_I'S_V4)P^L(3>[O'?2>¨¨¡Á¤´º¶£¬¦®§¨µ²¬È¬°´¶¤¾±³§¡¤ª£¬§®¤¥µª¤¢¦©¾¨¨¥ ¥©§°²¾¬§§¢ª¨¤¬££§¬¢ª¢®¦ ±¥¢¨£¥§£hn}qv´©
¡z¤
li{}urxyvu{jstudw}vkpzl_b[ogLXYej_WYpzomfSOFR9OZNRO(+;JB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¢¿¢£±±· ©¦³§¥°µªÉ«²¦µ¦À¨´¡¥¦¥ «§¬£¤·¬ ª¦Á«¤¢£¨¨§²Ã¯«ª©«¡¡¢¥¯¥¡¤¨«¦¡°¡¢§¡£¤¡{©¨
{
£~e¡³®w{~wyzogykuyrisyujtcxf_hdcdfjXk{qjk\SLPD_UF@??,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_^]]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@³ ¹¯¾¬«±² ª¦²¢¬³°Æ°«¤³¯¼¤´ §¢¡¨¦©¦¤¦³µ°¦®¾ «¢¡©
©¬¢´Ç³©¤ª§© ¥« ª®¨¤£«¡¬ ¥°¤¨¥©f|e~cxlhjz£«kd~g
eeihz¡kh¢wkj¢slnzyXe]
^lv[hswwnxxsmysw{i
X]jsd]sik|qmc]QNWIdX@J4=F7?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[I.6ZO6)EY/DO1YB;?.=¥º¼¹¯¬²°«¥¨®°§®°½±ª¨¥°° ¤¢§¬¬£¦¨©³®££°¦¶¹¥®£¡ ¦{¥¬¢¨³Ã·¥¢§¯££¤ª¨¡ ª¯©©£ª§¦§ ¬¡¥±¤«¡¥«~¾r´r
hw¹Ä¸q¡£{¦sª|ËÀÀ»q£|À½ÁÀ{z¿}k¥²ooÊzwvyyq{px
ylube^xd_eb^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA@?=6468266*&%#)*&.+*)109*#>H[L*#CP/#F[3PY/UAB;/8¢¸Ã´°¯¿©©£¯©°¯¦²µ¯«¦§¥±« «¢ ª§¢«¢¥©¥¥´¤£¦®¬¸´§¯¢¥ ¡ ¦«¤«¿¿±¡©®©¢£¤ª£ ¡¬®§«¦£¡¥¤¤©¤©ª«¢¦¢¤Îyz¥z_]¨ ¡|§t«¯^d©z¨
t³c« ³j®s|¸aY£Ínu{Û{q~ue{vvl}n}
}k_pjof`_xd\qhjcf`RTSW^JOD5AHED8>6;@?A;=8@>>?BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\:L-!P@F4.1Á¿¿´´°·£ª©´«¦²¬¤¬¦°ª¡§¦¢¯¡¨§£¦¡°¬¦®°«¨¬ ¥¤§£®¤«°¨¿Æ³¨©±®¢¡ªª¡®®¦©¨¦¦£ ª¬³¥¢ªª¤§§¢±¢§¡ p
u¨q°|r¬} ¥w«}r~«v{|~ª¡}«z zVÄzoÁ}mupmfweoawnrnldmsuo`fmd_ohjnfcWS\`ZRRC8II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;92478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1-+¯ÓÅÆ²³ ££¢¢®¶¯©±§©«¨®««¦¢££¦«¢¦ ©¨¢°¬¨¨¯¬¨§©£¢¡¬¦£¯¬£¬µ©¹Í²¦®¬¢®¬¡ª±§©©ª¨£¡ª¯±¢¨¬¯¦¦«ª«²¤¤¦
¤j¤uz©uz²q¥p¤_`R«®u®§z
{f£¤£}©~®^|¨U¢z£|ïÅs¯´³¹qb©¯Âthlnlxxwnkfddqpf{ic\V_iXXTLLQLCCAB;CA@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÕÀ¡«¨¡¯¢°µ°¯©£¨§ª««©¤¦¥¦§¦¤¬£¬¡¤¯¢ª¤¶°® ©¦£¢§ ¦±¦£¨±¬¶È²µ©¬ª¢ ¥´¡§«©¢ª¨¡¡©¡³¢ª³²¢ª¨°°·¥¤¨|ªlu«y|°n¤Ò·´¸É²^_©¤ zxªÉs£§¨~ÆÆwe¡¥s}¯^oµc±uK£m§Gd{o}nyt|zm[ejrqfj^aXcm\^YILLKEDBB=A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\]\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4NTQ;<F2,$¨¤Àƹ©²®¬¥¢²¹¬ª¡¦¨¦«¬©¦ ¦¤«£®¬¦¡¬©¥§µ¢¨«¶²¬¦ ¥¦¢ ª¦¡£§©°´Â±²ª¨¥¢¤¯¦¡¥¥©®«¦¤«£¶¬ ±¹°¯¨´´´¦©¤¡Nxz£|¤¦¸{|y¹ÌÆÃ¶w¡~v¤¤§~¯¬}a¥l£p
}r¬`¤rq`¼}RUu£{|ryr}p\lnwrjnZc_hnbd]LLQSAHGFI99K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,- ©¬¤«¹«¯ ¡¬³´¦¡¦¯®®©¦¥¥£§¡²®¢©§² ©¤¢µ¢£¢ªµ¹¤££¡²¦¤ ¢¯¤¨¢µ±Ã±ªª§£¤¥¥£§¡¬¢¤®¥»¬¡··®µ³¹²´¨±¢¥ÑµÃ·y
¦x¢w
¥q«
´nri£|s®¥¢¦mp²\¥szl{~n©a¢qqbs²¸hw¤}v{xlhwixsn~t\ddmmeh`JZWX<HF?T3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH#)%r¿¿¼»µ¨¤¶¡¢£©§®©«¥¡¦¡ µ§¢©§°£«£¤£ª´´¤¦©® ¦£§µ¡ª£µ«Â¯©«©¢¢ ¦£¦£¥©¦¬ £¬¦½¬¾°£°´»¬µ¨ª³¥©{¨}|°w¤¥m²o {¡¨¬
®
¨¡¢
{~«ªw y¯]£|¦§d|tk®]¥kq
]`[ m¥xy~jl}b}tmy`gepngghBY_[=JS2T8BBC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZWSPONI7052.*,ATVVVTTUUUUTTUTSSVWWXVUVQHFIJ#((¼©ÆÃ¶Á´ ®¸¥£¤£ ¯®©£¹ ¢« ¯ª®¡ª©¥®°¬¦ ¨¢¡¥¡¤¨¥¶¨¿®¤©£¦¤££§ªª¡£©¨¾¥Ã¬«£¢¬³»¬¯¨¢µ±ª¬v¯~
}ºd°e}¡§°
¦£¡¢
[lj³`{{±lgm±[}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m§yw|cs|axs|aifpmfeeOUc\AT^=H(>9=4!!,$2. *1/04579:<ACFHJLNPPRTWZ^`_`ab__\[XUPNJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò´±·½»´Á³£¦¥¶© ³±¨¢´ ³¨ª«°¬®¨¢¯¬¨§£¨®©¡¥£¢¥¢©²¨¼¯¥¨|¡ ¨§¬¥¤¤¢¤©» Ƨ¥©¢¬µ·®¯¨¡½¯®®©£®¤¸Ãº§¬¯§¥«~սªb£¿½|~£×º·µ
½¾j£o«nz²±Çk«°½¬xw¢¾»t¥wxa|ycgx{`kekjaPb[Si\@T`BL)<:5/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´±¿º²½³¢®¦¥³¦¥¿©¶°§¡¿¦¦±±¹¨®¥§¯¬®¦£¬¡¥ª £¦§ ¨¢ ¬¬©¸§£{¦¨¨§©¦¡¢«»©Å£ ¯£«´µ«±«¢½ª°°tvª¤·
epg¬mow¤ u°pr¨£®¤rlmlexnmqzipifqhi
gpd]cioY]g~x¦`brofd¡z
tdwgjx~xdlcflbKeWJkY:PdDP'J:+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´©º¹²³ª©¢®¤³ª½±Ãǽ´©¿«¬£ ¦«º£¤¬¥ª
¥ª¢¤£ ¥§©£ª ¥¦§¯¹ª«{¦¦§¡°¦¢¬¹ °Â¨¤³¦¬±²«¯©º¥°¹¡©¥µ¢©ª³£¬¡´£¡¡¢¡¤¡¬§¤~gtvtq§m|
pgvnwu|yikddocU`X@iZGb`NX+E=+&!640/!%2(*799469;>?ABDFJKKMPPQWUVY^_ac]^TQJEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¤µ·®®¢°¤ ¶±ªÄ»Ä¹·©¡¥¥°¨£¶§©µ¦§¬£§¬£¡¨£¨©¦¡£§¡´¹§ª|¡¤§µ£¦¬·¨¯Â®£·§°¯±®ª«µ»¢±¾¦¤¦µ¢¦©£¬°¡¤²ª±¥¡¤«¬¢ª
~fuvytj}
xqrx~q{~ind_pi`[_YmbP`dOY9GFE=2<=8/*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤§£°³¬®£©§ ¨µª£²ºª«¡¢z¢°¤¥±©¸¦£©¢®¤¨ ¡®ª¨¨¨¸¶£¥y¡§¸£¯µ¢°¯t¤¾£² x{¡¬´½w®¥ ©~d\bv¤~n´£¨¯¬¤e tzq©l£¨e¥
wkvq|ai[vghqy¢dwvhny~jpe_vokkg\ecaaoRZ=MMNRF=@TB91/&4:306678<;>@ABFHBGGIKLTUUY]`hggXQI<DG<9VR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥©¤§¤ª´®±¥©¦ªs¯¨«§¸ ¤~«¤§¢
t®¥¨£¹³§ uv¥²µ´½§¡~§¢{¤°¹§
±©¯¢y¬¢¨«©w¥z§{²zcynqzqt
xht t{}ijxzppgdwmilj\diier[\HTLQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aahfYQH9DK<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°§§ª¥Å¼¯ ¥§´«¦¢ ¾¡|
¬£¡¡¨¢£¹±§
pu£«´´®Ê«¯·
°²°
©§|¨r{w¦h¤y´§©Â«¡q¥}
²¡} |
ms{r}
uÅf©¢jogwt{vghupghk^bnlflXfF\QL2E46Mac7&4<DGD:63658;8>==>BL?NIJKCPZ]\Wb^jl\QE=KM@JdX]cghgbbbbcc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹±©«¦¢¤ª¢¤©µ¢¯ ¦¥½ y«¢
w ¤¢¸¬¥bm §~¡§ ® ¬±¤«~¢uk«tM«x©©ª«~¡{z§ilg¶~n`cX{dgs}yk]|n_Sq
\`ly`Ye~q§ªk£nr¥pgdlZlzeY_~aWPovemtqjjn^jolkhWgN]XE9@4GD^k4+ICQMN=84859;6@;;>BO>QRLMBJ[]_W^_bv`ME:MOMTb\[fgiibbdaddbab`cdcabjkdbddgdbgeach ¹ ª£¦¬¡¶¼«®¢ ¥««´¡§ ¦´u¦~
¬£©¥°¦¢in ¡¥£¡ w§¢¨«¯¥z}}¢pr{ym©|¢sv¦f~w¤^{}s¢n·´ºs¶¨dƸ{p¶q¤ct¬«`}j³~n}q£ls¤s}£^³o{³tr[²ibosuqhnXkkrrd[g]aKD=D5QAZq2<RF_JS=<395::6D;;@IP?TMNQ@E_^[YX``{dIC8LWUVbaZffkkbbeadc`ab`dd_`cknccddhdbgfchh£¹« ¥¸µ ¡¢£¤«±¬ª ¤«x
p¡}¨ ¢¨§¤~k{~} w¢ r¢©§©¬®}z y£xs}§£d¡}lhn{§}rgsªsªg]
vhªj¸f\©pa^§vvhumj¦\¨~w»j}©Z]³g\nqxwki[piwxa^dVaAPEO7VBRn4JZY^NZD@151;;7H?:CGU?XRX]>Db]V`Qac|iEB9N[^YdfXfgmmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬º²°«¥§¬°§ª¢¡ £iq{z£¨¢iy{~¡ ¢rh p© ¤©¢©}°¤¢¸v£³¢£xz«~¢r¡}
°µ}k¡x~´££«¨{|~sªZ]o{xbL{{
dzBMY¢jr|nvy±³~¦t~mq|ori£]vHec`sp}}nf_khu{bc_P]V\TV@YEQgERV\aX_ID=B8@A:IE8LEXAVQZVDFa\Z`K`m}qEC<U^bZejVhhmobff^a`\]^`hb_edvl^egfldelhhki±®S_¡§´º³³¨¢©§ «£ §¡w
ny
}r r¨|l
q¡x
{¢£®}µ{¦z©¢~§hwm~s sq|
o®}£§¤p^©hu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²§¼wm¿¦ª´^o~ros¢r^¤gt¦`h¦lÓznvykyvrl©¥g_dypkgfcmuwf_aQZePQaHWIT_WS[dj[eQFCKLJKBJE8P@PMXSXORQ`eeiRdxywIFEc]eZhjSihjocjf`c_\]]_ibahe|d^dgdkdjlfhlh°¬T\K~©¯²µ°²£¦ £¤§¨
{p}h}wpl|£ª
ywnw
y¢£ ³¡¢¶z¬§¤®¥p©}¤¢q¢®¤¯¢vµ¶¶É¢ta©my u¡w }oLf£ps¥{ytbl~ lrd`rtk{j´µ´Æ¦s~zj«tlswiytqPD}³^jujxfkgbttpmU\RXgORhIULXRU\gknUgWMJAJMJHJNAQJPdcimetrs~x{nu{{TQOm^h[kiRjhilgmfce_\\\_ibdhk{_]dgcjfnmeile¢¯§
f?¡³¬¯¯µ¢¢§¢¡£¤¦¥yjye~yui
z¥©z}yp y~¥§gnxl¢d|q¥xph§|¤z rv¹n¢b}¢nsj«ku mo¦`iiu¢}_
uobh¡eiupdgnr¢Z_[c¡n]p{trd¥nx¢df§hrn¡oRn ^d§T]TmmrjqmphkxskoQVUUeYSmIXO\HXhhsjYkVPREV\LXRaUhj^wuz|p||r{svv^QsagbqgPkhhklohdg_]]]`jbiivu]\chcjirlfkmc¥¦zetm§®¥ª°±¦ª¤¡¡¡¡{qh|st}|e|
¦¢«
}si¥}
©¦¦x~¥²¯¥yz©t¦n¥¢¼n}¥¯¡}¦{r¨ g~o¬cw¨l©¢vw«¦k°kv³©loo a«ªw§w}
¤ iu¬f¶sv¾£Y¦«`uqso{upbj~nhlSUYU``\jL\Q\I]lmv`[qX[_Zgsenoqcqt`wz~yryr~{{vbyddnsdRlggolrifia_^\ajbllzo\\biamiwmglnb¦ª¤ªª¨§®£ª£¤¨
t
zo}surn}{
¥¥¥uol¨ª¢ t~y¯¤qy
{r§q}}zx{~~w ¡{~k
[yysypin~rtq
e_wvtuo{oon^wixfªt}jou|umlfsw{wZjWyhmwrqowxo]lmigVY^W\dkdUaT^Q_owykjwejjju|pqtsaoubs{xuyuy
}{mldyn^Wnghukxjiid\`ZcielqunZ[bkdlkymhloa¹©§¡¢¦¤¤«¢ª ¦¨~r|}~ztrp{}
x~£{§¡
wqª
¨ ª~¨§xq{p©p}qjo|hn] sqtkvtYrn~~i]icz
_ix{|viykbqrw_r¨gnwowndfcyzZ[ifmv[zxwtmsrf\mkkbYX]YXkq[^`Y^]er}zsotcjji{|rzwtdmthl{~uz|{yyp{}s~zrhT\rilvpugkgd]aYjhkjqrmW[emlgryohjm`ª±¡£¡¨¢¡}«¡¤{|r}v
ror~z¦ xz¬¡ª¡¢££ª¢¨§¡|y
¨~~±¥±¦ k|vwe}
w|{u£~vqt
x§{
uj{yiqh`sp}zwvovs\^ogn_^YZ\RgqUc[[alht{|rnpcjih{mx~phoplf{rw}{m|zx|~zxNdvjsnq{ekebb`[sfpfrqlU]ltmhxzpgikeº¢¡¤ z©
|x{mxr~ml~z~}©q
}z©
¦¢¦ ¦x}
¦||
ª ª pxqta~u~
nyvu£
u~}rs|{y
¨uzmj}zmhklf^y~g|{vtuuzw\`p}mu`cZ[^QfmSeZ]akiuz~pllcjjgkrkjsnxnynv}
vr~{z|{`i{kuhiejc`i[cuhobumkTbqyeoyzrejmm¸¡¤zw¥¤xy
|l{xr
}|kh}|~|¦p ¡
|§v£ ¡¢¢¤z
¡~|¤ ¦~~vtpv`}r|q~
ixrys}}qz|
{{¦|
t
xdqz~xypkjf^}sh|uus|sj^`tvpwdcX]^RjhTdX^ahjvxqfkclgejm}gmpj}w
zkr}tv|z}jrntibilb_qUtomn`xhlWjtvctzzqbkoy³¥¥ {u£¡x{~~p~ztu
~wgc}x}y}o¥¦v¡¡z¤{x~s¢ ¢|wr~n{d|pk
fvo}~y}}|ryz
£wuys^ww|s}wfkc`~ijvstu}q|ccasnurmaY_]ZkdRbW_`iluypbjclfh|khthloh|xmqt|~z~|muttmeljbcuVipn`xglajvpex{yp_ql
®¦¨
|v¨yx{}|{xsxys}d^}~
t}~~£ ~q{¦ t§um{o¢|zrzkul|~n
xo~~esj}
tz~vx~}¥y
t|rs
l_ytxp{nanbd{anovswwssav`oluno][^]]j]O]Wbahmszk_iejchwmflhilg|zwos}tz}z}|ryyxnlkh_irchqoevgmlazhj|{wpawmª ¤¨|v¬|v}{|{vwotszo
}~|a\~szz¤||£
n¢¡p
g{
p¡}{
tsvkqnv|tnqt||eqmz~~
utyn~}
ª{}~
w}onbgwstnza]o`jt^pjzxxlrpey]mlsmsXZ]_ajZOWWdcfqqe]ihgbgqndigeigzwuos|u
x
|w
zw{{ryjk_phskqnmqgoke{bnywpkvw£¢¨¡¦t© s{v
wxrs{
kroymvnq[Y~vu w~
n¡l¥
gw~~|}ovplmop{ispwuygsov}
{zwtp|{
¤|vwwmj\qrqoowY]o`oj^oi|zpmmjmw`pokqmYX`aamWQSYefbupb]kmdcfkm`ff_gktqrptyvywv
{{vjqb|b
|opltjhnlvw_q~x{tus~¥§
~t
zrwtpr
squlnlumw}mnUQ«yvry wz¤|s
ih¡
qw{{||kwjnklmzby~vzw}zhumu{r{
pw{{~}}x|vohkw^womkprU]naqa_mnypgpffsuhqlawe]Ve``rSPN[ed\xp|^\hqbbefi_gd[go~okqs}v}
uvy{xs
~|yxfqj_~ookz`imtt_s|xwss
|y¡±¥~vtvspo
spqojiumn}|musRNᐙ|otuv{r
¡
}xzzwim¥cpz|z
|m|esoklzy\y{}~{ziukt}lp~{}wxxrken}kitoghslS^odpZ_lrwfkkbgxsoqd_w`aVk_^uOMK`ec\yqt\[ev`aeec`fbXirsmkqv|tyvw~s~zr}~vesn|enpkZknxyr`vz{vrvvy¯
x~{
twpypnomn~rcdxp|nz|jhlc¤ÁÜ®ï¢skuu¡np
£~{ux
vwp~¥
^l|}v
~~k}cxtjoxsXz
z
~zftjlwo
{utxurpesw`sloahufR`pgkU_ntyarc`i}qrn[cracWnZ\wLLLcea]vsm[\dx^`df_cc^Yirknkrw}swxx|q|}{tshuqyl{ntpWpyvyqdvxhvq§£|pwx|{rwpsjokil|t^`xv{ptzg`e|ëÚµÉÃÜslsvip
|zwxrvq¤a
h}}
qrwgvritwlZ}
}vbum~nmz
}~orz
tkoipv~^shn\iu_RdqhfS_pvt`o`]hqrjWgiciXmW[tLJLef^ars
h[\ey^^dgzad_]Yknenjtw~sr~{vzt
|wv
{vlwvyxunwz}Xy
qnfxvdv
q¡¢sorv|{xqtnodr~hflww[_x{zqqiagaÕ¶¦xnqw{qj{h{{~
zu{{qux
af}~m|tkmwutwvkc|
p`tr}}zqg{
|
opytlmijwzagiiXkuZRiribPbrxlbe^Zjnsb\g_em_nTZoNGNfd\fnrkZ[cs_\clwde]]Zllbmjsvqo|}txx
|vx{voxy{om{v^smhzssgs|r uu~mu}|v~vqoljat|gbiuyZ`w{ymq~echhW_rs¼Ävq}qrj{|
|{uvw}ru
rv}f}~r}f~|y}i}vfoyxswslk
x
k_sy{~|~siz
y}~nm{}vtnfe{tb[pbWnqSSmrhaNftxf`^]YoosYeb]jn`pOYkQDSg`Zjnm|nY[^mcZbowdg\]`kicljsvpm|tuz|
v~xtryy~oo{qixz~ml{ukjxtk
n}viw~yozsplid`szh_eqzZ`r|ygqzaee±²wKbZ¥ÙÐq{w}
nk
zy|xwoqu~zjy
¥ow
z
p{|nwhxr|e}~vcpsiypou|vx
zk\rs~{rnr
sz
yno~vzdfh{o^XvZXplNWqsf`Klwta]\ZYt}soWg]fjr`oNWhR?Xf^Zpkhzq[ZYkeZcqy_h\^elhekiqwol~uo{v
qq{|zyujy~ko~t}or{zpo~xg¡
fogy}~|hxrklf_`oym_box\dkzaqv_eeÔê½2:>qx
v~ml
u|
|xnvwn
lu{tfy§~nvx
{{w~krh~xm||wayqdqh~nuqu
su~so\nuy{}xzrm
szumkvut[ggunWV{RYpdKZrre[Ipxo\[[Y]t~thYb[gfodjMWfQ>^e\]ue`upZYTndYdqyZh]_fmgikipw}mi~yn||zupnw}{{h{}js{r
zsw~~zx}|kl}kh~z~~~}kuqghb[bgso_aks`hpzbst^cd n\5Z¯µti|u
svpl
uyx|z~rgu~~oq~hvynfy¤~nw~
|pz}{h~lj{zjzwr`w~qdrgvmu{|owz|umYpwuxvzxsos~{onjmtm\fdrpPZzM[o\O[rodUKsxiWYYZaqt`]]`gdiifNYhM@`c[`ua]ulXWStaZdorWj^bhkgmlhpw|lh||p~{zwq{oqw{j~{mwxvw|x~~zm£zuxklx}z~prpcf^Yf_oo_`gpfjotato[adjv{¿¦¤È¸q
r|xsqro{tttwyypcwzirvgwucj|}suzz{kxy~tgzhkysizv}h`w}jjth{iv~z~~p|v|tbVx~ss
}qwxqqz~}vwjqilqo\faqmIduK]mUSYrnbQOtxaRXX]aos[a]heedkdP[pICc`[cp^]whUVUv][enhVk^aigennhpwzmiy}r{~y|u|pwrmw~p{wyztx~zuo~}
zw
{gt
y~{
vgon_d\XeYmra``plkhnatiY^dnw©ÚªÇ²qwou{ztst~wpqmtxuk`zyfqpgvn[m|y~y|nw
u
{ltv~mgvdm{umiwv|abxzhuub}{gu{tvq{}mZWupv
zmtylv
|~y|t~thtenlsYh^sdGmmKZaWVUwmbPRtvXPVX^aqo\`cmdd^ocT]rFBe_]fg][{bQU\u[[gkaVj_`nefkqhpvxtku~vx~w{s}ortqu~
{wx{|
x|}~{~svy zvtx^}
xt
wzbnl[b[[aVisc`[gnofqaqfW]cl|Êι¡jmmlqq|~zyxsyuu{jlvcuwof^}zerkjqcXmz
sx}ors{y}ppo|fhqbmxqjkqx}|z]eyxivxfwgt}rjo~yo}^Ysnu|opqwixx~s{u}{sgsankqWi]v[GmjLVT^SU{kaOTurPQTW^bt
i]`ljfcZoaXcpG@g\`e^\V{^NVepY[jh]Wh`^rfkgqgpswxntzx~yuq
pp{xvuz
z|t~}~~}|xvxx}muxd
so
ztcnjY_[\]Tgrd`XdqrfsbkeW[`jw¾®{ ¶nbshs{qyz}~wwrvo{vejo`usjb^xyfqhkkZVow£qryvot
}xtqnhx_jl_mvjgjkywzvZg}|xes~nteu
pgkzunub]q}lu}{fv}nqivys~m{|{yqflbm}lmUi_vUJijNQNhMX{haNUvkLQTU_fuf^`qhgbWi]\khJDjYadVYUyYMVmjY]kd\Yec^tfldqgrpuxp
v~w|
}urnsy{zsr
y~u~|z~{v{wwziv}{lqp
~pflgX][\[Sdpd^WbruiupeebW\\hporsddx~itusrwyvsunkzqbgkgtnf]_}p{imygjdUWro¦|{vt}s}{o}|x}}uoqlgt\lg^ltdgeizo{rYhwuhpxvbw
|ojm{qgsfanzgsx|~bwwjlrv{q{zt~gywodfbn
{ljUhboRJhjOKNoG]{faMUtcJNSWajv~e]gsif`VcWbp]LKjXcaUTUsVLXudY^k`\Zce_vgmbpisor~utww
z|t~
nrt|ztq
zvt|
|~{~v{£¥y
ku|zuznsy}unjheV][ZZSbmd[Xas{ihmi`bW_[jjkpgk`hyxjstsmz|uunzhjyj_enhvgeXbwj~{ojpgf]TXog¨wz|zvqptwzyt
vjquggn[lc]mr_gajxh|m[nrtjo~zwaw
x
sroyrcqi\qxdrt|yctqhjzurmyxvyd|ywqddcn||jjThaeSJkgOGQkE`xfaMSq]JMTZekv{e_mqid]V`VnnWKShWe^XMUlTJ\y_[^k]][ce`yhl`oounpwuz}wzzxy~qttyvt}|ks{
~}{v«zkryu~tnn|sjomddX_ZYZTajg[Z^ti^ml\aW\\lert}ii\kvugsvql{}|xurlygixf]esgzwccTepg
wwgij`WVYgc§n~w{qr~hzp{}xq}ndurdgg\ja\oo\g_mudzh]torkr|~uvbt
{xruuapm[rtcqs
|uesmam{pkj{yvsfv{{vqebems}ikSg]\TKqbPFVaGbvfaKToWJLXXgkuzdenqfdZW]XveTJ\bWgWYHWePHbxZ]_l[^\ac^~ij_ntxmpnvyr|~uuy|tuuyzz}~isz}~
zz|sq{{}dqys|zuro
l{~lzbpobe]eVYYWcfk_]\r
hXpn[^XZ\l{cpwvmbZlssgtuolx~xwnntdite[gufvvy_]Rffjt~bdi\TW]bc¤hxtymp{iyn||vsx|xhdvl`f_^i^\skYe]oobze[w|knnoxysuds~{wpr~sbxd\ppbqr}tgre^nwiehz|unout}trb_fnn|dhSgXWSLv_PJYXHbtcaITmSJMZWilq{bmlscbZZ[aw\SLc]XiSWGY`MFiuX^`l[[_bb\iganxylojvxm~vsttrvuw|}~~~pw|yxz~ttp z{xcuxswtkto~kx|pr^po`gblTZZWhcmf\[qeSrn[ZXX`lvciuji^Ymsplsssi|~~{vonldiqc[krdtvs[WSearr]bc]SZ`\ceqq
tll{npq{}}qxszzzceuh]bY`gZ^vhWb]ohaw`[{vijrnxsruhq~vsjq}nfwX]lncrsztgo~[`prb`kr~mmusqxkpa\elly`fReTVQOtZQOXQHcsb`FUkPIPZUkkk|emoqb[ZXYlqWRPfWVhSTFZ\NHqtX_cmcX``a]jcdmyxkpiuy{k}|y|nrovz}t|tx
utquo¡s{zewnmznfxpzksvrk^tnagekR][UgalkZ\pdOon]VXUgithbtee]Ymtmoutxj|{vsddkna\nmcsxkZTVcdx}}q]c_cSZ_Ybcnp
tkh|pftxu}lzuvoz~u^erc[]VacXateU_`mdaq]]~phisqtpuvkm{
qsgp~qsoT\gkfqtwscmvVbrl[_pg~fmw~ssskm`Zdjjv^fScTUPSlVPVSOGdr_aEXiOHWTVmhd|ikxkbW]U[tdSRWhQXeTSHZZPMwvZ_eliYb`^^nafkyunoivvl}{~krgt{u}r|
{ss~vn¤rvwlz`d{pfzsxlmqvgd{lcfghS_^Ug_ln[^mhNim`TVSngtkexdd\Xoslqzwrl{vzykaelm^`ojepy~gZVX`lx|{p_b^gVX_Wcbkp}xlkyn\wsm{iutoo{rXim^X\UabWdpcS^ahablZ`~kfksvomwwli
{mrgq}nsndZaiiotts^imSeqeUcoc{drw|wkpmk`Yaght\dU`URNWdRN[OOGdo]bFYiMI_KXmd`xin~d`U_T]u\TS`fN]aUSJ\YPYtu]_elhXca[^qcgjxqsnhvtzrz~|ynulst
y}|
sstxro~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDARÌÚØØØØÜinnnnqI,00//,I
}}{{z}~||~}}}~}}~~~~~
-h
S7¤¤¤¤¤¤£r]____aR455552FØêççççëbggggl<;|}z{z|}{}~}}}~}}~~~~
|y{z{|{}}}}|}}}}~~~
~}xxy|}|}}}|}}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}~~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvy}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvttvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfgggihgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxxz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>><ED>?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrquxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;899;;:@:;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNMMMNONNMKKNNNMNNLTnpprtusqrwyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;89:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsusqsxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<979::989::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;=<>?=<=;:<===<<<<;<:;<>=>?@A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmqquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVppqssttuy{{{}~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;8:;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pqrrrtuvz{}}}~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@=<=;>=:::<:8:88:;=??<;;<;:;;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~{NIKKLLLEILNM<?<<=>@@AA;BCBC@???@=??><>@?===?>=>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGHEDCFEFFGED@AGGFCFDGHJGC>Hlpppqtuvy||}||~~}~~~~~~~~}QHKMMMKJKLOQ@?>>AA@@AGABDCDA?@@@?=@><=??@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBBC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>:><?=<:=<@BBE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGDEFFFJNNKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@DED?<ADEC@=HDADDDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHFHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCAACFJHIFHHJHFA@_hDBAUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKJKLKLHT_hq{WNl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopssuvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKLL`Xg~y
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHGIHKLOmy
fBB=88::9878896479;<:8567789787689;;<>@;999==>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz|{||~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@BFHKHPuT;8656766645763468:876565677778:77789;7689989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:<DBDEMv
H676468874578467699766765:::::<898977779::8878588;A=>>BA?AKLOQPQOOPQWkrrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897:A9<DNxz>:88;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<<:;<8::;:999<?<=ABDIJMKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989999:>=@@Ol<;>BCEEAAAB>@B@@?=>>@?>?@?@==?B?AA?A?=@@@>?A<><;:;:9;?=;;==AACABCAXqqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<<:;;<;=>AA?b
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHECEDFEAFEFDFFD@B>=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>>??<@>A@DAM
WGLLMKNJIKHIJJIECDFGFDCEFDBHIKHGGFHGEKIKIKKJCFCCDBAACBDCCDDCA=;=@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97<>;<:=??A=@@DCGBj
PMPMKNKJLIIJHKGEGHHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<;;<9>@>??ABEDKV~
qMQOMLLKLJIHFJJEJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnquvwy{xyzz||}~~~~}~}~~~~~TDAABGGB?8?@8:;8<=;=A=>?ADEFNn
^RRPMNMKJGFCGJGLJGKOLKJJMMLOPNHIKLOQQPQOOJIJJLJLFGHGEGIFEEB@BB\prwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9?=>@BGF?DFDHMu|WVRRTROLKJEEFKONOWVQPOQSRNSTOMSLPSUWRSRPLKMMMKNGGJFFHJDDEEBDCcquyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?==B>BCFVMCJKHLOy
gVVkaERQQPJ;;QSR`u]UVTVYYSYXRZfPUWZ]RTWQPNRPPPQKKKGHIHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??A@EBCFEDELXRLQQPRSz
}al[dU:XXXSP?@VUY\d`VYbr^]W]ZVEQYZ\Y_TYgRUVXTTVSOOMJLJIILMKOMSotvxyxwzzz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HMIMPKIKPTSRVWVWVv
g;~ynpXZ[ZRSRWVTZZuYU}a\X]^WIV]][[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxyxz{{|}}}~}~}}}~~xy}YMKJIIFBD@A:PQQWXPPOQSTSWWWXXm
n~fYY\YSVTWRQWVcQerXZW_hP`fZ[X\hbGOZig\[\]]WSNSPPQVVVVYZosuwvvtwxx{{|}}}~~~}~}|~}r}ot|]SOOMKJEC?@;PPZZ[SSQORRQURUSV_ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ\\^SPPPINOWVX[Zdqtvvttvxyy{{||}}~}~}~}}~~~zxwvsu{tk~~kry^\VUSROKFCDAM^lVRSNOQOQVRSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURPQNKRTQMOYQMNQSUUMQSRPNLLHCIHRSTZ]mrvvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YUQLILIaltPQSNQRQR[RSRQRUUbs{|}{{
u_]KC>CCCCB?DPCD@C>BHGV@INMG]iQHFOFDEFHGHBCHGHJGDBAC@NPMRdtuvustuz|z{{{|}}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQSQUYSUQQTROV`klsvz{xyurnstsyx~~kLG>>:;>@??>>jPJaEFHIEB?HMMGMQUJBE?><=<==?=?ACB??<=B>JMFUouvvstvx{|{}{|}}}}|~}}|~~{ywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJPQNKLQRQTVTWQQWVPX[b]agmmlokh`nrjmlqu{z}zxz||xwxdB@@A=:BCBACA[\N{NOONKLMOOPLKLWNIG@B<977599=;;;8989?;AG>\tuvvuvwy|||}|||}~~|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRSVXSRYTNYZ[WY\__`e`]^qwk^`gkwooljonnlfbYGFFHBAFIEEFCLQOaWRXQPSSRU[OOQVPMICF>:96586979:365795<B=ftuwxwyy{}}||{|}}~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKTTSPQUOLRSTWXTTXQLWYYVXXVXY]WWXhsk]V`tkaa_]d`_^YUPMONLIGJKIHFCPOSZWTTNQSYS\eUOSTQNKIHC?A9988978847578598Gnruxyz{{}~}}|{}|}~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVWXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNNNLJFPPUYSTNJNOTST\VRUSSOMLIHHF??=:787659967665Wqqtxyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXXYYYRUOJGOPOOMRJOPPPNNOTLMIPPSTU2<XMIAQ=c`QSQPNPQPNNMPNTRPRLILKOQPQRSTQSOLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWUQSFEAFGGHFJDHJHGEHLHKIGLMPMG/E_R>3@>joaRRQ@FTQOPPQNQOPOLJLLOPNNPQQNPOJMMMKGEEDB;==<9=G6677Dnquwz|{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8ENS]gSQSAGUPORQPMMNLJLKLNOOQMOOMHLKIKKLKGFFED<AA>;@E;<89Tqsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A>==A@B=>EHFDFFIGJJ@FAA@FHEJOHQRa\QPRNSOOPLLOMKMLMON[VKMQOGIHDIJLLKFFFD?CC>=BG?B>Adqtw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;>A@@>ADIECHGIGIEBB?><CBAGIDMOaePMONWKLNKLMMLLKNNSdNJLRIIIEAHJLMNKGIFBBB@?EFEHDLopwzzy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLMIMPMPOGKE?B=999:?B?<ABAADDGKFDIIGGHCC?B??@A>CECKNQTKJIMTFIIJLJKKIJLMOPRPKGCLGCCJJLMOMIJIGCCCDIJMLIZsnxyxz{{y|vrpurtyyvxjqojllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHKCFHHGJKIJLDGB=>=:::;AB?=BBCCHFJLJEIIFGGCC;A@B>@@CECIMOGHKFHKDHIKMHJLHIJLJM]RIHDNGBEKKNMPNKMJKFGGJMNQNLcnjwvv{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdpFKCFEGDEEFEGCC@=<=:;::@D@>BCEEIFJJLFIIGFFCB;BCC>@CCCDGLNHKNHDHEILNMGILGFFIILNKJHEOICGMMNMPNOOMLIHIOSQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGICEFEBBAE@DB>?>:;;=;=?CA?ACFGJGJILHGGGFEC?=EEB>ACCCDGIIGMPIFFGKNOKFHIFEDDIIHKIFHPKDJMLPNONOPNJJHMRUUROWdaamgqrosyzgehhcilgqlflmgiklsmpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEGCA@AD<BA>A=::=?;>?@B?@BEGJFJGIGFFFEDCAAFFCBBBDEEGGHFLPLIOJJLKIFHEFEDCIHHKJGKRMCOONQPOONOOKKKPUWVUSY`_]ianinhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsprkksMFGEGAB@CD<AA@C<8:=>:?=?B?@@DFHEHFFHFEECCDBDIFCGEAEGEFFGEJMKHQMJKHHIEFHHECIIJKMKPSNDRSQQRNONNPMLNSWVWXVX^Z]d`hbjigk_defcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBEE<@CBD<7:=>:>:@B>??CEFDFDDGECECDEFFJEEIGBGHFGFECFJJGMKLKHJKFIHJHEKKLLNORTOITUTQTPQMNQNMQWZVZYWZ^ZXa```_hec`deggjhhjfhnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGIDACHE<@EBD<8:>>=<<BB<@>ABFCEBBHCCDEFFGGIFGKHCIHGIGFDHKIGKIMKJKLHLJMKINLNNORUVOLVVTQTRRLOQPOTYZY\ZZ\__^`c^\ackb`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIKHJEBDGE<@GDD@9<>@?>?CB<@>BAFCEDCHDFDFFHHFHGIKJEJHHKHFFLHHHJHMLLLLIMKMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[]^``a`ae]d`fg`ehjcssfjhglprqossnswwpuvtsmoruorspurvrtwuuuwvuwsgtrkqrkrwowIJKIKGBDDE<@FDDB;??A@@@DA@B?ACHBEDFHEIEFEIHFIHJLHHJJIKJFJKHIJJGKKMLJJMLMNNOLOPRUWVMNTVUSRQPMNTSRW[^^_\^``aaa`cdebdicdijgvlkihmosqpqpprywruutsmmssmqsotutspswtuuwvuuueqskpqjrvpwJLKKLGCCAD<?EEEC=AACBBCEACDAAEGCGGHFEIFCGJGGJFILHIJMKMLGKIHKKNQKRQLSMKNMNPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da_`b_`fbacinicihhmxvmhimosrpqrrrvtsusssnksqmprotvrrquvuswywutucmtkopjqtpwLMLLLGEA@D>>DEFC?CAECDFCCEGCBHEBHIIHHKFDKJGHJHIKGJJNKNKILHJMKZfJd\KlRHOM_nUls[qpbwcRPbvuhucav`Xnqbdvinzf\lt`lkU_wvijhhfglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?=DEFDCCBEEDFBFFGDDKDDJLLJLMGGNIHJKGKJIKKNLMLLLILLL[sbdp^llUMNer]gfqlntgpi_aYnmbppbkjjgoqtetno\ougqMKryvkbakeelxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?AB?=BEGBFCEDEEDBHHGDEKHGKMMJMLFJNHJKJIKJJIJLMNMMMKNMM[roonpplkNPQlXNibtrpamov\YlP[mmZqmkomxxtsip\`slqjUuyxoc^kfbgppjioppsspqppqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGHFEEBAB=??EGBGDIEEDBFIHHEGKJGMMNKMNGLNIMKHJMIKIJJNONNMLNML\hdu]lqWlNOQnUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ghacityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIEEDCAB<B@BFCGFKGECCHKHHFJLKFMKLRRLGMMHNJIHNHJJHHNONNLJMMJZsppoqqmlOQSoYskgooqqomt^nXat_nopoqroousttj[]tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtHKHJCEEE@@>CCAFCHIMHFCFJLIGFKMLFOJKWRKGKJJNIIJLIKJIHKMMMLIKKKSkbZi^_jcrrZ_Zko`eeUk_c[abQ`mh\j\niidZoedp]Z\k[mqcpsldgcdg``knppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFIDEDFA@AEDCGBHJLGFDGKLIEFJNKIOIL[QJFHHKMIHJJKKIHJGLKKKGHJJLLLKIKLNT[]TPUMQPNOOURPOQOOQJJNPQdqiTYV[[\UY[]X]\\cfaafbcf_^fkmhmtyrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusGCEGFFAEC?CGDEGCIKLHFDGKLHDGHPKLOKLWMIFEHIJHIKHLJIFHHJGGIEFKHIKNLIO\W^O\\`^OXYS\\b^MYZMXaRKYaZS`d]bX[ddVVX\YZX\VY\^c_daa_ehkgmttqqtpqr
}rkiorssstxyyxyxwxtqxrxsqrurtOBCDLMBCDBDIEGGFKJKHEFJJJFEHHPJLMJMRIHEAHFJIKKILJIGEJHEFGEEJGBIMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^c_Z]`c_Y_b[`^[TYXZ_^dbbacfiekrpoppnow
{
uqprrsvyyzyyxxxvryvxrqxvtvaSJJMIDBBCFGEGGIJJIIDGKJKFFIINJNLHLNGHF>GGLIKKJKKIGEIEDDEBFJD?IKHN[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_aa]^ca`bbbcceZRXVV\[^c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFCGEBEGHFGHIFGJGHFHKIKDDJJMMLLHJJHJG?GFNJKKMKKKIGHED@DAHIA>HIFO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QQ]_accccb\dcbdcfXQVUS\X[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMB@IFCFKIFFGIGGJFFFILJNEDJJLNJLIKJHIGBHHQMKKOMKKIHHED?EBHHA@FECT]Y^X_X_[]UXXP]]QKJV^X^[]VZaRR__bb``bb`cbbddbXORRS\S\^]^^__`dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHDRKFHHHDFKIMPEGIJKNLLILKIIGDHKQOMLPLLKKIICEAECHFAAFDAVUE\T^SV`XNTUNZ[MJKT`a[_X_^b]OYb\``_bcb]bbW__TPOQRYS^\\]^_`bffelfoow|{{}
zo
~INFDFFGDIRcQDW_IGGHDFMJPPFIIJKNLLKMKJJGEINQQNOOMNMNHKADACDFDBACD@LHBLLPOOMFMFFHIHGLLMOPILOPPSPLQSRUZYWYXXdVOSTPPONQUT\YY[^^aaefchdklqsszy{z~{}{
}KIEEGFGDKM^MGHYMGHJHGNLQQIKJKKNMUNOKKLGGKOSSOPONOOOHKF`ED_LDfcCL[H^[smOMVmYLCP_TlWgJ]WU^DMQULMSVQRTXWTXUT\TPfZhhdYTkTXWU[\\``abbb`gignlhrz|}~}}zr{z{
~z{KIEFFHEEKOTJKG`TGJOJIOMRQKMKLORUROOJLMGHMQ[YOPPNOPPJKQQI|YYrsWPmHqnoaVPqqtOBksnqtpSo_[nX]V\XUkhU]VcY`YZ_VUWituu_av_Yb\\f[_aaab^`bgmpl`pwtx}~vxzmv~tx~|~|z~wwMIEHMMBDLLGJLFRVLLOHLRXWQNOOLQTNOQPKKNGMPS[ZTQROPPQKIZx]TxdhYRSPvgtlpbnfkRrNLwmjrpsrqrpop]fzuxqqzq~r}ku}bRg|essoss|}p~yor_``bb[a`hknkblfgmw~~{xwtvzhr~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJQOMNJNW^YULQSNYYLSSRNLOIQRTYWWQTPPQSLHgxlcxqmZKLTypumubnvPdeIevqmwojfxxiXrRi{mijzz}lxzpgoXuujvupash}ilx|o___cb\_defijdgbcdllppstsssyqrxbltgry{sruy~svzn|}yxrnMJRtNCBEPPIKLJLQOOOMPZ`ZXKTWPa^RVQYSMPJSTUXWWPUPONSJKrouuquqdhaVnLqp^GhyWvTKhx}x`y{sna^modSgrunmypwlvstqlm\s}zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsynqpj{ztromKKZVHGEGRPKLNKLQQPPPQW\YUNVYUfXRRY^TMNJTTVWYWOSOONQIRmHiwK`dvuUWlNnl{rajgvUKWkh}lmlx`[pz{_`zscroxqhd|ir{]TKl_vukiu{{m~xk|p]^^b[^bdegeeebZccikkrsrwgmihdg`alagsrlhmmr|kmhk{tmmkmOGJKHJHHRQMOPMLSSROSRWRVTPWZVVTTTa`QONKTSSQVVOOMNOQJHQNPULKKRSRRROVUQQORRXXQNPUTXXX[[USSW[WXW[ORTWWXQ]XV]USOXRVWWXZ`[gr^[[[]]_cZ_ccefdccbZccgffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilPIKKLMKJTRMRQPLVUTPTUXUZURZ]VUTWUYXPOLNWTPNUSNPNLQPKJQQKQMJKOQTRQQSRIIMNOQRQQQTVRXW\WSSQQUUVTZQNSQWUTYVTYUSRUSTUXYX^Z_a]\[Z]]`c\]bcdgeddaY`acabhhincad^_c]Zd\bma^ffgmsdihkkeddfhQJKKNOLMTQOTQQMXWUTVXWWZVT\`VWVYUXTQPKOXSPNUQNRNLSPMNUSNQNMNQSPTQSTTNLNOQTTRRQVWUYZ[YSURTXWWY[SOSTWUTYUVYTRRWUVX\Z[`]VY_]^]\]`a^[bbchfedbX``b]`hefda^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLOTPPTQOQZYXWYZZXYV]jdVXYZWVTTOKOVTPOTPPQNMQQORXSQQOMOSUNWQTTUONNQTUUTTRTXVZ]\ZVVQRWXV[\VPSUUUVXTWWTRRXVV[_[^`_V_]^`\\``__ZbbdhhedbYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROMPSRUZUSPPLPWUQVRSSXMOPQTXUUUSUYX[^]\[VROUVU[[VQSVUVXTSXZTSQYWW]_[`_`Vb\`a]`b_\`]cachief`Zc`a__ee_`c[Z\[\ZZYYW\Z\[`^`[^^a`_c\Y`ZQNONVQPUSPUTSPW\\\Y^\_W\^jpwyc\[VVYRNOWSNQQPRTRLQTSY[WUORNSXUSRTRRZOQSSV[UVVTVZX]^\\^VSNTVV[[UQSTVXXRSY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgidg^\e`a`acd_b_YZ_[\[XXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTPZ]^]\`\`U\]hjr}slh\UYWQOR[SRQTRTUTKRVUZZZSOSQUUUSNUQRZRTUTX]WXXSX\X^]YZ]UUNVVW^ZXQUTXXXSVY\TRV]Y]]a^cc_Y`[eb_dd^^cca^efief]^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POORZP[UUWVTTT^^`_^b\`U]^bkyum}lZUZVQQT\TTTUTVYWLRZV\Z\RPUSWUUSOWQSWSWUV[]X[YUZ^X_^Y\YRWRYXY_YYSUUZYYUWY\UTZ]\^`a`ed]^]]eabfd^_dc`\gdhfdb_da_a`bb_`^WY^Z\\ZYYWV]Z]^[Z[\[WY\]VXW]SOPWYP]UVYWWUX_`aa`c]`U]^beev{hXYZTVTV\XWWVVW]XOU\Y^]]TSXRWUSRSXRSVTXXX]^X][U^_X__X\VQYUYZZaX\UVWZZZXYZZWV]^_^cbbee]b\`fbefd_`dba[fbhfcfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNSZWT\UVWYWV\`aacac__V[`da_zuohZ\ZVXVX[ZY[YXY`VOT][`a\UUYPTVTRVVRTUW[[\_^Z_\V__Z]^Y^VSYXYZ]aY^VWZ[Z[[[YZXY__``dcdeebdZbfcgfe^ab`c^cciedg_g^bbcaa`^_XTZZZ[[X\XX\[Z[WWZXW\[\`]V]]SOVZVVZVYUXWX^`badada^YYadb`kfh^\][WWYZ\\\_[Y[bVSW^]ac\SVYPVUUUVVSVTX]]_``]a]W`^[^\[^XVXX[Z__Z^XX\\]]^[Z\WZ_a^`eddfffbYcfehgd^c`_ec]fideh_g^cbcaa`__[XY[YZZXZXW[[Z[WXZTY]\Z`\U^bMRWYVWZY[\YWY^`baeada]^Yacb_a`a_]]]XW[[]]__\Z]cXYW\`cd_RYYPWVWXWVVWV]]^aba_b^Ya]]^Y]^YXUW[[`^\_YY]]^^`\ZZY[_a_bedefggbZdfgigc_c^`feZiicficf_bbca``_]]ZX[YYXXZYWZ[ZYWXVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XW[]_]`_][`d\\WZbecaR\YOXVY[YYWZZ`^abc`ac_\b]_][_^YYTX]]__^_[Z^^`bb\\W[]`bbcedgfegd]efhifcab\cg`\iichife`baca_`_]]\Y\YXWXYYW\[ZWVXPXZ]acffrkJYW][Z_]\^\Y][^_bcbaa]b[bda_cbb]\[ZWXjq`\`_]\ac_]XYcedbT_ZQYW\]\[Y[[c`ccc`bda`c^`\^__ZXV[_]\aa_][`abeb^\S\_`cddfegfefe_ffhhgdd`[fg^ahhbhhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{{{z{{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{|{{{{|{zz{zzzz{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½sqrrrqo©Á¾¾¾¾Á¢~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊroooool²ÐÌÌÌÌЪ}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxxxwwwwwwwxyyyzzzwopppppprrrrrrrwzyyzzz~|||||||zzzzzyy||}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuxvvvz{x{xwvvxyxyz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{{{{zyyyyyz{{{{||{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwww|{{|y|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwy~{y{x|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|yww{~{y{w|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx{{y|x|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyywxzyyyyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegefgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|}}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~
}}}~
~~~~~
~
~~~
~{z
~|}}}~|{|
~}~~~~~~}|~}}}
}|}~~~}|}}|z|
}}}}~~}}}}zzz~~
~~~~||~}~~}}}}~}|zzz~~}~}}~
|}}~}~~}~}~}}~~}}}|{{{zzzz~~~|~~~~~~~}|~~~~~
~|~~~~~~~~}~~~}}}}{{|zzyyy{~}~~~|~~~~}|~~~~~~~~~}||}
~~}}~~~~}}}}}|||{zzyyy}~~~~~~~~~}~}}{|~~
~}}}~~}}}}}}}}|{zyyyyy~~||
~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~
|}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
}
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}|}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}{z{{{
~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{}|zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~~~~||||||{~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}~~}}|}}}}}~|}|}|}}~|~}}}}|{{{|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~~
~~~}yzz}|yw{t{|tw}~}{{vv~
~~~~~}~~~|~~|}}|~~~~}|}}||}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz}}yxut
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyvtz
~}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~~|}}~}~~}|~~~~}}z{{||}}|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}}x~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzswvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}||}~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqxyrx
~~~~~}~|~|~}~~}}}~~~~~}}~~~|~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~}}|~~~~}|~~|}~}~~~
~}}{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqrpxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~zz|}|{}y{zzxyxy{||}|||||||}}}||}|}}~~~}|z||{}}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|{|}{}}{yy{zyxstunsqpxruz
~}~~}~~~}~}{~~{|}{z|||yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}{||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}~xwvyyz|}}|}{|}}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~}~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~{{|zzzupxwyvu|uv|
}
{~~}y|zzz}}|}z||}}|z{~~~}}||}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}}}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~||}}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uz~
}y|~{
~~~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}~}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpur~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~~}}|}~~~~~~||}~{|||{{}
~|{}~{|{}~}||~}~~|~}}~}|}||~~|}|||}|||~z{{}~
{{~}|||}}|||}}|}|~}|}}|||}}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~~~||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}~{
~~{}}}~~~}~}}{|{zyzzyzz|yzz{{{|z{{{|}~}}}}||}}|
~|~~
~}}~~~{||}}}|~~}}~{~{{zy{zyzz{yzzz{{|z{||{}~}|}||}~
~~}|}~~
~}|~~|~~|~||~}|~}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××××ÜÝÝÝÝÝÝÝÝÝÝÝÝÝÚÖ×××××××ÖÖÖÖÖ×ÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹´{sssssssssssspÀ¼½½½½½½½½½½¾´½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¥4)+++++++++++$d°©ªªªªªªªªªª¬SRSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;@C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦=.00000000000*h²«««««««««««®XWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;>@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©«£K<>>>>>>>>>>>9q´¯¯¯¯¯¯¯¯¯¯¯±¡babbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB?;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÏÎÎÎÏÏÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÊÉÊÊÊÊÊÊÉÉÉÉÉÉÍÓÓÒÒÒÒÒÒÒÒÒÓÓÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÎÏÑÎÐÔÒÏÎÐÔÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖØ×××××ר×Ö××××ÖÕÖÕÖÖÖÖÖÖÖÖ×ÖÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÎÑÁ§ÓȨÒÐÆ«ÒÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏÏÏÑÀ«°Ð³ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÏÓº¯«µÅÎÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÏÓ±¿¾ÈÆ½ÉÆÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÑÀ½ÓÎÑ ÎÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÔ£¢Ä²ÂÚ£¿ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÑÄ{ÐÇËÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÕ«¯¼ÀÏÊÛ¥³ÐÛ¢µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ
§ ¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;547<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÆÓÓÕ¥¦¤¨ ¯§¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÒÑÒר̺վÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÒÏÅÔÓ¹ÇÖÓÓ¸ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÓÔÒÒÕÔÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786967899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiihxsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptyvt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»º¹¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®xpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_MHQIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¥¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocnihb^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥©§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´´¶¼¼¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkhguZfrwsxfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijh]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬¦©»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËËÇÆÌÉÍÅÆÆÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlietnsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÆÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»»½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegcjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÂÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfcZYY\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹½ºº´¿¸µ·³¯»¼·À·½Â¿Á»¿Á¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjffiei]VUSYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»À¿·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekgXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···µº¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8=<7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·¿¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸®µµ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcgb\cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼«ª£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊĵºÀÃÈ¿¿µ¿À¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^aaNHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍÊÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶º½Á¼»¿¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼¿ÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^\YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÂû¹³´ºÁ½¿ÆÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni\_`YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀ÷·°µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_e\ZUJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁù·³²²´²¸¾¹³µ²¼¹¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvrl^b`[]OHA>=HCFMC@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÄû»¶´´°¶ºµ´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ournc\fX\]RNMA>IB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³±¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÊȾÀ¸¸¶²´¶²´¯»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFMF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±ºÃ¼ÂÊÅ¿»¿¿¹´´³°±°¹¸¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¬¯²²ºº··µµ¼³¯´«¶º¸ÀÄÁ»µ¼½·²³°¯¬®¶¶²´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥££¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGOMLBOQ@>;>49:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬ª¨µ²±°®¯²§¦°¤¯®µÁºµ·²·¶³´«²´®ª«¯°²³®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©±£¥¨ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRNJNG;E@=2?759;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¦©¤©¤¥®¥¬¬´¼·³±¯±®µ¯¯³µª§¬£ ¢¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxy`bRU_HIIKSTIRPL9>B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ ¤¨®¬««¯ª¯©¥¥¦¤¡¢¦ ¢¯«¬µ²¶¦¯³«©ª´±±°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²°´©±¯¢¡¤¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNNULRLA7=B78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=>758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¡£ £ ¢¯¯¬¯±¬¶¨®±°¨¦±®¬°§¢ ¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸¬±´¤ ¥¬¡¡¢ ¤¡ ¤¡¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HQUHFUVJBLG=KH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¡¢ ¢ ©«§¬©ª´¬«¬ÊÀ¤«¨ª¬ª¥ ¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¢¬¢©¨²©«¨§¨ª§¦ §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·£°¦£¤¥¢¤£¢ª°¬¦¨Ô´¥¬¯®©«§¡¢
¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸³»ÆÃ¼Ã¼·³©³ª³´¯³®ª®£«§¶±¬¢¯¥ £¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{trkkurphW[QETHDIOH>EA4EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ¡ ¤¥¦¥ £È´²®§¤¤£ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÃ¾ÇÆÂ·ÃÉÉÂÀž¹´¹º´»·°µ²ªº±®»·¾ººª·«ª¸º´¼®®¹£¦£¦¥¢£©¦§ª§ ¡¡¤£¤§¢}zrkdhoxjdZ[FKLEDSLDBE7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ ¢±³¨ wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÌÓÐÓÓÌÊÂÅÆÇÊÇοÈÑÌÇÅÆÄÁ»ÃÀ¾¾¾µ½³¿¿ÂÂÆÄÇÄ®¾¸²¸¼ÄÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDC@5558:B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª££¬®¦¥±ªÅÆÌÎÍ¿°Á¨¥¨¬ª¡£© ¾£©°ª£ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÒ×Ñ×ÒÔÕÓÓÈÌÇÍÍÉÒÌÎÓÌÅÇÉÊÁÅËÆÈÈž²³ÈÄËÊÊÎÅÊ¿¾¿¼ÁÇÄÌÌÈɿÿ¯³¨¢ª£¦©¬¤¥¦
zruvgcgvidVWQDMF@IQB=B<:22@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤¬§¯Ë¬¯¯¦¡¥¡}wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÒÏÑÃÐÓÖØÕÖÒËÉÎÑËÆÍÑÉÒÕÖÙÕ×ÓÖØÎÒÊÏÑÌÎÐÌÒÏ¿ÇÆÊÃÌÌËÎÏÅÆÇ¶ÀÊ¿ÑÌËÏÅÉÇ¿ÃÃÈÎÌÏÐÏÍÊÈθ·»¨¥«§£ª¥©¨¨|xsvpc`erb]R\IJFAEHI>;@8=4585;86:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´µÂű¶¨¢¥¦¡¢«µ§¯ÄÆ¥ ¯¬ ¡¢wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÐÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÇÐØ×ØÑØÒ×ÙÕÖÌÏÏÉÍÑËÎÏ¿ÅÂÇÅÎÍÑÐÑÈËÌÀÊËÅÓÎËÎÈÄÉÆÆÈÌÊÓÓÑÕÏÒÌÒÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
{zqstmacim_VP_JJBFCQM?<>54:=52855<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯®ªª«¦®¸¨«·×ÔÕÙÙÑÎÐÀ¼ÌÉ·¿¯§«©£¤±µ²£·Ë»ª«¡ ~qecb__a__a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÒÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÆÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÍÃÈÎÌÊ˿ɿÇÈÍÎÏËÐÍÎËÎÎÇÊÏÐÊÎÊÂÉÆÉÌÊËÑÒÌÓÑÑÏÐʽȹ°®»¸µª¶°¨¸³¿»±
yvopnkadnpaW\ZIFFDMWE;@<33<=87855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¥®¾´°ÀØÒ×ÚÜÖÏÍËÄÓÐÂÁ±ª®«¥²±¸ª»Î¯£k^^^adb``aa``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÕÊÀÉÁÅÌÂÈÉÂÌÃÅÈÊÊÎÊÍÌÐÍÓËÅÈÏÌÈÇÊÄÆÀÅÊËÍÏÑÆÐÎÍÍÌÏÅÇÀ·¸½Ãýù³²¾±»Ãĵª¥¢
xpqkmg``qhXXhVLFLIPPB;D>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±Ç¸ËÕÖÙÚÛØÌÍÏÈÖÕÅ÷±µª£¬¸¹¯¿Ê¡|fbbb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÏÎÌÔÊÇËÎÏÇÇÏÒËÐÏźľÆÉ½ÂÇÉÎÄÁÇÀÇÍÇÃËÊËÏÇÃÃÐÈÆÁÅÇľÀÇËËËÎÂÊËÈÇÌÐÄÅÇ»ÇÃÈÈÂÏÁ½¼¿°ÁÉǹ½ª°²§¥¢£wntdk`^fqa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥²±¬ÉÍÊÈľ½ºÍÍÇÐÕÕÙÚÛØÐÊÏÐÒÔÉĹ½¾¯§·ª½¸·Ã¬~
t`\^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÈÆÂÃÀÃÇÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÁÂËÐÄËÈ¿¹Á»Åǽ¿ÆÏËÃ¿Ã»ÉÆÈ»ÈÆÄÊÀ½ÁËÆÅľż¼¿ÃÄËÅļÀÉÂÅÇÒÄÀÈ¿ÊÉÆÇÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¤¥¬£¡¥£ {vstfiZanmZ[XQDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ËÏÑÌÇÂÃÇÍÏÏÌÕÐÖÙØÙÐÌÓÎÏÐÊ÷ÆÀµµ»°¿¶¸°z
vxurq_Z[]``bddded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ°¶º²²³²±Â¼¼¼º¸ÀÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅþ¼ÁÍÃÆ¾¾µÁ½Ãº¼Æ»Â¹³¼ÅÄÁ¶¿µµ½¿ºËüµºÈº¿½ËÃÁÅÂÅÈÆÈÆÐÆÂÌDzÇÉÃÎÍÁÅÃÀ½²·°²§¨¨¹°¥°«¬yvwjdg`hocV^YJEJFHJAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÂÄÈÎÒËÊÊÇÍÎÏÒÉÑÆÖÔÖØÎÌÐÇÌÈÊĽÉÁ±´¹¶¹´®
y~|tud\\]^``bcabeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸´·´²³´ºµ½±·°µ¯²»Â¼Áļ¿ºµ³º¾À¸Ç¹´»¶À¼¸½ÆÁûµ®²¶º¾´Ä·»µ«¸½½¿½°º¶¯¶º²Å¼¶®»¿´¶´Å½¾ÃÅÀÃÅÆÈËÅÀÆÆ»ÈË¿ÏÊÇÃÆÂöý½¶¹¾Ç¿¬µºµ·¶xtxfgebkn^V^`FKHHJFBDAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÌÎÈËÉËÊËÅÑÎÓÐÏÇÉÅÉÄÿ¼Ï¼²·»¸¶µ{y~wx}th^]]]_`_`da^cec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¸¸µ°«¬§¢ª§«¬³©«©´¶°²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°¿±½¼»¶¼Ç¹Â¶ª¨°±¿µ·¼¯°§±³´»¼«µ¥®¶®º±°ª¸°»®»¸»¿¿½¹Â¿ÇÃÅÁ¼ÆÁÈ˸ÅÇÅ¿ÆÃÃ¹ÄÆÂ»ÆÉÌ˳¹Â¼º²rvvkiablhYWW[ALKLIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÎÒËÃÆÂÅÐÇÎÂÄÇÀÆÆÄÄËÂÊËÂÃÀÆ¿¹»ºÉ¶³º»´³ª|y~z{
wo^]\]]_`^_dcbccb`_][[ZZ]ZZZZ\dnohfgiknr¹°µ®¦¥§§ ¤ ¥«®£§¢«ª¬ª°¤¦ªµ¶±½¹¯·¯¨®·´´¼¸´¼¯¸¹´±¼Á±À®¥¨¢«±²³§¼ª«¨«¬´³¥¨¡¤®©²¥§¨¥¨·¬°²·¹º»±»½¾¾Ä¿µÁÀÇÈ·¿ÀÄ·Ä¿»¿Ä¾ÄÈÌÊ¿¾ÃÀÀ©rtrji]aodWVXPHYRSKFFE>>@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·ºÄ°¶°ª©°±³µ½¯ÅÑÐÍÄȺºÌÂÌÀ¼Ê¸¿ÅÀ»Ë¹ÂÅĹ»Â¼¸¶¼Ä·´·¹¬°|~~xt|swf_]\]^_`^_ccab``_^]\ZXZ[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥¤¡£ª£¢¥¥§¥¬¤¦¬²¯¶·§°¬§ª´ª´º±¶µ¶¹±¯º¹±·¤¤¦±§«¨¹ª¤§¨¨§² §¦¤¥¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹ºÂ³À½¿µ¸»½¾¼ÂÇÄÂÿ¿Ä wpkaf_ko`UY^HNgOTGEJF<=@=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;ȵµ½¸ºÁ»½µ ¡¦º¶«³³»³ÄÐÉËÃǹ¸ÉÂÍÀ¹Ë¹¼Ç»µÇºµÂű¼Äºµ®·¾º¯±´¡}zvtomkjjqi^`]\\\^`_acb````]\[\\XYXXXVX[^_dcbegggjmo© ¡¢¡¢¦£¥¡§¢ª°±µ¢©ª©««¤´¹·°¬²µ®²µ®°ª£¢²¤¦©¸¢¦¦¨¬ª ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«²²¹²½´¶±±µ´¿¶½À½ÃÁº»½zrk_e^ddXTX]IW\KPGIIFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÈÉÁǼ¼ÅÄÏ¿»ÉººÁº´Ä·³ÀÀ²À»«¨³¸µ¦¯°¦ysnpnkb^bff\]^]]]\]_`abccba_\[[ZZYXXWWWXXXZ^bddeffhikr¨¡¡¢¨¥¦¡¥ ®®² ¥¢«¦¡´°±±¬¨¯²§º³¦¶¡¢£¡£¡©µª¢£¦¥¦£¬¡«¦£¤¦«³³ª´°²ª²¹´¯©¯²²²·³®©¬®²¸°º¶¹½¿·²±
yue^e^[YVSZUK[QLIEHKIB=?AA@A:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ·½¿¶¾¼¿²¥£¥±Âµ¶½´¸ÂÍÈÇÁƸÂÁÈÏ¸ÂÆ¿µ¼¼¶Â¹µ½¿´¹½¹¨¤¯¹¯¥¯¬}
yprtqhedhec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXXXXVWadecdeddhjv¢¡¡¡¨£©ª¦¯°«££·ª ®¨¶©¦§°£·°¤·¢ª¦¡¬¸°¢¡¤¢ ¡©©£¡£ªª°®¨´«ª¦²°¥ª®²±¯°®¯¦§§²®±´¯¼´º·®£yud^aVYWSRTKM^LPKGGLLE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸½®§§£ª»À½À¹®´¸ÂÍÉÆÃľǹÉÍ´ÃÄ𾿸¿À¹¾¿¸¸»µ¥¥®¹¤¦¢}yrjmrtphhedgb\\ZYZ\\\]^]\[\^\[\Y[[ZXVWWVWXWWWU[ccbbcbcdfj ¦¥¤¦§¥ª¯¦¢£¶¨ ¡¢¨´¡¥§¤¯¥°¬µ ©¡¢¬±±¢£¡¦¦¡¢£¥¥«¤¥°§¥£««¦¨®¯®«¨ª©³¥¦«¯´±®¼µ±¯¯ zvrda\Z]XNLRHRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»±¸¬¤§·»¼Áź±¹µÅÊËÁÄÇÇÈ·ÇÅ´ÄÁÈ®¹ºÁ»Á¿À¼º¶¸´¤¥¯³wodbgiifgigjm`]\[ZZZZ\]\[\^_\ZY[YYZ[WUXWTTWVSTRU``_`a_`acdi£ ¥¡¥¤£¢£¡ª«¥¥±© ¥«§¡¬©¨®¢¡¢£«¨°¢¡¢¤ ¡ ¡¤¦£«¥¢¤ª¤«®¥±©¦¥¦¦´¦©¨³µ´¹º¯ª¬rpo`[WVUQFQOHZ\ORITKSLEGIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´´»²°¬²§§¯¹¹³ÀȺµÀ¯ÆÉÍ»ÂËÍÈ·Ë¿³ÀÆË¯´¼ÆºÀż½µ¸³£¨®¬|ujjjlhjlmkjme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]]^^__bdm¢ §¨ª¨ª¦¨¥£¤®¤¥¯© ¯ª³¥¦££¡¨ª¡ ¡ £¢ ¢ ¢¨£¢¨« «¯¤·¥£¤¢¬ª¨«®²·²½µ³«¯ssh[XXRUREXLQ[YMUNPLPQINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³®¨³¶®©¨¯©¨¬·¶¬¼Ê»¶¿¬ÌÇÆ¹ÂÏÐȵƽ¹¾ÅË´¯»Ã»Áü¿±¶¤¨¬©wxoninnnphgigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]\\^_`d~~¢ ª©¦®ª§¯£§¬ ¤¨§®§ª¥¡§«¥ £ ¢¥¥§¨¨ ±°¦°¼§£¬´ª®§°´°¹µÀ±±«}qrbVTVNRIGVQRRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¦±·ª¦¢°«ª§©²±¤¶Æ´¹º³Ëƺ»ÂËÑ̳¸º¾ÀÄÆµ³¶¼±¹ºÂ¼¿¯±«®«¨
kgmnroqkpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv¨©¥¤ª§ ¥¢
£¢¢¤¨¡¢¢¥¤¦¨¦¡ ´²§²·¡¢·¬©¤²²¦µ»µ««±£xql]NPQLOCMNNPKFNNJJNMQIMJAGKHGC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12776:999984988A7w¶§¤¶°¤§£©¥ ©¥¤³ª¢²Ãµµ²³ÇƸ»ÄÊÍǵ¯»¿·ºÃ²±µ¡«´Á¸¹¬¨©±¬¬£{^`gsqvqjniehhj_XXXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQMMKLSWWVXXYX[]aosvq
¢¡£¤¡s}
{¢~~tz¢£ ¡££¢´¯¬¯¬¥¸¦¥°¡°®°»ª©¯ªvrbUMROPMCSNLQMBPQHINSMHJJCJLFKJ<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-11764789::65:87A7w·¢£´¨¥¦¨£¦¥¦¦¦³§¥´Á¸¯´°ÊŸºÁÏÆ¿´®¼Ã®°Æ°¬¦ª¢¬½¶®®¥ªª¨pWW`hgihincjigb\XWXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo{
syz
}xro
~¡ §¯©¨§³¢¦¬«§´¢©£}rm_[NSRVLDTJPMLFNOIELQMKOJIMPFII<7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9y· £¡¦¦ª §©§¢©°¨§´Á¹°µ°Èø´¾ÏÀº°°·Ä©È¬¦¡
¸«¥¦£¢¡gQMRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`moi{tPBA}
x`JQnx}
n~wuuwpQ|~xvhw
~¤£¨©¥£°ª¡¤¤¥ª¡©¢¦¨tle^[HQQRMIUMSILKOIHFKNLMTKQQOFHB<769:8:;;8:;8>?99>=8;<6;;478;6775344696/3/.125221/,')+*,4833979:99::::?9w¶¢§¡®¡§¨¥§¨¯ª¶¼¶¸·³Â¼·¨ºÉ¹¶¨©¶·¬µ¿ª¡¯ cMLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut|
{uxsnupty}ª
yzhv{prmxxz{vsrwguz{© ©¥§¤ ¤qg`\\JVORGKXROJMMRJJJMPHLQLRTMEHA<77;99>=:;<98@?::>=7==79937795675252572/2.,//200/-+(().1272198798775:<;7v®£¡´©¯©¥¬°±ª½´²»¸¶»µ² ·»³«ª«´²¤¢
dKIIHGFHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQRSV^u}ygw}gyvx|r|v{ok~|s{}tfv|
lohs|lyq}pmuqhq}pC
~wwz
}zu~£¢¥vmlebZWWTQJSUTOPNQVKNKNOJQNHNOKFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©±¯±«¼¸¬»¾¹³¨±§§«¦£}zx}~dJFGFA@CDILLMQRPQSUTTUVWWWXWXYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{xn|yy|
omxsxjjr}Inhx~licly
ksl|nr{hmp~s
z}~{vots
ywp|~mhmnnWUWTRQYORUUSXUMNHNJMNKCHNGE@:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¥°¢¬ª¨µ¯®¬´¿«¼Â¿¦¢¥
¢£u}|w}s|wtw{fNEGD@<>>AFFGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jsCo;<95<_IMOORWZRY\`§bitze~pmzvtlts{jkMy
g1vsl~}tfet~
filukp|gpp{n{s}|qpnum~wytiyyuiingdWQZWYY[MPUVYYNIHEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226,+5775478iO8;5n¤¨®²¦º®«²°Â±»ÃÇz
swvwuwvoxsiTFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯³ q|xm}lr
zyr txsu5q¨¡¡¢vp||shfbinrmpuioXuovl{|mqmpzsvmbv
ux~~yponj^Z\][YX`_SN[ZYXLHJEJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µ©±®Á²»ÁÆ}nv
nyz{q{t|ko^JPG>@7448;;<=>@BEILLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~mw|}
~v¢y~aªzv~s{\dqtz{wlgiaxo
znwtzpsywkni]w}|
}q|uw{}unqref_[Z]S[f^WQUX\VGJKDLG?F@DC>AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\x¦ « ±¨¯À±ºÅºz
vk~yt¢s}lzlSWL@E211267688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|q|z|~v¡¥¬©H®¯¯¨sl|}hggx~n
q
Gkwqyvhmk_v}
z{uv|wmow~rqpjZ\\[ccXge\UPPWYPDLLFOICFCCA@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¬¡¦¸¯³½³}tp}}¥yuy_cVKB60./23123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¡¥»±§»Çè¡¥{r~v
ihotqw{v
}nvug¡«¢{zzogkx}x|qic]ZY]i\`f_ZOLNXRQIPKDNGCKDCADDA<:87=<:<:88778:==8<=68656623444576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nupgx{¤¡¬¦«¯°¡xw}lpj]CA4--//./02234779;=?BDHJOQRSRSTTRPOHDB<87/9D><<63.lMPHIKKKNV`cggmu £ª¥£¬¨¶¢¨Áîǯxº|¡
¡
lpuvql
r¡¥µ©¢~kjk|~~q_\b^Yfj\kk^XKHOSQNMLFIPDDNFBCEGB>997=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªge¤~
y}
xxgMR>/..,/.-/000212457;?CFNPRTPQRSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} ¨¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÈ·ÉÑϾ pi«©
¡§¢wz~¡{v«³ }¤¢¦¶°¨lss{}zof^[_^`fc`gf\REKKPOIJLFFMCGMFFCBGDA:85<<899975658>75=84745754536958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f2A@ia^Pqu`n}aw}|ªªBD}x{
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=FGAA@8662<9;FHGIIMOQYmw£§ªµ½¸¥®¬¬§¨´¬±·²²»±³¾³Ä¬»É˸Ŀ¸¥£°²¬ª£
¦¦ ¢¦¢ª¨¤
£ ª ¤©±£§·» £°££¤¢«¯³µ¢¥ªz{~|e_f[d`]bc^ff_[ODJHTOFHLFKGEFHAKFCFFA:87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicXjpXz
v
ÚÈsV|z
qna@E64<2/110-,+-1/-4?DAMUQRTUUWUM[PGGD<>>FHCD@7;<5C;=FKIGHROPW ®£³ª²ÁÈÄ«³Å¶¬³À³¸¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´°±§¯ª¤v¤¡«±³©¨®µ»²º¬¯µ¢±¬±µ¼·µ®µ §§£¨©°²º¸¸§·©¥ ysW`bTe``b__e_[TIDELVQIJJDJHEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL[ZQbdWzuq}v~{¿»£¼´y
zyn]V@EN<6:46AB764//6CHCQ[OQUWU\WO_UIKJA@?GKFEC;>@7D7?BJJEGWTP^¥£±´Ã¶¸ÁÌʶ»Ä½³´Á·¸Âµ¿°·t±´¦ºÅ¤°Æ¹±³±´¨¤µ¶ª± ¢¢¥±¥«§¤ ¬³º¢¨²¹µ»¾Ì¿Å޽³Â·º¸¿·º·¹±¦±ª¾°½»Â¬»¨ª~ziVa_WicidU[cYVTIHGLQGDIJAHD>?BBK@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FQLALRWTYVZwjp
nzrxb¸¡£{z|}}xzueO\dGEL:Qda[^SF>;HPDZdQQYXZgZT`aMSOEA?IJHEFA@C=E6B>HGKMSZT^¯¸µº¹ÉÀ»½ÊÌ»½À»¸µ¼¼·¾µº²Æ`u²¥±«¾ª¥¨«ª¤¢²µ «¨®¥§¦¥¤¢§°³¨²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÃÀ¾½¿»¼·´°¹··ÃºÆ¾Ãɰºª¢¬¥¨¶}o]`_\U`]heRXaVRVIEFMK@>HD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPOQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@IMPRLQ]gmlq
slsrsÕÀµ }x{{yt}zlepvY]\Peeb`ed][XW\MdmURmn_o_XgeUYTJDAKKHFHHHHBI9D?HKTTV]Z\¹À¹½·ÆÀ»¹ÊË»·º¶¸¹³¸µµ®¶¶du©p^¢¡¢¤«¥¨¥¤¬¤ª°·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊ¿ÉÏ´¤»±µ°¬¹½}wi[^ZX[_XabQ[`SQKCBEFE<@F>BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;-&**(-./,@M+/54mI0Ht?>BD@CDFKODR\Yi`onlotu³¬¡¡
|s{
{ts{ylmu|iseilifjii`fihmZmt¤¼g[oh]ZYTHJNPJKQLTQHLAJGKP__bgjb·Ç°¹³»¾¶±ÄǶ°¹±°»¬³±§«·¬¶§§N §¥¡¦¬¯¨¯§³³ÓÔÔÖÑËÏÓÔÎÓÏÌÆÃÊпÊÉËÉÒÈÍÍÃÑÒ¸¯Ä¼Äº¦·»Ä¢laZ[\W_WXdYO\WNQCBIECI;AD>AH??B8;D>@I=46655;:687654/10146278875367C5B8?-0,1348=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshqoyy ª¦}
|p{r~qyulpxr{nxslipmcimpyiw}~Ë¿Âß§mcxod[a`JPRUNY^P]]NPNTQUT\nnwr®¸¬´¨°¶«½Á±«µ¦¥¹§¬®¡¬´¤±®§«¬¤§¡¬¬ÎÒÕÑÍÌÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓÖÍÒÑÅÒÖÆÁÏÈÈ鿸Ðwlc[`[U^Q\ZOOTPNH>AGBCF<AB?FE>@?:===<JA45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwmwp}~¡¡
y
{r~z
v
pwsls||w|sxqkrrioqzys{¾Ë~±vr
whaj]CZZ[WfdXekTX]]`c^cx{ª¤¤¢ ¡¨§ª±¹«¦´£¢®¢¤®¢§±¦k¢~
§°¢ ¤¤¨ÇÍÏÇÁËÐÓÑÔÒÎÓÍÆÖÓÌÔØÖÖØÕ×ÕÉÔÚÍÊØÖÑÊÄÃÌpm`^]VRWQ[OJGJIJ@;:;ECD<CD>HC?CB;;9<9GC46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu~isyr
x~xs{}w{oxpmuvx}t|ylvun}vuy{µ<AÆ¥~|jeWICecfchjdoy[_fhknin ¤¤¦²¤¥³ ¢¥¡© ¢±~
z~ª£}«³§§½ÃʶÅÍÑÐÑÏËÒËÉÔÎÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÍ´utlb[XQSPXUEFJIEE=:7:@AB:GE@EDBDA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?1*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopbqqs|~
}y
zyqz{uzzp}opzr{qnzuw}|u|°tYªÂ·pnc=^hrpqpnxweioruxr{ ª¡¬¢¦¬
}
~my{®ª¦®µ¼¨½ÆËÈÉËËÏÉÃÒÊÔ֨ר×ÔÛ×ÓÙÛÖÏÛÚÑÖÈÕÌvxfeYXNQR\GBEII>A>=8:=?;>H=@BAADA>?:87DB755479.566435532323647553457EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbfkvqy~
|}~wyn{{tz¡vvtu}toou|
zv|¸Æ¥ÃʸxpeNeczw¢yyw{|vm¦ £«
{|¡¼¡¨¥¥§µ¾À¿¸ÇÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÜÆ
xvdfb]RVUTLKDMD;==<9:<>9>A7>?@=@><9867CA6455=80665547745613854564557HH=DJE7925;H>;::7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa][htzylwvz|~}
{~
z
{u}um}}~t|}x~yot}
|~{©Ã ½¤~}rs¦
{iGq¡¤
¡~¦
¤¸¡¦ £®¶º´«¿ÅÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û·wvuhgcT^YRONHCLC==>99;:99<=6@>>==9::;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?<DRSRX^UXfmmmiqsx{{}|{}{~uzsztm~}w¡n©
z |~£¢¤¯ Wr¬[¢£¢
¤
³¡¡§±¸¬¤¼ÁÇÍÇÆÏÌÏÌÏ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÙmzrddZZVQUVC@ID??>:49:;7:;:3<<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbxlb~omwxz{}|{v
sp
{uwvt
}¦¢¦¢§r²§
£ ¢©° n·ÄȲ¢¥±d¤ÍÈ
ª¤¢
¥¨¡¢²´¥£¼Á¾ÇÅÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎp|e`[\\MISXABGD;A>837;<:8=64::<:72?9929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcGv}|m~xz~{vv|mnz|xx|~£³§£ª³¢§¥¤®¢¸³¡¡¥°£¤§¨¬¯¤¡À£É¹«£¦²
¨¢
u²¤¡} ±®¢¤·¾´ÅÇĽÃÿÆÍÊÉÒ¦ÎÍÓÒÑÖØÓÐØºpwsZ^S^TOHIMEBCD5>:77:?<<7=43669774=5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGN[\YJf`;Hzzn
z|y~px|~}orz~|x§»¬¨²½¯¥³³¨£¡°¬µ¢¸¥¤©¸§¥£©©£®°ª»»®Ê¡j¶¸«°£¬½£^ª²|}´«¡¡ ¥¯¨¡¥³¸«ÂÈĵº½»ÅÇÇÂÑ ÆÉÍÍÅ×ÖÑËÓ nxfZXQ\PNEC><CAB8?885?G=<6<35345454B39:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdGb`bpJ?~s}um|}}pww{ªÂÀ¯½Æ»³´À¼´«³¶¨³½«»¤¨¹¸«§¦¢¢¤¢©¯²±«¤¢¦¥¤º¯©À¼²¹¥¤¨~¼°z¨±¬ ¤¬¡¡§¦¤¢¤°³§ÁÆÃ¯°º¶ÅÄ¿ͦÇÄÇüÖÑÍÄÊrp_YW]YLJAK@FG>A?B;:5>A==5<6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GD?CF\eG`igZ]\{uo~{q~{z§³ÆÉ¿ÂÌÂùǼ»¯«¹»³·º²À®¥Á¤«°¼½«®«££§«®´°ª ª¡°µ§£ºº¶Á¼¬©²¥¤¨
©Ääz¢¦ ®ª¡ ² ¤ ¥£¦¦¤¯®¥ÀÄµÉ¾¶Ï²Ä¿Ä¼³ÑÊÈ´rvjYVYhPLHBLKKJAA=CD<5AD;;3=8B332262A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeYNe\fTcjyr|xz¡¨º½ÇÈÉÁÒÉÊÂͽ³¼¾¨º¿½»Ã·¬Â©¬³¼¾ª°ª¤¥¤¬®³¶µ ¯¥¢£³½©¨½Á¤¶·°¬±¬©§¥¥vy
££ª¥|¢¡µ¥¥£¢¥¦¤£©§¢²¬¨¼Àᥲ·Ì¿¹¯Ä³»¾Á¸¬ÂÃÂÀjw`VUZYIJLIFDDHCBADL:4DH9;4<7E.12352B25SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>jH_XaZddV x
¡®¦¤Â½ÇÃÇÅÓÍÎÍ˼·°¹¼´½Ë¼ÃÁ¶·¼³¿º¼®¯¨ ©¨¶®©²·¢§¡«·¸ª¥¯¿Å±½¹´¨ªµ´®¯¥¬¨ ²Å§}}ª¥¡£¢Z¤e£³¥¡¬¬©§¦ ¤¨¥¶«ªº»Ã´¥³µËÀ¸ª¶¬²»¹®¨¸º½¸ilXUSSMDJRMK?AHEDHHH95EM;>8=@J.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;=@BFBpEiIRebLF¥¢©¦¢¯¾¯¡Æ¼ÄÄÆÆÎÎÎÒʾ»¶±º»»¾ÏµÃ½¸¹·²±µ³¸³«¦«¬¹ª©¨¯¯£¯¤§¤¥µÀ°¬¬´¾ÃºÀº´¨¹µ¹³¯¥®®¤¡tÁ}±¥£ ©¡ `J¥U°¯¤¯®«¥ ¥ §¢´©ª³»»»ª°²Ç¿¹¦««²²£¡²²´¤nkcZXMOJDOOPQ;HKIGICC>:KT?A:=EM07544:B44MWO<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯¨
¡£¤µÈµ©Æ¹ÂÃÇÊÉÈÌÍÆ¾º³®¹¹ÁÁ̵ǺÁ¹µº°¯¯³µ§¤ª´µª©¦¬¤®¥¤¨¬º¿¨¬¶·¾Â¿¾¹´³Ä²¹½¬£¯µ¬¹¦¦v¿®¡ ¡¨§ª¡§nv£¢®²¢ª¨ªª££¤¨¢±§©«¹¶½³²®¾¹· £§¨¥¦©©`c^^PIKFGMIVL=MENKLBCD<QV=AABDO18=77?B75TWN?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUHe^HE«¡»¯««¢¤££¶Æ¾´ÀºÂÂÇÈÅÂÍÈÁ¾¹²¯¸´ÁÂʵŲÁ¼µºª©°££ª´»¦©¦«ª©¯§£ª«¾¼¨½´¸¾Ç¼·¶¸Á²¾Á´©µ·«¾¥¢¢¼ ·©¥¢¡¨¤³¡¦¨©¤¡¢ µ¯¥¤¯««ª££¨©¤¡¡³´ºµ¨µ²³¢¥ª¡u^Z]\IGEFLPHMEGGCSLJBEGAVRDH=AGQ1;B7:BF79\YKALPTUSMWRNUJE@JJNO9C@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19f\FCCpbGE§¤Ã¥©ª§¦¬¢«¶Ä¼¾·ÁÂÀÇÃ¿ÍÆ»½¹²°¸³¿Ãȵ¿°¼·¹·¥¤«¬¡¡ªªÅ¢¤©«¦¬¯«¢©¨¿¸§¾±¸¶Ç¶µ¹¸À²¿Â·µ³´¯¾££® ¡£¥££½¤©¨« ¥½¢£¢©«¡¤ µ¬¥±§¯¦ª ¥¤«±µ±ª¥ª¬ ¨f`X_\NHGJMKHEDIA>QIA<GIH[ROK=HOU4BF9>HG5CaZKCNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA46@9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ:mRF<KxeaVK¢£Å¬¡¬® £¥¦ª¬¶±£ª³¶ÄĽ¿µ¿Â»È¾Êǵ¸µ´°³´·ÁŶ¾±¸µ¸´¦¬ª¬¥¤Á¤ª ¤©¯¢¦¨½µ¥±½¹¶¶Ä²´¸º¿³ÄÁ¸¸®³µµ£¥¡® ¢¨¨«£Â¬©¬¦ ½¡¤««¬¦¢W¥¡ ¸ª¦µ£± ®¢£¦®²«©¡¡¥¥¤_bXb_KHJJNEEAGK>=JB99JJN]QQI=LV\9FI=DMI8Hb[LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrGE6=ue\KN¡Ã¨¥¢´¢²§«¥ £©¬»°¨¬¶±ÈÅÁ²ÂýÆÃ¼Äɼ¯°¶°´¯¾Ä´¹±°¹´¬¨°©ª¥¡¨Á¬¬°ª£®±©¤¨½¶§·»¾¯·Ä´³ÃÀ³Ç´»·«³¶ª¢¦¤¬¢¨«°¯¯»²¦ ©¨¢¤¸ ¡£¯¯¬¥§¡¢§³¦¦³£®¬¡¡¦¬¯¥¦¡
_dZfdJIKJRBC@IH;;G?99OMU^RSJ>O^]=HPBLLI9Nc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<35-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 餪³¡¤´ª³¬§¢¤²¬®©»±°µ´ÆÀÄõÀĽÉĵ¿ÈÁ´«µ¨°¸¬¿Ã³·®¬¶¹¥ª²«ª¦»´§° ®´²§«¹³¨º´¸²¹Àª·²Ä¾µÆ¨¿¯¶µ©§¬¡¦¥¢¢¥¯¸®²µ¶ ¨¤¤ ·¢¤¥¯±²§ª¦¢¨ ¡®²¢¦®¤ª¤
¨©ª¡§
wbg\jiMOMNT=CANC::I?77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914802-/.<6-#Bqgsk23/1[bZ33806p[bH05IphVCWFyfC;¤£¢¦¿§¨¯°¡©µ«º±«£ª´¶±°¹·°·¸¸Ä½Ãǽ¼ÄÁÆÀ¸ÀÅÀ¹©¶¤¬»À··©¬±º¡±²¥§ª¹©¦°« °´³ª©¶¶¼³³¹·¬¹°Ã»¾¿¦Ã«°·®©««§«¡¢¡¡±¯³¬°¹© ¦¡¶©¥£¢°±´¬³¨¬ ¥¢£³°¥¨¢¨¨¦£}
igk`lmWPQZUABET@;;HA7:XPd^PVWEY_]MLRN^KJ>Zc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251.-.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=¨¢ª½¢«°«£±¸ª¥¶´¬ µ½®³¸»º½¶¶À¿ÈĹÄÂÀÀ¸Ä½Á·¯µ§«·±¼¾¾´¨®±¶«¨®¦¨§»¤¬³¬¢±°³¬ª¶´µ¾®°±µ¬°´²Á»Å·«½¯±¸¬ª£±¦¥ª¤³ª³«ª³§ ¦¥´®§¡®±§´²ª¤¨£¡¨µ©«¦¥¢
{dkqgoq^FYfVDBMXDZ9HB6>\Qh\NY]G[^]NMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8)C3YT\gK6zfL@¤¡¤¬¶¥ª¦¯®·ª¯µ»§¦±·Å·±·½Áµ´ºÄ¾ÌƹÂÀ¹¾¹Ã·À¹±´¬©º¶º¹¾´©°µ§«ª¬«««¾¬®²£«°³®®¶²¹¸ª®®±¨µ¯´¼½Ê³ª¶µ±´¯®§¡³ ¨ ¦²¢ ¥¯¡¤£¦¨³©¡¦³¬ª¶¥¯±µ¯¤§«·¢¡«¥¢¡ y
{jmwmu{`E`kYIHZZ={JFD6AbTi[M\aJ[]ZRRRbaLKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T`U`/5(C_Q\.+B/JGP[H3cYUKD¡±¨±ª¦¤¯®¶©·µº¤¬´·É»´ºº¿¿´³·ÃÀÌȼü¶½¿¿·¾¼±¼¦º¹·¶Â¶ª¬°·§®«¨£°ª¯»¤±³§¨£²´±²±µ±¸³©®«²§·¯¶´Äƶ©¶¶¬°©§£¶ §±¡¤±§ ª©¢¦¦¥¸§£²µ¬¨²§®±¶¬¥ ¬¨©¸¢¥ §£ u{lovt{~\Kem\JNc\?b{GI8GgWe\L^bMXYWTWTi]OOHa]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANHf27'GbLV%-B-=ELQ<3rkICC¥®¥¯«¨¥±³´«·²· «µ¹É¹®À»Â¸³±µÂÃÎÅÀÁ½´½¿¿º¾¼²Ä§©¹¯¶¶¿¼®ª²± §±¦¥¯¥²µ¬«±²ª©´»¬µ³µ´¬ª«¨¬©¹²±ÈÀ¸¥º°©¬¬¥¨®°¦¥£¯¤©¯££¢£¬£ ¢ª¦¦¹¤¬µ¶¥«¬¨¯¶®££©ª ¤³¡ §v}
|{{prq}||\Sdn^NYf\FD[G;NmXb[L`bNVVUWTYg]QRLcZZTKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/,1()+,-*&5*/&0)38:1&*3Bc:6*HeHJ+:H?3BHS,>k;GHª«¢ª±¤©¥³´±µµ²²¢«®½Ìº®ÀºÇ±´´ÂÃÑÅÆ¾À²¾Á»¾·»Ä§¬·«²·»¿¯«±¬£§ª¨¤°¤ª²ª¯¬°¯°®«³¼§·±²©³©«¥¥£º¬ª²Ãº¶»©©§¬©¨²¥©¤£®ª¨¢£¥¬¢§©¢¦¤«¸²²¡©¢ ¬¯±¬ §¨©¤ ¦¤~~
|w~
rqpuk_Z`nbQsq\K;|E?WtXaZNc[NVVUWQ\b_SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1<]J0.JgDF8<B05EKX1@Z>LE¨¢«³ªª°¶¹¶¯«¦«ª½É»°½·Â¯±¬³ÄÃÎÏþ¿´ÀÂú¿³Èë®·²¸¾¾²¬«¤§ª°©§¨±¥´®ª°®²±´¬´¼¤·³¬¬®§«£°·«ª»·¥·¶¤©§««ª¡©§¦±²¤§¥¡¡¬ª¡ ¦¤¢«¤£§±¸®®£¦¢ª«®©¢¥¤¤
££|zt|ru¤xj^`nfWecN?gLEbyWbYReTMVUUTO\]aUKMhVUWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06WZ.0JgAA<<B+:JO^4D>HFD°¥£«±«ª¶¬¶²¬¦¬ª©¼ÀÀ¸¸³»µ¦²¯ÄÉËÑ¿À»¹¿¾Á¸Á¹Àıµ±³º¿½²°¬ª«§¶ª¦¯ª¹°¨±²®²·ª··§´·«¬¤©ª£³³¨¨¤´µ ·® ª¨ª¨«§ «¬©¹¶©ª©©¢ª ª¡ ¤¢¦£ª§´¯¨¦ª¢£¥§§ª£¤£ ~
¢t~xt~yv~oqggpw\askO^VHmxUdVQcOMUTTPOX[bUHPiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Ji5OD;±¡¦«®¬¥°´µ°¬¦°ª©º¾»À°®¹®¡·¯ÈÇÈÑÀ¾½»¼Â½ºÃÀ¾¿®²²±µ¼ºÁ±±²«³¨¤µ¨¥³³¹±£®·²°²»«º¯ª®¶¬ªª¬£ ¶¨¡°³¢µª¨§©£ª¡¢¬¨½¯¬®¬¢¨¨¬°¡¢ §§§ª±ª£ ¢¡£££§©¥}£
xt|uxyzssyg¤ui^djtg}SXp^JwsSdTQ^MMRZfNLVYdXFSiRQ?CNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[*HM9UA4²¡¤¦¬¤§¤§µ³±«¥°§ª¸¾À¼¯§¹ª¦¯°ÉÇÈѼ¿¾¹¾¿¼ÉºÀ¸°¯´±º»·À²³º¬¸¬¢´§§¬²¶¹³¨¨½¶®¶¾°½§¬µ¬©¯¤ ¥«§«³¥´¨ª§©£©¤©¨©½¬´¯ª¤ ®³£¤¥¥¤©«¦ª¢¡¥©©
~
~}
¡~r{z~|hx|ztop{gxdagaqzmgx]]U@VzlTbPQXKLNru]HZ[gYEUfPD>JNDCA9HGKS?jbJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GjI14X=fcAJ7GS`U*=9DW>*² ©¦¥¡«¥¸³³¦ª±§¸Á½µ¯¢¸¨¨°ÂÉÉÌÁ¶½Àµ·¿¹ÈµÂµ³²µ²¼·¹½µ¹µ¿ ³§««°µ¸µ¬¾½ª³Á´¼¡¯³µª«°£¥¨ª£¥±§° «©§¡©¤¨¡»¨®° «£¤¯¦¡£¤ª£¥¤¢¦¬{{~¢|yl~vyxc{zqooqvgsjgdg_lrlaio`o>ZxkU^OPQJIMTYWM]^lWDX`O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>*49&'.34.0+/4&,:$41AhY13S=e_DL6KVdO*;2NX=# §¤£¨¤¸°¯£¯°ª«¸Á¹³¸¯«¨´ºÈËÈ¿¶Â¾°´½·Ä¶Ã±®¹²³¿´º½·¨¹·½ª£´¨©ª±®º±ª¼½¥°Áµ¶¢¯·µ¦§§±³ ¤¥§¡¥¬¨© ª®¦ ¦£© ±¹£°¯¡¬¡¤¦¦©¤©¦ ©¡ª}~}| x
}
{sp}qtt`yxhnppnh}qc{mieb^d
~_ZrjqKJ~hXZNPLJHPRPIO\_nSDXZRhOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-C*,4;NN@;73-.+-7**<%53<fd24M?e]FO=QZgH*>/XV5(§¬ ¡¤¢¸«²¥´´ª©¹Ãµ³·®°µÆÈÁ·¾Á¹±´¼¶¿»¾¯ª½°³¾°¼Â¹¨»º·¦§µ¨¨«±³±¨¾·¦¼·²±¸°¨¥§¯±¡¤ ¤¤ ¯§¡£¨¯¡¢¤¤¢·°¡¦°«¬£¯ª¤¨¥¦«¦¢¨¢
z~zx
~yzprwoot_ywdklkhgmerkkehYas^ZkuiYG|][XONJHHRUF2:^^lPDXVYeLHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84GBg[HTCT]hE.;1^S,2£¢©¦¡£¡¸ª°¡»¹¦¬½Ä³°®¢µ¯¯´ÄĽ³¾º·±³¹¸º¸º®¿³´¸¯¿Á·¬½º´¥¢³«¨ª³¬®²£Â¶¦©··«²»©¦¥¨¯«£§¥¦¡³¦¥©©¡ ¥¤¹¨¤§¦¥¡¨©¡¡¡¡ ¢«¢£§¤y|
}x
{w~{lurmlsbyuhgigemgghdfhi^fbifZezb`QsT[[SKIGIOS@!+i^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB377aM'2¤¤¥¦¤µ¨ªº·§¬ÃÀ·¯¬¡µ®§®¯·ÁÀ½±Á·°¯²¶µ¸·µ¬ª¼´¯²°½À·®¼¼±¤¶¬¦¦µ©«¯¡ Ĭª§±´«¬´º¨©«±¥ª¨¥¦®£¤ª¡¢ §¶¦¯©¡¡¡ ¦¢ ¦¢§ x
w{~{s}gypkjlguskbgdbtadefeiibgoY^X]lc`MgWZ`VIGHKLRX>9`liGBUS\[IHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=++,0A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3@cF%5¤ ® ¥´²£²¾·¡±Å»¹°±£¶¬«®©¹¾¼»À²¯¯®¶¯³¹²§«¹±¯®³¶»¶°¹¾¬¥µ« ¡±¥«¯¥Å¡³¥¯²°·µ¬®¬®¢§ª¥§¦ ¤£© °¦¹§®¢¡£¥¡¨©§§{t
|
ofynhkjgqrk[hcar`dgjnkfjfdl\lmvq`SbhceZIFLMOXQPUaeT@VSYUFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24:5#3*)6.55465Z|]1:Kj[M[KXdc@A1HcB'4¢±¡©²°¹À¶ ³Á»½¹±¦¶°©®¥·¹·¸¬»¯««·ª´¹¥²µ±¯©±¶¶±³¶»§©¶©ª£ª«Ã¯¥¯±¶µ¬¬±¯ª¢¤¬©§¤©£¥ £«ª©º§¤ ¡k¢q¤v«¨¡x
mi~wrl}o]d`gkuwfhvifX]itnNPjcfqf^dfnki]]^
hOKC7DTg]JHPPUUKHS`oteE[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl15Ok[N\K[fb>G1Oa<+/¤± ª«£½Å¯©·Â¸½¼§¶±¦«¤¸´²³°¹®ª§¬´¥°µ¢§¸¶µ¨§¬¶³®´®³¢©´«¢¥§¨¯¾¨§°´¸®¤¨ª«¦¡¡¨¨¡¦¦§¨ ¨ª£´¯£¢££¡¡¡¥§¬rx uif~sy o~|¡ {tvlnied{mrbTmcmiqXipnW]i[kjZpmyrhY^FM>F^MERVVQPRWTg]LYKRROEGG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I9/01.*/(-4583%&2115>1<8Xt15Rk[N\L[g_=K1U_70(¦¬«ª¨ª¿Ã®²º¼·À¿ª¤·±ª¬¦³µ®¯³¶«©¥±¥µ³¬µ¶´¦§¨³±²¨®ª¡³© ¤¤¢¤°·¥¦§·½¦¬§©ª«§¦¢ ¨¤§£¤¥ª£¤¦¦¡¶¤£ ¤®©£±¤yÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«°yhlX±®oei¼¼nhzmpØ~Skb¶²~qu¡ªVNWaOVNFT[XQPR\W[P@\EQNDFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww11Tk\O[M^g\>L1Z\41!¦§ª¥²©±Â½²µ¿µ¸¿Â«¦´©¨¯´ª¯¶´¨¨¦¶¥¨¹¯²²¶ª¥¤§²¯±¦«§¤²¤¢¡¡ ±®£ ´º¢ª¨ ¬¤¢¢ª © ¨¨§¢§£¡°££
°kjª~g
eq§q®¡¤~wº|k¡v±_j´[¥e`fzfixj©e¾rg¦v±j|±xucmm§n\ EigEu`}f{£¦Y_«ixzj¨8J¯[WSlcZLOX_\WV;NOVV/ITSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3..53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5^X31¢§¥£¤ª±·´½¾°¶Å²¸ºÃ§©°¬¯©©±¯¤±º°¤¥¯³£©¹©³²°£¥¡ª°¬¯¦¨£¢±£°¨¢ ´³¡ª¡¬¬ £ª¥¡¡§¤£¡ ¬¥¦ ¡µµy
©µw³·«~k¦z
w«gj±[¬{tpx
°vwqkjl|O¥XHcc~ch¥_yquR^P©mcq}a/R¢n[Skg_LK\cX\ZB>°wWXA#MhFBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFB@AD<FD;0201;F,0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_fW7J9aU50³¦¦¡®©¨³¬ª»¶Â°¼Â¸·Â«¬¯®§®³ª¢¯¼«¢§µ£«¶¥¥²³¨£¡§ª²¨°¨¦ ° ¯£¤¨µ®¡¨©§© ¦©£ £¥££«¥¢ Õ¹q°ÂÆ|Ö»|¦¤z¢¥z¬yU¯{~j¹Z¹w
}¦|zªy{±mt»
nP¯§ÅQ zc`ªbsrl_Sµ´È
|c¤3Bu]PjhdP@XfYdaJHMkJZSOYfZCC?E?0<<59;74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[J[P_fT7G:aP72%¢±¨©¥³ª¥´§¤¼·Á±ºÀ²¶µ½´¶§²±£±³¦ ¯¶©¨º®£°²¡²´±¡¤§©±©´©¥¬¢¬©°¨£¬¢§¡¦¢¢¡£¡¢¢§ ¦¡¦ ²nhµq«p¦r´ts¶{¥¢~¤~°uÒÑu[®|
¤nª¦k
}}{±sx³et
nfRÉZÂ\yb__vsb^YÊo¿uMKµSUÆdTQjceXAOj_liPUFI9=WR[VYHB?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\ANT_eP5G=aM62.¢¥¯¬¥©º¬¦µ¥§¶»¼²»¿¸·µ»»´¦µ´¢²²£ ¬°¥§º®¤²±´¸ª ¥¡ª¤²¨¬ª¤©£ª¡§«°¥¡¬¥¡¤§ §§¢£®¡¢¥¢
¬{w¨v£©o§¢¢~®
³\r³R®}£~q×}w~w¯w´ael[°WKuyf`^vwgj]¯wxl5yÈ®²_BTo]g`EPl_pmVUM.ebhSYP;AD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GC`I:77 ¸±³Á¬¨²§ª²º¸´¹¾¹¸³¶¾¶¦¸´ µ ©¬ §¶¬¨±±«´¤© ¨¢µ§¦ª£¥¢£¦§¯¥ ©¢¢©¦¡¦©¤¡ ¡ ¦©}}¥y¡ªp¦ ¢£ª{yo±Z¨ xtØvt§¤|{²^d }m\«\[hgªcr{jq]«Z kneOJC¡\ZMt]bfMZa_rt_JU5JXHE=HFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<OedA&Uf[?1T_bL7FI_C1=7¢¿¬³Â®«¨¦´°¸±¶¿¹º³²¸¼ª»µ ±¥¦§§ª±©°ª¶ª¯¡¡ ¦¤¤º¢£«¡£ ©°¯¦§¦¤¨¬¨©¨ ¤£¡¡¡ ¡«®nr´t©w¦s´yt´¥£¤u¸n{¢kk¶Z¡eh ¢§mr´t²j
ju´af¢nk\`N¡|Rs£ly~np\¯V<wfTon.[§ObRkeblZb\`p|cSYQ>>mo2BB@?M9!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U^aL5FM^91A8¥º¢±¿®««§·©¸¯µÁµ½²°»¸«Á¶ª«¡§¤¢««§¶£³¨®ª¡¨ ¥«¹£¥£¡«¶¯¦¬©¦¥£«²¤ ¨«°¡¢¢ ¡©ªÓ»t±ÄÃ~Õ¸y§y¢¶t}wv²`ºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¢~t«}¾ns¼t²uxmqm¤t½]w}[ay¼jZV[iz^iadfbmyoY[YCA@r?CG+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,;:08LXaF'TcX</T^`K5;L[-6@9§¢¼¢±Â¯©ª¬±¨¹¯·Å±»³¯¼°®Á²¦£¤¡ª¥ª²¤µ§¤ «§¬¹£¡¦ £¯¹°«£§§¥¤ ¨«©¤²¢¤§¢¡¤° ©
¶¸xµwnlnsoyrÁ»¼z²¨pt¹{{|¤»¹½uy³£tvut°ufi¶trpw¶^y}gymyb¬pt
X[§iDdYTf_c]cQffqmuBMOLD;ZL?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿¦³Â³«ª¨¬«ª»¯±Æ¯µ´¯¸§µ¹®«¤¢§ ¬¤®ª¦¶¨¨ £¬¤¾§¡ª¢¡¨¡²µ¶¬£¤¢¦¥«©¥¦¡©§¦£¨¡¬¢°©§¢k~i¨ys~uze{¾¿Àºnq
_rjZ]adk`cmvbke^_bqhr|fj~qty~}b[xthP\n|{jXlyrIJo
pNsMDV\faL[Wfc^OZmvjrRODEM<HI<L>2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5DFUEJOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR_I'S_V4)P^L(3>[O'?2>¨¨¡Á¤´¹¶£¬¦®§¨µ²¬È¬°´¶¤¾±³§¡¤ª£¬§®¤¥µª¤¢¦©¾¨¨¥ ¥©§°²¾¬§§¢ª¨¤¬££§¬¡ª¢®¦ ±¥¢¨£¥§£hn}qv´©
¡z¤
li{}urxyvu{jstudw}vkpzl_b[ogLXYej_WYpzomfSOFR9OZNRO(+;JB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¢¿¢£±±· ©¦³§¥°µªÉ«²¦µ¦À¨´¡¥¦¥ «§£¤·¬ ª¦Á«¤¢£¨¨§²Ã¯«ª©«¡¡¢¥¯¥¡¤¨«¦¡°¡¢§¡£¤¡{©¨
{
£~e¡³®w{~wyzogykuyrisyujtcxf_hdcdfjXk{qjk\SLPD_UF@??,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_^]]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@³ ¹¯¾¬«±² ª¦²¢¬³°Æ°«¤³¯¼¤´ §¢¡¨¦©¦¤¦³µ°¦®¾ «¢¡©
©¬¢´Ç³©¤ª§© ¥« ª®¨¤£«¡¬ ¤°¤¨¥©f|e~cxlhjz£«kd~g
eeihz¡jg¢wkj¢rknzyXe]
^lv[hswwnxxsmysw{i
X]jsd]sik|qmc]QNWIdX@J3=F7?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]^_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[I.6ZO6)EY/DO1YB;?.=¥º¼¹¯¬²°«¥¨®°§®°½±ª¨¥°° ¤¢§¬¬£¦¨©³®££°¦¶¹¥®£¡ ¦{¥¬¢¨³Ã·¥¢§¯££¤ª¨¡ ª¯©©£ª§¦§ ¬¡¥±¤«¡¥«~¾r´r
hw¹Ä¸q¡£{¦sª|ËÀÀ»q£|À½ÁÀ{z¿}k¥²ooÊzwvyyq{px
ylube^xc^eb^thmdbXLVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__`_^^^^___]\SMPGUNA@?=6468266*&%#)*&.+*)109*#>H[L*#CP/#F[3PY/UAB;/8¢¸Ã´°¯¿©©£¯©°¯¦²µ¯ª¦§¥±« «¢ ª§¢«¢¥¨¥¥´¤£¦®¬¸´§¯¢¥ ¡ ¦ª¤«¿¿±¡©®©¢£¤ª£ ¡¬®§«¦£¡¥¤¤¨¤©ª«¢¦¢¤Îyz¥z_]¨ ¡|§t«¯^d©z¨
t³c« ³j®s|¸aY£Ínu{Û{q~ue{vvl}n}
}k_pjof`_xd[qhjcf`RTSW^JOC5AHED8>6;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__]ZWOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\:L-!P@F4.1Á¿¿´´°·£ª©´«¦²¬¬¤¬¦°ª¡§¦¢¯¡¨§£¥¡°¬¦®°«¨¬ ¥¤§££«°¨¿Æ³¨©±®¢¡ªª¡®®¦©¨¥¥£¡ª¬³¥¢ªª¤§§¢±¢§¡ p
u¨q°|r¬} ¥w«}r~«v{|~ª¡}«zzVÄzoÁ}mupmfweoawnrnldmsuo`fmd_ohjnfcWS\`ZRRC8II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1-+¯ÓÅÆ²³ ££¢¢®¶¯©±§¨ª¨®««¦¢££¦«¢¦ ©¨£°¨§¯¬¨§©£¢¡¬¦£¯¬£¬µ©¹Í²¦®¬¢®¬¡ª±§©©©§£¡ª¯±¢¨¬¯¦¦«ª«²¤¤¦
¤j¤uz©uz²q¥p¤_`R«®u®§z
{f£¤£}©~®^{¨U¢z£|ïÅs¯´³¹qb©¯Âthlnlxxwnkfddqpf{ic\V_iXXTLLQLCCAB;CA@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ('"+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÕÀ¡«¨¡¯¢°µ°¯©£¨§ª««©¤¦¥¦§¦¤¬¢¬¡£¯£ª¤¶°® ©¦£¢§ ¦±¦£¨±¬¶È²µ©¬ª¢ ¥´¡§«©¢ª§¡¡©¡³¢ª³²¢ª¨°°·¥¤¨|ªlu«y|°n¤Ò·´¸É²^_©¤ zxªÉs£§¨~ÆÆwe¡¥s}¯^oµc±uK£m§Gd{o}nyt|zm[ejrqfj^aXcm\^YILLKEDBB=A<B?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4NTQ;<F2,$¨¤Àƹ©²®¬¥¢²¹¬ª¡¦¨¦ª¬©¦ ¦¤«£®«¦¡¬©¥¦µ¢¨«¶²¬¦ ¥¦¢ ª¦¡¢§©°´Â±²ª¨¥¢¤¯¦¡¥¥©®¬¦¥«£¶¬ ±¹°¯¨´´´¦©¤¡Nxz£|¤¦¸{|y¹ÌÆÃ¶w¡~v¤¤§~¯¬}a¥l£p
}r¬`¤rq`¼}RUu£{|ryr}p\lnwrjnZc_hnbd]LLQSAHGFI99K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,- ©¬¤«¹«¯ ¡¬³´¦¡¥¯®®©¦¥¥£§ ²®¢©§² ©¤£µ££¢ªµ¹¤££¡²¦¤ ¢¯£¨¢µ±Ã±ªª§£¤¥¥£§¡¬£¥®¥»¬¡··®µ³¹²´¨±¢¥ÑµÃ·y
¦x¢w
¥q«
´nri£|s®¥¢¦mp²\¥szl{~n©a¢qqbs²¸hw¤}v{xlhwixsn~t\ddmmeh`JZWX<HF?T3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH#)%r¿¿¼»µ¨¤¶¡££©§®©«¥¡¦¡ µ§¢©§°£«£¤£ª´´¤¦©® ¦£§µ ª£µ«Â¯©«©¢¢ ¦£¦£¥©¦¬¡¤¬¦½¬¾°£°´»¬µ¨ª³¥©{¨}|°w¤¥m²o {¡¨¬
®
¨¡¢
{~«ªw y¯]£|¦§d|tk®]¥kq
]`[ m¥xy~jl}b}tmy_gepogghBY_[=JS2T8BBC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI7052.*,ATVVVTTUUUUTTUTSSVWWXVUVQHFIJ#((¼©ÆÃ¶Á´ ®¸¥£¤£ ¯®©£¹ ¢« ¯ª®¡ª©¥®°¬¦ ¨¢¡¥¡¤¨¥¶¨¿®¤©£¦¤££§ªª¡¢©¨½¤Ã¬«£¢¬³»¬¯¨¢µ±ª¬v¯~
}ºd°e}¡§¬°
¦£¡¢
[lj³`{z±lgm±Z}´[¤kÈ¢e{¼YvµZ²}R¯z¬X¡m§yw|cs|axs|`ifpmfeeOUc\AT^=H(>9=4!!,$2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò´±·½»´Á³£¦¥¶© ³±¨¢´ ³¨ª«°¬®¨¢¯¬¨§£¨®©¡¥£¢¥¢©²¨¼¯¥¨|¡ ¨§¬¥£¤¢¤©º Ƨ¥©¡¬µ·®¯¨¡½¯®®©£®¤¸Ãº§¬¯§¥«~սªb¤¿½}~£×º·µ
½¾j£o«nz²±Çk«°½¬xw¢¾»t¥wxa|ycgx{`kejibPb[Si\@T`BL)<:5/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´±¿º²½³¢®¦¥³¦¥¿©¶°§¡¿¦¦±±¹¨®¥§¯¬®¦£¬¡¥ª £¦§ ¨¢ ¬¬©¸§£{¦¨¨§©¦¡¢«º©Å£¡°¤«´µ«±«¢½ª°°tvª¤·
epg¬now¤ u°pr¨£®¤rlmlexnmqzipifqhi
gpd]cioY]g~x¦`brofd¡z
tdwgjx~xdlcelbKeWJkY:PdDP'J:+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´©º¹²³ª©¢®¤³ª½±Ãǽ´©¿«¬£ ¦«º£¤¬¥ª
¥ª¢¤£ ¥§©£ª ¥¦§¯¹ª«{¦¦§¢¯¦¢¬¹°Â¨¤´¦¬±²«¯©º¥°¹¡©¥µ¢©ª³£¬¡´£¡¡¢¡¤¡¬§¤~gtvtq§m|
pgvnwu|yikddocU`X@iZGb`NX+E=+&!640/!%2(*799469;>?ABDFJKKMPPQWUVY^_ac]^TQJEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¤µ·®®¢°¤ ¶±ªÄ»Ä¹·©¡¥¥°¨£¶§©µ¦§¬£§¬£¡¨£¨©¦¡£§¡´¹§ª|¡¤§µ£¦«·¨¯Â¯¤¸§°¯±®ª«µ»¢±¾¦¤¦µ¢¦¨£¬°¡¤²ª±¥¡¤«¬¢ª
~fuvytj}
xqrx~q{~ind^pi`[_YmbP`dOY9GFE=2<=8/*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤§£°³¬®£©§ ¨µª£²ºª«¡¢z¢°¤¥±©¸¦£©¢®¤¨ ¡®ª¨¨¨¸¶£¥y¡§·£¯µ¢°°t¤¿¤² x{¡¬´½w®¥ ©~d\bv£~n´£¨¯¬¤e tzp©l£¨e¥
wkvq|ai[vghqy¢dwvhny~jpe_uokkg\ecaaoRZ=MMNRF=@TB91/&4:306678<;>@ABFHBGFIKLTUUY]`hggXQI<DG<9VR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«©¥©¤§¤ª´®±¥©¦ªs¯¨«§¸ ¤~«¤§¢
t®¥¨£¹³§ uw¥²µ´½§¡~§¢{¤°¹§
±©¯¢y¬¢¨«©w¥z§{²z cynqzqt
xht t{}ijxzppgdxmilj\diier[\HTLQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aahfYQH9EL;>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah£¦®®«¨¬ ¨°§§ª¥Å¼¯ ¥§´«¦¢ ¾¡|
¬£¡¡¨¢£¹±§
pu£«´´®Ê«¯·
°²°
©§|¨r{w¥g¤y´§©Â«¡q¥}
²¡} |
ms{r}
uÅf©¢jogwt{vghupghk^bnlflXfF\QL2E46M`c7&4<DGD:63658;8>==>BL?NIJKCPZ]\Wb^jl\QE=KM@JdX]cfhgbbbbcc`_babcccdiicbbbecafcbbi¢°¨©¨¥« ¤¹±©«¦¢¤ª¢¤©µ¢¯ ¦¥¼ y«¢
w ¤¢¸¬¥bm §~¡§ ® ¬±¤«~¢ukªtLªx©©ª«~¡{z§ilg¶~n`cX{dgs}yk]|n_Sq
\`ly`Ye~q§ªk£nr¥pgdlZlzeY_~aWPovemtqjjn^jolkhWgN]XE9@4GD^k4+ICQMN=84859;6@;;>BO>QRLMBJ[]_W^_bv`ME:MOMTb\[ffiibbdaddbab`bdcabjkdbddgdbgeach ¹ ª£¦¬¡¶¼«®¢ ¥««´¡§ ¦´u¦~
¬£©¥°¦¢in ¡¥£¡ w§¢¨«¯¥z}}¢pr{ym©|¢sv¦f~w¤^{}s¢n·´ºs¶¨dƸ{p¶q¤ct¬«`}j³~n}q£ls¤s}£^³o{³tr[²ibosuqhnXkkrrd[g]aKD=D5QAZp2<RF_JS=<395::6D;;@IP?TMNQ@E_^[YX``{dIC8LWUVbaZffkkbbeadc`ab`dc_`cknccddhdbgfchh£¹« ¥¸µ ¡¢£¤«±¬ª ¤«x
p¡}¨ ¢¨§¤~k{~} w¢ r¢©§©¬®}z y£xs}§£d¡}lhn{§}rgsªsªg]
vhªj¸f\©pa^§vvhumj¦\¨~w»j}©Z]³g[nqxwki[piwxa^dVaAPEO7VBRm4JZY^NZD@151;;7H?:CGU?XRX]>Db]V`Qad|iEB9N[^YdfXfgnmbbe_aa__``ec^bdnq`deekdcihgkiª¶¨c¬º²°«¥§¬°§ª¢¡ £iq{z£¨¢iy{~¡ ¢rh p© ¤©¢©}°¤¢¸v£³¢£xzª¢r¡}
°µ}k¡x~´££«¨{|~sªZ]o{xbL{{
dzBMY¢jr|nvy±³~¦t~mq|ori£]vHec`sp|}nf_khu{bc_P]V\TV@YEQgERV\aX_ID=B8@A:IE8LEXAVQZVDFa\Z`K`m}qEC<U^bZejVghmobff^a`\]^`hb_edvl^egfldelhhki±®S_¡§´º³³¨¢©§ «£ §¡w
ny
}r r¨|l
q¡x
{¢£®}µ{¦z©¢~§hwm~s sq|o|£§¤p^©hu£co¥aÓ|zxrsc¢
~¢r¢uk³`sª²§¼wm¿¦ª´^o~ros¢r^¤gt¦`h¦lÓznvykyvrl©¥g_dypkgfcmuwf_aQZePQaHWIT_WS[dj[eQECKLJKBJE8P@PMXSXORQ`eeiRdxywIFEc]eZhjSihjocjf`c_\]]_hbahe|d^dgdkdjlfhlh°¬T\K~©¯²µ°²£¦ £¤§¨
{p}h}wpl|£©
yvnw
y¢£ ³¡¢¶z¬§¤®¥p©}¤¢q¢®¤¯¢vµ¶µÉ¢ta©my u¡w }oLf£ps¥{ytbl~ lrd`rtk{j´µ´Æ¦s~zj«tlswiytqPD}³^iujxfkgbstpmU\RXgORhIULXRU\gknUgWMJAJMJHJNAQJPdcimetrs~x{nuz{TQOm^h[kiRjhilgmfce_\\\_ibdhk{_]dgcjfnmeile¢¯§
f?¡³¬¯¯µ¢¢§¢¡£¤¦¥yjye~yui
z¥¨z}yp y~¥§gnxl¢d|q¥xph§|¤z rv¹m¢b}¢nsj«ku mo¦`iiu¢}_
uobh¡eiupdgnr¢Z_[c¡n]p{trd¥nx¢df§hrn¡oRn ^d§T]TmmrjqmphkxskoQVUUeYSmIXO\HXhhsjYkVPREV\LXRaUhj^wuz|p||r{svv^QsafbqgPkhhklohdg_]]]`jbiivu]\chcjirlfkmc¥¦zetm§®¥ª°±¦ª¤¡¡¡¡{qh|st}|e|
¦¡«
}si¥}
©¦¦x~¥²¯¥yz©t¦n¥¢¼m|¥¯¡}¦{r¨ g~o¬cw¨l©¢vw«¦k°kv³©loo a«ªw§w}
¤ iu¬f¶sv¾£Y¦«`uqso{upbj~nglSUYU``\jL\Q\I]lmv`[qX[_Zgsenoqcqt`wz~yryr~{{vbydcnsdRlggolrifia_^\ajbllzo\\biamiwmglnb¦ª¤ªª¨§®£ª£¤¨
t
zo}surn}{
¥¥¥uol¨ª¢ t~y¯¤qy
{r§q}}zx{}}w ¡{~k
[yysypin~rtq
e_wvtuo{oon^wixfªt}jou|umlfsw{wZjWyhmwrqowxo]lmigVY^W\dkdUaT^Q_owykjwejjju|pqtsaoubs{xuyuy
}{mldyn^Wnghukxjiid\`ZcielqunZ[bkdlkymhloa¹©§¡¢¦¤¤«¢ª ¦¨~r|}~ztrp{}
x~£{§
wqª
¨ ª~¨§xq{p©p}qjo|hn] sqtkvtYrn~~i]icz
_ix{|viykbqrw_r¨gnwowndfcyzZ[ifmv[zxwtmsrf\mkkbYX]YXkq[^`Y^]er}zsotcjji{|rzwtdmthl{~uz|{yy~o
{}s~yrhT\rilvpugkgd]aYjhkjqrmW[emlgryohjm`ª±¡£¡¨¢¡}«¡¤{|r}v
ror~z¦ xz¬¡ª¡¢££ª¢¨§¡|y
¨~~±¥±¦ k|vwe}
w|{u£~vqt
x§{
uj{yiqh`sp}zwvovs\^ogn_^YZ\RgqUc[[alht{|rnpcjih{mx~phoplf{rw}{m|zx|~zxNdvjsnq{ekebb`[sfpfrqlU]ltmhxzpgikeº¢¡¤ z©
|x{mxr~mk~z~}©r
}z©
¦¢¦ ¦x}
¦||
© © pxqta~u~
nyvu£
u~}rs|{y
¨uzmj}zmhklf^y~g|{vtuuzw\`p}mt`cZ[^QfmSeZ]ajhuz~pllcjjgkrkjsnxnynv}
vr~{z|{`i{kuhiejc`i[cuhobumkTbqyeoyzrejmm¸¡¤zw¥¤xy
|l{xr
}|kh}|~|¦o ¡
|§v£ ¡¢¢¤z
¡~|¤ ¦~~vtpv`}r|q~
ixrys}}qz|
{{¦|
t
xdqz~xypkjf^}sg|uvs|sj^`tvpwdcX]^RjhTeX^`givxqfkclgejm}gmpj}w
zkr}tv|z}jrntibilb_qUtomn`xhlWjtvctzzqbkoy³¥¥ {u£¡x{~~p~ztu
~wgc}x}y}o¥¦v¡¡z¤{x~s¢ ¡|wr~n{d|pk
fvo}~y}}|ryz
£wuzs^ww|s}wfkc`~ijvssu}q|ccasnurmaY_]ZkdRbW_`hktypbjclfh|khthloh|yl
qt|~z~|muttmeljbcuVipn`xglajvpex{yp_ql
®¦¨
|v¨yx{}|{xsxys}d^}~
t}~~£ ~q{¦ t§um{o¡|zrzkul|~n
xo~~esj}
ty~vx~}¥y
t|qs~
l_ytxp{nanbd{amovrwwssav`oluno][^]]j]O\Wbahmszk_iejchwmflhilg|zwns}tz}z}|ryyxnlkh_irchqoevgmlazhj|{wpawmª ¤¨|v¬|v}{|{vwotszo
}~|a\~szz¤||£
n¢¡p
g{
p }{
tsvkqnv|tnqt||eqmz~~
uuzo}
ª{}~
w}om~bgwstnza]o`jt^pjzyxlrpey]mlsmsXZ]_ajZOWWdcfqqe]ihgbgqndigeigzwun
s|u
x
|w
zw{{ryjk_phskqnmqgoke{bnywpkvw£¢¨¡¦t© s{v
wxrs{
kroymvnq[Y~vu w~
n¡l¥
gw~~|}ovplmop{ispwuygsov}
{{wuq|{
¥|vwwli~\qrqoowY]o`oj^oj|zpmmjmw`pokqmYX`aamWPSYefbuoa]kmdbfkm`ff_gktqrotyvywv
{{vjqb|b
|opltjhnlvw_q~x{tus~¥§
~t
zrwtpr
squlnlumw}mnUQ«xvry wz¤}s
ih¡
qw{{||kwjnklmzby~vzw}zhumu{r{qx{{~}}x|vohjw^womkprU]naqa_lnypgpffsuhqlawe]Ve``qSPN[ed\xp{^\hqbbeei_gd[go~okqs}v|
uvy{xs
~|yxfqj_~ookz`imtt_s|xwss
|y¡±¥~vtvspo
spqojiumn}|musRNᐙ|otuv{r
¡
}xzzwim¥cpz|z
|m|esoklzy\y{}~{ziukt}lp~{}wxxrken}jitnghslS^odpZ_lrwfkkbgxsoqc_w`aUk_^uOMK`ec\yqt\[eu`aedc`fbXirsmkqv|tyvw~s~zr}~vesn|enpkZknxyr`vz{vrvvy¯
x~{
twpypnomn~rcdxp|nz|jhlc¤ÁÜ®ï¢skuu¡np
£~{ux
vwp~¥
^l|}v
~~k}cxtjoxsXz
z
~zftjlwo
{utxurpesw`smoahufR`pgkU_ntyarc`i}qrn[cracVnZ\wLLLcea]vsm[\dx^`de_cc^Yirknkrw}swxx|q|}{tshuqyl{ntpWpyvyqdvxhvq§£|pwx|{rwpsjokil|t^`xv{ptzg`e|ëÚµÉÃÜslsvip
|zwxrvq¤a
h}}
qrwgvritwlZ}
}vbum~nmz
}~orz
tkoipv~]shn\iu_RdqhfS_pvt`o`\hqrjWgiciXmW[tLJLef^ars
i[\ey^^dgz`d_]Yknenjtw~sr~{vzt
|vv
{vlwvyxunwz}Xy
qnfxvdv
q¡¢sorv|{xqtnodr~hflww[_x{zqqiagaÕ¶¦xnqw{qj
{h{{~
zu{{qux
af}~m|tkmwutwvkc|
p`tr}}zqg{
|
opytlmijwzagjiXkuZRiribPbrxlbe^Zjnsb\g_em_nTZoNGNfd\fnrkZ[cs_\ckvde]]Zllbmjsvqo|}txx
|vx{voxy{om{v^smhzssgs|r uu~mu}|v~vqoljat|gbiuyZ`w{ymq~echhW_rs¼Ävq}qrj{|
|{uvw}ru
rv}f}~q}f~|y}i}vfoyxswslk
x
k_sy{~|~siz
y}~nm{}vtnfe{tb[pbWnqSSmrhaNftxf`^\YoosYeb]jn`pOYkQDSg`Zjnm|nY[]mcZbpvdg\]`kicljsvpm|tuz|
v~xtryy~oo{qixz~ml{ukjxtk
n}viw~yozsplid`szh_eqzZ`r|ygqzaee±²wKbZ¥ÙÐq{w}
nk
zy|xwoqu~zjy
¥ow
z
p{|nwhxr|e}~vcpsixpou|vx
zk\rs~{rnr
sz
yno~vzdfh{o^XvZWplNWqsf`Klwta][ZYt}soWg]fjr`oNWhR?Xf^Zpkhzq[ZXkeZcpy_h\^elhekiqwol~uozvqq{|zyujy~ko~t}or{zpo~xg¡
fogy}~|hxrklf_`oym_box\dkzaqv_eeÔê½2:>qx
u~ml
u|
|xnvwn
lu{tfy§~nvx
{{w~krh~xm||wayqdqh~nuqu
su~so\nuy{}y{rm
szumkvut[ggunWV{RYpdKZrre[Ipxo\[[Y]t~thYb[gfodjMWfQ>]e\]ue`upZYTndYdqyZh]_fmgikipw}mi~yn||zupnw}{{hz}js{r
zsw~~zx}|kl}kh~z~~~}kuqghb[bgso_aks`hpzbst^cd n\5Z¯µti|u
svpl
uyx|y~rgu~~oq~hvynfy¤~nw~
|pz}{h~lj{zjzwr`w~qdrgvmu{|owz|umYpwuxv{ytos~{onjmtm\fdrpPZzM[o\O[rodUKsxiWYYZapt`]]`gdiifNYhM@`c[`ua]ulXWStaZdorWj^bhkgmlhpw|lh||p~{zwq{oqw{j}{mwxvw|x~~zm£zuxklx}z~prpcf^Yf_oo_`gpfjotato[adjv{¿¦¤È¸q
r|wsqro{tttwyypcwzirvgwucj|}suzz{kxy~tgzhkysizv}h`w}jjth{iv~z~~p|v|tbVx~ss
}qxyqqz~}vwjqilqo\faqmIduK]mUSYrnbQOtxaRXX]aps[a]heedkdP[pICc`[cp^]whUVUv][enhVk^aigennhpwzmiy}r{~y|u|pwrmw~p{wyztx~zuo~}
zw
{gt
y~{
vgon_d\XeYmra``plkhnatiY^dnw©ÚªÇ²qwotz
ztst~wpqmt
xuk`zyfqpgvn[m|y~y|nw
u
{ltv~mgvdm{umiwv|abxzhuub}{gu{tvq{}mZWupv
zmtzlv
|~y|t~thtenlsYh^sdGmmKZaWVUwmbPRtvXPVX^aqo\`cmdd^ocT]rFBe_]fg][{bQU\u[[gkaVj_`nefkqhpvxtku~vx~v{s}ortqu~
{ww{|
x|}~{~svy zvtx^}
xt
wzbnl[b[[aVisc`[gnofqaqfW]cl|Êι¡jmmlqq{~zyxsyuu{jlvcuvof^}zerkjqcXmz
sx}ors{y}ppo|fhqbmxqjkqx}|z]eyxivxfwgt}rjo~yo}^Ysnu|opqwixw~s{u}{sgsankqWi]v[GmjLVT^SU{kaOTurPQTW^bt
i]`ljfcZoaXcpG@g\`e^\V{^NVepY[jh]Wh`^rfkgqgpswxntzx~yuq
pp{xvuz
z|t~}~~}|xvxx}muxd
so
ztcnjY_[\]Tgrd`XdqrfsbkeW[`jw¾®{ ¶nbshs{qxz}~wwrvo{vejo`usjb^xyfqhkkZVow£qryvot
}xtqnhx_jl_mvjgjkywzvZg}|xes~nteu
pgkzunub]q}lu}{fv}nqivys~m{|{xqflbm}lmUi_vUJijNQNhMX{haNUvkLQTU_fuf^`qhgbWi]\khJDjYadVYUyYMVmjY]kd\Yec^tfldqgrpuxp
v~w|
}urnsy{zsr
y}u~|z~{v{wwziv}{lqp
~pflgX][\[Sdpd^WbruiupeebW\\hporsddx~itusrwxvsunkzqbgkgtnf]_}p{imygjdUWro¦|{vt}s}{o}|x}}uoqlgt\lg^ltdgeizo{rYgwuhpxvbw
|ojm{qgsfanzgsx|~bwwjlrv{q{zt~gywodfbm
{ljUhboRJhjOKNoG]{faMUtcJNSWajv~e]gsif`VcWbp]LKjXcaUTUsVLXudY^k`\Zce_vgmbpisor~utww
z|t~
nrt|ztq
zut|
|}{~v{£¥y
ku|zuznsy|unjheV][ZZSbmd[Xas{ihmi`bW_[jjkogk`hyxjstsmz|utmzhjyj_enhvheXbwj~{ojpgf]TXog¨wz|zvqptwzyu
vjquggn[lc]mr_gajxh{m[nrtjo~zwaw
x
sroyrcqi\qxdrt|yctqhjzurmyxvyd|ywqddcn||jjThaeSJkgOGQkE`xfaMSr]JMTZekvze^mqid]V`VnnWKShWe^XMUlTJ\y_[^k]][ce`yhl`oounpwuz}vyzxy~qttyvt}|ks{
~}~{v«zkryu~tnn|sjomddX_ZYZTajg[Z^ti^ml\aW\\lert}ii\kvugsvql{}|xurlygixf]esgzwccTepg
wwgij`WVYgc§n~w{qr~hzp{}xr~ndurdgg\ja\oo\g_mudzh]torkr|~uvbt
{xruuapm[rtcqs
|uesmam{pkj{yvsfv{{vqebemr}ikSg]\TKqbPFVaGbvfaKToWJLXXgkuzdenqfdZW]XveTJ\bWgWYHWePHbxZ]_l[^\ac^~ij_ntxmpnvyr|~uuy|tuuyzz}~isz}~
zz|sq{{}dqys|zurn
l{~lzbpobe]eVYYWcfk_]\r
hXpn[^XZ\l{cpwulbYlssgtuolx~xvmntdite[gufvvy_]Rffjt~bdi\TW]bc¤hxtymp{iyn||vsy|xhdvl`f_^i^\skYe]oobze[w|knnoxysuds~{wor~sbxd\ppbqr}tgre^nwiehz|unout}trb_fnn|dhSgXWSLv_PJYXHbtcaITmSJMZWilq{bmlscbZZ[aw\SLc]XiSWGY`MFiuX^`l[[_bb\iganxylojvxm~vsttrvuw|}~~~pw|yxz~ttp z{xcuxswtksn~kx|pr^po`gblTZZWhcmf\[qeSrn[ZXX`lvciuji^Ymsplsssi|~~{vnnldiqc[krdtvs[WSearr]bc]SZ`\ceqq
tll{npq{}}swszzzdeuh]bY`gZ^vhWb]ohaw`[{vijrnxsruhq~vsjq}nfwX]lncrsztgo~[`prb`kr~mmusqxkpa\elly`fReTVQOtZQOXQHcsb`FUjPIPZUkkk|fnoqb[ZXYlqWRPfWVhSTFZ\NHqtX_cmcX``a]jcdmyxkpiuy{k}|y|nrovz}t|tx
utquo¡s{zewnmznfwpzksvrk^tnagekR][UgalkZ\pdOon]VXUgithbted\Xmtmoutxj|{vscdkna\nmcsxkZTVcdx}}q]c_cSZ_Ybcnp
tkh|pftxu}mzuvpzv_erc[]VacXateU_`mdaq]]~phisqtpuvkm{
qsgp~qsoT\gkfqtwscmvVbrl[_pg~fmw~ssskm`Zdjiv^fScTUPSlVPVSOGdr_aEXiNHWTVmhd|ikxkbW]U[tdSRWhQXeTSHZZPMwvZ_eliYb`^^nafkyunoivvl}{~krgt{u}r|
{ss}vn¤rvwlz`d{pfxrxlmqvgd{lcfghS_^Ug_ln[^mhNim`TVSngtkexdd\Xoslqzwrl{vzxkaelm^`ojepy~gZVX`lx|{p_b^gVX_Wcbkp}xlkyn\wsm{jvtop|sXim^X\UabWdpcS^ahablZ`~kfksvomwwli
{mrgq}nsndZaiiotts^imSeqeUcoc{drw|wkpmk`Yafgt\dU`URNWdRN[OOGdo]bFYiMI_KXmd`xin~d`U_T]u\TS`fN]aUSJ\YPYtu]_elhXca[^qcgjxqsnhvtzrz~|ynulst
y}|
sstxro~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDARÌÚØØØØÚ° £cggggfo
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR455552FØêççççé¶ £¤¤¤§|\____^j|}z{z|}{|~}}}~}}~~~~
|yzz{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvutvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfggghhgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;89:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqususqsxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<979::988::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;<<>?=<=;:<===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{}~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@=<=;>=:::<:8988:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@???@=?@><>@?===?==>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCDA?@@@?=@><=??@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>:><?=<:>=?BBE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEFFFJNNKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@DED?<ACDB?>A?ADEDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJHIGHHIGGCDECDCAUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKJKLJKIHFEGNGOl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD?>?DFHDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsstvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKKNLKMLHIOpp
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswyz{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHGIIKLOQTOXlsz
fBB=88::9878896479;<:8567789787689;;<>@;999==>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@BFHKHKTpe|T;8656766645763468:876565677778:77789;7689989876:<@GFIFIFEFOSRSSROPPRTepqsttvy{|{|}~~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:<DBDFD]|
H676468874578467699766765::;::<898977779::8878588;A=>>BA?AKLOQPQOOOQWkrrttuwy{{{|}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897:A9<D?fz>:88;<=>9:;<89;9:;:99;:9===?;;;=:>;9;;<;<<:;<8::;:999<?<=ABDIJMKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989999:>=?@Dwl<;>ACEEAAAB>@B@@?=>>@?>?@?@==?B?AA?A?=@@@>?A<><;:;:9;?=;;==AACABCAXqqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<<:;;<;=>A@>b
^>DFIKJIFGGDFHGEC@@CECB@BCB?@DHECEDFEAFEFDFFD@B>=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:>:<;>>>?;?=@?C?K~
WGLLMKNJIKHIJJIECDFGFDCEFDBHIKHGGFHGEKIKIKKJCFCCDBAACBDCCDDCA=;=@hpsttwwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97<>;<:=?>@<??CBE@h
PMPMKNKJLIIJHKGEGHHIEEHFFELLMIJGGHIJNMNLLNKHFGGEECFFFFDEHHFCA?@Llptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<;;<9=?=>>@ADCIT~
qMQOMLLKLJIHFJJEJHGKJHJGGGKLNLLHHIJMPNPNMOKIGIJHIDIHHFFGGIFCBACUnquvwy{xxzz||}~~~~}~}~~~~~TDAABGHB?8?@8:;8<=:=?<=>@BDEMm
^RRPMNMKJGFCGJGLJGKOLKJJMMLOPNHIKLOQQPQOOJIJJLJLFGHGEGIFEEB@BB\prwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<9?==?AEE>CECGLu|WVRRTROLKJEEFKONOWVQPOQSRNSTOMSLPSUWRSRPLJMMMKNGGJFFHJDDEEBDCcquyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?==B>AAEULBIJGKMy
gVVkaERQQPJ;;QSR`u]UVTVYYSYXRZfPUWZ]RTWQPNRPPPQKKKGHIHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??A@EBCFEDDKWQKPPOPQy
}al[dU:XXXSP?@VUY\d`VYbr^]W]ZVEQYZ\Y_TYgRUVXTTVSOOMJLJIILMKOMSotvxyxwzzz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HMIMPKIJOSRQUVVVTu
g;~znpXZ[ZRSRWVTZZuYU}a\X]^WIV]][[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxyxz{{|}}}~}~}}}~~xy}YMKJIIFBD@A:PQQWXPPOQSSRVWWWWl
n~fYY\YSVTWRQWVcQerXZW_hP`fZ[X\hbGOZig\[\]]WSNSPPQVVVVYZosuwvvtwxx{{|}}}~~~}~}|~}r}ot|]SOOMKJEC?@;PPZZZRSQORRQURUSV^ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZTST^ZXWWWzkXZ\\^SPPPINOWVX[Zdqtvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQVRSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRTQMOYQMNQSUUMQSRPNLLHCIHRSTZ]mrvvussw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt_d]^[YUQLILIaltPQSNQRPS[RSRQRUUbs{|}{{
u_]KC>CCCCB?DPCD@C>BHGV@INMG]iQHFOFDEFHGHBCHGHJGDBAC@NPMRdtuvustuz|z{{{||}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQRPUYSUQQTROV`klsvz{xyurnstsyx~~kLG>>:;>@??>>jPJaEFHIEB?HMMGMQUJBE?><=<==?=?ACB??<=B>JMFUouvvstvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJPQNKLQRQTUUWQQWVPX[b]agmmlokh`nrimlqu{z}zxz||xwxdB@@A=:BCAACA[\N{NOONKLMOOPLKLWNIG@B<977599=;;;8989?;AG>\tuvvuvwy|||}||||~}|}}}}~}xuwz{zvyxuw{|yxuywcqhipmnmmhf^OP^\ZIGPRQOMPQNQRSVXSRYTNYZ[WY\_^_e`]^qwk^`gkwooljonnlfbYGFFHBAFHEEFCLQOaWRXQPSSRU[OOQVPMICF>:96586979:365795<B=ftuwxwyy{}}||{|}}~~{}~}}~~~~{wuy}|yx||||twvwvuwknihqnooojk`UW^ZWMKTTSPQUOLRSTWXTTXQLWYYVXXVXY]WXXhsk]V`tkaa_]d`_^YUPMOMLIGJKIHFCPOSZWTTNQSYS\eUOSTQNKIHC?A9988978847578598Gnruxyz{{}~}}|{}|}~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVWXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNMMLJFPPUYSTNJNOTST\VRUSSOMLIHHF??=:787659967665Wqqtwyz{|}~}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXXYYYRUOJGOPOOMRJOPOONNOTLMIPPSTU2<XMIAQ=c`QSQPNPPONNMPNTRPRLILKOQPQRSTQSOLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWUQSFEAFGGHFJDHJHGEHLHKIGLMPMG/E_R>3@>joaRRQ@GTQOPPQNQOPOLJLLOPNMPQQNPOJLMMKGEEDB;==<9=G6676Dnquwz|{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8ENS]gSQSAGUPPRQPMMNLJLKLNOPQLNNMHLKIKKLKGFFED<AA>;@E;<89Tqsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A>==A@B=>EHFDFFIGJJ@FAA@FHEJOHQRa\QPRNSOOOLLOMKMLMON[VJMQOGIHDIJLLKFFFD?CC>=BG?B>Adqtw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;>A@@>ADIECHGIGIEBB?><CBAGIDMOaePMONWKLNKKMMLLKNNSdMJLRIIIEAHJLMNKGIFBBB@?EFEHDLopwzzy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLLIMPMPOGKE?B=999:?B?<ABAADDGKFDIIGGHCC?B??@A=CECKNQTKJIMTFIIJLJKKIJLMOPRPKGCLGCCJJLMONIJIGCCCDIJMLIZsnxyxz{{y|vrpurtyyvxjqnjllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHKCFGGGJKIJLDGB=>=:::;AB?=BBCCHFJLJEIIFGGCC;A@B>@?BECIMOGHKFHKDHIKMHJLHIJLJM]RIHDNGBEKKNMPNKMJKFGGJMNQNLcnjwvv{x{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthdpFKCFEFDEEFEGCC@=<=:;::@DA?BCEEIFJJLFIIGFFDB;BCC>?BCCDGLNHKNHDHDILNMGILGFFIILNKJHEOICGMMNMPNOOMLIHIOSQRNRfgfrosxu{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhme_pGICEEEBBAE@DB>?>:;;=;=?CB?ACFGJGJILHGGGFEC?=EEB>ACBCEGHIGMPIFFFKNOKFHIFEDDIIHKIFHPKDJMLPNONOPNJJHMRUUROWdaamgqrosyzgehhcilgqlflmgiklsmpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGDEGCA@AD<BA>A=::=?;>?@B?@BEGJFJGIGFFFDCBAAFFCBBBDEEGGHFLPLIOJJLKIFHEFEDCIHHKJGKRMCOONQPOONOOKKKPUWVUTY`_]ianinhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsprkksMFGEGAB@CD<AA@C<8:=>:?=?B?@@DFHEHFFHFEECCEBDIFCGEAEGEFFGEJMKHQMJKHHIEFHHECIIJKMKPSNDRSQQRNONNPMLNSWVWXVX^Z]d`hbjigk_defcgggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBEE<@CBD<7:=>:>:@B>??CEFDFDDGECECDEFFJEEIGBGHFGFECFJJGMKLKHJKFIHJHEKKLLNORTOITUTQTPQMNQNMQWZVZYWZ^ZXa```_hec`deggjihjfhnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGIDACHE<@EBD<8:>>=<<BB<@>ABFCEBBGCCDEFFGGIFGKHCIHGIGFDHKIGKHMKJKLHLJMKINLNNORUVOLVVTQTRRLOQPOTYZY\ZZ\__^`c^\ackb`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKHKHJEBDGE<@GDD@9<>@?>?CB<@>AAFCEDCHDFDFFHHFHGIKJEJHHJHFFLHHHJGLLLLLIMKMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[]^``a`ae]d`fg`ehjcssfjhglprqossnswwpuvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwowIJKIKGBDDE<@FDDB;??A@@@DA@B?ACHBEDFGEIEFEIHFIHJLHHJJIKJFJKHIJJGKKMLJJMLMNNOLOPRUWVMNTVUSRQPMNTSRW[^^_\^``aaa`cdebdicdijgvlkigmosqpqpprywruutsmmssmqrotutspswtuuwvuuteqskpqjrvpwJLKKLGCCAD<?EEEC=AACBBCEACDAAEGCGGGFEIFCGJGGJFILHIJMKMLGKIHKKNQKRQLSMKNMNPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da_`b_`fbacinhcihhmxvlhimosrpqrrrvtsusssnksqmprotvrrquvuswywutucmtkopjqtpwLMLLLGEA@D>>DEFC?CAECDFCCEGCBIEBHIIGHJFDKJGHJHIKGJJNKNKILHJMKZfJd\KlRHOM_nUls[qpbwcRPbvuhucav`Xnqbdvinzf\lt`lkU_wvijhhfglmjmojmnsrprrqrsrssrtrnltonpqquuqqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?=DEFDCCBEEDFBFFGCDKDDJLKIKLGGNJHJKGKJIJJNLMLLLIMLL[sbdp^llUMNer]geqlntgpi_aYnmbppbkjjgoqtetno\pugqMKryvkaakeelxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?AB?=BEGBFCEDEEDBHHGDEKGGKMMJMLFJNHJKJIKJJIJLMNMMMKNMM[roonpplkMPQlXNibtrpamov\YlP[mmZqmkomxxtsip\`slqjUuyxoc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryIKGHFEEBAB=??EGBGDIEEDBFIHHEGKJGMMNKMNGLNIMKHJMIKIJJNONNMLNML\hdu]lqWlNOQnUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ghacityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvHMGIEEDCAB<B@BFCGFKGECCHKHHFILKFMKLRRLGMMHNJIHNHJJHHNONNLJMMJZsppoqqmlOQSoYskgooqqomt^nXat_nopoqroousttj[]tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtIKHJCEEE@@>CCAFCHIMHFCFJLIGFJMLFOJKWRKGKJJNIIJLIKJIHKMMMLIKKKSkbZi^_jcrrZ_Yko`eeUk_c[abQ`mh\j\niidZoedp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrIHFIDEDFA@AEDCGBHJLGFDGKLIEFJNKIOIL[QJFHHKMIHJJKKIHJGLKKKGHJJLLLKIKLNT[]TPUMQPNOOURPOQOOQJJOPQdqiTYV[[\UY[]X]\\cfaafbcf_^fkmhmtxrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusHCEGFFAEC?CGDEGCIKLHFDGKLHDGHPKLOKLWMIFEHIJHIKHLJIFHHJGGIEFKHIKNLIO\W^O\\`^OXYS\\b^MYZMXaRKYaZS`d]bX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBDIEGGFKJKHEFJJJFDHHPJLMJMRIHEAHFJIKKILJIGEJHEFGEEJGBIMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^c_Z]`c_Y_b[`^[TYXZ_^dbbaceiekrpoppnow
{
uqprrsvyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDGKJJDEIINJNLHLNGHF>GGLIKKJKKIGEIECDEBFJD?IKHN[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_aa]^ca`babcceZRXVV\[^c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFCGEBEGHFGHIFGJGHFHKIKDDJJMMLLHJJHJG?GFNJKKMKKKIGHDD@DAHIA>HIFO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QQ]_accccb\dbadcfXQVUS\X[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMB@IFCFKIFFGIGGJFFFILJNEDJJLNJLIKJHIGBHHQMKKOMKKIHHED?EBHHA@FECT]Y^X_X_[]UXXP]]QKJV^X^[]VZaRR__bb``bb`cbaddbXORRS\S\^]^^__`dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHDRKFHHHDFKIMPEGIJKNLLILKIIGDHKQOMLPLLKKIIDEAECHFAAFDAVUE\T^SV`XNTUNZ[MJKT`a[_X_^b]OYb\``_bcb]bbW__TPOQRYS^\\]^_`affelfoow|{{}
zo
~INFDFFGDIRcQDW_IGGHDFMJPPFIIJKNLLKMKJJGEINQQNOOMNMNHKADACDFDBACD@LHBLLPOOMFMFFHIHGLLMOPILOPPSPLQSRUZYWYXXdVOSTPPONQUT\YY[^^aaefchdklqsszy{z~{}{
}KIEEGFGDKM^MGHYMGHJHGMLQQIKJKKNMUNOKKLGGKOSSNPONOOOHKF`ED_LDfcCL[H^[smONVmYLCP_TlWgJ]WU^DLQULMSVQRTXWTXUT\TPfZhhdYTkTXWU[\\``abbb`gignlhrz|}~}}zr{z{
~z{KIEFFHEEKOTJKG`THJOJIOMRQKMKLORUROOJLMGHMQ[YOPPNOPPIKQQI|YYrsWPmHqnoaVRrqtOBksnqtpSo_[nX]V\XUkhU]VcY`YZ_VUWituu_av`Yb\\f[_aaab^`bgmpl`pwtx}~vxzmv~tx~|~|z~wwMIEHMMBDLLGJLFRVLLOHKRXWQNOOMQTNOQPKKNGMPS[ZTQROPPQKIZx]TxdhYRSPvgtlpbngkQrOLwmjrpsrqrpop]fzuxqqzq~r}ku}bRg|essoss|}o~yor_``bb[a`hknkblfgmw~~{xwtvzhr~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJQOMNJNV^YULQSNYYLSSRNLOIQRTYWWQTPPQSLHgxlcxqmZKLTypumubowQddIevqmwojfxxiWrRi{mijzz}lxzpgoXuujvupash|ilx|o___cb\_defijdgbcdllppstsssyqrxbltgry{sruy~svzn|}yxrnMJRtNCBEPPIKLJLQOOOMPZ`ZXKTWPa^RVQYSMPJSTUXWWPUPONSJKrouuquqdhaVnLqp^GhyWvTKhx}x`y{sna^modSgrunmypwlvstqlm\s}zkmy|lum|kpvux^__b^]_edighee^bbiiijknokqnmjpacfdowxompsynqpj{ztromKKZVHGEGRPKLNKLQQPPPQW\YUNVYUfXRRY^TMNJTTVWYWOSOONQIRmHiwK`dvuUWlNnl{rajguTKWkh}lmlx`[pz{_`zscroxqhd|ir{]TKl_vukiu{{m~xk|p]^^b[^bdegeeebZccikkrsrwgmihdg`alagsrlhmmr|kmhk{tmmkmOGJKHJHHRQMOPMLSSROSRWRVTPWZVVTTTa`QONKTSSQVVOOMNOQJHQNPULKKRSRRROVUQQORRXXPNPUTXXX[[USSW[WXW[ORTWWXQ]XV]USOXRVWWXZ`[gr^[[[]]_cZ_ccefdccbZccgffmnmuffgc`f_]g`dlhfgkhpzhggkujhgilPIKKLMKJTRMRQPLVUTPTUXUZURZ]VUTWUYXPOLNWTPNUSNPNLQPKJQQKQMJKOQTRPQSRIIMNOQRPPQTVRXW\WSSQQUUVTZQNRQWUTYVTYUSQUSTUXYX^Z_a]\ZZ]]`c\]bbdgeddaY`acabhhincad^_c]Zd\bma^ffgmsdihkkedcfhQJKKNOLMTQOTQQMXWUTVXWWZVT\`VWUYUXTQPKOXSPNUQNRNLSPMNUSNQNMNQSPTPRTTNLNOQTTQQQVWUYZ[YSURTXWWY[SORTWUTYUVYUQQWUVX\Z[`]VY_]^]\]`a^[bbchfedbX``b]`hefda^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLOTPPTQOQZYXWYZZXYV]jdVXYZWVTTOKOVTPOTPPQNMQQORXSQQOMOSUNWQTTUONNQTUURRRTXVZ]\ZVVQRWXV[\VPSUUUVXSWWTRQXVV[_[^`_V_]^`\\``__ZbbdhhedbYb`b^^fdc`b]\\\\YZ[X[a[^]\_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMMVSMNROQROMPSRUZUSPPLPWUQVRSRXMOPQTXUTTSUYX[^]\[VROUVU[[VQSVUVXTSXZTSQYWW]_[`_`Vb\`a]`b_\`]c`cgief`Zc`a__ee_`c[Z\[\ZZYYW\Z\[`^`[^^a`_c\Y`ZQNONVQPUSPUTSPW\\\Y^\_W\^jpwyc\[VVYRNOWSNQQPRTRLQTSY[WUORNSXUSRTRRZOQSSV[VVVTVZX]^\\^VSNTVV[[UQTTVXXRSY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgidg^\e`a`acd_b_YZ_[\[XXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTPZ]^]\`\`U\]hjr}slh\UYWQOR[SRQTRTUTKRVUZZZSOSQUUUSNUQRZRTUTX]WXXSX\X^]YZ]TUNVVW^ZXQTTXXXSVY\TRV]Y]]a^cc_Y`[eb_dd^^cca^efief]^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POORZP[UUWVTTT^^`_^b\`U]^bkyum}lZUZVQQT\TTTUTVYWLRZV\Z\RPUSWUUSOWQSWSWUV[]X[YUZ^X_^Y\YRWRYXY_YYRTUZYYUWY\UTZ]\^`a`ed]^]]eabfd^_dc`\gdhfdb_da_a`bb_`^WY^Z\\ZYYWV]Z]^[Z[\[WY\]VXW]SOPWYP]UVYWWUX_`aa`c]`U]^beev{hXYZTVTV\XWWVVW]XOU\Y^]]TSXRWUSRSWQSVTXXX]^X][U^_X__X\VQYUYZZaX[TVWZZZXYYZWV]^_^cbbee]b\`fbefd_`dba[fchfcfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNSZWT\UVWYWV\`aacac__V[`da_zuohZ\ZVXVX[ZY[YXY`VOT][`a\UUYPTVTRVUQSUW[[\_^Z_\V__Z]^Y^VSYXYZ]aY]UVZ[Z[ZZYZXY__``dcdeebdZbfcgfe^ab`c^cciedg_g^bbcaa`^_XTZZZ[[X\XX\[Z[WWZXW\[\`]V]]SOVZVVZVYUXWX^`badada^YYadb`kfh^\][WWYZ\\\_[Y[bVSW^]ac\SVYPVUUUVUSUTX]]_``]a]W`^[^\[^XVXX[Z__Z^WX\\]]][Z\WZ_a^`eddfffbYcfehgd^c`_ec]fideh_g^cbcaa`__[XY[YZZXZXW[\Z[WXZTY]\Z`\U^bMRWYVWZY[\YWY^`baeada]^Yacb_a`a_]]]XW[[]]__\Z]cXYW\`cd_RYYPWVWXWVVWV]]^aba_b^Ya]]^Y]^YXUW[[`^\_YY]]^^`\ZZY[_b_bedefggbZdfgigc_c^`feZiicficf_bbca``_]]ZX[YYXXZYWZ[ZYWXVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XW[]_]`_][`d\\WZbecaR\YOXVY[YYWZZ`^abc`ac_\b]_][_^YYTX]]__^_[Z^^`bb\\W[]`bbcedgfegd]efhifcab\cg`\iichife`baca_`_]]\Y\YXWXYYW\[ZWWXPXZ]acffrkJYW][Z_]\^\Y][^_bcbaa]b[bda_cbb]\[ZWXiq`\`_]\ac_]XYcedbT_ZQYW\]\[Y[[c`ccc`bda`c^`\^__ZXV[_]\aa_][`abeb^\S\_`cddfegfefe_ffhhgdd`[fg^ahhbhhfc`b`cb___]][Z[YXXXVZV\ZZVVULXW\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{||||{|{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{|{{{{{|}}}}|}|zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½sqrrrrt>(+++*"ÛÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääèÊrooooor2ïååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyyyzxopppppprrrrrrrwzyyzzz~|||||||zzzzzzzussssss}
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvvxyzyz~yyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{{{{|}}}}}}{zzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwww|{z|z}{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwy~{y}y}zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|yww{~|y|z{zwxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx{||}{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyywxz{zy{xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~}~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~
}}}~
~~~~~
~
~{z
~|}}}~|{|
~}~~~~~~}}~}}}
}|}~~~}|}}|z|
}~}}}~~}}}}zzz~~
~~~~||}}~~}}}}~}|zzz~~}~}}~
|}}~}~~~}~}|}~}}~~}}}|{{{zzyz~~~~|~~~~}~~}|~~~~~
~|~~~~~~}~}~~~}}}}{{|zzyyy{~}~~~|~~~~}|~~~~~~~~~}||}
~~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}|{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
|}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
}|||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~}~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~|~~}}}}~{|}}~
{z{ywz}~
~~~~}}}||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~
}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}{z{{{
~~}||~~~y}~v{vx}|||{}}~}}~~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{}|zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~~~~|||||||~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}}}}}~|}|}|}}~|~}}}}|{{{|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~~}|}}~}||~|}}|}}}~}~}}}{|}~||{|}zzyyyy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|}~~}}~}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv}
~~}~~}~~~|~~|}}|~~~~}|}}||}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||z|{|~
~~~~~~~~~z{z}}uqz|zqz}}yxtt
~~~~}~}}}~~~~}}}~|~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{syz|pwuvwyvtz
~}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyy{qtxwvxury
~~|}}~}~~}|~~~~}}z{{||}}|}}~}}~~~}}}~}}}}}}z{{|v}yxyzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}}x~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}}}||}~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqwyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~~}}|~~~~}|~~~|}~}~~~
~~|{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqrpxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~|~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~~}~}{~~{|}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}~xwvyyy|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~}~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
}
{~~}y|zzz}}|}z||}}|z{~~~}}||}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~}}{|}}}}}~~~}|~~~~~}}
~
~~|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
~~~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vzy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}~}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~~}}|}~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~|~}}~}|}||~~|}}||}|||~z{{}~
{{~}|||}}|||}}|}|~}|}}|||}}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~}||}}{}}|~zyzy{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yyzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~~|}}}~~~}}}}{|{zyzzyzz|yzz{{{|z{{{{}~}}}}||}}|
~|~~
~}}~~~{||}}}}~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}|~~|~~|~||~}|~}}|||{{zzzzy{zzzyyzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××רÜÝÝÝÝÝÝÝÝÝÝÝÝÝÚÖ×××××××ÖÖÖÖÖÖÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌͲâÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹³xsssssssssssspÀ¼½½½½½½½½½½¼¿ÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎnPSSSSSTTTTTSL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¥2)+++++++++++$d°©ªªªªªªªªªª¨°ÒÒÒÒÒÒÒÒÒÒÒÒÒÑàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;@C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÎqTXWWWXXXXXXWP¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦8/00000000000*h²«««««««««««ª±ÑÒÒÒÒÒÒÒÒÒÒÒÒÑßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;>@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÎx^a````aaaa``Z¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©« E=>>>>>>>>>>>9q´¯¯¯¯¯¯¯¯¯¯¯®¶ÒÒÒÓÒÒÒÒÒÒÒÒÒÒßéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB?;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÇÅÅÅÅÅÅÅÅÅÅÅÅÄËÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÏÎÏÏÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÊÊÊÊÊÊÊÊÉÉÉÉÉÉÍÓÓÒÒÒÒÒÒÒÒÒÓÒÒÕÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÎÏÑÎÑÔÔÓÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖØ×××××ר×Ö××××ÖÕÖÕÖÖÖÖÖÖÕÖÖÖÖÕÕÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÎÑÁ§ÔÏÒ¤¡ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÏÏѹ¼¸µ³¡©ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÏÓº¯¬¬¦ÆÈÐÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<=:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÏÓ±¨¡¬Öº¡°²ÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÑÀ¤ª¬¥²¯³ªÕÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<B@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÔ£¢¤¨
¤ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<;:9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÑÄ{§³«©
¤ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÕ«¯¼ÀÏÈÙÁ¼¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?;;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ
¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;547<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÆÓÓÕ¬¥«¢Ã «¤ÑÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÒÑÒרϩØÂ»ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÒÏÅÔÔ¿¿ÕÒÕÅÄÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::<=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÓÔÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9699:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9848<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?;8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>;<9;;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668784;?<?=9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778777646748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiihxsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptyvt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868556747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®xpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_MHRIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¥¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocnihb^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥©§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´´¶¼¼¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎÌËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkhguZfrwsxfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÉÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijh]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬¦©»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËËÇÆÌÉÍÅÆÆÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlietnsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÆÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»»½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegcjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÂÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfcZYY\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿»½¿¹½ºº´¿¸µ·³¯»¼·À·½Â¿Á»¿Á¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjffiei]VUSYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»À¿·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekgXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···µº¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8=<7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·¿¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸®µµ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcgb\cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼«ª£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊŵºÀÃÈ¿¿µ¿À¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^aaNHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍËÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶º½Á¼»¿¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼¿ÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^]YQEDCMIAE=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÃû¹³´ºÁ½¿ÇÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni\__YSPAEIGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀ÷·°µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_e\ZUJ<??FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁù·²²²´²·¾º³µ²¼º¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvrl^b`[]OHA?=HCFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÄû»¶´´°¶º¶´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ournc\fX\]RNMA?JB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³±¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÊǾÀ¸¹¶²´¶³´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLBFMF8665:6:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹½µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±ºÃ¼ÂÊÅ¿»¿¿¹´´³±±®°¹¹¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±«©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH@HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼·ÀÁ¾¼¼¼¹®¯²²ºº··µµ¼´¯´«¶º¸ÀÄÁ»¶¼½¸²³°¯¬®·¶³´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥¢£¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGOLLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬ª¨µ²±°®¯²§¦°¤¯®µÁºµ·²·¶²´«²´®ª«¯°²³®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦ª±£¥§ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRNJNG;D@=2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¦©¤©£¤®¥¬¬´¼·¬²±¯±µ¯¯³µª§¬£ £¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯©®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxy`bRU_HIIKSTIRPL8>B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ £¨®¬««¯ª¯©¥¥¦¤ ¢¦ ¢®«¬µ²¶¦¯´«©ª´±°°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±®²±´©±¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNNULRLA7>B78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=?758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¡£ £ ¢¯¯¬¯±¬¶§±¦¦°®¬°¨ ¢ ¡¢¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³¸¬±´£ ¥ ¬¡¡¢ ¤¡ ¤¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HQUHFUVJBMG=JH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¢ ¢©¬§¬©ª´«««¥¥«¨ª¬ª¥ ¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¡«¢©¨²©ª¨§¨ª§§ §¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·£°¦ ¤¤¥¢¤£¢ª¯¬§©£ ¡¬®®ª«§ ¢£¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸´»ÆÄ¼Â»·³©²ª³´¯³®ª®£«§¶±¬¢¯¥ £¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤{trkkurphW[QETHDIOH>EA3EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ¡ ¥¥¦§ «±®§¤¤£ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ½ÇÆÂ·ÃÉÈÂÀž¹´¹ºµ»·°µ²ªº±®»·¾ººª·«ª¸º´¼®®¹£¦£§¥¢£©¦§ª§ ¡¡¤£¤§¢}zrkdhoxjeZ[FJLDDSLDBD7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ £¡¯³©¡wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÈÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÌÓÐÓÓÌÊÂÅÆÆÊÇοÉÐËÆÄÆÄÁ»ÃÁ¾¾¾µ½³¿¿ÂÃÆÄÇÄ®¿¸²¸¼ÄÁÁº¼¼µ®§§®¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDB@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª££¬®¦¥±ªÅÆÌÎÍ¿°Â©¥¨ª¡£©¡ ¤±±«¤ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕ×Ò×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÔÕÓÓÈÌÇÍÍÉÒÌÎÓÍÄÇÉÊÁÅËÆÈÈž³³ÈÄËÊÊÎÅÊ¿¾¿¼ÁÇÄÌÌÈÉÀÿ°³¨¢ª£¦©¬¤¥¦
zruugcgvidVWQDMF@IQB=B<:23@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤¬©¦°®¥¡¥¡}wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÒÃÐÓÖ×ÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÕ×ÓÖØÎÒÉÎÑÌÎÐÌÒÏ¿ÇÆÊÃÌÌËÎÏÅÆÇ¶ÀÊ¿ÒÍËÏÅÉÈ¿ÃÃÈÎÌÏÐÏÌÊÈθ·»¨¥«§£ª¥©¨¨|wsvoc`erb]R\IJFAEHI>;@8=4585:76:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´¶ÂŲ¶©¢¥¦¡¢«µ§± ¦«¡¡¢wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÏÏÕÔÔÑÒÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑ×Ò×ÙÕÖÌÎÏÉÍÑËÎÏ¿ÅÂÇÅÎÍÑÐÑÈËÌÀÊËÅÔÎËÎÈÄÉÆÆÈÌÊÓÓÑÕÏÒÌÒÁ¹Å²¥¨µ®§¨¬¥²¨°³¬¬
{zqstmacim_VP_JJBFCQM?<>44:=52755<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡© ¯®ªª¬¦®¸¨«·ØÔÕÙÙÑÎÐÀ¼ÌÉ·À¯§«©£¤±¶³£¶ª¬Ã§©©¡¡~recb__a`_a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÓÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÆÑÔÊÑÔÕÖÎÒÐØØØ×ËÈÍÃÉÎÌÉ˿ȿÈÉÍÎÏËÐÍÎËÎÏÇËÏÐÊÎÊÂÉÆÉÌÊËÑÒÌÓÒÑÏÐʽȹ°»¸µª¶°¨¸³¿»±
yvopnkadnpaW\ZIFFDLWE;@<33<=86855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6==?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦£§¸¶µµ¥®¾´±ÀÙÒ×ÚÜ×ÏÍËÄÓв«®¬¦³²¹«²¼Æ¢¡l^^^adb``aa``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÕÊÀÊÁÅÌÂÈÉÂÌÃÅÈÊÊÎÊÍÌÐÍÓËÅÈÏÌÈÇÊÄÇÀÅÉËÍÐÑÆÐÎÍÍÌÏÅÇÀ·¹½Ãýù²³¾±¼Äĵª¥¢
xpqknh``qhYXhVMGLIPPB;D>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;776?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±ÇùËÕÖÙÚÛØÍÍÐÉÖÖÅĸ²¶ª¤®¬¹¹±²Ä¬|ebbb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÑÈËÎÍÆÑÒÏÎÌÔÊÇËÎÏÇÇÏÒËÐÏÆºÄ¾ÆÉ½ÂÇÉÎÄÂÇÀÇÍÇÃËÊËÏÇÃÃÏÈÆÁÅÈþÀÇËËÌÎÂÊËÈÇËÐÄÅÇ»ÇÃÈÈÂÏÀ½¼¿±ÁÊǺ½ª±²§¥¢¤wntdl`^fqa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥³±¬ÉÍÊÈľ½ºÍÍÇÐÕÖÙÚÛØÐÊÐÐÒÔÊź¾¾°¨·«¾¹¸³¥~
t`[^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÈÆÂÃÀÃÇÊÉÈÊÇÁÅÌÆÈËÍÉÄÂËÉÂÂËÐÄËÈ¿¹Á»Åǽ¿ÆÏËÃ¿Ã»ÉÆÈ»ÈÆÄÊÀ½ÁËÆÅľż¼¿ÃÄËÅżÀÉÂÅÇÒÅÀÈ¿ÊÊÆÈÆÐÃÃÆÃ¯ÄËÇÄÊ·¿¼º´©¬¥¥¬£¡¥£ {vstfj[anmZ[XQDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ËÏÑÌÇÂÃÇÍÏÏÍÖÐÖÙØÙÐÍÔÎÏÐËĸÆÁ¶µ¼±À¶º{
vxurp_Z[]`abcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ±¶º²²³²±Â¼¼»¹¸ÀÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅþ¼ÁÍÂÆ¾¾µÁ½Ãº¼Æ»Â¹³¼Åö¿µµ¾¿ºËüµºÈº¿½ËÄÁÅÂÆÈÆÈÆÐÆÂÌȲÇÊÃÎÍÁÅÃÀ½³·°³¨¨¨¹±¥°«¬yvwjeh`hocV^YJEJFHKAFBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÂÄÈÎÒËÊÊÇÍÎÏÒÉÑÇÖÕÖØÎÌÐÈÍÈÊžÊÁ²µº·º¶¯
y~|tud\\]^``bcbbeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸´·´³²³ºµ½±·°µ¯²»Â¼Áļ¿»µ³»¾À¸Ç¹´»¶À¼¸½ÆÁüµ®²¶º¾´Å·»µ«¸¼½À½°º¶¯¶º²Å¼¶¯»¿´¶´Å½¾ÃÅÀÃÅÆÈËÆÀÆÆ»ÈË¿ÏÊÇÃÆÂ÷þ½¶¹¾Ç¿¬µºµ·¶xtxggebkn^V^`FKHHJFBCAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÍÎÉËÉËÊËÆÑÏÓÑÏÈÊÆÊÆÄÀ½Ï½³¸½¹·¶{y~wx}th^]]]_`_`da^cec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¸¸µ°«¬§¢ª§«¬³©«©³¶°²©®¦¬²¼º¶Ã¹ºº±«µ¹»´Âº°¿±½½»¶¼È¹Ã·ª¨°²À¶¸¼¯°§±³´»¼«µ¦®¶®º±°ª¹¯»®»¸»¿¿½¹Â¿ÇÃÅÁ¼ÆÁÈ˸ÅÇÅ¿ÇÄÃºÄÆÂ»ÆÉÌ˳¹Â¼º²rvvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>=9A=?@?<>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÎÒÌÄÆÁÅÐÈÏÃÄÇÁÆÆÅÅÌÃÊÌÂÄÁÇÀº¼»Ê·´»½µµ«|y~
z{wn^]]]]_`__dbbccb`_^[[ZZ]ZZYZ]enohfgiknr¹°µ®¦¥§§ ¤ ¥«®£§¢«ª¬ª°£¦ªµ¶±½¹¯·¯¨®¸´´¼¸³¼¯¸¹µ²¼Á²Á®¥©¢«±²³¨¼ª«¨«¬´´¦¨®¡¤¯©²¥§¨®¥¨·¬°²·¹º»±¼½¾¾Ä¿µÁÁÇÈ·¿ÀÅ·Ä¿»¿ÄþÄÈÌÊ¿¾ÃÀÀ©rtrji]aodWVXPHZRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·ºÄ°¶°ª©°±³µ½¯ÆÑÐÍÄÈ»»ÌÃÌÀ½Ê¸¿ÅÀ¼ÌºÃÆÅº¼Ã½¹·½Å¸µ¸»®²{~~xt|swf_]\\^_`^_ccab``_^]\ZXY[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥¤¡£ª£¢¥¥§¥¬ ¤¦¬²¯¶·§°¬§ª´«´¹°¶´¶¹²°º¹±·¤£¦±§«¨¹ª¤§§¨§² §¦¤¦¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹ºÂ³À½¿µ¸»½¾¼ÂÇÄÂÿ¿Ä wpkaf_ko`UY_HNhOTHEJF<=@=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676778666;::;9:;<859<:>>@;ȵ¶½¸ºÁ»¾µ ¡¦º¶«³³»³ÅÐÉÌÃǹ¸ÉÂÎÁºË¹½È»·Ç»¶ÃƳ½Å»¶¯¸¿»°²¶°¢}yvtomkjjqi_`]\\]_`_acb````]\[\\XYXXXVX[]^dcbegggjmo© ¡¢¡¢¦£¥¡§¢ª°±µ¢©ª©«¬¤µ¸·¯¬³µ®³µ®°ª£¢²¤¦©¸¢¦¦¨¬« ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«²²¹²½´¶±±µ´¿µ½À½ÃÁº»½zrk_e^ddXTX^IW]KPGIJFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÉÉÁǼ¼ÅÅÐÀ¼ÊººÂ»µÅ¸µÀÁ³Áû¬©´¹·§°³©ysnpnkb^bff]]^]]]\]_`abccba_\[[Z[YXWWWWXXX[^bddeffhikr¨¡¡¡¨¥¦¡¥ ®®² ¥¢«§¡µ°±±¬¨¯³§º³¦¶¡¢£¡£¡©µª¢£¦¥¦£¬¡«¦£¤¦«³³ª´°²ª²¹´¯©¯²²²·³®©¬®±·°º¶¹½¿·²±
yue_e^[YVSZUK[QLIEHKIB=?AA@@:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾½¿³¥£¥±Âµ¶½´¸ÃÍÉÈÁƸÂÁÈйÃÇÀ¶¼½¶Ãº¶¿Àµº¾º©¦°º°§±¯}
ypqtqhfdiec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXXVWadecdeddhjv¢¡¡¡¨£©ª¦¯°«££·ª ®¨¶©¦§°¤·°¤· ¢ª¦¡¬¸°¢¡¤¡ ¡©©£¡£ªª°®¨´«ª¦²°¥ª®²±¯°®¯¦§§²®±´¯¼´¹·®£yud^aVYWSRTKM^LPKGGLKE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§£ª»À½À¹®´¸ÂÍÈÇÄžǺÊ͵ÄÅű¿¿¹ÀÁ¹¿À¹¹¼·§¦°»¥¨ ¤~xrjlrtpihedgb\\ZYZ\\\]^]\[\^\[\Y[\ZXVWWVWXWWWU[ccbbcbcdfj ¦¥¤¦§¤ª¯¦¢£¶¨ ¡¢¨³¡¥§¤¯¥±¬µ ©¡¢¬±±¢¢¡¦¦¡¢£¥¥«¤¥°§¥£««¥¨®¯®«¨ª©³¥¦«¯´±®¼µ±¯¯ zvrda\[]XNLQGRaMWPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»²·¬¤§·»¼Áź±¹µÅÊËÁÄÇÇÉ¸ÈÆµÅÂɯº¼Â»ÂÀÁ½»·¹µ¥¦±µ¡wodbgihfhjgjm`]\[ZZYZ\]\[\^_\ZY[YYZ[WUXWTTWUSTRU``_`a_`acdi£ ¥¡¥¤¤¢£¡ªª¥¥±© ¤ª§¡¬©¨®¢¡¢£«©°¢¡¢¤ ¡ ¡¤¦£«¥¢¤ª£«®¤®±©¦¥¦¦´¦©¨³µ´¹º¯ª¬rpo`[WVUQFQOHZ\ORJTKSLEGIC8;;=<8667:9;:976977:;:=<<7;<8>598:88659:;<97?<9678452121..1426:86:8598989;9@9{µ´´»²°¬²§§¯¹¹³ÀȺµÀ¯ÆÉλÂËÍÉ·Ë¿´ÀÇ̰¶½Ç»ÁÇý¾¶¹´¤ª¯®|uijjmhjlnkkme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^^___bdm¢ §¨ª¨ª¦¨¥£¤®¤¥¯© ®ª³¥¦££¡¨ª ¡ ¡ £¢ ¢ ¢¨£¢¨« «¯¤·¥££¢¬ª¨«¯³¸²½µ³«¯ssh[YYRURFYLP\YMTNPLPRINIB<??A?<65799<<987:79:;<=>;7;;:=57:;8976989:6:=99577571141-+/434988::8::748=8?9~³®¨³¶®©¨¯©¨¬·¶¬¼Ê»¶¿¬ÌÇÆ¹ÂÏÐɵƾº¾ÆËµ±½Ä¼ÂÄýÀ²¸®¥ª®ªwxoninnnqggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]]\^_`d~¢ ª©¦ª§¯£§¬ ¤¨§®§ª¥¡§«¥ £ ¢¥¥§¨¨ ±°¦°¼§ £¬´«®§°´°¹µÀ±±«}qrbVTUNRIGVQSRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¦±·ª¦¢°«ª§©²±¤¶Æ´¹º³Ëƺ¼ÃËÑ̳¹º¾ÀÄǶ´·½²º»Ã½Á°³°¯ª¢khnoroqkpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzu¨ª¥¤ª§ ¥¢
£¢¢¤§¡¡¢¥¤¦¨¦¡ ´²§²·¡¢·¬ª¤²²¦µ¼µ««±£xrm]NPQLOCMNNPKFNNJJNMQIMJAGKHHC>858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12776:999984988A7w¶§¤¶°¤§¤©¥ ©¥¤³ª¢²Ãµµ²³ÇǸ»ÄÊÍǵ¯¼¿¸¼Ä³³®¶¢¬´Ã¹º©«³®®§}^`gsqvqjnifhhj_XYXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKLSWWVXXYX[]aosvq
¢¡£¤¡s}
{¢~~tz¢£ ¡¤£¢´¯¬¯¬¥¹¦¥°¡°®°»ª©¯ªvrcVMROPMCSNLQMCPPHINSMHJJDJLFKK=749888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-12764789::65:87A7w·¢£´¨¥¥¨£¦¥¦¦¦³§¥´Á¸¯´°ÊƹºÂÏÇ¿µ¯½Ã¯±Ç²§«¤®¿·°¯¦¬¬ª¢rWV_hgihincjhgb\XXXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo{
syz
}xro
~¡ §¯©©¨´¢¦¬«§´¢©£}rm_[NSRVLDTJPMLFOOIELQMKPJIMPFIH=7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9x· £®¡¦¦ª §©§¢©°¨§´Áº±µ°Éù´¿ÏÀº±±¸Ä«®É®§£¢¹¬¦§¥¤£ iQMRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`moi{tPB@}x`JQnx|n~wuvxpQ|~xvhw
~¤£¨©¥£°«¡¤¤¦ª¡ª¢¦¨tle^[HQQRMIUMSILLPIHFKNLMTKQQOFIC<769:8:;;8:;8>?99>=7;<6;;478;6775344696/3/.115221/,')+*,4833979:99::::?9v¶£§¡®¡§¨¥§¨¯ª¶¼¶¸·³Â¼·¨ºÉ¹·©ª·¸¶Àª¢±¡eMLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut{
{uxsnupty}ª
yzhv{prmxxz{vsrwguz{© ©¥§¤ ¤qg`\\JVOQGKXROJMMRJJJMPHLQLRTMEHA<77;99>=:;<98@?::>=7==79937795675252572/2.,./200/-+(().1272198798775:<<7v®£¡³©¯©¥¬¬°±ª½´²¼¸¶ºµ² ·»³««¬µ³¥£fJIJIGFHHPTTTWWSTUUUVWWWXXXXXYXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQRSV^u}ygw}gyvx|r|v{ok~|s{}tfv|
lohs|lyq}pmuqhq}pC
~wwz
}zu~£¢¤vmlebZXXTQJSUTOPNQVKNKNOJQOIOOKFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«¨©±¯±¬¼¸¬»¾¹³¨±¨§¬§¤~|z
eJGHFB@CDILLMQRPQSUTTUVWWWXWYYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{xo|yy|
omxsxjjr}Jnhw~licly
ksl|nr{hmp~s
z}~{vott
ywp|~mhmnnWUWTQQZOSUUTXUMNHMJMNKCINGE@:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¤¯¢¬ª¨µ¯®¬´¿«¼Â¿¦£¥
¢¤v~
|x~t}xuw|fOEGD@<>>AFGGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jrAo;<95<_IMOORWZRY\`§bitze~pmzutlts{jkLyg1vsl~}tfet~
filukp|gpp{n{s}|qpnum~wytiyyuiingdWQYWXY[MPUVZYNIIEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226,+5775478iO8;5n¤¨²¦º®«²°Ã²»ÃÇz
twvwvywoxsiUFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯³ q|xm}mq
yyr txsu5q¨¡¡¢vp||shfbinrmpuioXuovlz|mqmpzsumbv
ux~}yponj^Z\][YX`_SN[[YXLHJFJG?CABG?CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥µ©±®Á³»ÁÆ}nv
oy{{r|t|ko^JPG>@7458;;<=>@BEILLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lv|}
~v¢y~
aªzv~s{\dqtz{wlgiaxo
znwszpsywkni]w}|}q|uw{}tnqref^[Z]S[f^WQUY]VGKKELG?F@DC?AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\w¦ « ±©¯À²»Æºzvk~
yu¢s}lylSXLAE311266688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRKi{y{q|{|~v¡¥¬©H°¯©sl|}hggx~n
qGkwqyvhmk_w}
z{uv|wmow~~rqpj[\\[cbXge\UPQXZQDLLGOIDFCCA@CA=988:::;;:888::?>6;>7595773344236756768;DFLMMLC7+"&'+)+++/00+nu22420L\5=<^t|~
¡¬¡¦¸¯³½´}tp~}¥yuy_cWLC60./23123668:=??BEGHJLNQTTUTTVUSQOGC?80,#[>?94.]ps£UFIKMNPW`YpZ\_j
~
¡¥»±§»Çç¡¥|r~v
ihotqw{v
}nvug¢«£{zzogkx}x|qic]ZY]i\af_ZOLNXSQIQKDNGCKDCADDA<:87=<:<:88778:==8<=68756623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nvpgx{¤¡¬¦«¯°¡xw}~mpj^CA4--////02234779;=?BDHJOQRSRSTTRPOHDB<87/9C><<63.lMPHIKKKNV`cggnu ¡£©¥£¬¨¶¢¨Áîȯxº|¡
¡
lpuvql
r¡¥¶©¢~kjk}~~q_[b^Yfj\lk_XKHOSQNMLFIQDDNFBCEGB>997=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªhf¤~
z}
xxhNR>//.,/.-/000212457;?CFNPRTPQRSQNPIED>;<:CF?><852<?R5HHHLLMNR^o|s} §¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÉ·ÉÑϾ pi«©
¡§¢wz~¡{v«³ }¤£§¶°¨lss|}znf^[_^agd`gg\REKKQOIJMFFMCHMFFCBGDA:85<<899975658>75=84745754546958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f3A@ib^Pqu`n}aw}|ªªBD}y|
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=FH@A@8662<9;FHGIIMOQYmw£§ªµ½¸¥®¬¬¨©µ¬±·²²»±³¾³Ä¬»É˸Ŀ·¥£°²¬ª£
¦¦ ¢¦¢ª¨¤
£ ª ¤©±£§·»¡£°££¤¢«°³µ¢¦ªz{~|e^fZc`]bc^fg_[ODJHTOFILFKGFFHAKFCFFA;87=<88:974658<54<76:54644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicXjpXz
v
ÚÈsV|{
qna@E64<3/110-,+-1/-4?DANVQRTUUWUM\QGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇÄ«³Å¶´À³¸¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´°±§¯ª¤w¤¡«±³©¨®µ»²º¬¯µ¢±¬²µ¼¸´®µ ¨¨£¨©°³º¸¸¨¸©¥ ysX_bUd``b__f`[UJDELVQIJKEJHEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL\ZQbdWzuq}v~{¿»£¼´z
zyn]W@EN<6:46AB764//6CHCQ\OQUWU]WP_UIKJA@?GKFFD;>@7D7?BJJEGWTP^¤®¤²´Ã¶¸ÁÌʶ»Ä½³´Á·¸Âµ¿°¸t±´¦ºÅ¤°Æ¹±³²´¨¤¶¶ª± ¢¢¥±¥¬§¤ ¬³º¢¨²¹µ»¾Ì¿Å޽³Â·º·¿¸º¸º±¦±ª®¾°½¼Ã컨®«~zhU`_VhcidV[cYVTIHGLQGDIJAID>?BBK@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYVZwjp
o{rxb¹¡£{{||}xzufO\dGEL:Qd`[^SF?;HPDZcQQYYZgZT`aMSOEA?IJHEFA@C=E6B?HGKMSZT^¯¸µ»¹ÉÀ»½Êͼ½Á¼¸¶¼¼·¾µº³Æau²¥±«¾ª¥¨«ª¤¢²µ «¨®¥§§¥¤¢§°³¨²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÄÀ¾¾À¼¼¸´°¹··ÃºÆ¾Äɰº«¢¬¥©·|o]__]U_]heSYaVRVIEFNKA>HE=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPOQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@JMPRLQ]hmlqslrrtÕÀµ }y{{yt}zkepvY]\Peeb`ed][XX\MdmURmn_o_XgeUYUKDBKKHFHHHHBI9D@HKTTV]Z\¹À¹¾¸ÆÁ»¹ÊË»·º¶¹¹´¸µµ®¶·du©p^¢¡¢¤«¥¨¦¤¬¤ª±·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀ¿ÂʾÁ½ÂÀÅÄÆÊÀÉÏ´¤¼±µ°¬¹½}vi[^ZX[^XbbQ[`SQKCBFGE<@F?BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;.&**(-.0,@M+/54mI0Ht?>BD@CDGKODR\Zi`onlotu³¬¡¡
|s{
{tt{ylmu|iseilhfjii`fiimZmt¤½g[oh^ZYTHKOPJKQLTQHLAJGKP__bgjb·Ç°º´»¾¶±ÅǶ°¹±±»³±¨«¸¶¨§N §¥¡¦¬°¨¯§³³ÓÔÔÖÑËÏÓÔÎÓÏÌÆÃÊпÊÉËÉÒÈÍÎÃÐÒ¸°Ä½Äº¦·»Ä¢laZ[\W^VXdYO\WNQCBIECI<AD>BH?@B8;D>@I=56655;:687654/10146278875367C5B8?-0,1348=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshroyy¡ª¦}
|p{r~qyulpxr{nxslipmcinpyiw}~Ë¿Ãß§ncxod[a`KPRUNY_P^]NQNTQUT\nnwr®¸¬µ¨°¶«½Á²«µ¦¥¹¨¬¯¡¬´¤±®§«¬¤§¢¬¬ÎÒÕÑÍÌÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓ×ÍÒÑÅÒÖÆÁÏÈÈ鿸Ðwlc[`[U^Q\ZOOTPNH>AGBCF=AB?FE>@?:===<JB45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwlwp}~ ¡
y
{r~z
v
owsls}|w|sxqkrriprzys{¾Ë²vr
wiaj]CZZ[WfdXekTX]]`c^cx{ª¤¤¢ ¡©¦ª±¹«¦´£¢®¢¤®¢§±¦k¢~¬§°¢ ¡¥¤¨ÈÍÏÇÂËÐÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÊÔÚÍÊØÖÑËÄÃÌpm`^]VRWRZOJGJIJ@;:;EBD=CD>HC?CB;<9<:GC46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu~isyr
x~xs|}w{oxqmuvx}t|ylvun}v
vy{µ<AÆ¥~}jeWICecfchjdoy[_fhknin £¤¦²¤¥³ ¢¥¡©¡¢±~
zª£}ª³§¦½ÃʶÅÍÑÐÒÐËÒËÉÔÏÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÍ´utlb[WQSPXUEFJIEE=:7:@BC:HE@EDBDA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?2*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopbqqt}~
}x
zyq{{
uzzp}ppzr{rnzuw}}u|°tYªÂ·qnc=^hrpqpnxweiorvxr{ « ¡¬¢ ¦¬
}
~ly{®«¦®µ¼©½ÆËÈÉËËÏÉÄÒÊÔרר×ÔÛ×ÓÙÛÖÏÛÚÒÖÉÕÌuxfeXWNQR\GBEII>A>=8:>@<>H=@BAAEA>?:87DB755479.566435532323647553458EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbflvqy~
|}~wyn{{tz¡vvtu~too
u|
zv|¸Æ¥ÃʸxpfNec{w¢yzw{|um¦ £«
{|¡¼¡¨¦¥§µ¾À¿¸ÆÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆvvdfa]RUUTMKDMD;=<<9:<?9=A7>?@=?>=9867CA6455=80665547745613854564567HH=DJE7925;H>;9:7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa]\itzylwvz|~~
{~
z
|v~um}}~t|~x~yot}
|~{©Ã ½¤~}ss¦
{iGq¡¤
¡¦
¥¸¡¦ £®¶º´«ÀÆÊÐÈÇÍÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¶vutgfbT]YROOHCLC==>99;:99<=6@>?==9::;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWO<MTHN?96333>C;[X>5YypZ<<A<=>8589?<DRSRX_VXfmmmiqsx{{||{}|~uzszsm~
~w¡n©
{ |~£¢¤¯ Wr«[¢£¢
¥
³¡ §±¸¬¤½ÂÇÍÈÆÏÌÐÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚlyqccZZVQUWC@ID??>:49:;7:;:3<<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbxlb~omwxz{}||w
sp
{uwvt
}¦¢¦¢¨r²¨
£ ¢©° o·ÄȲ¢¦±d¤ÍÇ
ª¤¢
¥¨¡¢²´¥£¼Á¾ÇÆÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎo{d`[\[MISYBAGD;B>837<<:8>64::<:72?:929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcGv}|m~xz~{wv|mn{}xx|
~¢³§£«³¢§¥¤®¢¸³¢¡¥°£¤§¨¬¯¤¡À£É¸«£¦²
¨¢
u³¥¡} ±®¢¤·¾´ÅÇĽÃÃÀÆÍÊÉÓ¦ÎÌÓÒÑÖØÓÐØºovrY^S^TNHIMEBCD5>:77:?<<7=42669774>5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGMZ\YJf`;Hzzn
z|x~px|~}orz~|x¦»¨²½°¥³³¨£¡°¬µ£¸¥¥©¸§¤£©ª¤®°ª »»®Ê¡j·¸«°£¬¾£^ª²|}´«¡¡ ¥¯¨¡¥³¸¬ÂÈĶº½¼ÅÇÇÂÑ ÆÉÍÍÅ×ÖÑËÓmweYWP\PNEC><CAB8@885?G==6<35345454B49:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdHb`bpJ@~s}un}|}pww|ªÂÀ¯½Æ»³´À½´«³¶¨³½«»¥¨º¸«§¦¢¢¤£©¯²±«¤¢¦¦¤º¯©À¼®²¹¥¤¨~½°z¨±¬¡¤¬¡¡§¦¤¢¤°³§ÁÆÃ¯°º·ÅÄÿͦÇÄÇĽÖÐÍÄÊ
qp_YW\XLJAKAFG?A@C;:4>A==5=6>343241A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUO79GD?CF\eF`igZ]\{uo~{q~{z§³ÆÉ¿ÂÌÂùǽ»¯«¹»³·º²À®¥Á¤«°¼½ª®«££§«®´°ª ª¡°µ¨£ºº¶Á¼¬©³¥¤¨
©Ääy¡¦ ¯«¡ ² ¤ ¥¤¦¦¤¯®¦ÀÄ¶Éþ¶Ï²Ä¿Ä¼³ÑÊÈ´rvjZUYgPLHBLKLJAA>DD<5AE;;3=8B332263A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeZMe\fTbkyr{xz¡¨º½ÇÈÉÁÒÉÊÂͽ³¼¾¨»À½»Ã·¬Á©¬³¼¾ª°ª¤¥¤¬®³¶µ ¯¥¢£³½©¨½Á¤¶¸°¬²¬¬¬©¦¥¥uy
££ª¥|£¡µ¥¥£¢¥¦¤£©§¢²¬¨¼À拾·Ì¿¹¯Ä³»¾Á¸¬ÂÃÂÀjw_VUYXJJLIFDDHCCADL:4DI:;4<8E.12352B25SHN<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>iH_XbZccV x
¡®§¤Â½ÇÃÇÅÓÍÎÍ˼·°º¼´½Ë¼ÃÁ¶·¼³¿º½®¯¨ ©¨¶®©²·£¨¡«·¸ª¥°¿Å²¾º´¨«¶´®®¥¬¨²Å§||ª¤¡£¢Z¤e£²¥¡««©§¦¡¤¨¥¶«ªº»Ã´¥´µËÀ¸ª¶«²»¸®¨¸º½¸hkXUSSMEIRMK?AHEEHHH95EM;>8=@J.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;>@BFBpEjIReaLF¥¢©¦¢¯¾¯¡Ç¼ÄÄÇÆÎÎÎÒʾ»¶±º»¼¾ÏµÃ½¸¹·³±µ³¸³«§«¬¹ª©§¯¯£¯¥§¤¥µÀ±¬¬´¿ÃºÀº´¨º¶¹´¯¥®®¤¡tÂ}±¥£ ©¡ `J¥U° ¯¤®®«¥ ¥ §¢´©ª³»»»ª±²ÇÀ¹¦¬«²²£¡²²´¤mkcZWMOJDOOPR;GKIGICC>:KU?A:=EM07534:B44MWO<JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨°¨
¡£¥µÉµ©ÆºÂÃÈÊÉÈÌÍÆ¿»³®¹¹ÁÁ̵ǺÁ¹µº°¯¯³µ§¤ª´µª©¦¬¤®¥¤¨¬»¿¨¬¶·¿Á¿¾¹´³Ä²¹¾£¯µ¬¹¦¦v¿®¡ ¡¨¨ª¡§nv¢¢®²£ª¨ªª££¤¨¢±§©«¹¶½²²®¾¹¶ £§¨¥¦©©`c_^OJKFGMJVL=MENKLBCD<QV=AABDO18=77?B75UXO?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUH~e^HE«¡»¯««¡££¤¶Æ¾´ÀºÂÂÇÉÅÂÎȾ¹²¯¹µÁÂʵŲÁ¼µºª¨°££ª´»¦©¦«ª©¯§£ª«½¼¨½µ¸¾Ç¼·¶¸Á²¾Á´ªµ·«¾¥£¢ ½ ·©¥¢¡¨¤³ ¦¨ª¤¢¢ µ¯¥¤¯«ªª££¨©¤¡¡³´º´¨µ²³£¥ª¡u]Z^\IGEFMQIMEGGBSLJBEGAVSCH=AGQ1;B7:BF79\YKALPTUSMWRNUJE@JJNO9C@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19f\FCCpbGE§¤Ã¥ªª§¦¬¢«¶Ä¼¾·ÁÂÀÇÄ¿ÍÆ»½¹²°¹³¿Ãȵ¿°¼¶¹¶¦¤«¬¡¡ª«Å¢¤©«¦¬¯«¢©©¾¸§¿²¸·Ç¶µ¹¸À³À¸µ³´¯¾££®¢£¥££½¤©¨¬¡¥½¡£¢©¬¡¤ µ¬¥±§®¦© ¥¤«±µ±ª¥ª®¬ ¨e_W`\NHGJNLHEDIA>QIA<GIH\ROK=HOU4BF9>HG5Ca[KBNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA46@9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ9mRF<KxeaVK¢£Å¬¡¬® £¤ ¦©¬¶±¢ª³¶ÅĽ¿µ¿Â»È¿Êǵ¸µ´±³´·ÁŶ¾±¸µ¹´§¬ª¬¥¤Á¥ª® ¥©¯¢¦¨½µ¦±½¹·¶Ä³´¸º¿´ÄÁ¹¹®³µµ£¥¡® ¢¨¨«£Â¬©¬®¦ ½¡¤«¬¬¦¢W¥¡ ¸ª¦µ£± ®¢¤¦²ª©¢¢¥¥¤_bXb_KHJJNFEAGK?=JB99JJN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrGE6=ue\KM¡Ä¨¥¢´¢³¨«¥ £¬©¬»°¨¬¶±ÇÅÁ²ÂýÆÄ½Äɼ¯°¶°´¯¿Ä´¹±°¹´¬¨±©ª¥¡§Â¬±ª£®±©¤¨½¶§·»¾¯·Ä´³ÃÀ´Ç´»¸¬´¶ª¢¦¤¬¢ §«°¯¯»²¦ ©©¢£¸ ¡£¯°¬¥§¡¢§³¦¦³¢¬¡¡¦«¯¤¦¢
_dZfdJHLJSBC@IH;;F?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<25-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 餪³¢¤µª³§¡¤²¬®©»²±µ´ÆÀÄõÀľÉĵ¿È´«µ¨°¹¬¿Ä³·®¬¶¹¥ª²«ª¦»´¨° ®´²§«¹³¨º´¹³¹Àª·²Ä¾µÇ¨¿¯®¶µ©§¬¡¦¥¢¢¥¯¸®²µ¶ ¨¤¤ ·¢¥¥¯²²§ª¦¢¨ ¡®²¢¦®¤«£
¨©ª¡§¡
wbg\jiMONNT>CANC;:I?77RO]_RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914801-/.<6-#Bqgsk23/1[bZ33806p[bH05IohUCWFyfC;¤£¢¦¿§§¯±¡©¶«º±¬£«´¶±°¹·°·¸¸Ä½Ãǽ½ÄÂÆÀ¸ÀÅÀº©¶¤¬»Á··©¬±º¢±²¤§ª¹ª¦±« °´³ª©¶¶½´³¹¸¹±Ã»¿¿¦Ä«±·¯©««§«¡¢¡¢±¯³¬°¹© § ¶©¦£¢±±´¬³¨¬ ¥¢£³°¥¨¢©¨¦£
}igk`lmWPQ[UABET@<;IA7:XPd^PWWEY_^MLRN^KJ>Zc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/261--.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=¨¢ª½¢ª°¬¤²¸ª¦¶µ¬ µ½¯³¸»º¾·¶À¿ÈĹÅÂÀ¿¸Ä½Á·¯µ§«·²¼¾¾´¨®±¶«®¨®¦¨§»¥¬³¬¢±°³¬ª¶´µ¾®°±µ¬°´³Á»Æ·¬½°±¸¬ª£²¦¥ª¤ ³ª³«ª³§¡¦¤´®¨¡®®±¨´²ª¤¨¤¢¨µ©«¦¥£
{dkqgoq^FYfVDBMXDZ9HB6>\Qh\OY]G[^]OMRXdJJC\b_PKMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8)C3YU\gK6zfL@¤¡¥·¥ª¦¯®·ª¯µ»§¦±·Å·±¶½ÁµµºÄ¾ÌƹÃÀ¹¾¹Ã¸À¹²´«©º¶º¹¾´ª°µ§¬ª¬«««¾¬®²£« ±³®®¶²¹¸ª®¯±¨µ¯µ¼½Ê³ª·µ±´¯®§¡´ ¨ ¦²¢ ¦¯¡¤£¥¨³©¡¦³¬«¶¥¯²µ¯¤¬§«·£¡ª¥¢¢ z
{jmwmu{aE`kYIHZZ={JFD6AbTi[M\aK\]ZRRRb`LKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T_T_/5(C_Q\.+B/JGP[G3cYTKD¡±©²ª¦¤¯®¶©·µº¤¬´·É»´»º¿¿´³·ÃÀÌȼü¶½¿¿·¿¼±½§º¹·¶Â¶«¬±·§®«¨£°ª¯»¤±³§¨£²´±²±µ±¸´©¯¬²§·¯·´ÄÆ·©¶¶¬°©¨£¶ §±¡¤±§ ª©£¦¦¥¸§£²µ¬¨²§®±¶¬¥ ¬¨©¸¢¥ §¤ v{lovt{~\Kem\JNd\?b{GI8GgWe\L^cMXYWUWTi]OOH`]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANGf27'GbLV%-B.=ELQ<3rkICC¥¯¥®¯«¨¥±³´«·²¸¡«µ¹É¹Á»Â¸³±µÂÂÎÅÀÁ½´½¿¿º¾¼²Ä§©¹°¶¶¿¼®«³± §±¦¦¯¥²µ«±²¬©¨µ»¬µ³µ´ª¬¨¬©¹®²±ÈÀ¹¥º°©¬¬¥¨®±¦¥£¯¤©¯££££¤ ¢«¦§¹¤¬µ¶¥«¬©°¶®¢£©ª ¤´¡ §v}
|{|prq}|}\Sdn^NYg\FD[G;NmXb[L`bNVWVWTXg]QRLcY[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/+1()+,-*&5*/&0)38:1&*3Bc:6*HeHJ+:H>3BHS,>k;GHª«¢ª±¥©¥³µ²µ¶²²¡«®½ÌºÀºÇ±´´ÂÃÒÅÆ¾À²¾À»¾·»Ä§¬·¬²·¼À¯«±¬ £§ª¨¤°£ª²ª°¬°¯°®«³¼§·±²©³ª«¥¥£ºª²Ãº¶»©©§¬©¨²¦ª¤£®ª¨¢£¥¬¢§©¢¦¤«¸²²¡ª¢ ¬¯±¬ §§©£ ¦
¤~
|v~
rqpuk_Y`nbQsq\K;|F?WtXaZNd[NVVUWQ\a^SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1;\J0.JgDF8;B05EKX1@Y=LE¨¢«³ªª°·¸¶¯«¦««½É¼°½¶Â¯±¬³ÄÃÎÏþ¿´ÀÂú¿³Èë®·²¸¾¾²«¤§ª°¨§¨±¥´®«±¯²±´¬´¼¤¸³¬¯¨«£°·«ª»·¥·¶¤©§««ª®¡©§¦±²¤§¥¡¡¬ª¡ ¦¥¢«¤£§±¸®®£¦£ª«®©¢¥¤¤
¢£}zs|ru¤xk^`nfWecN?gLEbyWbYReTMVUVTO\]aUKNhVVWIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06VZ.0JgAA<<B+:JO^4D=GFD±¦£¬±«ª¶¬¶²¬¦¬ª©¼ÀÀ·¸²»µ¦²¯ÄÉËÑ¿À»¹¿¾Á¹Á¹Àıµ±³ºÀ¾²°®¬ª«¨¶ª¦®¯ª¹°¨²²¯³·ª··§´·«¬¥©ª¤´³©¨¤´µ ·® ª¨ª¨«§ «¬©¹µ©ª©©¢ª ª¡ ¥¢¦£ª§´¯¨¦ª££¥§§ª¢¤£ ~
¢txt~yv~orggpw\askO^VHmxUdVQcOMVTUPOX[bUHOiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021&/2Qb02?f=NX>C,>LT_/Ji5OD<±¢¦«¯¬¥°´µ°¬¦°ª¨º¾»À°®¹®¡¶°ÈÇÈÑÀ¾½»»Á½ºÂÀ¾¿®²²±µ¼»Â±±³«³©¤µ¨¥³³¹±£®¸²°²»«º°ª®¶«ªª¬£ ¶©¡°³¢µª¨§©£ª¡¢¬¨½¯¬®¢¨¨ ¬°¡¢ §§¨ª±ª£ ®¢¡£££¨¨¥}£wt|uxyyssyg¤vi_ektg}SXo^JxsSdTQ^MMRZfNLVYdXGRhRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[*HM9U@4³¡¥§¬¤§¤§µ³²«¥±§ª¸¾À¼¯§¹ª¦¯±ÉÇÈÑü¿¾¸½¾¼ÈºÁ¸°¯´±º»¸À²²º¬¸¬¢´§§¬²¶¹³¨¨½¶®¶¾°½§®¬µ¬©¯£ ¥«¨«³¥´¨ª§©£©£©¨©½¬´°®ª¤¡®³£¤¥¥¥©«¦«¢¢¥¨©
~
~}
¢~r{z~|hx|ytop{gxdagarzmgx]^T?W{mTbPQXKLNru]HZ[gYEUePD>JODCA9HGKS?jbJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GjI14X=fcBJ7GS`U*=9DW=*² ª¦¥¡«¥¸³³¦©±¦¬¸Á½µ¯¢¸¨¨°ÂÉÉÌÁ¶½À´·¿ºÈµÂµ³²µ²¼·¹½µ¹µ¿ ³§««°µ¸µ¬¾½ª³Á´¼¡¯³µª¬°£¦©ª¤¥±§° «©§¡©¤¨¡¼¨®±®¡«£¤¯¦¡£¤«£¥¥ £¥¬{{}£}yk~vyxc|zpooqvgsjheg_lslaio`o=ZykU^OPQJIMTZWM]^lWDW_O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>)49&'.34.0+/4&,:$41AhY13S>e_DL6KVdO*;1NW=#¡¨¥£¨¤¸°¯¤¯°©«¸Á¹³¹¯«¨´ºÈËÈ¿¶Â¾¯´½·Ä¶Ã²®¹²³¿´º½·¨¹¸½ª£´¨©ª±®º±ª¼½¥°Áµ¶¢¯¶µ§¦§°³¤¦¨¢¥¬¨© «®¦ ¦£¨ ±¹£±¯¡¬¡¤§¦©¤ª§¡ª¡©|~}| x
}
|sp}qtt`zxhmopnh}qc{mieb]e
~_ZsjqJIiXZNPLJHPRQIO\_nSDXZRhOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-B*,4;NN@;73-.+-7**<%53<fd24M?e]FO=QZgH*>/WU5(§¡¡¡¤¢¸ª±¥´´©¨¹Äµ³·®°´ÆÈÀ¶¾Á¹°´¼¶¾»¾¯«½°³¾°¼Ã¹¨»º·§§µ¨¨«±³±¨¿¸¦¼·²±·°¨¥§¯±¡¤ ¥¥ °§¡£¨¯¡¡¤¤¢·°¡¦±«¬£¯ª¤©¥§«¦¢¨¢z~zx
~zzprwoot_ywdkkkhgmerkkdhXas^ZluiYE}][XOOKHHRUG2:^^lPDWUYeMHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84HBg[HTCT]hE.;1^Q,2¤£ª¦¡£¡¸©®¡»¸¥¬½Ä³°®¢µ¯¯´ÄĽ³¾º·°³¹¸º¸º®¿³´¸¯¿Á·«½º´¥¢³«¨ª³¬®²£Ã·¦©··«³»ª§¦¨¯«¢§¤§¡³¦¥©©¡ ¥¤¹©¤§¦¥¡¨©¡¡¡¡¡£¬¢£§¤y|
}x
{w|lurmlsbythfigemgghdfhi^ebifYezb`PsT[[SKIGIOS@!+i^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB377aL'2¤¥¥§¤µ§ªº·§¬ÃÀ·¯¬¢µ®§®¯·ÁÀ½±Á·°®²¶µ¹¸µ¬ª¼´¯²±½À·®¼¼±¤¶¬¦¦µª«¯¡ Ŭª§±µ¬¬´º¨©«±¥ª¨¥¦®£¤ª¡¡ §¶¦¯ª®¡¡¡ ¦¢ ¦®£¨ x
w{{s}gypkklguskagdbsadefeiibfoZ^X]lcaMgW[`VIGHKMRX?9`liGBUS\[IHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=++,/A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3@bF%5¤¡® ¥´²£²¾·¡±Æ»º°°£¶¬«®©¹¾½»À²¯¯®¶®³¹³§«¹±¯®³¶»¶¯¹¾¬¦µ« ¡±¥«° ¦Å¡³¦°³°·µ¬®¬®¢§ª¦§¦ ¥£©°¦¹§®¢¡£¥¡©¨§§{t
|
pgynhkjgqrk[hcar`dgknkfjfdl\mmvqaSbhceZIGLMOYQPVaeT@VRZTFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.4<;K6/.+,-24:5#3*)6.55465Z|]1:Kj[M[KXdc@A1HbB'4£±¡©³°¹À¶¡´Â»½¹±¦¶°©®¥¸º¸¸¬»°««·ªµ¹¥²µ±¯©±¶¶±³¶»§© ¶©ª£ª®«Ä¯¦°±·µ¬¬±¯ª¢¤¬©§¤ª£¥ £«ª©º§¤ ¡k£q¥v¬¨¢x
mi~wrl}o]d`gkuxghvifX]itnNPjcfqf^dfoki]\^
hOKC8ETg]JHPPUVLHSapteF[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl15Ok[N\K[fb>G1Na<+/¤± «®«£½Å¯©·Â¸¾¼§¶±¦«¤¸´³³°¹®ª§¬´¥±µ¢§¸¶µ¨§¶³®´®´¢©´«£¥§¨°¿¨§±´¹®¤¨ª«¦¡¡¨¨¡¦¦§¨ ¨ª£´¯£¢££¡¡¢¥¨rx uif~sy o~|¡ {tvlnied{mrbTmcmiqXipnW]i[kjZpmyrhY^FM>F^MERVVQPRWTg^LZLRRPEFG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I:/01.*/(-4583%&2115>1<8Xt15Rk[N\L[g_=K1T^7/(§¬«ª¨ª¿Ã¯²º¼¸Á¿ª¤·±ª¬¦´µ®¯³¶«©¥±¥¶³¬µ¶´¦§¨³±²¨®«¡³© ¤¥¢¥±¸¦§§·¾¦¬§©ª«§¦¢ ¡¨¤§£¥¥ª£¤¦¦¡¶¤£ ¤®ª£±¥® zÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«±yhlX±®oei¼¼nhzmpØ~Skb¶²~qu¡ªVNXaOVNFU\XQPR\W[P@\DPNCFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww11Tk\O[M^g\>L1Z[41!§§ª¥²©±Â½²µÀµ¸¿Â«¦´©¨°µª°¶´¨¨¦µ¥¨¹¯²²¶ª¥¤§²¯®±¦«§¤²¤¢¡ ¢ ²¯¤¡µº¢ª¨ ¬¤¢£ª ©¡¨¨§¢§£¡°££
¯kjªh
fq¨q®¡¤~wº|l¡v±_j´[¥e`fzfixj©e¾rg¦v±j|±xucmm§n\ EigEu`}f{£¦Y_«hxzj¨8J¯[XTmcZLOX_\WV;NPWV/ISSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3/.53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5^X31¢§¥£¥«²¸´½¾°·Å²¸»Ã§©°¬°©ª±¯¤±º°¥¥¯³£ª¹©³²°£¥¡ª°¬¯¦¨£¢±£°©¢ µ³¡ª¡¬¬ £ª¥¡¡¨¤£¡ ¬¥¦ ¡µµyª¶w³·¬k¦z
w«gj±[¬{tpx
°vwqkkm|O¥XHcc~ch¥_yquR^P©ncq|a/R¢n[Tkg`LK\dX\ZB>°wWXA#MiFBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFBAAD<FD;0201;F-0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_fW7J9aT50 ³¦¦¡®©¨³¬ª»¶Â°¼Ã¹·Â«¯¯§¯³ª¢¯¼«¢¨µ£¬¶¥¥²³¨£¢§ª³©°¨¦ ° °£¤¨µ¯¡¨©§ª ¦©£ £¥¤£«¥¢ Õ¹q±ÂÆ}Ö»}¨¤{¢¥z¬yV¯{~j¹Z¹w
}¦|zªy{±mt»oP¯§ÅQ zc`ªbsrl_Rµ´È
|c¤3Bu\PjhdP@XfYdaJHMkJ[SOYfZCC?E?0<<59<74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[J[P_fT7H:aP72%£±¨©¥³ª¥´§¤¼·Á°ºÀ²·µ½´¶¨²±¤²³¦ ¯¶©¨º®£°²¡²´±¡¤¨©±©´©¥¬¢¬©®±©£¬¢§¡§¢¢¡¢¡¢£¨¡§¡¦ ²nhµq«p§s´ut¶{¦£~£~°uÒÒu\®|
¤nª¦j
}}{±sy³et
nfRÉZÂ\yb__vsb^YÊoÀtMKµSUÆdUQjceXAOj_liPUFI9=WR[VYHB?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\ANT_eP5G=aM62.£¥¯¥©º¬¦µ¥§¶»¼²»¿¸·µ¼¼´¦µµ£²²£ ¬°¥§º®¤²±´¸ª ¥¡ª¥²¨¬ª¥©¤ª¡§«±¦¡¬¥¡¥§ ¦§¢£ ®¡£¥¢
¬|x¨v£©p®¨£¢}®³\r²S¯}£~q×}w~w¯w´ael[°WKuyf`^vwgj]¯wxl5yÈ®³_CTo^g`EPl_pmVUM.echRYP;AD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GB`I:77 ·±³Á¬¨²§ª²º¸´¹¾¹¸³·¾¶¦¹µ¡µ ©¬ §¶¬¨±±«´¤© ¨¢µ§¦ª¤¥¢¤§§°¥ ©¢¢©¦¡¦©¤¡ ¡ ¦©~¦y¡ªp§¡¢£ªzyp±Z¨ xtØvt§¤|{²^d }n\«\[hgªcr{jq^«Z kneOJC¡\ZMt]bfMZa_rt_JU6JXHE=GEAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<OedA&Uf[?1T_bL7FH_C1=7¢¾³Â®«¨¦´°¸±µ¿¹º³²¹¼ª»¶¡²¥¦§§ª±©°ª¶ª¯¡¢ ¦¤¤º££¬¡£ ¡¡©°°¦§¦¤¨¬¨©¨ ¤®£¡¡¡ ¡«®nr´t©w¦t´zu´¦¤¤u¸n{¢kk¶Z¡eh ¢§mr´s³j
ju´af¢nk\`N¡|Rs£ly~np\¯V<wfTon.[§ObRkeblZb\`p|cSZQ>?lo2BB@>M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U^aL5FM^81A8¥º£±¿®««§·©¸¯µÁµ½²±»¸«Â·ª¬¡§¤¢««§¶£³¨®ª¡¨ ¥«¸£¥£ «¶°¦¬©¦¥£«²¤ ¨¬°¡£¢ ¡©ªÔ»u±ÄÄ~Ö¸y§y¢¶u}wv²aºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxmqm¤t½]w}[ay¼jZV[iy^iadfbmyoX[YCA@q?CG+4H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,;:08LXaF'TcX</T^`K5<L\-6@9§¡»£±Ã¯©ª¬±¨¹¯·Å±»³¯¼°®Á²¦£¤¢ª¥ª²¤µ§¤«§¸£®¡¦ £¯¹°«£§§¥¤ ¨«©¤²£¥§¢¢¤° ª
¶¸x¶wnlotoyrÁ»¼z²¨pt¹|{}¤»¹½uy³£tvut°ufi¶trqw¶^y}gymyb¬pu
X[§iDdYTf_c]cQgfqmuBMOLD;ZL?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿§³Â³«ª¨¬«ª»¯±Æ¯µ´°¸§µ¹®«¤¢§ ¬¤®ª¦¶¨¨¡¤¬¥¾§¡ª¢¢¨¢²µ¶¬£¤¢¦¦«©¥¦ ¨§§£©¡¬¢°©§¢kj©ytv{f{¾¿Àºoq
_rjZ]adk`cmvbke^`cqhr|fj~qty~}b[xthP\n|{jXlyrIJo
pNsMDV\f`LZWfc_OZmvjrRODEM<HI<L>2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5CFUEJOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR_I'S_V4)P^L(3>\O'?2>¨¨¡Â¤´¹¶£¬¦®§¨µ²¬È¬°´¶¤¾±³§¡¤ª£¬§®¤¥µª¤¢§©¾¨©¥ ¦©¨°²¾¬§§¢©¨¤¬£¢§¬¢ª¢®¦ ±¥¢¨¤¦¨¤hn}rw´ª
¡z¤
li{}urxyvu{jstudw}vkpzl_b[ogMXYfj_WYpzomfSOFR9PZNRO(+:KB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¢¿¢£±±· ©¦³§¥°µªÉ«²¦µ¦À¨´¡¥¦¥ «§£¤·¬ ª¦Á¬¤¢£¨¨¨²Ã¯«ª©«¡¡¡¥¯¦¡¤¨¬¦¡°¡¢§¡£¤ ¡®|©¨{
£e¡³®w{~wyzogykuyrityujtcwe_hdcdfjXk{qjk\SLPD_UF@??,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@³ ¹¯¿«±² ª¦²¢¬³°Æ°«¤³¯¼¤´ ¨£¡¨¦©¦¤¦³µ°¦®¾¡¬¢¢©
ª¬£´Ç³©¤ª§© ¥«ª®¨¥£«¡¬¡¤°¤©¦ªf}ecylhjz£«kd~g
eeihz¢kh¢wkj¢slnzyXe]
^lw\gswwoxxsmysw{i
X]jsd]sik|qmc]QNWIdX@J3=F7?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]]_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[J.6ZO6)EY/DO1YB;?.=¥º½º¯¬³°«¥¨®°¦®®°½±ª¨¥®°° ¤¢§¬¬£¦¨©³®¤£°¦¶¹¥®£¢ ¦{¥¬¢¨´Ã·¥¢§¯££¤ª¨ ª¯©ª£ª§¦§ ¬¡¥±¤¬¢¦ ¬~½s´s
hw¹Ä¸q¡£{¦sª|ËÀÀºq£}À½ÁÁ|zÂÀ}k¥²ooÊzwwyyq{px
ylube^wc_eb^thmdbXKVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__a_^^^^___]\SMPGUNA@?=6468266*&%#)*&.+*)109*#>I[L*#CP/#F[3PY/UAB;/8¢¹Ã´°¯¿©©£¯©°¯¦²¶¯ª¦§¦±« «£ ª§¢«¢¥¨¥¥´¤£¦®¬¸´§¯¢¦ ¡ ¦«¤«¿¿±¡©¯©¢£¤ª£ ¡¬®¨«¦£¢¥¤¥©¤©®ª«®£¦¢¤Îz{¥z_]¨¡¡}§t«¯^dª{¨
t³c« ³j¯t|¸a®Y£Ínv{Û{q~ue{vvl~n}
}k_pjof`_xd[qhjcf`RTSW^JOC5AHED8>5;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__][WOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\:L-!P@F4.1¬ÁÀ¿´´°·£ª©µ¬¦²¬¬¤¬¦°ª¡§¦¢¯¡¨§£¦¡°¬¦®°«¨¬ ¥¥¨££ª°¨¿Å³¨©±®¢¡ªª¡®¦©¨¦¦£ ª¬³¥¢ªª¤§§¢²¢§¡ qv
¨q±|q¬} ¥x«~r¬v{|~ª¡}«zzVÄ{pÁ}mupmfweoawnrnldmsuo`fmd_oijnfcWS\`ZRRC9II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1-+¯ÓÆÇ²³££¢¢¯·¯©±§¨ª¨®««§¢¤£¦« ¢¦ ¨¨£°¨§¯¬¨§©¤¢¡§£¯¬¢¬µ©¹Ì±¦®«¢®¬¡©±§©¨ª¨£¡ª¯±¢¨«®¦§«««³¤¤¦
¤j¤uz©u{²q¥p ¤_aR«
®u®¨z{f£¤£}©®^{¨U¢z£|İÅs¯´³¹rb©¯Âuhlnlxxwnkfddqqf{ic\V_iXXTLLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ''!+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°µ°°©£¨§ª««¨¤¦ ¥¦§¦¤¬¢¬¡£¯£ª¤µ°® ©§¤¢¨ ¦°¥¢¨±¬¶Ç±µ©¬©¢ ¥´¡§«©¢«¨¡¡©¢³¢ª³²¢«©°°¸¥¤¨|ªlv«y|°n¤Ò¸´¸É²_a©¥ zyªÉt£§¨~ÆÆwe¡¥s}¯^oµc±uK£m§Gd{o}nyt|zm[ejrqfj^aXcm\^YILLJEDBA=A<A?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4NTQ;<F2,$¨¤Àƹ©²®¥¢³¹¬«¡¦¨¦ª¬©¦ ¦¥ª£®¬¦¡©¥§µ £¨«¶²¬¦ ¦§£ ª§®¡£§©°³Á±²©¨¥¢¤¯¦¡¥¥©®«¦¤«£¶¬¡±¹°°¨´´µ¦©¤¡Nxz£|¤¦¸||z¹ÌÆÃ¶w¢~v¤¤§~¯
¬}a¥l£p
}r¬`¤sqa¼}RUu¢{|ryr}p\lnwrjnZc_hnbd]LLQSAHGFH::K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,- ©¬¤«¹«¯ ¢¬³µ¦¡¥¯®®¨§¥¥¤§¡²®¢©§³ ©¤£µ££¡©µ¹¤££¢²¦¥¡¢¯¤¨¢µ±Â°ªª§£¤¥¥£§¡¬¢¤¯¥»¬¢·¶®¶³º³µ©±¢¥ÑµÃ·z
¦x¢w¡
¥r«´nri¤}s®¥¢¦mp²\¥szl{~n©a¢rr~bs²¸hw¤}v{xlhwixsn~t\ddmmeh`JZWX<HF?S3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH#)%r®¿¿¼»µ¨¤®¶¢££©§©ª¥¢¦¡ µ§¢©§±¤«£¤¤ª´´¤¦©¯ ¦£§µ ª£µªÂ¯©«©¢¢¡¦£¥£¥©§¬ £¬¦½¬¾°£±´»¶©«´¥©{¨}|°x¤¥m²o¡|¢¨¬
¨ £
{~«ªw y¯]£|¦§d|tk®]¥lr
]`[ m¥xy~jl}b}tmy_gepngghBY_Z=JS2S8AAC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI8152.*,ATVVVTTUUUUTTUTSSVWWXVVUQHFIJ#((¼©ÆÃ¶Á´ ®¹¦£££ ¯®©£¹ £« ¯ª®¡ª©¥°¬§ ¨¢¡¥¡¤¨¥¶¨¾®¤©£ ¦¥£¢§ªª¡£©¨½¤Ã«£¢¬³»°©£µ±ª¬v¯~
}ºd°e}¡§
°§¤¢¢
\lk³`{{±lfn±Z}´\¤kÈ¢f{»YvµZ²}S¯z¬X¡m§yw}cs|bxt|ajfpmfeeOUc\AT^=H(>9=4!!,$2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·½»´Á³£¦¥·© ²±¨¢µ ³¨ª«°¬®¨¢¯¬©§£¨®©¡¥£¢¥¢¨±¨»®¤¨}¡ ¨§¬¥¤¤¢¤©º Ƨ¦©¡¬µ·®°©¡¾°®®©£®¤¸Ãº¨¬¯¨¦«~սªb¤¿½}£×º·µ½¾j£o«nz²±Çk«°½yx¢¾»t¥wyb|zdgy{`kekjaPb[Si\@T`BL)<:4/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´±¿º²½³¢®§¦³¦¥¿©¶¯§¡¿¦¦²±¹¨¯¥§¯¬®¦£¬¡¥ª £¦§ ¨¢ «¬©¸¬§£{¦¨¨§¨¦¡¢«º©Å£¡°¤«´µ«²¬£¾ª°°tvª¤·
epg¬nnw¥ v±qr©¤¯¤rlmmfxonqzipigqhi
gpd]cioZ]g~x¦`brpfd¡z
tdwhjx~ydlcflbKeWJkY:PdDP'J9+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´©º¹²³ª©¢®¤³ª½±ÃǼ´©¿«¬£ §« º£¤¬¬¦ª
¦ª¢¤£ ¥§©£© ¥¥¦®¹ª¬{¦¦§¢¯¦¢¬¹ °Â¨¥´§¬±²«¯®ª¼¦°¹¡©¥µ¢©ª´£¬¢´¤¢¢£¢¥¢¬§¤~gtwtq§m}
phvowv|yiledocUaX@iZGb`NX+E=+&!640/!%2(*799469;>?ABDFJKKMPPQWUVY^_ac]^TQJEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¤µ·®®¢°¥ ¡·±ªÄ¼Ã¹¶©¡¤¥°¨¤·§©´¥§¬£§¤¡¨£¨©¦ £§ ´¹§ª|¡¤§µ£¦«·¨¯Â¯¤¸§°¯±®«¬¶¼£±¾¦¤¦µ¢¦©¢±¡¤²«²¦¢¥«¢«
fuwztj}
xqryq{~jnd_pi`\_YmbP`dOX9FFE=2<=8/*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤¨£°³¬®£©§ ¨µª£²¹ª«¡¢z¢±¤¦±©¸¥¢©¢¯¤¨ ¡®ª¨§¨¸µ£¥y¡§·£¯µ£°°u¤¿¤² xz¢µ¾w®¥ ©~d\bv¤~m´£¨¯¬¥f ¡tzpªl£©e¥
xkvq|ai[vghqy¡dx
vhnyjpe_vokkg\ecaaoRY=MMNRF=@TB91/&4:306678<;>@ABFHBGGIKLTUUY]`hfgXQI<DG<9UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«ª¥©®¤§¥ª´®°¥©¥ªs¯¨«§¹ ¤~¬¤§¢
u®¥¨£¹³§ uw¥²µ´½§¡~§£{¥±º§
±©¯¢y¬£©«©w¦{§{³{ bynqzqt
xht t{~ikx{qpgdxnilj\diier[\HSLQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aaifYQH9DL<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah¤¦®®«¨ ©±§§©¥Å¼¯ ¥§´«¦¢ ¾¡}¬£¡¡¨¢£¹±§
pu£«´´®Ê«¯·
°³±
©§|¨r{w¦h¤y´ ¨ªÂ«¡r¥}
³¡}¡|
nt{s}
uÅf©¢jogwt{vghupghk^cnlflXeF]QL2E46M`c7&3<EGD:63658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@IdX]cfhgbbbbcc`_babcccdiicbbbecafcbbi£ °©©¨¦¬ ¥¹±©«¦¢¤©¡£©µ¢¯ ¦¥½ y«¢
w £¢¸¬¥bm §~¡§ ® ±¤«~¢vk«uM«xª©ª«~¡|{§jlg·~n`cX{dgs}yl]|n`Sq
\`mz`Ye~
q¨«k£nr¥pgdlZlzeY_~aWPovemtqjjo^jolkhWgN]XE9@4GD^k4+ICQMN=84859;6@;;>BO>QRKMBJ[]_W^_cu`ME:MNMTb\[ffiibbdaddbab`bdcabjkdbddgdbgeach ¹¡ª¤¦¬¢¶½«®¢ ¥««´¡§ ¦´u¦~
¬¤¨¥¯¦¢in ¡¥£¡ w§£©¬¯¥z}}¢ps{ymª}¢tw¦g~w¥^{}s¢n·´ºs¶¨dƸ|p¶q£ct¬«a~j³~n~q£ls¤s~£^³o{³tr[²ibosuqioXkkrrd[g]aLD=D5QAZp2<RG_JR=<395::6C<;@IP?TNNQ@E_^[YX``{dIC8LWUVcaZffkkbbeadc`ab`dc_`cknccddhdbgfchh£¹« ¥¸µ ¡¢£¤¬±¬« ¤¬x
q¡}¨ ¢¨§¤~k{~} w¢ r¡©¨ª®}z y£xs}§£d¡~mho{§}rhtªsªg]
v
hªj¸f\©pa_§vwhumj¦\¨~w»j}©Z]³g[nqxwki[piwxa^eVaBPEO7VBRn4JZZ^NZD@151;;7H?:CHU?YSX]>Db]V`Qac|iEB9N[]XdfXffnmbbe_aa__``ec^bdoq`deekdcihgkiª¶¨c¬»²°«¥§¬°§ª¢¡ £ir{z¤¨¡iy{~¡ ¢rh p©¡¥ª£ª~°¤¢¸v£³¢£xzª¢r¡}°µ}l¡x~µ££«¨||~sªZ]o{xbM{{
dzBMY¢js|ovy±³~¦t~mq|ori£]vHec`sp|}nf_lhu{bc_P]V\TV@YEQgERV\aX^ID=B8?A:HE8LEXAWRZVEFa\Z`K`m}qEC<U^bZejVghmobff^a`\]^`hb_edvl^egfldelhhki±®S^¡§´º³³¨¢©§ «£ §¡w
ny}r¡r¨|l
q¡x
{¢£®}µ{¦z©£ ~§hwm~s sq|
o|£§¤p^©hv£dp¦aÓ|{xrsc¢~¢r¢uk³`tª²¨¼wn¿¦ª´^orps¢r^¤gt¦`h¦lÓznvykyvrl©¥g_dyplhfdmuwf_aRZePQaHWIT_WS[dj[dPECKLJKAJD8P@PMXSXOSQ`eeiSdxywIFEc]eZhiSihjocjf`c_\]]_hbahe|d^dgdkdjlfhlh±¬T]K~©¯²µ°²£¦ ¢¤§© {p}h|wpl|£©
yvnw
y¢£ ³¡¢¶z¬§¤®¥p©}¤¢q¢®¤¯£wµ¶¶É¢s`©my u¡w ~oLf£qs¥{zubm~ lrd`stk{j´¶´Æ¦s~zj«tlswiytqPD}³^jvkxfkfbstpmU\RXgORhIULXRU\gknUgWMJAJMKHKNAQJPdcjmeuss~x{nuz{UQOm^h\kiRjhilgmgce_\\\_ibdhk{_]dgcjfnleime¢°¨
e@¡³¬¯¯µ¢¢§¢¡£¤¦¦ykyeyuj
z¥¨z}yp y~¥§gnxl¢d|r¥xph§}¥{¡rv¹m¢b}£nsk«ku mo¦`iiu¢~`uobh¡fjupdgor¢[_[d¡n^q|trd¥nx¢df§hrm¡oRn ^d§T]TmmrkqmphkxskoQVUUeYSmIXO\HXhhsjYkVQREV\MXSaUhj^wu{|p}|r{sww^QsagbpgPkhhklohdg_]]]`jbjivu]\chcjirlfkmc¥¦zetm§®¥ª°±¦ª¤¡¡¡¡|qh|su}|e|¦¡«
}si¥}
©¦¦x~¥²¯¥y{©u§n¥¢¼m|¥¯¢~¦{r¨ h~o¬cx¨mª£uw«¦k±lw³©loo b«ªw§w}
¤ hu«f¶sv¾£Y¦«aurto{upbj~nglSUYU``\kL\R\I]lmv`[qX[_Zgsenoqcqt`wz~yryr~{{wbydcnsdRlggomrigia_^\ajbll{o\\bibmiwmglnb¦«¤©ª¨§®£©£¤¨
t
zo
~surn}{
¤¥¥uol¨ª¢ t~y¯¤qy{r¨q}}zx{}}w¡¢
|k
\zyszqio~qtqe_xwtupzooo
_wixgªt}jo~u|umlfsx{wZjWyinwrqowxo]k
migVY^V\dkdUaU^Q_owykjwejjju|pqtsaoubs{xuyuy
~|nmdyn^Wngiukxjiid\`ZcielqunZ[bkdlkymhloaº©§¡¢¦¤¤«¢ ª ¦¨~r||~{trp|}y~£{§
wqª
¨ ª~¨¨xq|pªp}qjo|hn] sqtkvtYro~j]id{
`ix{|vizlbqsw_s¨gnwowmdecyzZ[ifmv[{ywtmsrf\mkkbYX]YXkq[^`Y^]er~{sotcjji{|rzwtdmthl{uz}{yyp{}s~zrhT\rilvpugkgd]aYjhkjqrmW[emlgryohjm`«±¡£¡¨£¡}«¡¤{|r}v
ror~z¦ xz¬¡ª¡¢££«¢¨§¡}z©±¥±¦¡l}wwf|
w|{u¤ wqu
y§z
uj|yiqh`sp}{wvowt]^ogn_^YZ\RgqUc[[alht{|rnpcjih{mx~phoplf{rw}{m|zy|}zxNdvjsnq{ekebb`[sfpfrqlU]ltmhxzpgikeº£¡¤ {©
|x{mxr~mk~z~|©r|{©
¦¢¦¡¦x}
§|}
© © pyruav~nzvu¤u~~ss|
{y
¨tzmj|{mhklg^y~g||vtvuzw\`p}mt`cZ[]PfmSeZ]ajhuz~pllcjjgkrkjtnwnynv}
wr~|{|{`i{kvhiejc`i\cugobumkTbqyeoyzrejmm¸¡¤zw¥¤yy
|l{xr
}|kh}|~}¦p ¡
|§w£ ¡£¢¤{
¢~|¤ ¥vuqwa~s}q~
hxrys}}rz|
{{¦|
t
xdqz~xypkjf^}sg|uvs|rj^`tvpwdcX]^RjhTeX^`givxqfkclgejm}gnpj}w
zkr~uv|z}jrntibilb_qVtoln`xhlWjtvctzzqbkoy³¥¦ |u£¡w{~~p~ztu
~wgc}x}y}o
¥¦v¡¡z¥{
ys¢ ¡}wr~n{d|qk
fvo}~y}~|ryz
£wuzs^ww|s}wfkc`~ijvssu}q|ccasnurmaY_]ZkdRbW_`hktyqbjclfh|khthloh|yl
qt|~z~|muttmfljbcuVipm`yglajvpex{yp_ql
¯§©
|w¨yx{}|{xsxys}d^}~
t}~£ ~r{¦ t§um{o¢|zrzkvm|n
xo~~esj}
t
zwy~}¥y
t|qs~
l`ztyp{nanbd{amovrwwssav`oluno\Z^]]j]O\Wbahmszk_iejchwmflhilg|zwns}tz}z}|ryyxnlkh_irbhqofvgmlazhj|{wpawm«¡¤©|v¬|v}{|{vwotszo
}~|a\~szz¤}|£
n¢¡pgz
p¡}|tsvkqov}uort|}eqmz~
tu{p}
ª{}~
w}om~bgwstnza^o`jt^pjzyxlrpey]mlsmsXZ]_ajZOWWdcfqqe]ihgbgqnchheigzwuo
s|u
x
|xzw{{syjk_phtkqomqgoke{bnzwpkww££¨¡§t© s{v
wxrs{
kroymvnq[Y~vu w~
n¡l¥
hx~|}pvplnoq|jsqxuzgsov}
z{xuq|{
¥|wwwli~\qrqoowY^o`oj^oj|zpmmjmw`pokqmYX`aamWPSYefbuob]kmdcfkm`ff_gjurrotyvy
~wv
{{wjqb|b
|oplujhnlvw_q~y{tus~¥§
~t
zrwtpr
squlnltlv}mnUQ«xvry wz¤
}s
jh¡
qw{{|}lwjollm{bz~wzx}zhumu|r{qx{{~}}x|vogjw^womkprU]naqa_lnypgpfgtuhqlawe]Ue``qRPN[ed]xo{^\hqbbeei_he[go}okqs}v}
uvy{xs
~|zxgqj`~ook{`imtt_t|xxss
|y¡±¦~wtvspo
spqojiumn}|musRNᐙ|ptuv{r
¡
}x{zxin¥cpz|z}m|espkm{z\y{~{ziukt~mp~{}wxxrlen}jitoghslS]odpZ_lrwfkkcgxsopc_w`aUk_^uONK`fb\xpt\[ev`addc`fbXissmkqv|tyvw~szq}~vesn|enokZknyyr`vz{vrvvz¯
x~{
uwpypnomn~rcdxp|nz|jhlb¤ÁÜ®ï¢sluu¡np
£
~{vx
vxp¦
^l|}v~~l}dxujoztXzzzftkmwo
{utxtrpesw`smoahtfR`pgkU_ntyasc`i}qrn[cracVnZ\wMMLcfa]vsm[\dx^`df_cc^Xirknkrw}swxx|q}}{tshuqyl{ntpWpyvyqdvyhvq¨¢|pwx||swpsjokil|t^`xv{ptzg`e|ëÚµÉÃÜsltvip
|zwxrvr¤
a
h}}
rrwhvritxmZ}}vbum~omz
}~orz
tkoipv~]shn\it_QdqhfS_pvt`p`]hqrjWgiciWmW[tLJLef^ars
i[\ey^^dgz`d_]Yknenjtw~sr{vzt
|vv
{vlwvyyunwz}Xy
qngxvdv
q¡¡soqv}{yqtnodr~hflww[_xzzqqiagaÕ¶¦xnqw{qj
zh{{~
zu{|qvx
¡ af}~m}ulmwutwvlc
|
q`tr}}zr
g{
|
opytlmiiwzagjiXktYRhribPbrxlbe^Zjnsb\g_em_oTZoNHNfd\fnrkZ[cs_\ckvde]]Zllbmjsvqo|}txx
|vx{voxy{om{v^tmhzssgs|ruu~mu}|v~vqoljat|gbiuzZ`w{ymq~edhhW_rs¼Ävq}qrj{|
|{uvw~ru
rw~f}~q}f~|y}i~vgpyxswtlk
y
l_sy{~|sjz
y}~nm{}vtnfe{tb[pbWnqSSmrhaNftxf`^]YoosYeb]jn`pOYkQDSg`Zjnm|nY[]mcZbpvcf\]`kicljsvpm~|tuz|
v~xtryy~oo{qixz~ml{ukjxtk n}viw~yoztqlid`szh_eqzZar|ygqy`ee±²wKbZ¥ÙÐq{w}
nk
zy|xwoqu~{jy
¥px{
p{|nwhxr|e~vdqsiyqou}wy
zk\rs~{sor
s
z
yno~vzdfh{o^XvZXpkNWqrf`Klwta^\[Zu}roWg]fjq`oNWhR?Xf^Zokgzq[ZXkeZcpy^g\^elgekiqwol~uo{v
qq{|zyujy~ko~t}or{zon~xg¡
fogy}~|ixskkf_aoym_box\dkzaqv_eeÔê½2:>qx
u~~ml
u|
|xnvwn
lu{ufy§~nvy|{w~krh~xm||xbz
rdri~nuqu
sv~sp\nuy{~y{rm
szunkvus[ggunWV{RYodLZrre[Ipxo\[[Y]t~thYb[geodjMWfQ=]e\]ue`upZYUncYdqyZh]_gmgikipw}mi~yn|}ytpnw~{{hz}js{r
zsv}~zx}|kl}kh~z~~~}kvrghb[bgso_aks`hpybst^cd n\5Z¯µti|u
svol
uyx|y~rgu~~oq~hvynfy¤~ow
|pz}{h~lj{zjzwr`w~rdrgvmu{|owz|umYpwuxv{ytos~{onjmtm\fdrpPZzM[n[O[rodUKsxiWYYZapt`]]agdiifNYhM@`c[`ua]ulXWStaZdorWj^bhjgmlhpw|lh||p~~{zvq|oqw{j}{mwxvv|x~}zm
£{uxklx~{~psqcf^Yf_oo_`gpfjntato[adjv{¿¦¤È¸qr|wsrro{tttwyypcwzirvgwucj|~su{z{kxy~tgzhkysizv}h`x}kkth|iv~zq|v|tbVx~ss
}qxyqqz~wwjqilqo\faqmIduK]lTSYrnbQOtxaRXX]aps[a\ieedkdP[pIDc`[cp^]whUWVv][enhVk^aigennhpvzmix}r{~y{u|pwrmw~p{wyztx~yuo~}
zw
{gt
y~{vgpn_d\XeYmra``plkhnatiY^dnw©Ú©Ç²qwot{
ztst~wpqmt
xuk`zyfqpgvn[m}y~y|nw
u
{ltv~lgvdm{vmiww|abxziuuc~{gu{twq{}nZWupv
zmtzlv
|~z}t~thtenlsYh^sdGmmKZ`WVUwmbPRtvXPVX^aqo\`cmed^ocT\rGBf_]fg][{bQV\t[[gkaVj_`nefkpgpvxtku~vx~w{s}ortqu~
{wx{|w|}~{~ruy yutx^}
xs
w{bnm\b[[aVisc`[gnpfqaqfW]ck|Êι¡jmmlqq|~zyxsyuu{jlvcuvof^}zerkjqcXmz
sx}ors{y}ppo|fhqbmxqjkqx}}z]ezxjvxfwgt}rjo~yo}]Ysnu|opqwixx~s|u}{sgsankqWi]v[GmjLVU]SU{kaOTurPQTW^bt
i]`ljfcZoaXbpHAg\`e^\V{^NUepY[jh]Wh`^rekgpgqswxntzx~yur
pp{xwvyz|t~}~~~}|xuxx|muxd
so
ztdnjY_[\]Tgrd`YdqrgrbkeW[`jw¾®{ ¶nas
hs{qxz}~wwrvo{vejoausjb^xyfqhkkZVow£
qrzwot
}xtqnhy_jl`mvjgjkywzvZg}|yfs~m
teu
pgk{unub]q}lu}{gv~nqivys~m{|{yqflbn}lmVi_vUJijNQNgLX{haNUukLQTU_fuf^`qhgbWj]\khJDjYadVYUyYMVmjY]kd\Yec^temdpfrpuxqv~w|
}usnsy{zss
x}u~|{~{v{wwziv}{lrp
pglgX][\[Sdpd^WbrujuoeebW\\hporsddy}isusrwxvrunkzqbgkgtnf]_}p{imygjdUWro¦|{vu}t~|o}|x}}uoqlgt\lg^ltdgeizo{rYhwuhpxvbw
|okm{qgtfanzgsx|~cwwjlrv{q{ztgywodfbn
{ljUhaoRJhjOKNoG]zfaMUtdJOSWajv~e]gsif`VdWbp]LKjXcaUTUsVLXudY^k`\Zce_vgmboitor~ttwwz}u~
nrt|zuq
zut|
}}z}v{£¥y
ku|zuznsy}vojieV][ZZSbmd[Xas{jhmi`bW_[jjkogk`hyxjrssmz|utmzhjyj_enhvheXbwj~{ojpgf]TXog¨wz|zvqqtwzyu
vjquggn[lc]mr_gajxh{l[nstjp~zwaw
ytroyrcqi]qxert|yctqhjzurmyxvyd|ywqddcn||jjThaeSJkgOGQjE`wfaMSr]JMTZekvze^mqid]VaUnnWKShWf^XMUlTJ\y_[^k]]Zce`yhl`oovnpwuz~wyzyz~qttyvt
}|ks{~}~{v«zkryu~tnn|sjpnddX_ZYZTajg[Z_ui^ml\aW\\lert}ii\kvugsvql{}|xurlygixf]eshzwccTeph
xxgijaWVYgc§n~w{qrizp{}xr~ndurdgg\ja\oo\g_mtezh]torkr|~uvbt
|xruuapm[rtcqs
|uesmam{pkj{yvsfv{{vqebemr}ikSg^\TKqbPFU`GbvfaKToXJMXXgkuzdenqfdZW^XweTJ\bWhXYHWePHbxZ]_lZ^\ac^~ij_ntxmpnvzr|}uuy|tuuyzz}~isz~~
zz|sq{{}dqys|zurol{~lzcpobe]eVYYWcfk_]]s
hXqn[^XZ\l{cpwulbYlssgtuolx~xvmntdite[gufvvy_]Rffkt~bdj\TW]bc¤hxtynq|izn||vsy|xhdvl`f_^i^\skYe]oobze\w|knnpxytuds{wor~sbxd\qqbqr}tgre^nwiehz|unout}trb_fnn|dhSgXXTMv_PJYWHbtcaITmSJMZWilq{bmlscbZZ[aw\SLc]XiSWGY`MGiuX^`l[[_bb\iganxymojvymvtttrvuw|}~~~pw|yxz~ttp¡zzwcuxswtkto~kx|ps^pn`gblTZZWhcmf[\qeSrn[ZXX`lvciuji^Ymsplsssi|~~{vnnldiqc[krduvs[WSearr]bc]SZ`\ceqq
ull{opq{}}swszzzdeuh]bY`gZ^vhWb]phawa[|vijroxtsuhq
vsjq}nfwX]lncrtztgp~[`prb`kr~mmusrxkqa\elmz`fReTWQPu[QOXQHcsa`GVkQIPZUkkk|fnoqb[ZXYlqWRPfWVhSTFZ\NHqtX_clbX``a]jcdmyxlpiuy{k}|y|nrovz}t|tx
utquo¡s{zewnmznfxpzksvsk^unagekR][UgalkZ\qdOon]VXUgjthbted\Xmtmoutxj|{vscdkna\nmcsxkZTVcdx}}q]d_cTZ_Ybcnp
tki|pftxu}mzuvpzv_erc[]VacXateU_`mdaq]]~phitqtquvkm|qsgp~qsoT\gkfruwtcmvVbrl[_pg~fmw~stsknaZdjjw^eScTUPTlVPVRPGdr_aFXiOIXTVmhd|ikxkbW]U[tdSRWhQXfTSHZZPMwvZ_ekiYa`^^nafkyunoivvl}{~krgt{u}r|
{ts}vn¤rvwlz`d{pfysxlmqwgd|mcfghS_^Ug_ln[^nhNim`TVSngtkexdd\Xoslqzwrl{vzykaelm^`ojeqy~gZVX`lx|{p_c_gVX_Wcbkp}xllzn\wsm{jvtop|sXim^X\UabWdpcS^biablZa~lfltvomwwli
|mrgq}nsnc[aiiptts^imSeqeUcoc{drw|wlpmk`Yafgt\dU`URNWdRO[NOHdo\bGYiMJ_KXmd`xin~d`U_T]u\TS`fN]aUSJ\YPYtu]_ekhXba[^qcgjxqsnhvtzrz~|ynulst
y}
|
sstxro~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDARÌÚØØØØÚ° ¥^*///0,H
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____aR455552FØêççççé¶ £¤¤¤ªV:|}z{z|}{|~}}}~}}~~~~
|yzz{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~y{yz{{y{}|{~~~}~~~~~~y{z|{z{}}{|~~~~}}~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}}}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}~
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx|{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvutvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfgggihgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwz{|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;899;;:@;;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;89:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqususqsxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<979::988::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;<<>?=<=;:<===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuy{{{}~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@=<=;>=:::<:8988:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFEHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvvw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@???@=?@><>@?===?>=>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABECDA?@@@?=@><=??@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBBC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>;><?=<:>=?BBE@?@Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEFFFJNMKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@DED?<ACDB?=A?ADEECWu~XGIJLLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnopqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJHIGHHIGGBDFDDCAVtWILMLMMLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLKLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKJKMJKIHFFGFEPl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD???DFHDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsstvxy{{{||}}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKKMLKMMIFJVl
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDACFHIHHHKMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHGIIKLONNQNQ^r
fBB>88::9878896479;<:8567789787689;;<>A;999==>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56;<C@BFHKHLKOUg{T;8656766655763468:876565677778:7778:;7689989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:<DBDFFEfz
H676468874578467799766765:::::<89899877::98878589;A=>>BA?AKLOQPQOOPQWkrrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897:A9<D@Qz>:88;<=>9:;<89;9:;:99;:9===?;;;=:><:<;<;<;9:<8::;:999<?<=ABDIJMKJKLWortutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989999:>=?@Dv
l<;>BCEEAAAB>@CA@?=>>@?>?@?@==?B?AA?A?=@A@??A<><;:;:9;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::<<:;;<;=>A@>b
^>DGIKJIFGGDFHGEC@@CECB@BCB?@DHECEDFEAFEFDFFD@B?=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:=:<;>>>?;?=@?C?J~
WGLLMKNIIKHIJJIECDFGFDCEFDBHILGGGFHGEKJLIKKJCFCCDBAACBDCCDDCA=<>@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97<>;<:>?>@=??BBE?h
PMPMKNKJLIIJHKFDGHHIEEHFFELLMIJGGHIJNMOMLNKHFGGEECFFFFDEHHFCA?@Lmptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<:;<:>?=>>@ADCIS~
qMQOMLLLLJIHFJIDJHGKJHJGGGKMNLLHHIJMPNONMOKIGIJHIDIHHFFGGIGCBACUoqvvxz{xxzz||~~~~~}~}~~~~~TDAABGHB?8?@8:;7<=:<?<=>@BDDMm
^RRPMNMKJGGCHJGLJFKOLKJJMMLOPNHIKLOQQPQOOJIJJLJLFGHGFGIFEEB@BB\prwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;@A;=<8?==>@EE>CECGKu|WVRRTROLKJEFFKONOWVQPOQSRNSTOMSLPSUWRSRPLJMMMKNGGJFFIJDDEEBDCcquyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?=<A?AAEULBIJGJLy
gVVkaERQQPJ;;QSR`u]UVTVYYSYXRZfPUWZ]RTWQPNRPPPQKLKGHJHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??A@EACFDCDKVPKPPNPPy
}al[dU:XXXSP?@VUY\d`VYbr^]W]ZVEQYZ\Y_TYgRUVXTTVSOOMJLJIILMKOMSotvxyxwzzz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HLIMPKIJOSRQUVUVTu
g;~znpXZ[ZRSRWVTZZuYU}a\X]^WIV^^[[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxyxz{{|}}}~}~}}}~~xy}YNKJIIFBD@A:OQQWXPPPQRSRVWWWWl
n~fYY\YSVTWRQWVcQerXZW_hP`fZZX\hbGOZig][\]]WRNSPPQVVVVYZosuwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZZRSQOQRQURUSV^ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^TQQPINOWVX[Zdqtvvttvxyy{{|}}}~}~}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSNOQOQVRSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURPQNKRURMOYQMNQSUUMQSRPOMLHCIGRSTZ]mrvvuttw{z{{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt`d]^[YUQLILIaltPQSNQRPS[RSRQRUUbs{|~}{{
u_]KC>BBCCB?DPCD@C>BHGV@INMG]iQHFOFDEFHGHBCHGHKGDBAC@NPMRdtuvustvz|z{{{||}|{~}}}~~||}}vt{mh|gnqfieeb\XSQPURsWe[OONLQRPUYSUQQTROV`klsvz{xyurnstsyx~~kLG>>::>@??>>jPJaEFHIEB?HMMGMQUJBE?><=<==?=?ACC@?<=B>IMFUouuvstvx{|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJOPNKLQRQTUUWQQWVPX[b]agmmlokh`nrimlqu{z}{xz||xwxdB@@A<:BCAACA[\N{NOONKLMOOPLKLWOIGAA<977599=;;;8989?;AG>\tuvwuvwy|||}|||}~}|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OO^\ZIGOQQOMPQNQRSVXSRYTNYZ[WY\_^_e`]^qwk^`gkwooljonnlfbYGFFHBAFHEEFCLQOaWRXQPSSRU[OOQWPMJDF>:96586979:365795<B=ftuwxwyy{}}||{|}}~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKSTSPQUOLRSTWXSTXQLXYYVXXVXY]WXXhsk]V`tkaa_]d`_^YUPMOMLIGJKIHFCPOSZWTTNQSYS\eUOSTQNKIHC?A9998978847578599Gnruyyz{{}}}}|{}|}~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVWXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNMMLJFPPUYSTOJNOUST\VRUSSOMLIHHF??=:787659967565Wqqtxzz{|}}}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXXYYYRUOJGOPOOMRJOPOONNOTLMIPPSTU2<XMIAQ=c`QSQPNPPONNMPNTRPRLILKOQPQRSTQSOLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWUQSFFAFGGHFJDHJHGEHLHKIGLMPMG/E_R>4@>joaRRQ@GTQOPPQNQOPOLJLLOPNNPQQNPOJLMMKGEEDB;==<9=G6676Dnquwz|{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8DMS]gSQSAGUPOQQPMMNLJLKLNOOQLNNMIMLIKKLKGFFED<AA>;@E;<89Trsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A>==A@B=>EHFDFFIGJJ@FAA@FGDIOHQRa\QPROSNOOLLOMKMLMON[VKMQOHJHCIJLLKFFFE?BC>=BG?B?@druw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;>A@@>ADIECHGIGIEBB?><CA@GIDMObePMOMWKLNKKMMLLKNNSdMJLRIIIEBIJLMNJGIGBAB@?EFEHDLopvzyy{{z{zwtxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLLIMPMPOHKE?B=999:?B?<ABAADDGKFDIIGGHCC?B??@@=CEDLMQTLJIMTFIIJLIJKIJLMOPRPKGCLGCCKJLNONIJIGCCCDIJMLIZsnxyxz{{y|vrpurtyyvxjqojllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHKCFGHGJKIJLDGB=>=:::;AB?=BBCCHEJLJEIIFGGCD;A@B>@?BEDIMOGHJGHKDHIKMHJLHIJLJM]RIHDNGBELKNNQNLMJKFGGJMNRNMcnjwvw{y{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthepFKCFEFDEEFEGCC@=<=:;:;ADA?BCEEIFJJLFIIGFFCB;BCC>?CCCDFLNHJNHDHDILNMHILGFFIILNKJHEOICGNMPNPNOOMKIHIOSQRNSggfrosxv{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuwvXVuukotrkovlhmf_pGJCEEDBBAE@DB>?>:;;=;=?DB?ACFGKFJILHGGGFEC?=DEB>ACBCEGHIGMPIFFFKNOKFHIFEDEIIHKIFHPKDJMMQNONOPNJJIMRUURPXeaamgqroryzgehhcilfqlflmgiklsmpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEFBA@AD<BA>A=::=?;>?AB?@BEGKFJGIGFFFEDCAAFFCBBBDEEGGHFLPLIOJJLKIFHEFEDCIHHKJGKRMCOONQOOONOOKKKPUWVVTY`_]ianjnhrsbeffdihfnifmmhkkmriqvusqmvnoqrswsrstuuvvvwvwvvtwuksunutsprkksMGGEGAA@CD<AA@C<8:=>:?=@B@@@DFHEHFFHFEEDCDBDIFCGEAEGEFFGEJMKHQMJKHHIEFHHECIIJKMKPSNDRSQQRNONOPMLNSWVWYVX^Z]d`hcjigk_defchhgkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHAABEE<@CBD<7:=>;>;AB>??CEFDFDDGECECDFFFJEEIGBGHFGFECFJJGMKLKHJKFIHJHEKKLLNORTOITUTQTPQMNQNMQWZVZYWZ^ZXa```^hec`deggjhhjghnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGIDACGE<@EBD<8:>>><<BB=@>ABFCEBBGCCDEFGGGIFGKHCIHGIGFDHKIGKHMKJKLHLJMKINLNNORUVOLVVTQTRRLOQPOUYZY\ZZ\__^`c^\bdlc`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIKHJEBDGE=AGDD@9<>@?>?CB<@>AAFCEDCHDFDFFHHFHGIKJEJHHJHFFLHHHJGLLLLLIMKMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[]^``a`be^d`fh`ehjdssfjhflprqossnswwpuvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwpwIJKIKGBEDE<AFDDB;??A@@ADA@B>ACHBEDFGEIEFEIHFIHJLHHJJIKJFJKHIJIGKKMLJJMKMNNOLOPRUWVMNTVUSRQPMNTSRW[^^_]^``aab`cdebdicdijgvlkigmosqpqpprywruutsmmssmqrotuuspswtuuwvuuteqskpqjrvpwJLKKLGCCAE<?EEEC=AACBBCEBCDAAEGCGFHFEIFCGJGGJFILHIJMJLKGKIHKKNQKRQLSMJNMNPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^ac^`fbacinhcihhmxvmhinosrpqrrrvtsusssnksqmprotvsqquvuswywutucmtkopjqtpwLMLLLGEA@D>=DEFC?CAEDDFCBEGCCIEBHJIGHJFDKJGHJIIKGJJOKMKILHJMKZfJd\KlRGNN_nUls[qpbwcRPbvuhucavaXnqbdvinzf\lu`lkU`xvijhhfglmjmojmosrprrqrsrssrtrnltonpqquurqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?<DEFDCCCEEDFBFFGDDJDDJLKIKLGGNIHJKGKJIKJNLLLLLIMLL[sbdp^llULNer]geqlntgpi_aYnmbppbkjjgoqtetnn\pvgqNKryvkaakeelxmkvlnosrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?AA?=BEFBECEDEEDBHHGDEKHGKMMILLFJNHJKJIKJJJKMMNMMMKNMM[rponpplkMPQlXNibtrpamov\YlP[mmZqmkomxxtsip]`slqjUuyxoc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGHFEEBAB=??EGBGDIEEDBFIHHDGKJGMLNJLMGLNIMKHJMIJJJJNONNMLNML\hdu]lqWlNOQmUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ghacityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIEEDCAB<B@BFCGFKGECCHKHHFILKFMKKQQLHMMHNJIHNGJJHHNOMNLJMMJZtppoqqmlOQRnYskgooqqomt^nXat_nopoqroousttj[^tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtIKHJCEEE@@>CCAFCHIMHFCFJLIGFKMLFOJKWRKGKJJNIIJLIKJIIKMMMLIKKKSkbZi^_jcrrZ_Yko`eeUk_d[abQ`mh\j\niidZoedp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrIHFIDEDFA@AEDCGBHJLGFDGKLIEFJOLIOJL[QJFHHKMIHJJKKIHJGLKKKGHJJLLLKIKLNT[]TPUMQPNOOURPPQOOQJJNPQdqiTYV[[\UY[]X]\\cfaafbcf_^fkmhmtxrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusHCEGFFAEC?CGDEGCIKLHFDGKLHDGIQKLOKLWMIFEHIJHIKHLJIFHHJHHHEFLHIKNLIO\W^O\\`^OXYS\\b^MYZMXaRKYaZS`d\bX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBDIEGGFKJKHEEJJJFEHHPJLMJMRIHEAHFJIKKILJIGEJHEFGDEJGBIMJKT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^d_Z]`c_Y_b[`^[UYXZ_^dbbaceiekrpoppnow
{
uqprrsuyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKJJEFIINJNLHLNGHF>GGLIKKJKKIGEIEDDEAEID?IKHN[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_ba]^ca`bbbcceZRYVW][^c`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFDGEBEGHFGHIFGJGHFHKIKDDJJMMLLHJJHJG?GFNJKKMKKKIGHDD@D@GHA>HIFO]aZ[d]_TQRX]\\\_ZKW\LR\YIM^QQ]_bccccb\dcbdceXRWUT]Y[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKIFGGIGGJFFFILJNECJJLNJLIKJIIGBHHQMKKOMKKIHHED?EBHHA@FECT]Y^X_Y_[]UXXP]]QKJV^X^[]VZaRR__bb``bb`cbbddbXPRRS\T\]^^^__`dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHDRKFHHHDFKIMPEGIJKNLLILKJIGDHKQOMLPLLKKIJDEAECHFAAFDAVUE\T^SV_XNTUNZ[MJKT`a[_X_^b]OXb\``_bcb]bbW__TQPQRYS^\\]^_`bffelfoow|{{}
zo
~INFDFFGDIScQEW_IGGHDFMJPPFIIJKNLLKMKJJGEINQQNOOMNMNHLBDACCFDBACD@LHBLLPONLFMFFHIHGLLMOPILOPPSPLQTRUZXWYWXdVOSTPQOOQUT\YY[^^aaefchdlmqsszy{z~{}{
}KIEEGFGDKM^MHHYMGHJHGMLQQIKJKKNMUNOKKLGGKPTSNPONOOOHKF`ED^LDfcCL[H^[smOMVmYLCP_TlWgJ]WU^DLQULMSVQRTXVTXUT\TPfZhheZTkTXWU[\\``abbb`gignlhrz|}~}}zr{z{
~z{LIEFFHEEKOTJKG`TGJOJIOMRQKMKLORUROPJLNGHMQ[YOPPNOPPJKQQI|YYrsWPmHqnoaVPqqtOBksnqtpSo_[nX]V\XUkhU]VcY`YZ_VUWituu_av_Yb\\f[_aaab^`cgmpl`pwtx}~vxzmv~tx}|~|z~wwNIEHMMBDLLGJLFRVLKOHLRXWQNOOMQTNOQPKLOGMPS[ZTQROPPQKIZx]TxdhXQSPvgtlpbnfkRrOLwmjrpsrqrpop]fzuxqqzq~r}ku}aRh|essoss|}p~xor_``bb[aahknkblfgmw~~{xwtvzhr~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJQOMNJNV^YULQSNYYLSSRNLPIQRTYWWQTPPQSLHgxlcxqmZJLTypumubnvPddIevqmwojfxxiXrRi{mijzz}lxzpgnXuujvupash}ilx|o___cb\^defijegbcdllppstsssyqrxbltgry{ssuy~svzn|}yxrnMJRtNCBEPQIKLJLQOOOMPZ`ZXKTWPa^RVQYSMPJSTUXWWOUPONSJKrouuquqchaVnLqp^GhyWvTKhx}x`y{sna]modSgrunmypwlvstqlm\s}zkmy|lun|lqvux^__b^]_eeighfe^bbiiijknokqnmjpacfdowxompsynqpj{ztromKKZVHGEGRQKMNLLQQPPPQW\YUNVYUfXRRY^TMNJTTVWYWOSOONQIRmHiwK`dvuUWlNnl{rajguTKWkh}lmlx_Zpz{_`zscroxqhd|ir{]TKl_vuljv|{m~yk|p]^^b[^bdegffec[ccikkrsrwgmihdg`alagsrlhmmr|kmhk{tmmkmOGJKHJHHRQMOPMLSSROSSXRWTPWZVVTTTa`QONKTSSQVVOOMNOQJHQNPULKKRSRRROVUQQORRXXQNPUTXXX[[UQRW[WXW[ORTWWXQ]XV]USOXRWWXYZ`\gr_[[Z]]_cZ_ccegdddcZdbgffmnmuffgc`f^^g`dlhfgkhpzhggkujhgilPIKKLMKJTRNRQPLVVTPTUXUZVR[]VUTWUYXOOLNWTPNUSNPNLQPKJRQKQMJJOQTRPQSRIIMOPQRQQQTUQXW\WSRQQUUVTZQNRRWUSYVTYUSQUSUUYYX^Z_a]\[Z]]`c\]bcdfdeebY`acabhhjncad^_c]Zc\bma^ffgmsdihkkedcfhQJKKNOLMTQOTQQMXWUTVXWWZVT\`VWVYUXTQPKOXSPNUPNQNLSPMNUSNQNMNQSPTPRTTNLNORTTRRQVVSXZ[YSURTXWWY[SOSTWUTYUVYUQQWUVX\Z\`]WY_]^]\]`a^[bbcgfeebX``b]`hegea^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLOTPPTQOQZYXWYZZXXV]jdVXYZWVTTOKOVTPOTPPQNMQQOQXTQQOMOSUNWQTTUONNQTUUTTRTWUZ]\ZVVQRWXV[\VPSUUUVXSWWTRQXVV[_[_`_V_]^`\\``__ZbcdhgeebYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSTQOU\ZZW[[\YZ[dqmhd_[YVVXRMNWSMMROQROMPSQUZUTPPLPWUQVRTSXMOPRUXUUUSUXW[^]\[VROUVV[[VQSVUVXTSWZSSQYWW]_[`_`Vb\`a]`b_\`]cacgief`Zc`a__ee_`c[Z\[\ZZYYW\Z\[`^`[^^a`_c\Y`ZQNONVQPUSPUTSPW\\\Y^\_W\^jpwyc\[VVYRNPWSNQQPRTRLQTSY[WUORNSXVSRTRRZOQSSV[UVVTWZX]^\\^VSNTVV[[UQTTVWXRSX[SRR\XZ]^]aa`Wb[cb^ac_\bab_dgieg]\e`a`acd_b_YZ_[\[YXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTP[]^]\`\`V\]hjr}slh\UYWQOR[SRQTRTUTKRVUZZZSOSQUUUSNUQRZRTUTX]WXXSX\X^]YZ]TUNVVW^ZXQTUXXXSVX[SRV]Y]]a^cc_Y`[eb_dd^^cca^efief^^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POORZPZUVWVTTT^^`_^b\`U]^bkyum}lZUZVQQT\TTTUTVYWLRZV\Z\RPUSWUUSOWQSWSWUV[^X[YUZ^X_^Y\YRWRYXX_YYRTUZYYUWY[UTZ]]^ab`ed]^]]eabfd^_dc`\gehfdb`ea_aabb_`^WY^Z\\ZYYWV]Z]^[Z[\[WY\]VXW]SOPWYP]UVYWWUX_`aa`c]`U]^beev{hXYZTVTV\WWWVVW]XOU\Y^]]TSXSWUSRSWQSVTXXX^^X][U^_X__X\VQYUYZZaX[TVWZZZXYYZWV]_`_dcbee^b\`fbdfd_`dba[fchfdfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNTZVT\UWWYWV\`aacac__V[`da_zuohZ\ZVXVX[ZY[YXY`VOT][`a\UUYPTVTRVUQSUW[[]__Z_\V__Z]^Y^VSYXYY\aY]UVZ[Z[ZZYZXY__``dcdeecdZbfcgfe^ab`c]bciedh_g^bbcaa`^_XTZZZ[[X\XX\[Z[WWZXW\[\`]V]]SOVZVVZVYVXWX^`badada^YYadb`kfh^\][WWYZ\\\_[Y[bVSW^]ac\SVYPVUUUVUSVTX]]_``]a]W`^[^\[^XVXX[Z__Z^WX\\]]][Z\WZ_a^`eddffgcYcfehgd^c`_ec]fidei_g^cbcaa`__[XY[YZYXZXW[[Z[WXZTZ]\[`\U^bMRWYVWZY[\YWY^`baeada]^Yacb_a`a_\]]XW[[]]__\Z]cXYX]`cd_RXYPWVWXWVVWV]]^aba_b^Ya]]^Y]^YXUW[[`^\_YY^]^^`\ZZY[_b_bedefghcZefgigc_c^`feZiicficf_bbca``_]]ZX[YYXXZYWZ[ZYWYVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XW[]_]`_][`d\\XZbecaR\YOXVY[YYWZZ`^abc`ac_\b]_][_^YYTX]]__^_[Z^^`bb\\W[]`bbcedgffge]eghifcab\cg`\iichife`baca_`_]]\Y\YXWXYYW\[ZWWXPXZ]acffrkJYW][Z_]\^\Y][^_bcbaa]b[bdb`cbb]\[ZWXiq`\`_]\ac_^YYcedbT_ZQYW\]\[Y[[c`ccc`bda`c^`\^__ZXV[_]\aa_][`abeb^\S\_`cddfeggfff`fghhgdd`[fg^ahhcihfc`b`cb___]][Z[YXXXVZV\ZZVVULXX\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{||||||{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{|{{{{{|}}}}|||{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½sqrrrrt>(+++*%b~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääèÊrooooor2]}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyyyyy{xnoopppprrrrrrrwzyyzzz~|||||||zzzzzzzusssssry}}}~~}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwuvwz{x{xwvvxy{zy}yyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{{{{|}}}}}}|{{{{{||||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwww||}z{}{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwy~||}|}|xxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|yww{~|x{}||xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx{|||{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyywxzzzx{xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|}}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~
~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~
}}}~
~~~~~
~
~{z
~|}}}~|{|
~}~~~~~~}}~}}}
}|}~~~}|}}|z|
~}}}}~~}}}}zzz~~
~~~~||}}~~}}}}~}|zzz~~}~}}~
|}}~}}~~}~~|}~}}~~~}}}|{{{zzyz~~~~|~~~~~~~}|~~~~~
~|~~~~~}~}~~~}}}}{{|zzyyy{~~}~~|~~~~}|~~~~~~~~~~}||}
~
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}|{zzyyyy~~||
~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~
|}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
||||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
}
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z}x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~~}~~}}}}~{|}}~
{z{ywz}~
~~~~}|||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~}|~}~}}|{|||z|z}~~|}|}||~~|{{}~}~~}{{{}{z{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{}|zz}z~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~~~~|||||||~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}|}}}~|}|}|}}~|~}}}}|{{{|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~~}|}}~}||~|}}|}}}~}~}}}{|}~||{|}zzyyzy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv~
~~~~~}~~~}~~~|}}|~~~~}|}}||}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz}}yxtt
~~~~}~}}}~~~~}}}~}~~}}~}}}}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{sy{|pwuvwyvtz
~}}}~}~~}~|}}~~|{|z|{|~~}~~}}}~}~{{zx|vyz|qtxwvxury
~|}}~}~~}|~~~~}}z{{||}}|~}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}~y~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~
}}}|{||yz{z~y|yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}||~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{{{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqwyrx
~~~~~}~|~{~}~~}}}~~~~~}}~~~|~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~}}|~~~}|~~~|}~}~~~
~}}{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~}}~~}}||}~~}}||{zz|{{zyzz{zxswuqqspxwq{
~~}|~}}~~~~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}
~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqpwts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~}~~}}~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yy{zyystunsqpxruz
~}~~}~~}~}{~~{{}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxqvv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}~xwvyyz|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~}~}}}{}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~z{{zzzupxwyvu|uv|
}
{~~}y|zzz}||~z||}}|z{~~~}}||}|vrvxxvtvu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvw
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~|}
~
}}}||||~~~}}{|}}}}}~~~}|~~~~~}}
~
~~|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uz~
}y|~{
~~~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}~}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpur~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}}}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}~}~~~}}|}~~~~||}~{|||{{~
~|{}~{|{}~}{|~}~~|~}}~~}}||~~|}}||}|||~z{{}~
{{~}|||}}|||}}|}|~}|}}|||}}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}~}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~~~||}}{}}|}zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yzzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yz{{|{|{{z{}}|}|~~~{{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~{}}}}~~}}}}{|{zyzzyzz|yzz{{{}z{{{{}~}}}}||}}|
~|~~
}}~~~{||}}}|~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~
~}|~~|}|~||~}|~}}}||{{zzzzy{zzzzzzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××רÜÝÝÝÝÝÝÝÝÝÝÝÝÞÛרר××ר×Ö××Ö×ÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹³xssssssssssssp»¸¸¸¸¸¸¸¸¸¸¸¹°½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¥2)++++++++++*%a©¤¤£££££££££¥SRSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;@C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦8/00000000000+eª¥¥¥¤¤¤¤¤¤¤¤¦WWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;>@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©« E=>>>>>>>>>>>9n¯©©©©©©©©©©©«babbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB?;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÏÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÊÊÊÊÊÊÊÊÉÉÉÉÉÉÌÒÑÑÒÒÒÒÒÒÒÒÒÒÐÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÎÏÑÎÎÐÓÐÎÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖØ×××××ר×Ö××××ÖÖÖÖÖÖÖÖÖÖÖÖ××ÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÎÑÁ§ÑÒ¹¾ÔÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÏÏÑ𱸹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÏÓº¯ª¾¤ Ã}~¯°ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÏÓ±¸ºÔÒÍÃÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÑÀ° ÒÓÀ ÐÏÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÔ£¢ª«¯¡¹×¯¢©ÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÑÄ{¢©Ø£¡ºÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÕ«¯¼ÀÑ
¦Å¢ÑÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?;;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ
Ç¡ÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;547<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÆÓÓÕ竤Ŵ¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÒÑÒרÍͧ׹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÒÏÅÔÔ˽ÕÒÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::<=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÓÔÒÒÓÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786977899;;=?@<=89;;;?><<95:=>;99:<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9848<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?;8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995687673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785667784;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiihxsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptyvt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964777:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®xpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_MHQIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\ec[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¥¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlhbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocnihb^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥©§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´´¶¼¼¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkhguZfrwsxfg]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijh]jomxwcb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬¦©»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugiitmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËËÇÆÌÉÍÅÆÆÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlietnsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÆÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»»½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegcjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfcZYY\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿º½À¹½ºº´¿¸µ·³¯»¼·À·½Â¿Á»¿Á¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjffiei]VUSYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»À¿·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekgXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···µº¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8=<7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·¿¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸®µµ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcga\cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼«ª£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊĵºÀÃÈ¿¿µ¿À¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`aNHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍËÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶º½Á¼»¿¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼¿ÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp][^\YQEDCMIAD=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÃû¹³´ºÁ½¿ÇÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni\__YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀ÷·°µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_e][TJ<>?FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁù¸³²²´²·¾º³µ²¼º¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvrl^b`[]NHA?=HCFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÄÄ»»¶´´°¶º¶´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ournc\fX\]RNMA>JB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³±¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÊȾÀ¸¹¶²´¶³´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLAFMF8665:6:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹½µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±ºÃ¼ÂÊÅ¿»¿¿¹´´³±±®°¹¹¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH?HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¯²²ºº··µµ¼´¯´«¶º¸ÀÄÁ»µ¼½¸²³°¯¬®¶¶²´´¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥¢£¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGOMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬ª¨µ²±°®¯²§¦¯£¯®µÁºµ·²·¶²´«²´®ª«¯°²³¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©°£¥§ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRNJNG;D@=2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¦©¤©£¤®¥¬¬´¼·¬²±¯±µ¯¯³µª§¬£ £¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxy`bRU_HIIKSTIRPL8>B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ £¨®¬««¯ª¯©¥¥¦¤ ¢¦ ¢®«¬µ²¶¦¯´«©ª´±°°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±±±´©±¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle[SZYMQJNNULRLA7>B78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=?758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¡£ £ ¢¯®¬¯±¬¶§±¦¦°®¬°§ ¢ ¡¢¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³·¬±´£ ¥ ¬¡¡¢ ¤¡ ¤¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HQUHFUVJBMG=JH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¢ ¢©«§¬©ª´«««¥¥«¨ª¬ª¥¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¡«¢©¨²©«¨§¨ª¦§ §¨¥¤ª¢¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·£°¦ ¤¤¤¢¤£¢ª¯¬§©£ ¡¬®®ª«¦ ¡£¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸´»Åü»·³©²ª³´¯³®ª®£«§¶±¬¢¯¥ £¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{trkkurphW[QETHDIOH>EA3EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ¡ ¥¥¦§ «±®§¤¤£ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ½ÇÆÂ·ÃÉÈÂÀž¹´¹ºµ»·°µ²ªº²®»¶¾ººª·«ª¸º´¼®¸£¥¢§¥¢£©¦§ª§ ¡¡¤£¤§¢}zrkdhoxjeZ[FJLDDSLDBD7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ £¡¯³©¡wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÈÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÌÓÐÓÓÌÊÂÅÆÆÊÇοÉÐËÆÄÆÄÁ»ÃÁ¾¾¾µ½³¿¿ÂÃÆÄÇÄ®¾¸²¸¼ÄÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDB@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª££¬®¦¥±ªÅÆÌÎÍ¿°Â©¥¨ª¡£©¡ ¤±±«¤ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÔÕÓÓÈÌÇÍÍÉÒÌÎÓÍÄÇÉÊÁÅËÆÈÈž³³ÇÄËÊÊÎÅÊ¿¾¿¼ÁÇÄÌÌÈɿÿ°³¨¢ª£¦©¬¤¥¦
zruugcgvidVWQDMF@IQB=B<:23@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤¬©¦°®¥¡¥¡}wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÓÏÒÃÐÓÖ×ÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÕ×ÓÖØÎÒÉÎÑÌÎÐÌÒÏ¿ÇÆÊÃÌÌËÎÏÅÆÇ¶¿É¿ÒÍËÏÅÉÈ¿ÃÂÈÎÌÏÐÏÌÊÇ͸·»¨¥«§£ª¥©¨¨|wsvoc`erb]R\IJFAEHI>;@8=4585:76:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´¶ÂƲ¶©¢¥¦¡¢«µ§±¡¦«¡¡¢wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÏÏÕÔÔÑÒÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑ×Ò×ÙÕÖÌÎÏÉÍÑËÎÏ¿ÅÂÇÅÎÍÑÐÑÈËÌÀÊËÅÓÎËÎÈÄÉÆÆÈÌÊÓÓÑÕÏÒÌÒÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
{zqstmacim_VP_JJBFCQM?<>44:=52755<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡© ¯®ªª¬¦®¸¨«·ØÔÕÙÙÑÎÐÀ¼ÌÉ·À¯§«©£¤±¶³£¶©¨¨¡ª©¡¡~recb__a`_a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÓÍÕÔÒÊÏÌÓÖÒÑÖÍÏÕÕÑÆÑÔÊÑÔÕÖÎÒÐØØØ×ËÈÍÃÉÎÌÉ˿ȿÈÉÍÍÏËÐÍÎËÎÏÇËÏÐÊÎÊÂÉÆÉÌÊËÑÒÌÓÑÐÏÏʽȹ°»¸µª¶°¨¸³¿»±
yvopnkadnpaW\ZIFFDLWE;@<33<=86855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦£§¸¶µµ¥®¾´±ÀÙÒ×ÚÜÖÏÍËÃÓв«®¬¦³±¸«²Î¹«l^^^adb```a``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÔËÌÐÑÓÊÎÑÕÒÕÕÊÀÊÁÅÌÂÈÉÂÌÃÅÈÊÊÎÊÌÌÏÍÓËÅÈÏÌÈÇÊÄÆÀÅÉËÍÐÑÆÐÎÍÍÌÏÅÇÀ·¹½Ãýù²³¾±¼Äĵª¥¡
xpqknh``qhYXhVMGLIPPB;D>;67:89:56==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±ÇùËÕÖÙÚÛØÌÌÏÉÖÖÅĸ²¶ª¤®¬¹¹°¶Õ¡|ebbb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÒÈËÎÍÆÑÒÏÎÌÔÊÇËÎÏÇÇÏÒËÐÏźľÆÉ½ÂÆÈÎÄÂÇÀÇÍÇÃËÉËÏÇÃÃÏÈÆÁÆÇþÀÇËËÌÎÂÊËÈÇËÐÄÅÇ»ÇÃÈÈÂÏÀ½¼¿°ÁÊǺ½ª±²§¥¢¤wntdl`^fqa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥³±¬ÉÍÊÈľ½ºÍÍÆÐÕÕÙÚÛØÐÊÐÐÒÔÊź¾¾°¨·«¾º·Á®~
t`[^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÈÆÂÃÀÃÇÊÉÈÊÈÁÅÌÆÈËÍÉÄÂËÉÂÂËÐÄËÈ¿¹Á»Åǽ¿ÆÏÊÃ¿Ã»ÉÆÈºÇÆÄÊÀ½ÁËÆÅýż¼¿ÃÄËÅżÀÉÂÅÇÒÅÀÈ¿ÊÊÆÈÆÐÃÃÆÃ¯ÄËÇÄÊ·¿¼º´©¬¥¥¬£¡¥£ {vstfj[anmZ[XQDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÇÍÏÎÍÕÐÖÙØÙÐÍÔÎÏÐËĸÆÁ¶µ¼±À·º°{
vxurp_Z[]`abcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ±¶º²²³²±Â¼¼»¹¸ÀÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·»ºÅþ¼ÁÍÂÆ¾¾µÀ½Ãº¼Æ»Â¹³¼Åö¿µµ¾¿ºËüµºÈº¿½ËÃÁÅÂÆÈÆÈÆÐÆÂÌȲÇÊÃÎÍÁÅ¿½²·°³§¨¨¹±¥°«¬yvwjeh`hocV^YJEJFHKAFBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÂÄÈÎÒËÊÊÇÍÎÏÒÉÑÆÖÕÖØÎÌÐÈÍÈÊžÊÁ²µº·»¶°
y~|tud\\]^``bcbbeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸´·´³²³ºµ½±·°µ¯²»Â¼Áļ¿»µ²º¾À¸Ç¹´»¶À¼·½ÆÀüµ®²¶º¾³Ä·»µ«¸¼½À½°ºµ¯¶º²Å¼¶¯»¿´¶´Å¼¾ÃÅÀÃÅÆÈËÆÀÆÆ»ÈË¿ÏÊÇÃÆÁ÷þ½¶¹¾Æ¿¬µºµ·¶xtxggebkn^V^`FKHHJFBCAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÍÎÉËÉÌÊËÆÑÏÓÑÏÈËÆÊÆÄÀ½Ï½³¹½¹¸·{y~wx}th^]]]_`_`da^cec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¹¸µ°¬¬§¢ª§«¬³©«©³®¶°²©®¦¬²¼º¶Ã¹ºº±ªµ¹»´Âº°¿±½½»µ»Ç¹Â·ª¨°±Àµ¸¼¯°§±³´»¼«µ¥®¶®º±°ª¹¯»®»¸»¿¿½¹Â¿ÇÃÅÁ¼ÆÁÈ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÅÉÌ˳¹Â¼º²rvvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>=9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÏÒÌÄÆÁÅÐÈÏÂÄÇÁÆÆÅÅÌÄËÌÂÄÁÈÁº¼»Ê·´¼½¶µ«|y~
z{wn^]]]]_`__dcbccb`_^[[ZZ]ZZYZ]enohfgiknr¹°µ®¦¥§§ ¤ ¥«®£§¢«ª¬ª°£¦ªµ¶±½¹¯¸¯¨®¸´´¼¸³¼¯·¹µ±»Á±Á®¥¨¢¬±²³§¼ª«¨«¬´´¦¨®¡¤¯©²¥§¨®¥¨·¬°²·¹º»±¼½¾¾Ä¿µÁÁÇÈ·¿ÀÅ·Ä¿»¿ÄþÄÈÌÊ¿¾ÃÀÀ©rtrji]aodWVXPHZRSKFFE>?@9789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·ºÄ°¶°ª©°±³µ½¯ÆÑÐÍÄÈ»»ÌÃÌÀ¼Ê¹ÀÆÀ¼ÌºÃÇź½Ä¾º·½Æ¹¶¹»®²{~~xt|swf_]\\^_`^_ccab``_^]\ZXZ[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥¤¡£ª£¢¥¥§¥¬ ¤¦¬²¯¶·§°¬§ª´«´¹°¶´¬¶¸±°º¹±·¤£§±§«¨¹ª¤¦§¨§² §¦¤¦¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹ºÂ³À½¿µ¸»½¾¼ÂÇÄÂÿ¿Ä wpkae_ko`UY_HNhOTGEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7776788666;::;9:;<859<:>>@;ȵ¶½¸ºÁ»¾µ ¡¦º¶«³³»³ÅÐÉÌÃǹ¸ÉÂÎÁºË¹½È»·È»·ÄƳ¾Å¼·°¹À»±³·°¢}yvtomkjjqi_`]\\]_`_acb````]\[\\XYXXXVX[]^dcbegggjmo© ¡¢¡¢¦£¥¡§¢ª°±µ¢©ª©«¬¤µ¸·¯¬²´®²µ®°ª£¢²¤¥©¸¡¦¦¨¬« ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«²²¹²½´¶±±µ´¿¶½À½ÃÁº»½zrk_e^ddXTX^IW]KPGIJFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÉÉÁǼ¼ÅÅÐÀ¼Ê»»Á»¶Å¸µÁÁ³Âļªµº·¨±³©ysnpnkb^bff]]^]]]\]_`abccba_\[[Z[YXXWWWXXX[^bddeffhikr¨¡¡¡¨¥¦¡¥ ®®² ¥¢«§¡µ°±±¬§®²§º³¦¶¡¢£¢¢¡©µª¢£¦¥¦£¬¡«¦£¤¦«³³ª´°²ª²¹´¯©¯²²²·³®©¬®²¸°º¶¹½¿·²±
yue^e^[YVSZUK[QLIEHKIB=?AA@@:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾½¿³¥£¥±Âµ¶½´¸ÃÍÉÈÁƸÂÁÈÐºÃÆÀ¶¼½¶Ãº¶¿Áµ»¿»ª¦±»±¨²¯}
ypqtqhfdiec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXXVWadecdeddhjv¢¡¡¡¨£¨ª¦¯°«££·ª ®¨¶©¦¦¬°£·°¤· ¢ª¦¡¬¸¯¢¡¤¡ ¡©©£¡£ªª°®¨´«ª¦²°¥ª®²±¯°®¯¦§§²®±´¯¼´¹·®£yud^aVYWSRTKM^LPKGGLKE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§£ª»À½À¹®´¸ÂÍÈÇÄžǺÊ͵ÄÅű¿À¹ÀÁºÀÀ¹º½·¨¨±»¦©¢¥~xrjlrtpihedgb\\ZYZ\\\]^]\[\^\[\Y[\ZXVWWVWXWWWU[ccbbcbcdfj ¦¥¤¦§¤ª¯¦¢£¶¨ ¡¢¨³¡¥§¤¯¥°¬µ ©¡¡¬±°¢¢¡¦¦¡¢£¥¥«¤¥°§¥£««¥¨®¯®«¨ª©³¥¦«¯´±®¼µ±¯¯ zvrda\Z]XNLQGRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»²·¬¤§·»¼Áź±¹µÅÊËÁÄÇÇÉ¸ÈÆµÅÂɯº¼Â¼ÃÀÁ½¼·º¶¦§²¶¢wodbgihfhjgjm`]\[ZZYZ\]\[\^_\ZY[YYZ[WUXWTTWUSTRU``_`a_`acdi£ ¥¡¥¤¤¢£¡ªª¥¥±© ¤ª§¡¬¬©¨¢¡¡£«©°¢¡¢¤ ¡ ¡¤¦£«¥¢¤ª£«®¤®±©¦¥¦¦´¦©¨³µ´¹º¯ª¬rpo`[WVUQFQOHZ\ORITKSLEGIC8;;=<8667:9;:976977:;:=<<7;<8>598:88659:;<97?<9578452121..1426:8698598989;9@9{µ´´»²°¬²§§¯¹¹³ÀȺµÀ¯ÆÉλÂËÍÉ·Ë¿´ÀÇ̰¶½È»ÂÇĽ¿·ºµ¥«°®|uijjmhjlnkkme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^^^__bdm¢ §¨ª¨ª¦¨¤£¤®¤¥¯© ®ª³¥¦££¡¨© ¡ ¡ £¢ ¢ ¢¨£¢¨« «¯¤·¥££¢¬©¨«¯³¸²½µ³«¯rrh[XYSUREYLP\YMTNPLPRINIB<??A?=65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577570141-+/434988::8::748=8?9~³®¨³¶®©¨¯©¨¬·¶¬¼Ê»¶¿¬ÌÇÆ¹ÂÏÐɵƾº¾ÆËµ±½Å½ÃÆÄ½Á³¹¯¦«¯«wxoninnnqggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]\\^_`d~¢ ª©¦ª§¯¢§¬ ¤¨§®§ª¥¡§ª¤ £ ¢¥¥§¨¨ ±°¦°¼§ £¬´«§°´°¹µÀ±±«}prbVTUNRIGVQSRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576761321-*.102877;99;8948;8@8³¦±·ª¦¢°«ª§©²±¤¶Æ´¹º³Ëƺ¼ÃËÑ̳¹º¾ÀÄǶ´·½³»¼Ä¾Â±´®±®±¬¢khnoroqkpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzu¨ª¥¤ª§ ¥¢£¢¢£§¡¡¢¥¤¦¨¦¡ ´²§²·¡¢·¬ª¤²²¦µ¼µ««±£xrm]NPQLOCNNNPKFNNJJNMQIMJAGKHHC>858889:;69:68;99><8:>9;?8789:886857688974577820301*)-/12776:999984988A7w¶§¤¶°¤§¤©¥ ©¥¤³ª¢²Ãµµ²³ÇǸ»ÄÊÍǵ¯¼¿¸¼Ä³³®¶¢µÄº»¯ª¬´¯¯ ¨}^`gsqvqjnifhhj_XYXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKLSWWVXXYX[]aosvq
¢¡£¤¡s}
{¢~~tz¢£ ¡¤£¢´¯¬¯¬¥¹¦¥°¡°®°»ª©¯ªvrbVLQOPMCSNLQMCPPHINSMHJJDJLEJK=749888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-12764789::65:87A7w·¢£´¨¥¥¨£¦¥¦¦¦³§¥´À¸°´°ÊƹºÂÏÇ¿µ¯½Ã¯±Ç²§¬¤®¿¸±°§«¢rWV_hgihincjhgb\XXXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo{
syz
}xqo
~¡ §¯¨©¨´¢¦¬«§´¢©£}qm_ZNSQVLDTJPMLFOOIELQMKPJIMPFIH=7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//((++-3854779<:79;86A9x· £®¡¦¦ª §©§¢©°¨§´Á¹±µ°Éù´¿ÏÀº±±¸Ä«®É®§£¢º§¨¦¥¤¡iQMRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`moi{tPB@}y`JQnx|n~wuvxpQ{~xvgw
~¤£§©¥£°«¡¤¤¦ª¡ª¢¦¨tke][HQQSLIUMSILLPIHFKNLMTKQQOFIC<769:8:;;8:;8>?99>=7;<6;;478;7775344696/3/.125221/,')**,4833979:99::::?9v¶£§¡®¡§¨¥§¨¯¬ª¶¼¶¸¶³Â¼·¨ºÉ¹·©ª·¸¶Àª¢²¢ eMLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut{
{uxsnupty}ª
yzhv{prmxxz{vsrwguz{¨ ©¥§¤ ¤qg`\\JVOQGKXROJMMRJJJMPHLQLRTMEHA<77;99>=:;<98@?::>=7==79947795675252572/2.,//200/-+(().1272198798775:<<7v®£¡³©¯©¥¬¬°±ª½´²¼¸¶ºµ² ·»³««¬µ³¥¤fJIJIGFHHPTTTWWSTUUUVWWWXXXXXYXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQRSV^u}ygw}gyvx|r|v{ok~|s{}tfv|
lohs|lyq}pmuqhq}pC
~wwz
}zu~£¢¤umkeaYWXTQJRUTOPNQVKNKNOJQOIOOKFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«§©°¯±¬¼¸¬»¾¹³¨±¨§¬§¤~|z
eJGHFB@CDILLMQRPQSUTTUVWWWXWYYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{xo|yy|
omxsxjjr}Inhw~licly
ksl|nr{hmp~s
z}~{vott
ywp|}lhmnmWUWTQQYOSUUTXUMNHMJMNKCINGE@:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¤¯¢ª¨µ¯®¬´¿«¼Â¿¦£¥
¢¤v~
|x~t}xuw|fOEGD@<>>AFGGKKKMPSRRTTTTVVWWXYZYYZWVTSPLE1@3 jrAo;<95<_IMOORWZRY\`§bitze~pmzutlts{jkLyg1vsl~}tfet~
filukp|gpp{n{s}|qpnum~wytiyyuiingcWQYWXY[MPUVZYNIIEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226,+5775478iO8;5n¤¨²¦º®«²°Â²»ÃÇz
twvwuxvoxsiUFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯³ q|xm}mq
yyr txsu5q¨¡¡¢vp||shfbinrmpuioXuovlz|mqmpzsumbv
ux~}xpnnj^Z[][YX`_SN[[YXLHJFJG?CABG?CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´¨±®Á³ºÁÆ}nv
oy{{q{t|ko^JPG>@7458;;<=>@BEHLLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lv|}
~v¢y~
aªzv~s{\dqtz{wlgiaxo
znwszpsywkni]w}|}q|uw{}tmqrde^ZZ]S[f^XQUY]VGKKELG?F@DC?AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\w¦ ª°©¯À±»Æºzvk~
yu¢~~s}lylSXLAE311266688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y{q|{|~v¡¥¬©H¯¯¨sl|}hggx~n
qGkwqyvhmk_w}
z{uv|wmow~}qqpjZ[[ZcbWge\UPQXZQDLLGOICFCCA@CA=988:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¬¡¦¸¯³½´}tp~}¥yu
y_cVLC60./22123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¥»±§»Çç¡¥{r~v
ihotqw{v
}nvug¢«£{zzogkx}w|qic\YY\h\af_ZOLNXSQIPKDNGCJDCADDA<:87=<:<:88778:==8<=68656623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nvpgx{¤¡¬¦«¯°¡xw}~mpj^CA4--////02234779;=?BDHJOQRSRSTTRPOHDB<87/9C><<63.lMPHIKKKNV`cggmu ¡£©¥£¬¨¶¢§Á®ȯxº|¡
¡
lpuvql
r¡¥¶©¢~kjl}~}q_[b^Yfj\lk_XKHOSQNMLFIQDDNFBCEGB>997=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªhf¤~
z}
xxhNR>//.,/.-/000212457;?CFNPRTPQQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÉ·ÈÑϾ pi«©
§¢wz~¡{v«³ }¤£§¶°¨lss{|ynf^[_^agc_gg\REKKQOIJMFFMCHLFFCBGDA:85<<899975658>75=84745754546958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f3A@ib^Pqu`n}aw}|ªªBD}y|
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=FH@A@8662<9;FHGIIMOQYmw£§ªµ½¸¥®¬¬¨©µ¬±·²²»±³¾³Ä¬»É˸ÿ·¥£°²¬ª£
¥¦ ¢¦¢ª¨¤
£ ª ¤©±£§·»¡£°££¤¢«°³µ¢¦ªz{~{e^fZc`]bb^fg_[ODJHTOFHLFKGFFHAKFCFFA:87=<88:974658<54<76:54644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|{
qna@E64<3/110-,+-1/-4?DANVQRTUUWUM\QGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇÄ«³Å¶´À³¸¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´°±§¯ª¤w¤¡«±³©¨®µ»²º¬¯µ¢±¬²µ¼¸´®µ ¨¨£¨©°³º¸¸¨¸©¥ yrW_bUd``a^_f`[UJDELVQIJJEJHEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL\ZQcdWzuq}v~{¿»£¼´z
zyn]W@EN<6:46AB764//6CHCQ\OQUWU]WO_UIKJA@?GKFFD;>@7D7?BJJEGWTP^¤¤²´Ã¶¸ÁÌʶ»Ä½³´Á·¸Âµ¿°¸t±´¦ºÅ¤°Æ¹±³²´¨¤¶¶ª± ¢¢¥±¥¬§¤ ¬³º¢¨²¹µ»¾Ì¿Å޽³Â·º·¿¸º¸º±¦±ª®¾°½¼Ã컨®«~yhUa_VhchdV[cYVTJHGLQGDIJAID>?BBK@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYVZwjp
o{rxb¹¡£{z||}xzufO\dGEL:Qd`[^SF?;HPDZcQQYYZgZS`aMSOEA?IJHEFA@C=E6B?HGKMSZT^¯¸µ»¹ÉÀ»½Êͼ¼Á¼¸¶¼»·¾µº³Æau²¥±«¾ª¥¨«ª¤¢²µ «§®¥§§¥¤¢§°³¨²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÄÀ¾¾¿¼¼¸´°¹··ÃºÆ¾Äɰº«¢¬¥©·|n]_^\U_]heSXaVSVIEFNKA>HD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPOQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@JMPRLQ]hmlqslrrtÕÀµ }~y{{yt}zkepvY]\Peeb`ed][XX\MdmURmn_o_XgeUYTKDBKJHFHHHHBI9D@HKTTV]Z\¹À¹¾¸ÆÁ»¹ÊË»¶º¶¸¹´¸µµ®¶·du©p^¢¡¢¤«¥¨¦£¬¤ª±·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊÀÉÏ´¤¼±µ°¬¹½}vi[]YW[_XbbQ[aTRLCBFGE<@F?BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;.&**(-.0,@M+/54mI0Ht?>BD@CDGKODR\Zi`onlotu³¬¡¡
|s{
{tt{ylmu|iseilhfjii`fiimZmt¤½g[oh]ZYTHKOPJKPKTQHLAJFKP__bgjb·Ç°º´»¾¶±ÅǶ°¹±±»³±¨«¸¶¨§N §¥¡¦¬°¨¯§³³ÓÔÔÖÑËÏÓÔÎÓÏÌÆÃÊпÊÉËÉÒÈÍÎÃÐÒ¸°Ä½Äº¦·»Ä¢laZ[[V^VXdYO\XOQCBIECI<AD>BH?@B8;D>@I=56655;:687654/10146278875367C5B8?-0,1348=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshroyy¡ª¦}
|p{r~qyulpxr{nxslipmcinpyiw}~Ë¿Ãß§ncxnd[a`KPRUNY^P^]NQNTQUT\nnwr®¸¬µ¨°¶«½Á²«µ¦¥¹§¬¯¡¬´¤±®§«¬¤§¢¬¬ÎÒÕÑÍÌÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓ×ÍÒÑÅÒÖÆÁÏÈÈ鿸Ðwlc[`[T^Q\ZOOSPOI>AGBCF=AB?FE>@?:===<JB45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwlwp}~ ¡
y
{r~z
v
owsls}|w|sxqkrriprzyr{¾Ë²vr
wiai]DZZ[WfdXekTX]]`c^cx{ª¤¤¢ ¡©¦ª±¹«¦´£¢®¢¤®¢§±¦k¢~¬
§°¢ ¡¥¤¨ÈÍÏÇÂËÐÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÊÔÚÍÊØÖÑËÄÃËpm`^]VRWRZOJGJJJ@;:;EBD=CD>HC?CB;<9<:GC46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu~isyr
x~xs|}w{oxqmuvx}t|ylvun}v
uy{µ<AÆ¥~}jeWICecfchjdoy[_fhknin £¤¦²¤¥² ¢¥¢©¡¢±~
zª£}ª³§¦½ÃʶÅÍÑÐÒÐËÒËÉÔÎÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÍ´uslb[WQSPXUEFJIFF=:7:@BC:HE@EDBDA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?2*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopbqqt}~
}x
zyq{{
uzzp}ppzr{rnzuw}}u|°tYªÂ·pnc=^hrqqpnwweiorvxr{ « ¡¬¢ ¦¬
}
~ly{ª¦®µ¼¨½ÆËÈÉËËÏÉÄÒÊÔרר×ÔÛ×ÓÙÛÖÏÛÚÒÖÉÕÌuwfeXWNQR\GBEII>B>=8:>@<>H=@BABEA>?:87DB755479.566435532323647553458EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbflvqy~
|}~wyn{{tz¡vvtu~too
u|
zv|¸Æ¥ÃʸxpfNec{w
¡yzw{|um¦ £«
z|¡¼ ¨¦¥§µ¾À¿¸ÆÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆvvdfa]RUUTMKDMD;=<<9:<?9=A7>?@=@>=9867CA6455=80665547745613854564567HH=DJE7925;H>;9:7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa]\itzylwvz|~~
{~
z
|v~um|}~t|~x~yot}
|~{©Ã ½¤~}ss¦
{iGq¡¤
¡¦
¥¸¡¦ £®¶º´«ÀÆÊÐÈÇÍÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¶vutgfbT]YROOHCLC==>99;:99<=6@>>==9::;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWO<MTHN?96333>C;[X>5YypZ<<A<=>8589?<DRSRX_VXfmmmiqsy{{||{}|~uzszsm~
~w¡n©
{ |~£¢¤¯ Wr«[¢£¢
¥
²¡ §±¸¬¤½ÂÇÍÈÆÏÌÐÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚlyqccZZVQUWC@ID??>:49:;7:;:3<<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbxlb~onxxz{}||w
sp
{uwvt
}¦¢¦¢¨r²¨
£ ¢©° o·ÄȲ¢¦±d¤ÍÇ
ª¤£
¥¨¡¢²´¥£¼Á¾ÇÆÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎo{d`[\[MISYBAGD;B>837<<:8>64::<:72?:929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcGv}|m~xz~{wv|mn{}xx|~¢³§£«³¢§¥¤®¢¸³¢¡¥°£¤§¨¬¯¤¡À£É¸«£¦²
¨¢
u²¤¡} ±®¢¤·¾´ÅÇĽÃÃÀÆÍÊÉÓ¦ÎÌÓÒÑÖØÓÐØºovrY^S^TNHIMEBCD5>:77:?<<7=42669774>5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGMZ\YJf`;Hzzn
z|x~px|~}orz~|x¦»¬¨±½°¥³³¨£¢°¬µ£¸¥¥©¸§¤£©ª¤®°ª »»®Ê¡j¶¸«°£¬¾£^ª²|}´«¡¡ ¥¯¨¡¥³¸¬ÂÈĶº½¼ÅÇÇÂÑ ÆÉÍÍÅ×ÖÑËÓmweYWP\PNEC><CAB8@885?G==6<35345454B49:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdHb`bpJ@~s}un}|}pww|©ÂÀ¯½Æ»³´À½´«³¶¨²½«»¥¨¹¸«¦¦¢¢¤£©¯²±ª¤¢¦¥¤º¯©À¼®²¹¥¤¨~½°z¨±¬¡¤¬ ¡§¦¤¢£°²¦ÁÆÃ¯°º·ÅÄÿͦÇÄÇĽÖÐÍÄÊ
po^YW\XLJAKAFG?A@C;:4>A==5=6>343241A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUN79GD?CF\eF`igZ]\{uo~{q~{z§³ÆÉ¿ÂÌÂùǽ»¯«¹»³·º²À®¥Á¤«¯¼½ª®«££§«®µ°ª «¡¯µ§£ºº¶Á¼¬©³¥¤¨
©Ääy¡¦ ¯«¡ ² ¤ ¥¤¦¦¤¯¥ÀÄ¶Éþ¶Ï²Ä¿Ä¼³ÑÊÈ´quiYUYgPLHBLKLJAA>DD<5AE;;3=8B332263A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeZMe\fTbkyr{xz¡¨º½ÇÈÉÁÒÉËÂͽ³¼¾¨º¿½»Ã·¬Á©¬³¼¾ª°ª¤¥¤¬®³¶µ¡¯¥¢£³½ª¨½Á¤¶¸¯¬²¬¬¬©¦¥¥uy
££ª¥|£¡µ¥¤£¡¥¦¤£©§¢²¬¨»À拾·Ì¿¹¯Ä³»¾Á¸¬ÂÃÂÀjv^UTYXJJLIFDDHCCADL:4DI:;4<8E.12352B26SHO<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>iH_XbZccV x
¡®§¤Â½ÇÃÇÅÓÎÎÍ˼·°º¼´½Ë¼ÃÁ¶·¼³¿º½®¯¨ ©¨¶®©²·£§¡«·¸ª¥°¿Ä²½¹´¨«¶´®®¥¬¨²Å§||ª¤¡£¢Z¤e£²¥¡««©¦¦ ¤¨¥¶«©¹»Ã´¥´µËÀ¸ª¶«²»¸®¨¸º½¸hkWTRSMEIRMK?AHEEHHH95EM;>8=@J.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;>@BFBpEjIReaLF¥¢©¦¢¯¾¯¡Æ¼ÄÄÇÆÏÏÎÒÊ¿»¶±º»»¾ÏµÃ½¸¹·³±µ³¸³«§«¬¹ª©§¯°£¯¥§£¥µÀ°¬¬´¿ÃºÀº´§º¶¹´¯¥®®¤¡tÂ}±¥£ © `J¥U° ¯¤®ª¤ ¥ §¢´¨ª³»»»ª±²ÇÀ¹¦¬«²²£¡²²´¤mjbYWMOJDOOPR;GKIGICC>:KU?A:=EM07534:B44MWO;JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯¨
¡£¤µÉµ©Å¹ÂÃÈÊÉÈÍÍÆ¿»³®¹¹ÁÁ̵ǺÁ¹µº°¯¯³µ§¤ª´µª©¦¬¤®¥¤¨¬»¿¨¬¶·¿Á¿¾¹³²Ä²¹¾£¯µ¬¹¦¦v¿®¡ ¡¨¨ª¡§nv¢¢®²£ª¨ª©£¢¤§¢±¦©«¹¶½²²®¾¹¶ £§¨¥¦©©`b^]NJKFGMJVL=MENKLBCD<QV=AABDO18=77?B75UXO?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUH~e^HE«¢»¯««¡£££¶Æ¾´À¹ÂÂÇÉÅÂÎȾ¹²¯¹µÁÂʵƲ¼µºª¨°££ª´»¦©¦«ª©¯§£ª«½»¨½µ¸¾Ç¼·¶¸Â²¾Á´ªµ·«¾¥£¢ ¼ ·©¥¢¡¨¤³ ¦¨ª¤¡¢ µ¯¥¤¯«ªª£¢¨©¤¡¡³´º´¨µ²³£¥ª¡u]Z][HGEFLQIMEGGBSLJBEGAVSCH=AGQ1;B7:BF79\YKALPTUSMWRNUJE@JJNO9C@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19f\FCCpbGE§£Ã¥ªª§¦¬¢«¶Ãü¾¶ÁÂÀÇÄ¿ÍÆ»½¹²°¹³¿Ãȵ¿°¼·¹¶¦¤«¬¡¡ªªÄ¢¤©¬¦¬¯«¢©©¾¸§¿²¸·Ç¶µ¹¸À³À¸µ³´¯¾££®¢£¥££ ½¤©¨«¡¥½¡£¢©¬¡¤ µ¬¥°¦¯¥¨ ¥¤«±µ±ª¥ª®¬ ¨e_W_[MHGJNLHEDIA>QIA<GIH\ROK=HOU4BF9>HG5Ca[KBNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ9mRF<KxeaVK¢£Å¬¡¬® £¤ ¦©¬¶±¢ª³¶ÅĽ¿µÀ»È¿Êǵ¸µ´±³´·ÁŶ¾±¸µ¹´§¬ª¬¥¤Á¥ª ¤©¯¡¦¨½µ¦±½¹·¶Ä²´¸º¿´ÄÁ¹¹®³µµ£¥¡® ¢©¨¬£Â¬©¬®¦ ½¡¤«¬¬¦¢W¥¡ ¸ª§´¢±®¡£¥²ª©¢¢¥¥¤_bXb_KGJJNFEAGK?=JB99JJN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrGE6=ue\KM¡Ä¨¥¢´¢³§«¥ £¬©¬»°¨¬¶±ÇÅÁ²ÃýÆÄ½Äɼ¯°¶°´¯¿Ä´¹±°º´¬¨±©ª¥¡§Â¬±ª£®°©¥©¼¶§·»¾¯·Ä³³ÃÀ´Ç´»¸¬´¶ª¢¦¤¬¢ §ª°¯¯»²¦ ©©¢£¸ ¡£¯°¬¥§¡¢§³¦¦²¢¬¡ ¦«¯¤¦¢
_cYfdIHLJSBC@IH;;F?99OMU^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<25-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 餪³¢¤µª³¬§¡¤²¬®©»²±µ´ÆÀÄ´ÀľÉĵ¿È´«µ¨°¹¬¿Ä³·®¶¸¥ª²«ª¦»´¨°¬ ´²¨«¹²¨º´¹³¸Àª·²Ä½µÇ¨¿¯®¶µ©§¬¡¦¥¢¢¥®¸®²µ¶ ¨¤¤ ·¢¥¥¯²²§ª¦¢¨ ¡®²¢¦¤«¢
¨©ª¡§¡
wbg[jiLONNT>CANC;:I?77RO]_RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914801-/.<6-#Bqgsk23/1[bZ33806p[bH05IohUCWFyfC;££¡¦¿§§¯±¡©¶«º±¬£«´¶±°¹·°·¸¸Ä½Ãǽ½ÄÂÆÀ¸ÀÅÀº©¶¤¬»Á··ª²º¢±²¤§ª¹ª¦°« ¯´³«©¶¶¼´³¹·¬¸±Ã»¿¿¦Ä«±·¯¨««§«¡¢¡¡±¯³¬°¹© § ¶©¦£¢±±´¬³¨¬ ¥¢£³°¤¨¡©¨¦£
}igk`lmWPQ[UABET@<;IA7:XPd^PWWEY_^MLRN^KJ>Zc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251--.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=§¢©½¢ª°¬¤²¸ª¦¶´¬ µ½¯³¸»º¾·¶À¿ÉĹÄÂÀ¿¸Ä½Á·¯µ§«·²¼¾¿´©®±¶«®¨®¦¨§»¥¬³«¢±°³¬©¶´µ¾®±²µ¬°´³Á»Æ·¬½°±¸¬¬ª£²¦¥ª ¤³ª³««³§¡¦¤´®¨¡®®±¨´²ª¤¨¤¢¨µ©ª¦¥£
{dkqfoq^FYgVDBMXDZ9HB6>\Qh\OY]G[^]OMRXdJJC\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8)C3YU\gK6zfL@¤¡¥·¥¬ª¦¯®·ª¯µ»§¦±·Å·±¶½ÁõµºÄ¾ÌƹÃÀ¹¾¹Ã¸À¹²´«©º¶º¹¾´ª°µ§¬©¬«««¾¬®²£« ±³®®¶²¹¸ª®®±¨µ¯µ¼½Ê³ª·µ±´¯®¦¡´ ¨ ¦²¢ ¦¯¡¤£¥¨³ª¡¦³ª¶¥¯²µ¯¤¬§«·£ ª¤¢¢ z
{jmwmu{aFakYIHZZ={JFD6AbTi[M\aK\]ZRRRb`LKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T_T_/5(C_Q\.+B/JGP[G3cYTKD¡±©²ª¬¦¤¯®¶©·µº¤¬´·É»´»º¿¿´³·ÃÀÌȼü¶½¾¿·¿¼±¼§º¹·¶Â¶«¬±·¦®«¨£°©¯»¤±³§¨£²´±²±µ±¸´©¯¬²§·¯·´ÄÆ·©¶¶¬°©§£¶ §±¡¤±§ ª©£¦¦¥¸¨£²µ¬¨²§®±µ¬¥ ¬¨©¸¢¤ §¤ v{lovt{~\Lfm\JNd\?b{GI8GgWf\L^bMXYWUWTi]OOH`]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANGf27'GbLV%-B.=ELQ<3rkICC¥¯¥®¯«¨¥±³´«·²¸¡«µ¹É¹Á»Â¸³±µÂÂÎÅÀÁ½´½¿¿º¾¼²Ã§©¹°¶¶¿¼®«²± §±¦¦¯¥²µ«±²¬©¨µ»¬µ³µ´ª¬¨¬©¹®²±ÈÀ¹¥º°©¬¬¥¨®±¦¥£¯¤©¯£££££ ¢«¦§¹¥¬µ·¥«¬©°¶®¢£©ª ¤´¡ ¦v}
|{|prq}|}\Sdo^NYg\FD[G;NmXb[L`bNVWVWTXg]QRLcY[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/+1()+,-*&5*/&0)38:1&*3Bc:6*HeHJ+:H>3BHS,>k;GHª«¢ª±¤©¥³µ²µ¶²²¡«®½ÌºÀºÇ±´´ÁÃÑÅÆ¾À²¾À»¾·»Ä¦¬·¬²·¼À¯«±¬£§©¨¤°£ª²ª°¬°¯°®«³¼§·±²©³ª«¥¥£ºª²Ãº¶»©©§¬©§±¥ª¤£®ª¨¢£¥¬¢§©¢¦¤¬¸²²¢ª¢ ¬¯±¬ §§©£ ¦
¤~
|v~
rqpuk_Z`nbQsq\K;|F?XuX`ZNd[NVVUWQ\a^SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1;\J0.JgDF8;B05EKX1@Y=LE¨¢«³ªª°·¸¶¯«¦««½É¼°½¶Â¯±«³ÃÃÎÏþ¿´ÀÂú¿³Çê®·²¸¾¾²ª¤§ª°¨§¨±¥´®«±¯²±´¬´¼¤¸³¬¯¨«£°·«ª»·¥·¶¤©§««ª¡©§¦±²¤§¥¡¡¬ª¡ ¦¥¢«¤£§±¸®®¤¦£ª«®©¢¥¤¤¢¢}zs|ru¤xk_`nfWecN?gLEbyWbXReTMVUVTO\]aUKNhVVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06VZ.0JgAA<<B+:JO^4D=GFD°¦£«±«ª¶¬¶²¬¦¬ª©¼ÀÀ·¸²»µ¥²¯ÃÉËÑ¿À»¹¿¾Á¹Á¹ÀĬ±µ±³ºÀ¾²±®¬ª«¨¶©¦®¯ª¹°¨²²¯³·ª··§´·«¬¥©ª£³³©¨¤´µ ·® ª¨ª¨«§ «¬©¹µªª©©¢ª ª¡ ¥¢¦£ª§´¯©§«££¥§§ª¢¤£ ~
¢txt~yv}orgfpw\askO^VHnyUdVQcOMVTUPOX[bUHOiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Ji5OD<±¢¦«¯¬¦°´µ°¬¦°ª¨º¾»À°¹®¡¶¯ÈÇÈÑÀ¾½»»Á½ºÂÀ¾¿®²²²µ¼»Â±±³ª³©¤´¨¥³³¹°£®¸²°²»«º°ª®¶¬ªª¬£ ¶©¡°³¢µª¨§©£ª¡¢¬¨½¯¬®¢¨¨ ¬°¡¢ §§¨ª±ª£ ®¢¡£££§¨¥}£wt|uxyysrxf¤vi_djtg}SXo^JxsSdSQ^MMRZfNLVYdXGRhRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[*HM9U@4³¡¥§¤§¤§µ³²«¥±§ª¸¾À»¯§¹ª¦¯±ÉÇÈÑü¿¾¸½¾¼ÈºÁ¸°¯´±º»¸À²²º¬¸¬¢´§§¬²·º³¨¨½¶®¶¾°½§®¬µ¬©¯£ ¥«¨«³¥´¨ª§©£¨£©¨©½¬´°®ª¤ ®³£¤¥¥¥©«¦«¢¢¥¨©
~
~}
¡~r{z~|hx|ytoo{fxdagarzmgx]^T?W{mTbPQXKLNru]HZ[gYEUePD>JODCA9HGKS?jbJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GjI14X=fbAJ7GS`U*=9DW=*² ª¦¥¡¬¥¸³³¦©±¦¬¸Á½µ¯¢¸¨¨°ÂÉÉÌÁ¶½À´·¿ºÈµÂµ³²µ²½¸¹½µ¹µ¾ ³§««°¶¸µ¬¾½ª³Á´¼¡¯³µª¬°£¦©ª¤¥±§° «©§¡©¤¨¡¼¨®±®¡«£¤®¦¡£¤«£¥¥ £¥¬{{}£}yk~vyxc|zpooqvgsiheg_lslaio`o=ZykU^NPQJIMTZWM]^lWDW_O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>)49&'.34.0+/4&,:$41AhY14S=e_DL6KVdO*;1NW=#¡¨¥¤ ¨¤¸°¯¤¯°©«¸Á¹²¹¯«¨´ºÈËÈ¿¶Â¾¯´½·Ä¶Ã²®¹²³À´º½·¨¹¸½ª£´¨©ª±¯¹±«¼½¥°Áµ¶¢¯¶µ§¦§°³¤¦¨¢¥¬¨© ª®¦ ¦£¨ ±¹£±¯¡¬¡¬¤§¦©¤ª§¡ª¡©|~}| x
|
|sp}qtt`zxhmoomh}qb{mieb]e
~_ZsjqJIiXZMPLJHPRQIO\_nSDXZRhOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-B*,4;NN@;73-.+-7**<%53<fd24M?e]FO=QZgH*>/WU5(§¡¡¡¥¢¸«²¥´´©¨¹Äµ²·®°´ÆÈÀ¶¾Á¹°´¼¶¾»¾¯«½°´¿°¼Ã¹¨»º·§§µ¨¨«±´±¨¿¸¦¼·²±·°¨¥§¯±¡¤ ¥¥ °§¡£¨¯¡¡¤¤¢·°¡¦±«¬£¯ª¤©¥§«¦¢¨¢z~zx
~yzprwoot_ywdkkjgglerkkdhXas^ZluiYE}][XOOKHHRUG2:^^lPDWUYeMHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84HBf[HTCT]hE.;1^Q,2¤£ª¦¡£¡¸ª°¡»¸¥¬½Ä²¯®¢µ¯¯´ÄĽ³¾º·°³¹¸º¸º®¿³´¹®¿Á·«½º´¥¢³«¨ª³¬®²¤Ã·¦©··«²¼ª§¦¨¯«£§¥¦¡³¦¥©©¡¥¤¹©¤§¦¥¡¨©¡¡¡¡¡£¬££§¤y|
}x
{w|lurmlsbythfifcmfghdfhi^ebifZezb`PsT[[SKIGIOS@!+i^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB377aL'2¤¥¦§¤¶¨ªº·§¬ÃÀ¶¯¬¢µ®§®¯·ÁÀ½±Á·°®²¶µ¹¸µ¬ª¼´¯²±½À·®¼¼±¤¶¬¦¦µª«¯¡ Ŭª§±µ¬¬µº¨©«±¥ª§¥¥®£¤ª¡¡ §¶¦¯©®¡¡¡ ¦¢ ¦®£§ x
w{~
{
s}gypkklguskagcbsacefeiibeoY^X\lcaLgW[`VIGHKMRX>9`liGBUS\[IHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=+*,/A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3@bF%5¤¡®¡ ¥´²£²¾·¡±Æ»¹°°£¶¬«®©¹¾½»À²¯¯®¶®³¹²§«¹±¯®³¶»¶¯¹¾¬¦µ« ¡²¥«°¦Å¡³¦°³°·®µ®¬®¢§ª¥§¦ ¥£©°¦¸§®¢¡£¥¡©©§§{t
|
ogynhkjgqrk[hcar`dgjnkeiecl\lluqaSbhceZIGLMOYQPUaeT@VRZTFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.4<;K6/.+,-24:5#3*)6.55465Z|]1:Kj[M[KXdc@A1HbB'4£±¡©³°¹À¶ ´Â»½¹±¦¶°©®¥¸º¸¸¬»°««·ªµ¹¤²µ±¯©±¶¶±³¶»§© ¶©ª£ª®¬Ä¯¦°±·¶¬±¯ª¢¤¬©§¤ª£¥ £«ª¨¹§¤ ¡k£q¥v¬©¢x
mi~wql}o]d`gkuxfhvifX]itnNPjcfqf]dfnkh][]
hOKC8ETg^JHPPUVKHRapteF[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl15Ok[N[K[fb>G1Na<+/¤²¡ª®«£½Å¯©·Â¸¾¼§¶±¦«¤¸´³³°¹®ª§¬´¥±µ¢§¸¶µ¨§¶³®´®´¢©´«£¥§¨°¿¨§±´¹®¤¨ª«¦¡¡¨§¡¥¦§¨ ¨ª£³¯£¢££¡¡¢¥¨rx uif~sx o~|¡ {tvlmhdd{mrbTmcmiqXipnW]hZkjZplyrhY^FM>F^MERVVQPRWTg^LZLRRPEFG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I:/01.*/(-4583%&2115>1<8Xt15Rk[N[L[g_=K1T^7/(§¬«ª¨ª¿Ã¯²º¼·Á¿ª¤·±ª¬¦´µ®¯³¶«©¥±¥¶³¬µ¶´¦§¨³±²¨®«¡³© ¤¥¢¥±¸¦§§·¾¦¬§©ª«§¦¢ ¡¨£§£¥¥ª£¤¦¦¡¶¤£ ¤®ª£±¥®¡zÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«±yhlX±®oei¼¼nhzmqØ}Rkb¶²}pu¡ªVNXaOVNFU\XPPS[W[P@\DPNCFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww11Tk\O[M]g\>L1Z[41!§¨ª¥²©±Â½²µÀµ¸¿Â«¦´©¨°µª°¶´¨¨¦µ¥¨¹®²²¶ª¥¤§²¯®±¦«§¤²¤¢¡ ¢ ²¯¤¡µº£ª¨¡¤¢£© © ¨¨§¢§£¡°££
¯kjªh
fq©q®¡¤~wº|k v±_j´[¥e`fzfixj©e¾rg¦v±j|±xucmm§n\ EigEu`}f{£¦X_«h}xzj¨8J¯[XTmcZKOX_\VV;NPWV/ISSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3/.53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5^X31¢§¦£¤«²¸´½¾°·Å²¸»Ã§©°¬°©ª±¯¤±º°¥¥¯³£ª¹©²²°£¥¡ª°¬¯¦¨£¢±£°©¢ µ³¡«¡¬ £©¥ ¡¨¤£¡ ¬¥¦ ¡µµy©¶w³·¬k¦z
w«gj±[¬{tpx
°vwqkkm|O¥XHcc~ch¥_yquR]P©ncp{
a/R¢n[Tkg`LK\dX\ZB>°wWXA#MiFBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFBAAD<FD;0201;F,0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_fW7J9aT50 ³¦¦¡®©¨³¬ª»¶Â°¼Ã¹·Â«¯¯§¯³ª¢¯¼«¢¨¶¤¬µ¤¥²³¨£¢§ª³©°¨¦ ° °¤¤¨µ¯¡¨©§ª ¦©£ £¥¤£«¥¢ Õ¹q±ÂÆ}Ö»}¨¤{¢¥y«yV¯{~j¹Z¹w
}¦|zªy{±mt»oP¯§ÅQ zc`ªbsrk^Rµ´È
~|c¤3Bv]QjhdP@XfYdaJGLjJZSOYfZCC?E?0<<59<74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[J[P_fT7H:aP72%£±¨©¥³ª¥´§¤¼·Á°ºÀ²·µ½´¶¨²±¤²³¦ ¯¶©¨º®¤°±¡²´±¡¤¨©±©´©¥¬£®¨®±©£¬¢§¡§¢¢¡¢¡¢£¨¡§¡¦¡²nhµr¬p§s´ut¶{¦£~£~°uÒÒu\®|
¤nª¦j
}}{±sy³et
nfRÉZÂ\yb__vsa]YÊoÀtMKµSUÆdVRjceXAOj_liPUFH9=WR[VYHB?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\ANT_eP5G=aM62.£¥¯¥©º¬¦µ¥§¶»¼²»¿¸·µ¼¼´¦µµ£²²£ ¬°¥§»®¥²±´¸ª ¥¡ª¥²¨¬ª¥©¤«¢§«±¦¡¬¥¡¥§ ¦§¢£ ®¡£¥£
¬|x¨w£©p®¨£¢}®³\r²S¯}£~q×}w~w¯w´ael[°WKuyf`^vwgj]¯wwl5yÈ®³`DUo^g`EPl_pmVUM.echRYP;AD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GB`I:77 ·±³Á¨²§ª²º¸´¹¾¹¸³·¾¶¦¹µ¡µ ©¬ ¨¶¬¨±²«´¤© ¨¢µ§¦ª¤¥¢¤¨§°¥ ©¢¢©¦¡¦©¤¡ ¢ §©~¦y¡ªp§¡¢£ªzyp±Z¨ xtØvt§¤|{²^d }n\«\[hgªcr{jq]«Z kndOJC¡\[Mt]bfMZa_rt_JU5JXHE=HFAM35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<OedA&Uf[?1T_bL7FH_C1=7¢¾³Á®«¨¦´°¸±µ¿¹º³²¹¼ª»¶¡²¥¦§§«²©°ª¶ª¯¡¢ ¦¤¤º££¬¡£ ¡¡©°°¦§¦¤¨¬¨©¨ ¤®£¡¡¡ ¡¬®nr´t©w¦t´zu´¦¤¤u¸n{¢kk¶Z¡eh ¢§mr´s³j
ju´af¢nk\`N¡|Rs£ly~no\¯V<weTon.[§ObRkeblYb\`p|cSYQ>?lo2BB@?M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U^aL5FM^81A8¥º£±¿®««§·©¸¯µÁµ½²±»¸«Â·ª¬¡§¤¢««¨¶£³¨®ª¡¨ ¥«¸£¥£¡«¶°¦¬©¦¥£«²¤ ¨¬°¡£¡ ¡©«Ô»u±ÄÄ~Ö¸y§y¢¶u}wv²aºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxmpm¤t½]w}[ay¼jZV[iy^i`dfbmyoX[YCA@q?CG+5H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,;:08LXaF'TcX</T^`K5<L[-6@9§¢¼£°Ã¯©ª¬±¨¹¯·Å±»³¯¼°®Á²¦£¤¢ª¥ª²¤µ§¤«§¸£®¡¦ ¤¯¹±«£§§¥¤ ¨«©¤²¢¥¦¡¡¤° ª
¶¸x¶wnlotoyrÀ»¼{²¨pt¹|{}¤»¹½uy³£tvut°ufi¶trqw¶^y}gylyb¬pt
~X[§iDdYTf_c]cQgfqmuBMOLD;ZL?J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿¦²Â³«ª¨¬«ª»¯±Æ¯µ´°¸§µ¹®«¤¢§ ¬¤®ª¦¶¨¨¡¤¬¥¾§¡ª¢¢¨¢²µ¶¬£¤¢¦¦«©¥¦¡©§§£©¡¬¢°©§¢kj©ytv{f{¾¿Àºoq
_rjZ^ack`cmvbke^`cqhr|fj~ptx~}b[xthP\n||jXlyrIJo
pNrMDV\f`LZWfc_OZmvjrRODEM<HI<L>2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5CFUEJOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR_I'S_V4)P^L(3>\O'?2>¨¨¡Á¤´¹¶£¬¦®§¨µ²¬È¬°´¶¤¾±³§¡¤ª£¬§®¤¥µª¤¢§©¾¨©¥ ¦©¨°²¾¬§§¢©¨¤¬££§¢ª¢®¦ ±¥¢¨¤¦¨¤hn}rw´ª
¡z¤
li{}urxyvv|jstudw}vkoyl_b[ogMXYfj_WYpzomfSOFR9PZNRO(+:KB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¢¿¢£°±· ©¦³§¥°µªÉ«²¦µ¦À¨´¡¥¦¥ «§£¤·¬ ª¦Á¬¤¢£¨¨¨²Ã¯«ª©«¡¡¢¥¯¦¡¤¨¬¥¡°¡¢§¡£¤ ¡®|©¨
{
£e¡³®w{~wyzogykuyrhsyujtbxe_hdcdfjXk{qjk\SLPD_UF@??,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@³ ¹¯¾ª±² ª¦²¢¬³°Å°«¤³¯¼¤´ ¨£¡¨¦©¦¤¦³µ°¦®¾¡¬¢¢©©«£´Ç³©¤ª§© ¥«ª®¨¥£«¡«¡¤°¤©¦ªf}ecylhjz£«je~h
eeihz¢kh¢wkj¢slnzyXe]
^lw\gswwoxxsmysvzhX]jsd]sik|qmc]QNWIdX@J3=F7?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]]_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[J.6ZO6)EY/DO1YB;?.=¤º½¹¯«³°«¥¨®°¦®®°½±ª¨¥®°° ¤¢§¬¬£¦¨©³®¤£°¦¶¹¥®£¢ ¦{¤«¢¨´Ã·¥¡§¯££¤ª¨¡ ª¯©ª£ª¦¥§ ¬¡¥±¤¬¢¦ ¬~½s´s
hw¹Ä¸q¡£z¦tª|ËÀÀºq£}À½ÁÁ|zÂÀ}j¥²ooÊzxwyyq{pw
xlube^wc_eb^thmdbXKVIQZHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^__a_^^^^___]\SMPGUNA@?=6468266*&%#)*&.+*)109*#>I[L*#CP/#F[3PY/UAB;/8¢¹Ã´¯¯¿©©£¯©°¯¦²¶¯ª¦§¦±« «£ ª§¢«¢¥¨¥¥´¤£¦®¸´§¯¢¦ ¡ ¦«¤«¿¿±¡©¯©¢£¤ª£ ¡¬®¨«¥£¡¤¤¥©¤©®ª«®£¦¢¤Îz{¥z_]¨¡¡|§u«¯^dª{¨
t³c« ³j¯t|¸aY£Ínv{Û{q~ve{vvl~m}
}k_pjof`_xd[qhjdf`RTSW^JOC5AHED8>5;@?A;=8@>??BDDFIJLNPROS\^__^]]_``__][WOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';[:L-!P@F4.1¬ÁÀ¿´´°·£ª©µ¬¦²¬¬¤¬¦°ª¡§¦¢¯¡¨§£¦¡°¬¦®±«¨¬ ¥¥¨££ª°¨¿Å³¨©±®¢¡ªª¡®¦©¨¥¥£¡ª¬³¥¢ªª¤§§¢²¢§¡¡r
v
¨q±|q¬} ¥x«~r¬v{|~ª¢}«zzVÄ{pÁ}mupmfweoawnrnlcmsuo`fmd_oijnfcWS\`ZRRC9II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1-+¯ÓÆÇ²³££¢¢¯·¯©±§¨ª¨®««§¢¤£¦« ¢¦ ¨¨£°¨§¯¨§©¤¢¡§£¯¬¢¬µ©¹Ì±¦®«¢®¬¡©±§¨¨ª§£¢ª¯±¢¨«®¦§«««³¤¤§
¤k¤uz©u{²q¥p ¤_aR«
®u®¨z{f£¤£}©®^{¨U¢z£|İÅs¯´³¹rb©¯Âuhkmkxxwnkfddqqf{ic\V_iXXTLLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ''!+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°´°°©£¨§ª««¨¤¦ ¥¦§¦¤¬¢¬¡£¯£ª¤µ°¯¡©§¤¢¨ ¦°¥¢¨±¬¶Ç±µ©¬©¢ ¥³¡§ªª¢«§ ¡©¢²¬¡ª³²¢«©°°¸¥¥©}ªmv«y|°n¤Ò¸´¸É²_a©¥ zyªÉt£¨©~ÆÆwe¡¥s}¯^oµc±uK£m§Gd{o|myt|zm[ejrqfi^aXcm\^YILLJEDBA=A<A?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4NTQ;<F2,$¨¤Àƹ©²®¥¢³¹¬«¡¦¨¦ª¬©¦ ¦¥«£¯¬¦¡©¥§µ £¨«¶³¬¦ ¦§£ ª§®¡£§©°³Á±²©¨¥¢¤¯¦¢¥¥©®¬¦¥«£¶¬¡±¹°°¨´´µ¦©¥¡Nwz£|¤¦¸||z¹ÌÆÃ¶w¢~v¤¤¨~¯
¬}a¥l£p
}r¬`¤sqa¼}RUu¡z|ryr~o[lnwrjnZc_hnbd]LLQSAHGFH::K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,- ©¬¤«¹«¯ ¢¬³µ¦¡¦¯®®¨§¥¥¤§¡³®¢©§³ ©¤£µ££¡©µ¹¤££¢²¦¥¡¢¯¤¨¢µ±Â°ªª§£¤¥¥£§¡¬£¤®¥»¬¢·¶®¶³º³µ©±£¦ ҵ÷z
¦x¢w¡
¥r«´nri¤}s®¥£¦mp²\¥szl{~n©a¢rr~bs²¸hw¤|u{xlhwixsnt\ddmmfh`JZWX<HF?S3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH#)%r®¿¿¼»µ¨¤®¶¢¢£ª§©ª¥¢¦¡ µ§¢©§±¤«£¤¤ª´´¤¥©¯ ¦£§µ ª£µªÂ¯©«©¢¢¡¦£¦£¥©§« ¤¬¦¼¬½°£±´»¶©«´¦ª|¨}|°x¤¥m²o¡|¢¨¬
¨ £
{~««w y¯]£|¦§d|tk®]¥lr
]`[ m¤wy~jl~b}tmy_gepohghBY_Z=JS2S8AAC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI8152.*,ATVVVTTUUUUTTUTSSVWWXVUVQHFIJ#((¼©ÆÃ·Á´ ®¹¦££¤ ¯®©£¹ ¢« ¯ª®¡ª©¥®±¬§ ¨¢¡¥¡¤¨¥¶¨¾®¤©£ ¦¥£¢§ªª¡¢¨¨¼¤Ã«£¢´¼°©£µ±ªw¯~
}ºd°e®}¡§
°§¤¢¢
\lk³`|{²lfn±Z}´[¤kÈ¢f{»YvµZ²}S¯z¬X¡m¦xw|cs|bwt|ajfpmfeeOUc\AT]=H(>9=4!!,$2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·¾»´Á³£¦¥·© ²±¨¢µ ³¨ª«°¬®¨¢¯¬©§£¨®©¡¤£¢¥¢¨±¨»®¤¨}¡ ¨§¬¤£¤¢¤©º Ƨ¦©¡¬¶·®°©¡¾°¯¯ª£¯¤¸Ãº
¨¬¯¨¦«~սªb¤¿½}£×º·µ½¾j£o«nz²±Çk«°½¬yx¢¾»t¤wyb|ydfx{`kekjbPb[Si\@T`BL)<:4/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´±Àº²½³¢®§¦³¦¥¿©¶¯§¡¿¦¦±±¹¨¯¥§¯¬®¦£¬¡¥ª £¦§ ¨¢ «¬©¸¬§£{¦¨¨§¨¦ ¢ªº©Å£¡°¤¬´¶¬²¬£¾«±±uvª¥·
epg¬nnw¥ v±qr©¤¯¤rlmmfxomqzipigqhi
gqd]cioZ]g~x¦`brpfd z
tdwgjx~ydlcflbKeWJkY:PdDP'J9+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´©ºº²´ª©¢®¤³ª½±ÃǼ´©¿«¬£ §« º£¤¬¦ª
¦ª¢¤£ ¥¦©£© ¥¥¦®¹ª¬{¦¦§¢¯¥¢«¹°Á¨¥´§±³¬¯®ª¼§±º¢©¦¶¢©ª´¤¢´¤¢¢£¢¥¢¬§¤~gtwtq§m}
phvowv|yiledodUaX@iZGb_MX+E=+&!640/ %2(*799469;>?ABDFJKKMPPQWUVY^_ac]^TQJEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¤µ·¯®¢°¥ ¡·±ªÄ¼Ã¹¶©¡¤¥°¨¤·§©µ§¨¬£§¤¡¨¤¨©¦ £§ ´¹§ª|¡¤§´£¦«·¨¯Â¯¤¸§°°²®«¬¶¼£²¿§¤¦µ¢¦©¢±¢¤³«²¦¢¥«¢«
fuwztj}
xqryq{~jnd_pi`\_YmbP`bOX9FFE=2<=8/*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤¨£°³¬®£©§ ¨µª£²¹ª«¡¢z¡°¤¦±¨¸¦£©¢¯¤¨ ¡®ª¨§¨¸µ£¥y¡§·¢®µ¢°°u¤¿¤³¡y{¢µ¾x¯¦¡ªd\bv¤~mµ¤©°¬¥f ¡tzpªl¤©e¥
xkvq|ai[vggry¡dx
vhnyjpe_vokkg\ecaamQY=MMNRF=@TB91/&4:306678<;>@ABFHBGGIKLTUUY]`hfgXQI<DG<9UR[`ab`^`_`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«ª¥©®¤§¥ª´®°¥©¥ªs¯ ¨«§¹ ¤~¬¤§¢
u®¥¨£¹³§ uw¥±µ´½¨¢~§£{¥±º¨±©¯¢y¬£©«©w¦{§{³{ bynqzqt
xht s{~ijx{qpgexnilj\diieqZ\GSLQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aaifYQH9DL<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah¤¦®®«¨ ©±§§ª¥Å¼¯ ¥§´¬§¢ ¾¡}¬£¡¡¨¢£¹±§
pu£«´´®Ê«¯·
°³±
©©|¨r{w¦h¤y´¡ ¨ªÂ«¡r¥}
³¡}¡|
nt{s}
uÅf©¢jogwt{vghupghk^bnlflWdF]QL2E46M`c7&3<EGD:63658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@IdX]cfhgbbbbcc__babcccdiicbbbecafcbbi£ °©©¨¦¬ ¥¹±ª«¦¢¤©¡£©µ¢¯ §¥½ y«¢
v £¢¸¬¥bm §~¡§ ® ±¤¬~¢vk«uM«xª©ª«~¡|{§jlg·~n`cX{dgs}yl\|n`Sq
\`mz`Ye~
q¨«k£nr¥pgdlZlzeY_~aWPoventqjjo]iolkhWfM]XE9A4GC^k4+ICQMN=84859;6@;;>BO>QRKMBJ[]_W^_cu`ME:MNMTb\[ffiibbdbddbab`bdcabjkdbddgdbgeach ¹¡ª¤¦¬¢¶½«¯¢ ¥««´¡§ §´u¦~
¬£¨¥¯¦¢in ¡¥£¡ w§£©¬°¥z~}¢ps{ymª}¢tw¦g~w¥^{}s¢n·´ºs¶¨dƸ|q¶q£ct¬«a~j³~n~q£ls¤s~£^³o{³tr[²ibptuqhoXjkrre[f\aLD=D5QAYp2<RG_JR=<395::6C<;@IP?TNNQ@E_^[YX``{dIC8LWUVcaZffkkbbeadc`ab`dc_`cknccddhdbgfchh£¹« ¥¸¶ ¡¢£¤¬±¬« ¡¤¬x
q¡}¨ ¢¨§¤~k{} w¢ r¡©¨ª®~z y£xs}¨£d¡~mho{§}rhtªsªg]
vhªj¸f\©pa_§vwhumj¦\¨~w»j}©Z]³g\nqxwki[piwxa^dVaBPEO7VBRm4JZZ^NZD@151;;7H?:CHU?YSX]>Db]V`Qac|iEB9N[]XdfXffnmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬»²°¬¥§¬°§ª£¢ £ir{z¤¨¡iy{~¡ ¡rh p©¡¥ª£ª~°¤¢¸v£³¢£xzª¢r¡}°µ}l¡x~µ££«¨||tªZ]o{xbM{{
dzBMY¢js|ovy±³~¦t~mq|ori£]vHec`sp}}ne_kgu{bc_P]V\TV@YEPfDRV\aX^ID=B8?A:HE8LEXAWRZVEFa\Z`K`m}qEC<U^bZejVghmobff^a`\]^`hb_edvl^egfldelhhki±®S_¡§´º³³©¢©§ «£ §¡w
ny}r¡r¨|l
q¡x{¢£®}µ{¦z©£ §hxn~s sq|
o|£§¤p^©hv£dp¦aÓ|{xrsc¢~¢r£vk³`tª²¨¼wn¿¦ª´^orps¢r^¤gt¦`h¦lÓznvykyvrl©¥g_dyqlhfcmuwf_aQZePQaHVIT_WS[dj[dPECKLJKAJD8P@PMXSXOSQ`eeiSdxywIFEc]eZhiSihjncjf`c_\]]_hbahe|d^dgdkdjlfhlh±¬T]Kª°²µ°³¢¦ ¢¤§©
{p}h|wpl|£©yvnw
y¡¢³¡¢¶z¬§¤®¥p©}¤¢q¢®¤¯£wµ¶¶É¢s`©my u¡w ~oMf£qs¥{zubm~ lrd`stk{j´¶´Æ¦s~zj«tlswiytqPD}³^jukxfkfbstpmU[RXgORgIULXRU\gknUgWMJAJMKGJNAQJPdcjmeuss~x{nuz{UQOm^h\kiRjhilgmgce_\\\_ibdhk{_]dgcjfnmeile¢°¨
e@¢²¬¯¯µ¡¢§¡¡£¤¦¦ykyeyuj
z¥¨z}yp
y~£¦gnxl¢d|r¥xph§}¥{¡rv¹m¢b}£nsk«ku no¦`iiu¢~`uobh¡fjupdgor¢[_[d¡n^q|trd¥nx¢df§hrm¡oRn ^d§T]TmmrkqmphkwsjoQVUUeYSlIXO\HXhhrjYkVPREV\MXSaUhj^wu{|p}|r{sww^QsagbpgPkhhklohdg_]]]`jbjivu]\chcjirlfkmc¥¦zetm§®¥©°±¦©£¡¡¡¡{qh|st}|e|¦¡ª
}si¥}
¨¥¦x~¥²¯¥y{©u§n¥¢¼m|¥¯¢~¦{r¨¡h~o¬cx¨mª£uw«¦k±lw³©loo b«ªw§w}
¤ hu«f¶sv¾£Y¦«aurto{upbj}ngmSTXT``\kL\R\I]lmv_[qX[_Zgsemoqcqt`wz~yryr~{{wbydcnsdRlggomrifia_^\ajbll{o\\bibmiwmglnb¦«¤ªª¨§£©¢¤¨
t
zo
}strn}{
¤¥¤unl¨ª¢ t~y¯¤qy{r¨r}}zx{}}w¡¢
{l\zyszqio~qtqe_xvsupzooo
_wixfªt}jo~u|umlfsx{wZjWyinwrqowxo]k
nigVY^V\djcU`U^Q_owykjwejjju|pqtsaoubs{xuyuy
~|nmdyn^Wnghukxjiid\`ZcielqunZ[bkdlkymhloaº©§¡¢§¤¤«¢ ª¦¨~r||~ztrp|}y~£{¦
wqª
¨ ª~¨¨xq|pªq~qjo|hn] srulvtYro~j]id{
`ix{|vizlbqsw_s¨gnwowmdecyzZ[ifmv[{ywtnsrf\mkkbYX\YXjqZ^`Y^]er}ztotcjji{|rzvtdmthl{uz}{yyp{}s~zrhT\rilvpugkgd]aYjhkjqrmW[emlgryohjm`«±¡£¡¨¢¡}«¡¤{
|r|v
ros~z¥wz¬¡ª¡¢££«¢¨§¡~z©±¥±¦¡l}wwf}
w|zu¤ wqux§z
uj|yiqh`sp}{wvowt]^ogn_^YZ\SgpUc[[alhs{{rnpcjih{mx~phpplf{rw}{m|zy|}zxNdvjsnq{dkebb`[sfpfrqlU]ltmhxzpgikeº£¡¤ z~©
|x{mxr~mk~z~|©r|{©
¦¢¦¡¦x}§|}© © qyruav
ozvu¤u~~ss|
{y
¨
tymj|{mhklf^yh||vtvtzw\`p}nt`cZ[^QflSdZ]ajhuy~pllcjjgkrkktnwnynv}
wr~|{|{`i{kuhjdjc`i\cugobumkTbqyeoyzrejmm¸¡¤zw¤¤xy
{l{xr
}|kh}|~
|¦p ¡
|§w£ ¡£¢¤{
¡~|¤ ¥vuqwa~s}q~
jyrzs}}rz||{¦|
t
xdpz~xypkjf^}sh|uus|rj^`tvpwdcX]^RjhTeX^`givxqfkclgejm}gmpj}w
zkr~uv|z}jrntibhlb_qVtolm`xhlWjsvctzzqbkoy³¥¦ {u£¡wz
~~p~ztu
~wgc}x}y}o
¥¦u¡¡y¥{
ys¢ ¡}xr~n{d|qk
gwp}~y}~|ryz
£wuzs^vw|s}vfkc`~jkvssu}p{ccasnurmaY_]ZkdRbW_`hktyqbjclfh|khthloh|yl
qt|~z~|muttmfljbcuVipm`yglajvqex{yp_ql
¯§©
|v¨yx{}|{xsxys}d^}
t}~~£ ~r{¦ t§um|o¢|{qzkvm|n
xo~~ftj}
u
zwy~}¥y
t|qs~
k`ytyp|nanbd{bnovsxwrsav`oluno\Z^]]j]O\Wbahmszk_iejchwmflhilg|zwns}tz}z}|ryxxmlkh_irbhqofvgmlazhj|{wpawm«¡¤©|v¬|v~{|{vwotszo
}~|a\~rzz¤}|£
n¢¡pg{
p¡~|tsukqov}uort|}ernz~
uu{p}
ª{}~w}nm~afwstnza^o`jt^ojzyylrpey]mlsmsXZ]_ajZOWWdcfqqe]ihgbgqnchheigzwuo
s|u
x
|xzw{zryjk_phtkqomqgoke{bnzwpkww££¨¡§t¨ s|v
xxrs{
kroymvnq[Y~vu w~
m¡l¥
gx~}}pvplnoq|jsqxuzgtpw}
{{xur|{
¥|wwwli~[qrqoovY^o`oj^oj|zqnmjmw`pokqmYX`aamWPSYefbuob]kmdcekm`ff_gjurrotyvy
~wv
{{vjqb|b
|oplujhnlwx_q~y{sus~¥§
~t
zrxtpr
squlnltlv}mnUQ«xvry wz¤
}r
jh¢
qw{{|}lwjoklm{bz~wzx}zhumv|r{qx{{}}x|vogjw]vnmkprU]naqa_lnyphpfgsuhqlawe]Ue``qSPN[ed]xo{^\hqbbeei_he[go}okqs}v}
uvy{xs
~|yxgqj`~ook{`imtt_t|xwss
|y¡±¦~wtvspo
spqojiumn}|musRNᐙ|ptuv{r
¡
}x{zxin¥cpz|z}m|espkm{z\z{~{ziukt~mp~
{}wxxrken}jgsnghslS]odpZ_lrwflkbgxsppd_w`aUk_^tOMK_fc\xpt\[ev`addc`fbXissmkqv|tyvw~szq|~vesn|enpkZknyzr`vz{vrvvz¯
x~{
uwpypnomn~rcdwp|nz|jhlb¤ÁÜ®ï¢sluu¡np
£
~{vx
vxp¦^l|~v~~l}dxujoztX{zzftjmwo{utxtrpesw`rloahtfR`pgkU_ntyarc`i~qrn[cracVnZ\wLLKcfa]vsm[\dx^`df_cc^Xirknkrw}swxx|q|}{t
shuqyl{ntpWpyvyqdvyhvq¨£
}qxx||swpsjokil|t^`wv{ptzg`e|ëÚµÉÃÜsltvip
|zwxrvr¤
a
h}}
rrwhvritxmZ}}vbum~omz
}orz
tkoipv]qgn\it_QdqhfS_pvt`p`]hqsjWgiciWmW[tLJKef^ars
i[\ey^^dgz`d_]Yknenjtw~sr{vzs
|vv
{vlwvyyunwz}Xy
qngxvdv
q¡¡soqv|{yqtnodr~hflvv[_x{zqqiagaÕ¶¦xnqw{qj
zh{{~
zu{|qvx
¡¡af}~~m}ulmwutwvlc
|
p`tr}}zr
g{
|
opy~tlmiiwzagjiXktYRhribPbrxlbe^Zjntb\g_em_oTZnMGNfd\fnrkZ[cs_\ckvde]]Zllbmjsvqo|}txx
|ux{voxy{om{v^tlhzssgs|ruu~mu}|v~vqoljat|gbisyZ`w{ymq~edhhW_rs¼Ävq}qrj{{|{uvw~ru
rw~f~
q}f~|y}i~vgpyxswtlky
l_sy{~|sjz
y
~~nm{}vtnfe{tb[pbWnqSSmrhaNftxf`^]YoosZeb]jn`pOYjQDSf`Zjnm|nY[]mcZbpvcf\]`kicljsvpm~|tuz|
v~xtryy~oo{qixz~ml{ukjxtk n}uiw~yoztqkid`szh`epyZ`r|ygqyaee±²wKbZ¥ÙÐq{w}
nk
zy{wwpqu~{jy
¥px{q{}mwhxr|e~vdqsiyqou}wy
zk\rs~{sor
s
{
yno~vzdfh{o^XvZXpkNWqrf`Klwta^\[Zu~spXg]fjr`oNWgR?Xf^Zokgzq[ZXkeYcpy^g\^elgekiqwol~uo{vqq{|zyujy~ko~t|or{zon~xg¡
fogy}~|ixskkf_aoym_box\dkyaqv_eeÔê½2:>qx
u~~mku|
|wnvwo
lu{ufy§~nvy
|{w~jrh~xn|}wbz
rdri~nuru
tv~so\nuy|~y{rm
szunkvut[ggunWV{RYodLZrre[Ipxo\[[Y]t~thYb[gfodjMWfQ=]e\]ue`upZYTncYdpxYh]_gmgikipw}miyn|}zupnw~{{hz}js{r
zsv}~yx}|kl}kh~z}~~}kvrghb[bgso_aks`hpybst^cd n\5Z¯µti|u
svoltyx|y~rgv~~oqivynfy¤~ow
|pz}{h~lj{zj{wr`w~rdrgvnu{}owz|umYpwuxv{ytos~|onimtm\fdrpPZzM[n[O[rodUKsxiWYYZapt`]]agdiifNYhM@`c[`ua]ulXWStaZdnqVj^bhjgmlhpw|lh}}p~~{zwq|oqw{j}{mwxvv|x~}zm
£{uxklx}z~psqcf^Yf_oo_`gpfjntato[adjv{¿¦¤È¸qr{w
srro{tttwyypcwzirvgwucj|~su{
z{kxy~tgzhkytizw}h`x}kkth|jv{~q|v|tbVx~st
}qxyqq
z~wwjqilqo\faqmIduK]lTSYrnbQOtxaRXX]aps[a\ieedkdP[pIDc`[cp^]whUWVv][emgUk^aigennhpvzmiy}r{~y|v}pwrmw~p{wxztx~yuo~}
zw
{gt
y~{vgpn_d\XeYmra``plkhnatiY_dnw©Ú©Ç²qwotz
ytst}woqm
t
xtk`zyfrpgun[m}x~y|nxv{ltv~lgvdm{vmjww|abxziuuc~|gu|uwq{}nZWupv
zmtzlv
|~z}t~thtenlsYh^sdGmmKZ`WVUwmbPRtvXPVX^aqo\`cmed^ocT\rGBf_]fg][{bQV\t[[gkaUj_`nefkqhpvxtkuvx~w{t}ortqu~
{wx{|
w|}~{~ruy yutx^}
xs
w{bnm\b[[aVisc`[gnpfqaqfW]ck|Êι¡jmmlqq{~zyxsxut{jlvcuvof_}zerkjqcXmz
sx}os
t|y}ppo|fhqbmxqjlqx}}z]ezxjvxfwgu}rjo~yo}]Ysnu|opqwixx~s|u}{sgsankqWi]v[GmjLVU]SU{kaOTurPQTW^bt
i]`ljfcZoaXbpHAg\`e^\V{^NUepY[jh]Wh`^rejhrhpswxntzx~yur
pp{xwvyz|t}}~~~}|xuxx|muxd
so
ztdnjY_[\]Tgrd`YdqrgrbkeW[`jx¾®{·nas
hszqxz}~wwrvo{vejoausjb^~xyfqhkkZVow£
qrzwou
}xtqnhx_jl`mvjgjlywzvZg}|yfs~m
teupgk{unub]q}lu}|gv~nqivyt~m{|{yqflbn}lmVi_vUJijNQNgLX{haNUukLQTU_fuf^`qhgbWj]\khJDjYadVYUyYMVmjY]kd\Yec^temdqgrpuxqv~w|
}usnsy{zss
x}u~|{~{v{wwziv|{lrp
pglgX][\[Sdpd^WbrujuoeecW\[hporsddy}isusrwxvrunkzqagkgsmf]_}p{imxgjdUWro¦|{vt}t~|o~}x}}upqlgt\lg^ltdgeizo{rYhwuhpxvbw|okm{qgtfanzgsx|bwwjlru|r{{thywodfbm
{ljUhaoRJhjOKNoG]zfaMUtdJOSWajv~f]gsif`VdWbp\LKjWcaUTUsVLXudY^k`\Zce_vgmbpitor~ttwxz}u
nrt|zuq
zus|
}}z}v{£¥y
kt{zuznsy}vojieV][ZZSbnd[Xas{jhmi`bX_Ziikogl`hyxjrssmz|utmzhjyj_enhvgeXbwj~{ojpgf]TXog§wz|yvqqux{zv
vjruggn[lc]mr_gajxh{l[nstjp~zxaw
y
trpzsdri]qxert|yctqgjyusmyxvye|ywqddcm{|jjTgaeSJkgOGQjE`wfaMSr]JMTZekw|f^mqid]VaUnnVJSgWf^XMUlTJ[x^[^k]]Zce`yhlaoovnpwuz~wyzyz~qttyvt
}|kr{
~}~{v«zkryu~tnn|sjpnddX_ZYZTbjg[Z_ui^ml\aW\\kert}ii\kvugsvql{}|xurlygixf]dshzwccTeph
xxgijaWVYgc§o~w{qri{q|}xs
~ndurdgg\ja\oo\g_mtezh]torkq|~uvbu{ysuvbqn[rtcqs
|uesmam{pkj|zvsgv{zvqebdmr}ikSg]\TKqbPFU`GbvfaKSoXJMXXgku{eenqfdZW^XweTJ\bWhXYHWePHawZ]_lZ^\ac^~ij`otxmpnvzr|}uux|tuuyzz}~isz~~
zz|sq{{}eqys|zurol{~lzcpobe]eVYYWcfk_]]s
hXqn[^XZ\l{bpwulaYlssgtuolx~xvmntdite[gufvvz_]Rffkt~bdj\TW]bc¥hxtynq|jzo}}vty|xhdvl`f_^i^\skYe]oobze\w|knnpxytues|wpstcxe\qqbqr}tgre_nwjehz}uopvt}trb_fmn|dhSgWXSMv_PJYWHbtcaITmSJMZWilq|cmlscbZZ[aw\SKc]XiSWGY`MGitX^`l[[_bb\ihanxymojvym~vtttrvvx}}~~~pw|yxz~ttp¡zzwctxswtktn~kx|ps^pn`gblTZZWhcmf[\qeSrn[ZXW`lvciuji^Ymspksssi|~~{vnnldiqc[jrdtvs[WSearr]bc]SZ`\ceqq
ull{opr|~}sxszzzdeug]bY`gZ^vhWb]phawa[|vijroxtsuiq
wtkq~ogxX]lncrtztgp~\`prb`krmnvsrxkqa\ellz`fReSVQOu[QOXQHcsa`GVjPIPZUkkk|enoqb[ZXYlqWRPfVVhSTFZ\NHqtX_clbX``a]jcdmzxlpiuy{k}|y|mrovz|t|tx
utquo¡szzdvnmznfxpzksvsk^unagekR][UgalkZ\qdOon]VXUgishbted\Xmtloutxj|{vscdkna\nmcsxkZTVcdx}}q]d_cTZ_Ybcnp
tki|pguxu}m{uvpzv_frc[]VacXateU_`mdaq]]~phitqtquwkm
|rsgp~rtpT\gkfruwtcmvVcrl[_pg~fnx~ttsknaZdijw^eScTUPSlVPVRPGdr_aFXiNIXTVmhd|ikxkbW]U[tdSRWhQXfTSHZZPMwvZ_ekiYa`^^nbfkyunoivvl}{~krgt{u}r|
{ss}vn¤rvwly`d{pfysxlmqwgd|mcfghS_^Ug_ln[^nhNim`TVSogskexdd\Xoslqzwrl{vzykaelm^`ojepx~gZVX`lx|{p_c_gVX_Wcbkp}xllzn]xsn|kvtop|sXjn^X\UabWdpcS^biablZa~lfltvomwwli{nrfr~ntnd[aiiptts^imSeqeVcod|dsx}wlpmk`Yafgt\dU`URNWdRO[NOHdo\bGYiMJ_KXmd`xin~d`U_T]u\SR`fN]aUSJ\YPYtu]_ekhXba[^qcgjxqsnhvtzrz~|ynulst
y}|
sstxro~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDARÌÚØØØØÝm=DDDDCXhggggfo
}}{{z}~||~}}}~}}~~~~~
-h
S7¤¤¤¤¤¤£r]____aR455552FØêççççíg.55554Ma____^j|}z{z|}{|~}}}~}}~~~~
|yzz{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvutvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfgggihgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwz{|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;89:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqususqsxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<979::988::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;<<>?=<=;:<===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuy{{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@=<=;>=:::<:8988:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@???@=?@><>@?===?>=>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABECDA?@@@?=@><=??@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>;><?=<:>=?BBE@?@Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEFFFJNNKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|{{|~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@DED?<ACDB?>A?ADEDCWu~XGIJLLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnopqrvvy{{{z}}~~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJHIGHHIGFBDFDDCAUtWILMLMMLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKJKMJKHHFFGFEPl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD???DFHDEGIKIIGHIGIIIJIHFJJJJIJIJJJFILLJJKKfopsstvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKKMLKMLIFJVl
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHGIIKLONNQNQ^r
fBB=88::9878896479;<:8567789787689;;<>A;999==>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56;<C@BFHKHLKMTg{T;8656766645763468:876565677778:7778:;7689989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:<DBDFEJbx
H676468874578467799766765::;::<89899877:::8878589;A=>>BA?AKLOQPQOOPQWkrrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897:A9<D?]z>:88;<=>9:;<89;9:;:99;:9===?;;;=:><:<;<;<;9:<8::;:999<?<=ABDIJLKJKLWortutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989999:>=??Dw
l<;>BCEEBAAB>@CA@?=>>@?>?@?@==?B?AA?A?=@A@??A<><;:;:9;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::;<:::<;=>@?=a
^>DGIKJJFGGDFHGEC@@CECB@BCB?@DHECEDEEAFEFDFFD@B>=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:=:<:==>>;><?>B?J~
WGLLMKNIIKHIJJIECDFGFDCEFDBHIKGHGFGGEKJLIKKJCFCCDBAACBDCCDDCA=<>@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97;>;<:=?>?<?>BAD>h
PMPMKNKJLIIJHKFDGHHIEEHFFELLMIJGGHIJNMOMLNKHGGGEECFFFFDEHHFCA?@Lmptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<:;<:=?<==?@CBHS~
qMQOMLLLLJHHFJIDJHGKJHJGGGKLNLLHHIJMPNONMOKIGIJHIDIHHFFGGIGCBACUoquvxz{xxzz||}~~~~}~}~~~~~TDAABGHB?8?@8:;7<=:<?<<=?BCCLm
^RRPMNMKJGFCHJGLJGKOLKJJMMLOPNHIKLOQQPQOOJIJJLJLFGHGFGIFEEB@BB\prwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<8?==>@ED=BDCFJu|WVRRTROLKJEFFKONOWVQPOQSRNSTOMSLPSUWRSRPLJMMMKNGGJFFIJDDEEBDCcquyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?=<A?AADTKBHIFIKx
gVVkaERQQPJ;;QSR`u]UVTVYYSYXRZfPUWZ]RTWQPNRPPPQKKKGHJHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??A@EACFDCDKVPJOONPPy
}al[dU:XXXSP?@VUY\d`VYbr^]W]ZVEQY[\Y_TYgRUVXTTVSOOMKLJIILMKOMSotvxyxwyyz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HLIMPKIJOSQPTVUVTu
g;~znpXZ[ZRSRWVTZZuYU}a\X]^WIV^^[[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxyxz{{|}}}~}~}}}~~xy}YNKJIIFBD@A:OQQWXPPPQRSRVWWWWl
n~fYY\YSVTWRQWVcQerXZW_hP`fZZX\hbGOZig\[\]]WRNSPPQVVVVYZosuwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZZRSQOQRQURUSV^ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^TQQPINOWVX[Zdqtvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kqy^[VUSROKFCDAM^lVRSOOQOQVQSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRURMOYQMNQSUUMQSRPOMLHCIGRSTZ]mrvvuttw{zz{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt`d]^[YUQLILIaltPQSMQRPS[RSRQRUUbs{|~}{{
u_]KC>BBCCA?DPCD@C>BHGV@INMG]iQHFOFDEFHGHBCHGHKGDBAC@NPMRdtuvustvy|z{{{|}}|{~}}}~~||}}vt{mh|gnqfheeb\XSQPURsWe[OONLQRPUYSUQQTROV`klsvz{xyurnstsyx~~kLG>>::>@?>>>jPJaEFHIEB?HMMGMQUJBE?><=<==?=?ACC@?<=B>IMFUouuvstvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJOPNKLQRQTUUWQQWVPX[b]agmmlokh`nrimlqu{z}{xz||xwxdB@@A<:BCAACA[\N{NOONKLMOOPLKLWNHGAA<977599=;;;8989?;AG>\tuuwuvwy|||}||||~}|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OO^\ZIGOQQOMPQNQRSVXSRYTNYZ[WY\_^_e`]^qwk^`gkwooljonnlfbYGFFHBAFHEEFCLQOaWRXQPSSRU[OOQWPMJDF>:96587979:365795<B=ftuwxwyy{}}||{|}}~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKSTSPQUOLRSTWXSTXQLXYYVXXVXY]WXXhsk]V`tkaa_]d`_^YUPMOMLIGJKIHFCPOSZWTTNQSYS\eUOSTQNKIHC?A9988978847578599Gnruyyz{{}}}}|{}|}~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVWXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNMMLJFPPUYSTOJNOUST\VRUSSOMLIHHF?>=:787659967565Wqqtxzz{|}}}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXXYYYRUOIGOPOOMRJOPOONNOTLMIPPSTU2<XMIAQ=c`QSQPNPPONNMPNTRPRLILKORPQRSTQSOLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWUQSFFAFGGHFJDHJHGEHLHKIGLMPMG/E_R=3@>joaRRQ@GTQOPPQNQOPOLJLLOPNMPQQNPOJLMMKGEECB;==<9=G6676Dnquwz|{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVVYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORB8DMS]gSQSAGUPOQQPMMNLJLKLNOOQLNNMIMLIKKLKGFFED<AA>;@E;<89Trsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A>==A@B=>EHFDFFIGJJ@FAA@EGDIOHQRa\QPROSNOOLLOMKMLMON[VKMQOHJHCIJLLKFFFE?BC>=BG?B?@druw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;>A@@>ADIECHGIGIEBB?><BA@GIDMObePMOMWKLNKKMMLLKNNSdMJLRIIIEBIJLMNJGIFBBB@?EFEHDLopvzyy{{z|zwtxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLLIMPMPOHKE?B=999:?B?<ABAADDGKFDIIGGHCC?B>??@>CEDLMQTLJIMTFIIJLIJKIJLMOPRPKGCKGCCKJLNONIJIGCCCDIJMLIZsnxyxz{{y|vrpurtyyvxjqnjllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHJCFGHGJKIJLDGB<>=:::;AB?=BBCCHEJLJEIIFGHCC;A@B>@?BEDIMOGHJGHKDHIKMHJLHIJLJM]RHIDNGBELKNNQNLMJKFGGJMNRNMcnjwvw{y{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthepFJCFEFDEEFEGCC@=<=:;:;ADA?BCEEIFJJLFIIGFFDB:ACC>?CCCDGKMHJNHDHDILNMHILGFFIILNKIHEOICGNMPNPNOOMKIHIOSQRNSggfrosxv{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhmf_pGJCEEDBBAE@DB>?>;;;=;=?DB?ACFGJFJILHGGGFEC?=DEB>ACBCEGHIGMPIFFFKNOKFHIFECDIIHKIGHPKDJMMQNONOPNJJIMRUURPXeaamfproryzgehhcilfqlflmgiklsmpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEDFBA@AD<BA>A=::=?;>?AB?@BEGJFJGIGFFFEDCAAEFCBBBDEEGGHFLPLIOJJLKIFHEFECCHHHKJGKRMCOONQOOONOOKKKPUWVVTY`_]i`mjnhrsbeffdhhfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsprkksMGGEGAA@CD<AA@C<8:=>:?=@B@@@DFHEHFFHFEEDCDBDIFCGEAEGEFFGEJMKHQMJKHHIEFHHECIIJKMKPSNDRSQQRNOMOPMLNSWVWYVX^Z]d`hcjigk_defchggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHAABEE<@CBD<7:=>;>;AB>??CEFDFDDGECECDFFFJEEIGBGHFGFECFJJGMKLKHJKFIHJHEKKLLNORTOHTUTQTPQMNQNMQWZVZYWZ^ZXa```^hec`deggjhhjghnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGIDACGE<@EBD<8:>>><<BC=@>ABFCECCGDCDEFGGGIFGKHCIHGIGFDHKIGKHMKJKLHKJMKINLNNORUVOLVVTQTRRLOQPOTYZY\ZZ\__]`c^\bdlc`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIKHJFBDGE=AGDD@9<>@?>?CB<@>AAFCEDCHDFDFFHHFHGIKJEJHHJHFFLHHHJGLLLLLIMJMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[]^``a`be^d`fh`ehjdssfjhglprqossnswwpuvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwpwIJLIKGBEDE<AFDDB;??A@@ADA@B>ACHBEDFGEIEFEIHFIHJLHHJJIKJFJKHIJJGKKMLJILKMNNOLOPRUWVMNTVUSRQPMNTSRW[^^_]^``aab`cdebdicdijgvlkigmosqpqpprywruutsmmssmqrotuuspswtuuwvuuteqskpqjrvpwJLKKLGCCAE<?EEEC=AACBBCEACDAAEGCGGHFEIFCGJGGJEILHIJMKMLGKIHKKNQKRQLSMJMMNPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^ac^`fbacinhcihhmxvmhinosrpqrrrvtsusssnksqmprotvsqquvuswywutucmtkopjqtpwLMLLLGDA@D>=DEFC?CAEDDFCBEGCCIEBHJIGHJFDKJGHJHIKGJJNKNLILHJMKZfJd\KlRGNM_nUls[qpbwcRPbvuhucavaXnqbdvinzf\lu`lkU_wvijhhfglmjmojmosrprrqrsrssrtrnltonpqquurqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?<DEFDCCCEEDFBEFGDDJDDJLKIKLGGNJHJKGKJIKJNLMMLLIMLL[sbdp^llULNer]geqlntgpi_aYnmbppbkjjgoqtetnn\pvgpNKqyvkaakeelxmkvlnosrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?AA?=BEFBECEDEEDCHHGDEKHGKMMJLLFJNHJKJIKJJIKMMNMMMKNMM[rponpplkMPQlXNibtrpamov\YlP[mmZqmkomxxtsip]`slqjUuyxoc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGGFEEBAB=??EGBGDIEEDBFIHHDGKJGMLNJLMGLNIMKHJMIJJJJNONNMLNML\hdu]lqWlNOQmUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ghacityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIEEDCAB<B@BFCGFKGECCHKHHFILKFMKKRRLHMMHNJIHNGJJHHNOMNLJNMJZtppoqqmlOQRnYskgooqqomt^nXat_nopoqroousttj[^tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtIKHJCEEE@@>CCAFCHIMHFCFJLIGFKMLFOJKWRKGKJJNIIJLIKJIIKLMMLIKKKSkbYi^_jcrrZ_Yjo_eeUk_d[abQ`mh\j\niid[oedp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFIDEDFA@AEDCGBHJLGFDGKLIEFJOLIOJL[QJFHHKMIHJJKKIHJGKKKKGHKJLKLJIKLNT[]TPUMQONOOURPPQOOQJJNPQdqiTYV[[\UY[]X]\\cfaafbcf_^fkmhmtxrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusGCEGFFAEC?CGDEGCIKLHFDGKLHDGIPKLOKLWMIFEHIJHIKHLJIFHHJHHHEFLHHJNKHO\W^O\\`^OXYS\\b^MYZMXaRKYaZS`d\aX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMACDBDIEGGFKJKHEEJJJFDGHPJLMJMRIHEAHFJIKKILJIGEJHEFGEEJGBIMIJT_Y`X`a[`UXYT^^Z_RY\P^\YN_\^S[^d^Z]`c_Y_b[`^[UYXZ_^dcbaceiekrpoppnow
{
uqprrsuyzzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIIDFKJJEEHINJNLHLNGHF>GGLIKKJKKIGEIFCDEBFJD?IKIN[cY^^a_RTSW_`\]Y^QY\MV_WKQY[Q[_ba]^ca`bbbcceZRYVW][^d`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFDGEBEGHFGHIFGJGHFHKIKDCKJMMLLHJJHJG?GFNJKKMKKKIGIEE@DAHIA>HIFO]aZ[d]_TQRX]\\\_[KW\LR\YIM^QQ]_bccccb\dcbdceXRVUT]Y[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMC@IFCFKIFGGIGGJFFFILJNECKJLNJLIKJIIGBHHQMKKOMKKIHHFE?EBHHA@FECT]Y^X_Y_[]UXXP]]QKJV^X^[]VZaRR__bb``bb_cbbddbXPRRS\T\]]^^__`dhgljnnp{{|~{
srw
|x\SKBAGFDGMRHDRKFHHHDFKIMPEGIJKNLLILKJIGDHKQOMLPMLKKIJDEAECHFAAFDAVUE\T^SV_XNTUNZ[MJKT`a[_X_^b]OXb\``_bca]bbW__TQPQRYS^\[]^_`affelfoow|{{}
zo
~INFDFFGDIScQEW_IGGHDFMJPPFIIJKNLLKMKJJGEINQQNOPMNMNHLBDACCFDCACD@LHCLLPONLFMFFHIHGLLMOPILOPPSPLQTRUZXWYWWcVOSTPQOOQUT\YY[^^aaefchdlmqsszy{z~{}{
}KIEEGFGDKM^MHHYMGHJHGMLQQIKJKKNMUNOKKLGGKPTSNPPNOOOHKF`ED^LDfcCL[H^\smOMVmYLCO_TlWgJ]WU^DLQULMSVQRTXVTXTT\TPfZhheZTkTXWU[\\``abbb`gignlhrz|}~}}zr{z{
~z{LIEFFHEEKOTJKG`THJOJIOMRQKMKLORUROPJLNGHMQ[YOPPNOPPJKQQI|YYrsWPmGqnoaVPqqtOBjsnqtpSo_[nX]V\XUkhU]VcY`YZ^UUWituu_av_Yb\\f[_aaab^`cgmol`pwtx}~vxzmv~tx}|~|z~wwNIEHMMBDLLGJLFRVLKOHLRXWQNOOMQTNOQPKLOGMPS[ZTQROPPPKIZx]TxdhXRSPvftlpbnfkRrNLwmjrpsrqrpop]ezuxqqzq~r}ku}aRh|essoss|}p~xor```bb[aahlnkblfgmw~~{xwtvzhr~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJQOMNJNV^YULQSNYYLSRRNLPIQRTYWWQTPPQRKHgxlcxqmZJLTypumubnvPddHevqmwojfxxiWrQhzmijzz}lxzphnXuujvupash}ilx|o___cb\_degjjegbcdllppstsssyqrxbltgry{ssuy~svzn|}yxrnMJRtNCBEPQHKLJLQOOOMPZ`ZXKTWPa^RVQYSMPJSTUXWWPUPONSJKrouuquqchaVnLqp^GhyWvTKhx}w`y{sna]modSgrunmypwlvstqlm\s~zkmy|lun|lqvux^__b_]_eeighfe^bbiiijknokqnmjpacfdowxompsynqpj{ztromKKZVHGEGRQKMNLLQQPPPQW\YUNVYUfXRRY^TMNJTTVWYWOSOONQIRmHiwK`dvuUWlNnl{rajguTKWkg|lmlx_Zpz{_`zscroxqhd|ir{]TKk_vuljv|{m~yk|p]^^b[_bdegffec[ccikkrsrwgmihdg`alagsrlglmr|kmhk{tmmkmOGJKHJHHRQMOPMLSSROSRXRWTPWZVVTTTa`QONKTSSQVVOOMNOQJHQMOULKKRSRRROVUQQORRXXPNPUTWXX[[UQRW[WXW[ORTWWXQ]XV\UTOXRWWXYZ`\gr_[[Z]]_cZ_ccegdddcZdbgffmnmuffgc`f^^g`dlhfgkhpzhggkujhgilPIKKLMKJTRNRQPLVUTPTUXUZVR[]VUTWUYXOOLNWTPNUSNPNLQPKIQQKQMJJOQTRPQSRIIMOPQRPPPTURXW\WSRPQUUUSZQNRQWUSYVTXTSQTSUUYYX^Z_a]\ZZ\\`c\^bbdgeeebY`acabhhjncad^_c]Zc\bma^ffgmsdihkkedcfhQJKKNOLMTQOTQQMXWUTVXWWZVS\`VWVYUXTQPKOXSPNUPNQNLSPMNUSNQNMNQSPTPRTTNLNORTTQQQUWUYZ[ZSURTXWVY\SOSTWUTYUVXTRQWUVX\Z\`]WY_]^]\]`a^[bcchgfebX``b]`hegea^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLOTPPTQOQZYXWYZZXYV]jdVXYZWVSTOKOVTPOTPPQNMRQOQXTQQOMORTNWQTTUONNQTUURRRTXVZ]\ZVVQRWXU[[VPSUUUVXSWWTRQXVV[_[_`_V_]^`\\``__ZbceiheebYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSTQOV\ZZW[[\YZ[dqmhd_[YVVXRMNWSMMROQROMPSRUZUTPPLPWUQVRSRXMOPRUXUTTSTYX[^]\[VROUVU[[VQSVTVXTSXZSRQYWW]_[`_`Vb\`a]`b_\`]cachief`Zc`a__ee_`c[Z\[\ZZYYW\Z\[`^`[^^a`_c\Y`ZQNONVQPUSPUTSPW\\\Y^\_W\^jpwyc\[VVYRNPWSNQQPRTRLQTSY[WUORNSXVSRTRRZOQSSV[VVVSVZX]^\\^VSNTVV[[UQTTUWXRSY\TRR\XZ]^]aa`Wb[cb^ac_\bab_dgieg]\e`a`acd_b_YZ_[\[XXYWWZZZa\][]\\Z]`W[[ZPOOOYPUUSRWRTP[]^]\`\`U\\hjr}slh\UYWQOR[SRQTRTUTKRVUZZZSOSQUUUSNUQRZRTUTX]WXXSX\X^]YZ]UUNVVW^ZXQTTWXXSVY\TRV]Y]]a^cc_Y`[eb_dd^^cca^efief^^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POORZPZUVWVTTT^^`_^b\`U]^bkyum}lZUZVQQT\TTTUTVYWLRZV\Z\RPUSWUUSOWQSXSWUV[^X[YUZ^X_^Y\YRWRYXY_YYRTUYYYUWY\UTZ]]^ab`ed]^]]eabfd^_dc`\gehfdb`ea_aabb_`^WY^Z\\ZYYWV]Z]^[Z[\[WY\]VXW]SOPWYP]UVYWWUX_`aa`c]`U]^beev{hXYZTVTV\XWWVVW]XOU\Y^]]TSXSWUTRSWQSVTXXX^^X][U]_X__X\VQYTYZZaX[TVWZZZXYYZWV]_`_dcbee^b\`fbdfd_`dba[fchfdfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNTZVT\UWWYWV\`aacac__V[`da_zuohZ\ZVXVX[ZY[YXY`VOT][`a\UUYPTVURVUQSUW[[\__Z_\V__Y]^Y^VSYWYY\aY]UVZ[Z[ZZYZXY__``dcdeecdZbfcgfe^ab`c]bciedh_g^bbcaa`^_XTZZZ[[X\XX\[Z[WWZXW\[\`]V]]SOVZVVZVYVXWX^`badada^YYadb`kfh^\][WWYZ\\\_[Y[bVSW^]ac\SVYPVUUUVUSUTX]]_``]a]Wa^[^\[^XVXW[Z__Z^WX\\\]][Z\WZ_a^`dddffgcYcfehgd^c`_ec]fidei_g^cbcaa`__[XY[YZYXZXW[[Z[WXZTZ]\[`\U^bMRWYVWZY[\YWY^`baeada]^Yacb_a`a_]]]XW[[]]__\Z]cXYX]`cd_RXYPWUWXWVVWV]]^aba_b^Ya]]^Y\^YXUV[[`^\_YY^]^^`\ZZY[_b_bedefghcZefgigc_c^`feZiicficf_bbca``_]]ZX[YYXXZYWZ[ZYWYVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XW[]_]`_][`d\\XZbecaR\YOXVY[YYWZZ`^abc`ac_\b]_][^^YYTX]\__^_[Z^^`bb\\W[]`bbcedgffge]eghifcab\cg`\iichife`baca_`_]]\Y\YXWXYYW\[ZWWXPXZ]acffrkJYW][Z_]\^\Y][^_bcbaa]b[bdb`cbb]\[ZWXiq`\`_]\ac_^YYcedbT_ZQYW\]\[Y[[c`ccc`bda`c^`\^^_ZXV[^\\aa_][`abfb^\S\_`cddfeggfff`fghhgdd`[fg^ahhcihfc`b`cb___]][Z[YXXXVZW\[ZVVULXX\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{|{{{{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{|{{{{|{||{{{{{zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½sqrrrrq³ÖÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääèÊrooooon
¿éååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxxxwwwwwwwxyyyzyywopppppprrrrrrrwzyyzzz~|||||||zzzzzyz{}||||{
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuxvvvz{x{xwvvxyyzz~|yyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{{{{{{{{{{{zzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwww||}zy|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwy~|}}y{zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|yww{~|||z|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx{||}z|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyywxzz{yyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxxyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~
~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~~
}}}~
~~~~~
~
~{z
~|}}}~|{|
~}~~~~~~}}~}}}
}|}~~~}|}}|z|
~}}}}~~}|}}zzz~~
~~~~||}}~~}}}}~}|zzz~~}~}}~
|}}~}}~~}~}{}~}}~~}}}|{{{zzyz~~~~}~~~~}~~}|~~~~~
~|~~~~~}}~}~~~}}}|{{|zzyyy{~~}~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}|{zzyyyy~~||
~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
|}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
||||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}|}{}}}}}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{||||{|||zzy{|z}
~~~
~~~
~~~}~~}}}}~{{}}~
{z{ywz}~
~~~~}}||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}~}~~~~
}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{||zz}z~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~~~~|||||||~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}|}}}~|}|}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~~}|}}~}||~|}}|}}}~}~}}}{|}~||{|}zzyyzy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}~}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv~
~~}~~}~~~}~~~|}}|~~~~}|}}||}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz}}yxtt
~~~~}~}}}~}~~}}}~}~~}}~}}}}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~}{z{z|{z~~}~~~~}~}}z{|
{{sy{|pwuvwyvtz
~}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
~|}}~}~~}|~~~~}}z{{||}}|~}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}~y~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y|yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}||~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqwyrx
~~~~~}~|~{~}~~}}}~~~~~}}}~~|~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~~}}|~~~~}|~~~|}~}~~~
~~|{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqspxwq{
~~}|~}}~~~~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~}~}{~~{|}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}~xwvyyy|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~}~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
}
{~~}y|zzz}||}z||}}|z{~~~}}||}|vrvxxvtvt}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvuv
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~||
~
}}}||||~}~}}{|}}}}}~~~}|~~~~~}}
~
~~|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
~~~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~~}}|}~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~|~}}~~}}||~~|}}||}|||~z{{}~
{{~}|||}}|||}}|}|~}|}}|||}}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~~||}}{}}|}zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yzzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~|}}}~~~}}}}{|{zyzzyzz|yzz{{{}z{{{{}~}}}}||}}|
~|~~
}}~~~{||}}}|~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~~
~}|~~|}|~||~}|~}}}||{{zzzzy{zzzzzzz{|y{}{|}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~|}}}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D:;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=::;88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚØÖ××××××ר×××רÜÝÝÝÝÝÝÝÝÝÝÝÝÞÛרר××ר×Ö×××ÖÓÒÓÓÓÓÓÔÔÔÔÔÔÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde¦º¸¸¸¸¸¸¸¸¸¸¸¹³xssssssssssssp»¸¸¸¸¸¸¸¸¸¸¸·½ÒÒÒÒÒÒÒÓÓÓÒÓÓÓÜâáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSO§£££££££££££¥2)++++++++++*%a©¤¤£££££££££¡«ÒÒÒÒÒÒÒÒÒÒÒÒÒÑßêêëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;@C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWS
¨¤¤¤¤¤¤¤¤¤¤¤¦8/00000000000+eª¥¥¥¤¤¤¤¤¤¤¤£¬ÒÒÒÒÒÒÒÒÒÒÒÒÒÑÞêêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;>@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbb^¬©©©©©©©©©©©« E=>>>>>>>>>>>9n¯©©©©©©©©©©©¨°ÒÒÒÓÒÒÒÒÒÒÒÒÒÑÞéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB?;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÎÎÎÏÎÏÏÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÏÑÑÒÒÒÒÒÒÒÒÒÒÒÑÊÊÊÊÊÊÊÊÉÉÉÉÉÉÌÒÑÑÒÒÒÒÒÒÒÒÒÒÒÔÔÔÕÕÕÕÕÕÖÕÖÖÖØÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÎÎÏÑÎÏÓÓÏÎÐÔÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖØ×××××ר×Ö××××ÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÕÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎÎÎÑÁ§ÒÏ¡ËÑÆ«ÒÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÎÏÏÑŪ «Î³ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÏÏÓº¯«±¡´ÎÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÏÏÓ±§§´¿ÉÆÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏÏÑÀµ¤ ÃÒ ÎÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<B@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÏÔ£¢ÅÅÉØ¬£¿ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<;:9?@=<==@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÑÄ{¢¡»ÍÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<;;8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÕ«¯¼ÀÓy°³¥ÐÛ¢µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?;;9=>==;;=<@CB?>>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÉ
¢£¢¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;547<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÆÓÓÕ² © ¢©¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ACB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÒÑÒרϰ¥Ô¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<9=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÑÒÏÅÔÕÀ½ÖÔÓ¸ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::<=?:;9:<=BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÒÒÓÔÒÒÔÕÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786977899;;=?@<=89;;;?><<95:<>;:8:;???BBA>A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966;=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<59:<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=>?B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<?B?:8776=??@=@@??==;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>=<?@?<5676<>?><@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AA??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@C@CC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:;<>;==;><:;89:89AABA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B;9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=;?=:99:<9;ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6;DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<<DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875776858@>@;<9<;<>::;9:;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958:89:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995687673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86776668784;?;>=9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778777656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiihxsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778679645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptyvt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9867556747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664766=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:863656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87863767:66659>?:<?;?9;:7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==<?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757878789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687789:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495666788:<;=>:;::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYEDKPN<9886553956676879>:=>:<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643954775679=:=>;=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573146498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730473785766:=?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA8<;6:56534658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455588686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®xpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269664737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾¸¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾³¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?:<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_MHQIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<8::698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\dc[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¥¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlgbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocnihb^PQ@?;:8:8<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥©§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´´¶¼¼¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsositdidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎÌÌÇÁÃÇÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄËÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkhguZfrwsxff]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÅÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijh]jomxwbb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬¦©»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugihtmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËËÇÆÌÉÍÅÆÆÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlidtnsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÄ¿¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÆÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»»½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegcjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfaebabccjbfcZYY\YQNE=;8:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿º½¿¹½ºº´¿¸µ·³¯»¼·À·½Â¿Á»¿Á¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÁÊ¿±Â¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjffiei]VUSYOSKE8?6::779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»À¿·Á»»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekgXXNKKKRILHC9>8=;6:;:67<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···µº¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8=<7;;:78;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·¿¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸®µµ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcga\cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼«ª£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊĵºÀÃÈ¿¿µ¿À¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`aNHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍËÆÂÃËμ¹¾º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µ»¶¹Ä¸´¼¶º½Á¼»¾¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼ÀÅÂÇËÈÁÃÀÀÉËÂÀ»»°´¼½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp]Z^\YQEDCMIAD=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÃû¹³´ºÁ½¿ÇÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¦¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpni[__YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯²´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀ÷·°µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwnq`_e][TJ<>?FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁù·²²²´²·¾º³µ²¼º¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvrl^b`[]NHA?=HCFMD?775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÄû»¶´´°¶º¶´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³±¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶ª¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ournc\fX\]RNMA>JB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³±¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÊǾÀ¸¹¶²´¶³´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik][jT]\OMHDFLAFMF8665:5:=8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±ºÃ¼ÂÊž»¿¿¹´´³±±®°¹¹¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH?HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¯²²ºº··µµ¼´¯´«¶º¸ÀÄÁ»¶¼½¸²³°¯¬®·¶²´´¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡ª¨ª«¥££¦¢ ¥£¦¤§ ¢¤£¡¡¬«¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\QhTPNGOMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬ª¨µ²±°®¯²§¦¯£¯®µÁºµ·²·¶²´«²´®ª«¯°²³¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©°£¥§ £ §¨¥ ££¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRNJNG;D@=2?749;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¦©¤©£¤®¥¬¬´¼·¬²±¯±µ¯¯³µª§¬£ £¢¥¤ ¤ª¡¡¦§ª¢ §¤§¨£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxz`bRU_HIIKSTIRPL8>B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ £¨®¬««¯ª¯©¥¥¦¤ ¢¦ ¢®«¬µ²¶¦¯´«©ª´±°°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±±±´©±¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¤¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|uvshle\SZYMQJNNULRLA7>B78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=?758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¡£ £ ¢¯®¬¯±¬¶§±¦¦°®¬°§ ¢ ¡¢¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°¨«¨²µ·³·¬±´£ ¥ ¬¡¡¢ ¤¡ ¤¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]mZR`HQUHFUVJBMG=JH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¢ ¢©«§¬©ª´«««¥¥«¨ª¬ª¥¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¡«¢©¨²©«¨§¨ª¦§ §¨¥¤ª¢¢¨ ¥§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmiwmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DADABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·£°¦ ¤¤¤¢¤£¢ª¯¬§©£ ¡¬®®ª«¦ ¡£¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬¯§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â¾¸´»Åü»·³©²ª³µ¯³®ª®£«§¶±¬¢¯¥ £¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤£¢¡¤¦¢¤
{tqkkurphW\QETHDIOH>EA3EH95;=6;<?<<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C?ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ¡ ¥¥¦§ «±®§¤¤£ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÁÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌÌÌÒǾ¿ÀÂ½ÇÆÂ·ÃÉÈÂÀž¹´¹ºµº·°µ²ªº±®»¶¾»ºª·«ª¸º´¼®¸¢¥¢§¥¢£©¦§ª§ ¡¡¤£¤¨¢}zrkdioxjeZ[FJLDDSLDBD7:?;549979=><<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:=A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ £¡¯³©¡wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÈÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÌÓÐÓÓÌÊÂÅÆÆÊÇοÉÐËÆÄÆÄÁ»ÃÀ¾¾¾µ½³¾¿ÂÃÆÄÇÄ®¾¸²¸¼ÄÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDB@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª££¬®¦¥±ªÅÆÌÎÍ¿°Â©¥¨ª¡£©¡ ¤±±«¤ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÔÕÓÓÈÌÇÍÍÉÒÌÎÓÍÄÇÉÊÁÅËÆÈÈž³³ÇÄËÊÊÎÅÊ¿¾¿¼ÁÇÄÌÌÈɿÿ°³¨¢ª£¦©¬¤¥¦
zruugbgvidVWQDMF@IQB=B<:23@<D<79<B=<=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤¬©¦°®¥¡¥¡|wpkebhqoq{
vpnqtp
³Â¾ÅÑÑ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÒÏÑÃÐÓÖ×ÕÖÒËÉÎÑËÆÍÒÊÒÕÖÙÕ×ÓÖØÎÒÉÎÑÌÏÐÌÒÏ¿ÇÆÊÃÌÌËÎÏÅÆÇ¶¿É¿ÒÌËÏÅÉÈ¿ÃÂÈÎÌÏÐÏÌÊÇ͸·»¨¥«§£ª¥©¨¨|wsvoc`erb]R\IJFAEHI>;@8=4585:76:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´¶ÂƲ¶©¢¥¦¡¢«µ§±¡¦«¡¡¢wica____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÏÏÕÔÔÑÑÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑ×Ò×ÙÕÖÌÎÏÉÍÑËÎÏ¿ÅÂÇÅÎÍÐÐÑÈËÌÀÊËÅÓÎËÎÈÄÉÆÆÈÌÊÓÓÑÕÏÒÌÒÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
{zqstmacim_VP_JJBFCQM?<>44:=52755<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯®ªª¬¦®¸¨«·ØÔÕÙÙÑÎÐÀ¼ÌÉ·À¯§«©£¤±¶³¤¶ª¡ª©¡¡~recb__a__a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÓÍÕÔÑÊÏÌÓÖÒÑÖÍÐÕÕÑÆÑÔÊÑÔÕÖÎÒÐØØØ×ËÈÍÃÈÎÌÉ˿ȿÈÉÍÍÏÊÐÍÎËÎÎÇÊÏÐÊÎÊÂÉÆÉÌÊÌÑÒÌÓÑÐÏÏʽȹ°»¸µª¶°¨¸³¿»±
yvopnkbenpaW\ZIFFDLWE;@<34<=86855;>@<9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6==?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¥®¾´±ÀÙÒ×ÚÜÖÏÍËÃÓв«®¬¦³±¸«±¶©£l^^^adb``aa``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÔËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÓËÌÐÑÓÊÎÑÕÒÕÕÊÀÉÁÅÌÂÈÉÂÌÂÅÈÉÊÎÊÌÌÏÍÓËÅÇÏÌÇÇÊÄÆÀÅÉËÍÐÑÆÏÎÍÍÌÏÅÇÀ·¹½Ãýù²³¾±¼Äĵª¥¡
xpqknh``qhXXhVMGLIPPB;D>;67:89:57==@;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;776?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±ÇùËÕÖÙÚÛØÍÌÏÉÖÖÅĸ²¶ª¤®¸»ÁÅÉ¡|ebbb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÅÉÉÆÆ¿ÃÆÏÎÇÅÇÍÊÑÈËÎÍÆÑÒÏÎÌÔÊÇËÎÏÇÇÏÒËÐÏźľÆÉ¼ÂÆÈÎÄÂÇÀÆÍÇÃËÉËÏÇÃÃÏÈÆÁÆÇþÀÇËËËÎÂÊËÈÇËÏÄÅÇ»ÇÃÈÈÂÏÀ½¼¿°ÁÊǺ½ª±²§¥¢¤wntdl`^fqa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥³±¬ÉÍÊÈľ½ºÍÍÆÐÕÕÙÚÛØÐÊÐÐÒÔÊź¾¾°¨·ªÅÝÖDZ~
t`[^^^`^`cdc_]]^_``_[Z\`krrookloo}¸ÑÈÉÊÏËÍĺÀû»ºº¾ÈÆÂÃÀÃÇÊÉÈÊÇÁÅÌÆÈËÍÉÄÂËÉÂÂËÐÄËÈ¿¹ÁºÅǽ¿ÆÏÊÿúÉÇÈºÇÆÄÊÀ½ÁËÆÅýż¼¿ÃÄËÄļ¿ÉÂÅÇÑÅÀÈ¿ÊÊÆÈÆÐÃÃÆÃ¯ÄËÇÄÊ·¿¼º´©¬¥¥¬£¡¥£ {vstfj[anmZ[XQDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÇÍÏÎÍÕÐÖÙØÙÐÍÔÎÏÐËĸÆÁ¶µ¼¯ØÃu}{
vxurp_Z[]`abcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÂ±¶º²²³²±Â¼¼»¹¸ÀÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ¸»ÄÉ¿ÂÉ»·ººÅ¾¼ÁÍÂÆ¾½µÀ½Ãº¼Æ»Â¹³¼Åö¿µµ¾¿ºËüµºÈº¿½ËÃÁÅÂÆÈÆÈÆÐÆÂÌȲÇÊÃÎÍÁÅ¿½²·°³§¨¨¹±¥°«¬yvwjeh`hocV^YJEJFHKAFBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÂÄÈÎÒËÊÊÇÍÎÏÒÉÑÆÖÕÖØÎÌÐÈÍÈÊžÊÁ²µººÓpV
y~|tud\\]^``bcbbeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÁ¸®°°§ª¬§¸´·´³²³ºµ½±·°µ¯²»Â¼Áļ¿»µ²º¾À¸Ç¸´»µÀ¼·½ÆÀû´®²¶º¾³Ä·»µ«¸¼½À½°ºµ¯¶º²Å¼¶®»¿´¶´Å¼¾ÃÅÀÃÅÆÈËÆÀÆÆ»ÈË¿ÏÊÇÃÆÁ÷þ½¶¹¾Æ¿¬µºµ·¶xtxggebkn^V^`FKHHJFBCAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÍÎÉËÉÌÊËÆÑÏÓÑÏÈËÆÊÆÄÀ½Ï½³¹½½¹X{y~wx}th^]]]_`_`da^cec__\[^\]^Z[[]_lpmhfjmnr|¤Ç¿¹¸µ°¬¬§¢ª§«¬³©«©³¶°²©®¦¬²¼º¶Ã¹ºº±ªµ¹»´Âº°¿°½¼»µ»Ç¹Â¶ª¨°±Àµ¸¼¯°§±³´»¼«µ¥®¶®º±°ª¹¯»®»¸»¿¿½¹Â¿ÇÃÅÁ¼ÆÁÈ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÅÉÌ˳¹Â¼º²rvvkiablhYXW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?<>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÏÒÌÄÆÁÅÐÈÏÂÄÇÁÆÆÅÅÌÄËÌÂÄÁÈÁº¼»Ê·´¼½·w|y~
z{wn^]]]]_`__dcbccb`_^[[ZZ]ZZZZ]dnohfgiknr¹°µ®¦¥§§ ¤ ¥«®£§¢«©¬ª°£¦ªµ¶±½¹¯¸¯¨®¸´´¼¸³¼®·¹´±»Á±Á®¥©¢¬±²³§¼ª«¨«¬´´¦¨®¡¤®©²¥§¨®¥¨·¬°²·¹º»±¼½¾¾Ä¿µÁÁÇÈ·¿ÀÅ·Ä¿»¿ÄþÄÈÌÊ¿¾ÃÀÀ©rtrji]aodWVXPHZRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·ºÄ°¶°ª©°±³µ½¯ÆÑÐÍÄÈ»»ÌÃÌÀ¼Ê¹ÀÆÀ¼ÌºÃÇź½Ä¾º·½Æ¹¶¹»¯²{~~xt|swf_]\\^_`^_ccab``_^]\ZXY[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥¤¡£ª£¢¥¥§¤¬¤¦¬²¯¶·§°¬§ª´«´¹°¶´¬¶¸±¯º¹±·¤£§±§«¨¹ª¤¦§¨§² §¦¤¦¬§¤ ±¬²´²´°µ¼¶»ÁÁ²º¾ÃÁ²¹ºÂ³À½¿µ¸»½¾¼ÂÇÄÂþ¿Ã wpkae_ko`UY_HNhOTHEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676778666;::;9:;<859<:>>@;ȵ¶½¸ºÁ»¾µ ¡¦º¶«³³»³ÅÐÉÌÃǹ¸ÉÂÎÁºË¹½È»·È»·ÄƳ¾Å¼·°¹À»±³·°£
}yvtomkjjqi_`]\\]_`_acb````]\[\\XYXXXVX[]^dcbegggjmo© ¡¢¡¢¦£¥¡§¢ª°±µ¢©ª©«¬¤µ¸·¯¬²´®²´®°ª£¢²¤¥©¸¡¦¦¨¬« ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«²²¹²½´¶±±µ´¿µ½À½ÃÁºº½zrk_e^ddXTX^IW]KPGIJFA<??@;?<04536:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÉÉÁǼ¼ÅÅÐÀ¼Ê»»Á»¶Å¸µÁÁ³Âļªµº·¨±³©ysnpnkb^bff]]^]]]\]_`abccba_\[[Z[YXWWWWXXX[^bddeffhikr¨¡¡¡¨¥¦¡¤ ®®² ¥¢«§¡µ°±±¬§®²§¹³¦µ¡¢£¢¢¡©µª¢£¦¥¦£¬¡«¦£¤¦«³³ª´°²ª²¹´¯©¯²²²·³©¬®±·°º¶¹½¿¶²±
yue^e^[YVSZUK[QLIEHKIB=?AA@@:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾½¿³¥£¥±Âµ¶½´¸ÃÍÉÈÁƸÂÁÈÐºÃÆÀ¶¼½¶Ãº¶¿Áµ»¿»ª¦±»±¨²¯}
ypqtqhfdiec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXXVWadecdeddhjv¢¡¡¡¨£¨ª¦¯°«££·ª ®¨¶©¦¦¬°£·°£¶ ¢ª¦¡¬¸¯¢¡¤¡ ¡©©£¡£ªª°®¨´«ª¦²°¥ª®²±¯°®®§§§²®±´¯¼´¹¶®£yud^aVYWSRTKM^LPKGGLKE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§£ª»À½À¹®´¸ÂÍÈÇÄžǺÊ͵ÄÅű¿À¹ÀÁºÀÀ¹º½·¨¨±»¦©¢¥~xrjlrtpihedgb\\ZYZ\\\]^]\[\^\[\Y[\ZXVWWVWXWWWU[ccbbcbcdfj ¦¥¤¥¦¤ª¯¦¢£¶¨ ¡¢¨³¡¥§¤¯¥°¬«´ ©¡¡¬±°¢¢¡¦¦¡¢£¥¥«¤¥°§¥£««¥¨®¯®«¨ªª³¥¦«¯´±®¼µ±¯¯ zvrda\Z]XNLQGRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»²·¬¤§·»¼Áź±¹µÅÊËÁÄÇÇÉ¸ÈÆµÅÂɯº¼Â¼ÃÀÁ½¼·º¶¦§²¶¢wodbgihfhjgjm`]\[ZZYZ\]\[\^_\ZY[YYZ[WUXWTTWUSTRU``_`a_`acdi£ ¥¡¥££¢£¡ªª¥¥±© ¤ª§¡¬¬©¨¬¢¡¡£«©°¢¡¢¤ ¡ ¡¤¦£«¥¢¤ª£«®¤®±©¦¥¦¦´¦©¨³µ´¹º¯ª¬rpo`[WVUQFQOHZ\ORITKSLEGIC8;;=<8667:9;:976977:;:=<<7;<8>598:88659:;<97?<9678452121..1426:86:859898:;9@9{µ´´»²°¬²§§¯¹¹³ÀȺµÀ¯ÆÉλÂËÍÉ·Ë¿´ÀÇ̰¶½È»ÂÇĽ¿·ºµ¥«°®|uijjmhjlnkkme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^^___bdm¢ §¨ª§ª¥¨¤£¤®¤¥¯© ®ª³¥¦¢£ ¨© ¡ ¡ £¢ ¢ ¢¨£¢¨« «¯¤·¥££¢¬©¨«¯³¸²½µ³«¯rrh[XYSUREYLP\YMTOPLPRINIB<??A?=65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³®¨³¶®©¨¯©¨¬·¶¬¼Ê»¶¿¬ÌÇÆ¹ÂÏÐɵƾº¾ÆËµ±½Å½ÃÆÄ½Á³¹¯¦«¯«wxoninnnqggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]\\^_`d~¢ ª©¦ª¦¯¢§¬ ¤¨§®§ª¥ §ª¤ £ ¢¥¥§¨¨ ±°¦°¼§ £¬´«§°´°¹µÀ±±«}prbVTUNRIGVQSRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¦±·ª¦¢°«ª§©²±¤¶Æ´¹º³Ëƺ¼ÃËÑ̳¹º¾ÀÄǶ´·½³»¼Ä¾Â±´®±®±¬¢khnoroqkpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzu¨ª¤¤ª§ ¥¢£¢¡£§¡¡¢¥¤¦¨¦¡ ´²§²·¡¢·¬ª¤²²¦µ¼µ¬«±£xrm]NPQLOCNNNPKFNNKJNMQIMJAGKHHC>858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12776:999984988A7w¶§¤¶°¤§¤©¥ ©¥¤³ª¢²Ãµµ²³ÇǸ»ÄÊÍǵ¯¼¿¸¼Ä³³®¶¢µÄº»¯ª¬´¯¯ ¨}^`gsqvqjnifhhj_XYXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKLSWWVXXYX[]aosvq
¢ £¤¡s}
z¢~~tz¢£ ¡¤£¢´¯¬¯¬¥¹¦¥°¡°®°»ª©¯ªvrbVLQOPMCSNLQMCPPHINSMHJJDJLEJK=749888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-12764789::65:87A7w·¢£´¨¥¥¨£¦¥¦¦¦³§¥´À¸°´°ÊƹºÂÏÇ¿µ¯½Ã¯±Ç²§¬¤®¿¸±°§«¢rWV_hgihincjhgb\XXXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo{
ryz
}xqo
~¡ §¯¨©¨´¢¦¬«§´¢©£}qm_ZNSQVLDTJPMLFOOJFLQMKPJIMPFIH=7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9x· £®¡¦¦ª §©§¢©°¨§´Á¹±µ°Éù´¿ÏÀº±±¸Ä«®É®§£¢º§¨¦¥¤¡iQMRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`moi{tPB@}y`JQnx|n~wuvxpQ{~xvgw
~¤£§©¥£°«¡¤¤¦ª¡ª¢¦¨tke][HQQSLIUMSILLPIHFKOLMTKQQOFIC<769:8:;;8:;8>?99>=7;<6;;478;6775344696/3/.115221/,')+*,4833979:99::::?9v¶£§¡®¡§¨¥§¨¯¬ª¶¼¶¸¶³Â¼·¨ºÉ¹·©ª·¸¶Àª¢²¢ dMLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut{
{uxsnupty}ª
yzhv{prmxxz{vsrwguz{¨ ©¥§¤ ¤qg`\\JVOQGKXROJLMRJJJMPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937795675252572/2.,./200/-+(().1262198798776:<<7v®£¡³©¯©¥¬¬°±ª½´²¼¸¶ºµ² ·»³««¬µ³¥¤
dKIJIGFHHPTTTWWSTUUUVWWWXXXXXXXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQRSV^u}ygw}gyvx|r|v{ok~|s{}tfv|
lohs|lyq}pmuqhq}pC
~wwz
}zu~£¢¤umkeaYWXTQJRUTOPNQVKNKNOJQOIOOKFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«§©°¯±¬¼¸¬»¾¹³¨±¨§¬§¤~|z
~~bJGHFB@CDILLMQRPQSUTTUVWWWXWYYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{xo|yy|
omxsxjjr}Inhw~licly
ksl|nr{hmp~s
z}~{vott
ywp|}lhmnmWUWTQQYOSUTTXUMNHMJMNKCINGE@:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¤¯¢ª¨µ¯®¬´¿«¼Â¿¦£¥
¢¤v~
|x~t}xtwydOEGD@<>>AFGGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jrAo;<95<_IMOORWZRY\`§bitze~pmzutlts{jkLyg1vsl~}tfet~
filukp|gpp{n{s}|qpnum~wytiyyuiingcWQYWXY[MPUVZYNIIEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226-+5775478iO8;5n¤¨²¦º®«²°Â²»ÃÇz
twvwuxvoxrhUFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯³ q|xm}mq
yyr txsu5q¨¡¡¢vp||shfbinrmpuioXuovlz|mqmpzsumbv
ux~}xpnnj^Z[][YX`_SN[ZYXLHJFJG?CABG?CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´¨±®Á³ºÁÆ}nv
oy{{q{t|ko_JPG>@7458;;<=>@BEILLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lv|}
~v¢y~
aªzv~s{\dqtz{wlgiaxo
znwszpsywkni]w}|}q|uw{}tmqrde^ZZ]S[f^XQUY\VGKKELG?F@DC?AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\w¦ ª°©¯À±»Æºzvk~
yu¢~~s}kzlSXLAE311266688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y{q|{|~v¡¥¬©H¯¯¨sl|}hggx~n
qGkwqyvhmk_w}
z{uv|wmow~}qqpjZ[[ZcbWge\UPQXZQDLLGOICFCCA@CA=988:::;;:888::?>6;>7595773344236756768;DFLMMLC7+"&'+)++,/00+nu22420L\5=<^t|~
¬¡¦¸¯³½´}tp~}¥yu
y_cVLC60./22123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¥»±§»Çç¡¥{r~v
ihotqw{v
}nvug¢«£{zzogkx}w|qic\YY\h\af_ZOLNXSQIPKDNGCJDCADDA<:87=<:<:88778:==8<=68756623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nvpgx{¤¡¬¦«¯°¡xw}~mpj^CA4--////02234779;=?BDHJOQRSRSSTRPOHDB<87/9C><<63.lMPHIKKKNV`cggmu ¡£©¥£¬¨¶¢§Á®ȯxº|¡
¡
lpuvql
r¡¥¶©¢~kjl}~}q_[b^Yfj\lk_XKHPSQNMLFIQDDNFBCEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªhf¤~
z}
xxhNR>//.,/.-/000212457;?CFNPRTPQQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÉ·ÈÑϾ pi«©
§¡wz~¡{v«³ }¤£§¶°¨lss{|ynf^[_^agc_gg\REKKQOIJMFFMCHLFFCBGDA:85<<899975658>75=84745754546958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f3A@ib^Pqu`n}aw}|ªªBD}y|
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=FH@A@8662<9;FHGIIMOQYmw£§ªµ½¸¥®¬¬¨©µ¬±·²²»±³¾³Ä¬»É˸ÿ·¥£°²¬ª£
¥¦ ¢¦¢ª§¤
£ ª ¤©±£§·»¡£°££¤¢«°³µ¢¦ªz{~{e^fZc`]bb^fg_[ODIHTOFHLFKGFFHAKFCFFA;87=<88:974658<54<76:54644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|{
qna@E64<3/110-,+-1/-4?DANVQRSUUWUM\QGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇÄ«³Å¶´À³¸¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´°±§¯ª¤w¤¡«±³©¨®µ»²º¬¯µ¢±¬²µ¼¸´®µ ¨¨£¨©°³º¸¸¨¸©¥ yrW_bUd``a^_f`[UJDELVQIJJEJHEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL\ZQcdWzuq}v~{¿»£¼´z
zyn]W@EN<6:46AB764//6CHCQ\OQUXU\WO_UIKJA@?GKFFD;>@7D7?BJJEGWTP^¤¤²´Ã¶¸ÁÌʶ»Ä½³´Á·¸Âµ¿°¸t±´¦ºÅ¤°Æ¹±³²´¨¤¶¶ª± ¢¢¥±¥¬§¤ ¬³º¢¨²¹µ»¾Ì¿Å޽³Â·º·¿¸º¸º±¦±ª®¾°½¼Ã컨®«~yhUa_VhchdV[cYVTJGGLRGDIJAID>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYVZwjp
o{rxb¹¡£{z||}xzufO\dGEL:Qd`[^SF?;HPDZcQQYYZgZS`aMSOEA?IJHEFA@C=E6B?HGKMSZT^¯¸µ»¹ÉÀ»½Êͼ¼Á¼¸¶¼»·¾µº³Æau²¥±«¾ª¥¨«ª¤¢²µ «§®¥§§¥¤¢§°³¨²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÄÀ¾¾¿¼¼¸´°¹··ÃºÆ¾Äɰº«¢¬¥©·|n\^^\U_]gfSYaVRVIEFNKA>HD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPOQRQJA9/,,,*+((,-,/P>(.48}<2Kq9>CKE@JMPRLQ]hmlqslrrtÕÀµ }~y{{yt}zlepvY]\Peeb`ed][XX\MdmURmn_o_XgeUYTKDBKKHFHHHHBI9D@HKTTV]Z\¹À¹¾¸ÆÁ»¹ÊË»¶º¶¸¹´¸µµ®¶·du©p^¢¡¢¤«¥¨¦£¬¤ª±·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀ¿ÂʽÁ½ÂÀÅÄÆÊÀÉÏ´¤¼±µ°¬¹½}vi[\YW[_XabQ\aTRLCBFGE<@F>BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;.&**(-.0,@M+/54mI0Ht?>BD@CDGKODR\Zi`onlotu³¬¡¡
|s{
{tt{ylmu|iseilhfjih`fiimZmt¤½g[oh]ZYTHKOPJKPKTQHLAJFKP__bgjb·Ç°º´»¾¶±ÅǶ°¹±±»³±¨«¸¶¨§N §¥¡¦¬°¨¯§³³ÓÔÔÖÑËÏÓÔÎÓÏÌÆÃÊпÊÉËÉÒÈÍÎÃÐÒ¸°Ä½Äº¦·»Ä¢kaZZ[V^VYcYP]XORCBIECI;AD>BH?@B8;D>@I=56655;:687654/10146278875367C5B8?-0,1348=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshroyy¡ª¦}
|p{r~qyulpxr{nxslipmcinpyiw}~Ë¿Ãß§ncxnd[a`KPRUNY^P^]NQNTQUT\nnwr®¸¬µ¨°¶«½Á²«µ¦¥¹§¬¯¡¬´¤±®§«¬¤§¢¬¬ÎÒÕÑÍÌÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓ×ÍÒÑÅÒÖÆÁÏÈÈ鿸ÐvkbZ_[T^Q\YOPTPNI>AGBCF=AB?FE>@?:==<<JB45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwlwp}~ ¡
y
{r~z
v
owsls}|w|sxqkrriprzyr{¾Ë²vr
wiai]DZZ[WfdXekTX]]`c^cx{ª¤¤¢ ¡©¦ª±¹«¦´£¢®¢¤®¢§±¦k¢~¬
§°¢ ¡¥¤¨ÈÍÏÇÂËÐÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÊÔÚÍÊØÖÑËÄÃËol_\\VRWRZOJGIJJ@;:;EBD=CD>HC?CB;<9<:GC46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu~isyr
x~xs|}w{oxqmuvx}t|ylvtn}v
uy{µ<AÆ¥~}jeWICecfchjdoy[_fhknin £¤¦²¤¥² ¢¥¢©¡¢±~
zª£}ª³§¦½ÃʶÅÍÑÐÒÐËÒËÉÔÎÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÍ´uskaZWPSPXUEGJIFE=:7:@BC:HE@EDBDA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?2*(.BT29254/7K75<`bA<svV87AH:?C><9QECJTlnopbqqt}~
}x
zyq{{
uzzp}ppzr{rnzuw}}u|°tYªÂ·pnc=^hrpqpnwweiorvxr{ « ¡¬¢ ¦¬
}
~ly{ª¦®µ¼¨½ÇËÈÉËËÏÉÄÒÊÔרר×ÔÛ×ÓÙÛÖÏÛÚÒÖÉÕÌuwedXWNQR[GCFIH>B>=8:>@<>H=@BAAEA>?:87DB755479.566435532323647553458EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<B<:9D?CGRk_mdbflvqy~
|}wyn{{tz¡vvtu~too
u|
zv|¸Æ¥ÃʸxpfNeczw
¡yzw{|um¦ £«
z|¡¼ ¨¦¥§µ¿¿¿¸ÆÉÍÎÅÍÊÑÖÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆvvdfa]RUTTMKDMC;=<<9:<?9=A7>?@=?>=9867CA6455=80665547745613854564567HH=DJE7925;H>;9:7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa]\itzylwvz|~~
{~
{
|u~um|}~t|~x~yot}
|~{©Ã ½¤~
}ss¦
{iGq¡¤
¡¦
¥¸¡¦ £®¶¹´«ÀÆÊÐÈÇÍÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¶vutgfbT]YRNNHCLC==>99;:99<=6@>?==9::;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWO<MTHN?96333>C;[X>5YypZ<<A<=>8589?<DRSRX_VXfmmmiqsy{{||{}|~uzszsm~
~w¡n©
{ |~£¢¤¯
Wr«[¢£¢
¥
²¡ §²¸¬¥½ÂÇÍÈÆÏÌÐÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚlyqccZZUQUVC@IC??>:48:;7:;:3<<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbxlb~onxxz{}||w
sp
{uwvt
}¦¢¦¢¨r²¨
£ ¢©° o·ÄȲ¢¦±d¤ÍÇ
«¤£
¥¨¡¢²´¥£¼Á¾ÇÆÅÉÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎo{d`[[[MHSYBAGD;B>837;<:9>64::<:72?:929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcGv}|m~xz~{wv|mo{}xx|~¢³§£«³¢§¥¤®¢¸³¡¡¥°£¤§¨¬¯¤¡À£É¸«£¦²
¨¢
u²¤¡} ±®¢£·¾´ÅÇĽÃÃÀÆÍÊÉÓ¦ÎÌÓÒÑÖØÓÐØºovrY^S]TNGIMDACD5>:77:?<<7=42669774>5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGMZ\YJf`;Hzzn
z|x~px|~}osz~|x¦»¬¨±½°¥³³¨£¢°¬µ£¸¥¥©¸§¤£©ª¤®°ª »»®Ê¡j¶¸«°£¬¾£^ª²|}´«¡¡ ¥¯¨¡¤³¸¬ÂÈĶº½¼ÅÇÇÂÑ ÆÉÍÍÅ×ÖÑËÓmweYWP[ONEC><BAB8@885?G=<5<35345454B49:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdHb`bpJ@~s}un}|}pww|©ÂÀ¯½Æ»³´À½´«³¶¨²®¾«»¥§¹¸«¦¦¢¢¤£©¯²±ª¥¢¦¥¤º¯©À¼®²¹¥¤¨~½°z¨±¬ ¤¬ ¡§¦¤¢£°²¦ÁÆÃ¯°º·ÅÄÿͦÇÄÇĽÖÐÍÄÊ
po^YW\XLJAKAFG?A@C;:4>A==5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUN79GD?CF\eF`igZ]\{uo~{q~{z§³ÆÉ¿ÁÌÂùǽ»¯«¹»³·º²Á®¥À¤«¯¼½ª®«££§«®µ°ª «¡¯µ§£ºº¶Á¼¬©³¥¤¨
©Ääy¡¦ ¯« ² ¤ ¥¤¦¦¤¯¥ÀÄ¶Éþ¶Ï²Ä¿Ä¼³ÑÊÈ´quiYUYgQLHBLKLJAA>DD<5AE;;3=8B332262A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeZMe\fTbkyr{xz¡¨º½ÇÈÉÁÒÉËÂ̽³¼¾¨ºÀ¾»Ä·¬Á©¬³¼¾ª°ª¤¥¤¬®³¶µ¡¯¥¢£³½ª¨½Á¤¶¸¯¬²¬¬¬©¦¥¥uy
££ª¥|£¢µ¥¤£¡¥¦¤£©§¢²¬¨»À拾·Ì¿¹¯Ä³»¾Á¸¬ÂÃÂÀjv^UTYXJJLIFDDHCCADL:4DI:;4<8E.12242B26SHO<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>iH_XbZccV x
~¡®§¤Â½ÇÃÇÅÓÎÎÍ˼·°º¼´½Ë¼Ã¶·¼³¿º½®¯¨ ©¨¶®©²·£§¡«·¸ª¥°¿Ä²½¹´¨«¶´®®¥¬¨²Å§||ª¤¡£¢Z¤e¢³¥¡««©¦¦ ¤¨¥¶«©¹»Ã´¥´µËÀ¸ª¶«²»¸®¨¸º½¸hkWTRSMEIRMK?AHEEIHH95EM;>8=@J.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;>@BFBpEjIReaLF¥¢©¦¢¯¾¯¡Æ¼ÄÄÆÆÎÏÎÒÊ¿»¶±º»»¾Ï¶Ä½¸¹·³±µ³¸³«§«¬¹ª©§¯°£¯¥§£¥µÀ°¬¬´¿ÃºÀº´§º¶¹´¯¥¯®¤¡tÂ}±¥£ © `J¥T¯¯¤®ª¤ ¥ §¢´¨ª³»»»ª±²ÇÀ¹¦¬«²²£¡²²´¤mjbYWMOJDOOPR;GKIGICC>:KU?A:=EM07544:B44MWO;JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯¨
¡£¤µÉµ©Å¹ÂÃÈÊÉÈÍÍÆ¿»³®¹¹ÁÁ̵ǺÁ¹µº°¯¯³µ§¤ª´´ª©¦¬¤®¥¤¨¬»¿¨¬¶·¿Á¿¾¹³²Ä²¹¾£¯µ¬¹¦¦v¿®¡ ¡¨¨ª¡§nv¢¢®²£ª¨ª©£¢¤§¢±¦©«¹¶½²²®¾¹¶ £§¨¥¦©©`b^]NJKFGMJVL=MENKLBCD<QV=AABDO18=76?B75UXO?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUH~e^HE«¢»¯ ««¡£££¶Æ¾´À¹ÂÂÇÉÅÂÍȾ¹²¯¹´ÀÂʵƲ¼µºª¨°££ª´»¦©¦«ª©¯§£ª«½»¨½µ¸¾Ç¼·¶¸Â²¾Áµªµ·«¾¥£¢ ¼ ·©¥¢¡¨¤³ ¦¨ª¤¡¢ ´¯¥¤¯«ªª£¢¨©¤¡¡³´º´¨µ²³£¥ª¡u]Z][HGEFLQIMEGGBSLJBEGAVSCH=AGQ1;B7:BF79\YKALPTUSMWRNUJE@JJNO9C@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19f\FCCpbGE§£Ã¥ªª§¦¬¢«¶Ãü¾¶ÁÂÀÇÄ¿ÍÆ»½¹²°¹³¿Âǵ¿°¼·¹¶¦¤«« ¡ªªÄ¢¤©¬¦¬¯«¢©©¾¸§¿²¸·Ç¶µ¹¸À³À¸µ³´¯¾££®¢£¥££ ½¥©©«¡¥½¡£¢©¬¡¤ µ¬¦°¦¯¥¨ ¥¤«±µ±ª¥ª®¬ ¨e_W_[MHGJNLHEDIA>QIA<GII\ROK=HOU4BF9>HG5Ca[KBNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ9mRF<KxeaVK¢£Å¬¡¬® £¤ ¦©¬¶±¢ª³¶ÅĽ¿µÀ»È¾Êǵ¸µ´±³´·ÁŶ¾±¸µ¹´§¬ª¬¥¤Á¥ª ¤©¯¡¦¨½µ¦±½¹·¶Ä²´¸º¿´ÄÁ¹¹¯³µµ£¥¡® ¢©¨¬£Â¬©¬®¦ ½¡¤«¬¬¦¢W¥¡ ¸ª§´¢±®¡£¥²ª©¢¢¥¥¤_bXb_KGJJNFEAGK?=JB99JKN^QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrGE6=ue\KM¡Ä¨¥¡´¢³§«¥ £¬©¬»°¨¬¶±ÇÅÁ²ÃýÆÄ¼Äɼ¯°¶°´¯¾Ä´¹±°º´¬¨±©ª¥¡§Â¬±ª£®°©¥©¼¶§·»¾¯·Ä³³ÃÀ´Ç´»¸¬´¶ª¢¦¤¬¢ §ª°¯¯»±¦ ©©¢£¸ ¡£¯°¬¥§¡¢§´§¦²¢¬ ¦«¯¤¦¢
_cYfdIHLJSBC@IH;;F?99ONV^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<25-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 餪³¢¤µª³¬§¡¤²¬®©»²±µ´ÆÀÄ´ÀľÉĵ¿ÈÁ´«µ¨¯¸¬¿Ã³·®¶¸¥ª²««¦»´¨°¬ ´²¨«¹²¨º´¹³¸Àª·²Ä½µÇ¨¿¯®¶µ©§¬¡¦¥¢¢¥®¸®²µ¶ ©¤¤ ·¢¥¥¯²²§ª¦¢¨ ¡¯²¢¦¤«¢
¨©ª¡§¡
wbg[jiLONNT>CANC::I?77RO]_RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914801-/.<6-#Bqgsk23/1[bZ33806p[bH05IohUCWFyfC;££¡¦¿§§¯±¢©¶«º±¬£«´¶±°¹·°·¸¸Ä½Ãǽ½ÄÂÆÀ¸ÀÆÀ¹©¶¤¬»ÀÁ··ª²º¢±²¤§ª¹ª¦°« ¯´³«©¶¶¼´³¹·¬¸±Ã»¿¿¦Ä«±·¯¨««§«¡¢¡¡±¯³¬°¹© § ¶©¦£¢±±´¬³¨¬ ¥¢£³¯¤¨¡©¨¦£
}igk`lmWPQ[UABET@;;IA7:XPd^PWWEY_^MLRN^KJ>Yc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251--.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=§¢©½¢ª°¬¤²¹ª¦¶´¬ µ½¯³¸»º¾·¶À¿ÉĹÄÂÀ¿·Ã½À·®µ§«·±»½¾´©®±¶«®§®¦¨§»¥¬³«¢±°³¬©¶´µ¾®±²µ¬°´³Á»Æ·¬½°±¸¬¬ª£²¦¥ª ¤³ª³««³§¡¦¤´®¨¡®®±¨´²ª¤¨¤¢¨µ©ª¦¥£
{dkqfoq^FYgVDBMXDZ9HB6>]Qh\OY]G[^]OMRXdJJB\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8)C3YU\gK6zfL@¤¡¥·¥¬ª¦¯®·ª¯µ»§¦±·Å·±¶½ÁõµºÄ¾ÌƹÃÀ¹¾¹Ã¸À¸²´«©º¶º¹¾´©°µ§¬©¬«««¾¬®²£« ±®³®µ²¹¸ª®®±¨µ¯µ»¼Ê³ª·µ±´¯®¦¡´ ¨ ¦²£ ¦¯¡¤£¥¨³ª¡¦³ªµ¥¯²µ¯¤¬§«·£ ª¥¢¢ z
{jmwmu{aFakYIGZZ={JFD6AbTi[M\aK\]ZRRRb`LKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T_T_/5(C_Q\.+B/JGP[G3cYTKD¡±©²ª¬¦¤¯®¶©·µº¤¬´·É»´»º¿¿´³·ÃÀÌȼü¶½¾¿·¾¼±¼§º¹·µÂ¶ª±·¦®«¨£°©¯»¤±³§¨£²µ±±°µ±¸´©¯¬²§·¯·´ÄÆ·©¶¶¬°©§£¶ §±¡¤±§ ª©£¦¦¥¸¨£²µ¬¨±§®±µ¬¥ ¬¨©¸¢¤ §¤ v{lovt{~\Lfm\JNc\>b{GI8GgWf\L^bMXYWUWTi]OOH`]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANGf27'GbLV%-B.=ELQ<3rkICC¥¯¥®¯«¨¥±³´«·²¸¡«µ¹É¹Á»Â¸³±µÂÂÎÅÀÁ½´½¿¾º¾¼²Ã§©¹°µµ¿¼®¬²± §±¦¦¯¥²µ«±²¬©¨µ»¬´²µ´ª¬¨¬©¸²°ÈÀ¹¥º°©¬¬¥¨®±¦¥£¯¤©°££££¤ ¢«¦§¹¥¬¶¶¥«¬©°¶®¢£©ª ¤´¡ §v}
|{|
prq}|}\Sdo^NXf\FD[G;NmXb[L`bNVWVWTXg]QRLcY[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/+1()+,-*&5*/&0)38:1&*3Bc:6*HeHJ+:H>3BHS,>k;GHª«¢ª±¤©¥³µ²µ¶²²¡«®½ÌºÀºÇ±´´ÁÃÑÅÆ¾À²¾À»¾·»Ä¦¬¶«²·»À¯«±¬£§©¨¤°£ª²ª°¬°¯°®«³½§¶°²©³ª«¥¥£ºª²Ãº¶»©©§¬©§±¥ª¤£®ª¨¢£¥¬¢§©¢¦¤«¸³²¢ª¢ ¬¯±¬ §§©£ ¦
¤~
|v~
rqpuk_Z`nbQrp\K;|F?XuX`ZNd[NVVUWQ\a^SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1;\J0.JgDF8;B05EKX1@Y=LE¨¢«³ªª°·¸¶¯«¦««½É¼°½¶Â¯±«³ÃÃÎÏþ¿´ÀÁù¿³Çê®¶²¸¾¾²ª¤§ª°¨§¨±¥´®«±¯®²±´¬´¼¤·³¬¬¯¨«£°·«ªº·¥·¶¤ª§«ªª¡©§¦±²¤§¥¡¡¬ª¡ ¦¥¢«¤£§±¸®®¤¦£ª«®©¢¥¤¤¢£}zs|ru¤xk_`nfWdcN?gLEbyWbXReTMVUVTO\]aUKNhVVVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06VZ.0JgAA<<B+:JO^4D=GFD°¦£«±«ª¶¬¶²¬¦¬ª©¼ÀÀ·¸²»µ¥²¯ÃÉËÑ¿À»¹¿¾Á¸Á¹ÀĬ±´±³º¿½²°®¬ª«¨¶©¦®¯ª¹°¨²²¯³·ª¸¸¦´¶«¬¥©ª£³³©¨¤´´ ·® ª¨ª¨«§ «¬©¹µªª©©¢ª ª¡ ¥¢¦£ª§´¯©§«££¥§§ª¢¤£ ~
¢txt~xv}orgfpw\`rjO^VHnyUdVQcOMVTUPOX[bUHOiTVSGPYUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Ji5OD<±¢¦«¯¬¥°´µ°¬¦°ª¨º¾»À°¹®¡¶¯ÈÇÈÑÀ¾½»»Á½ºÂ¿¾¿±±±µ¼»Â±±³ª³©¤´¨¥³³¹°£®¸²°³»¬º°ª®¶¬ªª¬£ ¶©¡°³¢µª¨§©£ª¡¢¬¨½¯¬®¢¨¨¬°¡¢¡¨¨¨ª±ª£ ®¢¡£££§¨¥}£wt|uxyyrrxf¤vi_ditf|SXo^JxsSdSQ^MMRZfNMVYdXGRhRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[*HM9U@4³¡¥§¤§¤§µ³²«¥±§ª¸¾À»¯§¹ª¦¯±ÉÇÈÑü¿¾¸½¾¼ÈºÀ·¯¯³±¹»¸À²²º¬¸¬¢´§¨¬²¶¹³¨¨½¶®·¾°¾§¬µ¬©¯£ ¥«¨«³¥´¨«§©£¨£©¨©¾«´°®ª¤¡¯³£¤¥¦ ¥©«¦«¢¢¥¨©
~
~}
¡~r{z~|hx|ysno{fxdag`rzlfx]^T?W{mTbPQXKLNru]HZ[gYEUePD>JODCA9HGKS?jbJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GjI14X=fbAJ7GS`U*=9DW=*² ª¦¥¡«¥¸³³¦©±¦¬¸Á½µ¯¢¸¨¨°ÂÉÉÌÁ¶½À´·¿ºÈµÂ´²²´±¼¸¹½µ¹µ¾ ³§««°¶¸µ¬¾½ª³Á´¼¡¯³µª¬°£¦©ª¤¥°§° «©§¡©¤¨¡¼¨®±®¡«£¤¯¦¡¤¤«£¥¥ £¥¬{{}£}yk~vyxc|zpnoqvgsiheg^lsl`io`o=ZylU^NPQJIMTZWM]^lWDW_O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>)49&'.34.0+/4&,:$41AhY14S=e_DL6KVdO*;1NW=#¡¨¥¤ ¨¤¸°¯¤¯°©«¸Á¹²¹¯«¨´ºÈËÈ¿¶Â¾¯´½·Ä¶Â±¹±³À´º½·¨¹¸½ª£´¨©ª±®¹±«¼½¥°Á¶·¢¯¶µ§¦§°³¤¦¨¢¥¬¨© «®¦ ¦£¨ ±¹£±¯¡¬¡¤§¦©¥ª§¡ª¡©|~}| x
|
|sp}qtt`zxhmoomh}qb{mieb\d~^YsjqJIiXZMPLJHPRQIO]_nSDXZRhOHKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-B*,4;NN@;73-.+-7**<%53<fd24M?e]FO=QZgH*>/WU5(§¡¡¡¥¡¸«²¥´´©¨¹Äµ²·®°´ÆÈÀ¶¾Á¹°´¼¶¾»¾¯ª½°´¿°¼Ã¹¨»º·§§µ©¨¬±´±¨¿¸¦®½·²±·°©¥§¯±¡¤ ¥¥ °§¡£¨¯¡¡¤¤¢·°¡¦±«¬£¯ª¤©¥§«¦¢¨¢z~zx
~yzprwoot_ywdjkjgglerkkdgWar^YkuiYE}^[XOOKHHRUG2:_^mPDWUYeMHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84HBf[HTCT]hE.;1^Q,2¤£ª¦¡£¡¸ª°¡»¸¥¬½Ä²¯®¢µ¯¯´ÄĽ³¾º·°³¹¸º¸º¿³´¸®¿Á·«½º´¥¢³«¨ª³¬®²¤Ã·¦ª¸·¬²¼ª§¥¨¯«£§¥¦¡³¦¥©©¡¥¤¹¨¤§¦¥¡©©¡¡¡¡¡£¬££§¤y|
}x
{w|lurmlsbytgfifcmfghdfgh]dbieZezb`PsT[[SKIGIOS@ *j^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB377aL'2¤¥¦§¤¶¨ªº·§¬ÃÀ¶¯¬¢µ®§¯¯·ÁÀ½±Á·°®²¶µ¹¸µ¬ª¼³¯²±½À·®¼¼±¤¶¬¦¦µª«¯¡ Ŭª¨²µ¬µº¨ª«±¥ª§¥¥£¤ª¡¡ §¶¥¯ª¡¡¢ ¦¢ ¦®£§ x
w{~
{
s}gyplklguskagcbsacefehhaenY]X\lcaLgW[`VIGHKMRX>9`liHBUS\[IHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=++,/A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3@bF%5¤¡®¡ ¥´²£²¾·¡±Æ¼¹°°£¶¬«¯©¹¾½»À²¯¯®¶®³¹²§«¹±¯®³¶»¶¯¹¾¬¥µ« ¢²¥«°¦Å¡³¦°³°·®µ¬¯¬®¢§ª¥§¦ ¥£©°¦¹§®¢¡£¥¡ª©§§{t
|
ogynhljgqrk[hcar`dgjnkeiecl\llupaSbhceZIGLMOYQPUaeT@VRZTFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.4<;K6/.+,-24:5#3*)6.55465Z|]1:Kj[M[KXdc@A1HbB'4£±¡©³°¸À¶ ´Â»½¹±¦¶°©®¥¸º¸¸¬»°««·ªµ¹¤²µ±¯©±¶¶±³¶»§© ¶ª ª£ª®¬Ä¯¦°±·¶¬±¯ª¢¤¬©¦¤ª£¥ £«ª©º¦¤ ¡k£q¥v¬©¢x
mi~wql}o]d`gkuxfhvifX\itnNPjcfqf]dfnkh][]
hNKC8ETg^JHPPUVKHRapteF[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl15Ok[N[K[fb>G1Na<+/¤²¡ª®¬£½Å¯©·Â¸¾¼§·±¦«¤¸´³³°¹®ª§¬´¥±µ¢§¸¶µ¨§¶³®´®´¢©´«£¥§¨°¿¨§±´¹®¤¨««¥¡¡¨§¡¥¦§¨ ¨ª£´¯£¢££¡¡¢¥¨rx uif~sx o~|¡ |tvlmhdd{mrbTmcmiqXipnW]hZkjZplyrhY^FN>F^MERVVQPRWTg^LZLRRPEFG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I:/01.*/(-4583%&2115>1<8Xt15Rk[N[L[g_=K1T^7/(§¬«ª¨ª¾Ã®²º¼·Á¿ª¤¸±ª¬¦³µ®¯³¶«©¥±¥¶³¬µ¶´¦§¨³±²¨®«¡³ª ¥¥¢¥±¸¦§§·¾¦¬§©ª¬§¥¡¡¨£§£¤¥ª£¤¦¦¡¶¤££®ª£±¥®¡zÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«±yhlX±®oei¼¼nhzmqØ}Rkb¶²}pu¡ªVNXaOVNFU\XPPS[W[P@\DPNCFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22BE/.32.+/)-/186- /416A1=:Ww11Tk\O[M]g\>L1Z[41!§¨ª¥²ª°Â½²µÀµ¸¿Â«¦´®®©¨°µª¯¶´¨¨¦µ¥¨¹®²²¶ª¥¤§²¯®±¦«§¥³¥¢¢ ¢ ²¯¤¡µº£ª¨¡¤¢£© © ¨¨§¢§£¡°££
¯kjªh
fq©q®¡¤~wº|k v±_j´[¥e`fzfixj©e¾rg¦v±j|±xucmm§n\ EigEu`}f{£¦X_«h}xzj¨8J¯[XTmcZKOX_\VV;NPWV/ISSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3/.53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5^X31¢§¦£¥«²¸´½¾°·Å²¸»Ã§©°¬°©ª±¯¤°º°¥¥¯³£ª¹©²²°£¥¡ª°¬¯¦¨ £¢±¤°©¢ µ³¡«¡¡£©¥ ¡§¤£¡ ¬¦¦ ¡µµy©¶w³·¬k¦z
w«gj±[¬{tpx
°vwqkkm|O¥XHcc~ch¥_yquR]P©ncp{
a/R¢n[Tkg`LK\dX\ZB>°wWXA#MiFBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFBAAD<FD;0201;F,0.840,.(/3,>831/2-D1<<S}n3+Xj\OXM_fW7J9aT50 ³¦¦¡®©¨³¬ª»¶Â°¼Ã¹·Â«¯¯¨¯³ª¢¯¼«¢¨¶¤¬µ¤¥²³¨£¢§ª³©°¨¦ ° °¤¤¨µ¯¡¨©§ª¡¦©£ £¥££«¦¢ Õ¹q±ÂÆ}Ö»}¨¤{¢¥y«yV¯{~j¹Z¹w}¦|zªy{±mt»oP¯§ÅQ zc`ªbsrk^Rµ´È
~|c¤3Bu]PjhdP@XfYdaJGLjJZSOYfZCC?E?0<<59<74<;8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB./0483+-).323971#%5*>3==Qwj6*Yi[J[P_fT7H:aP72%£±¨©¥³ª¥µ¨¤¼·Á°ºÀ²·µ½´¶¨²±¤²³§ ¯¶©¨º®¤°±¡²´±¡¤¨©±©´©¦¬£®¨±©£¬¢§¡¦¡¢¡¢¡¢¢¨ §¡§ ²nhµr¬p§r´ut¶{¦£~£~°uÒÒu\®|
¤nª¦j
}}{±sy³et
nfRÉZÂ\yb__vs
a]YÊoÀtMKµSUÆdUQjceXAOj_liPUFH9=WR[VYHB?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\ANT_eP5G=aM62.£¥¯¥©»¦µ¥§¶»¼²»¿¸·µ¼¼´¦µµ£³²£ ¬°¥§»®¥²±´¸ª ¥¡ª¥²¨¬ª¥ª¤«¢¦«±¦¡«¥¡¥§ ¦§¢£® £¥¢
¬|x¨w£ªp®¨£¢}®³\r²S¯}£~q×}w~w¯w´ael[°WKuyf`^vvgj]¯wwl5yÈ®³_CTo^g`EPl_pmVUM.echRYP;AD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GB`I:77 ·±³Á¨²§ª²º¸´¹¾¹¸³·¾¶¦¹µ¡¶® ©¬¨¶¬¨±²«´¤© ¨¢µ§¦ª¤¥¢¤¨§°¥ ¨¢¢©¦¡¦©¤ ¡¡ §©~¦y¡ªp§¡££ªzyp±Z¨ xtØvt§¤|{²^d }n\«\[hgªcr{jq]«Z kndOJC¡\ZMt]bfMZa_rt_JU5JXHE=GEAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<OedA&Uf[?1T_bL7FH_C1=7¢¾³Á®«¬¨¦´°¸±µ¿¹º³²¹¼ª»¶¡²¥¦§§«²©°ª¶ª¯¡¢ ¦¤¤º££¬¡£ ¡¡©°°¦§¦¤¨«¨©¨ ¤£ ¡¡ ¡¬®nr´t©w¦t´zu´§¤¤u¸n{¢kk¶Z¡eh ¢§mr´s³j
ju´af¢nk\`N¡|Rs£ly~no\¯V<weTon.[§ObRkeblYb\`p|cSYQ>?lo2BB@>M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U^aL5FM^81A8¥º£±À®®««§·©¸¯µÁµ½²±»¸¬Â·ª¬¡§¤¢««¨¶£³¨®ª¡¨ ¥«¸£®¦£¡«¶°¦¬©¦¥£«²¤ ¨¬°¡¢¡ ¡©«Ô»u±ÄÄ~Ö¸y§y¢¶u}wv²aºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡~t«}¾ns¼t²uxmpm¤t½]w}[ay¼jZV[iy^i`dfbmyoX[YCA@q?CG+4H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,;:08LXaF'TcX</T^`K5<L[-6@9§¢¼£°Ã¯ªª¬±¨¹¯·Å±»³¯¼°®Á²¦£¤¢«¥ª²¥µ§¤«§¸£®¡¦ £¯¹±«£§¦¥¤ ¨«©¤²¢¤¦¡¡¤° ª
¶¸x¶wnlotoyrÀ»¼{²¨pt¹|{}¤»¹½uy³£tvut°ufi¶trqw¶^y}gylyb¬pt
~X[§iDdYTf_c]cQgfqmuBMOLD;ZL>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿¦²Â³«ª¨¬«ª»¯±Æ¯µ´°¸§µ¹®«¤¢§ ¥®ª§¶¨¨¡¤¬¥¾§¡ª¢¢¨¢²µ¶¬£¤¢¦¦«©¥¦¡©§§¢¨ ¬¢°©§¢kj©ytv{f{½¾Àºoq
_rjZ^acl`cmvbke^`cqhr|fj~ptx~}b[xthP\n||jWlzrIJo
pNrMDV\f`LZWfc_OZmvjrRODDM<HI<L>2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5CFUEJOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR_I'S_V4)P^L(3>\O'?2>¨¨¡Á¤´¹¶£¬¦®§¨µ²¬È¬°´¶¤¾²³¨¡¤ª£¬§®¤¥µª¤¢§©¾¨©¥ ¦©¨°²¾¬¦§¢©¨¤¬££§¢©¡®¦ ±¥¢¨¤¦¨¤hn}rw´ª
¡z¤
li{}urxyvv|jstudw}vkoyl_b[ogMXYfj_WYpzomfSOFS9PZNRO(+:KB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¢¿¢£°±· ª¦³§¥°µªÉ«²¦µ¦À©´¡¥¦¥¡«§£¤·¬ ª¦Á¬¤££¨¨¨²Ã¯ªª©«¡¡¢¥¯¦¡¤§¬¥¡°¡¢§¡£¤ ¡®|©¨
{
£e¡³®w{~wyzogykuyrhsyujtbxe_hdcdfjXk{qjk\SLPD_UF@>?,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@³ ¹¯¾ª±² ª¦²¢¬³°Å°«¤³¯¼¤´¡¨£¡¨¦©¦¤¦³µ°¦®¾¡¬¢¢©©«£´Ç³©£ª§© ¥«ª®¨¤¢« «¡¤°¤©¦ªf}ecylhjz£«je~g
eeihz¢kh£xkj£slnzyXe]
^lw\gswwowxsmysvzhX]jsd]sik|qmc]QNVIdX@I3=F7?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]]_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[J.6ZO6)EY/DO1YB;?.=¤º½¹¯«³°«¥¨®°¦®®°½±ª¨¥®°° ¡¤¢§¬¤¦¨©³®¤£°¦¶¹¥®£¢ ¦{¤«¢¨´Ã·¥¡¦¯££¤ª¨¡ ª¯ª©¢ª¦¥§ «¡¥±¤¬¢¦ ¬~½s´s
hw¹Ä¸q¡£z¦t«}ËÀÀºq£}À½ÁÁ|zÂÀ}j¥²ooÊzxvyyq{pw
xlube^wc_eb^thmdbXKUIQYHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^_`a_^^^^___]\SMPGUNA@?=6468266*&%#)*&.+*)109*#>I[L*#CP/#F[3PY/UAB;/8¢¹Ã´¯¯¿©©£°©°¯¦²¶¯ª¦§¦±« «£ ª§¢¬£¥¨¥¥´¤£¦®¸´§¯¢¦ ¡ ¦«¤«¿¿± ¨¯©¢£¤ª£ ¡¬®¨ª¥£¡¤£¤©¤©®ª«®£¦¢¤Îz{¥z_]¨¡¡|§u«¯^dª{¨
t³c« ³j¯t|¸aY£Ínv{Û{q~ve{uvl~m}
}k_pjof`_xd[qhjdf`RTSW^JOC5AHED8>5;@?A;=8@>??BDDFIJLNPROS\___^]]_``__][WOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\:L-!P@F4.1¬ÁÀ¿´´°·£ª©µ¬¦²¬¬¤¬¦°ª¡§¦¢¯¡¨§£¦¡°¬¦®±«¨¬ ¥¥¨££ª°¨¿Å²§©±¢¡ªª¡®¦©¨¥¥¢ ª¬³¥¢ªª¤§§¢²¢§¡¡rv¨q±|q¬} ¥x«~r¬v{|~ª¢}«zzVÄ{pÁ}mupmfweoaxnrnlcmsuo`fmd_oijnfcWS\`ZRRC9II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1-+¯ÓÆÇ²³££¢¢¯·¯©±§¨ª¨®««§¢¤£¦« ¢¦ ¨¨£°¨§¯¨§©¤¢¡§£¯¬¢¬µ©¹Ì±¬¦«¢®¬¡©±§¨¨ª§£¡ª¯±¢¨«®¦§«««³¤¤§
¤k¤uz©u{²q¥p ¤_aR«
®u®¨z{f£¤£}©®^{¨U¢{£|İÅs¯´³¹rb©¯Âuhkmkxxwnkfddqqf{ic\V_iXXTLLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ''!+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°´°°©£§§ª««¨¤¦ ¥¦§¦¤¬¢¬¡£¯£ª¤µ°¯¡©§¤¢¨ ¦°¥¢¨±¬¶Ç±´¨«©¢ ¥³¡§ªª¢ª¦ ¡©¢²¬¡ª³²¢«©±°¸¥¥©}ªmv«y|°n¤Ò¸´¸É²_a©¥ zyªÉt£¨©~ÆÆwe¡¥s}¯_oµc±uK£m§Gd{o|myt|zm[ejrqfi^aXcm\^YILLJEDBA=A<A?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4NTQ;<F2,$¨¤Àƹ©²®¦¢³¹¬«¡¥¨¦ª¬©¦ ¦¥«£¯¬¦¡©¥§µ £¨«¶³¬¦ ¦§£ ª§®¡£§©°³Á±²©¬§¥¢¤¯¦¢¥¥©®«¥¤«£¶¬¡±¹°°¨´´µ¦©¥¡Nwz£|¤¦¸||z¹ÌÆÃ¶w¢~v¤¤¨~¯
¬}a¥l£p
}r¬`¤sqa¼}RUu¡z|ryr~o[lnwrjnZc_hnbd]LLQSAHGFH::K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,- ©¬¤«¹«¯ ¢¬³µ¦¡¥¯®®¨§¥¥¤§¡³®¢©§³ ©¤£µ££¡©µ¹¤££¢²¦¥¡¢¯¤¨¢µ±Ã°©¬©§£¤¥¥£§¡«¢¤®¥»¬¢·¶®¶´º³µ¨ ±£¦ ҵ÷z
¦x¢w¡
¥r«´nri¤}s®¥£¦mp²\¥szl{~n©a¢rr~bs²¸hw¤|u{xlhwixsnt\ddmmfh`JZWX<HF?S3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH#)%r®¿¿¼»µ¨¤®¶¢¢£ª§©ª¥¢¦ µ¦¢©§±¤«£¤¤ª´´¤¥©¯ ¦£§µ ª£µªÂ¯¨ª¨¡¢¡¦£¦£¥©§« £¬¦¼¬½°£±µ»¶©«´¦ª|¨}|°x¤¥m²o¡|¢¨¬
¨ £
{~««w y¯]£|¦§d|uj®]¥lr
]`[ m¤wy~il~b}tmy_gepogghBY_Z=JS2S8AAC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI8152.*,ATVVVUTUUUUTTUTSSVWWXVUVQHFIJ#((¼©ÆÃ·Á´ ®¹¦££¤ ¯®©£¹ £«¡°ª®¡ª©¥±¬§ ¨¢¡¥¡¤¨¥¶¨¾®¤©£ ¦¥£¢§«ª¡¢¨§¼¤Ã«£¢´¼°©£¶±«w¯~
|ºd°e®}¡§
°§¤¢¢
\lk³`|{²lfn±Z}´[¤kÈ¢f|»YvµZ²}S¯z¬X¡m¦xw}cs|bwt|ajfomfeeOUc\AT]=H(>9=4!!,$2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UYXWXWWXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·¾»´Á³£¦¥·© ²±¨¢µ ³¨ª«°¬®¨¢¯¬©§£¨®©¡¥£¢¥¢¨±¨»®¤¨}¡ ¨§¥£¤¢¤©º Ƨ¦©¡¬¶·®°©¡¿°°°ª£¯¤¸Ãº
¨¬¯¨¦«~սªb¤¿½}£×º·µ½¾j£o«nz²±Çk«±½¬yx¢¾»t¤wyb|ydfx{`kejjbPb[Si\@T`BL)<:4/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´±À¹²½³¢®§¦³¦¥¿©¶¯§¡¿¦¦±±¹¨®¯¥§¯¬®¦£¬¡¥ª £¦§ ¨¢ «¬©¸¬§£{¦¨¨¨¨¦ ¢ªº©Å£¡°¤¬´¶¬²¬£¿«²²uvª¥·
e pg¬nnw¥ v±pr©¤¯¤rlmmfxomqzipigqhi
gqd]cioZ]g~x¦`brpfd z
tdwgjx~ydlcflbJeWJkY:PdDP'J9+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´©º¹²´ª©¢®¤³ª½±ÃǼ´©¿«¬£ §« º£¤®¬¦ª
¦ª¢¤£ ¥¦©£© ¥¥¦®¹ª¬{¦¦§¢¯¥¢«¹°Á¨¥´§±³¬°®ª¼§±»¢©¦¶£©ª´¤¢´¤£¢£¢¥¢¬§¤~gtwtq§m}
phvowv|yiledocUaX@iZGb_MX+E=+&!640/ %2(*799469;>?ABDFJKKMPPQWUVY^_ac]^TQJEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¤µ·¯®¢°¥ ¶±ªÄ¼Ã¹¶©¡¤¥°¨¤·§©µ§¨¬£§¤¡¨¤¨©¦ £§ ´¹§ª|¡¤¨´£¦«·¨¯Â¯¤¸§°°²¯«¬¶½£²À§¤¦µ¢§©¢±¢¤³«³¦£¦¬ ¢« fuwztj}
xqryq{~jod_pi`\_YmbP`bOX9FFE=2<=8/*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤¨£°³¬®£©§ ¨µª£²¹ª«¡¢z¡°¤¦±©¸¦£©¢¯¤¨ ¡®«¨§¨¸µ£¥y¡§·¢®µ¢°°u¤¿¤³¡y{¢µ¿x°¦¡ªd\bw ¤~mµ¤©°¬¥f ¡tzpªl¤©e¥
xkvq|ai[vggqy¡dx
vhnykpe_vokkg\ecaamQY=MMNRF=@TB91/&4:306678<;>@ABFHBGGIKLTUUY]`hfgXQI<DG<9UR[`ab`^__`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«ª¥©®£§¥ª´®°¥©¥ªs¯ ¨«§¹ ¤~¬¤§¢
u®¦¨£¹³§ uw¥±µ´½¨¢~§£{¥±º¨±©¯¢y¬£©«©w¦{§{³{ bynqzqt
xht s{~ijx{qpgexnilj\diidqZ\GSKQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aaifYQH9DL<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah¤¦®®«¨ ©±§§ª¥¬Ä¼¯ ¥§´¬§¢ ¾¡}¬£¡¡¨¢£¹±§
pu£«´´®Ê«¯·
°³²©©|¨r{w¦h¤y´¡ ¨ªÂ«¡r¥}
³¡}¡|
nt{s}
uÅf©¢jogwt{vghupghk^bnlfjWdE\PL2E46M`c7&3<EGD:63658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@IdX]cfhgbbbbcc__babcccdiicbbbecafcbbi£ °©©¨¦¬ ¥¹±ª«¦¡¤©¡£©µ¢¯ §¥½ y«¢
v £¢¸¬¥bm §~¡§ ® ¡²¤¬~¢vk«uM«xª©ª«~¡|{§jlg·~n`cX{dgs}yl\|n`Sq
\`mz`Ye~
q¨«k£nr¥ogdlZlzeY_~aWPoventqjjo]ioljgWfM\WE9A4GC^k4+ICQMN=84859;6@;;>BO>QRKMBJ[]_W^_cu`ME:MNMTb\[ffiibbdbddbab`bdcabjkdbddgdbgeach ¹¡ª¤¦¬¢¶½«¯¢ ¥««´¡§ §´u¦~
¬£¨¥¯¦¢in¡¡¥£¡ w§£©¬°¥z~}¢ps{ymª}¢tw¦g~w¥^{}s¢n·´ºs¶¨dƸ|q¶q£ct¬«a~j³~n~q£lr£r~£^³o{³tr[²ibptuqhoXjkqpd[f\aKD=D5QAYp2<RG_JR=<395::6C<;@IP?TNNQ@E_^[YX``{dIC8LWUVcaZffkkbbeadc`ab`dc_`cknccddhdbgfchh£¹« ¥¸¶ ¡¢£¤¬±¬« ¡¥¬x
q¡}¨ ¢¨§¤~k{} w¢ r¡©¨ª®®~z y£xs}¨£d¡~mho{§}rhtªsªg]
vhªj¸f\©pa_§vwhu~mj¦\¨~w»j}©Z]³g\nqxwki[piwwa^cVaAPEO7VBRm4JZZ^NZD@151;;7H?:CHU?YSX]>Db]V`Qac|iEB9N[]XdfXffnmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬»²°¬¥§¬°§ª£¢ £ir{z¤¨¡iy{}¡ ¡rh p©¡¥ª£ª~°¤¢¸v£³¢£xzª¢r¡}°µ}l¡x~µ££«¨||tªZ]o{xbM{{
dzBMY¢js|ovy±³~¦t~mq|ori£]vHec`sp}}ne_kguzbb^O]V\TV@YEPfDRV\aX^ID=B8?A:HE8LEXAWRZVEFa\Z`K`m}qEC<U^bZejVghmobff^a`\]^`hb_edvl^egfldelhhli±®S_¡§´º³³©¢©§ «£ §¡w
ny}r¡r¨|l
q¡x{¢£®}µ{¦z©£ §hxn~s sq|
o|¤§¤p^©hv£dp¦aÓ|{xrsc¢~¢r£vk³`tª²¨¼wn¿¦ª´^orps¢r^¤gt¦`h¦lÓznvykyvrl©¥g_dyqlhfcmuvf^`QZePQaHVIT_WS[dj[ePECKLJKAJD8P@PMXSXOSQ`eeiSdxywIFEc]eZhiSihjncjf`c_\]]_hbahe|d^dgdkdjlfhlh±¬T]Kª°²µ°³¢¦ ¢¤§¨
{p}h|wpl|£©yvnw
y¡£³¡¢¶z¬§¤®¥p©~¥£q£¯¤¯£wµ¶¶É¢s`©my u¡x ~oMf£qs¥{zubm~ lrd`stk{j´¶´Æ¦s}yj«tlswiytqPD}³^jukxfkfbstolU[RXgORgIULXRU\gknUgWMJAJMKGJNAQJPdcjmeuss~x{nuz{TQNm^h\kiRjhilgmgce_\\\_ibdhk{_]dgcjfnmeile¢°¨
e@¢²¬¯¯µ¡¢§¡¡£¤¦¥ykyeyuj
z¥¨z}yp
y~¤¦gnxl¢d|r¥xph§}¥{¡rv¹m¢b}£nsk«ku no¦`iiu¢~`uobh¡fjupdgor¢[_[d¡n^q|trd¥nx¢cf§grm¡oRn ^d§T]TmmrkqmphkwsjnQVUUeYSlIXO\HXhhrjYkVPREV\MXSaUhj^wu{|p}|r{sww^QsagbpgPkhhklohdg_]]]`jbjivu]\chcjirlfkmc¥¦zetm§®¥©°±¥©£¡¡¡¢{qh|st}|e|¦¡ª
}si¥}
©¥¦x~¥²¯¥y{©u¨n¥¢¼m|¥¯¢~¦|r¨¡h~o¬cx¨mª£uw«¦k±lw³©loo b«ªw§w}
¤ hu«f¶sv¾£Y¦«aurto{upbj}nglRTXT``\kL\R\I]lmv_[qX[_Zgsemoqcqt`wz~yryr~{{vbydcnsdRlggomrifia_^\ajbll{o\\bibmiwmglnb¦«¤ªª¨§£©¢¤¨
t
zo
~strn}{
¤¥¤unl¨ª¢ t~x¯¤qy{s©r}}zx{}}w¡¢
{l\zyszqio~qtqe_xvsupzooo
_wixfªt}io~u|umlfsx{wZjWyinwrqowxo]k
nhgVY^V\djcU`U^Q_owykjwejjju|pqtsaoubs{xuyuy
}{mmdyn^Wnghukxjiid\`ZcielqunZ[bkdlkymhloaº©§¡¢§¤¤«¡ª¦¨~r||~{trp|}y~£{¦
wqª
¨ «~¨¨xq
}p«q~qjo|hn] srulvtYro~j]id{
`ix{|vizlbqsw_s¨glvnwmdeczzZ[ifmv[{ywtnsrf\mkkbYX\YXjqZ^`Y^]er}ztotcjji{|rzvtdmthl{uz}{yyp{}s~zrhT\rilvpugkgd]aYjhkjqrmW[emlgryohjm`«±¡£¡¨¡ }«¡¤{
|r|v
ros~z¥wz¬¡ª¢¢££«¢¨§¡~z©±¥±¦¡l}wwf}
w|{u¤ wqux§z
uj|yiqh`sp}{wvowt]^ogn_^YZ\SgpUc[[alht{{rnpcjih{mx~phpplf{rw}{m
|zy|~zxNdvjsnq{dkebb`[sfpfrqlU]ltmhxzpgikeº£¡¤ z~©
|y{mxr~mk~z~|©r|{©
¦¢¦¡¦x}§|}ª¡© qyruav
nzvu¤u~~ss|
{y
¨tymj|{mhklf^yh|{vtvu{w\`p}nt`cZ[^QflSdZ]`jhty~pllcjjgkrkktnwnynv}
wr~{{|{`i{kuhjdjc`i\cugobumlTbqyeoyzrejmm¸¢¤zw¤¤yz
{l{xr
}|kh}|~
|¦p ¡
|§w£ ¡£¢¤{¡~|¤ ¥vuqwa~s}q~
hxrzs}}rz||{¦{
s
xdpz~xypkjf^~si|uus|sj^`tvpwdcX]^RihSdX^_giuxqfkclgejm}gmpj}w
zkr~uv|z}jrntibhlb_qVtolm`xhlWjtvctzzqbkoy³¥¦ {u£¡x|~~p~ztu
~wgc}x}y}o
¥¦v¡¡y¥{
ys¢ ¡}xr~n{d|qk
fvp}~y}~|ryz
£vtxs^vw|s}vfkd`~jkwssu}q|ccasnurmaY_]ZkcRbW__gjty
pbjclfh|khthloh|yl
qt|~z~|muttmfljbcuVipm`yglajvpex{yp_ql
¯§©
|v¨yx|}}{xsxys}d^}
t}~~£ ~r{¦ t§um|o¢}{qzkvm|n
xo~~esj}
u
zwy~}¥y
t{~qr~k`ytyp|nanbe{bnovsxwstav`oluno\Z^]]i]O\Wb`glrzj_iejchwmflhilg|zwns}tz}z}|ryxxmlkh_irbhqoevgmlazhj|{wpawm«¡¥©|v¬|v~{||vwotszo
}~|a\~rzz¤}|£
n¢¡pg{
p¡~|tsukqov}uort|}ernz~
uu{p}
ª{}~v|nl}afwstnza^o`kt^pj{yylrpey^nlsmsXZ]_aiZOVWdbgpqe]ihgbgqnchheigzwuo
s|u
x
|xzw{zryjk_phtkqnmqgoke{bnzwpkww££¨¡§t¨ s|v
xyrs{
kroymvnq[Y~vu w~
m¡l¥
gx~}}pvplnoq|jsqxuzgtpw}
{{xur|{
¥|v~wwlh}~[qrqoovY^o`pj^oj|zqnmjmw`pokqmYX`aalWPRYeebuoa]kmdcekm`ff_gjurrotyvy
~wv
{{vjqb|b
|oplujhnlvw_q~y{sus~¥§
~tzrxtpr
tqulnltlv}mnUQ«xvry wz¤
}r
jh¢
qw{{|}lwjoklm{bz~wzx}zhumv|r{qx{{}|w|vogi~v]vnmkprU]nbra_mnyphpfgsuhplawe]Ue``pSPN[ed]xo{^\hqbbeei_he[go~okqs}v}
uvy{xs
~|yxgrj`~ook{`imtt_t|xwss
|y¡±¦~wtwspp
spqojiumn}|musRNᐙ|ptuv{r
¡
}x{zxin¥cpz|z}m|espkm{z\z{~{ziukt~mp~
{}wxwrkdn|igsnghslS]odpZ_lqwgkkbgxsppd`x`aUk_^tOMJ_fb\xpt\[eu`addc`fbXistnlqv|tyvw~szq|~vesn}enpkYknyzr`vz{vrvvz¯
x~{
uwpyqoomn~rcdwp|nz|jhlb¤ÁÜ®ï¢sluu¡np
£
~{vx
vxp¦^l|~v~~l}dxujoztX{zzftjmwo{utxtrpdrv_rloahtfR`pgkU^nsyarc`i~qrn[cracVnZ\wLLKcfa]vrm[\dx^`df_cc^Xirknkrw}swxx|q|}{t
shurym{ntpWpzvyqdvyhvq¨£
}qxx||swpsjoljm|t^`wv{ptzg`e|ëÚµÉÃÜsltvip
|zwxrvr¤
a
h}~
rrwhvritxmZ}}vbum~omz
}nqytjoiov~]rhm\it_QdqhfS_qvt`p`]hqsjXgiciWmW[tLJKef^ars
i[\ey^^dgz`d_]Yknenjtw~sr{vzs
|vv
{vlwvyxunwz}Xy
qngxvdv
q¡¡soqv||yrtnodr~iflww[_x{zqqiagaÕ¶¦xnqw{qj
zh{{~
zu{|qvx ¡¡af}~m}ulmwutwvkc
|
p`tr}}zr
g{
|
nox~tlmhiwz`giiXktYRhribPbrxmbe^Zjntb\h`em_oTZnMGNfd\fnqkZ[cs_\ckvde]]Zllbljsvqo|}txx
|ux{voxy{om{v^tlhzssgs|ruu~mu}|v~vqoljat|gbiuyZ`w{ymq~edhhW_rs¼Ävq}qrj{|
|{uvw~ru
rw~f~
q}f~|y}i~vgpyxswtlky
l_sy{~|sjz
y
~~nmz|usmee{sa[pbWnqSSmrhaNguxf`^]YoosZeb^jn`pOYjQDSf`Zjnm|nY[]mcZbpvcf\]`kicljsvpm~|tuz|
v~xtryy~oo{qixz~ml{ukjxtk n}uiw~yoztqljd`szh`eqzZ`r|ygqyaee±²wKbZ¥ÙÐq{w}
nk
zy|wwpqu~{jy
¥px{
p{}mwh
yr|e~vdqsiyqpu}wy
zk\rs~{sor
s
{
ynn}~uyceh{n^XvZWpkNWqrf`Klwta^\[Zu~spXg^gkr`oNWgR?Xf^Zokgyq[ZXkeYcpy^g\^elgfkiqwol~uo{vqq{|zyujy~ko~t|or{zon~xg¡
gogy}~|ixskkf_aoym_box\dkyaqv_eeÔê½2:>qx
u~~mku|
|wnvwo
lu{ufy¦~nvx
|{w~jrh~yn||wbz
rdri~nvru
tv~so\nuy|~y{rm
szumjvts[ggunWV{RYodLZrre[Iqxo\[[Y]u~thYb[hfodjMWeP=]e\]ue`uoZYTncYcqyZh]`gmgikipw}miyn|}zupnw~{{hz}js{r
zsv}~yx}|kl}kh~z}~~}kvqghb[bgso_aks`hpybst^cd n\5Z¯µti|u
svoltyx|y~rgv~~oqivynfy¤~ow
|pz}{h~lj{zj{wr`w~rdrgvnu|}owz|umYqwuxv{ytos~|onimtm[edqoPZzM[n[O[rodUKsxiWYZZaqt`]]`gdiifNYgM@`c[`u`]ulXWSt`ZdorWj^bhjgmlhpw|lh}}p~~{zwq|oqw{i}{mwxvv|x~}zm
£{uxklx}z~prqcf^Yf_oo_`gpfjntato[adjv{¿¦¤È¸qr{w
srro{tttwyypcwzirvgwucj|~su{
z{kxy~tgzhkytizw}h`x}kkth|jv{~q|v|tbVx~st
}qxyqq
z~vwjqilqo\f`qlIduK]lTSYrnbQOtxaRXX]aps[a\ieedkdP[pICc`[co]]whUWVv][enhVk^ajgennhpvzmiy}r{~y|v}pwrmw~p{wxztx~yuo~}
zw
{ht
y~{vgpn_d\XeYmra``plkhnatiY_dnw©Ú©Ç²qwotz
ytst}woqm
t
xtk`zyfrpgun[m}x~y|nxv|
ltu~lgvdm{vmjww|abxziuuc~|hu|uwq{}nZWupv
zmtzlv
|~z}t~thtenlsZh]sdGmmKZ`WVUwmbPRtvXPVX^aro\`cmed^ocT\qFBe^]eg][{bQV\t[Zgk`Vj_`offkqhpvxtkvvx~w{t}ortqu~
zvx{|
w|}~{~ruy yvtx^}
xs
wzbnm\b[[aVisc`[gnpfqaqfW]ck|Êι¡jmmlqq{~zyxsxut{jlvcuvof_}zerkjqcXlz
sx}ost{y}qpo|fhqbmxqjlqx}}z]ezxjvxfwhu}rjo~yo}]Ysnu|opqwixx~s|u}{sgsankqWi\v[GmjLVU]SU{kaOTurPQTW^ct
i]`ljfcZoaXboGAg\`e]\V{^NUepY[jh]Wg`^rejhrhpswxntzx~yur
pp{xwvyy{t}}~~~}|xuxx|muxd
so
ztdnjY_[\]Tgrd`YdqrgrbkeW[`jx¾®{·nas
hszqxz}~wwrvo{vejoausjb^~xyfqhkkZVow¢qrzvou
}xtqnhx_jl`mvjgjlywzvZg}|yfs~m
ueupgk{unub]q}lu}|gv~nqivyt~m{|{yqflbn}llUi_vUJijNQNgLX{haNUukLQTU_gvf^`qhgbWj]\kgJDjYbcVYUyYMVmjY]kd\Yec^temdqgrpuxqv~w|
}usnsy{zss
x}u~|{~{v{wwziv|{lrp
pglgX][\[Sdpd^WbrujuoeecW\[hporsddy}isusrwxvrumjzqagkgsmf]_}p{imxgjdUWro¦|{vt}t~|o~}x}}upqlgt\lg^ltdgeizo{rYhwuhpxwbw|ojm{qgtfanzhsx|cwwjlru|r{{thywodfbm
{ljUhaoRJhjOKNoG]zfaMUtdJOSWakw~f]gsif`VdWbp\KKjWcaUTUsVLXudY^k`[Zce_vgmbpitor~ttwxz}u
nrt|zuq
zus|
}}z}w{£¥y
kt{zuznsy}vojieV][ZZSbnd[Xas{jhmi`bX_Ziikogl`hyxjrssmz|utmzhjyj_enhvgeXbwj~{ojpgf]TXog§vz|zvqqux{zvvjruggn[ld]mr_gajxh{l[nstjp~zxaw
y
trpzsdri]qxert|yctqgjyusmyxvye
|ywqddcm{|jjTgaeSJkgOGQjE`wfaMSr]JMUZelx|f_nqid]VaUnnVJSgWe]XMUkTJ[y_[_k]]Zbe`yhlaoovnpwuz~wyzyz~qtt~zvt
}|kr{
~}~{w«zkryu~tnn|sjpnddX_ZYZTbjg[Z_ui^ml\aW\\kert}ii\kvugsvql{}|xurlygixf]dshzwccTeph
xxgijaWVYgc§o~w{qri{q|}xs
~ndurdgg\ja]oo\g_mtezh]torkq|~uvbt{ysuvbqn[rtcqs
|uesmam{pkj|zvtgv{zvqebdmr}ikSg]\TKqbPFU`GbvfaKSoXJMXXhkv{eenqfdZW^XweTJ\bWgWYHWdPHbxZ]_lZ^\ac^~ij`otxmpnvzr|}uux|suuyzz}~isz~~
zz|sq{{}dqys|zurol{~lzcpobe]eVYYWcfk_]]s
hXqn[^XZ\l{bpwulaYlssgtuolx~xvmntdhte[gufvvz_]Rffkt~bdj\TW]bc¤ixsynq|jzo}}vty}yidvl`f_^i_]tkYe]oobze\w|knnpxytues{wpstcxe\qqbqr}tgre_nwjehz}uopvt}trb_fmn|dhSgWXSMv_PJYWHbtcaITmSJMZWjlr|cmmscbZZ[aw\SKc]WhSVFX`MGiuX^`l[[_bb\ihanxymojvym~vtttqvvx}}~~~pw|yxz~ttq¡zzwcuxswtktn~kx|ps^pn`gblTZZWhcmf[\qeSrn[ZXW`lvciuji^Ymspksssi|~~zvnnldiqc[jrdtvs[WSearr]bc]SZ`\ceqq
ull{opr|~}sxt{z{deug]bY`g[^vhWb]phawa[|vijroxtsuiq
wtkq~ogxX]lncrtztgp~\`prb`ksmnvsqxkqa\ellz`fReSVQOu[QOXQHcsa`GVjPIPZVkkk}fnoqb[ZXYlqWRPfVVhSTEY[NHruX_clbX``a]jcdmzxlpiuy{k}|y|mrnvz|t|tx
utqvp¡szzewnmznfxpzksvsk^unagekR][UgalkZ\qdOon]VXUgishbted\Xmtloutxj|{vscdkna\nmcsxkZTVcdx}}q]d_cTZ_Ybcmp
tki|pguxu}m{uvp{v_frc[]VacXaueU_`mdaq]]~phitqtquwkm
}rsgprtpT\gkfruwtcmvVcrl[_pg~fnx~stsknaZdijw^eScTUPSlVPVRPGdr_aFXiNIXTWnie}ilxkbW]U[tdSRWhQXfTSGYYOMxv[_ekiYa`^^nbfkyunoivvl}{~krft{u}r|
{ss~vn¤rvwlz`d{pfysxlmqwgd|mcfghS_^Ug_ln[^nhNim`TVSogskexdd\Xoslqzwrl{vzykaelm^`ojepx~gZVX`lx|{p_c_gVX_Wcbkp}xllzn]xsn|kvtop|sXjn^X\UabWdpcS^biablZa~lfltvomwwli{nrfr~ntnd[aiiptts^imSeqeVcod|dsx}wlpmk`Yafgt\dU`URNWdRO[NOHdo\bGYiMJ_KYmd`yin~d`U_T]u\SR`fN\`URI[XPYtu]_ekhXba[^qcgjxqsnhvt{rz~|yntkst
y}|
sstxro~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffh\CDDDDARÌÚØØØØÝm=DDDDE8.////+H
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____aR455552FØêççççíg.55557':|}z{z|}{|~}}}~}}~~~~
|yzz{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~y{yz{{y{}|{~~~}~~~~~~~y{z|{z{}}{|~~~~}}~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}}}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}~
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx|{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvutvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfgggihgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{}~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{}~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;899;;:@;;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrwyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;89:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqususqsxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<979::988::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;=<>?=<=;:<===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{}~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~}~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@=<=;>=:::<:8988:;=@?<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFEHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@?>?@=??><>@?===?==>CD?;<=>@==?AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCDA?@@@?=@><=??@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBBC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>;><?=<:>=?BBE@??Na_J@CEIIIILMKECFGHEGEEEDDCA?@>>BFJJGEEFFFJNMKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|{{|~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@DED?<ACDB?>A?ADDDCWu~XGHJLLNOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnopqrvvy{{{z}}~~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJHIGHHIGFBDFDDCAUtWILMLMMLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKJKMJKHHFFGFEPl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD???DFHDEGIKIIGHIGIIIJIHFJJJJIJIJJJFILLJJKKfopsstvxy{{{||}~~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKKMLKMLIFJVl
uIIFB??@??><<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDBCFHIHHHLMKGIJMMNMJJKKJLMSlortsswyz{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHGIHKLONNQNQ^r
fBB=88::9878896479;<:8567789787689;;<>A;999==>;;=ACEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@BFHKHLKNTg{T;8656766646763468:876565677778:7778:;7689989876:<@GFIFIFEFOSRSSROPORTepqsttwy{|{|}~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:<DBDFCCVx
H676468874578467799766765::;::<89899877:::8878589;A=>>BA?AKLOQPQOOPQWkrrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897:A9<GR`|z>:88;<=>9:;<89;9:;:99;:9===?;;<=:><:<;<;<<::<8::;;999<?<=ABDIJMKJKLWortutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989999:>=>Ow
l<;>BCEEBAAB>@CA@?=>>@?>?@?@==?B?AA?A?=@A@??A<><;:;:9;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~REBAGJNOLIGK:8:;9::;<:::<;=>@>N}
^>DGIKJJFGGDFHGECA@CECB@BCB?@DHECEDEEAFEFDFFD@B>=@>=?@>???>?>>:;=<`qrttuwzz{}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:=:<:==>>;><?>B?L~
WGLLMKNIIKHIJJIFDDFGFDCEFDBHIKGHGFGGEKJLIKKJCFCCDBAACBDCCDDCA=<>@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97;>;<:=?>?<?>BAD>g
PMPMKNKJLIIJHKGEGHHIEEHFFELLMIJGGHIJNMOMLNKHFGGEECFFFFDEHHFCA?@Lmptuvxyyy|||}}~~~}}}}~~~~~QA?>?FGG=<@@87<:;<:=?<==?@CBHS~
qMQOMLLLLJIHFJJEJHGKJHJGGGKLNLLHHIJMPNONLOKIGIJHIDIHHFFGGIGCBACUoquvxz{xxzz||}~~~~}~}~~~~~TDAABGHB?8?@8:;7<=:<?<<=?BCCLm
^RRPMNMKJGFCHJGLJGKOLKJJLMLOPNHIKLOQPPQOOJIJJLJLFGHGFGIFEEB@BB\prwxyzyyyzz{{~~~~~}}}}~~~~~UECEEGGED;?A;=<8?==>@ED=BDCFJt|WVRRTROLKJEFFKONOWVQPOQSRMSTOMSLPSUWRSRPLKMMMKNGGJFFIJDDEEBDCcquyyzzz{z{z{|~}}~}}}}|}~~UFFGGGGHF>@B=?=<A?AADTKBHIFIKx
gVVkaERQQPJ;;QSR`u]UVTVYYRXXRZfPUWZ]RTWQPNRPPPQKKKGHJHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??A@EACFDCDKVPJOONPQy
}al[dU:XXXSP?@VUY\d`VYbr^]V]ZVEQYZ\Y_TYgRUVXTTVSOOMKLJIILMKOMSotvxyxwyzz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HLIMPKIJOSQPTVUWUv
g;~znpXZ[ZRSRWVTZZuYU}a\X]^WIV^^[[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxyxz{{|}}}~}~}}}~~xy}YNKJIIFBD@A:OQQWXPPPQRSRVWWXXm
n~fYY\YSVTWRQWVcQerXZW_hP`fZZX\hbGOZig][\]]WSNSPPQVVVVYZosuwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZZRSQOQRQURUSV_ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^SPPPINOWVX[Zdqtvvttvxyy{{||}}~}~}~}}~~~zxwvsu{tk~~kqy^[VUSROKFCDAM^lVRSOOQOQVQSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRURMOYQMNQSUUMQSRPNLLHCIGRSTZ]mrvvuttw{zz{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt`d]^[YUQLILIaltPQSMQRPS[RSRQRUUbs{|~}{{
u_]KC>BBCCA?DPCC@C>BHGV@INMG]iQHFOFDEFHGHBCHGHJGDBAC@NPMRdtuvustvy|z{{{||}|{~}}}~~||}}vt{mh|gnqfheeb\XSQPURsWe[OONLQRPUYSUQQTROV`klsvz{xytrnstsyx~~kLG>>::>@?>>>jPKaEFHIEB?HMMGMQUJBE?><=<==?=?ACB??<=B>IMFUouuvttvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJOPNKLQRQTUUWQQWVPX[b]agmmlnjh`nrimlqu{z}{xz||xwxdB@@A<:BCAACA[\O{NOONKLMOOPLKLWNHGAA<977599=;;;8989?;AG>\tuvvuvwy|||}|||}~}|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OO^\ZIGOQQOMPQNQRSVXSRYTNYZ[WY\_^_e_]^qwk^`gkwooljonnlfbYGFFHBAFHEEFCLQOaWRXQPSSRU[OOQWPMJDF>:96587979:365795<B=ftuwxwzy{}}||{|}}~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKSTSPQUOLRSTWXSTXQLXYYVXXVXY]WXXhsk]V`tkaa_]d`_^YUPMOMLIGJKIHFCPOSZWTTNQSYS\eUOSTQNKIHC?A9988978847578599Gnruyyz{{}}}}|{}|}~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVWXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNMMLJFPPUYSTOJNOUST\VRUSSOMLIHHF?>=:787659967565Wqqtxzz{|}}}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXWYYYRUOIGOPOOMRJOPOONNOTLMIPPSTU2<XMIAQ=c`QSQPNPPONNMPNTRPRLILKORPQRSTQSOLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWVQSFFAFGGHFJDHJHGEHLHKIGLMPMG/E_R=3@>joaRRQ@GTQOPPQNQOPOLJLLOPNMPQQNPOJLMMKGEECB;==<9=G6676Dnquwz{{||}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVUYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORB8DMS]gSQSAGUPOQQPMMNLJLKLNOOQLNNMIMLIKKLKGFFED<AA>;@E;<89Trsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A>==@@B=>EHFDFFIGJJ@FAA@EGDIOHQRa\QPROSNOOLLOMKMLMON[VKMQOHJHCIJLLKFFFE?BC>=BG?B?@druw{z{{|{zzw|wy}~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;>A@@>ADIECHGIGIEBB?><BA@GJEMObePMOMWKLNKKMMLLKNNSdMJLRIIIEBIJLMNJGIFBBB@?EFEHDLopvzyyz{z|zwtxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLLIMPMPOHKE?B=999:?B?<ABAADDGKFDIIGGHCC?B>??@>CEDLMQTLJIMTFIIJLIJKIJLMOPQPKGCKGCCKJLNONIJIGCCCDIJMLIZsnxyxzz{y|vrpurtyyvxjqnjllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHJCFGHGJKIJLDGB<>=:::;AB?=BBCCHEJLJEIIFGHCC;A@B>@?BDDIMOGHJGHKDHIKMHJLHIJLJM]RHIDNGBELKNNQNKMJKFGGJMNRNMcnjwvw{y{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthepFJCFEFDEEFEGCC@=<=:;:;AD@?BCEEIFJJLFIIGFFDB:ACC>?CCCDGKNHJNHDHEILNMHILGFFIILNKIHEOICGNMPNPNNOMKIHIOSQRNSggfrosxv{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhmf_pGJCEEDBBAE@DB>?>;;;=;=?DB?ACFGKGJILHGGGFEC?=DEB>ACBCEGHIGMPIFFGKNOKFHIFECDIIHKIGHPKDJMMQNONOPNJJIMRUURPXeaamfproryzgehhcilfqlflmgiklsmpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEDFBA@AD<BA>A=::=?;>?AB?@BEGJFIGIGFFFDCBAAEFCBBBDEEGGHFLPLIOJJLKIFHEFECCHHHKJGKRMCOONQOOONOOKKKPUWVVTY`_]i`minhrsbeffdhhfnifmmhkkmriqvusqmvnoqrswsrstuuvvvwvwvvtwuksunutsprkksMGGEGAA@CD<AA@C<8:=>:?=@B@@@DFHEHFFHFEEDCEBDIFCGEAEGEFFGEJMKHQMJKHHIEFHHECIIJKMKPSNDRSQQRNOMOPMLNSWVWYVX^Z]d`hcjigk_defchggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHAABEE<@CBD<7:=>;>;AB>??CEFDFDDGECECDFFFJEEIGBGHFGFECFJJGMKLKHJKFIHJHDKKLLNORTOHTUTQTPQMNQNMQWZVZYWZ^ZXa```^hec`deggjhhjghnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGICACGE<@EBD<8:>>><<BB=@>ABFCECCGDCDDFGGGIFHJHCIHGIGFDHKIFKHMKJKKHKJMKINLNNORUVOLVVTQTRRLOQPOTYZY\ZZ\__]_c^\bdlc`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIKHJEBDGE=AGDD@9<>@?>?CB<@>AAGCEDCHDEDFFHHFHGIKJEJHHJHFFLHHHJGLLLLLIMJMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[]^``a`bf]d`fh`ehjdssfjhflprqossnswwpuvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwpwIJLIKGBEDE<AFDDB;??A@@@DA@B>ACHBEDFGEHEFEIHFIHJLHHJJIKJFJKHIJJGKKMLIILKMNNOLOPRUWVMNTVUSRQPMNTSRW[^^_]^``aab`cdeadicdijgvlkigmosqpqpprywruutsmmssmqrotuuspswtuuwvuuteqskpqjrvpwJLKKLGCCAE<?EEEC=AACBBCEACDAAEGCHFHFEIFCGJGGJFILHIJMKMLGKIHKKNQKRQLSMJMMNPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^ac^`fcabgnicihhmxvmhinosrpqrrrvtsusssnksqmprotvsqquvuswywutucmtkopjqtpwLMLLLGDA@D>=DEFC?CAEDDFCBEGCCIFBHJIGHJFDKJGHJIIKGJJNKNLILHJMKZfJd\KlRGNM_nUls[qpbwcRPbvuhucavaXnqbdvinzf\lu`lkV`wuhjhhfglmjmojmosrprrqrsrssrtrnltonpqquurqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?<DEFDCCCEEDFBEFGDDKEEJLKIKLGGNIHJKGKJIJJNLMMLLIMLL[sbdp^llULNer]geqlntgpi_aYnmbppbkjjgoqtetnn\pvgpNLryvkaakeelxmkvlnosrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?AA?=BEFBFCEDEEDCHHGDDKHGKMMJLLFJOHJKJILJJIJMMNMMMKNMM[rponpplkMOPmXNibtrpamov\YlP[mmZqmkomxxtsip]`slqjUuyxoc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGGEEEBAB=??EGBGDHEEDBFIHHEGKJGMLNJLMGLNIMKHJMIJIJJNONNMLNML\hdu]lqWlMOQnUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ghacityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIEEDCAB<B@BFCGFKGECCHKHHFILKFMKKRRLHMMINJIHNGJJHINOMNLJMMJZtppoqqmlOQRnYskgooqqomt^nXat_nopoqroousttjZ^tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtIKHJCDDE@@>CCAFCHIMHFCFJLIGFJMLFOJJWRKGKJJNIIJLIKJIIKLMMLIKKKSkbYi^_jcrrZ_Yjo_eeUk_d[abQ`mh\j\niid[oedp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFJDECFA@AEDCFBHJLGFDGKLIEFJOLIOJL[QJFHHKMIHJJKKIHIGKKKKGHKJLKLJIKLNT[]TPUMQONOOURPPQOOQJJNPQdqiTYV[[\UYZ]X]\\cfaafbcf_^fkmhmtxrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusGCEGFF@EC?CGDEGCIKLHFDGKLHDGIPKLOKLWMIFEHIJHIKHLJIFHHJHHHEFLHHJNKHO\W^O\\`^OXYS\\b^MYZMXaRKYaZS`d\aX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLMBCDBDIEGGFKJKHEEJJJFDGHPJLMJMRIHEAHFJIKKILJIGEJHEFGEEJGBIMIJT_Y`X`a[`UXYT]^Z_RY\P^\YN_\^S[^d^Z]`c_Y_b[`^[UYXZ_^ccbaceiekrpoppnow
{
uqprrsuyyzyyxxxwryvxrqxvtvaSJJMIECBCFGEGGIJJIHDFKJJEEHINJNLHLNGHF>GGLIKKJKKIGEIFCDEBFJD?IKHN[cY^^a_RTSW__\]Y^QY\MV_WKQY[Q[_ba]^ca`bbbcceZRYVW]Z^d`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFDGEBEGHFGHIFGJGHFHKIKDCKJMMLLHJJHJG?GFNKKKMKKKIGIEE@DAHIA>HIFO]aZ[d]_TQRX]\\\_[KW\LR\YIM^QQ]_bccccb\dcbdceXRWUT]Y[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMC@IFCEKIFGGIGGJFFFILJNECKJLNJLIKJIIGBHHQMKKOMKKIHHFE?EBHHA@FECT]Y^X_Y_[]UXXP]]QKJV^X^[]VZaRR__bb``bb_cbbddbXPRRS\T\]]^^___dhgljnnp{{|~{
srw
|x\SKBAGGDFMRHDRKFHHHDFKIMPEGIJKNLLILKJIGDHKQOMLPMLKKIJDEAECHFAAFDAVUE\T^SV_XNTUNZ[MJKT`a[_X_^b]OYb\``_bca]bbW`_TQPQRYS^\[]^_`affelfoow|{{}
zo
~INFDFFHDIScQEW_IGGHDFMJPPFIIJKNLLKMKJJGEINQQNOPMNMNILBDACCFDCACD@LHCLLPONLFMFFHIHGLLMOPILOPPSPLQSRUZXWYWWcVNRTPQPOQUT\YY[^^aaefchdlmqsszy{z~{}{
}KIEEGFGDKN^MHHYMGHJHGMLQQIKJKKNMUNOKKLGGKPTSNPPNOOOHLF`ED^LDfcCL[H^\smOMVmYLCO_TlWgJ]WU^DMQULMSVQRTXVTXTT\TOeZhheZUkTXWU[\\``abbb`gignlhrz|}~}}zr{z{
~z{LIEFFHEEKPTJKG`THJOJIOMRQKMKLORUROPJLNGHMQ[YOPPNPQPJKQQI|YYrsWPmGqnoaVPqqtOBjsnqtpSo_[nX]V\XUkhU]VcY`YZ^UUWituu_av_Yb\\f[_aaab^`cgmol`pwtx}~vxzmv~tx}|~|z~wwNIEHMMBDLLGJLFRVLKOHLRXWQNOOLQTNOQPKLOGMPS[ZTQROPPPKIZx]TxdhXRSPvftlpbnfkRrNLwmjrpsrqrpoo]ezuxqqzq~r}ku}aRh|essoss|}p~xor```bb[aahlnkblfgmw~~{xwtvzhr~nt|~wx{~x|u|||ssNKF`]GAEMMHKKHJQOMNJNV^YULQSNYYLSRRNLPIQRTYWWPTPPQRKHgxlcxqmZJLTypumubnvPddHevqmwojfxxiWrQhzmijzz}lxzphnXuujvupash}ilx|o___cb\_degjjehbcdllppstsssyqrxbltgry{ssuy~svzn|}yxrnMJRtNCBEPQHKLJLQOOOMPZ`ZXKTWPa^RVQYSMPJSTUXWWPUPONRJKrouuquqch`UnKqp^GhyWvTKhx}w`y{sna]modSgrunmypwlvstqlm\s~zkmy|lun|lqvux^__b_]_edighfe^bbiiijknokqnmjpacfdowxompsynqpj{ztromKKZVHGEGRQKMNLLQQPPPQW\YUNVYUfXRRY^TMNJTTVWYWOSOONQIRmHiwK`dvvTVlNnl{rajguTKVkg|lmlx_Zpz{_`zscroxqhd|ir{]TKk_vuljv|{m~yk|p]^^b[_bdegffec[ccikkrsrwgmihdg`alagsrlglmr|kmhk{tmmkmOGJKHJHHRQMOPLLSSROSRXRWTPWZVVTTTa`QONKTSSQVVOOMNOQJHQMOULKKRSRQROVUQQORRXXPMOUTWXX[[UQRW[WXW[ORTWWXQ]XV\UTOXRWWXYZ`\gr_[[[]]_cZ_ccegdddcZdbgffmnmuffgc`f^]g`dlhfgkhpzhggkujhgilPIKKLMKJTRNRQPLVVTPTUXUZVR[]VUTWUYXOOLNWTPNUSNPNLQPKIQQKQMJJOQTQPQSRJHMOPQRPPPTVRXW\WSRPQUUUSZQNRQWUSYVTXTSQTSUUYYX^Z_a]\[Z\\`c\]bcdgeeebY`acabhhjncad^_c]Zc\bma^ffgmsdihkkedcfhQJKKNOLMTQOTQRMXWUTVXWWZVS\`VWVYUXTQPKOXSPNUPNQNLSPMNUSNQNMNQSPTPRTTNKMORTTQQQUWUYZ[ZSURTXWVY\SOSTWUTYUVXTRQWUVX\Z\`]WY_]^]\]`a^[bbchgfebX``b]`hegea^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLOTPPTQOQZYXWYZZXYV]jdVXYZWVSTOKOVTPOTPPQNMRQOQXTQQOMORTNWQSTUONNQTVURSRTXVZ]\ZVVQRWXU[[VPSUUUVXSWWTRQXVV[_[^`_V_]^`]\`___ZbcehheebYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSUQOV\ZZW[[\YZ[dqmhd_[YVVXRMNWSMMROQROMPSQUZUTPPLPWUQVRSRXMOPRUXUTTSTYX[^]\[VROUVU[[VQSVTVXTSXZSRQYWW]_[```Vb\`a]`b_\`]cachief`Zc`a__ee_`c[Z\[\ZZYYW\Z\[`^`[^^a`_c\Y`ZQNONVQPUSPUTSPW\\\Y^\_W\^jpwyc\[VVYRNPWSNQQPRTRLQTSY[WUORNSXUSQTQRYOQSSV[UVVSVZX]^\\^VSNTVV[[UQTTUWXRSY\TRR\XZ]^]ba`Wb[cb^ac_\bab_dgieg]\d`a`acd_b_YZ_[\[XXYWWZZZa]][]\\Z]`W[[ZPOOOYPUUSRXSTP[]^]\`\`U\\hjr}slh\UYWQOR[SRQTRTUTKRVUZZZSOSQUUTRNUQRZRTUTX]WXXSX\X^]YZ]UUNVVW^ZXQTTWXXSVY\TRV]Y]]a^cc_Y`[eb_dd^^cca^efief^^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POORZPZUVWVTTT^^`_^b]`U]^bkyum}lZUZVQQT\TTTUTVYWLRZV\Z\RPUSWUUROWQSWSWUV[^X[YUZ^X_^Y\YRWRYXY_YYRTUYYYUWY\UTZ]]^ab`ed]^]]eabfd^_dc`\gehfdb`ea_aabb_`^WY^Z\\ZYYWV]Z]^[Z[\[WY\]VXW]SOPWYQ]UVYWWUX_`aa`c]`U]^beev{hXYZTVTV\XWWVVW]XOU\Y^]]TSXSWUTRSWQSVTXXX^^X][U]_X__X\VQYTYZZaX[TVX[YZXYYZWV]_`_dcbee^b\`fbdfd_`dba[fchfdfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNTZWT\UWWYWV\`aacac__V[`da_zuohZ\ZVXVX[ZY[YXY`VOT][`a\UUYPTVTRVUQSUW[[\__Z_\V__Y]^Y^VSYWYY\bY]UVZ\Z[ZZYZXY__``dcdeecdZbfcgfe^ab`c]bciedh_g^bbcaa`^_XTZZZ[[X\XX\[Z[WWZXW\[\`]V]]SOVZVVZVYVXWX]_badada^YYadb`kfh^\][WWYZ\\\_[Y[bVSW^]ac\SVYPVUUUVUSUTX]]_``]a]Wa^[^\[^XVXW[Z__[^WX\\\]][Z\WZ_a^`eddffgcYcfehgd^c`_ec]fidei_g^cbcaa`__[XY[YZYXZXW[[Z[WXZTZ]\[`\U^bMRWYVWZY[\YWY^`baeada]^Yacb_a`a_]]]XW[[]]__\Z]cXYX]`cd_RXYPWUWXWVVWV]]^aba_b^Ya]]^Y\]YXUV[[`^\_YY^]^^`\ZZY[_b_bedefghcZefgigc_c^`feZiicficf_bbca``_]]ZX[YYXXZYWZ[ZYWYVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XW[\_]`_][`d\\XZbecaR\YOXVY[YYWZZ`^abc`ac_\b]_][^]YYTX]\__^_[Z^^`bb[[W[]`bbcedgffge]eghifcab\cg`\iichife`baca_`_]]\Y\YXWXYYW\[ZWWXPXZ]acffrkJYW][Z_]\^\Y][^_bcbaa]b[bdb`cbb]\[ZWXjq`\`_]\ac_^YYcedbT_ZQYW\]\[Y[[c`ccc`bda`c^`\^^^ZXU[^\\aa_][`abfb^[S\_`cddfeggfff`fghhgdd`[fg^ahhcihfc`b`cb___]][Z[YXXXVZW\[ZVVULXX\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyy{{{{{{{{{{{{{{{{{|{{{{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyy{{{{{{{{|{{{{|{||{{{{{{zz{{{|||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÖ½sqrrrrq~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääèÊrooooon
}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyyzyzxopppppprrrrrrrwzyyzzz~|||||||zzzzyyy{}||||||}}}~~}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvvxyzzz~yyyxxxxyyyyzzyyyyzzzyxxyyyyy{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwww||}|z}{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwwy~|}}y}zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z|yww{~}||z{zwxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{yzzx{}}|{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyywxzzzz{xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|}}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~
~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtsttttwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~
}}}~
~~~~~
~
~{z
~|}}}~|{|
~}~~~~~~}|~}}}
}|}~~~}|}}|z|
}}}~~}}}}zzz~~
~~~~|}}~~}}}}~}|zzz~~}}}~
|}}~}}~~}~}{}~}}~~~}}}|{{{zzyz~~~~}~~~~}~~}|~~~~~
~|~~~~~}}~}~~~}}}}{{|zzyyy{~~}~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zzyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}|{zyyyyy
~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~
|}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
||||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
}
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~~~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}}}||}~~~
}{z}x~w{~~~~~~|{{|||||||||~}|{||||{|||zzy{|z}
~~~
~~~
~~}|~~}}}}~{{}}~
{z{ywz}~
~~~~}}||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}~}~~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}|z{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{||zz}z~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~}~|||||||~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}|}}}~|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}~~}~}}}{|}~||{|}zzyyzy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv~
~~}~~}~~~}~~~|}}|~~~~}|}}||}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz}}yxtt
~~~~}~}}}~}~~}}}~}~~}}~}}}~}~~}~|{|z|{z
~~~~~~}}~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~~~~
~~~~}{z{z|{z~~}~~~~}~}}z{|
{{sy{|pwuvwyvtz
~}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
~|}}~}~~}|~~~~}}z{{||}}|~}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}~y~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y|yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~
~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}|}~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqwyrx
~~~~~}~|~{~}~~}}}~~~~~}}}~~|~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~~}}|~~~~}|~~~|}~}~~~
~}}{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqspxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~}~}{~~{{}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}~xwvyyy|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~}~}}}{}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~z{{zzzupxwyvu|uv|
}
{~~}y|zzz}||}z||}}|z{~~~}}||}|vrvxxvtvt}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvuv
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~||
~
}}}||||~}~}}{|}}}}}~~~}|~~~~~}}
~
~}|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uz~
}y|~{
}}~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}~~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}}~}}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~~}~~~~~~~}}}~|{|~||
}{{|~{||}~||~}}~~~}}|}~~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~|~}}~~}}||~~|}|||}|||~z{{}~
{{~~|||}}|||}}|}|~}|}}|||}}|~}{|}|}|}|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~||}}{}}|}zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yzzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~{}}}}~~}~}}{|{zyzzyzz|yzz{{{}z{{{|}~}}}}||}}|
~|~~
}}~~~{||}}}|~~}}~{~{{zy{zyzz{yzzz{{|z{||{~~}|}||}~
~~}|}~~~
~}|~~|}|~||~}|}}|||{{zzzzy{zzzzzzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~|}}}~}|{|}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7;<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D9;<79<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÔÓÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=::;88:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<98:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËÊÊÊËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÕÔÔÔÔÔÔÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÐÑÐÐÐÐÐÑÑÑÑÑÑÑÍÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÙÙÚÛÛÛÛÛÛÛÚÛÜÛÛÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌͲâÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎnPSSSSSTTTTTSL óëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSQblkkkkkkkkkkkkiUSSSSSSSSSSSSTKCCDCCDCCDDCCCFSSSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;@C>6:7>>;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÎqTXWWWXXXXXXWP¡ñééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWVepoooooooooooomYWWWWWWWWWWWWXPGHHHHHHHHHHHGJWWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;>@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÎx^a````aaaa``Z¤îççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbbaoxwwwwwwwwwwwwucbbbbbbbbbbbbb\STTTUUUUUUUUTV`bbbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB?;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÇÅÅÅÅÅÅÅÅÅÅÅÅÄËÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÎÏÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÍÎÎÎÎÎÎÎÎÎÎÎÎÎÍÌÌÌÌÌÌÌÌÌÌËËËÌÌËËËËËËÌÌËËÌÌÌËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÏÏÏÏÏÏÏÏÏÏÓÏÏÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÑÔÔÓÏÎÒÔÏÎÎÓÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖ××××××Ö×××××Ö××××××××ÖÖÖÖÖÖÖ××××××××××רØ×ØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎѰÍÒ¨ ÐÏѤ¡ÐÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏɺ¸°·£§Ö¯¡©ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÑâÅÀÈÐÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÑ¿¨Ó¾¡´¢°²ÓÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏѺ¤¡´¹¯³ªÕÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÑÀ © x¤ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÒ¦°®¨y©
¤ÕÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑÉ×ĸ¯¦½¦¯ÖÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÅ §¥§»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;547<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÉÁ¡¡ Á¢«¤Ð«¤ÑÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÕ«©ØÅ·×¼ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÔÁ¾ÕÒÔÇÃÖÒÕÅÄÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELLA>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÑÔÕÒÒÒÔÕÓÓÓÔÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668884;?<?<9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiihxsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptyvt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9<<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹º¹¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676879>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®xpljac`YQMQLRFC9MPE>8;727967443588797;9:==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥§©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:99=7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AA??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=ACADA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?C@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::<;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=::9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>98;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<??::97;8887489<;<8;;<=:=>:?A=:=<>>@?=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:;=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<97:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;9799;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8437:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8@B?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:;:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_MHQIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\dc[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¥¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlgbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[`_Z\V\hdocnihb^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥©§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9:;<>AE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285677:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´´¶¼¼¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YSah`fsosiscidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnm[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCBDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆ¿ÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÄÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸·»¶·´¬¨©©«¦¨£~¡£vyz{vnkhguZfrwsxff]d[RXIF?;78876169744333646;8:<;=<8=><:;<;=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÈÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂľ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijh]jomxwbb``^XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬¦©»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugihtmxl]d[U`YLHC6<9988:53:664413525;:<>;;<=<;<=<;<>=?A?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÅÉÅÍÐÎÇÌÉÂÁÆÁËËÇÆÌÉÍÅÆÆÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlidtnsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÆÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»»½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegcjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfcZYY\YQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿º½À¹½ºº´¿¸µ·³¯»¼·À·½Â¿Á»¿Á¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjffiei]VUSYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»À¿·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekgXXNKKKRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···µº¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼ºº´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebm_\THKJDJBCG?9;8=<7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·¿¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸®µµ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿ÂºÀ¿¼¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcga\cQKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼«ª£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊĵºÀÃÈ¿¿µ¿À¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^`aNHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿®³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍËÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>CEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=?>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸´¼¶º½Á¼»¿¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼¿ÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp]Z^\YQEDCMIAD=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÃû¹³´ºÁ½¿ÇÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpmh\__YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀ÷·°µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwmp`^e][TJ<>?FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁù·²²²´²·¾º³µ²¼º¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvrl^b`[]NHA?=HCFMD?775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÄû»¶´´°¶º¶´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo{ourmc\fX\]RNMA>JB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³±¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÊǾÀ¸¹¶²´¶³´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶°ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmuik]ZjT]\OMHDFLAFMF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±ºÃ¼ÂÊÅ¿»¿¿¹´´³±±®°¹¹¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH?HQDMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¯²²ºº··µµ¼´¯´«¶º¸ÀÄÁ»µ¼½¸²³°¯¬®¶¶²´´¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥££¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\PhTPNGOMLBOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¸´§¥¬ª¨µ²±°®¯²§¦¯£¯®µÁºµ·²·¶²´«²´®ª«¯°²³¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©°£¥§ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRNJNG;D@=2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¦©¤©£¤®¥¬¬´¼·¬²±¯±µ¯¯³µª§¬£ £¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxz`bRU_HIIKSTIRPL8>B67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ £¨®¬««¯ª¯©¥¥¦¤ ¢¦ ¢®«¬µ²¶¦¯´«©ª´±°°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«¹¨¦«§««©¬¬§ £±±±´©±¯¢¡¥¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZYMQJNNULRLA7>B78=76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=?758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¥¢¡£ £ ¢¯®¬¯±¬¶§±¦¦°®¬°§ ¢ ¡¢¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°§«¨²µ·³·¬±´£ ¥«¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HQUHFUVJBMG=JH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¢ ¢©«§¬©ª´«««¥¥«¨ª¬ª¥¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¡«¢©¨±©ª¨§§ª¦§ §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmiwmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·£°¦ ¤¤¤¢¤£¢ª¯¬§©£ ¡¬®®ª«¦ ¡£¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬®§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â½¸³»Åü»·³©²ª³´¯³®©®£«§¶±¬¢¯¥ £¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¥¦¢¤
{trkkurpgW\QETHDIOH>EA3EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ¡ ¥¥¦§ «±®§¤¤£ ¥«¥ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌËÌÒǾ¿ÀÂ½ÇÆÂ·ÃÉÈÂÀž¹´¹ºµº·°µ²ªº±®»¶¾»ºª·¬ªª¸º´»®¸£¥¢§¥¢£©¦§ª§ ¡¡¤£¤§¢}zrkdioxjeZ[FJLDDSLDBD7:?;549978>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ £¡¯³©¡wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÇÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÌÓÏÓÓÌÊÂÅÆÆÊÇοÈÐËÆÄÆÄÀ»ÃÀ¾¾¾µ½³¾¿ÂÃÆÄÇþ¸²¸¼ÄÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDB@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª££¬®¦¥±ªÅÆÌÎÍ¿°Â©¥¨ª¡£©¡ ¤±±«¤ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÔÕÓÓÈÌÇÍÍÉÒÌÍÓÍÄÇÉÉÀÆËÆÈÈž³³ÇÄËÊÊÎÅÉ¿½¿¼ÁÇÄÌÌÈɿÿ°³¨¢ª£¦©¬¤¥¦
zruugbgvidVWQDMF@IQB=B<:23@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤®°«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤¬©¦°®¥¡¥¡}wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÒÔÔÒÏÑÃÐÓÖ×ÕÖÒËÉÎÐËÆÍÒÉÒÕÖÙÕ×ÓÖØÎÒÉÎÑÌÎÐËÒÏ¿ÇÆÉÃËËËÎÏÅÆÇ¶¿É¿ÒÌËÏÅÉÇ¿ÃÂÇÎÌÐÐÏÌÊÇ͸·»¨¥«§£ª¥©¨¨|wsvoc`erb]R\IJFAEHI>;@8=4585:76:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦«£°±©¨µÐÔ×ÚÒÇÆË´¶ÂƲ¶©¢¥¦¡¢«µ§±¡¦«¡¡¢wic`____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÎÏÕÔÔÑÑÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÇÐØ×ØÑ×Ò×ÙÕÖÌÎÏÉÌÑËÎпÅÁÇÅÍÌÐÐÑÈËÌÀÊËÅÓÎËÎÈÄÉÆÆÈËÊÓÓÐÕÏÒÌÒÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
{zqstmacim_VP_JJBFCQM?<>44:=52755<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯®ªª¬¦®¸¨«·ØÔÕÙÙÑÎÐÀ¼ÌÉ·À¯§«©£¤±¶³£¶ª¡ª©¡¡~recb__a__a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÓÍÕÔÑÊÏÌÓÖÒÑÖÍÐÕÕÑÅÑÔÊÐÔÕÖÎÒÐØØØ×ËÈÍÃÈÎÌÊ˿ɿÇÈÍÍÏÊÐÍÎËÎÎÇÊÏÐÊÎÊÂÈÆÉÌÊËÑÒÌÓÑÐÏÏʽȹ°»¸µª¶°¨¸³¿»±
yvopnkbenpaW\ZIFFDLWE;@<33<=86855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><>>:EBE>¥§ £§¡¦¤§¸¶µµ¥®¾´±ÀÙÒ×ÚÜÖÏÍËÃÓв«®¬¦³±¸«³·©£l^^^adb``aa``a^__^]bmroostvvy¤¾ËÕÑÖÔÓØÖÎÎÓËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÓËËÏÑÓÉÎÑÕÒÕÕÊÀÉÁÅÌÂÈÉÂÌÂÅÈÉÊÎÊÌÌÏÍÓËÅÇÏÌÇÇÊÄÆÀÅÉËÍÏÐÆÏÎÍÍÌÏÅÇÀ·¹½Âýù²³¾°»Ãĵ©¥¡
xpqkmh``qhXXhVMGLIPPB;D>;67:89:57==A;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±ÇùËÕÖÙÚÛØÍÌÏÉÖÖÅĸ²¶ª¤®¬¹¹±²À¡|ebbb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÄÉÉÆÆ¿ÃÅÎÎÇÅÇÍÊÑÈËÎÍÆÑÒÏÎÌÔÊÇÊÍÎÇÇÏÒËÐÏźľÆÉ¼ÂÆÈÎÄÂÇÀÆÍÇÃËÉËÏÇÃÃÏÈÆÁÆÇþÀÇËËËÎÂÊËÈÇËÏÄÅÇ»ÇÂÈÈÂÏÀ½¼¿°ÁÊǺ½ª°²§¥¢¤wntdk`^fqa[W`GHHGIMTG?J=64355=<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥³±¬ÉÍÊÈľ½ºÍÍÆÐÕÕÙÚÛØÐÊÐÐÒÔÊź¾¾°¨·«¾¹¹³¥~
t`[^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺ¿Ã»»º¹¾ÈÆÂÃÀÃÇÊÉÈÊÇÁÅËÆÈËÍÉÄÂÊÉÁÂËÐÄËÈ¿¹ÁºÅǽ¿ÆÏÊÿúÉÇÈºÇÆÄÊÀ½ÁËÆÅýż¼¿ÃÄËÄļ¿ÉÂÅÇÑÅÀÈ¿ÊÉÆÇÆÐÃÃÆÃ¯ÄËÇÄÊ·¿¼º´©¬¥¥¬£¡¥£ {vrtfiZanmZ[XQDLFBGDLDFS@54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ÊÏÑÌÇÂÃÇÍÏÎÍÕÐÖÙØÙÐÍÔÎÏÐËĸÆÁ¶µ¼±À·º{
vxurp_Z[]`abcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÁ°¶º²²´²±Á¼»»¹¸ÀÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ·»ÄÉ¿ÂÉ»·ººÅ¾¼ÁÍÂÆ¾½µÀ½Ãº¼Æ»Â¹³¼Åö¿µµ¾¿ºËüµºÈº¿½ËÃÁÅÂÅÈÅÈÅÐÆÂÌDzÆÉÃÎÍÁÅ¿½²·°³§¨¨¹±¥°«¬yvwjeh`hocV^YJEJFHKAFBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÂÄÈÎÒËÊÊÇÍÎÏÒÉÑÆÖÕÖØÎÌÐÈÍÈÊžÊÁ²µº·»¶°
y~|tud\\]^``bcbbeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÀ¸°°§ª¬§¸´¶´³²³ºµ½±·°´®²»Â¼Áļ¿ºµ²º¾À¸Ç¸´»µÀ¼·½ÆÀû´®²¶º¾³Ä·»µ«¸¼½À½°ºµ¯¶º²Å¼¶®»¿´¶´Å¼¾ÃÅ¿ÃÄÅÇËÅÀÆÆ»ÇË¿ÏÉÇÃÆÁ÷þ½¶¹¾Æ¿¬µºµ·¶xtxfgebkn^V^`FKHHJFBCAEE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¥«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÍÎÉËÉÌÊËÆÑÏÓÑÏÈËÆÊÆÄÀ½Ï½³¹½¹¸·{y~wx}th^]]]_`_`da^cec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¹¸µ°«¬§¢ª§«¬³©«©³¶°²¨®¦¬²¼º¶Ã¹º¹°«µ¹»´Âº°¿°½¼»µ»Ç¹Â¶ª¨°±Àµ¸¼¯°§±³´»¼«µ¥®¶®º±°ª¹¯»®»¸»¿¿½¹Â¿ÆÂÅÀ¼ÆÁÈ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÅÉÌ˳¹Â¼º²rvvkiablhYWW[ALKMIEAC?FA:9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÏÒÌÄÆÁÅÐÈÏÂÄÇÁÆÆÅÅÌÄËÌÂÄÁÈÁº¼»Ê·´¼½¶µ«|y~
z{wn^]]]]_`__dcbccb`_][[ZZ]ZZZZ]dnohfgiknr¹°µ®¦¥§§ ¤ ¥«£§¢«©¬ª°£¦ªµ¶±½¹¯·¯¨®¸´´¼¸³¼®·¹´±»Á±Á®¥©¢¬±²³§¼ª«¨«¬´´¦¨®¡¤®©²¥§¨®¥¨·¬°²·¹º»±¼½¾¾Ä¿µÁÁÇÈ·¿ÀÅ·Ä¿»¿ÄþÄÈÌÊ¿¾ÃÀÀ©rtrji]aodWVXPHZRSKFFE>?@9789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·ºÄ°¶°ª©°±³µ½¯ÆÑÐÍÄÈ»»ÌÃÌÀ¼Ê¹ÀÆÀ¼ÌºÃÇź½Ä¾º·½Æ¹¶¹»®²{~~xt|swf_]\\^_`^_ccab``_^]\ZXY[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥¤¡£ª£¢¥¥§¤¬¤¦¬²¯¶·§°¬§ª´«´¹°¶´¬¶¸±¯º¹±·¤£§±§«¨¹ª¤¦§¨§² §¦¤¦¬§¤ ±¬²´²³°µ¼¶»ÁÁ²º¾ÃÁ²¹ºÂ³À½¿µ¸»½¾¼ÂÇÄÂþ¿Ã wpkae_ko`UY_HNhOTGEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;ȵ¶½¸ºÁ»¾µ ¡¦º¶«³³»³ÅÐÉÌÃǹ¸ÉÂÎÁºË¹½È»·È»·ÄƳ¾Å¼·°¹À»±³·°¢}yvtomkjjqi_`]\\]_`_acb````][[[\XYXXXVX[]^dcbegggjmo© ¡¢¡¢¦£¥¡§¢ª°±µ¢©ª©«¬¤µ¸·¯¬²´®²´®°ª£¢²¤¥©¸¡¦¦¨¬« ¥£¯©«§ª«¬°²¸¯¸¹»°¶»»º«²²¹²½´¶±±µ´¿µ½À½ÃÁºº½zrk_e^ddXTX^IW]KPGIJFA<??@;?<04535:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÉÉÁǼ¼ÅÅÐÀ¼Ê»»Á»¶Å¸µÁÁ³Âļªµº·¨±³©ysnpnkb^bff]]^]]]\]_`abccba_\[[Z[YXWWWWXXX[^bddeffhikr¨¡¡¡¨¥¦¡¤ ®®² ¥¢«§¡µ°±±¬§®²§¹³¦µ¡¢£¢¢¡©µª¢£¦¥¦£¬¡«¦£¤¦«²³ª´°²ª²¹´¯©¯²²²·³©¬®±·°º¶¹½¿¶²±yue^e^[YVSZUK[QLIEHKIB=?AA@@:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾½¿³¥£¥±Âµ¶½´¸ÃÍÉÈÁƸÂÁÈÐºÃÆÀ¶¼½¶Ãº¶¿Áµ»¿»ª¦±»±¨²¯}
ypqtqhfdiec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXXVWadecdeddhjv¢¡¡¡¨£¨ª¦¯°«££·ª ®¨¶©¦¦¬°£·°£¶ ¢ª¦¡¬¸¯¢¡¤¡ ¡©©£¡£ªª°¨´«ª¦²°¥ª®²±¯°®®§§§²®±´¯¼´¹¶®£yud^aVYWSRTKM^LPKGGLKE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§£ª»À½À¹®´¸ÂÍÈÇÄžǺÊ͵ÄÅű¿À¹ÀÁºÀÀ¹º½·¨¨±»¦©¢¥~xrjlrtpihedgb\\ZYZ\\\]^]\[\^\[\Y[\ZXVWWVWXWWWU[ccbbcbcdfj ¦¥¤¥¦¤ª¯¦¢£¶¨ ¡¢¨³¡¥§¤¯¥°¬«´ ©¡¡¬±°¢¢¡¦¦¡¢£¥¤«¤¥°§¥£««¥¨®¯®«¨ªª³¥¦«¯´±®¼µ±¯¯ zvrda\Z]XNLQGRaMVPOJMOEBD?9=69:764599;9887;89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»²·¬¤§·»¼Áź±¹µÅÊËÁÄÇÇÉ¸ÈÆµÅÂɯº¼Â¼ÃÀÁ½¼·º¶¦§²¶¢wodbgihfhjgjm`]\[ZZYZ\]\[\^_\ZY[YYZ[WUXWTTWUSTRU``_`a_`acdi£ ¥¡¥££¢£¡ªª¥¥±© ¤ª§¡¬¬©¨¬¢¡¡£«©°¢¡¢¤ ¡ ¡£¥£«¥¢¤ª£«®¤±©¦¥¦¦´¦©¨³µ´¹º¯ª¬rpo`[WVUQFQOHZ\ORITKSLEGIC8;;=<8667:9;:976977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:8698598989;9@9{µ´´»²°¬²§§¯¹¹³ÀȺµÀ¯ÆÉλÂËÍÉ·Ë¿´ÀÇ̰¶½È»ÂÇĽ¿·ºµ¥«°®|uijjmhjlnkkme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^^^__bdm¢ §¨ª§ª¥¨¤£¤®¤¥¯© ®ª³¥¦¢£ ¨© ¡ ¡ £¢ ¢ ¢¨£¢¨« «¯¤·¥££¢¬©¨«¯³¸²½µ³«¯rrh[XYSUREYLP\YMTNPLPRINIB<??A?<65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³¨³¶®©¨¯©¨¬·¶¬¼Ê»¶¿¬ÌÇÆ¹ÂÏÐɵƾº¾ÆËµ±½Å½ÃÆÄ½Á³¹¯¦«¯«wxoninnnqggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]\\^_`d~¢ ª©¦ª¦¯¢§¬ ¤¨§®§ª¥ §ª¤ £ ¢¥¥§¨¨ ±°¦±¼§£¬´«§°´°¸µÀ±±«}prbVTUNRIGVQSRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759:9876958779;85576661320-*.102877;99;8948;8@8³¬¦±·ª¦¢°«ª§©²±¤¶Æ´¹º³Ëƺ¼ÃËÑ̳¹º¾ÀÄǶ´·½³»¼Ä¾Â±´®±®±¬¢khnoroqkpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXZYYY\\]ajzv¨ª¤¤ª§ ¥¢£¢¡£§¡¡¢¥¤¦¨¦¡ ´²§²·¡¢·¬ª¤²²¦µ¼µ««±£xrm]NPQLOCNNNPKFNNKJNMQHMJAGKHHC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12776:999984988A7w¶§¤¶°¤§¤©¥ ©¥¤³ª¢²Ãµµ²³ÇǸ»ÄÊÍǵ¯¼¿¸¼Ä³³®¶¢µÄº»¯ª¬´¯¯ ¨}^`gsqvqjnifhhj_XYXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKLSWWVXXYX[]aosvp ¢ £¤¡s}
z¢~~sz¢£ ¡¤£¢´¯¬¯¬¥¹¦¥°¡°®°»ª©¯ªvrbVLQOPMCSNLQMCPPHINSMHJJDJLEKK<749888;;69;7:<9::;79?9>@79:<89764445874312485/0102)(,-12764789::65:87A7w·¡£´¨¥¥¨£¦¥¦¦¦³§¥´À¸°´°ÊƹºÂÏÇ¿µ¯½Ã¯±Ç²§¬¤®¿¸±°§«¢rWV_hgihincjhgb\XXXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrm
|tNXr_;Wo{
ryz
}xqo
}¡ §¯¨©¨´¢¦¬«§³¡©£}qm_ZNSQVLDTJPMLFOOIELQMKOJIMPFIH=7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9x· £®¡¦¦ª §©§¢©°¨§´Á¹±µ°Éù´¿ÏÀº±±¸Ä«®É®§£¢º§¨¦¥¤¡iQMRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`moiztPB@}y`JQnx|n~wuvxpQ{~xvgw
~¤£§©¥£±«¡¤¤¦ª¡©¢¦¨tke][HQQSLIUMSILLPIGFKNLMTKQQOFIC<769:8:;;8:;8>?99>=7;<6;;478;6775344696/3/.115221/,')+*,4833979:99::::?9v¶¢§¡®¡§¨¥§¨¯¬ª¶¼¶¸¶³Â¼·¨ºÉ¹·©ª·¸¶Àª¢²¢ eMLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut{
{uxsnupty}ª
yzhv{prmxxz{vrrwguz{¨ ©¥§¤ ¤qg`\\JVOQGKXROJLMRJJJMPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937795675252572/2.,./200/-+(().1262198798775:<<7v®£¡³©¯©¥¬¬°±ª½´²¼¸¶ºµ² ·»³««¬µ³¥¤fJIJIGFHHPTTTWWSTUUUVWWWXXXXXYXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQRSV^u}ygw}gyvx|r|v{ok~|s{}tfv|
lohs|lyq}pmuqhq}pC
~wwz
}zu~£¢¤umkeaYWXTQJRUTOPNQVKNKNOJQOINOKFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦¯¬®«§©°¯±¬¼¸¬»¾¹³¨±¨§¬§¤~|z
eJGHFB@CDILLMQRPQSUTTUVWWWXWYYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{xo|yy|
omxsxjjr}Inhw~licly
ksl|nr{hmp~s
z}~{vots
ywp|}lhmnmWUWTQQYOSUTTXUMNHMJMNKCINGE?:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¤¯¢ª¨µ¯®¬´¿«¼Â¿¦£¥
¢¤v~
|x~t}xuw|fOEGD@<>>AFGGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jrAo;<95<_IMOORWZRY\`§bitze~pmzutlts{jkLyg1vsl~}tfet~
filukp|gpp{n{s}|qpnum~wytiyyuiingcWQYWXY[MPUVZYNIIEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+),,++)(+'),,226-+5775478iO8;5n¤¨²¦º®«²°Â²»ÃÇz
twvwuxvoxsiUFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯³ q|xm}mq
yyr txsu5q¨¡¡¢vp|{shfbimqmouioXuovlz|mqmpzsumbv
ux~}xpnnj^Z[][YX`_SN[ZYXLHJFJG?CABG?CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´¨±®Á³ºÁÆ}nv
oy{{q{t|ko^JPG>@7458;;<=>@BEILLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/?©®_GLMNPL7CMRSDJv||v~lv|}
~v¢y~
aªzv~s{\dqtz{wlgiayo
znwszpsywkni]w}|}q|uw{}tmqrde^ZZ]S[f^XQUY\VGKKELG?F@DC?AA=:97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\w¦ ª°©¯À±»Æºzvk~
yu¢~~s}lylSXLAE311266688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y{q|{|~v¡¥¬©H¯¯¨sl|}hggx~m
qGkwqyvhmk_w}
z{uv|wmow~}qqpjZ[[ZcbWge\UPQXZQDLLGOICFCCA@CA=978:::;;:888::?>6;>7585773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¬¡¦¸¯³½´}tp~}¥yu
y_cVLC60./22123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¥»±§»Çç¡¥{r~v
ihotqw{v
}nvug¡«£{zzogkx}w|qic\YY\h\af_ZOLNXSQIPKDNGCJDCADDA<:87=<:<:88778:==8<=68656623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nvpgx{¤¡¬¦«¯°¡xw}~mpj^CA4--////02234779;=?BDHJOQRSRSSTRPOHDB<87/9C><<63.lMPHIKKKNV`cggmu ¡£©¥£¬¨¶¢§Á®ȯxº|¡¡
lpuvql
r¡¥¶©¢~kjl}~}q_[b^Yfj\lk_XKHPSQNMLFIQDDNFBCEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<ungYppuqv~§ ªhf¤~
z}
xxhNR>//.,/.-/000212457;?CFNPRTPQQSQNPIED>;<:CF?><752<?R5HHHLLMNR^o|s} §¦¢¡¢¨©«¨¬©ªµ«¿«¶ÈÉ·ÈÑϾ pi«©
§¡wz~¡{v«³ }¤£§¶°¨lss{|ynf^[_^agc_gg\REKKQOIJMFFMCHLFFCBGDA:85<<899975658>75=84745754546958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f3A@ib^Pqu`n}aw}|ªªBD}y|
w_bP460-1/,.00./..0015>AAMQRSPRSUSNSLEE@<>=FH@A@8662<9;FHGIIMOQYmw£§ªµ½¸¥®¬¬¨©µ¬±·²²»±³¾³Ä¬»É˸ÿ·¥£°²¬ª£
¥¦ ¢¦¢ª§¤
£ ª¡¤©±£§·»¡£°££¤¢«°®³µ¢¦ªz{~{e^fZc`]bb^fg_[ODIHTOFHLFKGFFHAKFCFFA;87=<88:974658<54<76:44644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|{
qna@E64<3/110-,+-1/-4?DANVQRSUUWUM\QGGD<>>FHCD@8;<5C;=FKIGHROPW ®£³ª²ÁÇÄ«³Å¶´À³¸¾¶¿´Á¶»»¤¸Æ©¶ÉǶ¾¹´¨£´°±§¯ª¤w¤¡«±³©¨®µ»²º¬¯µ¢±¬²µ¼¸µ®µ ¨¨£¨©°³º¸¸¨¸©¥ yrW_bUd``a^_f`[UJDELVQIJJEJHEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL\ZQcdWzuq}v~{¿»£¼´z
zyn]W@EN<6:46AB764//6CHCQ\OQUXU\WO_UIKJA@>GKFFD;>@7D7?BJJEGWTP^¤¤²´Ã¶¸ÁÌʶ»Ä½³´Á·¸Âµ¿°¸t±´¦ºÅ¤°Æ¹±³²´¨¤¶¶ª± ¢¢¥±¥¬§¤ ¬³º¢¨²¹µ»¾Ì¿Å޽³Â·º¸¿¸º¸º±¦±ª®¾°½¼Â컨®«~yhUa_VhchdV[cYVTJGGLRGDIJAID>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58:9650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYVZwjp
o{rxb¹¡£{z||}xzueO\dGEL:Qd`[^SF?;HPDZcQQYYZgZS`aMSOEA?IJHEFA@C<D6B?HGKMSZT^¯¸µ»¹ÉÀ»½Êͼ¼Á¼¸¶¼»·¾µº³Æau²¥±«¾ª¥¨«ª¤¢²µ «§®¥§§¥£¢§°³¨±²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÃÁ¾¾¿¼¼¸´°¹··ÃºÆ¾Äɰº«¢¬¥©·|n\^^\U_]gfSYaVRVIEFNKA>HD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPOQRQJA9/,,,*+((,-+/P>(.48}<2Kq9>CKE@JMPRLQ]hmlqslrrtÕÀµ }~y{{yt}zkepvY]\Peeb`ed][XX\MdmURmn_o_XgeUYTJDBKKHFHHHHBI9D@HKTTV]Z\¹À¹¾¸ÆÁ»¹ÊË»¶º¶¸¹´¸µµ®¶·du©p^¢¡¢¤«¥¨¦£¬¤ª°¬·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀÀÂʽÁ½ÂÀÅÄÆÊÀÉÏ´¤¼±µ°¬¹½}vi[\YW[_XabQ\aTRLCBFGE<@F>BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;.&**(-./,@M+/54mI0Ht?>BD@CDGKODR\Zi`onlotu³¬¡¡
|s{
{tt{ylmu|iseilhfjih`fiimZmt¤½g[oh]ZYTHKOPJKPLSQHLAJFKP__bgjb·Ç°º´»¾¶±ÅǶ°¹±±»³±¨«¸¶¨§N §¥¡¦¬¯¨¯§³³ÔÔÔÖÑËÏÓÔÎÓÏÌÅÂÊпÊÉËÉÒÈÍÎÃÐÒ¸°Ä½Äº¦·»Ä¢kaZZ[V^VYcYP]XORCBIECI;AD>BH?@B8;D>@I=56655;:687654/10146278875367C5B8?-0,1348=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshroyy¡ª¦}
|p{r~qyulpxr{nxslipmcinpyiw}~Ë¿Ãß§ncxnd[a`JPRUNY^P]]MQNTQUT\nnwr®¸¬µ¨°¶«½Á²«µ¦¥¹§¬¯¡¬´¤±®§«¬¤§¢¬¬ÎÒÕÑÍËÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓ×ÍÒÑÅÒÖÆÁÏÈÈ鿸ÐvkbZ_[T^Q\YOPTPNI>AGBCF=AB?FE>@?:==<<JA45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwlwp}~ ¡
y
{r~z
v
owsls}|w|sxqkrriprzyr{¾Ë²vr
wiai]CZZ[WfdXekTX]]`c^cx{ª¤¤¢ ¡©¦ª±¹«¦´£¢®¢¤®¢§±¦k¢~¬
§°¢ ¥¤¨ÈÍÏÇÂËÑÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÊÔÚÍÊØÖÑËÄÃËol_\\VRWRZOJGIJJ@;:;EBD=CD>HC?CB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYpu~isyr
x~xs|}w{oxqmuvx}t|ylvtn}v
uy{µ<AÆ¥~}jeWICecfchjdoy[_fhknin £¤¦²¤¥² ¢¥¢©¡¢±~
zª£}ª³§¦½ÃŸ¶ÅÍÑÐÒÐËÒËÉÔÎÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÍ´uskaZWPSPXUEGJIFE=:7:@BC:HE@EDBDA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?2*(.BT29254/7K75<`bA<svV87AH:?B><9QECJTlnopbqqt}~
}x
zyq{{
uzzp}ppzr{rnzuw}}u|°tYªÂ·pnc=^hrpqpnwweiorvxrz « ¡¬¢ ¦¬
}
~ly{ª¦®µ¼¨½ÇËÈÉËËÏÉÄÒÊÔרר×ÔÛ×ÓÙÛÖÏÛÚÒÖÉÕÌuwedXWNQR[GCFIH>B>=8:>@<>H=@BAAEA>?:87DB755479.566435532323647553458EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<A<:9D?CGRk_mdbflvqy~
|}wyn{{tz¡vvtu~too
u|
zv|¸Æ¥ÃʸxpeNeczw
¡yzw{|vm¦ £«
z|¡»¡¨¦¥§µ¿¿¿¸ÆÉÍÎÅÍÉÑÕÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆvvdfa]RUTTMKDMC;=<<9:<?9=A7>?@=?>=9867CA6455=80665547745613854564557HH=DJE7925;H>;9:7HP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa]\itzylwvz|~~
{~
z
|u~um|}~t|~x~yot}
|~{©Ã ½¤}
}ss¦
{iGq¡¤
¡¦
¤·¡¦ £®¶¹´«ÀÆÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û¶vutgfbT]YRNNHCLC==>99;:99<=6@>?==9::;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<9DWO<MTHN?96333>C;[X>5YypZ<<A<=>8589?<DRSRX_VXfmmmiqsy{{||{}|~uzszsm~
~w¡n©
{ |~£¢¤¯
Wr«[¢£¢
¤²¡ §²¸¬¥½ÂÇÍÈÆÏËÏÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚlyqccZZUQUVC@IC??>:48:;7:;:3<<?=>7;9:1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLA98:GX@5HWI66223:ECeX?&_yi_z>>9<;98:;@;BQKKSYPTcbxlb~onxxz{}||w
sp
{uwvt
}¦¢¦¢¨r²¨
£ ¢©° o·ÄȲ¢¦±d¤ÍÇ
«¤£
¥¨¡¢²´¥£¼Á¾ÇÆÅÈÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎo{d`[[[MHSYBAGD;B>837;<:9>64::<:72?:929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHRWSRBcGv}|m~xz~{wv|mn{}xx|~¢³§£«³¢§¥¤®¢¸³¡¡¥°£¤§¨¬¯¤¡À£É¸«£¦²
¨£
u²¤¡} ±®¢£·¾´ÅÇĽÃÃÀÆÍÊÉÓ¦ÎÌÓÒÑÖØÓÐØºovrY^S]TNGIMDACD5>:77:?<<7=42669774>5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88567=:JFDGMZ\YJf`;Hzzn
z|x~px|~}osz~|x¦»¬¨±½°¥³³¨£¢°¬µ£¸¥¥©¸§¤£©ª¤®°ª »»®Ê¡j¶¸«°£¬¾£^ª²|}´«¡¡ ¥®¨¡¤³¸¬ÂÈĵº½¼ÅÇÇÂÑ ÆÉÍÍÅ×ÖÑËÓmweYWP[ONEC><BAB8@885?G=<5<35345454B49:BM:B;AHB;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdHb`bpJ@~s}un}|}pww|©ÂÀ¯½Æ»³´À½´«³¶¨²®®½«»¥§¹¸«¦¦¢¢¤£©¯²±ª¤¢¦¥¤º¯©À¼®²¹¥¤¨~½°z¨±¬ ¤¬ ¡§¦¤¢£°²¦ÁÆÃ¯°º·ÅÄÿͦÇÄÇĽÖÐÍÄÊ
po^YW\XLJAK@EG>A@C;:5>A==5=6>333242A17@BN>G@CNCA=C=;86CC5BIB:878;5B>79VKDWOF8=4K@C>4EKHN>AA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUN79GD?CF\eF`igZ]\{uo~{q~{z§³ÆÉ¿ÁÌÂùǽ»¯«¹»³·º²À®¥À¤«¯¼½ª®«££§«®µ°ª «¡¯µ§£ºº¶Á¼¬©³¥¤¨
ªÃäy¡¦ ¯« ² ¤ ¥£¦¦¤¯¥ÀÄ¶Éþ¶Ï²Ä¿Ä¼³ÑÊÈ´quiYUYgQLHBLKKJAB=CD<5AE;;3=8B332262A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeZMe\fTbkyr{xz¡¨º½ÇÈÉÁÒÉËÂ̽³¼¾¨ºÀ½»Ä·¬Á©¬³¼¾ª°ª¤¥¤¬®³¶µ¡¯¥¢£³½ª¨½Á¤¶¸¯¬²¬¬¬©¦¥¥uy
££ª¥|£¢µ¥¤£¡¥¦¤£©§¢²¬¨»À拾·Ì¿¹¯Ä³»¾Á¸¬ÂÃÂÀjv^UTYXJJLIFDDHCCADL:4DI:;4<8E.12242B26SHO<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>iH_XbZccV x
~¡®§¤Â½ÇÃÇÅÓÎÎÍ˼·°º¼´½Ë»Ã¶·¼³¿º½®¯¨ ©¨¶®©²·£§¡«·¸ª¥°¿Ä²½¹´¨«¶´®®¥¬¨²Å§||ª¤¡£¢Z¤e¢³¥¡««©¦¦¡£¨¥¶«©¹»Ã´¥´µËÀ¸ª¶«²»¸®¨¸º½¸hkWTRSMEIRLK?AHEEHGG95FM;>7=@J.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C=4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;>@BFBpEjIReaLF¥¢©¦¢¯¾¯¡Æ¼ÄÄÆÆÎÏÎÒʾ»¶±º»»¾ÏµÃ½¸¹·³±µ³¸³«§«¬¹ª©§¯°£¯¥§£¥µÀ°¬¬´¿ÃºÀº´§º¶¹´¯¥®®¤¡tÂ}±¥£ © `J¥T¯¯¤®ª¤ ¥§¢´¨ª³»»»ª±²ÇÀ¹¦¬«²²£¡²²´¤mjbYWMOJDOOPR;HKIGICC>:KU?A:=EM07544:B44MWO;JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;4EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯¨
¡£¤µÉµ©Å¹ÂÃÈÊÈÈÌÍÆ¿»³®¹¹ÁÁ̵ǺÁ¹µº°¯¯³µ§¤ª´´ª©¦¬¤®¥¤¨¬»¿¨¬¶·¿Á¿¾¹³²Ä²¹¾£¯µ¬¹¦¦v¿®¡ ¡¨¨ª¡§nv¢¢®²£ª¨ª©£¢¤§¢±¦©«¹¶½²²®¾¹¶ £§¨¥¦©©`b^]NJKFGMJVL=MENKLBCD<QV=AABDO18=76?B75UXO?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUH~e^HE«¢»¯««¡£££¶Æ¾´À¹ÂÂÇÉÅÂÍÈÁ¾¹²¯¹´ÀÂɵƲ¼µºª¨°££ª´»¦©¦«ª©¯§£ª«½»¨½µ¸¾Ç¼·¶¸Â²¾Áµªµ¶«¾¥£¢ ¼ ·©¥¢¡¨¤³ ¦¨ª¤¡¢ ´¯¥¤¯«ªª£¢¨©¤¡¡³´º´¨µ²³£¥ª¡u]Z][HGEFLPIMEGGBSLJBEGAWSCH=AGQ1;B7:BF79\YKALPTUSMWRNUJE@JJNO9C@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19f\FCCpbGE§£Ã¥©ª§¦¬¢«¶Ãü¾¶ÁÂÀÇÄ¿ÍÆ»½¹²°¹³¿Âǵ¿°¼·¹¶¦¤«« ¡ªªÄ¢¤©«¦¬¯«¢©©¾¸§¿²¸·Ç¶µ¹¸À²À·µ³´¯½££®¢£¥££ ½¥©©«¡¥½¡£¢©«¡¤ µ¬¦°¦¯¥¨ ¥¤«±µ±ª¥ª®¬ ¨e_W_[MHGINLHEDIA>QIA<GII\ROK=HOU4BF9>HG5Ca[KBNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA56?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ9mRF<KxeaVK¢£Å¬¡¬® £¤ ¦©¬¶±¢ª³¶ÅĽ¿µÀ»È¾Êǵ¸µ´±³´·ÁŶ¾±¸µ¹´§¬ª¬¥¤Á¥© ¤©¯¡¦¨½µ¦±½¹·¶Ä²´¸º¿´ÄÁ¸¹®³µµ£¥¡® ¢©¨¬£Â¬©¬®¦ ½¡¤««¬¦¡W¥¡ ¸ª§´¢±®¡£¥²ª©¢¢¥¥¤_bXb_KGJJNFEAGK?=JB99JKN]QQI=LV\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQIK?H?5HMXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6SZkWrGE6=ue\KM¡Ä¨¥¡´¢³§«¥ £¬©¬»°¨¬¶±ÇÅÁ²ÃýÆÄ¼Äɼ¯°¶°´¯¾Ä´¹±°º´¬¨±©ª¥¡§Á¬±ª£®°©¥©¼¶§·»¾¯·Ä³³ÃÀ´Ç´»·¬³¶ª¢¦¤¬¢ §ª°¯¯»±¦ ©¨¢£¸ ¡£°¯¬¥¦¡¢§´§¦²¢¬ ¦«¯¤¦¢
_cYfdIHLISAC@IH;;F?99ONV^RSJ>O^]=HPBLLI9Mc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<25-/4@1+'VtSeO?104b[M23>0<v]^?[T^eq@8;HweA4£ 餪³¢¤µª³¬§¡¤²¬®©»²±µ´ÆÀÄ´ÀľÉĵ¿ÈÁ´«µ¨¯¸¬¿Ã³·®¶¸¥ª²««¦»´¨°¬ ´²¨«¹²¨º´¹³¸Àª·²Ä½µÆ¨¿¯¶µ©§¬¡¦¥¢¢¥®¸®²µ¶ ©¤¤ ·¢¥¥¯±²§«¦¢¨ ¡¯²¢¦¤«¢
¨©ª¡§¡
wbg[jiLOMNT=BANC::I?77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914801-/.<6-#Bqgsk23/1[bZ33806p[bH05IohUCWFyfC;££¡¦¿§§¯±¢©µ«º±¬£«´¶±°¹·°·¸¸Ä½Ãǽ½ÄÂÆÀ¸ÀÆÀ¹©¶¤¬»ÀÁ··ª²º¢±²¤§ª¹ª¦°« ¯´³«©¶¶¼´³¹·¬¸±Ã»¿¿¦Ã«°¶®¨««§«¡¢¡¡±¯³¬°¹©§ ¶©¦£¢°±´¬³§¬ ¥¢£³¯¤¨¡©¨¦£
}igk`lmWPQ[UABET@;;IA7:XPd^PWWEY_^MLRN^KJ>Yc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DFBM?:1D?77547?=95E4+75/251--.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=§¢©½¢ª°¬¤²¹ª¦¶´¬ µ½¯³¸»º¾·¶À¿ÉĹÄÂÀ¿·Ã½À·®µ§«·±»½¾´©®±¶«®§®¦¨§»¤¬³«¢±°³¬©¶´µ¾®±²µ¬°´³ÁºÅ·¬½°±·«¬ª£²¦¥ª ¤³ª³««³§¡¦¤´®¨¡®®±¨´²ª¤¨¤¢¨µ©ª¦¥£
{dkqfoq^FYgVDBMXDZ9HB6>]Qh\NZ]G[^]OMRXdJJB\b_PLMNXWXPJVVWL=EUJEDAM@AFHHQPA;FDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8)C3YU\gK6zfL@¤¡¥·¥¬ª¦¯®·ª¯µ»§¦±·Å·±¶½ÁõµºÄ¾ÌƹÃÀ¹¾¹Ã¸À¸²´«©º¶º¹¾´©°µ§¬©¬«««¾«²£« ±®³®µ²¹¸ª®®±¨µ¯µ»¼Ê³ª·µ±´¯®¦¡´ ¨ ¦²£ ¦¯¡¤£¥§³ª¡¦³ªµ¥¯²µ¯¤¬§«·£ ª¤¢¢ z
{jmwluzaFakYIGZZ={JFD6AbTi[M\aK\]ZRRRb`LKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76)(9.$:K5."T_T_/5(C_Q\.+B/JGP[G3cYTKD¡±©²ª¬¦¤¯®¶©·µº¤¬´·É»´»º¿¿´³·ÃÀÌȼü¶½¾¿·¾¼±¼§º¹·µÂ¶ª±·¦®«¨£°©¯»¤±³§¨£²µ±±°µ±¸´©¯¬²§·¯·´ÄÆ·©¶¶¬°©§£¶ §²¡¤±§ ª©£¦¦¥¸¨£²µ¬¨±§®±µ¬¥ ¬¨©¸¢¤ §¤ v{lovt{~\Lfm\JNc\>b{GI8GgWf\L^bMXYWUWTi]OOH`]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANGf27'GbLV%-B.=ELQ<3rkICC¥¯¥®¯«¨¥±³´«·²¸¡«µ¹É¹Á»Â¸³±µÂÂÎÅÀÁ½´½¿¾º¾¼²Ã§©¹°µµ¿¼®¬²± §±¦¦¯¥²µª±±¬©¨µ»¬´²µ´ª¬¨¬©¸²°ÈÀ¹¥º°©¬¬¥¨®±¦¥£¯¤©¯£££££ ¢«¦¦¹¥¬¶¶¥«¬©°¶®¢£©ª £³¡ §v}
|{|
prq}|}\Sdo^NXf\FD[G;NmXb[L`bNVWVWTXg]QRLcY[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/+1()+,-*&5*/&0)38:1&*3Bc:6*HeHJ+:H>3BHS,>k;GHª«¢ª±¤©¥³µ²µ¶²²¡«®½ÌºÀºÇ±´´ÁÃÑÅÆ¾À²¾À»¾·»Ä¦¬¶«²·»À¯«±¬£§©¨¤°£ª²ª°«°¯°®«³½§¶°²©³ª«¥¥£ºª²Ãº¶»©©§¬©§±¥ª¥£®ª¨¢£¥¬¢§©¢¦¤«¸³²¢ª¢ ¬¯±¬ §§©£ ¦
¤~
|v~
rqpuk_Z`nbQrp\K;|F?XuX`ZNd[NVVUWQ\a^SONgXWVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1;\J0.JgDF8;B05EKX1@Y=LE¨¢«³ªª°·¸¶¯«¦««½É¼°½¶Â¯±«³ÃÃÎÏþ¿´ÀÁù¿³Çê®¶²¸¾¾²ª¤§ª°¨§¨±¥´®ª±®®²±´¬´¼¤·³¬¬¯¨«£°·«ªº·¥·¶¤ª§«ªª¡©§§²²¤§¥¡¡¬ª¡ ¦¥¢«¤¢§±¸®®¤¦£ª«®©¢¥¤¤¢£}zs|ru¤xk_`nfWdcN?gLEbyWbXReTMVUVTO\]aUKNhVUVIJHIOBGISQYoAMX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06VZ.0JgAA<<B+:JO^4D=GFD°¦£«±«ª¶¬¶²¬¦¬ª©¼ÀÀ·¸²»µ¥²¯ÃÉËÑ¿À»¹¿¾Á¸Á¹ÀĬ±´±³º¿½²°®¬ª«¨¶©¦®¯ª¹°¨²²¯²·ª¸¸¦³¶«¬¥©ª£³³©¨¤´´ ·® ª¨ª¨«§ «¬©º¶ªª©©¢ª ª¡ ¥¢¦£ª§´¯©§«££¥§§ª¢¤£ ~
¢txt~xv}orgfpw\`rjO^VHmyTdVQcOMVTUPOX[bUHOiTVSGOXUI>IHOQPxLMV=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/2Qb02?f=NX>C,>LT_/Ji5OD<±¢¦«¯¬¥°´µ°¬¦°ª¨º¾»À°¹®¡¶¯ÈÇÈÑÀ¾½»»Á½ºÂ¿¾¿±±±µ¼»Â±±³ª³©¤´¨¥³³¹°£®¸²°³»¬º°©¶«ªª¬£ ¶©¡°³¢µª¨§©£ª¡¢¨½¯¬®¢¨¨¬°¡¢¡¨¨¨ª±ª£ ®¢¡£££§¨¥}£
wt|uxyyrrxf¤vi_ditf|SXo^JxsSdSQ_MMRZfNMVYdXGRhQQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Lg:48_=ad?F1CP[[*HM9U@4³¡¥¦¤§¤§µ³²«¥±§ª¸¾À»¯§¹ª¦¯±ÉÇÈÑü¿¾¸½¾¼ÈºÀ·¯¯³±¹»¸À²²º¬¸¬¢´§¨¬²¶¹³¨¨½¶®·¾°¾§¬µ«©¯£ ¥«¨«³¥´¨ª§©£¨£©¨©¾«´°®ª¤¡¯³£¤¥¦ ¥©«¦«¢¢¥¨©
~
~}
¡~r{z~|hx|ysno{fxdag`rzlfx]^T?W{lTaPQYKLNru]HZ[gYEUePD>JNDCA9HGKS?jbJQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GjI14X=fbAJ7GS`U*=9DW=*² ª¦¥¡«¥¸³³¦©±¦¬¸Á½µ¯¢¸¨¨°ÂÉÉÌÁ¶½À´·¿ºÈµÂ´²²´±¼¸¹½µ¹µ¾ ³§««°¶¸µ¬¿½ª³Á´¼¡¯²µª¬°£¦©ª¤¥°§° «©§¡©¥©¡¼¨®±®¡«£¤¯¦¡¤¤«£¥¥ £¥¬{{~
£}yk~vyxc|zpnoqvgsiheg^lsl`io`o=ZxlU]NPRKIMTZWM]^lWDW_O^PHMDF;7HEKO<rhKK9AE;;==;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>)49&'.34.0+/4&,:$41AhY14S=e_DL6KVdO*;1NW=# ¨¥¤ ¨¤¸°¯¤¯°©«¸Á¹²¹¯«¨´ºÈËÈ¿¶Â¾¯´½·Ä¶Â±¹±³À´º½·¨¹¸½ª£´¨©ª±®¹±«¼½¥°Á¶·¢¯¶µ§¦§°³¤¦¨¢¥¬¨© ª®¦ ¦¤© ±¹£±¯¡¬¡¤§¦©¥ª§¡ª¡©|~}| x
}
|sp}qtt`zxhmoomh}qb{mieb\d~^YsjqJI~iXYMPLJHPRQIO]_nSDXZRhNGKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-B*,4;NN@;73-.+-7**<%53<fd24M?e]FO=QZgH*>/WU5(§®¡¡¡¥¡¸«²¥´´©¨¹Äµ²·®°´ÆÈÀ¶¾Á¹°´¼¶¾»¾¯ª½°´¿°¼Ã¹¨»º·§§µ©¨¬±´±¨¿·¦®½·²±·°©¥§¯±¡¤ ¥¥ °§¡£¨¯¡¡¥¥£·°¡¦±«¬£¯ª¤©¥§«¦¢¨¢z~zx
~yzprwoot_ywdjkjgglerkkdgWar^YkuiYE}^[XOOKHHRUG2:_^mPDWUYeLHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84HBf[HTCT]hE.;1^Q,2¤£«¦¡£¡¸ª°¡»¸¥¬½Ä²¯®¢µ¯¯´ÄĽ³¾º·°³¹¸º¸º¿³´¸®¿Á·«½º´¥¢³«¨ª³¬®²£Ã·¦ª¸·¬²»ª§¥¨¯«£§¥¦¡³¦¤©©¡¦ ¤¹¨¤§¦¥¡©©¡¡¡¡¡£¬££§¤y|
}x
{w|lurmlsbytgfifcmfghdfgh]dbieZezb`PrT[[RKJGIOS@ *j^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-N?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB377aL'2¤¥¦§¤¶¨ªº·§«ÃÀ¶¯¬¢µ®§¯¯·ÁÀ½±À¶±®²¶µ¹¸µ¬ª¼³¯²°½À·®¼¼°¤¶¬¦¦µª«¯¡¡Å¬©¨²µ¬¬´¹¨ª«±¥ª§¥¥£¤ª¡¡¡§·¦¯ª¡¡¢ ¦¢ ¦®£§ x
w{~
{
s}gyplklguskagcbsacefehhaenY]X\lcaLgWZ`VIGHKMRX>9`liHBUS\[HHFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=++,/A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3@bF%5¤¡®¡ ¥´²£²¾·¡±Å»¹°°£¶¬«®©¹¾½»À²®¯®¶®³¹²§«¹°¯®´¶»¶¯¹¾¬¦µ« ¡²¥«°¦Å¡³¦°²±·´¬¯¬®¢§ª¥§¦ ¥£¨°¦¹§®¢¡£¥¡ª©§§{t
|
ogynikjgqrk[hcaq`dgjnkeiecl\llupaSbhceZIFLMOYQPUaeT@VRZTFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24:5#3*)6.55465Z|]1:Kj[M[KXdc@A1HbB'4£±¡©³°¸À¶ ´Á»½¹±¦¶°©®¥¸º¸¸¬»¯¬««·ªµ¹¤³µ±¯©±¶¶±³¶»§© ¶ªª£ª®¬Ä¯¦°±·¶¬«°¯ª¢¤¬©¦¤ª£¤ £¬«©º¦¤ ¡k£q¥v¬©¢x
mi~wql}o]d`gkuxfhvifW\itnNPjceqf]dfnkh][]
hNKC8ETg^JHPPUVKHRapteF[QUPFGFC>1;=6=6<3f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:276Xl15Ok[N[K[fb>G1Na<+/¤²¡ª®¬£½Å¯©·Â¸¾¼§·±¦«¤¸´³³°¹©§¬´¥±µ¢§¸¶µ¨§¶³®´®´¢©´«£¥§¨°¿¨§°µ¹£¨¬««¥¡¡¨§¡¥¦§¨¨«¤´¯£¢££¡¡¢¥¨rx uif~sx o~|¡ |tvlmhdd{mrbTmcmiqXionW]hZkjZplyrhY^FN>F^MERVVQPRWTg^LZLRRPEFG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I:/01.*/(-4583%&2115>1<8Xt15Rk[N[L[g_=K1T^7/(§¬«ª¨ª¾Ã¯²¹¼·Á¿ª¤·±ª¬¦³µ®¯³¶«©¥±¥¶³¬µ¶µ¥¦©³±²¨®ª¡³© ¤¥¢¥±¸¦§§·½¦¬¦©©¬§¥¡¡¨£§£¤¥ª¢¤¦§¡¶¤££®ª£±¥®¡zÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«±yhlX±®nei¼¼nhymqØ}Rkb¶²}~pu¡ªVNWaOVNFU\XPPS[W[P@\DPNCFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22AE/.32.+/)-/186- /416A1=:Ww11Tk\O[M]g\>L1Z[41!§¨ª¥²ª°Â½²µÀµ·¿Â«¦´®©¨°µª¯¶´¨¨¦µ¥¨¹®²²¶ª¥¤§²¯®±¦«§¥²¥¢¢ ¢ ²¯¤¡µº£©¨ ¬¤¢£© © ¨¨§¢§£¡°££
¯kjªh
fq©q®¡¤~wº|k v±_j´[¥e`fzfixj©e¾rg¦v±j|±xucmm§n\ EigEu`}f{£¦X_«h}xzj¨8J¯[XTlcZKOX_\VV;NPWV/ISSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3/.53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:M5^X31¢§¦£¥«²¸´½¾°·Å²¸ºÃ§©°¬°©ª±¯¤±º°¤¥¯³£ª¹©²²°£¤ ª°¬¯¦¨£¢±¤°©¢ µ³¡ª¡¡£©¥ ¡¨¤¢¡ ¬¦¦ ¡µµy©¶w³·¬k¦z
w«gj±[¬{tpx
°vwqkkm|O¥XHcc~ch¥_yquR]P©ncpz
a/R¢n[Tkg`LK\dX\ZB>°wWXA#MiFBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFBAAD<FD;0201;E,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_fW7J9aT50 ³¦¦¡®©¨³¬ª»·Â°¼Ã¹¶Â«¬¯¯¨¯³ª¢¯¼«¢¨¶¤¬µ¤¥²³¨£¢§ª³©°¨¦ ° °¤¤¨µ¯¡¨©§ª¡¦©£ £¥££«¦¢ Õ¹q±ÂÆ}Ö»}¨¤{¢¥y«yV¯{~j¹Z¹w}¦|zªy{±mt»oP¯§ÅQ zc`ªbsrk^Rµ´È
~|c¤3Bu]PjhdP@XfYdaJGLjJZSOYfZCC?E?0<<59<74<;8=:<C:F:;>6:@C;6@OLH<9;DHCBCD<EF81211DB.00483+-).323971#%5*>3==Qwj6*Yi[J[P_fT7H:aP72%£±¨©¥³ª¥µ¨¤¼¸Á°ºÀ²·´½´¶¨²±¤²³§ ¯¶©¨º®¤°±¡²´±¡¤¨©±©´©¦¬£®¨±©£¬¢§¡¦¡¢¡¢¡¢¢¨ §¡§¡²nhµr¬p§r´ut¶{¦£~£~°uÒÒu\®|
¤nª¦j
}}{±sy³et
nfRÉZÂ\yb__vs
a]YÊoÀtMKµSUÆdUQjceXAOj_liPUFH9=WR[VYHB?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\ANT_eP5G=aM62.£¥¯¥©»¦µ¥¨¶»¼³»¿¸·µ¼¼´¦µµ£³²¤ ¬°¥§»®¥²±´¸ª ¥¡ª¥²¨¬ª¥ª¤«¢¦«±¦¡«¥¡¥§ ¦§¢£® £¥£
¬|x¨w£ªp®
¨£¢}®³\r²S¯}£~q×}w~w¯w´ael[°WKuyf`^vvgj]¯wwl5yÈ®³_CTo^g`EPl_pmVUM.echRYP;AD@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!03767=Pke>&Vg\@=V_cN6GB`I:77 ·±³Á¨²§ª²º·µ¹¾¹¸³·¾µ¦¹µ¡¶ ©¬¨¶¬¨±²«´¤© ¨¢µ§¦ª¤¥¡¤¨§°¥ ¨¢¢©¦¡¦©¤ ¡¢ ¦©~¦y¡ªp§¡££ªzyp±Z¨ xtØvt§¤|{²^d }n\«\[hgªcr{jq]«Z kndOJC¡\ZMt]bfMZa_rt_JU5JXHE=GEAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>002154+*05/7,&21($$6671<OedA&Uf[?1T_bL7FH_C1=7¢¾³Á®«¬¨§µ±¸±µ¿¹º³²¹¼ª»¶¡²¥¦§§«²©°ª¶ª¯¡¢ ¦¤¤º££¬¡£ ¡¡©°°¦§¦¤¨«¨©¨ ¤£ ¡¡ ¡«®nr´t©w¦t´zu´§¤¤u¸n{¢kk¶Z¡eh ¢§mr´s³j
ju´af¢nk\`N¡|Rs£ly~no\¯V<weTon.[§ObRkeblYb\`p|cSYQ>?lo2BB@>M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U^aL5FM^81A8¥º£±À®®««¨·ª¸¯µÁµ½²±»¸¬Â·ª¬¡§¤¢««¨¶£³¨®ª¡¨ ¥«¸£®¦£¡«¶°¦¬©¦¥£«²¤ ¨¬°¡¢¡ ¡©«Ó»u±ÄÄ~Ö¸y§y¢¶u}wv²aºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¡}t«}¾ns¼t²uxmpm¤t½]w}[ay¼jZV[iy^i`dfbmxoX[YCA@q?CG+4H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,;:08LXaF'TcX</T^`K5<L\-6@9§¢¼£°Ã¯ªª±¨¹¯·Å±»³¯¼°®Á²¦£¤¢«¥ª²¥µ§¤«§¸£®¡¦ £¯¹±«£§¦¥¤ ¨« ©¤²¢¤¦¡¡¤° ª
¶¸x¶wnlotoyrÀ»¼{²¨pt¹|{}¤»¹½uy³£tuut°ufi¶trqw¶^y}gylyb¬pt
~X[§iDdYTf_c]cQgfqmuBMOLD;ZL>J3<0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITBKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿¦²Â³«ª¨¬«ª»¯±Æ¯µ´°¸¨µ¹®«¤¢§ ¥®ª§¶¨¨¡¤¬¥¾§¡ª¢¢¨¢²µ¶¬£¤¢¦¦«©¥¦¡©§§¢¨ ¬¢°©§¢kj©ytv{f{½¾Àºoq
_rjZ^acl`cmvble^`cqhr{fj~ptx~}b[xthP\n||jWlzrIJo
pNrMDV\f`LZWfc_OZmvjrRODDM<HI<L>2,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5CFUEJOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR^I'S_V4)P^L(3>\O'?2>¨¨¡Á¤´¹¶£¬¦®§¨µ²¬È¬°´¶¤¾²³¨¡¤ª£¬§®¤¥µª¤¢§©¾¨©¥ ¦©¨°²¾¬¦§¢©¨¤¬ ££§¢©¡®¦ ±¥¢¨¤¦¨¤hn}rw´ª
¡y¤
li{}urxyvv|jstudw}vkoyl_b[ogMXYfj_WYpzomfSOFS9PZNRO(+:KB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[J'R^T10T^:+=8]K,<-@² ³¢¿¢£°±· ª¦³§¦°µªÉ«²¦µ¦À©´¡¥¦¥¡«§£¤·¬ ª¦Á¬¤££¨¨¨²Ã¯ªª©«¡¡¢¥¯¦¡¤§¬¥¡°¡¢§¡£¤¡®|©¨
{
£~e¡³®w{~wyzogyjuyrhsyujtbxe_hdcdfjXk{qjk\SLPD_UF@>?,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@³ ¹¯¾ª±² ª¦²£¬³°Å°«¤³¯¼¤´¡¨£¡¨¦©¦¤¦³µ°¦®¾¡¬¢¢©©«£´Ç³©£ª§© ¥¬ª®¨¤¢« «¡¤°¤©¦ªf
}ecylhjz£«je~g
eeihz¢kh¢wkj£skmzyXe]
^lw\gswwnwxsmysvzhX]jsd]sij|qmc]QNVIdX@I3=F7?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]]_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/AI[J.6ZO6)EY/DO1YB;?.=¤º½¹¯«³°«¥¨®°§®®°½±ª¨¥®°° ¡¤¢¦¬¤¦¨©³®¤£°¦¶¹¥®£¢ ¦{¤«¢¨´Ã·¥¡¦¯££¤ª©¡ ª¯ª©¢ª¦¥§ «¡¥±¤¬¢¦ ¬~½s´s
hw¹Ä¸q¡£z¦t«}ËÀÀºq£}À½ÁÁ{zÂÀ}j¥²ooÊzxvyyq{pw
xlube^wc_eb^thmdbXKUIQYHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^_`a_^^^^___]\SMPGUNA@?=6468266*&%#)*&.+*)109*#>I[L*#CP/#F[3PY/UAB;/8¢¹Ã´¯¯¿©©£°ª°¯®¦²µ¯ª¦§¦±« «£ ª§¢¬£¥¨¥¥´¤£¦®¸´§¯¢¦ ¡ ¦«¤«¿¿± ¨¯©¢£¤ª£¡¡¬®¨ª¥£¡¤£¤©¤©®ª«®£¦¢¤Îz{¥z_]¨¡¡|§u«¯^dª{¨
t³c« ³j¯t|¸aY£Ínv{Û{q~ve{uvl~m}
}k_pjof`_xd[qhjdf`RTSW^JOC5AHED8>5;@?A;=8@>??BDDFIJLNPROS\___^]]_``__][WOUJ=?><5578164('$!',&&/(&+360$7:SL+,-J0';[:L-!P@F4.1¬ÁÀ¿´´°·£ª©µ«¦²¬¬¤¬¦°ª¡§¦¢¯¡¨§£¦¡°¬¦®±«¨¬ ¥¥¨££ª°¨¿Å²§©±¢¡ªª¡®¦©¨¥¥¢ ª¬³¥¢ªª¤§§¢²¢§¡¡rv¨q±|q¬} ¥x«~r¬v{|~ª¢}«zzVÄ{pÁ}mupmfweoaxnrnlcmsuo`fmd_oijnfcWS\`ZRRC8II@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;91478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1-+¯ÓÆÇ²³££¢¢¯·¯©±§¨ª¨®««§¢¤£¦« ¢¦ ¨¨£°¨§¯¨§©¤¢¡§£¯¬¢¬µ©¹Ì±¬¦«¢®¬¡©±§¨¨ª§£¡ª¯±¢¨«®¦§«««³¤¤§
¤k¤uz©u{²q¥p ¤_aR«
®u®¨z{f£¤£}©®^{¨U¢{£|İÅs¯´³¹rb©¯Âthkmkxxwnkfddqqf{ic\V_iXXTLLQLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^`a`_^]\][SIB6799664,&$" ''!+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÂÉÕÖÀ¡«¨¡¯¢°´°°©£§§ª««¨¤¦ ¥¦§¦¤¬¢¬¡£¯£ª¤µ°¯¡©§¤¢¨¦°¥¢¨±¬¶Ç±´¨«©¡ ¥³¡§ªª¢ª¦ ¡©¢²¬¡ª³²¢«©±°¸¥¥ª}ªmv«y|°n¤Ò¸´¸É²_a©¥ zyªÉt£¨©~ÆÆwe¡¥s}¯_oµc±uK£m§Gd{o|myt|zm[ejrqfi^aXcm\^YILLJEDBA=A<A?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^__^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4NTQ;<F2,$¨¤Àƹ©²®¦¢²¹¬«¡¥¨¦ª¬©¦ ¦¥«£¯¬¦¡©¥§µ £¨«¶³¬¦ ¦§£ ª§®¡£§©°³Á±²©¬§¥¢¤¯¦¢¥¥©®«¥¤«£¶¬¡±¹°°¨´´µ¦ª¦¡Nwz£|¤¦¸||z¹ÌÆÃ¶w¢~v¤¤§~¯
¬}a¥l£p
}r¬`¤sqa¼}RUu¡z|ryr~o[lnwrjnZc_hnbd]LLQSAHGFH::K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,- ©¬¤«¹«¯ ¢¬³µ¦¡¥¯®®¨§¥¥¤§¡³®¢©§³ ©¤£µ££¡©µ¹¤££¢²¦¥ ¢¯¤¨¢µ±Ã°©¬©§£¤¥¥£§¡«¢¤®¥»¬¢·¶®¶´º³µ¨ ±¤¦ ҵ÷y
¦x¢w¡
¥r«´nri¤}s®¥£¦mp²\¥szl{~n©a¢rr~ bs²¸hw¤|u{xlhwixsnt\ddmmfh`JZWX<HF?S3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^`_]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH#)%r®¿¿¼»µ¨¤®¶¢¢£ª§©ª¥¢¦ µ¦¢©§±¤«£¤¤ª´´¤¥©¯ ¦£§µ ª£µªÂ¯¨ª¨¡¢¡¦£¦£¥©§« £¬¦¼¬½°£±µ»¶©«´¦«|¨}|°x¤¥m²o¡|¢¨¬
¨ £
{~««w y¯]£|¦§d|uj®]¥lr
]`[ m¤wy~il~b}tmy_gepogghBY_Z=JS2S8AAC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI8152.*,ATVVVTTUUUUTTUTSSVWWXVUVQHFIJ#((¼©ÆÃ·Á´ ®¹¦££¤ ¯®©£¹ £«¡°ª®¡ª©¥±¬§ ¨¢¡¥¡¤¨¥¶¨¾®¤©£ ¦¥£¢§«ª¡¢¨§¼¤Ã«£¢´¼°©£¶±«w¯~|ºd°e®}¡§
°¨¤¢¢
\lk³`|{²lfn±Z}´[¤kÈ¢f|»YvµZ²}S¯z¬X¡m¦xw|cs|bwt|aifomfefOUc\AT]=H(>9=4!!,$2. *1/04579:<ACFHJLNPPRTWZ^```ab^_\[XUPMJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·¾»´Á³£¦¥·© ²±¨¢µ ³¨ª«°¬®¨¢¯¬©§£¨®©¡¥£¢¥¢¨±¨»®¤¨|¡ ¨§¥£¤¢¤©º Ƨ¦©¡¬¶·®°©¡¿°°°ª£¯¤¸Ãº
¨¬¯©¦«~սªb¤¿½}£×º·µ½¾j£o«nz²±Çk«±½¬yx¢¾»t¤wyb|ydfx{`kejjbPb[Si\@T`BL)<:4/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´±À¹²½³¢®§¦³¦¥¿©¶¯§¡¿¦¦±±¹¨®¯¥§¯¬®¦£¬¡¥ª £¦§ ¨¢ «¬©¸¬§£{¦¨¨¨¨¦ ¢ªº©Å£¡°¤¬´µ¬²¬£¿«²²uvª¥·e pg¬nnw¥ v±prª¤¯¤rlmmfxomqzipigqhi
gqd]cioZ]g~x¦`brpfd z
tdwgjx~ydlcflbJdWIjY:PdDP'J9+# ",)-2.5:457:<?ABDEHKLMOQSV\WZ\`_a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´©º¹²´ª©¢®¤³ª½±ÃǼ´©¿«¬£ §« º£¤®¬¦ª
¦ª¢¤£ ¥¦©£© ¥¥¦®¹ª¬{¦¦§¢¯¥¢«¹°Á¨¥´§±³¬°®ª¼§±»¢©¦µ£©ª´¤¢´¤£¢££¥¢¬§¤~gtwtq§m}
phvowu|yikddocUaX@iZGb_MX+E=+&!640/ %2(*799469;>?ABDFJKKMPPQWUVY^_ac]^TQJEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¤µ·¯®¢°¥ ¶±ªÄ¼Ã¹¶©¡¤¥°¨¤·§©µ§¨¬£§¤¡¨¤¨©¦ £§ ´¹§ª{¡¤¨´£¦«·¨¯Â¯¤¸§°°²¯«¬¶½£²À§¤¦µ¢§©¢±¢¤³«³¦£¦¬ ¢« fuwztj}
xqryq{~jnd_pi`\_YmbP`bOX9FFE=2<=8/*&+)&&406658:==?AACHJGJKLMSSSUZ``i`eVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤¨£°³¬®£©§ ¨µª£²¹ª«¡¢z¡°¤¦±©¸¦£©¢¯¤¨ ¡®«¨§¨¸µ£¥y¡§·¢®µ¢°°u¤¿¤³ y{¢µ¿x°¦¡ªd\bw ¤~mµ¤©°¬¥f ¡tzpªl¤©e¥
xkvq|ai[vggqy¡dx
vhnykpd_vokkg[ecaamQY=MMNRF=@TB91/&4:306678<;>@ABFHBGFIKLTUUY]`hfgXQI<DG<9UR[`ab`^__`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«ª¥©®£§¥ª´®°¥©¥ªs¯ ¨«§¹ ¤~¬¤§¢
u®¦¨£¹³§ tv¥±µ´½¨¢~§£{¥±º¨±©¯¢y¬£©«©w¥{§{³{ bynqzqt
xht s{~ijx{qpfexnilj[diidqZ\GSKQ@E5-YTT6)!09=>643568;:=>>?DI@IEJKGRXZX[aaifYQH9DL<>bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah¤¦®®«¨ ©±§§ª¥¬Ä¼¯ ¥§´«§¢ ¾¡}¬£¡¡¨¢£¹±§
pu£«´´®Ê«¯·
°³²©©|¨r{w¦h¤y´¡ ¨ªÂ«¡r¥}
³¡}¡|
nt{s}
uÅf©¢jogwt{vghupghk^bnlfjWdE\PL2E46M`c7&3<EGD:63658;8>==>BL?NIJLCPZ]\Wb^jl\QE=KM@IdX]cfhgbbbbcc__babcccdiicbbbecafcbbi£ °©©¨¦¬ ¥¹±©«¦¡¤©¡£©µ¢¯ ¦¥½ y«¢
v £¢¸¬¥~bm §~¡§ ® ¡²¤¬~¢vk«uM«xª©ª«~¡|{§jlg·~n`cX{dgs}yl\|n`Sq
\`mz`Ye~
q¨ªk£nr¥ogdlZlzeY_~aWPoventqjjo]ioljgWfM\WE8A4GC^k4+ICQMN=84859;6@;;>BO>QRKMBJ[]_W^^cu`ME:MNMTb\[ffiibbdbddbab`bdcabjkdbddgdbgeach ¹¡ª¤¦¬¢¶½«¯¢ ¥««´¡§ §´u¦~
¬£¨¥¯¦¢in¡¡¥£¡ w§£©¬°¥z~}¢ps{ymª}¢tw¦g~w¥^{}s¢n·´ºs¶¨dƸ|q¶q£ct¬«a~j³~n~q£lr£r}£^³o{³tr[²ibptuqhoXjkqpd[f\aKC=D5QAYp2<RG_JR=<395::6C<;@IP?TNNQ@E_^[YW``{dIC8LWUVcaZffkkbbeadc`ab`cc_`cknccddhdbgfchh£¹« ¥¸µ ¡¢£¤¬±¬« ¡¥¬x
q¡}¨ ¢¨§¤~k{} w¢ r¡©¨ª®®~z y£xs}¨£d¡~mho{§}rhtªsªg]
vhªj¸f\©pa_§vwhu~lj¦\¨~w»j}©Z]³g\nqxwki[piwwa^cVaAPEN7VBRm4JZZ^NZD@151;;7H?:CHU?YSX]>Db]V`Qad|iEB9N[]XdfXffnmbbe_aa__``ec^bdoq_deekdcihgkiª¶¨c¬»²°¬¥§¬°§ª£¢ £ir{z¤¨¡iy{}¡ ¡rh p©¡¥ª¢ª~°¤¢¸v£³¢£xzª¢r¡}°µ}l¡x~µ££«¨||tªZ]o{xbM{{
dzBMY¢js|ovy±³~¦s}mp|ori£]vHec`sp}}ne_kguzbb^O]V\TV@YEPfDRV\aX^ID=B8?B:HE8LEXAWRZVEFa\Z`K`m}qEC<U^bZejVghmobff^a`\]^`hb_ecvl^egfldelhhli±®T_¡§´º³³©¢©§ «£ §¡w
ny}r¡r¨|l
q¡w{¢£®}µ{¦z©£ §hxn~s sq|
o|¤§¤p^©hv£dp¦aÓ|{xrsc¢~¢r£vk³`tª²¨¼wn¿¦ª´^orps¢r^¤gt¦`h¦lÓynvykyvrl©¥g_dyqlhfcmuvf^`QZePQaHVIT_WS[dj[ePECKLJKAJD8P@PMXSXOSQ`eejSdxywIFEc]eZhiSihjncjf`c_\]]_hbahe|d^dgdkdjlfhlh±¬T]Kª°²µ°³¢¦ ¢¤§¨
{p}h|wpl|£©
yvnw
¡x¡£³¡¢¶z¬§¤®¥p©~¥£q¢¯¤¯£wµ¶¶É¢sa©my u¡w ~oMf£qs¥{zubm~ lrd`stk{j´¶´Æ¦s}yj«slswiytqPD}³^jukxfkfbstolU[RXgOQgIULXRU\gknUgWMJAIMJGJNAQJPdcjmeuss~x{ntz{TQNm^h\kiRjhilgmgce_\\\_ibdhk{_]dgcjfnmeile¢°¨
e?¢²¬¯¯µ¡¢§¡¡£¤¦¥ykyeyuj
z¥¨z}yp
y~¤¦gnxl¢d|r¥xph§}¥{¡rv¹m¢b}£nsk«ku no¦aiiu¢~`uobh¡fjupdgor¢[_[d¡n^q|trd¥nx¢cf§gqm¡oRn ^d§T]TmmrkqmphkwsjnQVUUeYSlIXN[HWhhrjYkVPREV\MXSaUhj^wu{|p}|r{sww^QsagbpgPkhhklohdg_]]]`jbjivu]\chcjirlfkmc¥¦zetm§®¥©°±¥©£¡¡¡¢{qh|st}|e|¦¡ª
}si¥}
©¥¦x~¥²¯¥y{©u¨n¥¢¼m|¥¯
¢~¦|r¨¡h~o¬cx¨mª£uw«¦k±lw³©loo b«ªw§w}
¤ gu¬f¶sv¾£Y¦«aurto{upbj}nglRTXT``\kL[Q[I]lmv_[qY[_Zgsdmoqcqt`wz~yrys~{{vbydcnsdRlggomrifia_^\ajbll{o\\bibmiwmglnb¦«¤ªª¨§£©¢¤¨
t
zo
~strn}{
¤¥¤unl¨ª¢ t~x¯¤qy{s©r}}zx{}}w¡¢
{l\zyszqin~qtqe_xvsupzooo
_wixfªt}io~u{tmlfsw{wZjWyinwrqowxo]k
nhgVY^V\djcU`T]Q^owykjwdijju|pqtsaoubs{xuyuy
}{mmdyn^Wnghukxjiid\`ZcielqunZ[bkdlkymhloaº©§¡¢§¤¤«¡ª¦¨~r||~{trp|}y~£{¦
wqª
§ «~¨¨xq
}p«q~qjo|hn] srulvtYro~j]id{
`ix{|vizlbqsw_s¨glvnwmdecyzZ[ifmv[{ywtnsrf\mkkbYX\YXjqZ^`Y]]dr}ztotbjji{|qzvtdmthl{uz}{yzo{}s~zrhT\rilvpugkgd]aYjhkjqrmW[emlgryohjm`«±¡£¡¨¡ }«¡¤{
|r|v
ros~z¥wy¬¡ª¢¢££«¢¨§¡~z©±¥±¦¡l}wwf}
w|{u¤ wqux§zuj|yiqh`sp}{wvowt]^ogn_^YZ\SgpUc[[`lgt{{rnocjih{mx~phpplf{rw}{m
|zy|~zxNdvjsnq{dkebb`[sfpfrqlU]ltmhxzpgikeº¢¡¤ z~©
|y{mxr~mk~z~|©r
|z©
¦¢¦¡¦x}§|}ª¡© qyruav
nzvu¤u~~ss|
{y
¨t
ymj|{mhklf^yg|{vtvu{w\`p}nt`cZ[^QflSdZ]`jhty~pllcjjgkrkktnwnynv}
wq~{{|{`i{kuhjdjc`i\cugobumlTbqyeoyzrejmm¸¡¤zw¤¤yz
{l{xr
}|kh}|~
|¦p ¡
|§w£ ¡£¢¤{¡~|¤ ¥uuqwa}s}q~
hxrzs}}rz||{¦{
s
wdpz~xypkjf^~sh|uus|sj^`tvpwdcX]^RihSdX^`giuxqfkclgejm}gmpj}w
zkr~uv|z}jrntibhlb_qVtolm`xhlWjsvctzzqbkoy³¥¦ {u£¡x|~~p~ztu
~wgc}x}y}o
¥¦v¡¡y¥{
ys¢ ¡}wr~n{d|qk
fvp}~y}~|ryz
£vtxs^vw|s}vfkd`~ijwssu}q|ccasnurmaY_]ZkcRbW__gjty
pbjclfh|khthloh|xl
qt|~z~|muttmfljacuVipm`yglajvpex{yp_ql
¯§©
|v¨yx|}}{xsxys}d^}
t}~~£ ~q{¦ t§um|o¢}{qzkvm{n
xo~~esj}
u
zwy~}¥y
t{~qr~k`ytyp|n`mbe{bnovsxwstav`oluno\Z^]]i]O\Wb`glrzk_idjchwmflhilg|zwns}tz}z}|ryxxmlkh_iqbhqoevgmlazhj|{wpawm«¡¤©|v¬|v~{||vwptszo
}~|a\~rzz¤}|£
n¢¡pg{
p¡}|tsukqou}uort|}ernz~
uu{p}
ª{}~v|nl}afwstnza^o`kt^pjzyylrpey^nlsmsXZ]_aiZOVWdbepqe]ihgbgqnchheigzwuo
s|u
x
|xzw{zrykk_ohtkqnmqgoke{amzwpkww££¨¡¦t¨ s|v
xyrszlroymvnq[Y~vu w~
m¡l¦
gx~}}pvplnop|isqxuzgtpw}
{{xur|{
¥|v~wwlh}~[qrqoovY^o`pj^oj|zqnmjmw`pokqmYX`aalWPRYeeatoa\kmdcekm`ff_gjurrotyvy
~wv
{{vjqc|b
|oplujhnlww_q~y{sus~¥§
~tzrxtpr
tquloltlv}mnUQ«xvry wz¤
}r
jh¢
qw{{|}lwjoklm{bz~wzx}zhumv|r{qx{{}|w|vogi~v]vnmkprU]nbra_mnyphpfgsuhplawe]Ue``qSPN[ec\wo{^\hqbbeei_he[go~okqs}v}
uvy{xs
~|yxfrk`~ooj{`imtt^s|xwss
|x ±¦~wtwspp
spqojiumn}|musRNᐙ|ptuv{r
¡
}x{zxin¥cpz|z}m|esokm{z\y{~{ziukt~mp~
{}wxwrkdn|igsnghslS]odpZ_lqwgkkbgxsppd`x``Uk_^tOMK_fb[wpt\[eu`addc`fbXistnkqv|tyvw~szq|~vesn|e~nokYknyzr`vz{vrvvy¯
x~{
uwoyqoomn~rcdwp|nz|jhlb¤ÁÜ®ï¢sluu¡np
£
{vx
vxp¦^l|~v~~l}dxujoytX{zzgtjmwo{utxtrpdrv_rloahtfR`pgkU_nsyarc`i~qrn[crabVnZ\wLLKcf`]urm[\dy^`df_cc^Xirknkrw}swxx|q|}{t
shurymznspWpzvyqdvyhvq¨¢}qxx||svpsjoljm|t^`wv{ptzg`e|ëÚµÉÃÜsltvip
{zwxrvr¤
a
h}~
rrwhvritxmZ}}wbum~omz
}nqytjoiov~]rhm\it_QdqhfS_qvt`p`]hqrjWgichWmW[tLJKef^aqs
i[\ey^^dgz`d_]Yknenjsw}sr{vzs
|vv
{vlwvyxtnwz}Xy
qngxvdv
q¡¡soqv||yrsnodr~iflww[_x{zqqiagaÕ¶¦xnqw{qj
zh|{}
zu{|qvx ¡¡af}~m}ulmwutwvkc
|
p`tr}}zr
g{
|
nox~tlmhiwz`giiXktYRhribPbrxmbe^Zjntb\h`em_oTZnMGNfd[fmqkZ[cs_\ckvde]]Zllbljsvqo|}txx
|ux{voxy{omzv^tlhzssgs|ruu~mu}|v~vqoljat|gbiuyZ`w{ymq~edhhW_rs¼Ävq}qrj{|
|{uvw~ru
rw~f~
q}f~|y}i~vgpyxswtlky
l_sy{~|sjz
y
~~nmz|usmee{sa[pbWnqSSmrhaNguxf`^]YoosZeb^jn`pOYjQDSf`Yjmm|nY[]mcZbpvcf\]`kicljsvqm~|tuz|
v~xtrxy~oozqixz~ml{ukjxtk n}uiw~yoztqkjd`szh_eqzZ`r|ygqyaee±²wKbZ¥ÙÐq{w}
nk
zy|wwoqu~{jy
¤px{
p{}mvh
yr|e~
vdqsiyqpu}wy
zk\rs~{sor
s
{
ynn}~uyceh{n^XvZWpkNWqrf`Klwta^\[Zu~spXg]gjr`oNWgR?Xf^ZojgyqZZXkeYcpy^g\^elgfkiqwnl~up{vqq{|zyujy~ko~t|or{zon~xg¡
gogy}~|ixskkf_aoym_box\dkyaqv_eeÔê½2:>qx
u~~mku|
|wnvwn
lu{ufy¦~nvx
|{w~jqh~yn||wbz
rdri~nuru
tv~so\nuy|~y{rm
szumjvts[ggunWV{RYodLZrre[Iqxo\[[Y]uuiYb[hfodjMWeP=]e\]ue`toZYTncYcqyZh]`gmgikipw}liyn||zupnw~{{hz}js{r
zsv}~yx}|kl}kh~z}~~}kvqghb[bgro`aks`hpybst^cd n\5Z¯µti|u
svoltyx|y~rgv~~oqivynfy¤~ow
|pz}{h~lj{zj{wr`w~rdrgvnu|}owz|umYpwuxv{ytos~|onimtm[edqoPZzM[n[O[rodUKsxiWYZZaqua^]`gdiifNYgM@`c[`u`]ulWWSt`ZdorWj^bhjgmlhpw|kh}|o~~{zwq|oqw{i}{mwxvv|x~}zm£{uxklx}z~prqcf^Yf_pp_`gpfjntato[adjv{¿¦¤È¸qr{w
srro{sttwyypcwzirvgwucj|~su{
{{kxy~tgzhkytizw}h`x}kkth|iv{~q|v|tbVx~st
}qxyqq
z~vwjqhlqo\f`qlIduK]lTSYrnbQOtxaRXX]apt\a\ieedkdP[pICc`[co]]xgTWVv][enhVk^ajgennhpvzmiy}r{~y|v}pwrmw~p{wxztx~yuo~}
zw
{gt
y~{vgpn_d\XeYmsa``plkhnatiY_dnw©Ú©Ç²qwotz
ytst}woqm
t
xtk`zyfrpgun[m}x~y|nxw
|
ltv~lgvdm{vmjww|abxziuuc~|hu|uwq{}nZWupv
ymtzlv
|~z}t}thtenlsZh]sdGmmKZ`WVUwmbPRtvXPVX^`ro]`cmed^ocT\qFBe^]eg][zbQV\t[Zgk`Vj_`offkqhpvxtju~vx}w{t}ortqu~
zvx{|
w|}~{~ruy yvtx^}
xs
wzbnm\b[[aVisc`[gnpfqaqfW]ck|Êι¡jmmlqq{~zyxsxut{jlvcuvof_}zerkjqcXlz
rw}os
t{y}ppo|fhqamxqjlqx}}z]ezxjvxfwht}rjo~yo}]Ysnt|ooqwixx~s|u}{sgsankqWi\v[GmjLVU]SU{kaOTurPQTW^cui]`ljfcZoaXboGAg\`e]\V{]NUepY[jh]Wg`^rejhrgpswxntzx~yur
pp{xwvy
y{t}}~~~}|xuxx|muxd
so
ztdnjY_[\]Tgse`XcqrgrbkeW[`jx¾®{·nas
hszqxz}~wwrvo{vejoausjb^~xyfqhkkZVow¢qrzvou
}xtqnhx_jl`mvjgjkywzvZg}|yfs~m
ueupgk{unub]q}lu}{gu~nqivyt~m{|{xqflam}llUi_vUJijNQNgLX{haNUukLQTU_gvg^aqhgbWj]\kgJDjYbcVYUyYMVmjY]kd\Ydb^temdqgrpuwpv~w|
}usnsy{zsrx}u~|{~{v{wwziv|{lrp
pglgX][\[Sdpd^WbrujuoeecW\[hporsddy}isusrwxvrumjzqagkgsmf]_}p{imxgjdUWro¦|{vt}t~|o~}x}}upqlgt\lg^ltdgeizo{rYgwuhpxwbw|ojm{qgtfanzhsx{~bvwjlru|r{{thywodfbm
{ljUhaoRJhjOKNoG]zfaMUtdJOSWakwf]gtif`VdWbp\KKjWcaUTUsVLXudY^k`[Zcd_vgmbpitor~ttw~xz}u
nrt|zuq
zus|
}}z}w{£¥y
kt{zuznsy}vojieV][ZZSbnd[Xas{jhmi`bX_Ziikogl`hyxjrssmz|utmzhjyj_enhvgeXbwj{ojpgf]TXog§vz|zvqqux{zvvjruggn[lc]mr_gajxh{l[nrtjp~zxaw
y
trpzrcri]qxert|yctqgjyusmyyvye
|ywqddcm{|jjTgaeSIkfOGQjE`wfaMSr]JMUYelx|f_nqje]VaUnnVJSgWe]XMUkTJ[y_[_k]]Zbe_yhlaoovnpwuz~vyzyz~qtt~zvt}|kr{
~}~{w«zkryu~tnn|sjpnddX_ZYZTbjg[Z_ui^ml\aW\\kert}ii\kvugsvql{}|xuqlygixf]dshzwccTeph
xxgijaWVYgc§o~w{qri{q|}xs
~ndurdgg\ja]oo[g^mtezh]torkq|~uvbt{ysuvbqn[rtcqs
|uesmam{pkj|zvtgv{{vqebdmr}ikSg]\TKqbPFU`GbvfaKSoXJMXXhkv{eenqgdZW^XweTJ\bWgWYHWdPHbxZ]_lZ^\bc]~ij`otxmpnvzr|}uux|suuyzz|~isz~~
zz|sq{{}dqys|zurnl{~lzcpobe]eVYYWcfk_]\s
hXqn[^XZ\l{bpwulaYlssgtuolx~xvmnsdhte[gufvvz_]Rfgkt~bdj\TW]bc¤ixsynq|jzo~}vty}yidvl`f_^i_]tkYe\oobze\w|knnpxytues{wpstcxe\qqbqr|tgre_nwjehz}uopvt}srb_fmn|dhSgWXSMv^PIYWHbtcaITmSJMZWjlr|cmmscbZZ[aw\SKc]WhSVFX`MGiuX^`l[[_ab\ihanxymojvym~vtttqvvx}}~~~pw|yxz~ttq¡zzwcuxswtkto~kx|ps^pn`gblTZZWhcmf\\qeSrn[ZXW`lvciuji^Ymspksssi|~~zvnmkdiqc[jrdtvs[WSearr]bc]SZ`\ceqq
ull{opr|}}sxt{zzdeug]bY`g[^vhWb]phawa[|vijroxtsuiq
wtkq~ogxX]lncrszsgp~\`prb`ksmnvsqxkpa\ellz`fReSVQOuZQOXQHcsa`GVjPIPZVkkk}fnorb[ZXYlqWRPfVVhSTEY[NHqtX_clbX``a]jcdmzxlpiuy{k}|y|mrnvz|t|tx
utqvp¡szzewnmznfxpzksvsk^unagekR][UgalkZ\qdOon]VXUgishbted\Xmtloutxj|{vrcdkna\nmcsxkZTVcdx}}q]d_cTZ_Ybcmp
tki|pguyu}m{uvp{u_frc[]VacXateU_`mdaq]]~phitqtquwkm
}rsgprtpT\gkfrtvscmvVcrl[_pg~fnx~stsjmaZdijw^eScTUPSlVPVRPGdr_aFXiNIXTWnie}ilxlbW]U[tdSRWhQXfTSGYYOMwvZ_ekiYa`^]nbfkyunoivvl}{~krft{u}r|
{ss~vn¤rvwlz`d{pfysxlmqwgd|mcfghS_^Ug_ln[^nhNim`TVSogskexdd\Xoslqzwrl{vzykaelm^`ojepx~gZVX`lx|{p_c_gVX_Wcbkp}xllzn]xsm|kvtop|sXjn^X\UabWdpcS^biablZa~lfltvomwwli{nrfr~ntnd[aiiptts^imSeqeVcod|dsx}wlpmk`Yafgt\dU`URNWdQO[NOHdo\bGYiMJ_KYmd`yin~e`U_T]u\SR`fN\`URI[XPYtu]_ekhXb`[^qcgjxqsnhvt{rz~|yntkst
y}|
sstxro~zz}~~}}~~}~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~mfggggg}
]-0000-F¡¡¡¡¡¡ wegfffc¾»»»»½³mfgggggmnnnnnojfggggfo
}}{{z}~||~}}}~}}~~~~~
g_```_^yS7¤¤¤¤¤¤£r]____[~ÈÄÄÄÄÆ»g^_____eggggghc_____^j|}z{z|}{|~}}}~}}~~~~
|yzz{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}~}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}~~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}}~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvutvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfggghhgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{xvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVQQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwzz|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNONONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMLORNYpprwxwwtstwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??;898;;:@;;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;89:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqususqsxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;;?@AB@=<9<=<979::988::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;<<>?=<=;:<===<<<<;;:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?CCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{}~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@=<=;>=:::<:8988:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvuw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@???@=?@><>@?===?==>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hloppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCDA?@@@?=@><=??@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBCC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz|{||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>;><?=<:>=?BBE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEFFFJNNKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBADeopqqtvux{|{{|~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@DED?;ACDB?>A?ADEDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFJHIGHHIGFBDFDDCAUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrswwz{{z{}}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKLKJKMJKHHFFGFEPl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD???DFHDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsstvxy{{{||}~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKKMLKMLIFJVl
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswyz{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHGIIKLONNQNQ^r
fBB=88::9878896479;<:8567789787689;;<>A;999==>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@BFHKHLKNTg{T;8656766645763468:876565677778:7778:;7689989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:<DBDFFDVx
H676468874578467799766765::;::<89899877:::8878589;A=>>BA?AKLOQPQOOOQWkrrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897:A9<D?P}z>:88;<=>9:;<89;9:;:99;:9===?;;;=:><:<;<;<<::<8::;:999<?<=ABDIJMKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?:;<:89989999:>=??Cv
l<;>BCEEBAAB>@CA@?=>>@?>?@?@==?B?AA?A?=@A@??A<><;:;:9;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:8:;9::;<:::<;=>@?=a
^>DGIKJJFGGDFHGEC@@CECB@BCB?@DHECEDEEAFEFDFFD@B>=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD97:=:<:==>>;><?>B?J~
WGLLMKNIIKHIJJIECDFGFDCEFDBHIKGHGFGGEKJLIKKJCFCCDBAACBDCCDDCA=<>@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97;>;<:=?>?<?>BAD>h
PMPMKNKJLIIJHKFDGHHIEEHFFELLMIJGGHIJNMOMLNKHFGGEECFFFFDEHHFCA?@Lmptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<:;<:=?<==?@CBHS~
qMQOMLLLLJIHFJIDJHGKJHJGGGKLNLLHHIJMPNONLOKIGIJHIDIHHFFGGIFCBACUopuwxz{xxzz||}~~~~}~}~~~~~TDAABGHB?8?@8:;7<=:<?<<=?BCCLm
^RRPMNMKJGFCHJGLJGKOLKJJLMLOPNHIKLOQQPQOOJIJJLJLFGHGFGIFEEB@BB\prwxyzyyyzz{{~~~~~}}}}~~~~UECEEGGED;?A;=<8?==>@ED=BDCFJu|WVRRTROLKJEFFKONOWVQPOQSRMSTOMSLPSUWRSRPLJMMMKNGGJFFHJDDEEBDCcquyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?=<A?AADTKBHIFIKx
gVVkaERQQPJ;;QSR`u]UVTVYYRXXRZfPUWZ]RTWQPNRPPPQKKKGHJHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGGFE??A@EACFDCDKVPJOONPPy
}al[dU:XXXSP?@VUY\d`VYbr^]V]ZVEQYZ\Y_TYgRUVXTTVSOOMKLJIILMKOMSotvxyxwyzz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HLIMPKIJOSQPTVUVTu
g;~znpXZ[ZRSRWVTZZuYU}a\X]^WIV^^[[_YHYXY\]XXYWRQMPQMMOSQQURassvwwvxyxz{{|}}}~}~}}}~~xy}YNKJIIFBD@A:OQQWXPPPQRSRVWWWWl
n~fYY\YSVTWRQWVcQerXZW_hP`fZZX\hbGOZig\[\]]WSNSPPQVVVVYZosuwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZZRSQOQRQURUSV^ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^SPPPINOWVX[Zdqtvvttvxyy{{||}}~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSOOQOQVQSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRURMOYQMNQSUUMQSRPNLKGCIGRSTZ]mrvvuttw{zz{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt`d]^[YUQLILIaltPQSMQRPS[RSRQRUUbs{|~}{{
u_]KC>BBCCA?DPCC@C>BHGV@HNMG]iQHFOFDEFHGHBCHGHJGCBAC@NPMRdtuvustvy|z{{{||}|{~}}}~~||}}vt{mh|gnqfheeb\XSQPURsWe[OONLQRPUYSUQQTROV`klsvz{xytrnstsyx~~kLG>>::>@?>>>jPKaEFHIEB?HLMGMQUJBE?><=<==?=?ACB?><=B>IMFUouuvstvxz|z}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJOPNKLQRQTUUWQQWVPX[b]agmmlnjh`nrimlqu{z}{xz||xwxdB@@A<:BCAACA[\O{NOONKLMOOPLKLWNHGAA<977599=;;;8989?;AG>\tuuvuvwy|||}||||~}|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OO^\ZIGOQQOMPQNQRSVXSRYTNYZ[WY\_^_e_]^qwk^`gkwooljomnlfbYGFFHBAFHEEFCLQOaWRXQPSSRU[OOQWPMIDF>996587979:365795<B=ftuwxwzy{}}||{|}}~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKSTSPQUOLRSTWXSTXQLXYYVXXVXY]WXXhsk]V`tkaa_]d`_^YUPMOMLIGJKIHFCPOSZWTTNQSYS\eUOSTQNKIHC?A9988978847578599Gnruyyz{{}}}}|{}|}~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVWXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWT[fJLPRROMMNMMLJFPPUYSTOJNOUST\VRUSSOMLIHHF?>=:787659967565Wqqtxzz{|}}}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXWYYYRUOIGOPOOMRJOPOONNOTLMIPPSTU2<XMIAQ=c`QSQPNPPONNMPNTRPRLILKORPQRSTQSOLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWVQSFFAFGGHFJDHJHGEHLHKIGLMPMG/E_R=3@>joaRRQ@GTQOPPQNQOPOLJLLOPNMPQQNPOJLMMKGEECB;==<9=G6676Dnquwz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVUYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORB8DMS]gSQSAGUPOQQPMMNLJLKLNOOQLNNMIMLIKKLKGFFED<AA>;@E;<89Trsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A>==A@B=>EHFDFFIGJJ@FAA@EGDIOHQRa\QPROSNOOLLOMKMLMON[VKMQOHJHCIJLLKFFFE?BC>=BG?B?@druw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSNKHCE=9879?B?;>A@@>ADIECHGIGIEBB?><BA@GJEMObePMOMWKLNKKMMLLKNNSdMJLRIIIEBIJLMNJGIFBBB@?EFEHDLopvzyy{{z|zwsxtx||yznqrmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLLIMPMPOGKE?B=999:?B?<ABAADDGKFDIIGGHCC?B>??@=CEDLMQTLJIMTFIIJLIJKIILMOPQPKGCKGCCKJLNONIJIGCCCDIJMLIZsnxyxzz{y|vrpurtyyvxjqnjllnttmsu{stxronqovsnporpopstyjN`gsjt|ygosqiqheqHJCFGHGJKIJLDGB<>=:::;AB?=BBCCHEJLJEIIFGHCC;A@B>@?BDDIMOGHJGHKDHIKMHJLHIJLJM]RHIDNGBELKNNQNKMJKFGGJMNRNMcnjwvw{y{z}qmlskptttuhpmjikktpnttyprytorqowsoqptrprutykNVmulq{vinoijthepFJCFEFDEEFEGCC@=<=:;:;AD@?BCEEIFJJLFIIGFFDB:ACC>?CCCDGKMHJNHDHEILNMHILGFFIILNKIHEOICGNMPNPNNOMKIHIOSQRNSggfrosxv{z|lhjoekpmsqfmlhikltmputwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhmf_pGJCEEDBBAE@DB>?>;;;=;=?DB?ACFGJFJILHGGGFEC?=DEB>ACBCEGHIGMPIFEFKNOKFHIFECDIIHKIGHPKDJMMQNONOPNJJIMRUURPXeaamfproryzgehhcilfqlflmgiklsmpvutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEDFBA@AD<BA>A=::=?;>?AB?@BEGJFJGIGFFFDCBAAEFCBBBDEEGGHFLPLHNIJLKIFHEFECCHHHKJGKRMCOONQOOONOOKKKPUWVVTY`_]i`minhrsbeffdhhfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsprkksMGGEGAA@CD<AA@C<8:=>:?=@B@@@DFHEHFFHFEEDCEBDIFCGEAEGEFFGEIMKHQLJKHHIEFHHECIIJKMKPSNDRSQQRNOMOPMLNSWVWYVX^Z]d`hcjigk_defchggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHAABEE<@CBD<7:=>;>;AB>??CEFDFDDGECECDFFFJEEIGBGHFGFECFJJGMJLKHJKFIHJHEKKLLNORTOHTUTQTPQMNQNMQWZVZYWZ^ZXa```^hec`deggjhhjghnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGHCACGE<@EBD<8:>>><<BB=@>ABFCECCGCCDDFGGGIFGKHCIHGIGFDHKIFKHMKJKKHKJMKINLNNORUVOLVVTQTRRLOQPOTYZY\ZZ\__]_c^\bdlc`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquKIJHJEBDGE=AGDD@9<>@?>?CB<@>AAFCEDCHDEDFFGHFHGIKJEJHHJHFFLHHHJGLKLLLIMJMNMOLPPQUVWOKVVUSSRQLORRQV[[]^[]^``a`bf]d`fg`ehjdssfjhglprqossnswwpuvtsmoruorspurvrtvuuuwvuwtgtrkqrkrwpwIJKIKGBEDE<AFDDB;??A@@@DA@B>ACHBEDFGEHEFEIHFIHJLHHJJIKJFJKHIJJGKJLLIILKMNNOLOPRUWVMNTVUSRQPMNTSRW[^^_]^``aab`cdeadibdijgvlkigmosqpqpprywruutsmmssmqrotuuspswtuuwvuuteqskpqjrvpwJLLKLGCCAE<?EEDC=AACBBCEACDAAEGCGGHFEIFCGJGGJFILHIJMKMLGKIHKKNQKRPLSMJMMNPPPTOWXX[NSQW\ZSVPNTUTTXZ_bb_da^ac^`fcabgnhbihhmxvmhinosrpqrrrvtsusssnksqmprotvsqquvuswywutucmtkopjqtpwLMLLLGDA@D>=DEFC?CAEDDFCBEGCBHFBHJIGHJFDKJGHJHIKGJJNKNLILHJMKZfJd[KlRGNM_nUls[qpbwcRPbvuhucavaXnqbdvinzf\lu`lkV`wuhjghfglmjmojmosrprrqrsrssrtrnltonpqquurqstvvuuywutt`ktkppkqsqyKNJKJFB?@B?<DDFDCCBEEDFBEFGDDJEEJLKIKLGGNJHJKGKJIJJNLMMLLIMLL[sbdp^llULNer]geqlntgpi_aYnmbppbkijgoqtetnn\pvgpNLryvkaakeelxmkvlnosrprqpqrqrrrtrmmsnnoprutqsstuuutwxvutbmukpplrrqzKLIIGED?AA?=BEFBECEDEEDCHHGDDKHGKMMJLLFJNHJKJILJJIJMMNMMMKNMM[rponppkjLOPmXNibtrpamov\YlP[mmZqmkomxxtsip]`slqjUuyxoc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGGEEEBAB=??EGBGDHEEDBFIHHEGKJGMLNJLMGLNIMKHJMIJIJJNONNMLNML\hdu]lqVkMOQnUZk^klvaldtTecNlYl\tpkilxjwuhp]_skhWbcw|oc`ghacityknnqsspqpqprqppprukmqmmmoqstqsrtvvswvzvuthoulsomsrtvIMGIEEDCAB<B@BFCGFKGECCHKHHFILKFMKKRRLHMMINJIHNGJJHINOMNLJMMJZtppoqqlkOQRnYskgooqqomt^nXat_nopoqroousttjZ^tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtIKHJCDDE@@>CCAFCHIMHFCFJLIGFJMLFOJJWRKGKJJNIIJLIKJIIKLMMLIKKKSkbYi^_jcrrZ_Yjo_eeUk_c[aaQ`mh\j\niid[oedp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFJDECFA@AEDCFBHJLGFCFKLIEFJOLIOJL[QJFHHKMIHJJKKIHIGKKKKGHKJLKLJIKLNT[]TPUMQONOOVQOPQNOQJJNPQdqiTYV[[\UYZ]X]\\cfaafbcf_^fkmhmtxrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusGCEGFF@EC>CGDEGCIKLGFDGJLHDGIPKLOKLWMIFEHIJHIKHLJIFHHJHHHEFLIHJNKHO\W^O\\`^OXYS\\b^MXZMXaRKYaZS`d\aX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtOBCDLLACDADIEGGFKJKGEEJJJFDGHPJLMJMRIHEAHFJIKKILJIGEJHEFGEEJGBILIJT_Y`X`a[`UXYT]^Z_RY\P^\YN_\^S[^d^Z]`c_Y_b[`^[UYXZ_^ccbaceiekrpoppnow
{
uqprrsuyzzyyxxxwryvxrqxvtvaSJJMHDCBCFGEGGIJJIHDFKKKEEHINJNLHLNGHF>GGLIKKJKKIGEIFCDEBFJD?IJHNZbY^^a_RTSW__\]Y^QY\MV_WKQY[Q[_ba]^ca`bbbcceZRYVW]Z^d`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxXQJFDGEBEGHFGHIFGJGHFHKIKDCKJMMLLHJJHJG?GFNJKKMKKKIGIEE@DAHIA>HIFO]`Z[d]_TQRX]\\\_[KW\LR\YIM^QQ]_bccccb\dcbdceXRWUT]Y[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMC@IFCEKIFGGIGGJFFFILJNECKJLNJLIKJIIGBHHQMKKOMKKIHHFE?EBHHA@FECS]Y^X_Y_[]UXXO\\QKJV^X^[]VZaRR__bb``bb_cbbddbXPRRS\T\]]^^___dhgljnnp{{|~{
srw
|x\SKBAGGDFMRHDRKFHHHDFKIMPEGIJKNLLILKJIGDHKQOMLPMLKKIJDEAECHFAAFCAUUE\T^SV_XNTUMYZLJKT`a[_X_^b]OYb\``_bca]baW`_TQPQRYS^\[]]^`bffelfoow|{{}
zo
~INFDFFHDIScQEW_IGGHDFMJPPFIHJKNLLKMKJJGEJNQQNNPMNMNILBDACCFCB@CD@LHCLLPONLFMFFHIGFLKMOPILOPPSPLQSRUZXWYWWcVNRTPQPOQUT\YY[]\aaefchdlmqsszy{z~{}{
}KIEEGFGDKN^MHHYMGHJHGMLQQIKJKKNMUNOKKLGGKPSSNPPNOOOHLF`ED^LDfbCLZH^\smOMVmXKCO_TkVgI]WU^DLQULMSVQRTXVTXTT\TOeZhheZUkTXWU[\[``abbb`gignlhrz|}~}}zr{z{
~z{LIEFFHEEKPTJKG`THJOJIOMRQKMKLORUROPJLNGHMQ[YOPPNPQPJKQQI|YYrsWPmGqnoaVPqqtOBjsnqspSo_[nX]V\XUkhU]VcY`YZ^UUWituu_av_Xb\\f[_aaab^`cgmol`pwtx}~vxzmv~tx}|~|z~wwMIEHMMBDLLGJLFRVLKOHLRXWQNOOMQTNOQPKLOGMPS[ZTQROPPPKIZx]TxdhXRSPvftlpbnfkRrNLwmjrpsrqrpoo]ezuxqqzq~r}ku}aRh|essoss|}o~xor```bb[aahlnkblfgmw~~{xwtvzhr~nt|~wx{~x|u|||ssMKF`]GAEMMHKKHJPOMNJNV^YULQSNYYLSRRNLPIQRTYWWQTPPPRKHgxlcxqmZJKTypumubnvPddHevqmwojfxxiWrQhzmijzz}lxzphnXuujvupash}ilx|o___cb\_degjjegbcdllppstsssyqrxbltgry{ssuy~svzn|}yxrnMIRtNCBEPQHKLJLQOOOMPZ`ZXKTWPa^RVQYSMPJSTUXWWPUPONSJKrouuquqch`VnKqp^GhyWvTKhx}w`y{sna]modSgrunmypwlvstqlm\s~zkmy|lun|lqvux^__b_]_eeighfe^bbiiijknokqnmjpacfdowxompsynqpj{ztromKKZVHGEGRQKMNLLQQPPPQW\YUNVYUfXRRY^TMNJTTVWYWOSOONRIRmHiwK`dvvTVlNnl{rajguTKWkg|lmlx_Zpz{_`zscroxqhd|ir{]TKk_vuljv|{m~yk|p]^^b[_bdegfeec[ccikkrsrwgmihdg`alagsrlglmr|kmhk{tmmkmOGJKHJHHRQMOPLLSSROSRXRWTPWZVVTTTa`QONKTSSQVVOOMNOQJHQMOULKKRSRQROVUQQORRXXPMOUTWXX[[UQRW[WXW[ORTWWXQ]XV\UTOXRWWXYZ`\gr_[[Z]]_cZ_ccegdddcZdbgffmnmuffgc`f^]g`dlhfgkhpzhggkujhgilPIKKLMKJTRNRQPLVUTPTUXUZVR[]VUTWUYXOOLNWTPNUSNPNLQPKIQQKQMJJOQTQPQSRJHMOPQRPPPTURXW\WSRPQUUUSZQNRQWUSYVTXTSQTSUUYYX^Z_a]\ZZ\\`c\^bbdgeeebY`acabhhjncad^_c]Zc\bma^ffgmsdihkkedcfhQJKKNOLMTQOTQRMXWUTVXWWZVS\`VWVYUXTQPKOXSPNUPNQNLSPMNUSNQNMNQSOTPRTTNKMORTTQQQUWUYZ[YRURTXWVY\SOSTWUTYUVXTRQWUVX\Z\`]WY_]^]\]`a^[bcchgfebX``b]`hegea^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLOTPPTQOQZYXWYZZXYV]jdVXYZWVSTOKOVTPOTPPQNMRQOQXTQQOMORTMWQSTUONNQTVURRRTXVZ]\ZVVQRWXU[[VPSUUUVXSWWTRQXVV[_[_`_V_]^`]\`___ZbceiheebYb`b^^fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSUQOV\ZZW[[\YZ[dqmhd_[YVVXRMMWSMMROQROMPSRUZUTPPLPWUPVRSRXMOPRUXUTTSTYX[^]\[VROUVU[ZVQSVTVXTSXZSRQYWW]_[```Vb\`a]`b_\`]cachief`Zc`a__ee_`c[Z\[\ZZYYW\Z\[`^`[^^a`_c\Y`ZQNONVQPUSPUTSPW\\\Y^\_W\^jpwyc\[VVYRNPWSNQQPRTRLRTSY[WUORNSXUSQTQQYOQSSV[VVVSVZX]^\\^VSNTVV[[UQTTUWXRSY\TRR\XZ]^]ba`Wb[cb^ac_\bab_dgieg]\d`a`acd_b_YZ_[\[XXYWWZZZa]][]\\Z]`W[[ZPOOOYPUUSRXRTP[]^]\`\`U\\hjr}slh\UYWQOR[SRQTRTUTKQVUZZZSOSQUUTRNUQRZRTUTX]WXXSX\X^]YZ]UUNVVW^ZWQTTWXXSVY\TRV]Y]]a^cc_Y`[eb_dd^^cca^efief^^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POORZPZUVWVTTT^^`_^b\`U]^bkyum}lZUZVQQT\TTTUTVYWLRZV\Z\RPUSWUUROWQSWSWUV[^X[YUZ^X_^Y\YRWRYXY_YYRTUYYYUWY\UTZ]]^ab`ed]^]]eabfd^_dc`\gehfdb`ea_aabb_`^WY^Z\\ZYYWV]Z]^[Z[\[WY\]VXW]SOPWYQ\UVYWWUX_`aa`c]`U]^beev{hXYZTVTV\XWWVVW]XOU\Y^]]TSXRVUSQRWQSVTXXX^^X][U]_X__X\VQXTYZZaX[TVX[YZWXYZWV]^`_dcbee^b\`fbdfd_`dba[fchfdfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[YZZ]_]TY]UNTZVT\UWWYWV\`abcac__V[`da_zuohZ\ZVXVX[ZY[YXY`VOT][`a\UUYPTVTRUUQSUW[[\__Z_\V__Y]^Y]VRXWYY\bY]UVZ\Z[ZZYZXY__``dcdeecdZbfcgfe^ab`c]bciedh_g^bbcaa`^_XTZZZ[[X\XX\[Z[WWZXW\[\`]V]]SOVZVVZVYVXWX]_badada^YYadb`kfh^\][WWYZ\\\_[Y[bVSW^]ac\SVYPVUUUUUSUTX]]_``]a]Wa^[^\[^XUXW[Z__[^WX\\\]][Z\WZ_a^`dddffgcYcfehgd^c`_ec]fidei_g^cbcaa`__[XY[YZYXZXW[[Z[WXZTZ]\[`\U^bMRWYVWZY[\YWY^`baeada]^Yacb_a`a_]]]XW[[]]__\Z]cXYX]`cd_RXYPWUWXWVVWV]]^aba_b^Ya]]^Y\]YXUV[[`^\_YY^]^^`\ZZY[_b_bedefghcZefgigc_c^afeZiicficf_bbca``_]]ZW[YYXXZYWZ[ZYWXVU[]]]``baxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XW[\_]`_][`d\\XZbecaR\YOXVY[YYWYZ`^abc`ac_\b]_][^]YYTX]\__^_[Z^^`bb[[W[]`bbcedgffge]eghifcab[cg`\iichife`baca_`_]]\Y\YXWXYYW\[ZWVXPXZ]acffrkJYW][Z_]\^\X][^_bcbaa]b[bdb`cbb]\[ZWXjq`\`_]\ac_^YYcedbT_ZQYW\]\[Y[[c`ccc`bda`c^`\^^^ZXU[^\\aa_][`abfb^[S\_`cddfeggfff`fghhgdd`[eg^ahhcihfc`b`cb___]][Z[YXXXVZW\[ZVVULXX\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vuuuuuuuvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyyz{{zz{zzzzzzzzz{{{{zzzzzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vutuuuutuvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyyzzz{{zzzzzzzzz{{z{zzzzzzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||xÅÔÒÒÒÒÔ{}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÓÏÄÅÅÅÅÅÇÒÔÔÔÓÓÓľ¾¾¾¾¾ÊÓÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}xÕçääääç{~y1333332j{éääääåàÔÔÔÔÔÔÖãååååäåÒËÌÍÌÍÌÛæååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}v~ywwwwwwxyzzzzzxooopppprrrrrrrwzyyzzz~
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vtttttwuvwz{x{xwvy|zzzy}yyyxxxxyyyyzzyyyyzzzyxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwvz|y}}{}{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwvz~{}}}~|xxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwwxy}}{}~|xxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{xzzz||||{~{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{xzzy|xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxxyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oyyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|||||||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}||~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~
~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~
}}}~
~~~~~
~
~{z
~|}}}~|{|
~}~~~~~~}}~}}}
}|}~~~}|}}|z|
~}}}}~~}}}}zzz~~
~~~~||}}~~}}}}~}|zzz~~}~}}~
|}}~}}~~}~}{}~}}~~}}}|{{{zzyz~~~~|~~~~}~~}|~~~~~
~|~~~~~}}~}~~~}}}}{{|zzyyy{~~}~~|~~~~}|~~~~~~~~~~}||}
~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}|{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~~
|}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
||||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~||~|{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{zz|~|~~}~~~~}}}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~}|~~}}}}~{{}}~
{z{ywz}~
~~~~}}||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}~}~~~~}|||}~{{}w~vx~}|}|}~~z}}|~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}||~~|{{}~}~~}{{{}{z{{{~~}||~~~y}~v{vx}|||{}}~}}~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~}~|||||||~~{|{||||}|}|~|}||{z|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}|}}}~|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}x|zr}{{|||~~}}
}~~|~~~}|}}~}||~|}}|}}}~}~}}}{|}~||{|}zzyyzy{{~~
~~~z{y}}zzz}q~z{|}}}}zx
~}~~}~}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv~
~~}~~}~~~}~~~|}}|~~~~}|}}||}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xvw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|~
~~~~~~~~~z{z}}uqz|zqz}}yxtt
~~~~}~}}}~}~~}}}~}~~}}~}}}~}~~}~|{|z|{z
~~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~}~~
~~~~}{z{z|{z~~}~~~~}~}}z{|
{{sy{|pwuvwyvtz
~}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
~|}}~}~~}|~~~~}}z{{||}}|~}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}~y~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}~|~~~
~~~~
}}}|{||yz{z~y|yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~|{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}}||~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~
}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqwyrx
~~~~~}~|~{~}~~}}}~~~~~}}}~~|~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~~}}|~~~~}|~~~|}~}~~~
~~|{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqspxwq{
~~}|~}}~~}~|}~}|~}}~~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}~t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~{z|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~~|||~{{~yz{z{~wwy{|{}||||{}|}}}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~}~}{~~{|}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}~xwvyyy|}||}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~}~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
}
{~~}y|zzz}||}z||}}|z{~~~}}||}|vrvxxvtvt}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvuv
~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~||
~
}}}||||~}~}}{|}}}}}~~~}|~~~~~}}
~
~}|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uy~
}y|~{
}}~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}}~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vyy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}~}~}~}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|upozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~}}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~~}}|}~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~|~}}~~}}||~~|}|||}|||~z{{}~
{{~}|||}}|||}}|}|~}|}}|||}}|~}{|}|}|~|||zz||}
{}~}{||~}|}}|}{||||||}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~||}}{}}|}zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yzzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|z{{{|}}}|~}||}~|{
~}}{
~|}}}~~~}}}}{|{zyzzyzz|yzz{{{}z{{{{}~}}}}||}}|
~|~~
}}~~~{||}}}|~~}}~{~{{zy{zyzz{yzzz{{|z{|{{~~}|}||}~
~~}|}~~~
~}|~~|}|~||~}|~}}|||{{zzzzy{zzzzzzz{|y{}{|~}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~|}~}~}|{|}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7:<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D:;<8:<>;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=::;89:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<97:9:::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÕÔÔÔÔÔÔÕÔÔÔÔÔÔÓÒÓÔÔÔÔÔÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËÊÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÙÙÚÛÛÛÛÛÛÛÚÛÜÛÛÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÚÓÒÓÓÓÓÓÔÔÔÔÔÔÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÏÐÏÏÏÏÏÏÏÏÏÏÏÏÖÞÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccdddeÓÒÒÒÒÒÒÓÓÓÒÓÓÒÝãâââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÌÐÒÒÒÒÒÒÒÒÒÒÒÒÑÞìëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSQblkkkkkkkkkkkkiUSSSSSSSSSSSSTKCCDCCDCCDDCC?]ÒÓÒÒÒÒÒÒÒÒÒÒÒÐàìëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;@C>6:7>?;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÌÌÑÒÒÒÒÒÒÒÒÒÒÒÒÑÝêééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWVepoooooooooooomYWWWWWWWWWWWWXPGHHHHHHHHHHHD`ÑÓÒÒÒÒÒÒÒÒÒÒÒÐßëêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;>@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÍÐÒÒÒÒÒÒÒÒÑÑÑÑÐÜèççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbbaoxwwwwwwwwwwwwucbbbbbbbbbbbbb\STTTUUUUUUUUQkÒÓÒÒÒÒÒÒÒÒÒÒÒÒÞéééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB?;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÎÎÎÎÎÎÎÎÍÍÍÍÍÍÎÏÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÎÎÎÏÎÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÍÎÎÎÎÎÎÎÎÎÎÎÎÎÍÌÌÌÌÌÌÌÌÌÌËËËÌÌËËËËËËÌÌËËÌÌËÍÔÔÔÕÕÕÕÕÕÖÕÖÖÖØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÑÔÔÓÏÎÑÒÎÏÒÔÕÔÐÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖ××××××Ö×××××Ö××××××××ÖÖÖÖÖÖÖ××××××××××רØ×ÖÖÖÖÖ×××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎѰÎÓ¸ÏÑÆÏÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏÉ»¸¯·¹º¸¹¯¡ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÑâɣ¨²Ñ}~¯±ÒÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÑ¿§ÐÓµÕÓÍÄÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏѺ¤¬ÑÖ£´ÔÓÀ ÐÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÑÀ ¥·Ø¢µÔÕ°¢©ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<9765::6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÒ¦¯®¦Ù¢µÔÕ¤¡¹ÔÑÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑÉ×Ä Ù¢¶ÔÎÉÒÑÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?;<9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÅ ¨Ú£µ×áÒÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÉÁ¡¡ ¿Ø¢´Ù²¤¦ÖÒÒÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÕ«©ÕÖ²ÆÖ¹¿ÕÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>;=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÔÁ½ÕÒÒÑÄÕÑÑÂÓÒÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELL@>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÑÔÕÒÒÒÓÕÓÓÓÕÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9948<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995686673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668784;?<?=9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiihxsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptyvt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8<:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495666788:=;<>:<::==9<<=<==<;=DHDCA<<<<>>@;8<815:AFEW®µµµ¶·¸¸¹¸¸¸¸¸·¸¹ºº¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676889>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498566:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545659756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455588686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®xpljac`YQMQLRFC9MPE>8;727967443578797;::==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥¨©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:9:>7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AB??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<;;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=AC@DA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?B@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::;;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=:;9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<>?::97;8887489<;<8;;<=:=>:?A=:=<>>@@=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:<=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<:7:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;97::;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:846<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8537:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAELOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8AB?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:<:>98;:::<<>=<D>96;;88>95157BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5256AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_MHQIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\dc[]Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¥¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlgbbZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r_h_cSQYTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[_^Z\V\hdocnihb^PP@?;:898<;624333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª«¥©¤¥ª§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkna_d`POA@;;9;8:9614364777:=:<;9==B?>?=<:?9;;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285678:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´´¶¼¼¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa^YTah`fsositcidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnm[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<;>BDE>>=@CCCDD;:8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿µ³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tkkndolhqxoyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABB@=@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐËÆÆÀÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÃÄø´À·´½Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸¸»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrwsxff]d[RXIF?;78876169754333646;8:<;=<8=><:;<:=;;>>DAACB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÉÎÉÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂĽ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeijh]jomxwbb``]XWFE8:8:979449766512335;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬¦©»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqobagugihtmxl]d[U_YLHD6<9988:53:664413525;:<>;;<=<;<=<;<?=?B?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËÊÈÆÌÉÍÅÆÅÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlidtnsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÅÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÅÅÃÂÁÂÇÇÉÊÇÌÈÇÈÍÆËÏÅ·ÀÀÀÀ»»½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegcjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ¾ÂÀÀÁÂËÃÆÌËÅÈѰ¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfbZYY\XQNE=;9:;77996499:5314527:;:@=?<<977;;::<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿º½À¹½ºº´¿¸µ·³¯»¼·À·¾Â¿Á»¿À¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ §¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjffiei]UUSYOSKE8?6;:779;65:;<6313417;98?=>;<;76998:<=@?>@==?B><@ACCA?C=:6<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»ÀÀ·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¡¢¡¡£¢ £ ¢¦zxpmedfoiekgXXNKKJRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<97>BDA?@88?þÆÁÁ¼¼¸¸º¿¶¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶¼¼ÀĹ···¶º¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼»º´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebl_[THKJDJBCG?9;8=<7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??==97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¿»Ä·¶¸¶·À¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸®¶µ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿Âº¿Á¿½¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcga[bPKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<;><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¹¯²¼¼°·»¶»¼««£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊĵºÀÃÈ¿¿µ¿À¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^aaMHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED<AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍËÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>BEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=@>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µº¶¹Ä¸µ¼¶º½Á¼»¿¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼¿ÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp]Z^\YQEDCMIAD=G::59;:<<:;;;=?:=54512788;<;B;?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÃû¹³´ºÁ½¿ÇÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¦¢¥ª¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|vluzpmh\__YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀ÷·°µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zsvvwmp`^e][TJ<>?FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁù·²²²´²·¾º³µ²¼º¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qtwtvql^b`[]NHA?=HCFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÄû»¶´´°¶º¶´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅɺ½¾¶±§¤¡©±®µ¹¶²±«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{wo|ourmc\fX\]RNMA>JB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;66:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³±¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÊǾÀ¸¹¶²´¶³´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬²®³©¦©ª®©¢£¢¢¯§¤¬¦©¡§§¦§©¯¶²«´¶¯ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyrvsmtik][jT]\OMHDFLAFMF8665:5:>8;97<=:;=:9236777>;=>::?><<<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹½µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±ºÃ¼ÂÊÅ¿»¿¿¹³´³±±®°¹¹¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH?HQDMC=8875:7<>:;<89<;;<;8248978;;<;8;=>;<<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢¤ § ¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼¸ÀÁ¾¼¼¼¹®¯²²ºº··µµ¼´¯´«¶º¸ÀÄÁ»µ¼½¸²³°¯¬®·¶²´µ¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥££¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ x|vybwln\PhTPNGOLLCOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:=;9;=;<<=><@=?<8;@@A???949<7ACBD=@Cª¤£¢¡¢«¥¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¹µ§¥¬ª¨µ²±°®¯²§¦¯£¯®µÁºµ·²·¶²´«²´®ª«¯°²´®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©°£¥§ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}|uu}mk{dhUQcMIHGNRMJMG;D@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¦©¤©£¤®¥¬¬´¼·¬²±¯±µ¯¯³µª§¬£ £¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®²«¥ªª ¡£§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxz`bRU_HIIKSTIRPL9>A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ £¨®¬««¯ª¯©¥¥¦¤ ¢¦ ¢®«¬µ²¶¦¯´«©ª´±°°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«º¨¦«§««©¬¬§ £±±±´©±¯¢¡¤¡ £¡¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle\SZYMQJNOTLRLA7>B68<76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=?758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢§ §¡¤¢¡£ £ ¢¯®¬¯±¬¶§±¦¦°®¬°§ ¢ ¡¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½·¾°¬±®©ª´±°§«¨²µ·³·¬±´£ ¥ ¬¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]mZR`HQUHFUVJBMG=JH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:>758==?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¢ ¢©«§¬©ª´«««¥¥ª¨«¬ª¥¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·½³³µ¡«¢©¨²©ª¨§§©¦ § §¨¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?858<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·£°¦ ¤¤¤¢¤£¢ª¯¬§©£ ¡¬¯®ª«§ ¢£¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬®§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â½¸³»Åü»·³©²ª³´¯³®©®£«§¶±¬¢¯¥ £¯±°¤¤¯£¡ ¡¦¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤{trkkurphW\QETHDIPH>EA4EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¢©²«»²¿«¯¬¥ ¡ ¥¥¦§ ¬±¯§¤¤£¡¦¬¦ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌËÌÒǾ¿ÀÂ½ÇÆÂ·ÃÉÈÂÀ޹³¹º´»·°µ²ªº±®»¶¾ººª·¬ªª¸º´»®¸£¥¢§¥¢£©¦§ª§ ¡¡¤£¤§¢~zrkdioxjeZ[FJLDDSLDBD7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ £¡¯³©¡wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÈÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÒÓÌÓÏÓÓÌÊÂÅÆÆÊÇοÈÐËÆÅÆÄÀ»ÂÀ¾¾¾µ½³¾¿ÂÃÆÄÆÃ¾¸²¸¼ÃÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDB@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA;;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª££¬®¦¥±ªÅÆÌÎÍ¿°Â©¥¨ª¡£©¡ ¤±±«¤ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕ×Ò×ÍÆÇÉÌÃÅÊÏÊÓ×Ñ×ÒÕÕÓÓÈÌÇÍÍÉÒÌÍÓÍÄÇÉÉÀÅËÇÈÈž³³ÇÄËÊÊÎÅÉ¿½¿¼ÁÆÄÌÌÈɿÿ¯²¨¢ª£¦©¬¤¥¦
{ruvgbhwidVWQDMF@IQB=B<:23@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A:9>8:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤¯ °«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤¬©¦°®¥¡¥¢}wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÒÏÑÃÐÓÖ×ÕÖÒËÉÎÐËÆÍÒÊÒÕÖÙÕ×ÓÖØÎÒÉÎÑÌÎÐËÒÏ¿ÇÆÉÂËËËÎÏÅÆÇ¶¿Ê¿ÒÌËÏÅÉÇ¿ÃÂÈÎÌÏÐÎÌÊÇ͸·»¨¦«§£ª¥©¨¨|xsvpc`erb]R\IJFAEHI>;@8=4585:76:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦¬¤°±©¨µÐÔ×ÚÒÇÆË´¶ÂƲ¶©¢¥¦¡¢«µ§±¡¦«¡¡¢xida____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÏÏÕÔÔÑÑÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÑÈÐØ×ØÑ×Ò×ÙÕÖÌÎÏÉÌÑËÎпÅÁÆÅÎÌÐÐÑÈËÌÀÊËÅÓÎËÎÇÃÉÆÆÈËÊÔÓÐÔÏÒÌÒÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
{zqstmacim_VP_JJBFCQM?<>44:=52755<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;9<74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯®«ª«¦®¸¨«·ØÔÕÙÙÑÎÐÀ¼ÌÉ·À¯§«©£¤±¶³£¶ª¡ª©¡¡~rfcc__a`_a`_``_`fmppnkorvwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÓÍÕÔÑÊÏÌÓÖÒÑÖÍÐÕÕÑÆÑÔÊÑÔÕÖÎÒÐØØØ×ËÈÎÃÈÎËÊ̿ɿÇÈÍÍÏÊÐÍÎËÎÏÇÊÏÐÊÎÊÁÈÆÉÌÊËÑÒÌÓÑÑÏÏʽǹ°»¸µª¶°¨¸³¿»±
yvopokbenpaW\ZIFFDLWE;@<33<=86855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><=>:EBE>¥§ £§¡¦¤§¸¶µµ¥®¾µ±ÀÙÓ×ÚÜÖÏÍËÃÓв«®¬¦³²¹«³·©£l__^adb``aa``a^__^]bmroostuvy¤¾ËÕÑÖÔÓØÖÎÎÓËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÔËÌÏÑÓÊÍÑÕÒÕÕÊÀÉÁÅÌÂÈÉÂÌÂÅÇÊÊÎÊÌÌÐÍÓËÅÇÏÌÇÇÊÄÆÀÅÉËÍÏÐÆÏÎÍÍÌÏÅÇÀ·¹½Âýù²³¾°»ÃĶª¥¡
xprkmh``qhXXhVMGLIPPB;D>;67:89:56==A<:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;;;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±ÇùËÕÖÙÚÛØÌÍÏÉÖÖÅĸ²¶ª¤®¹¹±²À¡}fbcb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÄÉÉÆÆ¿ÃÅÎÎÇÅÇÍÊÑÈËÎÍÆÑÒÏÎÌÔÊÇÊÍÎÇÆÏÒËÐÏźľÆÉ¼ÂÆÈÎÄÂÇÀÆÍÇÃËÉËÏÇÃÃÏÈÆÁÆÇÿÀÇËËËÎÂÊËÈÇÌÐÄÅǺÇÃÈÈÂÏÀ½¼¿°ÁÊǺ½ª±²§¥¢¤wntdk`^fqa[W`GHHGIMTG?J=64355<<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79;>=;>=FAC= ª®¥®ª« ¥³±¬ÉÍÊÈľ½ºÍÍÆÐÕÕÙÚÛØÐÊÐÐÒÔÊź¾¾°©·«¿º¹³¥~
t`[^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺ¿Ã»»º¹¾ÈÆÂÃÀÃÇÊÉÈÊÇÁÅËÆÈËÍÉÄÁÉÉÁÁËÐÄËÈ¿¹ÁºÅǽ¿ÅÎÊÿúÉÇÈºÇÆÄÊÀ½ÁËÆÅýż¼¿ÃÄËÄÄ»¿ÉÂÅÇÒÅÁȾÊÉÆÇÆÐÃÃÆÃ¯ÄËÇÄÊ·¿¼º´©¬¥¥¬£¡¥£ {vrtfiZanmZ[XQDLFBGDLCFR?54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ËÐÑÌÇÂÃÇÍÏÎÍÕÐÖÙØÙÐÌÔÎÏÐËĸÆÁ¶µ¼±À¶º¬{
vxusq_Z[]`abcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÁ°¶º²²´²±Á¼»»¹¸ÀÁÁž½¹½¿¹ÄÊÅÆÂ½ÆÀ·»ÄÉ¿ÂÉ»·ººÅ¾¼ÁÍÂÆ¾½µÀ½Ãº¼Æ»Â¹³¼Åö¿¶µ¾¿ºË¼µºÈº¿½ËÃÁÅÂÅÈÅÈÅÐÆÂÌDzÆÉÃÎÍÁÅ¿½²·°³§¨¨¹±¥°«¬yvwjeh`hocV^YJEJFHKAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9;<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÂÄÈÎÒËÊÊÇÍÍÏÒÉÑÆÖÕÖØÏÌÐÈÍÈÊŽÊÁ²µº·»¶¯
y~|tud\\]^``bcbbeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÀ¸°°§ª¬§¸´¶´³²³ºµ½±·°´®²»Â¼Áļ¿ºµ²º¾À¸Ç¸³»µÀ¼·½ÆÀûµ®²¶º¾³Ä·ºµ«¸¼½À½°º¶¯¶º²Å¼¶®»¿´¶´Å¼¾ÂÅ¿ÃÄÅÇËÅÀÆÆ»ÇËÀÏÉÇÃÆÁ÷þ¾¶¹¾Æ¿¬µºµ·¶xtxfgebkn^V^`FKHHJFBCADE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¦«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÍÎÉËÉÌÊËÆÑÏÓÑÏÇÊÆÊÅÄÀ¼Ï½³¹½¹¸·{y~wx}th^]]]_`_`da^cec__\[^\]^Z[[]_lpmhfjnnr|¤Ç¿¹¸µ°«¬§¢ª§«¬³©«©³¶°²¨®¦¬²¼º¶Ã¹º¹°«µ¹»´Â¹¯¿°½¼»µ»Ç¹Â¶ª¨°±Àµ¸¼¯°§±³´»¼«µ¥®¶®º±°ª¹¯»»¸»¿¿½¹Â¿ÆÂÅÀ¼ÆÁÈ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÅÉÌ˳¹Â¼º²rvvkiablhYWW[ALKMIEAC?FA;9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<:9;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÏÒÌÄÆÂÅÐÈÏÃÄÇÁÆÆÅÅÌÃÊÌÃÄÁÇÀº¼»Ê·´»½µµ«|y~z{xn^]]]]_`__dcbccb`_^[[ZZ]ZZZZ]dmohggiknr¹°µ®¦¥§§ ¤ ¥«£§¢«©¬ª°£¦ªµ¶±½¹¯·¯¨®¸´´»·³¼®·¹´±»Á±Á®¥¨¢«±²³§¼ª«¨«¬´´¦¨®¡¤¯©²¥§¨®¥¨·¬°²·¹º»±¼½¾¾Ä¿µÁÁÇÈ·¿ÀÅ·ÄÂÀ»¿ÄþÄÈÌÊ¿¾ÃÀÀ©rsrji]aodWVXPHZRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·ºÄ°¶°ª©°±³µ½¯ÆÑÐÍÄÈ»»ÌÃÌÀ½Ê¹ÀÅÀ¼ÌºÃÇź½Ä¾º·½Å¸¶¸»®±{~xt|swf_]]\^_`^_ccab``_^]\ZXY[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥£¡£ª£¢¥¥§¥¤¥«²¯¶·§°¬§ª´«´¹°¶´¬¶¸±¯º¹±·¤£¦±§«§¹ª¤¦§¨§² §¦¤¦¬§¤ ±¬±³²³°µ¼¶»ÁÁ²º¾ÃÁ±¹¹Â³À½¿µ¸»½¾¼ÂÆÄÂþ¿Ã wpkae_ko`UY_HNhOTGEJF<=@=:;;8255369:8;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676778666;::;9;;<859<:>>@;ȵ¶½¸ºÁ»¾µ ¡¦º¶«³³»³ÅÐÉÌÃǹ¸ÉÂÎÁºË¹½È»¶Ç»·ÄƳ¾Å¼·°¹¿»°³¶¯¢}yvtpmkjjqi_`]\\]_`_acb````]\[\\XYXXXVX[]^dcbegggjmo© ¡¢¡¢¦£¥¡§¢ª°¬±µ¢©ª©«¬¤µ¸·¯¬²´®³µ®±ª£¢²¤¥©¸¡¦¦¨¬« ¥£¯©«§ª«¬°²¸®¸¹»°¶»»º«³²¹²½´¶±±µ´¿µ½¿½ÂÁºº½zrk_e^ddXTX^IW]KPGIJFA<??@;?<04535:;9:899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÉÉÁǼ¼ÅÅÐÁ¼Ê»»Á»µÅ¸µÁÁ³Âļªµ¹·§±²©ysnpnkc^bff]]^]]]\]_`abccba_\[[Z[YXXWWWXXX[^bddeffhikr¨¡¡¡¨¥¦¡¤ ¯² ¥¢«§¡µ°±±¬§®²§¹³¦¶¡¢£¡¢¡©µª¢£¦¥¦£¬¡«¦¢£¥«²³ª´°²ª²¹´¯©¯²²²·³©¬®±·°ºµ¹½¾¶³±yue^e^[YVSZUL\QLJEHKIB=?AA@@:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾½¿³¥£¥±Âµ¶½µ¸ÃÍÉÈÁƸÂÁÈÐºÃÆÀ¶¼½¶Ãº¶¿Áµ»¿»ª¦±º±§±¯}
ypqtqhediec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXXVWadecdeddhjv¢¡¡¡¨£¨ª¦®°«££·ª ®¨¶©¦¦¬°£·°£¶ ¢«¦¡¬¸¯¢¡¤¡ ¡©©£¡£ªª°¨´«ª¦²°¥ª®²±¯°®¯¦§§²®±´¯»³¹·£yud^aVYWSRTKM^LPLGHLKE<@><B<;7653498899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼´¹Â±¾¸¼®§§£ª»À½À¹®´¸ÂÍÈÇÄžǺÊ͵ÄÅı¿¿¹ÀÁºÀÀ¹º½·¨¨±»¦¨¡¤~xrjlrtpihedgb\\ZYZ\\\]^]\[\^\[\Z[\ZXVWWVWXWWWU[ccbbcbcdfj ¦¥¤¥¦¤ª¯¦¢£¶¨ ¡¢¨³¡¥§¤¯¥°¬«´ ©¡¡¬±°¢£¡¦¦¡¢¤¤¤«£¥°§¥£««¥¨®®®«¨©©³¥¦«¯´±®»µ°¯®yvrea\Z]XNLQGRaMVPOJMOEBD?9=69:764599;9887<89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»²·¬¤¦·»¼Áź±¹¶ÅÊËÁÄÇÇÉ¸ÈÆµÅÂÈ®º¼Â¼ÂÀÁ½¼·º¶¦§²µ¢wodbgihfhjgjm`]\[ZZYZ\]\[\^_\ZY[YYY[WUXWTTWUSTRU``_`a_`acdi£ ¥¡¥££¢£¡ªª¥¥±© ¤ª§¡¬¬©¨¢¡¢¢«©°¢¡¢¤ ¡ ¡£¤£«¥¢¤ª£«®¥±©¦¥¦¦µ¦©¨³µ´¹º¯©¬rpo`[WVUQFQOHZ\ORJTKSLEGIC8;;=<8666:9;::76977:;:=<=6;<8>598:88659:;<97?<9678452121..1426:869869898:;9@9{µ´´»²°¬²§§¯¹¹³¿Èº¶À¯ÆÉμÂËÍÉ·ËÀ´ÀÇ̰¶½Ç»ÁÇý¿·ºµ¤ª¯®|uijjmhjlnkkme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^____bdm¢ §¨ª§ª¥¨¤¢¤®¤¥¯© ®©²¤¦£¤ ©© ¡ ¡ ¢¢ ¢ ¡¨£¢¨« «¯¤·¥¢£¢¬©¨«¯³¸²½µ³«¯rrh[YYSUREYLQ\YMTNPLQRINIB<??A?=65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571141-+/434988::8::748=8?9~³®¨³¶®¨§¯©¨¬·¶¬»Ê»¶¿¬ÌÇÆ¹ÂÏÐɵƾº¾ÆÌµ±½Ä¼ÂÅýÁ³¹¯¥ª¯«wxoninnnqggigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNPQYZZZ]\\^_`d~¢ ª©¦ª¦¯¢§¬ ¤¨§®¦©¥¡§ª¤ £ ¡¥¥§¨¨ ±°¦±¼¦£¬´«§°´°¹µ¿±±«|prbVTUNRIGVQRRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759::876958779;85576661320-*.102877;99;8948;8@8³¦±·ª¥¢°«ª§©²°¤¶Æ´¹º³Ëƺ¼ÃËÑ̳¹º¾ÀÅǶ´·¼²º»Ä¾Â±³°®°¬¢khmoroqkpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv¨ª¤¤ª§ ¥¢£¢¢£§ ¡¡¤¤¦¨¦¡ ´²§²· ¢·¬ª¤²²¦µ¼µ««±£xrm]NPQLOCNNNPLFNNKJNNQHMJAGKHHC=858889:;69:68;99><8:>9;?8789:886857688974577820301+)-/12776:999984988A7w¶§¤¶°¤§£©¥ ©¥¤³ª¢²Ãµµ²³ÇǸ»ÄÊÍǵ¯¼¿¸¼Ä³³®¶¢¬µÄº»¯ª¬´¯¯ ¨}^`gsqvqjnifhhj_XYXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKLSWWVXXYX[]aosvp ¢ £¤¡s}
z¢~~tz¢¢ ¡¤£¢´¯¬¯¬¥¹¦¥°¡±®°»ª©¯ªvrbVLQOPMCSNLQMCPPHHMSMHJJDJLEJJ<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764789::65:87A7w·¢£´¨¥¥¨£¦¥¦¥¦³§¥´Á¸°´°ÊƹºÂÏÇ¿µ¯½Ã¯±Ç²§¬£¿¸±° ¨¬ª¢rWV`hgihincjhgb\XXXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTQMMJHNSSSTUUWY[]ilrl
|tNXr_;Wo{
ryz
}xqo
~¡ §¯¨©¨´¢¦¬«§³¡©£|qm_ZNSQVLDTJPMMFOOJELQMKOJIMOFIH=7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3854779<:79;86A9x· ¢¡¦¦© §¨§¢©°¨§´Â¹±µ°Éù´¿ÏÀº±±¸Ä«®É®§¢
¢º§¨¦¥£ iPNRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORMKHFHNQQMPRTVXZ`moiztPB@}
x`JQnx|~n~wuvxpQ{~xvgw
~¤£§©¥£±«¡¤¤¦ª¡©¢¦¨ske][HQQSMIUMSILLPIGFJNLMTKQQOFIC<769:8:;;8:;8>?99>=7;<6;;478;6775344696/3/.115221/,')+*,4833979:99::::?9v¶¢¦¡®¡§¨¥¦§¯¬ª¶¼¶¸¶³Â¼·¨»É¹·©ª·¸¶Àª¢²¢ eMLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut{
{uxsnupty}ªyzhv{prmxxz{vrrxguzz¨ ©¥¨¤ ¤qf`\\JVOQGKXROJMMSJJJLPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937795675252572/2.,//200/-+(().1262198798775:<<7v®£¡³©¯©¥¬«°±ª½´²¼¸¶»µ³ ¸»³««¬µ³¥¤fJIJIGFHHPTTTWWSTUUUVWWWXXXXXYXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQRSV^u}ygw}gyvx|r|v{ok~|s{}tfv|
lohs|lyq}pmurhq}pCwwz}zt~£¢¥umkeaYWXTQJSVTOPOQWKNKOOJQOIOOKFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«§©°¯±¬¼¸¬»¾¹´®©±¨§¬§¤}|z
eJGHFB@CDILLMQRPQSUTTUVWWWXXYYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{wo|yy|
omxsxjjr}Inhw~licly
ksl|nr{
imp~s
z}~zvott
ywp|}lhmnmWUWTRQYOSUUTYVMNHNKNNKCINGE?:89;99:><9<;::=>:8:;9?868727575541442/024*+**-.+-*(*(',-1250,5567485HA895w¤¯¢ª¨µ¯®¬´¿«¼Â¿¦£¥
¢¤v}|x~t}xuw|fOEGD@<>>AFGGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jrAo;<95<_IMOORWZRY\`§bitze~omzutlts|jkLyg1vsl~}tfet~
filukp{gpp{n{s}}qpnum~wytjyyuiingcWQYWXY\NPVWZYOIIEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+*,,++)(+'),,226-+5775478iO8;5n¤¨²¦º®«²°Â²»ÃÇz
swvwuxvoxsiUFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯³ q|xm}lq
yyr txsu5q¨¡¡¢vp{{shfbimqmouioXuovl{|mrnpzsumbv
vy~}xpnnj^Z[][YXa`SO\[YXLHJFJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´¨°®Á³ºÁÆ}nw
ny{{q{t|ko^JPG>@7458;;<=>@BEILLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/>©®_GLMNPL7CMRSDJv||v~lw|}
~v¢y~
aªzv~s{\dqtz{wmgiayo
znwszqsywkni]w}|}q
|uw{|tmqrde^ZZ]S[g^XQVY]WGKKELG?F@DC>AA=;97<;;=<::99;;=>79>9986754244004645654-,)+('''&(())((+++/00Uq<23331E~W4=9\w¦ ª°©¯À±»Åºzvk~
yt¢
s}lylSXLAE311267688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|r|z|~v¡¥¬©H¯¯¨sl|}hggx~m
q
Gkxqyvhmk_w}
z{uv|xmow~}qqpjZ\[ZccWgf\VPQXZQDLLGOIDFCCA@CA=978:::;;:888::?>6;>7595773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¬ §¹¯³½´}tq~}¥yu
y_cVLC60./23133668:=??BEGHJLNQTTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¡¥»±§»Èħ¡¤{r~v
ihotqv{v
}nvug¢«£{{zogkx}w|qic\YY\i]ag`ZOLNXSRIQKDNGCKDCADDA<:87=<:<:88778:==8<=68756623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nvpgx{¤¡¬¦«¯°¡xw}
mpj^CA4--////02234779;=?BDHJOQRSRSSTRPOHDB<87/9C><<63.lMPHJKLKNV`cggmu ¡£©¥£¬¨¶¢§Á®ȯxº|¡¡
lpuvql
r¡¥¶©¢
~kjk}~}q_[b^Yfj\ll_XKHOSQNNLFIQDDNFBCEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<unhYppuqv~§ ªhf¤}
z}
xxhNR>//.,/.-/000212457;?CFNPRTPQQSQNPIEE>;<:CF?><752<?R5HHHLLMNR^o|s} §¦¢¡¢¨©«¨¬©ªµ«¾«¶ÈÉ·ÈÑϾ piª¨
§¡wz~¡{v«³ }¤£§¶°¨lss{|ynf^[__agc`gg]REKKQOJJMFFMCHMFFCBGDA:85<<899975658>75=84745754546958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f3A@ib_Pqu`n}aw}|ªªBD}y|
w_bP460-1/,.00./..0015>AAMQRSPRTUSNSLEE@<>=FH@A@8662<9;FHGIJNOQYmw£§ªµ½¸¥®¬¬¨©µ¬±·²²»±³¾³Ã¬»É˸ÿ·¥£°²¬¬ª£
¥¦ ¢¦¢ª§¤
£ ª¡¤©°¤§¸»¡£°££¤¢¬°³¶£¦«z{~{e^fZc`]bc^fg`[ODIHTOFHLFKGFGHAKFCFFA;87=<88:974658<54<76:54644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV|{
qna@E64<3/110-,+-1/-4?DANVQRSUUWUM\QGGD<>>FHCDA8;<5C;=FKIGHROPW ®£³ª²ÁÇÄ«³Å¶´À³¸¾¶¿µÁ¶»»¤¸Æ©¶ÉǶ¾¹´¨£´°°§¯ª¤w¤¡«±³©¨®µ»²º¬¯µ¢±¬²µ¼¸µ®µ §¨£¨©°®³º¸¹¨¸ª¥ zrW_bUd``a__f`\UJDELVRIJKEJHEA@@KDBMF<867;<97:986555711<8895466497>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL\ZQcdWzuq}v~{¿»£¼´z
zyo]W@EN<6:46AB764//7CHCQ\OQUXU\WO_UIKJA@>GKFFD;>@7D7?BJJEGWTP^¤¤²´Ã¶¸ÁÌÊ·¼Ä½³´Á·¸Âµ¿°¸t±´¦ºÅ¤°Æ¹±³²´¨¤¶¶ª° ¢¢¥±¥¬§¤ ¬³º¢©²¹µ»¾Ì¿Å޽³Â¸º¸¿¸»¸º±¦±ª®¾±½¼Ãû©®«~yhUa`WicieV[dZWUJGGLRHDIKAID>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./57::650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYVZwjpo{rxb¹¡£|z||}xzufP\dGEL:Qd`[^SF?;HPE[cQQYYZgZS`aMSOEA?IJHEFA@C<D6B?HGKMTZT^¯¸µ»¹ÉÀ»½Êͼ½Á¼¸¶¼»·¾µº²Æau²¥±«¾ª¥¨«ª¤¢³µ «§®¥§§¥£¢§°³§²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÃÁ¾¾¿¼¼¸µ°¹··ÃºÆ¾Äɱº«¢¬¦©·|o]^^\U`]hfSYbWSWIEFOK@>HD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPPQRQJA9/,,,*+((,-+/P>(.48}<2Kq9>CKE@JMPRLQ]hmlqslrrsÕÀ¶ }y{{yt}zlfpvY]\Peeb`ed][XX\NdmURmn_o_XgeUYTJDBKKHFHHHHBI9D@HKTTV]Z[¹À¹¾¸ÆÁ»¹ÊË»¶º¶¸¹´¸µµ®··du©p^¢¡¢¤«¥¨¦£¬¤ª°¬·°¼¸ÔÐÎÖÏÉÌÒÌÏÎÊÇÀÀÂʽÁ½ÁÁÅÄÆÊÀÉÏ´¤¼±µ°¬¹½}wi[]YW[_XabQ\aTRLCBFHF<@F>BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;.&**(-./,@M+/54mI0Ht?>BD@CDGKODR\Zi`pnlotu³¬¡¡
|s{
{tt{ylmu|iseilhfjih`fiimZnt¤½g[oh]ZYTHKOPJKPLSQHLAJFKP__bgjb¸Ç°º´»¾¶±ÅǶ°¹±±»³²¨¬¸¶¨§N §¥¡¦¬¯¨¯§³³ÔÔÔÖÑËÏÓÔÎÓÏÌÅÂÊпÊÉËÉÒÈÍÎÃÐÒ¸°Ä½Äº¦·»Å¢~laZZ[V^VYdZP]XORCBHFDJ;AD>BH?@B8;D>@I=56655;:687654/10146278875367C5B8?-0,1348=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshrpyy¡ª¦}|
p{r~qyulqxr{nxslipmcinpyix}~Ë¿Ãß§ncxnd[a`KPRUNY^P]]MQNTQUT\nnwr®¸¬µ¨°¶«½Á²«µ¦¥¹§¬¯¢¬´¤±®§«¬¤§¢¬¬ÎÒÕÑÍËÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓÖÍÒÑÅÒÖÆÁÏÈÈ鿸ÐvkbZ_[U^Q\ZPPUQOI>AGBCF=AB?FE>@?:==<<JA45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwlwp}~ ¡
y
{r~z
v
owsls}|w|sxqkrriprzyr{¾Ë²vr
wiai]DZZ[WfdXekTX]]ac^cx{ª¤¤¢ ¡©¦ª±¹«¦´£¢®¢¤®£§² ¦k£~
§¯¡ ¥¤¨ÈÍÏÇÂËÑÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÊÕÚÍÊØÖÑËÄÃÌok`]\VRWR[PJHJJK@;:;EBD=CD>HC?CB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYqv~isyr
xys{}w{oxqnvvx}t|ylvun}vuy|¶<AÆ¥~}jeWICecfchjdoy[_fhlnin £¤¦²¤¥² ¢¥¢©¢£²~
zª£}ª³§¦½ÃŸ¶ÅÍÑÐÒÐËÒËÉÔÎÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÍ´tskaZWPSPXUEGKJFF>:7:@BC:GE@EDBDA;?;;7DC75655;0689443341014558754449@>DBC<33.6FTWOQJAJF?2*(.BT29254/7K75<`bA<svV87AH:?B><9QECJTlnopbqqt}
}x
{
yq{{v{zp}ppzr{rnzuw}}u}°tYªÂ·pnc=^hrqqpnwwfiorvyrz « ¡¬¢ ¦ ¬
}
~lz{®«¦®µ¼¨½ÇËÈÉËËÏÉÄÒÊÔרר×ÔÛ×ÓÚÛÖÐÚÚÒÖÉÕÌuwfeXWNQR\GCFII?B>=8:>@<>I=@BAAEA>?:87DB755479.566435532323647553458EBDCEB56<FNSM[nfcnsk`V>,4LG865433BF4=W_hLux^8;?F<<A<:9D>CGRk_mdbflvqy~
|}wyo{{tz¡vvtu~too
u}
zw|¸Æ¥ÃʸxpfNeczw
¡yyw{|vm¦ £¬
{| ¼ ¨¦¥§µ¿¿¿¸ÇÉÍÎÅÍÉÑÕÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆvvdfa]RUUTMKDND;===9:<?9>A7>?@=?>=9867CA6455=80665547745613854564557HH=DJE7925;H>;9;7IP\ZRUXK9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa]\itzylwvz|~~{~
z
|v~un}}~t |~x~yot~
|~{©Ã ½¤~
}ss¦
{iGp¡¤
¡~¦
¤
·¡¦ £®¶¹´«ÀÆÊÐÈÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×Û·uutgfbT]YRONHDLC>=?99;:::<>6A>?==9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<:DWN<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^VXfmmmiqsx{{||{}|~uzsztm~~w
¡n©
{¡}
£¢¤¯
Wr«[¢££
¤²¡ §²¸¬¥½ÂÇÍÈÆÏËÏÌÎ×ÏÑÔ®ÖÕØÚØÚÚ×ÖÙÚlyqccZZUQUWC@ID???:49:;7:<;4<<?=>7;::1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;88;<@;BQKKSYPTcbymb~onxyz{}||w
sp
{uwvt
}¦¢¦¢¨r³¨
£ ¢©°o·ÄȲ¢¦²d¤ÍÇ
«¤£
¤¨¡¢²´¥£½Á¾ÇÆÅÈÈÉÂÊÓÌÍÔ¨ÒÑÖÖÖØÚÔÓÚÎo{d`[[[LHTZBBHD<B>837<<:9>64::<:72?:929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHSWSRBcGv}|m~y{~{ww|mn{}xx|
~¢³§£ª³¢§ ¥¤®¢¸³¢¡¥°£¤§¨¬¯¤¡À£É¸«£¦®²
¨¢
u²¥¡~ ±®¢¤¸¾´ÅÇĽÃÃÀÆÍÊÉÓ¦ÎÍÔÒÐÖØÓÐØºovrY^S]UNGINEACE5?;77:?<<7=43669774>5;5<L<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88467=:JFDGNZ\YJf`;Izzn
z}x~px}~}osz~|y¦»¬¨±½¯¥³³©¤¢°¬µ£¹¦¥ª¸§¤£ ©ª¤®°ª »»®Ê¡j·¸«°£¬¾£^ª²|}´«¡¡ ¥®¨¡¤´¸«ÂÈĵº½¼ÅÇÇÂÑ¡ÆÊÍÍÅ×ÖÑËÔmweYWQ\PNEC?=CBB8@885?G=<6<35345454B49:BM:B;AHC;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdHb`bpI@~s}un}|}pww|©ÁÀ¯½Æ»³´À½µ«³¶¨²®®¾«»¥¨¹¹«§¦¢¢¤£ª¯²±ª¤£¦¥¤º¯©À¼®²¹¥¤¨~½°z¨±¬ £¬ ¡¦¥¤¢£°²¦ÁÆÃ¯°º·ÅÄÿͦÇÄÇĽÖÑÍÅÊ
po^YW\YLJBKAFH?A@C;:5>A>=5=7>333241A17@BN>G@CNCA=C=;86CC5BIB:878:5B>79VKDWOF8=4K@C>4EKHN>BA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUN79GD?CF\eF`igZ]]{uo~{q~zz§³ÆÉ¿ÁÌÂùǽ»¯«º»³·º²À®¥À¤«°»½ª®«££§«®µ°ª «¡°µ§£»»¶Á¼¬©³¥¤¨
ªÄäz¡¦ ¯« ¡³ ¤ ¥£¦¦¤¯¥ÀÄ¶Éþ¶Ï²Ä¿Ä¼³ÑÊÈ´quiYUYgQLHCMKLJAB>DE<5AE<;3=8B332263A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeZMe\eTbjyr{xy¡¨º½ÇÈÉÁÒÉÊÂͽ³¼¾¨ºÀ½»Ä·¬Á©¬³¼¿ª°ª¤¥¤¬®³¶µ¡ °¥¢£´½ª©½Â¤¶·¯¬²¬¬¬ª¦¥¥uy
££ª¥|£ ¢µ¥¤£¡¥¥¤£©§¢²¬¨»À拾·ÌÀ¹¯Ä³»¾Â¹ÂÃÂÀiv^UTYXJJLIFDDIDCBDL:4DI:;4=8F.12242B26SHO<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>iH_XaZccV x
¡®§¤Â½ÇÃÇÅÓÎÎÍ˼¸°º¼´½Ë»Ã¶·¼³¿¹½®¯¨ ©¨¶®©²·¢§¡«·¸ª¥¯¿Å²½º³¨«¶´®®¥¬§²Å§||ª¥¡£¢Z¤e¢²¥¡ª«©¦¦ £¨¥¶«©¹»Ã´¥´¶ËÀ¸ª¶«²»¸®¨¸º½·hkWTRSMEJRMK?BHEEIHG96FM;>7>AK.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C>4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;>@BFBpEjIReaLF¥¢©¦¢¯¾¯¡Æ¼ÄÄÆÆÎÎÎÒÊ¿»¶²»»»¾ÏµÄ¾¹¹·³±µ³¸³«§«¬¹ª¨§¯°¤¯¤§¤¥µÀ±¬¬´¿ÃºÀº´¨º¶¹´¯¥¯®¤¡tÂ}±¥£ © `J¥T¯¯£®ª¤ ¥§¢´¨ª³»»»ª°²ÈÀ¹¦¬«²²£¡²²´¤mkcYWMOJDOPPR;HKIHJCD>:KU?A:=EM07544:B44MWO;JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;5EA:A?>H@5*B52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯¨
£¤µÉµ©Å¹ÂÄÈÊÉÈÌÍÇ¿»³®¹¹ÁÁ̵Ⱥ¹µº°¯¯³µ¦£ª´µª©¦¬¥®¥¤¨¬º¿¨¬¶¸¿ÂÀ¾¹³³Å²¹¾¤¯µ¬¹¦¦v¿®¡¡©¨ª¡§nv¢¢®²£«§©ª¬£¢¤§¢±¦©«¹¶½²²®¾¹· £§¨¥¦©©_b^]OJKFGMJVM=NFOKMBDD<QV=AABDO18=76?B75UXO?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUH~e^HE«¢»¯ ««¡£¬£¤¶Æ¾´À¹ÂÂÇÉÅÂÍȾ¹²¯ºµÁÂʵƲ¼µºª¨°¢£ª´»¦©¦«ª©¯§£ª«½»¨½µ¸¾Ç¼·¶¹Â²¿Áµª¶·¬¾¥£¢ ½¡·©¦¢¡¨¤³ ¦¨ª¤¡¢ ´¯¥¥¯ªª©¢¢¨©¤¡¡³´º´¨¶²³£¥ª¡u\Z]\HGEFLPINEGHCSLJBEGAWSCH=AGQ1;B7:BF79\YKALPTUSMWRNUJE@JJNO9D@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</';*HB:SJ0,[oW71<*BdT49-19f\FCCpbGE§¤Ã¥ªª§¦¬¢«¶Äü¾¶ÁÂÀÇÄ¿ÌÅ»½¹²°¹³¿Âǵ¿°¼·¹¶¦¤«« ¡ªªÄ¢¤©«¦¬¯«¢©©¾·§¿²¹·Ç¶µ¹¹À³Àø¶³´°½££® ¢£¥££ ½¥©©«¡¥½¢£¢©¬¡¤ µ¬¦°¦®¥¨ ¥¤«±µ±ª¥ª®¬ ¨e_W_[MHGINLHFDIA>QIA<GII\ROK=IOU5BF9>HG5Ca[KBNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA55?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ9mQF<KxeaVK¢£Å¬¡¬® £¤ ¦©¬¶±£ª³¶ÅĽ¿µÀ»È¾ÉǶ¸µ´±³´·ÁŶ¾±¸µ¹´¦¬ª¬¥¤Á¥© ¤©¯¢¦¨¼µ¦±½¹·¶Ä²´¸»À´Å¹¹¯³µµ£¥¡® ¢©¨¬£Â¬©¬®¦ ½¡¤««¬¦¡W¥¡ ¸ª¦´¢°®¡£¥±«©¢¢¥¥¤^aXb_KGJJNFEAGK?=JB99JKN]QQI=LW\9FI=DMI8Hb\LCLPSYYVWOZ^IA=WQJL?H?5HLXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6S[kWqGE6=ue\KM¡Ä¨¦¡´¢³¨«¥ £¬©¬»°¨¬¶±ÇÅÁ²ÃýÆÃ¼Äɼ¯°¶°µ¯¾Ä´¹²°º´¬¨±©ª¥¡§Á¬±ª£®°©¤¨¼¶§·»¾°·Ä³³ÃÀ´È´¼¸¬´¶ª¢¦¤¬¢ §«°¯¯»±¦ ©¨¢£¸ ¡£°°¬¥¦¢¢§´§¦²¢¬ ¥«¯¥¦¢
~_dYfdIHLISAC@IH;;F?99ONV^RSJ?P^]=HPBLLI9Nc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<25-/4@1+'VtSeO?104b[M23>0<v]^?[T]ep@8;HweA4£ 餪³¢¤µª³¬§¡¤²¬®©»²±µ´ÆÀÄ´ÀľÉĵ¿ÇÁ´«µ¨°¹¬¿Ã³¸¯¶¹¥ª²««¦»´¨°¬ ´²§«¹²¨º´¹³¹Àª·²Ä¾¶Ç¨À¯®·µ©§¬¡¦¥¢¢¥¯¸®²µ¶ ©¤¤ ·¢¥¥°²²§«¦¢¨ ¡¯²¢¦¤ª¢
¨¨ª¢¦¡
wag[jiLOMNT=CANC::I?77RO]^RVQAW`\BJSHVKH:Ud\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914801-/.<6-#Bqgsk23/1[bZ33806p[bH04IogUCWFyfC;££¡¦¿§¨¯±¢ªµ«º±¬£«´¶±°¹·°·¸¸Å½Ãǽ½ÄÂÆÀ¸ÀÅÀ¹©¶¤¬»ÀÁ··ª²º¢±²¤§ª¹ª¦°« ¯´³«©µ¶¼´³¹·¬¸±Ã»ÀÀ§Ä«±·¯©««§«¡¢¡¡±¯³¬°¹©§ ·©¦£¢±±´¬³¨ ¥¢£³¯¤§¡¨¨¦¢
}hfk`lmWPQ[UABET@;;IA7:XPd^PWWEY_^NMRN^KJ>Yc^NHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DEBM?:1D?77547?=95E4+75/251--.,1=*'+=\p=>1.0dZd@1647gY`F(?8l}g[V;{cC=§¢ª½¢ª°¬¤²¹ª¦¶µ¬¡µ½¯³¸»º¾··À¿ÉĹÄÃÀ¿·Ã¼À¶®µ§«·±»½¾´©®±¶«®§®¦¨§»¤¬³«¢±°³¬©µ´µ½®±²µ¬°´³Á»Æ·¬½°±¸¬ª£²¦¥ª ¤³ª³««³§¡¦¥´®¨¡®®±¨´²ª¤¨¤¢¨µ©ª¦¥£
{djqfoq^FYgVDCMWDZ9HB6>]Qh\NZ]G[^^ONRXdJJB\b_PLMOXWXPJVVWL=EUJEDAM@AFHHQPA;GDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'__`U150=`V^8*C3YU\gK6zfL@¤¡¥·¥¬ª¦¯®·ª¯¶¼¨§±·Æ·±¶½ÁõµºÄ¾ÌƹÃÀ¹¾¹Ã·À¸²´¬©º¶º¹¾´©°µ§¬©¬«««¾«±£« ±³®µ²¸¸ª®¯±¨µ¯µ»¼Ê³ª·¶±´¯®¦¡´ © ¦²£®¡¦¯¡¤£¦¨³ª¢§³«¶¥¯±µ¯£¬§«·¢¡ª¤¢¢ z
{jmwlt{aFakYIGZZ={JFD6AbTi[M\bK\][RSRb`LKE_``QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76((9.$:K5."U_T_/5(C_Q\.*A/JGP[G3cYUKD¡²©²ª¬¦¤¯®¶ª¸¶º¥¬´·Ê»´»º¿¿µ³·ÃÀÌȼüµ½¿¿·¾¼±¼§º¹·µÂ¶ª°·§®«©£°©¯º¤¬±³§¨£²´±²°´±·³©¯¬²§·¯·´ÄÆ·©¶·¬±©§£¶ ¨²¡¥²¨ ª©£¦¦¥¸¨£²µ¬¨²¨®±µ«¤ «¨©¸¢¤§¤ v{lovt{~\Lfm\KNc\>b{GI8GgWf\L^cMYYWUXTi]OOH`]_PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANGe27'GbLV%-A.=ELQ<3rkICC¥¯¥¯«¨¥±³´«¸²¸¡¬µ¹É¹Á»Â¸³±µÂÂÎÅ¿Á½³¼¿¾º¾¼²Ã¨©¹°µµ¿¼®«²± §±¦¦¯¥²µª±±¬©¨µ»´²´³ª¬¨¬©¸²°ÈÁ¹¥º±©¥¨®±¦¥¤¯¤©°££££¤ ¢«¦§º¥¬¶¶¦«¬©°µ®££¨ª £³¡§ w}
|{|
prq}||\Sdo^NXf\FD[G;NmXb\M`bNVWVWTXg]QRLcY[TKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/+1()+,-*&5*/&0)38:1&*3Bc:6*HeHJ+:G>3BHS,>k;GHª¬¢ª±¤©¥´µ²µ¶²²¢¬®½ÌºÀºÇ±´´ÁÃÑÅÆ¾À²¾À»¾·»Ä§¬¶¬²·¼À¯«±¬£§©©¥°£ª²ª°«¯®°®«³¼§¶°²©²©«¥¥£ºª²Ãº¶»©©¨¬©§±¥ª¥£¯ª¨¢£¥¬¢§©¢¦¤®¬¸³²¢ª£ «¯°¬¦§©¤¦
¤~~
|v~
rqptl_ZanbQrp\K<
|F?XuXaZNd\NVVUWQ\a^SONgXVVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1;\J0.JgDF8<B/4EKX2@Y=LE©¢«³ªª±·¹·¯¬¦««½É¼°½¶Â¯±¬³ÃÃÎÏþ¿³ÀÁù¿³Ç믷²¸¿¾±¬«¤§ª°¨¨©±¥´®ª±®±±´¬´¼¤·³¬¬®¨« £°·«ªº·¥·¶¤ª§¬«ª¡©§§²²¤§¦¡¡¬ª¡ ¦¥¢ª¤£ §±¸®®¤¦£ª¬©¡¤£¤
££|zs|ru¤xk_`meWdcN?gLEbyWbYReUNVUVTO\]aUKNhVUVIJHIOBGISQYoANX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06VZ.0JgAA<<B+:JO^4D=GFD°¦£«±«ª®¶¬·³¬¦¬ª©¼ÀÀ·¸²¼µ¦²°ÃÉËÑ¿Àº¸¿¾Á¹Á¹ÀĬ±´±³ºÀ¾²°®¬««¨¶ª§®¯ª¹°¨²±®²·ª¸¸¦´¶«¬¤©ª¤³³©¨¤´´ ·® ª¨ª¨«§ «¬©º¶ª«ªª¢ª ª¡ ¥¢¦£ª¨µ¯©¦«£¤¥¨§©¢££ ~
¢uxt~xv}oqgfow\`rjO^VHnyUeWQcPMVTUPOXZbUHOiTVSGOXUI>IHOQPxLNW=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/1Pb02?f=NX>C,>LT_0Ji5OD<±¢¦¬¯¬¦°´µ°¬¦°ª©º¾»À°¹®¡¶°ÉÇÈÑÀ¾¼º»Á½ºÂ¿¾¿±±±µ¼»Á±±³ª³©¤´©¦®³³¹±£®¸²°³»¬»°©¶¬ªª«£ ¶®©¡°³¢¶ª¨§ª£ª¡¢¨½¯¬®¢¨¨ ¬°¡¢¡§¨¨«±ª£ ®¢¡¢¤£§¨¥}£
xt|uxyyrrxf¤vi_ditf|RXp_JxsSdTQ_MMSZfNLVYdXGRhRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Kg:48_=ad?F1CP[[*HL9U@4³¡¥§¤§¤§µ³²«¥±§ª¸¾À»¯§¹ª¦¯±ÉÇÈÑü¿¾¸½¾¼ÈºÀ·¯¯³±¹»¸À³²º¬¸¬¢´§¨³·º³¨¨¾¶¯·¾°¿§¬µ«©¯£ ¥¬¨«³¥´¨ª§©£¨£©¨©¾«´°®ª¤¡¯³£¤¥¦ ¥ª¬¦ «¢¢¦¨©
~
~}
¡r{z~|ix|ysno{fw
dag_rzlfx]^T?W{lTaPQYLLNru]HZ[gYEUeOC>JNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GjI14X=fbAJ7GS`U*=9CV=*² ¡ª¦¥¢«¥¸³´¦ª±¦¬¸Á½µ¯¢¹¨¨°ÂÊÉÌÁ¶½À´·¿ºÈ´Â´²±´±¼¸¹½µ¸µ¾¬¡³§«¬±¶¸µ¬¿½ª³Â´½¡¯²µª¬°£¦©ª¤¥±§° «©§¡©¥©¡¼¨®±®¡«£¤¯¦¡¤ ¤«£¥¥ £¥¬{{~£}yl~vyxc|zpnoqvgrjgeg]lsl`hp`o=[xlU]NPRKJMTZWM\^lWDW_O^OHMDF;7HEKO<rhKK9AE;;=>;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>)49&'.34.0+/4&,:$41AhY14S=e_DL6KVdO*;1NW=# ¨¤¤ ¨¤¸°¯¤¯°©«¸Á¹²¹¯«¨´ºÈËȾ¶Â¾¯´½·Ä¶Â±¸±³À´»½·¨¹·½ª£´¨©«²¯º±«½¾¦°Á¶·¢®¶µ§¦§°³ ¥¦¨¢¥¨ª ª®¦ ¦¤© ±¹£±¯¡¬¡¥§§©¥«§¡ª¡©|~}| x
}
|sp~rtt`zxhmoomh}qc{miea\d~^YsjrIH~iXYMPLKHPRQIO\_nSDXZRgNGKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-B*,4;NN@;73-.+-7**<%53<fd24M?e]FO=QZgH*=/WT5(§®¡¡¡¥¡·«²¦´´ª¨¹Ä´² ·®°µÆÈÀ¶¾Á¹°´¼·¾»½¯ª½°´¿°½Ã¹©»º·§§µ©¨¬²´±¨¿¸¦®½¸³±·°©¥§¯±¡¤¡¥¥ ¯¦¡£¨¯¡¡¥¥£·°¡¦±«¬£¯ª¥©¦¨¬¦¢¨¢z~zx
~yzprwppt_ywdjkjgglerjkdgWar^YkuiXE}^[XOOKHHRUG29^^mPDWUYeLHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84HBf[HTCT]hE.:1]Q,2¤£«¦¡£¡¸ª°¡»¸¥¬½Ä²¯®¢µ°¬¯µÄĽ³¾º·°³¹¸º¸º®¿³´¸¯¿Á¸«½º´¥¢³«©«´®³¤Ä·§ª¸·¬²»ª§¥¨¯«£§¤¦¡²¥¤©©¡¦ ¤¹¨¤§¦¥¡¨ ©¡¡¡¡¡£¬££§¤y|
}x
{w|musmmtbythfifcmfghdfgh]dbieZezb`PrT[[RKJHIOS@ *i^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-O?.+-7-1195,&.5-80576`tB3CDh[KWGU`hB377`L'2¤¥¦§¤¶¨ªº·§¬ÃÀ¶¯¬¢µ®§¯¯·ÁÀ½±Á·±®²¶µ¹¸µ¬ª¼³¯²±½À·®¼¼°¥¶¬¦§µª«¯¡¡Å¬ª¨²µ¬´¹¨ª«±¥ª§¥¥¢¤ª¡¡¡§·¦¯ª¡¡¢¡¦¢ ¦®£§ x
w{
{
s~gyplklgusjafcasadefdhhaenY]X\lcaMgWZ`VIHIKMRX>9`liHBUS\ZIGFEA.<?9A89RG@7:B037=7693:<97:9DM=B<0*<@;A<-5B37=++,/A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3@aE%5¥¡®¡ ¥´²£²¾·¡±Å»¹°±£·««®©¹¾½»À²®¯®¶¯³¹²§«¹°¯®´¶»¶¯¹¾¦µ« ¡²¦«° ¦Å¡³¦°²±·´¬¯¬®¢¨«¦§¦ ¥£©±¦º¨®¢¡¤¥¡ª©§§{t
|
ogyniljgqrkZhcaq`dgjnkeiecl\lluqbSbiceZIGLMOYQPUaeT@VRZUFGFE@/<=7?6<FNa8:?249@37828?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24:5#3*)6.55465Z|]1:Lj[M[KXdc@A1G`A'4£±¡©³°¸À¶ ´Á»½¹±¦¶°©®¥¸º¸¸»°««·ªµ¹¤³µ±¯©±¶¶±³¶»§© ¶ª«£ª®¬Ä¯¦°±·¶¬«°¯ª¢¤©§¤ª£¥ £¬«©»¦¤ ¡k£q¥v¬©¢x
li~wql}o]dagluyfhvjfX\itnMOibepf]dfnkh][\hOKD8FTg^JHQPUVKHRapteF[QUPFGFC>1;=6=6<4f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:286Xl15Ok\N[K[fb>G1N_;+.¤±¡ª®¬£½Å¯©·Â¸¾¼§·±¦«¤¸´³´°¹®©§¬´¦±µ¢§¸¶µ¨§¶³®´®´¢ª´«£¦§©°¿¨§°µ¹£¨¬««¥¡¡¨¨¢¦¦§¨¨«¤µ°£¢££¡¡¢¥¨rx uif~sx o~|¡ |tvknied{mrbTmdmiqXiomW]hZkjZpkyrhY^FN>F^MFRVVQPRWTg^MZLRRPEFG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I:/01.*/(-4583%&2115>1<8Xt15Rk[O[L[g_=K1T]7/(§¬«ª¨ª¾Ã¯²¹¼·Á¿ª¤·±ª¬¦´µ®¯³·«©¥²¥¶³¬µ¶µ¥¦©³±²¨¯ª¡²© ¥¥¢¥±¸¦§§·½¦¬¦©©¬§¥¡¡¨¤§£¤¥ª¢¤¦§¡·¥££®ª¤±¥®¡zÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«±yilX±®ofj¼¼ngymqØ~Rkb¶²}~pu¡ªVNWaOVNGV\XPPS\W[PA\DPNCFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22AE/.32.+/)-/186- /416A1=:Ww11Tk\O[M]g\>L1YZ41!§¨ª¥²ª°Â½²µÀµ·¿Â«¦´®©¨°µª°¶´¨¨¦¶¦¨¹®²²¶ª¥¤§²¯®±§«§¥²¥¢¢ ¢¡²¯¤¡µº£©¨ ¬¤¢£© © ¨¨§¢§£¡°££
¯kjªh
fq©q®¡¤wº|k v±_j´[¥e`fzfixkªe¾sg¦v±j|±xucmm§n\ EigEu_}f{£§Y_«h|w{j¨8J¯[XTlcZKOY`\VV;NPWV0ISSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3/.53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:N5]W31£§¦£¥«²¸´½¾°·Å²¸ºÃ§©°¬°©ª±¯¤±»±¥¥¯³£ª¹©²²°£¤ ª°¬¯§¨ ££±¤°©¢ µ³¡ª¡¡£©¥ ¡§¤¢¡ ¬¦¦ ¡µµy©¶x´·¬k¦{
w«gj±[¬{tpx
°vwrkkm|O¥XHdd~ch¦_xqtR]P©ncpz
a/S¢n[Tkg`LK]dX\ZB>°wWXA#MiEBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFBAAD<FD;0201;E,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_fW7J9`T50 ´¦§¡©¨³¬ª»·Â°¼Ã¹¶Â«¯¯¨¯³ª¢°¼«¢¨¶£¬µ¤¥²³¨£¢¨«³©°¨¦ ° ¡±¥¤¨¶¯¡¨©§ª ¦©¤ £¥££«¦¢ Õ¹q±ÂÆ}Ö»}¨¤{¡¥y«yV¯{~j¹Z¹w}¦|{©y{±mu¼oP¯§ÅQ zc`ªasrk^Rµ´È
~|c¤4Cu]PjhdP@XgYdaJHMjJZSOYfZCD?E?0<<59<74<<8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB.00483+-).323971#%5*>3==Qwj6*Yi[J[P_fT7H:aP72%£²¨©¥³ª¥µ¨¤¼¸Á°ºÀ²·´½´¶¨²±¤²´§ ¯¶©©»®£±²¡²´±¡¤¨ª±©´©¦¬¤®¨±©£«¢§¡§¡¢¢£¡¢¢¨ §¡§¡²nhµr¬p§r´vt¶{¦£~£}°uÒÒu\®|
¤nª¦k
}}{±sy³et
ofRÉZÂ\yb__vs
a]YÊo¿~rMKµSUÆdUQjceXAOk_liPUFH9=WR[WXHB?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\ANT_eP5G=aM62.£¦°¥©»¦µ¥§¶»¼³»¿¸¸µ¼¼´¦µµ£³²£ ¬°¥¨»®¥²±´¸ª ¥¡ª¥²¨¬ª¥©¥«¢¦«±¦¡¬¥¡¥§ ¦§¢£ ® £¦£
¬|x¨w£ªp
¨£¢~®³\r²S¯}£~q×}w
~w¯w´ael[°WKuyf`^vvgj]¯vwk5yÈ®³_CTo^g`EPl_pmVUM.echRYQ;AC@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!04767=Pke>&Vg\@=V_cN6GB`I:77 ¡·±³Á¨²§ª³º·µ¹¿º¸³·¾¶¦¸µ¡¶® ©¬©¶«©²²«´¤© ¨¢µ§¦ª¤¥¡¥¨§°¥ ¨¢¢©¥¡¦©¤ ¡¢ §©~¦y¡ªp§¡££ªzyp±Z¨ xtØvt¨¤|{²^d ~n]«\[hgªcr{jq]«Z kmdOJC¡\ZMt]bfMZa_rt_JU5JXHE=GEAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>102154+*05/7,&21($%6671<OedA&Uf[?1T_bL7FH_C1=7¢¿³Â®«¬¨§µ±¸±µ¿º»³²¸¼ª»¶¡²¥¦¨¨¬±©°«·ª¯¡¢ ¦¥¤º££¬¡£ ¢¡©°°¦§¦¤§«¨©¨ ¡¤®£ ¡¡ ¡¬®nr´t©w¦t´zu´§¤¤u¸o{¢kk¶Z¡eh ¢§mr´t³jju´af¢ok]`N¡|Rs£ly~no\¯V<weTon.[§ObRkeblZb\`p|cSYQ>?lo2BB@>M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>/U^aL5FM^81A8¥º¤±À®®««¨·ª¸¯µÁµ½²±»¸¬Â·ª¬¡§¤¢¬«¨¶¤´¨®ª¡¨ ¥«¸£¦£¡«¶°¦¬©¦¥£«³¤ ¨¬°¡¢¡ ¡©«Ô»u±ÄÄ~Ö¸y§y¢¶u}wvÁ²aºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¢~u«}¾ns¼t²uxmpm¤t½]w}[ay¼jZV[iy^iacfbmxoX[YCA@q?CG+4H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,;:08LXaF'TcX</T^`K5<L\-6?9§¢¼£°Ã¯ªª±¨¹¯·Å±»³¯¼°®Â²¦£¥¢«¥ª³¥µ§¤ «§¹£®¡¦ £¯¹±«£§¦¥¤¡¨¬ ©¤²¢¤¦¡¡¤° ª
¶¸y¶wnlotoyrÀ»¼{²¨pt¹|{}¤»¹½uy³£tuut°ufj¶tsqw¶^y}gylzb¬pt
~W[§iDdYTf_c]cQgfqmuBMOLD;ZL>J2;0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITAKNGEOF?G<7>7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿¦²Â³«ª¨«ª»¯±Æ¯µ´°¹¨µ¹®«¤¢§ ¥®«§¶¨¨¡¤¬¥¾§¡ª¢¢¨¢²µ¶¬££¢¦¦«©¥¦¡ª¦¦¢¨¡¬¢°©§¢kjªztv{f{½¾Àºoq
_rjZ^adl`cmvblf^`cqhr|fj~qtx~c\xuhP\n||jWlzrIJo
pNqMDV\f`LZWfc_O[mujqRODDM<HH<L?1,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5CFUEKOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR^I'S_V4)P^L(3>\O'?2>¨©¢Á¤³¹¶£¬¦¯¦¨¶²¬È¬°´¶¤¾²³§¡¤ª£¬§®¤¥¶ª¥¢§©¾¨©¥ ¦©¨°²¾«¦§¢©©¤¬ ££§¬¢©¡®¦ ±¥¢¨¤¦¨¤ho~qw´ª
¡z¤
kj|}urxzvv|jstudw}vkoxl_b[ogMXYfj_WYoynmfSOFS9PZNRO'*;KB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCSGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[I'R^T10T^:+=8]K,<-@² ³¢¿¢£°±· ª¦³§¥°µªÉ«²§¶¦Á¨µ¡¥¦¥¡¬§¤¤·¬ ¡ª¦Á¬¤££¨¨¨²Â¯ªª©ª¡¡¢¥¯¦¡£§¬¥¡°¡¢§¢¤¤ ¢®|©¨
{
£~e¡³®
w{~xyzpgykuyrhsyujtbxe_hdcdfjYk{pjj\SLPD_UF@>>,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@²¹¯¾«±² ª¦²£¬³°Å°«®¤³¯¼¥µ¡¨£¡©§ª¦¥¦³¶°¦®¿¡¬¢¢©©«£´Ç³©£ª§© ¥¬ª®¨¤¢ª¡«¡¥°¤©¦ªf
}eczmhjz£«je~g
eeihz¢kh¢wkj£slnzyXe]^lw\htwwowxsmysvzhX]jsd]sij|rmc]QNVJdX@I3=F8?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]]_]ZUODHOKSN=>==6535554*&&%,*%.++'6*$;'/BI[J.6ZO6)EY/DO1YB;?.=¤º¼¹¯«²°«¥¨¯±§®®°½±ª©¥®°± ¡¤¢¦¬¤¦¨ª³®¤£°¦·¹¥®£¢ ¦{¤«¢¨´Ã·¤¡¦®£¤¤ª© ª¯©©¢©¦¥§ ¬¢¥±¥¬¢§¡¬ ½s´s
hw¹Ä¸q¡£z¦t«}ËÀÀºq£}À½ÁÁ|zÂÀ}j¥²poÊzxvyyq{pxxlube^wc_eb]thmdbXKUIQYHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^_`a_^^^^___^\SMPGUNA@?=6468266*&%#)*&.+*)109*#>I[L*#CP/#F[3PY/UAB;/8¡¹Ã´¯¯¿©©£°ª°¯®¦²µ¯«¦§¦±« «£ ª§£¬£¥©¥¥´¤£¦®¸´§¯¢¦ ¢ ¦«¤«¿¿° ¨®¨¢£¤ª£¡¡¬®¨ª¥£¢¤£¤©¤©®ª«®£§£¤Îz{¥z_]¨¡¡|§u«¯^dª{¨
t³c« ³j¯t|¸aY£Ínv{Û{q~ue{vvl~m}}k_pjof`_xd[qhjcf`RTSW^JOC4AHED8>5;@?A;=8@>??BDDFIJLNPROS\___^]]_``_^^[WOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\:L-!P@F4.1¬ÁÀÀ´´°·¤ª©µ«¦²¬¬¬¥¬¦°ª¡§¦¢¯¡¨§£¦¡±¬¦®±«¨¬ ¥¥¨¤£ª°¨¿Å²§©±¢¡ªª¡®¦©¨¥¥¢ ª¬³¥¢«ª¤¨§£²¢¨¡¡rv¨q°|q¬} ¥x«~r¬v{|ª¢}«zzVÄ{pÁ}mupmfwenaxnrnlcnsuo`fmd_oijnfcXS\`ZRRC8IH@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;92478452&# 1' 1''45-&7=WJ-<(=1)3V@F!G;C1.+¯ÓÆÇ²³£££¢®¯·¯©±§¨ª©®«¬§¢¤£¦« ¢¦ ¨¨£°¨§¯¨§©¤¢¡®§£®¬¢¬µ©¹Ì±¬¦«¢®¬¡©±¨¨¨ª¦£¡ª¯±¢¨¬¯¦§¬««³¤¥§
¤k¤uz©u{²q¥q ¤_aR«
®u®¨z{f£¤£}©®^{¨U¢{£|İÅs¯´³¹rb©¯Âthkmlxwwnkfedqqf|ic]V_iXXTLLPLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^aa`_^]\][SIB6799664,&$" ''!+-"$.!3-&@DWH,G+56*1PKL# A9D4,'ÁÉÖÖÀ¡«¨¡¯¢±´°¯©¬£§§«««©¥¦ ¥¦§¦¤¬¢¬¡¤ ¯£ª¤µ°¯¡©§¤¢¨¦°¥¢¨±¬¶Ç±´©«©¡ ¥³¡§ªª¢ª¦ ¡©¢²¬¡ª³²¡«ª±±¹¦¥©}ªmv«y|°n¤Ò¸´¸É²_`©¥ zyªÉt£¨©~ÆÆwe¡¥t }¯_oµc±uK£m§Gdzn|nyt|zm[fjrqgi^aXcm\^YILLJEDBB=A<A?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^_`^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L0/>-4OTQ;<F2-$§¤Àǹ©²®¥£³¹¬«¡¥¨¦«¬©¦ ¦¥«£¯¬¦¡©¥§¶ £¨«¶³¬¦ ¦§£ ª¦ ¢¦©°³Á±²©¬§¥¢¤¯¦¢¥¥©®«¥¤«£¶¬¡±¹°°¨µµ¶§ª¦¡Nw{£|¤¦¸|}z¹ÍÆÃ¶x¢~v¤¤¨~¯
¬}a¥l£q
}r¬`¤sqa¼}RUu¡z{rys~o[lnwsjnZd_hnbd]KKQSAGGFH::K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[T6?G,-!©¬¤«¹«¯ ¡³´¦¡¥¯®®©§¥¥¤§¡³®¢©§³ ©¤£µ££¡©µ¹¤££¢²¦¥ ¢¯¬£§¢µ±Ã°©¬©§£¤¥¥£¨¡«¢¤®¥»¬¢·¶®¶´º³¶© ²£¦ ҵ÷z¦w¢w¡
¥r«´nsj¤}s®¥£¦mp²\¥szl{~n©a¢rs~bs²¸hw£{u{xlhwhxsnt]ddmmfh`JYWW<GF?S3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVTQOQ[U%!2AH$*%r¿¿¼»µ¨¤®¶¢¢£ª¨®©«¥¢¦ µ¦¢©§±¤«£¤¤ª´´¤¥©¯ ¦£§³©£µªÂ¯¨ª¨¡¢¡¦£¦£¥©§« £¬¦¼¬½°£²µ»·©¬µ¦«|¨}|°x¤¥m±o |¢¨¬¡¨¡£{~««w z¯]£}¦§e|uj®]¥lr]`[ m£xy~il~b}tmy`gepogghBX_Z=JS2S8AAC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZXSPONI8152.*,ATVVVUTUUUUTTUTSSVWWXVUVQHFIJ$))¼©ÆÃ·Á´ ®¹¦££¤ ¯®©£¹ £«¡°ª®¡ª©¥®±§ ¨¢¡¥¡¥¨¥¶¨¾®¤©£ ¦¥£¢§«ª¡¢¨¨¼¤Ã¬«£¢´»°©£¶±¬®w¯|ºd°d®}¡§°¨¤¢£
\lk³`|{²lgn±Z}µ\¤kÈ¢f|»YvµZ²}S¯z¬X¡m¥yw|cs|bwt|aifonfefOTb[AS]=H(>9=4!!-$1. *1/04579:<ACFHJLNPPRTWZ^```ab__\[XUPNJGC553./@UYXWXWXXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·¾»´Â³£§¥·© ²±¨¢µ ³¨ª«°¬¯©£¯¬©§£¨®©¡¥¤¢¥¢¨±¨»®¤¨|¡ ¨§¥¤¤¢¤¨º Ƨ¦©¡¬¶·®°©¡¿°°°ª£®¤¸Ãº
¨¬¯©¦«Ö½Âªb¤¿½}£×»¸µ½¾k£p«
oz²±Çk«±½¬yx¢¾»t£wyb|ydfx{`kejjbPb[Ri\?S`BL)<:4/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMIC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´²Àº²¾³¢¯§¦³§¥¿©¶¯§¡¿¦¦±±¹¨®¯¥§¯¬®¦£¬¡¥ª £¦§ ¨¢ ¬¬©¸§£{§©¨¨¨¦ ¢ªº©Å£¡°¤¬´µ¬²¬£¿«³²uvª¤¶
e pg¬nnw¥¡v²qrª¤°¥rmmmfxomqzjqigrii
gqd^cioZ]g~x¦`brpfdz
tdwgjx~ydlcelbJdWIjY9OcDO'J9+# ",)-2.5:457:<?ABDEHKLMOQSV\W[\``a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´©ºº²³«©¢®¤´ª½±ÃǼ´©¿«¬£ §« º£¤®¬¦ª
¦«¢¤¤ ¥¦©£© ¥¥¦®¹ª«{¦¦§¢¯¥¡«¹°Á¨¥´§±³¬°®ª¼§²»£©¥µ£©ª´¤®¢µ¥£ £¤£¥¢¬§
¤
htwtq§m}
phvowu|yikecocUaX?hZGa^MW+E=+&!640. %2(*799469;>?ABDFJKKMPPQWUVY^`ab]^UQKEC>9=@ASX[\YWXXXXXYXXZ[[\^__`^^^__```_YY`¥©ª¤µ¸®¯¢°¥® ¡·±ªÄ¼Ã¹¶©¡¤¥°¨¤·§©µ§¨¬£§¤¡¨¤¨©¦ £§ ´¹§ª{¡¤§´£¦«·¨¯Â¯¤¸§°°²¯«¬¶½£²À§¥¦´¢§© ¢±¢¥³«³¦£§¬ ¢« fuwztj}
xqryq{~jnd^pi`\_XlbO_bNX9FFD=2<=7.*%+)&&406658:==?AACHJGJKLMSSSUZ`aiaeVPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤¨£°´¬¯£ª§® ¨¶ª£²¹ª«¡¢z¡°¤¦±©¸¦£©£¯¤© ¡®«¨§¨¸µ£¥y¡§·¢®µ¢°°u¤¿¤³ y{¢µ¿w¯¦¡ª~d\bw ¤~mµ¥©±¦f ¢u{pªm¤©e¥ylvq|ai[vfhqy¡dx
vhnykpe`vokkh[dca`lPY=MMMRF=?SB90/&4:306678<;>@ABFHBGGIKLTUUY]_gggXQJ<DH<9VR[`ab`^__`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«ª¦©®£§¥ª´®°¥©¥ªt¯ ¨«§¹ ¤~¬¤¨¢
u®¦¨£¹³§uw¥±µ´½§¢~§£{¥±º©
±ª¯£y¬£©«ªw¥{§{³{ by
nrzqtxht t{~ijx{qpgexmilj[cihdpZ[HSKP@E5-YST6)!09=>643568;:=>>?DI@IEJKGSX[X[aaifYQH9EL<?bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah¤ ¦®®«¨ ©±¦§ª¥¬Ä¼¯ ¥§´¬§¢ ¾¡}¬£¡¡¨¡£¹±§
pu£«´´®Ê«¯·
°³±©ª|¨r{w¦h¤y´¡ ¨ªÂ«¡r¥~²¡}¡|
nt{s}
uÅf©¢jogwt{vgivpghk^bnlfjWdF\QL2E46M`c7&3<EGD:63658;8>==>BL?NIJLCQZ]\Wb^jl[QE=KM@IdX]cfhgbbbbcc__babcccdiicbbbecafcbbi¢ °©©¨¦¬ ¥¹±©«¦¡¤©¡£©¶¢° §¥½ y«¢
v £¢¸¬¥~bm ¡§~¡§ ® ¡²¤¬~¢vk«uM«xª©ª«
¢|{§jlg·~n`cX|dgs}yl]}oaTr]`mz`Ye~
r¨ªk£nr¥ogdlZl{eY_~aWPoveotqjjo]ioljgWfM\WE8A4GC^k4+ICQMN=84859;6@;;>BO>QRKMBJ\]_W^^cu_MD:MNMTb\\ffiibbdbddbab`bdcabjkdbddgdbgeach¡¹¡ª¤¦¬¢¶¼«¯¢ ¥««´¢¨ ¡§´u¦~
¬£¨¥¯¦¢in¡¡¤£¡ w§£©¬¯¥z}¢ps{ymª~¢tw¦g~w¥_{}s¢n·´ºt¶¨dƸ|q¶r¤dt¬«a~j³~n~q£lr£r}£^³p|³tr[²ibqtuqhoXjkqpd[g\aKC=D5QAYq2<SG_JR=<395::6C<;@IP?TNNQ@D_^[ZW``{dIC7LWUVcaZffkkbbeadc`ab`dd_`cknccddhdbgfchh¤¹« ¥¸¶® ¡¢£¤¬±¬«¡¡¥¬x
q¡}¨ ¢¨§¤~k{} w¢ r¡©¨ª®®~z y£xs}¨£d¡~mho{§}rht«sªg]
vhªj¹f\©pa_§vwhu~lj¦\¨~w»j}©Z]³g[nrxwki[piwwa^dVaAPDN6VBRm4JZZ^NZD@151;;7H?:CHU?YSX]>Db]V`Qad|iFB9N[]XefXffnmbbe_aa__``ec^bdoq_deekecihgkiª¶¨c¬»²°¬¥§¬°§«£¢ ¤ir{z¤¨¡iy{}¡¡rh p©¡¥«¢ª±®¤¢¸w£³¢£xzª¢r¡~°µ}l¡x~µ££«¨|}tªZ]o{xbM{{ezBMY¢js}ovy±³~¦s}mp|ori£]vHec_tq|}ne_kguzbc_P]W\SV@YEQgDRV\aX^ID=B8?A:HE8LEXAWRZVEFb\Z`K`m}qEC<V^bZejVghmobff^a`\]^`hb_ecvl^egfldelhili±®S_¡§´º³³¨¢©§ «£ ¨ w
nx
}r¡r¨|l
q¡x
z££®}µ{¦z©£§ixn~t sq|
o|¤§¤p^©hv£dp¦aÓ|{xrsc¢~¢r£vk³`tª²¨¼wo¿¦ª´^orpt£r^¤gt¦`h¦lÓynvykyvrl©¥g_eyqlhfcmuvf^aQZePQaHVIT_WS[ej[ePECKLJKAJD8P@QNXSXOSQ`eejSdxywJGEd]eZhiSihjncjf`c_\]]_ibahe|d^dgdkdjlfhmh°¬T]K~ª¯±´°³¢¦ ¢¤§©
{p}h}wpl|£©
yvnw
¡x¡£³¡¢¶z¬§¤®¥q©~¥£q¢®¤¯£wµ¶¶É¢t`©my u¡w ~oMf£rt¥{zubn~¡mrd`stk{j´¶´Æ¦s}yj«slswiytqPD}³^jvkxfkfbstolU[RYhOQhIULXRU\gknUgWMJAJMKHJNAQJPecjmeuss~x{ntz{UQNm^h\kiRjhilgmfce_\\\_ibdhk{_]dgcjfnmeime¢°¨
e@¢²«¯¯µ¡¢§¡¡£¤¦¦ykyeyuj
z¥¨z}yp
y~¤¦gnxl¢d|r¥xph§}¥{¢rv¹n¢b}£nsk«ku np§ajiu¢~`uobh¡fjuqegos¢[_[d¡n^q|trd¥nx¢cf§gqm¡oRn ^d§T]TmmrkqmphkwsjnQVUUeXSlIXN[HWhhsjYkVPREV\MXRaUhj^wu{|p}|r{sww^QsagbpgPkhhklohdg_]]]`jbjivu]\chcjirlfkmc¥¦zetm§®¥©°±¥©£¡¡¢¢{qh|su}|e|¦¡ª
}si¦}
©¥¦x~¥²¯¥z{©u¨n¥¢¼m|¥¯
¢~¦|s¨¡ip¬cx¨mª£vw«¦k±lw³©loo b«ªx§w}
¤ hu¬f¶sv¾¤Y¦«aurto{upbj}nglRTXT``\kL\Q[I]lmv_[qX[_Zgsenoqcqt`wz~yrys~{{vbydcnsdRlggomrifia_^\ajbllzo\\bibmiwmglob¦«¥ªª§§£©¢¤¨
t
zo
~turn|{
¤¥¤unl¨ª¢ t~y¯¤qy{s©q}}zx{}}w¡¢{m\zys{qin~rtqf_xwtvpzopn
_wixgªt}io}u{tllfsx{w[kWyinwrqowxo]k
nigVY^V\ejcU`T]Q^owykjvdijju|pqtsaotbt{xuyuy
~{nmdyn^Wnghukxjijd\`ZcielqunZ[bkdlkymhloaº©§¡£¦¤¤«¡ª¦¨~r||~{tsp|}
x~£{¦
wqª
§ «~¨¨yq
}p«q~qjo|gm] ssulwtYro~j]id{
`iy||w
jzlbqsw`t¨glvnwmcecyzZ\ignv[{ywtmsrf\mkkbYX\YXkq[^`Y]]er}ztotbjjj{|qzvtdmthm{~uz}{yzo{}szshT\rilvpuglgd]aYjhkjqrmW[emlgryohjm`«²¢£¡¨¡ }«¢¥{
|r}vros~z¥ xy¬¡ª¢¢¤£«¢¨¨¢~zª±¥°¦¡l}wxf}
x|{u¤ wqu
y§ztj|yirh`tq~{wvovt]^ogn_^YZ\SgqUc[[`lgt{{rnocjjh{mx~phookf{rw}
{m
|zy|}zxNdvjsnq{elebb`[sfpfrqmU]ltmhxzpgike»£¡¤ z~©
}x{mxr~ml~z~|©r
|{©
¦¢¦¡¦y~§|}ª¡© pyruaw
nzvu¤u~~ss|
|z
¨s
ymj}{mhklg^yg}{vuvu{w\`p}nt`cZ[]QflSdZ]`jhuy~pllckjgkrkktnwmynv}
wq~{{}{`i{kuhjejc`i\cugobumlTbqyeoyzrejmm¸¢¤zw¤¤yz
|l{xr
}}kh}|~
|¦o ¡
|¨w£ ¡£¢¤{¡~|¤ ¥uuqwa~s}qhxrzs}~rz||{¦{
s
xdpzxypljf^~sh|uvt|sj^`twpwdcX]^RihTdX^`giuyqfjclgejm}gmpj}wzkr~uv|{}jrntibilb_qVtolm`xhmWjsvctzzqbkoy³¥¦
¡|u£¡x|~~p~{tu
~wgc}x}y}o
¥¦v¡¡z¥{
zs¢ ¡}xr~n{d}qkfvp}~y}~}ry{¤vtxs^vw}s}vfleaijwstu}q|cdasnurmaY_]ZkcRbW__gjty
pbjbkfh|khthlnh|yl
qt|~z~|muttmfljacuVipn`xglajvpfx{yq_ql
¯§©
|w¨yy|}}{xsxys}d^}
t}~~£ ~q{¦ t§um{o¢}{qzkvm|n
xp~esj}
u
zwx~~
¥y
t{~qr~k`ytyp|nance{bnovsxwttaw`olunp]Z^]]i]O\Wb`glrzk_idichwmflhilg|zwns
}tz}z}|ryxxnlkh_iqbhqoevgmlazhj|{xpawm«¡¥©|v¬|w~{}|vxptszo
}~|a\~rzz¤||¤
n¢¡ph{
p¡}|usukqnu}uort|~ernz~
uu{p~«{}~v|nl~afwstnzb^oakt^pjzyymtqez^nlsmsYY]_`iZOVWdbepqe]ihfbgqnchheihzwuo
s|v
x
|xzw{{sykk_ohtkqomqgoke{amywplww££¨¡§t¨ t|v
xxrszlroxmvnq[Y~vu w~
m¡l¦
h
x~}}
pvplnoq|jsrxuzgtpw}
{{xur||
¥|v~wwlh}~[qrqoowZ^p`pk^oj|zqnmjmw`pokqnYX```lWPSYeeatoa]kldbfkn`ff_gjurrotyvyxv
{|wjqc|b
|opltjhnlww_q~y{tus~¥§
~tzrxtprtquloltlv}mnUQ«xvry wz£
}r
ji¢
qw{{|~lwjollm{bz~wzx}zhumv|r|rx{|
}|w|vogi~v]vnmkprU]nbra_mnyphpfgtviqlawf]Ue`_qSPN[ec\wo{^\hpabefj_gd[go~olqs}v|uvy|xs
~|zxgrk`~ook{`imtt^s|xxts
|y¡±¥~wtwspp
tpqojiumn}|musRNᐙ|otuv{r
¡
}x{zxin¥cpz|z}m|esokm{z\z{~{ziukt~mp~
|}wxwrkdn|igsngislS]ndpY_lqwgkkbgytppd`xa`Uk_^tOMK_fb[wpt\[du`beec`fbXissmkqv|tyvw~szr}~vesn|e~nokYlnyzr`vz{vrvvy¯ x~{
uwpyqopmn~rcdwp|nz|jhlb¤ÁÜ®ï¢slvu¡np
£
{vx
vxp¦^l|~v~~l}dxujoztX{zzgtjmwp|utxtrodrv_rloahtfR`pgkU_nsyarc`i~qsn[csbcVnZ\wLLKcf`]urm[\dx^`de_cc^Xirknkrw}swyx|q
}}{t~sguqymznspWqzvyqdvyhvq¨£}pwx|
|swpsjoljm|t^`wv{ptzg`e|ëÚµÉÃÜsltvip
{zwxrvr¤
a
h}~
rrwhvriuxmZ}}wbumpmz}nqytjoiou~]rhm\it_QdqhfS_qvt`p`]hqsjWgidiXmW[tLJKef^aqs
i[\ex]^dgz`d_]Yknenjsw~ss{vzs
|vv{vlwvyxtnwz|Xyqngxvdv
p¡¢snrv||yrsnodr~iflww[_x{zqqiagaÕ¶¦xnqw{pj
zh|{~
zu{|qvx ¡¡af}~m}ulmwutxvkc
|
p`tr}}{r
g{
}
nox~tlmhhwy_giiXktYRhribPbrxmbe^Zjntc\h`em_oTZnMGNfd[fmqkZ[br_\clvde]]Zllbljsvqo|}txx
}ux|voxyzomzv^tlhzssgr|q uu~mu}}v~wroljat|gbiuyZ`w{ymq~edhhW_rs¼Äuq}qri{|
|{uvw~ru
rw~f~
q}f~|y}i~vgpyxtxtljy
l_sy{~|sjz
y
~~nmz|usmfezsa[pbWnqSSmrhaNguxf`^]YootZfb^kn`pOYjQDSf`Yjmm|nY[]lbZbovdg\]`kickjsvqn|tuz}
v~xtrxy~oozqixz~ml{ujjwsl
n}uiw~zo{tqkjd`s{h`eqzZ`r|ygqy`ee±²wKbZ¥ÙÐqzw}
nk
zy|wwoqu~{jy
¤px{
p{}mvh
xr|e~
vdqsiyqpu}wy
zk\rs~|snrt{
ynn}~uycegzn]XvZWpkNWqrf`Klwta^\[Zu~spXg^gjr`oNWgR?Xf^Zojgyq[ZXjeYcpx_g\^elgfkiqwol~up{vqq{|zyujy~ko~t|or{zon~xg¡
fogy}~|hxskkf_aoxm_box\dkyaqu_eeÔê½2:>qy
u~~mku}
|wnvwn
lu{ufy¦~nvx
|{w~kqh~yn||wbz
rdri~nurutvtp\nuy|~y{rm
tzumjvts[ggunWV|SYodLZrre[Iqxo\[[Y]uuiZb[hfodjMWeP=]e\]ue`toZYUncYdqyZh]`gmgikipw}liyn|}zupnx~{{hz}js{rzsv}~yx}|kl}jh~z}~~}kuqghb[bgrn_aks`hpybss^cd n]6Z¯µti|u
svoltyx|y~rgv~~oqivynfy¤ow
|pz}{h~lj{zj{wr`w~rdrgvnu|}pxz|umYpwuxv|ytos~|onimtm[edqoPZzN[n[O[rodUKsxiWYZZaqua^]`gdiifNYgM@`c[`u`]ulWWSt`ZdorWj^bhkgmlipw|kh}|o~~{zwq|orx{i}{mwxvv|x~}zm£{uxjlx}z~prpcf^Yg_po_`gpfjntato[adjuz¿¦¤È¸qr{w
srro{sttwyypcwzirwgwucj|~su{
{{kxy~tgzhkytizw}h`x}kkth|iv|q|w|tcVx~st
}ryyrq
z~wwjqhlqo\f`qlIduK]lTSYrnbQOtxaRXX]apt]b\ieedkdP[pICc`[co]]xgTWVv^[fnhVk^ajgennipwzmiy}r{~y|v}pwrnw~p{xyztxzuo~}
yw
zgt
y~{
wgpn_d\XeYlra``plkhn`shY^cnw©Ú©Ç²qwotz
ytst}wpqmt
xtk`zyfrphun[m}x~y|nxw
|
ltv~lgvdm{vmjww|abxziuuc~|hu}vwq{}nZWupv
zmuylv
}~z}t~thtenlrYh]sdFmmKZ`WVUwmbPRtvXPVX^`rp^acmed^ocT\qFBe^]eg][zbQV\t[[gk`Vj_`offkphpvxtkuvx}w{t}ortqu~
zvx{|w|}}{~ruy yvtx^}
xt
x{bnl[b[[aVisb`[gnpfraqeW\bk|Êι¡jmmlqq{~zyxsxut{jlvcuvof_}zerkjqcXlz
rw}os
t{y}ppo|fgqamxqjlqx}}z]ezxjvxfwht~sko~yo}^Ysnt|oprwixxs{u}{sgsankpVi\v[GmjMVU]SU{kaOTurPQTW^cui]`ljfcZoaXboGAg\`e^\V{]NUepY[jh]Wg`_rfkgqgpswxntzx~yur
pp|xwvz
y{t}}~~}~|yuxw~|muxcso
{ucnjY_[\]Tgsd`XcqrgrbkdVZ_jx¾®{·nas
hszqx
z}~wwrvo{vejoausjb^~yyfqhkkZVow£
przvou
}xtqnhx_jl`mvjgjlywzvZg}|yfs~m
ueuqhk{unvc]q}lu}{gv~oriwzt~m{|{xqflam}klUi_vUJijNRNgLX{haNUukLPTU_gvg^aqhgbXi]\kgJDjYbcVYUyYMVmjY]kd\Ydb^tfldqgrpuwqv~w|
}usnsy{ztsx}u~|
{~{w|wwziv|{lrqpflgX][\[Sdpd^WbruiuoeebW[[hporsddy}isusrwxvrumjzqagkgsmf]_}p{imxgjdUWro¦|{vt}t~|o~}x}}upqlgt\lg^ltdgfizo{rYgwuhpxwbw|okn{rgtfanzhsx{~cwwklru|r{{uhywodfbm
{ljUhaoRJhjOKNoG^zfaMUtdJOSWakwf]gtif`WdWbp\KKjWcaUTUrVKXudZ_k`[Zcd_vgmbpitorutwxz|u~
nrt|zuq
zvs|
}}z~w{£¥y
kt{zuznsy}vojieV][ZZSbnd[Xas{jhmi`bX^Ziikpgl`hyxjrssmz|utmzgiyj_enhvgeXbwj~{ojpgf]TXog§vz|zvqqux|zvvjruggn[ld]mr_hajyh{l[nrtjp~zxaw
y
trpzscrj]qxert|yctqgjyusmyxvye|ywqddcm{|jjTgaeSJkfOGQjEaxfaMSr]JNUYelx|f_nqje]VaUnnVJSgWe]XMUkTI[y_[_j]]Zbe_yhlaoovnpxuz~wyzxy~qtt~zvt}|kr{
~}~{w«zjryu~tnn}sjpnddY_ZYZTbjg[Z_ui^ml\aW[[keqt}ii\kvugsvql{}|xurlyfiwf]dshzwccTeph
xxgijaWVYgc§o~w{qri{q}~xs
~ndvrdgg\ja]oo[h_muezh]torkr|~uvbu{ysuvbqn[rtcqs
|uesmam{pkj|zvtgw{zvqebdmr}ijSg]\TKqbPFV`GcvfaKSoXKMXXhkv{eenqgd[W]XweTJ\bWgWYHWdOGaxZ]_lZ^\bc^~ij`otxmpovzr|}uu
y|suuyzz|~
isz~~
z{}sq{{|eqys|zurn
l{~lzcpobe^eVYYWcfk_]\s
hXqn[^XZ[kzbpwvlaYlssgtuolx~xvmnsdhte[gufvvz_]Rfgkt~bdj\TW]bc¤ixsynq|jzo~vty}yidvm`f_^i_]tkYf]oobze\w|knopxytues{wps~tcxe\qqbqr|tgse_nwjehz}uopvt}srb_fmn|dhSfWXSMv^PIYWHbtcaITmSJNZWjlr|cmmscbZZ[aw\SKc]WhSVFX_MFiuX^`l[[_ab]ihanxympkvym~vtttqvvx}}~~~pw}yxz}ttq zz~wctxrwtkto~kx|ps^po`gblTZZWhcmf\\qeSrn[YXW_kvdiuji]Ymspksssi|~~zvnmkdipc[jrdtvs[VSearr]bc]SZ`\ceqq
ull{opr}~sxt{zzdeug]bY`g[^vhWb]piawa[|vijroxtsuiq
wtkq~ogxX]lncrsztgp~\`prb`ksmnvsqxkpa\ellz`fReTWQOuZQOXQHcsa`GVjQIQZVkkk}fnorb[ZXYlqWRPfVVhSTEY[NHqtX_clbX```]jcdmzxlpiuy{k}|y|nrnvz|t|tx
utqvp¡sy
zdvnnznfxpykrvsk^uoagekR][UgalkZ\qdOon\VWTfishbted\Xntloutxj|{vscdkn`\nmcsxkZTVcdx}}q]d_cTZ_Ybcmp
tki|pguyv~m{uvp{u_fsc[]VacXateU_`mdaq]]~phitqtquwkm
}rsgprtpT\gkfrtvtcmwVcrl[_pg~fnx~stsjmaZdijw^eScTUPSlVPVSPGdr_aFXiOIXTWnie}jlxlbW]U[tdSRWhQXfTSGYYOMwvZ_ekiYa`]^nbfkyvnoivvl}{krft{u}r|{ts~vn¤rvvly`d{pfysxlmrwgd|mcfghS_^Ug_ko[^nhNim`UVSnfskexed\Xoslqzwrl{vzykaelm^`ojeqx~gZVX`lx|{p_c^gVX_Wcbkp}xllzn]xtn|kvtop|sXjn_Y\UabWdpbS_bibblZa~lfltvomwwli{nrfr~ntnd[aiiptts_imSeqeVcod|dsx}wlpmk`Yafgt\dU`URNWdQO[NOHdo\bGYiMJ_KYmd`yin~e`U_T]u\SR`fN\`URI[XPYtu]_ekhXb`Z^qcgjxqsnhvt{rz~|yntkst
y}|
sstyso~zz}~~}}~~~~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~>.1111/o]-0000-F¡¡¡¡¡¡ wegfffc¾»»»»½³mfgggggmnnnnorJ,00//,I
}}{{z}~||~}}}~}}~~~~~
-h
S7¤¤¤¤¤¤£r]____[~ÈÄÄÄÄÆ»g^_____egggghk=;|}z{z|}{|~}}}~}}~~~~
|yzz{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}}}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}}~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}~~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvutvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfgggihgmgjghehgccbab``]X[[WXWTVQPTSSMJLKLLNOOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVRQQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwz{|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNOOONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMMMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOONLORNYpprwxwwtttwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOPNPOP`pprxxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAFQE=C=?EH9:;=?=<AF@>:<>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOABA@BA?;><>??<899;;:@:;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrwxy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;88:87:<978;;>=;;:8:@@BB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqususqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;<?@AB@=<9<=<979::989::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJINJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?=<:=>A@A?>>@?>=;<<>?=<=;:<===<<<<;<:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AB?=?CCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BAA@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC??AAABA@=<=;>>:::<:8988:;=@?<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFFHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvvw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@A@;BCBC@???@=?@><>@?===?==>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hlpppqtuvy||}||~~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGABDCDA?@@@?=@><=??@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBBC@BDDBDEAB>ABBAB@?=ABCDCCACEGA?=Vppqpruuwz||||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>;><?=<:>=?BBE@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGEEFFFJNMKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBAEeopqqtvux{|{||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@DED?<ACDB?>A?ADEDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnopqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFIHIGHHIGFBDFDDCAUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCGJJKLLLKLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{~}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKKKJKMJKHHFFGFEPl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD???DFGDEGIKIIGHIGIIIJIHFJJJJIJIJJJFILLJJKKfopsstvxy{{{||}~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKKMLKMLIFJVl
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHGIHKLONNQNQ^r
fBB=88::9878896479;<:8567789787689;<<>A;999==>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@BFHKHLKNTg{T:8656766646763468:876565677778:7788:;7688989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~}}}}}~~RHHHIKIGIJIJJKDEHEB@5788=:=DBDFFDVxH676468874578467799776765::;::<89999877:::8878589;A=>>BA?AKLOQPQOOPQWkqrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A@<:579897:A9<D?P}z>:88;<=>9:;<89;9:;::9;::>==?;;<=:><:<;<<=<::<8::;:999<?<=ABDIILKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?;;<:89989999:>=??Cv
l<;>BCEEBAAB>@CA@?=>>@???@?@==?B?AA?A?=AA@??A<><;:;:9;?=;;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~REBAGJNOLIGK:8:;9::<<:::<;=>@?=a
^>DGIKJJFGGDFHGECA@CECC@BCB?@DHECEDEEAFEFDFFD@B>=@>=?@>???>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD979=:<;>=>>;><??C>J~
WGLLMKNIIKHIJJIFDDFGFDCFGEBHIKGHGFGGEKJLIJKJCFCCDBAACBDCCDDCA=;=@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97;>;<:=?>?<?>BAE?h
PMPMKNKJLIIJHKGEGHHIEEIGFELLMIJGGHIJNMOMLNKHGGGEECFFFFDEHHFCA?@Lmptuvxyyy|||}}~~~~}}}}~~~~~QA?>?FGG=<@@87<:;<:=?<==?@CBHS~
qMQOMLLLLIHHFJJEJHGKJIJHHGKLNLLHHIJMPNONMOKIGIJHIDIHHFFGGIGCBACUoquwxz{xyzz||}~~~~}~}~~~~~TDAABGGB?8?@8:;7<=:<?<=>@BCCLm
^RRPMNMKJGFCHKGLJFKOLKJJLMLOPNHIKLOQQPQOOJIJJMKLFGHGFGIFEEB@BB\prwxyzyyy{z{|~~~~~}}}}~~~~UECEEGGED;?A;=<8?==>@ED>BDCFJt|WVRRTROLKKEFFKONOWVQPORSRMSTOMSLPSUWRSRPLJMMMLNGGJFFHJDDEEBDCcquyyzzz{z{zz|~}}~}}}}|}~~UFEGGGGHF>@B=?=<A?AADTKBHIFIKx
gVVkaERQQPK;;QSR`u]UVTVYYRXXRZfPUWZ]RTWQPNRPPQQKKKGHJHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGFFE??A@EACFDCDKVPJPPNPPy
}al[dU:XXXSQ?@VUY\d`VYbr^]V]ZVEQYZ\Y_TYgRUVXTTVSOOMKLJIILMKOMTptvxyxxzyz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HLIMPKIJOSRQTVUVTu
g;~znpXZ[ZRSRWVTZZuYU}a\X]^WIV^^[[_YHYXY\]XXYWRQMPQMMOSQQURbtsvwwvxxxz{{|}}}~}~}}}~~xy}YNKJIIFBD@A:OQQWXPPPQRSRVWWWWl
n~fYY\YSVTWRQWVcQerXZW_hP`fZZX\hbGOZig\[\]]WSNSPPQVVVVYZostwvvtwxx{{|}}}~~~}~}}}}r}ot|]SPOMKJEC?@;PPZZZRSQOQRQURUSV^ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZXWWWzkXZ\\^SPPOINOWVXZZdqtwvttvxyy{{|}}}~}}}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSOOQOQVQSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRURMOYQMNQSUUMQSRPNLKHCIGRSTY]mrvwuttw{zz{{}|}}}~}}}~}~}}~~~~{vsw}~~du}iqt`d]][YUQLHLIaltPQSMQRPS[RSRQRUUbs{|~}{{
u_]KC>BBCCA?DPCC@C>BHGV@HNMG]iQHGOFDEFHGHBCHGHJGDAAC@NPMRdtuvuttvy|{{{{}}}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLRRPUYSUQQTROV`klsvz{xytrnstsyx~~kLG>>::>@?>>>jPKaEFHIEB?GLMGMQUJBE?><=<==?=?ACB?><=B>IMFUouuvstvx{|{}{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJOPNKLQRQTVUWQQWVPX[b]agmmlnjh`nrimlqu{z}{xz||xwxdB@@A<:BCAACA[\O{NOONKLMOOPLKLWNIGAA<977599=;;;8989?;BG>\tuvvuvwy|||}||}}~}|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OO^\ZIGOQQOMPQNQRTVXSRYTNYZ[WY\_^_e_]^qwk^`gkwooljomnlfbYGFFHBAFHEEFCLQOaWRXQPSSRU[OOQVPMIDF>996587979:365795<B=ftuwxwzy{}}||{|}~~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKSTSPQUOLRSTWXSTXQLXYYVXXVXY]WXXhsk]V`tkaa_]d`_^YUPMONLIGJKIHFCPOSZWTTNQSYS\eUOSTQNKIHC?A9988978847578599Gnruyyz{{}}}}|{}|}~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVWXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWS[fJLPRROMMNMMLJFPPUYSTOJNOUST\VRUSRNMLIHHF?>=:787659967665Xqqtxzz{|}}}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXWYYYRUOIGOPOOMRJOPOONNOTLMIPPSTU2<XMI@Q=c`QSQPMPPONNMPNTRPRLILKORPQRRTQROLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWVQSFFAFGGHFJDHJHGEHLHKIGLMPMG/E_R>4@>joaRRQ@GTQOPPQNQOPOLJLLPPNMPQQNQOJLMMKGEECB;==<9=G6676Enquwz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVUYYVQQQO@>;=?@BAC@BEDA@GHGHFFHJMLDGCORC8DMS]gSQSAGUPOQQPMMNLJLKLNOOQLONMILKIKKLKGFFED<AA>;@E;<89Trsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A?==A@B==EHFDFFIGJJ@FAA@FGDIOHQRa\QPROSNOOLLOMKMLMON[VKMQOGIHCIKLLKFFFE?BC>=BG?B?@druw{z{{|{zzw|xy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;>A@@>AEJECHGIGIEBB?><B@@GJEMObePMOMWKLNKLMMLLKNNSdMJLRIIIFBJKLMNJGIFBBB@?EFEHDLopvzyy{{z|zwsxux||yznqqmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLLIMPMPOHKE?B=99::?B?<ABAADEGKFDIIGGHCC?B>?@@=CEDLMQTLJIMTFIIJLIJKIILMOPQPKGCKHCCKKLNONIJIGCCCDIJMLIZsnxyxzz{y|vrpurtyyvxjqokllnttmsv{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKCFGHGJKIJLDGB<>=:::;AB?=BBCCHEJLJEIIFGHCC;A@B>@?BDDIMOGHJGHKDHIKMHJLHIJLJM]RHIDNGBELLNNPNKMJKFGGJMNRNMcnjwvw{y{z}qmlskptttuhpmjikktpnttyprztorqowsoqptrprutykNVmulq{vinoikthepFJCFEFDEEFEGCC@=<=:;:;AD@?BCEEIFJJLFIIGFFDB:ACC>?CCCEGKMHJNHDHEILNMHILGFFIILNKIHEOICGNMOMPNNOMKIHIOSQRNSggfrosxv{z|lhjoekpmsqfmlhikltmoutwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhmf_pGJCEEDBBAE@DB>?>;;;>;=?DB?ACFGKGJILHGGGFEC?=DEB>ACBCEGHIGMPIEFGKNOKFHIFECDIJHKIGHPKDJNLQNONOPOJJIMRUURPXeaamfproryzgehhcilfqlflmgiklsmpwutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEDFBA@AD<BA>A=::=?;>?AB?@BEGJFJGIGFFFDCBAAEFCBBBDEEGGHFLPLHNJJLKIFHEFECCHIHKJGKRNCOONQPOONOPKKKPUWVVTY`_]i`ninhrsbeffdhhfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqskksMGGEFAB@DE<AA@C<8:=>:@=@C@@ADFIEHFFHFEEDCEBDIFCGEAEGEFFGEIMKHQMJKHHIEFHHECIIIKMKPSNDRSRQSNPMOPMLNSWVXYVX^Z]d`icjigk_defchggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBEE<@CBD<7:>>;>;AB>??CEGDFDDGECECDFFFJEEIGBGHFGFECFJJGMKLKHJKFIHJHEKKLLNORTOHTUTQTPRMNQOMQWZVZYWZ^ZXa`a`^hec`deggjhhjghnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyNHHGIDBCHE=@EBD=8:>>=<<BB=@>ABFCECCGCCDDFGGGIFHJHCIHGIGFDHKIGKHMKJKLHKJMKINLONORUVOLVVTQTRRLOQPOTZZY\ZZ\__]_c_\bdlc`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquLIJHJFBDGE=AGDD@:<>@?>?CB<@>AAGCEDCHDEDFFGHFHGIKJEJHHJHFFLHHHJGLKLLLIMJMNMOLPPRUVWOKVVUSSRQLORRQV[[]^[]^``a`bf]d`fg`eijdssfjhflprqossnswwpuvtsmoruorspurvrtvuuuwvuwsgtrkqrkrwpwJJKIKGBEDE<AFDDB;??A@@ADA@B>ACHBEDFGEHEFEIHFIHJLHHJJIKJFJKHIKJGKKLLIIMKMNNOLOQRUWVMNTVUSRQPMNTSRW[^^_]^``abb`ddebdibdijgvlkigmosqpqpprywruutsmmssmqrotuuspswtuuwvuuufqskpqjrvpwJLLKLGCCAE<@EEDC=AACBBCEACDAAEGCGGHFEIFCGJGGJFILHIJMJMLGKIHLKNQKRPLRLJMMNPPPUOWXX[NSQW\ZSVPNTUTTXZ_bb_da^ac_afcabhnhbihhmxvmhinosrpqrrrvtsusssnksqmprotvsqquvuswywutucmtkopjqtqwLMLLLGDA@D>>DEFC?CAEDDFCBEGCBHFBHJIGHJFDKJGHJHIKGJJNKNLILHJMJZfJd[JlRGNM_nUls[qpbwcRPbvuhucavaXnqbdvimzf\lt`lkV`wvijghfglmjmojmosrprrqrsrssrtrnltonpqquurqstvvuuywutt`ktkppkqsryLNJKJFB?@B?<DDFDCCCEEDFBEFGDDJEEJLKIKLGGNIHJKGKJIJJNLMMLLIMML[sbdp]llULNer]geqlntgpi_aYnmbppbkjjgoqtetno\pvgpOLryvkaakeelxmkvlnpsrprqpqrqrrrtrmmsnnoprutqsstuuutwyvttbmukpplrrr{KLIHGED?AA?=BEFBECEDEEDCHHGDDKHGKMMJLLFJOHJKJIKJJIJMMNMMMKNMN[rponppkjLOPmXNibtrpamov\YlP[mmZqmkplxxtsip\`slqkUuyxoc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGGEEDBAB=??EGBGDHEEDBFIHHEGKJGMLNJLMGLNIMKHIMIJIJJNONNMLNML\hdu]lqVkMOQnUZk^klvaldtTecNlYl\toljlxjwuhp]_skhWbcw|oc`ghacityknnqsspqpqprqppprukmqmmmoqstrsrtvvswvzvuthoulsomsrtvIMFIEEDCAB<B@BFCGFKGECCHKHHFILKFMKKRRLHMMINJIGMGJJHINOMNLJMMJZtppoqqlkOQRnYskgooqqomt^nXat_nopoqsoousttjZ^tcwxrjnzhaacfabjmtupsuvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumtonssvtIKHJCDDE@@>CCAFCHIMHFCFJLIGFJMLFOJJWRKGLKKNIIJLIKJIIKLMMLIKKJSkbYi^_jcrrZ_Yjo_eeUk_c[aaQ`mh\j\nijd[oedp]Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunvqrutwrHHFJDECFA@AEDCFBHJLGFCFKLIEFJOLIOJL[QJFHILMIHJJKKIHIGKKKKGHJIKKLJIKLNT[]TPUMQONOOVQOPQNOQJJNPQdqiTYV[[\UYZ]X]\\cfaafbcf_^fkmhmtyrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusHCEGFF@EC?CGDFGCIKLGFDGJLHDGIPKLOKLWMIFEHJJHIKHLJIGHHJHHHEFKHHJNKHO\W^O\\`^OXYS\\b^MYZMXaRKYaZS`d\aX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtPBCDLMACCBDIEGGFKJKHEEJJJFEHHPJLMJMRIHEAHFJIKKILJIGFJHEFGEEJFBILIJS_Y`X`a[`UXZT]^Z_RY\P^\YN_\^S[^d^Z]`c_Y_b[`^[UYYZ_^ccbaceiekrpoppnow
{
uqprrsuyzzyyxxxwryvxrqxvtvaSJJMIDCACFGEGGIJJIIDFKKKEFIINJNLHLNGHF>HGLIKKJKKIGEIFCDEBFJD?IKHNZbY^^a_RTSW__\]Y^QY\MV_WKQY[Q[_ba]^ca`babcceZRZWW]Z]d`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxYQJFDGEBDHHFGHIFGJGHFHKIKDDJJMMLLHJJHJG@GFNKKKMKKKIGIEE@DAHIA>HIFO]`Z[d]_TQRX]\\\_[KW\LR\YIM^QQ]_bccccb\dbadcfXRWUT\X[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMC@IFCEKIFGGIGGJGFFILJNECJJLNJLIKKIIGCHHQMKKOMKKIHHFE?EBHHA@FECS]Y^X_X_[]UXXO]\QKJV^X^[]VZaRR__bb``bb_cbaddaXPRRS\S\]]^^___diglknnp{{|~{
srw
|x\SKBAGFDGMRHDRKFHHHDFKIMPEGIJKNLLJLLJIGDHKQOMLPMMKLIJDEAECHFAAFCAUUE\T^SW`XNTUMYZLJKT`a[_X_^b]OYb\``_bca]baW`_UQPQRYS^\[]]^`bffflfoow|{{}
zo
~INFDFFHDIScQEW_IGGHDFMJPPFIIJKNLLKMLJJGEJNQQNNPMNMNILBEACCFCB@CD?LGCLLPOOMFMFFHIGFLKMOPILOPPSPLQTSUZXWYWWcVNRTPQPOQVT\YY[]\aaefdhdlmqsszy{z~{}{
}KIEEGFGDKN^MHHYMGHJHGMLQQIKJKKNMUNOKKLGGKPSSNPPNOOOILFaED^LDfbCLZG^\smOMVnYKCP_TkVgJ]XU^DLQULMSVQRTXVTXTT\TOeZhheZUkTXWU[\[``abbcagignlhsz|}~}}zr{z{
~z{LIEFFHEELPTJKG`THJOJIOMRQKMKLORUROPJLNGHMQ[YOPPNPQPJKQQI|YYrsWPmGqnoaVPqqtOBksmqspSo_[nX]V\XUkhU]VcY`YZ^UUWituu`av_Yb\\f[_aaab_acgmom`pwtx}~vxzmv~tx}|~|z~wwNIEHMMBDLLGJLFRVLKOHLRXWQNOOMQTNOQPLLOGMPS[ZTQROPPQLIZx]TxdhXRSPvftlpbnfkRrNLwmjrpsrqrpoo]ezuxqqzq~r}ku}aRh|esspss|}p~xor```bb[bahlnkblfgmw~~{xwtvziq~nt|~wx{~x|u|||ssNKF`]GADMMHKKHKPOMNJNV^YULQSNYYLSSSNLPIQRTYWWPTPPPSLHgxlcxqmZJKTypumubnvPddHevqmwojfxxiWrQhzmijzz~lxzphnXuujvuqash}ilx|o___cb\_cegjjegbcdlmppstsssyqrxbmtgry{ssuy~svzn|}yxrnMJRtNCBEPQHKLJLQOOOMPZ`ZXKSWPa^RVQYSMPJSTVXWWOUPONRKLrouuquqch`UnKqp^GhyWvTKhx}w`y{sna]modSgrunmypwkustqlm\s~zkmy|lun|kqwux^__b_^`edighfe^bbiiijknokqnmjpacfcowxompsynqpj{ztromKKZVHGEGRQKMNLLQQPPPQW\YUNVYUfXRRY^TMNJTTWWYWOSOONRIRmHiwK`dvvTVlNnl{rajguTKWkg|lmlx_Zpz{_`zscroxqgc|ir{]TKl_vuljv|{nyl|p]^^b[_ceegfeec[ccikkrsrwgmihdg`alagsrlglmr|kmhk{tmmkmOGJKHJHHRQMOPLLSSROSRXRWTPWZVVTTTa`QONKTSSQVVOOMNOQKHQNPULKKRSRQROVUQQORRXXPMOUTWXX[[UQRW[WXW[ORTWWXQ]XV\UTOXRWWXYZ`\hs_\[[]]_cZ_ddegdddcZdbgffmnmuffgc`f^]g`dlhfgkhpzhggkujhgilPIKKLMKJTRNRQPLVVTPTUXUZURZ]UUTWUYXOOLNWTPNUSNPNLQPKIQQKQMJJOQTQPQSRJHMOPQRPPPTURXW\WSSPQUUVSZQNRRWTRXUSXTSQUSUUYYX^Z_a]\[Z\\`c\^bcdgeeecZ`adabhhjncad^_c]Zc\bma^ffgmsdihkkedcghQJKKNOLMTQOTQRMXWUTVXWWZVS\`VWVYUXTQPKOXSPNUPNQOLSPMOUSNQNMNQSPTPQTTNKMORTTQQQUWUYZ[YRURTXWVY\SOSTWTSYTVXTRQWVVX\Z\`]WY_]^]\]aa^[bcchgfdcX``b^`hegea^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLPUPPTQOQZYXWYZZXXV]jdVXYZWVSTOKOVTPOTPPQOMRQORXTQQOMORTMWQSTUONNQTVURRRTXVZ]\ZVVQRWXU[[VPSUUUUXSWXTRQXVV[_[^`_V_]^`]\`___ZccehheebYb`b^_fdc`b]\\\\YZ[X[a[^]]_b__bddbd__`\PMNNRQMRSPSTQOV\ZZW[[\YZ[dqmhd_[YVVXRMMWSMMRORSOMPSRU[UTPPLPWUPVQRRXMOPRUXUTTSTYX[^]\[VROUWU[ZVQSVTUWUSXZSRQZWW]_[```Vb\`a]`b_\`]cachiegaZc`a__ee_`c[Z\[\ZZYYW\Z\Z`^_[^^a`_c\Y`ZQNONVQPUSPUUSPW\\\Y^]_W\^jpwyc\[VVYRNPWSNQQPRTRLRTTY[WUORNSXUSQRPRZOQSTV[VVVSVZX]^\\^VSNTVV[[UQTUUWXRSY[SRR\XZ^_]ba`Wb[cb^ac_\bab_dgieg^\d`a`acd_b_YZ_[\[XXYWWZZZa]][]\\Z]`W[[ZPOOOYPUUSRWRTP[]^]\`\`U\\hjr}slh\UYWQOS[SRQSRUUUKRWVZZZSOSQUUTRMTPRZRTUTX]WXXSX\X^]YZ]UUNVVW^ZWQTUWXXSVY[TRV]Y]^a^cc_Y`[eb_dd^^cca^efieg_^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POOR[PZUVWVSTT^^`_^b\`U]^bkyum}lZUZVQQT\TTTVTVYWLRZV\[\RPUSWUUROVPSXSWUV[^X[YUZ^X_^Y\YRWRYXY_YYRTUYYYUWY[UTZ]]^ab`ed]^]]eabfd^_dc`\gehfeb`ea_aabb_`^VY^Z\\ZYYWV]Z]^[Z[\[WY\]VXW]SOPWYQ]UWYWWUX_`aa`c]`U]^beev{hXYZTVTV\XWWVWW]XOU\Y^]]TSXRVUSQRWQSVTXXX^^X][U]_X__X\VQXTZZZaX[TVWZYZWXYYWV]^`_dcbfe^b\`fbdfd_`dba[fchfdfaf__bbaa`_^VU]Z[\[Y\YY][[[XXY[ZZZ]_]TY]UNTZVT\UWWYWV\`abcac__V[`da_zuohZ\ZVXVX[ZY[YXY`VOU][`a\UUYPTVTRUUQTUW[[\__Z_\V__Y]^Y]VRXWZY\bY]UVZ[Z[ZZXZXY__``dcdeecdZbfcgfe^ab`c]bciedg`h^bbcaa`^_YT[ZZ[[X\XX\[Z[WWZXX\[\`]V]]SOVZVVZVYVXWX^`badada^YYadb`kfh^\][WXYZ\\\_[Z[bVSW^]ac\SVYPVUUUUUSUTX]]_``]a]Wa^[^\[^XUXW[Z__[^WX\\\]][Z\WZ_a^`ddeffgcYcfehgd^c`_ec]fidei`g^cbcaa`__\XY[YZYYZXW[[Z[WXZTZ]\[`\U^bMRWZWWZY[\XWY^`badada]^Yacb_a`a_\]]XW[[]]__\Z]cXYX]`cd_RXYPWUWXWVVWV]]^aba_b^Ya]]^Y]]YXUV[[`^]_YY^]^^`\ZZY[_b_cfdfgfhcZefgigc_c^afeZiicfjdf_bbca``_]]ZW[YYXXZYWZ[ZYWXVU\]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XW[]_]`_][`d\\XZbecaR\YOXVY[YYWYZ`^abc`ac_\b]_][^]YYTX]\__^_[Z^^`bb[[W[]`bbdfdgffhe]eghifcab[cg`\iichjge`baca_`_]]\Y\YXWXYYW\[ZWVXPXZ]acffrkJYW][Z_]\^\Y][^_bcbaa]b[bdb`cbb]][ZWXjq`\`_]\ac_^YYcedbT_ZQYW\]\[Y[[c`ccc`bda`c^`\^^^ZXU[^\\aa_][`abfb^[S\_`cddfegffgf_fghhgdd`[eg^ahhchigd`b`cb___]][Z[YXXXVZV\[ZVVULXX\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyyz{{zz{zzzzzzzzz{{{{zz{{{{{{{||||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvuvvvvuvvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyyzzz{{zzzzzzzzz{{z{zzzz{{{{{||||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||v}}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÓÏÄÅÅÅÅÅÇÒÔÔÔÓÓÓľ¾¾¾¾Â¢~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}v~~y1333332j{éääääåàÔÔÔÔÔÔÖãååååäåÒËÌÍÌÍЪ}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vxxxxxxxwwwwwwwxyyzzyywopppppprrrrrrrwzyyzzz~||}}}}}|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvuuuxvvvz{x{xwvx|zyyz~|yyxxxxyyyyzzyyyyzzzyxxyyyyyyyyyyyyyyyyyyyyyyyyyz{{{{||{|||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwvz}y{{y|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwvz~zy{x{zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwwxy|z|w|yxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{xzzz}|z|x|xxxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{yyzyyxxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyyyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyyyyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oxyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{|||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}|}}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~
~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}}|~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~
}}}~
~~~~~
~
~{z
~|}}}~|{|
~}~~~~~~}}~}}}
}|}~~~}|}}|z|
~}}}}~~}}}}zzz~~
~~~~||~}~~}}}}~}|zzz~~}}}~
|}}~}}~~}~}|}~}}~~~}}}|{{{zzyz~~~~|~~~~~~~}|~~~~~
~|~~~~~}}~}~~~}}}}{{|zzyyy{~~}~~|~~~~}|~~~~~~~~~}||}
~~}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~}}{|~~
~}}}~~}}}}}}}}|{zzyyyy
~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~
|}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
||||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
}
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~~}||||||||||||||}|||~~{z{zxz{{|}{~}~}}}}||}~}~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{{z|~|~~}~~~~}}}{}}}}}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~}|~~}}}}~{|}}~
{z{ywz}~
~~~}}}||}~}|}}}}}}|~|}|{}||z{z|}}}~}~~~}||~}}}}|{}|~~~~~}}}~~~~}|||}~{{}w~vx~}|}|}~~{~}|~~~~~~~~~~~}~~}|~}~}}|{|||{|z}~~|}|}|}~~|{{}~}~~}{{{}{z{{{~~}||~~~y}~v{vx}|||{}}~~}~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~~}||}}|}}}}{|~~~~}~|||||||~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}|}}}~|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}y|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}}~}~}}}{|}~||{|}zzyyzy{{~~
~~~z{y}}zzz}q~z{|}}}}zx~
~}~~}}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv~
~~}~~}~~~}~~~|}}|~~~~}|}}||}}||{||{{{|{|||}|
~~~~~{zz||{v{tw~vr{~~{xuw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|}
~~~~~~~~~z{z}}uqz|zqz}}yxtt
~~~~}~}}}~}~~}}}~}~~}}~}}}~}~~}~|{|z|{z
~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~}~~
~~~~}{z{z|{z~~}~~~~}~}}z{|
{{ry{|pwuvwyvtz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
~|}}~}~~}|~~~~}}z{{||}}|~}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~}}}~~~~~}||~~~~{{|||}}}~}z~}~y~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}}~|~~
~~~
}}}|{||yz{z~y|yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzswvst
|~}~}~~|~~}~~}~}~~~~~
~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~}}}||}~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqxyrx
~~~~~}~|{~}~~}}}~~~~~}}}~~|~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~~}}|~~~~}|~~|}~}~~~
~}}{{||zw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqspxwq{
~~}|~}}~~}~|}~}|~}}}~~~~~||z|{{y{zwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}}t|}zzzz|yyzz
wy|||||}|||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~zz|}|{}y{zzxyxy{||}|||||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~}~~}}~|||~{{~yz{z{~wwy{|{}||||{}|}|}}|}|~~~~|z|}{}}{yz{zyxstunsqpxruz
~}~~}~~}~}{~~{|}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~~}~}~~{}|}|||wxuxxy{||}{||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}~xwvyyy|}|||{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~}~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~~
~||||x|yzyz|}|{||}}}||~{{|zzzupxwyvu|uv|
}
{~~}y|zzz}||}z||}}|z{~~~}}||}|vrvxxvtvt}
}
~
{||}zz{}}||z|~}}}}~~~~~|}}~~}|{xvuv
~
}}||{||}}~~~}~||}}}~~~}}~~~}}}~}}~~||
~
}}}||||~}~}}{|}}}}}~~~}|~~~~~}}
~
~~|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~}uz~
}y|~{
~}~}}}{}~~}{||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}}~}~|}}}||||}|||~}~}}}
}q{pyv~nypus|vzy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}~}~}~}}}||}}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~}~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|tpozls|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~~}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~~}}|}~~~~~~||}~{|||{{~
~|{}~{|{}~}||~}~~|~}}~~}}||~~|}|||}|||~z{{}~
{{~~|||}}|||}}|}|~}|}}|||}}|~}{|}|}|~|||zz||}
{}~~{||~}|}}|}{||||||}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~~||}}{}}|}zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yzzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yzzyz}}yzz{|{|{{z{}}|}|~~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}||}~|{
~}}{
~~{}}}~~~}}}}{|{zyzzyzz|yzzz{{|z{{{|}~}}}}||}}|
~|~~
}}~~~{||}}}|~~}}~{~{{zyzzyzz{yzzz{{|z{|{{}~}|}||}~
~~}|}~~~
~}|~~|}|~||~}|~}||||{{zzzzy{zzzzzzz{|y{}||~}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~|}~}~}|||}{{zzzyy{yzzyzz{{{z{}||~ÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÌÌÌËËËËËËËËËËËËËËÌËËËËËËËËËËËËËÌÌÌÌÌÍÍÍÎÎÏÏÏÏÐÐÐÑÑÑÒÒÒÒÒÒÒÓÓÓÓÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÔÔÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÓÓÒÒÒÒÒÒÒÑÑÑÑÑÓÇse`[KYgUMFH@=77897<<<:<;>6:=8<;:9878;;:?;=;<<>;?A?BBACDEDA>=<;@CCA@CCAAGHGIKRÂÕÒÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÊÊÊÊÊÊÊÊÊÊÊÊËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌËËËËËËËËËËËËÌÌÌËËËËËËËËËËËËÌÌÌÍÍÍÍÍÎÏÏÏÐÐÐÐÑÑÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÒÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÓÓÓÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÓÔÔÔÔÔÔÔÓÓÓÓÓÒÒÒÒÒÒÑÑÑÒÌrg`\MYeRKGK?;378;89>=9<:A:;=7:<<::78:;=?;?<=<?>?A=AA>CCDB@A>:;?CDACDDBBIGHHIN¾ÕÒÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÊÊËËÊÊÊÊÊÊÊËËËËËËËËËËËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÌÌÌÌÌÌËËËËËÌÌÌÌÌÌÌÌÌËËÌÌÌÌËËËËÌÌÌÍÍÍÍÍÎÎÏÏÐÐÐÐÐÑÑÒÒÒÒÒÓÓÓÓÓÓÓÓÔÓÓÓÓÓÓÓÔÔÔÕÕÕÔÔÔÔÓÓÓÔÔÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÒÓÓÓÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÒÒÒÒÑÑÒÏwh_^OWgMKFL=8765999<>9?<D9;<8:<=;979:<=@;>=>;<><=>A@>DCCC?A=:;=BCECCDA?EHJIJLºÕÓÓÓÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËÊÊÊËËËËËËËËËÌËËËÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÌÌÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÏÏÏÐÐÐÐÐÑÑÒÒÓÓÓÓÓÓÓÓÓÔÔÔÔÓÔÔÔÔÔÔÔÔÕÕÕÔÔÔÔÔÓÔÔÔÔÓÓÓÓÔÔÔÔÔÕÔÔÔÔÕÕÔÔÓÓÓÓÒÒÒÒÒÒÒÒÓÓÓÓÔÔÕÕÕÕÖÖÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÒÒÒÒÓÓÓÔÔÔÔÕÕÕÕÔÔÔÔÓÓÓÓÓÓÓÒÒÒÑÑÑ~gabNUjJHIK?<:937677=;>9=:::89:;;88:;;<>:===:<?<=?B@?CDCD>@==<@CDCBDBD>DHIIKL¶×ÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÌÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÎÎÎÏÏÏÐÐÐÐÐÑÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÔÔÔÔÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÔÕÕÕÕÕÔÔÔÓÓÓÓÓÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÒÒÒÑÒi_dSXlHHHK@=78476::?;D<<9<<97:9;::;<::;9>=>9=@;?AAB?BBAC=??><@BECCB@A;FIGMLI²ØÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÕÕÕÖÖËËËËËËËËËËËËËËËËËËËÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÌÌÌÌÌÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÌÍÍÍÎÎÎÎÎÏÏÏÏÐÐÐÐÑÒÒÒÒÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÕÔÔÔÔÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÓÓÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÓÓÓÓÓÒÒÒÔ£l_fRVjGHGIA>366:;<8C<BA><A<89:<::<<<9<=:;<==<?=@?@A?@A@B<>>?<BCCCF@AA=HJINMG®ØÓÔÔÔÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌËËËËËËËËËËËËËËËËÌÌÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÎÍÍÍÍÍÍÍÍÍÍÍÎÎÎÎÎÎÏÏÏÐÐÐÐÑÑÑÒÒÒÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÔÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÔÔÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÒÒÖ®kceRXhLJGIB8494:;:9@9?CE@<<999=:=;<<:=<;9<=;;?=@==>@@?BA>@<=9@DCBAAB><HJKMNH¨ÙÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÌÑÓÓÓÓÓÓÓÓÓÓÓÓÓÎÊËËËÌÌÌÌÌÌÌÌÌÌÍÍÍÍÍÍÎÎÎÍÍÍÍÍÍÏÏÏÏÏÏÏÏÏÏÏÏÐÐÑÑÑÑÑÑÑÑÑÑÑÒÒÑÕÙØØØÙÙÙÚÚÚÛÛÛÛÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÙÙÚÛÛÛÛÛÛÛÚÛÜÛÜÛÙ××××××××ÖÖÖÖÖ×ÚÚÚÚÚÚÚÚÚÚÚÛÜÜ×ÕÕÕÕÕÕÕÕÕÕÕÖÖÖ×ÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÓÓÔÔÔÔÔÕÕÕÕÖÕÕÕÕÕÕÕÔÔÔÔÓÓÓÓÓÓÒÕºkhhRXeIILO@99:4;A<7=9AC>@?=8::;9=;>?:;<<:;<:;>=@=???A@AA?A<<;>ADCAD@=<IIJMNF£ÚÓÔÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÌÍmpppppppppppj§ãÝÝÞÞÞÞÞÞÞÞÞÞÝÒÐÐÐÐÐÐÐÐÐÐÐÐÑȹ¹¹¹¹¹¹¹¹¹¹ºº·¥¤¤¤¤¤¤¤¤¤¤¤¤§`cccccccccddde ¿¼½½½½½½½½½½¾´½æáââââââââãããâØ××ÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÔÔÔÔÔÓÓÓÓÓÕÃqkjNSbLLVN<::77>C>8>:??A<?@7;:;;=;>>:;<><;=;=?>@<??=@@@A>?<><@AEBBF@@?GHJKOFÚÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××ÌÎN&+++++++++++"ôëëêêêêêêêêêëéÕÒÒÒÒÒÒÒÒÒÒÒÒÔÄ©ªªªªªªªªªªª«¦
NJTSSSSSSSSSSSQblkkkkkkkkkkkkiUSSSSSSSSSSSSNz¯ªªªªªªªªªªª¬SRSSSSSSSSSSSKªòëëëëëëëëëëëëéÙ××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÓÔËvliJN_MRUM><<7;@C>6:7=?;=B?9<9=;<:<=;=;=;;=<=>==;A=<A@AA=<?<;@BCADE=A@CFKKOFÜÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××ÍÎR+11111111111'óééééééééêêéêéÕÒÒÒÒÒÒÒÒÒÒÒÒÔŪ«««««««««««¬¨RNYWWWWWWWWWWWVepoooooooooooomYWWWWWWWWWWWWS~°¬««««««««««®XWWWWWWWWWWWWO«ñêêêêêêêêêêêêéÙר×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÑzqiJT]ORUND>?;>@@8:;8<;;<?:;;8;99;<;:<9;;<;:===>=A?>??>=<=?<<AACADE<>@EFJKMFÜÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××ÍÏ\9===========5ðççççççççççççæÕÑÒÒÒÒÒÒÒÒÒÒÒÓÅ®®®®®®®®®®®¯«]"''''''(((((')Zcbababbbbbbbaoxwwwwwwwwwwwwucbbbbbbbbbbbb^
²¯¯¯¯¯¯¯¯¯¯¯±¡babbbbbbbbbbb[¯ïééééééééééééçÙØØØØØ×××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔÔÖ£{qdI[`NNUO@A?=DB?;=:9;:==;<;:9899;<;<<::;<:;@=<=<@A<AA;;<@?<=B?DCCE<>BDFJLLEÜÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÍÍÅÂÃÃÃÃÃÃÃÃÃÃÃÂÉÐÏÏÏÏÏÏÏÏÐÐÐÐÐÏÎÎÎÎÎÎÏÎÎÎÎÏÏÍÌÌÌÌÌÌÌÌÌÌÌÌÌËÉÉÊÊÊÊÊÊÊÊÊÊÊÊÇÂÃÃÄÄÄÄÅÅÅÆÆÆÆËÌËÌËÌÌÍÌÌÌÌÌËÍÎÎÎÎÎÎÎÎÎÎÎÎÎÍÌÌÌÌÌÌÌÌÌÌËËËËÏÓÓÒÒÒÒÒÒÒÒÒÓÓÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÔØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØ××××××××Ö××××××ÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÖÕÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÔÔÔÔÔׯp^F^bPQWNGFCCIA?=;<:<8@B<=8::898;?;<<;;<<<<?;<>:>>8>B<>=A><>B@DEC@<>@>CIIKDÜÕÖÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØØØÎÍÏÐÐÏÏÏÏÏÏÏÐÔÐÐÎÌÍÌÏÓÒÒÎÍÏÒÎÎÎÎÎÎÎÑÔÔÓÎÐÔÒÏÎÐÔÒÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÑÑÑÑÑÑÒÓÓÔÔÔÔÕÕÕÖÖÖÖ×ÖÖÖ×Ö×××××××××ÖÖ××××××Ö×××××Ö××××××××ÖÖÖÖÖÖÕÕÖÕÖÖÖÖÖÖÖÖ×ÖÖØØØØØÙÙÙÙÙÙÙÙÙØ×ØØØØØØØØØÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØ××××רØ×××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÖÕÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÔÔÕÕØ¸oWJ_cRQZKHAA<B==;:>><>?==?79:9978><<>;;<;<;?==>9;;9=>?@>@=;:B?BCB?=>@>BEGJBÜÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØÎÎÎÎÎÎÎÍÍÍÍÎÊÊÍÍÍÍйÇÓÀËÏÎÎÎÎѰÏɨÒÐÆ«ÒÎÎÎÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÐÐÐÐÐÐÐÐÑÑÑÑÒÒÓÓÓÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÕÕÕÕÕÖÖÖÖÕÕÕÕÕÕÕÔÔÔÔÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØ×××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕØÀnUO`cWY[LLC@==;=:<>B>BC@<:898:::7;?>?<<;<:9?<<=89<?A>===A@=;AB@BC>;@?AAIGJAzÛÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙØØÙÙÎÎÎÎÎÎÎÎÎÎÍÒ©ÑÎÎÎ綤¢À¬ÓÎÎÎÏɺ¸¬«°Ð³ÒÎÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÑÑÒÒÒÓÓÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÕÕÕÖÖÖÖÖÖÕÕÕÕÕÕÕÔÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖ×××××ר×××ØØØØØØØÙØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØÙÙØØØÙØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕ×ÈoZSae^]\OJD=@?>;7:>9?D>A98789;;<89?==<=<>;:A;9;9;<C@<;=>@A>=BD?BC==?>?>HIH?uÚÖÖÖ××××××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÎÎÎÎÎÎÎÎÎÎÏȼ¦ÒÐÐÎÊ ~毧ÔÏÏÏÑâÂÅÎÏÎÎÎÎÎÎÎÎÎÏÏÏÏÏÏÏÏÐÐÐÑÑÑÑÑÒÒÒÓÓÓÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÕÕÕÕÕÕÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØÙÙÙÙÙÙÙØØØØØ×××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÖÕÕÕÕÕ×Ís]Xih^_`OIF:A@>?<<:6?B@C:647:;:<:9><>==;?=<A><<:<<=<:<@=@B>>AB=CC==>;?AEKH@pÙÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÏÏÏÏÏÏÎÎÎÎÒ¬¥§©ÕÀ¼ÒÇËÓɪÔÏÏÏÑ¿¨ÐÔ»ÈÆ½ÉÆÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÑÑÒÒÒÒÓÓÓÔÔÔÕÕÕÕÕÕÕÖÖÖÖÖÕÖÖÖÖÖÖÖÕÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÖÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙØØØØ××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÐu[[jia^]SNI<C@A>@>:8FA?C:749::9;;8;=?>>=A=<?@=><<<<<:=@@??=>B@?@B@<@=>AEKG?k×××××××××ØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÏÏÏÏÏÏÏÏÏÐ̬ÐÊŲÍÖªÔÏÏÏѺ¥ÒÑÎÑ ÎÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÑÑÒÒÒÓÓÓÓÔÔÔÔÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××××××ר××ØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØ×××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÖÒr^^kkje]OLG?DCC@:=;<B<>=964:99::97;?@;<=@<<A><=;=<?<:<C@>=;=@>B>@A>@=@?FID?fÕ××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÏÏÏÏÏÏÏÏÏÓ±¢¯É £¿Ê¥§ØªªÔÏÏÏÑÀ ¥¼³ÂÚ£¿ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÔÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÕÕÕÕÕÕÕÖÖÖÕÖÖÖÖÖÖÕÖÖÖÖÖ××××××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÒp`^phfeZQHGBEC@@7::<>:<97659:6:<;7<@@<::=:=?>=<9@<<::9?@>=<=@AC?@?>A;?@FJB?bÒØ××ØØØØØØØØØÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏÐÎlת£ÓÒ®¦µÕªªÔÏÐÐÐÒ¦¯®§ÐÇËÈÒÑÑÐÐÐÑÑÐÐÐÐÐÐÐÐÐÐÐÑÑÒÒÓÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖ×ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×ÖÖ×××ØØØ×××××ØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ÖÖÖÖÖÖ×Òn`\qdgdZUJ@CFCAB8;?<=;<<8558968;:9<:>?<==9<?>=::>9<::8>?<==<>@ACA><<:BDDJFB]ÐÙ××ØØØØØØØØÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÏÏÏÏÏÏÏÏѽ÷ÖÀÓÑÐÒÊÒÍÔª«ÕÑÏÐÐÑÉ×Ä¡ÐÚ¥³ÐÛ¢µÕÑÑÑÑÑÑÑÑÑÑÐÐÑÑÑÑÑÑÑÒÒÓÓÓÔÔÔÕÕÕÕÖÖÖÖ××××××ÖÖÖÖÖÖ××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØØØØØØØÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÙÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØ××××××××××ÖÖ××ÖÖ×××××××××××ÖÖ×Ñl]\oghb]OF@HIGE@<<>><=><756:969;::;8@?:<<9<>=;;:?9?:;9=>==;;=<@CB??>;CFFGHDYÍÚØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÛÛÛÐÐÐÏÏÏÏÏÏÏ~{¥Ô¢ÓÌ£¡Ø««ÕÒ¦ÕÅ § ¨»ÕÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÓÓÔÔÔÕÕÕÕÖÖÖ××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××ØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØ×××××××××××××××××××××××××Ö×ÏdV^pk\``NEHMIIOC>:B==@B;557<:7:;::;9==9::9=>?=;9>;<:<;9><>;<=>@CB?>A<ACGFFEUÉÛØØØÙÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÜÜÜÜÜÜÐÐÐÐÐÐÏÏÏÐÑÕ§É£¨¾Ê±£µÙ©©Ø¸«¡ÉÁ¡¡£¥¦¤¨ ¯§¢©ÐÓÒÒÒÒÒÒÒÒÒÒÑÑÑÒÒÒÓÒÓÓÓÓÔÔÔÕÕÖÖÖÖ××××××××××××××××××××ÖÖÖÖÖÖ×××××××ÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖÖ××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙØØØØØØ××××××××××××××רØ××××××רÍ]WbodO]TKHFSQKL@>=D<?CF=557;96:;:<=:;?::98:==?>;?;>=:;9>;=<=>ADB@?>?<@AEGEDRÅÛØÙÙÙÙÙÙÙÙÙÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÜÐÐÐÐÐÐÐÐÐÐÐÓ¹½ÓÏÔµÓÔ¼»ÔÎ ÓÕ«ªÖºÕ¾ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÔÔÕÕÕÖÖÖ×××××××ØØØØ××××××××××××××ÖÖÖ××××××ÖÖÖÖÖÖÖÖÖÖ×××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÚÙÙÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØ×××××××××ØØØØØØØØØØØ××ÙË~ZUjj[L_MJLJULFB<=?GFHKH=657:979:;:<=9>99:8;=>>A>=9<<:=>>:=99:?EA@>=??B@GEDEPÁÜÙÙÙÙÙÙÙÙÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÜÜÐÐÐÐÐÐÐÐÐÐÐÐÑÁÑÑÊÈÒÐÔĸÒÒÑÒÂÒÐÓÇÌÒÑÔÁ¾ÕÓÓ¹ÇÖÓÓ¸ÈÕÒÒÒÒÒÓÓÓÓÓÓÓÒÒÒÓÓÓÓÔÔÔÔÔÕÕÕÖÖÖ××××××××ØØØØØ×××ר×××××××××××××××××ÖÖÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙØØØØ××××××ØØØØØØØØØØØØØ×ÚÇw\RgiZNZNLPQWEJ??=?AELL@>775;8899:;<><>8::9;>?@=>>:5::;=?:;9:<>BB@????ABGDCDN¼ÝÙÙÙÙÙÙÙÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÐÑÑÐÐÐÐÐÐÐÐÐÐÒÐÐÑÑÐÐÑÓÔÑÑÑÑÓÑÑÑÒÒÑÑÑÔÕÒÒÒÕÔÓÓÓÖÔÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÖÖÖ×××××ØØØØØØØØØØ××רØ××××××××××××××××××ÖÖÖÖÖÖÖÖ××ÖÖÖÖÖÖÖÖÖ×××××ØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÚÚÙÚÚÚÛÚÚÚÚÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØÛÁsXUikSLRNPRYTFI<>C?ABEJ>>786977899;;=?@<=89;;;?><<95:=>;99;<???BBA=A=@ABFBBBKµÞÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÓÓÔÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÖ××××ØØØØØØØØØØØØ××ØØØ×××××××××××××××××××××ÖÖÖ××××ÖÖÖÖÖÖÖÖ×××××ØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØÙÙÙÙÙÙÙÙØØØØØØÜ¼oTTllLKRJTRUKFD:>GDDADF<?89:9599:7<=;>@==79:;9>;9966:=@A>;<9:>?CA>?B=>BCEBABJ°ÞÙÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÖÖÖÖÖÖ××××ØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××ÖÖÖÖÖ×Ö××××ØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØÜ¶kS[pkKUWR\QWHD><BJE=HJ?=<788:59896;><=@<<599<:?;9848<==AA<>;:<>@?=>A==CFGB?BIªßÚÚÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÐÏÔÐÎÏÒÒÓÒÒÒÒÒÒÒÒÒÒÓÓÓÔÔÔÔÔÔÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÖÖÖÖÖ×××××ØØØØØØØØØØØØØØØØØØØØØ××××××××ØØØ××××××××××××××××××××××××ØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙݰdSar_OZTW_QRGB=EILAALD??;:889386869>=>?=:6:;>;==:968:=;@@<@?=??B><><<BEGIB>CI¤àÚÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÒÒÒÒÒÒÒÒÒÒÑÑÑÑÑÑÑÓÓѹ»ÌººÐÈÓÓÒÒÒÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××ØØØØØØØØØØÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÛÛÚÚÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÞª_U`n[UYQZ^OLGCFMIFDDJ;AA;<886486987<?A?=:7<?><??;:688==@A=@>A@=@:;:>=AEGIB@CGáÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓ¾ÀÊ ¢ª©ÏÔÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖ××××××ØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØ××××××××××××××××××ØØØØØØØØØÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÞ¢\U^nX^]NZPTNCCLIIIFJD<BA<;876797799=?A?<:9@?<>B?:8776=??@=@A??<=;;8><?EIHA?CFáÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÓÓÓÓÓÒÒÒÒÒÒÒÒÒÒÔÈ®µ}ÄÕÓÓÓÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖ××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØ×××××××××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÝZXanYaWOWMPEBDLIMKFIE>BD98867975698==A>:89>><?@?<5676<>?>;@@@?>>?>;?>ABFGB@CHâÛÛÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞßßßÔÓÓÓÓÓÓÓÓÓÓÒÒÒÒÓϨ~¬£ÊÔÓÓÓÓÓÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××ØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØ×ØØØØØØØØØØØØØ××××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÚÙÚÜZYcnZZRU^PL<@GNHRIHE>;HF89757875898;>>=;89A>=@?A>7596;>AB??@@BB?>?>A@DAFHB?EJâÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞßßßßßßßÔÔÔÓÓÓÓÓÓÓÓÓÓÓÖµ¥
ÂÖÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖ××××××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØ×××××××××ØØØØØØØØØØÙÙÙÙÙÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛZ[gj\XLZ_VH:LHLJJCEFC@LH7:7678858789<<;;98@?=>??<67<47?BBA@@???A==?@>@@FE==DKâÜÜÜÜÝÝÝÝÝÞÞÞÞÞÞÞÞÞßßßßßßßßßÔÔÔÔÔÔÓÓÓÓÓÓÓÔÅ
}}|y~~¤ÛÖÔÔÔÔÔÔÕÕÕÕÕÕÕÖÖÕÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÙÙÙÙÙÙÙÙÙÙØØÙØØØØØØØØØØØØØØØØØØØØØØØØ××××××ØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÜÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÛÙZ^mhZSI][XJDMHJSLGFA@?JB8;669975868;:;:<98==;@=;:65<7;=B@AA<>=@A=<@??>BDE><DKâÜÝÝÝÝÝÝÞÞÞÞÞÞÞÞßßßßßßßßßßßßÕÕÔÔÔÔÔÔÓÓÓÓÓØ²¨}yv{wy~~®ÀÕÔÔÔÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÚÚÚÚÚÚÚÚÛÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÚÚÚÛÛÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÖy\ZlfXRO`QRAHGJFXLF@@CCK?;;788765768:9<<:=;?=;=><;88<9=?BABC<<?AB>=ABCBDEC@;CL}áÝÝÝÝÝÞÞÞÞÞÞÞßßßßßßßßßßßààààÕÕÕÔÕÔÔÔÔÔÓÔÒ»uy{
rs
¬×ÕÔÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙØØÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÛÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÛÛÛÛÛÝÐr]_peWKPcOKBGCJHKFA<A=HPA::77876787<:8==<>;@?<?=;:;9:9<@B@BC@=A@?=@BCCA@@?@;EMxàÝÝÝÞÞÞßßßßßßßßßßßßàààààààààÕÕÕÕÕÕÕÕÔÕÔ×Èx
|z~sit
ÔÖÕÔÕÖÖÖÖÖÖÖÖÖÖÖ×××××××ØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÞÊj\cqeROX^K?GLIOKE@>AB?IO>9:76;76:;7;:8:<<>;==;><:;89:89ABBA@@;@B=:>ABC?>=>?=FNtßÞÞÞÞÞÞßßßßßßßàààààààààààààáÕÕÕÕÕÕÕÕÕÕÖÎ~|}sqÀÙÚ·´Ð×ÖÖÖÖ××××××××××ØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛßÀcZ[m`VPSSJDLHMHI<>ADCFND<<979:68;97<989<=;9@>:A?<757;8:@AEA?>9=B?;=BBB:>=;=>FNqÞÞÞÞÞßßßßßßßàààààààààààáááááÖÖÖÖÖÖÖÖÕÖØË
x{{yo}ukwtv{xÇÆØÙ××××××××ØØØØØØØØØØØØØØØØÙÙÙÙÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÜÛÛÛÛÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜà·cWYkbRMUQLJKFKFC@>BA?EM>>=899:79:75=77:><;;B<9?=9668=9:@BF@>=<@BD@=@?C;@=<>?FOmÜßÞÞßßßààààààààààààáááááááááÖÖÖÖÖÖÖÖÖ×Õzw}«yxz{st~oq{yzs{v
¤ÍÙØ×××ØØØØØØØØØØØØØØØØØØØÙÙÙÙÚÚÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÜÜÜÛÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜáa[^lbRMVLMGKKDFBB;A=<ELCA>8:9:77966:5;>@;=;?=<?=:99:<9<ECF@?>@CBD=9=?A=B?=@>GOiÛßÞßßßàààààààááááááááááááâââÖÖÖÖÖÖÖÖ×Ð}zv{uszyzª¦wrr~~ÉÌÙ××ØØØØØØØØØØØØØØØØØØÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÙÙÙØØØÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜá¥_TbmbPOSIHGFJIIBA>BB<EED@>8:8;77:7886>?=;<9=<:>=;:67;6:DAF>???>CA?;==>;DC?><HOgÙàßßßàààààááááááááááââââââââÖÖÖÖÖÖרØÈ~vv~~tvxzyuw¡»¡~|¨ÎØØØØØØØØØÙØØØØÙÙØØØØØÙÙÙÙÚÚÚÚÚÚÚÛÛÚÛÛÚÛÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÝÝÝÝÜß[Ogk\PQPICOJKGLGJB@?AGD@A<8<885897677@@?;<9>=8=<<:78=9?DCF>A?B@C?<:>=?>ED?=;KQc×áßàààààáááááááâââââââââââããÖÖÖÖÖ×ÕÁÜ´nxrs{pzyv
{x}¥|~{
½ÝÙØØØØØÙÙÙÙÙÙÙÙÙÙÙÙØÙÙÙÙÙÚÚÚÚÚÚÛÛÛÚÚÛÚÚÚÚÚÚÛÛÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÙÙÙÙÙÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÞXWhnYPQKHJSIMHMIKAC?CFBAD::<864887666?>>:<9<;:==<<8;<;DDDE>?>B>B?8=??CCB@A>;LTcÕáßàààááááááââââââââââââããããÖÖÖÖÖ׬¶zxrow{t{xun~
{
r|}~}ÇÔØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÙY`hl\QKGGOKNNOMDFBH?CHDD@:;;875777858@>@;<9<;<>:9;99;9FDEB<@>?<@C;>@?@?B?>:;JUcÕáààáááááâââââââââââããããããããÖÖ××ÛÊ
wqrnnx{xyvpxswvs}wwuw|ÃÛÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÛÚÛÛÛÛÛÛÛÛÛÛÛÛÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÚÚÚÚÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÒuYhijVNJHMNGMDPIFH?E=FLDC>;;<977966958>>?=;<@;=<:7;7998GDEB=A=B?>@<?AA?@B@>;<KTbÔâàááááââââââââããããããããããããã××××Ä{olnuv~~urmem{s{x{±ÎÚÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßÞÞÞáÉl[jjjSNGGNOEHFMII@;D>HI@=<:::868:77948=<==;8<<<<86789::EBEA?@<B?CC>>CDA@@?@<=KQaÓãàááâââââââããããããããããããããää×××Ù©v
~|wlpwyx|}
wjstwz}n{~yz~~x|~¶ÓÚÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßÞÞã½jaikiQNFMLKJXMNGA@@OAC?@;<89996866684;><=;96::9:958989:BDF?>>>@@@B?<A@?<>?A9>JO^Òãáááâââââãããããããããããããäääää×××ÚÊysomqsuwxv|u
wuru z{wvyvtmln{x»ÜÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßÞã³iinihPPOLLOROKSF?EDDD><<8;87995687673:>;>=7:>99996::87<CEG??;?>@=>A=;=>9A@@8ANQ\ÐäááââââããããããããããããääääääääØØØØÚ¹zvunjoxp}ktrvw
yyyyzuwzsko||v}|²ÞÚÚÚÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÝÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÚÛÛÛÛÛÚÚÚÚÚÚÚÚÚÚÚÛÛÚÛÛÛÛÛÛÛÛÛÛÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÜÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÞÞÞÞÞÞÝÞÞÞÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßàààààààßßßßßâªjkhkdSPOFPTRNHRK>DDCB;;9::86785668784;?<?=9<<7;::7::7:=CBC=A>?<9=>A@;<<;E@>;CNS\Ðäáââââããããããããããääääääääää䨨ØÙÖov{oxxvpntwpptpso~sz
zsmrz}ov|}µÝÚÛÛÛÜÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÚÚÚÚÚÚÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßààààààààààààààßßßâ mhfkfUVRGPQNKLLEBHEG=8=<::778677656748><==:8:8>:;7877::>CD;CB>=8=@AC?><>E<>=BMP_Òãáâââãããããããããääääääääääää䨨ØÜÀvv~zxxpluyrk}lsotghiihxsg~xp{w}~
½ÝÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÜÜÜÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßààààààààààààààààààààßkmfnfSSIPYTLHFNFFEBF=;><;9778579645758<;=>::;;@9;;87:99@BA<AA??9?@BECA@@C;;=DKM`ÖäââââããããããããääääääääääääääÙÙÚÙs{ªrtuv}xhl|whxwnkptyvt|}spxyÈÞÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßàßßßßßßààààààààààààààààààààààáÛnmgscYQMU[WHCIFNKGBD??B:;:66756764876;<;>?:<9<B879:::9:AABABC@A>=?BCCDABF98=DJNbØäâââããããããääääääääääääääääåÙÙÚܨqµx~slznv}khjxv|u}
tfpy}w}z
{}|~´ÞÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÜÜÜÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÜÜÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßÞÞÞÞÞßßßßßßßßßßßààààààààààààààààààààààáààààààààâØ
oqkuaVOUU\ODMF>JGJED<?B:<9868456747649;;<;8>;<A88:=8=8:==@@@?AB?@>@CBCAAE76;DLNcÚäââããããããääääääääääääääääååÛÚÚÝlnsq
rmpnu~krvvzsxxsoupmkv|y
vr±ßÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààáááààáááááááááàâ×
mqov^RWSZZQJHC@Q@BD<9?A:<975745664756=<:==9>:<@8::<6;9;>=BBB;AB@C@@DDC<=@7:<EKMeÜãââãããããäääääääääääääååååååÓÎÆÀ~qlox{vounjssmxnttnotokpntmvr}vqwy¦ßÜÜÜÝÝÝÝÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÝÝÝÝÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞßßÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààáááááááááááááááááâÖnpmq`RYPW_YJLLIR?D=9;BF;:974565754666>=;?>9=9;>8=;:48;@@CBCABFA?C@ABDD;=>9;<BLMdàåããäääããäääääääääääåååååååå¹·µ¨srlpwztwxmqruwtrsllkq|npntkqw}~ysr ÙÝÜÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààááááááááááááááááááááãÕqljl^XZUW`VVPOPL=A:;<FA8:873656965857?=;?>9=8;<9=;;5:=CBB<CCDDDAA?>BCC<=>89<CKKcÍÑÙáÖÈØãäääääääääääåååååååååµµ¶«ryrn}vuwhjhipovmkkgefqtmynmywvxqkjhuuytuÁßÜÝÝÝÝÝÝÝÝÞÞÞÞÝÝÝÝÞÝÝÝÝÝÝÝÝÝÝÞÞÞÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààßßààààààààààààààààààààààààààááááááááááááááááââáááãÕqpciaWSYW_LRORMK@>89;A>87964767:66649>?:<?:?9::7:=<99<AA=;ACECF@>>>AED>@A78>FHJ^²µ¸Á¹µ»Èàåååääåäååçççççæåæææ¶¶µµ}~pzurvgbcelkrofilvmw}
yllwxkvp|}xsuy|wv¹àÝÝÝÝÝÝÝÞÞÞÞÞÞÞÝÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÝÞÞÞÞÞÞÞÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááâââââââââââááãÕun^ncZTSXWKSKJMRGA8;;><98756566968669?<:==;?:;;9<<;9:>>>;<=ADBCA@@A?BC<<=7;>DEJ^±µ´µ¶··¶ËÚÉÞååÝàâÞÕÔÖÓÔàãàßß¶¶·®{nyzrumchllmitxzqyzzzih}qdoq|~y{}|{§ÚÞÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààààààààààààààààáááááááááââââââââââââááãÖvlao_]WY\ZRPHJWLEG=@=;;=9646555867678?;9==<<99<:><:98>B;;>>@D@CEA@@=?@<==59<BGF]±µµ¶¸¹¹¹º½¸ÃÓÒ½ÁÁÀº»¼º»ÄÌſ÷··iu}guyguqkkyxpw|}ymiw{xwniuplyxww}{y ÜÞÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßààààààßßßßßßßßßßàààßßààààààààààààààààààààáàáááááááááááááááááâââââââââââââââáã×
rkgta[XX_^SUUQUJLF?ID;9=6647757877789<<:><8<:=>9;<9;9?A<=?C?A@EBBA<=C@:><549DGGZ±µµ¶·¹¹¹¹¹¹·¹¹¸¸¹¹ºººº¹¹º¹º»··¹npszopysnsulsvxqqpokoq~si}tsumu
rv
§ÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààßßßßàààààààààààààààààààààààáààáááááááááááááááááááááââââââââââââââââáã×qklr[WW]`TQUTPROJC@MA=;9653464687779:>;<>;9<:<<9<=<;==>=CDD@CBA?@><>A<8=:66:BJHX±µ´¶¶¸¹¹¸¸¹¸··¸¸¹ºº¹¹¸¸¸¸ºº»·¸¬{rxqvs~plmzrgolmntp{wwrrwzov||zvy|s}ruÓßÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßàààààààààààààààààßßàààààààààààààààààááááààááááááááááááááááááááááááââââââââââââââââââã×ojqjUVWa[OQRPNWIDDIJ?:9:753495766788:<;<>:<::=<9;<=;==<;=DGDCA<<<<>>@;8<815:AFEV®µµµ¶·¸¸¹¸¸¸¸¸·¸¹ºº¸¸··¸¸¹º»·¹ªrpxw|{{whnqjojcirmsr~xtqljvy}uvukvÕßÝÝÞÞßßßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßàßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßßßßßàààààààßààààààààààààààààààààààààààààààààààààààááááááááááááááááááááááááááááááââââââââââââââââââââãØmlteVP\gXMXSRQYECKPN;9887553956676889>9=>9<99<;6899:<@@=>@F@BB@:><A=?;;;616<BGDP¨¶µµ¶¶¶·¸·¸¸¸¸¸¸¹º¹¸¸·····¹º·¶´rwx}|pzo}shjlggltlqwtqlvsqqwqr|yxv{wi}ÎßÝÞÞÞÛØÙÚÙÛÞßßßÞßàÞßßßÜÛÜÜÝÞÞààßààààßÞÞÞߨÒßÞßßÞÞÞßßÞÞßÞßßÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßßßßßßààßàààààààààààààààààààààààààààààààààààààààààààààààáááááááááááááááááââáâââââââââââââããâããâââããããââââãâä×hgudVUdeWJZYW[T=EMKH=8757643944775679=:=><=<9;<99:>9<>?>AACAEED>;<A><9<;737>DHEJ¡¶µµµµµ¶¶·¸¸¸¸··¸¸¸·¶¶¶¶¶·¸¹¶¶¶}zllzplyvnjhgeqzxoioopusmswgo}ryjprz©àßÝÙËÆ¿¼½¿¾ÂÍÒÐÖÞÙÜà×ÐÍÃÂÃÃÇÕ×ÓÙÜ×ÔØ×ÐÇÄÅǽ¼ÏÊÏÎØÝØÎÜÝÜÚÝÓÑÜÞßßÞßÞÞÞÞÞàßßßßßßßßßßßßßßßßßààààààààààààààààààààààààààààààààààààààààààààààààààààáááâââââââßâãâáâàáÞÖÛßÒÃÊÉÇÑÛÜâäááàÙÚÞÖÆÄÅÄÍÚÚßäáââÚ×ÞË}ifqaY^eaMLTKRZL;HMHFA=766534664876569<;>>:>99<979;;:>=<@@CDBGFBA=<C@=9<;777?DFFF¶´µµµ¶¶¶¸¸¸¸¸¸·¸¸·³µ¶·¶··¸¹µ¶·¢qoopintvqfeckngormfgkreov|xdsshqrieeno°ßÑÅ¿»¹¹¹¹¹ººº»º½ÍÆÃÇ¿ºººº»»»Á½Á޼¿¾¼»ºº¹¹ºº¹¹ºÃÅùÀÃÁ¼¿¹·¿ÏÏÔÞØÜÞßàÞÒÚàßßàààßßßßßßßßßßààààààààààààààààààààààààààààááààààààààààááááâââáàáââââáÚÚÝÑÂûÅÓÖàÝÉÓî¹À±ª«««°´¶ÉÒÅÑı¸¿´«««¬¯´´¼ÌÄÕδ´»«xlmm`]b_YKSUTQPD@QMHD?:78573156498466:<;=<8<96::88975<<<?@A@BDCBA<>B??===758>CEC@¶´´µµ·¸¸¸¸¸¸¹¹¸·µ±«¯³±³³³´´´¶¦kn{vqyxgch_qwaknoho}onckilxwlk~lpzvmlpoy±Æ¼º»»º¹¹¹ºººººººººººººººº»»º»»¼»ººº¹º»»ºººººººº¹¸··¸¸··¶µµµµ¸·»Ç¾ÃÅÇÍĸÀÉÇÒÜÙÙßÞÞàßßßßààáààààààààààààààààààààààààààáÜØââââáááàáàÞׯÆÑÐÎÔÞÞÓÎÒßÒ¸¸¼²¬¬¬®±¾¹®·¬¨©©©ª«««ªªª«¬¬¸¬ªªª««««®®®®®®¼³¬«¤ynom_^]]TMRS\TJA?PIH>89683730573785766:<?<89;:::89:659;<>?D?CEBCB?@@A?@><787:AED?
¸´´µµ·¸¸¹¹¸¸··´®¬«ªª®®®¯°±³³µ£pnnrmp}uiaehfdcdqsmmwngimmepsoosqs|zu}u»ºº»»ºº¹¹¹ººººººº¹ºººº¹¸¹¹¹¹ºººº»º¹¹¹¹¹ºº¹¹º¹¹¸¸¸···¸¸···¶¶µµ¶¶¶µµµµµ¶µ····ºÁ¾¼ÆÉÊÛßààÞÛÝÝÞáâÐÖâáààààààààààààààáààáâÓ¾¼ÌØÝÜâàÑÙÛĽ·°°±±¯³»»³°´½³®®®¬«ªªª©©¨©©©©©ª««ªªª©©¨©©©©©©©ªªª¬®®®®®®®®¬¤xibqfaYZVQRN\SF=BRDA7<;6956545658756578;><;999:8779768<;>;D??C@ADA>?C=><>::77?CF>x²°³´µ¶·¸·¶²®®¬««ª©ª¬¬®¯±³´µ·nrtjhyfjfel]hnphlqbcfr~vhhljnz
|xqqy¯º¹ººº¹¹¸¹¹¹¹¹¹¹¹¹¹¹¹¹¸¸·····¸¹¹¹¹¹¸···¸¹¹¸¸¸¸··¶¶¶·····¶¶¶¶µ´´µµµµ¶¶µµ¶········¶·¸¿ÆÏÐľ¿ÀÄ××¼ÉÚÚàáàààááààààááàÛÞÞÔͼ·¶·ºÀÀÉķȾ²°°°°¯°¯®®®¯°°¯®®®®®¬¬«««ª©©©©©©©©©©¨©©¨©©©©©¨©©¨©©ªª«¬®¯®¬¡yjdmgb\XQPQKTJB:IQ?A7<94:565455688686;:9<==;:86688:867>===>AAEBBCAA@A:==?=9:7=AG<lª¦¨«°±°®«©¨ª««©©©©«¬¬®°³´µ¸¥oigstfkpmjdlornkmckp|njl|xc{~sjsnkq»¹¹¹¹¹¹¹¸¸¹¹¹¹¹¹¹º¹¸¸········¸¹¹¸¸¸·¶¶¶·····¶¶·¶¶¶¶·¶¶¶µµµµ¶µ´´´µµµ¶¶¶¶¶·····¸¸¸·¶·¶¶¸¹¸¸··¸¾¾¸º½½ÇÛàáàØÙÝááàÝ×ÊÁú¹¹¸·¸¸¸·µ´´´²²±±±°°¯¯¯¯¯¯¯¯¯¯¯®®¬¬¬««¬ªª©¨¨©©¦§©©§¡¥¨©©©¨¢¡¡¢§¨§©«¬¬®¯°°®®xpljac`YQMQLRFC9MPE>8;727967443578797;::==<::974:98658??@B=DCCCAC@BA@;@?@?<<:;CH=c¨¥¥¥¦¨¨¨§§§¨©ª©¨¨¨©ªª¬®°°°³´µµµ¥v~qfkxqomfelhclgfii}umio}vy
fhwoxoqorx§»¹¹¹¹¹¹¹¸¸¹º¹¹¹¹¹¹¹¸··µµµ¶¶¶······¶¶µµ¶¶·¶µµµ¶¶···¶µ´´´´´´´µ´´´´µµµ¶¶¶¶¶·······¶¶¶·¶¶··¸·¶·¸¸·¸¸¸¸¸ÀÅÓʼ¼ÃÍÏÈÀ½º¹¹¹ºº¹¸¸¸¸¸·µ´´´³³²²²±°¯¯¯¯®®®¯¯¯¯®¬¬¬««¬¬¬«§¡ ¡¡¤¤¦¨ ¤ª®¯®¬¬upikca^]UNSKRDD8NKGA:85269654737778979:;==>88875:9958?@@AD>FABC@BCBA?<@BB@=>::DF>\¦¥¦¦¦¦¦¦§¨§§¨¨¨¨§§©««¬¬´´´µ·¤s}unsrfjqcimchfhlnui_cgusvzngppr~zq¡»¹¹¹¹ººººº¹¶³¶µ¸¹¶¶µµ¶¶µµµµµµ·¶¶·¶¶¶µµ¶µµµµ´´´¶¶···µ´´³³´´µµ´´´µµµ¶¶¶¶¶¶···¸··¶¶¶¶µ¶µµ¶¶¶¶¶¶¶¶¶·¶¶·¸¸·º¸¸¸¸·¸¸¹¹¹¹ºººº¹¸····µµ´´´³³²²²±±°°¯®®®®®®¯¯¬¬«©¥¤¦¦¤ ¤¥¤££¢¢¢tncpa^^[TSTHTJ?<QBFC;8637:554838997897;9;=;7:75699858>??@E>B??C?<AAB?=?DA?>=9=CF?U¤¥¦¦§¨§¨©©¨§¨¨¨¨¨¨¨ª¬«ª©¨©«µµµ¶¹£wqrwtphykbcaelinsj_ceccejkbdjlv~¨½¹·¶·¹»»º¸µ±¬««ª®°¬¬««««¯°±¯¯°²µµ¶·µµ¶µµµµµµµ¶¶´¯¯³´´´¯®¯²µ´µµµµµ¶·············³°²¶µ´¶¶¶··¶¶¶µµµ¶¶···¹¸¸¸···¸¸¸¹ºººº¹¸¸···µµ´´´´´´´´³³²±°¯¯¯¯¯®¯¯¨£¢ ¡¡ tnit]`f^RTKDTI=ESHEB;:4469445738887899:;;?=8:93589639=>@?@:@BBB@?@BB?=>AAB?=:>EC@Q£¦¥¥§¨§©«ª¨¦¨¨¨©§¨¨¨¨§§¨¨©ªµµ···²´}ugijlfc`cheoxpibq|ypjffdfksj
¬¶²°´·²°°¬«ª©¨¨§¨©©©©¨¨§¨¨©©§¨ª««¬ª¬¬¬®®«§¥¤§ª¬¨¤£¤¥©°±±³µµ¶·¸··µµ¶·¸····²©¥¦¬«¨¯´¶µ³µ··¶µµµ¶¶¶·····¶¶····¹ººº¹¸¸··µ±³´´´²±°®¬«¬®®°±°«ª©ª¨¨£ ¡¡¢¢¢ ¡ ujknY\aVKODGUG>OWHD=<834484548289889::<99@<69:367914<??@@A:CFEBADBCA:;?ABC?@=@DC@O£§¦¥§¦¨ªªª¦¤¦§§¨¨¨¨¨¦¦¦¨««µ¶···¸²up{v`bikbefadgf}ylr}qoqxcmnqf¬¬«««¬¬®®¬¬¬ª§¥¦¥¥¥¦¨¨¨¨¨¥§¨¨¨¨¨§¨©©©§¥¤£¢¢¢£¢ ¢¢¡¢¡ ¡¡¢£¤££¥¥¥¨°´³³³°«ª©ª³´¶·¶±¨¥£¢¡¡¢¤¨ª©¨«³´±®®±³µ¶¶¶·¸¸········¶¶¸·´±®©¦§«¬©§¦¥¤¤¤¤¤¥¨©¦£ ¡ ¡££¢
tklhWXSJGMEHMG@SWFG==93637455738::::9<=::A<6=8378837;@??@@:BEC@BDCA?;<@CBCA@<AC@=N¢§¦¦§§©ª«©¤¥¥¥¥¦¨¨¨©¦¦§¨©©ªµ¶¶···¸³sh{sbgjkiibadih]]m|rfkr|t|nmss~ ©©«««ª«¬«¬«©©¨¥£¤¦¦¦¥¦§§ª©¦¦§§§¨¨§§¨¨§¥£¤¢¡¡¡¡ ¡¡£¥¤££¤¤¤¦§§§¦¥¤¥¦¦¦§ª«¦¤¢¡¡ ¡¤¥¥¥§§¥§¨¨¦¥¥¨¯´¶·¶µµ¶¶µµ³°¬«©©®«¨¥¥¦¦¦¥¤¤¥¥¥¦¥¤¤¤¤¥¢¡¡¡ ¡¡¢ sknd^SJHMFDLKEDQSCG=<8362846464898:;9;><9=;9=7359656<@=?@?<?BC>BBB?=>>BCAE@?:>E@;O£¦¥¤¦§¨©§¥¤¥¥¤¥§§§¨¨¦§§¦¥¦¦µµ¶¶¶µ¶¹mqmo||qgjf`al`TN[hjnom}qgqv~¨§¨ª©©ª««¬ªªª¨¦¥¥¤¢£¥¦¦¥¥¥¦©ª©¦¥£¤¥¦¦¤££¢¢¢¢ ¢¡¢££¢¡¢¢¤¥¤¢¢££¤¤£¤¤¤£¡ ¡¢¤¦§§¨©©§¥¥¤¢¤¤¥¨°°¬«ª«¬ª©§¥¥¦¥¥¥¥¦¥¦¨¨©¨¥¥¥¤¤¤¥¤££¤£¢¡¡¡¢¢ ¡ ~znrb^SMJPEFNMB@OE>I;=5363836675:;89;9:>=;:9:>7669656>B>>A?=>CA>CC@@;@@BBBE@>;>E?<P ¤£¤£££¤¤¢¤¥¥¤¥¦¦¦§§¦¦¦¥¦¦¥´µµµ´´µ¸h|}eszlpua_cTNOQ[hlillqmnqnt¢¤§¨¨¨©«ªªªª©§¦¥¤££££¤¤¥¦¦¥§¬©¤¡£¤¡ ¡ ¡£¢ ¡£¤¤£¢¤¥¥¥¤¢ £¤¤¤¦©©¨§¥¡£¥¨©©¨§¨¨¨©§¦¥¥¤¤¤¥¦¦¦¦¦¦¦§§¥¥¤££££¢¢¢¡¡¢¢¡¢£¤¢~qt`[TMGMHFLJ??NC<@;<4383747678;=8::99;=;;89=7789588?@=?A>;=D?=D@??:@AA?AE@><<C?<N¢¡¢¢ ¢¥¤¤¤¥¥¦§§§§¦¦¦¦¥¦¦¥µµµ´´´´·v¥±wfsroslcdiXORQOO]md`Zm¢¢£¥¦¦¦§§¨¨¨§¦¥¥¤£¢¡¡¡¢£¥§¦¦§¬¬§¦ ¡¡ ¡ ¡ ¢£¤££¦§¨§¨¥¢ ¡¡¡¡¤¥¥¥¤ £¦¦¦¦¦¦§¦§¦¥£¥¤¥¥¦¨¨§§§¥¥¥¥¥¤¤£££¢¡¢¢¢¢¢¡¡¢££¢ wos]ZNHJNGEFIDEN@<==<45;46465679;899899<;<7:;7888588?B?AA<>?@<<B@A>=A>??=BA@::@<<O¢¡ £¤¤¤¥¦§¨¨§§§¦¦¦¦¦¦¥µ´´´´´´µ´¶§ufxvclccec[RSSRM^ xXhv£¡¡£££££¤¤¥¦¦¥¤¤¢¡¡¤£££¢£¥¦¥¦¦§§¦¢ ¢£££¢¤¤¥¢¡¡¡¢£¥¦¦¥¤£¡ ¡¡ ¤££¤¥¦§¦¥¥££¤¤¤¤¥§§¦¦¦¦¦¥¥¦¤£££¤£¢¢£¤¡ ¡¡ ¡ ¡ }tlt^ZOHEGFBENE?F;:>?;46:69364688:89788:<;<9;;::67899>?@><=@>@:9@A?=A??AA>AA?:9=>:P ¢£¥¥¥¥§¨¨§¦¦¦¦§¦¦§´´´´³²²±°°«x~wb]SRQQLb ¢Z ¡¡ ¤§§¦¥¤¢¡£§¦¥¥¢¢¥¦¦¥¦§¦¦ ¡ ¡¡¢¢¤¦¦¢ ¡£¤£¢¡ ¡¡¢¢¢¢¤¥¥¦¤¤¤¤¢¢¢¢¤¥¥¥¥¥¥¥¦¥¥£¤£¢¢¢¡ ¡ |rgq^]PF?AD?JOBBF8CE>>98;7748459::;979:<;:<=><<:67698>?A>;?>=<8:>A@AB??AB@DA>:8>A<S¡¢£¢£¢¤¦§¦¥¥¦¦¦¤££²²°«§¦¦§¦¥¦¨¥¨¨§ª§¡y\QROL\ b ¡¦¦¦¦¤£¢¢¦§§¦£¥¦¦¥¥¦§¦¦¢¡¡¡ ¢£¤£¢ ¢¢¢¢¢¢¡¢£¥¥¤£¢£¤¢¡¡¡¢£¤¤¤¤£¤¤¤¤¢¢¢¡¢¡ zjfj`bNF>?@=JE@C@;@A<:;9:765846789=88;:;?;:;<:9:7768;;;=<::<=<7;>CBDC?=AC@DA?<:@B;W¢¢¡¢¤¥¤¤¥¦¤¢ ¨§¦¥¦¥¥¥§¦§¦¦¦¦¤¥¦§¨§¡©rNQMJT¡zr¢¢¡¢£¤¤££¥¦¥¥¦§¦¤¥¦¦¥¥£ ¡¡¡¡ ¡¢ ¡¡¢¢¢££¡¡ ¡¢¢£¤¤£¢¡¤¥¤£¤£¤£¢¢¢¢¢¡ ¡xlcdbdQGA=C;KHD:;;<>9::9:73795:888<98;9==;:;:9<<7647?<:=;<?><;8<ACACBB>?B@BA@:?@?;Y ¡¡¡¡¡¢¢¢¢¢¡¤¥¦¦§§¥¥¦§¦¦¦¥¤¤¦¥¤¤¤¥¦PRPOOpz £¤¢¡¡¢¢¢£¤¤¥¦¥¤££¡¡¡¡¡ ¡ ¡ ¢£¢£¡ ¢§¨¤¡ ¢££¢¢¢ wdghdbMCE<D9IJE9:;==::88:64795<968979<;;<::<;:<<8787>=;>>:B?:::?ADBCAA@?DAA@>:@>=:[ ¡¢¢ ¥¤¥¦§¦¥¥¦¦¤¢¢¢££¤£¢££¢§TXURNgmk ¡ ¡¢££££££¢¡ ¡¡ ¢¡ ¢ ¡£¢ ¢§§¥¡ ¡¡¢¡ rflbd[DBL=?8FKB<@>>=9;9:=85886;856:8<<;;<<;9<:==9587<9<?<:A?:::@@CBDAC@?CA@>=<@==:_¡¡¡ ¥¤¤¤££¢¢££¡¡¡¢¤£¢£¤¢§W^]TW_nk ¡¡¡ ¡ ¡¢¡¡¢¡¢¡ ¡¦¦¥ ¡¡ ooe^`W@JH8?7IE?EA<=;::;;;75;86;746::>;:=>>=;;;>;:8:996@A=:<=:;9?ACBDEC>?AA??>>?=<;`¡¡ ¡¢¢ ¥¥£¤¤¢ ¡¢££££¤¡°£]ed`ank¢¤¡ ¡¡¢¢¡ ¡¡ ¡¢¥£}nm_eVTEK<7>7REC>BA8;<;98:86;77:679:=>:<<=>=<=:?=:8<=9;@>>?=>99;?BC@CEC=?CB>@@>@=<<a ¡ ¥¥¤£¢ «cimnifm £¤ ¡ ¡¡ ¢£¤¢ xvg]_WTEE99;<Y>@8B?9;;>98;8:;79:589;=<9=;=><=>;??;9><<>?>@AA=87;BCE?AEC=@DBA@D;;>;<b¤¤¤¤ ¦ektxm[
¢ ¢¢¡¡ ¡¡ ¡¢¢¡¡xv_[]^Q=F:98?UCA;CC:<>?::97;8887489<;<8;;<=:=>:?A=:=<>>@@=@A>96<DCE@AEE=>EDD?B;:<9:d££¤£ ¥kqvzoe ¡¡¡ ¡¢¡ }xjabb\P<@<68CVHDB:8;:>;7796=:99647:;<=9::;?;==<@>;;>:=?=>@A?@<7;ACE??DD>?DDC>B=;<;:g££¢ ¤jjoysq £¥¢¡¢¢¡¡ ¢¡¡¡
wqgjd[\QA>86BG`BEG@>;<;:8865<8:834:69==99:<=;<:<><:>@:>@><?@?><8:CAD?>BD?>CEB=B@<<<:g¤¢ ¨}ges{zs¢¢£¡ ¡¡ ¢¨ª¦¥¥¬£¦¡§§²¨¢£ pqil\[\MF<77GGX>HNTF9>:89875=9873396:><:7:<;::::<<;?>;@@>;=>A<<67@>B@>AF><ADA=CB>=<9f¢¡¬jmzyq¡ ¡ ¤¢¤©£©½ÁÁº¼¸½º¹À¼¹º·º»»´½³ÁµnufgZ^YLIE:;LIS<VRIC:A:;;775:::82568;=<99;;<:7:8:<:=?9<?><<=A;958<;@?A?D=<AB@<DC===:a ©
pu{wo¡ ¡
¤¦¦ª«±¬¯¯«¦«ª±¹¹µ´´®¬¯´ÀÈÅÅÁ¾ÆÃÄÄúµ¾·¶´³°¶µ¾ªptr\f_]]IF??EKLVI\LD?=B:C9977;9971798:>88:<<;979:;=:>?9>A<;><>:969<:A>CAA=<B@@>BD>?>9\
ªzuv{y ¡¡}
£ª¡¢¤¢«±·´¹µ±³¯²²¥§³º±ºº¼¶·¶ÀÃý½¼¶¿ºº¼Áµ¸À¾´¯®¦©¯·n|g[cZ]_HE>AKISXY^AF99=9F??:7;;;63:7:9>8::<=998;9;<:>=;@@;<B<@:847<;B?AB>>;CDD@CC=>>9a
y}{
kxvwsq}r ¡
¡§ ¤£ª©³¶±µ°¨©¢¨®ª¯°µ¹¸¼Â¿Áĸ±µ°®¶³°¸¾¼º¼¾º³³§±·Âucb^ZWRMHFEPIYW_[CP:BC=GF?87::75597<9<98:=>::7;;>;;=;=?A;?><?:8537:AA@B>>:CDC?AC;=>9g©¥¢¢ ¢¦u{{v{zyz~}|z~
}s|}|~tpxvs|v
| ¥¢¯±©®¤¤¤¦¦¸·¬¬»½½ÂÃÀ¿¿¯¥°°´·¸³´¸¶´µ®¬´¯¸´¶yzcf`^VPQAEKOI\^_TGGBKLBD@=88;957797;7=<9=>=9;8:;@<:=:>BA8?<:?86429;B@?B>=8AB?>@D;@>7`¥ ¡¡ £¡rqpovqnpmnpvnoophpqpt~sqrqw{ryvwrrwvz{y|}{
}§¤¥«¦ª·µ¸²±§¯ª§¦¡¢¦©«§££ª°¦¦«¡´½¾³³¿¹»»º¹¼½®¨®±®°¸¼³´±±ª°©¨±±²¨¥wrt_ha`TVQIJHVM^^^TLJEQJEGC=:9974868388=:=<>;9;8:;?<<>9?C?8;:8<776379E>?C?=7@@A=?D<>=8T xqnmrxqqlnrpkqopmrs{uvwy~uqxvtw{rn|}yx}y
}s}~
z}}¡§¦ ¦°«¡£¥µ´²ª¦ª¯¢±¶¹½Â»¹Ã¾¼¸½¸µ±¬°¬¥ £ª¬¡¡§ª°©¦¦¤£¤¢¬¤¬³´³³¨·¶»¸°²¯²·¶º²µº³·¹»¸¼º¶²¯¬±±²³´³±±®³±³³¬¡vqs_c^RQTMOIGXOZ\dTNGUOEDJD>8:875888597::=<?:8<899=;==:B>?8;:9:986257B>?D@@6>?B?<C<=>:N|¡rorqqqqqpnsqoutrqvwuw|y
~w{|y}|}z
z||}~x
¢±©¤¥¯¬¬¬µ®¾¹®©µ°·±«±¶¬¯½ÂÂÀ¾º¼¶²®¶¶±´®º»³®¬§©§«§¢© ©¨¢¯°¸´±¼ººº²´µ¯¼´·³··»·¹°©¬µ¹±·²´·¶°»»¼»ºº¼µ¼¸´Áµ¬ªª«´±·¸¹µ¶´³°¬¦®°ª«°±«¬®°²±´®ª£xvreg[LRPFMHSWRe^gTPL\QHLRCA997958866;79:<:>98;:::<<>=<D>96;;88>95156BFDD?@7>>C>:A?@@;K|tuvuyustnvrstuvw}}~z|~}
~}}¨®²¯¯µ´³²µ¸°¼µµ±ª°ª³µ´»·´³¶´µ¯¸¸·§¢¦¬°°¯¶··¾µ¹¼³²±®µ»°´¯¯²»¶±¸À½´´´³¸³¼º¶´ºÀ½¹º¹º¾¹¹¹¾µ²±¯²¯ªµ´±³±´³®¸¸µ¿¯¤¦¨£«¬±¯³®®°°¬«ª«¢¢¦¨¢§«ª¥¬§¢§xyqfeYOOMIRMWLO_^\NUTbQDTM;?9<895775795:::9;8:<<:=<>>??B=86::9:@;5266AFCC>?7>=CB9?B?>;K¢}zxvttst~wzwv
£ ¤£¤¬´¹º¼¯¶´¸´´²·¸¹³«¯ª¨¬µ²²µ®±«®¦·³³±¥¡¨µ°¯¬«µº²»ºº´²·º¾»¹±¸°¹¨²¸»®´´·µ»¶¶¹¹¼·´¯±´·¶¹³·µ¦©«¨¨¯¬©®®§¢±´±´«¦¨§ £«®¨ª®¨¬²°¯¯©¨¡¡¡£¦£ ¢¥£¨rwngbUKTOOJCPK_bXZQ\S_LHQIA@9:866775894;9;9<7;>:8<<=?B@A=;6999:?;6378>FBB@B9>=@C>@FB>8Gyrsu{
£¡§ª©¢¢¡¥¨¬¯©§ª©¨§¡¥¨¨«©©¯¡¡££ ¡¤¤§¤©«®¬¥£¨«¯±´®ª¬®³¯¬¬´³´¹®®¬ª¬²°°°¨ª¦²´´¸®ª¶º°¯ª®¬°·³¸´·µ´»¼¸µµ±µ«²¬¨²³»¯±²´¶µ±±´³³¯¬«¯³¶´±¬®´ªª¦¥§«¨¨«©ª¨©³°ª§©¥£¢£°©¦¥¨«¬©¥¤¢ ¥¢¥£¢¢¦nuegdVOXKKJKSTpbYdW_[\RZPLC<89:698747748:<:<8:=97<<;>C?A>;9:9:;>=8458ADEDBC9>;@>B?GD>7B¢£¡¡£¤§¥¥¦©©«©¢¦¤¨¥¤¡££¬¨«®®ªª«¤¡¢¥©§§©¨£¢¤ ¥¨£ ¡¢©§ ¢¢®¬«ª§®¨¥¤©©©©¦£¨ª©§¤§®°¯³¯«°«ª¯²¯°³¹¯«¨°±®°²¹³´¯¯µ°¬³±®¬µµ´´³³°¯¬¬ª¬«¬¯±´³°°®°°°¬ª«ª«¦¥®°²°«¦©°¯©£¤©«§¨¦¨¦«°«©¯©¦¨©¦¥£¨°ª©¨¢©£¥§¤¡¡ ¢¥¡ ¤©ns^ji_UZNRNPORd\dc[\Y\PYOK@<;9:7:8735338:=9:89:9:=<<@D>@=9:<<<>;>95:<BAEACA9>;?@D@CB@7@
¢¢¤¡ ¡ ¦¡ ££¢¥¨©«©ª¦£¦¥ ¥ ¦¨¦¥§¨¦©¨£§¦¤¥¢¡ ¡¡ ¡¤¤¢ ¢¢ ¡ ¢¨ ¡¥¡ ¦£¢¤¡¬¦¡¡¤¬ª§¬¨¯«§´±®®¯µ²¬ª°«©µ°®®¬®·®§¬ª¤¨¯²¯¬«²¯ªª©««©®®®±±ª©«§§«¨©«¢¦©¨¨¥¨¨¬¨¨¥¤¥¨§¨¨¦©¬¯¯¨«©¡¢¢¥££©«¬¦¨¥£¨¢¡ ¤¡¡£ªosfnrd]]PUOWO^ddlgbaZZRTOMA:=::8;95163288;9999;99<;=?C>@=9;:;<@=><99<AAEAFA:=;?AABAEB8= ¥¢¥¢£¡¡£¨§« £ ¡££¥£¢¢¤¬¨¥© ¦©§«©¤¢ ¢¦¡¦¦¦¡ ¡¤¡ ¡ ££¢¢¤¡¡¢ ¡¤ §£ª±¨®«¬©¤ªª«¨¬¦¥¬ª°³¯««©°«¦©¥¥¨«¬§¦§¯«¥§««©«¨«ªª«¨¥¨£¦¥§¬©¬¨¢¤¡£¦£ª©¨¦§£¤§¨¦§¨§©¨«©¡¢¨£¦¥£¨¨§£¥¥¦© ¤¢¢¢¥ £uwkvwa_\UYQUV[c^r`h_cSQXTH><=8;9:85373347:89=9;:9<<A@C==>8;<=<@?C?:8:>?C@DA:;><@?CCEC9<¡¤©¥©§¨¬¦¢¢¤¦£¤±®²§¦¬£§ £¢¯«ª¬¨¨«°©¨©¨¡ §©°²¯¬£¢¦¡©¥¤£¢¦ ¥¤¢¥£ ¥¢¢¢¤¡ ¡£¨¢¨¡¡£¦¢¤¨©ª¨«°±¨¥¥§§¨¤¥©©ª§¢¥¦¨¦¥¥¢ ¥¥£¥¦ £¥££¥§¥©©ª¤§¤¦¢¦§¤«©§§¤¡¥¨¬§¦¥¥££¨¤£ £©§¨¦¡££©¨ ¨¢ ¡¦¢ |wo}yf[[_^Z\V\hdocmihb^PP@?;:898<;634333799;<9;;9>=B@@=;=8<=@=<<CA>:8=?D?C>:9?<B??ADB9:¤§¢ £¥§ª®¬³²³´¸·©ª§¯´²±ª®®±²®±¥«³¬±±©«¯««¬¶°´°«±²±£¢ª©§®·¶´´¶³¯¬«®«¶°©²±®§¦¢££¢¨¥¡£¡¤¢§ £ ¢¥ ¤§ª©¨ª¬¥©¤¥©§ª©ª¬§¤¤¤£¢¡¡ ¥¥¤¦¤ª¨¢§¥¥¡ª§©§§§£¨¥¦¥¡¤¨§¬¢§¤¡¦¥¥££§¥¥¤¥£¢ª£¡¡wrvxib[_^\bY`dnmkma_d`POA@<;9;8:9614364777:=:<;9==B?>?=<:?9:;<>BE@=9;@A>C<;9?9@@@@BC;9{££ ¢¢¢ ´´®µ¸³´¸¶·´¸¹·µ¹¸¹½¼¸ª²¸¼´½ºµ»º»¸³º¿¸·¹»±·¯¨®²¢ª²¸¼¼½»º¿´¯±³µ´··¯µ´µ²°¨¤¢ ¤ª¦¦¡¤£¤«¥¥¡¤£ ¡¢¨¡£ ¥¡£¥¡¨©©¨«¯¯®©¨©«¬¬«¨«§¥£ £££ ¢¥©¦¢§¤©¡£¢¢ ¥¦§¦¤¨ ¢¤¡£¢¨¨§£¥ ¡¨¦¦¥£¡¤¢ ¡¥ vxyxc[RYT__alhukpgiibYSL@<:;89797556285678:<;;;;@>?@=>>9:<967>;BFB<8;?CCD<>9>7>AB?FC;8p¢¦£¢¡¾·±¸¹¶··¸»¶½»½½Àŵ¢» ·¿¿ºÁÉ´»¶²¶¿ÅÁ¨ ¶³º±ª®´±°±´´¶¼¼¾¼¼½Æº¸·º½´¯µ±±º¸·²³²ª¦¦¤¤§¨¤®¤««µµ®³ §ª¬§ª©¥¦ § ¡¦¡¢¤£¡ ¡¤ ¦ªªª®°±«¬¬©©«®¨¦¥¦¥¦¤¤¦¦£§©¤¡ ¢£¦ ¢££¤¢¥ ¤¡£¡¡¥¤¥©£¤¥¢¤§§¡ |xa]YSah`fsositcidb[LK>:8898897345254669<<;=<?A?@@=>>89;867?9BEC<;<>CDC=@;=7=CC@EB<7g¢§«¦¡¾µ³´»º¹¸¹Â·«¸»ÀÂų£Ã§¸³½¿´Äǽ´»¸¾¶ÀÄÄ® °¢µ¶µ½¾ÁÃÆÃù½¿ÀÀ½¿Ä½¼º½¾´§ª±À½¸µ¹À³¯¯ªª¨§§¤¯§ª´¼±´µ¨¯±°¯¬ª¢¦£¬¦«¨¥¥ «°°¬¢« ¨¯²²³«¨®·µ²©¦¥¨«¥¥¤©¤¡ §¦¨©¦¡¥¦©£¢¦¡ ¨£¡¥¢ £¢¡}
p`a^^jbbnwuvnl[bQU\MG;<97979:7444143768<;;<<@@=@?>?>::9:7:?>EEE<==@BBBAB;<8@CC@D?;5_
¦§¥¹±¶³¹¼¼¹ºµª²¼±¾Á´¼Ç¹¸»®¿§ÆÃ¿ÊÆÉÈÅÅɼÂÇÇ¿±±§¼¼¾ÅÄÆÉÇÅÆ»ÄÀÅÆÀ¹¯½¼À¾¾³«ª³»¾´µ·Âº¯°µª«¦ª£¤§±¶«µ²³¨®¯§¦°¯²ª¯³¤«µ©§¨¤ ©²¸¾µµµª©¦®²·¸·¶©«¸¼¹·±¯®§¢£¨§¤¨£ ¡¢¤§§¡ ¡¥ ¡£¡¢¡¤|jfhaklfnuqruqf^_\RIE?:::7848<7654233657<:;<;=@>?@><=999;:<<>BDE>>=@CCCDD::8ABBAC@92[¶±¹µµ¾¾¶¸µ¸³¼¼ÄĺÃÇÁ¿´³ÅÅÆ¿ÂÍÇËÎËËÇÁÃÆÇÈÊÅÄÅû¼¼ÁÅÁÅÅ¿ÃÂÆÅÀ±¾º¿Ã¶¶º©´³´©«³»»±±¯¬¤¬®´§ª©¨ª¬©¥¥©¯«²»º¸»·¹·³¹¸³®¬³´ª°µ¹½Áº¾¾¼¾´º¹¸»º²±´¼»º»³³²§¤¦««¢¡ ¢£¡~z|tklncolhqwnyiia\gaQFDA<997644:8465332656=99;;=>;>>=;=99;;;?=ACABA@<@CCCEB;89D??@B?;2W
³·¸¸¸¾»°µ²¸¶µ¶ÀÃÁ¾ÃÂÀ¾»¾»»¼ÄÌÄÌÐÊÆÆÀÅÇËÈÔËÊÈÆ¿»»¾Ä¾ÅÈÆÆÃÄø´À·´¼Á¹··¿À»®¥®·¼·£·°¦´µ¬®¥¥£¨¤ ¥ª³²¾Á¾º¹º¸µ´²±´´³ºÀ¾À¿¾½»»½¾À·¶·¶»»²»¾¹¸¸»¶·´¬¨©©«¦¨£~¡£vyz{vnkiguZfrwsxef]d[RXIF?;78876169744333646;8:<;=<8=><:;<:=;;>>DAADB@@ABCCDC=99B@??@?=2L³»µ¶¿½½±¶¸Á½¼´¸¿Á±¸·¾ÁŽ»¼ÂÆÉ¿ÈÎÉÁÄÁÇÊÊÆÊÅÌÈÍÆÈÅ¿ÃÀËÍÏÉÆÃÃÄÂĽ¸¾ÁÃÀľÁÏÏÎÆ«¯¶´µ« §´³®«¸µ³«©£¢©¬¦¬µ´¿Â¾¹¸½¶°«¬¯µ´º¾Å¿»¼º³¹»¸¹¹µ°´½»±¿¼¸²¶¹³¹»´¨¬¬ª©§~¡¡¢~xyuueeiig]iomxwbb``]XWFE8:8:979449766512334;:=?;==::=;<>:;?><B@CBBEB=?CCCCDE@9:BAAB>BA5B¶»´¼ÆÁĽÁÅÂÀ´³½¿¬°¯ºÃÊþÍÈÅ·ÁÈÅ¿ÁÂÈËÊÂÂÄÉÌÍÏÏÌÃÇÆÈÈÈÇÉÇÅÉÇÈÇ¿ÅÇÄÄÇÈÊÒÏÒ̼¸¶´¸¸Á¾¾º½º¼º¼¬¦©»º¹·À²µ¸²Àƺ··Á³±©«µ³»¶Ã¶¶½µ±·¾¶³·¸°µ¶¿»°½º´«°±±³¼º³³®««±££ £¢ £ }qtqob`gugiitmxl]d[U_YLHC6<9988:53:664413525;:<>;;<=<;<=<;<?=?B?EABCC>@A@EEDEA;7>CBB>CB8;·ÀºÆÅÄÃÌÂÁĽ¾µ¯·»¯¯³ºÀÇÅÄÁÌËŶ¹ÀÂÂÄÇÊÑËÂÃÄÆÉÅÍÐÎÇÌÉÂÁÆÁËÊÈÆÌÉÍÅÆÅÃÆÅÉÍÐÍÏÌÇÄÀÃÂÉÍÇÅÁÄÇÁ»¾´±°°Á¾¿ÁÆ¿¾¸·Ãºº¶À¾µ²¬©¯²¸¾´À´´¸´·¹Ä¹¯¼¾¹¾¿Â¿µº¶«ª¬®¯°·¾¼¶´®®µ¤¥¨¨¦¢ } ¢¤£ ¡¢¤£¤¢}r|xpg`jjvlidtnsb\bTWTSMG:7;9977:748784523425;:9>:=<?=8;=999=<@A@EBABAA?@?DEDE@<:>BCB@CA:4¡ÅËÃüÀÃÇÁ¹½½»¸¶··®²·¸¼ÀÂÀÂÇÆÇº¼ÀÂÄÇÈÆÒÉÁÃÿ¿¾ÄËÈÊËȼ»ÈÇÉÍÈÃÈÉÉÅÅÃÂÁÂÇÇÈÊÇÌÈÇÈÍÆÌÏÅ·ÀÀÀÀ»»½µ³³¿¿¹¿Ã¹À·»Á¼º¸»¹½»²°¯°¬¹Â¸½¹·µ·º½Å½¸ÆÈÂÁÂÆÂ½¼µ©®®°°¯³º·¹¶°¯¯³©¦«©®¦§¤¥£££¢ £
|§ ¢¤¡¡¤¢¢£¡£¢£¡¦yzyrofegcjdajmnn^X\VUNPJF99;97677637895613527<;<@;?<<:8:<998>=@??F?BAC?=A>@DCCA<9<CACDA@:3l¢ÊË»¹º¹Á»º·¾Á¼¼»¹±®µº¸¸»Äº¾À¾¾»¼ÀÅÁÆÂ¾ÆÁ¹»Ãº¸¹¼¾ÁÆÁƺ¹ÉÉÃÅÄÀÄÁÂÁÄÁþ½ÂÀÀÁÂËÃÆÌËÅÈа¾½¸º»¼¾·´°¹¾³¼¾±¹µ¸»¶¼³µ¹¶¹¶¹·±ºÁº¼Á¿·¾Ä¿ÆÃÃÇÇ»À¿¿¸²³³µ´±®·´·µ´±¬±§¥¥§°¨§«¦£¨¥¦¦ ¡¡¡¡¥ ©¤¥¤¥¢ ¤¢£¢¡£ ©¥¨}{xnfadbabccjbfbZYY\XQNE=;9:;77996499:5314527:;:@=?<<977;:9:<>@?>D<BAD@?>=BDBBB>:9B?AB=>85YÅǸµº¹Â¹¹¼ÃŸ»¹±±¶¼ºµ¹À»»¹¶·´´µ¿º½¿¹½ºº´¿¸µ·³¯»¼·À·¾Â¿Á»¿À¼»Å¾»ÁÄÀ¾¾¸¼ÁÁ˾½ÉÄÀÀÊÀ±Á¿»¸»¾¹µ·´¸¼´½¸µ´°³¼±·¶¸¿¶½¹½¾¹·º¾»¿À޽ËÃÆÃÄÀþ¶¹º¶¿¸»¿¼¸¶³²«°°²µ³³®¬«§¦§®«¢¨«¦¦ª£§¨ª£¡¥¡¡ ¡¦ ¨¡£¤¤¢¢ ¢¤¡¢¨¥¡|y}qc`bbgjffiei]UUSYOSKE8?6;;779;65:;<6313417;98?=>;<;76998:;=@?>@==?B><@ACCA?C=96<@A@<=87IÁÂÀº¼¹¾¶¸¾ÄÀ±½º²´³¸¼µ·¼À¼½´´±°µ·µºÁ¸¾¸¿¼½·µ·°®¸¶¹¿»ÀÀ·Á¼»Ã¶ºÈ¸¶¹»½¹º¶»ÅÅʽ¹ÅÀ¿¼Á¾¸Æ½ÁÀ¼Å¸¶·´¸¶¶»»¸¶´·ºµ´¸¼½¹¿¹ÃÀÀ»¹¼»¾½ÈĽÇÄúÀ½¾¶²¶¸²¹´ºÂº·²±¬¬«²¯²®¯¨£¤«¬¬ª¤¦¤¤¨ª¢§¦¨¡¡¡¦£¢¢¢ £¡¢ ¤ ¡¡¥¤¡¢¢¡¡£¢ £ ¢¦zxpmeefoiekgXXNKKJRILHC9>8=;6:;967<89860431799;?=>:<:889<8:;;;<=A>==CA<?CCD@??<:7>BDA?@88?þÆÁÁ¼¼¸¸º¿·¼±Â¶´¼±´¶¸³º½¿½¼²¯¬±°·¼¶»¼ÀĹ···¶º¹º»À½ÃÀºÄ¾Ǹ¹¸·µ¸º´·³»ÅÆËÁ»ÆÀÀ¿½¼¿ÉÃÄžƸµ²²½¸¸¸¾ºº¹¼»º´·»º¹¿¼ÄÀ¿¹º¸¿¹»ÅƽÅòº½»±¯¶¸³·³º¾À¹¶¬±«®©ª©ªª®¦¤¥§®©¥£¢£¡¤¥¥¦¢¦£¢¥£¡£¡¡ ¥¡ ¥ ¢¦¥ ¤£¤£¡¦~|knpgpksebl_[THKJDJBCG?9;8=<7;;978;7<<6275169<<=<A;<:;:9>9:;==@>D?=>D@??AFD??<=97?ACB@B9:9w½·Ç¾Ã¾½»¾¼½¶º¸½º·½³³°¸¸µ¹¼¼À·ª¤®°·»³½¾»Ä·¶¸¶·À¿Ä¼ÂÅÅÇÇÊÉÆÏÂÁ¸¯µµ¼¾¸»²¾ÄÄÊÅÁÉÿ¿¾½ÇÌÇÇÄǽµµ¶Á½º»¿Âº¿Á¿½¶·½½½ÁÁÀ¿¼¹·¼Â»·¿Å»Â¿¾µ·¼¼¯¯·¶°´³º¹º»¯©««¬¦ª¢§®¨¥ª¯§¤ ¦£¢£¨££«£¢¢¥£ ££¢££§ ¦ £ ¥¢qelintnwcga[bPKTHEECGC<;98=:7:=:89;7<=53650689:<;@=<:><9>99=>;?>C<?>@?=??FD@A?>:7?@CC?A=:8f¡¹¶Á´¿¼¹¼ÃÀ¾Àºµ¶²²À¸¯²¼¼°·»¶»¼«ª£°¹½¾³¼¾¼Å¸²¸¹½ÇÉÊÃÇÈÆÆÉÈÌÎÑÌÊŵºÀÃÈ¿¿µ¿À¿ÆÆ¿ËÆÃ¿Á¼ÀÃÌÊÇÅÆÁ¹½¼Ä¿À¿ÂȽÇÇÅżºÄ¿»Á¿ºÀ¼»»ÀĽ·¹Â¹¾½·´¶¸º®¯µ±°°²¶·´·¬®¬ª¬¬«¨«¡¦³ª¥¯¬¨©¥£¤§¢££§¡§¢¢¢¡ ¦¦¢¢¢¦¢§¥¢ ¤£¡ ¢¤tolltkln_b^aaMHM?E@?DC;;::;:8;<:9<>9:>4455199:9<;@<?==<8<;:<;;?>C>B>@?=??EEBAB?;6?BED=AA::Y¶¸¶±º»º¾Á¹¹Æ»¶µ²¥¾½´¶Á¿³½´¸Á±°±´¼Ã¼ºº¾¼Ä¿·½¿½ÇÌÆÇÉÆÆ¿ÄÄÊÈÌÌÍËÆÂÃËμ¹½º¹ÀÃ¿ÈÆÄÁÁ¿ÅÀÊÉÃÃÃùþ½¹¿¼ÂÆÂÉÎÇÆ¾ºÆ½º¿¹·À¹¹¾À¾µ´¼¸¶»°¯²²µ¯°¯®¬®³°³²¸«±²±ª°««¬«¬¶¨¬®²¦«¬©©¡¥ ¥¦¤¬¤¦¡ ¡¡ ¦ ¢§¨¢¤ ¢ª¦©¡¨¡¥ £¢§¡{zzmmw{_pc[]_^SI>BEIBC>C;>69:;;;;;;;==9=566218:9;;:A;?<<>7;<;<==<=@>AAA>>ABAECBD@<6>CDE>BD?;S º½´°»¼ÁÄÂ¿ÅÆº¶¹²£»½´·Ä»°µºµ¹Ä¸´¼¶º½Á¼»¿¶¿Á¿¼¿ºÀËÂÇÈÀ¿¼¼¿ÅÂÇËÈÁÃÀÀÉÊÂÀ»»°´»½ÀÅÆÅÅ¿À¿ËÇÂÀÈÀºÂ»º³ººÁ¾ÀÊÎÊĽµ¼¼¹¿¹¹µµ³¿À¾·´³´¸·ª¯°°²±¯«¯§¯¶®²±¹®¶¶¸´³°±¶´º±®¬®¶§¬²¬¤£¡§§¨²«ª¥¤§§¥¥ ¦£¤¦¢£¢¥¢¢¡¥°´°¤¥¤©§¯§© « ¢¢¢¤¡¦§¯©±{}zmsxsgp]Z^\YQEDCMIAD=G::59;:<<:;;;=?:=54512788;<;B<?>:;6:=:;>=?@?;AAA>>?B@ABBE>:5:ABI?@B@;L žº¶Ã¼ÆÂ¾¿ÈÅ·µ¸·¶¹»´¯·¶²µ³·¹¼»¶»»½ºÃ»·½·¹À»º¸¸µÅÁÃû¹³´ºÁ½¿ÇÀ¹À¼¾ÅĽ¾¹²°®¸·¿ÃÇÃĽ½¿¿Ãþ¿Ç¼¼¿´´®µµ¼¾¿ÎÍË·²¸¸¸½¹»±¶²ÈÀ»¶´±°·¬³©°³·¯«®ª±µ¯±¯·³ººÀ¿¶·¶²»ºÀµ²³·¬°º¯²¥¢¥«¬¯¹³²¨°¯±¯ª¢¨¡¤¨¬³®¨§¦¥¦«¤¤¦ª£¦²¸³«¥§¦§®«ª¥°¥¥¥¤£§±¬µ¸°²y|wluzpmh\__YSPAEHGK@DCH<=6;99<;::;:=?<=55613698<A>@;=@;;9<=8:=<@>::>=>==>@BBBAD=745=DG=CB?<E ÃÀ½¼ļ¼»Å»·³·¶¶»»³ µ¬¯±´´´¶¸¹ÁÀ·½¹¸¹¶µ¿³´²¸±»ÁÀ÷·°µ¸¸¸Âº´»·»¾À»»¼®¯®³²¹ÁÂÄþ¼¿»º¸¶Áµ¿ºµ®¯°½À¹ÏÊÉñ¯µ´´½º¾¹º»Êûº¶¯°½±¸¯²³°·½¶®¯®°·°¬¬²¶½¼Äº½·¶À¿Á·µ°¶²±³º±±¯§«¯«¶¿·µ©º³µ¹±§«¨§¶®²±µ¹¨¬¬¯ª¯°ª¨§¬±¬²¶½´±¬¤¨«¨¨«¬«¨¶©¦¨¦£®¼±»Á´¦|zrvvwmp`^e][TJ<>?FF=FCC9:5;99><<::<>>>>88315789>?A?;:?=<;==9;<9;:7;>==CA??ABDBA<858=CF=DD?<?Á¾Ã¾¾¾¹¶ºÀ±µ±³··Âµ³«³¨©®µ¯´¶¹Ã¿·º·¶¶²´À¶²´¸³ºÀÁù·²²²´²·¾º³µ²¼º¼¶º¾²´´´°¸¾ÃÆÄÀ½¿¹³¯²¼º®»´³¦«¨º¾¸Ë¿¾¬«°¯³º·¹¾»ÀÅÁ»¼·°µÄµ¿´¸»´»Ã³¶¶±¸¬©¥«²½·¿¿»»·±¼½¼¶±¯««©³¯°°«°´©¸À¶²©´µ°·¶¬¦«»³®´¸Â°±±µ±²µ±¬°²¸¸¹¸¾´±³®¬±©¯®ª²¸®¨§¡©¶¿¸º¿°}|qswtvql^b`[]NHA?=HCFMD@775;:9><<98=>;=?:8325768??B?:8>>=<9<9;;:<;;:<@>BB=@A?BB?<;7:<AD>BC?>A ¡»´½¿»¼¹·³¼¼¬³²´´¶ÀµÀ¯²³ªª±·©¹³·À½»¼¸¶º¶±Àº·¹¸¹»ÁÁÄû»¶´´°¶º¶´²¬¼¹¸µ¸Áº¸³±¬·¼ÁÇÿ¹ºµ®¥¬³°¦°¨ ¥¶µÂ·¶´¥¨«¨°¶³²ºµ»»»µ¸¶°µÄ²¾¼¿¼¹ºÅȺ½¾¶±§¤¡©±®µ¸¶²°«´·¶±¨¦ ¥¦¤¬§«¬¶©¯º±¤¦¥«±«¬©¸¶°²¸Á¶±±µ±¯»¶²·µµ²¼µº²°±²®´²ª®§¸µ²µ®ª¨¨²º½À¶´©{vo{ourmb\fX\]RNMA>JB@JI@665;78>:;87>><;?:9327575<<><<8>><<999;;;>;;9<>?A=<B@??B@>;67:@DACA?AB ¥ µ¯´»»´µ°±¶º®°´³¯µºµº°µ³±¶º®¬¼²¸¹·»¿½¹¾À´¿»¼º¸¾Â¼ÂÊǾÀ¸¹¶²´¶³´¯¬»º¸¶¹Àö®®ª²¶¼½¹¶²±¤§§£¦©®¹¬««¥¨¤«®®§¯¬¯±±±®®°¹°´¼¾¸¹¸Çż¼»¸©¢§¦¬±®²©¦©ª®©¢£¢¢¯§¤¬¦¨¡§§¦§©¯¶²«´¶¯ª°¯±©¹¶±µ±®¬·³¶¯®«®«´µ¯««±±²¨««³µ·º½°«¡zyqvsmtik][jT\\OMHDFLAFMF8665:5:>8;97<=:;=:9236777>;=>::?><;<::;9;>;=9<>=B<;@?@?A?>:55:@EBDA@BA¢¦¡¥©®®¸¹±²¨®¯¸²«°°ª²µ¹¹¾µ²¸´¹ºµ¹»µµ³µ»¼À»¾À´¿¹¹º±ºÃ¼ÂÊÅ¿»¿¿¹³´³±±®°¹¹¶¼¸»¿²²²®±®¹¯ª«¬£¨¡¡¨®¤£¤ ¢§¢£©©¡¦§¥ª§¬§¨§¬«¬²»´³´¹º¶²¶© «¬«¯£££¡© ¤¥ §¤£¡¥ª¬¢©ª©¤©®¥´±®±ª©®¯°¥¦ª¤¨³®¬©¦¦©«¦ª§«²¬¯³±«©wrxhtsndT`cW\QNLH?HQCMC=8875:7<>:;<89<;;<;8248978;;<;8<=>;=<:9<:;==<::@=<<;@>B@A?>958;<FACD?AA£¦¢£ §¨ªª©¨±¯°¥§¦²¯©¦« ¯°»µ½¼·ÀÁ¾¼¼¼¹®¯²²ºº··µµ¼´¯´«¶º¸ÀÄÁ»µ¼½¸²³°¯¬®·¶²´´¯ª¤¨¨ ¨©¡§¤¨ ¢¢¢¥¥££ ¥ ¤¬¤¦¨¤¢££«¬³®©®®®§ª¨¬¡©¨ª«¥¢£¦¢ ¥£¦¤§ ¢¤£¡¡««¤²ª¬¬§£¬®«¡¢¤¤¯¬¬©¦£¢ª¤ªª¤©«¦©¬«¦ y|vybvln\PhTPNGOLLCOQ@>;>39:5;9=;:9=99<;<<;936996:;?=:8;:><:<;9;=;<<=><@=?<8;@@A??>949<7ACBD=@Cª¤£¢¡¢ª¤¦¨¦¡§¤¡¦¨©¥¤ ¡§«¡¢§«µ²¼½ÀÂÂÀ¾À¹µ§¥¬ª¨µ²±°®¯²§¦¯£¯®µÁºµ·²·¶²´«²´®ª«¯°²´®¥ ¢ ¤¥¨¢ª £¥¨ ¡¢£¨§§¡ ¤¬¨¬¬ ©«¦ ¤¨¦¬£«¦©°£¥§ £ §¨¥ £¢¡£ ©ª¥®®¦¨©¡¢ª®ª§¡ ¢£©¬«§©¦¤¡©¢¥©¦¥¤¢¦¤¨£}}uu}mk{dhUQcMIHGNRMJMG;D@<2?859;>;99;8:<;;;9948;87;;><:9<:=;;<=9<<<>==A>@B@=7:?AB@@?855<:@C@D>AF®¤¢¥£¢©¨¨©ª¥¦¢¢£¢ £ ¡ ¡¨¬®¶·º¹º··»®¨ ¡©¡ «ª¦©¤©£¤®¥¬¬´¼·¬²±¯±µ¯¯³µª§¬£ £¢¥¤ ¤ª¡¡¦§ª¢ §¤§©£¦ªªª®§¨°¥£¤¦§¬¦¡¤¡¯¨®±ª¥ªª ¡¢§¥¡¢¢£¡¦§¦¨£©¥¤§©¤¥¥¡¥¤¬¬©¦«§¢ ¤£¤§§¡ ¥¢¦ {}vx|dxy`bRU_HIIKSTIRPL9>A67=65;:<<9;;8:<=:;8657:69>=><99=9==<>=;;<:>=<???@==7:>@@@??865=<>ABF@@G ®¤¦«¡£ª¬®§¬©¨ ¢¦ £¨®¬««¯ª¯©¥¥¦¤ ¢¦ ¢®«¬µ²¶¦¯´«©ª´±°°¸§¡¢£¥¦© ¦£§®®«¦¢±£¤¦¦ª¢¡ª¢©¤¨²«±²«º¨¦«§««©¬¬§ £±²°´©±¯¢¡¤¡ £ ¤¢ ¢¦¥¦¥¤¥¨£§£¦£¢¦¥¢¥¥¨¬¤¦§ ¥¡¥ ¦{|vvshle[SZYMQJNOTLRLA7>B68<76:<<=:<98:;<:;976:=59<;@=78;7=;===:;<8>==@>A>>>88<?@@=?758=>=A@F@AH¡ª ««¡¤ª«°©©§¥¥¥¤ ¡¥¡ª¢¦ §¡¤¢¡£ £ ¢¯®¬¯±¬¶§±¦¦°®¬°§£ ¡¡¤¢¥¡¤¤¨¨¬¨¤¬´·¶°§´¬¢£¯¥¤¦¡©¨®µ³²½¶¾°¬±®©ª´±°§«¨²µ·³·¬±´£ ¥«¡¡¢ ¤¡ £¡ ¥ ¡¨§©¡£¤ ¦ §¡¦£¢¥£¨ ©«¥¦¢£§|xuiwu]lZR`HQUHFUVJBMG=JH8E<67;>=<:<98::;:<966:<7;>=?>97=9>;<@<:@::@?;@>A@=<97:>@?:?758=>?A@D@BF«©©¢¥©©®¨¦ª¥¦§¦¨ª¡¥¤£¦¨®§¡¢¢ ¢©«§¬©ª´«««¥¥ª¨«¬ª¥ ¦ ¨¥±ª§®£«¶°´²±®¶¸½Àºµ´°·°®´©¦¤¥¬©¹³µ»Ã¼ÃÁ¶º¶«¯±¹·¼¯³°µÁ¼·¼²²´¡«¢©¨±©ª¨§§©¦ § §§¥¤ª¡¢¨ ¤§£§ ¦¢¡£¢¡¦¥¥¤¢¤ £
~vqmivmhm\X[BVMJGMGBFM<>L=4<96:=?<;::88<9:;;<54:<89>>?>88?9<;=?;=A=:?><@>?>?=<6;?A=;?867<<@DBDABCª ¦©£©ª¨©£¡© ¦¨§¬®¥©¥©ªª ±¢·£°¦ ¤¤¤¢¤£¢ª¯¬§©£ ¡¬¯®ª«§ ¢£¡«¤«²°¹²²±²±º½¼¼¹¶¸Ã¾¿Â¿¶ººÀĹ½»¬®§±±Â¶¸ÂÆÀÈÊÀÊ¿°¹¹½¹Â½¸³»Åüº¶³©²ª²´¯³®©®£«¦µ±¬¢¯¥ ¢¯±°¤¤¯£¡ ¡§¡¤ªª £ ¦¨¡¢¤££¡¤¦¢¤
{trkkurphW[QETHDIPH>EA4EH95;=6;<><<::89<89;8::8;<7;>=>=68@9;;=@<=@97<=;>=>=B>>7:A@><>958=;=C@ACBAª¡¥ª§¥ª¨¦¢§¦¬§±²«£©¬¢¡ ¡©²«»²¿«¯¬¥ ¡ ¤¥¦§ ¬±¯§¤¤£¡¦¬§ym ¤¢«¬´¼¶Ã¾¾³»ÁÃÂÅÀ¿ÂÆÆÅÃÈÂÀÅÈÍÐÈËò·µ¾²¾Å»¾ÌÍÅÌËËÒÆ¾¿ÀÂ½ÇÆÂ·ÃÉÈÂÀ޹³¹º´»·°µ²ªº±®º¶¾ººª·¬ªª¸º´»®¸£¦¢§¥¢£©¦§ª§ ¡¡¤£¤§¢}zrkdioxjeZ[FJLDDSLDBD7:?;549979>?;<;;8><6:=9<=9<=:;=>>>7;A:>9=>9=>87;::;??=B>?7:A@=<=866<:<A?AAA>« §®¨¢«¥¤¢¢¥¡¥ª«°²®¤©¦¤¦¡ª§¢«¬¼¼¿ÃÁ³²¸§¡¡«ª¢¡¢ £¡¯³©¡wsqnp¦®´¹Å»ÍÇË¿ÂÌÎÍÌÈÉÑÌÍÌÇÉÅÆÌÐÒÕÎÓɽÀ¿Ã»ÆÅÈÅÑÓÌÓÏÒÓÌÊÂÅÆÆÊÇοÈÐËÆÄÆÄÀ»ÂÀ¾¾¾µ½³¾¿ÂÂÆÄÆÃ¾¸±¸¼ÃÁÁº¼¼µ®§§¨ ¢©¥ ¨«©£¤¤ £
ytsebgrof^ZYCNLCEPIDB@55589B=68:A>;;><9>=7:=9:<8<<<;??><=>C<;:@=:;::8889;A><@?>8;AA<;>786:<>B>CA@>¯¨¯¦¨«£¢¥ ¦¦¤«¨«ª®¢ª££¬®¦¥±ªÅÆÌÎÍ¿°Â©¥¨ª¡£©¡ ¤±±«¤ yrroly¤¶º¹¾ËÁÓÒÓÈÍÎÑÓÑÒÑÐÑÑÍÎÎÐÅÎÔÕØÒ×ÍÆÇÉÌÃÅÊÎÊÓ×Ñ×ÒÔÕÓÓÈÌÆÌÍÉÒÌÍÓÍÄÆÉÉÀÅËÇÈÈž³³ÇÄËÊÊÎÅÉ¿½¾¼ÁÇÄÌÌÈÉÀÿ¯²¨¢ª£¦©¬¤¥¦
{ruvgbhwidVWQDMF@IQB=B<:23@<D<79<B=;=?;;>=9:><;>8:99:?:>=@>@<>;>;9==<96::>=<<@?>9:@A;9>9:::;>><A?A>¬¢¢©¦§¨¤¢ª¨£¬££§¦¬¢©£¤¯ °«¨¬±ÉÍÔ×ÏÆ»Ç¬´¸¬®£¤£ ¤¬©¦°®¥¡¥¢}wpkebhqoq{
vpnqtp
³Â¾ÅÑÐ×ÖÖÒÖÍÔÖ×ÔÓÑÓÔÔÒÏÑÃÐÓÖ×ÕÖÒËÉÎÐËÆÍÑÉÑÕÖÙÕ×ÒÖØÎÒÉÎÑÌÎÐËÒÏ¾ÆÆÉÂËËËÎÏÅÆÆ¶¿É¾ÒÌËÏÅÉǾÂÂÇÎÌÏÐÎÌÊÇ͸·»¨¦«§£ª¥©¨¨|xsvpc`erb]R\IJFAEHI>;@8=4585:76:<@=;><;9@;9:<;;<7==;:>;=<><?::<;;9;?=95;<><<=??>:;@B;9?98;==>?<A@D<« § §£¢ ©¤¥© ¡¡¦¨¤¢©¦¢¦¬¤°±©¨µÐÔ×ÚÒÇÆË´¶ÂƲ¶©¢¥¦¡¢«µ§±¡¦«¡¡¢xida____^_`^blusqpolrquÄÇÆÔÕÖ××ÓÖÏÕÔÚÔÔÏÏÕÔÔÑÑÌÑÎÓ×ÖÓÕÐÏÒÓÑÉÓÐÇÐØ×ØÐ×Ò×ÙÕÕÌÎÏÉÌÑËÎÏ¿ÅÁÆÅÎÌÐÐÑÈËË¿ÉËÅÓÍËÎÇÃÉÆÆÈËÊÔÓÐÔÏÒÌÒÁ¹Å±¥¨µ®§¨¬¥²¨°³¬¬
{zqstmacim_VP_JJBFCQM?<>44:=52755<<@<;<:9:@:8;:>:=8>::<@=<9;=?9:?=;=<==:6<=?@=<==>:<@B;:=74:><??=FAD=¤ ¥¥¥£¤££ §¡©¯®«ª«¦®¸¨«·ØÔÕÙÙÑÎÐÀ¼ÌÉ·À¯§«©£¤±¶³£¶ª¡ª©¡¡~rfcc__a`_a`_``_`fmppnkorwwÌÀÒÕÓØØÖÙÑÒÒ×ÏÓÎËÓÍÕÔÑÊÏÌÓÖÒÑÖÍÐÕÕÑÅÑÔÊÐÔÕÕÍÑÐØ×××ËÈÎÃÈÎÌÉ̿ȾÇÈÍÍÏÊÐÍÎËÎÎÇÊÏÏÊÎÊÁÈÆÉÌÉËÑÒÌÓÑÑÏÏʽǹ°»¸µª¶°¨¸³¿»±
yvopokbenpaW\ZIFFDLWE;@<33<=86855;>@=9<<8<>9<@;@:=8>98:?<=8;>B::=<:A==<:6=<?@=<;=>8;@A=:<88;><=>:EBE>¥§ £§¡¦¤§¸¶µµ¥®¾µ±ÀÙÒ×ÚÜÖÏÍËÃÓв«®¬¦³±¸«³·©£l__^adb```a``a^__^]bmroostuvy¤¾ËÕÑÖÔÓØÖÎÎÓËÍÎÅÎÊÒÒÏÆÎÍÍÔÌÎÓÍÊ×ÕÐÌÑÓÊËÐÑÓÉÍÑÕÒÕÕÊÀÉÁÅÌÂÇÉÂÌÂÅÇÊÊÎÊÌÌÏÍÓËÅÇÏÌÇÇÊÄÆÀÅÉËÌÏÐÆÏÎÍÍÌÏÅÇÀ·¹½Âýù²³¾°»ÃĶª¥¡
xprkmh``qhXXhVMGLIPPB;D>;67:89:57==@;:<=9<=9==:>:<8;=9;@<>;>>A<9=>=B=;775?<<?<<;<<8;A@<:<9;:;<=A:EAE>¨¤¤ª¢¡©©¥ÅÃÁ¿»µ²±Ç¹ËÕÖÙÚÛØÌÍÏÉÖÖÅĸ²¶ª£®¸¹±²À¡}fbcb`]^acb`_``aa`_][]grqqrsqmry¤ÆÓÏËÐÏÔÕÉÄÉÉÆÆ¿ÃÅÎÎÇÅÇÍÊÑÈËÎÍÆÑÒÏÎÌÔÊÇÊÍÎÇÆÏÒËÐÏźľÆÉ¼ÂÆÈÎÄÂÇÀÆÍÇÃËÉÊÏÇÃÃÏÈÆÁÆÇÿÀÆËËËÎÂÊËÈÇÌÐÄÅǺÇÃÈÈÂÏÀ½¼¿°ÁÊǹ½ª°²§¥¢£wntdk`^fqa[W`GHHGIMTG?J=64355<<48===:;=<9:;9?=9<;<8:<::@=@<==><:C><?=889:@>?><;;;;8:>?<;:79<>=;>=FAC= ª®¥®ª« ¥³±¬ÉÍÊÈľ½ºÍÍÆÐÕÕÙÚÛØÐÊÐÐÒÔÊź¾¾°¨·ª¾¹¹³¥~
t`[^^^`^`cdc_]]^_``_[Z\akrrookloo}¸ÑÈÉÊÏËÍĺ¿Ã»»º¹¾ÈÆÂÃÀÃÇÊÉÈÊÇÁÅËÆÈËÍÉÄÁÉÉÁÁËÐÄËÈ¿¹ÁºÅǽ¿ÅÎÊ¿úÉÇȺÇÅÄÊ¿½ÁËÆÅþż¼¿ÂÄËÄÄ»¿ÉÂÅÇÒÅÁȾÊÉÆÇÆÐÃÃÆÃ¯ÄËÇÃÊ·¿¼º´©¬¥¥¬£ ¥£ {vrtfiZanmZ[XQDLFBGDLCFR?54334?<3:<<;9<<<8;=;A=:<:;7;=9;=;=;:8>><B>;?<99;?=;@><;9999:;=:<:69<><;>;CBD>¥©²©´®°¢¨¿¸¼ËÐÒÌÇÂÃÇÍÏÎÍÕÐÖÙØÙÐÌÔÎÏÐËĸÆÁ¶µ¼±À¶º¬{
vxusq_Z[]`abcdded`\\]]_^`[YZ\borokilposƼÉÅÌÀÆÁ°¶º²²´²±Á¼»»¹¸ÀÁÁž½¹½¿¹ÄÊÅŽÆÀ·»ÄÉ¿ÂÉ»·ººÅþ¼ÁÍÂÆ¾½µÀ½Ãº¼ÆºÂ¹³»Åö¿¶µ¾¿ºË¼µºÈº¿½ËÃÁÅÂÅÈÅÈÅÐÆÂÌDzÆÉÃÎÍÀÅ¿½²·°³§¨¨¹±¥°«¬yvwjeh`hocV^YJEJFHKAEBEI@9:648853;:;<9<<;9;9:@>::<:7:;7:;;?<:<@=@?=??;=;;@<>>>:998978:<<<;9:<>;;>:@@E>~¬ ¬µª·´²¡¦¢·ÆÂÄÈÎÒËÊÊÇÍÍÏÒÉÑÆÖÕÖØÏÌÐÈÍÈÊŽÊÁ²µº·º¶¯
y~|tud\\]^``bcbbeeb]][\^\^]Z[]]hsqmggnpry½ÌÀúÀ¸°°§ª¬§¸´¶´³²³ºµ½±·°´®²»Â»Áļ¿ºµ²º¾À¸Ç¸³»µÀ¼·½ÆÀû´¯²¶º¾³Ä¶ºµ¬¸¼½À½°¹¶®¶º²Å¼¶®»¿´¶´Å¼¾ÂÅ¿ÃÄÅÇËÅÀÆÆ»ÇËÀÏÉÇÃÆÁ÷þ¾¶¹¾Æ¿¬µºµ·¶xtxfgebkn^V^`FKHHJFBCADE?<:565633;:;=:;;:;>8<A=<:;87999;<:>;9>?=@?>B@=@::>;?==9:::856;=><<:;9>=9?:<@@<·¦«³±¼¼± «£¯ª§¤ÆËÎÈÆÉÎÌÐÍÎÉËÉËÊËÆÑÏÓÑÏÇÊÆÊÅÄÀ¼Ï½³¹½¹¸·{y~wx}th^]]]_`_`da^cec__\[^\]^Z[[]_lpnhfjnnr|¤Ç¿¹¸µ°«¬§¢ª§«¬³©«©³¶°²¨®§¬²»º¶Â¹º¹°«µ¹»´Â¹¯¿°½¼»µ»Ç¹Â¶ª¨°±Àµ¸¼¯°§±³´»¼«µ¥®¶®º±°ª¹¯»»¸»¿¿½¹Â¿ÆÂÅÀ¼ÆÁÇ˸ÅÇÅ¿ÇÃÃºÄÆÂ»ÅÉÌ˳¹Â¼º²rvvkiablhYWW[ALKMIEAC?FA;9:995854::9;<=;:;>8;@<=9:79>9;<:8;;:>>9A=?@?;>:;<:=<<8989768<<=;<::;>=;?;;>@<À«¨¸·¹Ã³©¡¦°µ±·¦ÆÏÒÌÄÆÂÅÐÈÏÃÄÇÁÆÆÅÅÌÃÊÌÃÄÁÇÀº»»Ê·´»½µµ«|y~
z{xn^]]]]_`__dcbccb`_^[[ZZ]ZZZZ]dnohfgiknr¹°µ®¦¥§§ ¤ ¥«£§¢«©¬ª°£¦ª´¶±½¹¯·¯¨®¸´´»·³¼®·¹´±»Á±Á®¤¨¢«±²³§¼ª«¨«¬´³¥¨ ¤¯©²¥§¨®¥§¶¬°²·¹º»±¼½¾¾Ä¿µÁÀÇÈ·¿ÀÄ·ÄÂÀ»¿ÄþÄÈÌÊ¿¾ÃÀÀ©rsrji]aodWVXPHZRSKFFE>?@:789776437:99:<;;<<7;=;;;<89>8=;<6:=;?=7A>?@?:<<:=9:;:7778879<;<;9;:<979><>?A;¯®¼·¹Ä°¶°ª©°±³µ½¯ÆÑÐÍÄÈ»»ÌÃÌÀ½Ê¹ÀÅÀ¼ÌºÃÆÅº¼Ä½¹¶¼Å¸¶¸»®±{~xt|swf_]\\^_`^_ccab``_^]\ZXY[[YXZ\_fkfegehkor
ª¥¬¦ ¡¥£¡£ª£¢¤¤§¤¬¤¥«²¯¶·§°¬§ª´«´¹°¶´¬¶¸±¯º¹°·¤£¦±§«§¹ª¤¦§¨§² §¦¤¦¬§¤ °¬¬¬±³²³°µ¼¶»ÁÁ²º¾ÃÁ±¹¹Â³À½¿µ¸»½¾¼ÂÆÄÂþ¿Ã wplae_ko`UY_HNhOTGEJF<=?=:;;825536999;9::<:7<?<<;<88<9<:;78::<98>:?=98<:;=:7676788666;::;9:;<859<:>>@;ȵ¶½¸ºÁ»¾µ ¡¦º¶«³³»³ÅÐÉÌÃǹ¸ÉÂÎÁºË¹½È»¶Ç»·ÃƳ¾Å»¶¯¸¿»°³¶¯¢}yvtpmkjjqi_`]\\]_`_acb````]\[\\XYXXXVX[]^dcbegggjmo© ¡¢¡¢¦£¥ §¢ª°¬±µ¢©ª©«¬¤µ¸¶¯¬²´®²µ®°ª£¢²¤¥©¸¡¦¦¨¬«¥£¯¨«§ª«¬°²¸®¸¹º°¶»»º«³²¹²½´¶±±µ´¿µ½¿½ÂÁºº½zrk_e^ddXTX^IW]KPGIJFA<??@;?<04536:;9;899<<7>?;=;;88<898<78:;;:;?:=;78<:=<74776757466;79:;:8:98:;9:<?;ɶ¸¾»·ÁÁÁ´¤¤¤¦À²¯¶¬´·ÆÐÉÉÁǼ¼ÅÅÐÁ¼Ê»»Á»µÅ¸µÁÁ³Âû¬©´¹·§±²©ysnpnkc^bff]]^]]]\]_`abccba_\[[Z[YXXWWWXXX[^bddeffhikr¨¡¡¡¨¥¥ ¤ ¯² ¥¢«¦¡µ°±±¬§®²§¹²¦¶ ¢£¡¢¡©µª¢£¦¥¦£¬¡«¦¢£¥«²³ª´°²ª²¸³®©¯²²²·³©¬®±·°ºµ¹½¾¶³±yue^e^[YVSZUL\QLJEHKIB=?AA@@:245249989;9:=<6=?;<>;7;;777>6:>;:8:=;<=:;<:=;8797465546785::8:99<87:89>@:Ƚ¸½¿¶¾½¿³¥£¥±Âµ¶½µ¸ÃÍÉÈÁƸÂÁÈÐºÃÆÀ¶¼½¶Ãº¶¿Áµ»¿ºª¦°º±§±¯}
ypqtqhediec\\[[]]\[^`a^__`^\[Z\ZYXVWWVXWXXVWadecdeddhjv¢¡ ¡¨£¨ª¦®°«££¶© ®¨µ©¦¦¬°£¶¯£¶ ¢«¦¡¬¸¯¢¡£¡ ¡¨©£¡£ªª°§³«ª¦¬²°¥ª®²±¯°®¯¦§§²®±´¯»³¹·£yud^aVYWSRTKM^LPLGHLKE<@><B<;7553398899:9>:8>>;=<<7>=676=7;=;979;;<>99:;:867654531045679:8:9::7:;99=@:vÀ¼µ¹Â±¾¸¼®§§£ª»À½À¹®´¸ÂÍÈÇÄžǺÊ͵ÄÅı¿¿¹ÀÁº¿¿¹¹¼·§¦°»¦¨¡¤~xrjlrtpihedgb\\ZYZ\\\]^]\[\^\[\Y[\ZXVWWVWXWWWU[ccbbcbcdfj ¥¤£¥¦¤ª¯¦¢¤µ§ ¡¢§³¡¥§¤®¤°¬«´ ©¡¡¬±°¢£¡¦¦¡¢¤¤¤«¤¤°¦¥¢ª«¬¥¨®®®«¨©©³¥¦«®³±®»µ°¯®yvrea\Z]XNLQGRaMVPOJMOEBD?9=69:754599;9887<89=>;>;<69:7;6;7;;:85:;:;;6<;8846863321./2556;:8;7876<;:;;A8x»»±µ½°»²·¬¤¦·»¼Áź±¹¶ÅÊËÁÄÇÇÉ¸ÈÆµÅÂÈ®º¼Â¼ÂÀÁ½¼·º¶¥§±µ¢wodbgihfhjgjm`]\[ZZYZ\]\[\^_\ZY[YYY[WUXWTTWUSTSU``_`a_`acdi¤ ¤¡¬¥££¢£¡ªª¥¥°©¤ª§¡««©¨¢¡¡¢ª¨°¢ ¢¤ ¡ ¡£¤¢ª¤¢¤ª¢«¥±©¦¥¦¦µ¦ª¨³µ´¹º¯©¬rpo`[WVURFQOHZ\ORJTKSLEGIC8;;=<8666:9;::76977:;:=<<6;<8>598:88659:;<97?<9678452121..1426:86:859898:;9@9{µ´´»²°¬²§§¯¹¹³¿Èº¶À¯ÆÉμÂËÍÉ·ËÀ´ÀÇ̰µ¼Ç»ÁÇý¾¶ºµ¤ª¯®|uijjmhjlnkkme]\\[[\ZXZ][[^``\XXZYXWXWTVVUTUURSOQY]\]^____bdm¢ §¨ª§ª¥¨¤¢¤®¤¥¯© ®©²¤¦££ ¨©¬ ¡ ¡ ¢¢ ¢ ¡¨¢¢¨« «¯¤·¥¢£¢¬©¨«¯³¸²½µ³«¯rrh[XYSUREYLQ\YMTNPLQRINIB<??A?=65799<<987:79:;<=>;7;;:=67:;8976989:6:=99577571140-+/434988::8::748=8?9~³®¨³¶®¨§¯©¨¬·¶¬»Ê»¶¿¬ÌÇÆ¹ÂÏÐɵƾº¾ÆË´°½Ä¼ÂÄüÀ²¹¯¥ª¯«wxoninnnqghigd]Z[[[[\[YZ[\\^__\XXYXWXWVUTSUVUUTSNOQYZZZ]\\^_`d~¢ ªª¦ª¦¯¢§¬ ¤¨§®¦©¥ §ª¤ £ ¡¥¥§¨¨ ±°¦±¼¦£¬µ«§°´°¹µ¿±±«|prbVTUNRIGVPSRLLXMJLNRGMKACFDC>@75889;9:7::7<=:;@>:9;9:?759::876958779;85576661320-*.102877;99;8948;8@8³¦±·ª¥¢°«ª§©²°¤¶Æ´¹º³Ëƺ¼ÃËÑÌ´¹º¾ÀÄǵ´¶¼²º»Ã¾Á°³°®°«¢khmoroqkpkdfge^ZYZYZZZ[ZZZ\\]\ZXXXYYWXWUUTRSUSVURNNNRWXYYYY\\]ajzv¨ª¤¤«¦ ¥¢£¢¡£§ ¡¡¤¤¦§¦ ´²§²· ¢·¬ª¤²²¦µ¼µ««±£xrm]NPQLODNNNPLFNNKJNNQHMJAGKHHC=858889:;69:68;99><8:>9;?8789:886857688974577820301*)-/12776:999984988A7w¶§¤¶°¤§£©¥ ©¥¤³ª¢²Ãµµ²³ÇǸ»ÄÊÍǵ¯¼¿¸¼Ä³²®¶¢¬µÃºº®ª«´¯¯§}^`gsqvqjnifhhj_XYXXXYYYZZY[[\\YXXWYYXUVRSRPQTQSUQNMKLSWWVXXYX[]aosvp¡¢ ¢¤¡s}
z¢~~sz¢¢ ¡££¢´¯¬¯¬¥¸¦¥°¡±®°»ª©¯ªvrbVLQOPMCSNLQMCPPHINSMHJJDJLEJJ<749888;;69;7:<9::;79?9>@79:<89764445874312585/0102)(,-12764889::65:87A7w·¢£´¨¥¥¨£¦¥¦¥¦³§¥´Á¸°´°ÊƹºÂÏÇ¿´¯½Ã¯±Ç²§¬£¿·°¯§¬¬ª¢rWV`hgihincjhgb\XXXXXYYYYYYZ[[[YYYVWWWSTPNPNOOPSTRMMJHNSSSTUUWY[]ilrl
|tNXr_;Wo{
rxz
|xqo
~ §¯¨©¨´¢¦¬«§³¡©£|qm_ZNSQVLDTJPMMFOOJELQMKOJIMOFIH=7599999:7:;:>>8:==6:?8>?589;79675333760.-/344110//()++-3844879<:79;86A9x· ¢¡¦¦© §¨§¢©°¨§´Â¹±µ°Éù´¿ÏÀº±±¸Ä«®É®§¢
¢º¦§¥¤£ iPMRVZZW]^bgc_YWWWXXXYZYXYXYZZZYXXVWWUSRNLKHGb\MORNKHFHNQQMPRTVXZ`moiztPB@}
x`JQnx|~n~wuvxpQ{~xvgw
~¤£§©¥£±«¡¤¤¦ª¡©¢¦¨ske][HQQSMIUMSILLPIGFKNLMTKQQOFIC<769:8:;;8:;8>?99>=7;<6;;478;6775344696/3/.115221/,')+*,4833979:99::::?9v¶¢¦¡®¡§¨¥¦§¯¬ª¶¼¶¸¶³Â¼·¨»É¹·©ª·¸¶Àª¢±¡eMLNNOLMQW[\ZXZUUVVVWYYXXYXXYYYZXXVVWUSPMJE@@kssIMKDDDINOhYNQSTUZntw~ji]Ut{
{uxsnupty}ªyzhv{prmxxz{vrqxguzz¨ ©¥¨¤ ¤qf`\\JVOQGKXROJMMSJJJMPHLQLRTMEHA<78;99>=:;<98@?::>=7==79937795675252572/2.,./200/-+(().1262198798776:<<7v®£¡´©¯©¥¬«°±ª½´²¼¸¶»µ³ ¸»³««¬µ³¥¤fJIJIGFHHPTTTWWSTUUUVWWWXXXXXYXYYWWUVUSPKF>93N<~MHJD@=ADj~LOQRSV^u}ygw}gyvx|r{vzok~|s{}tfv|
logs|lyq}pmurhq}pCwwz}zt~£¢¥umkeaYWXTQJSVTOPOQWKNKOOJQOIOOKFD<;79;::?=9<:99??;8<=7<9999266856633621224.,,-..-0-+*''*.1362/876966527995y¦ ¦°¬®«§©°¯±¬¼¸¬»¾¹´®©±¨§¬§¤}{z~~eJGHFB@CDILLMQRPQSUTTUVWWWXWYYYYYYYVVTSQKD78f70?¨iNHC=;:D
zZJNPQTX^eprm§ªÀ~uyb{wo|yy|
omxsxjjr}Inhw~licly
ksl|nr{
imp~s
z}~zvott
ywp|}lhmnmWUWTRQYOSUUTYVMNHNKNNKCINGE?:89;99:><9<;::=>:8:<9?868727565541442/024*+**-.+-*(*(',-1250,5567485HA895w¤°¢ª¨µ¯®¬´¿«¼Â¿¦£¥
¢¤v}|x~t}wtw|fOEGD@<>>AFGGKKKMPRRRTTTTVVWWXYZYYZWVTSPLE1@3 jrAo;<95<_IMOORWZRY\`§bitze~omzutlss|jkLyg1vsl~}tfet~
filukp{gpp{n{s}}qpnum~wytjyyuiingcWQYWXY\NPVWZYOIIEJJHGBAFDCG=998;9:9<:9;:::@<9:<98>787715244533645031.**+*,,++)(+'),,226-+5775478iO8;5n¤¨®²¦º®«²°Â²»ÃÇz
swvwuxvoxsiUFID?<;9:?@ADDEGJLOQQQQRSTUVVXZZYXVUTSPKE80/\`³G9XP;9441ºHLMOPQVLAIQIb¯³ q|xm}lq
yyqsxsu5q¨¡¡¢vp{{shfbimqmouioXuovl{|mrnpzsumbvvy~}xpnnj^Z[][YXa`SO\[YXLHJFJG?CABG>CD=;97=;:;;9:99;:?<88=:8;66651121353475531./,,+)*))***)(*)+/3DM2166643<vR7=7b¤§¯¥´¨°®Á³ºÁÆ}nw
ny{{q{t|ko^JPG>@7458;;<=>@BEILLLMNPQRUUVWXYXVUTSPLE<5*K[@-gI94/>©®_HLMNPL7CMRSDJv||v~lw|}
~u¡y~
aªzv~s{\dqtz{wmgiayn
znwszqsywkni]w}|}q
|uw{|tmqrde^ZZ]S[g^XQVY]WGKKELG?F@DC>AA=;97<;;=<::99;;=>79>9986754244104646654-,)+('''&(())((+++/00Uq<23331E~W4=9\w¦ ª°©¯À±»Åºzvk~
yt¢
s}lylSXLAE311267688:<?BEGFGJKMOPQSTUWVVVTSPMF@:2= #c[5311i?GoIFILMORLKT]YRJi{y|r|z|~w¡¥¬©H¯¯¨sl|}hggx~m
q
Gkxqyvhmk_w}
z{uv|xmow~}qqpjZ\[ZccWgf]VPQXZQDLLGOIDFCCA@CA=978:::;;:888::?>6;>7595773344236656768;DFLMMLC7+"%'+)++,/00+nu22420L\5=<^t|~
¬ §¹¯³½´}tq~}¥yu
y_cVLC60./23123668:=??BEGHJLNQSTUTTVUSQOGC?80,#[>?84.]ps£UFIKMNPW`YpZ\^j
~
¥»±§»È硤{r~v
ihotqv{v
}nvug¢«£{{zogky~w{pic\YY\i]ag`[PMNYSRIQKDNGCKDB@DDA<:87=<:<:88778:==8<=68756623445576867<BB?<8:>CQ^e\G2'&,,--.1(?[.310O_4?;nvpgx{¤¡¬¦«¯°¡xw}
mpj^CA4--////02234779;=?BDHJOQRSRSSTRPOHDB<87/9C><<63.lMQIIKLKNV`cggmu ¡£©¤£¬¨¶¢§Á®ǯxº|¡¡
louwql
r¡¥¶©¢
~kjk}~}q_[b^Yfj\ll_YLHPSQNNMGIQDDNFACEGB>:97=<:;:987767;:6=:785456345566668556310.*,,)().:Pa\@,(-++0,'r7240Ob3@<unhYppuqv~§ ªhf¤~
z}
xxhNR>//.,/.-/000212457;?CFNPRTPQQSQNPIEE>;<:CF?><752<@R5HHHLLMNR^o|s} §¦¢¡¢¨©«¨¬©ªµ«¾«¶ÈÉ·ÈÑϾ piª¨
§¡wz~¡{v«³ }¤£§¶°¨lss||ynf^[__agc`gg]REKKQOJJMGGMCHMFFCBGDA:85<<899975658>75=84745754546958:616863/0.-*,/.-'#*;XbB(*,1-(K^063Q
f3A@ib_Pqu`n}aw}|ªªBD}y|
w_bP460-1/,.00./..0015>AAMQRSPRTUSNSLEE@<>=FH@A@8662<9<FHGIJNOQYmw£§ªµ½¸¥®¬¬¨©´¬°·²²»±³¾³Ã¬»É˸ÿ·¥£°²¬¬ª£
¥¦ ¢¦¢ª§¤
£ ª¡¤©°¤§¸»¡£°££¤¢¬°³µ£¦«z{~{e^fZc`]bc^fg`[PDJHTOFHLGKHFGHAKFCFFA:87=<88:974658<54<76:54644739<38<202551/1.-**/,-*(*&%5XX/,0,,0871P
h5AC[XTLicWjpXz
v
ÚÈsV}{
qna@E64<3/110-,+-1/-4?DANVQRSUUWUM\QGGD<>>FHCD@8;<5C;=FKJGHROPW ®£³ª²ÁÇÄ«³Å¶³À³¸¾¶¿µÁ¶»»¤¸Æ©¶ÉǶ¾¹´¨£´°°§¯ª¤w¤¡«±²©¨®µ»²º¬¯µ¢±¬²µ¼¸µ®µ §¨£¨©°®³º·¹¨¸ª¥ zrX_bUd``a__f`\UJDELVRIJKEKHEA@@KDBMF<867;<97:986555711<8895466597>=3891.0121130,*,.,+++*('*)EZ00*/+hO60Rj6AEWQJL\ZQcdWzuq}v~{¿»£¼´z
zyo]W@EN<6:46AB764//7CHCQ\OQUXU\WO_UIKJA@>GKFFD;>@7D7?BJKEFWTP^¤¤²´Ã¶¸ÁÌÊ·¼Ä½³´Â¸¸Âµ¿°¸t±´¦ºÅ¤°Æ¹±³²´¨¤¶¶ª° ¢¢¥±¥¬§¤ ¬³¹¡¨±¹µ»¾Ì¿Å޼³Â¸º¸¿¸»¸º±¦±ª®¾±½¼Â»©®«~yhUa_VhcieV[dZWUJHGMRHDIKAID>?BBL@@MD99669:?6:9966246/19599364627;=?6:1./58::650*(,---,,*((++(ES/*00Jk52Pm6?FRLALRWTYVZwjpo{rxb¹¡£{z||}xzufP\dGEL:Qd`[^SF?;HPE[cQQYYZgZS`aMSOEA?IJHEFA@C<D6B?HGJLTZT^¯¸µ»¹ÉÀ»½Êͼ½Á¼¸¶¼¼·¾µº²Æ`u²¥±«¾ª¥¨«ª¤¢³µ «§®¥§§¥£¢§°³§²²¼¶Á½ÓÉÉÓÆÂÅÌÂÊÃÁ¾¾¿¼½¸µ°¹··ÃºÆ¾Äɱº«¢¬¦©·|o\^^\U`]hfSYbWSWJFFNKA>HD=KB=B@=F>;H@796379>489:57045/26389374526?8@>GKRTTRPPQRQJA9/,,,*+((,-+/P>(.48}<2Kq9>CKE@JMPRLQ]hmlqslrrsÕÀ¶ }y{{yt}zlfpvY]\Peeb`ed][XX\NdmURmn_o_XgeUYTJDBKKHFHHHHBI9D@HKTTV]Z[¹À¹¾¸ÆÁ»¹ÊË»·º¶¸¹´¸µµ®··du©p^¢¡¢¤«¥¨¦£¬¤ª°¬·°¼¸ÔÐÎÖÏÉËÑÌÏÎÊÇÀÀÂʾÁ½ÁÁÅÄÆÊÀÉÏ´¤¼±µ°¬¹½}wi[\YW[_XabQ\aTRLDBFHF<@F>BIB@D=:E>=J?47535;=468977022/24169775555D3ELM>510006:477@IOJ;.&**(-./,@M+/54mI0Ht?>BD@CDGKODR\Zi`pnlotu³¬¡¡
|s{
{tt{ylmu|iseilhfjih`fiimZnt¤½g[oh]ZYTHKOPJKPLSQHLAJFKP__bgjb¸Ç°º´»¾¶±ÅǶ°¹±±»³²¨¬¸¶¨§N §¥¡¦¬¯¨¯§³³ÔÔÔÖÑËÏÓÔÎÓÏÌÅÂÊпÊÉËÉÒÈÍÎÃÐÒ¸°Ä½Äº¦·»Å¢~laYZ[V^VYdZP]XORCCIFDJ;AD>BH?@B8;D>@I=56655;:687654/10146278875367C5B8?-0,1348=97,.,1;FL=),(.0007K?-46TW0DwC;B>EBACJM?UYSfWshrpyy¡ª¦}|
p{r~qyulqxr{nxslipmcinpyix}~Ë¿Ãß§ncxnd[a`KPRUNY^P]]MQNTQUT\nnwr®¸¬µ¨°¶«½Á²«µ¦¥¹§¬¯¢¬´¤±®
§«¬¤§¢¬¬ÎÒÕÑÍËÒÓÓÐÔÑÎÈÃÔÑÈÎÒÓÓÖÍÒÑÅÒÖÆÁÏÈÈ鿸ÐvkbZ_[U^Q\ZPPUQOI>AGBCF=AB?FE>@?:==<<JA45465<888664412/03526768533;=<E=@11+/349?5901022-2EO3)/3.32=N248C}_2AtD:==I>@CFH<VRMO[uwlwp}~ ¡
y
{r~z
v
owsls||w|sxqkrriprzyr{¾Ë²vr
wiai]DZZ[WfdXekTX]]ac^cx{ª¤¤¢ ¡©¦ª²º«¦´£¢®¢¤®£§² ¦k£~
§¯¡ ¥¤¨ÈÍÏÇÂËÐÓÑÔÒÎÓÍÆÖÓÍÔØÖÖØÕ×ÕÊÕÚÍÊØÖÑËÄÃÌok_]\VRWR[PJHJJK@;:<ECE=CD>HC?CB;<9<:GB46544<5687543250/2546745544<>=E?A62/-16;=081/254/-.;R017/532ED28>nb5=tM99@I<AD?A;PLFKYqv~isyr
xys{}w{oxqnuvx}t|ylvun}vuy|¶<AÆ¥~}jeWICecfchjdoy[_fhknin £¤§³¥¤² ¢¥¢©¢£²~
zª£}ª³§¦½ÃŸ¶ÅÍÑÐÒÐËÒËÉÔÎÑÕÚ×רÔÙØÍØÛÎÉÚÚÒÖ¿ÌÍ´tsjaYVPSPXUEGKJFF>:7:@BC:GE@EDBDA;?;;7DC75655;0689443341014558744449@>DBC<33.6FTWOQJAJF?2*(.BT29254/7K75<`bA<svV87AH:?B><9QECJTlnopbqqt}
}x
{
yq{{
uz
zp}ppzr{rnzuw}}u}°tYªÂ·pnc=^hrqqpnwwfioruyrz « ¡¬¢ ¦ ¬
}
~lz{®«¦®µ¼¨½ÆËÈÉËËÏÉÃÒÊÔרר×ÔÛ×ÓÙÛÖÏÛÚÒÖÉÕÌtwedXWNQR\GCFII?B>=8:>@;>I=@BABEA>?:87DB755479.566435532323647553458EBDCEB56<FNSM[nfcnsk`V>,5LG865433BF4=W_hLux^8;?F<<A<:9D>CGRk_mdbflvqy~
|}wyo{{tz¡vvtu~too
u}
zw|¸Æ¥ÃʸxpfNeczw
¡yyw{|vm¦ £¬
{| ¼ ¨¦¥§µ¿¿¿¸ÇÉÍÎÄÍÊÑÕÕÔÙÕ×ÛÔ×ÙÚÛ×ÛÚÙØÎÛÆuucea]RUUTMKDND;==<9:<?9>A6>?@=?>=9867CA6455=80665547745613854564557HH=DJE7925;H>;9;7IP\ZRUXL9T>;95327I8=NYMHxxd5=>C=<@:6:>>@EQ_Yfa]\itzylwvz|~~{~
z
|v~um}}~t |~x~yot~
|~{©Ã ½¤~
}ss¦
{iGp¡¤
¡~¦
¤
·¡¦ £®¶¹´«ÀÆÊÐÇÇÌÏÓÒÒØÒÕ×ÀרÙÛØÚÚÙÙ×ܶttsffbT]YRONHDLC>=>99;:::<=6A>?==9:;;37D@8378>70688357<37804976755546FP5DNI8938AK=;3C@I<:DWO<MTHN?96333>C;[X>5YypZ<<A<=>8589?=DRSRX^VXfmmmiqsx{{||{}|~uzsztm~
~w¡n©
{¡}
£¢¤¯
Wr«[¢££
¤²¡ §²¸¬¥½ÂÇÍÇÆÏËÏÌÎÖÐÑÔÖÕØÚØÚÚ×ÖÙÙkxpccYYUQUWC@ID???:48:;7:<;4<<?=>7;::1:G=:27=@50677255?65;55858:57735HR7GOK994=EJB>1FCLB98:GX@5HWI66223:ECeX?&_yi_z>>9<;88;<@;BQKKSYPTcbymb~onxyz{}||w
sp
{uwvt
}¦¢¦¢¨r³¨
£ ¢©°o·ÄȲ¢¦²d¤ÍÇ
«¤£
¤¨¡¢²´¥£½Á¾ÇÅÅÈÈÉÂÊÒÍÍÔ¨ÒÑÖÖÖØÚÔÓÚÎnzd_[Z[LHTZBBHD;B>837<<:9>64::<:72?:929I:>67BC32:96264>=4;>6949;57944KQ<JQK9A7BGI@64JELF>;88ETA7>\86214:;E`XAFathLcZ>5;::5;:=:EMFHSWSRBcGv}|m~y{~{ww|mn{}xx|~¢³§£ª³¢§ ¥¤®¢¸³¢¡¥°£¤§©¬¯¤¡À£É¸«£¦®²
¨¢
u³¥¡~ ±®¢¤¸¾´ÅÇĽÃÃÀÆÍÊÉÒ¦ÎÍÔÒÐÖØÓÐØ¹nuqY]R]UNGINEACE5>;77:?<<7=43669774>5;5<K<>;<BA75<;4277?@6?@784987;<55OMDPRL8@=EAGA5:JENED:6A@BS>9DO323575=v\<R\tiZM]S<=88467=:JFDGNZ\YJf`;Izzn
z}x~px}~}osz~|x¦»¬¨±½¯¥³³©¤¢°¬µ£¹¦¥ª¸§¤£ ©ª¤®°ª »»®Ê¡j·¸«°£¬¾£^ª²|}´«¡¡ ¥®¨¡¤´¸¬ÂÈŵº½¼ÅÇÈÂÑ ÆÊÍÍÅ×ÖÑËÔlvdYWP[PNEC?=CBB8@885?G=<6<35345454B49:BL:B;AHC;:@<746<B9?@B874::6><47TKCUQJ7<:IAD@4AJHNBA?6DA<JND/T=254:EJ\XJZQmgppDi`KI6757:>J@CIPdHb`bpI@~s}un}}}pww|ªÂÀ¯½Æ»³´À½µ«³¶¨²®½«»¥¨¹¹«§¦¢¢¤£ª¯²±ª¤£¦¥£º¯©¿¼®²¹¥¥¨~½°z¨±¬ £¬ ¦¥¤¢£°²¦ÁÆÃ°°»·ÅÃÿͦÇÄÇĽÖÑÍÅÊ
oo^YW\YLJBKAFH?A@C;:5>A>>5<7=333241A17@BM>G@CNCA=C=;86CC5BIB:878:5B>79VKDWOF8=4K@C>4EKHN>BA6BB?BSE58P145;<8;D>9Ljj];WRdKgZUN79GD?CF\eF`igZ]]{uo~{q~zz§³ÆÉ¿ÁÌÂùǽ»¯«º»³·º²À®¦À¤«°»½ª®«££§«®µ°© ª¡°µ§£»º¶Á¼¬©´¥¥©
ªÄäz¡¦ ¯«¡¡³ ¤¥£¦¦¤¯¥ÀÄ¶Éý¶Ï²Ä¿Ä¼³ÑÊÈ´puiYUYgPKHCMKLJAB>DE<5AE<;3=9B332263A05IEN>I@HR@H>C@;>=FA5AU@;998<7E>8>VJCWOG8?4L@B;5JKCL?B?<BF=AHL9+G<367464A?7OaOaE/=>6klj`@:H>?EBeZMe\eTbjyr{xy¡¨º½ÇÈÉÁÒÉÊÂͽ³¼¾§ºÀ½»Ä·¬Á©¬³¼¿ª°ª¤¥¤¬®³¶µ ¯¥¢£´½©©½Â£¶·¯¬²¬¬ª¦¥¥uy
££ª¥|£ ¢µ¥¤£¡¥¥¤£©§¢²¬¨»Àᥳ·Ì¿¹¯Ä³»¾Â¹ÂÃÂÀhu^VTXXIJLIFDDIDCBDL:4DI:;4=8E.12242B26SHO<JBJQEKCDE:ELB<7EV=;=89?<I?:EUIAWQG7A:K:B79JMBI@C><DG<BCO=20H366170=B:=jjJK5QS3SppdN;D=@F>iH_XaZccV x
¡§¤Â½ÇÃÇÅÓÎÎÍ˼¸°º¼´½Ë»Ã¶¶¼³¿¹½®¯¨ ©¨¶®©²·¢§¡«·¸ª¥¯¿Å±½º³¨«·´¯¯¥¬¨ ²Å§||©¥¡£¢Z¤e¢²¥¡ª«©¦¦ £¨¥¶«©¹»Ã´¥´¶ËÀ¸ª¶«²»¸®¨¸º½·gjWTRSMEJRMK?BHEEIHG96FM;>7>AJ.32025C55OVN<LFKRLOHGI>IQ?:8IS;;?79>DLB@HSK@WPF:A?G6A7;HMCE;C>4FE:BABG9/:A3603>GD94=tdMG;E+:f|gV;>@BFBpEjIReaLF¥¢©¦¢¯¾¯¡Æ¼ÄÄÆÆÎÎÎÒÊ¿»¶²»»»¾ÏµÄ¾¹¹·³±µ³¸³«§«¬¹ª¨§¯¯¤¯¤§¤¥µÀ°¬¬´¿Ã¹Àº´¨º·¹´°¥¯®¤¡tÂ}°¥£ © `J¥T¯¯£®ª¤ ¥§¢´¨ª³»»»«°²È¿¸¦¬«²²£¡²²´¤mjbYWMOJDOPPR;HKIHJCD>:KU?A:=EM07544:B44MWO;JKOUNQJPHHJOB<>MR;>=8:<CR>DHRIBWNI@BAF3>58JKCA=C;5EA:A?>H@5+C52,>c]g:35tde@R7}hW;:BC@=QEWSsbWFHª ¢¨¯¨
£¤´Éµ©Å¹ÂÄÈÊÉÈÌÍÇ¿»³®¹¹ÁÁ̵Ⱥ¹µº°¯¯³µ¦£ª´µª©¦¬¥®¥¤¨¬º¿¨¬¶·¿ÂÀ¾¹³³Å³º¾¤¯µ¬¹¦¦v¿®¡ ¨¨ª¡§nv¢¢®²£«§©ª¬£¢¤§¢±¦©«¹¶½²²®¾¹¶ £§¨¥¦©©_b^]OJKFGMJVM=NFOKMBDD<QV=AABDO18=76?B75UXO?HNQYSPQUKQJJEAEMQ??=8=;GR<EDQBGYMKAHDE::39KIB>CB99C><@>;;G7-2>-1hNz\/0kh`<=BB86zfW;:=.-R`MUH~e^HE«¡»¯ ««¡£¬£¤¶Æ¾´À¹ÂÂÇÉÅÂÍȾ¹²¯ºµÁÂɵƲ¼µºª¨°¢£ª´»¦©¦«ª©¯§£ª«½»¨¬½µ¸¾Ç¼·¶¹Â³¿Áµª¶·¬¾¥£¢ ½¡·©¥¢¡¨¤³ ¦¨ª¤¡¢ ´¯¥¥¯ªª©¢¢¨©¤¡¡³´º´¨¶²²£¥ª¡u\Y]\HGEFLPINEGHCSLJBEGAWSCH=AGQ1;B7:BF79\YKALPTUSMWRNUJE@JJNO9D@5=<NQC??P?EZMJAKDG@53=IG?=EA97A;<@<<3@</(;*HB:SJ0,[oW71<*BdT49-19f\FCCpbGE§£Ã¥ªª§¦¬¢«¶Äü¾¶ÁÂÀÇÿÌÅ»½¹²°¹³¿Âǵ¿°¼·¹¶¥¤«« ¡ªªÄ¢¤©«¥¬¯«¢©©¾·§¿²¹·Ç¶µ¹¹À³Àø¶³´°½££®¢£¥££ ½¥©©«¡¥½¢£¢©¬¡¤ µ¬¦°¦®¥¨ ¥¤«±µ±ª¥ª¬ ¨e_W_\MHGINLHFDIB>QIA<GII\ROK=IOU5BF9>GG5CaZKBNRUWVQXTRUI@8RQPM:GA4CHQSIC;C>GVKC@O>K<06;GF>;FA55?9:?9;15D0-,/Mv\4KZ5,MnW<-=)#zbQ5CKQ9mQF<KxeaVK¢£Å¬¡¬® £¥ ¦©¬¶±£ª³¶ÅĽ¿µÀ»ÈÁ¾ÉǶ¸µ´±³´·ÁŶ¾±¸µ¸´¦¬ª¬¥¤Á¥©¤ª¯¢¦¨¼µ¦±½¹·¶Ä²´¸»À´Å¹¹¯³µµ£¥¡®¢©¨¬£Â¬©¬®¥ ½¡¤««¬¦¡W¥¡ ¸ª¦´¢°¡£¥±«©¡¢¥¤¤^aXb_KHJJNFEAGK?>KB:9JKN]QQI=LW\9FI=DMH8Hb[KCLPSYYVWOZ^IA=WQJL?H?5HLXSHA:@ADPH?>Q>K7099FE;8G?.6>78>77/1?91%1QUm[JO10=gWD17=-+w`S6S[kWqGE6=ue\KM¡Ä¨¦¡´¢³¨«¥ ¤©¬»°¨¬¶±ÇÅÁ²ÃýÆÃ¼Äɼ¯°¶°´¯¾Ã´¹²°º´¬¨±©ª¥¡§Á¬°ª£®±©¤¨¼¶§·»¾°·Ä³³ÃÀ´È´¼¸¬´¶ª¢¦£¬¡ §«°¯¯»±¦ ©¨¢£¸ ¡£°°¬¥¦¢¢§´§¦²¢« ¥«¯¥¦¡
~_dYfeIHLISAC@IH;;G?99ONV^RSJ?P^]=HPBLLI9Nc\LELRTY[SUO\bHA?ZQAHAKB7FELKM?;BHDNB=;N@A3/97CB97F;+6<46<25-/4@1+&VtSeO?104b[M23>0<v]^?[T]ep@8;HweA4£ 餪³¢¤µª³§¢¤²¬®©»²±µ´ÆÀÄ´ÀĽÉĵ¿ÇÁ´«µ¨¯¸¬¿Ã³¸¯¶¹¥ª²««¦»´¨° ´²§«¹²¨º´¹³¹Àª·²Ä¾¶Ç¨À¯®·µ©§¬¡¦¥¢¢¥¯¸®²µ¶ ©¤¤ ·¢¥¥°²²§«¦¢¨ ¡¯²¢¦¤ª¢
¨¨ª¢¦
wag[jiLOMNT=CANC;:I@77RO]^RVQAW`\BJSHVKH:Td\NFON[W[RPQX]GAB[PBG>NC9HGHOP??CIBLB<2IA94177B>;7E7+6914801-/.<6-#Bqgsk23/1[bZ23806p[bH04IogUCWFyfC;££¡¦À§¨¯±¢ªµ«º±¬¤«´¶±°¹·°·¸¸Å½Ãǽ½ÄÂÅ¿¸ÀÅÀ¹©¶¤¬»ÀÁ··ª±º¡±²¤§ª¹ª¦±« ¯´³«©µ¶¼´³¹·¬¸±Ã»ÀÀ§Ä«±·¯©««§«¡¢¡¡±¯³¬°¹©§ ¶©¦£¢±±´¬³¨ ¥¢£³¯¤§¡¨¨¦¢
}hfk`lmWPQ[UABET@<;IA8:XPd^PWWEY_^NMRN^KJ>Yc^OHPO\UYPKTWZI?DXPDF?N@=IGGQPB=DEBM?:1D?77547?=95E4+75/251--.,1=*'+=\p=>1.0dZc?1647gY`F(?8l}g[V;{cC>§¢ª½¢ª°¬¤²¹ª¦¶µ¬¡µ½¯³¸»»¾·¶À¿ÉĹÄÿ¿·Ã¼À¶®µ¦«·±»½¾´©®±¶«®§®¦¨§»¤¬³¬¢±°³¬©µ´µ½®±²µ¬°´³Á»Æ·¬½°±¸¬ª£²¦¥ª ¤³ª³««³§¡¦¤´®¨¡®®±¨´³ª¤¨¤¢¨µ©©¦¥£
zdjqfoq^FYgVDCMWD[9HC6>]Qh\NZ]G[^^ONRXdJJB\b_QLMOXWXPJVVWL=EUJEDAM@AFHHQPA;GDFK=87B=68719><65D0+80/05/*,/-*=,,%2+*5K1/'_^_T150=`V^8*C3YU\gK6zfL@¤¡¥·¤¬ª¦¯®·ª¯¶¼¨§±·Æ·±¶½ÁõµºÄ¾ÌƹÃÀ¹¾¹Ã·À¸±³«©º¶º¹¾´©°µ§¬©¬«««¾«±£« ±³®µ²¸¸ª®¯±¨µ¯µ»¼Ê³ª·¶±´¯®¦¡´ © ¦²£®¡¦¯¡¤£¦¨³ª¢§³«¶¥¯²¶¯£¬§«·¢ ©¤¡¢ z
zjmwlt{aFakYIGZZ={JFD6AbTi[M\bK\][RSRb`LKE_`_QLIPWVUOGWVUN:IVIH?CK?EDHHQNA?HHHE<7=>:75609?866B,-8,/04,(,/-*76((9.$:K5."U_T_/5(C_Q\.*A/JGP[G3cYUKD¡²©²ª¦¤¯®¶ª¸¶º¥¬´·Ê»´»º¿¿µ³·ÃÀÌȼü¶½¿¿·¾»°»¦¹¹¶µÂ¶ª°·§®«©£°©¯º¤¬±³§¨£²´±²°´±·³©¯¬²§·¯·´ÄÆ·©¶·¬±©§£¶ ¨²¡¥²¨ ª©£¦¦¥¸¨£²µ¬¨²¨®²¶«¤ «¨©¸¡¤§¤v{lovt{~\Lfm[KNc\>b{GI8GgWf\L^cMYYWUXTi]OOH`\^PJHQVURKHWUVM8MZNE@FK?HBCKSM??LOH@;:>;6;041<=458?)07)1.2)),,-+-9$042%9B7.#ANGe27'GbLV%,A.=ELQ<3rkICC¥¯¥®¯«¨¥±³´«¸²¸¡¬µ¹É¹®Á»Ã¸³±µÂÂÎÅÀÁ½´½¿¾º¾¼²Ã§¨¸°µµ¿¼®«²± §±¦¦¯¥²µª±±¬©¨µ»´²´³ª¬¨¬©¸²°ÈÁ¹¥º±©¥¨®±¦¥¤¯¤©°££££¤ ¢«¦§º¥¬¶¶¦«¬©±¶®££¨ª £³¡§ w}
|{|prq}||\Sdo]NXe\FD[G;NmXb\M`bNVWVWTXg]QRLcYZTKGOTSNGIVS\N;P^IBDHJAE??KSO>:NMC<<>9:5=+32=6249:(45)/+1()+,-*&5*/&0)38:1&*3Bc:6*HeHJ*:G>3BHS,>k;GHª¬£ª±¤©¥´µ²µ¶²²¢¬®½Ìº®ÀºÇ±´´ÂÃÑÅÆ¾À²¾À»¾·»Ä¦«¶«²¶¼À¯«±¬£§©©¥°£ª²ª¯¬°¯°®¬´½§¶°²©²©«¥¥£ºª²Ãº¶»©©¨¬©§±¥ª¥£¯ª¨¢£¥¬¢§©¢¦¤®¬¸³²¢ª£ «¯±¬¦§©¤¦
¤~~
|v~
rqptl_Z`maQrp\K<
|F?XtXaZNd\NVVUWQ\a^SONgXVVKGLNRHEIVR]c<P]D<FHHBG?=JPL:>OJ=9?=2:7;*25>10485(5/*,.30;),,'%234$,2-860)(1;\J0.JgEF6;B/4EKX2@Y=LE©¢«³ªª±·¹·¯¬¦««½É¼°½¶Â¯±«³ÃÃÎÏÿ¿´ÀÁù¿³Çê®¶²¸¿¾±¬«¤§ª°¨¨©±¥´®ª±®®²±´®µ½¤·³¬¬®¨« £°·«ªº·¥·¶¤ª§¬«ª¡©§§²²¤§¦¡¡¬ª¡ ¦¥¢ª¤£ §±¸®®¤¦£ª¬ª¢¤£¤
¢£|zs|ru¤xk_`leWdcN?gLEbyWcYReUNVUVTO\]aUKMhVUVIJHIOBGISQYoANX@:JGFEG>>EQH8CKE87C72:::*39?./463)4+*,+.#4.-+&(+79*&6+<-2,&06VY.0JgAA;;B+:JO^4D=GFD°¦£«±«ª®¶¬·³¬¦¬ª©¼ÀÀ·¸²¼µ¦²°ÃÉËÑÀÀ»¹¿¾Á¹Á¹Àì±´±³ºÀ¾²°®¬««¨¶ª§®¯ª¹°¨²²¯³·«¹¸¦´·«¬¤©ª¤³³©¨¤´´ ·® ª¨ª¨«§ «¬©¹¶ªªªª¢ª ª¡ ¥¢¦£ª¨µ¯©¦«£¤¥¨§ª¢££ ~
¡uxt~xv}oqgfow\_rjO^VHnyUeWQcPMVTUPOXZbUHOiTUSGOXUI>IHOQPxLNW=<KD?@A<@CUC9AK=5;E13;:7*4:=+-341*8**+*,))(/*&)%3;,$2)2021%/1Pa02?f=NX?C,>LT_0Ji5OD<±¢¦¬¯¬¦°´µ°¬¦°ª©º¾»¿°¹®¢¶¯ÉÇÈÑÀ¾½»»Á½ºÃ¿¾¿±±±µ¼»Á±°³ª³©¤´©¥®³³¹±£®¸²±³»«»°ª®¶«ªª«£ ¶®©¡°²¡¶ª¨§ª£ª¡¢¨¾°¬®¢¨¨ ¬°¡¢ §¨¨«±ª£ ®¢¡¢¤£§¨¥}£
xu|uxyyrqwf~¤vi_citf|RXp_KxsSdTQ_MMSZfNLVYdXGRhRQ?BNQaQ:IHLSIqQLS;<I?;<=;@@W<<?H73CB15:93-5::)-31--5)(+-,42#2)',%.;.&1.0-14%,0Kg:48_=ad?F1CP[[*HL9U@4³¡¥§¤§¤§µ³²«¥°§ª·½À»¯§¹ª¦®°ÉÇÈÑü¿¾¸½¾¼ÈºÀ·¯¯³±ºº·À²²º¬¸¬¢´§¨³·º³¨¨¾¶¯·¾°¿§¬µ«©¯£¤¬¨ª²¤´¨«§©£¨£©¨©¾¬´°®ª¤ ®³¢¤¤¦ ¥ª¬¦ «¢¢¦¨©
~
~}
¢r{z~|ix|ysnnzfw
daf_qylfx]^T?W{mTbPQYLLNru]HZ[gYEUeOC>JNDCA9HGKS?jaIQ8=H<<<>:<?T6:?C45H>2;59027<5(.5/-11'/>KH0%90%,,09/,,+6'17#-0GiI24X=fbAJ7GS`U*=9CV=*² ¡ª¦¥¢«¥¸³´¦ª±¦¬·Á½µ¯¢¹¬§§°ÂÊÉÌÁ¶½À´·¿ºÈ´Â´²±´±½·¹½µ¸µ¾¬¡³§«¬±¶¸µ¬¿½ª³Á´¼¡¯³µª¬°£¥©ª¤¤°¥° «©§¡©¥©¡¼¨®±®¡«£¤®¦¡¤ ¤«£¥¥ £¥¬{{~
£}yl~vyxc|zpnnpufrjhdf]krl`hp`o=[ylU^NPRKJMTZWM\^lWDW_O^OHMDF;7HEKO<rhKK9AE;;=>;;=J49B<3;G<4?18-68;2(09/,4/.=-*K>)49&'.34.0+/4&,:$41AgY14S=e_DL6KVdO*;1NW=# ¨¤¤ ¨¤¸°¯¤¯¯©«¸Á¹²¹¯«¨´ºÈËȾ¶Â¾¯´½·Ä¶Â±¸±²À´»½·¨¹·½ª£´¨©«²¯º±«½¾¦°Á¶·¢¯¶µ§¦§°³¥¦¨¢¦¬¨©¡ª®¦ ¦¤© ±¹¤±¯¡¬¡¬¤§§¨¥«§¡ª¡©|~}| x
}
|sp~rtt`zxhmnnmg}qc{mid`[d~^YsjrIIiXZMPLKHPRQIO\_nSDXZRgNGKEF56HBLI5ZeJ@6EB9:>=>::C59>:3@F<2@23.:;83&2<0,85B*)-B*,4;NN@;73-.+-7**<%53<ec24M?e]FO=QZgH*=/WT5(§®¡¡¡¥¡·«²¦´´©¨¹Ã´² ¸®°µÆÈÀ¶¾Á¹°´¼·¾»½¯ª½°´¿±½Ã¹©»º·§§µ©¨¬²®´±¨¿¸¦®½¸³ ±·°¨¥§¯±¡¤ ¥¥ ¯¦¡£¨¯¡¡¥¥¢¸°¡¦±«¬£¯ª¥¨¥¨¬¦¢¨¢z~zx
~yzprwppt_ywdkkjgflerjkdgW`r^YkuiXE~^ZXOOKHHRUG29^^mPDWUYeLHJEE07F?KB6IJH;6F949>=<98@8;8:7@I>8<4-3<<75(5>1,;A1(+6<#8R=*113>D5,-'42+;+139cl84HBf[HTCT]hE.:1]Q,2¤£«¦¡£¡¸ª°¡»¸¥¬½Ã²¯®¢µ°¬¯µÅĽ³¾º·°³¹¸º¸º®¿³µ¸¯¿Á¸«½º´¥¢³«©«´®³¤Ã¶§ª¸·¬ ³¼ª§¥¨¯«¢§¤¦¡²¥¤©©¡¦ ¤¹¨¤§¦¥¡¨ ©¡¡ ¡¡£¬££§¤y|
}x
{w|musmmtbxthfifcmfghdfgh]daheZezb`PsT[[SKJHIOS@ *i^jLCVU^`KHGEC.:B<F<6KPD8:D357==895?:;4>8@L=>93)8><:9*6@3.E4(+,>0-O?.+-7-1195,&.5-80576`sB3CDh[KWGU`hB377`L'2¤¥¦§¤¶¨ªº·§¬ÃÀ¶¯¬¢¶®§¯¯·ÀÀ¼±Á·±®²¶µ¹¸µ¬ª¼³¯²±½¿·®¼¼°¥¶¬¦§µª«¯¡¡Å¬ª¨²µ¬´º§©«±¥ª§¥¥¢¤ª¡¡¡§·¥°«¡¡¡¡¦¢ ¦®£§ x
w{
{
s~gyplklguskafcas~adefdhhbenY]X\lcaLgWZ`VIGIKMRX>9`liHBUS\ZIGFEA.<?9A89RF@7:B037=7692:<97:9DM=B<0*<@;A<-5B37=++,/A*JK./*+3722(57$+7.72685\yN2>HiZLZJVbfA:3@aE%5¥¡¯¡ ¥´²£²¾·¡±Å»¹°±£·««®©¹½¼»À²®¯®¶¯³¹²§«¹°¯®´¶»¶¯¹¾¦µ« ¡²¦«° ¦Å¡³¦°²±·´«®¬®¢¨«¦§¦ ¥£©±¥º¨®¢¡¤¥¡ªª§§{t
|
ogyniljgqrkZhcaq`dgjmjdhecl\lluqbSbiceZIGLMOYQPUaeT@VRZTFGFE@/<=7?6<EMa8:?249@37818?7=8>FJ@D92-=A=A=05@9@1-+.3<;K6/.+,-24:5#3*)6.55465Z|]1:Lj[M[KXdc@A1G`A'4£²¡©³°¸À¶ ´Á»½¹±¦¶°©®¥¸¹··»°««·ªµ¹¤³µ±¯©±¶¶±³¶»§© ¶ª«£ª®¬Ä¯§°²¸µ¬«°¯ª¢¤©§¤ª£¥ £¬«©»¦¤ ¡k£q¥v¬©¢x
li~wql}o]dagluxfhvjfX\itnMOibepe]dfnjg\[\hOKD8FTg^JHQPUVKHRapteF[QUPEGFC>1;=6=6<4f\5:<75;D4860:B7?:>FLCB343=@@@=28@E=1,,08>G701.*.*/668,#1'214:286Xl15Ok\N[K[fb>G1N_;+.¤²¡ª®¬£½Å¯©·Â¸¾¼§·±¦«¤¸´²³±¹®©§¬´¦±µ¢§¸¶µ¨§¶³®´®´¢ª´«£¦§©°¿¨¨±µ¹¤¨¬ª«¥¡¡¨¨¢¦¦§¨¨«¤µ°£¢££¡¡¢¥¨rx uif~sx o~|¡ |tvknied{mrbTmdmiqXiomV]hZkiYpkyrhY^FN>F^MFSVVQPRWTg^MZLRRPEFG><49=9<7;0<<799:6=F5860<B;<9=FQG=.5<;@=@>59GA82*/1<I:/01.*/(-4583%&2115>1<8Xt15Rk[O[L[g_=K1T]7/(§«ª¨ª¾Ã®²¹¼·Á¿ª¤·±ª¬¦³µ¯¯³·«©¥²¥¶´¬µ¶µ¥¦©³²²¨¯ª¡²© ¤¥¢¥±¸¦¨¨·¾¦¦©©¬§¥¡¡¨¤§£¤¥ª¢¤¦§¡·¥££®ª¤±¥¯ ¡zÔ¨ÀÆxw±¥·dÀ¿yy|Êq¼Å{r¶§º{l±«±yilX±®ofj¼¼ngymqØ}Rjb¶²|~pu¡ªVNWaOVMFV\XPPS\W[PA\DPNDFI<<57=;:9:.=;878;9>F6:74>@>69?ERI:.5>;B<?A8:J>52*22AE/.32.+/)-/186- /416A1=:Ww11Tk\O[M]g\>L1YZ41!§¨ª¥²ª°Â½²µÀµ·¿Â«¦´®©¨¯´ª°¶´¨¨¦¶¦¨¹¯²²¶ª¥¤§²¯®±§«§¥²¥¢¢ ¢¡²¯¤¡µº£ª¨ ¬¤¡£© © ¨¨§¢§£¡°££
¯kjªh
fr ©q®¡¤wº|k v±_j´[¥e`fzfixkªe¾sg¦v±j|±xucmm§n\ EigEu_}f{£¦X^«g|w{j¨8J¯[XTlcZKOY`\VV;NPWV0ISSJCEF=?46?;8:90=8999:=<D8;:6=A@6<@HQG907<AC>@D8@G=13-33E3/.53/+/(.0.:6/'$203B/=;Uv2-Vj\OYL_gY:N5]W31£§¥£¥«²¸´½¾°·Å²¸ºÃ§©°¬°©ª±¯¤±»±¥¥¯³£ª¹©³³±£¤ ª°¬¯§¨ ££±¤°©£ µ³¡«¡¬¬ £©¥ ¡§¤¢¡ ¬¦¦ ¡µµy©¶x´·¬k¦{
w«gj±[¬{tpx
°vwrkkm|O¥XHdd~ch¦_xqtR]O©mboz
a/S¢n[Tkg`LK]dX\ZB>°wWXA#MiEBDA@A19>88:84;:9<9:A:E::;6:CB8=?KNH:5:AFBAAD<FD;0201;E,0.940,.(/3,>831/2-D1<<S}n3+Xj\OXM_fW7K9`T50 ´§§¡©¨³¬ª»·Â°¼Â¹¶Â«¯¯¨¯³ª¢°¼«¢¨¶£¬µ¤¥³´¨£¢¨ª²¨°¨¦ ° ¡±¥¥©¶¯¡¨©§© ¦©¤ £¥££«¦¢ Õ¹q±ÂÆ}Ö»}¨¤{¡¥y«yV¯{~j¹Z¹w}¦|{©y{±mu¼oP¯§ÅQ zc`ªasrk^Rµ´È
~|c¤4Cu]QihdP@XgYcaJHMjJZSOYfZCD?E?0<<59;74<<8=:<C:F:;>6:@C;6@OLH<:<DHCBCD<EF81211DB.00483+-).323971#%5*>3==Qwj6*Yi[J[P_fT7H:aP72%£²¨©¥³ª¥µ¨¤¼¸Á°ºÀ²·´½´¶§²±¤²´§ ¯¶©©»®£±²¡²´±¡¤¨©°©´©¦¬£® ©®±©£¬¢§¡§¡¢¢£¡¢¢¨ §¡§¡²nhµr¬p§r´vt¶{¦£~£}°uÒÒu\®|
¤nª¦k
}}{±sy³et
nfRÉZÂ\yb__vsa]YÊo¿~rMKµSUÆdUQjceXAOk_lhPUFH9=WR[WXHB?J<2?;5=<56>;7><=C;G9;@7;>D;.CRJG>?<IJFCED>II:1746@>/.24252-).26,742&60;5:=Pqh9'Wi\BMT_eP5G=aM62.£¦°¥©»¦´¥§¶»¼³»¾¸¸µ¼¼´¦µµ£³²£ ¬°¥¨»®¥²±´¸ª ¥¡ª¥²¨¬ª¥©¥«¢§«±¦¡¬¥¡¥§ ¦§¢£ ® £¥£
¬|x¨w£ªp
¨£¢~®³\r²S¯}£~q×}w
~w¯w´ael[°WKuyfa^vv
fj]¯vwk5yÈ®³`DUo]g`EPl_pmVUM.echRYQ;AC@L:5?91><16?98@=:C:G;<?:>>E9-EUJE@C:MKJBHG>GK97<46:>/04333.2..18*.32%!04767=Pke>&Vg\@<U_cN6GB`I:77 ¡·±³Á¨²§ª³º·µ¹¾º¸³·¾¶¦¸µ¡¶® ©¬©¶«©²²«´¤© ¨¢µ§¦ª¤¥¡¥¨¨°¥ ¨¢¢©¥¡¦©¤ ¡¢ §©~¦y¡ªp§¡££ªzyp±Z¨ xtØvt¨¤|{²^d }n]«\[hgªcrzjq]«Z kmdOJC¡\[Mt]bfMZa_rt`JU5JXHE=GEAL35A8.;>05A78@<6=<F?:<6?=B7.HVJE@H6KIN@IK@EN::@4.;>102154+*05/7,&21($%6671<OedA&Uf[?0T_bL7FH_C1=7¢¿³Â®«¬¨§µ±¸±µ¾º»³²¹¼ª»¶¡²¥¦¨¨¬±©°«·ª¯¡¢ ¦¥¤¹££¬¡£ ¢¡ª°°¦§¦¤§«¨©¨ ¡¤®£ ¡¡ ¡¬®nr´t©w¦t´zu´§¤¤u¸o{¢kk¶Z¡eh ¢§mr´t³jju´af¢ok]`N¡|Rs£ly~}no\¯V<weTon.[§OcRkeblZb\`q|cSYQ>?lo2BB@>M:!7@6.;@37C58??3;<CDBJFMIF62JTKEBJ6IJP?HOCFP=<E50;;010/75,+,326/#00,,289/9N`eD'UdY>.U^bL5FM^81A8¥º¤±À®««¨·ª¸¯µÀµ½²±»¸¬Â·ª¬¡§¤¢¬«¨¶¤´¨®ª¡¨ ¥«¸£¦£¡ ¬¶°¦¬©¦¥£«³¤ ¨¬°¡¢¡ ©«Ô»u±ÄÄ~Ö¸y§y¢¶u}wvÁ²aºyÀ|u¸bµ©}¬©q{u¼§ ia¦¯¢~u«}¾ns¼t²uxmpm¤t½]w}[ay¼jZV\jz^iacfbnyoX[YCA@q?CG+4H"';?10<?7:B99=C4<@NZ^``___ZPPRKEFJ4HLR@JNEFOB<E84=9020.87-*./180"-1,3,;:08LXaF'TcX</S]`K5<L[-6?9§¢¼£°Ã¯©«±¨¹¯·Ä±»³¯¼°®Â²¦£¥¢«¥ª³¥µ§¤ «§¬¸£®¡¦ £°¹±«£§§¥¤¡¨¬ ©¤²¢¤¦¡¡£° ª
¶¸y¶wnlotoyrÀ»¼{²¨pt¹|{}¤»¹½uy³£tuut°ufj¶tsqw¶^y|gylzb¬pt
~W[§iDdZTf_c]bPgfqnuBMOLD;ZL>J2;0 8>;.3=A99?=;<C6BTYZZ[[Z[^`b`]SGGH4DITAKNGEOF?G<7?7070/9:.,/-*8/%&2(4$(>7/7KT_G'SbW8*O]]=+;VV'=:<¦¡¡¿¦²Â³¬ª¨«ª»¯°Æ¯µ´°¸§µ¹®«¤¢§ ¥®«§¶¨¨¡¤¬¤½§¡ª¢¢¨¢²µ¶¬££¢¦¥«©¥¦¡ª¦¦¢¨¡¬¢°©§¢kjªztv{f{½¾Àºoq
_rjZ^acl`cmvblf^`cqhr|fj~qtx~c\xuhP\n||jXlzqHJo
pNqMDV\faL[Wfc^O[mukrRODDM<HH<L?1,2A?8/5?C<9;@;=C>RVVWYZ[[\]`aaa`\UG5CFTEJOHFPIIH;8=51:.1;:./-76=5&"/*2,%;8-7IR^I'S_V4)P^L(3>\O'?2>¨©¢Á¤³¹¶£¬¦¯¦¨¶²¬È¬°´¶¤¾²³§¡¤ª£¬§®¤¥¶ª¥¢§©¾¨©¥ ¦©¨°²¾«¦§¢©¨¤¬ ££§¬¢©¡®¦ ±¥¢¨¥¦¨¤ho~qw´ª
¡z¤
kj|}urwyvv|jsttcv}vkoxl_b[ogMXYfj_WYozonfSOFR9PZNRO'*;KB635=@A9:C><ENSSTVWXZZ\]`bba_^^[TKCRGKNDGPLOI<:;489,2;820)6IRO8")+/2#4;*7FO[I'R^T10T^:+=8]K,<-@² ³¢¿¢£°±· ª¦³§¥°µªÈ«³§¶¦Á¨µ¡¥¦¥¡¬§¤¤·¬ ¡ª¥Á¬¤££¨¨¨²Â¯ªª©ª¡¡¢¥¯¦¡£§¬¥¡°¡¢§¢¤¤ ¢®|©¨
{
£~e¡³®
w{~xyzofykuyqhsyujsbwe_hecdfjYk{qjj\RKPD_UF@>>,4@F;45;>A;<?>>HNNOPSTVVXZ\_aca_^^]^]XVJKLBIOMRJ;<:786/3964.(&$-1..)+*7%+<(6CMLD/T\Q05M[17E4\G5<,@²¹¯¾«±² ª¦²£¬³°Å°«®¤³¯¼¥µ¡¨£¡©§ª¦¥¦³¶°¦®¾¡¬¢¡©©«£´Ç³©£ª§¨ ¤¬ª®¨¤¢ª¡« ¥°¤©¦ªf
}eczmhjz£«je~g
eeihz¢kh¢wkj£slmzyXe]^lw\htwwoxxrmxsvzhX]jtd]shj|qmc]QMWJdX@I3=F8?FD71<=?AC;;DGHHILNORRTW[^`aa`]]]]]_^ZTODHOKSN=>==6535554*&&%,*%.++'6*$;'/BI[J.6ZO6)EY/DO1YB;?.=¤º¼¹¯«²°«¥¨¯±§®®°½±ª©¥®°± ¡¤¢¦¬¤¦¨ª´®¤£°¦·¹¥®£¢ ¦{¤«¢¨´Ã·¤¡¦®££¤ª© ª¯©©¢©¦¥§ ¬¡¥±¥¬£§ ¬½t´s
hw¹Ä¸q¡£z¦t«}ËÀÀºq£}À½ÁÁ|zÂÀ}j¥²poÊzxwyyp{pxxluae^xd_eb]thmdbXLUIQYHOD2IE?DB>/<?>@A:8DCBCEHIKMNPSVY^_`a_^^^^___^\SMPGUNA??=6468266*&%#)*&.+*)109*#>I[L*#CP/#F[3PY/UAB;/8¡¹Ã´¯¯¿©©£°ª°¯®¦²µ¯ª§§¦±« «£ ª§£¬£¥©¥¥´¤£¦®¬¸´§¯¢¦ ¡ ¦«¤«¿¿° ¨®¨¢¢¤ª¤¡¡¬®¨ª¥¢¢¤£¤©¤¨®ª«®£§£¤Îz{¥z_]¨¡¡|§u«¯^dª{¨
t³c« ³j¯t|¸aY£Ínv{Û{q~ve{uvk}m}~k^pjpg`_xd[qhjce`RTSW^JOC4AHED8>5;@?A;=8@>??BDDFIJLNPROS\___^]]_``_^^[WOUJ=?><5578164('$!',&&/(&+360$7;SL+,-J0';\:L-!P@F4.1¬ÁÀÀ´´°·¤ª©µ«¦²¬¬¬¥¦°ª¡§¦¢¯¡¨§£¦¡±¬¦®±«¨¬ ¥¥¨¤£ª°¨¿Å²§©±¢¡ªª¡®¦©§¦¥¢ ª¬³¥¢«ª¤¨§£²¢©¢¡rv¨q°|q¬} ¥x«~r¬v{|ª¢}«zzVÄ{pÁ}mupmfwenaxnrnlcnsuo`fmd_oijnfcXS\`ZRRC8IH@C<><@FDCEA=<<<>@@ABEFGE@CISWYZ\]^^\^_a_^^][ZRC>;92478452&# 1' 1''45-&7=WJ-=(>1)3V@F!G;C1.+¯ÓÆÇ²³ £££¢®¯·¯©±§¨ª©®«¬§¢¤£¦« ¢¦ ¨¨£°¬¨§¯¨§©¤¢¡®§£®¬¢¬µ©¹Ì±¬¦«¢®¬¡©±§¨¨ª¦£¡ª®±¢¨«¯¦§¬««³¤¥§
¤k¤uz©u{²q¥q ¤_aR«
®u®¨z{f£¤£}©®^{¨U¢{£|İÅs¯´³¹rb©¯Âthkmlxwwnkfedqqf|ic]V_iXXTLLPLCCAB;C@@BI<=:9:<=>>?A=86;DLPRTVX[^^]\^aa`_^]\][SIB679:664,&$" ''!+-"$.!3-&@DWH,G+66*1PKL# A9D4,'ÁÉÖÖÀ «¨¡¯¢±´°¯©¬£§§«««©¥¦ ¥¦§¦¤¬¢¬¡¤ ¯£ª¤µ°¯¡©§¤¢¨¦°¥¢¨±¬¶Ç±´©«©¡ ¥³¡§ªª¢¬ª¦ ¡©¡²¡©²²¡«ª±°¸¦¦ª}ªmv«y|°n¤Ò¸´¸É²_`©¥ zyªÉt£¨©~ÆÆwe¡¥t }¯_oµc±uK£m§Gdzn|nyt|zm[fjrqgi^aWcm\^YILLJEDBB=A<A?J;79799:;;;3.6<AFILMOQSWZ[[[]^_^_`^\\\\\XMB75785/)(%&%$&),5FNPPMFLJVF*L1/=-4OTQ;<F2,$§¤Àǹ©²®¥£³¹¬«¡¥¨¦«¬©¦ ¦¥«£¯¬¦¡©¥§µ ¤¨«¶³¬¦ ¦§£ ª¦ £§©°³Á±²©¬§¥¢¤¯¦¢¥¥©«¥¤«£¶« ±¸°°¨µµ¶§ª¦¡Nw{£|¤¦¸|}z¹ÍÆÃ¶x¢~v¤¤¨~¯
¬}a¥l£q
}r¬`¤sqa¼}RUu¡z{rys
p[lnwsjnZd^gnbd]KKQSAGGFH::K>B108856877-*5==?BDGILNPTWYYZ[\__^]__\ZZZYUSOH@772.,*.+*'&?QTVWWWYXXWUOTF<E2:P[S6?G,- ©«¤«¹«¯ ¡³´¦¡¥¯®®©§¥¥¤§¡³®¢©§³ ©¤£µ££¡©µ¹¤££¢²¦¥ ¢¯¬¤¨¢µ±Ã°©¬©§£¤¥¥£¨¬¡«¢¤®¤º¬¡¶¶®¶´º³¶© ²¤¦ ҵ÷z¦w¢w¡
¥r«´nsj¤}s®¥£¦mp²\¥szl{~n©a¢rs~bs²¸hw£{u{xlhwhxsnt]dcmmfh`JYWW<GF?S3@F><*(63.013)&4:;<=>@CEIKNPRTVWWY]__^^``]Z[ZXURRQF:2230/++(@QRTUTSTVWWXXWUUVUQOQ[U%!2AH#*%r¿¿¼»µ¨¤®¶¢¢£ª¨®©«¥¢¦ µ¦¢©§±¤«£¤¤ª´´¤¥©¯ ¦£§³ ª£µªÂ¯¨ª¨¡¢¡¦£¦£¥©¦« £¬¦¼¬½°£±µ»·©«µ§«|¨}|°x¤¥m±o |¢¨¬¡¨¡£{~««w z¯]£}¦§e|uj®]¥lr]`[ m£xyjl~b}tmy`heoohghBX_Z=JS2S8AAC7$$3+''3, /667436:@CFIKMNQSSSVZ]_a`aaa^][ZWSPONI8152.*,ATVVVUTUUUUTTUTSSVWWXVUUQHFIJ#((¼©ÆÃ·Á´ ®¹¦££¤ ¯®©£¹ £«¡°ª®¡ª©¥±§ ¨¢¡¥¡¤¨¥¶¨¾®¤©£ ¦¤£¢§ªª ¢§§¼¤Â¬«£¢´»°©£¶²¬®w¯
|ºd°d®}¡§
°¨¤¢£
\lk³`|{²lgn±Z}µ\¤kÈ¢f{»YvµZ²}S¯z¬X¡m¥yw}cs|bwt|ajfonfefOTb[AS]=H(>9=4!!,$1. *1/04579:<ACFHJLNPPRTWZ^`_`ab^_\[XUPMJGC553./@UYXWXWWXWWXWVWWWWXWWXYZZ[\XWWGB;Ò³±·¾»´Â³£§¥·© ²±¨¢µ ³¨ª«°¬¯©£®¬©§£¨®©¡¤£¢¥¢¨±¨»®¤¨|¡ ¨§¬¤£¤¢£¨ºÆ§¦©¡¬¶·®±ª¡¿±°°ª£®¤¸Ãº
¨¬¯©¦«Õ½Âªb¤¿½}£×»¸µ½¾k£p«oz²±Çk«±½¬yx¢¾»t£wyb|ydfx{`kejjbPb[Ri\?S`BL)<:4/$%2 $(0496678;>ADFGJKMNNQTW]a\__a^`[\YTQMHC><A?5=SYYXYYZYZZYXWWXYZZYYXY[[]]\ZVXTWZ»´´²Àº²¾³¢®§¥³§¥¿©¶¯§¡¿¦¦±±¹¨®¯¥§¯¬®¦£¬¡¥ª £¦¦ ¨¢ ¬¬©¸§£{§©¨§¨¦ ¡ªº¨Å£¡°¤¬´µ¬²¬£¿«³²uvª¤¶
epg¬nnw¥¡v²qr«¤¯¥rmmmfxomqzjqigrii
gqd^cjpZ]g~x¦`brpfdztdwgjx~ydlcelbJdWIjY9OcDO'J9+# ",)-2.5:457:<?ABDEHKLMOQSV\W[\``a]][TPLHD=:AB7MXYZYYZYXXYXWWVWY]^^]\\\]^]^][[UW^¨´©ºº²³«©¢®£³ª½±ÃǼ´©¿«¬£ §« º£¤®¬¦ª
¦«¢¤¤ ¥¦©¢© ¥¥¦®¹ª«{¦¦¦¡®¥¡«¸°Á¨¥´§±³¬°®ª¼§²¼£©¥µ¢©ª´¤®¢µ¥¤ £¤¤¦¢¬§
¤
huwuq§m}
phvowu|yikecocUaX?hZGb_NW+E=+&!640. %2(*799469;>?ABDFJKKMPPQWTVY^`ab]^UPKEC>9=@ASX[\YWXXXXXYXXZZ[\^__`^^^__```_YY`¥©ª¤µ¸®¯¢°¥® ·±ªÄ¼Ã¹¶©¡¤¥°¨¤·§©µ§¨¬£§¤¡¨¤¨¨¥ £§ ´¹§ª{¡¤§³¢¥ª¶§®Á¯¤¸§°°²¯¬¶¾¤³Á§¥¦´¢¦© ¢±¢¥³«³¦£§¬ ¢« fvwztj}
zqryq{~jnd^pi`\_XlbO_cOX9FFD=2<=7.*%+)&&416658:==?AACHJGJKLMSSSUZ`aiaeUPJACB;9EMV[^^[Z\[[[\]]_^]^_`aabaaa`bbbdb\[c¤¨£°´¬¯£ª§® §µª£²¹ª«¡¢z¡°¤¦±©¸¦£©¢¯¤© ¡®ª§§¨¸µ£¥y¡¦¶¢~®´¢°¯u¤¿¤³ y{£µÀx°¦¡ª~d\bv¤~mµ¥©±¦f ¢u{qªm¤©e¥
ylvr|ai[vfhqxdwwhnykpe`vokkh[dcaamQY=MMMRF=?SB90/&4:306678<;>@ABFHBGFIKLTUUY]_gggWQI<DH<9VR[`ab`^__`aa_\]___aabcdabaaedchd^]f¦£¡°±¬«ª¦©®£§¥ª´®°¥©¥ªs¯ ¨«§¹ ¤~¬¤¨¢
u®¥¨£¸³§tw¤°µ´½§¢~§£{¥²»©
±ª¯£y¬£©«ªw¥{§{³{ by
nrzrtxht t{~ijx{qpgexmilj[cihdqZ[HSKP@E5-YST6)!09=>743568;:=>>?DI@IEJKGSX[X[aaifYQH9EL<?bV^bded`aa`bb_]`aabbbcfgcba`edcgcaah¤ ¦®®«¨ ©±¦§ª¥¬Ä¼¯ ¥§³¬§¢ ¾¡}¬£¡¡¨¡£
¸±¨
pu¢ª´´®Ê«¯·
°³³©ª{¨r{w¦h¤y´¡ ¨ªÂ«¡r¥~²¡}¡}
nt{s}
uÅf©¢iogwt|wgivpghk^bnlfjWdF\QL2E46M`c7&3<EGD:63658;8>==>BL?NIJLCQZ]\Wb^jl[QE=KM@JdX]cfhgbbbbcc__babcccdiicbbbecafcbbi¢ °©©¨¦¬ ¥¹±©«¦¡¤©¡£¨µ¡¯ §¥½ y«¢
w £
¡¸¥~bm ¦}¡§ ® ¡®³¤¬}¢uk«uM«xª©ª«
¢|{§jlg·~n`cX|dgs~zl]}oaTr]`mz`Ye~
r¨ªk£nr¥ogdlZl{eY_~aWPpveotqjjo]ioljgWfM\WE8A4FC^k4+ICQMN=84859;6@;;>BO>QRKMBJ\]_W^^cu_MD:MONTb\\ffiibbdbddbab`bdcabjkdbddgdbgeach¡¹¡ª¤¦¬¢¶¼ª®¢ ¥««´¡§ ¡§´u¦~
¬¤¨¤¯¦¢in¡¡££¡ w§£©¬±¥z|¢pr{ymª~¢tw¦g~w¥_{}s¢n·´ºt¶¨dŹ|q¶r¤du¬«a~j³~n~q£kr£r|£^³p|³tr[²jbqtuqhoXjkqpd[g\aKC=D6QAYq2<SG_JR=<395:96C<;@IP?TNNQ@E_^[YW``{dIC7LWUVcaZffkkbbeadc`ab`dd_`cknccddhdbgfchh¤¹« ¥¸µ¬ ¡¢£¤¬±¬«¡¡¥¬x
q¡}¨ ¢¨§¤~jz~}w¢ r¡©¨«®®~z y£xs}¨£d¡~mho{§}rht«sªg]
w
hªj¹f\©pa_§vwhu}lj¦\¨~w»j}©Z]³g[nrxwki[piwwa^dVaAPDN7UBQm4JZZ^NZD@151<;7H?:CHU?YSX]>Db]V`Qad|iFB9N[]YefXffnmbbe_aa__``ec^bdoq_deekecihgkiª¶¨c¬»±¯«¥§¬°§«£¢ ¤irzz¤¨¢i
yz}¡¡rh p©¡¥ª£«°®¤¢¸v£³¢£xz©¢r }°µ}l¡x~µ££«¨|}tªZ]o{ycM{{ezBMY¢js}ovy±³}¦s}mp|ori£]vHec_tq|}ne_kguzbc_P]W\SV@YEPgDRV\aX^ID=B8?B:IE7LEXAWR[VEFb\Z`K`m}qEC<V^bZejVghmobff^a`\]^`hb_ecvl^egfldelhili°®S_¡§´º²²¨¢©§ «£ ¨ w
nx}r¡r¨|l
q¡wz¢¢}µ{¦z©¤¡§ixn~s sq|
o¬{£§¤p_©hv£dp¦aÓ|{xrsc¢~¢r£vk³`u«³¨¼wo¿¦ª´^orpt£r^¤gt¦`h¦kÓynvykyvrl©¥g_eyqlhfcmuvf_aQZePQaHVIT_WS[ej[ePECKLIKBKE8P@QNXSXOSQ`ediSdxywJGEd]eZhiSihjncjf`c_\]]_hbahe|d^dgdkdjlghmh°¬T]K~ª¯±´°²¢¦ ¢¤§©
{p}h|wpk|£¨
yvnw
x ¢³¡¢¶z¬§¤®¥q©~¥£q¢¯¤¯£wµ¶¶Ê¢t`©my u¡w ~oMf£qt¥{zubn~ mrd`stk{j´¶´Æ¦s}yj«slswiytqPD}³^ivkxfkfbstolU[RYhOQgIULXRU\gknUgWMJAIMKHJNAQJPecjmeussy{ntz{UQNm^h[kiRjhilgmfce_\\\_ibdhk{_]dgcjfnleime¢¯§
e@¢²«¯¯µ¡¢§¡¡£¤¦¦ykye yuj
z¥¨z}yp
y~¤¦fnxl¢d|r¥xph§}¥{¢rv¹n¢b}£ntk«ku np§ajiu¢~`uobh¡fjuqegos¢[_[d¡n^q|trd¥nx¢cf§gqm¡oRn ^d§T]TmmskqmphkwsjnQVUUeXRlIXO[HWhhsjYkVPREV\LXRaUhj^wu{|p}|r{sww^QsagbpgPkhhklohdg_]]]`jbjivu]\chcjirlfkmc¦¦{etm§®¥©°±¥©£¡¡¢¢{qh|su}|e|¦¡ª}si¦}
¨¥¦x~¥²¯¥z{©u¨n¥¢¼m|¥¯
£~¦|s¨¡ip¬cx¨mª£vw«¦k±lw³©loo b«ªx§w}
¤ gt«f¶sv¾¤Y¦«avrto{upbj~nglRTXT``\jL\Q[H]lmv_[qX[_Zgsenoqcqt`wz~yrys~{{vbydcnsdRlggomrifia_^\ajbllzo\\bibmiwmglob¦ª¥ªª§§£©¢¤¨
t
zo~turn
|{
¤¤¤unl¨©¢t~y¯¤qy{s©q}}z
x{}}w¡£
|m\zys{qin~rtqf_xwtvpzopn
_wixgªt}io}u{tllfsx{w[kWyinwrrowxo\k
nifVY^V\ejcU`T]P^owykjvdijju{pqtsaotbt{xuzuy
~{nmdyn^Wnhhukxjijd\`ZcielqunZ[bkdlkymhlo`¹©§¡£¦¤¤«¡©¦¨~r||~{tsp|}
x~£{¦wqª
¦ «~¨¨yq
|p¬q~qjp}gm]¡tsulwtYro~j]id{
`iy||w
jzlbqsw`t¨glvmvmcecyzZ\ignv[{ywunsrf[lkkbYX\YXkq[^_Y]\er}ztotbjji{{qzvtdmthm{~uz}{yzo{}szshT\rilvouglgd]aYjhkjqrmW[emlgryohjm`«±¢£¡¨¡ }«¢¥{
|q}vros~z¥wy¬
©¡¢££«¢¨¨¢~zª²¦°§¢
l}wxf}
x|{u¤ wqu
y§y
tj|yirhasq~{wwpwt]]nhn_^YZ\SgqUc[Z`kgt{{rnocjjh~{lx~phookf{rw}{m
|zy|}zyOdwksnpzelebb`[sfpfrqmU]ltmhxzpgike»£¡¤ z~©
}x{mxr~mk~z~|©r
|{©
¥¢¦ ¦y~§|}ª¡¨¡pyruaw
nzvu¤v~~ts|
|z
¨s
ymj}{mhklg^yg}{vuvu{w\_p}mt`cZ[^PflSdZ]`jhty~pllckjgkrkktnwmynv}
vq~{{}{`i|kuhiejc`i\cugobumlTbqyeoyzrejmm¸¢¤zw¤¤yz|m{~wr
}}kh}|~
|¦p ¡
|¨w£ ¡¢¢¤{£~|¤ ¥uuqwa~s}qhxrzt~s{||{¦{
s~
xdpzwypljf^}sh|uvt|sj^`twpwdcX]^RigTdX^`giuxpfkclgejm}gmpj|wzkr~uv|{}jrntibilb_qVtolm`xhmWjsvctzzqbkoy³¥¦
¡|u¢¡x|~~pzsu
~wgc}x}y}o
¥¦u¡¡z¥{
z s£ }wr~n{d}qkfvp}y~~}sy{¤vsxs^vw}r}vfle`ijwstu}q|cdasourmaY_]ZjcRbW__gjtxpbjbkfh|khthloh|yl
qt|~z~|muttmfljbcuVipn`xglajvpfx{yq_ql
¯§©
|v§yy|}}{xsxys}d^}
t}~~£ ~q{¦ s§um|o¢}{qzkvm|n
xp~esj}u{wz~
¥y
t{~qr~k`ytyp{nance{bnovsxwttaw`olunp]Z^]]i]O\Wb`glrzj_idichwmflhilg|zwns
}tz}z}|ryyxnlkh_irbhqoevgmlazhj|{xpawm«¡¥©|v¬|w~{||vxosszo
|~|`[~rzz¤||¤n¢¡ph{
p¡}|usukqnu}uort|~gsnz~vu{q~«{|~v|nl}afwstnza^oakt^pjzyymtqez^nlsmsYY]_`iZOVWdbepp~e]ihfbgpnchhehgzwto
s|v
x
|xzw|{syjj_phtkqomqgoke{amywplww££¨¡§t¨¡t|v
xxrsz
lqoxlvnq[Y~vu w~
m¡l¦
h
x~}}
pvplnop|jsrxuzhupw}{|xvr}|
¥|v~wwkh~~[qrqoowZ^papk^oj|zqnmjmw`pokqnYX```lWPRYeeatoa]kldbfkn`ff_fjuqrotyvyxv
{{wjpc|b
|opltjhnlww_q~y{tus~¥§
~t
zrxtprtqulnltlv}mnUQ«xvry wz£
}r
ii£qw{{}~lwjollm{bz~w{x}zivmv}s{ry||
}|w|vogi~v]vnmkprU]nbra_mnyphpfgtviqlawf]Ue`_qSPM[ec\wo{^\hpabefj_gd[go}olqs}v|uvy|xs
~|zxgqj`~ook{`imtt^s|xxts
|y¡±¥~wtwspotpqojiumn||mtsRNßÉÖ|otuv{r
¡
}x{{win¦cpz|{}m|esokm{z[z{~{ziukt~mp~
|}wxwqkdn|igsngislS^oepY_lqwgkkbgytppd`xa`Uk_]tOMK_eb[wps\[du`beec`fbXissmkqv|syvw~szr}~vesn|e~nokYlnyzr`vz{vrvvy¯ x~{
uwpyqopmm~rcdwp|my|jhlc¤ÁÜ®ï¢slvu¡np
¡
{vx
wwp§^l|~wl}dxujoztX{{zgtjmwp|utxtrpdrv_rloahtfR`qgkU_nsyarc`i~qsn[csacVnZ[vLLKbe`]urm[\dx^`de_cc^Xirknkrw}svxx|q
}}{t
shuqymznspWqzvyqdvyhvq¨£}pwx|
|swpsjoljl|t^`wv{ptzg`e|ëÚµÉÃÜsltvhp
{zwxrvq
¥ a
h}~
rrwhvriuwlZ}~wbumpmz}nqy
tjoiou~]rhm\it_RdqifS_qvt`p`]hqsjWgidiWmW[sKIKde]aqr
i[\ex]^dgz`d_]Yknenjsw~ss~{vzs
|vv
|vlwvyxtnwz|Xyqngxvdv
p¡¢snrv}|yrsnodr~iflww[_xzzqqiagaÕ¶¦xnqw{p
i
zh{{~
zu{|qv
y ¢¡af}n~ulmwutxvkc}
p`tr}}{r
g{
}
nox~tlmhixz`giiXkuYRiribQbrxmbe^Zjntb\h`em^nTZmMGNec[fmpkY[br_\clvde]]Zllbljsvqo|}txx
}ux|woxyzomzv^tlhzssgr|q uu~mu}}v~wroljat|gbiuyZ`w{ymp~edhhW_rs¼Äuq}qri{{|zuvw~ru
sw f}
q}f~|y~j~
vfpyxtxtljy
l_sy{~|sjz
y
~~nmz|usmfe{tb[pbWnqSSnshaNguxf`^]YootZfb^kn`pPYjQDRf`Yjml{nY[]lbZbovdg\]`kickjsvpn~|tuz}
v}xurxy~oozqixz~ml{ukjwsl
n}uiw~zo{tqkjd`szh_eqzZar|ygpyaed±²wKbZ¥ÙÐqzw|
nk
zy{wwoqu~{jy
¥p
x|
p{}mvh
yr
}f~
vdqsiyppu}wyzk\rs~|snrt{
ynn}~uycfh{o^XvZWplNWqsg`Klwta^\[Zu~spXg^gjq`oNWgQ>Xe]YnjgypZZXjeYcpx_g\^elgfkiqwnl~up{vqq{|zyujy~ko~t|or{zoo~xg¡
fogy}~|hxskkf_`oxm_box\dkz`qu_eeÔê½2:>qy
u~~mku}{wmuwn
lu{ufy¦~nvy} {xkqh~yn||xbz
rerinurutvtp[nuy|~y{rm
tzunjvts[ggunWV|SYodKZrre[Iqxo\[[Y]utiZb[hfocjMWeP=]e\\ue`toZXTncYdqyZh]`gmgikipw}liyn|}zupnx~{{hz}js{rzsv}~yx}|kl}jh~z}~~}kuqghb[bfrn_aks`hpybss^cd n]6Z¯µti|u
svoktyx|y~rfu~~oqivynfy¤ox
|q{}{h~lj{zj{ws`xresgvnu|}pxz|umXpwuxv|ytos~|onimtm[edqoPZzN[o[N[rodUKsxiWYZZaqua^]`gdiifNYgM@`c[`u`]ulWWSt`ZdorWj]bhkgmlhpw|kh}|o~~|zwq|orx{j}{mvxvv|x~}zm£{uxjlx}z~prpcf^Yf_po_`gofjntato[adjuz¿¦¤È¸q
r{w
srrozsttwxypbvzirwgwucj|~su|{{kxy~tgzhkysizw~h`x~lkth|iv|q|w|tbVx~st
}ryyrq
z~wwjqhlqo\f`qlIduK]mUSYsnbQOtxaRXX]aps\b\ieedkdQ[pICc`[co]]xgTVUv^[enhVk]`jgennhpwzmiy}r{~y|v}owrnw~p|wxztxzuo~}
yw
zgt
y~{
wgpn_d\XdYlra``plkhn`shY^cnw©Ú©Ç²qwotz
ytss}voqms
xtk`yyfrphun[m}x~y|oxw
|
mtu~lfvdm{vnkww}acyzivvc~|hu}vwq{}nZWupv
zmuylv
}~z}t~thtenlrYh]sdFmmKZaWVUxmbPRtvXPVX^`ro]acmed^ocT\qFBe^]eg][zbQU[t[Zgk`Vj^`offkqhpvxtkuvx~w{t}ortqu~
{wx{|
w|}}{~ruy yvtx^}
x
t
x{bnl[b[[`Visb`[gnofraqeW\bk|Êι¡jmmkqq{~zyxsxtt{jlubuvnf_}zerkjqcXlzrw}ps
t{y~qpo|dgpamxqkmqx~~z]f{xjvyfwht~sko~yo}^Ytmt|oprwixxs{u}{sgrankpVi\v[GmjMVU]SU{kaOTurPQTW^cu
i]`ljfcZoaXboGAg\`e^\V{]NUdoYZjh]Wg`_rfjhrgpswxntzw~zur
pp|xvvz
z{t}}~~}~|yuxw~|muxcso
{ucnjY_Z\]Tgsd`XdqrgrbkdVZ_jx¾®{¶masgszqx
z}~wwruo{vejn`usia^~yyfqhkkZVow¢przw
p
v
}ytrohx_il`mvkhkkyx{w[g~}yfs~m
ueuqhk{unvc]r~lu}{gv~oriwzt~m{|{xqflam}klUi_vUJijNRNgLX|haNUukLPTU_gvg^aqhgbXi]\kgJDjYbcVYUyYMVmiY]kd\Ydb^tfldqgrpuwpv~w}
}usnsy{ztsy~u~|{~{w|wwziv|{lrqpflfW][\ZSdpd^WbruiuoeebW[[hporsddy|hsusrwxvrumjzqagkfsmf]_}p{imxgjdUWro¥|{vt}t~}p~y~}upqlgt[kg^ltdhfizo|rZhwuiqxwbw|pkn{rgtfao{gsx|~cwwklrv|r|{uhywodfbm
{ljUhaoRJhiOKNoG^zfaMUtdJOSWakwf]gtif`WdWbp\KKjWcaUTUrVKXudY^k`[Zcd_vfmbpitorutwwz}u~
mrt|zuq
zvs|
}}z~w{£¥y
kt{zuynsy}vojheV][ZYSbnd[Xas{jhli`bX^Ziikpgl`gywirssly~{utmzgiyj_enhvfeXbwj{ojpgf]TXog§vz|zvqqux|{vvjruggn[ld]mr_hajyh|m[nsukp~zxaw
ytrqzscrj]pxert|yctqgjzusmzyvye|ywqddcm{|jjTgaeSJkfOGQjEaxfaMSr]JNUYelx{f_nqjd]VaUnnVJSgWe]XMUkTI[x^[_k]]Zbe_yhlaoovnpxuz~wyzyz~qttzwt}|kr{
~}~{w«zjryu~tnn}sjomddY_ZYYTbjg[Z_ui^ml\aW[[keqt}ii\jvtfsvqkz}|xurlyfiwf]drgywbbTeph
xxgijaWVYgb§o~w{qri{q}ys
~ndvrdgg\ja]oo[h_mue{h^uorkr|~uvbu{ysvvbqn[rtcqr
|uesmam{qkj|{vsgw{zvqebdmr}ijSg]\TKqaPFV`GcvfaKSoXKMXXhkv{eenqgdZX]XweTJ\bWgWYHWdOGaxZ]_l[^\ac^~ij`otxmpovzr|}vvx|suuy{z|~
isz~~
z{}sq{{|eqys|zurn
l{~lzcpobe]eVYYVcfk_]\s
hXpnZ^XZ[kzbpwvlaYlrrftuokw~xvmnsdhte[gteuvy^\Rfgkt~bdj\TW]ab¤ixsynq|jzo~wty}yidvm`f_^i_]tkYf]oocze\x}loopxytues|xps~tcxe\qqbqr|tgse_nwjeh{}uopvt}srb_fmn|dhSfWXSMv^PIYWHbtcaISlSJNZWjlr|dmmscaZZ[aw\SKc]WhSVFX_MFiuX^`l[[^ab]ihanxympkvym~vtttqvux}}~~~pw}yxz}ttp zz~wctxrwtkto~kx|ps^po`gblTZZWhcmf\\qeSqn[ZXW_kvdiuji^Ylrokssrh|~{vnmkdipc[krdtvsZVTearr]bc]SY`[ceqq
ull{opr}~sxt{zzdeug]bY`g[^vhWb]piaxa\|vjkroxtsuiq
wtkr~ogxX]lncrsztgp~\`qscaksmnvsrxkpa\ellz`fReTWQOuZPOXQHcsa`FUjQJQZVkkk}fnorb[ZXYlqWRPfVVhSTEY[NHqtX_clbX```]jcdmzxlpiuy{k}|y|nrnvz}t|tx
utqvp¡sy
zdvnnznfxpykrvsk^tnagekR][UgalkZ\qdOom\VWTfishbted\Xmtloutxj
|{vscdkn`\mmcsxkYTVcdx}}q]d_cTZ_Xbcmp
tki|pguyv~m{uvp{u_fsc[]VacXateU_`mdaq]]~phitqtquwkm
}rshpqtpT\gkfqtvscmwVcsl\`phgnx~sssjmaZdijw^eScTUPSlVPVSPGdr_`EWiOIXTWnie}ilxlbW]U[tdSRWhQXfTSGYYOMwuZ_ekiYa`]^nbfkyvnoiuvl}{krft{u}r|{ts~vn¤rvvly`d{pfysxlmrwgd{lbfghS_^Ug_ko[^nhMil`UVSnfskexed\Xoskqzwrkzvzykaelm^`njeqx~gYVX`lx|{p_c^gVX_Wcbkp}xllzn]xsn}kvtop|sXjn_Y\UabWdpbS_bibblZa~lfltvomwwli|nrgq~ntnd[aiiottr_imSereVdpd|esx}wkpmk`Yafgt\dU`URNWdQN[NOHdo\bFYiMJ_KYmd`yin~e`U_T]u\SR`fN\`URI[XPYtu]_ekhXb`Z^qcgjxqsnhvs{rz~|yntkst
y}|
sstxso~zz}~~}}~~~~~~~~~~}z{|~~}}~}~~~~~~~~~|z||}~}}~}}}~}~~~~~~|z|{}~|}~}|}~~}~~~~~ÎÚØØØØÚ]-0000-F¡¡¡¡¡¡ wegfffc¾»»»»½³mfgggge¡ £cggggfo
}}{{z}~||~}}}~}}~~~~~
Ûéççççê~S7¤¤¤¤¤¤£r]____[~ÈÄÄÄÄÆ»g^____]¥£¤¤¤§|\____^j|}z{z|}{|~}}}~}}~~~~
|yzz{|{}}}}|}}}}~~~
~}xxy|}|}}}||}}~}~~~
~|wvx{}|{}}||}}~~~~~
~{wvx{|||}}}}}}~~~~
}|vvx||{|}}|}}~~~~~~~
~wxz{zz||||}}~~~~~~~}xyzzz{}|{{}~~~~~~~|xzzy{||{||}~~~~~~{yyxz||z{{}}~~~~~~{xyxz|z{{|}}~~~~~~~~
zxyy|{zz{||}~~}~~}~
yzyx{{z{||{~~~}~~~~~~y{yz{{y{}|{~~~}~}~~~~~y{z|{z{}}{|~~~~}~~~x{{{zz|}||}~~}}~
xz{zzz{||}}~~~}}~~
|x{|yzz|||}}~~}}~~
zy}{{{z||||}~~}}~~
~yy}zzz{}{|}~~~~}}}~
}zy{zyz||{}~~~~~}~~~~~
|yyzyz{{{{}~~~~~~~}~
{xzzx{|{{|~~~~~~}}
{xyyxxzz|}}~~~~~}~
zyxxxyyy|}~~~~~}~~
yxwwwyzy{|}~~~~~~~~~~
~ywywwzyy|{}~~~~~~~~~~~~
~ywyvxyx{|{~~~~~~~~~~~~~~~
ywwvzyx{{{}~~~~~~~~~~~~~~
xvxxzxz|z|~~~~~~~~~~~~~}~
}wuwyzz{{z~~~~~~~~~~~~~}~
{vvwxzz{{{}~~~~~~~~~~~~~~zuvvx{{{zz}~~~~~~~~~~~}~~~~~xuwyz{{{z{}}}}~~~~}~~~~~vrwzz{{{|}~}}}~~~~~~~~~~
tswzz{{{|}}}~}~~~~~~~~~~~~stvz||z{}|}}~}~~~~~}~~~~}suv{||{|}}}~~}~~~~}~}~~~rtx|||{||}}~~~~~~}~~~~xrvy|}|z}|}}~~~~~~~ssvx}~|y}|}}~~~}~~
ty}zxurkeimolffggpsswy}~yz{|}}~~~~}~~{z~{}||}ysrrrruupmkjjigcda_[\]^XUWXYSKEIJJKLMOOK`ttwy}}xzy{||}~~~}~~~
{|yz{zspqqqmljglmgefefdcededeeeedddcaa^]\ZXXWTPQRSRSMMJIFDHJGGHGGLNIgsuxy}zxwy||||~~~~~~~g^`cacnq}{z{}w||vxz{xxzop{xy{|{xw{xuwttvutvwuqrqnprpghklnomjiihheeddd_`ab``^]YXZZ[]]_`_`___`ba^^^^YY]\][WWVRTRSSNQJHIFDEHLLHFGIKJIMmrtxz{zwwy{z{|~~}~~~~~~gX[ZY\[\c\Z\^`kqmpponnonkinlklojikkijkigfgggihgmgjghehgbcbab``]X[[WXWTVQPTSSMJLKLLNNOTXXWUUTRPPMMPONKLMPQOLLJGIIGHHIHHHGFGHJJHHHIIHIVpsuyz{yvvyzz{|~}}~~~~~~l[XVVVYYZYYXUVhjlnnlkkjhhihdedb\bf__`c_\_]`]^Z^]YY^ba^^ZY_\XWSNMLKKKLIKMNKJKKLJKPLKKFGGIIFGIHIFEHGFFEDEEDDEIIIGHGHFFKMKIIIHGHKMMKLLLUqsvyz{yvwxwz{|~}~~~~~hRTUVSUWYYYWWW[[ac_^\[XVVYVRTRQQUTSSSPMJMNPROMPQQQQRVVRPQTPPNNOLJMLKLJJKKFIIJLIGJHIIEGGFFEEHIJGFGFFGGHJGGHHJLJJKIIHJKKJHJKJHIKLMOPPKTttuxzzxvvwwz{|~}~~~~~~~iPRTWUTVYWXXZ[TTSRPQSQQQONNPPQOLNPONNMLKMNNPMOPPRQPNNOOONOOPQONNONNPNMMKIHHJIIIIGFGGGIJHIHHIHHGHGHHIHILKJIHJJIJJHGJLKJIIHJJKLNMNMOQLUsrswzywvtvxz{}}}~~~~~~~~lOONTYUU][YWWXNMJJIFJOLJJGIJMMKJLMJGIIIJKLFDFJKKKHJLLLOMLLNOOOMNOLNNNPPOLMLNMLLJIHGIHIHHIIKLKKJIKJIJIIIIIGGJIGIIJJNMNLHIJIIJMOOMKORNYpprwxwwtttwz|~}~~~~~~~~~oKJMNQNNUWVVRSIECEERDDA>B?D@@>BDA@ADGFEHEBA@@CCDEACEHKOKIIJHGJIJIIKJLPNMLMMLMMMLIHDFFGFFFIJIIKJHLJIJJJIHHJKKHFGIJIKMNNJKOMLKMMOONPOP`porwxvtrsuwz}}}~~~~~~}sPPNNPMJKPRPNQCDBAEQE=C=?EH9:;=?=<AF@>:<>><ED=?EA?@A@DEGGGGBDDEFEGGGGJGHJKGCDGJGCDEAACGHGHGHJKJHILKIHJKKMNLMLLJJLKIKMOOPSQOPPNOPRQMPgposvutrqtxy}}}}~~~~~~vTUQQPOLMPPNOOAAA@BA?;><>??<898;;:@:;><;;<<HL==AA?BC=ADDFBFFDGIHC?@@@AABAA?><=>A@@?>?@EGGGIKLNMNMLMMJKMPUSNLNQNNMNLMMNONNMKKNNNMNNLTnpprttsqrvyy}}}~}~~~~~xQQRTRSQSSQQRO@@=>?<?>@A?=>9;::;88:87:<978;;>=;;:8:@@AB?A?CFDBCC?;>>@CCA?>?A>@@B?@<?B@ACEEEJKPOPOMMNLLLORQPRNLLOMKNOLLLKLKKJKKJMMKK\qqqtsusqtxxz}~}~~~~~~|RMOQPQRRTRSSN<;<;;<?@AB@=<9<=<979::988::78:9:;;8789;:8<;=@A@=;;><==@BCA?ABA=>==;=?CDB@?ADBEGJJJJJLMLLLMLLNUSKLMTIPJIMJIJKKJIHGJKIJfrqstsurrvyy{}~~~~}~~VLNPPNRQPPQQN8=?<<:=>A@A?>>@?>=;<<>?=<=;:<===<<<<;<:;<>=>??A@>?A?@@A@@@=??=<:;==<?@ABBA@BDFFFGFGGHIKLLLKLKJKIJJMLLJLKIHILLJIIHIKGMmpquuuusuxyy|}~~~~~~~~aKOONNOPOOPPO:<><=;?>>AA?=?BCC@><=?@??=;>=>CE??@=;===<;:=>AA?>@@?A??=<><=;;<=>A@?@>@CCDBDEHEEGHHHGFIJIIIIIHJJJJLKJJIIHHJJKLKIKJJHVpoqssttuyz{{|~~~~~~mLPQNOPNNOPPO><<=>??@>@@???CED?=;<@>:;::97:<9==@=:<;;<;89;?>=<=;<@==<<>;=<=>A@BA@@?BDCDEFFFCEGHIIHHIKKLMJJIJMMJKJKIHHHHJIJKJJNLII_pprrrtuvz{}}}~~~~~~~~vMNNMNNLLNPOL>A<<=?>BC?>AAABA@=<=;>=:::<:8988:;=??<;;<;::;>??=<8:><=>?=;>?@BCBBCCABBABBDBBDBDCFIGFEHIIKMJIJJKLJJIJEDIIFFHHIJJLJFFgpoqqtvvw{||}|~~}}}~~~~~zNIKKLLLEILNM<?<<=>@@AA;BCBC@???@=??><>@?===?==>CD?;<=>@==>AC@<9;A?>>A=;?B@BCB@CCACA==>@=?AAA@CEE@@CBCGGEDCFEFFGED@AGGFCFDGHJGC>Hlpppqtuvy||}||~}~~~~~~~~~QHKMMMKJKLOQ@?>>AA@@AGACDCDA?@@@?=@><=??@@@C@@?@@>=<=@EABBFHC=<@DCAA?>=@A>>>?<>@DGE@>@A?@CFECBBC@BDDBDEAB>ABBAB@@=ABCDCCACEGA?=Vppqpruuwz||||}~}}}}}~}~~~~~RHKMMLKKNNRUDB@CCAAB@BC@@AA@A@>;><?=<:>=?BBD@??Na_J@CEIIIIMMKECFGHEGEEEDDCA?@>>BFJJGDEGFFJNNKJIGGHKLJGGCDDDEDABBC@CDEDDEDEFCBAEeopqqtvux{|z||~}}}}}~~}~}RIIJJHJJLORSGFEGHDGHD@><;>@DED?<ACDB?=A?ADEDCWu~XGHJLLMOOLHGHGHIIHHGGHHECEEEEFHJJFEGIJMOOMMKJKJMNKIHGHIHGFEFFFDFHGEEHHFHGHFQnnpqrvvy{{{z}}~}}}}}~~}~~|PHGHIFGIJMNNJLIIJKLNJFCABCFIHIGHHIGFBDFDDCAUtWILMLMNLJGGGGDGGGGFHFHECDDFEDDHHCCCFJJKLLLLLLIJKJJIIIHJHHGHIHGGHFFFHJIIIIH]ooqrtwwz{{z{~}~~}}}}}~~}~~|MGFHFEFGGJKJLMLKMNMOKIHHJKKKKJKMJKHHFFGFEPl|PKLKHGFFDECC@ACCCCFFEB@>>@AA@BD???DFGDEGIKIIGHIGIIJJIHFJJJJIJIJJJFILLJJKKfopsstvxy{{{||}~}}}}}~~}~}OFFGFGHGEFGGMMMKLKIGCCCDIKKKKKKMLKMLIFJUl
uIIFB??@???<<<>::<AA@><998<<=;>;9;?ABAACCC@ABEDBCFHIHHHLMLGIJMMNMJJKKJLMSloqtsswy{{{|}}~~}}}}}~~~~~~QFEFGIIGDCEFNMLJIHE?9:>@EHGIHKLONNQNQ^r
fBB=88::9878896479;<:8567789787689;<<>A;999==>;;=ADEHJMLLGIHORQPPNLMMOQ]oprtsuxz{{||~~~~}}~}}~~QGFGHJHFEFGHLLJIIGCB56:<C@BFHKHLKNTg{T;8656766645763468:876565677778:7788:;7688989876:<@GFIFIFEFOSRSSROPPRTepqsttwy{|{|}~~~}}}}}~~RHHHIKIGIJIJJKDEHDB@5788=:<DBDFFDVx
H676468874578467799776765::;::<89999877:::8878589;A=>>BA?AKLOQPQOOPQWkqrttuwz{{{}}~~~}}}}~~~~THGIILMKJKKLIH?@A?<:579897:A9<D?P}z>:88;<=>9:;<89;9:;::9;::>==?;;;=:><:<;<<=;::<8::;:999<?<=ABDIJLKJKLWorsutvx{{{|{}~~}}}}~~~TFEFILNNLJJMB?;;<:89989999:>=??Cv
l<;>BCEEBAAB>@CA@?=>>@???@?@==?B?AA?A?=AA@??A<><;:;:9;?=:;==AACABCAXpqtttvy{{|}{}~~}}}~~~~~~~RECAGJNOLIGK:89;9::<<:::<;=>@?=a
^>DGIKJJFGGDFHGEC@@CECCABCB?@DHECEDEEAFEFDFFD@B>=@>=?@>>>?>?>>:;=<`qrttuwzzz}}}~~~~}}}}~~~~~~~PD@=CHOMGFBD979=:<;>=>>;><??C>J~
WGLLMKNIIKHIJJIECDFGFDCFGEBHIKGHGFGGEKJLIJKJCFCCDBAACBDCCDDCA=;=@hpsttvwzx{||}}~~~}}}~~~~~}~OA>=?DLK@BBA97;>;<:=?>?<?>BAE?h
PMPMKNKJLIIJHKFDGHHIEEIGFELLMIJGGHIJNMOMLNKHFGGEECFFFFDEHHFCA?@Lmptuvxyyy|||}}~~~}}}}~~~~~QA?>?FGG=<@@87<:;<:=?<==?@CBHS~
qMQOMLLLLIHHFJIDJHGKJIJHHGKLNLLHHIJMPNONMOKIGIJHIDIHHFFGGIFCBACUoquwxy{xyzz||}~~~~}~}~~~~~TDAABGGB?8?@8:;7<=:<?<==@BCDLm
^RRPMNMKJGFCHJGLJGKOLKKJLMLOPNHIKLOQQPQOOJIJJMKLFGHGFGIFEEB@BB\prwxyzyyy{z{|~~~~~}}}}~~~~~UECEEGGED;?A;=<8?==>@ED>CDCFJu|WVRRTROLKKEFFKONOWVQPORSRMSTOMSLPSUWRSRPLJMMMLNGGJFFHJDDEEBDCcquyyzzz{z{zz|~}}~}}}}|}~~UFFGGGGHF>@B=?=<A?AADTKBHIFILy
gVVkaERQQPK;:QSR`u]UVTVYYRXXRZfPUWZ]RTWQPNRPPQQKKKGHJHEFIIIHIjsvyyzyz{{|z{|}|}~}}}}}}~~~THJIIGFFE??A@EACFDCDKVPJPPNOPy
}al[dU:XXXSQ>@VUY\d`VYbr^]V]ZVEQYZ\Y_TYgRUVXTTVSOOMKLJIILMKOMTptvxyxwyyz{z{|}|~~}~}}}~}~~~~~VJJIHGFDDBA?HLIMPKIJOSRQTVUVTu
g;~znpXZ[ZRSRVVTZZuYU}a\X]^WIV^^[[_YHYXY\]XXYWRQMPQMMOSQQURbtsvwwvxxxz{{|}}}~}~}}}~~xy}YNKJIIFBD@A:OQQWXPPPQRSRVWWWWl
n~fYY\YSVTWRQWVcQerXZW_hP`fZZX\hbGOZig\[\]]WSNSPPQVVVVYZostwvvtwxx{{|}}}~~~}~}|~}r}ot|]SPOMKJEC?@;PPZZZRSQOQRQURUSV^ux
}{\PVXTRTRQQLOMKfyZ]TYUV]ZLTZUST^ZYWWWzkXZ\\^SPPOINOWVXZZeqtwvttvxyy{{|}}}~}~}~}}~~~zxwvsu{tk~~kry^[VUSROKFCDAM^lVRSOOQOQVQSRRTcdv
~ymqVIKNNKMKHJDFHEC>ScURQQNKRURMOYRNOQSUUMQSRPNLKHCIGRSTY]mrvwuttw{zz{{}{}}}~}}}~}~}}~~~{vsw}~~du}iqt`d]][YUQLHLIaltPQSMQRPS[RSRQRUUbs{|~}{{
u_]KC>BBCCA?DPCC@C>BHGV@HNMG]iQHFOFEFFHGHBCHGHJGDAAC@NPMRdtuvuttvy|{z{{|}}|{~}}}~~||}}vt{mh|gnqfiedb\XSQPURsWe[OONLQRPUYSUQQTROV`klsvz{xytrnstsyx~~kLG>>::>@?>>>jPKaEFHIEB?GLMGMQUJBE??==<==?=?ACB?><=B>IMFUouuvstvx{|z|{|}}}}|~}}|~~zywxwvvx{~~}{xv|uaxglpjljif`[QQZ\Y^IJOPNKLQRQTVUWQQWVPX[b]agmmlnjh`nrimlqu{z}{xz||xwxdB@@A<:BCAACA[\O{NOONKLMOOPLKLWNIGAA<977599=;;;8989?;AG>\tuuvuvwy|||}||}|~}|}}}}~}xuwz{zwyxuw{|yxuywcqhipmnmmhf^OO^\ZIGOQQOMPQNQRTVXSRYTNYZ[WY\_^_e_]^qwk^`gkwooljomnlfbYGFFHBAFHEEFCLQOaWRXQPSSRU[OOQVPMIDF>996586979:365795<B=ftuwxwzy{}}||{|}}~~{}~}}~~~~{wuy}|zx||||twvwvuwknihqnooojk`UW^ZWMKSTSPQUOLRSTWXSTXQLXYYVXXVXY]WXXhsk]V`tkaa_]d`_^YUPMONLIGJKIHECPOSZWTTNQSYS\eUOSTQNKIHC?A9988978847578599Gnruyyz{{}}}}|{}}}~~z}~|}~}~~}~|ttu{xrqoontxqrsxvuqfdgrnppqnmd]__YWOPWVVSTVOOUVWXYSUTLKSUUUUWPTUWTUR]n^RNY`[VY;DUWS[fJLPRROMMNMMLJEPPUYSTOJNOUSS\VRUSRNMLIHHF??=:787659967665Xqqtxzz{|}}}~||}|~}}y}}|~~~}||}}~}|rvqxxruuqqnppopuvtnjddjppqrpnfedc\^RTZVWTSVTRXWYYYRUOIGOPOOMRJOPOONNOTLMIPPSTU2<XMI@Q=c`QSQPMPPONMLPNTRPRLILKORPQRRTQROLMKLLHCBA=:9876;B4566;eprvxy{||}~|}|}}}}|{x|z{}}~|{y}|}|{puowuputosvpqqpuuvcjgeWhtrrqniihpVVTUXUVURWVUZYXWVQSFFAFGGHFJDHJHGEHLHKIGLMPMG/E_R>4@>joaRRQ@GTPOPOQNQOPOLJLLOPNMPQQNQOJLMMKGEECB;==<9=G6676Enquwz{{|}}|z||}~~}{yvxwyy|}zzv}{|zzoqnwrpvqmpspopssstfg`hZWkrsrlmmknbePSTRSUOWVUYYVQQQO@>;=?@BAC?BEDA@GHGHFFHJMLDGCORC8EMS]gSQSAGUOOQPPMMNLJLKLNOOQLONMILKIKKLKGFFED<AA>;@E;<89Trsuy{{{|||{y|zz~~|{uturvvzzxzr|{|yymqoxrqunnqroootssrutkgg^ejmpkoqmimcLONMQSLTUTWWULLKH=987;?A?<=A@B==EHFDFFIGJJ@FAA@FGDIOHQRa\QPROSOOOLMOMKMLMON[VKMQOGIHCIKLLKFFFE?BD>=BG?B?@druw{z{{|{zzw|wy~~{{qstprswtxxsz{yvwlqovqttloqrnnosvrtsrrklenshmnmlmljkILHHOQJQSQTSOKHCE=9879?B?;>A@@>AEJECHGIGIEBB?><BA@GJEMObePMOMVKLNKLMMLLKNNSdMJLRIIIFBJKLMNJGIFBBB@?EFEHDLopvzyyz{z|zwsxtx||yznqqmnorrvrsx|xvvmpmsputlpprooorvurVVnqglyjmqrnnjhoHJCGLLIMPMPOHKE?B=99::?B?<ABAADEGKFDIIGGHCC?B>?@A=CEDLMQTLJIMTFIIJLIJKIILMOPRPKGCKHCCKJLNONIJIGDCCDIJMLIZsnxyxzz{y|vrpurtyyvxjqokllnttmsv{stxronqovsnporpopstyjN`gsjt|ygosqjqheqHKCFGHGJKIJLDGB<>=:::;AB?=BBCCHEJLJEIIFGHCC;A@B>@?BDDIMOGHJGHKDHIKMHJLHIJLJM]RHIDNGBELKNNPNKMJKFGGJMNRNMcnjwvw{y{z}qmlskptttuhpmjikktpnttyprztorqowsoqptrprutykNVmulq{vinoikthepFJCFEFDEEFEGCC@=<=:;:;AD@?BCEEIFJJLFIIGFFDB:ACC>?CCCEGKMHJNHDHEILNMHILGFFIILNKIHEOICGNMOMPNNOMKIHIOSQRNSggfrosxv{z|lhjoekpmsqgnlhikltmoutwqoxtotsrvspqrtsrtuuvvXVuukotrkovlhmf_pGJCEEDBBAE@DB>?>;;;>;=?CB?ACFGJGJILHGGGFEC?=DEB>ACBCEGHIGMPIEFGKNOKFHIFECDIIHKIGHPKDJNLPNONOPOJJIMRUUROXeaamfproryzgehhcilfqlflmgiklsmpwutpnvrosrsutqssutsuvvvyvutvlkuumrvqlnlerMGEEFBA@AD<BA>A=::=?;>?AB?@BEGJFJGIGFFFDCBAAEFCBBBDEEGGHFLPLHNJJLKIFHEFECCHHHKJGKRNCOONQPOONOPKKKPUWVUTY`_]ianinhrsbeffdhhfnifmmhkkmriqvusqmvnoqrswsrstuvvvvwvwvvtwuksunutsqskksMGGEGAB@DE<AA@C<8:=>:@=@C@@ADFIEHFFHFEEDCEBDIFCGEAEGEFFGEIMKHQMJKHHIEFHHECIIIKMKPSNDRSRQSNPMOPMLNSWVXYWY^[]d`icjigk_defchggkggkmkmlpqgttursnvoqprtxqssuvuyvvtxuuwxnouorsuqqipzMGGGHBBBEE<@CBD<7:>>;>;@B>??CEGDFDDGECECDFFFJEEIGBGHFGFECFJJGMJLKHJKFIHJHEKKLLNORTOHTUTQTPRMNROMQWZVZYW[^ZXa```^hec`deggjhhjghnllomqpiuuxrrpupppruvpusuvu{~}xvtwvvvwplupmsunossyMHHGIDBCHE=@EBD=8:>>=<<BB=@>ABFCECCGCCDDFGGGIFHKHCIHGIGFDHKIGJHMKJKLHKJMKINLONORUVOLVVTQTRRLOQPOTZZY\ZZ]`_]_c_\bdlc`dghr
hgjfjnnponsqjtuxrsstrnpqvrquruus~y}uuvvvvxriuqkrtlqwquLIJHJFBDGE=AGDD@:<>@?>?CB<@>AAFCEDDGDEDFFHHFHGIKJEJHHKHEFLHHHJGLKLLLIMJMNMOLPPRUVWOKVVUSSRQLORRQV[[]^[]^`_a`bf]d`fh`eijdssfjhglprqossnswwpuvtsmoruorspurvrtvuuuwvuwsgtrkqrkrwpwJJKIKGBEDE<AFDDB;??A@@ADA@B>ACHBEDFGEHDFEIHFIHJMHHJJILJEJKHIJJGKJLLIIMKMNNOLOQRUWVMNTVUSRQPMNTSRW[^^_]^``aab`ddebdibdijgvlkigmosqpqpprywruutsmmssmqrotuuspswtuuwvuuufqskpqjrvpwJLLKLGCCAE<@EEDC=AACBBCEACDAAEGCGGHFEIECGIGGJFILHIJMKMLFKIHKKNQKRPLRLJMMNPPPUOWXX[NSQW\ZSVPNTUTTXZ_bb_da^ac_afcabhnhbihhmxvmhinosrpqrrrvtsusssnksqmprotvsqquvuswywutucmtkopjqtqwLMKLLGDA@D>>DEFC?CAEDDFCBEGCBHFBHIIGHJFDKJGHJHIKGJJNKNLILHKLJZfJd[JlRGNM_nUls[qpbwcRPbvuhucavaXnqbdvimzf\lt`lkV`wvijghfglmjmojmosrprrqrsrssrtrnltonpqquurqstvvuuywutt`ktkppkqsryLNJJJFB?@C?<DDFDCCCEEDFBEFGDDJEEIKKIKLGGNJHJKGKJIJJNLMMLLIMML[sbdo]llULNer]geqlntgpi_aYnmbppbkjjgoqtetno\pvgpOLryvkaakeelxmkvlnosrprqpqrqrrrtrmmsnnoprutqsstuuutwyvttbmukpplrrr{KLIHGED?AA?=BEFBECEDEEDBHHGDDKHGKMMJLLFJNHJKJIKJJIJMMNMMMKNMM[rponppkjLOPmXNibtrpamov\YlP[mmZqmkplxxtsip]`slqkUuyxoc^kfbgppjioppsspqpqqrrqqrrtlmrmmnorutqtrtuutuuzvutenukpolsrryJKGGEEDBAB=??EGBGDHEEDBFIHHEGKJGMLNJLMGLNIMKHIMIJIJJNONNMLNML\hdu]lqVkMOQnUZk^klvaldtTecNlYl\toljlxjwuho]`skhWbcw|oc`ghacityknnqsspqpqprqppprukmqmmmoqstrsrtvvswvzvuthoulsomsrtvIMFIEEDCAB<B@BFCGFKGECCHJHHFILKFMKKRRLHMMINJIGMGJJHINOMNLJMMJZtppoqqljOQRnYskgooqqomt^nXat_nopoqsoousttj[^tcwxrjnzhaacfabjmtupstvsqppqort{~}wlkqnlmnprsqttsuutxxyytukoumupnssvtIKHJCDDE@@=CCAFCHIMHFCFJLIGFJMLFOJJWRKGKJJNIHIKIKJIIKLMMLIKKJSkbYi^^ibrrZ_Yjo_eeUk_c[aaQ`mh\j\nijd[oedp\Z\k[mqcpsldgcdg``kmppotyruqopqny
vsnkmmonqrttrtuuvyxxsunqunwqrutwrHHFJDECFA@AEDCFBHJLGFCFKLIEFJOLIOJL[QJFHHKMIHJIKKIHIGKKKKGHJIKKLJIJLMS[]TPUMQONOOVQOPQNOQJJNPQdqiTYV[[\UY[]X]\\cfaafbcf_^fkmhmtxrtroppt
zpmmlkqsttrtvtuyyxuvqruovrtsuusHCEGFF@EC?CGDFGCIKLGFDGJLHDGIPKLOKLWMIFEGIJHIJHLJIGHHJHHHEEKHHJNKHO\V]O]\`^OXYS\\b^MYZMXaRKYaZS`d\aX[ddVVX\YZX\VY\^c_d`a_ehkgmttqqtpqr
}rkiorssstwyyxyxwxtqxrxsqrurtPBCDLMACCBDIEGGFKJKGEEJJJFEHHPJLMJMRIHEAHFJIKKILJIGFJHEFGEEJFBILIJT_Y_X`a[`UXZT]^Z_RY\P^\YN_\^S[^d^Z]`c_Y_b[`^[UYYZ_^ccbaceiekrpoppnow
{
uqprrsuyzzyyxxxwryvxrqxvtvaSJJMIDCACFGEGGIJJIIDFKKKEFIINJNLHLNGHF>HGLIKKJKKIGEIFDDEBFJD?IKHNZbY^^a_RTSW__\]Y^QY\MV_WKQY[Q[_ba]^ca`babcceZRZWW]Z]d`__cebhommllllu
yu|
}wrrtwyyyy~}yuyvvrnzwvxYQJFCGEBDHHFGHIFGJGHFHKIKDDJJMMLLHJJHIG@GFNJKKMKKKIGIEE@DAHIA>HIFO]`Z[d]_TQRX]\\\_[KW\LR\YIM^QQ]_bccccb\dbadcfXRWUT\X[a_^_aa_dlkmjklnv~uz|
zrsuu{
~xpzwvx\RMB@IFCEKIFGGIGGJFFFILJNECJJLNJLIKKIIGCHHQMKKOMKKIHHFE@EBHHA@FECS]Y^X_X_[]UXXP]\QKJV^X^[]VZaRR__bb``bb_cbaddaXPRRS\S\]]^^___diglknnp{{|~{
srw
|x\SKBAGFDGMRHDRKFHHHDFKIMPEGIJKNLLJLLJIGDHKQOMLPMMKLIJDEAECHFAAFCAUUE\T^SV`XNTUMYZLJKT`a[_X_^b]OYb\``^bca]baW`_UQPQRYS^\[]]^`bffflfoow|{{}
zo
~INFDFFGDIScQEW_IGGHDFMJPPFIIJKNLLKMLJJGEJNQQNNPMNLNILBEACCFCB@CD?LGCLLOOOMFMFFHIGFLKMOPILOPPSPLQTSUYXWYWWcVNRTPQPOQVT\YY[]\aaefdhdlmqsszy{z~{}{
}KIEEGFGDKN^MHHYMGHJHGMLQQIKJKKNMUNOKKLGGKPSSNPPNOOOILFaED^LDfbCLZG^\smOLVnYKCO_TkVgI]WU^DLQULMSVQSTXVTXTT\TOeZhheZUkTXWU[\[``abbcagignlhrz}}~}}zr{z{
~z{LIEFFHEELPTJKG`THJOJIOMRQKMKLORUROPJLNGIMQ[YOPPNPQPJKQQI|YYrsWPmGqnoaVQqqtOBjsnqspSo_[nX]V\XUkhU]VcY`YZ^UUWituu`av_Yb\\f[_aaab_acgmom`pwtx}~vxzmv~tx}|~|z~wwNIEHMMBDLLGJLFRVLKOHLRXWQNOOMQTNOQPLLOHNPS[ZTQROPPQLIZx]TxdhXRSPvftlpbnfkRrNLwmjrpsrqrpoo]ezuxqqzq~r}ku}aRh|esspss|}p~xor```bb[bahlnkblfgmw~~{xwtvziq~nt|~wx{~x|u|||ssNKF`]GADMMHKKHKPOMNJNV^YULQSNYYLSSSNLPIRRTYWWQTPPPRLHgxlcxqmZJKTypumubnvPddHevqmwojfxxiWrQhzmijzz}lxzphnXuujvuqash}ilx|o___cb\_degjjegbcdllppstsssyqrxbmtgry{ssuy~svzn|}yxrnMJRtNCBEPQHKLJLQOOOMPY`ZXKTWPa^RVQYSMPJSTVXWWPUPONRJLrouuquqch`VnKqp^GhyWvTKhx}w`y{sm`]modSgrunmypwkustqlm\s~zkmy|lun|kqwux^__b_^`edighfe^bbiiijknokqnmjpacfdowxompsynqpj{ztromKKZVHGEGRQJMNLLQQPPPQW\YUNVYUfXRRY^TMNJTTWWYWOSOONQIRmHiwK`dvvTVlNnl{rajguTKVkg|lmlw^Zpz{_`zscroxqgc|ir{]TKl_vuljv|{nyl|p]^^b[_ceegfeec[ccikkrsrwgmihdg`alagsrkglmr|kmhk{tmmkmOGJKHJHHRQMOPLLSSROSRXRWTPWZVVTTTa`QONKTSSQVVOOMNOQKHQNPULKKRSRQROVUQQORRXXPMOUTWXXZZTQRW[WWW[ORTWWXQ]XV\UTOXRWXXYZ`\hs_\[Y\]_cZ_ddegddcbZdbgffmnmuffgc`f^]g`dlgegkhpzhggkujhhilPIKKLMKJTRNRQPLVUTPTUXUZVR[]VUTWUYXOOLNWTPNUSNPNLQPKIQQKQMJJOQTQPQSRJHMOPQQPPPSURXW\WRRPQUUVSZQNRRWTSXUSXTSQUTUVYYX^Z_a]\[Z\\`c\^bcdgeeecZ`adabhhjncad^_c]Zc\bma^ffgmsdihkkedcfhQJKKNOLMTQOTQRMXWUTVXWWZVS\`VWVYUXTQPKOXSPNUPMQOLSPMOUSNQNMNQSPTPQTTNKMORTTQQQUVSXZ[YRURTXWVY\SOSTWTSYTVXTRQWVVX\Z\`]VY_]^]\]aa^[bcchgfdcX``b^`hegea^_]]^ZZ_Z_g`^^]chkahfhfd`bdbPKMLPQLPUPPTQOQZYXWY[ZXYV]jdVXYZWVSTOKOVTPOTPPQOMRQORXTQQOMORTMWQSTUOMNQTVURRRTWUZ]\ZVVQRWXU[[VPSUUTUXSWXTRQXVV[_[_`_V_]^`]\`___ZccehheebYb`b^_fdc`b]\\\\YZ[X[b\^]]_b__bddbd__`\PMNNRQMRSPSTQOV\ZZW[[\YZ[dqmhd_[YVVXRMMWSMMRORROLPSRU[UTPPLOWUPVRSRXMOPRUXUTTRTXX[^]\[VROUWU[ZVQSVTUWUSXZSRQZWW]_[```Vb\`a]`b_\`]cachiegaZc`a__ee_`c[Z\[\ZZYYW\Z\Z`^`[^^a`_c\Y`ZQNONVQPUSPUUSPW\\\Y^\_W\^jpwyc\[VVYRNPWSNQQPRTRLRTTY[WUORNRWURRTQRYOQSTV[VVVSVZX]^\\^VSNTVV[[UQTUUWXRSY[SRR\XZ^_]ba`Wb[cb^ac^\bab_dgieg^\d`a`acd_b_ZZ^[\[XXYWWZZZa]][]\\Z]`W[[ZPOOOYPUUSRXRTP[]^]\`\`U\\hjr}slh\UYWQOS[SRQSRUUUKRWVZZZSOSQUUTRNVQRZRTUTX]WXXSW\X^]YZ]UUNVVW^ZWQTUWXXSVY[TRV]Y]^a^cc_Y`[eb_dd^^cca^efieg_^daaabcd_b^X[_[\[XXXXW[Z[`][[\[XZ[^V^Y]POOR[PZUVWVTTT^^`_^b\`U]^bkyum~l[UZVQQT\TTTUTVYWLRZV\[\RPUSWUUROWQSWSWUV[^X[YUZ^X_^Y\YRWRYYY_YYRTUYYYUWY[UTZ]]^ab`ed]^]]eabfd^^dc`\gehfeb`ea_aabb_`^WY^Z\\ZYYWV]Z]^[Z[\[WY\]VXW]SOPWYQ]UWYWWUX_`aa`c]`U]^beev{iYYZTVTV\XWWVWW]XOU\Y^]]TSXRVUSQSWQSVTXXX^^X][V]_X__X\VQXTZZZaX[TVWZYZWXYYWV]_`_dcbfe^b\`fbdfd_`dba[fchfdfaf__abaa`_^VU]Y[\[Y\YY][[[XXY[ZZZ]_]TY]UNTZVT\UWWYWV\`abcac__V[`da_zupiZ\ZVXVX[ZY[YXY`VOU][`a\TUYPTVTRUUQSUW[[\__Z_\V__Y]^Y]VRXWZY\aY]UVZ[Z[ZZXZXY__``dcdeecdZbfcgfe^ab`c]bciedg`h^bbcaa`^_YT[ZZ[[X\XX\[Z[WWZXX\[\`]V]]SOVZVVZVYVXWX^`badada^YYadb`kfh_]][WXYZ\\\_[Z[bVSW^]ac\SVYPVUUUUUSUTX]]_``]a]Wa^[^\[^XUXW[Z__Z^WX\\\]][Z\WZ_a^`ddeffgcYcfehgd^c`_ec]fidei`g^cbcaa`__\XYZYZYXZXW[[Z[WXZTZ]\[`\U^bMRWZWWZY[\XWY^`baeada]^Yacb_a`a_\]]XX\[]]__\Z]cXYX]`cd_RXYPWUWWWVVWV]]^aba_b^Ya]]^Y]]YXUV[[`^\_YY^]^^`\ZZY[_b_cfdfgfhcZefgigc_c^afeZiicficf_bbca``_]]ZW[YYXXZYWZ[ZYWYVU[]]]``bbxKWW\YW]\\]ZW\]_`bdbca]`Xbcb`cac^\]\XX\\_]`_][`d\\XZbecaR\YOXVXYXYWYZ`^abc`ac_\b]_][^]YYTX]\__^_[Z^^`bb[[W[]`bbdfdgffhe]eghifcab[cg`\iichife`bbca_`_]]\Y\YXWXYYW\[ZWVXPXZ]acffrkJYW][Z_]\^\Y][^_bcbaa]b[bdb`cbb]][ZWXjq`\`_]\ac_^YYcedaT_ZQYW[\[[Y[[c`ccc`bda`c^`\^^^YXU[^\\aa_][`abfb^[S\_`cddfegffgf_fghhgdd`[eg^ahhcihfc`bacb___]][Z[YXXXVZV\[ZVVVMXX\gikhuxvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzz{zzz{{{{{{{{{{{{{{{|{{{{{{{{{{|||||||||||||{{{{||||||||||{{{|||||{{{{{{{}
~|||||||||||||||vvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwwwxxxxyyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{z{{{{{{|||||||||||{{{{{{{{{{{|{{{{{{{||||{{{{{{{|
}|||{|||||||||||vvvvvvvvvvvwvwwwwwwwwwwwwwwwwwwwwwwxxxxxxyyyyyyyyyyyz{{zz{zzzzzzzz{||||{|{zzzzz{{|||||||||||{{{{{{{|||{{{{{{{{{|||||{|{{{{
~|||||||||||||||vvvvvvvwwvwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxyyyyyyyyyyyzzz{{zzzzzzzzz{}}}}|}|zzzzz{{||||||||||||||||{|||||{{{{{{{||||||{{{{{{
~||||||||||}}}||upooooppz~}}}}}x))***)+=?>>>>>m~~{¥×ÓÓÓÓÓÏÄÅÅÅÅÅÇÒÔÔÔÓÓØZ%+++*"ÛÒÒÒÒÖº}~~}|||||||||||||||||{||||||||||{{{{{~||||||||}}|||}}upnoooooz~y1333332j{éääääåàÔÔÔÔÔÔÖãåååååëTïååååéÇ}~}}}||||||||||||||||||||||||||||{{{~|||||||}|||}}}}vuuuuuuuvwwwwwwxyyzzyzwopppppprrrrrrrwzyyzzz~wsssssr|
|}}}}}}}}}}}|||||||||||||||||||||||||||{{~||||||||}}}}}}}vvvvvvywvvz{x{xwvy|zzyy}yyyxxxxyyyyzzyyyyzzzyxxyyyyyyyyyyyyyyyyyyy|}}}}}}{zzzzzz{||||}}}}}}}}}||}}}}||||||||||||||||||||||~}}||||||}}}}}}}wwwvvw}xww}zx}xwvz}zz{y|{xwwwwxxxxxyyyyyzzz{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||}}}}}}}}}}}}}}}}}}}||||||||{{||||||||||~
}}}|||}}}}}}}}}}wwwwwz}x{x||w{xwvz~zy}x|zxxxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||}}}}|}}}}}}}}}}}}}|||||||{{||||||||||}
}|}}}|}}}}}}}}}}wwwww}~ywwx{z{xwwxy}y|z{zwxxxxxxxxxyyyzzzz{{{{{{{{{{{{{{{{{{{{{{{{|||{||||||||||||||}}}}||}||}||||}}}}}|||||||||||||||||||~||}}}}|}}}}}}~~~wwwwwy|y{x|}y{xzzz|||}{}{xxxxxxxxyyyyzzzz{{{{{{{{{{{{{{{{{{{{|||{{||{|||||||||}||}}}}}}}||||||||}|}}}}}|||||||||||||||||||
||}}}}}}}}}}~~~~wwwwwvxxywyzxzxyyy{yzzy{xxxyyxxxxyyyyzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}||}||}}}}}|}}}}}||||||||||||}||}}}}}}}}}~~~~~wwwwwwwwwwwxxxxxxxxxxyyxyyyyyyyyyyzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||}}}|||{|}}}}}}}}~~~~~~wwwwwwwwxxwxvyyxxxxxyyyyyyyyyyyyyzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||{||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||}}}|}}|
||}}}}}~~~~~~~xxwxxxxxvqdj^jmyyyxyyyyyyyyyzzzzzzzzzzz{{{|{|||{{{{{{{{{{{{{{{{{{{{{{{{{{{||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~~~xxxxxxxymdbe__^oxyyyyyyyyyyzzzzzzzzzzz{{{{{{|||||||{{{{{{{{{{{{{{{{{{{{{{{|||||}||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
~|}~~~~~~~~~xxxxxxyndegedb^fxyyyyzzzzzzzzzzzzzzz{{{{{{{||||||{||{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
||~~~~~~~xxxxxywgedefdea_iyzzzzzzzzzzzzzz{{{{{{{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{|{|||||||||}}}}}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}}}}}|
~||~yyyyyykeabeeaee^bxws{zzzzzzzzzzz{{{{{{{{{{{{|{{{{{{{{{{{{{{{{{{{{{{{{{||||||||}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
||yyyyytccedcfcghdfld^s{zzzzzzzzzzzz{{{{{{{|||{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~
~||yyyzwdacgbbd][e_a]^`ahxzzzzzzzzzzz{{{{{{|||{|{{{{{{{{{{{{{{{{{{{{{|||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~
~}}yyyoobbbd^cg_]aa`\_db[m|zzzzzzzzzz{{{{|||{{{{{{{{{{{{{{{{{{||{{|{||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~}yzp]bedbd^fgg`Ybbace_\]s{{zzz{{{{{{||||||||{{{{{{{{{{{{{{||||||{|||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~~~~~
~~yzlbdgcbgfa``dabedcdc^\bu|{{{{{{{{{||||{{||||{{{{{{{{{{{|||||||||||||||||||||}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~
~z{tggffddff`^_acehde^bd`t|{{{{{{||||||||||{{|{||{{{{{||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
zzmhccgfgegffgbedebg[be`v||{{||||||||||{{||||{|||{{|||||||||||||||||||||||}}|}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~
{ziidcjfa`fecccgidcb`bdbt}||||||{|||||||{||||||||||||||||||||||||||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
vsedgcdfebefgdfhfec``cd`q}||||||||||||||||||||||||||||||||||||||||||}||}}|||}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~
~~ssgeddeijhfggcaffefgfeecu}|||||||||||||||||||||||||||||||||||||||||||}}}}}}|}}}}}}}~~~~~~~~~~~~~~~~~~~
~ttsu}~~trgdecfijiecec`fddggbbeap}||||||||||||||||}}}|||||||||||||||}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~sssstuxuuttuvuupfcfehhighgefeb_defc`bgw||||}}}}}|||||}}}}}}}}}|}}||}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~
~ssssssssttttssuoccagehhgjfdegfhfcbeb^by}|{{|}}}}}|||}}}}}}}{|}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~
~tsssssssssssssurgeedejhhgfihgceebdchdg{xusstvvyxvtttvwwwvtttuuxwxxwwz{|}}|}~~~~~~~~~~~~~~~~~~~~~~|{{}~|yyvvvy||zzwvwy{}{x
~usssssssssssssushegheklhjgijgggfddbednuttsstsssssssssssssstssssssssssttuusuwxy{~~}~|}x|~~}|xuvwywxvtssstutssssssstsssttstttsusttssssssrsssvvichjhjlefilh`fedc`ddftuuutttttttttttttttttttttttttttttsttssssstvvuuwux|~}~|zxustuuutssssssstttttttttuutttuuttuutuuuut
vsssssssssssssvvsggjfhgfhhfdigccgeefpvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuttttttttstttvuuwvtsttttttttuuuuutuuuuuuuuttssssttsstttttuutu
wsssssrrrrsssrvvund]cgeikhehggjjigepvuuuuutttstttttttuuuuuuuttuuttuuuuuuuuuuutttuuuuuuuttuttuuuuuuuuuuuuuuuuuuuttsssssssttssssssttttttu
xsssssrrrrrsssvvwwibhhgjkihfddefihputtttssrqrrtuutttttttssrqqqqssttttttttttutrrrstttttuuuuuuuttuttttttttttttttssssssssssssssttstttttttu
yssssrqrrrrssswwwwljhdhikvzkefehgmrststsrpppqrstuttssrrsrqpoooopqsssrrrrstttsqpqrstttttttsstsssstttttsttttttttstttssrrqqrrsssrsssttttsv
yssrrqqrrrrssswwwwssjgiihy}qnulnpqrrrqqpopqqqstsssrqqppnnnmnmnnnpqrrrrrrrrsqpoopqrrssrqrrrrrrrrrrrssrsssssssssssrqoonnooqrssrrssrrssrv
xqpppqqrrrrssswwvvwvrqtsnv~vsxppprrrrqqppqqqqrssssqpqpoonnnnnonoppqqqqqppqrponopqqqqqppqqqqqrrrrrrrrrqqrqqrrrrqpoonnmnmnoqrrrrrrrrsrqxwopopqrrrssssrvvvvvvwvvusy~wwwopqqqqqqpppqrqrrssrrqppoopoooooooopopooooppqooopppppopoppqrqqqrrrrqqqqqqqqpppppqoonnnmmnmnopqqqqqqqqqqp{
vnopppqqqqqpppvvvvvuttssq}}}sopqqqppppqqpppqrrqqqpopooppooppooooooooopqqpnoppoopooprrrrqqqpqrqpqqqpppppppppoonnmnnnnnonopppqqqqqqqqp
uooopqqqqpppppvvvutsrrrrqyppppoppppqqqqpqqqqqqpooppppppopqppooopoooqqppoppooonopqqpppopooppppppppppooooooonnmmmnnnnonoopoppppppppptnoopqqqppoopovvusrqqqqqprppppppppppqqppqqqqqpppppppppqpppppppppoppqqpppqqooonopppooooppooppppppppppoooonnnnnnmnnnmnnoppoooooopsqu
tooonooooooooovutsqqqqqrrtqqqqqqqqqqqqqqqqqpqqqqpqpqpqqqpppppqqqpqpppqpppppppppppppppqqqpqppppqppqqpqqqqqqrqrqprtrrttttuvtstttuwwuoooooooonooooutsrrrrrrrrvqrrqqqrqrrqqrrrqqqqqrqqqrrqqrqqqqqqqqqqqpqqqqqqrssrrrsuutttttttuvwwwwwwxxxxwwxxxwvwvuvvvvwxz{|{{{zzzzz|
wqqqqqpnnpoppovtuussssssuyrssrrrsrrssrrrrrstrrsrsssssssrssttuuuuutuwxwwwwxxxwxxxyyyyyxxyyyzz{{{{{zzzyyxwwwuvuvvwyzz{~~~}}~~~~~
|zzyy|yxxvuvvtyvwxwwvwvvz|~~|vvwwvuxzxxxxwwwvx|yy|zyy|{yyyxxyyzzyyyxxzzyyxxxxwvwwxxwxxyyz{{z||}~}~}{{{{zyzyy{{~~~~}}}~~~~~~~}}}}|{{{yxxxxyyyxyxyyyxzzzzzz{{{|}~|{{z{|{}|{{{{{{zyxyxxz{zzzyyz||{zz|||zzz{}}|~~~~~~}}~~~~~
}zzxxwxxxxyxxyzzy{~|z|}}{|}}}|||~|}~~~~~}}||}}|}|}}{}}|||}}}}~~~~~~~~}|}}}}}~~~~~~~~
~~}~~~}}}~~~~~~~~~~~~}~~~~
|||{|}||~~~~~~~~~~~~~~~~~~~~|}||}}~
}||~~
}}}
~~
}}~~
~~~~~~
~
~
}}}~
~~~~~
~
~{z
~|}}}~|{|
~}~~~~~~}}~}}}
}|}~~~}|}}|z|
~}}}}~~}}}}zzz~~
~~~~~||}}~~}}}}~}|zzz~~}~}}~
|}}~}}~~}~~{}~}}~~}}}|{{{zzyz~~~~|~~~~~~~}|~~~~~
~|~~~~~}}~}~~~}}}|{{|zzyyy{~~}~~|~~~~}|~~~~~~~~~}||}
~~}}}~~~~}}}}}|||{zyyyy}~~~~~~~~~}~}}{|~~
~~}}}~~}}}}}}}}|{zzyyyy~~||~}~~~
}}}}}}~~}}}}}}}}}|{yyyyx|
~
~}}}~~~
}~}}}}}}}}}}}}||~~~|{yxwxyy}~
~~}~
|}|}~}}}}}}}}}}}}}|{{|z|yxy|~~~
||||}}||}}}}}}}}}}||{z|xyz{|~|~~{||}
~
~~
}}||}}|||}||}|}}}|||{z{|zzz{|yy}}~|{{~~}~|~||}
~{z|
~~~}||||||||||||||}}||~~{z{zxz{z|}{~}~}}}}||}~}~~||~}{}~
~}|{||}|zx{
~~~|||||||||||||}|||||||y{{{xxy{{z|~|~~}~~~~}|}{}}}|}||}~~~
}{z|x~w{~~~~~~|{{|||||||||~}|{}|||{|||zzy{|z}
~~~
~~~
~~}|~~}}}}}z|}}~
{z{ywz}~
~~~~}|||}~}|}}}}}}|~|}|{}||z{z{}}}~}~}~}||~}}}}|{}|~~~~~}|~}~~~~}|||}~{{}w~vx~}|}|}~~{~}|~~~~~~~~~~~}~~}|~}~}}|{|||z{z}~~|}|}|}~~|{{}~}~~}{{{}{z{{{~
~}||~~~y}~v{vx}|||{}}~~}~~~}~~~|~~}}}{{}}|z||~||}|||||}|}{~{{{|||}|{{{{||zz}z~~
~{|~~|z~xyvw|||{{}|~~~~~~~}||}}|}}}}{|~~~~}~|||||||~~{|{||||}|}|~|}||{{|y{|{{}{}~~
|{zzy{}z|~~y|yxxt|||{|||~~~~}~|z|}}~}}~~}}~{{}}}}}|}|}}}~|}{}|}}~|~}}}}|{{z|{||{z{{zzz{~~
~zxyyz~~{yzx~s|||{|||~~~~~~}~~{~|}~~}}}~}}~}|||}}|}|}}}~}}~~|{{{||}|{z{|yzyxy{~
~~{zy{}}y|zr}{{|||~~}}
}~~|~~}|}}~}||~|}}|}}}~}~}}}{|}~||{|}zzyyzy{{~~
~~~z{y}}zzz}q~z{|}}}}zx~
~}~~}}~~~}~}}
}~}~~}}}|~~~}}}}|}||{|}{{{zzz{{|}~}
~~~}yzz}|yw{t{|tw}~}{{vv~
~~}~}}~~~~}~~~|}}|~~~~}|}}||}}||{||{{{|{|||}|
~~~~~{{z||{v{tw~vr{~~{xuw|
~~}}}~~}~|}}}}~~}}~}~|~~}}}{|~|}|||{|{|}
~~~~~~~~~z{z}}uqz|zqz}}yxtt
~~~~}~}}}~}~~}}}~}~~}}~}}}~}~~}~|{|z|{z
~~~~~}~~~{{z~~xry}qzx{xytu}
~}}~~~~}}|}}~~~~~~~~}~~
~~~~}{z{z|{z~~}~~~~}~}}z{|
{{ry{|pwuvwyvtz
}}}~}~~}~|}}~~|{{z|{|~~}~~}}}~}}{{zx|vyz|qtxwvxury
~|}}~}~~}|~~~~}}z{{||}}|}}~}}~~~}}}~}}}}}}z{{|v}yxzzruyyvwwsu
~~}}}~~~~}||~~~~{{|||}}}~}z~}}y~|||~}~}~}}}}}~}|}}}}z{z|v|zw{xrvy{vvvst
}~}}}~~~}}}~|~~
~~~
}}}|{||yz{z~y{yx~{{{~}}~}~|}~}}}}}|~~|}|y{|xz|wzwsxwzsvvst
|~}~}~~~|~~}~~}~}~~~~~~}||||zyvyyzyvyv~|{{{~}{}}}~~}}|}}}}}}}|~|}y{{zy|wxxtuuxrwwtv
~~}}|||~~~}~~~~}~~~~}~~~~~~|}||{|uyyxxxyw{|{z{~}~}z{~~~}~}~~}}|}}}}}}|{}||z{{{z{wvxursvqwyrx
~~~~~}~|{~}~~}}}~~~~~}}}~~|~~~~~~~|}||{|xw{xuywwy|z{{}}|}wz}~~}}~~|~~}}|}}}}}}{|z{}zzx{|zz{xtxuqrtpxxqy
}~~}|~}|~}~~}}|~~~~}|~~~|}~}~~~
~}}{{||yw{ywxwwx{{z{|
}{zwz|}}||}}}~|}~~}}||}~~}}||{zz|{{zyzz{zxswuqqspxwq{
~~}|~}}~~}~|}~~|~}}}~~~~~||z|{{xzzwsvwxy{z{yz~{{wz|}|||~}|}}|}}}||}}}}}}|}{y{|||zzzzzzxsvupprowvr{
}}~}~~~~}~|~}~~~|}~~z}}t|}zzzz|yyzz
wy|||||}{||||}}}||}}}}~}}}}zy}||}zzzzzzysuuooqowts|
~}~}}~~~}~}~zz|}|{}y{zzxyxy{||}||{||||}}}||}|~}~~~}|z||{|}{yzzzyysuuooqpwst}
~~~|~~}~~}}~|||~{{~yz{z{~wwy{|{}||||{}|}|}}|}|~~~~|z|}{}}{yz{zyystunsqpxruz
~}~~}~~}~}{~~{|}{z||{yxxy|||}{||}}}||}}~}}}~~}{|}|||{zy{{yysrunvrpxquv
~~~}~}~}~~{}|}{||wxuxxy{||}|||||}~~}}~|}||}{z{yz|xzsrunwqqzqvw
~~~~|z}|{}~xwvyyy|}}|}{||}}~~~}~|~}}~|w{zz{yysqunwpuzqvy
~}~}}}|}z}zyvzxy{{|}}{|}}}}~}~~~}yy{zzzysruowqwysw{
~~~~}|z|{{w|yyy{z}~}||||}~~}~{{{z{ztpxrytvxtw{~~~
~||||x|yzyz|}|{||}}}||~{{{zzzupxwyvu|uv|
}
{~~}y|zzz}||}z||}}|z{~~~}}||}|vrvxxvt~vu}
}
~
{||}zz{}}||z|~}|}}~~~~~|}}~~}|{xvvv
~~
}}||{||}}~~~}~|||}}~~~}}~~~}}}~}}~~||
~
}}}||||~}~}}{|}}}}}~~~}|~~~~~}}
~
~~|~}}~||~~|z|}}}}}~~~}}|~~~~~
|{wy}~~ruv~
}uy~
}y|~{
~}~}}}{}~~}|||}}}}|}}}}|
h
j|{qq|sstt}usqtpurstv{}uvy
hzrss|s}}}~}~|}~}}||||}|||~}~}}}
}q{pyv~nypus|vzy
rpvxqvtturstvinrotvnulwm{snym}rsvsvmmxlpylu}~}~}~}}}|||}|}~}~|~
vpt{pru
muovo|uryyxqtwnwhwznpvr~ozyymonzoomw}xpqzprtfu~n{ysoy}}|}|~~~~~~~}}~~
~
quprsoszy~ttu~vnrynjrqmsw|ut|~xquwnyuzqvxuzyqjoyxpkyszozwvvp~~~z~}}}~}}~~~~~
xyrz{pp
x
xyks~y{krz|m{yyt}vnoot|uwqy}}m~uo
zrr{|tpozks|nw~~}}{}{|}}~}~~}~}~|}~~
}w
}~{|{~{||}~}|~~}~~~~~~~}}}~|{|~||
}{{|}{||}~||~}}~~~}}|}~~~~~|}}~{|||{{~
~|{}}{|{}~}||~}~~|~}}~~}}||~~|}|||}|||~z{{}~
{{~}{||}}|||}}|}|~}|}}|||}}|~}{|}|}|~|||zz||}
{|~~|||~}|}}|}{||||||}{{{}|{~|{|}}|}}}|zz{{||
zz
~|~~||}}|}}|}z{{z{|||{{{~{{}{{{~||||}~}{z|z|}
|
~~~}||}}{}}|}zz{y{|}{{{{~||||z{}||||~}|{{{{|{
z{
}~~||}}~}{~}|}yzzy{}}zz{{}|}||z{}||}|~~|{{|~}|
}|{
|~~}||}~}~{~}||yyzyz}}yzz{|{|{{z{}}|}|~~~|{{}~}|
~~~yz}
~{}~~~~~}}~}{}{zyzzyz|}yzz{{z|{{{{|}}}|~}||}~|{
~}}{
~|}}}~~~}}}}{|{zyzzyzz|yzz{{{}z{{{|}~}}}}||}}|
~|~~
}}~~~{||}}}|~~}}~{~{{zyzzyzz{yzzz{{|z{|||~~}|}||}~
~~}|}~~~
~}|~~|}|~||~}|~}||||{{zyzzy{zzzzzzz{|y{}||}~}}}
~}~~~~}}~~~~~
~~||~}|~}{~{}~}~}|||}{{zyzyy{yzzyzz{{{z{}||~
\ No newline at end of file
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_aac_stereo_128kbps_48000hz.aac b/media/codec2/hidl/1.0/vts/res/bbb_aac_stereo_128kbps_48000hz.aac
new file mode 100644
index 0000000..831102d
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_aac_stereo_128kbps_48000hz.aac
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_aac_stereo_128kbps_48000hz.info b/media/codec2/hidl/1.0/vts/res/bbb_aac_stereo_128kbps_48000hz.info
new file mode 100644
index 0000000..5fcda0b
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_aac_stereo_128kbps_48000hz.info
@@ -0,0 +1,469 @@
+5 32 0
+5 32 0
+337 1 0
+322 1 21333
+279 1 42666
+280 1 64000
+283 1 85333
+317 1 106666
+318 1 128000
+321 1 149333
+313 1 170666
+312 1 192000
+317 1 213333
+330 1 234666
+350 1 256000
+355 1 277333
+333 1 298666
+325 1 320000
+376 1 341333
+335 1 362666
+351 1 384000
+350 1 405333
+339 1 426666
+329 1 448000
+350 1 469333
+330 1 490666
+359 1 512000
+316 1 533333
+345 1 554666
+357 1 576000
+325 1 597333
+336 1 618666
+339 1 640000
+312 1 661333
+350 1 682666
+338 1 704000
+353 1 725333
+340 1 746666
+332 1 768000
+340 1 789333
+339 1 810666
+333 1 832000
+333 1 853333
+345 1 874666
+340 1 896000
+343 1 917333
+335 1 938666
+339 1 960000
+342 1 981333
+348 1 1002666
+350 1 1024000
+351 1 1045333
+342 1 1066666
+366 1 1088000
+340 1 1109333
+354 1 1130666
+340 1 1152000
+334 1 1173333
+338 1 1194666
+340 1 1216000
+351 1 1237333
+346 1 1258666
+331 1 1280000
+321 1 1301333
+343 1 1322666
+342 1 1344000
+345 1 1365333
+326 1 1386666
+342 1 1408000
+356 1 1429333
+351 1 1450666
+343 1 1472000
+347 1 1493333
+349 1 1514666
+350 1 1536000
+330 1 1557333
+341 1 1578666
+340 1 1600000
+330 1 1621333
+340 1 1642666
+335 1 1664000
+344 1 1685333
+359 1 1706666
+337 1 1728000
+346 1 1749333
+330 1 1770666
+351 1 1792000
+355 1 1813333
+352 1 1834666
+325 1 1856000
+342 1 1877333
+327 1 1898666
+349 1 1920000
+326 1 1941333
+337 1 1962666
+378 1 1984000
+321 1 2005333
+319 1 2026666
+346 1 2048000
+352 1 2069333
+349 1 2090666
+331 1 2112000
+330 1 2133333
+329 1 2154666
+333 1 2176000
+367 1 2197333
+362 1 2218666
+337 1 2240000
+337 1 2261333
+360 1 2282666
+333 1 2304000
+317 1 2325333
+344 1 2346666
+335 1 2368000
+337 1 2389333
+349 1 2410666
+336 1 2432000
+348 1 2453333
+349 1 2474666
+342 1 2496000
+359 1 2517333
+340 1 2538666
+340 1 2560000
+348 1 2581333
+334 1 2602666
+328 1 2624000
+341 1 2645333
+339 1 2666666
+337 1 2688000
+350 1 2709333
+326 1 2730666
+360 1 2752000
+344 1 2773333
+340 1 2794666
+343 1 2816000
+361 1 2837333
+329 1 2858666
+345 1 2880000
+345 1 2901333
+330 1 2922666
+342 1 2944000
+344 1 2965333
+330 1 2986666
+329 1 3008000
+335 1 3029333
+366 1 3050666
+328 1 3072000
+349 1 3093333
+339 1 3114666
+340 1 3136000
+335 1 3157333
+327 1 3178666
+348 1 3200000
+339 1 3221333
+334 1 3242666
+350 1 3264000
+325 1 3285333
+361 1 3306666
+338 1 3328000
+350 1 3349333
+353 1 3370666
+327 1 3392000
+346 1 3413333
+348 1 3434666
+339 1 3456000
+342 1 3477333
+334 1 3498666
+350 1 3520000
+354 1 3541333
+363 1 3562666
+322 1 3584000
+337 1 3605333
+355 1 3626666
+329 1 3648000
+324 1 3669333
+338 1 3690666
+356 1 3712000
+330 1 3733333
+321 1 3754666
+337 1 3776000
+345 1 3797333
+335 1 3818666
+348 1 3840000
+342 1 3861333
+348 1 3882666
+335 1 3904000
+344 1 3925333
+357 1 3946666
+368 1 3968000
+324 1 3989333
+343 1 4010666
+341 1 4032000
+329 1 4053333
+356 1 4074666
+317 1 4096000
+351 1 4117333
+340 1 4138666
+340 1 4160000
+332 1 4181333
+355 1 4202666
+357 1 4224000
+327 1 4245333
+338 1 4266666
+323 1 4288000
+346 1 4309333
+352 1 4330666
+347 1 4352000
+343 1 4373333
+311 1 4394666
+338 1 4416000
+365 1 4437333
+349 1 4458666
+327 1 4480000
+355 1 4501333
+319 1 4522666
+349 1 4544000
+351 1 4565333
+337 1 4586666
+340 1 4608000
+349 1 4629333
+316 1 4650666
+344 1 4672000
+334 1 4693333
+344 1 4714666
+347 1 4736000
+348 1 4757333
+334 1 4778666
+338 1 4800000
+331 1 4821333
+344 1 4842666
+342 1 4864000
+336 1 4885333
+326 1 4906666
+364 1 4928000
+350 1 4949333
+350 1 4970666
+363 1 4992000
+358 1 5013333
+305 1 5034666
+344 1 5056000
+346 1 5077333
+342 1 5098666
+330 1 5120000
+318 1 5141333
+361 1 5162666
+354 1 5184000
+313 1 5205333
+330 1 5226666
+350 1 5248000
+347 1 5269333
+346 1 5290666
+357 1 5312000
+325 1 5333333
+335 1 5354666
+331 1 5376000
+366 1 5397333
+329 1 5418666
+349 1 5440000
+371 1 5461333
+326 1 5482666
+333 1 5504000
+319 1 5525333
+327 1 5546666
+353 1 5568000
+356 1 5589333
+348 1 5610666
+338 1 5632000
+331 1 5653333
+341 1 5674666
+362 1 5696000
+326 1 5717333
+359 1 5738666
+315 1 5760000
+376 1 5781333
+343 1 5802666
+354 1 5824000
+353 1 5845333
+344 1 5866666
+334 1 5888000
+345 1 5909333
+355 1 5930666
+322 1 5952000
+334 1 5973333
+353 1 5994666
+338 1 6016000
+351 1 6037333
+334 1 6058666
+339 1 6080000
+345 1 6101333
+347 1 6122666
+355 1 6144000
+312 1 6165333
+352 1 6186666
+354 1 6208000
+318 1 6229333
+344 1 6250666
+363 1 6272000
+321 1 6293333
+339 1 6314666
+356 1 6336000
+334 1 6357333
+354 1 6378666
+325 1 6400000
+321 1 6421333
+341 1 6442666
+337 1 6464000
+351 1 6485333
+343 1 6506666
+341 1 6528000
+344 1 6549333
+341 1 6570666
+364 1 6592000
+319 1 6613333
+348 1 6634666
+332 1 6656000
+333 1 6677333
+343 1 6698666
+348 1 6720000
+347 1 6741333
+350 1 6762666
+342 1 6784000
+341 1 6805333
+326 1 6826666
+351 1 6848000
+329 1 6869333
+323 1 6890666
+350 1 6912000
+361 1 6933333
+326 1 6954666
+345 1 6976000
+345 1 6997333
+311 1 7018666
+349 1 7040000
+358 1 7061333
+352 1 7082666
+347 1 7104000
+364 1 7125333
+328 1 7146666
+318 1 7168000
+351 1 7189333
+340 1 7210666
+341 1 7232000
+355 1 7253333
+336 1 7274666
+352 1 7296000
+341 1 7317333
+334 1 7338666
+348 1 7360000
+342 1 7381333
+335 1 7402666
+342 1 7424000
+359 1 7445333
+349 1 7466666
+329 1 7488000
+356 1 7509333
+292 1 7530666
+316 1 7552000
+318 1 7573333
+320 1 7594666
+342 1 7616000
+285 1 7637333
+326 1 7658666
+352 1 7680000
+392 1 7701333
+364 1 7722666
+384 1 7744000
+334 1 7765333
+317 1 7786666
+326 1 7808000
+373 1 7829333
+354 1 7850666
+329 1 7872000
+347 1 7893333
+353 1 7914666
+338 1 7936000
+317 1 7957333
+354 1 7978666
+345 1 8000000
+350 1 8021333
+351 1 8042666
+332 1 8064000
+358 1 8085333
+315 1 8106666
+336 1 8128000
+358 1 8149333
+343 1 8170666
+319 1 8192000
+370 1 8213333
+344 1 8234666
+361 1 8256000
+343 1 8277333
+337 1 8298666
+354 1 8320000
+332 1 8341333
+348 1 8362666
+328 1 8384000
+345 1 8405333
+340 1 8426666
+346 1 8448000
+341 1 8469333
+344 1 8490666
+342 1 8512000
+341 1 8533333
+345 1 8554666
+337 1 8576000
+335 1 8597333
+335 1 8618666
+340 1 8640000
+345 1 8661333
+341 1 8682666
+342 1 8704000
+338 1 8725333
+343 1 8746666
+336 1 8768000
+338 1 8789333
+353 1 8810666
+339 1 8832000
+329 1 8853333
+349 1 8874666
+323 1 8896000
+351 1 8917333
+359 1 8938666
+357 1 8960000
+341 1 8981333
+333 1 9002666
+335 1 9024000
+328 1 9045333
+347 1 9066666
+343 1 9088000
+369 1 9109333
+331 1 9130666
+344 1 9152000
+330 1 9173333
+346 1 9194666
+337 1 9216000
+341 1 9237333
+338 1 9258666
+329 1 9280000
+360 1 9301333
+336 1 9322666
+341 1 9344000
+341 1 9365333
+345 1 9386666
+351 1 9408000
+349 1 9429333
+336 1 9450666
+326 1 9472000
+349 1 9493333
+343 1 9514666
+357 1 9536000
+342 1 9557333
+325 1 9578666
+346 1 9600000
+326 1 9621333
+402 1 9642666
+331 1 9664000
+339 1 9685333
+371 1 9706666
+314 1 9728000
+310 1 9749333
+364 1 9770666
+338 1 9792000
+339 1 9813333
+337 1 9834666
+355 1 9856000
+351 1 9877333
+332 1 9898666
+316 1 9920000
+474 1 9941333
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb b/media/codec2/hidl/1.0/vts/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb
new file mode 100644
index 0000000..0d82593
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_amrwb_1ch_14kbps_16000hz.info b/media/codec2/hidl/1.0/vts/res/bbb_amrwb_1ch_14kbps_16000hz.info
new file mode 100644
index 0000000..f6a61d4
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_amrwb_1ch_14kbps_16000hz.info
@@ -0,0 +1,494 @@
+41 1 0
+41 1 20000
+41 1 40000
+41 1 60000
+41 1 80000
+41 1 100000
+41 1 120000
+41 1 140000
+41 1 160000
+41 1 180000
+41 1 200000
+41 1 220000
+41 1 240000
+41 1 260000
+41 1 280000
+41 1 300000
+41 1 320000
+41 1 340000
+41 1 360000
+41 1 380000
+41 1 400000
+41 1 420000
+41 1 440000
+41 1 460000
+41 1 480000
+41 1 500000
+41 1 520000
+41 1 540000
+41 1 560000
+41 1 580000
+41 1 600000
+41 1 620000
+41 1 640000
+41 1 660000
+41 1 680000
+41 1 700000
+41 1 720000
+41 1 740000
+41 1 760000
+41 1 780000
+41 1 800000
+41 1 820000
+41 1 840000
+41 1 860000
+41 1 880000
+41 1 900000
+41 1 920000
+41 1 940000
+41 1 960000
+41 1 980000
+41 1 1000000
+41 1 1020000
+41 1 1040000
+41 1 1060000
+41 1 1080000
+41 1 1100000
+41 1 1120000
+41 1 1140000
+41 1 1160000
+41 1 1180000
+41 1 1200000
+41 1 1220000
+41 1 1240000
+41 1 1260000
+41 1 1280000
+41 1 1300000
+41 1 1320000
+41 1 1340000
+41 1 1360000
+41 1 1380000
+41 1 1400000
+41 1 1420000
+41 1 1440000
+41 1 1460000
+41 1 1480000
+41 1 1500000
+41 1 1520000
+41 1 1540000
+41 1 1560000
+41 1 1580000
+41 1 1600000
+41 1 1620000
+41 1 1640000
+41 1 1660000
+41 1 1680000
+41 1 1700000
+41 1 1720000
+41 1 1740000
+41 1 1760000
+41 1 1780000
+41 1 1800000
+41 1 1820000
+41 1 1840000
+41 1 1860000
+41 1 1880000
+41 1 1900000
+41 1 1920000
+41 1 1940000
+41 1 1960000
+41 1 1980000
+41 1 2000000
+41 1 2020000
+41 1 2040000
+41 1 2060000
+41 1 2080000
+41 1 2100000
+41 1 2120000
+41 1 2140000
+41 1 2160000
+41 1 2180000
+41 1 2200000
+41 1 2220000
+41 1 2240000
+41 1 2260000
+41 1 2280000
+41 1 2300000
+41 1 2320000
+41 1 2340000
+41 1 2360000
+41 1 2380000
+41 1 2400000
+41 1 2420000
+41 1 2440000
+41 1 2460000
+41 1 2480000
+41 1 2500000
+41 1 2520000
+41 1 2540000
+41 1 2560000
+41 1 2580000
+41 1 2600000
+41 1 2620000
+41 1 2640000
+41 1 2660000
+41 1 2680000
+41 1 2700000
+41 1 2720000
+41 1 2740000
+41 1 2760000
+41 1 2780000
+41 1 2800000
+41 1 2820000
+41 1 2840000
+41 1 2860000
+41 1 2880000
+41 1 2900000
+41 1 2920000
+41 1 2940000
+41 1 2960000
+41 1 2980000
+41 1 3000000
+41 1 3020000
+41 1 3040000
+41 1 3060000
+41 1 3080000
+41 1 3100000
+41 1 3120000
+41 1 3140000
+41 1 3160000
+41 1 3180000
+41 1 3200000
+41 1 3220000
+41 1 3240000
+41 1 3260000
+41 1 3280000
+41 1 3300000
+41 1 3320000
+41 1 3340000
+41 1 3360000
+41 1 3380000
+41 1 3400000
+41 1 3420000
+41 1 3440000
+41 1 3460000
+41 1 3480000
+41 1 3500000
+41 1 3520000
+41 1 3540000
+41 1 3560000
+41 1 3580000
+41 1 3600000
+41 1 3620000
+41 1 3640000
+41 1 3660000
+41 1 3680000
+41 1 3700000
+41 1 3720000
+41 1 3740000
+41 1 3760000
+41 1 3780000
+41 1 3800000
+41 1 3820000
+41 1 3840000
+41 1 3860000
+41 1 3880000
+41 1 3900000
+41 1 3920000
+41 1 3940000
+41 1 3960000
+41 1 3980000
+41 1 4000000
+41 1 4020000
+41 1 4040000
+41 1 4060000
+41 1 4080000
+41 1 4100000
+41 1 4120000
+41 1 4140000
+41 1 4160000
+41 1 4180000
+41 1 4200000
+41 1 4220000
+41 1 4240000
+41 1 4260000
+41 1 4280000
+41 1 4300000
+41 1 4320000
+41 1 4340000
+41 1 4360000
+41 1 4380000
+41 1 4400000
+41 1 4420000
+41 1 4440000
+41 1 4460000
+41 1 4480000
+41 1 4500000
+41 1 4520000
+41 1 4540000
+41 1 4560000
+41 1 4580000
+41 1 4600000
+41 1 4620000
+41 1 4640000
+41 1 4660000
+41 1 4680000
+41 1 4700000
+41 1 4720000
+41 1 4740000
+41 1 4760000
+41 1 4780000
+41 1 4800000
+41 1 4820000
+41 1 4840000
+41 1 4860000
+41 1 4880000
+41 1 4900000
+41 1 4920000
+41 1 4940000
+41 1 4960000
+41 1 4980000
+41 1 5000000
+41 1 5020000
+41 1 5040000
+41 1 5060000
+41 1 5080000
+41 1 5100000
+41 1 5120000
+41 1 5140000
+41 1 5160000
+41 1 5180000
+41 1 5200000
+41 1 5220000
+41 1 5240000
+41 1 5260000
+41 1 5280000
+41 1 5300000
+41 1 5320000
+41 1 5340000
+41 1 5360000
+41 1 5380000
+41 1 5400000
+41 1 5420000
+41 1 5440000
+41 1 5460000
+41 1 5480000
+41 1 5500000
+41 1 5520000
+41 1 5540000
+41 1 5560000
+41 1 5580000
+41 1 5600000
+41 1 5620000
+41 1 5640000
+41 1 5660000
+41 1 5680000
+41 1 5700000
+41 1 5720000
+41 1 5740000
+41 1 5760000
+41 1 5780000
+41 1 5800000
+41 1 5820000
+41 1 5840000
+41 1 5860000
+41 1 5880000
+41 1 5900000
+41 1 5920000
+41 1 5940000
+41 1 5960000
+41 1 5980000
+41 1 6000000
+41 1 6020000
+41 1 6040000
+41 1 6060000
+41 1 6080000
+41 1 6100000
+41 1 6120000
+41 1 6140000
+41 1 6160000
+41 1 6180000
+41 1 6200000
+41 1 6220000
+41 1 6240000
+41 1 6260000
+41 1 6280000
+41 1 6300000
+41 1 6320000
+41 1 6340000
+41 1 6360000
+41 1 6380000
+41 1 6400000
+41 1 6420000
+41 1 6440000
+41 1 6460000
+41 1 6480000
+41 1 6500000
+41 1 6520000
+41 1 6540000
+41 1 6560000
+41 1 6580000
+41 1 6600000
+41 1 6620000
+41 1 6640000
+41 1 6660000
+41 1 6680000
+41 1 6700000
+41 1 6720000
+41 1 6740000
+41 1 6760000
+41 1 6780000
+41 1 6800000
+41 1 6820000
+41 1 6840000
+41 1 6860000
+41 1 6880000
+41 1 6900000
+41 1 6920000
+41 1 6940000
+41 1 6960000
+41 1 6980000
+41 1 7000000
+41 1 7020000
+41 1 7040000
+41 1 7060000
+41 1 7080000
+41 1 7100000
+41 1 7120000
+41 1 7140000
+41 1 7160000
+41 1 7180000
+41 1 7200000
+41 1 7220000
+41 1 7240000
+41 1 7260000
+41 1 7280000
+41 1 7300000
+41 1 7320000
+41 1 7340000
+41 1 7360000
+41 1 7380000
+41 1 7400000
+41 1 7420000
+41 1 7440000
+41 1 7460000
+41 1 7480000
+41 1 7500000
+41 1 7520000
+41 1 7540000
+41 1 7560000
+41 1 7580000
+41 1 7600000
+41 1 7620000
+41 1 7640000
+41 1 7660000
+41 1 7680000
+41 1 7700000
+41 1 7720000
+41 1 7740000
+41 1 7760000
+41 1 7780000
+41 1 7800000
+41 1 7820000
+41 1 7840000
+41 1 7860000
+41 1 7880000
+41 1 7900000
+41 1 7920000
+41 1 7940000
+41 1 7960000
+41 1 7980000
+41 1 8000000
+41 1 8020000
+41 1 8040000
+41 1 8060000
+41 1 8080000
+41 1 8100000
+41 1 8120000
+41 1 8140000
+41 1 8160000
+41 1 8180000
+41 1 8200000
+41 1 8220000
+41 1 8240000
+41 1 8260000
+41 1 8280000
+41 1 8300000
+41 1 8320000
+41 1 8340000
+41 1 8360000
+41 1 8380000
+41 1 8400000
+41 1 8420000
+41 1 8440000
+41 1 8460000
+41 1 8480000
+41 1 8500000
+41 1 8520000
+41 1 8540000
+41 1 8560000
+41 1 8580000
+41 1 8600000
+41 1 8620000
+41 1 8640000
+41 1 8660000
+41 1 8680000
+41 1 8700000
+41 1 8720000
+41 1 8740000
+41 1 8760000
+41 1 8780000
+41 1 8800000
+41 1 8820000
+41 1 8840000
+41 1 8860000
+41 1 8880000
+41 1 8900000
+41 1 8920000
+41 1 8940000
+41 1 8960000
+41 1 8980000
+41 1 9000000
+41 1 9020000
+41 1 9040000
+41 1 9060000
+41 1 9080000
+41 1 9100000
+41 1 9120000
+41 1 9140000
+41 1 9160000
+41 1 9180000
+41 1 9200000
+41 1 9220000
+41 1 9240000
+41 1 9260000
+41 1 9280000
+41 1 9300000
+41 1 9320000
+41 1 9340000
+41 1 9360000
+41 1 9380000
+41 1 9400000
+41 1 9420000
+41 1 9440000
+41 1 9460000
+41 1 9480000
+41 1 9500000
+41 1 9520000
+41 1 9540000
+41 1 9560000
+41 1 9580000
+41 1 9600000
+41 1 9620000
+41 1 9640000
+41 1 9660000
+41 1 9680000
+41 1 9700000
+41 1 9720000
+41 1 9740000
+41 1 9760000
+41 1 9780000
+41 1 9800000
+41 1 9820000
+41 1 9840000
+41 1 9860000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_avc_176x144_300kbps_60fps.h264 b/media/codec2/hidl/1.0/vts/res/bbb_avc_176x144_300kbps_60fps.h264
new file mode 100644
index 0000000..da1e75d
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_avc_176x144_300kbps_60fps.h264
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_avc_176x144_300kbps_60fps.info b/media/codec2/hidl/1.0/vts/res/bbb_avc_176x144_300kbps_60fps.info
new file mode 100644
index 0000000..5456309
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_avc_176x144_300kbps_60fps.info
@@ -0,0 +1,62 @@
+28 32 0
+10 32 0
+4780 1 33333
+960 0 100000
+480 0 66666
+246 0 50000
+264 0 83333
+1160 0 166666
+404 0 133333
+237 0 116666
+193 0 150000
+936 0 233333
+384 0 200000
+199 0 183333
+275 0 216666
+1086 0 300000
+520 0 266666
+301 0 250000
+270 0 283333
+1232 0 366666
+559 0 333333
+287 0 316666
+274 0 350000
+1084 0 433333
+485 0 400000
+307 0 383333
+284 0 416666
+1052 0 500000
+504 0 466666
+298 0 450000
+327 0 483333
+1189 0 566666
+358 0 533333
+172 0 516666
+185 0 550000
+1115 0 633333
+463 0 600000
+218 0 583333
+255 0 616666
+1155 0 700000
+622 0 666666
+356 0 650000
+341 0 683333
+1240 0 766666
+610 0 733333
+341 0 716666
+380 0 750000
+1326 0 833333
+620 0 800000
+396 0 783333
+353 0 816666
+1196 0 900000
+623 0 866666
+375 0 850000
+362 0 883333
+1192 0 966666
+654 0 933333
+359 0 916666
+352 0 950000
+828 0 1016666
+436 0 983333
+401 0 1000000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_avc_640x360_768kbps_30fps.h264 b/media/codec2/hidl/1.0/vts/res/bbb_avc_640x360_768kbps_30fps.h264
new file mode 100644
index 0000000..1d8c68f
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_avc_640x360_768kbps_30fps.h264
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_avc_640x360_768kbps_30fps.info b/media/codec2/hidl/1.0/vts/res/bbb_avc_640x360_768kbps_30fps.info
new file mode 100644
index 0000000..b5f3b9b
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_avc_640x360_768kbps_30fps.info
@@ -0,0 +1,242 @@
+29 32 0
+9 32 0
+38469 1 66666
+3270 0 200000
+443 0 133333
+246 0 100000
+214 0 166666
+2280 0 300000
+368 0 233333
+238 0 266666
+688 0 433333
+287 0 366666
+234 0 333333
+172 0 400000
+1363 0 566666
+273 0 500000
+166 0 466666
+182 0 533333
+3731 0 700000
+349 0 633333
+216 0 600000
+229 0 666666
+6061 0 833333
+408 0 766666
+271 0 733333
+241 0 800000
+7004 0 966666
+442 0 900000
+261 0 866666
+229 0 933333
+7354 0 1100000
+404 0 1033333
+264 0 1000000
+198 0 1066666
+4542 0 1233333
+286 0 1166666
+205 0 1133333
+131 0 1200000
+3329 0 1333333
+216 0 1266666
+136 0 1300000
+2353 0 1366666
+986 0 1400000
+808 0 1433333
+318 0 1466666
+62 0 1500000
+55649 1 1533333
+1606 0 1566666
+2935 0 1600000
+3564 0 1633333
+3324 0 1666666
+4543 0 1700000
+1740 0 1733333
+2737 0 1766666
+2762 0 1800000
+3185 0 1833333
+3238 0 1866666
+3395 0 1900000
+3421 0 1933333
+3482 0 1966666
+3370 0 2000000
+3656 0 2033333
+3509 0 2066666
+3684 0 2100000
+3732 0 2133333
+3366 0 2166666
+3374 0 2200000
+3202 0 2233333
+3449 0 2266666
+3360 0 2300000
+3372 0 2333333
+3460 0 2366666
+3511 0 2400000
+3471 0 2433333
+3330 0 2466666
+3377 0 2500000
+3744 0 2533333
+3667 0 2566666
+3867 0 2600000
+3776 0 2633333
+3329 0 2666666
+3876 0 2700000
+3385 0 2733333
+3566 0 2766666
+3301 0 2800000
+3570 0 2833333
+3132 0 2866666
+3487 0 2900000
+3270 0 2933333
+3472 0 2966666
+3487 0 3000000
+3503 0 3033333
+3443 0 3066666
+3528 0 3100000
+3258 0 3133333
+3707 0 3166666
+3120 0 3200000
+3347 0 3233333
+3372 0 3266666
+3161 0 3300000
+3393 0 3333333
+3399 0 3366666
+2905 0 3400000
+3543 0 3433333
+3103 0 3466666
+3099 0 3500000
+3457 0 3533333
+3191 0 3566666
+3290 0 3600000
+3312 0 3633333
+2955 0 3666666
+3341 0 3700000
+3102 0 3733333
+3186 0 3766666
+3180 0 3800000
+2839 0 3833333
+3089 0 3866666
+3110 0 3900000
+3165 0 3933333
+2684 0 3966666
+3082 0 4000000
+2694 0 4033333
+3051 0 4066666
+3002 0 4100000
+2929 0 4133333
+2676 0 4166666
+2411 0 4200000
+2874 0 4233333
+2572 0 4266666
+2420 0 4300000
+2500 0 4333333
+2137 0 4366666
+2344 0 4400000
+2028 0 4433333
+1754 0 4466666
+1627 0 4500000
+1375 0 4533333
+1069 0 4566666
+801 0 4600000
+21689 1 4633333
+261 0 4733333
+76 0 4666666
+45 0 4700000
+334 0 4800000
+61 0 4766666
+1577 0 4933333
+280 0 4866666
+72 0 4833333
+479 0 4900000
+2181 0 5066666
+919 0 5000000
+349 0 4966666
+534 0 5033333
+4860 0 5166666
+759 0 5100000
+677 0 5133333
+3101 0 5300000
+498 0 5233333
+327 0 5200000
+213 0 5266666
+1640 0 5433333
+259 0 5366666
+162 0 5333333
+148 0 5400000
+2130 0 5566666
+397 0 5500000
+191 0 5466666
+180 0 5533333
+1757 0 5700000
+338 0 5633333
+194 0 5600000
+141 0 5666666
+1103 0 5833333
+289 0 5766666
+149 0 5733333
+148 0 5800000
+3914 0 5966666
+1025 0 5900000
+714 0 5866666
+428 0 5933333
+4604 0 6100000
+1456 0 6033333
+699 0 6000000
+892 0 6066666
+4535 0 6233333
+1301 0 6166666
+708 0 6133333
+592 0 6200000
+2175 0 6333333
+603 0 6266666
+411 0 6300000
+1813 0 6366666
+5055 0 6466666
+1538 0 6400000
+2201 0 6433333
+6249 0 6533333
+1420 0 6500000
+2254 0 6566666
+2441 0 6633333
+293 0 6600000
+2062 0 6700000
+213 0 6666666
+2455 0 6800000
+344 0 6733333
+204 0 6766666
+3920 0 6933333
+751 0 6866666
+376 0 6833333
+337 0 6900000
+2882 0 7066666
+457 0 7000000
+222 0 6966666
+184 0 7033333
+2734 0 7200000
+472 0 7133333
+185 0 7100000
+250 0 7166666
+2735 0 7333333
+301 0 7266666
+307 0 7233333
+109 0 7300000
+1852 0 7466666
+322 0 7400000
+153 0 7366666
+195 0 7433333
+1506 0 7600000
+350 0 7533333
+170 0 7500000
+145 0 7566666
+2123 0 7733333
+430 0 7666666
+364 0 7633333
+190 0 7700000
+1296 0 7800000
+196 0 7766666
+858 0 7833333
+3865 0 7933333
+693 0 7866666
+1606 0 7900000
+4884 0 7966666
+2821 0 8033333
+2211 0 8000000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_flac_stereo_680kbps_48000hz.flac b/media/codec2/hidl/1.0/vts/res/bbb_flac_stereo_680kbps_48000hz.flac
new file mode 100644
index 0000000..db94d8e
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_flac_stereo_680kbps_48000hz.flac
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_flac_stereo_680kbps_48000hz.info b/media/codec2/hidl/1.0/vts/res/bbb_flac_stereo_680kbps_48000hz.info
new file mode 100644
index 0000000..0355295
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_flac_stereo_680kbps_48000hz.info
@@ -0,0 +1,415 @@
+42 32 0
+1386 1 0
+2401 1 24000
+2321 1 48000
+2367 1 72000
+2370 1 96000
+2334 1 120000
+2396 1 144000
+2375 1 168000
+2431 1 192000
+2428 1 216000
+2334 1 240000
+2261 1 264000
+2124 1 288000
+2152 1 312000
+2295 1 336000
+2183 1 360000
+2393 1 384000
+2400 1 408000
+2246 1 432000
+2289 1 456000
+2400 1 480000
+2335 1 504000
+2294 1 528000
+2260 1 552000
+2206 1 576000
+2185 1 600000
+2155 1 624000
+2118 1 648000
+2094 1 672000
+2050 1 696000
+2059 1 720000
+2030 1 744000
+2022 1 768000
+2078 1 792000
+2082 1 816000
+2094 1 840000
+2111 1 864000
+2043 1 888000
+2023 1 912000
+2024 1 936000
+2056 1 960000
+2108 1 984000
+2138 1 1008000
+2140 1 1032000
+2111 1 1056000
+2110 1 1080000
+2137 1 1104000
+2157 1 1128000
+2174 1 1152000
+2200 1 1176000
+2203 1 1200000
+2237 1 1224000
+2261 1 1248000
+2215 1 1272000
+2133 1 1296000
+2091 1 1320000
+2088 1 1344000
+2122 1 1368000
+2139 1 1392000
+2146 1 1416000
+2231 1 1440000
+2282 1 1464000
+2273 1 1488000
+2304 1 1512000
+2292 1 1536000
+2255 1 1560000
+2181 1 1584000
+2081 1 1608000
+2012 1 1632000
+2011 1 1656000
+2066 1 1680000
+2069 1 1704000
+2120 1 1728000
+2141 1 1752000
+2148 1 1776000
+2181 1 1800000
+2176 1 1824000
+2240 1 1848000
+2297 1 1872000
+2325 1 1896000
+2336 1 1920000
+2329 1 1944000
+2299 1 1968000
+2322 1 1992000
+2347 1 2016000
+2287 1 2040000
+2286 1 2064000
+2269 1 2088000
+2320 1 2112000
+2305 1 2136000
+2384 1 2160000
+2429 1 2184000
+2370 1 2208000
+2365 1 2232000
+2361 1 2256000
+2370 1 2280000
+2393 1 2304000
+2342 1 2328000
+2325 1 2352000
+2334 1 2376000
+2316 1 2400000
+2317 1 2424000
+2305 1 2448000
+2360 1 2472000
+2331 1 2496000
+2332 1 2520000
+2361 1 2544000
+2417 1 2568000
+2438 1 2592000
+2403 1 2616000
+2386 1 2640000
+2382 1 2664000
+2350 1 2688000
+2355 1 2712000
+2383 1 2736000
+2384 1 2760000
+2383 1 2784000
+2373 1 2808000
+2374 1 2832000
+2347 1 2856000
+2353 1 2880000
+2381 1 2904000
+2401 1 2928000
+2401 1 2952000
+2385 1 2976000
+2382 1 3000000
+2328 1 3024000
+2303 1 3048000
+2272 1 3072000
+2270 1 3096000
+2312 1 3120000
+2273 1 3144000
+2330 1 3168000
+2339 1 3192000
+2296 1 3216000
+2317 1 3240000
+2440 1 3264000
+2353 1 3288000
+2346 1 3312000
+2303 1 3336000
+2308 1 3360000
+2287 1 3384000
+2316 1 3408000
+2367 1 3432000
+2335 1 3456000
+2350 1 3480000
+2395 1 3504000
+2408 1 3528000
+2413 1 3552000
+2415 1 3576000
+2468 1 3600000
+2437 1 3624000
+2372 1 3648000
+2371 1 3672000
+2341 1 3696000
+2328 1 3720000
+2273 1 3744000
+2244 1 3768000
+2233 1 3792000
+2229 1 3816000
+2252 1 3840000
+2236 1 3864000
+2217 1 3888000
+2179 1 3912000
+2251 1 3936000
+2192 1 3960000
+2199 1 3984000
+2212 1 4008000
+2190 1 4032000
+2102 1 4056000
+2120 1 4080000
+2167 1 4104000
+2024 1 4128000
+2010 1 4152000
+2067 1 4176000
+2035 1 4200000
+2051 1 4224000
+2012 1 4248000
+2066 1 4272000
+2025 1 4296000
+1987 1 4320000
+1972 1 4344000
+1966 1 4368000
+1999 1 4392000
+1987 1 4416000
+1922 1 4440000
+2020 1 4464000
+2072 1 4488000
+2021 1 4512000
+2017 1 4536000
+2099 1 4560000
+2064 1 4584000
+2109 1 4608000
+2093 1 4632000
+2090 1 4656000
+2148 1 4680000
+2184 1 4704000
+2179 1 4728000
+2152 1 4752000
+2143 1 4776000
+2159 1 4800000
+2123 1 4824000
+2129 1 4848000
+2147 1 4872000
+2192 1 4896000
+2051 1 4920000
+2116 1 4944000
+2124 1 4968000
+2088 1 4992000
+2073 1 5016000
+2146 1 5040000
+2133 1 5064000
+2073 1 5088000
+2059 1 5112000
+2044 1 5136000
+2012 1 5160000
+2034 1 5184000
+2053 1 5208000
+2013 1 5232000
+1981 1 5256000
+2094 1 5280000
+2076 1 5304000
+1968 1 5328000
+2028 1 5352000
+2031 1 5376000
+2020 1 5400000
+2019 1 5424000
+2030 1 5448000
+2015 1 5472000
+1962 1 5496000
+2070 1 5520000
+2087 1 5544000
+1964 1 5568000
+2069 1 5592000
+2034 1 5616000
+1994 1 5640000
+1985 1 5664000
+2030 1 5688000
+2066 1 5712000
+1954 1 5736000
+1733 1 5760000
+1649 1 5784000
+1652 1 5808000
+1631 1 5832000
+1656 1 5856000
+1672 1 5880000
+1667 1 5904000
+1696 1 5928000
+1672 1 5952000
+1701 1 5976000
+1651 1 6000000
+1674 1 6024000
+1695 1 6048000
+1702 1 6072000
+1707 1 6096000
+1694 1 6120000
+1727 1 6144000
+1730 1 6168000
+1708 1 6192000
+1704 1 6216000
+1735 1 6240000
+1758 1 6264000
+1753 1 6288000
+1748 1 6312000
+1763 1 6336000
+1737 1 6360000
+1783 1 6384000
+1839 1 6408000
+1861 1 6432000
+1832 1 6456000
+1947 1 6480000
+1939 1 6504000
+1926 1 6528000
+1896 1 6552000
+1909 1 6576000
+1869 1 6600000
+1900 1 6624000
+1896 1 6648000
+1883 1 6672000
+1903 1 6696000
+1895 1 6720000
+1865 1 6744000
+1878 1 6768000
+1881 1 6792000
+1861 1 6816000
+1791 1 6840000
+1787 1 6864000
+1798 1 6888000
+1811 1 6912000
+1824 1 6936000
+1895 1 6960000
+2079 1 6984000
+2034 1 7008000
+2038 1 7032000
+2018 1 7056000
+2030 1 7080000
+2067 1 7104000
+1982 1 7128000
+1911 1 7152000
+1904 1 7176000
+1874 1 7200000
+1876 1 7224000
+1944 1 7248000
+1977 1 7272000
+1977 1 7296000
+1979 1 7320000
+2012 1 7344000
+1961 1 7368000
+1773 1 7392000
+1780 1 7416000
+1801 1 7440000
+1892 1 7464000
+1869 1 7488000
+1936 1 7512000
+2154 1 7536000
+2226 1 7560000
+2159 1 7584000
+2253 1 7608000
+2286 1 7632000
+2214 1 7656000
+2111 1 7680000
+2027 1 7704000
+1994 1 7728000
+1882 1 7752000
+1887 1 7776000
+1993 1 7800000
+1962 1 7824000
+1982 1 7848000
+1966 1 7872000
+1962 1 7896000
+1928 1 7920000
+1878 1 7944000
+1857 1 7968000
+1885 1 7992000
+1919 1 8016000
+1904 1 8040000
+1909 1 8064000
+1909 1 8088000
+1933 1 8112000
+1824 1 8136000
+1756 1 8160000
+1733 1 8184000
+1705 1 8208000
+1755 1 8232000
+1756 1 8256000
+1725 1 8280000
+1761 1 8304000
+1736 1 8328000
+1706 1 8352000
+1662 1 8376000
+1604 1 8400000
+1613 1 8424000
+1692 1 8448000
+1736 1 8472000
+1779 1 8496000
+1768 1 8520000
+1758 1 8544000
+1708 1 8568000
+1642 1 8592000
+1645 1 8616000
+1581 1 8640000
+1651 1 8664000
+1731 1 8688000
+1743 1 8712000
+1717 1 8736000
+1715 1 8760000
+1646 1 8784000
+1551 1 8808000
+1563 1 8832000
+1649 1 8856000
+1742 1 8880000
+1724 1 8904000
+1676 1 8928000
+1664 1 8952000
+1587 1 8976000
+1497 1 9000000
+1503 1 9024000
+1644 1 9048000
+1658 1 9072000
+1680 1 9096000
+1611 1 9120000
+1694 1 9144000
+1668 1 9168000
+1677 1 9192000
+1604 1 9216000
+1567 1 9240000
+1639 1 9264000
+1552 1 9288000
+1486 1 9312000
+1494 1 9336000
+1480 1 9360000
+1509 1 9384000
+1457 1 9408000
+1423 1 9432000
+1459 1 9456000
+1444 1 9480000
+1424 1 9504000
+1413 1 9528000
+1498 1 9552000
+1455 1 9576000
+1393 1 9600000
+1638 1 9624000
+1919 1 9648000
+1979 1 9672000
+1894 1 9696000
+2002 1 9720000
+2062 1 9744000
+2098 1 9768000
+1919 1 9792000
+1738 1 9816000
+1890 1 9840000
+1971 1 9864000
+2429 1 9888000
+1861 1 9912000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_g711alaw_1ch_8khz.info b/media/codec2/hidl/1.0/vts/res/bbb_g711alaw_1ch_8khz.info
new file mode 100644
index 0000000..66e5480
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_g711alaw_1ch_8khz.info
@@ -0,0 +1,10 @@
+8192 1 0
+8192 1 1024000
+8192 1 2048000
+8192 1 3072000
+8192 1 4096000
+8192 1 5120000
+8192 1 6144000
+8192 1 7168000
+8192 1 8192000
+5462 1 9216000
\ No newline at end of file
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_g711alaw_1ch_8khz.raw b/media/codec2/hidl/1.0/vts/res/bbb_g711alaw_1ch_8khz.raw
new file mode 100644
index 0000000..cfc4a11
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_g711alaw_1ch_8khz.raw
@@ -0,0 +1 @@
+kogOÇÅØÕJvCusXÓÕIvJ~}KuY]ÁÈÄôôôÊØIrtBRTóùÇÚÆÖTÅùììãÿÕOeb}ÙþíéëáÁ[sggDôåàààåÆ^LLKeZQIÙ÷ñóPvxnmpUäíäþÜ`hfvùèïæçÃugmtewX[ß_XØÄÔÏÏØÁXÐÖyegqRÛøåÿáøTGesF|OÂõÉÐYßYuÂæïæÈJkkwøëçÇwbimLùäæìäØCz|ybpÃåãçáèø[vxxJBôÿõþô]qgau_ÝûàãåÂÆVe|UÁTOpIp`dqÐôÁ÷äØLBFKrevtysgf}sOÔBqRÜÜFqÜÍNNMqwZÂûçåûôÙsiaØûãèêíý[ebfÜäéèïøYxdx|J÷çäèêâØsxgffyÄüÙPLdf{OÚÌöñÑ@q`oz@ÎåÿËÚ_}blCðåçùÝFfimbd[ÍäåVFHr||dv\ØÇ_EÛÖIpa~ÐöúãçðR|`opñííøôDdnkdÝäëîýÕppCDØöñÍÉÄöñÝ[ÇÃS{RÓÜÌÏTÜSWÔPÕÎÉÈÕvFEV÷øÍ]qKrcgUäíçÆÔH`knc~wÃûÉSACwxcfdx~{fgg|Ldf|ÓõÅÕö÷ÐMgggFçéáB}LÜííÔx|uôåõñüÒÅÛÀñSu\qfg{XÄAsKw[WM^Xsvra}EÍàøñÿSr}`erOåéàçö\tjjdÙáæúÌvfoj`CÑóðSNszxcg`}ÙßÁçäçÈxz|@üäåâÿØUsHÖäîèêâæáøØ^QÄö÷ÂÆñòóØÐÌÎÏÃDygfsDÙòþæîçÇ_ZßWMv}OÓXDÜÉÈWxbkmLßþåÀNdisÖÛÝMvNdczuGPÎýüùðPv~e@ÌäáäÿûÂÕÓuPð÷ÏÆôàÿÐ]ycdpÍííïáð\daEÊúæùÐDZ^TÆàêäõZurd|WÄúãëàüðP{acHÌðùÄKsckibwÖÒW^Ô|nkjkaAÍÃß]Sdln}Å÷ÿúÊAu~rrXüçõÈÃýçýääñ×DEÇÕÏáíàÊFBDIÖÖÆÂÛÝÝSUÓÝ\uJB\_]U^@PØøúÌËÌD}gHåíêïäñúÿñåçæäþáîàûÛ~kbZÉúìîðgkgsydooaqWÔÑF|aieRÀ÷ÿü÷IdepDÝÁË×wtH\ÆÁ÷çøðÇÝÛWv|feUòåûûçåQJKSöàïÃ@syrÔåìãääãæ÷ÀÕðäáèïûÂöÀÚÄÅSXqRÃÜÜZq}{cblzNJsyok`q_UA{ikcH@}fd_ÚÈÍÔWQrA×ßÍÈÏ^~NÆÑÚöñýþó÷ZCÑðæåôõùÂNv\×WÅøáàâåGfmbEåëüÈÆAÓäíèâàì÷PSSÌ÷QPÄÏÚÅÂßghbe|vEqxcnkom|FFwd|ufhdzspKPKGSAtadMÂÛÄÁÈF|t\òíàÌYVSßßÃËÍÂØËøûÀÊÒ}maHÙÎçìíàÎM|qrJZÄÇËäáäåäñÒõãïèîý_K_Ï÷ØØÂÚSØÅQIEweddxx}aocd~sz{J}njmxPöþòÜGJI^ÅñåðÒôÍQZDFÖõåçÍÐÛHdli{^\ÛúåóDyrbn}[UÀÞôãæçûW×ÇÄíéúÃÈæåçéäùý×ÁÍÔÞóÎÜwzE^HRNwA}pAsx~ljj|@w\Ozxzt\sfef~KH÷ûÃQAOXÖöøòõÇ[CvgIÙöùóÇÐFuÑÖ@RÜT×TÇöðPygvqMöýþçàíáÞ@psNWËåäúýËñÁÌåüÄþúþÊÍÖT×ÝóùæúÊÓZxep^ßUÖÛXKRvMWWÉÓXGJA~``bbXðåùÆÓPeavqÑÿÉÂÏqcfdfeesJÒUrljhgMýáÉÕ×vMwlfPUÀóÆÚÀþïëãúÀÚóúããùøáúâìçàãÈÍðÑL]ÅøåôñÈþóÑßÃN×ÉØ÷[fyr`~|gfK^ÚÒNJH@s||jawqtH|ÚÙdLqfpX_þ÷Sqy~zwÍüÿíýPdhisYÉæýÅÅÊÈþÞwwÐTUðûóÇÑFYJpCóóöÌEI\ÒóàååæãýËÎXuÅÌÃÿðüãà÷_yyuÏíçFr|eLQDÏøÛØÞfeKBws|uBtB}`rI|YYBôÖ~s`jeATÐZBMFÝV^ÍXuVFw[s|@OBÖLrØÉñøÎ@[RÎþÿúÖDØÔÅãáïàòÎ\ÆçäãþÖ@YÚÿçìãòóÕe`zzEØ÷øä÷ÅÎ߯UupFÙúä÷@~vpv×ÞVöÌPKefpHIryvuL|amkj`ex}cmmcdSÿçåÉHxy~×ñõÌæàûþóýæàíêïçùæáúðýåãèïíãàÉÒÅÅðåäåúÀBrvpyx}I\ÞÊòSggrtQÞßöø÷ÑPws_ÊÂCsegzz{pee}{dze|s`lcglha{a`bjla~}gsÒþàæöÚÅÇóäåýçéîàááãèêêêéãìèïæùþåçáâîãùÿÄM}|eerqDD}aa~|IDÜõûúÏ|laz~wGWÍôÍÚY~sLGCDÑPEFNv|uÞÍÚØ[sdonmih`abiiagdp_ÕPDKMÑýâéìíêèàççàãáûÉuggpIßÎÝÖÔRF|c`d~suOÔÃööÁP}sWÞÕÜQETÓÞÊß@Nsyyddffacbbz_\DE|gf`f|`lbnniknlg|spBSÃÜßÞ^ÑÏðùäóýáçúääìîëîèèêäÛÔÚÄÃôËóñÿùÜt}p\ÍóñùýÌÌTVMsI_LuK|zzdgmiolgd`lncfdzflii~LSVEXÑÝÕX@GTòäå÷ÆÆÏÄÂòýðòóõÉØÑÜ÷ËöüüüÿæáåöÎÈôüæãããéêïþùáíæååúåàîïçóòçæäçýóõÏÂU}mhhmojjhinjjo|LvBST×_s{d}Y×ßR\ÑVPYqpMÜùçöÇõüúäáçøþûìèãþÄÜÑSÐÔØñåçþWtGZÉæàíæøúôÓGFÛ÷óåáåÿóüùôñðûììèâþòËÊÀ^tzgzypga|{psd~glikmobammbobaw×ÞÃAtEqZßD^ÓÆåçýðôóö÷üÙPÊþáâûòòðþæàçþäøûçñôüñúïììîèíóDz\ÃðíäÎÈÑWÇTÑüäãâãáõËÅXXqd|qpLuajngtrc`nkmxyeailfcafim~}F@}}ddd{|rVóäàåÛWØÎÿääþÏðóöüÙÅóúéãÿñõËõ÷ÊðáâãéûÏþûûýôËÉñÊÃ÷ÏÚýååçýöúäíèãñ_QU[ÑSqqrytt~|wFwajjocaafdbcfbqÁÀÈØQÑÑPÖÔLJQÎüû÷^NJp\ÅÊÏÍõÙVYFÔýæìãüùççâæùçæâíéèàææûñÌÇÃüûæú÷ÂBZÑôþõþúùæýÖ[RÚÞÑ^Ig`blxgfy}Gugac`aa`afey~H~dsJ]^NpevHsqwp{g{IwswITÖNdIßÄó÷×[RÞÿçþôõüòÂÈ÷ûâáæäüþüäèáãàçäúòúèäææçåÉõôÂÇw`b||tgmhakkcdqfxxuDydinbduXÅusqa|e~v_ÉÚÞC~c`O×öÝXÔvEv{|pPQÊÍBq}Z]ÇÍËåùáæäàúâããíçæäçâéìàíçàæøæýùúúåÀS_õãïìáþUy|_FAT_Ing}CBppxdad~z|pAtdgeSDuO|pyx|FRMÒÁôÇLqyÖÉôÌZ[daeFKZ\ÝÁZpz×ÊÊýÅÏTITÓúùðùøåÏÃÞÿããïçááñ÷ÉæíãâàìäôÛôíëãäòWÖVßÛÖÓRÒXxmhm`eaduxdv@v|dptdmib{uyg{ccf|EQÃÔ_Xr{^ðåùQApafUÓÑD@ÖJrztÌõóõÂÎÙÚÀÿåæãçáääþöáãîîàáåçäíîææûøñÆ]AóùÿøÙÖ@[[R÷ÀÄÇPw}dkasLÃPu{ysÝÕDGsg``igAtMqbkkinrCIXursvxuÎ÷òöPHIB}HAs]ÞÜÒÕsetNõãæåòÃPÚñÇôýñýÿÎPòæâêâøúæçâëâíìúñÊöÁøáÿäÉv~~ywÈ÷ôýÓGLp`awvÝÁ@Bvdb~tsÕÑY]\qd|zvDzdgabbgcyCKtp{ctRÑ÷PAvxgfBJL@}{zcy_Ààçý÷ñüýïîíìúýÌÌÔÝùäíàíëëìëëâïãàûóÅRÌöûþÚZr}esSVÄÑTM~aizLÀóõÆEM}rA@MBHHqq{~@SÕCLprdlc```dzspdeGÑÄÑFr`cbxHpsDXLJuuÃäãéãÿÃÃUÖðúùùýÂÓBy@ÉôúìëííáçíáçãèîãâòôúþüÚMaf{dBÓPDÜËÚÄHvÛÒÒÕÚB|JATÔÙÀ÷Mq~`}sGTÖBadoo`aeeFCu}beKÕÁÂÄtMvtZpxdqIxeb{uBÛÁýÄÀ÷ÉûûøäåçñÀ\GßÚøøçäúçûãïïâïëéæòÇÊÃñÎ_qlggt^ÝÚ÷ý÷Ô^ÓýçäñùÝGxxtG]uQZylnicr[CPvzdd{~[qGÐ×tygeBÖK@Zswt]KSuCÜRve}q^ðõÄÄGLMÝÓåìúåÉÔLOPÂãìäçõSFÉÿûíäïïäËÁñýâéåýWreHqÍÈõÎVKpÕÞöãûöÙ|``I]ÃôÉÌ\rduO^ÆÚÕOgcaquAÒÑTpcjieVÐ^vfm`JÒÀÉÍßJfkfJÑüóóÙ}lopÆúïììüÓBSÒÄàëêàñ×ZÅüàîüÚÍõçàäö[ebfvEÃõÎÆJ~~L×ôààóV}dgwÙ÷ôMxboio{FðûÛw`knsZÛ×Ñ^xb`wÛøÈ\q|s|ÙþíâþôÚØG\Åôû÷_p{d`MõóðÉÍÞÓÑÚñûãâðXv@@_öþæåóüü÷ÞÉáàçßry{pËæçòÚÆÝTÜÄþýøóArxqKÙðËÞJNMuKwÅñÉÜ{fmlbeCGBKt|fa{KLp@}gcdKVØÇÚRBC\ÖÓÅØÓÜOeyKÞøüÃQYP]S÷àìâãåÃFMÇòáæáæòõ÷óøáíàþÈ×L{}qÛýÉÃÞÈôÉöøäðÅÍÄCzqtEYex{y~CFÑÁ]BsebzrÝFregdqDØñDtAvgdMSöô×ÖC_ÜùæüçðØZyggwwWÃAv|O\Õ÷òíæÃÝ_@BÒÎðåòÌÖÖÄòäûäçðÌÓÒTÛÏóáåÃ@\ÀðþúããüÙY^uCÜËýÀ[xadwÞðççñEciibrqAI{nlxBÐÓÒDygzt}LRÓÒNxceZÝñ÷ÃËÅ[uABÑÛ]QLpgx×ÊæííãüÞÖõòþâíïæÏXNÜôáîàçþÃ^BGFÛÂÂÙ@~fpÑþáåøõULNÔÔÍÉÓ×sf`eDÚÿóÈÖNw|uFYPtpzmio{GÁUGGBY_ÛÂÚÆÜÛEyzyZßüääþÃÕDF_ÑÆVGr`lozÕûæåóßEuHÑÍõÏñÀu{xFÓóçççüñåùåæàæûòÏÆÚÀòçúÇUÕGEÑÉåúôÜÑtdeYÌñ÷÷ÚwqLsHAC}eljorÕ@wHrxp}]ÎÞTVXyewMÐñÌÑÒux_ÜÂüäòÑ[x~wp×ÿþÏÂÈÊåääíìåõ÷×HRQÒýùõ÷òÀôùüåäþÍÐEq@HwÜö×JtrtUÛòáåÜQ@z`gsÒöÆËöÛ]ÐÑ\×Ôt}`jjinopJ|wI^ÆôüççñÊÎÀÆÐÕ×ÂØAGBtZÇÃÞÞ_K~eexxeNÑVEF\ÇÚÜËúøÍÕRMp|pTðñÊùäúåçííæùðòùý÷ÍÂ÷Í\MXWßÅõõÈÜA×ÂÙR\ÒÒPFXÇßÒÁ÷ÏQNydammolozqgzsJVÛÜÞÁRuFFHxID_tORG[ÝÚWÒPsKPTÛÚÛ÷ýöÉþåæááíâç÷ÄöÑvwHRÙ]DÄÂÁþúúùÉõôñÏÞß]NpsrwCHWØÝÎôÝXÝÖXSPÐßWÀÄÔ]ÖÎÁÒ@JqydcdepLGCuLÜÓA\ÓßÛÃÎÂÕXIqpsD×ÒÆÅÝT×Kp@AHtHOw@߯ÍÇôýþçúðÓØÀOvq]ÞÞÐÕÌÊðÿÿúüýöÿçðõðýÄ^_PÖÐEUW×Ò@@tTÄרÞÚUØÂWÏØØÅÝßMqx~xbadz{z~d{rpGE]ÖÜÜ]ÅÛ]SOqx~pS[×ÒÏÊWZBWÍÎÈ÷óýóöÁðåøçäùñËÀÔÖTÖÚÛÌÕÕU^Q^A[ÜÂÆÚÐÃÊRGNwMHOwru@FRÄÜÌÍÁþúòöÊÃÛÑRØðòÀÝUHzagzwutBMvwOHK_RÒÒWÑSTÞÍÃÖRY]Zw}EBLGH@LBE_R[PGA\PÒÂóöóòÎÂÜSÕÃð÷ÃTTÃÎÄÌüúäáøðüðüäúõÛÝSNvqCS[YÐP]ÓÐÓÞÉÎÍÚ[NSÖÐØWXWXwpydxp}~}|x||zdzsZ@wJUÜÒÊÊÌÙ]BCAF_PSEML\ÙÙÒÀóðôÊÆ÷ûáãçúûþÂW[D_×ßSNw@PUßÅÉñóñÌÞØÝÓÝÇõÉÅVAsvIptKZFCQÜØÄôþüËÝÚËýòÌÛUStqr}tCZMv}|sKGFUÜÐRwvYÖÄÛÎðßNtL@MA_Swqp}ydzwRVØÍÍÊ÷ðÌÅÌÃÃÄ×TÛÃÛÄÄÙ×S[ÄÅÐÏüùóøûþøçàææýÆWqtMG@ÑÓQÑ^X\VÜÚöðÂßÜÄËÁ^ÛÏ[uCqgacgdgxysvtutuNp|Kw|BÓÚõòõÔBu@__VÆÁÄÑ^usqBQÚËõóüñýüòúåüòýÍÙUTUXANvt_ÒØÝßÝRDSÝÞÆñýóòÈØT[Y[PTÒÓÛÐCuwO×ÍÿáçùüòöÊÜØÃÃØSHg`gex|spCJvAJJC[_WÝÉóËÞ]@t~|LSSÔ_@Yqrp~{tÑÎ÷ÁÁÃÄÄÍÀÉðòýÝOGKXÜÚÉðóÉÀÜ×[\TÇÌÉýüøóñøòôÀÖQUØßØÝUÔQA@_PÆÉõÄÐÒWÄõÍÓÛÏÌ^qe`l`de{swrr|CFPUÙËÀWÕÒWÅÒRGLQÑWZ×Þ]EtF_ÒóþÿüÉÝõÇÑÃÈóøýÍÇQX_@_PÐÝ_CXCwD@]ÂÛÆÏÆ^_PÑÈÐTÖÁÅ×ÜÜÖÑÇÖ^ÔTÙôñððÁÊþòýñððÊÄBdd|y|L^]Osyp}vAAX^×U@Lwt\ÑQZNuGAL@DYWÓSMBQRAÒÚWÑÂñòËÂ÷ÍÇÚÞÓØßÐÆÃöÀA×]QÝÒÇØØÔÀÖSÖQÁöòöÍÔÑÄTÃßTÄØÜÐÕ^ÙÄÉôÃÎÍÏÚÜQÕÜHBwsr{ee}e}ec``ywIG×ÑÞÉØËÃØñÿÌÔEuSZ[QP_]\IJqJ]ÖÎÌöùåÿøûôòðÂÜV[P]HPÙÝÕCtptPØUÝÝQÇÆÒÖÔÖÌÍYNwuQßÒÚöååÈÚÐ]ÓÙÂöðñþðÍËÍÙÄÒ@NNvpy~wttt}~|tGu|vLB[FFSØÁ÷ÃAt}JMGWÄÁÑ^CBDÐÙÐØÍÅÒÐÝÉÈÚðøóöôÁÐP]Ú÷ÉÆRVËÄÙÒEYÖ×ÛÜÖ÷ÿÂÇÔMAYUÙßÁðÌÜßHrCuZØËøþÙÞÇÙÈËÚÆÐRUqegg}gadgJsv|eCÐÜÀÍöåòËóÓG_K@ÓÑÆËSBLt@RTØÀÊóÅÙ÷ÊýäñÃóðñôZvHuZÓÑ\XVÕ_GXu@XwIØËòùßS^vwF\×õóõÅÚÀÆÊÇÝÅýúùòV_PPØÈÉÒÂÑJKJvuXLwysOHw}~y}}uCAQPZPTEÑÝ@@YÀÿöÐAqywu^ÇÅöüÚP×Ý÷ÿþûøçáåÏÄÕRÐÐÂÂP^VwqQWUÖ[IDÁòðÄÅÚTG@TØÚÊüÝTßYV×YMÚôô÷ÞU\ZYÒËÉÓ_Fxds}tJrpJ|{yevsKL_]ßÃÓÛÏõÏß]]ÀÂÉ÷Ý@CKs@WÚÎËõÛÜÛÃÎðòûãæøåöÕÓPG[X_QF}stCY[AINVÛÐÏËÖÇÒRGO^ÀÎÓÊôÇÛÛÃÉóçæóðÎ[@LGYSÔ×M{rr~wYVYÕÄßwqtz{r~|qOHvADH@VVRÒÊýõöÊÙUYDN_PÁÇUÐÙÕ_Þ÷óûáçüôÆÞÇÎËôôÈõßFHXAKWTAMSÒÐÝÝÚÕ_QQCMTÜVUÇÙÞÍÊÉôôØÐStJuEÔÅÄÊòÀ\tHuvGWQS_LKzmadewwJtC__UßÄÇÉÃÌÊÄÏÐ^YMvJÑßÀÍËÁSVØÀØòåúüÊÿËÔÐÃÀÚöÊÉÐÑ_OZ\ÕÔÌÀÔXF\KvIZCAÒÁÙ]UÖSWÄôÎÌýäòôôÛ_HERTÆòËÑÕMr|MECÕÄÑtwO~aar}xHUYsrrvtIOH]ÑÑÔWWZLGÕPDÛóÈÅÁÆÛÜÁÎÏõåáåÿüþÉÄöñöúåö÷ÞÔÕVÐÕUÖÁÑDuyxe|ZG_ÎòôÄWÒÇÕÓÄÁÂööðÇCLwpJwMÒÚÕRYÕÕXS_LWÇÝÜ_vrecezqEDGOqrtZ]NAË÷ËôØRUCAUZVÙØßÖÜÂÌõËØÀñòäúôÌõÄÍÊÃðøðÄßÛÔ[PXptWÄÆPLwyf}wuÒ÷÷ÁÒÑÔÙÈÛWÃúäýðñÆ]D×^DÕßÇURÇÅÑRw}sEWPZ@t}eacf|wIr|CuvKvsNÍöõØßYtstHJ×÷öÑÙÿñôÇÅÒÙ÷ÁöðóòýóÈØßøáúòðæåÿÃPEAÅÒÕYuv{mbaeEÃ÷ôôóõÂÝÔWÃøóÏÎõß]s}|~\UDFÕÊÂÞSApwZGZBwICymnbp}NPW[XGCAÒ÷óþýÌÝ]w~rZÉôÏÎõðôÎPGVÞñõñûúúýÏW[ZÂñôýðååþÃQ^EÔ[Y×^usdcgx]×Ùòö÷ÙÓ][XÚùôöýò÷Ú_wOvG×RßÝÌÍÞYHvpFHCYqps{gddwFwBGJ|yqtZÉÃóøÆEvr{{yÑ÷ÇõñýñÊÞPPUõöøàççåñÞÖTÊøåàæûùù÷ÕPßÊÅØÒAqza`ddIVWÄÛÁÏÈÈÇÁÉþÿöÇTßGrd`fpMDÒßËÈÆÔIAFTÑÒÕBI{gmiatMF_uJwJtuÝÊøýòñÏßRI~|ZPÛÀÐÈóôVZÕÝÊöäàáàçô\MMUÁöùýýüÊÚTÒ÷ýÍØÅDNvefd|BV]QE]ÛØÒÝôþðÂÁÎßÈËQMuKASUÂÊô÷ÛRtI]]WQQDIennmgw^_PAvp}{}_ÄÁÚßÙÐQGHNN_×ÔRWÕRVÐ[LEYQØðæíïïáðÂÉÎöûáàáäÿÄÕÆÆÚÙQRDtsyz}uJEYLC_QØÙÂþûðÈÙÐUY^WNuvsFDVÄÍÄÉÔIDNqNJ[]Ire`gzyDTQÒWXRvw×ÐUÚÐ]_AX[J[UYÖÞÔÞÑÓÏ×GQX^ÁÍòãíìãøðÃÐÍñóåäþöWRØSQÓ\[PE@HvCDNADutBTÌõüäÿòñÌÚÝWVVILJwE_ÕÆöÊÄÒÕPvqDQÜÖSJgcaf`~uutHMHwJA\YZ_@HF^YTÆS\ÕYZYWÖÖÓVYHLTÎåàëîáæûÇÉóøãíííç÷ÇÜWXEÝßÑßPFGLp_RICvrG]ÔÌÈÁÛØÌÅØÍÔ^SNyvqJUQß÷Ù[DvrwuWÑØRzecarrKEG]ÕPSÖQSÞÝU×ÝÑרÜ×WR@_\EQÓ×SPLuDÓÅÿááâåùÊÅËòæäàãúõÒÓM_YDEZÞWU]ÖÝ\VSD|ytt^ÚÌÉÃÄÓÞÀÎòñÉÁVGL]TRÅÃØCr~y|DRÞÉÂEwrytC}qOtvrwZDAXu}LHOÖV^[P^_ÕÚÀÄßS\H@ÖVýîîâçäøåúûâììãæùÌÂÝRR^MCÔUWTVÄÎÓS_OvBHs^ßTOLOKTÅÛÓÑÙEHtAÔ^À÷Ú\JJyptq^ÅÀCqpxewBZ@EAÒÜÖÁßÅPE_ZYuMSW@pJ@EÐßÄÄÛÑCF]ÒÏüãáääüõÇ÷ñüúäúÌÎÇÚÑTÑVßÅÒ_@ÝßÕÙÜÜQLswC[ÝÛÞÑÑßÉöÊñÊÌTCvpÜÃÜÅÄËTCppSDSÐßDr|eyye~vKvqpwZFBBXÕSFrsZIpwNpzvJYPßöÄÝGEGÜûäæàììáæäáàïíååÿõÜØÅßÒÂÈÆÌÃÝÂôÁÄÕÐÐqeeqursppwMZ×ÃÀôÄZ_B|sRÛ×SÖVLJwuRÖÕÑLJvaeqtqv@HtwG\ÓÏØÆßÙÓCMN@G@PIvvv[PÅÁÒP@NvÔÀÿùçãããáíãâãçúÀÝXAYu^ÐÔÖßÍÑÞõóóõËÅÓ\LMwvuspqvXÛôøÿ÷ÅÙÕOMZ^ÕQSWW[IBÐÒ^^Fw}svpuryqtvq@ÜÒDPTMGANuqqp}ssrsC×ÏÍÐßX@GFWÀòòÿçâííïîëïáãüØÈËÚÔÓÝWÝÍ÷ôõþúûôÀÒA]Es~s~ag`evKÒÍ÷ÃßÄGOJwJNXCRÒÐÛÑSßÄÕA[s~J~spgdqrH_ÜÏôËÒÄÜVÁÖVTu~xe~IVÆÁÌ×^M~wFAÒÎÌöøûåâïïìïàäÿÀÏÀÓØÕJJÐ×TÎýøøæùö÷ÓÔÐECNemg`o~GÁöÿÿÉòßVÒÖßÚÝu\×J@UßÐÙÙD^J~spsrecf}aaMVTÄÊÕÕÑSD^]Nvd`g``|YSVÂQZGHOSÆöåûåàãããéêèëàçäÿöòõÅßXÝÜTÅðääãçóôÇQtHLeaokhicSÑÛ÷ÛÛÔ[\\×QRHqu|qLSÜÓ÷Û@EvsuK|{~aeffpCÔÛóôÃõÀÒÔP@qMebdg|BW\ÚÉRÐVNÐÌÎõøðÉåçæâéîéàúäÊÅÉÄWÅÝKCGNÖÿçæâáþýÅZPGylh`fzF]RÆÈÀÆÄÔÉñÝÄÍRtLCFÒÀÅÁÞOpvxxseazgnlcavWTÇÈÇ×TPEEKsvxonffyL^ÖÀÚÔÆÙÀÿøýüçøøãâëîçäûÿûûôÀÏÖMGXÖüúþåøÍØTEVSOyaciinmzsqBU^GÙÝÌóÀSU×BuCPÅÏÂÒQve~yyB@~xy`be~XÇÉÈÎÄ[EPRØÍÕpyaafetG^ÐÚÕÝÌÎýåøõöùüùçâéëæäþÏõññÿðßSWZqDÃýøøùòËÛWÖÇÉõ]}ebbfew_TÓØÛÐÈÿÿõÈÆÔÙQ[×ÐÚÆGwrredex|xgcbbndC^ÜÕSYDNuCÔÚTI}zdnc`gK[ESÆØÕÎýüûøçáãàíëîíãçÿýþöô÷ÍÄÚÔÑ÷üøçòÌÀÓ[BYÖTE|foikjlfEÐCÙÀÙWÆôÅËÚßQCOwLÕØÛCIDO|~r|rreaaz~pPÅÏÒÒ×X^_ÚõÎÅY}dam`{MÐØWWÜÚÃÀòùÿçøõËñûøíèîãçäðÎØÏÊÛÌÐEÓÚÈöæãçåõÝQRÕVØ×DrbcoogJÙÁõßRÏÃÞÍþÿÌÄGttpPßÏÇUX|pebds|bbibcdEßÓÓÓs|MGØ÷õWvxlomaOßÑ_ÜItÈõñæíâáúËÏþæèëçÊóùÊùáÿÑ[FEÈþäîîâçØuuDETÍÕmjldRÁS[peJÁ÷òþÿÌLege|WÁðÚTXffe}tG]ylbÓóþøýÌv~BÅüüðÐvdolcrÑÚÅAwzgZÏáâáâùÅG\ÊæêêâúËLRÎùæþ÷Ps|HØÿëëïäÉLqUÀðôÚLdbna{Uð÷ÇBKtIÙ÷ççôÒwzddtÝõòÉAv`dq@\ynnaB÷ÿö\wN}}Ý÷ñÇS}cc`fHÂÚÔqa|L^ÄøíâçöÇñúäâèùòòòýàïåÉZ|HÍóòèêíÌÐÛÆÓÍðÓArmifgCÒCNda}CTÒòñØDef^FÜÂVÐIzes@QÓDxajlrFÕýóóÜqPVÅòñÐPsa`yDÑÊRBqcgtVÁøåööÕGÔ÷úçéïæä÷ÁÌöÿãíÇZKsHSÿáëëæçóÎÌòüýúÛB}{gcuÕÏñAKtppCËñäðP@vq~×ÍÑÀ]try}PZVpmkctLÓÕCuKO^õÂÆËÕ}lgx{RÜÇÒwegrNÇôÿáþÉPÍüùïîèêèøÊùÿáââìøÞwIÑÅûâéâåÌØ÷Éúäô÷Åwlkb`}DSC|fklfsÂÌñÂBevqÖ÷ÄÛQLgaqÁÜ@M~chcÄÀÄÛ×G@ßÒúæÍöÓIafrtÍÃÕÐ]|oewÝåüäüÆVQË÷æïìãúðPWÎ÷âàáåÛDsCÐòìïãøþðËúæïîáôHsab}GØß@|e`leHÛñ÷ÌXMJrXÅÏöÆqbgJYÓ^Igohlzqtwxx{HÕÒÉõÃAwqdxARVWBydfyXÙúçåùþøóåâïïîàýúñÀòøáãìçÎÀVÑ÷ääæáÿûòýâìïâûÈNqecdq}zzljhigwZÞßÒ^LNIWÏÌW_E}vqWÇÏÅX|lb`atGKu@psSÓËÿþ÷ßQHKJ|E_Mt}amzrBÉòòôöñõùúæâæòöÍרÅÜðùúòÈÅÐÏÂôùüòþð÷øæãíéíúðÅYOqtwrzf`f{qCUÝÜÙWGXWÕÝÁÔWU[FOLOZ\Iaonmba|}vrsBV×ÖÅÛQ@qrr~ruvs|ysHSØöùÿÿóäæàíâìààáùóóüóóýÏÇÏÊôñýüúúûùøåäãïàçùËÁ\OwsydgooohmcezxwIKARQÝÑST×ÔÖW^PEu}v}e{{{{eHBHNEXÖÞÛÒßÚYXOvuHt|tv{r}q]TÄõòÏÁðÿçáæäææþûüñþËÚÕÕWYÚÞÆóôñúàäúáæíìíáææÊÚSLZC~~q~dz{}Jt[_U_JY]רÙÃÍÎÑ_\D^@rgafm`ca~yxyvsxsBA\GAVRLtOtAO}wr}zgsI]ÛÉôÿùûçâïëèîéãåùóðððÚRWWÞÙÀñüùýûòóüýçãìæùäõÝWGJyclihbcft@vwKJYF^ÑßUÙôÝÒP[ÜÑRJffdz}qGFAvCÕSÛÙÍÇ_[KqCM^AHq||xs}XØÚÚÑTÔÁüäãæãïâæøøõËÀÕQSHKI]Øõþúæçúøûúæáàíàøðô÷÷÷ÊYt}dc`erN^]P^RÙõñÍßÒ\BNtsrvp}s{a`f`a`g`fa`dpLw]ÍØ^_Busvs}dz|z~tØÆöüýñóüçìèïéèàáúæçúñõÀÕÖUÒ×ÛÎöóðôþøùúãàåáçåùñËÍ_qp~aggaf~vwABAFFYEXÐÖÓR^ZHLOIJI~d|xzsqptKtupswuGXÕÚÛÞÅÝÚ_trr~dyrwtWÞÉõÎËñþäþÿåþþüüËÀÀÁÔÙÌÞÔÞØÅÜXØÇÎõ÷ÏñÿûãéîààäúüýÃWHvq}sK^N[UÐDXMEWÜSSÒÖÔWSBwwqpdgf`dzd`f`fzed}rpJRPQS]EOLvp}|vNOUÇÄÏÿùõõ÷ñùçáãììââãáøðôÀT_S\TÛËÏõòüñýð÷þøúçæøðýüðÉØ×MsrquwIp}suvstMqLÐVTÖPDGtde~~yxs{zs}swqsKOHZ×QYPEODBJHJIMwKRSSÔÔUÃÂÞÃ÷õÍüúäææäçþöÈõÀÒÜFLFDGÖÜÇöýöýùùûúäççþüóüööÊÅÇÜPßÌÐÑÔSDEJKHvtZVÜÉÀßÑ×us~flbmi`dedyepwpprywprqEBvwCtK[]ÐÙÙ\VÐÓÅËÏÉõùàæàììãáæäýó÷ÈÆÛØÇÄÝPTÅÚõðóøûåúýöðöõÃÈÌØÚÄÚVPSÕQ^tC^vvtLtKNKOGSÜÅÕWFCJp~dffd{~dz|rvNM_T]EQ]OFFAYDvvprt]ÃÄßÓWRÓVVWUÙÈþýþÿåþýðñÊÚÇÄÐLXVÖ\DN]ÜÀòåàæäúçøôô÷Ãôÿøüð÷÷öñóÃØ]RÔÜPGFÑÖ[S_^GQVW_Aqwvyda`mccbcegz~}wOwpKI}{rsuwqsqpX]ÙßÅÍ×ßÄÞÐØÆòûåþäáæåæçøü÷þùòÂÁÂÛÕ_KC[ÔõòþùæäûäüÎÁßÓßÞÐÝÅÎöÌÉÍÝAOELJtsIELvJ\BY[VXMLCO|~~gaaff}sZÕDPÙØ@CAJpwwJwru^PÐÞÝÑ\VÖÐ[F\ÄÓÎõÈÉÈýûçñòööÎÈÏÎÄÐRVYvZDTÝÈòúçäääóÎðýóò÷ÎÊõøúçýòòÌÄÄYLYASÐÖqL^F^ÛUFBOMIvfg{dggloibdqvsCIwuvg{zyeefxKFÕÅÕÓPÕPÇÕQÜÉñþýôþùøçîáåçáäåÿÈÎËÅÖÒAuAÞÊðüåäùÎõ÷ÐÒÀÌØÍôÌÊòÍýÿÜÕÕ^LMMutGCPXqJ]XTÝSDAGsHvezszdyegdyyES^SFwvtptwspNqvCAC×ßQT][^Ö]WÓßÒôñÊüøýüäúøüÊÚËÏÙØÝZL@CEÔRÜöùüþÿÂõ÷÷ñüõôýüüúóöþùøýýÃÇØÛÐÚVA_[AWÄTÐÒÞXZu|zgaaaoobggx{pJKpJpfdzzf{ez~||FCHGÝVDÐÜÒVTÐ÷õõóæçàìîîïìæâûöÊöÛÓÜÜ_]\YÊÅÂÈôSRÓÜÖÜÓÞóÆÆõóÚËñ÷ÏÎÄßôÓ×ÖS@QYFB\NSÉTÛÑAruHs|fxrdr~yIDRÕ]pJBqwvr|ppsquyH_SÔ\DF]ÑÖÒ×VÏÎÁôýðöåæææÿ÷ðôÛÓVEMA[A^]ÜÍõöñÅYXÓÇÜÂÈðüüùäåððøùýùûûÿò÷ÈÄÛÀÉÐPߨߨÚÖRpgdxal`ffaggyd~tp|s{z~dgs|~sqzIOB[^QÑQÒßÙÝÍ÷þøúÿçíååáæäàáççúÀÁÍÐVQYBUÛÂÌÅYQPMvOspX×ÃÊÌÔõ÷Âߨ×ÎöýùÿÎÔôÉÌËÄATÙßÞÚEB^qrsdo`a~r}xwKuF^q|NK_DtepvI]Ôpr@GÓÔY]ÇRÖÞRv\ÝÛ÷ñ÷òúðüòõÑÌ÷÷÷ÂQ^FK×Ð\KPÔÉòÎÜßÕTU_LsM\ÍóÿôüýüýóôðúøæáäüåúúþûöÐÖÜÑÕ×^[@teebkhcgdezy}|sefg~dxxgzrt_urpOuSÆÏÈÈÜÙÀÝÛõÿýáãæáçòþåýðòËÓÐTSTÐÐÄÒQÖÛÛÂ÷ÃÅÓLwNr}HA[ÞõÃÈÁÅÎñõòðÂÍñññÿð÷þüÃÇÑS_ßÑÖ]wxeccdzxpIvO[@MY@IIpge~yqALAQZXF[OPߨÆÇT\ÖUÑÛõÂóýòóòôÀËÍØÝ×Hq}wHRYZW\YÙÍÛÈ÷ÌÐÔOqNFAÝÃÄËñóôùäçáçåäûüøååúàáåûýÌÃÀ×ÒÔFydbiilcfde{dx|qrsqrzda``f~wDLIIBKYÖÂÀËÊÆÑÜÙÇÈöåçæäæäúååóôÂÔECtqXWÕÜÙRRÕÓÜÛÛÐTEvr|xrMG[VVY\ÓÎÿþþþÿòñòþüüäáãæäÿ÷÷ÉËÂUL}g``dd{yyprqAYZCAIs|{eexrtLBBMN\TÝÎÀÀÇÜÔWÙÁÎöýøþüöËöõÆßSNt~{}vqBGDRTRVÛÅÄÝÝSEKwJXQÜÜßÀÂÎËùäçæççáåúäæàæáãìàçúÿÊÍÖArdbnlbafd`dez{}wup~yxgbgfge~~suIPÄÚÌðõË÷ôÁÌÈüåûøçàáçççûñÃÀUFtHNtwwqvuIYÐÓÄÏÒQZEu|pLDED^GZQÐôññöñóòòøåçáçåäçááääåóÚUO~zdfe{edz~{suI@@wr|~~{strpwuHDÔÁõ÷öðñËÌõöôññ÷óóýúüÈôÌÖDqy{ee{xgd{xyCWÑÛÓÔ×@J[G@UÙÄÌÍËöóóüåäúåçùåãìïïáçæåøûùò÷ÊÌVu|eddfdd`fgg{qvwvzedae}vKw|tuuSÛØËñôñ÷È÷ÿòòòóòååäáæúóñÞX_EKCLwtvr|ssvG_AIuvwsx}rq@@@YSÒÀÍÎöñôõòøûäæçäååàáúäàäüõÇØWOtv~deyerBD_ZBI}z}~}w@DHI_RQQÆö÷ôüþóþþøúðÌôÈÌÏôñöôËÓBupr{{~dggaaezvs}r}rpruLEDCETPTÀÈòüøûøþåçææáãíãæãàáàæúôÓ]P@prtw~egged{tw~rwrz}stqptwpN^RÔöÿüþþøáäúààæääúùþåæàåñ÷õÐ[]OuLJuKxyp~yrwszgf`fgxwwzywydg{vuqGXDPÞÌÊÎöùþüùåäááíãÿó÷ÙÕE[ÜßTSPX[KHZY^ÕQVGCPU][@CDuH@[×Ëóüòöðü÷óúæãäåæåþûò÷ÍUS×O}vwuHq~zge{z~MXu~{{~rywEtqEAwvLS×ÔPÖÄÕSÅÉöô÷ÃÄÈöþçùüøüÏSMxvOY]wKYDJI]R[EBNCKCVÒ\\VIrr|MÖÞËøäúççþúàíïìâàìîãíâùüòÃØÔ^TÁÅÓÔGpegz|rrt|dzfceee~~{dzd{x{~|pKGU÷È÷ÊÚÁÊÚÁÁÅÛÇÍÝÖZA^U^][\SQÝÆðôÍÚß\R]QÕÜØÁÊU@K@GSTÚÏòüøäùûúæåúùúåáæàæüÊß×tK@QÓØÓÃÚÕFLZq}|s}rstI}IQNJr}wMHERYvKO|qtAQØßßÏÆQÄØE[GD_@swLvrLvzzeJXFWÇWBTPEÕPVÇÃÜÆÅV_WYUÑÔÃðøûáâáçàääåýøçäÿäçýöõÆÈÏÀñýÿðóóÈÌÛR]MswKJwDZZXOp}zgzpwAvsrxeyerrIES^ÖQ_@AIpKKAYQ]ÐÔRMDuvDGWÛÒVÓT\FTGGS]ÓÃÐVÔR^EÜWÑØÞðçúÿþÿðôðÌÉÊöûçýÊõ÷ÍÀÊÚÅÄÚÍñÙÖÀÀR^R^WÖÓÃòÌÌööÛÙÑÑÔQPßÏSARSDR^BNNCÐÙXH@H~yef`afpxxps|~|wN@ÒÒXBYDMMupqKLU×VVßÐÝßÖR×ÜÇööôõ÷ÏÏÌÀÚËôñþþòüøúçæúýü÷óýñÊõÙÙÆÛPQÜÓÃÃÁÆÈÃÀÜÖB^Q_ÔSZVÖB_VYK[G_ÒßÛÏÙC@AA~yqwswpdyp|epsZQS\ÖPESYBsJJMIZFÖPtL\EFQ\Ñ×ÑÐÞZIM[GKM@DPÑUÌÀÄõñÄÚÁÈ÷ðóòùôÎÍñññüþñùûäáåùÿúøÿñÌÙÊÌÍÍÛÞÃËÇØÌÄßõÂÀßSXRYJtB|{~z|}efddgerdyqtKwx{ptpvJ~@^\]DKE_FD[EIT]ÜÄÒQÐ]^]UQ@T\ÁÊÌÁôÁÉËËÑPÖÕôÎÚÛËÀÊÏÁÐÖÒÅòñ÷óÿ÷ôÎÌÚÁÒÚöÃÁôõÉññ÷ô÷Íóúðö÷ÆÚÚÖREYEÒß[ADuH@uwup~Jp~sqvwqJMKtY^YX^@[Z@MJpqMwws}|vvw}~suOHFA]X_SPXFSÑÞÅÍËöËõóüððùåæãáúþ÷ñÿðÎ÷óñùÿððþüååñË÷÷ÂõÎËôÊØÆÛVUÞÓVÒ\XSAOWÑXGLr|eyzywpy~|vItM^BA]@JDAN^^EW\uBRGC^^ZPPQÒWG]TBttqpIJNDOtA_E]ÔÚÆÏÚÁÃÛßÁõÏÉÊöÎðýäáçæââáæååþûýþóÈÏÊÊÃÀÃËÚÁÝÀÄÒÅÃÙÕ×Ò×XR_ÚÙVW^@JttvpBNYO}}rs|s|~~}{|dgyz~}rxyrqMNADAFCZDC@X]ÝYE\YÑßÞÑÔPÔÜÙÐÖÝÛÇÝÛÞØÀöþúúúåûúøäåûûááçäøùþþðúÿô÷ýñÏÛP^QR@SCvJQPVRZD^E@V_BFS@LKtH[AMELvBVVÖUTTUDLv}zw\ZNtJwJrsp}xJBNq|pr}y{ezgqFZIGFGY\ÖÚÁÇüúúððó÷õñññüöøçþñýüûääååûóùøðÉöòöÊõßÒÞÖÎðËõñ÷ÊÍÁÐQR]×Õ[GAGKv}dddzqq}vvvzzdxqXÖPY_ZFKHAMZ×ÄÛÖWT__ONHvswJpy|rp~qtvKQÝÝUÕÙÁÂÚööÏÃöôññòäàæåâáäþûüüóüøûÚ^ÔOtG×ÕØÅÇÏÃSÑÄTÔÃööÉðöüóQVÛÓÞÊÎÏÌÀÜ÷Åws}yrD^DwJsLd|px}Jst}pr\q}w@uwvss}qsDyex~eqJOuOFO\B\V]M\ÝÙÐÍðüúóýûúýþçàáéèââûòûýñååååúüýÿöÊÆØÐÚÚ×ÑÆTP^vIXEXÛÜÝÄÞTÐ_KIDuJUAHuJpFBMWÕ@ZÓPTSDuOs}vrdK}MGEBZJpJpe}rex~~wrpGqsC[GÖÝÓTÜTÝÎÝÐÁÉÍþüý÷òõ÷üÂôûçùçåøðöÎð÷ÞÂóùðøùüôôÃ÷öËõòÿüäøûóõÞÍÂÐÔØÑQÑAus}wNp~xp|Ovrxx{|yyrrtFNHtuwG\LE_uFAq}{dfedffz{JDOJtutPPZPÒÓóü÷ô÷ôÂøþüÿûüàâçææúòæÿýðÎÛ÷ÉÚ×SNuÓÕÖÝÚÞñÍÓÝÄZQÁÅÉÞÃÂö÷ÂÀÏYPÉÐÕ×DCÕEqLwgswv[uHBFZvEJyOOCH}uB^V[ÔAvMIJrfgdgddx```g~y|IB[Z_TJH@ÔÆÞÃöòÿåááåæàíìààáæáæåÿÎÌÄõôññ÷ÏÃÁØß^SQT\PTEXVÚÈÍÀõñÉÄÃÞFKIwNvy|Irt\@NKKuEJv}rdNq~wpu]IEÕRvYDtr}zr{clmblsHtqpxwtuwFtwVÓØÆÛÙ÷÷üûáåçïèîàúøäûøþåóúçäûõVÕÒTÝÖÔYÔÖÞÜW@ÓÃÈòüñÁóýåþôÞØÕWÚß\ZÒÒÊöÒBXM]×]JtGG__p{qr@Õ\pvANNweabn`ge`fefgdikjjmf``}wuwFO@^ÒöçøðäáçæíáæàîêêêééïçÿñÿýåÏÄÁÓMXÜUV×ÁÁñÆÁÆÇUßÅPZSÚÈýôõ÷õÚÏÁÓGE^YP@^VYAVÖSYXD\SX]XAMLwwtwtFYXRDLMKyg`afacmamhoccdxwZUÖÞÙÒÐÓV×ÃÀÎüàãèêêîìâçäæûýåýÍÈòÊôÅÜÃÈÂ÷óÎÂØÌ][ÏßÒøóúíâæìíäþòüÊðÆÏô^pEIwKsI[]GÓTw{zlnii`afxBOuwFuup}vsyeryf`ed~eHuvC×P^URCZDQÇØÚýäùåââàìàííãæáàûýñ÷ñþõüûý÷ðÊ×F@qy{zqvuEÇÏÃÏöÃÎÌÂòþÿñùùôÉÊÍó÷ôøÿÊÚÌßZAwezfcfffz|eeqrexy}vv~zyxysprp~ys|e{zgffbl`dx~pAØÚÁðýýòðôðüÿäàãìëëêèìãìíçæçþüÿõÖWEXÑÑEWÖ]ÝÛÓVÒÝÞÁÞWÙÇ×WÞÒÃÃÜÅÊÊÆÉÛØÓÕGO}}|pppMItB[tv{s~{{y~pwrp~~ewyd}reyxaaa``rzztCuVÞWÕT@FÆ^ZÝÞÝþþñçíàïîèèáïáòüúñóüÈùøôÎÎÔWÝEw_\HSUEQÀØ÷øòüáåÿæþÍòóÙÃÀ\Y×wpM|gzdgs|`gzmaecfyeyKvyuNsZ^~vDtptxe|f`|vJIuJCs|Jq~H[@ÞØÝÂý÷ôñ÷õùù÷þûûýúý÷õÉÙ÷öÇÌÈÏÛÊÇÖÑQMYUQWÞÝÜþøðåçòúúñöóõÚööÈöËÜËÈÜÍñÃÑßXpt|f~qqp{bmfmogbkmbcge``yyq~xMDQÝÚÜÖÓTVÙPCUÂÃÃßÙÚÅÁËýÈÅÆÊÈÎÛÛÄñöñÿ÷õòøýðõ÷ÑÞÕÑSJywOvvtLpANFGCJÕÃöòòÿüäøùÿðüãââíîìâìáçóWWÀ×Ô×ÚÝÕ^tuJ~|xzdz|d~ya~y~vvyp|eavMAAÝÛÅõñÃóýýùÿýðûùðòýÌñÊ÷üòðöùöÇØÑ_QHN[]\TÊôÌôÃÞÛTÒÞÐ^_ÑTWÞT[]ÑÐÖßÖÞö÷ÆÎÈÈôñýûûûåáäûäùóòúûðÌÁÅÀÐQTFvwD[[EZF_[vsvwJLMLBAQÇÜÐ×PYSPAtHCK@DXZBOF^X\ÕÑÝÚ×ÔQQÕQTTTÇÀÏðöÌÐÓÔÑWZ\Ü×TÒÒÉÏÈÊöüÿäàæçùüñôðÈÀÂØÍõÏóòòÈÒQV]PA[_SÜTÙÚÍÚÝÆÈÛÌÃÁÄS^ÕÃÆÒBOZ]CMGGOZQGADBXTMKXÕÓÌÇÛÛÚÕÔÞÔRWqgzdddepr|JFyypr|}}qEFJMTFUÁßßÏôñþýÁÏöÕÒÃÌÏÎõýò÷ÎþåõñòðüòôõÊÌÅÃÅÁýñËÂÁõÎÄ\A[v}KwGOKQ×^RÙôõÅÒRÙT_S@uEUØÙßSÖØPYRYJNtsggazdc|GuILK^ZEdd|wNtez|}|{xeqwEÅÂQTSÕ\DAZÙÎðøååæçúøöØÁõõôÌØÇÛßÓUTÔQÔÅýþ÷ÉÀÌÇÜ\DMDÖØ]R×ÔØ×ROAA_]Gwr]ÜPq|pEAFVÍôüÿöÊ^tuIuZÖßÃôÍÙ×Np|xfde``ag~eomgfgstHZOH@tgaggxJpNÛÛÆ÷ßXÓUESÆÐÁöÊýúñÉýõÍûäþáâæãâýÎÈÞÜËØUöó÷ýðÔ]PLwDtr[WT×Öu~gew|KÑQAtr~{dd}uK_ÄõñÍÑÚÑRPÖQBG\ßõÖRÔ^×WÐWÞÌÆÀÀBuqg`cmmd~vPTK^ÕJOCr|qrsPYvQ[uACH\ØÞËå÷ÛÊÇÓÜ]UÊöóåàøùáçúä÷ÏððËøäýúü÷ÂÇSÞÏÇÕÉÜALu|r~eJtL_Ò_ÔÝÞVSwygd~pJONMZwLSGEÐÒ×ÜW^EC|OICÝØõüþÿóöÔÕ[uE_RYÐÖÖÅP^WPVÌ÷ýóÌõÂ]GMRS^ÒÚËõÃÊÀTØÜPRQ×ÅôÃÜñðÄËÊÙÚÐVôñÈÎúñÇ÷ÈÀÁØÒÉñôÿàðÉôTMtezBFMÔÂY]ßXuCs[ÃÐ[QD~sdgxdLÒÅÄòÈY[@qsv|BÝ×ÒÎÍÖÁõÃñ÷õúáåäûøóððÅßÓÒÇöôÿååååýÉßÙÜÆÕÅôÀößÐÒRpBAH@tuF^HEQSsFZ×ÁÏôñüÎÁÕSEÖÑÂÍóøæàäåð÷Á÷õËÀÁÛÞ\OtryxwKÔSÇÊñÌßÔZvesvtvIGÒTÑÖ^DGWÐÞ]ÖÉðÏßÀÁPWÑØýöåïëíàáùôôõöûùäíìæøõÔ]ÞTWÁPWõ÷ÉËßp~q}AU\ÂûÄ@K|bmgces}RóÙÙÄÙßÌØUÉÈTÂòÂôõßXßÜÂûúýãçôþñUZ[|y{aJIt]BMÔWJZ×Q_ðÜÐÎÓNJw}]ÇÂðäöýæýÏÂUFÞõÅÊåòúåðôôÆÝõ÷ÉòùÊÿòÁRQXCÓÂÚÇÖHFAwy}y}HIq[T^ÙÀÜLEuswvsy}qdgprv[T[ÛÌÙÁ÷Ü]WJpNOvVÐßÿáñÌ÷ÑF\VK[PDÖYdgdfdvtvÜÇßöòÓS\\EÕVQ÷õÉýöÆÌÖ]PÉÙUÍÌÃÂW[[AÔÖõÛ×ß[_ÕWP\SQAPPPÕÒõÅÚÀQFq|tpvJpJJMpwtKMBKvLsK}abijjkhbyp~EIqpqOCFPÑÒÕZÇÒÅÇÇÀóùøüÿÿüûõËØÛÖÔ[XQRBZQ\XuZÔÝUÛÓVQVQWÝÖÕVRX^ALGQQZty|x{ewCDUÄÂÇÔDSÐÐVÞÐØÌÊÌÊÊÁÎÃÞÒÄQUÄßLrxezzezsy|JBKwsKN}yzaccconmmf{ysMOÔÏËÛÜÌßÏÈÉÍöñüææûøûþáæúóðÎÅØÀÖ×ÇÑQCu|psG××NO[DGNN}GAIYÕOY\WÙR@[PCXÐTwDÒ[\×ÜWÓÍüÈÃÝÕßÄPÕÄWÑÙÂÞÚWVÑÙDYYvttJ}OsvEAsYRBZÝÓ@\w}vwer{aaxy@MAØôÛööÊÍöõôýñùæúöûûñòúöðþõõñÈÝÑ_DYDuZUXÕÓAHRBBVÑÝÛÍÍõÛVPÚßÑÄÁÙÀÅÑÌÎÁÛÔMDFuKR^ZÑRWÆÝL__FZSYÀñÅôÿüñøòÈðÍÖÆÏÑÑÑLtDJOWÛÇñýØÎÍDpLr{{x~uJrHMpHÓÓWöñ÷äþðÏÈÐÄÌóôøäþäôñýöÑÁöÊÛÇÍÄôÈñÉÅÛÞÎÁÐÓQSÜÇÚÒÝÞÑÚ×]TQÐÐÀôÊÐR×ÚRYÓÜÒÞÊÏÈÚÒÝÝVÝÅÓÛÅÄÓPFNC_]Î÷üúçææçõÄÞ_[ÖÓÝÐßßÓÑPTÖÒÃðÉÓÓ]Msvdx~xuDMKQÀÈùòóôûÆôÇÉÝñËÎöñðòøÛôÊÄÝÏÅÚÁÏõýßVÚúGÎðØü÷×ZQ||tF^P^ÓÃÐ^ÖÝWUÇÂØÄÂÏÙÐÀËßÓÏñóðüðõÀÞÒÛ^ME^TÕ\u\Ü]Ãð÷ÿçàçýñôÏßÙöÄM^ÅÒÞÜÓßÇÛÚÎSHLvtQXusLLEÔtpuMEESS[^õòÙSÝÝÇðòùýÊÈÊÇ_R\_ÂðöÎõÃÈòÀÖÐPÖÀÖMK}grNwswtC\]PÒP@TW^ÕØ×ÄÊÏËöÊÙÂÁÀõØÓÅPHOGvvYZYYJvHABÖÚÓÌÆTÐßÖÕTÑÅÊÈöüÊÁÅÓÓTusruHpqtJwqtu_UØÖW_stNtAtNÑÄÚÃõØE^X[ÙRu|LZBHIXÞÐÔÛFJF^ÝQYtxqtMursu[TÇÎÃÚÚÄÌÈÑ\WÛ÷ñüüÿóýüþýÊØÃõÁÓp{g|xggffr|vx`g|se`cezzr}|rrp]UYÖÁØöôÓTÚÍÙËÍÃüùøåÿÎØÇÔÀÀ@uFW]ÇõÀÏÂSÜÁ]SVKOM~d`ed|tyAG@QÌWqpdaebijoappurMFHÙÛÜÇõÅÞÈ÷ÊüåæîìàâéàçæúçåñÒÐÆÒÌ÷Ù^I}ds~adaombbmag`xyyOOe||dytzed`af|}ÕÞRÞß_×È×ÖßEOWÓ^ÐÎØÉùåìëíïêìàïìáúñÙÛÉÈÈòÈÛÃQYÁÓLD|zxgcbljcl`ygmlcmgddxfg|OQÝ÷ÎÛôÉÂþò÷óóöüüüÿøåúãììèïäòñÄÅôÍÞWKC@PWÐÎPE_KNvrabccgb`eagvHXWDwCLrtrrffa~Hp\ÜYÐÙÛòúáççæãìãââíãìêëàåçåøÿýËÚß×ZÔZ\]pez|d~re`bbaagzqBIÚðð÷ÄÔÓÞÕVÐÆSSÔÕõýùäùþþùúþûÎÕE@PPÑ@FÖÕÜðñþÿÏÃÇØTÔ]ELC^ÝÌËóÉÐRSVÕÓÐ\GvvGMwxpCSÚÞY[ÐT\ÜÇÆØÈòúíìââäþúåûääýòðÌðøúüÿúþüøøÿöÝÒ_KHIL}zps[ÚÌñÍÀØÍôÁËÝZSvKACCp[P_ÝÄðòÆÏÇ×XFO~dezqZÖÏÛ×T×ÀØÂÄF×SSÜßÌUÞÍÆòþäàäåþüÊÈüÈÛÀÆÏööòñÀV^YX^Yvppr@SÒÕ×Üß÷üþçååüôÁQßP@]ÜÛõùçááúýùóÃÑEvwr{}A]XÕÒTÆ÷ýóüûüòÞTÕKvCGZRÕßÙÎÐN[R\ZEOsxeeddxsu]R_ÍÜUßMGLK@PôËõÿþãâúççäÿôöÖSÔQÉ÷ðóÃËÏÆß^Ù\rMqsq|veOÐQÇÄõüÂÈöõÀÅõRNPEXÔQVLGVÐÌÞÏÏÞÊÆMwq}aaytLWÙUÜÍÂÅÆÊÓ_ÒÐÙÂðýÏÛÇÄËÀÅÄ_D^D^^A||LJwtBCvB\VAG}exrvvMEHC×ÞÊýöÈÁÎôÎÅØQ@rJPÝÅÆõÏÃõóñÎÝ_ryrJYOCFvFÑÞÈÛÛÁÓØÓÕÞ_Gt{qC@HH^MATÙÀ_NK~~pw|f{f`~rG@tZKEUTßÓÚÐ\ÕÓÏÊÉñÉÁöûçû÷ÂS[ÖÛÀT×ÒEÖÆØÅ×ÓRADGMww|ff{yz~MuIPÜÃÀÂUCss}dxyxzsRÖQÀÇÔÓÓÕIAXMJwuIvCÖGLXÞÙÀöÈÝÓSPVÓØMNMXRYÜÖA\]^L@ÔAwq|dggeeesqOPLxygesrrw[VÛðçàåùúüÉóüôðóÿÊõöÉññõÌÜÉðñÆÇÌSRÜÔHpv}G]R×YTPuGÐRTEOyy}ge}Htw_VVYMug`gfffyzeHÖÙÚõÌSYYQÒÊðôÀÃñõÈõýÚRÐÚÌñóóôööÃÌU^}dxztCEYtHws@PÁ×MK}}OSPWÔÅÌüäóÊØÜÓAPÃÄVQØÇüúóýÌÇÀÐÇòúóÂÆÐØËôýõÄ×ÐÛóåüööðÂÉÂT\v~yIMEBvwqJLIvfb`mbdex{ytÞÌÐ\uupqSZßÅÝÈóæäùçüþúøçáïâæþÿøûóô÷ÉÔÝÆÃÈÏÄU×ÙÈ^HCv}~Htq]^[V\ÜÜ÷òÁEsCCLÜÅÐWPßÒÇÆÜ××ÞÙU\Ò]I[UÚËóÿ÷ýýÿûçâàûöõËöûþËÙØÎÉö÷ôÛÑVS_t}xf`mbgdvxxzgOVÁÔGHpGÕÅóóöñõþåæúýð÷ðûüýüõôÚÇÊ÷öÆÈÆÖõñüðÏôÑPÝÊòÜÚÙÔÌÊøýõòÈÚËðÏ_NvsBP\F[YvAÚÙRJ[tpuL\HMJpHPÀØÑÛTÐõÿýÃËÊÎÌ÷üóðñÿøäãíæúåþÌÒÐÜÇÓÓÒÆõÎÀÛÇÆÜÙÎØUBr}qLC@MwMEEÜÕÕU@PQÑÔPØÖØÔ_Ã_D\LEBVÛ\ÐEC_ZÊõWÁÄÆÏöçüçæÿûóäÿPÞÁÅÜÐþÌÀõÄ÷ÒÇÌwvqd`mygbaobme^}ep}VVrE_\ÕVÿôÖÆÆÏÆûàÿûåÿËÎçúÅV×ÄÝôûòþÿòÊËçøØ[Q×TÚðñÊöõß^õðÙSNwdfquvpxd`~J~abfag}}dfd{zJGXOv|{uUÛÚÚPRWÈóð÷ÍÃÃ÷ôòåàæñýýúäÎÞ[BÖPÒØÁÇKO[ZP^Ys`faewJ^sxrzJZOp`}txtA_epxwZSVy~u}CÝÊÞLPVQôää÷Îýòøàîéæàçýøàà÷ÇÊÇÛËúøÎØZHpJ\}gljjadbcnjlyaba`adLÐ\Dts|JÙÛPPLqOÕÿðõõÖZ^ñþËóÂPTÅúþþýöÎÈúäðöÇ]VÂòûåþñQHVÃÙT_}aeqtp|flcgcfahjhaeypyygBAYGNwNÒÀ÷åçûÏõþååæáåøäáââíâåþóñóðÏWYÔÕÑÈÏÁÖ[^Lwtwqze{wqOKpvgfgfydeyeqtCG@AAHHBuJrvx}BSÐÐXOMÑÑÚËòáúòåæìâàáþûåäåûúþüüøäúÿõÑMvtprr~xeqJHv`ommnmagfgx~wKwwz|XM\^]TAÝôüåóñÜÄüóäçàâûäàìîíãòÁóýÿúðþýòçàáçþÁIJJvqr~rHGXIPDffaabhcaad~HuYF|rttsCuqDÐöÈÊðÖÝÃÅ÷ÎøãæàâèïãíúþÿõõÒÍôÃðýäçûåÃEMJKxs~q^\@M_@w|e{acf`gt@HvYIrHJD@FYIDVôü÷àçôÈÃóÌñåùáíêêéâæáÿùúôòäíìççäñÏÒFqxygag}@K[UGtxfllalma{HtFZFAIBpHQKCRÝôÁðñÌÌÝÜIKÜÖÜðþçàîêïîíæòßõóÏóÿäçììáûÿÄFÓÑFZ_ÔIFØU\[\qcgd`lcgma~wqxs~`ewMM[ÞÑÑäïãææáòôûåçãèêîæñüõõÊÍÇTÆøúñÆÁYdg|ddpzd|I^BIGwdgzgg}p{u^suMxda~q~JuqIPõÈÈ÷ÕEuNVQôþûáãîâäçùäáñüúçàæáûôßADALYpzpu~vwd`onioa`ax{}xqB}ffddvÔQZÜöüþçáå÷ÌÅREÍùýåíïìèéàþÂÐöÿÈÊóøþúìâüÄVZpXTKtpNw~vJ~egcbbommcadqdoiingg~KTÜÌåöÅÑ^Aw^ôÈöûãéééèïäýñýüÎÉõ÷õòáðÂÇ[JsC^F^JMFwQZ~xamnif`aegxzy{cmhnh`{{rwVÂõøÄÒWsHvOËÎóøçéèêâççþçúöÃÐÏ߯ñÁÙZuHpJNHN|qJ}t~abbfd~vFBBIpygfcc{NLsGÇÊõôÏÜRONuJ×ÖW÷øäæãíàåùöÊÇÄ÷ÓÝÃÞÌñþùÂÙÙÚ×ÖÆU_ZNLqvtdg`nl`a|ysBr}zbmhjidvwAÔÉüåäåþüɨ߯òñüåçàííííáçüñðÎÈÏÅßWÒÃØÁTYEH\ÐÖÆÚÖFJSIqprgfzeptB[MßS}}{zbkooa|KqGUG_ZMrf~tIÔÎóòäïìíèêèççáåäúü÷ÚôòðøùüÄßÊÉÈýÊÔFJNq|szcbcagLÑYXYTRCwpxg`ffxttJDÙÇ×ÔÜKq|xrtPÜÝÁýçúúìæøäåøäçøöðýøááîîàãàæàâãùðÈU_^^Adcab`f}ppp~x~|fokijigyd|AÕÇÁØPJWFw@×ÀÇÃüççáãáåúúððçû÷ÅÞÆÇôóýóüøúúàãäýýüÃØÀØÑYOLIYTTØÅÝTB^[effcbo`gzH}zsX×A}vMJH[VTØÇõýøáââëëììáíàæáûúäáâåäãäæàííæåÿ÷ßEEpxx`gee{y\PM^uLOzaimlbaeqexrvQCvKvNKN]UÍØÕÆôøúúâæàíãìããáÿþÿäâçâáúàåäââæöÏÝRÒ\YL~wqJ]VÃÖ@[tCArymlmnd~ru}vKCÛÝ_LvuvCSÛÅÐÝ^Óååúåûääîéâîá÷ÏöúåçáåæâïîéèçòÎSÜÕQY|daz|Ctxgzyybjjiolnlm`yJSYH@HYPßôØÇÙQÝÍøæúçáåæãâàúôÚÍõðúÿóýùäøààü÷ÌÆ×RÉÚELuwpMÕW^TØÖFÜÖpd`bbma`ooma`pE|e~s|gwrvtJrCÂ÷ÊÿäçåáïâãíâäçâãáæääûøáåñóÈÐ\WWKvrxfbcccd~yyyrg`cc`bolibfbg{qt}pLuttKvt_KHGZGEØýýøÿðÎØÎÍÂðýÉÛÃôÀÊòó÷ËöüüùûÎÕÙÆQVTQpzpOUÛÉÔrtwx~dzbjkhm`{wdzHuG_ÑÔOZSÕÌôþÌPÄßÌÿæãÿôöÎüàìäÈòÉÄÆÍÈÞWÕSQÜËÇJw|yuDMpxdgDÎÎVFqdeKEp~z`azB\CI~}@ß\\HdxsÜôÝÅEuAßûòþäÏÀÌÿãçæü×F\õÈÅñÑ@_ØþüòõDtvTÙO^pff}×ÁÌÀKzdIÖATWtfeOYÑÍ_xeJÒß÷÷VqKÓñøçüÐHUñôñåûÚÄðþæéïåÂÊþüûáçØDÜßÃÿøÆ~a~pt~zgbfe}_ÒRzmaevMuz`f`dZÁõSyq[ÝÊòÍ[SÙÛýääôSAXÒôúæñÓÔÇåããäòÎÔ×ÇôóÀÓ]]ÈòùüÁØZ^ÁððWXQI^ÌÃÍÕu~|L_ÓXutafJYWXIdmrAN@wtQÉðÅÙØAÑýçáääöÇûâéîâçÈÀöøäüþÎPÝðüöËÀOt[TÅÖXGqsßñôÜÜqzsAÆÂõÀXOBÔÈÄÏExx~HBNpgzv[ÛÔÛ\wYRÁÎÅÅAI@\ñòûúÞÅõüæáâäòõÇöó÷ÂY[V×ÉÎöÛ]ÒØ÷ðÊÙMsrx}v^_tuqGÛÚôÛ]XpLMWRqwuBTÄÁÅW×ÓÃõüúÚÓÔ]ÜõøúõÂÙÄöñÿõÚÁ_DVÑÜ^ZM^ÚÉöÉÇÁPSÃÚÐO}eLRÆÒÖWDÂñôôßRu}tLECvqqOÒÚÄÌõÂÖÈÿýþ÷Ò[OÐÜÁôÚÇEYËÌôÃÄSvSE@VIvp~NP\ÐÐ^vDÔRÞÊ]s}sIÑÊÇÌFGÅÛËñôÜHJJwX[]M_ÄÅö÷ÿ÷ÖÇÁóùôüÕK×ÔöççäÃØÝÈøÈýÃLJyvOEP{puq×ANG~ppAQLF{cg`}DQTJ}rCôýÿõPEq@ÛØÈ×NMOׯÍÌÞÙÕÛóðòÂ_FEÞÊýôÞSBCÆþøðÁ_wBVÅÇÒOtwMÝÄÖ\Duw^ÅÜ_pdgdrO@IurGÂñÂÕSHqvOAw|g{pÀÿñöÂÃÛðáíáôWMRÍË÷ÈÄÀ\Tôúú÷ÙQG_ÑÃÎXp{zwMDAvLCYÂÁÙZyd`wDSQqr}_ÁÎÈÓPvsprxf`ldM_×SÑ\IEMYSw~wÀËÆØÑßSÅþäâæ÷ÃEÑ\DPEZvLÕØÆËÛÜ×ÐÆÓÄÐu~ywJF]^XNY÷þåûñÍECv}Jup|rK@EÄÞÒW\QHM@LupARÛ÷õÌÜÞôõóÿôÅY]_QÀôôÓEGA]ÅÞ×AFEGVPD}e{d~M\ÚÅÒÊÏÿáùÌÖ_[pDW^BpKFÕÌÌÚôÚ×OFÝGp{ypvÚ÷ÀôÖ^A[õÀPÕEEuFô\BFwryG]tQÑ^MPùóÈÀÜWNØýÕÍòÍÏüìâååòØ@OÞP\Å×JtÊÊUÝÆ×E^ÎÌÙÑV^Zòçõöùô××ò÷ÍÁÚÝuXÙÔTEKem}z}MrMÃÜÖXKv}TÒWÖØÏÒÀáçåæåóÜÓÙTSXALsXÞGAXGuIT\YÑPZ[ÛõßÝÇÄØÍö÷ÅÊôÝÛ÷ôöðñÒDLvC}z}~KÖÇÆÐßDuMQ[MR\PÀüå÷ýüÅÃÂñÇSÙYH\\ØÓÅÍÕÍôòÉÔÄGHÖÚòÊÎôÜÌßôþÊùöÄññûñÍõR[DBH~t|ap@Ó÷Ã÷Å^[L]C_ÖuYÚÊåøúüÁÇÓÜÑZ]LKGwIqt@vrrq_ZRGuELYÄõóöÉ÷Éô÷õÎÚ÷ôÊùû÷ÛÕUAvME^AuurFÞÃÆÕ×QPÙßÁÅÔËÈþáàâæûòÂÊòÀÙ@tttDMQXw~mayyvrvdsqSÜÖÇÔØòôþøøúóùåäæøöÕVÑSÑ×Dpfypw@LLsdpJ^ÁÙÀVTÜÎùäæäòöôö÷ñüØÐÔÔÊóüÙw~yqvgyr}|a{EØS}|vDVQÄÊÅPKZÌþÿÅWEI^רõÖÕ]QËÿóÞ]HNDUÍôÃÝWVÁòþýñÀÐRÄÎÚÁ[w@SUÙÑYHH[SÔQNCPÄö÷ÌØWZFWWÒÅÂß^ØñÍõÅZw~p~~Hqy{{v^P@[usOAYßÞV_Òñòåçæäò÷ÿóýåËTY×WÔØÒL|}wpstuza~~rOX_qqu^ÙÍñËÈñóàììãøñÆÝÀØÃÓIuuHUPAtz~xedyde}pRÛñÈÙßRÁÉôûöÌÇÚÏöüóÚÓFFR×QXBtv|pqwtHwKDN\]SÞßÅðùúöÎ÷ôôöÌóýõÉCCÜÓSXAYt}|zpuN@w@XEOFÔÑÜÜP]XR\X]PWÞ]PNAÔ×UZYÕQG_tIJu[HLYXW_QÒTÀÀÜÑÒÙÛÐ×ÛÏÀÄÞÀ÷ùùÉÚÚßÔUÐ÷ýðóñôöÈÉØÖÓRV×\ÖUX@uNRMFJ~w|~||y~gacgrN[A^ZA]ÇõöñðñÿÿòøüüûõôñôõÄÝÜBvf`amgaofu\Y]ÆðÃÌðüûýøúüäàãæáïàûõ÷ÎÕEgcnnkhlgdfveLCqSYQÓSôüóÿñäàûãéìçÇØO|yf`xqYÓÛÉÇÜÄÊññöÎStwHFGLÖÔXÇôûçøÊId{r}xsysZÐ÷ÏÐWLÕô÷ûþöÌS]DÕÆÛÜRWÚÉûùñÝw}~}}{x|}LEÔÊýøöýåûýððÍÕUÝRBTÞQSÝññÚVYz`gzfg~rqeZTÐÔÚPÞöÌöõÅÀÐÂõÆññÞÚØôðõ÷ÖK}@vxt}eerFQÌýðõóåüøûýðÜÄÊÞóþõÍÓÅÀÇÐLr}eccbddaexwAÜð÷Åõõñäáâàùçäÿùçíàäçæçäñ÷Â[qgbkknnoaquERIJI[^XÓÒAw|rOr_ÑÝöòøùÈÈÉÕ[ZCBJ_\LGQ×ÚÓ]DuqZVÓÄÒÞÕY^PÝÈôóåíëâàáðþòñÿËÉ÷ßÛöüûþôËPYÕPÝEvuzdv}wMvNKLÆÄ_MdfaegewNGMCÓÖÅßÓÚÊÎóååçåòñÉóçáäþòçäúòÚWpacho``zgevu[ÝÇôÈòúæíïìãäúåúäáäýúåÿò×_wamnjnnfea{|t]ÔÒÞÔßÛÅÊôôñÇÌÚÞÃÎôñõÝZqLG|xdyKXõöÁÌÕÛÚÒäçåìàääüäùÂËÏÚÙXÛÊßýÁFTEÝØvH}{q}F^tH|fpw\ÌÓÓ×WÜPÐôÇÌôÅÇÇ÷äúóÜMCrz|{~wvKDM]OwttDYWÀÄÊÈßÚÆòûþååüÿñåáû÷×tppqwHtv|p|{tp~xd{|pMXLtvsOODEBVSQÝÏÿúýÄÕG@OF\DYÔTÙôÿáãàâãíâàçöÒÐGJAKpqdd{y|}DGq}wpp|dr~yYEÐÄÍöôöúåååçæûÊõ÷ÀÝ^]NrIMKHJMG~pt}HIsecdx{tMÑWDÔÎ÷ðøääöÊòÊÇÈõõWWÅ×ÄÍÍÁOCRq~wJehcfdztZsvÑÞÂ÷ÿåø÷äàæâáæüÂñÊÍðö÷×HßÑßÝLZIyvqzy~fb`t@~~tYq}GQNEÜVLIRÀS^ØÛT@ÑüÌÛÜÑEBEßÜÜ÷ùööñóó÷ùóÌ÷òüþÊÎúöÎõ÷ÏR@TC@PÑÕN}v}gya`ce[@tCvNvNÀñññõ÷þüåùôöÉËùÚÄÃQÓrde|qgohhbcfeepqvTÙÄÝÀÎÎùæàçäúåüÌáèêèúÞVwZNruJFMtF^EHw]@KÅÇÞÜÑZYLDßÂ÷ÅÊòÏÅÜL|u{s}}E@×ñöÉÎòúòöñÃÒF@\KB^Lvagmcr}zzimbnaz~I_õýôøæåççèéãæçûìèæÿõäáóÁÖzcbmnnhjikcgeq}e~z}tEÍÀÖYSôùðøüçìëîâûÁÙSCLEÞËöÂ@tvtEQWSQ]Kw^\SW×ÙÎòúüýÿüñP[XFÐÖMutLWØ÷ññ÷ÞÄÏÄÊÉÂÍØUÒ]NKLtdf~HYN~gmlgy}qEÖÑòøúáãëéìêêéìáøúäøúËÝQIFWur~`ikihhbfyyz~D_TÓØÓUÝÀÆÐÓÛ_\EÄöÀôÿðñÿÿ÷ôÎõôËÛ÷þþñùýôËðõÆÀÅÝ_@MOA[urstptw]ÅÇÊ]LGrNMrvruWVÀÙ\ÒÓSÙÒÃôÁÍÅׯØÇõ÷ùÎ_ÕÞÎóÝ@sf`cbambmicepLBÖÐ]Ã÷óáçáîâìïíèîéîææàäùTv~niijnofx~sY]Ò÷þáçãæòúäáïáæàæìâÿøÉÐÐFuvxtMHw}vOLY\ÑÛVuNpvqf`lnbof~uÜÑsspBPLVÑZÅýäéìéèãäçâéâàøÉÍÖFÖBMJgabatxmohkmb|~~Mpt×ÒûäÿüõÉóðçáåîãåäåìçôõÑTÂÊÄÖpzaolnczagcca`g~aer|JqDÌÜÞÐQËþûææåââæûÿøðÙßJzrt_Ð@Ð]BÃÉöñÔÉÕITÜÍñPÚÂPØËúíäáüÅ×Ò_ÜtsLFSPT÷ÑÐÁÛÌóüíçñûÛÐWwMHzz`mzg~ginkcoaciac`wCTÖYÆöæêêîîííâñðäáãáùùWX_^[r}C|ea`z{ffcfafxqI_EXB]ÞÄöÊÙÆÉüÿüåúçþÊÜÙÇ÷ÏÞÙÜÝUGIuOJKM[[ROp~}q@uHE×ÇÇß]YSRG\F[RQÓÚÂýóúúûçåüÿñüýöôÞ]ÕFFqsq|{t}~ycg`ogapRQÍÌÛöðÿàèéëàìäÂýÿÃÓORKwvwvxxxdinlhocgdagefgeLBqI[QYEWYtTÎôöúîíæáãíìïäûæííæàäôØÆôÚEEpfcmdd`ez~rz~}tÆõÑÖ\ÛÝ_ÄËÀö÷åûôüúÉÐXÍü÷ñùöÚOC\u^ÂÒufpZp}}pdb`y`of{d}RÐÂòúàáãêïéêàäåúðñýÏÃÞÊ\OpsdkjjodalmdpHUÿäûüüäúúàáúåäøÊÑÏõÅUFGU[STw}uAFGWÄ^B~rEXÛóÅRGqqs|sxeblzyCPCqp@\ÓÚðòûùþçúçàääçûäùþåÊÂVKMwIREs{d~|{tu}`kobcqADK~N_QÜÞÚÛRÕÚÇÊûúÿðçìíàãííæúüÊõÈÁ_v||zacmlkjklg~xfd|uM^ÚÌTRQÏþáèãåøûäÿÉËÇPFJAZDÔBwGEÙÇWÚÝEtyq^PÝT[PZÐÉßÈÁÐÓGvAWôôÅöô÷øøçæåùøýýøúÊTÔDwwrz`ihjkhndqCtt^TQÓñàáàëéìïéëâúçúõÁÉúðÙõõØÁËóÂZE^LqOÐUqvL~sDursqdgvJuwFNDÕöòÌÛËÂßÊýóóúæüõôùðÞSWRJtTVHwLNs}F@tuNW^uPXBNGQXXÃ÷ÆYNTÝÖÆÎÇÀËòüýóóÚÔRÐÒ_TÂÚÜÆDtsswxg``zfdMNOPÌÂÊøâìåûçáçäìïûñúççøçùÐvvOse{pz`d|zzeprfa{dxss~yvwu@TÑ\MYQ@]ÞÇÜÌúåçàïïáíéíþöýñÙ×ÎÌÚÀÏËZ}uH{d|vz`zwKtMÜQÓ÷çäñÈÌÁÞØ÷úåóûöÀÄÚÎÂÑT^@AÓÉóÛSJvpvItKchicarIEqd~vAPÒËÕNJYÂôðÿåùûæííììáóÑÝõóÊÈô×KwwC]ÓUTGwIM_GFÐÅßÂÿæáçõÐHJZXT\CIMGWÇñðËÂÍÀÀ÷ÍÂÕBQõöýòÍÝupHtdaikbzsNNFÅõþþóúøçìîéàïèâáô]R||Muu|fwrse|{cxpJZLFGwYWÑÉÃõP}JPSÐÕUÕJ×ÊÈðüáâðüûåæóôÈW@ZUÑQD[pmlfaaayy}eey|wCRËÜÇýüåääåúÿùääûÞWÚH}xrOr}u[VSÂôÝA\Ý[stPÑ@]Ýöý÷úäñÏôä÷ÖÙÈß[߯ÆÒVÆôðöô÷ÕpKD\E@RP@wvppyd{df`ld`ce~ILuÙÛUÕÊðÂXGRIBZVÙ]ÚæàçåââöËöÈõØõùýôøüäåðäÿÖÜÕVOg`binil`gxvzdyv_Æöòúóõóòý÷ñåðÃööÊòòöôÑ×@Juax|okbdesHpsuXÕßÙõôËUGÖÕÖÌ÷þúÿüÃÓÂËõÏÀÍ÷ÀÀ÷ôôÄÞTTÔGVÜL|e}w}OV^P]BUÓV÷ÏÞXqDZt^ÇóûýÉõÎÃÏôÍ]LprLHRÔJZDKÔ\Óñ÷TEzafm{sqfap{yXÑØXGR×WÆÿþõÀ÷òûøûãäÂÎÈøæáìâüÂÖGLptWCgcaerX\ÑÐ\^QÜÛÁÒAvqHÜ÷ÃôüÑÕ_WðöÿæñV]Ý÷÷ÊýûÃ[tKJsFF}`nmaae|vzl`gs[PDOeJZôçæïâøþûþÿæåþÈ]NMVÕÁöòÆ[L]VßÇÒVuSÉßóðóûStßÃôæä÷ÏISÑYÉüøÃXryezNP[@uwJAÜÿòÎRy{zgBIamjm`}ÇØQVLqÕ\ÂÿÌÉÔØÇôýàãáçäùúúþäñÕNMLÝÎÿá÷[[CPÂóäüÆVWSTØÌþËWI~ez~rx}ffeg|ZÜÇ×N]SRôüòòUÓÂÈúáîéæ÷Ç^IWØRF|`ddf~YTÞWtL{wØßÒXu[@]õùý÷QwpyYöôÎÜCÑÃÉùàâáçÛ]CZËÌÍÉÒÑÇßÜðþÁÝsxzrR]EB~epuÓûæçÿÝÕÇôíàùòÈÔ[EMÃÊUÑqfdf|eggmnko`}Cwqal{NׯÇóÌÜÕÁÈùâàûÈÚ]ÓÉ÷õþóþÿøäãìãùÊßR\ÌÂÛ\txdw×ÁÎÑ[qame@RALIJPÕÄØÌôûñÃØÂýËÄÃØYUßÒWÙÙØAglcpNNG@q|rvÙÄÀ^s}Z_wAQVSÐÚÓüùýÈ@OFÀÏÁòóÚ_WôýâîãñYs}]ÕØØFtNGßÀöûÊ]RÕQõòÀÈÅpOÙßÜñðÊÞyg~vE]ZEHsMQRÜÎÑ@qxtVZHLt_ôÄÑÚÞCyacepB^M]XwAÓÝôææýÙYÕÇ÷üòúýöåáúæàûÄ\BLÓÐTZXDOZÑÅÉúöÜNsffs_ÖTÛP@@XÞþÄRCq{yE\V^]QÍåïèëçÆBwsvÙØWCN~dxrKÑVp{fcietN|qNMPWÏÿýÄ]ÕÃÑ÷ûþÅÒUTØÜùäöUGq||FÄØÂåçäääìèâùÉ×ÕZZÆÞGWP_ÚÄöùßrahoccsFIARFVÚüàåÉÖIvpdv{eryKJFÅFconhczXÔIu^FÑñåéúÏÛÑVWÎðññáãæáàíãõÓTPT]ÔTÔZVÅòåíëïôu~gnjm``mayuAÓ÷ñ]wA[KpTßÜUÓÈûçïëä×tvsxD@p{gds}wÒÜ^u{ep~K_^XÓõääøãàòÕIwp~vBwuBuVËóïêáôPIAK[ÁËÌôñùæçîîäÍRYLez|pwT÷Éñä÷Ó\wswNTÞPX\ÇÍÿíäÄ^pxfcagdaeJÓÐÎåùS|y|egdrItÝÂüàëú×Xv~f}ZuYñäíãáàæñÓ[vuswÓñóçáäÉG}}`olbrguÜÞòäàäðTÜXMIEÁBHDÈðþåøÀÕNq}edeqvI^ÏÈôåçüôÕuelagg|@CÛÜÚôþòßI~updO[ÐÞ÷æîêèáÇT^vQÐÌ×[W÷åíáôô^ufytXWÕØÎåæâàðÇQLeoi`mfz`e\Ä÷ùüçýßL`cqawRIJÁüðÿóóÄÕpd```gyxrRÊÍóóùÿúØÐÓÂñÞòðýûçûçàáåàõwrrOOG@ÑÅ÷öÀÍöÛÙ]z{cbgM_]SÍÃ×ðüõöR`cmncHXÜõÿøàíâííñXG}vty|HQÐ×ÓÄYLueknndr|}pXVÛÍóüÿòÞ|MUSßÙØËýðæçùúúôZ~uTDSFuÁùýçâîãçåÎSDHp|vp]ÉÞÔÂôÑßÛUDwechilaswXÏ÷Æ÷üôÐKJtuswHp||HS^TÎQreeeL@EWtZ]ÔÎõóáýÀ^NQÄÁSÄÆÁÈùãèêàöUMIGÑHTÑS]WÚÎòóÂK|{fflkbamzuÙÊðþÈõÜQA_X__UVSßõñô÷ØÉ×Gq}vprNuMPBA[ÙÖT@vtrJLZEOSÝÅØÉáæùÀt}{``xZWÁöÿýæëïíãõÌÀ^ZIJtA]ÜÂüïáåæòUEw~ONey{qCFÄÄÜÃUK^[qut|wqFÅVÞÓ_ÐNtÞô^NIyqC_ÞÛõÇUÀÓtstzrA{M×óü÷ÏÐÏüÊÌþ÷ðòÕFTÈäççíáçþÌÚóôßÞÆÐLvHES^GVNsqÕ\NuL^ÞØÐØRFwqgfgOBI[\GUVßøüäóÿÈTWP@wYÑVZÚÈþøð\R|bcarxxaay|EËøöñöÝÚõóöøåýúþöøïèúÁP~qY^×ÀÆ_GIYÐýäÍÅS{~PÐÂ÷÷ÅÖôÉÙÊþ÷Ö\xkbcmed`asvvAÿü×ÒY_ÆÏÞüõÑ@B@JVõñÔWGOwrd}JtsuOwAPÇÝÒÛÊóäåãèíçäüðåáìäÏÅÆßÛUß÷ÛuKJpKBÝÙTu]V_ZEÛÓJuXFRÞÆÅ×qwO×ôõÿÏNq}ax@QÒÓCLUYÇÂóÍ\ÕÕDLÒÜFpfft@SÛòùÃ]CFOÞöõÁNpFÞÆüäæäúùóõýçþýÎÏÁÈÞôúòõÇÌÇÓÞøõÓ[M^YDÛûôÉÕ@w||DZJKpwwvM]_ÖUSJt@]V\@~~rJ_ÎõÎÀYwJRÏðÂÜAA^]ØüûóñÌÜVWÚÆÛÆÙÊóðüùøðöÍ×ÒÇÈÁÒÒVSBÝýççùåôOtwJv~sdgxrNSÜTÎÌTVX]S[ÜQAAWPWÃôòÍÔItDÙÓTSJvCB[ÜÐõÄ^NtI[vq]D\ÜÄÂÇ\ÇÔKwqs|tRÕÔRDÜÁýýòûÈØÏÄÞUZÖLÔÂÐÏÚÃÊÓÔßUT]NwOK@Ø]RUÛôÏÛÞWPÌØÒߨÛÛWWYGQNqwNq||qJ@ÔÌØÅßÙÉ×]^ECsytNX^TÕÔõPtw|xdg|HDÆÊñðõáåäàäù÷ÄÃß]]U×ÐTÒýòÝGygfmes{NJXÕTÈñ÷÷ÿüûõôôÁôüýçäóû÷ÆÒZgfc`daa~|rB[ÆõÅ_XNwxd|xyZG\ßÖõÃÉØõüþÝqt|{}uITUÌËòÈÛÑÕU]ÇÊÌÍÂRÓÖ×UÒÌÍÛÜÚÔÛ×^_YÕÊÂÀÙÜÖWÒÕ×\QTÚ×[_ØÙÒöùðÙACLag{qCQNOEuJrx|tJq}yx{ytIXÍøÿóñóÞÑÐÇðåäðßÍüòöÄÆßÓLKS×FKT\WÃòúýÐ]GDAuK@VÔÆUQÕ^Æ÷ÿäúô]taaxg`azuMZÄÇQQXOUÙôö[u@CZEÓÆÂØTVtssOwK_[@s~OÛÎÎÂËÁ÷óÇõõÐÅÂÎùæãáûÍRJLJN[ÕÂÖFDuJP×ÝÆÀ^Nu}}|~pNL_TÑÄÝTQ_]ÙÙÓ_DRXBVõôý÷ÌÆ[HCG[ÖÏóüÈÊÈËÍÙÝ×XKKdgxpvtGÁùçàæòÍDqL[JEÛßP\Ó÷ýúáâæÉT]×[NIAtqYÓPIu|z~DQÓYwLvssvÓòððüÏÕÑÏñÌùãâàûðþúþÉÜÑP@pwKqr|daBÞÓÒ[ts|ryqwLSÃÏÛÌúåùãïîîãåöÁÃTÔÉÅÍPCqtItxfypvWÄUÑSÆÛÙðòóÊÐAG\UßôùçäåøûçàæÓ]C}~gcbcgdrPõöþåÈÀÉóôÜÄËÁßÙÛÎñóýÿöðöôÓqp~gblgqs|rqsxJØÇÎüýóÈÖÙôýþðþóÏôÍÆPÎüûÿùÿÌÄUQ_B_Ku@|dz~|v[ÏÈÊûûúøÉÞÒÞÎÌÛÙÓÛñØ^×ÚËÂÏØ[ZÄÀZIqNYW×BJwvq|xytTYwCGYW÷áãàû÷ÒØÀÛÛÄ÷òüûóåæäù÷ÌÂÆßÒMvILF\ÙËÿåýWUÝFvqIqqrr~F]ÔÏÈ÷òÈÖÜÊõÚFRÙWßÛ\vNF@RE\ÌÈÅMqy}tGN@Hqs{}]ÂüûûáçðûúåæåõÂÝPZNLy}OSYDÔÖÑ]BLXßýáçùöÛÝTÃóåÿÍ×]DI@tswtB_DXÔÐvgaeywZRXTQ|v\ÝÆÊÿ÷ÑQGLRßÂÄÓ××ÝÏÞGW_XWÖRvvv~tSÄËúçÿ÷ÏZOXSÍÊõÙBt@I^ÞÍõÊóÂÇÿøÎÝVWZ@\KzdmnlfdptwuseeHUÝÎß[_]ÝÉðøçåàûÍÁWÔE}pp}pv|xdgzuZÖÛÃVLCtBÒýäøùùõÄÛöåúÇÕFII~zf`ddyvKAVBM]ZÂðýûðñÀ@pvtNMMu]EvqtIÕVV××ÀÆßÉÒQÁÄôÈÅÚ^MFu_ØÑÉÃXYXqpeuÄÑÇÞDq}pqvEE^ÔV×ÕGDZQÛÜÆöÈÖDws{qOwADu~x@GLEÞX^ÞÐPBÝöñááúçûýñÉÅSER@wDV@JprqYËÍÑðÎÓ\rxxIHu_ÑWUQWØÆôóÎôúòÎÝR__ÔÕDØÞFGwzep_ÒGJp`cmlg{y{pWVQÊËÂùàëééîáæöÍÎÄÙÄñÂ^ÕÑvNEGEGGEr{epOÕÆöüóðòðôÿþûþñöÞ[AOMYYF^]@Iv}ddrMM@ÑPJJvx|svFJ}pKu_óäçáíìãçþòöÈÌÃÆØÙÛÖTW×ÇÁÉðöPpwt@ÔWÓÎÉñüüüüýúøøüûúÈÕ×ÕSßSÐðÌWG|ggd}}|uJvs|}psvJ[XVÇÁÂÆõäàæïèîâþÃÝT\Ntt~t@L@@Pôõõùüý÷ÒVX@רõþý÷ÊÀßÎòÿôòýòòÍßÐÐWWUQ_ØÒYpg~uwZß\W^ttIrpOt~zrpuMTÉåæíìîîáûÉÝ[RS_X[Nwxw@F[GqB@JKJwEQÚöþãîïáæààúäæþ÷Á×ÐRARÒNÖ|KPftONFÝÖÑÆÏÕFwxe}}wNvCvCÜÄÿâïïàääóÌ]rp|{|vCGHEÕÑËõÈÂ^ÖVZÖFAÐQÕÖ×ÐÚÆÌÑÙùòøûÿþÛ\EL×ÝÐÕFv|de}z@ÔZ_AZPLt|d}r}N×É÷ÍöúæìâââáüÄ]Nqsqs}}rtBVVÝÙÖÑÑWOwAFGVÃÊôòÿùõÎõÏòùñðÈØSCtr}}w|qq|JÕÐÑQ\ÝW@sx{~ys}}qv]ÐÙÌüàîéêâòÒÒÆÞÜ×KZCvqwHQW×ÔAÝ\Mv~uFMÜÌ÷úýýåýÿçùåöôòÝI~rJJJu|xagz|YÐUMXXqe`fyss|GCNVÕÆøæàæäàÿÓOqvGWQD^UDWÆÄÂúúñÃÂÚ_vrODTUÕÓÌÚÝÅÁÔÇáìáààóØ^RÕÁõÆÔÕRpy|rOGw~p|`lhjcfdxvNM^ÖÌýâéîìãðÊÙÓWUÚ\NO]LFLMKÕÎÀÚßÔLOyeJÄôÿòööõ÷óòþãäøùåÉ×X}xw}|swXÓÐTXGKxydgfegeyrMp}N@UðøåçåóÏÙÖßÈÈÆÏÛÐT]ÑØÐÑGJHJtxdccfdqAÄßÃÈööüáïèìíçåùÊÀÚÝÜT_XOFI~dg}tp}~}qghjhcxyGFKÕÐÇóæííâîéàüÂÌÒAGS@Hu@J|~JDY_FBMF}~r}sGÓÄÙ×ÂÞÑÃòóöñ÷ðüðÇÐÒÙØ÷ðÏY]UHwJAwpAFKrx`hkmzvp~ARJZ÷ææìîíáääÿÌÝÂñóõÓ]ÚÐV_^HqMt}dzd`a~GÀÍÂÈËøÿåáæäàâæúüúôUELJCJtxxggxr~gvtCIup|y}MUPRW×Ý÷øåÿáíàãàæÿ÷ñýõòòÌÎÛÑØÁÒGvQÝXÕÖMusqB[ÌÀÖØÞÏÊÉòóóäåÿúþðùÊÃVEQuxx~{rydeeyffdbhofezrCBYÔñçàïèîêêíéìçåúóýÂÜTKFAtvrswquuXVREWÝÆÁÒÏö÷þäååúçáääæàæúûóÍÉTutzd~~q}~qvHMv~xeabfzfyf|DÔ×Ô÷çÿúââíìîîáíàòóËÒÌÆÜRrt`ezexyzzvÐCqÓÖÀÿäììèéîäüÏÈÅeccno`cbomfcxNvpv}r{||ztHFÝõóýóúåøúüÿåúóðñ÷ÒBOt}J[EXZYAFSPBANNCZÖ^Y]ÑßË÷óùûäãîéêîíæòÃ_p}prwgcblhjlacbmccdefzMUÚøíéêîéëîáçäòÊÉ\pyyg`blmgyrOUY^ÖÖS^Þ×רôÿþççøúäûåäáããæñ]Drcbb`eppvNLHqpqydegcdd`fqCXÕ×ÌøäæìëêêêéíâåÂ]QÝYHebblhkiaggxzytw|pBÛòçìîéïíûÈUymkjjjjnhfruBM@JHDEXX_ÛôóçåòùËÆÃõýûææÿüÊ]KstDYÖßD]ÓTPPVTßÕYYLp|gcg|wHGAÀñòäâêëïìæóÅDKOu~fmnnhkfvÅüäèêêèìçÞJwzbmhkjjllfpGSÝÖÞÎõËÀþåäãíïïáæþùççáçöÖ\rbko`ggr}vp}}qMDDAHx`ccf~z~tNPÔÙÌúãïéèëéíáçðÈÖ@pemhknafdged{b`~^ÁñáíëìäùÙtgbmjibaeLÑÝÇÎøåäàçäçûýòõõüåùÃZNpzdg|rt}wBDAtJVô÷ô÷ÊñÇRHJCMׯÆñòÿúàíïîãâíéîàøÏÍÓK~glhholc``g}TÀòåáïïîâàáäãììíáþðË]Kxgdf`bbhilbg}LIÔÈñäííáàïììâãâãæææûçÿÍÙXv{dffdryesKr~ab`gpI_XGJvr}pJY_UÌÇÞÀÊùçàæâèëèëéâýÛØOgabkhomcz|rMOpAÕÒÊåàíîêîæþÈ_I|fomooapQÍåâêëêèèèîïïçÿùñÄÑ×IvvvvwtOM[ÕPRQÕPÐÊõÆðúúý÷ÏÖDOuGÓÓÁÊËÁÂøäþöðùþåáæûÈÀRvw~fcokhkhlniodrNQÌõôýçæáààìèèééïíçäóÛH}qeabcmkkiib`eFÙóàéîîëëîîêèéìíàúø÷ÃXs||~p}fe|{za```a{ytvvZYDL@G]ßÙßÇÝÛÍÍÑÖÐTÄðòäçÿõöüÅÖÚÑÑÙ×]FYÕÖVENR×WßÏòòÊøçãìîëêïâäÍZKyalhnapTÛõüçàççæææäåÿó÷ÏÛÒtx{y}~NJvtHS_tt[ÓßÁòùääáçòÒÚÁßÜÍóôÈôüäúùáãàäçàæùóþòÓOKuveefbhjolmzN]QÜñåûøæíâëîäæäÁ^pvvalnnonaa`fwCRõäæåçâïãàãïéâáâïâáçòÞRE]IJHqfezdfcg~egztqypAIuq@ß]ZCLItGVYZZVÕ@EÖÉÈÛõÏÉÃ×ÚÄÓUSYwI[N}exppysqEHMÑÐÁÎþìëêëáúðÀS{fmihhcex_÷üüüúäúúúçäþåýÐBqpts~e`mds~}HXUWØóúþþåúðõüåáøËÇPuuÔÇÝÐÅÍÀÅËþùñöôÀÖQXR]tq|{c`dojhc~}yzpLÓöáíâììçûææõÜÓÕQGvuvyfadgz~vGtKRSUÁýäøþþþùýÿæçûäæø÷ÿóôöÊÍÇEvuu}gzxyzzsIrfcablgzvBA[@ON[ÝÇWÐÐÛPSÍÊÞÕW^BAÒÐÁÆÛØÕSQÛÄEwtwptÒðýÀÚØÝÝöûàîïêêâóËÄÝ]E_VHfijlo`alobafpEMKG]TÓÊòüóôÁÖEFCuvdddgd~BIyvDVÁþãîæý÷ÀÁÈÊÿùò÷ôöõÍÃWX_ÐÆÎòúçâáûåòúãàæûþòÂÝÝÜ]rljonmcfqDÀýûãìîéëèãóÑts~sC@Lwzcmbd|ttHOuEÆûçøûçãìíïìçÿýýüýÙÔDKHO^Zt}gdqIWÅöÊÄEwKNvqJwpsvvÔÓX@qqvEÖØPuuqst\Ïü÷ñÿòóýääñÑJpqrvZCLtvL_UÅýùýÿáíëïçúùùúäå÷ÎÖBwO@AKxfgcl`fbl`axv[ÍåååäûååùüýöÑLKy{~e{zgevWÍññòöÃõòùùüøòôõÁóçûÈõÃÜÐÞÁÿæÿ÷ÏÇÄ÷þúäÿÌ÷ÈÚõñØ[Jd```m`mnhjjlxK\ÝÙÁüüùãáÈÃÞZFJOVÒBtKMKH_ÑÇÖu@UVÄÎÁUÞÅÃôóòàìçûøäæáççäøõ÷ÌÉÿòÆDX^SVÕÂûþÊÅÇ]IBte`mnalnaedaeqE×ÑÄòôÃÞÒWÇñòö÷ÄÑÃßÛÈ×GNvwvuCQRCZP_XÆóþÿþåáìëïàçúò÷ñþ÷ÕDXCJA\YN}{|yxxdmiio`d|K]\DSWQÐôðÛS@OJ}t@pacg|vKFÒÎÅÄòùþùæçü÷ÅÈÍÒßÜDvtMSÇÎ÷ÿþôÍðÿûæìïâíãïíàæûÃRZYLq|dzajhlmmgsßÍÎøçøñöòËÜÔÖÜFyz}zdgdggg}D@D^YL^ÒÛÊùçâãäåæãáâìâçøùçùÂÀÃÕHO_SP_RÛ×]^ÇÌÚÛ×XrggealnljicxvB\ZDPÖ[VVYMHFÚÁPMDMedwqwwCGqpZ^B[]]XXÜþæçäãâåûæàææáàäóÎöÂÒÕS@uGÔØÖDHHec`qyp@Aqy~wquYVFBDÐÕLvwKadp|||uLvAWÐÜÞÌÍ_RÐËõÚÇÞXKw@R\ÅÿçúäàïãäæàçýþæãçýôÎÖLt_XMIupg```a`cgbibeHG_ÇËÂÍôÿñËËÀ^JNAwd``oogdyqutwKÜÉðçàíàæââàæççäñõËÃÍÓW_[VTÚÎÉÊ÷ËÏñøççþóðÙGFEBuq|alkjonlfJLVÉÈÇÝØÁÐWÞÅÝÔYMq}ye~y~qv~~}ppNPßÀÛÀÈôðåâèèéèïèëìàæáçóÈÜ\OzgzypuKus|e~su\TECNJCuuKHOtuJsrabae{{zyxdzv^WßÃÄÛRLVÛÉöüåþüöÂÍÃÅÂÂÌóäâàåþòùøòúçææäøýýüò÷öô÷ÚR_GIq}~zeaccmbdID\ÛÃÄÀÂÅÞW_FEMIqe`mkkhocg~suqvCÓÈüúäæìîìïïíãæûùþüøçûñ÷ôñöðýðÇÐÔØõöüù÷ÎÝÖÒR^ZBMt||~e{{fdrBSÐÒSNwpvN@[QPupps}{xdaafxppwNOE×ôóøæâîéëêëîâæäåÿòóðÊßUWWUÕÙñÌÇËöùûñÌÇÍÈÜ\Z@]ÑSDwqJM@BIuwp}{z|qreffgeu@Os~rKut[WÖÞÄÉöþúüñÉÆõøáíïéîïâãâéèâæáààåóÃÚU@MYÑÖGs}|xexrttwOXWÇôÂÐEIrzfffdedd`cblonom`dyvBE[SQÇõùàéêêêèèèîïïïãääääûóÊÎÂöÿùççæåûààáåóÀRutv|yfmhnlcfg`ocfy}rpwtABGNzaazwZQÕÁÍÂüåàâããääãéèìãàããæûþýö÷ðôÐRZMOKNAFBqegcijna`fdeeexx~xzzdeeddzrwB^VÜÞÖÙÀÎÆÈþøùøÿýÿùþÿúççæäþñðÿøùúûÿËÚÛÞSBp|ppwtJqq~dedxqJJwsyewtr|rs}qFBB[YYYGRÕQVVÝQÕÏËÍÒ\ZPÓÇñÿýÿûòÿüóþÿøüóð÷ÿÿ÷ÂÙ_ZSY[Orggd{vL@MJNZCI]ÓÄÓYYYBtKG@uGDZ]RVÑÒÒÛÀÎôôÆÌÌÂÈ÷÷÷÷ÆÐÖÔEp}xz|rx||z|wD]YXÐÐRÓÀØÔ_ÔÐVÓÒÀÁÑEEMHGÖÅÆÍÇôÍÉÿøùøûÿõÄÂÂÀÀÈÃÞ]]ÙÉÆV_SRr|efmmbmg~JEtruGHJ^ÙÖVSVROBIu@KuuvCE×ÙÜÝÈññåáàçáàãçúæçäûòòÎÁõ÷ùñÂÀÜ^vK[Npwprdccbmhnnhl`f{dagffdsHIOKIs~sH@[^Y[ZÝÀñùüþäàæáìâããáçøüùýðôØÕDWÚñúùðö÷ö÷ðóÀÓE@txeamijjjhmohnlnoba{{z~wtOX]UÓÛËÉöäàéëêèîèèîìàççåùåäúòýýñôóúúøöÎØVADDMHr{aaggdcaalomaga`agclcgdabfacewZ\DÐÚÜÅýãííïèëïìéèìáááçääåäÿ÷÷ÀÒÕÜÀØÛßÕÕE_ÚÐDuIOOSÜÛÀROFCtpLI}zgexdxJrfzuspÑÁõðÂË÷ôôöòóðöñþüòøúòôõôÂðåøûù÷ÈôÀßÚÛPZF[Y@[ZMr}ptMOLK}s|~qBSSYÖÙÀöýåÿóòüÿüåæçþöÂÍ×G^SGtKW\M]ÖÚV[]^]_ÍóÊÞVTÕDA]]XuCQBMÕ×PIqvruRSDLK_RN[ÒÇÍÏöøúáîêéïïââïîíçÿðñÂÒÆÎÇVWÅÓPÖÞÓNygccfgg`lbconcc``ztwIWÇÃÑQÜÒQßË÷÷ÆÔÛÇ߯ÈÈÊöäæåáãàáæäåýþåæçúûåäûñ÷ÊÓÔTÙÓDRWP[Iurgg{~edzxza`ffccfygd}tIwqvpxtTöýðþûþýäàâáâéîâìïãíïàúäçáåùþ÷ÚÛÏÉÅÒÜÑYuHNL}zedbolc`llmcllmbonl`fazsrptZVYÔÉÿÿúãâääæáâãàââáäçáûüþûçåûúùñ÷óÎÝÚÞQEMMuutJGCIOAQ_KHIv||~cmfaaggdgddrIvMPÑØÓ×ÃËÍôþå÷ôüððýüþøùüäçäçäçæäøÿöÁÒÕI{ss|~xzeedetIsp|~}rqssFwrD_QÕÙÁõõÚËþ÷ÌÈÎÌÁÀÚÇß[]ÖDPÛÓßÙÜÄÍÛÝÌÃÑS^_SXXBKuwqvwEÑWTÝØØÂWERXJuHvJOtwv}sJq|tÐÝÚ÷óúäåùääåääúûåý÷ÆÁÀõÇÁñôÙÛÚÇÔ]EIt{dddccblboimaaf{~stJLqsstI|xezwqwDR×Èýòçïìïïëëîîìíàåûø÷ÊðñÊÄÙÏÏÀÙÂÄÑÞTD}ga`cbionknmadyzy}vJ__CODRFqOw~dfy|qtDÑÎÊöúúùçâãàíîèíãâàáøýüóþúùøÿðüýöÈË÷UFAwgacoihhiilllmcbccnklcnbaezdNXA@YÜÊôýáàçæââçäììáàããåøåøóðñðõÍôÊ÷ÂÚ×YGKMCNBHvuJMÐÛÓÞUZLF\_RCtrz`oommmm``ce}ptNC\TÍóùúùäúùúäáãáæøûúøæàæúøøòõñ÷ÌßT]MMw}pvsqqIHLYK}{~rzdexdegbcccdsrvYÑÍ÷ÿúúÿýûúöÈöñÏÂÀÁÜÜÑÙÈÌÚÚ×[\WÚÝ\MFAwvLV_]ZC@WÓÍýùòðöóÿòüÍXZWZtM[Z\]LuC\Àóðñüüöôûÿ÷ÎÎôÁÙÜÓÄÄÕYNuNT×PRDAGZSÖNwrMKuHwuwNAtK[MGONG@FGu|z{vLFYVÝÚÂüäãïîîíïïéèïììáøòðòôÆÝÝTWTÕSZJJq{dge`gd`onb`gxtFSÔWÓÙW×ÜQ]EWß[FQ_AN[\PÞÅñååäæàíâîéìííéïàáàäóÏÊÈÏÈôüüðôõËÌÒÝZtq{|~fddciilobncd{`nbmlbzgfexqHqtBQUÂññøåàãïîêêêêêîâæáàääúýÛVÆÆÇÄÃÆÝWPP[NMGHp}pNRGG^FM^R]QQÝPLtwtqx|yd`cg~vu]ÞÅØ÷óÿüûåúæâììâááýýññ÷ÂõÏ÷ðõÈõÌÛÚÉÉÛÁÂÍÌÐSV^Y[PDANL[AppGK}y{zx{ss|xyyO[S×ÚöòýöøäûúåúþüåææçäåöÖBD_U]W_Ou{|ruOttuswHÕÁÂÇÑR\QÛÈÃðóûåüòòð÷ÍÞV]S^ÔßÚÜßÒÚÆÌÈ÷öÎýóöÿ÷ÍÇUENGSÔWELKCD\S[KqzedgzrJqygddrJFYPJ}yt@ZD_Ô^S]ÕÄËÈÙÝ××ßÄÃõüäøòüùçæâéîìíåüõýöÆÞÔÜÖMrzeg`fccnilcy~yyepLZYEÖÑTÚÙÊüóöÎÛÛÐÀÌòøõÁÞÂÈôòûçàçáááèèéìçþõÉöòæçùðØ\wwOCtygaijhibmikjilcfrvy~tDY^ÚôóüøàãääáíîèêïíïáþýùóûåüþÏSM@DBDCydcnihhlbljilaegegg`bgeyKZV@vpvIEÅðóÈ÷ÿðåçäæåæçæåäíîíàääúñúçúñ÷ûúüýýðÊÁ×Xqex}yff``oo`blob``af{dmgegaz\ÐENDQSQõñÄ_SQÜÍòáãæçãâæåàíïåöÿòÈÈËÉÔAERÝÔÝöôÑG@tg`d{zca|{|}pqz{v][MÇöÃQSTÙÓÉýóñÌýåøòûúôÜÐÞÌöðäáåðõôÒX\ÚÃ\@P^KBDXKKVQÝÞÂüóÝREuzcmcboocmonlnklafgOÖÑÔÅôóóûàããàíééîééíçþðñôñøûôÛÓ^qz{zfeyzestp}ptHMDÞõÄGLtdbnhonncsqv^PAA×ÁöññáéáäìéíìêêëëáþõÍÛUTÑÓR@Cqxdg|egpYwKAt}|I[tz~u}gggnndywKHGÄóôñæìâàîîìéêëâúôÓINZHy~~{efxqps|yypGvrNÒBp}wwwq~xabbmbacaf}VVZEQÉýüçàãìêêêèèçñÂÔv~yezfeprytACWÀÙ_XÅÚMzaf`bmlonkomoib``azvsrLÅÊÍÅÍÏÉñäæíéïëêëèèïìëëíäåàåÎÔDry{y{~x~}e{r~sBP\u~wOKr~dfzNYVÅÞßÚÄØÌÅÖÓÌñôÍÃñùøÿûýðñäãíîîííäåæüôûæùý÷õðñÑDt~z{dg{ptqt~{eda{df~fmcfil`c~v@PØÌòþýääøøüó÷À÷ûçáæçæáâàîëíîïàøñÊÁôÂÔ\DBEYÔStpxbohncg{e|{d{|{{}r}y|tAppVÑZTÜôøàîéïïíæäýüûäâéïâìïããáæûñôÈÆWX^VX@MuCC]PEtyeaijhknbclnmhoa`nhldqMQÛÏöøæíïìíïãççääúçáàãâïêïèíçÁÞÝÕUרWßÑPUW×Yv{fgfom`mmbfefaxfsA\s`gfaarAÚôñúäåäþÿûüüÿåäçââîéèèéëâéâøþÝZuOYÓÛÞÁÂÈÄ]DEqdmnkinjjjkkay`hhikhl`deHÝÍóÿþýöÏÊÃÄËøçæáìïèêèìêïøúñÄXMNuHM\ÜÛÅPP×]veddc`ezzqvzfsYÒlgoinextVÀôôõþøÿòþÿýðùäùäíèêéìãÇÛZq~|qIqpwA[SPZÔTCpqIvygbo`afiiefcjiff{OTÂÿûþòðòõôÍöýõñûäáíâíãìéìèçÎÁPtysvswqMXNCYÓRtyxd`c`eyxuK|afttvy`nkho`dI^UÏóçáãïîæóýäçæàìâââîìíèîáôÈÒX_BDOreywZ[DEJe`ggacoooiooca`gfljkhklzp\ÑñÿÿáãáäáãéïæãììîîëãíáàìÿùüôÀVÑÖHJJAQGKJECusq{``gzedxrvzysxged`nmddz~qwuYôýæîèêèêëîéïïïéâæúþöÙË÷ÌÀÔQÓQVUÕQN|gfc`g`bhionbobbmmm`ffagsvEÙÏÌñæáàâìíêêëíáàïàáàûûäàïîìããáþñòñöòöÈÉÅR]YNvxdgdge~dee~z{dfdye`gacdy}JLÔÎùáéëéëëéïíááâìàäåþóóòäáøööô÷õöýñÂDuv{zryecmoibceyef`loiobkicfsRÒÅôüäâèêëèèìâààåñòçäþøääóÈÆÜÎöòûåóÉ÷ôÌÊÞQGeydyvOOrz`e}JCLJrxzdc`zppZÇöàéééêîíáûÌÊÿñöÍÑÝÀôòüöÎÁÖWÖÚÛÙÑ[Cu|{{gbhnlclmbmb`d~wvy|rpJDÕÏõôÈðçàèïãäþóóôÄÞÚÇÌóøåÿþÊ÷ýóÿüóôØ[NuNws}{}}xy{~dcjhl`de|~e{~qwNF_ÞôûáìèéïâáãèêïåðÇßÂÛßÚÐÏòûááàäôRJJYÔÖÓ_sgabbconmlnofcmojibfrt{af|qLG×÷òçíêâýÀÐÄóøúòôÌÅÒÛËðüåäçãâàåòÁS|ad}uK]QGrddgf``fbldxydcmhleywutMÝüæàìïêëáöRFTÐÉñòþûòýøæäùýôÌÍÿþÎRI{iko`g{yenhikoblnjkces_ÊüöûããàààãæçáûñÆPu|r^ÛøæìèîáøÊÜS_A\ÜGw}z`iodrGLI]Cwr{dcmolmgwKxgfmlmetÕôñçïïéèîìæûóòûäàáþñÌÚÔUÛöçããìíää÷ßFy`njnfgbcloofzzrtrdggbhnon`CÕ[OOttsBÝÏýúáãáçøýÉÛØÓßÄùààçøÿçåöþáíïìàåõTEpglhihndq}y{xp~HGuquutrsu}edHYÏåáàäùûÿ÷ñåäþäçæàäääþøåæçåìèéìçäçüÏÀòõÉÏ×P[vzbom`nobc``f{adyxpsvuvvt_ÚÉäãïïãæøõÜPV[CÐÁöþäááúçãïéééíæýÈÙTÐTÑßÞÝÖÓRqxeaabbgx}yeamcfdyvwN]ÖßÍÀ×ÐÃöùàééâàúÿùýðö÷öúäåàíìâìïïééîïäðôÐLvzab`cae{}vsygcllmombil`caeqLSß÷ñüþþÿýýòñõñýüðÃòðÉóùøçáæããíïééìããáçääúøÎÅÛÕZKAMw~qIE_NtJtr|yr|sz{eesqvBUÁòýáàáàççäùþðÏÌÈùúóô÷ýñóúàïïîêéïîíâåÿöÁÄßÞÝZvxzgagfafg~wegffa``cagd|qprp@PÓÀÀôó÷ùåóöõÁÓPÖS\ÐÊóýðöýþäãííïïïéìáäüõWG_^A]PÑßSGNvvJ}}N[DDuss|z{qvstIDÖßÂÉÎËôñ÷ÉËñýþüóýöËÚÐßÀÍÊó÷ñþåøùüùýÎôôõÛÔÖ]w{gfcomggd{ydohhllbafgfe~ezfagdyLßÇØÁôÅ\XGYÔ×ÊöÊÉ÷ðÈÃÅÇÄÇÊåäúùûþÀV\WÑQTÅÇÔVUPGqezpBLp|s}g`fx|y{r{e}p}eerttFËðÍÉÈ÷ÎÑÞÌÍÌÍÈÃÛÎÈöö÷òüýôòÿðöÀÇÜPNOOIJ|r|||zz{{abomamb`bonlfcdeyxggg{~ruHwqqDSSÐÖQYGEWÕÀôÿÿðþçááäæûÊÆÖÒÔÑÛÇÇÛØ×ÑÊ÷Ï×^]ÔR}eqFNsdxtLHpzgdzfadvPDuIÚóÎØÍÏôðÍÃÞÄÍÅÖAAVRÙÎùàáúüäçøþöÝÃÂ÷ÇÜÂÙÐXABupKL@_ted`bggagfdfaddgegdgxET×RZXSXvtX\DNX\PUÖÆÆõñ÷ôÿáâàææççòðùúúåäûýòòü÷ÙßÔXC]ÒÞÞÐ\F^HMJtCIvpHD[QGATRUÀôóööÃÜÃÃÐS]ÑÝÒ]QÍõóûúøøåäáíâæçüöòÉÍÞÒÀTP[ABvuIuuvqKAYtIMpr{eegyrKKuOMBOYQÓÅWÙÒY_SSÖP]ÞØÁÆÉññûäåæäçààãíîíàæäûûüðòËÞÜÝÛÛÀËõÁÂöñËÂßS^Otw@VZX\CGSÑÇÌ÷ôÉÉÃÀÁÔWPXDwqHZÅÉöüñóðóòýýñò÷óûñðþóÈÐ×ÞÕ]\\DXTS\ÔÓXHKJtqu}{fga``cfzyx~wJ\ÓÒÑ\ZCqIMKKNZ]^Ð÷óåàììïêïíàÿËÞWWßÇÌÏÏö÷õöÊÞÒSY^Ktssqyfcbblcfdyzvursr{stGÐÏÈ÷ñóüþûæáçøúúæàâïáúøþóöóóüøýüýÎÚÑ_FJ}{fx~{fcmoihm`ege~y}wJs~e{sJpKOtuXÑÖßËþæìîêëéãùËÎÛÑÔÒÑÚÛÜÉõÌÁÌWXIKpxe`boklomga`ddgdeqZWÁöññõñùþò÷óòóÿûåúäæøÿñöòþøåæååûòóÉÆÆ]Lvy{zeefokjhmd{~|}|ys|yxyz{~s|~sOF]ÂûàæãïêëîêéíâáäÿÀÅÜYrqu|{pB[BC^P\XRYNwtqyf`fnczp|~yy}wOA_RVÒÇÎ÷÷ÌßÒØÎôñóòýÊÛßÛߨÓ×ÖØôòö÷ùýÀ]×ÚÚQ^UÛÕ^Bsrss{``gz{gzwuX]\VÐÁÂÜÔ\[YOwqs|ppx}wNGÖöýñþúúäúÿÃÛ×tedcnll`gd~vtIVÎ÷ðþúùñÃÖFsealnh`gbbfwNDE_RÈåãíæäøñööÈÓÑÜT^ÓÏÆÓÀÚUÝØÅ÷ÿþúüûÿüóÎÌÚÅÚÄõõÄÁÂÔS^]]BACsx}xr}wZA^UÀ÷ÎÒÞßTSXZCqtvwdg{fx}H[GVÂööóÿóÊËÁÅßRNNw|x|}qtvqqCÚ÷þæäùûûÿüôÞTDGJz~pHKuuqNÃòòÿåàâàãàåóõËÂßÛÞ×ÜÙÄÚÚÁÍðÿçíèêêëèìáàçüðñÍÅÝ_RBIBAE^DNGYZXFBuqMO@ZXXHt|}v}ggzy~xyrrvvw^ÕßñÿúæåùåýÊÈòõÜÖ]I}|zeqEÄñðäìîéëèîàúüôÍÐ\Ie{}}qwKFLVõðåæàâïïãìâãæúÿöÍÂÄ××ÒÒÕÚÀõýääææááâìãúðÍÙÔ^SBq~afyydddag{fgdfafe{~qwvBJtBIMOOQ[ÖÔ[ÝÜÙÛÐVTÙÉüäúÿþñýüòþóôÂÚ×SMvygdd{vBDÝÀüçûûäåäååðÓPMvsqvBÒÚÍôðçããîêïìííìãçðÞTXDH[^E_BSÇÆÇõýýùÿý÷ßÓRupz`okjnmcfzg`fztBAW\OH\P[PPU]ON^P×ÂØÚÏÃñòöùåûúåççãæåäþòüðÍÛÐROw}zgxz`ce}JÔÀÎôÿøøàâíïáäýËØPOBKwqpvNE]TÚôüçãîéèëéèìçüÎRJe`ga`mllmoof{@WPÞÞÒÒ\ENxg`llolob`c`aagx|qtG\XÐÀÜÑÑÄÈÎËÏÝ×RDÕõñ÷ôÎÁÚÃÀÎüäÿÿýÿöÁÁÂõñ÷ÎÂÜÔRXÖÐYBIIE\RF[TÖÌ÷ñó÷öùùýø÷ØUTBwYPHDU\ÓØÙØÚÅÝßÁ÷ÊÈÛÒÔOv|abcoinnkhca{GÚÏðùñõôÁÕPV_pafcfzaggfd{MRÀÁÙöõòûÌôñÀÇÙÆÆP]ONIHBWPÕÝÂöóðôðòøàæäáùòðöýñÏÚßÁÅÖ\[t|{ez{zsMÜ÷÷ð÷çàùäàþÊßDHqeaconhncfade~DQODÐÐÀÈÄÖYupp}dedcmbmfeex|rR÷ýùûøååþðÊßW^RYNsre`{qswAS\YÑÂÄÞÄÀôóöÊÌÇÒÜÏÅÝÓÐÔÆÿåáææáçâéèèéãåååñÞQEMIHXXGÔ×ÔÛßPEOtvMGP]NvqOÔ@pzgdffaclhjmcbf|AÙõÿåçáåÿáæðõÜYZt|xgddfyLEVÒÇöåæãïîïãâïãúÊÑFpda`ac`gpODSQÚñûäãïéìáããæúö÷ýòÊÃÊÆÜßÖÖÉñðõñøÿüäèêìîéíû÷]IDIzljhoohjcyqrstMEVYutuLJq}x|s}p{eqKuEÖ÷ÿúçäçàààãáø÷ÁÁ×@t||q}qASV_ÓÎñÿóýåæàæúýÀÛÔYXAXYI\RSÒÍðóøäàîëîééàäòõÅURMswLAFXÒÀñþåáââàâàæäÿ÷ÏÑ[xfgahkimac~MZTÆöÊÍÀÚÜ\ÕFuM~g{{xsLG[ÓÊñäæáìîìãîìæúòñÂßQsrqy{dg~H@MTÁÿÿåíìïéèîíààçòöÄR^CN^ALFP^[ÐÆýÿúääøçààáûòËÞQ[Kqrxdafdddy}JCB\ÑYNRTSNsqz{yfblfgae|sqquNANCRÕQÓýýÆÂÌÄÓÁÃUUQ\@KZÑÇÅÚÈðäøçáääååóÉÃÚØÝURYYÕ×TÜØÛËÌ÷äååááäûäåûûùðÊÃÜQXLutJO[ôòòòÿýðåàçþýÄ_CK|fmnjjnohildsLÃööüøøþÿóõÃÐEB|{gaa`ayrqJLRÐÚöõÂÉÃÆØÒÊòÎÇÆÐTGD_tqrv^MGÜÂôûáàèèèéãæúÿÓT]KJF_OvwLuGÓÞÇñóýûúçáãâãæûÈÑVXLpy`mlme~|r{z{~psdlonhhomobdgywuvvvyqOI@TÐÝÌðóõþûóöÅßÑßÑLJvrsZWÖÙÛßÙÅÏÙT_uvJF\ÙÀÃõñó÷òùùøûüýÿýüøæææááäääþôØBr|qvwKNM^ÑÜÓÞËÀõðóñÈÜUÐZOuNJ{gcloookhhnm`dqRÓÃÈõôñù÷ÅÔMq{ggca`cg{qDWWTYRÔÝõðöÈõ÷÷ýøøúúôÉËÂÙ\BHpyggqPQÀ÷õüåæáàìâçåúûòøûý÷ÄÕQÕT^CIuuSÁÆòççáããáííãúôÍ\vygggg`bllmgx|rsdcfdxe~pwJU^OSP[[VÔuzds[ÆÅ_BISÊþåõÜ]PÝÖTuysDRRMeuTÖUSP\ÑÞÙÇÖUÚÂýçáìïììíààæäøõÍËõòûÿ÷ÎÍÙÔWRÖÙÒÀÛÂÀÄÌÈÍËôÅÌðôöñöÌÀôÇÀñÍÅÚÙQEteamijkibgKÃÈÈõõôôÚõüÝR\H[[uuu[\BL]TSÒÞÈóóó÷÷öÍÄöþö÷ôÜÓÕ@qrtK~xr|rAQØôõ÷üøæàíëêëëèéæÿõÁWÕÞQ^UÐÙÍÉËÞÈÊÉ÷òçãáäøö÷ÚEYRBOvsq~eeamblhle}pCGpFSEÒÇWOIqx~xegfdgeKÑ×WÜÄÀÛÏôÏö÷ðûùÊÑWAvvqHGÑØ×ÐÒÚÚÜÔÅÏÌÈÊöýûúøü÷ÊÁÁóúþÿóðóóôÈÂÖ\\ÛÆÀ÷ýÿÿääçááúþûÿ÷ÊÉ÷ðÍÒQÔÔEB[Dtyeg{v|aboinom`fddxtCSÞÛÙÝVQÛõÈÛQ]D_PIM[[LvqrvL\×QSSRÒÅØÛÃÇTÔßËñ÷öÄÓ\tHJHNvtBÜÏ÷ñöÿúçàïêèéïìâæüÎÓQKvsrwvKZMG]UÞÂòçááááìîáäúþñôÊÄPJya``onnolmmmbg`bcdqKCvpuspJNJtwJFG]]NEQQV×ÁÛÅÁÂ÷ÍÞQ\GJAAIrsGE\YHtqwLOYÞÓRGTÉýðüÿûûüÿúáãáäÿüñÃÞWÕ×Y[TÙÁ÷ðñòõöõØÀÄTVED\\AEAHODÐÅÝÞÒQGtAJKt|~zd``ma`ad{vuG^QTÙWTßUW[Kwvedz}dfxpu_ÜÒÛÐÔÍÂÍðöÍÄÔßÄØQ×Y}rrw@LtHvLZUÐÖߨôñäæååçàçúääøôÇÆÖW^ÔÙÔÝßÖÖWQÒÖÜôóõðäããàæäþÊÊÌÖ]JszlhlagrNC^SÄôñö÷õôößÐWPÕAKvuMOLX_VVÇñôÆÓÓQGvrqqvquL@FA_ÓÔWWPØÊôóùöËÇÓÁÌÛÀÈôÿúüüûúåðóùÊÍÀÙßÛÁÅÆßÖÖÐÅÄÃöòÿùúýþååøòøüñÃUYX]FXJqvuwv~`fgfdg`ffccc`ged}qJVÎòðóñÈ÷òýòòýöñôÍÝÒÝVFCR]QÇÉõö÷÷ÈËÀÚÖÒZqr~vspvwuBÛðóöñøúäãíééãåððóõÐ\PGF@HOHZÖ×ÒÍöýåååçúðÿù÷ðöÈ÷ð÷Ç×R\u|yz`bmlmb`dx|rHF^ÝØÆÈôöÇ×PTVQCp{amfe|JKDÔÅÅÉôöýýúçæãæøôÂß_FAKutuKZWÔÀõüýòñõõõÊÛVÔWRÝÞÌ÷ÍÆÁ÷Êõ÷òþõÈ÷ýýðÏÃØ×ÛôÉÈÁTÝÝÚÄÒWWÝÑÞÒÔÑWQQ[qfbbbc`f{gdfzssO}BL\Ö×R]\_×Ì÷ØÜÐÝÀÏöÌ×ÁQuVÐVOvv{{yswNML]ÜÄÐÑÁÏÊðÌõöõÁôüÅTVuK]ÆÛÒÈñøúãéîâøÿûü÷ÅÒM~anmdgf~OßÏËñÿþäàãïìààáøÆ×[uItp{amhiogdgxrtuIvys}OUÝ×_RVU\ÙËÞÖ\A^ZUU\ZJtp[ÜÒÚÆØÁôÈöòÈÄ×DBOtqxabagg}uG]ÓÙÓÅÎóÿäããâéèîìãÿÁÝQEHZ^EB\^QÁöòòÊÈôÎÝS_Yvx{{{sCONYÝÆôóòÉÄÒÝ_ut|dcb`okhklikbd|JSÜÊ÷òäçäúýÄTWL|qOHt@FBRTÖÒÆÉÎÁÀõÊÞÐEI\GCSÒUWÇÃÁÉÉßÞÌßWYÖ×FDPÙØÆÌÊñþóöýýýüùùûøüõÈ÷õÛWÑ×R_ÑØÚ÷ýùþçàáààäóÍß^N}cjknadr]ÞÌôýóõôðóÊÅÅ×QWCCELyzyrqHRÖÍóòöôòñÊõÁÔ][urLBqpquMSÄóþùñÅÎý÷ÝP×ÑÔUßÊ÷ñÿäáààæáçðÀÙÌÇ]HrwKr{~LÕWTÜÐÛñðøàïîàåäûøÿüðÆØ_XÕYuJq~|ppxzdadglkjklf}uVÁôÿûâïïïíæåÿôÚÓROuf``adyK]Y]רÇôþþÿýôËÃÁÑGIrr|}~{wpvÓóúæâìïíâíçûùóôÀÄWÔÅÚÛØTSÐÛÇËÂÄÄTTÖÛÏÍÚÕPQÑÌÈÊÀÇÉÈôÎØPWPB@CtJs{dxrr}}wJO@[×ÞÎÎË÷Þ^Otp}z{yI]ÓÓÑÇ÷úáâíçûýÚÖSK|g``g{wICtHWÆôôðóöòóþüÿñÄÅÙ×S_]ÕÅÞÞÚÈùýþäûùÿðÎÆÀÛPAMJBX\TUÔßËÿùûúòóôÂÛZK~fcbmlcclincerqtVÂÁÃóüøäåúþÿóõÊÂÎÅ×Ñ_X]GYMpqp~xeed~}vCA[ÔÒÛÊüúæàåüÉÀÚYtprxddysquESÕÉþáãâïìææäðõÃW[\f`cd~}pqAÑÏ÷üààíãááòúñÉôÜÔGv~Jte`laz{xdcmmcagdafzqu}vJBVôÿóýûáàäòÄõòùõXX]ÝWspZ]u|rvIw}vuBCttJHsrNXY]ÝÚØÓÀñúçäøóõÎÆ÷üôÍÇÕQ]QXIBCuBTÛÅÞÂÌØÙÕ^PXNAYX[]_YE^S^ÓÉÎÌÀÀÛÓVQGJvyegafgeee~yyvZ]ÓÅÚÅÜÂð÷ÎÂÚV[AvJHv|e|J^TÝÞÙÉËÍôüýñýöÍö÷ÊÝWGvwtIHqOK|pqvMLMZQ×ÇöûäúçäøùþýÉËÈÎËÓߨRIpwursIONYXÐÍöÿýòòõ÷ÊÆÁÃVwuvsygfa`fac`x}p@_ÐÞÐÑØÇÀöòûøþúü÷ôËÀÝD[FMAMIKKMt~r|xxwZTÑÔÓÚÂóùùúúæçûååüËÌÂÃÀÏÛ×SXEZ_XVÔÖTÓÌÆÒÕÑÜÜÉõÍÀÀßÓÝWDOJHA^ÕÝÎôÏÇÛÆÚÄÊ÷öÊÊÁQ\[_ENusr~{~ef``z~rw@ÖÛÀÎòþÿÿüúäæäý÷ÁßTÕ××QGMAF@MuwsrstM\ÞÞÜVEF[W×Õ_S××ÓÔ×ÞÜÙÀ÷ÿûåäääøûøùûúÿöõÎÌÙ×PDMtqtrruvssvH^×ÚËÌËôöõÃÛÑRLOYRSTR@w|}pqJur|~|r}swNMFTÆÌöüòôÀÅÁÍÍÍÚØÜßÐ^WWSFNY××W×]FKNQØÃô÷÷ôôñõÁÐWZwtBED\]ZNK@AGÕÙÛÆÏ÷ñðòýÿòòúæáææþÎÒÕ\ZYEMtpKZ_QQR^DVßÓÝÙÑXOA_\PWQPYGNqyf`blmage|IMFÒËýäãâàçäúÿýõÆÖ_BL[]^\O~sqvuLMAEPTÑßßÓÒÚÄÍÌÀÍÆÖ×ÞÆÇÅÇÁÏÁÆÁßÙßV]Y[VÝÄÎÊÙÕÒÞÚÂÉÃÙW_D@EAHIFYÝÈñóý÷Ïõð÷ÎÂÌÄÑ×ÔQ^EOr|xzzzx~{a`fgzrIX_\XWßÃÉÂÇÚÀôöòùÿôÀõñöôÎÂÑSXGKtqx|ptFYPÔÔU\WÐ×ÖÞô÷õõÈÇßßUQ]\WWÜÀÂÌÒÖÄËñýåúøóôôÌÂÐGt}|pI@FNND\ÔVWÐÖWYXGX^ZVÙÍÌÎõÊÃÒQ^@Js{edgz~pLFYWÑÛÈüûûðÌÃØÒßÁÁÄÞÖÔWQSZKvq}}qJF__ÒÍÏÀÎÂÆÙØÆß×ÑÑÕVÓßÝÜÅÆÅÛÛÛÞÜßÜÞÒÕTQ_[ÔÜWÖÚØØÄÇÅÖ_XZFVÖÒÃÇÇÏ÷ÉÂÀ×]D@GMZSYGX]X[\_^FBJq}{x{z~|r}qO[\RßÞÅÉÂÎÍÆÍÀÁÌ÷÷÷ñöóÿþÿòÉÒ]YQ]BCKuuJEFF\[YÔÒÚÀËõËÍÉÈÐ^GBFAMCGFDDGZY]PPÐÅÎ÷ðóöôÉÁØÐÖÑ×ÛÛÐÜ×רÞÝßÙÑÝÖ×ÐÑÝÓÒÕÖÝÕRIqq|xegfe~~xsHwH_T×ÜÃÎËöôÊÈôõÈõöüýüòñöð÷ÙÐVAAGLIwHALuL@F@LMZRÐÛÛÄÆÃÁÞÝÝÐÕÕßÜßÞÚÁÃÃÌÍÂÀÞÓÓTQ[@ZEGDIuDPÖÚ÷òüþúäúýöÅFrzd{xy~sIF_Ö×ÜÃÂÁÍÌÚÖ]IvssvuNAPÔÝØÞ߯ÎÏÉÎÄÆßÕTÕVÕÑ×ÓÙQ_BKLMGA\RSÔÞØ×QQLLA[_ÑÁÈôôôÊÂööõñüøýõÆØÖÓÔ[^\[WVÝÆÀËð÷ÁÚÜPXMuvqtprwCARÕP_EF_QÖØÂõóôôñÉÌÌÅÝÒWYOH@LJABN[WÔÓØÌËÊ÷÷ÛSAv~zegg{|stRߨÂÈÆÆÊÍÚÅØÒTÔWVRTÖÒÇÏÎñÿýóóÿþüò÷ÅÖR@O@FD[]PWY_RZE^AXW×TW×ÕFM_FBXSÐÍóúúååøóýöÌÏÁÐSMqrwuLDY\VTTV]V×\[[@trxze{yrvIA_ÞÛ×Ö×ÔÝØÃËðþýñððÎÝÖVDLMBHJLOZ×ÝÚÂÏÈÍÀÎÀÂÍÄÛÛÓÔTQ^FLES]UØÞÝÓT@JtsprtKEØÅÆÈÈÏÂÉôôóþþùúåääåÿ÷ÁÚÝWDButtqOCFGuwrzdddaffge~s|~qtCÔôþåççåùùóÀÝSAA[^]ÑÝÇÌôñöö÷Ãß×ÜÐT×TVPRRGIussrswtvqtwtKHBYÕÛÇËòòôôöÈÚÃ÷óüåäåáãáæçûòÉÛÐV\YDF^Y^Q_CupvuqtIwJIHKOwprz~puVUUÐQ]P\EXQÑÛÆÈÉÂôÊÚßÚ×V]AA@RßÅôòüýõÃ×Dwyg`aag}qvvuJJB\ÓÍòøøúåÿ÷ÏÙT×ÝÇÂÌõÎôýýþþüËÇßQRP\AORÑÝÅßW[AANBSÝØÀÊðöÏÛ^t~z}v@YGPQRX^VQ××ÖÐÖÞUX]RX]^@OuwvwB_×ÅÎÃÄÅßÐÐP[GLIJMZ\@v}gdee}J[ÑÇÈòñÍÂÈôõõôÉÉÎÀÎñûúúûÿðõ÷ÊõôËÎÃÆÓDNws|rwvuF_TÒÙÒVFLI@\WÑÙÁÅÓßÑÔßÙÃÀÏÊÃÌôòýþåùñÛ_O|gc`{}suBOKI@A@DABIJJq}gbomfzsuXÙÎ÷òúåúäååúÿÿöÈñþúáâáäóÏßVYGF\ÐÕ×ÑRZMsswwqrvBG@\U]_XEVÒÆôñýýõÎõôÊËÂÁÁßRR×ÙÆÂñòöÍÓ]Mp~ruOLZXZ]RR^G@OJCDGYAtqrydz{x~sHO@Q×Þ÷óòÿÿÿþùåæáááúÿô×DMttMX×ÓÝØßßÁÃÚÙÞSAMODGLOuLLNC[X^ÝÇØÄÈôÈÃõÂÒUPEE]ÑÍôñòðóñÉÀÙWÑÂÆÙÙÝÕQ[QT]@wr}yy}r||rqr|~eeyyqXTÐÙÀö÷ôÊô÷ðüäãíàæåü÷Ý^CtwuKCFAFED_ÑÚÅÐWT]]\D@@OHLOMNNC\ÖÄôòåúÿøûó÷ÚÑÝVÑÛØÄØÑÕÕZAZD_VÖØÆÄÏÁÝÚÞXIqs}}vvqHJNLJNDBHFSÔßÚÃÅÅÍÆØØÞÛÎòùùøúøþýÉÞ×]t|vJtILABLZ^FNHHLYX[YDEHtHNLCO[×ÄÊýþüùüòþ÷ÊÊÉÍÍÛÄÂÚÚÛÐÔ_FAuu@YRÞØßÁÃÆÕ@CJwqtvptILMLAHIZE_ÝôóóñóñÊËßRWÖÒÙÃÉÈÈõñõÍÁÝÖ\D^RWS]AOGYXAOuJMD@OFCHtN_^FOKKBRÑÛÀÄÄÆõõÄÜÚÍÅÓÇÈ÷ñÈÄÅÞTDMCLNX×ÅÍÃÍÉÀÕSUTÔ_GCwv}|rss|qtwMQßÓÚôõñý÷ÌÀÏõñðüýòùûÿòòñÍÙÐTÐÐÞV[EKt}yegzypr}r}qvtGQÑTPPÑÇÌÊÏËÍÏôÁÓÖ×ÐÜÞßÞÅÃõÃÇÁßÖ_GCOL@^EZWÐÔCuJOD_AJBMKBEGLwqwqKZWÛÂÁÉýåù÷Êðñðÿûùøÿýþý÷ËÃØÐQÕÜÚÞÕ_SÕ\MJvp}stpp}rpuIC_\^]ÛÍÏööÊ÷õÍÓR_Q]TÕY_ÐÜÐÐÞØÖÕÔQ]WP^]YEVÑÒEN@DCABJNOtJKMwy~|y}OZUÝÒÄõõËÄÁðòðûççççåøòðÉØßÑRVÞÜURQ×V_\ZG[ANF^EE\PXMC@LH@\ÔÙÅÆÊõÍÄßÖWT×ÒÓÕ×ÒÆÂÇßÞØÐV\U×S_X[]P]\Cv}xeedeqtJNLBOuttu[WÖÀÌÌõõÈÈÀÅÈÉÉÈÊñþüýýðñôÌÃÐUÖÖQVSPÜÒÔ]EG@tKE_ÖÆÅØÞÖQZAEOFVÝÅÆÃÃÎÃÄÄÆõÊÍÏÌÂÆÃØT_TÖTÔRFCGA@F^QÖÑÕS[Bp{}rtMHr}|edegd|L[ÔÁÏËõÈÉÉðýòðñòýüüñÊÊö÷õõÂßÓÙÝÑßÇÄÝPFKqr}|K]ÖÚØÝÖÑQZ@OMGWÄØÚÇÚÇØÚÃÊñóðöüùþþóÊÎ÷ôÀÝTL}yr~|sqq|}|spsqEÑÐÖW\MIts}x|uGVÓÜÀÚÖÛÂ÷ðõÏÏÃÎÎÍÌôËõôÀÀßTÒÒÖÅÊôÉß_AqrqK@SÓÜÓ]RP_SAtK[TßÏö÷ÌÇÅÓÑØÇÁÌõõôýüñËÊðòüýõÞTV_YQÕYOtq~e}swD_FOuvrs{efd~}t@SUSQ×ÖÛ÷ôðþüúçççúøþ÷ÌÆÖDS]C[UØÐX_DvwuvCÕÒØÝÙÙÕÑÅÖ^ZADVÑØÃÂôÍÛÆÅßÅÜÓÃôðüòóðÍÀÏÆÆÞVRS^XÕÑVNqq|rqvN@PÔÑ×ÑS@ALKwqs{zyyrOCKOJCX^ÑÚÍóüùåääúýôõÍÙÅ××ÒP×ÓTVDwNLqwZÖÚÄÄÏÎÂÉÚÒ×AIAF\WÕÜÒTÑ×TÑT]TÛõòÿúúÿýöÈÊÊÃÆÅÞÞÛØÖENt}|rrwBLAXALMvssqrx{}tHYUÐÚØÜÛßÚÀÏñùóÿûüòöõËÁÙÑÔRPRFAJOFIKvqqwFVÝ×ÚÂÁÏÉôÊÀÑCF^UßÄÃÜÖßÜ×]WRSØËòüååòöõööñÈTWTP^FLv}||x}vJBFE^\V_BBMNHqx~puJKZSÕÕU×ÞÄÃðóòþûøþðôö÷õÎÒQÖØÐY@X_Z\ZOBHuCASTWÓÞÖÞõôÄTY_]ÐÚU_ÕS_S^YYZ]Ö×ÊÿüýððóññòöÙÒßÞÞY[[OHv}qyrpM@F^ALCOws}{x}ppeqE@XÕÄÁÎ÷ýøüååûûýóüùóÍÌÏÂÚÜÖGXVRTRZAOvpwu[]X]\ÓÍÀÝÔÖÔÑÑÙßTÑÙßÅÍØÝÅÓ×ÛÉõÈÂôõÌööÉÎÍÀÛU^Ytpwxyws|ssJIDWR@^EIDNvq}ps{x|~rHFÕÁÅÀÊËóòþþóÊôõÊòöÎö÷öõÃÀÞVWT^UÓR_^EY^ÑÓ\[SQÖÆÉÆÇÆÎÐSÓT\D[P^P]^[^ÑÛÊöññöüÿòòðñõõÅÑÒVZIvwqs}sssvvHq|xxzy|~rqy~sstOSÜØ÷öôðùåøúúüñ÷ñôÊÊÎÁÁÃØÔPT[LE\S]\GLFGBA_XYÑÆÎñðüýñõÇÜ×ÔWTÑTÔÕS_SÙÚÛÁõÏÇÈÇÆÌÆÃÒÙØTDY\utvvMuKOLXAwwJssstJvButw~xqwDRTÄÙÏóýÿÿòñõÁÁÄØÂÌÍöô÷ñÂÙÞÓQRZ\×SRP_YBJHI@QÐÙÊ÷õ÷õÎÇQX_QQR]]]Y]ÝÂö÷Êñýóýñöö÷õ÷ýöÈØWQZKsrvs}pJuq}y{{ezx{yzyw}yrwL_ÝÜÍôôÿäççûÿðõÀÉÉÁÉÈ÷ðòóôÞÓTZZ\FWÔ[XCuNJptESÙÀÉý÷ñðÌÀÚTWÝÑÖÙWÑÐ_ÑÅÌõÃÄÎÉËÊÌÍöÈôðÉÀÞR\GuvtvqwqtHNur|qqpvwpvtps}|r~y|qI^P\ÝÊðþååðÈÌÀÂËðñýøùùÿòðÁ^DS[E\_REAZBHuwAPÖÁËÎðóÏÂÁÜÓÔ_[[QTGZWÒÛÁôÍÀÇõ÷ÈðððòýüñóöÏÒYEF_Gwp}rpr|{zde~~ye~zzepv|}}vOWSRÄÌüúäçøþýõÊñòòùòðòôñõÐ[tvtwwwtwuwJBK[UÝÏ÷ýûäûøýô÷ÌØÝVQT[[PSÜÍÆÁÆÓÝÚÇÀÚÚÀÛÒÜÜÛßPR\@^T_DFD_VXZAIJJOKvwv~{xzrq|{espvI\×Å÷öñóöÃÏõÏõýüüóóýð÷Ã×YGNIHNGZGFBZ]UÞõ÷ôòþùóððÍÞÛÐGOH}rvuXÒÀÏÁËÊÏõòð÷öñüñËôÂÝÛÝPTÖWÖYMLMBw}rsp~zdefgxy|tsy}stKFTÍüåûøúþöðö÷ðýÿýö÷ËÁØÓ^MCLwrswKNIwu@XÕÆÉððüøýüùýðÌÙ×[tqspLEÜËÎôÎÇÎËÈõÊÁÏÇÝÞÒÑÖY_TRVÓÔS_EQTSVGOGLKJHsxd{~rqxzg`dy}w[ÐÏôñòòóðôôöðýýñ÷ÌÏöÆ×ÜÔW×XGLLAKtMG[ÔÅÍ÷õóòôôÊÏ÷õVGLJt}rwM\ÖÅÀ÷õ÷óöýÿýÿýÎÂÅÜÅÜVÕÓÜÚÝÑÔ]ZOIOHvHHps~|ddexy|zdfddepO\ßÀõ÷öòüýÿùýøûùüöýôÀÂÜTTÖ]AIB^LB[CCYSÓÚÌÈÈôñöôòöÂÅ^_PDF@_VÔ×ÇÏÍ÷ËÈð÷õ÷ÁÞÑDÕÐX]Ö]ÑØWÓVTÓZ[ÓÔ\ÕYE_uJpzxd~zgedfgfazzJw\ßÞ÷ññûäúåùñò÷õ÷ËÌÈÀÅÃÙßÜSÐÕ_ÙÞÒÚÜÖÞÁÀÀÆÁÎÅÄÄÔTEODBNDXYP^SØÃôðÿùúûþòôÎÇÛÓR\VQÕÕ×ÓÖÐW_\ZMLBJKqpp~ezxz{gfdgz{e|spqqwX]ÔõóóúúäåòóñõðöÌÊËÇÆßÕÑ]WTGGÑÐÔØÒÆÊÅÏÌÌ÷ÈôñôÀÚÛØÞPDVVVXuZVQÖÚËýòËÎÄÜÔES×VF]ÛÞÒWÐØØÃßÜÈÆÓT×ÜÖ]AIpyxdgfacladfgdey{ezpHGTÈüåäåùþüôõ÷÷òñõóòÊÏÛÜÆÅÒTØÆÒÓÂöõÊÊÚÎÂÖÕUÖWG[Ô×^EZ@BMOK[ØÞÍùäåøÿö÷ÈÞÚÆÀØÑßÇÇÐQQVWUÐÔWQFA\YYDJxygggacmagd~y|~|ptNYÜØÌðýþþÿðÊÏÎÌÃÎËÚÚÅÙÇQWÐÕÓPÒßÚÂÌñýùþðüËÞÂÇÞÚÞÓÄÍÐÚUHD@Jw@QÓÇÆôÊõôØÒRYÑØÚÇÎÂöÀRßVQÕÕWÅÎÝÅÆUÅÆÐRO}dxzaa`ccaccffdaazvMEÔßÏýüÿþþÌÏ÷õ÷Îöôó÷ßÃÅÞÉÓWÝÌÅÄ÷ÚÌûÿññõÒÕQ^CJZ@\WPÃÕPÖuJIÜ[×÷ÞðûóþÎÂÛVVÖÏÐÇñÎÇÑÖZCXJGTÐV×ÕPÞÐWWtOrrggdoafbf`fdedftqOÕTÙôþóðüÉËö÷ÃÂÃÃÈÅÒÔEÑ^@ÔÓÏÀÌÂØÊðøùúþ÷ü÷ÌÞP]_Ó\WÅßÂUO^S^[ÑÒÙöõóñÏÉÀÑRWØÚÛËôÅÞÛW\E[C^ÅÑQRÏÀRÆßWPZpysfmbb`cmmlbllbfy|t]õñõóõñôÃÍÿþÎ÷ûÿñôõÝ_ÐÑ]ÆóËÄõöÈÊûýÊúüÎÎþTJÖJ}R_FÒÜJWÔRÁGÚýËýûÊððÐÈôVÇñÞÆÎËÍ\\ÑJuÒMMÚÔAZÄÞ_^Û]vÐHgyxnh~figdmffm~J{YÈ_ËûÝÌóÖÚöÌòþØ÷ùÆÍÄÖÖA_ØWÆåÀÝñÉÍöçûÏðáñØåÃtWÓrvÆSwZE~q_[ÆÉ]ÉúÓÈûRÖóSVðÛñû×ÍòYSÞ\_CUòßWþ_LðÚDXÁÚuwMdbdmibabn`gmyfrD]ÖÅðÀTÂÃEÁ÷ÌðøçóñåÆUüQqÂÍÇËóýÜÖûËZåäÔñãÃ[ÍÌvvÜGtÚÀ}sÔD~ÖýÖQçø[óä\EùÏuÎæÁÏåÆMÃÞqJßNCÌÝ^ÓÚS[×WwPÍCvYrleiipyguihNulAöX[åÌqßùItçþ_ûîÏÎàÇLÈõsÕåÃßäÿÛúæÅôãðÉççÍôðGCÆ×}Tôp~QueVÒvUäÝ^ÿÀuYÊIYþÉÖäàÅÍýÖLÇÖwØð]DöÚOÛõN@ÍAvÂÅfwScnt~kdv|m}\`rüÓMòösRäSMãæUçèÖQáÃyÉÿuÖïõ_ãàÔçîÒÎîðÕçäAÞøCsôØ{Þþ{dò]gÍåHWîô|ùüfMåD}àùHåàtVàQdðÁzÂþ~wþLaüßlQöaqóz`ÍJHd]ZbAQkIæ}sàÜfðåzÑîÅYéù{ðãyKáBzàûsùëVÊóRëã[àèDÏî@qäPfóômJðe|åXzäåvÎæ}vüMgôóvÊãW[àôIþö{ÑæLqç×dð÷`Dóz~òBaõÅb}]nmGfef`wjoÞLaÃÊeÐåOuçñFàãBóâ^FæÖdðóqÌæSÍéþWáæSûìÔÍîõDäô{ËüHñqgÊÚgWùMFçÞ~ôÃeYöLRàþYòæÕÞáÛLÿýOÁäMFþ_xPRgvÃJËÐy__bd_bhsdashiv~fPÓXôX[öÊ_úäSÅäÓLñÀ}ÅÿtFçÆHçâQÊíÀÑãúÓåìÀÂáÄKóðpDõt~ÆP{Ñôu_þW|ÁÚYóB[àñXùç\ÚäÔ]åòLÎäOKò]gMXavÁw}ÍÑZÒdzSfk|~`pk}zcAÞzuò\tþùZðáW×ÿÅtÞÞxDþ\wþùHñàSÛíÿPçìÁõîþ\øåDÒçR}ÃË|IÆJsÊÅyßûrsþTzÌúuÑæÄBåårßçTÖâöuüäw[ðvgÜVgFðqpþQ`_ÆdfXddHkxc{XleÈ_eÍÿAÏîÂFäø|Òþ}zòÃqôåDÐìÿJóíÚÍîø_áïUÆìÇ@åú[üt~÷Ö`_û}püTsõ÷[ÿTLþúAÁãTwóÍqòâßÝáÿLÅûsxòQb[ñg{óXmEËebÑsxQMcdDn`öPgÂäw@îðtúàZYúScÛùJáÆxäãMÇéö[íì[öôCâá@õèÖ~øñeXúwcÌ÷`uäÔñÿzOàÑ{þáv@ãØdÎúÖìÇIãíIQâYzÏÅcsÿqaÊËguütlFJmFodkFzi\ÈduúÚvûáFÅïÅróÊavþ\}ùçEÀéõ×ììWÊïößãæÝÈíóÔçþKVóu~ØGfXÏqBåõuÈÿ}uùÕróûZØçØrÇÃvXÿÄ^ååRÂøÕsÓB`wÓryÁ_dUÌ|Óei||djzvbpÁKÎÈtØæÁLýçGÖÿIa×ÜgFùUHäæÐûèößîáÄãðÉãòÆìíÔÀç×sÚPbrW}qòñ@õývtóÐ}ÍüKSæöBöõ}EÿÔAäåVöæÖSÿÜg@ÊssõQ{[Ùy[Îsctaa`isQd}ÆCÚ÷_ÅçÐBøÿ}NôqzÉÆ}ÐàÛÒãáÛúî÷ôéæÄäà×ÐãýUþöpDÌ}lwpbI÷AEæÿtÛþ^AòÚwÇýYÑäÖwÉôtÖøÝQåýCÇûUM÷WeÔÁ{yÝJfYÑe}WzkdfohJHfFöCuü÷KÙþFXúÞ|ÝÉ}JõTsÄõYõâÂÞíäÌíûäþQøçÇÉáÆAþÁzGÖgbPW{Yö_RýÌwôäCwÏQ|ôõyZø^eöòtÃæÁWåñuõúJLüÀr×Åf~Êvm\DogKhglapbÐ|gõÎtÞåÕuóÍKÁÂ}GûßpÁüAÖãñVàà×øêùñìÌçà@ßíÇrüóLÑ÷w~ÑJeUÂvEäô^úà×ÅàÕ}øýwÓçUuçòÚá@XíÌxñö|_óGr÷Ôd\Ra{Íxo^BiyJkud`FobÙPpóûYÇçVuóÖPÐztñMgÆÀOÜçUEåñ_áéýúãVãâ\ÚæßOúÿXÉùKtõMdPÒeQûÔTçùNØòtLòÐqööNÝäÖvóñEÁýXDóÇsßóMPÈAwßCdDEcfBxh~~bsj}irÍBuóÌN÷åXÒçßqÈËuÝÍJ^åÂ[ûúNÜçÃVããÙçéÇÝâÿw×òOYüÙIôÂ}]ÌF~ÒÔMýòÜóæSDûÇ[ùå_ÛâËBþüw]þÔ}ÄÒ{NVr~ÝRdEÒzpÝud]taJDabLxo}{hdEfg÷ÜÒótGûÌNöðsBÈJe_DTÊDÕðÛ@÷üÐóãöðéáôïìÜÊàÍPûÿ^ÚçÔBùÚ|SÍtBöÔIߨvQùÇFåáÕËáÀRçõJôúFN÷_zVÝdvÄ{gÌS{GÙvqÕ|gvqn`wch~zkgGefÇBbQðtZá÷XæíGÐáBzôÌsÆäFVüÙGýó@ÍåÞÄâçÚÿäÞÍáÍKñóJÕúØSóÝ{ÚúuNÿÐ|ÅÉMôçÚÀïáÀääTTûÍuÊñrÅbEtl{FfeßCfÞ÷xCð@eSIbwDaaFeoOPgØrgÝØsÄáÄÑæùXÇÄzJõu|ñô{QûYAäÀyôâÜÃéåõìæÃæãÕÓæõEóûG\ñIrõPa^Üg|ÇMsóåYöóÔàúKõâÑQû×}TØdsÖfmDIcMØeDöIw÷Q`KYafFapqdDcgPzaõÔ{ÂãÈÀèçÖúðqÖåMNùÖÌñvQû[}õÉwÍàÙÃîóËìåN÷æCÖáÁqöõyÙûusòÑeÄðtÖàÃÅêíÈåãSÝàÉKóÍzuÄgcÔ{~vjgÔedÏÝsÂÿrNðJeÚXorRofWzgVC`@ÃrFó_QâùCÿåzEü}z÷ÔbSü|[ûP|ÉÌqôâÝñæüèÊäíÂöíÉ_ûÈd\ý||ôsmÛÞfMøAEàðÄìäZýæAÎíWBæÖgÎÃbrÖnlß|nÝÖfWñ{pñrcÚOiOYbFhk]xjRßc\øuMâü_ïï\óìNqúÐ~ÈÁzQÎ|HõqeÆQÎÿ[÷éÎÁìûTçþÓàæWûúvÒæLwçÐzòðeÙäEÞï÷Îèÿ]û÷pÌýIÐós{ÖqourjevkyÌzzüQ{ðÅÊðz_òdzÛfmUqi]Ól^ÉcMûwZïÊRâÚýVlÓÄ`\ÿdBäwrüZ}åôHâàSáèÚúèWÆé×GìÈtøÅg÷öfÛñaDüeqàApìý\îâAþáyÖâFÒïZ}ùwoÙv]Xk^ÈcDþdrþ~f÷JiÔ[sÔcÞlmËmûRmå÷dæZäOVí}yäZ~û\aùßmôÀoÔÿgÄéHÐÆRëópíü`äàpüìsWê\Oêô|äÚ{äåyäëNÿ_ÍèrqàApâ_añ[[@wN~ÚnzåydäpmåFhôÞk[õjvóbròdzÿ|cüM`úõxáâ}ñäaNðasäz`úHaàÞfûø{öïCùÐýñÇëËpãÀxãÿdüød÷çeÇàduçzdâP{éüqíàröàeÀïpQíKyùtmËHkÙAjAØcJÆ{qÑbaQgf_~l^IoJÚztÎpwñXqðÎZäçÞáätôüePñsBôptötw÷t}ËÅvÊü^õæÚÙúßR÷×Y÷ËÐñÊÝùùÎýüÛÉôÇÃÎÄØøòÊøüÛÍÑu[Åw[ÅuDÃ@Gsfuvxvr|NStuÖItArvMtw@u|X@AÓ\BÐÐL^ÝNPÅÕÛüñÑÉÑ}[CsD_u@ÞÑWÝ\ÜöÌÄôñÃÊý÷÷ðÀÏñÊÍÉÃÏÌÝÑÒÅÃÄÙÀÂÚÏÏ×ÞÅÙÂôõÌðþÄÐÇÅßÍÅSÚÆVÖ×LJGX@At}sseagg{~{|vrsr{}sEXB]ÚÍÙÙõÌ÷òöôóþÈßÛÑEEWCLQS[P_NB[]×Ý×ÒØØÕVVZRÙÎôòüüýöÊýóûðõÎÉðÏòüðóýùÿÿðÂÎÄY]WZ_ECJZPMwOprOMFMtvqyezg|wtKGUÕEOHIIuYÐS^WÞÕÜÔRÞÌÇÓÇÏÖ^BtHFIOGGE\QÔÓÕÛÁ÷ôñÌÏöÅQÐÔ]ÖÎôöùåòòõÞÒÛÛÅÅÒWÙÙPÎÛÛõýýðÿÁËÆWÛØôôÖÃQ×ßCÙWLÔWVR_Cx~flkicazxx^IsL}ysB^Ù]ÒÂÍñØñÿ÷äÍõôÓÂDZVZ]VW_LXZ]EG_ÜÆTWÛDMYw}pJ[ßË÷þþúáõóþòçñùöôùÆôþË÷òøÿñËÝÛÑMA_ÆR×Óx\ÑJrG_NR×IZDqxfgabex|LIYCJtGwuT××ßôËRÁÃÔÓÊÄÝÀÍFACrvrCGI[A@[]Ó^ÐÄýôÁÌÁßQYVNFQ^TÈðôöøôÍõððóüñô÷õØÇÓÚÁÍØôýÇØÇT\ÚõÅÈðÚ]ÚÃRVÅÆÝÇÜ\Lu}fmooli`ade{{ad~xXßÐÎùðÏýÿñýøþþøòÎÛUDCDDB^GEAGFuX^]ÁÓD×[wv@q~wFuÙËÁôÿüøæäáéáãíáäçûñ÷ÁÉñõÀÇÛWRCZQXTÐPEZYsv[AI×ÚÔX×BywsfeeeyrqHsgreytBÕÂõ÷ðóüóÁÍôÎÃÅTQS[Nvsru@|CFYYÑÙÑÎûñÒÃÖ_Ñ]EIvTÈÔQÆÃÍÁÆÕÌþýùøûæüÿóôÙVÃÝÝÆÓÔÝÅÑVÎñÇÞÎÚÊÑ@ÐQÕÊÝÑÎßYHtx``lnbmgf`bb`hm`l}_ÜóûääíâååæøúòÙÆËÁÙXpJtvstpepIJ_PÓÆÑVKFBMHgeBL^QÓÍ÷öÈþåäçâáíèáãíúÍóðÐÚVX__ÔYF_ÖTGZÜGvEqpXRTÛÌÄÛÖ_YZea|ddvr`z|bcgez~MSÚòæäÿøäðôøöGVÝ^M@F~y{qsBÑBNÔÉÆ÷ûöÛõÈÑ\KwtpZBBÞÁÛ߯÷öåäááçàääçûðöÎÃG@WZ]ÓX×ÀÄÔÝÄÔ×TE\_OÒÂÁÈÿÂÖÍt`agbiddcxcb`h`ibr}WÒøáçîìïàäÿËÈõÞßÝSÔLOIx}vzqJHJWÏÛôðÞÂÐqw}|xJsqÙ^ÙôõðõàåùäêþäæEgÇÁb÷cõf_KÑGØC_FxÀaÆeó[ÀøÞäÑÍE|Jde{d}d}}}ezf`~drMWÅÈåüóâÌýötþwÐÍeønÁvz×cÆgÛtÇQýÌáòþáØú}÷`IqdAdDKFØYØÎ÷åòáäæçìáàâøåÊÅ^@TtJ×sÏÒZçröQCúoærØôTæ[ä×÷|Xcth|zmejÓsmiehp`|ßsòüóãáíæáÿüõÈÁÛUE[@OxszNxvYqÞ^Îü\ÍåeÉÒiÿl`õðféjîÕÌCðéîäüèáìåúÔýHPw}HaÙ|õJ_KZ[LXLØGÉØÛßñðÖÖFNC`u@Piö[úpÉëcÿægtëÕÅàzðqÅvRÜÄdÆd×OzÿdæAàÍåóÁçGûyRE`Çj}}lÈeLØwþÃÙìÝæïÖöùÈìç^ãÙ~ïoöËc`Êølc]äxØãjbôÂjìFrñq|ðÍmgÌüaÎÄSçØãÿâøäáÓçZõÁNÎÒÒ]sHOgRpwÄqô×tõXHólÀ]á^DàhUøo@årßìqNêe`áÊüHméáz|öjþfÒÑ_óKñßø\òÔÖÉfÍoHnÁK~hôÑujàù_ffÛÙë|ápÎTMöEýFôtÂsqÙeópôôqç}åÏ{ãlÈqjáÖ~æçuCâpêÑäåûãÂíøèðîþöätäsÆÞBâ{øÄxàhòXlîjã]akétHákúcJ{krhfaa{M{YeöIVýTêÁàãQíXÑægûô~ëgË÷nö`sWfKÈvvóÜÒyÎNdÌyyõoÆVmìÅâ}ðÄAîNÒïAFÔùFSËMDúzÒÅn×oôbæoý÷fÒhãÃ`ÐÏâ~ÇàtÀìiYýo|æá~iàÇmìÇgmøÅaúdqÿzôËfîdÜújïo[óéiLÃâßÚmhâüxbíPLëVÅÏìOææx{Áøèjx÷ëiNàèiWæjóþõdòÈjgÁænÉÆxeêÿßfYÂînfåöxîþwpöúcuóhìjÂÔkáçqtäeâeÀÖwôfþDýôLëJâáTÑèëZTùäDæÕÎSÏ^wÓÚgoÂÀ~bíbôúfì^YïRÎâSÐòmSEÕoØrQÜB{áqÇíu÷ädçÈ{ëw_ìcøÛ`çzuàzÐðyæôaíCâmRçbûønâtjèxæäÊh`\lèïwôÃYþsêì`×e\äázëÅøtbkóçt~øCá|GùjZ]fádãÊÉvÜFmîÉdmÛçï`lïËXikôöiïiÇÔoçbù_uîlåqrãàAZéoìðIè]åîÕïçÒãÍôøßñÓÀKZÒn^bgBÇ`pÉiìYuêHäçMêËÕàB×Qz}deirgPkJLhædÍü}}×ãdúÐqæYEÿÔC÷BtÍsY÷PUýþCþôqüCdðXböX`õtdÊzfËzòKBç@öâßáìûäíäùíä÷îýuêÅeú{aQhlÃoaùfsíxöî`ìýmêSgão|åwDÙknóGÈmâT]^øräåeéR}ïqQùmÒÍÐHküctìjñàníM~âjÞþhùFrãcôôfædRûaçSØàtéüóìTÜÈîIìÓ\ízÙÈmÃbmV@rcðaðôÑâÔîþÓéNæß}ãfMTkUljE~jôcÔýdã×ÎàwçÓÁøpæTÏÊvàvFüeØ×såÔJáÀZûÔ]ô}GÚesÔ}APdWKd]|@qsù_Xá÷ôâñäêßåÔáé^íçuòÉ}CVfgBbdTbyû^qâÿuçñrÿÞdÿÐ`ÂZnps|EQcÀæOüîTóâSTìOCâMvæNvøsyðtcÊCgô[{ùÛrûÇzÄÊaXügßýyÏøfDùdeç~wë}Ö@ÌEÓsÊføíiüÊnÿvnöahðmgýkÂügêòÃXàí{àÝKçdÜ×lXlcfKnyÓcðNJïòý{î^OâvÙùpÎåLÒáHWâqßæ}ÛûO\àPeåqcÊg{Ïx[Û~ÔrbÁ`cø{\äFø÷ÝãÚåæ]èåÛõþáUÿÝÕÉtôs{ðbDBlõf_åxæÁrâqtú|VùJCÈagÜcQivÛpEÿÉBçý|úøLÉñ\×ÝÍZYõt\ñw]GÐD`ñOaàÞ|åÒeÜÑdBÿOKíÅvæÉ`ÏÉoÙàeØîqFV|ÒeÝeêØdîÈaçØaçTfñZ`ÐX`ÓÛpøÎVäÁÂÃGü×Gá\sÂzd~bgc}vaZTgÖö|DÿPDåÀpøÊ~åä{ýètÛêYSë@zíVfìÏiäÚôVÍÃnòúlÃõmYQaPÎqÜöNýÎLæ_ÛíMúæRíñÑîÃ^ãÛ@åCqùrxÆezÃtsôDsÈQsÉÑvóÕÕý~Û]lÛdgÙfAÆdTù}QøÅå|ÇþyÞøHÇú@ÄçWÚú^Òÿp\Õrýppóa]ÑcÒGgÍÉHçþväÉzöÐ~ðÄyÆÀvÉÍpÁÏuòðAùßÑæuüåJäÃDóVDö[ÀuvöwÕó~ØðpSôY]øÝ^þÕ×_crÝfdÉsaÜGe\ÝJ@ÏÑKÃËWÉÉòõ×å÷\ùûÙÍåVPöHw×tcJFoqPaAðDRþÒOÕÛKqËÖ}ÞÊ^qÞô}_þWSþøÜùìõÂçþL÷áeEát}ôÐe_ÓfIØfyÃfÍY{õòLÙøÒ_Ç\HMZDv[ÏZxôØnÏÿ`Dÿ@säòtòýKôåsXçAqøÇuÀÅ}uXpysvyywÕEWãÐGñÿøsIúH{åÞfÊÄm]ùaQísÔëÈÖíÏvúöc÷æ`ÐíeNâyqádxæ~gæpcåFsæDBáQqð×dÇÝgÅVmôÔjÑÐkQÌcÁûüèuÖHqî_xâý}àçeýàmMäfaõhÕNlôÊcûçgüåbÔçfZçgRáfNäf}ö}ZãÜõúÁÊBíLdøJzæRgøÞoÚÂnZÉhuônrãreíËeãçxûÊdøÎfýóaÍÿc]ñiNünGqSé\XþqIôzyäO~ãT{ãÖmåÄo÷ØiWÇaÜõqûäwæîfÆïf@îeváwdýAnQQjDä{ÍëB÷êpVì{eãDeìÐeãCfçÑbåÌbûÜaúÜfçðgøæaÓåf@ÿ{Löarù{aÿxhÈpfæÊqéç~íþdùÈfúù|áäföäaßÿfQõnGöisñypöXvýGzþYeåöeôçyÜúaXõlEøpÞéõÄêÿZàßföØcöÿcEô`N÷b[ðnFøc}æâ[NëAtéBgìðdäógùûcÈújuäi{ãp|íÐ~ãÔbûTjÏü`TåaZãeuîpdîÐbåÂmýùgøàdñìgDèríveâKaàuôÑPò`VâsÄëJBîMgàÊfúülÊþoÃàaÖïHwâØzåÏfçð`ûäoWàd}æydåKgä_nñÅÑål\ì|ßér\î@xãügåçcðç`ØábOâzgávoÿQmüÉlõåoVíaIîrî[Hï]fûÄiÍç`Ðìt×éP_ì]záÏm÷úiwùleÿ`dáp`âÁ`çúdþæ~ýídÛìawìvsàÔrãÛgåÀhËñEålIçdpç~dãVmçón÷älÙãbSìaMèyaí]aíÈfïôlæûôànVïf\èeqécbíejæEiæÍnåÿnøíböêdDïdxíedèAaîÊcãä`çïcüîoÀîiwícgàyfâM`âßhåðÆûjßæiQâiN}sÙrÍaïônàüjýåißånJà`pìefìqhä^oàÃbãÿaáæcÄágOádrìszïtmâÑcáýgåûlÍüMúkdãz~î|{\pô{íúaòømÊæcØíe^NJïGxçMm÷JjÚSRÀh]åbÝëDèv|ïVqíÖ{àÁcòða÷ã|ÖãtuøgøMcåõaýädÆåcEämzøfyáw`çYbçÍgàç{æñcäÓiàOlívwîzÓêaáîcëòmîagéÚæìZb`Pã÷myëÂÀëddkçìnÐa`uëmÁílÕônÞùaÏúfUþgpõrüYqä÷HóúpSæ\~õÝgYówsñTgFÉ~qûòs]äE`ßýfbþÉlEïÕaá@wîguîPjÐëFmýì}cåí}xàçabúþaböÁjmöÀhfçäesïâ~ááp|àït`Çç@eÎíÓfXåRmpüÀa~øút~öåDeÜçP`yôÙfxöþ}gÒþZzÃâôpGÿô|{ßðE}SðÄvQåäÑZüäÒ^ÎQruÎÉNwÒõT@ÅûðÕWÎ÷ÕOPÄEpY_qwÄ÷Ý^Û÷ÀCMÓÙÑ]ÕÇPwJÓÜYIRÄXsIÓÄ^FÍýÚÐÏñÉÑ×ÍÈVDEVQuwZUXwwFYtZ×ÑTE_PXtuX]P@QÙÑÞÂóþñöýðÇÞÚÒÒÖÕÜÐÜÕUßÚÇÄÁÇÅWXÖÕ^uuBts}J[DXPßÓÖÆÁÙßÛÈÈÀÞÛÓ^]ÐT_S×PX\WUÕUT_G×ÜVQÓÚÞQTQP^^Z@CLA^AY^WÒÛÞUTÔRGOBASP\QÔÖÒÃÌÎÍÁÍÇØÛÄÜÕÒÖRUÝÔSTßÃÎÊô÷ÏÈÈÌØTQBttuIMXXSRTÐÔTTSXSTQÔ^YS[X\TÓ×RRÔUÔÛÛÒÓÝÆÇÚÁÀÆÞÅÄÖRWÓS@_\DKJBBvN_FtIGCuuuFAAXY\WÑßÁËòÿþüð÷ÎÃÃÎÝ\ÜÅÝUÝØÆÌÌËÌÂÇÄÙÑÕ_Lvqv|tMXFIYUQSPÞßßÀÏÆÝÞÓVQ]ÕÓÖßÝÓWÖÙÝSY]XDPRT××ÐÔSRÝÑV__]X[PSS^SP\DGGIMYIJERXFDPÑÕÐÇõËËôðÉßÙÜRE_ÕÐÐÛÚÝÅÊðËÌöóóÊöñÌÖ]\BttDDJKAD[SPZ\RT_]Q^C@BZ]WÞÛÛÝÝÞÚÄV×Ý×ÐßÛØÃÃÄÙÐÜPWÕWR^^QÕZNZD@prq|x}pvpN[GMG_@XÝßÃñúåøøüóôÎÜS_VÇÂÇÃõö÷ôÏÊÊÆÚÅßÒÜÕZIwspILtutO\]DÔÍÃØÅÄÀÓÕUS\WÝÛÛÛÙÐÕßÔZXRS^Y\×ÕQÔÕ\SSS\_TWQT×T]UWÐ]BIwqqpvHBL[ZBFZDXSÄôÌôüôÇØÇÒ^GTÒÝÍôöóÿùùòóùð÷öñõÄÙÜ_wqJws}swvv@MFQÕÕÐWQ_FF[YUÐÛÆÙÐÛÆÔRTÝÙßÍÊÁßÃÂÝ×ÐÔXLXZBC^PGOGVEHDu|x{ysCCBZQP[^ÝØÚöååþýòðÌÜØÐ×ÚÌÈÍÊòþôÊòôÅÅÌÂW[U×LuBOJtNtpKAuKXÓÙÁÉ÷ôÞÔÖÑ×TÓÆÀÕWÓ×]ZX[ETÒ×TÔ×P^]TTE\ÕYOATÔRVÖßÑÒÞÖ^ZDs{}wqvFGKu[SGEQ×ÒÇõõÍÁÚ×ÔUÝÎñðöýüøääúðöóýÊÍÀÚÕ[[]XE_CpswLvvvuuHQÑTÕÕFE\UÛÞÓÜÐÖßÃÆZVW]ÝÏÍõÅÑÚPXVRÝÕZ@uON@GHF_W]ZRFuq|}sJuBBA@OPÐÑÓÔÄöõôñþñÑRØÀÙËÿÏÎñùðôñÿöÆÎðÁÑW_DvpNR_M@[YtI[_AEWÔ×ßÉÞWÓÈÅßÍÏÚVÐÄ^O^V@tG×ÑWPÝVCBBWWWÜÜWTØOEÓUÄX]ÍÇTPÖZw}uAtrwYDzv\ADJ]ÅÝÊÌÌZvÖWÞþäöóþåÿðûàüðåäþ÷óÛ^TH_XqOCqs}tqss_Cr{LU@JRWwRôÎPÓôþÎXUWSRÁËÖñÊÀåxJýÃpKöÌÂÆpy^FupOGÓYuÒ_rrYGKz[Û_[qvQWßÕG]ÛÂÙÞôÊÕÑÛðüÓÂþõÉäåûüñðÁÛ÷ô]J×T×uIÝ_O^PÑMOX\[C]ÑV]^UVBÔÚV^ÅÉQ×SÕÔtFÑQCÂQ@[RÛVw\ÅT_ØõÝZ\TUHG[VQÔVPQD\ÜKq×XFMqLCvr_YuÚÅÕSU×ÖQÂÛÊþøääúáíàæææýðóóÍÓÆÏÐEWÓHpNBwqMYOuBNS@uuruvsKLÕÒÒÓÛßÝ×_ÝÖÖÙÌñØÄÆÝÅVQE@XXÔ\[YQDELJIrsu}sOCKtwuFFLEu@FXTSSXSÒ]RWßÔSÚÉôÿþÿùûçãáäåøùõôÈßß×VÑ_TÝS]NXÒÚÀV\^ÓÛ\Z@]GerOMJMQ\vu\PI@]ÝÅÂõÊÖÔÓÄÐX^TÐZ^WÀÐÅÀÉÃXUDOI@_@GBZIvJt}}sJNqvLHZXIuuFNrAÖÝÕ÷æçûçìææáãããÿø÷ôÐÕöÑÔÒÑÚI{YÑ^SÜÐZF×]LLwC|gdqssIYBGôÆY]ÊÚõøãäþöÀôÌÛÐÇÞOHrAÎUQÖÐÃØ~wQustVNrw{spFÕLWDwW\GPAÔtPY|wtuÑûûùáãåùÆúæÿñÛôÉ×S_QVFLÌÐBGvÂQEÅÍÒÆÙÚDw_DMG]@Bvr@M|tw^}pY_÷ùÂþÒÍôÜVsÒuvñÐûØùÅJðËýÏôËÀZôÚ]XL×OuvexCfJFv]vRO}XqJxdrtWÃËòæçøçæýþûåýó÷øýý\MP[ÙLwyFvR[DVEÕAAXpzBCsUwEX@LMVV[YRXÁþçäüàøôðÝÓõÒØÉÅÏÂßQÖTSßYÓQBFsGBqHtLuwNtuKER[BÖCMW__^LHNB]ÀööþüççùþåúäÿüöúçÇÓ_VßÇÒß_RÕ_ÓÐÙÐÛÒTXEXp~~~y|IpsLJFHHKvpDØÇÈôññÇÄõÄÀÐÑôôÀÅÞÉÈÑTÄñPÑWRTL^HAr{y|y|e|tv}uEMtpFOttKqJCÔÆÄÊÿüóåçãääàûøääðóÁÃËÀÜÅÅ\STPÕ^JÔ@\F^T]tIqpDAEE^@RQ×YJXÓÑÒÙõÿðÈÈÇTßÑÔS]ÖÅÙÖ]ÔÞQWQSuN[]OsOJqvJtuKqsKK_Ô^RYEZX_BtvvMPÐÇõÈüø÷òäàúåäåüñöñÅÝÛÁÌÑÖÙQ[[_PÕÑSÔØÔVR_HuIMNNZCIFFHuqMOJATÕÜÚÆÄÆÌÁÒÒÄÛÒÜÍÌÁÇôõÀÅÆÓSXG@uwtw}pwp|dd|{ywOtwvuNrpvvtHWÒÄöåäçáìééìììãàááÿò÷öÎÀÙÔWSENHH@AMGRDGFOtuNEZL[ZYAAZSEYÐÕÔPØÁÄßÌôÌUÑÐDM^ÑRYWØÛÓ×ÚÞXILu|srsqtvMIMwtAGX]PRYDFMNtJtJBAXÒÇÆñúäûäáçøüûûýôüüöÄôôßVÐØWZ\×RZPÜÒVW×S\XS_ROwA@NK@EGB[YYYRQÖßÛÌÌÄÝUQÕRVÓÙÒÜÌõÌÅÚÅ×OILu|{}p|~wt}xpHwpKIwspqvvptHAM\ÛôüùáííìîâáæàåäåøøÎóÚÖÞMXPH_KqRD@u[WBHGSWXRWPZLY_CBQÕPRUÒÚßÙÏÅÛÇØÐ\GXGAG[VÔRÓØßßÖÕ_@NCCJvvuIOIXYZGNXXIOCOr|ps|e}qstDÞðýåæáæçãáäúääúúçåÿõÉ÷ÁÔÐ×W_XPÑÖYV×PDLYSE@ALNuvMFuI[^\YPßÙÐÚÍÀÇÑ×Ô\]VÔÖÕÑÞÙÔÝÃÝÖTURLIDEurrOwqC]XKJNCt}pqr~sqs||J[XÝòûûúæàææáàæûååäøÿüôÁÒÑÐÕPTÔ]YSSZMOD@JC__CJE]AORSEAI]VVÖÅÆÆÙÝÅÞQ_X[[ZPÑ×ÖÓÒÝÒÓÒÕQQSR]__XBtu@[QWÕ×[L@EBvrs}x{~ydd|uDQÃöóÿûäççäççûùäçæúþøòõôÉÂÁØÙØÐÖTYZ@tKCHMJqttLFMBEZ@BKCWPÓÅÚÃÛßÄßÖÕ×ÐÔÕ×ÅÇߨÜÐÖWT\@^VREMNwr}tuNG_YDLwJuqq{{yz~uM_ÞÚÏöðòååæààãåÿúàæåûåÿÎôôÂÆØÀÅÒ×_GAOLtuMOLJLGX[RSXFDABBGYÕßÓÑÒÖÔQPS]\DD^Q×ÞÁÇßRWÓPX[PÞÓÔUVYNLD]ZET\XF@EuwsyxzdewM_ÕØÚÉ÷þåäççäøåçááàæáæäøýñðóñóñÁ×P^LuuKtr|ssqswu@HwZYAuAVÔQUÐÐÓÑßÎØÅßÑÖTÛÅÄÃÂÄÖPÑ\ECDSÕ_COHp}wHpuOGJwuBt}|}s~}wMODQßßÜÄ÷òóùååúøþäççäçäåüýýËÉõðöÏÂÚÔ\XFJvvJMJIA]Z@GWRMESW]S×ÞPPVÐTR^WÔZE_UWTÜÏÏÏÄÀÓ[GE\RWTÔW^EYDDBKNMC_^Juvv|xy}e{tMHO_ÑRÑÅöóõ÷ýüóýúçáááâààæäøö÷üòËËÆßWDLJspsvqpvKJvBICJL^\G__^Y\PTÖ\]WÝÑT×ÙÝרÌÈõÏÙÞ\FCRDMGGEO@@MttJMNDR\KqvvqsquIvK^W_VÖÝÓÐØÊôÌËðüñðøåûúäææúûùóÉÊ÷ÊÁÁÌÅUZGGLtOAAtIAELNZV\HDÜÜE^TÔXE_WMuOZXIGWÖÖÓÆôõÏØÙ[HGP^@GSÕZZ_PBt@QDF_RKrvtIr~qvqvLSZEXÓßVQÙÊÜÐÌñööòúççæãíæþøúòôôðöÊÏÍÃTX^YFBLZNvsKAJJ[SLBÕÝYAEÔÔX_T]@@RÕ_ZPÒÑÕÞóýÍÝÞUAOMCKwt]_@CYZMA]ßRBIBtspHpdevuJICVVSÓÎÚÞÙÀÎÍÏðòõôðåäåäáøüÿÿÿñõðòÉÆÃÍÝRYT]_E@@JstFCHuAYQSÕÑVYWÖRD_PGX_\PSYSW×ÚÏÈÀßTÔSFtOFCOXV[YYSW]SÝÐ]L@BItp|xyyqwvq@]TÔßÇÅÓÑÄÃÁÅÈÌÏõùååúúúùÿüó÷÷ñÿñôËÈÚÐVÕÓÔ^G\DC@DCHtMAZDFEY\Y\RUSGZSRP^XZZVרÚÀÙÄÅÚT_YDCNFSTRSQUÖÜÑÕ\YFDFOtsp}r}wvsvKB^ÐÃÆÙÉËÎÍÉÏÇÓÇõ÷ðøåûûþåûùýñ÷öÎÃ÷ÈÜVUÖQGRÑPLZY[OJ@CMOFZTZEX^[Y]X\\\QXADF_D]ÐÞÑÝÚØTEQTEuFR[GGEÔÔVTÑÜ\^×VJwuKyz|JwpCG\_WÄÉÅÙÍ÷ÀÜØÁÜVÒÏñöýúäòüúäøðóüñÎÊ÷ôÞÖÜÐYQÑÛÝQQÒÓCI@ZwrCÕRB@QYNFÕÖEMCCupwADCGÓÄßÞÀÎU\VÐRGVÑQC]ÑÐ]]Õ×RSPÜYq|rrze|t}pCAZ\ÛËÄÚôöÈÜÐÛRXÓðòüúáãæäææùóõòóÉÁ÷ÂSE_TDGQÑ^GXRFOMDHuL\ÕXGGÕW_\ÞÝQ^XXKuNYXYPÙÃÌÚÁÄÑRZVSXQÔZG\WSSXPÑVQVÕFsyr|z|JGOwCS^QÝÛÓÛßÄÆÔPY[[SØ÷ôòäææääçäýÊôñõôÍÏÛT]WTV×ÁÇÕQQQEDBOuOZSZNME\YG[ÕROwItrqOEB^ÐÆÇÞÙØÖ\^WÕÙÅÅÄÔÑÒÔ^GQÓÕS]_Osx~{epNLNBSTDYÓÐÖßÇÞÑÕÓÕVßÁËùååãâàæäçùôóü÷ÇÁÆØTZ\\Y]S×Ð^ZQ\@BAFAA[XNHB@DD[ÑÖSXY[OvO^Y[ÝÂÝÕÑÜVXD_QÖÜÄÇÙÖÕT^ABSVXA^EJvppsvtDPS]TÑTC]ÓÐ×SÐßW]Ñ×VÐÂ÷óþúááäûúùñõòýÈÂÀÇÒUÞÄØÜÒÅÅßÔWW[M@[XBIXI}sKOwNBGZZXY@JqtZ_ÔÜØÙÕQ×ÔRVÙÅÅÉ÷öÃÓÐÐSZ_×YHAAJsrs||stB[PVWV^ZZRP\ÔÞ×^ÔÚØÙÌ÷ÿùúçççøüóüðñööÈÙ×ÓÑQÕÝÑÕ×ÓßÖVT]FLFW]@O@LwGED@C×ÞßÝÑP_CKBFF\TT^LBANNE]ÑÜÙÆÇÅßVPSY[\SCtuBMNBOMDSTPWÜÑVRY[V×TPYRGXÖÝÒÞÉòøûúåùòö÷óÿþò÷ÏÇÆÚÇÇÚÄÁÎÃÒØßVX\ZJuO[Ksqq|spvJODQWÕWGALHN[P×ÖÒÝWPÒÓÖÞØÍôÏÌËÀÞVPQY[MJtvrvwwvtOHGGGQRXSPWÕÛÙU]R×ÖÓØÈ÷ôðøåúÿòöËõÏöóöÊõÂÅÞßÓÞÛÙÅÄÚÞÛÝQ@GGFLHO@tw@MBYVSQ^RR^RIJwJICEXDFA@M@PÔ×ÜÍõ÷ÌÀØßÔWÕWFINNBuNC^[[Z__]SR_G]×ÐZ]PXMNGX]ÔÚÌÊ÷ÿøøñôõôÊô÷öñöýóñô÷ööÎÎË÷ÈÆÐÐÕDMNBv|pt|~vCGGAGBN@OHqJBMM@XS__RÔÝT߯ÂÛÁËñôÆÙÙÔFA@Buuuq|pqJKtHAZE[DSVVÕÚÓW\ÔÑZ\ÚËÊÈõöÊðýüôËôÈÚÚÀÏÂÇÏÃÉÁÄÏÏÛÞÌòðÇÜÒÚWZGFNHMDLE]ÔÐÔÑUXMJqqsvuutqpO[utEÐÔWTÂÏÁË÷ÉÆÅÅÞ]_\SYVX]XLZRZLC_PCLRÑ]ZXÕ\LK@HqFPßÝÓÇÎÇÊõö÷÷öñôÃÍÏôÈÏôþýñðòðõ÷üðÂÇÞÙ_COKtqpptKIARY[MGt|ysrsvuupNE][TÁôõÈÊñ÷ÎÉËôÆÙÝÖ^MNX\ZI@[BuwuwuMFLFYSSSUTYAAFZDWßÂÍÍÁôðÈÏöòýðñðÍÚÞÛÖÝÙÁÁÛÄÀÍÎõõ÷ÈÀÀÂÜVCBG@MD_SPSÑÓTYEwqspp|}r~xvJuH^ÓÚÅÍÃÌÉÍÀÌÊÎÃÙÜ×RYUQPW××QV_GMXXGZ\R\X\]GuvtvvtD]RQÝÅÌÍÉ÷ðòüþûùõÌÏÈÛÆõôÉË÷÷õöýðöôöÎÛVGHutJtHMM]PXOFAJ}}qsyysv~~w@BL×Í÷õ÷óÿðÏô÷ÊÆØßß_D[^ELEUQ[XAtwMADHXÕÔ\VÔQOvNCGLYÑÄßÓËðÌÏ÷ýýöðÿñÛÚÚÞPVØÂÇßÄÎÉÍÏòø÷öòñÅ^AXBvI\PWÓÜÛP]]Dtqpv|e{xed{|twO×ÎÇßÄññØÆññÂÁÃÏÜSÔÐÔÑÝÄÁÜUQ]DEOX[CYPXNNLu|ystptCTTRÐÌÎÉöÿûûþüùóËÀËÉÂÁÊñËÈõóöôýúþñÊÎÑEuwJpptZX_X\DOJHup|rtr~~ryyrM^PÖÉ÷ôËôð÷õÊöôÍÞÐÐWX]UWTQQR[IBvvqwHDE]SFGwutKqMLA_TÜÜÝÛõöòýþùÿöñôÏÀÄÁÅÞÝÅÂÃÅÃÈ÷õñòþüñÏÞWFGN@E]UÔÜÑ][GCLvqssxdfaggzrtIC^×ÐÖÓÄØÂÃÎ÷õôÍÛÙÆÆÄÀÏÂÀÝÄßR\AHtuK[_ZKtttrvKtuKADZCRÔÑÆÈðøåúÿÿýñöõ÷ËÊÊÏô÷È÷òòýóóüýõÅQ_EHwtLMIKACJKLKJtqwNqzzexy}uG\ÖÙÅÇÀÍÂÀÅÇÀËÊÍØÚÑÔÛÅÛÛÛØU_YGBtqspuIZEBBA\RG[V\DXPR_PÝÞÞÛËóýñõóöÍÀÀÇØÝÅÄÚÅÏÏÎõ÷ýüýÿðôÎÜÜßPD]ÕSZEPQ^S_ZFJwq~faafddJM@_UÕUÔÓßÐÛÈôöõôðôÃÈôÊÊÉÍÄÓÐÜÔDtvprrvvppwOJvLXKquCXAFUÁÍõüûøÿýÿòððòüöÎËðôöòð÷ÉôñõÇÞÅÝSGE[OsqJuwJZYNL]R\ZMurxzx}qwGVUTÙÀÛÑÔÒÜÙØÁÀÆÀÎÎÍÅÚÇßÔÕÒÐTWVYHtNJvqtCFGA^S\AG\GIMRRYVÚÀÃÂËôõÏÆÁÈôÃÌÎÂÁÉ÷öö÷óòüòð÷ñôÈÀÚÓÑÑ\XZ\P^^SYGAFNKpx{fa`dx|qBG[Z_]\UÙÅÀõñüûþòóòðÉõËÏÆÀÎÆÝWAuvsrqvsrqJuHuuvvwuMGRÕßÎô÷ðóòôöôðüòñ÷òÿüÿüóñõôÉÊÉÅÆÃÀÝTTPGDGDEDEA@G[@C@Iqvq||}qvuBFDPSPSÕUÕÓ×ÐÝÃôöõôÉÁÆÃÇØØÝÖÓÓÕW\DLNNuINNHuKB@MuOLJKL\QUÖÂÈÌÆÎôÎÁÍËö÷õöýüñòòñôÊññõõ÷öÊÌÉÚÐÖÒWSTPS]EONts|~~{eee{zxrvwqNBZEAVÙÒØÌôÎÉòòüòüðòðÈËóôÃÛÅÓZF\XvvvJ}|r}xx~xysJst_ÅÇÛÈò÷ôðòýðòÿûýýþúåùñðýÈÉËËÚÇÏÏÜÐÐÑ×P^\U^[FZHwtBwy~s}ex|pswwuLAC\W_GÔÍÞÐÞËÃÚËòôÎ÷ðõÉÈÍÍÇØPWÓU^TWDBEMqrpq}rsrrptJtL_ÑÔTÛñõÏôðööðòñöòòùúþöùùòöòüôÆÈÊÝÖÁÇÔWPÔYXAtvIv|red{dde|}sJtwMZ]EPÅÌÃÀÀ÷óðÊòÿññðüöôôÉÜÒQ_^\[OB@Bttp~yv}x~r~e~vvJYPÕÑÆÏöòüðÿúùóýþñðÿúýòùøýòóö÷ôÏÞØÙÔQÕSX[\@JJIIIX@Jqvryyx|p}sNAHIEXDVÙÄÓÒÚÇÏ÷ôõðóðõüþôÁÌÄSV×PYZE@M[@KtKqsvtqrr~zytwuYÖRTÄÊ÷ÊñýþýóóþüôÊüþüÿååòðýðÏÎÀÜ×ÖYGY^MOFOtO\BH@Fwrvq{{ss~pOuHMLJDUÕÐÌôÂÇ÷ôÎ÷ýþýóððöôÀÒßÓ^ES[CNOJJLFIIMwpuHp|~x}wHGÑÙ×Ûô÷õñÿüöýøÿüùó÷òùþÿúúòôðôÃÁÄÕSQ^CM[BwH^ACRPDDMv~eex{d|qqswwJAPÓÝÁÎËôóðñþûüýùúòðñÁÕÓÙPP×]AMBLK@Cpptrypw{aerxewON_ÐÜÇöô÷ñüüòøäøüøûøúäçäååý÷÷ÉÙÛ×Y_^NwBFKvBZLL[ELuvs}s{~}yytAvqA[FPÌÊÍËñôõððññóñöóýôÂÅÑYVÖQE^^COE\GMHtvur}qq{z|s}sNE_ÔÙÇÈ÷öñÿüóòøúòòøò÷üåûþûüÊÀÌÇÐÞÖ\__G@^TDI_WGM_Zwptpyzgex{~KBwJYW\ÒÏÎÂÉöôõ÷÷öòýóòþöÇÁÇW_ÖÜ][ÔÕXZ\ANHv}sqyz|sdgy~e~KFBWÃÃÊüûþúäúûäçøüúûýûçäÿòöÁÑÐSFEYAEWW[Z^CKD\BNGBvvtp{{{|vqvERD_ÚËÇÆËöÎõ÷ÉÃÂÆÀöó÷ËôÏÝU×_FYWR]ÔÖXMCOwtHvvuv}rqy{rvppC^PÜÌôñÿúùûääþûûñÎ÷ñôðþý÷ËÀÖSSDF\T×ÒÄß]^QVXW×DHCIs~efdze~wpqGTPÕÁÈÇÅôöÎÏÍÙÑÛÂÃõòöÈ÷ÊÐUÛÜPÔØßÔÖPOuvpsvtr|przz~ye}vst_Õ×Âðýþåäçàãçåäøô÷þüô÷üöÂØÖ@OALN\U]PÑPBB_FKD^NwOu}|r|y|qpKYYX×ÇÂÂñóõõðÊÜÒÖ]\ÔÒßÃÈÀÆÇ×[PÖP^ÔÙÐPQQZAFKuBButHwqIqrHBIDUÐÒÆô÷öúçåäåÿöôÈÚÚÈËÃôüÎÑÒÐ_ZQ×ÔÓÙÞÄÃÜU×ÝPAERMrrszdxx{|pptDGCQÙßÇñóôõôÅTÑÙÕQÙÍÏÊöÉØÇÚWUÇÒ\ÕØP@]YwpHt|vKrsp}tq}HYLNÕÇÙÂüúäàíæçàäüýýôÉôöÍÄÅUAM@IJE]A@ÕßÑÒÖ]VÓÕX\ÕFtHOvvNOuJ@FDRTRÔÏÊÉô÷ÃßÛÜZDQYGTÛÒÐÄÞVP××]ÕÑVUÜÐRPUXIESLuDZINCJuOOqvLKuZÕ×ÛöùøåæäååúñÏõËÌÌÎÛÐÑP@@_EAX×ÔÐÌÎÄÄÀÛÓÝÑX@ZFtww|yrr~}tLwJYPÕÄÍÁÍÎÍÅÇÚÐPÖßÓÛÌÍÀÇÇÆÞØØTQ×ÑUÕV[DFDLuNJtJIuJutwwutwHBFQÛÈñþåæáààäåûóöôõÏÄÅÖ]GAIvJutAW×ÖÑÞØÓßßÕQPRX__@NNOqqBG@F[]TÑØÅÇÆÆÄÅÙÐS_\]_VÓÝÒÐTTÑ×QYSQÕ×UÑÖÕQVÕPPSPWR[[ECNJqpvvquAEPØÌ÷üåäåúûþñ÷ôõËÂÆÛÒÖSEXZC@QÓÜÄÁÂÏÏÌÄÝÑÔS[\^@twws}}ppvvJXR\WÝÚÅÙÜÝÓ×ÔÖÔÜØÄÏÏÎÂÏÃÅÞÐÑW×ÝWQÕV_^EGC@DBNFLwwtqppps|u[]×ÌÊ÷üäæææáäøþðôñôÆÞÜÔXGFJswNMZSUVÖÒÜÙØÛVRT\^WPAMECHIEG@]VUÒØßÐÛÅÖSÖÑGF[[G\Ò×ÖÜÓÔ×ÖVSÕTVÕßÞ×ÙÚÑWÑßQ]ÕUP_ZNKus|||~vD\RׯÍÈñþÿýüÿöô÷ÊÈõÏÚÚÇÒWPQ^A\×ÖÜÚÆÁØÙÅÚÞÔYZRFHLJq|}qpqN@G^VÓØÜØÚÐÕU×Ð×PQÕTTÝÃÈÅÄÃÄÝÓÒÑWPSWWUU]R^@AFABLCHtJItpqpqIZÕÛÎÊõòøùùääþüòóÊÌËÀßÐÐW[[AIHJLAVVS×ÒÜ×ÒØÐS^RPRY[ZOKOMEYRÔߨÚÂÃÁÆÚÜÖÔP^XANuOFE\WUVSÑÐÕTÕWPÕÙÚÙÄÃÅÑÕU××WVRYGHHNtpsvKIGTÒÓØÁÉôöðñôõôÊÃÙÞØÜÔÐÒÓ×Ö×]\VÕÜÄÂÆÄÉÌÅØÝÔRSRFBBuspwtNGEZS×ÔÖØÙÕT×ÕSPUPYYAGP×ÔÕÞÅÞÚÌÅÔÜÝ_VÙØÖÑÞÑSRPXX\CJHKqsJKqvDEZÒÛÒÆ÷ñ÷óþòðýòõ÷ñÇÜÚÞV^UUED\BKZEM^ÝÑQÝÇÖWÒÓ^VÐPZ[[LMQUSÖÅÅÆÈÃÞÀÎÛWQWALZAtIMHuMFF]ÑÐTÔÝQ]VS]ÒÏÃÛÂËÁÅÅßUÐÞS@GFBLA@KN^\\PUÖØÀÄØÅÂÍÅÀÀØÀÆÝÔÖÐÐÒÝØÖWTUQRTÜÀÍÍÈËõÏßÜ×_YYBwwKNM@[Z\ÕTTÕUÐÔÕW]_UÑQQPSQÔÔQÕØÃÇÅÂÛÝÔ]ZGSÕÕÐÒÞÝØÄTX[EMtwvwNBLB^QÔÒÙÜÙÍõËÍÉôô÷õÈËÉÏÙÐÓTWÑÓV^S\GCIuC\\_×ÅÃÆÀÀÙÝßÓUVS[X×ÙÕÔÄÀÙÐÜÞÞØU^^YAOGEBNCDCNCZYQÕPWÐÑ^Z\\VÙÆÁÍõËÉöõÄÚÙQCCZCBD[OMXDZQV]WÙÝQÔÚÓUÐÝÒÅÃÜÐÚÄßÚÉÎÓÖÝURY]WÓÛÞÄÏôÏÆÎÚÕWQXCABNC_X@PWDF\WW×U\^VW[_ÖS]ÔÐV]ÜÚÞØÅÜ×ÞÑGA\YFQÙÙßÅÇÒÝÞT\^@qsNMJH_^[WV]×ÇØÓÆÌÄÅÊÈÆÀÃÅÛÆßÖÓÚÒVÝØWX[MqwNINQÐWÞÈÎÆÊ÷ÆßÙÐRTÓÔQÒÚÓÑÅÙPTÜÕ]QQGMEOuBFttBOKEVQTÖÖTVT_\×ÜÖÝÌÎÉõñÊÃõÏÓ×ÐZHDDHHE[NO@MCPW^]ÕU\RÞÝÔÛÁßÓÁÃÆÍÃØÛÀÇÖWP[ERQTÞÚÛØÇÏÀÀÍÚÕSWYD\[@GQ_MYQY[WW_WÔSXQS[^ÔQF_ÔTVÝÛÝÞÅÝSPVX[QUWÓÙÜÜÅÛÑÖÓWFG^DOMFAEXGZ_^]UÜÜÑÝÄÅÄÍÌÃÀÄÞÐßÙÓÑÒ×ÔÒÓP^YGMB_Y[TÐÑÐÄÌÆÅÚØÖÓØÓ×ÐÔÕÖÜÓÕ×ÝU^VV^DZ[Y_Y[@MMuIGA@[VÕÔÕÖ×ÔÜÒÓØÙÒÝÆÃÃÏÉÃÙÄÙVQQGHBZLHCDBLY^Z]_DYÒÙÞÀÊØQÜÆÓÖÚÙ×ÒÞÜßÅßRWÙÜÑÜÜUWÝßÒÅÍÜSÓÙQP×Q[EZZ_TRAQÜURÔÕXZRTPUÐ_@\RF[URZVÙÓÔÞØWÒÌßUÝÜQ\ÐßVUØÔ[ÔÓ]E^AKLYAHX_O[×V_UÐÖÞÈõÉ÷öÅÔÆÁÖT×Q[QÓUWÓÕGSØTZWÐ_]ßÙÕÜÂÖSÚÅWUÅÜRÕÛßUÙÅ×ÒÇÔYWÕE[Ð×GEUEt@FJLD@GTÝÕWÛÇÝÛÌßWÝÓ\SÞÞPÒÌÒÑÏÃP]\CBEZKu\]NDWDB^ÕTÐË÷ÀÃõÇÝÁØ^YTP^ÔÝUTÇÂÜØÆÙÑÑ×]QÞÜWÕÒTÕÝÖ]]ÖQ^ÖÝWׯÆÑÒÞ×PQV[WÙQFZSEB^RABQS[VÖPÔÂÌÞÜÇÞPPPFY×ÔRTÄÇØÚÛÕX^DNB@LD\YMGQR]ÑÚÀÊóöÍÎõÃÛßÕ[E_GA^PRQÙÚÔÜÃÜRP×PPÑÖSÔÄÜTÒÓÖßÜÝÐÙÎÁßÄÛ×ÔÖÕ\]PSVQ]FZ_OLEGDEECF]U×ÑÙÙÐÜÜÖWWTVÕßßÜÏÈÆØÄÄÔQ\MHNMLM@LLCG^\ÒÁÃÏÍÉÍÀÂÇÝ×ÔRXZFEVÕÕßÞØÇÜÑTRÔÖÔÕPÖÝÐÐÜÐÑßÑÝÝÕÐÛßÖÔÑÖW]SRS×ÖUTVWW\_]X_Q[ZXEZ\ÕÑÕÓÙÑWÕW]VUWQÕÜØÞÅØÙÙÝÕYZECBDZ@@EEG[RÔÇÎÌÀÎÉÃÃÁÚÜÑÔ^ADDGXRPPUÖÔPVTPÐÙÑÑØÚßÙÇÀÚÛÄÑÕÝßÒÒÝÔWTÔV[VÕQU×VY_][ZRSYXRDC[GD_RTWÔÝÖÑÅÞÑÓÜÐÔÜÛØØÀÙÖÒÑXEX[FDYFO@@OCRWWßÅßÓÅÀÅÅÌÄÓÜÓP^SSY_R]\VU\VÐÝ×ÑÙÝÐÙÅÞÛÚÓÖÐÒÔÔßÝÖÓÑPSP][SÑÖÕÐÓSPTP]\P][RSDCDA@XSSPTÑÔÐÄÛÓßÜ×ÐÝÝÝÐUR^SPY^P]SÕQ_[E[C[TÕÖÜßÐÝØÅÇÇÅÜÐÜÕ[Y_ED[XYY]PSSÔÖÖÜØÙÚÃÀÁÇÚÝÓßÝ×ÜÚÓÖÓÖVPWTWWÔP\S^_RVQ]VQR\]Y@BMHB]QPÑßÞÅÆÃÁÁÄÙÙÚÄÜÐ×]YXSRZ^^EZ^^EZXD[\RSÕÔVWÔÒÙÆÂÁÇÛßÖÔTS^ZY]QWWTÕÖÐÝÛÅÞØÛÒÐÜÚßÜÙÒÐÒÒÐÐÖTWP\_QUWR]QWU×ÖÕÕÑÝÖÑU^DCLOF^\QWVUÜÇÇÇÃÄØØßÓÔU]EFZEX^__\T×ÕUT\[QWRVÓÐTÑÜÒÞÃÃØÙÜÑW]_FFE[ZESQSQTUÖØØÜÇÄßÛÁÆÚÛÅÛßßßÓÛÁÒÔUT\X^[@CXE[ÕUWÐÛÜT×ÐPFAMuFSSÔÒÞÝÄÉÎÅÂËÄØÆÙÐÖT^B@FLOX[ARU]Y^^GE\GBV×\QÐÒÞÁÍÍÇÇØÝßÜVQÐÕ\\VTWÔÓQ]×W^ÕÒWTÓÓUÔØÓTßÅÝÜÁßWVTV]VU^XWP\UÝÜÙÃÂÛÞÙ×Y[ZLIAE_Õ×ÔÜÁÀÞÛÃÄÒÙÙÖÕQEMNLIO_ÔRQÝÔSÔÖR]TQZ\ÒÕ]ÓÝ×ÝÁÇÄÄÛÓTÔT^\T_D\V^YQÕSVß×TßÒTÑÜ×ÖÛÇØÙÀÀÚÁÇÐÕÖT[ZQ]AYQDDWÕVÝÁÛ߯ÛQ^QEM\WSUÙÜÖÞÀÇÙÂÉÞÜÄÑ^RSGIBAO@\EGVU^]ÐQ[_QXZQT_QÜÐÒÎôÎÃÍÁÜÐÐPRÐ×X^TYCZRX^ÑÜWÔ×ZFVVSÕßØÝØÆÚÞÆÇ×ÑÙ×VTTYESQD^ÑÔÐÂÏÇÃÇÜÕR\Z[TÕ\_VSQרÛÅÏÂÓ×ÓXF]\DE\]XXZFZWQYRÑ×_]W\XRQSWßÅÀ÷ôÆÄÇÙÕSPP]Q\ACBLBDRQרÄÔXR\\V×ÑÞÇÇÙÙÄÆÄÆÁÝÖÝÙÑR_YE[^EE×ÞÓÒÛÚÞÜÝW\]QPRPXEPÓÐÒÍõÎÂÃÜPUÔ]_SRE[[OtLEB@\S^VUYF]Q[\×ÖTÇ÷ÉÃËÈÄÅÛÔRUÓ]ZR[LEVXXÔÝVR×\LXTYXÓÙÑÔÝÕWÄÉÅÚÈÃÓØØP[VÕ[EÕT_ÞÆÑÔÛÂßÝÚÕXTÑ[DS]FSÐÑÞÏõÒÕÚÝQÑÒ]XUÕE@AJwAXMEÔÕ_^\EFSUXRÞÓÑÄÏÚÛËÌÒÒÞÕ_ÕUZ[UWGYQ__UTZ[ÔQZ\VYYÓÒQWÓÖ×ÇÊÏÍõÎÝÓÒVSTT]PÜÓPTÔVׯÅÒÓÜTZ\PX_ÖQEPÐÒÜÄÇÑ×ÇÛÕÐÓVVW]AF_GJL^Z^ÕPED]S_RÖUWÞÓTÖßÚÇÅÙÐ×ÒÑ]RWSRUQPVVPYXRSP×PZ]UTWTTVUÝßÓÄÉÃÚÅÙ×UÑÑQVÐÐU×Õ^^UÓÔÐÚÞÖÐÑSPÐÐPQÖÖÑÓÜÒÝÅÚÓÐÒ×PUUDCEGFEGLC]YMFXZF^SR×ÙÓ×ÖÑÕÖÃÀÜÇÏÛÖÞÚÑÒÛÖ^WØTZ][MGS]AZ]DZPP[RÐTVÝÇÅÄÎÏÜØÂÄÞÙÇÚÅÃÜÔÒÒWQ×ÔPÕ×\EYRX]V_YWÒÕVÓÞÒÞÅÓWÒÛÖWÐT\QÔSYTÔ^ZXZ@D\EC_×Q]W^A[WVSÐÞÜÓÞÖVÝØÖVÑÝÑÜØÐVUÖTQVP^]U][WÕQUÖ×ÐÚÅÑ×ÜÝWÐÙÖÔØÅÝÐÐÔQÔßUWÙÝVÔÝÖWÐÙTSÒÞÖÝÙÖ×ÞÅÒWÖ×_PTYEXDCGXY_VPABEEDYXXPWUSPÖPZVÖÔÝÄÛÜÝÞÝßÃÛUÐÚßÑÒÜÔ]^_GA[ZCGXYRÕÔV×ÞÙÜÄÅÞÛÆÄÛÄÆÅÞßßÑÖÐÖÕÑÓÓÒÑW_VW[EPVRSVUUÒÓÑÝÝÓÕÔÐÕQWUÔVQRRWP__QV_]VSS_XXY[ZX^YDDZ\RQPPÔÖÓÝÓÛÄÛÚÚÅÁÇÛßÒÔTSGEZ[]RÕÖÔÝØÙÜÝÓÞÛØÝÜÙØÐQTTPÕÔWÕÜÞÝÜØÒÖÒÒÖWTW×ÒÖW×ÞÞ×ÐØÝÕÔU_^WW]SRZ[_FOADEXWÔ]Q×]AD^ZXRRXRÓÔP×ÔRTÜÝÝÚÃÚ߯ÇÜÅÎÅÔ×ÑS[GMuHDD_ÔÐÕÓÜTTÞÄÅÆÌÃÄÀÆ×STT]VÖÖUÜÄßÐÜÝÑÜÜV\TT^[PPRWÑÐÓÞÞÕPP\RÔÝÓÖÓÐV_EAA\R\ÕÝ×VPYCAEZEZ[ZY\XG^P]RTÕTUÒÑ×ÜÄÅÄÍÃÅÆÆÒP\\XX]]]ÖÒÕÕÔSPÑÞÛØØÇÙÐT_\WVSÔÜÜÒÜÛÛßÄÁÜÚÄÓÜØ×\R×ÐÖÑÞߨÁÝWTRZYRW_YQ_NJKuLZZYSÕQ[DEAXR\SUTPQWR]ÔÜ×WÝÝ×ÖÖVQ×ÙÞÚÆÛÛÁÛU_R[BA_\YT×R_WUÔÒØÞÞÆÁÜÓÔWÔßßÐßÚÞÖÖÜÒÑÙÙÒÒÝÖTP]AETÕVÐÞßÅÁÙÐÝÜÕPÔÖVÕÖS[[YY\P]\VÕYC@@MA^^^RQZG^XXWÖÕUÐÝÖVVPP×ÓÓÙÇÁÁÁÆØÐÓÑSY^_X]_DXQS_WÖTÔÐW^^]STÜßßÞÇÛÐÝÄÆÚÇÀÁÆÌÃÝÐÑWÔÜÜÐßÅÙÜÅÄßÓÓQ_]S][E@MAX[[YYZY^DMDYZZS×WU×VPÔÑÑÒÞÜÜØÛÑR\R\RTÕÓÞÞ×WÑÑVTÕS[_\ZFXY]UÐTQÖÓÖÔÕVPÕÒÝØÃÍÇÚÚÞÝÚÛÑÔÒØÙÙÞÔ]RSSWÑÐÒÙÜ×ÐÅÆÛÞÒÐÐÐÖWW×TVÔÔPY\_A@AGXR]Y\TT[[]_YSVRUÐÜÓÑÑP_ÕÐÕÔßÞÒÝÒÑÑßÜTWÑ×UTPYZYS\^R^X_Y@C^RQÖßÅÚÂÁÞÛÅÛØÛØÜÝßÄÛßÞßÝßÝÖÝÅÚÝÒßÝÐÙß×ÑÜ×RR]\]UÔ]]\E@@AIHES]רÓTÔW^SÓÓPPÖÑÐÞÙÑUWVPVÓÔUÑU_^RPQVQSWÓÖPWQ\]VÕW]]YEE[XSÜßÓÚËËÀÀÆÛØÃÚÖÓÑU_SU_YUÐVTßÒ×ÒÒ×ÕßÙÖÜÇÚÙÚØÑÑߨÝÒßÖQP^LIGFCDWTWÐT^FFADR]FFRPX]ÔURVTUÐÄÛ×ÒÙÖ×ÛØÕWÒÒÖÞØÑ×ÜÔ^SQYNNOqvAY^ÑÇÚÅÌÍßßÀÅ×ÝÚÑTUP[YVWVÝÚÓßÂÁÜÜÅÙÝÞÙÖÑÅÝÔÒÐSRÖÑWTÖRDGGOBRS]ÖÇÚÖÝÜPX_GLADMLYY@XÔÕ]PÕWÕÐÓUTÐÑUÓÓTTÒÝÖÜÆÚÒßÜVVVZOBFC@_×ÑÞÍÎÂÀÅÒÓÒÕ\]T]F@DBFSW×ßÚØÙÆÁÛØÂÀÛÛÆÁÇÃÆÛØÄßÑÒÜÕQUS[GEZ@D^^RÖ×^EGMJuuvvJHuM[XPÓÞßßÛÄßßÚÞÝÅÄÝÝÙÙßÛÇØÙÄßTUÖS[FOtvuNOGUÒÝÁÂØÝÜÝTWÕQ\VQ[_UWWÒÅÄÅÇÃÄÅÂÂÇÁÀÙÙÇÄßÜÛÒQÔÖSWÒÕPVQ_EY^EXÕÔUÐ×\FCLwswvpuOKCRR\ÕÜÐUÒÜUÔØßÜÄÀÛÚÃÃߨÃÄÓÝÜTÕÑQZ[_CKFEA_ÜÛÙÄÆÜÐÐQGYQYG^RY]×ÓÑÅÏÁÅÍÃÅÇÊÌÇÌËÂÁÈÁÓÛÅUPÖÐÕ×ÜÖPUUYFXZF[WP_SSAIOwrvuqqOACYTWQÐÜÖÐØØßØÅÙÛÌÊÉÃÃÅÝÙÅÒÕÑÖVQV^GFCKKG^QÒÝÖÖÜßÖQ\XFZ\_RÔÖ×ÓÞÄÇÉõÂÁÏÈÉÊÈÁÃÎÌÆÅØÒÕWVPÕÑÒÒÖ×WQVSXD[^_]]\QQ^@OItuwvuHLD_]\PÕVSWTUÐÝÝßÄÃÈÎÇÚÜÓÓÖÖÖÒÓÖÔVSPSYD[ZEVÔÕÐÙßÐÕURY^E@E_QWÐßÜØÀÍÁÁÎÌÂÎÉÌÎ÷ÈÇÇÅÐÐÝÑU×ÓÖÑÛÞÖÑßÔ_R]ZFFABE_AICAutOJvuINC\\ZPÔ^XTÐ×ÐØÛÄÈõÌÀÏÍÜØÄÜÓÜßÕÕÝÔRPTDBY[BXVRVßÙWSÕ]FDYEZÕÕVÒÄÙÓÚÏÚÅÊõÉ÷ñÊÎöÎÜÜØÔ_QÕPUÜÑרÅÐTÑÕZDXANF[@A_DHMFKwCGJBYZERPFF^XFS×QTØÇÞÅÈÏÇÁÌÄÚÂÚÖÝÙÕWÛÆÝÓÝWEZZBZWPSÖÞÐÕÕV[ZYAGRV\WÙÜ×ÓÛØÜÆÁÇÎôËÏÈÌÞÙÆß×ÒÓSSÖÖÑÛÆØßÞÑ][DOK@FLBDCHIItu@@uOZGF^^GDYZZVÐ×ÓÆÆÙÁËÎÌÎÎÂÎõÁÝÒÓUTÝÝÑÖ×_GZZBGP][QÖVRW]GYR^[VTRTßÐÖÝÞÚØÁÌÉõ÷õÏÌÌÄÚÛÝÕÕÕR_]QVÐÒ×ÖÐTY[DA@ZXZDYZMLMCCDYEF[^_YY@FDCCE\]VÓØÙÅÆÃÍÁÆÁÁÚÒÐÖTUÑÙßßÙßÔP]PPQÕÕÐÑÖÕUVRPV]YX\YZQÔUWÐÜßßÜÛÇÌÁÁÂÎÀÄÃÌÄÞÒÖS^]]QÖÒÐÜÝ×P\FMGDCMEDML@@@F@CMMOI@DAOA^DZQ×WÖÛÙÙÆÌÂÌÏÌÂÌÂÚÓÐÔSVÒÞÑÑÜÓPPWÕWÕWÕ×URRU]YPU]^VW^\T×TÔØÅÄÆÍÀÈôÏÃÊÌÝ߯ÛUÑÞÖ]PQ\\TTTWS[G^ZCDR[@XRF@Y\[XQ_FCBLA@LNGYGZT×WÓÅÀØÁÍÃÆÄÇÙÛÞ×UÔVSÕÛßÒÙÛUSTÖUTÐÐÑÔÐÔÐÓTPUV[[WÕ]QÒÒ×ÝÛØßÙØÄÆÇÃÂÎØÝÅÁÙÒÞÚÖ\VÔTSQPQ\XGZDCLD[AZRQ^PUU_Y^DHtuuJuHFYZZRÓÖÔÞÀÅØÆÀÆÅÆÁÂÄÙÓÒÐTÕÜÛÞÙÇÅ×ÕÖ×\SÔÑÕÕÔÔÓÑ×TÕ^Z\VR]PÖÑWÐßÜÓÞÇÍÀÂÌÉÀÜÒÅÀßÛÆÄÓÕWW\[ZEAIJOCINMGE^SÕV]×ÓT_\_XMOMCOLAY[A_ÖÓÔÜÚÁÞÝØÅßߨÅÅÒÒÞÜWWÓÄÛÜÚÅÑÕÕUÔTÓØÅÛÙÚÀØÖÖÖRE]WV\QÔÕRPTÔÔÕÔÐØÙߨÄÞÑßÃÛÜßÅÚÒ×ÑÐWRRRZLLFMuN_TQTÞÅ×UÖÕZCFEBuu@BtuODA[WÖÕÐØÅØÐÝÆÆÛÄÃÌÆÛÅÀØÑßÄÅÓÐÞÛÔRPÔUQÕÇÙÐØÀÞRSÕUDDSU\^VÖTPÐÄÅÓÒÇÂÒÖÅÁÜÞÁÃØØÁÂÚÓÓÒÑS[YDHtKKwsK[[YUØÛÞÒUWQ^[ZXMIC@uwM[[YUÖÐÓÙÜÝßÜÜÚÞÑÓÚÇÓÖÞÇÒÒÜÞÔÑÔÜÓVVÓÛÝÐÂôÀÙÄÁVXQÐS@YÕQDF_ÔS\ÑÇÜÔÒÇÖZVÚÛÕØÏÆÝÅÏÁÝÚÁÇÒQRS^LIBOJJF\]ÔÛÀÛUSY_EBNABwqutrpFY@FÕÞÕSÑÚÞÝÁõÈØßÎÉÐÖÃÈÞÑÛÆÖÕØÅÕR×ÝÑVÑÚÅÞß×T_[^_^Y_^ZAAG\×ÜßÛÌÀÜ×ßÞÖÓÈËÇÛõõÛÑÇÎßÔÒßSAGS@qwCBwuXP[SÜÒZB^QFBRWGHHNHtL[[[PÔÕWTÔ×ÝÄÂÄÇÂÇÝÐÛÇÞÚÂÙWÕÚÞWQÒÒVVÚÍÄÞÃÎÜPÑÛÔYPÐWZXSGtLSQXSÝÞS_TÓÔÖÁÈÂÚÍôÍÙØÚÚÄÚÜÝßÓUPS_FFY\YD\ÖVYXRY@ODFutBtxKNvJRPADT×R]ØÎÇßÏðõÇÄÏÍÝÞÌÃÓÑÄØUUÒÐUUÔÖÖÓÐÕT]\WÔ×Ô×Q\][G[RPY_ÖÐ×ÓÄßרËÉÃËðõÌÊõÌÛßÁÅQ_ÔÑ[ND^@K^×_B^WYIFR]Y^R\YDFFOJCZD@D_^[^R]QÑßÜØÙߨÅÞTUÚÚ×ÑÚßUWÐÓP]ÓÆÛÖÒÃÆÕUÚÛÑÓÆÚÔPÓÓYG\PRY[_ZABDXE\ÒÆÇÆÈôôôõÎÂÂÂÇÇÇÛÓÒÜÕ]VÑÕSVÐ×^E_XACX]@KOAw|sJutO[DA[^_^_WÜÛÄÂÉÊÊÊÊËÌÈËÏÀÁØÜÑÐÕ]WÕPRÕUS^YZDEP×××ÕÒÑRYQWPRÕÕR_VQXXQÖÒÃÈõÊõôËÈÈËÉÀØØÜÓVR\ABDR^^TÑP_]P\_PP_^]\\GCCFZ^SP\[YGBCYRVÔÒßÜÙÜÒÓÒÑÜÚÆÄÅÄÙÑUUUÐ×UÔßÝ×ÐÞÒWÑØÚÒØÃÄÖVVR^_VRYDZGLtJBO@SÜÛÆÎËÃÃÏËÊÊËÌÀÇÛÑ×ÖÕVT×ÖÓÐÑWQ]]RÕREZ^DHKuvpwKNOD[ZFLMDYYÐØÅÅÍÈÀÅÌôÎÉô÷õËÍÆÒÔÖUÔWS]Q\ZE^^_RWWUÝÜÒÕÕ\]QT]STPZFZFAXWUßÁÊôôÊÆÃÎËÍÈÈÁÝÓQED^DMG[Y_VP]_VWQT]_QT^G@CNBA@CXV^ZEZFE_S]×ÝÙÝÑÔÕØÅÛÛÃÂÀÆÁØÒØØÓ×ÐÑÖÔÔPWÐßÞÙÚÙÚÀÃÞÖÔÔPPR__YAJwvqwNCGRÜÛÄÆÀÃÌÈÈÊôöõÃÅÝTWTP^]U×ÑÑÖÔÔVSWQYD\^@JIuvspqwuKNB@G_SVTÓÚÛÞÛÅÇÀÎÊÉÊÊõÎÈÁÛÚÚÓÔÑÐÕPQ]XX]RWPTÑßß×ÑÜÝQUÝÓTÔÔR@MFB@C[R×ÐÞÇÍÇÀÈÈÂÍÊÉÇÞßV]XEOB[DZ]T]RÕÖPWÔÐ×ÔUS]^[A@HuJBKwOXDO[]\ZQUUVÑÙÄÆÚÇÍÌÛÄÃÃÙØÅØÑØÁÛÒÖÑWUTÕTÜØØÚÂÆÒÒÝ×]PP_FAOINJwH@MFSÓÑßÂôÈËöñõÈõÊÏØØÝÐPYYQXDRWRXPQ_[RRYZ[F@CBCHuwwqttHC[[STWÖÓÓÐÄÆÀÃôËÂÎõËÃÍÂÃÙÝÞÙÖÑÖÔP__^\^PÖÞÓØÀÂßÅÀÚÒ××PXDYZAMFFAF^QÕÑÛÈÊÊËôÌÅÛÚÒÑÕW\X^GGGXE^SVQÕÑßÝÑÓÐÑTWRSZGFMwqtutwNB@LEY[D\ÔÑÑÜÀÃÆÄÉËÌÆÏÎÁÄÌËÀÛÙÇÙÜÑÖ×UTÑÒÜÞØÆÄÙÐßÜÖ][@MJuOOKuCDZGRÑÜÙÏðòñöñôÍÇÃÁÜVTÑVX\QSYYWP^ZSWSZXS]ZDZEAILKwqtKLOLD^XG_VV]UØÇÚÂõõÍÂõôÌÄÃÍÁßÅÆÙÔÔßÓS_T×PRÝÚÜÑÛÆØÒßÅÞVX^Y@HM@CLAE[YRÖÒÙÇÈ÷ôÉÃÌÀÝÔÓÒWRQTP^WÑ×UÔÒÐUTÜßÑVUÔRD^Q[LLAOqqKKqqI@LJOFFAXTÐÜØÃÉÈÎÎÉÏÍÌËÏÏÎÎÂÅØÛÚÝTÔÒÒTÕÛÆØÓØÚÓPTÑQD@ZENuIOutCXDDQßßÞÌñðÊÊ÷ÈÅÒÛÚÜÐÓßÓ×TÓßÖTÕÑÔQWWS_^R\XFEDNHHIuqwKHwtDYDO[S_^WÆÍÍÏ÷ñÎÍÈÉÁÛÃÍÁÅÛÚÐ×ÐÓÔ]PWP]SÑßÜÐÒÞÐ×UÑÓP\\SXABAECMGYSRTÜÛÛÁõËÂÅØØÖÑÒÖÔT×TPRTÝÑÖÐÞÛÑÐÝß×VUWQ_]SYEBIOIJttvuKtttHOH@^×ÝÛÃÏÊÃÁÃÌËÂÃÈ÷ËÁÌÂÂÚÞØÜÜ×ÕÑÐÝÝßÐÑÒWRPUWXXRWXLCCCJuOBFDPÒÅÆÀÊËÊËÃÇÛÁÛÝßÛÇÑTÕ×ÖPQÔÐÑQVWT]ZXY[ACGEZOOMC@INNOMNMCEEF[SÓÝÝÅÉ÷ÏÀÏÈÏÚÇÂÃØÒØÙÙÐÑÓ×ÑTRRQÖTÔÑÜÞÕÕÔÜÒUÐßÚÐPPS]AMF[XD_TÒÝÐÛÄÄÞÑÓÒÝÔÕÓÝÜÕV]]WRQÕÙÙ×ÐÙÚÑPÕÔV[E_\\D[^[AKHJuqqtuONIB@Z[RÖÙÂÁÀÏõôÊõôöôÃÃÍÉÁÙÇÆÛÔUÒÝÑWÖÐÓ×QP]R\[\PTP[ZE[NICFEAZPÓÜÝÀËõÍÇÁÃÂÛØÆÀÁÒÓÑÔVYQÕÕVV×ÔÕV]^EZFC@D[FFX\[MBC@OwJCZBOEY\XP߯ÀÀËÊÊËõ÷õÊÌÄÅÙÛÞÓÐÓßÔU×ÓÝWSUÜÐPÕÓÐPSÐÐÖQSVR\ZXXXE@Z]WÖÐÒØÇÄÙÜÞÅÜÒØÄÇÓ×Ö×VXSÑÒÔTÓÞß×Õ×T]ZX_YY^S_^]_[@@MwvuLJtHFYDDQßÞÖÝÂõÊÊðòöÊÉËÂÅÞØÛÞÙÞÙÙÅÅÓÕUÝßWSPÔP[^QTYFX^AKCYZCC_PSP×ÜÞÄÅÛÚÆÍÀÀÀÃÌÆÚÞÞÒSVÔ×Q^SUTXE]P\@CYYYEY_XZZ^EALNNJHLBAXS^YVÛÀÝßÍôÊÎôð÷ÏÁÀÆÜÕÕßÓ×UÓßÞÜÑÕUÖÔWV×Ó×PTÑÒT]]]ZOBZ^ZDRÔÕ]\UÑÖUÖÙÅÆÁÀÇÄÆÅßÑÓ×R^QUWPÕÖÕ^XSÕW[YVVRY_PR^X[FFNtttJuKM[ZAZ\ÖßÒßÄÎÏÇÌöóôÎÊ÷ÎØÜÅØÓ×ÜÛØßÒÝÓÖTTÕ×ÐURSWÔPXZ\YJuG_D@_TT\RÑÞÝÐÝÄÁÆÅÇÂÌÆÚÅÙÞ×]^SWSRPPW^@F^^AXUÐW_PÔUYGZZFNJMFBICCBCAADSTTÖØÂÀÄÃÈ÷ÉÌÏËÎØßÚÃÅÓÝÙØÝ×ÒßÝ×ÑÞÇÚÒÝÝÑÕQR\\^CIB[FCZ^W_[WÒÓVPÐÚßÒÆÎÏÃÁÂÆÚÜÕQTÕVPVÕT^D[_\Y]VÖT\RVVX@G[GItHMNtK@F@BAYQPWÒÛÆÀÍËÊôËÉÎÉÉÆÚÄÍÁÝÓÙØÓÔÔÒØÝÑßÛÛÔWTUS[X]RDAEDZDAZ\S^_PÕÑUÔÐØÅÙÅÂÏÃÙÙÛÚÐT×Ñ×RRQTQ[XY]]YPUÑÕSTÔUS_YEAIKHNMNO@EDOME\X^ÕØÂÂÀÉôõÌÍÌÃÄÜÛÆÆÚØÛØØÜÐÑߨÐÖßÅÅÓÕÔÖVXEX\Z@FY]YXRTWX[RPP^]UÐÓÒÞÇÁÚßÙÛÛßÒÓÐ×S\RÕÕR]WÔWRUÝÝÔVÔÕTR^^E@HKLLIJN@EZ@D[_^[]ÐÅÚØÀõôÏÌÈËÂÛÅÁÁÚßÚÄÚÞßÛÙßÖUÖÓÝÔWTÕWXGZ^EBG\W]\×ÑT__RSRX\UÝÒÖÞÇÃÚÜÞÙÙÓÔÖÐ×]_STQ_RWÖ×WÔÜÛÐWÖÐÔYEYXANMFEGBAG@CCFE^[D^ÕÜÑÑÞÀÏÆÇÍÈÏÄÇÃÌÆÛÆÍÂÄÄÀÆÛÓÑÐÝÜÑÖÜÜÖ]ZD[E@C[PS\PÔTYDY_DOGRTQRÖÙØÝÒÙØØÞÝÝÝÜÑUÔÐÓÑ×ÖÒÖVTÓÒUSWÓÕXAXYZAGXY[FGGFAAZY^^^SWÕ×ÔÜÄÂÃÃÏõÊÀÆÂËÌÚÛÁÆÞÞÄÛÝUUÖ×UQWÐ×Q\\_^^X\QWÕ]STÕQ]PVVX[]P\[QÓÜÐUÑÝÐWWÑÓÑÕ×ÓÒÝÖÕ×ÔÑ××ÑÐÖVÔÑÖSZ\RPY^VWRDDGACCFDGFFEE[^\ÕÜÛÅÇÃÃÀÅÇËôÈÂÎÈÈÂÛÁÃÅÜÒÙÓÖÕWÖUP]\\\_X^QV\Y\_]_Z]WPYDY]\^QÜÛÜÐÞØÒ×ÔÒØßÑÐÙÜÐTVÔÔÕVWWRSY]VQSX_SP\\TÖQEDY^[GZ_^EBEYYYRÖßÅÛÚÁÆÄÞÙÇÏÌÅÅÀÆØÒÙÅÛßÔÐÝÖUWÔÕTSQÕTTVÕÖÑURQÔUS^]R\@MFDEFXÕ×TSQÑ×Õ×ÝÇÅÝÝÞßÓTTÑÒÓÓÑÐÑU\]PSQSPTTQPWÔU_D^^DOCG@IuICDZ_UÜÚÙÙÇÁÀÄÀÎËËÍÂÍÍÀÞÛÁÇÙÓßÙÐQRÕÕS_RP]][_RPW]TÕWS^^ZDABG^SSSÔÝÐWWÒÜÓÓØÄÄÅÝßßÐÕWÑÑ×ÔUÕPYGE_Y^]QTÐ×V×ÐÓÕWWUQEAF@MNNFXEZQÖÖ××ßÙÛÛÙÇÆÇÅÅÇÇÅÙÛÁÆÁÛÙÚÞÐTÕÑÔTW×ÐÐWWÓÓÖUÔÔV^DGMCLIAZ[X^SVWQPUÒÞߨÃÃÚÞÙÚÄÝÐÙßÝÝÑ×ÔQYY\\\XRVQQRTÖ×ÐTVV\GNOIIHOAE[G\TUÑÔÙÅÆÀÅÍÏÌÁÇÃÀÃÀÁÄØÛÒÓÓÖURQÕTVPVTTVRÕÐÑÔ×ÓU]EZEFF@[\SRRUTÕÕ×ÜÞßÒÙÄÛØÐÑÐÖ×ÔÖÓÐTQWV]Y_\\RSQÔÔÖÔÓÞÙÙÖÒÖPYGZDABO@AAMG^^XYUßÞÞÜÛÛÛØÝÄÁÆÇÇÂÆÆÙÞÙÓÑUÖÖÕÖWUÝÖÐÜÐÝØÖ×ÒVSFCAMMHNBAFCYSRPTÐÙÚÙÚÀÄÚÞÙÛØÞÑÜÙÓÖT×ÖWS\SRQ]]WTÔVWÖUUQU\\\GDMACIFFC@G_]RQÓÞÜÛÅÄÃÇÅÇÃÍÌÆÛÅßÙÑÐUÕU^\VSTRQ×ÖUÕßÓÝÒÖÒÕVR\]^DCFDEXXPPRVVÔÓÞßÒÙÙÛÒÖÞÓÑÔÖÜ×ÕQÕÕWV\TUUWTßÓßÒÝÙÓÑÔÕTPSX[^ZALLKIHNDGDY_TÐÝÓßÛØØØÁÃÁÀÍÎÀÆÅߨÜÝÑVÑU×ÕÑÜÒßÐÓßÓÐWÔV_[GD@NHHBIBAXRRTWÑÞØÛÜÇÆÆÇÛÁÇÜÐÐÞßÐÔÕÒQR]QÕ\VVÕÐUÖÕÖUÕU]Q__^X]X^@GDAGF]WWVQÖÝÝÓÞÆÅÚßÙÆØÇÚÚÄßÞ×ÑÔPQSÕWWÑ×ÜßÙÒÒÙÞÓÔ×ÑTU]R\DAOFBB[EPRVTTÓÐÐÓÐÜßÒÑÒÜÐÑUÝÐÔÔWÔÑTTWÜPÐÄÒÁWÞÝÑØÕW_P\\YFYYDBHBBNMG][__UÔÖÐׯÚÀÅÞÄÀÌÀÇÌÁÄØÜÙÐ×QÕÐÑÜÓßÜÞÜÒÛÝÔR\DQSY[A@IuHH@FE]VVÕÑÝßßÓÞÀÅÄÅØÅÚÙÓÞÅÙÐTÔÕWVR××UTWÖÖWVWÔV\ZE^G[ZX\[GMAD\^YÖÐÖÕÔÞÜÓÐÙÅÞßÝÛÄÚÞÙØÜÓ×T×VPPSÖ×ÓÖÓßÝÞÓÞÙÓÖVVWQSPV\XGCEDD[]TWTVW×UUQU×Õ×TÑÓÓÓ×ÜÞÐÔÔÐ×TUÓØÜÒÒØÆØÓÐÜÐVP_R\\X[Y@CKHAOLAYP\YYPÕWWÔÙÙÝÙØÀÀÁÀÂÍÅØÞÚÞ×ÒÐÝØÞßÒßÙÞÓÖÜÖSYE^ZGDEE@MLFFF^]QVQWWÖÐÒÑÝÛߨÜÛÁÄÇÅÀÀÄÙÖÓÕQWVÖ×VPVÕVRRQV\^X^R\Y[XXZD[]RPPV×TVQWÐÖÖÒÙÛÝÜÜØÚßßÞØßÐ×U×VWWTÐ×ÖÑÐÒÐÓÑßÙÐÖTÑÖVPPÕS]__SXYX[_ZY^]R^]^PQQÔÕÒÞÜÜØÁÇØÝÜÞÐÖÓÚÄØÛØÙÒ×ÐÔÓÑTWSQ[DFBANLNMFCC@ZX_\]UQTÕÑßÞÙØÇÁÁÍÁÌÎÁÂÇÁÁØßÜßÒÐÖTÐUWWRWS]X[[AFCEZE[[]YZZZ]X\PWÑÑÒÒÜÛÞØÞÄÀÅÆÅÁÇÚÞÓÒTVPSÕQRSPQSPRTQRQYR]XYE__^X\V__]PWPTUÔÔTÑÔÑÝÑÑÐÐ×ÖÖÖÓÔ××ÑÒÐÒÐÜßÝÐ×ÐÓÐÝÜØØÞÝÒÓTTPPQ]R^^ZGAL@BLBB[^^^]TTTW×ÜÝÞÙÅÀÆÆÆÀÁÇÆÇÆÄÚØÝØÜÐÐÐÐUW_]REABMNINuKuKHMEDYY\WWÕ×ÝØÙÚÚÆÌÂÀÁÌÃÀÁÚÇÄÄÛÓÓ×UVQUTVSÕÕQS^RRXGAXX[DFEDGFE_^\QÑÒÒÜÒÚÚÛÛÙÄÇÛÙÙÅÅØÜßÝÑÖVPSRPSVTVVWÕVRSPVPSYXPRYZ^\XXZYY]TWÔÐÖ××Ó×Ó××ÜÐÓÖÐÑÞÕÔÐÓÓ×ÖÐÝÐÐÐØßÞÚÀÄÄÃØÙßÜQ^S]^DDZFBLOBL@G[RPQSÕU×Ô×ßÓÞÞØÃÁÇÅÅÇÆÚØÅÆÛÙßÝÖÜÙÃÉÅPÝ_YTN@MLANwNL[HuLAAR_^ÖRÓTØÜSÆÀÆÚÆßÜÝÒÂÐÐÚÂÜÜÐßß×VVØVÐÝSÕÞWYUP[GC_ÔE@]XBX@UÞQVÁÁÅÁÚÍÌÜÞÇÚÍÛÁÍÌÙÆÛÒÅÔQÄÒQTXV^\_ßÖRÃÔWQSÑZ_^_JVZp\q[tFÖPU\Q^ÜÖVÝ[ÕØTTQÙWÕQTUUUØÑÖÚßWÚÅSØÇËÙÄõÊßÅôÞUÕÒ×Õ\]IACtDrB[^wAVCGRÔwÓÀEÑÃÛÀ
\ No newline at end of file
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_g711mulaw_1ch_8khz.info b/media/codec2/hidl/1.0/vts/res/bbb_g711mulaw_1ch_8khz.info
new file mode 100644
index 0000000..f00b9cd
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_g711mulaw_1ch_8khz.info
@@ -0,0 +1,10 @@
+8192 1 0
+8192 1 1024000
+8192 1 2048000
+8192 1 3072000
+8192 1 4096000
+8192 1 5120000
+8192 1 6144000
+8192 1 7168000
+8192 1 8192000
+5462 1 9216000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_g711mulaw_1ch_8khz.raw b/media/codec2/hidl/1.0/vts/res/bbb_g711mulaw_1ch_8khz.raw
new file mode 100644
index 0000000..f38f1ca
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_g711mulaw_1ch_8khz.raw
@@ -0,0 +1 @@
+?CK^åæêý\X`ZTjòþ]X[PS\[koãÜåÙÚÚÜê]TZ`p|ÕÏåèäø{çÏÄÄÇÑþ^MFSëÐÅÁÀÉãiUKKfÚÍÈÈÈÍäl^^\QMhv]ëÙ×ÕtXOBEV}ÌÅÌÐîH@<=JXÏÀÃÊËá[KEQZMYiiìmjéåûÞÞéãjõ÷OMQKWpéÏÍÑÉÏ}eMUdR^àÛÝôkìk[àʾÊÜ\?9:?YÏÀ¹¼ËåYFAE_ÏÌÊÄÌêaMQOFVáÍÇËÉÀÎhWNO[`ÚÑÛÐÚoWKI[lïÎÈÇÍàãwMR}â|^V]VHLWóÙãØÌê_`c\TMXZOUKJSU^ý`WpîîdWîß]]_WYhàÎËÍÎÚêUAIêÎÇÀ¿ÅÓhMFJîÌÀ¼¾ÀÃÏkOLOR\ÙËÌÀ¼¿ÆêUNJJJOæÒêt_LJN^çߨ×÷bWHCMbÝÍÑÜçlSFDaÖÍËÏïcJAEFLhßÌÍwc]TRRLWmêälféø]VIPôØÎÇËÖpQQHCVÖŽÅÏÚfLB?Lî̼»¾¿ÂÓþVU`féØÖßÝæØ×îiåásQNpòîÞÞ}îryütþÝÝÝÿXdgxÙÏßoW\TGK~ÌÄËäû]H?BGPYáÎÝqc`XOGILOPNJKJR_LJRòÛçþØÙô_QKKKdËÁ¼ºº¼É`S^µ¸¾ÅüOR[ÚÌÛÖÒðçéâ×r[nWJKNjæbU\Yiz_ljUXTIRgßÈÏ×ÑqSRHMT^ÍÁÈËØmZ?9?LêÉÊÎßWJC?Ha÷ÕÕq^UMQOGKHSëíãËÌËÜOMQaÒÌÍÆÑê}TQ]ùÌÂÀ¾ÆÊÉÏéluæØÙàã×ÓÕêôßÞÞáfOKJUfêÔÐÊÁËålhí{_XS^òjeîÝÝzOF?E_íÐÍá^LA<8>Uøéî_X^QLGMZeuÞÓÒÏÕsXPMbßÌÉÌÑÎàþó[uÖØÞäÙÈÑóoOGLVßÅÅÃÉÖnLIgÜÎÊÏóegl}äȽ¾ËÛh[TLRzåÎÆ¿¼ÇÒÕuNIG]ßÕÏæ\UG@@=FYøðylûRB?>>?IbßáínqLDBSçÙÑÎÜcZPTTjÒËÛÝáÒËÒÌÌ×ûfgåþÞÉÅÈÜd`f]÷øãàèïîq~ñïn[[`nmo~lbtéÏÎßÜßfSJ]Íž»¾ÃË×ÎÑ×ÌËÊÌÐÉÂÈÎéP@=FhÝÎÄÂÖK;69<?KUOLC=:6:CIWzýödRI><AMpâÙÑÒÙ]LMVfïâÜúYZ\mããÙËÎÖåîéyXRJM}ÔÍÎÎËÍu\\rØÈ¾¼ÃàbUPSüͽ½ÄÇÌÌÇÊÙáþÖÌÉÀ¼¾ÃÎàØâèæçrjVpáîîhWSNGFDN^[UOC>@HWl~bNA?<=G]aSJLmçÜßýzwTcúìßÝÞlP^ä÷èØ×ÓÐÕÙhaöÕÊÍÚÛÏà^XnúzçÎÉÈÆÍeIEFfÍ¿º¹º¾ÒÜãcóÌÅÀÆÈÄÙtrsߨutåÞèæàíK@FLRWgWOGB@CERddYLR[J@LNUU\t\QeqbZIL_àéæãÜdRYnÔžÈßkwqíìáÜßàêÜÏÎáÜðSEH]ëÝËÄÅÈÞ_RVT\hæåÜÌÈÌÍÌ×ðÛÇÃÀ½¼ÂÓm\mÞÙééàèsêæv]gYMLLOORQICGLPUNN[SB87?EOtØÐÔîe[]lç×ÍÖðÚßuhecøÚÍËßóé]LDANlméÎÍÕfOSFARi}âìÚÇÉËÎzúåæÄ½¼¶¸ÁÎáÜÊÍËÁÌÏÓùãßûìÕÝîYNfk]p^YcSVcUOPC?>>RbYn^NONZnUJMJP\]ÙÎàvc^jøØÏÔÛäiaXK]ëØÏÕåôd[÷ùbpî|û{åØÖuOKWW_ØÓÐËÈÅÉëbVU]{ÜÍÌÍÓÜ×ãßÍÒæÐÍÐÛßø{úïÕÏÊÎÜòhOMVlí~÷éi\pWQ_yzÝñid[cPHHFFjÖÍÏäñtMIXWöÑÝàÞWGJLJMMQT\ñ~SD?@K_ÓÉÝÿûW_YDJt~âÕäèâÐÿÇÎâèÕÍÇÇÏÏÉÎÆÄËÈÇÝßÖö_oçÏÍÚÖÜÐÕ÷íá^ùÝéØiIOTHPRKJ\lèð^\]aURRP?IYWZ\RçêL_WJUjlÐØsWOPMYßÒÑÅÓtL@AUkÝÊÒæçÜÝÐìYXó|~ÖÎÕåödk\VaÕÕØÞg]nðÕÈÍÍÊÇÓÜÝjZçßáÑÖÒÇÈÙlOO[ÞŽ½ËdTRM_vfÞÏéêìQJMQ\`YUR[`Z`SHT]Rkj`ÚøPUH?Mc|ôh`_cîxlßj[xdYhUQb^`ø_TêÝ×ÏÞbipÞÐÐÎøféüçÆÉ½ÈÓÝmäËÌÇÐ÷bkèÑËÄÇÔÔÿMHMNgéÙÏÌÙçÝíä}[UdêÍÌØbPXVXúìx×ßt\MJV]]TOX[_QHE?8:=?HMOSQGEEGLqÐËÍÝ]OOPú×ÛßÊÈÎÐÕÓÊÈžÃËÏÊÉÎÖÓÍÇÀþ½ÅÇÈÝðææÖÍÌÍÎâ`TXVOOS]nìÛÔqKKTZvìíØÏÙösYUmÛàaUMKMNNVMMSNKNMRUHDFKD@INIHF>>DIPSKUðÐÈÉØèçåÔÌÍÓËÁÂÈÉÉÇÀ¾¾¿ÁÇÄÀÃÊÏÐÍËÉÆÂÇÏÑå_SRMMTWefRIIPQQ]fîÛÎÍÞRDIMPYd{ßÚßçkPU_eafõsfc^XRQ[ìßèéiULCBEA=@HIFA>;;>@IKLVmÿsf\_÷ÓÆÁÄÅ¿º»º¸¸¶¶µµ´·¹¹»ÀÇËËÈÇÉÎÝ[KKV]ìÞïøûpdRGHLPU[^ûáØØãtSUzìþíwg|òìÛíb^UQOOLLJJIGFFNmmfgRKJHJRHDFBBA>?ADKRUV`ráîììl÷ÞÕÏÌÕÓÉËÎÌÌÄ¿»¸¹¼½ÂÀÀ¿½¾»º¼¾ÌéüçæáÙÜÕ×ÑÏîZSVnßÕ×ÏÓßß|x_U]m_Z\RNMLKEACDKLHD>:9>BGJLNJDA>=AP_rwgj÷ïþjbe{ÔÌÍØääÞæàÔÓÖÔÕÛÝêõîÙÜØÒÒÒÑÊÉÍØÞÝÙÒÊÇÇÆÁ¿¾ÂÐÏÉÅÊÍÍÍÍÈÁÃËÕÓËÊÌËÓÕÛÞà}SE@>>@EC?>?@>9:>AB?>;;=CR^W`r{úmUNLSkúípnöxukWV_îÏËØäÛÒÎÌÉËÏÐÎÄÀÇÐæî÷sôûê×ÍËÐ{ZehÝÊÈÅÊÏÎÚóedéÙÕÍÉÍÑÕÒÐÙ×ÖÎÄÃÀÆÐÔÜÜâlZMKNOQUKHRNVULPKDA=<869<?ECFIEEFCFIYûìàcZfWhíflòäÍËÓÖÚÕØÙÒëtÜÐÉÆÎÔÔÖÐÊÈËÐÌÏÎËÖÚÒ×ÎÃÄÄÂÀ¾ÅÕfNnáÖÅÌÝÝõzä{öÒÌÇÆÇÉÛÜçijWLRWV_[I?=BKZTGHB<><<@EOOMIADJGIJAEPRdbSSLLLNRTxÕÌÈÍézêÞÑÌÌÐÞÖÕØÒëæÕÎÁ¾ÇÑ×ÛÜÛÙÜÖÉÆÇÁÎÞÐÎÎÓÚÜÝ×ÜáÙÞçÓÍÍËÓØÎÌÅÀÇ×mw~iörVWTOZZPQYdXI?:<<;?<78:=CGIIJLFGJFWãâÝêwö÷tøü^\vÞÑÎÙl][VnçÜÞßÚêxkdüÓÊÄÇÒÏËËÆÊÐËÊÆÅÁÀÈÊÊÎ×ßåáÒÎÊÍÙà`höÚÐÛÐÎÏÊÓ÷hqèìõl]JHEDNJJOSe[KIGHIIHIJMOP\PLU[ol^VLX\TWYUNKN]YUY]|÷^QL]ìæÕÙùipìÑËÐÚÛÒÔàÝÙÎÆÉÊÌÒÐÒÌÀ¼¾ÉÇÈËÌÎÓξ¾¼»½ÀÌÊÉËÍÝÚÚàåYHFRQRZKE<<=@I??GLWJOO[fOLABFL[iæ[UWIRMPXlÝèìaPGH^ùØïjüXfXNRVtuÜß`WShnäßÜÍÏÉÉÌÇÍÆÇÇÅËÊÌÊÆÀÄÈÅËÈÊÏÊÓÏÎÎÍârlÛÇÃÄÉÐ}QPRmdb{m]B:7<KR``VVNLILPNRVcZLKMre[^QVOORcp_ñãÚå_WOøÝÚßhiQLIMd\gnïãhVNúÛÜÓæÞ|]}òÎÏÖÏÏÍÞáëÑÇÇÃËÉÉ×ÙÝÊÅÇÆÈÄÌÚéÙÅÀ¾ÇÌÔzùxíéùòpðjNE@EHMIL[QOLXbWRLVZLEAFNZOKNGGJRgwáûmjTQNlÖÍÏwcUIIQ~ñõfbø[TNZßÛÔÛàÝëèâÑÍÊÇËÉÌÌÐØÉÇÂÂÈÈÍËÌÅÂÊÊÎÎÖänbÕÏÑÏêøbiipÙâååuYSL@IU_átZQNOUïýedTKHHAKcZ_VF@?ABTa]j[TUXO[ÞÙÔØt]]`S]bUoìîñýUMY^ÛÇÊÍÔátè×åÚÓ×ÓÑÝsÔÊÆ¿ÆÏÎÊËÆ¿ÆÅÄÎ×ÛØãÏÉÑÌÝXPPOYÝÙÚÓóe_VHIYWïâa`XLFPZUþõknnWLRNXeNLKIFFJGOa\ZVNGZpöÙscXOKJ`[_bSQNNGPmâÈÊÓÙ×ÒÒÃÂÅÄÍÒÞßýïÏËÅÈÅ¿¿¾Ä¿¿ÆÃÇÈÎÔæqߨÎÐèhTSMTryæõ}_PIAM_âÕÛãg_STcb_`]]WWNPbrýa_VTLDGHHHLNUVLMeõåõdTHFFO]VUfj_[[[áÌÇÁÇÑáà}øÖÎÏÏÓàó`OaÝÚÎÄ¿ÅÅÉËÅÉËÇÀÂÇÆÔÚÎÐÒè_IJNL`òtfíÜçæ\Xéððþè`R[Qc}üëâÙ_WPHSTe{ù`ILCCHIMMda[RFM\þâàæZ_XZhVOLW]OMFN[`éãÓåáÙÝÎÎÎÌÍË×ândìèÏÏËÌÎÊÎÆÃÃÆÃ¿ÁÊÔåÜà×ÞmWDKJQZlïçÙÓÙýlòÓÊÌ×ÏïeOOZeo[ugODBAGTiatXMLLNPhVeôúZOKM`ø\bhUYYn\q[`îpWMSWlÖÛæåe__ïñÌÄÎÍÝû_^tàÇÄÌËÛqcÝÑÎÅÌÃÃÌÜã×ÓÆÁÍÓ{TLQ]WßÝÛÞx\Vþì×ÇÎØëRHH]oáÚÝßnTL[^lãçÿ^KGIWZcñö{VG>?AMxôlWJEH\ðâÝßì\J@J[öÒÕÔêRDCVäÍÃÄÄÒò`qðæÈ¿¿È×úhçÒȾ¾»»ÂÒçßÛËÈÌ×iMEJXgáÚÞä[PP_úÚÈÈÕwSLKYëÙÚ_OFCACNdÖÎéYH?=BUgéú÷lOF>HYéÏÝnVRURëÐÅÆÐÚçêenæÙÎÙmVNLH_ÚÕÖÝßìò÷è×ÎÇÆÖjXbblØÐÊÍÕÒÒÙëÝÉÈËíTONQVÜÊËÔçäï|îæÐÓÏÔcTOW\êÖÜì\^_[\Yç×ÝîNJEDFMae`\YRJHN\^UbSKGK\yêåèq``nøóçéòî^QMO\ëÏÒàvktnsÙÈÄÆÇÍác_äÔÉÊÉÊÔÛØÕÏÉÅÈÐÝù_NSWéÓÝáìÜÚÝØÏÌÖæßæaMVYgjMONPQPadõão`UMFMQTïdSMKQLWfê×fZcXKK_r×ÚúùamîÏÊÒËÖêhOKKYY{ácXR^nþÙÔÅÊàïmb`ðÞÖÍÔßøøåÔÌÎËËÖßñð|èÞÕÉÍábnâÖÐÍÇÇÒëkl[aîÜÒâhOILXëÖÊË×gGAAFTWb]NB=DO`ôññfOKNZS_pòð^OGMhî×ÙáÜæi[c`öénv_VKOúÛÊÅÅÇÑëøÛÔÐÆÅÃÊÞj^íÚÈÂÈËÐál`edéààëbPJU÷ÐÉÍÏÛ~_]üýßÝñùUJHMfçÑÕÝø^YR[dksZVMEACNdã}ee`kméàèäîégONPgìÒËÌÐáÿfdmöäxeTHDCMýÎÊÌÕìg[]õßÛÞ×á[NNdòÕËËËÒ×ÍÏÍÊÈÊÎÔÞäèáÔËÎä~þeg÷ÝÍÍÚîõZLMQkß×ÙÙèYW_U\baSMD;<?CTþbX]TOVSoÞë}yiOMY_ô×ß÷ð[OmîàÒËÔöiOPYVúÑÐÞàÝÜÍÌÌÅÃÍÛÙù]qvðÓÏÛÙÔáÚÏÒÍÌÐßôfWa]YîØú\YTZ~èÔÉÍíwbMHKUðØäÜØéoõõnûüZSH??ABCV\RY]läÚÒËË×ÜÞâäõþûàêce`Zhåáìëm\PMMOOM^÷xgdnåçîÜÎÏßþp_VRV|Ö×ÜÏÌÎÍËÅÅÊÏÖÔÏÓÙßàÙßn_izíçÛÛÜîbûàëqnððtcjåíðãØÞu^OLIEECDCNWKNU\yéîìâp[dd]OQ]fmZ^peiîèzðtU\s|éèéÙÓØÝÐÍÊÉÉÄÆËÙæØöXX]pëofæàãÐÎÎÏÝÛÙ×Þìío^VUTXa\zêïÞÚïjïøjssóìyáæün÷Þãðb\WOKGLQMU_eaZ_îòcmñíéáÞàýj]WVUfùðäçï{ú\Vbb\Z]^YbíäßåÚÒÐËÍÕñéâ^XWnëìôþÞÛÖÐÑÍÒÓØÑËÕÛÖÓålmsøóg~yùðbbZ{æùêëè~éàzÞêêæïí_WOPOFILNNMPLNTVego÷îînçéos^VOQPVshùðÞÜyh`zßÞÝØÕÓÕ×âÖÍÎËÌÏ×Üâüù}÷èéßýþ~lukbhíàãèõàÜpe^Y_\^YT[bcpæíßßãÐÍÔØÛàéõpêÖÔâî}]NIKMY[Z`_WY^\\mqñðyör{ëßàøqkohYSPg`_e]a^`gmqhsecntñàÕØÕÔÞàírþáÖÙá|}áÞæßÒÍËÉÏÖÒÖÒÌÎÛèîr^XVarijôunòôóìÝÞßèh^søóêzjzjYVOKOVSPSRORRMLMUhbX\~îðÜÛßëo`acdmsqg_^nêëñâÕÖÚÛäÙÎÉÇËÎÎÐàzhelúìq^Ybt}íçÝ×Õ×ßìêïñïåÛÝçycUW]VZ\gd`víêæÚÐÒÜïçÜÓÔßé}rZVTSZag_XSQRU\dd~îôpYXjøæéÞÖí^Z_b_cmrYVVSOLNYpyêßßÜÙÖßçßááæú{èàéææëùqiæçôÞÒÏÕÏÎÐÏËÈÊÊÓãzWZ_eböñuökjmwîçØÖàííåÜãlèÞi[aWKIGKLKOOUXZ[Z[^VR\YR`òèÛÔÛü`[amlyããæõk[UW`wèÜÚÕÒ×ÓÑÔÎÍÒÔÓßë}{~jc^XZmðêïíïpfrîìä×ÓÕÔÝê{hkhu}ññèô`[Y^úßÑÉËÏÒÔØÜîêàáêq]QKHKLOQUV`[Xc\\ailyïÝÕÜënbZPR_rrümakWTVPNZ÷ÞÙãâáåæßáÝÖÔÓï^e\jîèÝÖÕÝâîûim{åßÝÓÒÏÕ×ÎÔÙáùu~êíéï~üvcbltäÝÛæõñ{æÛßòèÞßlWPMHDHLMNUYTTQRadu~êÜâyþðzçðpe_vözhùìogYdmðÔÐÑÑÝîÛåöáÝÕÏÓßåwimbltóîmaiaYfbnàèäÞãlmuõÝô|øâçûíî÷õåùkü|ëÚ×ÖÕâÛÐÔÒ×ÖÖÜæ`LLROR_lo^UOUSXbcjlú~b_YZnövh^Zec_bfk{ós_`wpcðèzõà×ÔÜàØßåçëòêíóãáØâcúovîðåêêûâùsøuâØÔØßý÷å|áí|åêíôÿkêæÝÚáÝßÞèîvþî]`XUSNMMSMSMGHHOX]eùöìÝéÜáé×Ñßüg[rhivulon][W\oøÞÞØÏÍÑÏÎÚÓÖàîwisn]tëïþaZVZtê}îïuåäñøûøßßk^YZvíðèØÍÍÝèóoñëàØÖÖÐÕßÜßëåñb^]XVOPXZZZSPRZeZRX_`hddqêâØàcZQS\_eyæãõk``fôëôéßçðóïÝÝçÖÏÔØÚãõsoçÙÝäpwÜæëðgkùúèî÷ÙÑàåü_ck~ëíâÖßîì]Ta[gêÜÏÐêìåëÝÜèäõq}WMQKKSKIKKQ\UXQMaôîâߨÍÔÜÕòel\bò÷äÜq`_Zbp|éâÜÕçëÙÛÓÌ×àÕÖ×ÚgX\[hòönjxÿmej[bjY]êÜÔÏìrlXXcnúÛÕÛæèáäÜåîçÓÎÏÔwmttêÜÝñà÷[\\X[j^YOU^]YSPOSS[acwths{g÷ïbakâÑØõcWOY[låçØÒètùïØÑÐÎÏËÉÍÞæýqóôààtlxYWvz~øh]fâÔÕåçè{eb|êèÛÒï}íkyúk_çÚÚÙì~ngkðÜÝòldOLUSZ\TV\RNQOMPXU\_loíáóéÞÛÞíooáàÝÙïba\UbzèÞÜÛèîéàÞÖÔÎÇÊÏÍØýòueijmudSUZ`kib]^xéõÞÜøåðpe^kâÞòÜÚäééáÝÕËÊÕÖÝib_ekrüú_NTTPXjwkýåíYVZMNQTPRW^]Xce]bxxpðÛÓÛØÛë~jf^ltãå}ôêþlìÙÕÎÉÊÒÚäìåÝÜÚÙÝÛíd]jb\y|b_rðõîîèþmwva_{íy~åëìßÜÝÚÚêôrZ[ZfüçæÜÔánZ][Xdzvqm_\MEILMQYY\Zamm~íæåÝáßÜæÞõlk_X\÷íáßÜãqwêâêÔÍÎÒÛÐÜûõáâèØÜÝõöm^hnÿüßâüjcn\X]habðâëo~ùrzåÚÞßÓÌÔÚÚém]fq{äÔÜöÿ_TR_gaþæöZY^PIITSN\~kUTTXZ]^]o÷õü{yh_eþseèÕÝçãäèîãÞÞÛÍÉÍÑÒÐÝåØÖØÍÍØÙìûþxóÿ}øãöf[OOMRhelÞÔÚæyñäþñæãàØ×Öäa_YV[Y_ðèþpjþþjsm^{åîîmXTMGMNWgfe^WTZho^cÜÙÜÚép~`b~hxëéíøîàßÛÜêá×ÓÌÎÚßÛæßÛáÖÏÖæíéühujVZzæãt^YOJSX[ñÙÙãðõüëÝézáÎÌÓÖ×ãofúlfþíå~påæõpYSUgzugbZSMIGJRY]TQa[X\XU]ߨÛêíjZUZ]\ùÙØõëÑ×ÚåçñëÙãØÖÕÔÓÕÝéíÏÉÍÔÖÊÍÑásgcçñýk[XNEFHMgáÙÙÚÕÛàïüyáÏÕÞÞÛínUSRPn~fdÿÛàìrbUYhdh`Y]aODBFQVS^tyiieacðØÕÐÓÞïoYPThÝÚÞÝÛÕÚÝsewë×Û×ÎÍÎÓÞzihà×ÚÓÖÍÍÐàukgýikûl[ULGKOnùëÓØÙëònijèÏÚØÓÔÙèmY^Xdûqíïßßìk]XVd]`kVVUNKLLYdY`e[RPOWYhÝàÔÏägXTNNO÷ÙåÛ×Ó×Ûìtt~Û×ÎÈËËÍ×ëø|ÛÏÍÈÊÎÏÏÙþsìÛçéðbWNIHLL]xzæèâÞÜÝåãÝÐÑØå{íeSLHJU_fðíÜÝäü]cd|öñþ`]NJEAIZ_dm[[Y\Z[ïÜÏÓÔ×Þíp]PQRgséáõÝÕÚwhÿïÜ×ÌÈÉÈËÚn__~âØÏÓÒÒÜç|ðÙÓßéçe]XMJLR`wnvgoéêðïÚÐÖàãÞíÝÜv_[\cr~àÛÚÙépZ]noywuf]MBBEJYlmtcXVSNSmåãèíëôud]^^múüq{ýqxói_gkwêÖÊÄÃÃÉÖàÝÝØÎÉÈÉÌÑæýääçêvpeZUONS[[gk_aluêëàÐÎÖÜëõ~klz^[XUcfxåßåÝü]e]W^[ho]TMHKNOe|uðyjpXYûô~èôomcii\i~k÷ëüì÷óÞùewjlãßÓÇÅÄÇÏÖáóßÖÕÍÌÐØzpêqwòmitga]Xaf^ce[Z`}ÞÚÒÌÑÔ×ßèïzxx]_[Xglþã×ÛæñýtXWfuî÷s[KGIJHP[[Z]_\X[bmkhmb]dlk{äsnþkhk{øøñxk]_|ÞÍÈ¿ÂÉÊÎåÝÕÏÇÅÅÅËÙåîyigïìöìtce_Vmp]aXTeoûßÝãéêßçéßýlr^OXW\~víÙêifXTY[zöêpQNMGHTS\geoÿtqùurëï~úïõùêîúzqamngvòûrt_ZfòçÑÉÉÆÍÏÜçÜÔÊÌÈÇÎÛðò_mjfggìz}oùînxrfQOZZkèßÝáæóìâÞÔ×Ýâxe^o{pæáêaTPOQRfpìÝàgQYSOQZaSW^ZXTYheci[S^]Q^øyliskmýçâæíqn\bøyÓÁÂÆËÌÏÌÎÎÆÄÄÇÉÏßàïppk_aü}z}xåÝòsm^X`]Ulí|^_^\{çèóõëf]YcükâÙçn[[OVYWlçâaVVQOMQY`gbgbðîøãíçtfmgk[_szbV\bfõíåæéö`dnðÞÒÇÉÌÌÒÚåÙ×ÒÎÌÎßÞåèö|öyìçðmaïíÿëîíu_UQY`iïéìööìÝØÛ×Üß}aXVîàíçæÜ{aVVrfsôìfTRMOOLPX\WWVYgd``jÿrdTUg]UY^VMX[ktíØæïegdîÎÌÊÈÄÄÉÊÌÉÈÃÅÍÍÐÛîêçìðàÝãÞáïàÚãæÿõóWMMVZSUUVX_húáâÚæhm`RUqéúrøw_\Y[p÷ýö_\XILWZVWb]ZYenòÞêäíëòa_^bebs]XXXhuçãðtb^QXýáÑÏËÇÇÇÉÅÇÆÆËÎâïick[kóüøíßöìÛÕÕÛÜçòn__YX[UVQWXjéÚÏÑÙçêý^_hkývsy{i]`ôðllcYSQUXV[TOWZXWbîðft}_dc^[WWVSUUTU`úÞßóíjbecyáÔÔÑËÆÅÅÿÂÉÇÒéÜÜèýñïzîßÙÚÛÐÎÎÚáðbofUPUPIKHMW\ñßÙàìæe^\X\^i`pðõéöríæýchUP[PUVQKLWT]mîÞÙÜñæîxãùx{[POQMP]xããßûl_PYdcñÝߨÏÎÍÆÃÃÄÃÈÌÑâÞáòêý\[õú|ÞÓÏÏÊÏØÙòýõg`]MEKGCPeâØÑÑÝÔìxðøìèï[nù\b~íóêêfl\PUVUTMGJSII_w{æÜþþöqfko^XLHKHHRjryàvhe]^säØÍÎÍÈÇÇÇÁ¿À¾¿ÈËÌÑØÓÚçíjïî|çÖÌÌÇËÔÚåvZ]_MIC@@AGQqöèÙééýinnúwp]W[RW^rîñÙébgXU[\RNPILJJVaûéÕÚáÛâñüubW_MFLKQ`zmèÝpóy^ôÞÞÛÏÕÝÍËÊÆÁÁÁ¾ÈÎÌÜçÝæyçï\`e^÷ÑËÊÆÉÐÓçhuePQQD@HJNdopäÝâäæýÝÖîæßpZ_adðâçãì^VXOOUMINKBDGIX{{äÝåú{tgf\UXOCBJJO_løâèüäêáÑÏÒÒËÏÏÇÆ¿¼»½¾ÂËÌÎÑÎÎÚâÞ÷_ejøÒÎÐÍÎßê}fxq^OIGA@BENUW`}leêïßÕâs}û`[asæÞàðvXMPOO`bPOOHFMPjäÝÝÞæigtpêßþVQOIIJMZelóèþïßÞÓÍÏÛØÏÑÏËÆÁ¾¿ÊÌÐÞÛ××ÑÖìszgWfáÓÏÎÏÔÜéyøäÝÛnSQMFFJMYm}òêéóÝÑÑÛÝäüêwiûôèäeYSTMLMORNKGFFBLalíþqkf^[aýç|]SMLBGHK\igqäêþÞÓÒÎÏËÈÇÈÅÀ¾»»ÂÅÇËÑÓÐØÚÙßæèû÷ØÒÏÊÔÞâñi`kù{fQJCA??DJgôaëâë{äÚæÜèíwa^X_þêéa]e^RPSRTTMIIMPVtçÞñðújlmèÛÞækSLIEHN_ôêzzîèàáÔÏÑËÏÚÜ×ÎÏÅÀÂÇËÌÖÝêÞÛéßófóèÝØÊÇËÍÛïvqþxêùfTFFCCK\êâÚìpÞàìßÐÑßæeZZVtíÞä~iRVLFLUQEFA=FGLgíòòòUR_eêÙÛzXODCEI^ì÷mî]ZÝÛ×ÊÅÆÉÎÜÞÐÊÀ»¼½¿ËÜÕÏÜÏÉÑõidfÝÐÌÂÂÆËê[Zff|ßþQE?=>DLpãsiVM\ãÙÔÐÑß_MKMRyãÖç|jJJMSYeoOD>=FPòÕÐÏÓßXP`çÒÒÖôXLCDGT÷ççcYNKgÞÉÆÉÆÏæemÜÊ¿¾¿ÆÍÜ_pÝÏÊÐÙtUR]êÑ¿¾¿ÃÌÝ_V}âÖÚè_LEBIN~ÖØä`\Z]ëÙËËÙðYNLLZïÛÔÝbWQHLWbnOB;9=BI`ÙÑØnY^SRïÙ×åsSGGHJ]àçüWIR_kåÏÅÆËØå×ÎÌÆ»½¾ÀÏÔÔÔÓÈÃÍÝhR]ßÕÔÀ½¾ÅÞóéäñßÖòcTD>AJK`ða^LIS`|ðÔ×éfMJQkcíàyô]MMUbvòfOI?>DTdþÓÔÕîQWtxçÔ×õtUIHOfõÜp`WFKZyãÏÍØØþeýÙÍËÁÃÊÌÙãߨÑÇÄåg\U]qÐÉ¿¿ÊËÕÞßÔÒÒÍé`SNKG[ÿÞ×c\ZVV`Ü×ÌÖubXWPùß÷âoZSQOSthwVD?;>>GZ_ñþ`[\^kÛàäÜÿRDKONqîåðYMKT^äÚÑÉÐÝußÒÏÃÂÀ¿ÀÏÜÏÑÉÆÆÄÏëY]÷çÎÆÁÆÍßêÙÝÎÌÚÙçYD?FHSfqaRJ?DJUàß×à`QMXWøØæèv_KIPVãîb_PG=@FQæáæèùebíðÎÊߨò]IJTZßáþõoQCMYïÍÒÌÒäxvÜØÊÃÄÇÎÖtzÝÙÆÈÈÍéfUaõÔÄÂÇÎÐÖÜÎÊÃÂÉÚ]UIFSeéíbRMHDM]éÖÙßj_[TjæÞØäWQQFK[kòl]KC@>DNWZYOOQN]ÿðÝÛábYVLOcpwz`OLJOjëÎËÍÏÐÏÔÍÆÃÃÂÈÓÎÖâÔÏÉÇÄËÞâyöÙÌÌÊÉÑÎÔÓÆÄÃÆÎÝ^WMGLWSNMD?@AKXhëíðl^^]yÞÞ{mgQSWWzåÞçjRDFHIZd\[aVUqòÜÑÐØív]\\Rfl_YSIEMS`ÝÔÓÚØ×ÛÏÍÊÅÊÔØßùêçîÖÏÎÔÝçôÞàÚÏÒÔÐÖØÏÊÇÅÁÅÎÕçk^WQZYSMJHJNWa~ïîêyejyÿîãüz}ic^_^hn]PICBEFIRRQXTU`xúøçéubWSTPT[XURQOU\rê×ÏÑÑÕÌÊÈÅÆÄÈÈÈÏÕÕÒÕÕÓÞåÞÜÚ×ÒÑÍÎÎÏÏÍÌÇÃÈËÏÜân^YUOLKCCB@EGMNOY]\bpvïöq}úüùzktg[SXSMNNNNMQ]`\^fjøëéñìèkj^XZ]ZRZWNTSWo{åÛÔÞãÖÑËÉÊÌÉÊÐÎÑÖÐÜèþýzkèìäÕÚ×ÎÈÌÎÉÊÅÄÅÉÊÊÛèr^h`PPWPLNNS[Zim~m\joúêëáßÞõlmflaTKIJEHGIPOOOXTOU`bnecyp^Z^Zc^SYSSNKU]oéÝÚÑÐÎËÆÃ¿ÀÂÁÇÍÏÔÖÖÖèpyzìëâ×ÒÏÒÎÔÕÒÓËÇÄÊÏÌÛïzd[QOGDA@FGJQZbXY\\jdk÷ì~ëÙîñuiîõp\QQJJLNRWdccXaþréëßåmi\W`_kc]WRROUSjêçèõ}üãÒÌÇÊÇÃÆÊÏÏÛÜáþvr]\]néÛÐÍÊËÍÏÎÎÊÉÈÅÈÏÕÚØÙÙÛkYSKGGMQT]lotlpêÛ×ßíðn`^ZTTXVQSUNIHJHIHKHJIHLV_Xoßêkm`[UXUSLNRMPZéäØÒÓ×ÕÒËÄÀÃÁÀÈÉÎÊËÎ×Ûâþù~ðúéÞØÕÕÙÐÏÏÍÇÈÍÉËÍÏ×ÜßmWVPIJKIJPXXc`bddkfjôøòplh]_^]\]PLQONUWVZ\ZZUUY[ejÿèéëçïèlZTTPLOTYZ{ìÝÛÝÜ×ÐÌÐÑÍÐÐÒÒÜáââýëßìüëêçîjéåÞÛÙÞ×ÑÎÇÁÂÈÈÌÍÒÓáz]WVSU\k^h~õei_gzíqrðùüyq`YQYVVLKJHLMKHJHJNMLSTV[puvsog^^XVSRX^^~åæÞÑÏÛÚØ×ÐËÉÇÄÄÆÅÇÉÏÖÚâ|mrm}éÜÞÛÓÒ×ÓÕÙÐÏÎËÊÎÖÓÒÖÝêú_UTW[Y]VSU[XTZ_W_ów{øteeZQLMQPPOOTNNUSUYWT\^]húvktf^f`\\[]_Y\qrqüü~ààìàÙÚßÒÍÌÊÊÌËÐØÜÛâðîd^dfe÷îåØÓØÓÏÏÎÍÌËËÐÒÕÒרܿåîuíÞôöûqfg[\]WZhyíÝâíöú[UPJDFEAHLMLOMPVQQYVUTOYVTWf`XYaZ\inôëënyóòçÜÞÝÛÏÈÊÈÄÄÇÉÉÌÓÕÙÝäèéåæïu{çèÛÖÔÏÎÍÎÓ×ÖØÛáÝßéçåèytsþvlZalXXZ_Z\^\^drîçþ{d`\VPLJJLNPLNRTX^_m|ogvo^dcckfXXVTZoáåìñzqóxxz~ëÜÐÓÐÑÍÐÓÖ×Üèäåõ_jxønf^oîâÓÍÈÊÌÎËÎÚÚÙáÚÑÏÒÕÙÙØ×Õàênqüîsed÷÷ismlewx{lbVYXOKIHEFGFGMKNPSY^YV\]SNTU[YWUVVioêíçßûíæìôéäÔÎÍÐÌÉÊÍÊËÏÒÙÐÏÔàãàèþm\aiûÛÔÐÏÉÌÎÌÑÞãíóììõïçÝ×ÞÝßïc^f_[ZU]g_W\m`jixj__`^RPQPKIIJJSUhýftëêaac\VYY\YT[lsóìïõnxùóidnæòÝÛÝÝÝÓÎË×ÔØØÞÝÞÞæõpxkXhf}ïÝÔÍËÌÌËÕÞÖÓÕÔÙÞÜÛÏÎËÓÔÔßææk_jbrõ÷W_ldlé}c`^_]XIKNLKJDCAFLVXUa]Y[XKNNOMQMJO\cÿçþñtÿtåÿwîÝ×ÐÓÙÐÏÏËÂÉÍËÉÌÍÑÝÝÜçøðb[cìÛÖÒÍÌÏÝÛÙõðáÞêßÚßÜÔßÓÑîýþl___[Ze`sjW\oj}îsfbeU]XMNUNLOMKLOPfrlrdXXZVZYUU^WXacaûíu{oikøoyñìðÚ×ÛÒÏÓÒÌÍÏÑÛçÜÞëêïg_aagüqîØÏÒÐÑàÚÙÙ×ÒÛÚÓÒÒÎÕØÐÏÏÓÓáåêéôèycmiczæ{ôðìih[RNJIIICCFKKONU\\V\VJLNNJNMNPRQda]eîyfóîñy|óÙÛÚÔÊËÈÄÂÂÃÄÊÆÎØÜØéñîîlonjÜçàÝÚqpñî÷îóìÔääÛÕèÜ×ÙÞÝæìÚòúørbukd`n]rÝ{éöbT[]URQJOTLQTPO]fqþoV\`WYXTRVVUV[O]mrümfco÷÷ñûxÞÞãÚÓÕ×ÍÊÊÊÑØÖÚéñxf_bibkoîßÛØ×çkjóåîàÝÖÒÒÏÌÍÖÖÎÏÓÐÎÎÑÔÙÝæéâÝõtìêíêèøpVKLOIDHJJIKKQOLPZVQTNNPLKURPUWMQ]^`ilwõwñíëïßÙÐÏÍÑËÅÍÌÉÊÌÈÉËËÎâãßóyvk`~éàßçkwt_X^UVjûáÛßüÛØàíéùÞØÓÏÑÞýÚÝßÜæc|ëíëèg`lWTULCHIPTROY\[dlWR^\lfZMVX]oýVTbdòûknåp÷ìpXmïéÙ×ÙÔÎÖÒÔÛößÙØØàvld\úôn\tüÝÔÝîíþ{}m^U_mßÕÑÚÒÓÒÓÕÙÖÎÏÊÉÌÒÍÍÎÐÎØó÷îöýúkibZMMF@@GKLMNOSQRUMJKPLONKNTQYm[TV^[säÞÝÝíëâïéÚÑÒÈÆÊÉËÔÐÍÓÖÔÜòô|r|ôóæñv÷éèàÙáçó_X]TS]ciìÛáÝãçÞ×ÛÔÖàß×××ÑÖÙÐÒàå÷qmíö÷oYOMGGLMOV]X^ib_kb]]VKLPOWc_cuhjdh^síêää}nù~öéÛàÕÓÔÕÔÚáÜßêîû]WSY\pjgynkêßéÝÙÞôû^W^dcïáæÜ×ÕÚÏËËÉËÍÌÎÒÏÍÍÍÈÉÌÎÓßáâûðûdPLFAADFJLMNLORWTUWTMLHHHJPYe_]]`\k÷àâÜÛäõîëäÝØÍËÊÌÊÌÎÍÍÕÙàügaZWjzþîëppþñîééô|fXTQOT_diwykmñÝÑÐÐÐÑÔ×ÔÐÑÒÌÉÇÊÌÑÙÙÝÜà}_SKHHLLNOOQVSWckg`c]URNMMOTZ_``_^m}îÝâáäîýzëâÞØÓÏÐÑØÜØÛäìr^ZPNSXW`efp|pxéçæïîsg\X\jvîîìâàÝÜÏÌËÊËËÉÍÍÌÊÈÊÉÇÄÈËÍÑÜß÷bTLEBDFIJKHLMNNSY[VPOOKFKJKMPPU[]uæèßÖÚÜÙÙãßÝÒÍÎÏÊÇÉËËËÎ×áâ~dZ]^ZYYWX[]kôòæÞðwhg[RV^efflehuôÚ×ר×ÔÔÔÎÍËÉËÍÌËÉÉÌÌÍÔè~^PNLJMNMKNPNU[]abYTRPQPNUYTVY[]füãÛÙØÕ×ÜßÛØÚ××ÙÕÕÓÍÒÝÚßøfWONMMNQOKLNOO`zöèóûúb\idb~êæßßÜØÕÕÒÌÌÍÍËÏÍÇÄÃÃÉËÊÍÏÎÏÔÙÜßx[RMLLJLLHJKKNWXYXQMMLIMQSX\YRZZ[réêÜ×ÚרÝÙÑÔÔÔÕÔÍÍÌÉÊÎÕ×ìimg\a_YZXTRTUXdmb][XYUOQSTWbbbksðâßÞØ×ÚÛÔÏÎÌÊËÌÍÍÈÉÍÌÈÌÒÛåêz^ZXPLMQOMT`emg`]SNSQPSYbf]]lpvvãØÙÚÒÐÕÐÐÏÎÖßÚÜßÞÚרÙÜñ`[VTQNNPLKKIIMNQXUSTSTVT[_gfag{u}âÜÓÒÏÎÏÐÍËÊÊÉÇÅÇÊÇÈÉÈÉÍÚñosbVTYYPMKKLLNYYPTYTNQSUYWVYYV]kpüØÑÒÐÐÏÉËÎÈÈÊÌÌÎÏÐÍÊÈÍ×ÙÛôhn^[_\[\OOVPOTYUNKJHJKOYYMOYOKKNW[WejftìÞÜÞØÏÐÑÏÍÌÉÉÅÇÑÕØêýgiîì{qtji\]hjlÿuweas}oha`f[]ahúÜÔÒÔØÖÒÙÕÎÊÇÌÍÊÍÐÎÓÙß~qú^SXYZ]VQPNKLNNP_jZPNNPTOYgYVgbYX_rúûuøåÿrçÝØÚÙáæÝØÐËÏÒÏÒÞs_QOX^koY\kf\]nqhf`^a\`yðmnx]TTR_øìÜÎÌÎËËÐÎÈÅÃÄÆÈÄÂÇÄÆÏÒÔáêýl|ãçòûdVQMKMRSSZQLNJGMMLPPNLMLNQONQPRV\d~ÙÝÙÛèâÛçâãçéåßïøhcl~loinqwïäÖÚßèínpouþîêãÛ~b\aer}èÞÔÒÏÌÏÎÎÊÍÎÏÍÍÉÊÈÊÑÜìùZ\auñêñàçýd_gWSRUSTQUZ]S]v^[TSY_]gpkX\^RWZcwêííÞävåêfidfmbUY_XT^XMNMQ\idyäy`}tgÿsyäáíäçwl{k~õûàÖÏÎÉÆÉËÈÌÌÍÓÏËÌÑÌËÓØÛãÝÞá×ÓÑÖÕÕÝßépo_UY\\Yehhi^VSNKNQVYcXUTOMQOMTT]grk÷umbc]V\\bkvnóûp_f[Xfdzéðxò{md{edqoòáówüplfîyöêëÖËÎÑÐÐÖÙÕßÝÛØÎÊÓÜÛÙßâÜèçæèß×êùâáqlql{øòáÔßߨØéêööüwuíÞsbprfpk`]^aôëj]b]POMIHIJQVOOVUQRPRY^bððj`kf__[VW\_}úxxìóïíùqúîåØ×ÚÛØÞÞÞâèÜÚÖÐÐÔÒÏÎËÊÍÓÒÙÕÓÖÜÛêëäétwîóàáâãÝáâî÷`lwmürgxø`lxk\idmðíéÞëabcbPQOQWYUYVLOVRMVUgvqnøtgrk`U\\_]hdøuZ_ngdunöû÷õìh]_ie\_aeu÷}ßâæÛ׿èãÝÙÖÔÔÏÚÝß×Ö×ÒÐ×ÏÎÌÉÍÏÑÎÏÑ×ßêÜßßßèìáÜåéßæíÛàâíqjpk\Z`RNPNQSMJKLKMTLOWY\YONVZVW\Pblmof\gmdfif]}oîæðuónlo~wb}nãÛßãÚãÝÜÜöt÷ÿÚÝèéÜâÜÞãõ÷ðæÔ×ÙÕÑÙÚÞßèãñèØáãÚÛÝÖ×ÙÚÙßÕÎÖØÙäçèùpgkgñíicf[]b[X[VP\VPUWQXXW\_\Zjljjlahgb_[VW_YYUSRXXYSPU[^]dcojmrujcqõìçßÜØÜÛÕÒÖÕÏÍÊÇÉÎÐÙ×ÑÖÞÙÕ×ÏÑÕÖÐÒÍÍ×ÜÙÙàÛÞÜÚÜêäéx~ëòxðnjqc^zöie_TRQMOQNOYVOPRQX]Y_k`coa\fc^llf{n[`peaklgttwñ{eo}`YZWV]\]f^ZcmfoüèäÞçãáéíãÛÞÝÛØÝÕÓÌÉËÊÆÆÉÊÍÍÐÎÓÐÕÝÞÜÜáâáÜçãîáæðçáëýúðùiplèëx{lb\ZZXV`^k^SSTURURPPSNRLKONPSTQOOTW_]cfcdagfabioîkgmköíë÷ütûíëó÷ïéäïéìéâØÐÎÎÍÍÎÍÏÌÍÎÎÉÉËÌÎÐÐÐÕÎÑÚÙÒ×ÞèslupbraX[vuyphflgaxl`drb^\Z\ic_g_X`xxù}}|}f_XSNXnh^Z\Y\TUVSO\`^WRVTRONMNKWdg]ddekn÷èãåÒÎÎÖÖÕÙÛÖ×ÖÒ×ÏËÐ×ÒÒÎÌÌÍÍÎÕÏÏÖÝØÔØÛÛíðìøÝÖÜÚ×ÙÜßãóvpnûÿidbe\WSLLLNWVSXXXQNNLOWjøtklhd\]c_gùæèøy}ml^^\XUY[VQORTVPWYX\wïï}ýëâàèØØÞáØÚ××ÓÌÈÊÍÆÉÌÐÎÒÒÕÒÏÎèlû^ZeûýêçäÞárõæ|üáØØÝÖØÒÕuxéòìÜÞÞßáîÙçYUSOTflfY\U_QKRVOS[UZSVTnWSYb[YXUUSWUfOMOPMW\^[^d^n`nyo_nïëôßÖÒÎÕÓÎÍÓÐËÈÉÁÀÆÆÎÔÎÓÖÍÍÍÍÎÒÓÑ×Üäêôèèúöä{tlX]igjéîïæë{ôm\]e[\}c\[\Vc`_yþbhòu{rfZ^USXTLP\S_eg`h\V\VMRTMQOPPYTVeWUaie÷ïñ|î|ïÞîôãÝßÐÒÓÙÔÛÙÒàÚÎËÏËÍÏÖØÝÖÙìàÔÏÖÏÏÒÙÚáÙØÜÛÔÑÒÌÏÎÕÛëßàôüê÷vöc[USY]VPOVRQ^XTOONRQOOTTZd^]Z[Yem^gmZdcVSNLJMLIJNN\f^[Z[ZuthtðñÕÒØÚÙÚàÏÐÒÑÎÒÈÆËÊÊÎÔÊÑÓÖÞéÙÝèús][òþøîèì×ßóïægvãçÝìààØÙàâÞkuÝôýúfaþgW_YKUXXi[]`dhXg[O^^a]S[`kwiübX_]\TIKLKLLOHHHKPOR]`ihl{[]büäìáØÔÐÍÉÉÍÉÈÄÄÈÈÉÊÉÊÌÑÞßæÛÙ××ÙÞáâêílrv|nu{gjwèÝßâÛ×Ýæáëc\]Y^XOR]TZma^\\[g\XSTLQ^WPYV[o]gýpXkeZTSMSNGDEEDT]ZWVOYZ[YdZYxñêäéëÙÙÒÎÉÍËÃÀÂÈÍÏÌÎÎÐÍÕÍËËÎÛyýñ|ïøûkûøìîybòáÜÔÒ×âÕÓÍÐÚëéÿ{èínhñðÜØð`i_núo\ZdemmVNWTbÿmVXb]^YMIFBHKMHJMJKLA???EJHHSYZYd^akñ×ÊÏÖÌÉÊÊÅÉÊÈ¿¼¾¿¾¾ÀÁÃËÑÖÑÓÍÞåãó_jí~yûãâ×äãäå~íçthrèÝÓÚÛÙÛçÞãòegkktblxkbxùqkjfnriojc__YYYYZdkjpf__\OKHIJIGEIE@CGGLOYh~øìëðóñxúáâÞÒÈÇÀ¾¾¿¿ÂÄÆËÌÊÎÓÍÓßÜÔÜÚçîáÝàØÕÞàêßoiÞíñÏÕÎÅÆÊÄÅÌÐÔÒÛÖäÞÚlVf]Y\U]ioeò|YNNDBAAHIJO`^[Yd[[VRXUOMSOJHMLQPM][Xaûul}qahfvåéèÓÌÏÍÆÆÈÄÇÅÅÇÊÉÈÎÒÖÙ×ÐÛÒÎÓÙÕÛùdbWONMWXZgäÞáÞØáÝßàÔÐÑ×ÐÏÙÝÜßÕÙÚÏÑÛèÞíhbYMMJGJJJMRMMWSLOOSXXPMPOOUVTVPPTRMNNKJJFDHLOPVcêçãÖÒÓÔÖÚÖÒÑÌÈÇÄÀ¿¿ÀÄÇÄÅËÊËÐÒÑÛøygiöögzùoïéòxðïìãìzëåû{ìñàáîçÜÛäÝéêóþd^SSRUVV_]Z`iZXQQNUPNNOPVYTVPPMYOLRTMOOIIIHHTNNZ`[xì{þ{bdälhïëïÐÐÖËÅÈüÂÀ½ÀÉÃÉÔÒÍ×ÕÒÜÏÏÙÞÞûzïgYln\r}gvâêÙÏÓÒÈÍÑÊÐßÓÕëáâmkùYV_QJNLKURHKMEILGJOMO\WO[^UhkPXfZVZOMRJHRXQ[][\aUR\WP]ibìêïàÓÙÚ×ÙÚÏÏÙÐÎÎÓÎÓÙÛÝëÙ×åßÝÞéÜåù÷v_k~uyìïíÐÏÕÌËÔÍÍרÕÛèØ×ÝØÜîÜÜíß×àöíiUZRJPWWUNFEJECKF?EFGKMHHOQOWPO_fvîçí÷ó|xësa~àááíëççãÜÓÜæäÛÜÞééæ×Ø×ÑØÛÔÏÓÖÛÙõìþör[OY^XXZ_Vb^de`\þáØÔÔÐÒÌÏÏÑÖÒÇÆÆÅÂÄÆÄÉËÔz{âúýùèîþlZ[\PQRQQONLNRLPOIPOQPWXQOVPRMIX_ccïéçÛÖáÕÒÒÏÑÓÖÎÏÖÔÓß×ÛÙÒÔÖØÏ×åê÷mv]]ion{ÜÚßÙáëé|ðìôlmõ}yì{ioöõ÷í÷ìØØäÝÜÜÚ×ÓÎÎÎÌÉÌÎÌÏÕÔÍÎÖßãçâõw|dXYfhighcmiXUWY[__^`cuäîóûtjrucZ]a\bfjh`^dljný÷ïèúûvvþu|||åâÞÖØßôñý÷yhnîû{ññÝÞÝÛØÒÑÌÈÊËÐÒÖÚÖÝâàéßÛÞÕÔÓÝðvwotcimrî{êèßçïäÝéßáâæskþáãð`^goa_ee^hvdce`j|_\jÿòÞåèèèþüëûp{WKQNLLLMVTR\dPOVTRSSWgd[_|c~ãííÞÚ×ÐÒãÞØþðàßÞÞÛÒÔÙÞÐÍÛ×ÔÖÒÔÚÛÛßçàçâÓ×ÜàãÚÞænchWS\Ye^\vúlpëÚÛçñqê{mrb[g~êêírøêtkpk\^ZUKKINLGRd[]_\khgLLQY^ZLMRSQNOMWYfçàw{sþnfchëÞÖÏÍÍÊËÍÏØêãÛÛÚßêåéíò~{üvýçÓÐÙÝâßåînf_eùênpúüêúp^cclodYToítWRVgccxßÚÒÑØÜlZ[][høíàÚßêù^UROJLMHHIKPMCDKJKUZ]h^]bZKIKKO[V]èéäØíjò~fsãôãØÜÓÎ×ÝÓÛßÎÌÐÉÆÊÇÆÓÞÝìîÜê~ØÕÙÓÕüot_YfZTiz{úø[PPKMYQ\õucZTPNLLS[\læÚ×ßöè÷ptøu`dníÛøqýlû{ôzìßãáâ`[VKHGEELPWu}\lÿ\^aTQWTUtkXui[c`\néëÜÍÙèÛåóîo~Û×ÕÍÈÏÐÉÊÎÌÙÞÖÖÜÏÌÓÍÑÙàårìÞåýÝîc_[RTPM\Z_mñlûïìwrYOQKLPVQ\^]_gX_sdgõðúízlgaR^]QaïêÚÒÐÐÕØýþi[gmpjôøøçslyswßÙÓÕßÛàoe_prkñèÜÛáÛá|êîspvúæÚáî×ÖæÜÜêçóyÚÖÜÞÎ×åÙÝâãêðÝ×ÚÑÈÖÝÚ|_ZMN`d_üàkoíj[aUiàôiufQPULKOL^ðçæÔÝkhbWUXR`ïûðÞß÷âÛà×ÙÛÍÉÍÌÎÏÕÖÖçíóñåØÚÐÍÍÍÌÓÝíëíäþçÚâØíôðpV`c\bY[cl\furUchúãÞÙ×ÒÝãÿsg÷÷àßÕÏÊÈÌÍÖÙãÙÛÜâãéìn^ZTOOY\üräÛ×ßíühXMTXZW]eð|÷ølfe{ôìoøÝÖÞíáâuy÷êÓ×ÍÿÄÈÉÏÚÚÛØÎÏÌÅÄÊÏÛünë|{ãszÛÙÝÜíVPWSc}nàÎåb\RFEKGLURpÕêëæëíßê~ÝÝ{àÔàÚÛìjíîàÎÍÓÇËÙÐ×}ghROQNI\]Zo`_üy[húwmÖîôÝò^\YSoåàÖÌØÓÊÓÞà}dìÛçÜÍÔÎÍÖÚÚäïÛØÝÓÐÛÑÔâpvjaóàèåø]dcXOSOS]]Wi{lëâí_g[UXWQUQOSWLKVTXh{héßëãÙîo{[U]^XyóíÑÉ×ßÙõcmw\itføkLKLJLXZXíäìØÔñqnngÿxwÙÛÝÓØäßùotÝë~ßßàà{iicüùÛéúìimÿztmqwcsstÿñÛçèáwdWRZVX[V\Q\_QVYZ\_`\X_U\RIFA???@FOVPf]WVW^adtöðýhåðæååâÕÏÎÒÑÑÒÎÚÜêé÷ûijvp`hvmj[hûï~éòwvxw{îøýypilc^evvhZORONMYaf~æàåûeqôôwëôéßÛßÛÛãÞáëðæw~åì^TOMNNMMUOR\`\XUP\^SOMIGGGBBEEJNOU_^üÞÜéîßìÞÝÝߨÖÒÊÊÎÏÎÐÉÊÎÔÖÝçêâøûåöua[RVUdûú^^iee^]Sdc]kÿ^jm{ëpbit`iõ}YfðinúíyòßÑÝáîýíætýæyöëàìèzxöëfkkXZY[S^UXgcUkp`hïòbnYSWYMSNIIOOQb_bêÚ騨ÜߨÚÚÓ×ÐÊÍØÎÎ×ÔÎØÕÐÛÛ×Ýïölfjf[h~jþóc]p``yöïèßßÛéxtèìõåãêâçõÞÝãèý_fd[\plh÷qzãï^mmdhqká×çÚÑÒ×ÏÔÝÕß÷äÞööö_Yf\^zèå×ÓêÝßfV_TNNOP[\T]_V\óózØ×ÙÌÐÖÞÝôæßÕÚÏÌÐÌÚ×Ó×õãØÛèåßæÚÝ×ÝçéìÝâóówrîåèðïëöèúo}uóôâÚÜôpúèpkñíðìÛÞÜèðîïwïçñéææòtd^amoÞÙÒÎËÊÊËÛæëmiøòïóíìòõu|ùðàÕÝòón_UXLNPOZf_\vâÝÏÔÕÙÎãÚåÝï×ÜÞØ×ÖÔÏéÚÛæïÞæèãÞÚÓíxèÎeÞÖêÒÙûguRRZdltlñáôl÷ïy~åàêæàÞëóâÜíñÞ×ÕÖÒÖÛáìñél_gk|þn[mînáÖÙÑËÈËÓ×ÚÞíëØæ_læðìîòìäéèÞr]_XZuj[U_^gýZQV[_ggrqikÛÓêrïïäÖÔÏÓÜÝÛämqnmàÖØÞÛáÜÓáøótøá÷_\SKT^XUYYanotðta|zkýêûæÜÞÜØÜëàãâÚêòæt]^eWXjgkk[X]c`øèòÞã{õì÷þ|öçÜÝ×ÒÜãçóó|ZTT[]VWZ\XQWZ[l~ê÷{mUZ^ZcZ^öæèáÛêgljiëq[R^g`\]iìõüéd\dlîvkZOWZ_[SU[i|åÞáèèåßÝõm{éÙ×ÒÒÑÕÓÑÐÓÛêáÚâòVNKROKKIJQTRXOHKQPUMHGMNNTSRTTVo~køãê×Úñ{çßêÜßàÒÏÏÍÑÞéåüâábZdzoåÛáÞàrîãoqy\^_PLHMLRZObebvÞ{VULIMF>A?CIVQV[TP_c]ëéîäÛçìÝÙÜÒÍÊÂÄÈÆÁÈËÊÎËÍ×ðôäðßÙël]SLUPILHCEFEEIKHOOP^^MRRLOZNMLHIJRSþëpììmûÝûùíg^zólôÞêÝÏÍÄÀÅÿÄÈÃÄÉÎ×êèÝÝÜÔÜéáwkãó_eRMOJGFD>?GDHOKEDGEKLLOJKR^uïÙÞéÚÝàÐÔÙÕÕ×ÒÒÒÑÎÌÎÇÄÄÀÃÌÔ׿çÚßìz\abtzôÞtgm\^WQTIFGGKFGMIKW]izfYa_TZTTQJJIP]VmíjôëéÓÍÉËËÊÇÄÇÆÆÄÇĽ¼¾¿ÈÍËÍÏÑÓÜèíúhýhnoUMMRLPTMHFFIIKNV`]èÕÖÙæüñìÿwõärrüþÛÓÏÌÏÐÐÏÎÐÎÞÿgbusöacùÿîÖ×ÐÑÞáåé}üog^alïßÜÕÝôqsyþòômeXXe_YOQQV`qèìkhô{nîåäêÜÔÎÅÄÆÆÌÐÎÍÎÌËÓÔÖÞÖÏÎÒÑÎÐÑÏÏÑØïðm\]]_SNVUhèß×ßáêßÚãÜïhrX\caaVhtmïæÕÔäÞåûjd^PLMMWhøÞéû{ùâéàædûrsîíß~ëßäÔÐÌÈÌÍÐÒÜÜÒÝéáäÞ××Ó×âykkjkkWVVTbqñþûîìÙÒÐËÍÍÒÚãuísanîéÛÏËÈÉÎÒÐÕáöfXXTNScojýð|äÙÓÕÒÎÒÔë}ý\XaehpÿíëÞô^hpnhg^UOMMQLLQOUZopmßî~í_e_\asÚÜÛÑÐÇÆÎËËÌÑÚØørüvÝÙÕÕàÜÞäìlênT_WUWRXM^ôväæÛÒàÜØÛâçÛq^sgjüvx_ewóßìÞÞìÛä_YWSIIQOZ^zë~îßàçäÛòmðóëàÖÓÞéåæÜâææmflfllcRR_\YZ`aPX`mwbeSMOTXX_g\`ùëÜÓØÜãÞÙÞçêwbT\uïçäÛÞàÛÕ×ÞïmTOT\k^adWcöëÝééãòêñþìmeZNWab]]l_c{ëâm^\PPUYRJNJHPTebZh\g~}íòèônþòÞÜÝ×ÝãØÎËÎØàri÷éâ}ûðgùäéçúñqbfe_XYRJJNONP_[]tíàâà~aUUSLOPONTqøvâäûóñÿ]cj_[Y[]Xaød_iìêâØÝîòqtwòê_^_iqjîùcnol_aûbXWRLKKMMMQUW^s_OOQKMUTTYixéÖËÈÍÏÍÒÝÔÒÚÖÕÑÜÛØÝ××ÛßîÝÖÖãåÞqpîû]VXSPeopûk{t[dôp{f^POSKMS]ZXmwxk_[KHKJJJONM\ùëçÛÞrkkvðÜÖÚáá×ÛÝÛÓçpóèÞ×ÕÕÚØØáß}lSLOMZagkZ]YTbtãù_\SS^quzüæßÒÌÕÜêîóbuáæxvêåÒÍÕÒßåâõåÔÎÕàäóêÜÚÓÛæûõéÕÍÒØØÖàÝà|nXPOQ]_g`XXW\_]WJFHEFLMQNNOZìßón[[VWrhíæîÜÕÊÌÐËÒÐÎÏËÉÃÆÊÐÑÏÎÔÚÙÝýïäáÝÞå~úëÝl]aXSP\ZVolixmííÙÓãgUaa_îæóztíðåãíúùìë}mðo]h~èÜÔÑÙÓÒÑÎËÆÈÎØÛÜØÎÐÜëéÝÝØÙÚé÷yrmZSOJHEFJLXOOMK^yãüd]VeýçÕÕ××ÛÐÍÊÎÓÖÙÖÎÒÓÒÚÚèäÛØØäÝäøÛ×ÒÖÞÚ÷tïÜÔíèêýßÛÏÓÛÔÝèÜÖÞl]XQU`undikXcèëp[iZV[_n\_[V]uâêöé{ôÛÑÓàÜÜÞÞÙÒÕÖ×ÑÏÌÇÄÊÍÍÐßñôîäòóðäÛÞâéääîëÞê}`SSW_ab_X_ggîþý~btvöüsêøéülámem^g`xénógalhÜÚzãæäÞØËÒÊÊÐÎÔÌÑuëâçîôÐßâÛåØðåßYWVLHEOKFICFEMlSMVSPQywTgmnýxÑÚøääÞäÎÈÑÎÍÑÜÞËÎçxùæîÚÎÔÐÑÔÛÜËÏêiwú|èÖ×ÛØÛìkÛÖëq^YLJW[WVOLHP\PIFJIKSSKJLNNQ\ei^XRN[~éçèupzÝÕÖÙßààÙÚÔÍÈÊ×ÓÒÎÌÞëi`øtðêãå\^hgulkUHJIMY\kTOTM\h^VHSZOZclQMVOYgrxOP[SaïÜë_txuÚÌËÙÞÓÔÏÈÂÁÉÈËÒÏÈÇÙåÜåéÜÎÏÞêh]V[mSJD>>>ILFGB?>COIFIHIL_ônfZUR[ëést_W^þÑÖÛÛøgl×ÐÜÕàu{æÎÐÐÓØÞÜÎÌÖØånwàÔÎÍÐÖw\xáë}lSIMQWZVRJDGKGJI@?@IMOVOOKQ`cke^Y]ðâÙÍËÎÞÛÐÍÍÊÉÍÏÌÉÅÆÅÆÍÐÔ×ÕÕÞyjüþ÷ÝÞã÷il_YZXWNMNQXW^\VXKJKJOLMOMWZaebcb]]`[[TXOS`róôj^_÷öçÜÔÉÍÔÍÊÄÆÈÉÐÎÍÌÌÎÎÐÒÑÏÌÎÑÛõ_WZVQTTPQNMW\]XHCEEBEIKJKOPY\XYNRj_nlo{cîÙÒÍÕ×íåÒÕÌËÈÆÎÌÈÄÂÅÇÔâÕÓÐÎÖÐÓÔËÈÉËÐã][\XWQSPT]dj]sfJIIIF@GHILP\[kdQRTZZUa[WfõØÜÜÖ÷ïáæÙÝÏÇÊÈÅÀÃÇÅÍÐÑÛÛñßÚáÖÓÌËÎÍág_\\OQTPWknb_mbYRMNHFJHJZa\Xk]T]\ebdj]fyÚÒÙÈËÚÜáÔß×ÍÏÉž¼¿¾¿ÁÆÊÉÑÏÎÚÔÌÅÄËËÌ×ÞðcWOOKIKSa\i~dZNJDDICEIN]Zdgdc]`V]v\apîÚãÖ×ßßîí]\íøíÖÐÊÈ¿ÂÂÅÊÔíÛÕÞÕÑÌËĽÄÉÎÐædóõdgmý]dé~nhnWGKLHDGJEIPYWNTPHLX__iì÷õÌÃÇÊÊÉÔÙÎÍËÇÀ¿Â½¸¹¼½½Ê×ÒÛÛÜßå{äÎÎ×äãkLKRLLVNLR]k`]eYLKNKKSVQN[lU[_OLIPWP[[W]tÛÝÜÙÿg[]xwÚÐÎÉǽ½¾»¾ÂÆÌËÏÌÉ×ÒÎËÇÊÉÎÚícec_kVNPV[PXXLHCAACIHIONSNW`SJJLKXüvgîØÒÐËÉÍÙßçpgßÏÓÍÅÃÄÀ½¾ÁÈÐàóØÑÝÜÕÏÐÍÄÆÒæyhVj}\ZU]YPX\PMKG>>FFCEEGILWKC@A>;BKKP\{îßÍ׿ölbYlÚÝØÎÇÁÁ¼¼ÁÀÃÌÒ×ÓÒÝÝÛØÚÔÉÖàåi[Ualck[_dYvgPOIEBAJHIMKONONGE@B@>HNNTXxàÛÏæðzU]W^ÜÞÕÏËÁÀº»¿¾ÆËËÐËÎØáôÞíãÖãëh[]V\^]^RW\SYPIF>>==FJLPXd``]VPKJGGN^^UeäÜÛÚÞîp^][[ú÷zØÏÌÊÇÅÈÍÏØÜåæÙñîàëß×ÐÏàëêèùùã~lh]_WWZLKHB>=DHIQOU`TSMFE@?ALXYcûÝÒÍÌÍÐÒÝêíãÔÖÒÍËÇÅÅÅÅÉËÒ×ÖÞÝÞçíyðàéã}kf]nôøäèød\r]WVQTJINMVZ`h_írSRNMF?CCIQR\We~emh_TJPZ]ýÞÕÔÌÃÄÅÀ¿ÀËËÉÍÌÎÒÙèÚÔÖÏÐÒåíÜÝÝÓÛýd\^WQUNGFGIK_õkjk{paYVOKHIJOZZ\fëäúüî\WROSZuîïâÓËÎÎÄÊÏÌÍÎÌËÏØÖÓÎÉÉÂÂÈÇÈÊÈÆÇÏÖÝ~lklbLGIFHJSVVVPOPRJC@A>?AKOLRcþåâêt[{cXbûâäáÑËËÉÇÉÍÍÎÖÖËÎÙçëãåÚÕÓÕÒÏÎÎÈÇÌÒÒÒàêâêõk^_]k}{êæî{`liMJJGFCHKN\RNUjúbSW_[]ix{éåÛÓÎÉÆÆ¿¿ÄÄÉÅÈÊÉÎÎÌÉÆÍÌÇÌÊÈÅÅÊÍÑÙífgVOOHKMMNOnu_l[_^NQI@EDFHMWMOTXuaX\X^\^o~ßêýäÚÏÎÍÆÊÈÅÇÄÇÇÉÑÐÑÌÆËÆÉÎÈÍÌÆÆÊØÞïqðnk_PYW[oyáùbiZ`cSOEDEBLPT[RW\aèïm_X[WaqèçõïlñÍÍÎÍÎÌÌÂÁÆÂÉÙÞ×ÎÍËÉÌÊÆÃÂÁÀËÔÞrîþwkRQLINR`ZOPKMQPOF?><>ABDBDEHO[qk]b]ksìÚêåëvïßÏÊÎËÉÍÊÇÆÈÍÚèßÛÖÎÐÕÓÏÌÏÈÈÒØÞãûqÝèg_[YU_þyl|ê÷dîùVLHFFEIHCCEIHVgRMPURKQYTXZ\TaàÙÜÑÌËÍÉÃÆÇÅÆÌËÆÇÉÊÌÌÎÏÉÍ×ÕÝômz{\XTOJFGGGLPOPOTKHGGHFCDAFJFKNWZSV_[ZZ\XZm\]egefêÒÒÏÑÖÞêÞßàÖÓÝéáÚâÛÔÕÙÜØÑÒÏÎÝÿêäwy{vUNV^}éÝýTZYOPLNE>?@EHNYLN]Zdmõû^hrýßÚÐßtæíßÑÊÇÑÚØÞÒÈÄÌÝÔÝåãßÝìzþqvîÜå[XRO[f_VOLKQfÞÞxdWLM\gVPMHIN`n`]QPSbínn]LOUîÚïçf[cìÎÔÐÌÞâÞÐÇËÊÒùdmÛÝæ×öbmêÐÒÔÛfZX}ë^lVJJSúãßâ\NL]÷b|{ZJM^k÷ßlOM[ðíÙÙxW\ñ×ÎËÒô]}×Ú×ÍÎèåÖÐÊÁÃÍàÛÐÒÎÉËéfîíàÑÏäPIPVZPMKFJMRmñpNEIMX_[MHJHLhâÛqPWiîÛÔßiqëéÓÌÌÚqcjñÚÎÊ×óüåÍÇÇÌÔÝüúäÙÕâñnoÝÔÏÒãêhlãÖÕziv]lßàßýZPR_lój[ZIJ[kzj]LESc^bYZQPvÝÖçëêcöÓËÉÌÌØåÎÅÁÂÆËÜáØÏÌÒÐÞuïÖÒØÜâ^Zh|çùjeWUí×ÚîíWNUcäàÛâj^`üÝåÞgOOP]`]VKMXiéûènYkpãÝææc]bnÖÓÎÎìæÛÒÊÉÆÌÔÛåØÕÙàkixúÝÞØéoðêÙÕÜê_TTOSXlmZ[WeéçÚèojV^_zpWY[`}æâæ{úóàÛÑÍèóüoîÛÏÎÛàëæØ×ÑÚèãmfwöílh_kèÝØÝåãssáçó^QSMP_päñùzfà×ÚÚíp[SY_g`XWW^ðèåßÚàøÜÑÓÐÙðh^ôíãÚèåfkÜßÚàærXrgby]XVP^snôôlXfüpìÜoUSU]öÜåÞcdçèÜ×Ùî\[\Yjio_mæçØÙÑÙùåãÕÏÚÒý\ùüØËËÌáéîÝÏÝÓà_\OX^ftNU[Wûc^ePVUcw^cNGKHSfw|[SS`ÚÓÑÛtgWbéêÜú^_^úäßßìêýèÕÖÔàmdgìÜÓÚës`aäÐÏÖâlY`wçäð^YY_ïæùnf[YlçîmVLKLT^b][TQeà×àþr]WX^cYRKNVâÑרààèÖÉÄÉÚy_pßÜÙÜåán|ÙÎÎÙêvem÷áÞiVNMY_fcX_akàãëhOLHYfrvWTSQmãÞÝòsXTVQTOJHDL_múrön]f_krYPQYâÜäéöìrçÐÌÆÊÙágönftghX^ýêãÜéîúóãòæôZPOY\coli^kÙÐÍÎ×ßf`XS\[VRS\afæìðymu]_b_ZVcpéÙÛßíìÚÛÕÑÚçknmwâÚÚòfecoçìúcdfexufSMNLP_nèçðÜÞÑÉÏßømiVfzl`V\dþÞßèÚèù^cîeVNOVXçÙáÚ÷lciÛâuþgg[cÚn`dYTOdoZvöl_sÏÕÝáîy^êÓþßÔßÞÒÄÆÍÍÔêb^ësnçú\ZÜÛ~ïäúglÞßêõxlhÔËÚØÏÚûúÔÙßãçï[jëý|g\MEQSNQS_T_áîøj\XR{ðzøêÞðâÉËÍÊÍÕîñë}ric_Ujìecie[]|nk÷thiéÚíîåæêߨÙçÜÚïéÙÚØÖ×ðf^XaSNSP\øåäôìfQZ_vi_pmtâÒÍÙÓÒçàà×årëj\nnêòçßþßÙÔÝüæe]øèÔÛÞÚîßíÚÐÜÏØæ××Î×ßÛpie`]PZRIUbóÙàÙçkh_o`mø[kçÜÍÏÎÒâåòî÷ho_\eY]WZbXTTWlgpd[g_jæÛÕØÝÙÝÚÙÛÞèÙÚÜÏÎÙèý~cX_glc[[TcìáäþûuuêíãçüÜÜÐÈÈÅÊÎÔàÛÔâëbZZZe_viYPEIOOXTWPLTWrî÷åýêÔÚÐÏÏÎÕÏÌÌÊÏØýx÷rõúeVJOVYa__ULV\lâëáw{îÞÏÌÊÌÔ×ÙØÙ×ÒéôýýÛÕÒëYPOWXKOTRRINfêrSRXexuåÜçu\hÞÐÑæ{g]lûéÛùþovÜÐÕìo\^f}ßÚáïzxãÔÐÓÖâôpæÝèãiYQQbr}ëök]]irýv]atæØÙßêzhdyyðçàíkê×ßÛçgYPVPP]WONNXlsbi[U^ckììxmð×ÔÍËÉÌÔÙÑÕÓÍÜ{kù{üêð_RSYVUZ[NIPPT^imWWZkëß×ÜÝ×ÔÈÄÄÇÏ×äîâêàñ][[]~tcZNQPOMLOKMRVqè×ÝëípãÝÚÎØßåèÞØÒÔèóddpúvj`ZXRUWXZ]Y\f]norëíçÕÏÎØÝØÚÚØÞÕÓÛÝaaîóqjckZSRMVZ^aYbjg^cüöîîsojqnjns{ìot^cüù~hkÿudlZ][Zi]^jjzmwð{ââî÷ðëéôúéÞáæìâÙÏÏÝèçíý~ôÙÓÖÔ×Ú×ÝÝéùòpwûmù~ib[^p_d\PYRPRROPKIGKT^ibkhboåÛØ×Ö×ÑÑÔÏÒÒÎÛÚ×ÙÚæïî`WJHIEKICJZnknäÖàÞÖÒÎÓÎÎÒÌÈÇÊÉÃÈÎÛÙÝþgQKGBB?>@DKLJQQQXM^aWqjuórÚÑÔÑ×ÌÈÎÇÁÃËåê^RQOIHOWkñéÝåîåÜÖÖØÞsYY\dd^øüjåÚÎËÏÜ]LNQTSOUOUhóÙÞô{_ýÚØÎÐØßsofþäéîpzèÝÎÏ×ïYSPSSNORS^gýÛÒÏ×ÓÍÎÓÖÖßþ}ïp`|ìurî××çxjNHKNJKPTVMQh{óüèsìØßØÛæâôàÛä××ìèêÚÕÛÙù\SQaXOZSMMTcwÞÓÖÛÕÍÒÏÎÓÖîåÜìÕÐÛßóçáåó_TSMGGFLLIMOYcîÖÙçÛÛ×ËÉÆÈÏËÌÑÏËÅÈÌËÊËÌ×ÙàiWKF@?BBCIW[gp][]hljòðcYRT^Slõï×ÔÏÏÝÝÝýhha`\ln^evúèñne[WgyóæñëþkltïÝÚÕÍÅ¿ÆÈÉÕÐÔ×ÑÜÝÙìéØÒÎÐÚÜtkÿsïgX[MLXSY_X^\_ãæm_QLJIMKMY^e_aó÷æìóèÜÝÕÍÍËÍÔ×ÝÕËÉÌÐÔËÌÎÔèzVIG@CHHNKMX[iïåÚÜÔÍÊÅÃÄÇËÍÍÎÌÉÌÓÎÍÑÔúmXIEB>==?BBIMINQZnüðìüíéçÛÚÚ×åßèëàÝÚ×ÛîhW_eROLO\jÚØãßýéèðÌËÍÄÈÌÌÒÌÏàÜÞèëièÛìÓãc}gïéX]SNWSdlY\QJVYnßóòûzîsóÚåßÚçäåÙÌÎÕî_`SMRNPYX\e_o^YYZfjzáæÜÝíçäÔÎÐÍÍÒÑ×ÍÉÎÙùYVVWY]ZXRVRNYVPOLNRV_j_YXU^^ef`wruïÞÑÎÓåÿda^dnfkü{ëÚÑÉÇÈÆÇÅÆÈËØñôe\b\VWLLNOQRedWSYVVRLTPOkgôæßØÙØÎÍÍÍËÊÎÜÛÙâïkn]T]_\\\_ePVZS]]UMGLONY_ö{füÝØÖÏÌÌØÛÔÛäÝÛÛ{yæûåßßã^apWPY\M@>FJLNZhTX÷ìàÙÑÍÏÙÌÈÊÆÉÊÑà×ÜßÖØØú]íöíî_h]OXVNOPJFGZbPPZjWSew^fîx_]qâqlêè|bõÒÞéíög`gíîîÙÏØØ×ÕÕÙÏÔßÙÔÑÐÜÝÎØÝÛÙÞqb|abs÷ý]SXSKOIHFMiaZ`X]X^á×××ÛÙÐÒÍÏÙØÝÜÏèæàuñTLMRWKC@>@FGJMMVWX}ëåïâÝÝÏÊÈËÌÍÍÒßÉÀ¿ÀÎìxYh]TZ[d_Zdlg\Ynb\çäìî÷gk_eíàÙæÜÔÞçî_R[NUSSgbú××ÝÝÔÍÔØ×áðcbn\`l_XQIKEGTSNMAEFBINP]mÛÓÚÏÊÍËËÀ¼¼¹¸½ÁÇÊËÎÄÀÊÑÚÌÉÕâøNGFEB<;B@?A?GKMVSMPMSYgßâùjrÚÏÖÏÑÊÄÀÁÆÎãëra_gìÜØàbZXZgvzsuo\YlmrzûëÝÔÎÒÓÑÑ×uhidõù_ZZ_{êÙ××ÙëæÞæÜÝàßê}ðo^\^ZLJP]k]PKE>DKOSWgùöÓÏÎÉÇ¿ÁÄ¿»¼¾ÁÄÉÏÎÌÏÎÜïu]dz[TPHA?A@@FJOOMPfm}òéò}ïâäõñélngæØâÚÑÕ×ÑÑÙÚÞÛÚÜéÙÐÐ×ÏÓÚÜÖÛäâæïmb_^ci[TUZVZYoçåÛo_dT^_TXS[zwâênñòsëðáÚãßçùäêåÚÙÏÝmÿìÞÕïbTJHGFIEFEAGMV_`ùôoáÙÔÉËÉÂÆÄÃÅÀÂÁÂÊÊÇÌÐ|XPBA=<=<<A?>BCJOPUjoðÙÐÉËÆÊÔÎÌÉÃÉÊÈÊÄÆÑÏÝõôd[XOZ_]YSX^_jmõéx[]VWWJHDBFCJP[îöUUV`u_xöhçÓÌÁÄÁÀÇÌËÆÁÆÈÏÝßødø`_[KIFIZOEC@?DFRPP_VZûñÎÌÑÒÛÝÔÕÊÈÍÂÇÍÌÍÄËÚÛ÷|àÛæùVNICDBGNIJGGIHKPILTR[WfßîìôvÜÐÎÊÊÍÆÆÊÎÑÏÖëí\MTZlóaôo`áÝØ×üÝþ]|îß×tèàséÜÎÅÌÉÒçúðmîZU^dqt|ÙõóâèÞÕÒÅË×ÎéózY_]NNHEMKPKAB=?GCIGAIGHYa}ùjäØÊ¿½¼»¿¼¾ÂÂÅÄÆ×ÕÌÉÇÉÐÏzimlhTS`RMIHNNIJGJIJNW]lgj`nìåØÛêäÝÒÐÒÍÎËÐÜîëåÙÞëëîï}d][^\\_iiq^VPSWb[]gûååìojqpenciqvòèàÓÕÍÎÎËÍÑÑ×ÒÓ×ÚìoýddWUWRNZRPOGKHCKIVpvßßéØÖÑÈÀ½¾À½½¾¿ÈÄÌàÓÑáñ^p\YXYXOOOLABD@CGKLIKMJKM_`W]hvkg{kZ{ÞÚØÎ¾ÅÊÉÇÅĽÃÌÎÊÅÅÊÈÌÚêãÚèggUJGDLLHMNPTNPSZäÛöùnèîlæÜâØØÍÎÚÒÍÝôjßÒÙ×Ï×è^an[làð[JVhVSSVLFHPHCJPNLSpõàÔÍÈÉÇ¿ÃÁ½½¿ÈÌÍÎÖ×ÓÞáìÜn^VUL?<=??CLIDELV\}ÑÌÎÒÒÌÍÍÈÉÍÌÌÏÜöÞÛæ~cd}iq{YR[cdezål`PSfjéÕçpeWWURTNMFDNOataWVanñèÖÔÎÏÐËÍËÈÌÌËÎÌÏÐÍÜày\_Y]pgUNLPRNZ[SH?CFGWce\P]mvîëèéqÿèäÛÎÎÑÖËÄÄÈÇÅÅÊÎÑÜÛÜãmXRRMIGED?=??DKPNJLR[_lèß}pvÞÐÉÀÇÍÎÎÌÑÝÜåtc[cgfû`YegëåzçîgYOWlsï}ithôÝìÝâôòeXbzÚÚçØÚÙÏÏËÊÍÏÏÓÓÎÎÛ}ûfYYTMHA@?;;<>=<?@BLW`ZZl{wñ×ÈÉÈ¿ÁÄÃÁ¿ÆÎËÎÛâÝÎÖëÚÛêãÜÕàhgl_W^ô~WX_QPUeZTUWQLKW[ZYd^fþØÔÞéÜàíÛÓÕÔÎÉÒÛÙÏÖìq{p[Z{w]Y^^USdbZ[^yl[sj`^dvjiáÙäk]}ïùäÞåâÜÔÒÓÕÕèýqôðm|àèîäfZUUYOKHHMJL_^^tßàÜÏÅÄÍÎËÉËËÄÃÎ×ÍÊËÎÊÏõWX^UMNVNGLRNNMVTJIQNLOUUPOXY[b|ön_kwaoìäîßÎÍËÈÃÃÉÅÁÅÐØÒ×ëúÞßçâÞÜhS[]NLRXNHNY\Z_îvòØËÌ×ÝÞãìêÙÍÍÕÎØáæèÝàö|lbcñÝÕèr\XVX]Z\QF@AGIT]fWLPWcsñÜÿ^\kàÙÖÐÍÏÎÊÅÅÃÄÉÕöïÛÔÜÜÚû\YYaoñ~|dY]_ledôçíàÑÊÉËÛõ]\hj}na]_dyå×ÖÜàßââÙßàþ`uÛØÓÔßï[V\ZLIA?88;=FMT^^dçÛÐÐÕÎÏËĽº½½ÁÈÃÀ¾¾ÆÉÙopRR_[[RJXSQUMRNGNV\h_deYkzöÝáÚtS\sqõÿ}ý[ùÜÝÖÑÉÆÖÒÎÍÊÕÚÝzbh}÷veiVEDIIIIOOSMLORYapÜîåÓÒÍÌÌÌÍÑÏÌÌÎìzè\ROT^TRZixsàÚïcmïhUZtöbnîØÓØÎÌ×ÞÚÌÙùëÝíiíääðwäÚÖØÙÙþV\engbqtbYXVVPLNLJHCLHGLP]_[ëé}þÛÖàjep]`hwënèÊÈËÍÆÆØÜØÜÛêÛÏÓÚÏÒÌÍÖÌÑùíÿx^KHFABADHKNWQNLPXmãØÓÎÔÛÕÓÓÙ×ÍÖàרÛÔÔØÙöûb\[INRC>?FLMU]VU[iÿíëÛÚÜ~e÷þùßÙÐÎÑÒáñàÜÛÞâßÙâáÙÚÙåì||ýexî_QMSYR^wlto`~ñxÙÞìjWfhZlåÕÎÓÝÛÝáÞÚßn_VT_]pý\hf\ýmò×Ù|fNIJDNUQVJIVNOjöêjdpúzãÑÐÛâÙÔÎÏÎÇÌàÞÝÏÊÉÄÆÒàùd_VZ{aQKGIMTjnöõnlvîéãðcXW]îÙáÚÒöþmzÖØÑÊ×woïÙÙÜÓÎáiZ\\UcdSHAEHILRWNDHKTite^PM[gÚËÊÃÅÏÐÎÐÑÊÍÐÜn]_yþãØÔãh_owíäñy[rÝíÕÕÕÎsZíàÚÊÌÙÞ]qökÝÒÏáiTOMM^tib[X[bíÑÔÞqONNK`]IE?=DHSäêvy_VþmàÑÞÝûêåÚÓÈÇÉËÌÏÎÎÐÌ×ý^__ïÞÑÉÙii`tàÕÌÒãxzq}êßÐÜz]PMMPTOSJJMKRhîåú^oqqÚÒÔÔ}ñàÝÎÉÂÁÊÙäl]yêpdQHLKJPk|ìyZ_NYéìðj[iboÛÏÓØuYVOjØÚÞíaöàÝÏÈÆÈËéo`gÜßßÝñöåíîÖÐãïUOMTpog`PMVZòÎÊËÑïþåÚÅÈÏÔÝýig_àÜ~õWJLJRMKKEB?CHSaYVIDN]ûäåÕßíþâÝÏÅÈÎÝènñÝÙÚÐÕÐÑÏÌÇÄÇÏÜípnßàénZOLYúâÞ÷iWIEMapb_][týæêßÙÎ×àêàÒÜåáêj~ìñyëëêcKDGV^^ebWRTQXêæálUSQhmYbvyrôèñÒÏÓÝa^câÞâÔÔèmzÚÓÆÂÇ×kURoþêêdY^eíá×ÎÜopývÛÔâÜçV^ëíîÖÖÛìOKPXfnhf]U_vqîÞõaVQOZyh]^ZlÚåõèìaOIGMV`l_oiYbòïÚÊÊÓêkþäÙÒÔÎÓØÍÉÎÊÈÎæn`_òô|hjf^h÷çÝÎØî^UJJUmø|étbaiìÐåpaWNOgnxkowßÍÃÀÀËä`YUXëê{`^PLOT\õyVNJGAMY^RV]_syÞÐÓæoýá÷ÙÎÐçð}|êíÏËØ~dWRRdæéàÍËÌÌÌÄÀÆÏÝûÿhgãìdzumèæØÏíSI@CGGUc]bqcyèÒÈÍÝ÷]XVLQXNMTO\\dçdGCB@GNiû][lcõ×ÍÁ¾ÎÞéöxyÞÖ××ÉÇÊÉÈÅÇÛò{t}oû|ühxçÓÍÅ¿ÃÚ[PKB?EGHEIO[cóØÖoYch\V}ìî}ñÜÎËþ¿ÌúYXUOfaVNKLUSYñîl[NMVP\lljòÛÌÌÏÇÈÔþ]YVPX`Y[`[xÜÕÿÉÚt]b\iãÜÞÚ×ÏÊËÂÂÌßpk^QMNRUQY|ÙÝ×ÌÙónYQTY^}ìtinåßÑÅÌælUOJGIKLIM[ñôÝÍÏrRORMKLS]PZïàÑÈ¿¾ÍújXPPJSh[k×ÌŽº»ÇÉÈÊ×ñiX[UYñ×ÕËÉÌÝeSRHCDFQTK[îëÓÌÈÌÖ{íi_]gã`]fÜÕÐÍÏâþ]WSMLLWX]lÞÝÚÍËÒÚý[MDIKKRaaéîèÚÐÔí]P[ULQ^hôìÙÊ¿½½ÀÉå|lQXwóßùhzÙÍÅÉÙÚl[QJOZiyþêÝÍÊÆÈÖåv_MC@HEJNHMnæØÐÑËÓí^HGWIYp][ãÒÖÑÕÕæÿVLHGHKONTqÜßÕÕÏÑÎêóòà×ìÔÖÓÎËÎËÈÉÌÈÛYTT^^ebõçÙ×âߨèêoMNGEK_lnqßàúÖÒÛØqHGEBGQ\jîÛÑÏÈÅÆÅÅ×jeRXZOR]wóùòæk_[M?ABLTRSVjxéßÕÒÑÔëR_}rìëêÜÓÖÊËÏÍÍÚhP[|fqd[ãÏÓËÅÂÇËÍÞqe]VRXVnÝìüàÚöíé}fYMG@ADIUYjÞØãÙÒÙõ\\Z[UY]VRR]qk|ÞvTMMM_bgzZhoýÝÛÕÉÓál^væâsæäâÜÏÇÀ¾¿ÈØ}_]dö]|öso{çÞÔÕà\RNJJD@EIEN[êÛÖÐÜÛívcljml~ysíÛ×ÚÙêÝùeWSXVT^[_u`ciëù}bXYT\_hf^rîçêÝÉÊÏâYSNGHOg{ãØÑÓÊ¿ÃÅÇÛßákh][ZbníàÒÃÉÍÊÔ}gYP^^MONV`dææîá~\liV[YRYWdçwìòlô^ZëÚl^]PWamëèÛå}âòZUZNTcNQ_úÕÒÙÞôÞÒÛßÐÙÖÔÿd{ÝÌËËÅÉËÐÞèÕÚíìäô_W]fslew^UWþn^Z_lëéõêpdYWKIK^`]ind~yíÏÒÌÕÑÝ|{tbYk÷xhèÝÐÎÕnpRFGISOOQIIORfÜÏ×ÖØïèÚÕØÏÍÓÎÐØÏÃÀÎãuPWklúâäme]kóÓÌßçrNPtôàÙÙçøÚÝëÜÐÙømO@FGEMLHIUXXcÑÒúñkmäÞìÒÛõa`b\xÛ×ü{e^YTLS\YT[^YcsåïðéÛÕÌÍÇÀÅËÌÒÖÍÈÄÌÞçäíé~íÙéZ\[U\`ïë|[oxlhgéò[[jdpìäçúWY^úÙÛÑÞ^VSIObuñña_}kåàÕßnþþe_ðîdVJJZbrèÔÏán`c^ìØÛâ]VdìäÒÌÊÌÍÏÕÛÒËÐÒÝÞãÝëÚÍÔÛåÞåòëÏÛñh_kkfèÎÙÝþbXRQfh\\UYYX_olø}q[ZboymaPPT\lÞÛÝâkY\pÞÖàîcckoêÒÎÕ×ßîyzèãéäëÛÔÕÒÏÏÖ×ßûñåÝãñðxs`îÓËËÏÍÚ^ZY[WPULKOT^rî}ÞÞ|wjosiíucczuzáÚÔßü]Zfëò}s[Xa`iîôÚæl^Y]hXWofníæàånåü\YWURZpþýpfîâÓÓÔÎÝêÞæë}gø_QüàõÞèáÜóüí~|o^Y^\aêoq}éÚÞéì{tßéðíêèèzzjev^WX^WRQV[bûßéçíêÝúolg`QQUOZ]jl|þüÛuYYQOLKPR]eäÜ×ÖÛÉÍÌÈÌÏÙåáíoo~úó|ðÓÔïdOKIEMUNQ]\iþ}Ý×ÙÙÑÒÎÛÚÚãÚÒÓËÌÕÎÙäðhKJGHLHIPRT`iäÛçlj^YOLROPgeníøÛáÝêÛÒÐïWZRNSZ]{~ÞÜÔÝèöÿ~oäÜßßàpó÷ú}ñÞßéíèûéûkmkþÛàâëî÷yñÿúnu|èùilêêñØÏÕêca_IKNWav]^g[\QTORZ\WSPONOZ]jßÏÐÕ×ÕëöõäÖÍÌÖíßÒÔØæäíò_\súd\|nyáÔÍÓôndec[\bxüä}wþläÙÑÌÎÚoZIIOKHIN[_hæåuuj^}ëÚØi[b`ggòäàê|xZUU^Y\mibUP^éÝÞàÜãÙÕåÛÚóçàÞÐÊÇÉÎßp[^\^iþàødf[\sùïäâl^ZSSRPV^_m|÷æî}vmoëêòmfpi`yÛÚÓÙßãi]aeiùÞÕÒÝÜÝÜßëïúj\\QLJOVXZeâÐËÈÊÔßfW^i[géítmòÙÓÎÉÆÊÝ{oûi^]cZWkòu][RMPfvòkY^XUUXñÔÖÖÒÞýöÞÖßÏÇÆÈÎÕÐÍÐÝîötbVY\WTRLI`ìñðhZUQTOWY_ráÞèßÎÍÐÇÃÂÂÇÍØãá}ýÝæßt`WZ]ZOJOVXzæ~öräéëÖÔÕÜôcem}ìÚÏËÌÍÏÎËÈÊñoaSPKGFFKLTtÛØÐÍÝâÝÕÚîåÜâíëéÞ×ÕÓÑ×Ö×ÚòWVPKEDKWURTWUO\êåÝÒÓÕÝùëÚÓÐÖÐÕÞÚßäuÞÒÎÑÐÐßæ~vm`m\[bRLNPRXiÞÜÛÎÎÎÎÝìñìÞßèëñè×êlúèÜàÞêihæâg]V^kzú`\XXWRNOZ|kYadjyÙÉÇÈÎÙðêâè鿨ÔÑÎÕÍÊÌÏÙßàãíñ_X]_dnëÜÑÍÓ{}ïdXW]WWTSPQdoûÞÝÙÔÜøîÜÛèdpëzìénX^dapfnßÝç_WOQSZe^b\WUNSoàÒÎÎÉËÖÎÎÍÊÍÛàïsh^_OS^rkeû÷ön`_jíÓÉÊÏØéî|àÔÍÑßùof]bZUYZ`meiýõXKIMOYhpi|uRXnïäÜÑÙöve^píàæóúúïÞëeymjzùpXQXWPZræÜÎËÑÙÞg^isßÛÛê`Zb]lëßÛÜÔàåÑÏÞîxyhbn\PMLEBDJLVZY[UMLQ]~ïÞíimoïÝÖÏËÍÇÎßãzügSVVSVXROLKN[høéàx_aZ`ðÓÌÏÏÏÚæéØÍÍåýd]]PNJHLLOX\by`_ngàÖÓÎÕ×ábVXQZ^__[ngXWY]þwwùúáäíÝðvâæÚÝçèl_d[mêöÝájkjWVM[æöåìeWRVWWgglûxûþeehwéíäØÝùfYUNW^Ycf[PObd_gìjkìôt`ï××ÉÉÍËÎÓ×ÝçrgpbYfxa[VTWkÜßõÖÞómTOO]][lõ{}vyêãÚÔÞÚÎÓÞîpmmûýeêìdeYNMVmðe\VHGEDKNONVywwÜÜàÏÈ¿ÁÁ½ÁÉÊØßÞæêæ×àkýöX^gegeegTNQMV^ýäØÑÕÖÔÖÚÐÐÎÐרìic^_kkclob]XSLLT__aõu\\XOQUQWd\RU\[mÕÌËÉÅÃÇËÐÔØÝÞáãêêèø{{úåâÝÖØsVYZbüzóÞÝ×ÒÒÒÒÓÎÏÏÒÎÎÜþúþsíróÖßzeRKKLSSRZ[XURSVUX\hjyåãàãÛÌÈÊÃÀÂÆÐáï|n^ZYPZb_abtÚÛÛÏÒÓÙðxjbûêÛÐÓÙÜâíÞÔÑÚÔÓÔÔßíóôzz~vmêñkVKP[YhínzlZZ]TV^ZPNTU[_|ÝÍÊÅÃÂÂÉÎÝïipqljh^YQOYbdidW`b\\[YgwèØÐÇÂÃÉÊÈÈÎÌÊÐÙãúópcpñ^øR\uJZ^^dïø÷äÞþcYNMSSY^XaX`îåÑÆÃÃÈÌÌÕÞoTVRNRXad]gÿ÷ÜÛÜàl÷xhùdcóvþùûõèäÞ÷ëÏÔÏÎÑÐémg_úïõÿdWRLMSNbügmcht^ZRLSTS]úÝÙߨÎÊÄÆÆÆÉÒæo^WUWUQRSTY`xxïëøööz^YcddyáÜÙÔÑÏÚÝÛÞÔÏÖÖÝéraZTSSYRQQWVR[ÿô÷unïybUONPOTSSWXoôëßÑÈÂÁ½¿ÆÔððäëîû\h`XWX]vzûûcïn_XP[d_îßÙÎÓÓÍÓÑËÏÍØÚÔî]PT\[[[RQNIKQMRkô~_jjWMHJQOUURea^wÿãÏÊÈÊÌÈÑò^WXeywfk~fyãåàÎÍ×áàèmXT^f|~ÿóßèïçãüåÉÄÉÈÈÕêlqþãÛäýÿpUPRTQ^eYPVRHD@?>GJLOX^_løßÓÅÁÂÄÇÖÜëòy}çm^^o_d__\ýÞâçíü_^OM\æÚÑÔ××ÛÙÕÔÐÇÌÏÏÍÝújROQYQQQSQRUYjòó|ie\OOLKJMKMOT_VS^b}ÖÏÍËÍÕÞêøìÝÝãÞèõ|oöêóõe\][ZOLGGILWcæíáÝØØÒÉÃÀÄÅËÍÏÛáèïî}mj^c]PLKSZVSPRWK@?@FNOdd\þõåÔÊÅÅÆÂÁÈÒàÞðcera][a[RP[fjmd`_dSPTRUdóåëûàìöáÔÔØ×ÙÖÒÖäõðëéÙÖÞkn~]Y\cYVcd\TOH@>?ENXVPbq\gÙÊÊÄÂÅÈÌÌÑÞîà×ÕÛñnèôyml]W_ZSKNLHIPeâßàÝÜÏÑÌÉÊÌÈÆÊÎÑÎÚ~g_[a\ZONKKNTPKXZ`][VRQOS_~up{úïÙÎÍÑÉÅÈÇÈÊÑÙ×ÓÚÔÔßÞéõêâðeWvïjýù_[TW`iÞâøêëÞÜÝÔÕÕÌÍÑÎÐÖÏÜàxgu[OOPNTOLMLOJJLF@CJMNSa`kû×ËÈÃÀ¿¿ÄÁÄËÍÎÕÓàí|\ccZXTUYW[[jypgzïäâðÞØÙÐÌÍÍÎËÉÌÌÊÈÊÍÎÕßÝ{ZZNLPPWSPWX]_XPOMIFJNIPQIReüúüÙËÑÍÆÆÄÄÂÂÉÅÈÔÕÜðßãîpTYQHMNMOONNXõaWò÷âÑÌÄÄÀ»¾¾»¾ÁÂÌÒÞÝçMGGBCHGFCEJGN]XVXSTNRQNZ]dïÚÕÓÕÍÌÏÎÒÑÍÍÕÖ×Ùð`^ZS\hfjhkccrt`c^^ahùljoöíÜØÕÏÎÌÇÂÀ¾¾¿ÂÅÊÔámVSVTYQJGFD@?DIGFEGGLMJN_}èÏÅÁ¾¼¾ÂÁÀÂÉÊÌÔÜÝnVOQPKHFDEKOT^}kl÷øskìûûêÚÑÐËËÎÎÌÎÍÌÉÆÇÊ×ofTGFFHMVVX^_]WVWQOLMKGLLHJVajþúßÏÌÊÄ¿¾¾¾¿ÁÅÆÍàouïk]MFED@@@IKKONOYYRV`éÔËľ¹º»»½½ÁÃÅÎÜ~OE?>?>??;>A@JT[`_b\]fgjjléÚÕËÍÔÏÜäáÛÓÎÊÊÑÒÛn\UZfk÷ìeoò|tuy}ìýkj^VRKGKRY]ecâ×ÔÌÆ¿¼½¿ÃÄÊÕçf\^[PJE><9678:;<;>BB@?JXçÒÌÀ¼½º¼¿¾¾¾¿½ÀÄÊë\YNFE@<?>>DDJVeqïøëÞÛÜâÐÍÌÇÅÃÃÉÊÐÏËËÉËØømTE@=>CHKKTSQXVSQSW_ffc]OHGGJPNPZ^tüêßÎÇÃÁÀ¿½½ÁÅÉËÖÜùbVME@?BIJLKMLNFHPlã×Éž¼¼¼¾¾½½¾¿ÄÌÏëZKFE?>=<:;;;;<>AFIM_öîåÞÏÍÌÈËÌËÎÓÔÛÛÒÍÏáh^VNLKPRTZSX`fcZ\xÚÙÙÙÛ×äp]\a_úää×ÔÐÎÇÅÃÂÇÆÅÁÂÈÏÞßñ\PJD@>;:9:=@CDGHHKS{áÔÍÉÃÃÂÆÈÉËÇÄÄÅÉÐÖÜo\OKLJGFF@ADFKS_]ýÝ×ÌÄÅÉÈÃÃÄÆÇÆÇÊÊÊÎËÐßëjXNLJJLTOMU\TPIFHKV]mie\XTSV[km~ÞåëâÜÏËÈÊÆÀ¿À¿ÀÆÓéê^QKIF?@CEGNRS_^VcþñÜÍÈÅÁ¾½¾½½¾¾¿¾ÂÉÐÜl]RJCEC=>=;769;=CIVvßÍÆ¾¿¿ÀÀÀÂÃÃËÑÏ×åõù]XXXXYY^_iÿupvþtôÜÛäÖÍÎÒØÞùe^[dòòãÜÜãàÏÌÐØÖÏÐÍÉÊÎÝâpXYPJGC>?@?=@DBACLT]vßÛÚÒÊÊÉÈÈÄÀÀÀÁÃÅËÌÕé]SVMIFGE??AAFHMdëÕÈÁ¿¾¿Â¿½ÀÁÄÅÈÎÏÙájURQPQVSJMRNMIHHGINOZXXhke_benìëíåïéßßö÷ó|æÖÔÌËÑÚØÒç÷èööêúndkýøxg^qúzìÞÔÓÜÏËÇÄÂÀ¾½ºº»¾ÃÆÌßh\OIC@<;978768;=BIV{èÛÑËÈËËÊÊÊÌÍÑÕÙÞéðZONOSP]\WZ]slZZhóíâÔÏÌÌÉËÔðèãíîßÕÚÝÙÒÌÍÏÉÇÈÌËÈÊÏÕÐÔó^\[XMMJF@=?=;:=BDEN^nuíÖÍÎÏÊÅÆ¿»½ÂÌÊÌãlVXXIDBBC>BHIHJYapÛÌÊÍËÆÃÇÈÇÃÁÆÉÆÃÆÉËÔëpgo][\WQJMNLJGKPLKNYWOVc]ZWbíoha_]Yewkggwÿaf÷ÝÝèÛÞÝáûèåó~rjY]i^SMOVUOUWf]_õôãÝÐÄÀ¾»º»¾¾¼ÀÈÍÖáqNIE@==><99:<@@GMNQlÙÒÒÒÎÌÍÎÎËÌÐÍÒô`WVYUPQMHELUPR]j~{êÔÎÐÐÌÎÖÛÒÍÉÎÜät[ZüäîôçßáçÜÐÐÖØÚâ÷vjpoZWRNGHLC>>==?@GPSONQV_ñØÉÅÆÄÄËÎÊÊÛíòÿvdX[XOJILKNPXdZ\pr~ãÓÌÏÐÐÐÏÓÑÊËÎÌÊÏÙÑÔÚØÜßägX[ZSKMOONNU]TJGIFDKNX`cib^^hîåzôôétqßÜìþzl`cðóããèéýrvéågXZYVZðÖÓáçêïï×ÎÈÂþ»½¾¿¾ÅÕÜæïogmx]IA=>?DCHIDCFIJVg_\eo}óÛÔÒÔÚãùfdaZXLLLKLP`]QOWfxãÐÇÂÊÒØâãÝÜÑÏÔÙÚØÛßázjmõãÝÔÎËÆÉÎÍÔÍÇÈÊÎÐÓàïïîoTD>=98:<?CBEGJVfâÓÎÇÄÂÁÀÀÇÕöZUPTab_YMGEFLRZZ\^ZgäÎÊÏÎËÇÄž¼»¾ÃÄËÑÓÒÒÓëüf\\^lgZSKLV]yçØÜægY\^XW\YVUXXüòjbVQWXg÷êt[[WUZnÞÒÙ×ÑÓÕÓÌÌ×õ\VWTQXha_ZX_m}çÓÐÓÐÉÅ¿½¼¾ÃËÍÏÏÎÌÍÙÞø`Y^bc\OJKGDHJFDHIOXißÍÍÍÌÎÍÍÏÒÓ×ö_\ONQPLNNKMXzß×ÖÔØáÛÔÐÏÒÏÔÙÛãÕËÎÝÛáíóìãÑÊÑÙÞäæÙÐÎÌÑÞÙÝèÚ×êh\LHHGEHEB@>?DN\nïëãÑÒÏÇÉÝáìhd\^wð`Z\_\\m÷åù[b~yåÝâ~ìçáÚÕÔÈÄËÎÏÌÊÉËËËÏÛÙßÝÑÔäfjlrxýàÎÐÜçåo]`YMHDBHDBIMKIMWfûöåÔÚáìðzåÖÔØÙåöáíèÝûe^XYX[awqahtmjäÕÐÑÐÍÉÄ¿¼º¼ÃÈËÎÔÙ×ÐØÿfja\cmk]SNROOOKE@@CHLR\omeqzvóÚÕésa^\RZbVIFKRX\cðÞçæÔÏÐÏÊËÒØçÝßñìîfXY_råÞÙÑÐÚßÖÑÎÊÃÃÆÅÆÃÅÈÊÎáqhk_WRLMI=;>?>@DEEKTìßÞÏËÏרÔÜîýøîcONSNLKLKKKSfbelk^lðéÜÏËÆÇÌÍÊÇÉÆÄÆËÎÏËÐàâáý]^mstmpéúolåÞèéûiSKKMIDBD?<>AGOX`nhet÷hxxk_]dçât_f_MLQYWYYaeWVhl`inoijîÐÊËÌÇÆÍÎÊÈÊÊÉÈÌÕÞØàðþqa[eûêøf]]MGHQWOUbbWOPYW[kyc`fôý_XY\QILVRRR[_Xc{ôîëßßmpôÜÛèäìj\YbqnæÐËÎÌÈÃÇÌÉÈËÒÐÊÇËÓÚÞ÷_Zmj_]ZVKGHHIHGJFAFM\emäÜàßÚÑ×ÜÜâl[]cYLHHC==CJLOW[ZY\íÝÖËÈÅÈÊÆÆÈÊËÊË×ÛÜáßñzliy{èÝÝÜÙÜÞ×ÏËËÐÕÕëedg`[WQID?>CBCJQ[^yÝÜåîêãô{ìçïüj_WSOMPPPWXPPSVU^síâéâÜÚÖÍÆÀ¾¾ÀÁÀÂÀ¿ÄÈÊÉËÔÜîn^NJNOV[\[URMPT[n|g`]\a[[\]^Z[[UQTQIFIMNNNOOLNXkzíáæèq_xéÝØÒÍÐÒØàßáçààßÕÌÆÈÍÐÔÐÏÔÍËÊÊËÏÓÓÒÔÙØÚÙèpmd]WSPNMIGGEFL]fnéáåâàçìyldf_]WMHD??@CGKPU[WXañÝÒÎÌÉÄÂÄÃÃÅÇÊÎÏÐÒÎËÎ×ÙÚ××ÖÒÖäôüêÛØÒÏÙÞï÷ðplg`_ZRRPMNQNJLT`qóñq]YVX]bivs[VVUSQNOLIIJNVVY^^gûÚÕÏÊÆÂÁ¿½¼¾¾¿ÂÆÊÌÍÐÔÕÖÛì~{y}ÿë×ßäÜØÐÎ×ßäßÜínhboöqfYV[_a`][YVRNNRWTMJJJMQ[b^TPT\[Yhz÷ìæÝØÐÎÑ×ÝäÛÏÉÅÃÁÂÃÆÇÆÁ½¾ÀÆÊÉÈÈÍÕàè}b_köùeTSROMOSZZY^jzäÚàôg]TMJJJKMLLHFFDCBCEHLPX`girvåÛÏÈÁ¿¿¾¾¾¿ÀÀÀÂÃÃÃÇÌÌÌÌÎÕÜÞàØÑÏËËÊÍÎÈÈÉÍÕâp[ZXROIE@<<<>BDGJKHCGJPQSTVYZc`d]QNIINYhwÿãßàÒÍÈÆÇÇÌÌÇÁ¾½¼½ÀÄÇÈÇÇÊÎÐÓ×ÙÖÚópg_^\^cd`WMKGA?BIHJLMMMOOPONNLMMLLMQTY`kxíìøêâÞäÝÐÏÏÏÑÓÑÏÐÑÎËËÊÌÐÖÖÐÎÐÎÎÑÜèéës`VRVVYZ\WWPLMLOW[\YUOMQYZTRSQURWd``ikkjepþvwyïvþÞÜßðnhuñä×ÑÓÑÎÔÐÒÕÐÐÏÑÕÖÙÑÑÙàëmhrji^TKKLNQX_b_\^ha]oòæòjkk`Z\ea[efgopxõñðéâÞÚÚãßßàÜÙÙØÙäõøýfVRONRSORRNRYenjjóóqòáêýlýõyñðáãögg_]e÷çäßåÚßÝÑÏÐÏÎÑÛæààââÝáìnoêÝãxlrpTQQMJEEFEKP[gZS[e]\lë÷xqxp^`][b\[[XagúëîîÝ××ÍÉÈËÉÈÇËÍÊËÌÎÔÔÝãÛÙÏ×àáîlX\h^VYVTLGGFE@BB@DHJNLIKJJLU\]^\]UPU]ailkhhïá×ÏÑÐÌÈÊÉÄÆÇÇÉËÏÒÏÒÖÚêþfyè×ÎÏÖØØØÙÖÔâógbZOMIEA?>==?@EC@BDBCFINNMPYZ^jo~òèÜÝ×ÌÈÁ¿¾¾ÀÂÀÀÂÄÈËËÌÏÍÌÎÔÓÒ×ÚÕÎÍÏØÝêycff_]SQNIIJKLGIIDCDIKIHIKGDGKLIFIIGMYhmfôèîçÒÇÅÅÃÀÀÃÄÁÀÄÉÉÉËÌÌÍÌÑÙÙáðþíâêéíýþgmèôf[]^^rîéâp^daZV_]SNKMOLO\TJN[TVöãÛÖàÜÙÙÚØÓÕÖØÖÐÒÔÏÎÔÙÚÚàÖÍÏÎÏÙÝÚáìèéthdikbhg_TRQQVZ_^_\SURPV`rrkøëáØÓÍÐÕÔÒÑÒÍÊËÐØàßúdlseZ\{n_n÷èxiokomßÕÜìx{ýecooj[`v`_þùu]VXSPZpqf^\mp^iðåßÞØÏÎɾ¾ÁÃÃÆÆÃÂÅËÑÖ×àðãÞåx{çñsùìò^QOKGGJKJHDFGBBGGHHMZY]zåáõuîñvíÜÙØäýéåíäÝÝÛØÌÊÌÉÇÈÉÊÌÍÒÐÍÊËÎÎÍÌÎ×ÙÜñý{êñfpyui][TKKNPMLNONIHJJGGJOKLSZ]YWXVOZ}ØÓÖÐÎÐÓÌÈÆÉÆÁÂÆÄ¾¾ÃÇÅÂÈÎÌËÉÍÏÐÙçéÞÝçñîök[]^_SNMLFCDGHDDEGCDEFCBDHJINUTVZhyjüÝÑÑÎÇÆÌÌÊÉÆÇÈÆÆÉÌËÉÎÒÐÎËÍÎÎÏ×ÙÔÞïèìwf__Z[Y\ea]^cum\]]XRRPGEJHIKKKKLLS]X_u÷êñùáÜßÚÐÍØÚÒÖÖÓÒÐÏÏÑÌËÌËÌËÊÌÏÐØãðþ]NUURPONMMLMZ]UVQPQSTWUQUdYTfmvþëãÚÚèÜÐÙßÝÞÞãáèåíinøeséóíëîæßéîÞàörkmrjj`\[XWXYgö{{ïêêàzgpj[Z]X\^ZYXSU[WRZõïçÙÕÍÌÍÏÌÌÍËÌÎÎÍÓÙäãâÛäãÖÚëéçåüog]ZNKLLGGFDFCAEHIJNPUZ[_WUTZ]RNQMNYWYfpûÝÓÓËÃÃÿ¿ÂÂÄÅÇÍÎÏÙÛÖ×ÜæëÞÞáëàæöë}fSKIHGFACB?BEILOMOSX\mm`^fqdW^YPLJOQWYf÷ÞÜØÎÎÏËÆÇÈÅÂÀÅÇÆÇÉÏÓÒÕÐÎÏÏÐÖÒÓØÝÜÙ}ccYQKIGCA@@AADDDEGFGGB?DGAFHMMLQ]jcbkîÜÚÓÉÈËÊÆÆËÌÄÄÈÈÇÇÍÏÍÏÕÖ×ÖÛßÚÜÙàèùke\_a^`]X[[_ôéñì~g^dnlpaZTNHCCEEEEHHGMSVZ^am|ßÕÏÍÏÌÎÐÍÌÉÇÉÊÏÎÎÏÊÈÊÎÏÏÔÚ×Ùßì}n__YSVWUVW]]^k\SNPTMLMNLMKFGGGLUTXkößÙÑÎÎÑÓÎÎ×ÜØ×ÞàâãîíõêÜßèèùin{èïn_dcYX_xlnh`byóßÓÏÓÖØÕÑÔÒßigzhZ_ihnn_Q[amâÕÕ×ÒÒØÚÎÑÙÞÞÚãëîòåæþj^[^|ûupfcegrù]YSQ_\QZ\Y[X^cZ\i_e^^eaddZRNNX_dkyïçàÒÌÇÃÂÂÄÃÃÀÀÃÄÄÉÏÔÖÓÚäïî{y|þrg\[WNLKQMHJLHCBEHKOZdrûzòëzúíuogzíhdumc^imsìç×ÍÍÌÊÈÅÆÂÀÄÅÄÁÃÈÉÈÌÔÞÜÝÞÝÚÒÑÖÚÛÜßðïgYWNRPJLLGAADCFBGLNHBFEDFMKJMNW]WZ`u~à××ÏÍÈÇþ¿¿¿¾¾ÂÆÊÉÈËÌÎÓèxããåæàãï{sui^_e]VSV^peeld_lpovvït^ZYZWOROLHGKPX[oìçêÙÕÑÑÎÍÎÊÆÄÄÆÉÉÓÓ××ÙàÛÞÙÖÛÝÚßèèÝÝéãàßßôsxlkitfb]_hcVVe\SONNONUUROOQOQ^hrùçØÔÓØÏÌÎÎÍÎÐÒÍÊÊËÌÍØ÷`fm~o{m^[NRS[^ZZ[UY]ýãàåöqnwéÜáÖÕÎÍÒÔÓÖÙßìwoqküìçîíñçãÞÝÙØÞÓÕØÑÙßå}g^esü{g_\`emri\WMMLKNT[WOKLLT\cku\SOYahemüksoþæÜÜêïûúíæáÛÒÌÏÓÒÏËÊÆÀÂÄÅÍÒÛÓØäìûî÷_TNMKHJGGB==<:<>ADGOPOOMV^hkg÷ö|çëÛÒÔØÞééóâßÔÎÚãìàÝÚÔÎËÈËÉÉÈÀÀÁÄËÐÛÝØÔÊËÏÖêmYY^aYOKIA=>>><<=>?@AFEA@=<<?ADGJTXOPZekkèÚÕÒÏÈÇÌÌÉÅÂÀ¼º»¼¾½¾ÃÅÃÉÐÓÏÕÎÍÒÐÞq_ae`faOLGBA@@DED?ADIMKLKKHFKMO\hwbXVX]fæÖÕÝÙÑÖÍËÌÊÍÊËÊÍÌÅÁÅÈÌÌÎÖÎËÎ×ÙÎÎÒÒÓÕÜãùjWMOSOJJHGCCHFDCFHHIINLEKLKINmóg^evrvÛ׿mqvíßÔÉÇÊËÇÆÉÌÈÅÃÍØÑÓÝÜÜÝýcgpïýïØÚ÷dbZKHLNMGIRNRSVWNNXni_åØáwq}ëòÝÓÔ×ßÓÍÏÓÎÎÚîôëߨÖÌÉÌÖÛÚñjnèánbsl\`ej\\yvîìàÒÕïpg[NGEGFBCGEBBDB>@DIJK^øöüçÚÕÕÎÈÇÇÈÅÁÀÂÁÁÅËÐÖ×Ú×ÏÎÚéòlWMNPMJMOMMUZVSVZ]_eìÛæe_YLFB@CBBGTWXlsccúâØ××ÉÀÉÌÄÁÅÄ¿¾¾¿À¾¼½½¼¿ÉÐÛßé~{÷òpaaWOLKQRMKVkY\cZSR]iZNPZSKKKB<88989;>BLOY\\eæÕÚ×ÊÄÆÈÂÂÄÁ¿¹¹¹¹¹·¹¹·ºÀÆÎÚò]^h\OPPNMJOVVURQOOVeXQT]ñ`VSYYXWPNIFFEFIFIJSyyhgwÝÓÒËÈÇľ¿¾¿À¾¼º¹¸¸¹º»¼ÀË×àüXPOMMJMVTOQZca{áëmjçç_NIJHFEDCB@CEBAFHHINWUT^çÛßçßÞÝ×ÌÊÅÁÿ¿ÀÀÀÃÄ¿½¿ÅÌÍÈÌÞüfTONONQPNPSMNSPU`un[PY^\SPLJN]jxçìíèæéÞç÷òß×Úßá×ÏÏÑÎÓÖÖËÇÅÂÂÅÅÌÍÊÑÚÎÊÏÓÙÚÖÖöeZPNNLKNVZWZPNMLINLJPJEGJA>DGGPXasêÞÔÐÓÌÌÏÏÒÕØâÙÎËÉÊËÉÉÆÈ¿ÅÂÃÈÏÖÜãÚàýne`gkûsZVOFC@BGKNMRNLNRNNSTSORZcVVy÷g|íÚÏÈÁ¾¾ÁÂÃÅÊÌÓÒÎÌÆÁÃÆÃÃÇÇÉÉÎ×ÚÝãzjlxia_[``oufZOMIA>?@?BFGDBE@CIHB>>@DLW_vèÞØÎÊÅÃÄÅÃÇËËÌËÎËÉÈÇÆÃ¿¾ÃÀ¾ÅËâëîþ~úê{íõu~zúkXNJKIBEHEEFJMJIOQJUcmUHKJIITcèÚÖÎËÍÌÐÑÎÒÒÐÍÌËÆÆÂÁÀÀÀ¿ÆÁ¼½ÆÏÐïh[^jòéëãàÝæofgWLEB@AB?>?>=??=?IOH@@A?@DHLM]îßÕÑÐÓØÞÜáåÜÏËÊÉÄÃÀ¿ÀÄ¿º»ÃÏÎ׿i_^[\_nîéæssûoXQMLLGHMMNWXNJUjñQDKCA=BMQOZwâÚÚÛÐÏÑÔÐÐÓÕÏÌÏÌÅÀ¿Áü¼½ÇåéhWPRW]WUYcirshü|aVW]XPOKFCHIJAAMJG?;;;;;AJJN^|àÑÎÐÓÖÔÛÚߨÒÛ×ÎÌÉÅÆÅÇÃÁÃÀËÝãtZPUXUYW_j^`kópZPOLHGHMOO[\RIJZZXOHB?@CGLQ]l~ÞÔËÉÇÃÂÊÕÓÌËÊÈÄÆÆÆÂÄžÀÂÉÙÝðim`f^TMOYgheg[MHKJIGCCCACCGHHKJD?===<>@@?DNVn÷×ÑÑÉÇÉÌÉÆÁÃÊÇÄÄÂÂÀÇÅÉÈÃÑÏÒÚáxõ÷][\bue\\g`[UWNHHKMMLNTWMPUPNKMLHBELLNPWY[kÚÓÊÂÀ¾¿À¾¿¾¼»¼½¿ÂÁÃÂÃÁÆÊÎÐØëÜÙßáüwòwx}ÿu^RKJGHKHF@>>>>ACBFCFFEEDHJJIKUWgëÞÞÖÉÉÈÆÄÅ¿½¿ÀÄÉÈÃÈÉÈÎÎÌÈÃÂÄÇÇÉÐ×Ô×ØÔØÝÝçpok^XNLKLKMPLMMPNNLJLPMHKIGLOS\_üÞÏÉÁ½¿À¿¿¾½¾½½¼ÁÃÄÉÉÆÄÈËÍÐÔÕÔÌÉÏØØÚÙÛØÓÖàf[XNNSPMGECAFGLQOMJHDCACF?=AGJUpðçÚÒÌÆÀ¿½»½¿ÀÀÄÆÈÈÍ×ÔËÌÐÎÌÌÕÜäíÞØÔÎÍÕÝÙÙßÜëvePMOLOX^^TNHMS[a_\TNMLGHNQVVhåØÈÁ½¼¾ÁÁ¿¾¾¾¾ÂÅÉÎÞÜÑ××ßõïâÚÓÒØÝãùyøèéëöia[RNQNKF@=>BDGDDFEFHLPXXORTV[eýÞÛÚÜÖËÇÀ¾¼¼¾ÂÇÌÐÕÕÙåìèåÞÕÏÍÑÐÛÙÓÕÐÒÕÚêi][^YUSNSSOONQPLG?@DGLMQPMNPQWY^cmìÙÎÈÄÀÁÃÆÉÇÀ½½¾¿ÃÍÖåíàèìèôÞÔÎÉÉÈÌÚp\[küùòlUKHFFGCBEDBCJGEC?<98:AFJTZNIJQW_eûÙÔËÅ¿¾¾¾ÆÓáôåÕÏÎÔÚÞçðéÜÖÒÍÌËÇÆÈÍÔãrRILS[\oveTLLKJHHIFDLOOLGE@;:<>DMOY[Z_ïÒÊÈÄþ¼¸·¹¼¿ÈØpd{õÝ×ÔÐÎÔÓÏÊÌÏÒÚßßÑÐÝp]NA<<?CHKNOMB@A?><<>>>CFDB?<87;@GMUlÜÒØÎÇÇÇÈÈÇÊËÉÎ×äu[RTkéÏÊĽ¼½ÀÂÉÏÜîslcnîdYSNHACLTd_]oaYTNLGECDEKY\NKJEDEMZþÚ×ËÃÃÁÀÂÄÊÎÕÔÎÌÈÉÐ×ßçý}éØËÇÇÄÅÌÌÙícOHB>?BIKFGDC>=CJMMTZTLKKF@BCBHQaýi^^YZT`ïÞÓÎÉÇÉËÎÓÝèêóíåÏÈÇËÎÑËÌØÐÉÅÃÄÈÍÛ|gVKD@A@BLWSONOVQP]e[W[[ZTU[SMLQ]kÞÍÉÈËÏÎÑØ×ÍÌÐÌËÊÈÌÌÌÐÏÍÊËÍÃÀÁÄËÌËÒÞâÔÛÝÞûsiWNF><:<;=CEHBCFGHHJNILOOVUX[XXZmèÝÌÇÃÃÇÊÏÛîuyi`óãØÐÌÉÉÍËÇÂÁÁ¾¾¾ÁÅÊÓÝë|ô}÷íìïøñpWOMIIFFJOSOMHEGJLOXY]o÷ìßâùôá×ÏÈÁ½½ÁÆÈÍÑÏÓÖØØØÍÌÍÈÅÄÆÄÃÃÁÁÂÃÌÖÚó_XNIFHGIMNRXUOKGDDECEFADHGIMQW_qíÙ×ÒÐÐÑÓÓÔ×Û×ÓÒÖàÔÖÝÕÏÎËÉÊÇÇÅÃÁÁÄÇÇÉËÌÌÍÏÝçèÿg\c_YPW]gm]Z\ZTROTRUNNLMUWX`~ãÔÒÉÈÉÈËËÌÐÐÕÞÞÝÐÎÔÚÙÓ×ÕÍÈÿÀÃÂÅÆÍÑØâåíìïhXONKIJJIJKPYMJJJIHHGIKLRWVTVbtñáâÚÕÙÏÍÕØÛãòt÷smóÜÕÓÖØÓÐÌÇÅÅÃÃÃÁÄÉÌÒÛzemlcntöírd^XW[SS^hff[UTRNNWXUZ]f÷íàÝÞÜÚ×ÙÝÜ×ÓÐÒÕÓØÜèõìáßÜÕØ×ÐÍÎÐÒÏÓÝÚÙÛéûùoYNKIGCEKKLNOLC@@DDFIJKJMPMMJIKLO_íåêãÚçnjeküúÜØÛÝÙÖÝáçåååÜÍËÎÏÎÐâynzöv}çåýx}seWQPMMV`_VRUSKHJORONTNMSVRMLTYZcÜÖßÝÜÙÝ÷ìÞßÞßÝáéÝÝØØÙÔÒÓÚÓÑÖØâåîu]^^]\RTRQQQNNNNIFCEIEFHFCBDJGLMOOKKKNPT[]XWWfrrôùvkegyÿâÚÑÑÖÐËÉÉÌÊÎÜä÷ñüõéååéêûöÜÙÞùknûpSMWd^ULOY_]VMKLMJILXuf[]èÕÞêßÞÚÖßáëæßçùccxqëÞÏÈÉÎÒÌËÎÐ×îáàÙåîàëôic`[V\^amZQMLHFKJIKJLJILLKMKLKOg}ùqhirjXZinf^int~øãäÛ×ÙÙÑÉÆÈÊÊËËÔÖÐÎÍÍÌÎÓÔÔÒÙëìüj`oðëìôndl]_[Za]XV]ehuec|p~âÚÕØØáîááôroöïðoußÛÕÎÎÏÏÍÌÉÅÆÊÊÒ×ÔÝßìðâ{sib`X[][[WW\bkZ]_UTNMQMKOQQQT\\Z^_`^kvñçzëñkmrs÷toìéãäÝ××ÎÌÌÊÌËÈÈÇÅÂÄÈÊÌÎÎÑÖÔÜìîïéèâÜÛãà××Üàíql^YYbxhjnaesöåßÙÚÝÝáââü{tjfYW]hçÝØÒ×ÕÖÔÔÓÓ×ÔÙÕÎ×ÖÐÕÝôûìýonnfi{qnüñj]\\ZW[RQNJKIGHGJNOOPY[nòðõngaW]_\\^holôÙÕÍÈÄÄý½¼º»»»¼¼½½¿ÃÅÈÑÜìyzíäßÞÞØÙÛØÜëðqkk\ZUUWOJGFFDGJLONW[TUTQNQUZeôÞÝÙ×ÕÒÐÎÊÉËÏÎÍÊÈÆÃÉÎÏÐÔØÕÕÒÏÓÒÓÞèömd[SNJOQPQNJGECA@EHMKMPOSX\UPMNU\V\^Y[iö÷íÜÐÊÄ¿¾¾¼¹¹º¼¼¼½½¿ÁÇÏÜÞéöüðöèèîÝÛßãßzj]\VOMHFC>;;<;;>?DCEKIHLKKLLWg{ã×××Û×ÏÐÔÙÕÔÔÑÎÍÎÌÊÏÑרÔÐÎÍÊÍÍÎÓÕÝãän_XPNNMMJC?>>>>@ELNPRQSROTROOQQONNPTRPU^dnàÎÈÉÇþ¿Á¾ÁÅÆÉÌÑâæîkTV[RNV`h`akunipk^YZWOJHJB<:;=<>GMVRPOOSY^cmpyðäÝÙÙßìðêÞÚÖÕÔÓÜéíéìêòùøéÚÔØÙÏÓáoúèèvl~éýk`UTUTNHHKNNKNY[innyôãàîýnij^XWUQQVVOSY^e÷ØÓ×ÐÎÎÌÎÑàéùZQMLGBDDHKKPXZ]xÞÙÕÐÍÐ×á÷dUMIDB@GKFEJQY^fgmqÝÍÇÅÊÌÏרØÝòõî{kòÞäòáè~îêæÙÑÐÎÒÎÑÒÕÞÞèæèæÛÛåãàüslno`baUOSOTSYhck}âÙÞðìí}rjh`WZXYLKNJOS]ieyàØØÔÑÕÛÜãçìp^^YRORSWZXWW`èØÐÊÌÏÎÎÑÒÚì|fe[PNPQV]\[[W^áÓÔÑÍÈÆÈÇÈÍÕÛÜàíèìûîëæçèãßÖÐËÅÀ¿¿¿ÀÄÉÈËÑÖ×ßçïmp`]`cfke]ekhic`[W_^bhji]ZRSXSKKNOPQOOTQTXXYlÿí×ÑÎÊÍÏÍÓÜÝÔÛîøo]SRMMQWgæ×ÕÌÄÂÁ¿ÀÂÈÎÑÚßôn]QMNSSVY\d_xÛÖÍÊÈÆÃÃÇÄÆÇÊÎÑØßàæúúððÿèáÚÓÌÌÊÊÉÉÆÄÇÎÖßêýkr`WPIJOQPLLLIKNJKLJIJMNPWYX`\Z`]_^^uiøüiïíëéõy|ëÝÒÌÎÑÐ×ÓÒÔÐÕÚàèúq_XOKLLNPX`fïâÒËÎÎÌÍÌÍÍÖòu_XQQTWX`ðèßÚÖËÇǾ¿ÃÄÅÅÃÇËÖì}jf\ilgm`råãåÛÓÓÐÐÓÙìòp[VNHB?>=<<>BEGJMKHJNY`czn^]mtist~o^^ltùàêèÞá×ÔØÏÍÎÍÍËËÇÊÍÌÐÔÒÖßèôp^YSMKOMHGMS\üâÝÚÑÏÏÈÆÅÃÉÌÓÜét^`\YWUX^gn{çÙÒËÇÂÁÀ¿ÁÀÄËÒÞp\MHKIHEDDECCJNazsììðñng^OKHDDCDCFHGHIIKOQWZenjóáíõ÷æÝÝÜÞïûpeýÛ×ÙÚÞãèáâÞÒÌÑÑÓÑ×âãàÛ×ÙÞàîûpjøôk`]]fnpdh|øÞÙ×ÕÙØÏÐÒÏÙé~{`Yku]e}nòêëêèçïíãÙÜÝéñû^WRIFGCABB?><<@GINeçÞÖÏ×ÚÙãÿuxmUIJGJMIKKJKN_pâãëØÛÔÎßÚ×âäêääto^^]]`ytýïàØÔÕÚÖÔÏÈÊÌÉÏÔÖØÓ×ÞèìâçùmiZRNMMQNMU_îÙØÖÙËÇÐÌÈÐÜìf]VMIGCB@BGJILMPfv^fõóâÝæ÷k[VVSLMLGEFEJMMORTpÙÓÏÎÎÍÍÐÖÜízlqk^USMHNVUYcrnk÷àåìæáÚÕØÜÞåðîÞæïñôüãÑÍÉÊÊÉËÆÁÀÀÀÇÍÌÍ×ëvg_]]ijeüûüéísg^ZX_eto^WV^ýaVNKKJJIGD@>?DGFJRcêÛÑÍËÉÍÐÉÊÖÛîjhZROKLLJO_fwðå×ÍÊÇÃÂÃÇÆÃÇÎÜödVLIHIGHKV^ervè×ÎÌÇÃÁÄÉÇÆÊÎØÙÓÔÛàÛãîì÷ùÝ×ÖÛ×ÏÑÒËÀ»º¾ÄÂÁÅÎØo]e]ND>=>@CC@=?GOWTUY_fxj[Z[_\WRORUSUNMQW\[gøÙÑÎËÌËÈÈÇÇÉÏÙããùbZRRWSWcrwmòÞÖÑÕÓÍÊÈÊÎÓâéûkicjj]nprðßÖÕÏÌÇ¿ÂÁÁÈÌÓÛç}p_UY_bdjðâ×ÐÍÉÆÆÈÆÈÊÌÑØÞöiOJKI@>=;<<:9<?AEIGP_h|ã×Ûßâèînþd[_PKNNOQT_eiñÛ×ÌÊÉÄÂÃÆÂÄÊÍÔ×àíuUSWONLKP]b_|ãÑÐÍÅÄÃÁÀÂÅÈÈËÔØæpla^lc_dtlhóäÓÑÎÌÌÏËÈÈÉÎÔÜìwi\WTOLIJLLLOS[a`nök^q|s]UWMNOJFDJKIMQUWW[]c]`qývóÓÓäàßæóãá~~vna\h÷åçèÝÖÌÏËÉÌÌÍÍÔÝáèêï}pkkþú}îêéÜßÙÌÍÍÉÈÌÎËÍÎÎÐÖÛàîvj_[Z[^iÚÔÓÔÑÒÕÍÇËÐÓæla\RJDB><<::>??BC@ADLU_àרÒÏÏÐÑÕÛáôg`RNKIIHHOTW\_pôèØÛàÝàäêðÜÔÝääõ{efmYWTPWk_eîàÚÎÉÈÀ¼½ÀÀÁÇÊÍÑñ{n\\dm^XY_ZeóìåÖÕÓÎÍËÉÇÆÇÊÎÝõxj_VOGEDEMQPRTNNNPVUQLDCB@@CDCFKKOY[XXXQOW^]b}ôïßÖÕÛÐÎÔØçí÷íö_[XTUg{÷ëéíëçÞë{m[X\dnëâáÛ×ÕØÔÏÏÎÎÒÓÑÓÒÏÉÊÊÉÉÌÌËÐÚé`SRVXY\^_kõîòìÜáÛÖÕÖÝí~ôg^[^\NKGDCCC?>@@BEHLWpòáÝÛÚ×ÏÙçü_WNKKGIHGJNWfzz|kqüîÚÕØÝÛÙÙÓÏÏÎÎÚÝÜàën`]VPKKWsuâÙÛÒÍÊÉÈÄÆËÍÎÎÔÏÎÓØåþwý|la][[qãäÓËËÉÇÇÉÅÅÇÎÚßnXOKKKKHFDDEKNRTUKGJLQOMPVY\~l^quiiwüZMLUhäçm`]rÜÐÍÛîotïø|[OUfpp_QM[|ø}qunõìëåø~èàÓËÉÄÃÄÄÅÈÈÊÌÏÚßÜÛÓÎÑØÞßêüzp÷ëðáéàâåÞÝßÜÚçßÖÚ×××ßâÚåâ×ßæèëwgZMIEA?>=;;=>@AFK\àÝÝÚÛÚÚçÛÒïqn]ii[[[hn`_n|qðëÝÕÔÕÙÙØßæØÐØÙÚîòÿaWTZ\POTRTbuêÚÛÙÒÏÊÈÅ¿½¿¿¿À½½ÁÊÑÛã{ýìvk~óêßÝÜëÝÛÝÙÓËÇÉÌÏØÙègkp`^XTWPMLIEFD@DMSVaeVcqgðåy^]WOPOMJJLKM\õúyíåâéÞÚÞØÙÖÎÏÛö{cWWW\eõêûôðèèîüæÞßÝÜØÓÎÎÏÒØÜããÕÎÐÐÕÖÕÕÚÝà÷mnéãâÙÓÑÑÌÌËÈÉÎÐÎÑÙÜÝÙÖßñwüûf`heZOLKNXRIFCABCEHJLLOZaqìéëîyuéÛÜéwoflt]_hi_WWTX_nùwqspðæééàå|üíÜ×ØØæónZ][\]XZ`îÞÙרÑÍÊÈÿÀÁÃÄÆÊÑÞòv\XUQTYX\g_eo}ìàÔËÉÉÉÉÃÂÉÌÎÐ×ÚÜåu\OIHHCBBCDEEEFKHFGLW\`XV[TV[^\ZY[ceon^guwxûãèæãàØßìwnd[cc]TUdgnk]ZVY_^kìòqe}ÝÓÖÒÐÎÎÒÑÍÉÇÉÌÑÒ×áëzþújh|ëãÙÖ×ÔÛØÛêâæ}xgfnncgc]^fóçîìðvdZb\\ZRPNLHHEHHILNX[dlv{ëy{ì~zh\YXQMLMSLJOV[mîñéóýßàßÕØßæüíæêvúkSTTYa_Y]X_h~ôøíêÚ×ÌÊÍÍËÈËÎÌÌÏÚåãøzlüêüïíøøyuðøîÚÕÛÖÌÇÇÈÊÌÐÛÛÞ÷o\UMD@>=;;<=>>DIKT^alqæÚרÙÛÚØíõytþc\X[_^_jmyyä×ÙäóówdXTWWXW[_adcmòûyztéÛÚÕÏØÜåóãßéâÝÚÑÎÒÒÎÎÍÖÕÏÜßâêíéâæäì÷ùôçåàØÓÐÏÎÓÐÍÍÏÓÏÒ×á~kjndi\WX[YXPHJKJLKHJIGGGHKMLSW\xÞÔÖÕ×ÝÙÔÓÔÔÓØ×Úßïðïxd`pouåÝÛØÙÙÜÜâèøñgQWTPXUVXY[`éÖÔØ×ÏÎÌÇÅÁ¾¾ÁÇÍÕÖÕÛômsddb]^]høùñß×ÒÍÍÍËÍÖÑÏØÖ×ÝØÖÙåùpn[RQONHFEDEFHLORT]dlïêãÝÚØåús|xw`VNIEJMQ\\füæçÝÚ×ÒÓÍËÊÇÉÏÚàìmdb\[ZZ\hzýâÚÑÓÔ×ÛÛÛÛéwûzpïìÞÙßãâÙÜÚØÔÐÛÝÙÓÓÖÞàéúéÚÝÝã}ïïèæðzzïõìðüö{vwiWJFFFFHJNKLJMUU^SQ`_n÷úpnnmúßÙêîôïáÞØßûãv[wóx^WXNNOUX^__oíæõöãÞÜÖÞÛØÛãÙÒç}x[\nãéðÝ×ÏÍÇÁÂÆÏÑÎÒØçð_PHBELKJP^íÞÜ×ÐÐÌÈÇÃÄÈÈÈÏãúi[]ZVNIE><=@ACKLKOTZ[]WOUR^~îûmpy~nëÜëønclh~}ng\ZViîñèãêãÚÝØÔÝæúe`^ZWOIFIKKR[doóëòçÝÕÐÌÇÇÆÁÀÂÄÇÑãïug]hlg`mkvãØÔÔÛÜÚÞïrmkXONNNUa^^kîãÚÕÔÝæðïm[YRLGFHC?@@D@?FLQ\ríÛÙÔÌËÌÎÓæ}y_RW^\Zbd`q|øðäÝÞââÛÜëôg]ne`rð}zåáãÝÝíìÞízkøúdftëêäßÜ×ÐÕØÒÓÒÑÐÏÎÏÒÛÝÙÚézöúpm÷êèÙÓÐÐËÈÉÈÈÌÕßík^SG?<:89;=?BILToìÞÚÓÕÛÚÖÕÜççûuyaag^ONOTW]qøßÕÓ×ÚÔ×ÜÛãüoi[T^`WVV[_sæÕÐÏ×çÞÓÙîtûõü~íÜÙ×ÑÌÉÈÈÊÉËÖáêßåo]TY\TNP^þy|îóé×ÖÏÈÃÁÈÍÌÎÏÑÒÖäêmjÿkZ\VPPRVUONLILKD?>??DJR[wãÚÑÎÆÃÃÃÅÉÍÑÚèóp^[QJHHILP\okoúêåÚÐÐÑÓÚÜáãõe]TTRSPNYVXòÕÍÊÆÄÃÅÆÅËÎÏÕÚâæ{ýçèèê|sôèåÜàææ{{øèÞßèýtvößÝÜâåÝÝÚÝétyt`baZ[UNLOSTSSY[^biùìÝÞÜÙìl^YVSQNNOQ]oñòõäØÎÉÆÅËÎÓè÷r\RKHHKNQY]aZ]zäÚÚÖÕØÔÔÐÒÑ×åçëùrmoþçìëèÝÏÓÐÌÎÐÑÖÞäâétc_\`jn|~ýíÜÑÏÎÎÓÕÚàèh\PJGFEDGGDAAGMTWZyàãàÕÒÏÌÍÎÐÑÕÛÜàÝçû÷mjndk_VWVPOQMMLPSWaciüñéÛÒÎÊÈÍÒÝâèkZUTOLLOUWZgsþÝÐÉÇÆÃÄÊÊÌÖÚá{inQJHGLPSVWcõÞÙÒÈÈÅÇÉÉÔÍ×ÝÚíüeXP\ZMHDIMNOLGEEGIKLIJNWZSX\`xÚÑÕÓÎÉÈÌÔåÛÔÏÛjjnïzUUgo[RTX]YSX[``ZZ\]UT^jknïèéñá×ÎÊÌÏÔÛÞäÙÒÚßåÿwnuj]`a[`|éæìàßêëþktj^ckiiomkglrlñÝÞßââéòxwe[XPMKIJKMMMPOOXhoñçèçîàÖÙÞàèyicX\]XRMR\l}ïëëÝÜßÚÒÒÖÓ×ߨÙÜîzeXYZ]]W^\RVWX_^_gvúåØÎÌÎËÌÏÏÐÓÝÜÝÝÜñíêp]VYZSU]^^kjóߨÑÒÔÔÛØÛäãáwY[XTOKJIHJIGHOSVbmóëõõêåáØÔÎÏÐÎÑÙÚÜáïfid_c_]\\_ZQPTROOXg|öüòèàÕÏÏÎÎÊËÎÍÌÒÜÞàáâÞèûsjggljxýø}òÞãðþöîíÝÛßáâíòïyf^\]ckýïÝÚÞåéãèæÜÙØÜÛãvnimf^ZUTPQNPQLJHHNPTYa÷éâÞÔÐÑÑÒÍÌÊÌÓÙãí|ýúùve_cdb_[YUSUZ_nììîxgdhzùýmrúûòüúëîëâÙÑÎÌÌÌÌÏÎÏÏÎÎÑØÛÞßëúuf_ZWYTT[XUUX\lùèÜßÜÚØÛáéõp_^kps{qbYRSVW[[TRPRTSUX^_d|äߨÒÔÙáæâßßßèêîíõlyzsd^kúú{únd\^vêàÚÙØÚÙ×ÛãózgYZ`gfnng^\aceÿëéäÞÙ×ÖÔÓÑÔÔÎÊÉÊÊÐÞðýngkg_ZV\glvvpleyìòîêöj^clntyvtkd^WOJGFDEIKMR]_cðÜÓÌÇÆÈËÌÎÐÓÚãøm`_hnln^PQUWW[__cgt|öìíóðèåßÞâßä÷ùëääæåãÞãäãìêíyokixïæÞÜëýñìçàÝàêzmeafc]]dkïÜ×ÕÓÙÞÛÖÙÝàßæöûûwlg^TRONNMOPNIGJKMT]jmmizíàÝàåèâÚØÔÐÑÙáÛרÚÝàösje\ZWOQVZdksüû~mzôùùìÚÙÛÛÝåíí~vomz{îáàÞðøæÜÖÓÍÍÏÕÚÚßàôeZRQRU]ac]^fnüxzôøyjjejkhxëßÞÞÛÜàðwlb\UQNMLKMPV_djzõèÝÒÎÎÖÞáêðìããæì÷ýzvrh\XVSSW[dmmðßÞâÞàäëêäìû÷õþxóíïîçäçèééëíííìðþ{wlhýîy÷çêéæåçømjhdyøðàååÞÙÝàâúnfbe_hskejojinmkd`[WSNONNPRTSV^inpíìæÝàÞßäßââßÙÙÙרÕÑÐÑÔÝñokwn``\[[\fdcniküðèáÜÛÜßÝÝôke`dc_aedffdhkotuõçÝÙÖÕ×ÙÝãéõùöùééôîùúêëïíëöïøûõ÷îòðý÷ïþp]VWRQNMKJMPPOU]Y\m}ûîàÞÜØÚÛÝÚÛÝÚØÒÓÒÓרÖÙëóyccd_]Y]c_[^adb__hpõééæäàãìîïôÿýíîíìçãááßßàâìñó|vibhfef][ftøçÙÔÑÐÍÌÎÒØçdTPMLNOOPU]cmøúîáàãßÞèøn]XUUX[^btüîêììäÞÞÝÝæäíþ|ÿxÿ÷úñëvl`\__dcmqrýìêúvv__cim÷ãÜÚÚÚÜàØØÛÖÒÏÓÛãéøòûilniyxîäâÜÖÙâçîtj_[XVYVTYabqþtlgdmwøêàÛÕÚÚ×Ýßßçïð{k^\b^\c`]i{üóéßÜÜÙÙésbXPMMKKNRTZpíêàÝããÜßèçéð}ýyxp|øñåÞÞ×ÑÓÕÕÐÐÒÔÙçøqa^acfhosykmqhglcizù}zúþd_ld`jsõßÕÎÍÍÍÏÕÓØßÞãôr_VQSY[^fjny}|woxúniibYTOMMNPTX]bmìéú÷ùýïéáÜÖÐÒ×ÖÖÞï÷xe__`\\^^hûïçàÞÝßâÝâàßæèéòü}wld_gro~éëïò{b[ZUVTZ\gêæäÝÜÞàÝÚÚÕÐÐÏÎÍÌÌÍÑÙãèï{e`[ZZW^add[YTNKLLIJJKMPURPWZaüÙÐÍËËÍÏÏÕáïrbcikn÷ïåßÚרØÙáíûîô|ú|xspqe][UUTQTYYXWZYZ\\`jþéåÜÔÔÚÚØÜçáÙÔÒÍÌÍÉÇÉÊËÎÔÝèôxmjedlklvmaZVXZWZ]Y\]]\^YUSNPV[w~~õuotngjw÷éãÝÝàÚÛèíçúxoccbpíæÚÔÒÓÛàúeYOKHIIKSWXX[\\`nñßÔÏÏÍÍÑØÞê{ùïåàßÛÝÚÓÓÐÐÒÜåívptnc^põïçìzicc^`sïêâÛÖØÞélZPMRXbjetvpjkxwúùøôùì~iopjolb^[YXY`múçÞàåçìôôsie^]\_hmbXSKLMMS[h÷åÝÔ×ßàÝÙÛÛÚÝÝÞâÞ×ÎÎÍÎÑÖÛÙÛÛÚÜÞáäòf^YTRTYW[dl|ñëðxd_]bnyõêãçñí÷ûíëááÞÛáßÚÔÓÐÍÐ×èl^RKGHNSU[`^\]bbbfb`]\\WSQKFCEJNU[jëÞÙÔÎÍÍÌÍÍÍÐÑØÜ×ÐÎÉÆÉÌÕÞíykednôÿûõph_UUYYWTW`ebn}nmjgwðãÚ×ÓÓÛÞÛÚÜÜàããíqpùëãà×ÔØßño_VQPT[^^higoppkeb^\`fejbZWTOLNNOPT]^bwùìÙÕÔÑÑÑÐÏÍÊÉÉÉÎÑÙúf_ZZ_jûòîêííâàèêìqb_^fd_^[__^ahjlïåêåÝÚÝáÛàñ~tggoößÚ×ÔÕÔ×Ýâëzõàäëëïýviv}nbYTSOOSTRRQTWTRPMMOOWi}óëâØØÚÜÚÙÖÒÌÆÅÈÊÍÒÙïlaZY[\adbdgfm÷èæôy|oonfba^\_^_^^anøæÚÔÍÎÑÏÎÔÙèöïxõéêæêöþÿhchfmw÷êäæÞâïçìj]WTSQSXXW\\^_\^e`]dqüíèáæçßãêêëèÞÔÏÏÏÎÏÐÓÝìùoZRX\Z]_c`_hld^]]_kjhkfg]Z]^_`^iûåÛÓÐÒÏÒÓÐØÛÜÝßßèæàèèèôûlcc[[ajqìéíãáãýb`\YWZXVZ]___c]]hfmîÚÕÕ×Õ×ÜÜípzøñëàÝÝÝÛ×Ûßãïønflpzrnc^ekjc^[[_fb^da\Z^mkd^\\`pöèáææäÛÛæîèßçòäÝÙ×Üåçë|e_a_^júçßáßÝáÿr~}ümeaYXSRTUURWZY_vìñèÚÛ×ÓÙÞâÞÛ×ÖÒÓÔÏÎÑÔÔ×ßëõ}ôóìxhg\ZSOMKMOVTRTSWXZew÷|tuõåßÜÞÜßÞÚãñùúõîìíìæáÛàåãìøld`^_bkghzóýa[[^emc[`_\`ge_YWYW\h{éàãÝÒÍÏÙÛÖ×ÖÑÎÏÏÑÓÐÓÙÜáêóvÿîèìþlqýn_[XVSUZVQVSTV[]`mmknéßÞØ×ÜÙÛßòpmvo}ÿkmõíôóëêùÿüuozslojfyöñg^afab`[^^Z\\_YPPROS^h}îñæÚÛÜæãÕÔÖÎËËËËÍÏÔÖÝêíöqxìî~quûxmnheic^clggnti_ab_]bnüëçäÛÚßæíøy}úðòÿùðäàäíìêõxn~ûrmjhotonaXSOMMLMWZ[^_`^[ZZZiz÷âÞßÛÛÝÝâæÝÝÝÝÜ×ÐÒÓÓÖ×Úßáô~÷øwxquîðüngebZ\gmøäçêìøuhbg^dyïçäááÝàæåäÚÜßÞßàäáê|m{ø}üpdaecbclw÷öýri`VNQSTY_\TRRMLMKLR_iüãÞÜÛÝÝÝÖÓÔÖ×ÔÓÒÒ×ÛÜØÙÛÛàíòêîõíåæîsd\WTSQ\oøçêïø÷vhb^_ezåêèåçåêèàÜ×ÕÖØÒÏÐÐÕÛÞÙÚáî|^SOTPRUWWRSQQUVUWföô÷{n_]ZUSQOR[exòîâèùèàÙÖÛÞÞáÞÝßßÚÜÚÚâáí|ðñ÷æÜÚÝímbWTW\bròíòoqtmqcZ\i|íÞØÙßåæòöêåãÞÛÛÚÓÑ×ÜÛÖÔÒÓÛë}wmkvþk^ZWPMQSQUYfld^[WTTQNMJLPSZbs~rvúøéÙÙÖÐÒÎËËËÎÏÐØÞãøfroah}éõjlfXY[X`þðêïëëÿõçølhcexöêáàÚßéãçìçîóáÚÖÑÔÕÖßâÞääëwpqkjýõx^VWRTWX^buûöú÷rbb^\YWUNNOOS^a\^\ajlöçßÕÑÏÍÌÌÎÓÚÛßëçûùðtúó|wfY^_WYhøçæåÞÞàÝèðúb]cdmzþîð}õú{ö|o{èÛÔÑÎÍÑÓØÝÜÜáäæìëéê÷g]ZSQQRTTY`_cic__XTUWTONSY]k}ôèêîèíèáÞ×ÏÔÑÎÒÔØÛÜãë÷ýpuqcc\^c]\XWWYcyïùèàãÞÝÚÜá÷adl~íåáí÷íîúo{pqéÜÔÒÍÍÔØÛØØ×Ü|{}tkc_XSRRQOSX\`dglnwm``_^]VOPV[[\gsþý~ûìæáÖÔÔÐÎÏÐÖÙ×ÙÚÞñvùêôjajmgnh^`\Zabr}{òìùëÛÚå{kloõè~mþsmrljkhoøúÜÑÑÓÖÕÕ××ÔØëðíëìkii^\XQSWQOTV_bckb_`^YUSNOSVVMWgbiþæãÞÙÓÏÒÍÍÎÎÒÕÒÏÕßßÞàçîùdjyp|phc^XUYZiojonóßâïýùüö÷ëì|öëíçßéïæòùéÝÛÝàÚÛßרÝÞßâè}lkZUYOOYTRUU\]fzpalg]e^XWSVUNORPT\dþãçáÛÜÕÓÐÐÕÛÚÛÜÔØÞØÙØÛáâìwy|l~òpmlgkl÷òmiqwùãÝäåãÞóqó|mfiultnlilöéÜØ×רÒÑÔÔÖ×ÛÛçöñxh]XYWTRUUUXX]WPQOONOQPQTWOPUUZ^sîéÙØÚÕÏÍÏÎÎÒ×Ù×ÚÜÛÞããáéût|i_gnrone_dd`cljkõäÝ×ÖÒÓ×Ûåîùýz|ö|ýþslqêçéãÛÞåÝåäßãáðëê}fkn[ZXX_Z\^_jcXX[UQUUZ\X`[ZYPOQWYfq|æëÞÕÓÑÑÔ×ÛãâåêàÞßØÚØ×àëìòwphmúspsmk`\\]bvõëÜÙÛÙÛÞåvilvwponnknïàØÙÜ×ÓÕÓר×ÙÛÙÓ×Ýêzuh\UTXUSV\ZWSONNMNONQPMOYSOQTY_mîîßÚÙÑÌËËÎÑÕÛâÝÝãÝÝÙÖÔÔÚëñ|hgndyýija[^[VZgrëâÝÓÙ×ÖÞâè|zïöøë{öóm÷æßÛáåÞÝÜÛÞߨÜÚÖÝáìpne[XZXWYVZ\^[TQWWVXYUXZVURRTPORW]lsnîÛÖÐÍÍÖÝßáàÜÖÖÓÏÏÏÑÔÕãkfsigmmpfbh`][Yct÷ãÜÝÖÕÞàâíòüliiw{dhzñéãÚßâäÛÙÜÖÖÖÔÓÒ×ÕØÞðkfdmeXVSTVTRNNLMPPPMPQMNMVXRSSX^zqqæßÒÎÌËÏÐÓÚÛÖÔÔÐÔÖÔÙ×ÛôiZXZYYYZY[Y\`\i~ïÞØÓÎÌÎÏÓÚÙÞéïwu|ihusîßäãäñïçåâççâéðîîéíspmbk|mfdfmxihb]\[^\XYXPNONTWRNMQUUX]nùçÙØÖÕØàÞÛÞÛÓÒÒÔÕÓÖÙáûje^]]]ehed`go}ìÛÙÚÓÐÏÕÖÖßìéõd^]RTXZjðáÞãÜÛÞÛÔÖÙØ×ÒÖÜÚàïéït|øzøk___`YQRTQUVQPMLMJKOORZUPSUY\c|ßÒÍÎÏÎÐØÖØÙÖÒÑÓØÙÜãêñl_a^YTUY\^]Y[bjþäÝÖÖÒÏÓÒÏÒÖßêûiZWUV_gîÜÝÚÝåÝÜÝÛÜâÞåïìðõøkm|pyñýrmgv}rxe^e_\[\UQOLNPTWONKHLPRYhôÞÚ×ÔÔÕÖÚÚØÖÓÓרßÞØäùîýyúie__c\Z_ehüçßÙÛÕÔÚÚÜÞÙÛwe_\ZSSY_nøçâÙÛÙÕ×ÓÑÓÑÓÞàçíçíxþóîèî÷ýoh^]^\X]]VUPRQLLMNORQNLJLLMV^nìâÛØØÔÒÓÑÏÓÏÎÐÒ×ÓÚâàî|}ønc]`l_`iaajqòèßÜÜÚרÚÔØàçlmtfcblxûúäÞßÙÜÝÖØÛÙâìöfýõjoønöêzñy{ñghòünÿkgm[\VNQOLPNKMLIKJIMMQ[YmíìÙÖ×ÎÌÍÍÐ×ÔÙÛÙÜÞÝáçáëìîróÿmëìðçîøëãáâäãÝææåü|g^f`^fjkulréáÚÖÑÏÎÎÐÓÚÝåéòqnxvÿþúòùõzlnh__`\\WVVPMMONNKJLKNNMRUVWVXjoûÛÕÕÎÍÌÌÔÕ×ÛÖ×ßÛÜåäíÿõoz|eeöôûéñãÜæÞßߨÝÚ×Úâçèéìsfxwyj[hwvøèÜÓÔÜÞåíügsùxdoéìð{õéêàíîÝäó{úîøoc]VOOLKJIGDILJKLMONMNV]e{ÝÒÍÌÍÏÐÒÚÛÙØÔ×ÛÕÔÛÞéîäçñ}êäðóàØÛÛÜèÞàøÿ}øydhüûlfgb`_^\iêìßÏÌÍÏÑØÙÜìèäâêöíäåôuvxz~ôüyvdcnkje[QOOKKKIGEIKLPORPRVZ^jîêßÖÓÐÐÑÖÜÞÝßàÞÜèççêåvzõÿñtðíèàÞ×ÓÏÐÖÒÜëàåëèìóæßôç}]fa[YbvòåäÚÛÛÚêñpkõêçäÞàØâpíxwýþzçÝïçä~æäôq^SLOMIIHGGIGGJJLIIMX_güíÞÓÑÑÐÐÞÞÙÛÙÞØÚÕÙíáçìÝóyïßçæÙèßÎÑ×ÖÛðÿwl`[hbnysàþtø[[]îhùÙëÕÎÕÐÞàéyyùÞôå×Þå÷øhaj\e{óxùþsìõ{zZ^TTKKLCIJFJHJLMLJZW^þ|ëÚÐÕÖÒÝÜØÙáààáÝçðüfõkbûñÞâßàêÜÕÏÏÍÐÙÒÙßëuolómyçíà}^lrliöðëØÛÕ×ÞÝâ÷pzêçéÜÙçìé{mgialçöwpÞâpäízugVOTJEFFHGEEDFDDFJORZnÛÖÚÕÛÖÚáßÑÐÞÙÎÑÖÚÚïmôönäÕÜæÚØÝÛÎÒÛÎÒÞÞÐ|[ù[Splcðí[yûQqãeçÓÜÓÎÜÕÖôÝÚxå×ëäÞÜßnn÷\[ñ__èüchæìllénXó]KOOB@PJAKLEJJEP\NjÝmÜÎïßÕ÷èØÞÔÐêÙÏäßæ÷ùcmêzäÍâï×ÝߨËÎÞÖÉ×êÍàZzñTXäqYhfPWliäÝoÝÎóÝÎp÷ÕrxÖè×ÎúßÔkqënma~ÔíyÐm_Öèfjãè[Y_LFLEAFIFBHK>EOJTeo÷çÕâ}àágãØÞÖÏËÕ×Íä}ÒvWàßåÜÕÓíùÎÜgÌÌü×ÇáhßßXXîdZèâSUýePøÓøvËÏhÕÌnfÏÞ[ÞÊâÞÍä_áìW\ì^aßïlóçsiûyYtß`XjTDMQAAVO>K[A@^ZDbØihÍßWíÏ]ZËÐlÎÂÞÞÈå_ÝÛUýÍáíÌÑéÍÊæÚÇÖÝËËßÚÖeaãúR|ÚVPv[MyðX~ÌïlÑâ[kÜ]kÐÝùÌÈçßÒù_åøYêÖnfØè^èÛ^bßcWàçJXqGBZP?LX>=RE=RnHSÒò_Ô×UpÌr_ÇÊ~ËÀøwÉáPÝÑ[øÃÚmÇÈýËÂðÞÂÖþËÌcëÏaTÚêNëÐNLÔoKßÍ\{ÂÚRÏÒJ_ÍfSÈÏ]ÌÈZwÈvLÖãNàÐPYÐ_IÒìDvØIWÕNHßQ=\]<Lo=;gF:bv?]ÊSUÈíJÖÍNöÂçkÁÏNÖÇP\É`NÈÎTÏ¿yܽÕp¿ÇiÈÀfÞÂaWËtJÕÚE\ÖMRÍjNÌÍXÞÊSXÑ_KÚÕXÜÇ{iÈÚ]ÐØNöÊ_WËúLÕÙHeÕNPÔ`IÛçFSoBEeJ<MJ9HY?Cì_IáÛMóÍ^[Ë×dÈÇ`ÕÆlcÊøLÕÕWßÊqßÁÐzÉÊqÎÄüßÂÛfÌÚNÜÒQ\×WKÜèK{Ï_dËìPÚàMkØ_pÈÐkÔÉþëÉé_ÑÓ^ãÌ_dÐmNtpKXá[QÜôOlmELmF@UL>IU@AXPJtòQjÙji×ÜmÎÌrçÌñ_×âSçÑZcËä]ËÆuÜÄâöÇÎòÍÄâàÉæ\ÕÖVeÛZPätNõÙZmÐzRâèQjÕ`hÈÖjÏËnèÌýoÍÔ^ÞÌ^\ÔoK_jIXãYSßõQhñLNrJ?QP>HV>?SMFcìM[ÔnZÐÏhÖÉzúÐçZëìOeÐnYÐÏ]×ÈréÅÑsËÃâÛÂÐnÏÍeðËpSáÜR]ä[UÜæOìÎTUÐ|MßÎ[öÊæ`ÍÍTíË|ùÆØ[ÒÌYhÕXKíxKdÕWVÐvHmäLJiL=L\?=OG<NiDLÜmMßÑcÞÂàcÌÎRðÐSNÓáWÙÍfôÄÑ[ÕÅçßÂÏmÉÃ~äÄäbÍÎQiÒZPÙøHmÎSUÒ{UÛÙPhÑ|_ÐÎcãÆ|YÕßWÔÆíïÉÑ_æÎUOÔwFi×KNÕjEfÜMEõU;Nw=<_F9LfBHØtKàÌYbÂÖZÍÈgkÎrGéÏQ\ÈäOÌÇ_åÁ×hÅÄiؾÚ`ÆÉbÛÀøPÏ×MiÎYFßÙH[ËüQ×ÑM^ÈõNÐÉXbÇêLÞÎQ÷Ää]ÇÅ]uÆkNÞçFUÑVIÜÜKZÒZDc\>EdC9LQ:?dNAnÝLZÎèWÎÉdçÃçTÕÜIXÐnSÏËfáÁÛûÄÄzÜÃØíÇÊïÝÅÕüËÐ\xÕ[PêeJjÞW`ÍÛ[ÝÑSZÏÿTÕÎhêËéTåàXiÑælÌÍpàÏþUó`HYóTOâmL~ßRQñMARR<>L>:NXFVã\QÞÝYêÊã_ÓËdøÑ]IûîKdÏ}]ÌÊôÎÀØìÂÉæÇ¾ÖÝÆÔäÄÅüâËûUçtFS{RVÔ×bÛÓXZÕõSßÒ\rÊØ`ØÛSfÑücÌÍwØÊùrÑíKaÛUUÛuNhëPiÞUGZQ=>I=;IHAUuLSäaQèÙmçËó`ÏÑS]ÚWMÝäSôÈèðÆÉèÍÂÙÚÁÊæÌÈûôÇÓ~ÐØVeßSDYVF]ÙcfÊÑZéÐlcÔèYåÓkõÌùYÝÚZøÏïvÍÓaåÎ~_Ù{MüãNPï\JköMS{N?LJ8>PC@\\JcØa[ÑÙ\êÐdjÍìRîÝS\Û}UåÛjÛÆàìÅÌßžÎ̾ÐwÏËåÝÉäcÐãMeøKFuzNkØmpÓßYÚÌ`YÞuRÙÛOgÏkMØÔZáÊãzÍ×[ÛÎ\_ÑáTúæJPÜXEnfCK\@;KD:HV=FôRKÚÞZìÌÿ[Õß\ãàSeÎíVãÒcøÇ×xÈÈùϾÏÖ¾ÄßËÈbíÅåTÒÕ_õØYPõ\M~àXgÌÚlÍÈùæÈþSÏÒYóË~[ËÔQçÉajÅßOרRmÕeTÙüLmqINßOCl`AP\?>ZL:HdCFëuVÕÎjåËx[ÕøQtôMZ×_Käá^îË~gÍ×lÉÁÓλÇxÇÆmèÊí^ÎÑjÝÏ\ZÛ_KtðLwÎû|ËÏ^êÔZ_ÔôWØØ]îÌøXÕ×gãÒjfÕåUíÕ_sÝcYíaLffGJ`O@PP=FU?<SQATß`ZÔß^ÙÍjñËìWÝÜ[ïß[kÍàhÎÎ^îËàwÇÇêËÁåïÆÐYûÓ^jÒë]ÚàSoßdPñý_ÒÓîÕÊqfÎåiÏÍméÆÜ`ÐÒXoÐüRæñN^wTPïpLgðNVï[LoZI\fIF^OCSN@LgJKØîQðÕZeÎß^ØÕU`Ý[MmfP{ÛeÿÖébØÒóÕÇØÖÁÈÚÃÄîÜÈßuÎÑlèËü`ÏèQqßZ`Øû]íéXvÏäcÍÉþÜÉâpËÛ[ÚÎd^ØmMxïLXæNKÞrNdêXWþQKWVAHYG@PN?KeMJå`FvÕZhÉÙjÊÅeôÉ`MÚßUãÌdxÒëeÓÕbßÍìæÆËèÑÌìßÉß\×Õ[ýÎêqÕïNèÎ[^ÑõRçÝ_ÚËçáÃÉáÌÌ}{Îß[Ü×QSçQFgYDNdJMíaJìÙOaÖbLr]FYfIIcMC^sKQêTKîêUæÉæöÊÏjåæN[Û[R×ÚNvÎkcËâOÚÆîáÁÍÛÄÉáÊÇÿñÊÛgÕÎdn×]TÛuIlîKRå_UÕÍkؾÕüÈÎ\ÛÆ÷vÎûS|êLU÷JEf]G_êLeØ]YÙwH\kIJdI>VW=LfGKtNIÛüNàÇÝâÀËøÎÖWùÍ_^ÏùQß×WvÎiSÛÝYßÈëàÂÕÜÄÍ^ÙÊaùÉãWØÛOêÎ[UÔöMæÖY÷Èàæ¿ÅÝÍÇsïÈÝ\ÕßNZæKGüN=PX?KûMLÞîUàÑT^Ö[MçjCTpCJ{MKwaHaáTdÕmuÆÏ`ÑÍNgÒSNÙüFqÒRhÎtRÝÞWÚÆî×½ÊѾÀÜÌÅàØÅÝmÎÝLnÓQRÚTEéìJ_ÏcgÈÖåÃÌhÓÊcÞÅy`ÊøKÞáFS÷BDíRBïøJ{×NV×TGç^A^j>Fd@?oO?pìGnÏ[_ÆÒmÃÃnÕÄ^WÎôPÝãNwÝQ]ÛWMäwQÝÑhÙÁÝãÄÎ{ËÐñÈÊzÎÎXðÊ_YËôMÔÖMëÌfìÃÙÞÀÑnÎÙVßÓ]õÕUNøVC[T?MW@OßNMÒwNÖçPÛÖNmÔLNèJE}WAoóDlÝG_ÎYhÃÛpÆèQÓyDñåHnÑL`ÌXTÒhRÍÚ]ÆÇsÉÀèÎÀzäÀùeÄÝYÏçKÙØJé×IfÑMWÈcVÃÓmÂÆbÐÉOøÅdðÃhSÏYCëW>nj?lÝGeÐLTÐPJØ\Aüh=Uü=GëDEÜQEÎqEÍÙLʾh̼^xÅSOÌhPÎnIÏíEÚâCüÐKæÁ\ô¾äp¿ÕVÅÒHÌÈUÒÄU{¿n^¿ÙRÌèNÌÍOÌ¿^оlßÀTWÈcVÆmIÖh=ib;Y^:PèBNÍPLÌVEÍd@Úì?iÛ?XÕFTÔLNÑRGÑ_HÎÛNÉÅS×ÌI^ÖIUÌMHÍ\IÈëJÎÏNØÃ`оôÓ»×äÀÜUÇáNÇÑLÒÏLÙËMåÈL[ËNLÆtNÁÒWÅÈTØÈMâÃVwÅ\OÏZEÜ]@ëb?cêG\ãNW÷FIvKJmPDk]C[çMZÞUY×jWÖÞhÌËìÉÌYÚÒMt×U`ÚVZØYYÙZSÜçXÜÒkÚÊèëÎíqÙúkÙÜó×ÜïÏÏÝÓÒéÝÚåáÞæêÏÔÛÏÒéßõ[iæYhç[fábQeUJ[WOXTQ^qZ[ø]ZcSX_ZYb[Riacòm`ôõ_lï^tæýéÒ×öÝöSi`Ufl[bìõ{înîØÞåÚÖáÜÓÙÙÖâÞ×ÛßÝàÞßîõñçáåêâàèÞÞùìçëàÚÛÞÖÐæôåçíßçrèäwùû_[ejbcZSTUMIJKNPNRXTUTNQSQUfi`oèßëëÛßÙÔØÚÕÐÜíéöfgza_wrisl]`ioúïûðéêýxwhqëÞÚÔÒÒÓØÜÓÕÎÖÚÞÝÖÞÔÒÖÕÒÏÑÐÖàÞækoyhmg`\gs_Y^VT^_d_ZXWOMMKRYZ\d~ýg^\]][jôqlzìýíüpëßåòåÞøk`Y]c]^degnvûóþéãÙÚ×ßÞ×çuõüo÷ÞÚØÏÍÔÓÛìñééççð{ëêuÞééÛÓÓÕÑãÜäzéêÚÚùàwúì`ëy_ýzxqmaOPJD@AGIMNOl]U_SOQU`lënðàß×é×ÑÙÌßÚÙóàehygnxzl_jhogemîã|yée_kYSV[iíÜØÐÐÍÉÛÕÐÓËÖÏØÚÏäÚÐÜÙÔÏÑ×Üîèõ_bmäpúòOnö\Tem]pù]hfWOJKIFMOR_]k`[ZeY[}úúíÚÜqãàýòÜæïáßdcaTXTae]icahnòlõæÓÚãÞãìwky]cuk|ÝÖÚ×ÏÚßÛÖÖÕÒ×ÙÙÚéäòèãßêÚÓåêå}nèÛçÝÖçoèápwçäïåîm_[SJECCDAHILMNNILPOPjíõÞÏÖÞÓÑ×ÓÎÐÐÏÔÞé~eaff`legbec[jlnãñeúiYXbWPYd[êÜâÙÑÒÏÉÌÉÁÉÇÅÉÌËÎ×ÙâÝ×Úâåézpahvj}ôsghkUXic]ûçýjú`OYUJMMMOTW]UKQTMOY`ýàÛÙÖÕÒÕâßÚÝáæ|vrh]XUT[aRadkkõë÷ÞÎ×ðàømõog]X|ÜüväáßãäþÞÐÓÏÏÎÊÒÑÕÚëwáïïäóýîçõxÞ×åëÞèÜöaóvþÜïöÞìk]ZOHHCBFEKJHFFH@EHDSlîÕÎÌÌÅÆÍÍÊÎÍÔêäÜãëiV[ZXUYVMV]\mtóäöw\d`_]KM`_lvòßÙØÝÐÍÌËÆÉÅÀÉÇÄÎßÔÖôèximmükdmø{dhîeXgWVjp}éßæéùmjgMIRLLWTHNRFGKMNP_rèÔÊÌÑÏÌÖÚÏØexîl_adPQPNWT`õ`^üÝäÙÎØéÛÝ÷m\YZVh``ìâéìäÙØÍÌÉÉËÈÌÌÊÎÖ×Þàdbzhoòjùâåýïæûù|gnl^ñàãÝÑàøßZHIKFALLGOGFH@HAETSzðÏÉËÂÄÃÈÌÑÜÝÛììîsü^^]OSXNW[]\zÞéÚÖìàõWYRRO[UWëkëÚÛÖÛÈÍϽ̿½Ð»Ìʾg½KåãEÙGÛJl\öeêamdOâIãMÕiâÏëËößfQ\LMNKSLSRSMNJHPLT_yçÜÍÒÕÆßÒØZÐYôßMÏBãXMúGäKéZävÓßÉÔÐÉêÎSÙH]WLcLf\cêjêÞÙÍÔÉÌÊÊÄÉÈÆÏÍÜçlb{Z\úTÞñgËTØw`ÎCÊTêÚ}ÊiÌúÙRjGZ@RNDM?ò;UDAM@VHRíUÔÒÕÇÉÅÊÉÐÒÛÝãé~gib^OUN^OWkWìlÝÒnßÍMÝðAÐCHÛ;ÖJPÁ?Âþߺa¶ÕÁÂ̸ÒÀÈÄÍÍüÓ]tYS]IëRÛ[l\hh_i_éeÝêéí×Öøùd^aH[a<tPAØ<Pi<Î<VÝ<¿GÑÊK¸Z¿þæÈNÖWçXpîæLäKù^NÑKÉcÈßÍÕãËeÎOqfHå?SRDÝM_éYÐáëÄïÊÃ÷»×ϽÜÄËlÇëPÃCØÜGºGÛÏD¾GoÌ=¼OéÇ?¾FÚà?Ä<cT:×4WR9Ö4ßEKÞ=ÒIÞårËêÇÑÆÏÌÉóËhÛã^ÝðñnU]^KpVYæWÚùZÛj\ÕDâo=É;lf:È@}ÎCºaͼT³íĺW³]¾¼M³HÉÛ<½9Ò]EÁ:ÉMR×?ÐJðölÕ\×íÏnÔýùÝJßC]QBã=\P@Ú<÷[?È=ÏlJ¼I½èë¿QÉVÞ{_ØgÓdÚZàUWëMÕUÙÚWÊSÍÞNÇDÝW?É8÷P>Ê9Ë[aÆV¾öËÍÎÇàÅÏÀÖÂÐØÌZÌUäì`ÆNÏæOÈ@ÓiDÂ?ÇoI¾?ÁZ]É@ÎG[N?T=P@JIQIN_NkM×]wÓ|¿âÈÇwÅj÷ÉKÎÚP¿KÜÙB×HUyJ\ÝXXÕPíñOÞ^LßOOÛBäxEÄQçÆS½Öæºc½Â]³ð¾c»cüÏcrÜ_fÎNðçBùQCÚFQÊCÓÙJ¼Qð½@ÇáH½;óÞ5Å8På2È:Zá7ÄAjÓC¼RÊÉP¼AÈåE»>ÄåK»EÏçIÎLWÑNÚÜJÂLíÎ?ÃCiÔ;ÁA_à<Æ>ìèE½@ÆÒOµF½Ås³_½¿w¾çÞÄ^ÊÊO½NãÏ;À?OÙ9¿A^È<ÀAzÊ;¼>ÔÐ<»7ÛL;Ó0Ý>Jâ;ÊBÝäO½M¿Ñì·JºkàÂBºJÍØOÂ>ÐXVØ<ÎGZÕ@Ä?àý?É>ËWZÌMÆMâ÷XÙJÐfÓÚ_¿[ÆÉ{·÷ÀÀh»}ÏÌeÊýÝrÞlYñ>èKCà:áPFÅFÚÎJÄlkÃpÞÆrõÔEqg8ýC>ê:Tw:î`NÉWäÅ[ÙÌLËÜN¿YmÄGÏéHËM[ÈNôÖOÊÚIÅ`QÆEpËFÎÏBÆZ?À=OÊ8ÌÜ@»Hn¸DÀÃX´ÚáµkлU¿ÄH»úM¾=nÌ4ÉM<¿;çÎ9½ZF»?ÕË<¸ZP¼9Ïa6É6Re8Ï?hoJÈLÇÜݽX»îd»EÂÝL¸EéË<ÃHDÃ:ÜiA½?ÚØAÃAåüCËFÐm[ÂDÍWTÇ=ÈbgÁCÄÖ]ÀnÍÂýÃËðÇßÚÏí×òâ\hñBlFK`:äHUÝAÄj[¿]ÌÊ_¿ÜÿÈ`ûwMSLMATK=u?[_@ÊLßÒS¼SûÇLÎõWÊkgÑû`Ù`ZßUkÙt}ÓÐaÐÚVÒ`LÖjFØjHÚZKÜNJÜQMÔ\`ËaØÆíÉÄÎÌÅÌÏÅÌÙÂÓ[¾çMÎNHv@DáCIÏJUÅOØÂHÄÓD¿rKÇCRÍ:Yf;ë?BÔ>eÜEÆ|o¹lÏ»TÌÌLÁpSÃVvÏEðß;ó]?ÒGZÄ?×ÈBÄ_PÆ>ìÐ@ÏdTÇGÚÚJÊLqÎIËrêÇZÁÒÔÄ|¾íÝÂ]ÄòmÅNëÝEáFEx:bTGÖIÖÚõÆüÂÐóÁ^ÊìSÆJ_{?~D?g9PQ?ÚFüÓLÇúÞÇYËòãÏVÊ{ÞÜXÈXdÒMêùUÍý\ÉâhÎûoÚSdèMUûRctLz\LoRbWUÏmjÉØÚÆÖ̾ì;ýÉÁlÅË[ÔÝSaxJK`FL{FOÎlWÆÑ[Ë×TÑìLÑôGàhBVU=RQ=gvGâÊ^ÒÂ|ÕÆr{Ä^aÆ_XÊ^XÏUOÖZGÛaKÚiNÏéTÎäNæÜIjÑKíÓOÞÏJfÏLMËPY¿Sø½bß»gñ»UÛ¼JÏÅAÑÜBÑWBØI@ÖEKÒ?àÒK¿Ôà¼jÈÅNÈï\ËKîúDjDGJ>\BOñGÖ^\ÃPÔÓNÂl^ÅXëÏVÞÍ_ñÉ]zÆWíÊSèÎ^mÈsMÍWGÜKNÞOhèPüSFãHGÏNnÌdÏÙïÇçÍÊoÀÍé¾ÚÐÉ~ÑïþÝZÚUNÖFf`DÛJmÍOÊãSÆWZÎRyÏ\aÝIKî>GwAXèVgÐÝ`ËÓRÍÏ^Ý×nûïßhjÛZn×YoeôfH×^IÈìRÍðMíõL`Ñ^\ÅçXÊÝHÞÝCëÈMéÂWd¾yR¾ñM¼ïM¾êKÂÝIËêIË|J×gHõjHòéVÏÝxÌãààeÒúeÉnUàNLPFKGSXIh|KøØReÑtfÍâUÏÛPÍÌNÓÀZé¿ks¿bNÅxJÄÞAÌè<Úx<ßáBÓÍDáÛEkuIsÞWîØ]ÓÞ^ÊléÅ_ÍÊpÅ×öÂálÇébÍaVÏTOäMNàYUÚfTÝvUÝ÷XÕþÿÓPénDéLKëJbäL}ÐRuÏQçÍRäÐOìÏ\åÍbæË{çÎlñÑVnýTÓVVÕIo÷GðeKßÝ]ËÐXÌÝMØôPÖæOäáWÝßVãÞ[ÔÖcÐìõÊ[ÑÍ\ÌàfÕxeØhQâ[XØXýÕPêÖVqÚkoÎîkÐþQûlGTïJLÝTIíeMnï\aÞõ\áÜzÝÝÔÛúÍÙmÏÎëßÍytØ]YùZG\dCWtIcÖeqÐð^ÿé\WÜøSìÜkWìÚSmÐzsÐÏîÏÄÛàËÐ_ÙÉMgÉZSÚôMmòJ]êJOáQJßkNÛÔ_ëÎñmän]_heXhÞhOÚêBÞÑHeÑbUÌÔZÔÓ\ÚÍTiËbWÏå[âçR[iVPUXOOYÿgzÇõe¾×PÑÎU]Í]NÍìJÜæEoÏIuÅUü¿ÜùÅÞWÍØGÙÊHôÅM^ÆOWÉKOÊPKÊVGÍdUÊe`ÉwWÕûLåîKçwEÚü?öó?wßGãÎPÒÀ[ø¾]WÂmNÅÓSÈËMÒÈE_ÌJIÛQ@þ^DÚÛGÎËKÒÍFûËJhËKpÉJ^ÌJSØShÇíÛºÍã½Ü`Å_KÏ[NÊpKÏìCèàBhÝ@[ÙBTÇTMÅÜMÇËOÎÛLÏÝJÓÕIßÑGo×A^ÒBe¾WrÁmiÐW]ÚNOÌ^PÇ|NÆøEÌæCÙêA{åHîÛWÎÌYÊÂJäÃJbÂMXÉYLÓcAwv>fÌNß¿`Ù¾VyÄNMÇfMÄôMÇaJËõFÍßFÎíIÍíJËÖKÏÊIñÍJbÑN_ØISÏNIÑN@ÜVJÊÛWÁËPÅÐLÏÜJÎÏRÉÌJØÌIíÑJwÛBeØAU×OV×jXÓeNÐkMÍØLÙËOîÎIjÛDgÏVìÁÛæ¿ÑhÈìJØéGØÐGgÚH]ÙFiÖBdÏGSÊQQÆh^¿bZÁ`KÄÖLÌÕKÏÎGÜÎ>[ÌANÇURÅõPÇüFÎ}?ÞÒH{ÍIhÇMZÂVLÂôFÍàEÓÏJÏÈLÖÄJfÀTQÅXMÆ\IÈ[=Ú÷>tÔHxÆUæ¿[`Â_KÈÜJÎÒDÜÐCáÈIùÃ]YÆêNÍÞJËÕHÎËC{ÇLSÊOLÍ\JÌmA×ç=÷ÍCnÄQíÁTnÂaOÆÒKÌËGÕËHêÉF^ÆNKÉXCÑvEÒÝDÛÍCxÅI]ÁQTÁi\ÃoJÎæAßËHóÄZúÁslÄoNÉÞDÙÎAYÏDMÑHLÉVHÆãHËÎLÐÊPÓÅLèÃIYÄXUÈüTÇéKÍá@Ü×>gÍD]ËLVËPLÇxEÊÕBÙÌDëÇFrÄI_ÀOIÅoIÅÜJÃÚDÊÎ>ÚÈBxÃJnÀMWÁGFÅM?ÊfAÊßBÍÑBÎÅFØ¿LfÃLOÅMLÀcIÂÛGÇÌHËÃGÒÂCáÂAYÅFKÈOJÆ_HÅí@ÍÖ>äÎ>íÊAvÆA^¾SU»êT¾ßIÃÚBÈÒ?ÓÌAíÍB\ÈHVÄMJÃW@ÌlCÇáFÇÑHÉÊGæÉK^ÉLTÄUNÃZEÅöGÉÓKÍÎDßÒ=_Í?LÆNPÂRN½nV¼ÚNÅÎIÔÎEÜÊGêÅMk¾^\ÃeOË_EÙ\?èq<qâ@oÍFï¿QeÀXRÃxWÅøNÈãGÔÖIÙÇRùÇZ[ÎQKÏ_GÍÛIÓÌKäÍGgÌEMÏJOÈYHËjFÊßKÈËNÊ×GÌòAÈ^DÅXYÂMñ¿IÈÂG¿ÔEÂIKÁ>çÊ:ÄhFºHu½=ÆÙ=»EO¿8àá:¿LL½?ÊÄB¼ôI½H[¿DâÅDýÙBìÏIÞÍJ~ÐKVÛPTÒkWÌÙ]ÕÎVqÊmPÛîKjÕYU×|KdÝPWÎÔUoÌgHìÓJFÐÝDgÃÿIɽbY½ÂK[Âu?ô¿dEÓÄSGÍÅSNÈËIFÎÐIFØâ?EØâ@JËÌMUÃÆQPÉÉURÇÃZHåËaMÞÅòJiÍqEVÒâIPÏÎZPØÍfMîËsHOÚëJOØÐSKðÐhNáÆÚVeÐÚQNíÖgSrÖæXvÍÌöhÒÌñQlÞvT[ÞÝ^YðÛ{bçÎÖÿyÞÙý^tægQVklWYåØïlèÙâ`_òë÷oýätY[òík]pæiU]òækcßÓèôÞ×Ý÷úßÝxfgwv[Yh~jYYdkZhúö|gmtjZ[jntavëõìàÕÐרÓÖåìèððùýîõîþ~íçåæãäç{jøþl[[`ZUS\ifjuìò÷ããëìèÝÝâëéòlnó|mrûujnz~ý~|meûîxwóèëw{wtkkhba_ckbkl{ðéì}}üpe^`brunuüøñáßÝßãßäêéæîýðøq~ïüs{íàÞÜÚÙÞÝÝßê|u`ZZ[]_jirp|ôý{{rir}wýljrijn|òúppü}ûéèðóïäåèââäìçåøpzñrbmnf\\``X^mdZ]ea[[[dccijnzõíãÜÔÑÐÒÖÙÞáàÝïmîæï~îêäßßÜÞàåæëöÿm_XWXRY_jc]k~vquìííáÞäîëòxvnþóøìïòzøëîrknjfsp|úùôûrpîõxmmojitqqkrtneed]_k]\gpjcfs÷þóåÛÜÜÙÖÝíêîqfmÿôôéèîçÜÖÜß×ÕÕÜØ×ßønn`ZYff[\cfiquhmp}moulaa`hozìèéîïëèæwûïûóíèéááæêôîtzýyplluþh]gfaVTWROSUXV^ie_embiïíá×ÎÍÏÏÒÕÚÞîrmxåàåáÛ×ÙÚÞÜÛãèçíðîþh]YUV]_Z[Z^nnfûßáêçæâòþ~rnzïèééëôýíühjprljnúþvýþmqrsnm|zu|ú{o~yôo`]YWWVX\`_ig`dhfjqæÚÞÚÒÚåêåðld|ñïßÙØÕÑÏÏÓÕÏÖÙØ×ÚæëîlYW\YUSUYXXb_dwÿþôzwmddhj~ôéäëôéäûq|îëíßÛãìáàîûôüj^jh``lte^exg]fZQONQQOUaa`hvuilîêèØÍÍÐÓÔÕÞîêóúèßÝßÛÓÐÙÜÔÚæçßàzi}û_[`^[Y^ZV\c[\jñêãÝÙÚìûø÷ú|òäâþzòúnhjhg}ðù|ûútlo{|gnÿj^b|üpx÷íöñë÷lhfUNSXWWde\[hsegvúñäÛÛßãèúü}îÞ×ÖØÒÒÏÌÌÎÖØÕÓÛßâçÿhhnjfmaUUY_XXX[Z]vö}ÿÿdgn~éìòíôùíáähxynîÞßÚçõçuixpîÿgb[^^be\dmzogpc[WRSU\[``bb^uôõóüæØÛÚ×ÐÖöqêâëÜÑÞÞ×ÏÖÚ×ÐØãÞÖâõzmfWV]qm_bikZ]imcgyýúìÝëzóÜçíßÞèxõåk^lxbZeùö{tïxa``yyzîíy{ê^fñ~åjoßä{uøhYS[cZTYjfNXmbe\næïÛßßhWùzìÐÌØÕÐÍÑÕÎÈÒÖÍÌÐÙÕèl}]ljW^aWUSZWUUlaSN_}b\p{XpÙÞtòÙÐÞj~zspãÜù×ÜáÍO\ÒáV\ØßàãVOkdZV^eòj[ðmTSke\NiémhWXw{íþdoéàëìÚÛÿöéÖÒòàÐÛÝÌÍÎÒ×ÕâéÙÚo\ù|ú[]ïm^lu÷_^jnian÷xol~x`ýèxkæÝuùsþüZd÷vaàvbipéxYnç{méÛïhn|}]dixvüwtvfnî\Wùic_V^aXTlk[çæþr}úøvàéÛÐÏÌÌÎÉÅÈÊÉÊÒÖÕÕßòäÞóf{ó]V^`YW_j^Z`^sbZ[T[XU\^ÿððñèíïúmïøùêß×éæäîæwwgbjjûnijwfg_\]TUZSU^a\YY[cd_f[bdj{srjrðopzíýqèÝÚÑÐÑÏÎËÇÉÌÍÏÏÚÚÝííùwöm}îro^jðçáynkóénhbodMT^_\_wnX[nt]aoïçàÛÛøüòæõjl}õhlzáóçâÝáj~e^]bmbe`h]X\ZSSU\]WX^]gj]Z[c^SbùïÿÙÊËÎËÄÊÊÉÇÇÇÑÏÙÚôþØõûñ÷è]Nkökrîógdún_^YaRKLVTU]k`eÚäkoÛèÚÏÇÌÐØâÚßéôäì^\QTcÞ~uùõáêPYv[UZw^TYNUVdÿ^yfY{nescüZtjRYZ[öÎÎÐÉÇÌÏäÎÊÑÖéÚÝúsmwxd^ßô`eXàvgçßñäëèfYmf_dob`XTb_RYYlSVklÙÐàÐðßÚîyUð[W×õÎêÏç\ÖÜÓÞÚÜâhÚçnj_û^[XMO`J[cXoXp^SjW\NLTZzàÜÔÊËÏÊÊÓÐÎÍÓÕÙÏÓÓm_uhë_YPQdXphexgýccjVN`aU~Ygjb__wwikpjãÐËÌÒÇÏÚÖîòÛðéÝçÞàívø|ríjòv`dUd`V\Z_[X^Z[\gph`øa_ymml_]]`oâØØÐÒËËÏÐÍÎÌÑÒØÎËåñlxìåðílpÿmòôëõéð{jgiVPPPOR]VU_[d]]\XVféåÝÚ××åæÛæâóöÚÚâæìÝÝõ|æ×tö{p}^k]cTNORORMRYXS[f_ZVd^ZZ\W\aýãæÜÑÒÕÍËÇËÌÈÎÏÌÌÖÔãàÜâîççnq|tþl\ûandl}nZ]WVfbggkbpuûj\iòöðêÛÑÖÝÜå{íõûsnøçëùnüìuzvq[]ho^U^[WX[Z[\WU\\mýlpkfhjm`ZXX_tõåÛÝÒÏÙÔÌÈÎÍÌÍÒר×çïéãßõøêvihmtþ÷qüêüwqm][]_^^ha]dd][W_^\c|þîçäæäßãððæéðîßßãåÚÚâçäòrjeb[YZYRVYVRLKQNOY^YYX[^TUXWZ\zðæØÍÌËÉÄÁÁÄÄÄÇÈÉÉÑÔÙØÞáëýyqf^]]bc_eqfdd^Z[^fh_ihkccgrgkóÿütêâæíÞÚß~öôf_l÷pjyééóûçìj]_[RTTUWZX_]_XZcejoupjfd_^Z\Z\`cjðåä×ÎÌÎÌÉËÎÒÎÎÓÙÒÒØåÚÚíwôêygmûqgtîñwzûsmirmp^Ycb]\bfe`ikkkqvøíéßßæï}vþpwòêðîÞÛßçèçú^]_[RNSVRPYZSOU]YV\]YUVWXXVZ]c_néÚÒÏÉÅÅÄÂÆÉÊÇÍÌÍÏÏÞÕèøë_js]m\WpfbZh{`]dr{iqzug_kma`vÿtp~ðèíêÞæéäêóneiecdiyûpñêìíøÿmb^a`[XX[]^]jkhe^ji]^a^TRVURMSWUZfìÖÓÍÊÉÊËÇÉÌÍÌÌÎÎËÍÑÛÝÙãûõùzmjuöùkyútf_jrgbc_^ZX_c[]iknktíëõèßáåõúûnoxý÷ýöìëýïáïù|~q^]ff[TT^YWanj\\^aZSVWTQPTWUQQ\ijîÔÎÎÍÊÈÊÊÉÈÊÎÍÍÌÎÑÑÚãðöôþt|ýokssh_^eb\alma[goc^qrgc]oxxøæãäëïçìvmiihhuõúøòðïðòñývvqpnmmj`Z[biwzÿùi_bg`XTUSONPOLLR[fuáØÕÑÎÌËÊÌËËÎÏÌËÊÎÐÏÔÛÚÝàãéêêõø{jhbZ\a\_\WZZ_d_`ghb`\azsòæçáéìæíøýûóûýúæåìéîõø{{malxpg_^YTSZ[^eljf_Y[[WWNNPNQPQ[_mìèÞØÖÔÍÍÊÈÈÇÍÑÎÈÊÍÎÍÐÝÚÚàãêáæðúmeb^_Z[_^_[_ejiprjdfc``ejþìñöð÷üusrnnfflwùìãåíp{ótjhtìóý~wk^_fohf{njdbg[YUQOOQNLMPY_mýêçÝÙÐÍÌËËÌÎÍËÉÉÈÊÉÊÌÏÓ×ÖÕ×Õ×ãùtl_[[\ZTRUUWUY[b]Ygkc[cxüu~ôóò÷íÝêçí÷ø|èææáàæùuöngaerýla^]VQSX]V[^e[Y[`ZSRSUPSY_^fvííîæÙÓÕÏÍÍÎÏÐÌÊËÌËÌÍÒÓÓÜÝÛÖØÞàèümjd\WX\_\]cngbdzq_fsyorúìssxô|qlzûhgm}z|îÞÞÞæáòiegnpz}üzlgjfe`\]_aml\[WXROOSQMNZ_]^m÷pöçØÕÛÙÓÒÕÓÎËÉÉÉÆÈÈÊÌÏ×ÙÒÓÜÜäízf_[UVUWVVX\\X`]a\_lndmmlkmu}÷no{ï÷|úëïúéßÝÛÞëìncapf_eef^ab_ZY\_^epn\WXXVUVZ]X\kzlyùïòóêÜÚÞÜÖÒ×ÖÏÍÎÎÌÊÊÎÎÏÕÝÜÙÛããßç}hed^Z^ccZ]cf_^hwn]eîîgl}ýjgmz_Z^hj]dzøùóãÚÛÞêêi\dslbeqþghms`Zbufcmp\TXZ]SPWXWX_rhgjòìxvëÜîõÞרØÔÎËËÊÇÄÊÐÏÍÔÚÚÖØÜÞßá{jljd`_h^XU\c\[hr^`þïkcgûûim{nabpþmhtðöþëÕÒßïì~b^_a\XZombakh_bníp`]`YUV\VLMX[\]axwsóÞèëëáÞßÞÖÔÛÚÕÍÌÍÌÉÏÒÑÐÑ×ÛÖÔÝãàßïpj|omgaa[UZca\[ckvsýöxk{÷pfmsejmntqkryúèÞÝâì}ürdZ^d`^jxijkqzoqïón_b`]YVROOOWYXWbn{ýìåçóöæáãæÝßÞÛÏÍÍÍÎÎÏÑÒÕØÙ×Ñ×ÚÜÝèôxþóülenf`afa]Z_cgfcgknjnp~rdhrptljhhxúêçâëæçç}mkea]ds{psw~÷í÷þnkcfc^YUVRTSYXUX\`lôáäêÝÜÞßÝÞäñäÛÙÖÏÍÎÎÐÍÎÏÒ×ÙØÝáÙÝíw}øvepöt_hji^\ba_^dg{ggjkhjojnnmvjcfdmeoóì÷ïèê{fv|gZdpieegüüx{÷înlúw[Y[\OMR\YV`enm{æÝæêßÙáîêãîwðÞ××ÓÎÌÔÒÍÌÎÖÕÒ×ÞÛÙÚìøîõkv÷éïvvðó`]bgYTaþp`bvj^cý÷g_a`[VYceaeóåíìáÞ}nyôpewövanõónnþùqrtîkVRTSNMQZSPVacgnéÜåçÚØÝîõéqjòÖÔÒÎÉÇÊËÊÊÏÕÛÔÕÝãÙàqgm{few÷lejpc^_e\Z_nýjdeÿymnìïwkjj\Z]kjksëáÞèãæ÷qhwqiuûgdn{qqisõxvwþdUOTRNR\e^YarlwïéñéíæäütjiiréÙÚÔÌÊÊËÌËÌÓÛÚ×ÛÚßÞé}oy|xúãåþuvuff`^[^gsh^_gnjeiþp^Y]ZTW^f`lóäåëêêønlyýëæçæüöðýlevòþrom^UQOPNMV^_]`s|ekóóøíåëõþóþwíâÜÏÍÍÇÆÈÊÌËÏÚÕÒÙåãäé{hnnkorúókhuna`bdccii]]`bfei÷÷riji^X^lkiïàïþõîxifluøîååëøÿ}lc`qxjblg\XVVUXZftro}÷|aoñôúróízo÷ûxôàØÕÐÍÉÉÌÎÎÏ×ÛÔÓÝàâåð}ìåéîðççíûyzi_bij`]j]SU\^Y^`eghika[WZhmüîéêþvúüqxëççÝÙØáòôôqhmùk]cc[UTURQUZ`hux{xlghpumýìùlûçêêßÙÐÏÍÊËËÏÒÕÒÖרØÜêúñövýïöþúñìøx}oc_d{oa^b_Xegeb`ùëíîõtma\`ddn|{l_`c^]go÷îëãåçíxtsjhmqaZ[`_^`^_fs{uzîöxpkixù|skpeiøïðìÝÔÏÎÎÍÏÔØÙÕÑÐÓÙÞåäèååçåãÝáðêíxjng\[^i\UWWQUVX\^fu{þzec_]]iuú÷ðïzsññ÷ìêßÚÞßÜáìwuwkh_[ZXTXYYXZ^]eeeupjqt{þèë}opûøñéÝÙÚÖÏÍÎÑÔØÜÛÞØÕ×ÜÛàæìíóìèëçæçìèïvbeed_]^aZYa_`jyswlpqlp]\Y[]`fifdcb_btüúíßÛÙßâêìüyýzd]]^`[^aliihmmorpmeoúõhoui_^djnýèßÜÙÐÏÏ×ÚÛÚÜÚÙØ×ØÓÕ×ÚÙØ×ÝÞÜØÝäóóþf_^`XRVZRPWaeecd`^b^\W\`__ajrmmpüï}íäàèãÜ×Úäëëüdcb`[[[WRVW[\Y]chgifrxyþèò{nü÷hnèÜÛÝÛØÛÖÒÒÚÜÙÝèçâÞàåÞáÝãæÞÞéìßÓÖäîðèyhed^]_f_foûóüö}j_\WWUX[[ZWV^i[Ygôüz{àÞãÜÙÝãççìnmnrkyjoj_hph^amta_põnhjýn_\b\WdtíïñåÞåÜÛØÙÙØ×ÙáßÞÚÜÞÚÐÓ×ÖÔÕÛÙÒÖàåìêma^\ZWVVZ\]bpki_eZROUTTX[[V]foi|ãÚÛÜÛÖÙÝÝÜÚäëï÷l_^ing]ai`[Y[Y[_d_dksqr}}kccdhfzíàßßãÚÖÝÞ×ÔÓÕ×ÖßèëèøïêãâéæáßÞÛÛÙÜââàíxa`eb_fmrtr÷ò}kgYWUUVRSTPOW[[\kñèçßáÞÝßâßÛÞáëíúpk}vuzúùuyle_jiegmpnjnoe[XZXXZfopwïçÞßÝÙÖÔÒÐÎÏÚßÞÝéäÚÚÝÜÙÙÛØÓÕØÙ×Þéxe][Z\Z]__ntj^dc[SSWUPOUXPPYb`^ùߨÛÙÕÑÖÞÚÙÛãêìímeilf_g~viibZY_bf]iýûmyüu^W^ad_k÷æíñÜÖßÞÙÓÓØÖÐ×èèçëuxêàåíåÞÝßÞÔÏÙØÔÖçlbj`X]ms{óíétnofZWVWRMNOMLNRYY^ûÞåìå×ÖêäÖ×àãàÞîrûôüõïæãí~uoef^jiaktj^^_[ROUZVZa|{qôßÝÝØÑÎÎÐÒÏÕÜáÜÝàãÜ×ÜÝÛÕØÙÓÎÐ×ÛÞög[Y\VVZhimjmf^\]ZVRTZTPPTOPT_lsùÝÙÚÜÚÖÙÛÛØÚßìôózjo~{|uwpi]`XXWY]egnqdeY[Z\W_^bm{îîïéÛØÔÓÐÐÑØ×ÚÞâæãçìïçàáçáÝÙÛ×ÔÐÒ×Þì{de^bgn~ûíönie`_XWUUOLJIKKNTZ]alúõ÷òåéààÝÙÛÚßéëãäæâÞàáîæìqnc]Z[\hlh\ZZZTX\Z[\cfhaqýõäÝÖÏÍÎÑÑÓ××ÛØÜÛÜÞÚÙÝÙÔÔÓÕÔÒÓÚçvlg]YZ__]\c`\\_\\ZWY^WNMMOOS[enøëçåâßàáæåâÜÜßêèõýéçééèê~lke`ZVTV[]hg``cmpeiwnejsqmuîììéÜÕÓ×ÛÕØßââåêîææèçÞÞÞÛÙÒÒÓÑÖÚÞîííufoþrggtvlqmhc\YWPJIIIKLQ\_bm}þ~üñíôèÝÚØÛÚÖÚáÝÚÛÜÝßæòôíýeZXVTPTXXVVY^\X_j\W[aicd~ãßÛÒÎÏÑÓÑÔÖÖÔÒØÞÜÖÚØÓÖÙÝÚ×Ûåëçïregh^TW\[Y[hk^^opnh_[TOMOSWYex}}ëâé÷üðîëêââãáÝÝßççåíûÿðó{zxk]Z]\XWZaceblsmbdnd]_ppkxèâààÜÚÛÞäâÝÚáßÞàãÝÙרÙÕÔÒÔÖÙÖÚÝâèòõ÷njhnullqkdcd]\VONJIHLOQRW`ehgmon}êæâÛÖÒÎÐÔÔÔÖÝÛÜÞãâÝäï{c[XTTQWXUTW\[]Z[XXYZ_epýìÝÚÙÕÕÔÚ×ÚÖÒÔ×ÙÔÐÒÑÒÕ×ÛÚÝÛÝçäááï|}sefefgfgcbeibaa]WXWRRSWX[`dftrtrÿ~ÿòúõïáÚØÚÚÝãäáåêêïøóñþymf^]][]^^][\`b_[^^[\^nu}÷àÜßäÞÚÞãßÜØÙÛØÓÑ×ÓÔÖÚÛ××ÛÛÙØÛÞÝèóøð{r{sqng^]ZURPPNMMMNNOTXYW^`hgcyëðêßÚÞÝÔÓÒÔÒÖÔÖÝÜÕÚàéçñhcmiXXX[SRTSOOPOQQOU\UZmæåéÝÔØÚÖÓÒÖÔÑÎÓÓÐÎÍÏ×ÖÓÝÝÜÜèåÞÞîõó÷útkm~lhdh]YZ`YOPUSMORVUYY[_can{meüßìôìÜáèÜÔÚÞÙÖÚÝÝßßäêtzò~k|yf`g_WTVWQSTUTTVZ\Z_möü|é×ÛÞÚÖØØÖÔÖ×ÔÔÏÍÐØÏÏÔØÓÒÚäÝÜï÷âåü{uýjjcZX]XRTQLLNLLMRSQU[YY_hogtçßááâÙÕÖÜÔÑ××ÖÒØÚÚÝîðvmlni^`b`ZZUPOXSOPTPMPXW[kuýöäÞØÔÒÖÑÎÏÕÓÐ×ÖÐÎÓÔÏÏÓÔÕØÙÚÞìêëûuþriinb\[]]]ja[WWTOOPORVSU^c\]fjfyëæóñèåÞÙÙÛÖÕÕÛÒÐÚãßærwûskhga_ib\Z\WUXZVTTPNOZY[køp{æÛÙÜ×ÓÐÓÕÕÐÒÚÛÒÐÒÑÍÍÔÖÓÖÞÞâîúøkekl_^d^Z^n`]bdYTXWNNTUPV^[]_^[f}þôßÙàåÙÙÞÙÓÐÓÕÖÖØÚâðíñkgqh`^^\[^d]]_YV[]VQPQOSY]eõëúéÚÙÚ×ÑÒØÓÏÑÒÏÕÙÔÏÐÑÎÍÔÚÖÚáãæþsvl`_i`Y]lcaqtff_XPQQMMONLRVWUXY\ctóïâÝÜÚÕÖ×ÐÎÒÒÏÎÔÖÖãþñëuuûob_`^\baVVZTOVYNIMTNMY^^móîå×ÚÙ×ÒÒÔÏÌÏÒÏÎÏÎÌËÌÍÍÓÙÙÝëéúkll]Y`d\X`h__ig_[XUSUQNPSOOZbXWcidtßÜßÜ×ÚÛÖÕ××ÔרÔÓÚàæõkx÷wgkla^gnd_]ZX[TRWWNNRURU^gmüëäÝÙØ×ÑÑÔÔÏÎÔÓÏÔÙÒÍÎÐÎÒÛáßåôìønmlebl}f]mze_lhYVZVQONKMONP\`Y\jznñÞÝàÝØÚÛÙÙØÔÓÔÓÐØäãå{møîohüþihnc^]XRUWPMRULKOPMP\d`{ááÛÒÎÐÎÌÍÎËËÏÒÍÎÓÎËÌÑÔØãõõsdgkcgz{ihla\en`^e`XXZUQNNNRXWXgpfmçÜåäÜØÝÛØÝààãâØÕÙÜÚÞï~úmdkypoü÷i_a^XZ]XX[XSTWONTXVV`ltîßÚ×ÐÎÏÎÌÌÐÎÎ×ÝÙ×ÚÕÐÓÙÜá÷rsecm{ùðæíokvxjzûf]a]UPPMJLNMPYVWe{tÿãÝåæÚØÞÞßëöéàáÛÔØÝÙÜô}éíuýêíûøt^ZXVUWZTRVTNNPOMRXUZlþùàÖÓÐÌÌËÈÇËÍÌÏÙÙÐÒÚÙÒØàéùb^b_]m~osõu``md\fl^Y^[SRTRORWV\jkjùåàà×ÕÛÛÖÛîñùonýðíáÝáäåûiuùtlüëótuvhbd\Z``[Z\YQV]WT]`]f}õñãÚÙØÎËÍÌÍÑ×ÚÝèçÝÜáÚÒÞöðómhvùüòëìæáî~úïscgp_TTUNLOONRVUZfdavëìå×ÕÚÛÚç|õëþwëßÞÛØÝêäèz~åðmÿêtbokYV]ZRX\TQUVQSZWS]k^]þåëàÒÎÌÈÅÊÊÈÌÒÓÓÙÝÚØßåæ}b_b]\focbÿí÷ð÷oxñýjnÿcZ\^XX^^[[bdfp|pûÞÜÝÚÙáíèíhfvke|èðóæìxuùûnþõx}íõpu~j]gr_[eh]^a\[^^WW_\[hýúéØÏÏÍÊÌÍÍÎ×ÞÛÜßßÞéôõtbbmgciúüôßÞææâéòîöjbhdZYYROSTPRZ_Y[ksþåßãßÞßæåèõuøìòéßßâååäìéê{vù÷~þxhfce_[]\Z\][\[YYY[ZY]`dvèÝ×ÐÍÊÉÈÈÌÍÎÕØÚÛÞæçùnec]X[[Zbzúùõìêòìíÿvtqjlmb]^^WW`ebcio|öêçåääæçëórlmomxòïðó{}öúwkqwþù~÷øývxýttst{piiga^[WVWXW[cgtéßÙÒÍÌÍÎÎÐÖÙÙÛÜàãéð÷rgih`avóíæãàÞÞßåï÷ürinlaYYYUSSVVXX\jpnyïççëíïòúû÷üîêæÞÞÞàÞáçìó÷yúïzvþxlkgdabf`^c_YYZWVVVTR[inùßÜÙÒÌÊÊÊÉÌÎÐÖÙ×Úäëíüjdd\UY^_hs~xøñíëêéxp|mlztc_fa]]febnw~ðêíôèç÷rùöediienðùøíñûûùxrý|xþíìùëèözöíwoþ~smg^\[URRRPXenpúäßÝÖÐÐÓÒÑ×ÚÙÜÝÛÞçèåð{sulcnûøíèãâêëçèìükhpd]^[WRSWUW^belyñéîêèôý}úóútvÿ{}ïáÝææáæîóð÷ztr{{~~opkacdc`_`\Z[]ZVWUW]hþéÞÛÚÔÏÏÏÌÌÐÒÔÕÜÞÜâìõõ{iic]]\_cyxsûðíûðéôskptpkih^\^_fkpüíêèàáâäèíùýtlib]Z^cgny~wsöôþ}ÿzsýëèêæáçõý~úû{wpke]\^ZUUX\]e|ðñêâÝÚ×Ö×ÚÛÚÜàêìéîûôðóû÷úonxþîæàäæÝßçéïüpspc``[TVYZ^eghrúýøêêý{úÿst~tkkcetúüýëçìèßçüîïmxëêø÷ìösptjjna\]\WU[\WXeggðéðäÙÖÙÕÐÔÖÓÔÛÙ×äîèìxl~}gfn`\gg_lïõwïå÷yðòlwõthii__u~qùæçäÝáìâÞé{wzc_hcZ]_][_ddo÷ô|üïvoyroðÞàèàÜâççì~óìsbed`_bb\^knmt}øêáåéçàßçââéâäîý÷óóðîê÷z|~up{îâßßÝÜÛÞíîúmkj`YY\^_aihnþ|}ÿ~õüþ{om~öuuuruüývþêáåçàéïýogeqþýóðìïêå}jhg_ZYXY^`_`kvüðëíëßÛÜßÝÚÚÙÛÜÜÝÞëõñ{zöñxkrnea][amnmûçáãââêïìñ}yriiúëþýæâêõîììé~llkc^eg`^af`^agkvýs{óõlhnnwëäãßÛÜÝØÛæçëvaaha`fi^_ifguyozëïvüçò}óïðçáîôèåíèÝÞó÷î~pkoyòèìæÞÚÞäÞèÿywjac`]amjbt{fdnzzú}mlxzimøqoýóynîèìêçîúì÷ecnkdwëëíçäñïì}nlbWU]_\]mlizwnùåêòäÞæçÜÝäâàæéãìùñèðwîêzii_WY^]^wõ{ìÝÞäÜÙäíëôp{ñývðèó÷çëu|íýovwe_g^[`cYZ`^\gyw|øø}y}mmùî÷ïßÞÝÚ×ÜáÛÞóûôh]ff]\fi]^b_atzloþ~nqìïüéãíñâáãßàéèâåøztigpu{ìèéêåÞââßçþqykfnhbevm_kvkizzmzürjvsikývcmý}xîéïìçïstxjiu~zñëîîçé÷øó{ddlf^_dcgjegmln~îîöïæçæßßáâæìóíëñöðùýñòtlkd_`mki|õöôæßäæçêùòêóúõûÿøîòþúï}lwxlfghjljib__[]dcbhwýüÿøùûîðñêëðïãááÞÝáëæëxuwe]`h_]`f`_klhnmfkñëìâÜêuîäñøèëûðìííçípzëíöíî~{ïíðçßîròëwsùwifhhm|pcuî~pûýihp|s~ómbnqdi~phxëóüìê{ñßì~ïîvnóìx~êüiýònglc\^kb\im^iùwm}óøìÝÚÝÙ×çýäãø|úviwó~zòþdrê{h{ôloíëýîà÷rèç{}çîpÿéí~ëçûðåûk{ýgiôûeg}fYbd[^ebe}ïÿ{éäïéÞízïònsëìuðßð÷Þáuona`gh\[no^fzf`lþ}ôÜÙâáÚåïãêkk|slüï~}åàîêäëö÷ûovìîzÿñ|þïøooøwkøïzúääõðëùsvwizëwdhqg`kpc`vsiyøuüàÞìîåëuutdkùýp}æäêèéþike^`b_fnk_ewpn÷çâÛÕØßÝÛàéíýigmebltpuëèûîáíptùutõùsüæí|ðòùìíïóêÞãíæéùû÷ýnnuqwwodhm^^feeggado~û÷êëôîîù{y|yýíííÞÝäêææûvm_]]___b__`elmðãáÞßÝßâàåïúüpjgdgwþþíìéåîõ{pûøûýuùïóôíôöíõïïþôéíøû÷øzorpsùø}|wzznmnjmuigighnþöþóëözþzow}zvÿîêìçéëëïÿjgfa`fhbbggeipýåÞßâÞÝááãèíöülcefejpst~øütw|tõê÷÷êèíëäáèéæõþïìððîûz|ýxhyýv~ûwkmoigprkipfaheelp{{üïøöæë÷ñîõýíèêêâëøð÷jfjicfkd^ab^`p{zíçíñçâççÞæòîòtkrrkmponx}nxôîúöëïõëçìéèòøôðüýíï÷ò÷tssoirö÷þôóst}sonuoiprfafbajrqs}öûôæéòìîúõïïïó~qlssklsoqþvmighai}þùîíôïêçääçíóîþikmgfijkkosqrýøùîêëçáâãåèîóìïùîèñùñ÷xuz|yyüunqllpyvoxvpnokb`_]`nvtöíëçãáããæëëèåíôúojjrphllfhklghjfinqrÿûxzûðëäàãåéí÷ý{qlhkowy{|þøóïéçëêèðõíèíîëðôððóôø{ysmmu~ypovz~úøþþõïù÷~kfa_^dlnv{y~îåääàæêéíòû}ogdggjllmm|ùþ}|nivypyñô{öîðìááêêíõzomcdghhgqwqv{~÷êêîäåíéãäèéæéíííòéãðû~|mjlibaighþ~{ôèí|ùôtcb_[drrüðìîæÝÞæàÜæêäëóù|l`bd^^jicp}okkldfne`yúnvõðìãßßååéîíîxuõÿnnx|züóvoúzlÿñ{|òò~ýéò}íçïîãì{w|xoy~ljysm}ïîëáàéìêûkhh^]cgmÿùûîâáìéàæðëë÷ÿvg_^_]^müpwïýrü÷po{vhnðÿoóîúïãåææéó|ü}kn}mfmylkwþrxíû}íð{öîúùéåéëááèãåõþù|ihuncjvff{þyïãéíãéuluf_m{q~ëîùìâåëàÝìîæõlprd]`c^bnfew~loôvimuigu{mvîôðÝÚÝáßãîôõupôûjk{kahpjkõîzýúgcyyqþìêîêäèìãåúöëúy|}kfrvfl÷ýôàÞäáåíþpnhh|ÿnlysvúéèæÞàòúóidonfgmnjjhdhywkpöûmoznipvr{íçâÙÚäæåëþsstounba`_`fpwûêåýjpnmyû÷ëååêêæäæäãïùîë÷pmkfilggûìòðéèëîïzmowtpujgtñôðßÛÞàáît~üomqqgii^Z_g`bnqlx~kdouimùø|åÙÝáÜÝæçèýp~ñohph_gwjiýïypûm_i|kjòëöûïýzæÝçèÝáñêêtixýifý|mìäöýèàìîèþi|öhfrodsôöìÞÛñþèïvöðoj}ýfac\Ycj_güýmlngdr~ipìòöæÞçéÜßððìþmþ~gi~zekvmm~{hiüuhmxkkñðwyòùùåÜÞßÚÞïòðys||nsîót|ûxùäæðóí|hmuimøufsóñíæå÷úåéþóòxx{ncdmd\_lhkÿtgforlpø}zìñ|øíèåæëõúðöopzqq~wtxwtkjprsútho~}y}|w~ïíóæÝàèçëú}õövyóõ~ùýll~òüôèìøóöqtõôsuùøöòíðïæèòôðût}}fagedfe_aok_cjgclrpúëóú÷öýøáâîåÞè÷ìè÷ðéølzê|hoh_esochofhtuipó|wîåçåÞÞîêàæëêäèçáîüññzuùüsþùmgkpjoxmj{ðÿwóëðìçó{ðéùzõ{nvûsk}ülhjhafngamúun{lci{xrõëîòìøxîêøxöîõîéóx~ù|vytlo~oi{þw~øùõèçöúîïzóëøüêçïôôûuýí~yëïxýïø{óë}rðëøïë÷úìçð{øúms}kfjeadjkmysc`ggfjjjs{~rtøthxøüïæèîïìïíàé}õèíöðíüolmebigaeikpþûxùìëîåçìèãæèåäçìííõøôøþõóñðõzmxyiguxpry~~ðñöïïóþüõþw{~ûyuppzslmwxmnyssmjjkihjljfehnpuutýøòïòèæéèççãåéíñü}qeggiopýøýïêëíïñìéêîîëêõv|{tÿû{ýîìïîêð÷ððùz{zûð÷yûëìúõêïþü}mlyyorphimd^bffjzüouúocelhjpqipòýuûüp|îïïçáèìääíçÞçüùörie_[]fflüõÿòî}{ìåæäßáæâäùs|{nx÷ù~îåíôîî÷îîym{|lhtsq{õôòìëÿusnpüîòøóôymfcbnpmþïûwsk`bghghihjnjdlunp|ÿ|~ðöûîæææßáçãäðummiionoøðýþüqs÷ìéêêåêô{mmzwrûîíðîèéìæãîèæñîêúnpúóøöìíêãï{|phkq{mjwm^[\[_hhksþwhfgcjpnr~}svzpoüîúyîïùù÷xuúêìèäèéãé}mpi`cmnj|úpm{~üðêììããîòüyýìíôíèëù÷íñõëëððïø{uocg|þxõìíçãëóïîýtü÷xþùrhikjntnnyþk`ab_blllpvheljjz÷þ}óïùxystùòòëåââãäéôòösklmjnmfivqmzø{ûóyklos{îìíìåéóïæãèåâãäßáïóõyüîîõíçëîçæìòóvloroigb_ciihkkhklf_fkghqûz}ûwtýõöðìîîêéöpnqnq|þòëìúzöõx{þrimnhdiko~õ}vøó÷ýýxsþðïêàßåèçëïèéõýðêëëìýoprr{÷ôðëíûóçäéìðõõô÷zzû}yýüuknlcbcdipojn|}iinmkqxp}óîñö÷tmÿóÿüììðïðöõíí}yõù~|ujhjqnlpljmkb`kpwùíçèàãìéçéêéêíïíæéíëíïíï÷ïçèïðìïóêíúöîúpqomo}ûoongbbb]]gqoûêò{û{lròòusùõôìëõ~zwsyòü}ö~mlqtvyvszòùuzwnoyþyookggijsîíóèÜÜáâãééáèøóõ}ms~mk}õx|íðùñðûþíëøîåèëçê÷÷ìêïðìøvtl_]ddafz|{ó}kddcfpoddqsjoû~px|~óåéûñë÷ùéêÿzððùìéöûîûlrvk^^^WXcklõåççÞßííâçúîç÷|~sikx{xïèòíàâîíçëïëë÷öæïûðóqpøõz|ùpfed^`qro÷åè÷îîtime_cf_^jkbjýþnuýzÿõò~|ô÷}òò{}ðî÷îäçðíîyxwh^`d`bmù÷ëßÞàâçðóðþnn|ncaf`dr{úìçêêäãèéàâéèããåáãéêæí÷ñîýv}shdggbfklp÷ùlge_[[[XX[][_ijtòìííéæííçëïçåîïëëíèåêëæí{~ùrid^ZX[^^e}ðîãàéïîï|zþunxwhl~zzñçæçäáæçààåãâêëååííéðwü÷s{ðþuwvlgklgjþü~õúmda_XUYXVZ^\apqmþîô~ðî~üêìíåâèèááíêáåòïî|þövgima\cgcmîéêåäîóõuejvkdlpkoùñõçÞãçßáçäÜßåÞÜàãÝãñèç}uøóÿúí÷u~~kcihciytmsrc]^XTW[WW^cak|{vôî÷ôêêìêçêèßÛÝàáçïëæñþöøxvwked`\\elvðî÷÷îí÷vmjdhmlpüøùóëæåÝÛàãÞÝÝÛÝãáÝßäçêðý{xtÿöðñùúzwyrifhlloonuwlb^]ZZYX[]_fmonuÿxry|~ôïîíåáÝÞåèîñòùø÷ñóùýxqtsjfihgxüÿõëíóþ}pkkgbfmvzôíîêâßããÞÞàÞÝßÝÙÜåäæõôî÷}ûóøöéìø÷íûmqnhdcc`gmb]ac[Z^\X[]]annhtülj}õúôééæÝÛÞáÞßíêåîòîíþýîüqt{f`ki`jypxíëysþodekfhýþxðåêñèÞèçÛÛÝÙ×ÜÝØÞîîéûlvÿs~íöúêçõ|öþhejb]chbcme]_c\Yad[`khgqtddljdrûv|êåëçÝÞåãßæèàèøîëþ{éäïóïyghh`gzts÷ëõýþxhgkbdpxmzëîúòéêîäâåÝÚÜÞÜßëëäíúñòsqøø÷éäêíëöoif^\ac_`fa]]]YZbb[^hddllefkghwõûòãäêãÜÞßÝÞàÝÛãïñó~|ïï÷øûlehh`dsohvùxpyoekplix{p{íôùïëçêâßÝÛÙÚÞÞÞæèèïþÿþpmovwóðùøô{kifbbhjhfkh___a`ekgdhkljkadf`afnnxóêêçäáßãäââèðó÷}~õëììëíüsouswþÿõö÷ý~xpsxokjmkhwü~{óîììíéäßããàÞâåáßåìñ÷qkoovøðôíïúsnc_dfa_gf__baadba__^]beb^clfhuûzùéêëäÞàßÞßàÞàèñôürwðìö÷íótt{þzÿ{þù~pq~nkt}nlyzln}ù|ûéææãßâÝÚÞáÜßïíãè}÷ìøotvnn|||zqiekgafpibjpdbkniiumd``_cb^^ekdh{úzñçâêãßàäååêèìú~ûxqþéíðêé~q|ø~{ôó÷üõüôò|t}xiizþnwñðûïéêíëêæãäáàÞêïçãêðëç÷nxü{rvuvnjehfa_fichpvlt~~lklf]Z[[\[]dkhgqòøüëáçêãâäçããàæëòðó}þíéëëåæûÿøúnrûöÿþûüóöú}þlhmxpntøö{ôííóìåßâàßÝâíñçâíéãæóýzznhggb]\^a]^_eglqþyoúñ{mnmj_^_a^^cjicmùòýíçãìïêçììêæçñðìí{zòæéîèæöÿþ~ý|òêçéëèâêùùùpgn{ynvüþpt}üûÿüôéëìêæìöíáéîíçèðú÷ózpppg__d_[^m}u{ìçû~÷þhadg`[[b`Z[^fci{øþôêæêôïäãèåáßäéçâê÷íæçñôìéüptû~uýåêõêâìpqý}ffs~nly÷}uôåçòðåàðøçãîìâàêéãàçóòñ÷rikf]Z\\XU\hik}ééìñ~{wkihj_]ab[Y_hhj}øóóëîïíîíèìõòèåòøìåññíìüöûíóxwòéîôàÙâëæãxjvõsbjývfdmüqnõäîýñäùhxçéÿéÞãïçÞãïèãåñuqql_]`^[\cnoýéâé}rkmf`]c`YV[ZTVdkbdÿëþr÷çìïãÛÝêìÞÝôøàÜìöèä÷þêæýpúî÷xöèçëíû}milmlkllhccenùîíéßâíúìëùñÜÜåèÛÚéöåÞìüðìqcerbWY``YZishqîðh`lud`qze]]^]Z^iiitýÿy{ûùïæàåäàåïóéåìèàê{ýèì{wðñxyèßæëàÞît÷éüktõzhjrdZ_suiqïìrl}ñýøâÜàçßÚßëêçèæçîïíò~uqmddkmkfnøxjjpkb^fd[Z`ZOQ\]X[ptcf{ùpoêÝåìÞÖÚåæÞßïìÞàóõæê}~ðõ~~ýø÷òôþ{onzýùýúunniehptjmøôúòåíûêÜÝáÜÖÛßÜÛÞéìãçulüõh^fla\lùl`l{k]dpoklpnkfdd^[agfbfmlilqnvõííêëìéæë|~çèúõèí}zóñtoòäé÷ðàäÿ~èèöóäçütòòkdmtqkimhb`fjfmñãåãÜÚÚÚÛÞàààåååéòðíýoxöÿrxõûkgmjc`inb\^bYRU[[Z^ifcilmlmzîéæàÝÜÜÜÜÜÞÝÜÞâãêîöõþoyÿspþ~sljhfgsúúúýðöpjwztpþþpmxvjjv÷ðáÝÛÛÛÚÜÝÝÜÝáééíòxpmc`epll{ösmotmmtsmkomndaachlqunikd``kpxûðíîëíññð÷îèäåçåëõ~}~ôù}üíïúõëð{÷éèðéàæøyyplmxpkfgd^Z\`^bqîéäÞÜàáÞÜÜÛÜßáäé÷û÷þw}úùòõ÷ywoopÿpfhlf]\ZXVY\^^eihd__fjkôéççßÝâçßÚÝÝÚÙÛÜßäðüù~ýzsovnhflkmq{{~ïîðþþnov{oq|thchccjy~íâÜÚÚÜãáÞÜßÝÝãïóugfkf_eikmxuomwzv{omv}leba^`cbajykhghdgmqoûïëîöüþêæèèáàâäãêðééñùô÷øûûszôíëëèêçááìøûüuspmmkc[YXVY]aepîéæäâáßÝÝÜÚØÛáæï|y|ulo}ùö÷÷üüwryvkfnka\][XUVWYZ\]`bemrx{òèèìéçåâÞÛÝÜÛÛÝÝâéèèñü÷ôþsvnjjoqyt{öíìúöîïv~ïñ|üüpb_d`bahpùôìåßåâÝÝàßÛÝäìíxojg^`ifhn}npÿùsyüôúý~rolhcb][\`\Y^je^iomhw}}yöëåäèåßßéæááëéæêõêãèñø÷z}|þ}íêéçàäððïùossldc^]^\Y\b_drò÷íàÚÝÜØ×ÚÝÛÛÞéêîõskkvjepzqjuvmiqpkhidba`a][YYWZZ]ahiq{yøñòôæäâáÚÜàÞÛÜàßàáëïìëùõøütmllnlsùìòêâàìçâçðùûsjfkgc_dccdlvþõéÝÜÜÜÚßçéèðöþynjkeeejglrwvþ÷íïõñõö|{prhed_YWZ[YX]`b_gjifný÷÷îâáãæÝÜßäÞÞãæßÜáéëåëîöùû}|õðîìêäæëôíîøohb_\[^^\[aehepöíëÞÖÔר×Úßåàãîw}÷xjmwskkyslhryrhjrnhfhgb]^\YWY\^^_fkielxwo~êåèàÚÛßàÛÚßæáßãíæãëýüíñrm|ûtqïèîöèäêðíçìyjljb]_ba_cgikqùðëåÝÙÚÝàßâïüòðzqv}tlzöù~üñô}|îíöy~ûqflui^^c^WW\\WW]b^\^ccbj{ôîêáÝÝÞÞÝÞßßÜÞÞÞÞàçêéèï}üðð}þéäêòêèót{õufbhg^Z]^[Z`jffvìíëÞ×ÖÛÜÙÜçñéèîôòìñû|ñíø|þöüvzyrmlpnjcgf]\\][WX\]XZfke^hrlkzäßßÞÙ×ÞßÝÝãéáßãçéèóúôòüou{torõííôðìôû~öòtmmqjb`bga_ekrp|íééãÛÜàçéêùöðøý{û|sp{î÷øôëè÷óïíúx~zwmoqkg`]^]\ZZXZ\ZZZ]^]blùïéáÞÜáãáßÜààÜÙÜãßààèìêîîúý÷óïîíô÷ðzpt~{jiqzi_aaa\[^`cetðçãâÛÜÜÜáåéãèïíéåõ}ÿú÷tvüóöuxz{ohjjicaegh^^_`b]^]^_]_aggdisòïîæÝÙÞáÞÝÞçåààêðêêëóöóú÷{pqwø|ûõíìþþüíð~ôíèôutqoc_cijem|ñîôéæåë÷ñðïüÿóïîþwooypwýëêúóëç÷uÿûwhgmnneilic\]\[WWY[^^]`ahipùêàââÞÛÚÜÛÚØÚàáßÝãëåäéý~ñïöyøóóúvuopmint|siggh^]`dfchuóîïáÜÛßäâààééäáãðóõûxkvýþwwúýýxnlghdabfiddjmi_`ab^Y\`h`^gknjtíäââÜÜÜÜÛÙÛÜßæçêéìòôñíû}ûñîzr~íôtÿòôtrõóùvsxqnhiiigbhoyøõðêäæëíëçîðéæåòúøúyjs÷ñü|ñëìúÿú{ogjmjklqmkomibb_YX[^\Z]djffvíìøîàÛÛÛÕÔ×ÜÝÜàçìééìêìëëççòÿ~ïí{suýuilu}kdjlb\akgaaltsuúíìåçéèäßââááßäèììðrxýùwlr~|igotnbakkkgkmjhhkgc_^^\]_`bjslkxéâïíßÚÛÞÚÖÙÞãâäíÿþíñù}óììí÷þ~øûywûñúu}öð}nnog^`hlgfpüýon~öù~ùëæããâååäçíõóúplv~zuþ÷ÿljqþ{ikxxpkmupliidd^ZZZ\[\_hhchnùíðíæÞÞåߨÕÚÞÜÙÞêíçêòúîèéíðïóø{|þûô~qrzütjhmj[[emeam}|npöìîõïæãäæåàßãèçëìúolqzsqstylbdllbj~õylsû}kehhd]\_c`]`a`abcer}{øêàâæáÝÙÝßÞÜÞêíèàæòïëêïùñíïúöìåèñïïõývpmml`]`idahlzmiyñòwtóèíðäÞÞáãàäçîþw{ýysxÿ}lfimnknwù|mpxyiaeie]Z]_^Z\adb`cjvt{ðéäâßÜÜÚÜÝÞÝÝäçæßãïòëéòýûñêïöíèéûz|~rijopfcffhechnslmsýö~üóêçëçàÞáëëéçõ|ùõûppu|uiikooku~öýs|ý}qmkgc]\]^_^^aff^_gnjlþêààâÝÚÛßßÞàæîéääçêéêéîô÷íêõ÷ìççñþýøyigjmhbdkokjp|zjiqttln~ôññëåãçíëèéíðòóúrmpÿþpoyûzp~ïîüxýþ}qllfb]\__]\^aggbeimlioôçèêáÛÚÞßÝÜàèçããèíèæèìíéëí÷~ùòïûy|þ{idhkg`enyonú÷|mmqspim~ïñøìåáçîìëëñüøõûomr{wmpyøúyýîèôzøôûkgkic^_dfd`cdbaacfkhflÿîõõëâÞãäßÜÞååàÞäéãßàææâäéò÷ôïîõ÷îíùngeifbahusntý{kfjmf^ep|wqùëêïðêêêëïïîîõ~üõóöú÷ðøw{óñ~q{óýjcjkgcejkiddedcchjkllrzýúûîåàáàÞÛÜáäàÜßçéâäëëæèï~~øù~wzõúummmklinvzÿos{þvotywiiosniuóíô}÷ïôzzöóöþùóðïøþúýöùû÷õøxü÷ùrgmptjlxyqffeb`acedddggilnýîèæåàáâçäÜÚÝàÞÝÜàéâáçîðëó÷ÿzø}tommnljlvwmknmomgozujfjonkwîéîôìéðùüðêìöôëîô|xýýÿxzzprkoxvrjmssnn|ùwgfklhegmlg`gjkkp÷ìçéèâäæìëåÞßççâäêðëçèíûóï÷}zýÿ|svý}|yþøö~pvü}rkopmb_dfgdjþû}svöúþúïåçïïììó|{÷ðóó÷ôõ~nourvqu|{wtyü~mfllf^adb][]afgl}íèêëåãâåâÝÜÜßàßßâìéâåëòíëôwpþÿqmptoohmquzo}þyqllhfc`eksqsüïôzzðîñòêæåçîííôýz÷÷ùü~ýskeglklnu|ôûxúóñþz{~ugcdb_^^difguùøùúíëéèëåãäçæäåæëéãäãéëèìõ|þöü|zùôõz{ñòù~ûýykfe_`^]bhhilqxzvt~ðìíêááçìëèæïôëìïïõûýukkmmnjpywwp|øûõ{xxne^^]]\^cgien|~÷ûëçäâçßÞÞãåáâàââæêéðóñø~pvþ}xtw||xpþôõüúò}oghgcdbinqpp~|þýúíìíðëæéêôöó÷ùýøòõ|uzxokmnnpqvûû÷üòìêë÷ð÷tjdhfc`^bbb_dlljk~íëìîéèéêïåâäåäàääêìëòö~ùùÿøy}ï÷ôîôïêøûðxqd`c__\^`bdaksps{õëçëèâæèìëèéìöîëñ÷|úøzrnqpvooy{üyyø~~v~mnnef_ca]dd`bemnpuóëîèçæàåæåàßÞãèçíëöõ~þ~lnxr|puûù~ýíóïð÷ðýxpnolf`dfgjjstqxxûóììðëëéðøìó÷ýøîùþwÿýywm|~~y|íòíðïêóõûþ|urjilhc__\]]]fefkl}ôïñíééêêãàãâßÞâãæíéîîöwö~ùþöîðìôòíòõzýymiefb^]]`]`cjpq|yöìêéíåãäåéãäîôõëíôûþðvpnuþnwxýô}øþø~þ~nvmlljojlbefcedozzwwùîïñìäççìëäéåçèæíìúõüsurÿyzöùîìëðñëìñüùö}}opneb^d``igupw||òõóñôîíðöðîôö~ïôýüyü÷}|zîsóæðãzìïõêþzmunnkdkkf`\``]_eoimm~üøôùäèâçìæâßâåÞãæéîëôûuýôöîòìîìîñèïûpnfvqkicb][]]acgoxyÿöïíìòìâçæçêçèëòìæêõ{üþyxpùú}}zøøzx{üwnhgkeiginie_cfnlk÷óùþüìíòôëçëìîéæèìëéíòú|úyutr÷ûóøòìïìóìëñøyyzvsuxnieafefhn|y}wyù~~u}úþû|÷òòòùíìôüûõú|~òêíñðêãéóõíôytlpnnjijba\]b^_bksmkkuþzyüëëîëêâáãâàßæêìèìùðôïêìíðìëìòøîùrkfkgefgga__dddkovxvzz÷ôðöîéìêîèãæåçââæë÷ñþvyxøûxtwÿxqquynljlqnkijjhfhopttwû|yuyôøùñêèîîîêèìíìêíóú~úyz{{ôúøöõñóòöíëõø{ö÷wtsþromlqikjimhkkoploktuwüýðìíîêãåêîíìô÷óèæêèêëðúõüó÷{zsvifc`c^^^_d`abgjlno~u{ýöíìëêåâãßãßÞâàäããêíîìðôù{ô}{zpzrojiibdaghghinkhhgojnuyööððîéëêìæáæäçãåèìñð}wssþvqrsuqup{wqvjpojkglmljnwllot{s{~ýü}öüöïõõôõù÷÷øòüúûöðóñóîíïõûóñõîîêêìïðó||stwopllgec_b`_``hklko|{|zûíïìêæâäääâãåäåäæèêïêîôôôõ}zmopgc`_^]^[\[\]_gfkknzzþúîêëèèäßàââßáâãèåææéóóù~xv~|xsÿþwqlppjecjjhfdgeecgllnu÷ððîðçèèéëååéëëççéîíïöøwtsptrx{yy{ýwqquxurkjtpkhlnijhkko{züóùùùòùòûúîõòøôõìþûôòóúøóîôôôêíìçâåæàêëìívlrolffhd`^^`_aeipuwrþ~úûûíòìëêáãäææåäèéçäéëíïøîëáÝçtïlk}^b_^b^Y^_h\[_ccpll÷qò{éîräâäèäìîïðàôôèàîîõííúxxêxôïqþë{k~tieamügaoj`jb~ìwxããçãèßßíìåèßéãßßëãéðæývæðw|jxknmíùpáýzvsõhmlm\ygVnWhZcøs~mvlí÷wïiþê}|vë{ÿv}}~~ê÷øèíyèçqêåÜêæÛÜíæÚì~þðûÿmo]baZfT`ilYcwadpýYóâföáèâ
\ No newline at end of file
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_gsm_1ch_8khz_13kbps.info b/media/codec2/hidl/1.0/vts/res/bbb_gsm_1ch_8khz_13kbps.info
new file mode 100644
index 0000000..2dfbe31
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_gsm_1ch_8khz_13kbps.info
@@ -0,0 +1,17 @@
+975 1 0
+975 1 600000
+975 1 1200000
+975 1 1800000
+975 1 2400000
+975 1 3000000
+975 1 3600000
+975 1 4200000
+975 1 4800000
+975 1 5400000
+975 1 6000000
+975 1 6600000
+975 1 7200000
+975 1 7800000
+975 1 8400000
+975 1 9000000
+520 1 9600000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_gsm_1ch_8khz_13kbps.raw b/media/codec2/hidl/1.0/vts/res/bbb_gsm_1ch_8khz_13kbps.raw
new file mode 100644
index 0000000..df903a8
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_gsm_1ch_8khz_13kbps.raw
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_h263_352x288_300kbps_12fps.h263 b/media/codec2/hidl/1.0/vts/res/bbb_h263_352x288_300kbps_12fps.h263
new file mode 100644
index 0000000..652581f
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_h263_352x288_300kbps_12fps.h263
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_h263_352x288_300kbps_12fps.info b/media/codec2/hidl/1.0/vts/res/bbb_h263_352x288_300kbps_12fps.info
new file mode 100644
index 0000000..75bfcb6
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_h263_352x288_300kbps_12fps.info
@@ -0,0 +1,122 @@
+26362 1 0
+12023 0 83333
+10647 0 166666
+10269 0 250000
+11076 0 333333
+11104 0 416666
+5909 0 500000
+4291 0 583333
+5149 0 666666
+5353 0 750000
+5185 0 833333
+2736 0 916666
+21575 1 1000000
+2196 0 1083333
+4340 0 1166666
+3109 0 1250000
+4410 0 1333333
+1731 0 1416666
+4557 0 1500000
+3376 0 1583333
+1352 0 1666666
+2844 0 1750000
+1787 0 1833333
+1088 0 1916666
+36843 1 2000000
+2520 0 2083333
+3749 0 2166666
+3784 0 2250000
+3402 0 2333333
+3795 0 2416666
+2345 0 2500000
+3142 0 2583333
+2948 0 2666666
+2018 0 2750000
+5133 0 2833333
+2276 0 2916666
+23468 1 3000000
+1522 0 3083333
+2299 0 3166666
+3273 0 3250000
+2630 0 3333333
+2915 0 3416666
+3032 0 3500000
+1890 0 3583333
+3718 0 3666666
+1990 0 3750000
+3139 0 3833333
+1806 0 3916666
+23208 1 4000000
+1419 0 4083333
+2263 0 4166666
+3131 0 4250000
+2645 0 4333333
+1880 0 4416666
+2239 0 4500000
+3637 0 4583333
+1941 0 4666666
+1577 0 4750000
+3777 0 4833333
+1816 0 4916666
+19601 1 5000000
+1104 0 5083333
+2808 0 5166666
+2411 0 5250000
+2159 0 5333333
+2411 0 5416666
+2408 0 5500000
+2388 0 5583333
+2418 0 5666666
+1481 0 5750000
+1926 0 5833333
+9022 1 5916666
+292 0 6000000
+701 0 6083333
+747 0 6166666
+2059 0 6250000
+1693 0 6333333
+2078 0 6416666
+2975 0 6500000
+1317 0 6583333
+1742 0 6666666
+1019 0 6750000
+1053 0 6833333
+14183 1 6916666
+1467 0 7000000
+994 0 7083333
+1709 0 7166666
+838 0 7250000
+1328 0 7333333
+2292 0 7416666
+1829 0 7500000
+1728 0 7583333
+2436 0 7666666
+1852 0 7750000
+2190 0 7833333
+15167 1 7916666
+1188 0 8000000
+2070 0 8083333
+3316 0 8166666
+2636 0 8250000
+950 0 8333333
+1260 0 8416666
+906 0 8500000
+1294 0 8583333
+1298 0 8666666
+1897 0 8750000
+1348 0 8833333
+13194 1 8916666
+1042 0 9000000
+1258 0 9083333
+1457 0 9166666
+990 0 9250000
+900 0 9333333
+963 0 9416666
+3448 0 9500000
+774 0 9583333
+1075 0 9666666
+750 0 9750000
+1054 0 9833333
+13139 1 9916666
+3104 0 10000000
+3366 0 10083333
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_hevc_176x144_176kbps_60fps.hevc b/media/codec2/hidl/1.0/vts/res/bbb_hevc_176x144_176kbps_60fps.hevc
new file mode 100644
index 0000000..f82236f
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_hevc_176x144_176kbps_60fps.hevc
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_hevc_176x144_176kbps_60fps.info b/media/codec2/hidl/1.0/vts/res/bbb_hevc_176x144_176kbps_60fps.info
new file mode 100644
index 0000000..c4357ce
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_hevc_176x144_176kbps_60fps.info
@@ -0,0 +1,61 @@
+1695 32 0
+1938 1 33333
+471 0 83333
+153 0 66666
+99 0 50000
+657 0 150000
+260 0 116666
+115 0 100000
+99 0 133333
+622 0 216666
+211 0 183333
+79 0 166666
+95 0 200000
+597 0 283333
+288 0 250000
+145 0 233333
+147 0 266666
+676 0 350000
+284 0 316666
+144 0 300000
+131 0 333333
+658 0 416666
+270 0 383333
+101 0 366666
+151 0 400000
+529 0 483333
+257 0 450000
+98 0 433333
+160 0 466666
+664 0 566666
+186 0 533333
+147 0 500000
+67 0 516666
+78 0 550000
+575 0 633333
+230 0 600000
+134 0 583333
+114 0 616666
+629 0 700000
+224 0 666666
+138 0 650000
+129 0 683333
+645 0 750000
+264 0 733333
+145 0 716666
+705 0 816666
+365 0 783333
+156 0 766666
+160 0 800000
+725 0 883333
+330 0 850000
+138 0 833333
+162 0 866666
+638 0 950000
+337 0 916666
+170 0 900000
+133 0 933333
+432 0 1016666
+287 0 983333
+130 0 966666
+136 0 1000000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_hevc_640x360_1600kbps_30fps.hevc b/media/codec2/hidl/1.0/vts/res/bbb_hevc_640x360_1600kbps_30fps.hevc
new file mode 100644
index 0000000..651f7cf
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_hevc_640x360_1600kbps_30fps.hevc
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_hevc_640x360_1600kbps_30fps.info b/media/codec2/hidl/1.0/vts/res/bbb_hevc_640x360_1600kbps_30fps.info
new file mode 100644
index 0000000..299491a
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_hevc_640x360_1600kbps_30fps.info
@@ -0,0 +1,302 @@
+1075 32 0
+1075 32 0
+68613 1 66687
+19025 0 199687
+2405 0 133687
+777 0 99687
+681 0 166687
+20254 0 333687
+2927 0 266687
+766 0 233687
+658 0 299687
+20786 0 466687
+4214 0 399687
+609 0 366687
+661 0 433687
+20838 0 599687
+4209 0 533687
+506 0 499687
+586 0 566687
+20415 0 733687
+4207 0 666687
+427 0 633687
+514 0 699687
+24457 0 899687
+1904 0 833687
+921 0 766687
+992 0 799687
+543 0 866687
+24342 0 1066687
+1822 0 999687
+840 0 933687
+892 0 966687
+715 0 1033687
+22893 0 1233687
+1618 0 1166687
+881 0 1099687
+890 0 1133687
+794 0 1199687
+24292 0 1399687
+1673 0 1333687
+755 0 1266687
+810 0 1299687
+588 0 1366687
+19828 0 1533687
+1538 0 1466687
+894 0 1433687
+933 0 1499687
+19853 0 1666687
+2011 0 1599687
+981 0 1566687
+900 0 1633687
+22869 0 1833687
+1562 0 1766687
+842 0 1699687
+765 0 1733687
+665 0 1799687
+22346 0 1966687
+2245 0 1899687
+516 0 1866687
+604 0 1933687
+24333 0 2099687
+1765 0 2033687
+318 0 1999687
+320 0 2066687
+18577 0 2199687
+1123 0 2166687
+337 0 2133687
+17509 0 2299687
+869 0 2266687
+901 0 2233687
+23366 0 2433687
+1217 0 2366687
+380 0 2333687
+347 0 2399687
+19542 0 2533687
+1887 0 2499687
+467 0 2466687
+18939 0 2666687
+2863 0 2599687
+317 0 2566687
+272 0 2633687
+19353 0 2799687
+2092 0 2733687
+203 0 2699687
+310 0 2766687
+18800 0 2933687
+2038 0 2866687
+242 0 2833687
+199 0 2899687
+17452 0 3099687
+1060 0 3033687
+301 0 2966687
+452 0 2999687
+256 0 3066687
+21352 0 3199687
+409 0 3166687
+173 0 3133687
+19142 0 3299687
+642 0 3266687
+468 0 3233687
+19066 0 3433687
+635 0 3366687
+197 0 3333687
+190 0 3399687
+18813 0 3566687
+969 0 3499687
+165 0 3466687
+203 0 3533687
+17362 0 3733687
+246 0 3666687
+236 0 3599687
+174 0 3633687
+164 0 3699687
+17081 0 3899687
+353 0 3833687
+222 0 3766687
+181 0 3799687
+148 0 3866687
+10835 0 3999687
+185 0 3966687
+139 0 3933687
+7510 0 4133687
+149 0 4066687
+129 0 4033687
+132 0 4099687
+1063 0 4166687
+805 0 4266687
+157 0 4233687
+394 0 4199687
+90840 0 4399687
+6159 0 4333687
+1752 0 4299687
+985 0 4366687
+31338 0 4533687
+3390 0 4466687
+772 0 4433687
+781 0 4499687
+31084 0 4666687
+3498 0 4599687
+818 0 4566687
+881 0 4633687
+30416 0 4799687
+3265 0 4733687
+815 0 4699687
+790 0 4766687
+31053 0 4933687
+3106 0 4866687
+708 0 4833687
+713 0 4899687
+30230 0 5066687
+3214 0 4999687
+639 0 4966687
+768 0 5033687
+29657 0 5199687
+3013 0 5133687
+622 0 5099687
+720 0 5166687
+29344 0 5333687
+3196 0 5266687
+713 0 5233687
+775 0 5299687
+30420 0 5466687
+3374 0 5399687
+803 0 5366687
+717 0 5433687
+29960 0 5599687
+3283 0 5533687
+793 0 5499687
+790 0 5566687
+31011 0 5733687
+3397 0 5666687
+809 0 5633687
+831 0 5699687
+31194 0 5866687
+3401 0 5799687
+807 0 5766687
+827 0 5833687
+30326 0 5999687
+3186 0 5933687
+818 0 5899687
+863 0 5966687
+31559 0 6133687
+3364 0 6066687
+840 0 6033687
+919 0 6099687
+32013 0 6266687
+3495 0 6199687
+871 0 6166687
+803 0 6233687
+30294 0 6399687
+3153 0 6333687
+716 0 6299687
+812 0 6366687
+29952 0 6533687
+3299 0 6466687
+801 0 6433687
+749 0 6499687
+30598 0 6666687
+3536 0 6599687
+887 0 6566687
+850 0 6633687
+17246 0 6699687
+31110 0 6833687
+3198 0 6766687
+809 0 6733687
+836 0 6799687
+29784 0 6966687
+3155 0 6899687
+859 0 6866687
+958 0 6933687
+30666 0 7099687
+3371 0 7033687
+886 0 6999687
+861 0 7066687
+30416 0 7233687
+3350 0 7166687
+917 0 7133687
+987 0 7199687
+29509 0 7366687
+3574 0 7299687
+972 0 7266687
+885 0 7333687
+30872 0 7499687
+3399 0 7433687
+898 0 7399687
+1027 0 7466687
+31155 0 7633687
+3454 0 7566687
+965 0 7533687
+841 0 7599687
+28487 0 7766687
+3616 0 7699687
+921 0 7666687
+991 0 7733687
+23208 0 7899687
+3551 0 7833687
+918 0 7799687
+894 0 7866687
+16982 0 8033687
+3458 0 7966687
+844 0 7933687
+943 0 7999687
+30396 0 8199687
+4963 0 8133687
+1416 0 8066687
+1639 0 8099687
+524 0 8166687
+1368 0 8299687
+565 0 8266687
+392 0 8233687
+41317 1 8399687
+185 0 8366687
+477 0 8333687
+5342 0 8533687
+1275 0 8466687
+121 0 8433687
+982 0 8499687
+6465 0 8699687
+2606 0 8633687
+1163 0 8566687
+943 0 8599687
+1186 0 8666687
+11593 0 8833687
+3122 0 8766687
+1278 0 8733687
+1593 0 8799687
+9099 0 8999687
+978 0 8933687
+748 0 8866687
+835 0 8899687
+364 0 8966687
+4799 0 9099687
+365 0 9066687
+215 0 9033687
+4367 0 9199687
+302 0 9166687
+480 0 9133687
+6180 0 9333687
+771 0 9266687
+246 0 9233687
+281 0 9299687
+4636 0 9399687
+211 0 9366687
+4037 0 9499687
+382 0 9466687
+486 0 9433687
+3975 0 9599687
+312 0 9566687
+474 0 9533687
+6880 0 9733687
+1116 0 9666687
+206 0 9633687
+698 0 9699687
+6254 0 9899687
+2581 0 9833687
+1303 0 9766687
+985 0 9799687
+967 0 9866687
+6486 0 10033687
+3555 0 9966687
+1430 0 9933687
+1605 0 9999687
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_mp3_stereo_192kbps_48000hz.info b/media/codec2/hidl/1.0/vts/res/bbb_mp3_stereo_192kbps_48000hz.info
new file mode 100644
index 0000000..21fbfd4
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_mp3_stereo_192kbps_48000hz.info
@@ -0,0 +1,414 @@
+576 1 0
+576 1 24000
+576 1 48000
+576 1 72000
+576 1 96000
+576 1 120000
+576 1 144000
+576 1 168000
+576 1 192000
+576 1 216000
+576 1 240000
+576 1 264000
+576 1 288000
+576 1 312000
+576 1 336000
+576 1 360000
+576 1 384000
+576 1 408000
+576 1 432000
+576 1 456000
+576 1 480000
+576 1 504000
+576 1 528000
+576 1 552000
+576 1 576000
+576 1 600000
+576 1 624000
+576 1 648000
+576 1 672000
+576 1 696000
+576 1 720000
+576 1 744000
+576 1 768000
+576 1 792000
+576 1 816000
+576 1 840000
+576 1 864000
+576 1 888000
+576 1 912000
+576 1 936000
+576 1 960000
+576 1 984000
+576 1 1008000
+576 1 1032000
+576 1 1056000
+576 1 1080000
+576 1 1104000
+576 1 1128000
+576 1 1152000
+576 1 1176000
+576 1 1200000
+576 1 1224000
+576 1 1248000
+576 1 1272000
+576 1 1296000
+576 1 1320000
+576 1 1344000
+576 1 1368000
+576 1 1392000
+576 1 1416000
+576 1 1440000
+576 1 1464000
+576 1 1488000
+576 1 1512000
+576 1 1536000
+576 1 1560000
+576 1 1584000
+576 1 1608000
+576 1 1632000
+576 1 1656000
+576 1 1680000
+576 1 1704000
+576 1 1728000
+576 1 1752000
+576 1 1776000
+576 1 1800000
+576 1 1824000
+576 1 1848000
+576 1 1872000
+576 1 1896000
+576 1 1920000
+576 1 1944000
+576 1 1968000
+576 1 1992000
+576 1 2016000
+576 1 2040000
+576 1 2064000
+576 1 2088000
+576 1 2112000
+576 1 2136000
+576 1 2160000
+576 1 2184000
+576 1 2208000
+576 1 2232000
+576 1 2256000
+576 1 2280000
+576 1 2304000
+576 1 2328000
+576 1 2352000
+576 1 2376000
+576 1 2400000
+576 1 2424000
+576 1 2448000
+576 1 2472000
+576 1 2496000
+576 1 2520000
+576 1 2544000
+576 1 2568000
+576 1 2592000
+576 1 2616000
+576 1 2640000
+576 1 2664000
+576 1 2688000
+576 1 2712000
+576 1 2736000
+576 1 2760000
+576 1 2784000
+576 1 2808000
+576 1 2832000
+576 1 2856000
+576 1 2880000
+576 1 2904000
+576 1 2928000
+576 1 2952000
+576 1 2976000
+576 1 3000000
+576 1 3024000
+576 1 3048000
+576 1 3072000
+576 1 3096000
+576 1 3120000
+576 1 3144000
+576 1 3168000
+576 1 3192000
+576 1 3216000
+576 1 3240000
+576 1 3264000
+576 1 3288000
+576 1 3312000
+576 1 3336000
+576 1 3360000
+576 1 3384000
+576 1 3408000
+576 1 3432000
+576 1 3456000
+576 1 3480000
+576 1 3504000
+576 1 3528000
+576 1 3552000
+576 1 3576000
+576 1 3600000
+576 1 3624000
+576 1 3648000
+576 1 3672000
+576 1 3696000
+576 1 3720000
+576 1 3744000
+576 1 3768000
+576 1 3792000
+576 1 3816000
+576 1 3840000
+576 1 3864000
+576 1 3888000
+576 1 3912000
+576 1 3936000
+576 1 3960000
+576 1 3984000
+576 1 4008000
+576 1 4032000
+576 1 4056000
+576 1 4080000
+576 1 4104000
+576 1 4128000
+576 1 4152000
+576 1 4176000
+576 1 4200000
+576 1 4224000
+576 1 4248000
+576 1 4272000
+576 1 4296000
+576 1 4320000
+576 1 4344000
+576 1 4368000
+576 1 4392000
+576 1 4416000
+576 1 4440000
+576 1 4464000
+576 1 4488000
+576 1 4512000
+576 1 4536000
+576 1 4560000
+576 1 4584000
+576 1 4608000
+576 1 4632000
+576 1 4656000
+576 1 4680000
+576 1 4704000
+576 1 4728000
+576 1 4752000
+576 1 4776000
+576 1 4800000
+576 1 4824000
+576 1 4848000
+576 1 4872000
+576 1 4896000
+576 1 4920000
+576 1 4944000
+576 1 4968000
+576 1 4992000
+576 1 5016000
+576 1 5040000
+576 1 5064000
+576 1 5088000
+576 1 5112000
+576 1 5136000
+576 1 5160000
+576 1 5184000
+576 1 5208000
+576 1 5232000
+576 1 5256000
+576 1 5280000
+576 1 5304000
+576 1 5328000
+576 1 5352000
+576 1 5376000
+576 1 5400000
+576 1 5424000
+576 1 5448000
+576 1 5472000
+576 1 5496000
+576 1 5520000
+576 1 5544000
+576 1 5568000
+576 1 5592000
+576 1 5616000
+576 1 5640000
+576 1 5664000
+576 1 5688000
+576 1 5712000
+576 1 5736000
+576 1 5760000
+576 1 5784000
+576 1 5808000
+576 1 5832000
+576 1 5856000
+576 1 5880000
+576 1 5904000
+576 1 5928000
+576 1 5952000
+576 1 5976000
+576 1 6000000
+576 1 6024000
+576 1 6048000
+576 1 6072000
+576 1 6096000
+576 1 6120000
+576 1 6144000
+576 1 6168000
+576 1 6192000
+576 1 6216000
+576 1 6240000
+576 1 6264000
+576 1 6288000
+576 1 6312000
+576 1 6336000
+576 1 6360000
+576 1 6384000
+576 1 6408000
+576 1 6432000
+576 1 6456000
+576 1 6480000
+576 1 6504000
+576 1 6528000
+576 1 6552000
+576 1 6576000
+576 1 6600000
+576 1 6624000
+576 1 6648000
+576 1 6672000
+576 1 6696000
+576 1 6720000
+576 1 6744000
+576 1 6768000
+576 1 6792000
+576 1 6816000
+576 1 6840000
+576 1 6864000
+576 1 6888000
+576 1 6912000
+576 1 6936000
+576 1 6960000
+576 1 6984000
+576 1 7008000
+576 1 7032000
+576 1 7056000
+576 1 7080000
+576 1 7104000
+576 1 7128000
+576 1 7152000
+576 1 7176000
+576 1 7200000
+576 1 7224000
+576 1 7248000
+576 1 7272000
+576 1 7296000
+576 1 7320000
+576 1 7344000
+576 1 7368000
+576 1 7392000
+576 1 7416000
+576 1 7440000
+576 1 7464000
+576 1 7488000
+576 1 7512000
+576 1 7536000
+576 1 7560000
+576 1 7584000
+576 1 7608000
+576 1 7632000
+576 1 7656000
+576 1 7680000
+576 1 7704000
+576 1 7728000
+576 1 7752000
+576 1 7776000
+576 1 7800000
+576 1 7824000
+576 1 7848000
+576 1 7872000
+576 1 7896000
+576 1 7920000
+576 1 7944000
+576 1 7968000
+576 1 7992000
+576 1 8016000
+576 1 8040000
+576 1 8064000
+576 1 8088000
+576 1 8112000
+576 1 8136000
+576 1 8160000
+576 1 8184000
+576 1 8208000
+576 1 8232000
+576 1 8256000
+576 1 8280000
+576 1 8304000
+576 1 8328000
+576 1 8352000
+576 1 8376000
+576 1 8400000
+576 1 8424000
+576 1 8448000
+576 1 8472000
+576 1 8496000
+576 1 8520000
+576 1 8544000
+576 1 8568000
+576 1 8592000
+576 1 8616000
+576 1 8640000
+576 1 8664000
+576 1 8688000
+576 1 8712000
+576 1 8736000
+576 1 8760000
+576 1 8784000
+576 1 8808000
+576 1 8832000
+576 1 8856000
+576 1 8880000
+576 1 8904000
+576 1 8928000
+576 1 8952000
+576 1 8976000
+576 1 9000000
+576 1 9024000
+576 1 9048000
+576 1 9072000
+576 1 9096000
+576 1 9120000
+576 1 9144000
+576 1 9168000
+576 1 9192000
+576 1 9216000
+576 1 9240000
+576 1 9264000
+576 1 9288000
+576 1 9312000
+576 1 9336000
+576 1 9360000
+576 1 9384000
+576 1 9408000
+576 1 9432000
+576 1 9456000
+576 1 9480000
+576 1 9504000
+576 1 9528000
+576 1 9552000
+576 1 9576000
+576 1 9600000
+576 1 9624000
+576 1 9648000
+576 1 9672000
+576 1 9696000
+576 1 9720000
+576 1 9744000
+576 1 9768000
+576 1 9792000
+576 1 9816000
+576 1 9840000
+576 1 9864000
+576 1 9888000
+576 1 9912000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_mp3_stereo_192kbps_48000hz.mp3 b/media/codec2/hidl/1.0/vts/res/bbb_mp3_stereo_192kbps_48000hz.mp3
new file mode 100644
index 0000000..b83a4413
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_mp3_stereo_192kbps_48000hz.mp3
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_176x144_105kbps_25fps.info b/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_176x144_105kbps_25fps.info
new file mode 100644
index 0000000..c540642
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_176x144_105kbps_25fps.info
@@ -0,0 +1,249 @@
+6458 1 40000
+4040 0 80000
+3255 0 120000
+3026 0 160000
+3293 0 200000
+3089 0 240000
+3305 0 280000
+1794 0 320000
+1848 0 360000
+1288 0 400000
+1511 0 440000
+1527 0 480000
+6146 1 520000
+1243 0 560000
+1099 0 600000
+1354 0 640000
+1366 0 680000
+1042 0 720000
+1600 0 760000
+875 0 800000
+1728 0 840000
+1254 0 880000
+994 0 920000
+1591 0 960000
+6265 1 1000000
+1018 0 1040000
+825 0 1080000
+869 0 1120000
+921 0 1160000
+975 0 1200000
+924 0 1240000
+834 0 1280000
+1066 0 1320000
+793 0 1360000
+889 0 1400000
+2050 0 1440000
+6276 1 1480000
+881 0 1520000
+260 0 1560000
+730 0 1600000
+431 0 1640000
+351 0 1680000
+321 0 1720000
+3802 0 1760000
+146 0 1800000
+6462 0 1840000
+3246 0 1880000
+533 0 1920000
+6231 1 1960000
+1378 0 2000000
+719 0 2040000
+818 0 2080000
+856 0 2120000
+937 0 2160000
+611 0 2200000
+3031 0 2240000
+1041 0 2280000
+604 0 2320000
+714 0 2360000
+1283 0 2400000
+7565 1 2440000
+602 0 2480000
+530 0 2520000
+2579 0 2560000
+115 0 2600000
+1058 0 2640000
+689 0 2680000
+1119 0 2720000
+698 0 2760000
+1006 0 2800000
+545 0 2840000
+1617 0 2880000
+9123 1 2920000
+527 0 2960000
+1576 0 3000000
+465 0 3040000
+741 0 3080000
+521 0 3120000
+1322 0 3160000
+775 0 3200000
+863 0 3240000
+910 0 3280000
+915 0 3320000
+926 0 3360000
+7556 1 3400000
+741 0 3440000
+527 0 3480000
+2516 0 3520000
+459 0 3560000
+404 0 3600000
+509 0 3640000
+1227 0 3680000
+1561 0 3720000
+490 0 3760000
+712 0 3800000
+803 0 3840000
+7524 1 3880000
+730 0 3920000
+461 0 3960000
+2526 0 4000000
+453 0 4040000
+632 0 4080000
+783 0 4120000
+843 0 4160000
+918 0 4200000
+961 0 4240000
+948 0 4280000
+959 0 4320000
+7598 1 4360000
+678 0 4400000
+569 0 4440000
+893 0 4480000
+624 0 4520000
+755 0 4560000
+2234 0 4600000
+556 0 4640000
+944 0 4680000
+739 0 4720000
+862 0 4760000
+938 0 4800000
+7574 1 4840000
+699 0 4880000
+701 0 4920000
+530 0 4960000
+689 0 5000000
+778 0 5040000
+856 0 5080000
+930 0 5120000
+975 0 5160000
+1021 0 5200000
+1074 0 5240000
+978 0 5280000
+8021 1 5320000
+704 0 5360000
+610 0 5400000
+697 0 5440000
+711 0 5480000
+820 0 5520000
+843 0 5560000
+251 0 5600000
+3367 0 5640000
+507 0 5680000
+3168 1 5720000
+779 0 5760000
+316 0 5800000
+635 0 5840000
+204 0 5880000
+978 0 5920000
+127 0 5960000
+589 0 6000000
+604 0 6040000
+666 0 6080000
+582 0 6120000
+729 0 6160000
+4152 1 6200000
+858 0 6240000
+739 0 6280000
+885 0 6320000
+749 0 6360000
+950 0 6400000
+593 0 6440000
+771 0 6480000
+678 0 6520000
+529 0 6560000
+835 0 6600000
+391 0 6640000
+4692 1 6680000
+473 0 6720000
+724 0 6760000
+381 0 6800000
+909 0 6840000
+394 0 6880000
+659 0 6920000
+367 0 6960000
+658 0 7000000
+523 0 7040000
+554 0 7080000
+553 0 7120000
+6080 1 7160000
+496 0 7200000
+763 0 7240000
+939 0 7280000
+715 0 7320000
+672 0 7360000
+614 0 7400000
+811 0 7440000
+916 0 7480000
+1153 0 7520000
+940 0 7560000
+322 0 7600000
+6613 1 7640000
+851 0 7680000
+1007 0 7720000
+520 0 7760000
+456 0 7800000
+639 0 7840000
+758 0 7880000
+879 0 7920000
+1152 0 7960000
+1061 0 8000000
+946 0 8040000
+859 0 8080000
+3610 1 8120000
+871 0 8160000
+746 0 8200000
+367 0 8240000
+397 0 8280000
+930 0 8320000
+337 0 8360000
+418 0 8400000
+740 0 8440000
+637 0 8480000
+666 0 8520000
+627 0 8560000
+4338 1 8600000
+745 0 8640000
+783 0 8680000
+465 0 8720000
+460 0 8760000
+455 0 8800000
+506 0 8840000
+492 0 8880000
+485 0 8920000
+517 0 8960000
+534 0 9000000
+395 0 9040000
+5626 1 9080000
+1169 0 9120000
+564 0 9160000
+261 0 9200000
+327 0 9240000
+303 0 9280000
+1145 0 9320000
+257 0 9360000
+498 0 9400000
+465 0 9440000
+414 0 9480000
+553 0 9520000
+5617 1 9560000
+1052 0 9600000
+592 0 9640000
+323 0 9680000
+497 0 9720000
+467 0 9760000
+705 0 9800000
+1086 0 9840000
+1253 0 9880000
+1252 0 9920000
+776 0 9960000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_176x144_105kbps_25fps.m2v b/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_176x144_105kbps_25fps.m2v
new file mode 100644
index 0000000..cdf90c3
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_176x144_105kbps_25fps.m2v
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_352x288_1mbps_60fps.info b/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_352x288_1mbps_60fps.info
new file mode 100644
index 0000000..417caf9
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_352x288_1mbps_60fps.info
@@ -0,0 +1,60 @@
+16680 1 16666
+17017 0 33333
+10534 0 50000
+10289 0 66666
+3698 0 83333
+2776 0 100000
+1936 0 116666
+1493 0 133333
+1217 0 150000
+993 0 166666
+805 0 183333
+857 0 200000
+5082 1 216666
+812 0 233333
+718 0 250000
+746 0 266666
+762 0 283333
+865 0 300000
+782 0 316666
+833 0 333333
+750 0 350000
+819 0 366666
+826 0 383333
+846 0 400000
+4522 1 416666
+678 0 433333
+718 0 450000
+803 0 466666
+769 0 483333
+762 0 500000
+587 0 516666
+635 0 533333
+658 0 550000
+714 0 566666
+677 0 583333
+699 0 600000
+4616 1 616666
+800 0 633333
+831 0 650000
+928 0 666666
+869 0 683333
+931 0 700000
+930 0 716666
+974 0 733333
+978 0 750000
+932 0 766666
+918 0 783333
+978 0 800000
+4655 1 816666
+897 0 833333
+896 0 850000
+883 0 866666
+949 0 883333
+965 0 900000
+951 0 916666
+901 0 933333
+965 0 950000
+955 0 966666
+948 0 983333
+968 0 1000000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_352x288_1mbps_60fps.m2v b/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_352x288_1mbps_60fps.m2v
new file mode 100644
index 0000000..2f67c2b
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_mpeg2_352x288_1mbps_60fps.m2v
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_mpeg4_352x288_512kbps_30fps.info b/media/codec2/hidl/1.0/vts/res/bbb_mpeg4_352x288_512kbps_30fps.info
new file mode 100644
index 0000000..69ba9b2
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_mpeg4_352x288_512kbps_30fps.info
@@ -0,0 +1,241 @@
+47 32 0
+21115 1 0
+16456 0 33333
+11880 0 66666
+12155 0 100000
+11402 0 133333
+5345 0 166666
+2986 0 200000
+1924 0 233333
+2275 0 266666
+2793 0 300000
+2756 0 333333
+2933 0 366666
+21100 1 400000
+1302 0 433333
+2206 0 466666
+1599 0 500000
+2558 0 533333
+2784 0 566666
+2458 0 600000
+2480 0 633333
+1446 0 666666
+3109 0 700000
+944 0 733333
+3134 0 766666
+21342 1 800000
+652 0 833333
+1708 0 866666
+2202 0 900000
+1695 0 933333
+1661 0 966666
+1652 0 1000000
+1679 0 1033333
+1690 0 1066666
+1824 0 1100000
+1803 0 1133333
+1598 0 1166666
+21540 1 1200000
+205 0 1233333
+1124 0 1266666
+1069 0 1300000
+838 0 1333333
+765 0 1366666
+4265 0 1400000
+94 0 1433333
+20463 0 1466666
+1028 0 1500000
+1475 0 1533333
+3630 0 1566666
+28373 1 1600000
+725 0 1633333
+1119 0 1666666
+1427 0 1700000
+1679 0 1733333
+1866 0 1766666
+1197 0 1800000
+1572 0 1833333
+1651 0 1866666
+1678 0 1900000
+1688 0 1933333
+1659 0 1966666
+19900 1 2000000
+584 0 2033333
+1475 0 2066666
+1678 0 2100000
+1010 0 2133333
+1435 0 2166666
+1612 0 2200000
+1602 0 2233333
+1709 0 2266666
+1737 0 2300000
+1835 0 2333333
+926 0 2366666
+20090 1 2400000
+631 0 2433333
+1576 0 2466666
+941 0 2500000
+2349 0 2533333
+1112 0 2566666
+1566 0 2600000
+1773 0 2633333
+979 0 2666666
+2246 0 2700000
+904 0 2733333
+1342 0 2766666
+20147 1 2800000
+630 0 2833333
+982 0 2866666
+2089 0 2900000
+1021 0 2933333
+1506 0 2966666
+1642 0 3000000
+968 0 3033333
+1262 0 3066666
+2270 0 3100000
+864 0 3133333
+1252 0 3166666
+20145 1 3200000
+595 0 3233333
+918 0 3266666
+1167 0 3300000
+1347 0 3333333
+1597 0 3366666
+1636 0 3400000
+944 0 3433333
+1295 0 3466666
+1397 0 3500000
+1413 0 3533333
+1432 0 3566666
+20180 1 3600000
+525 0 3633333
+1068 0 3666666
+1230 0 3700000
+1428 0 3733333
+916 0 3766666
+1948 0 3800000
+966 0 3833333
+1342 0 3866666
+1338 0 3900000
+1379 0 3933333
+1296 0 3966666
+17378 1 4000000
+583 0 4033333
+936 0 4066666
+1745 0 4100000
+987 0 4133333
+1393 0 4166666
+1495 0 4200000
+869 0 4233333
+1938 0 4266666
+828 0 4300000
+1851 0 4333333
+834 0 4366666
+17280 1 4400000
+580 0 4433333
+869 0 4466666
+1605 0 4500000
+843 0 4533333
+6147 1 4566666
+220 0 4600000
+1106 0 4633333
+395 0 4666666
+304 0 4700000
+1946 0 4733333
+154 0 4766666
+482 0 4800000
+949 0 4833333
+1088 0 4866666
+974 0 4900000
+876 0 4933333
+9164 1 4966666
+1019 0 5000000
+983 0 5033333
+1375 0 5066666
+1041 0 5100000
+789 0 5133333
+1037 0 5166666
+812 0 5200000
+732 0 5233333
+972 0 5266666
+708 0 5300000
+623 0 5333333
+10667 1 5366666
+463 0 5400000
+911 0 5433333
+861 0 5466666
+507 0 5500000
+1015 0 5533333
+501 0 5566666
+934 0 5600000
+812 0 5633333
+855 0 5666666
+804 0 5700000
+783 0 5733333
+10610 1 5766666
+950 0 5800000
+1292 0 5833333
+1002 0 5866666
+728 0 5900000
+960 0 5933333
+1230 0 5966666
+1315 0 6000000
+1248 0 6033333
+995 0 6066666
+1401 0 6100000
+905 0 6133333
+9326 1 6166666
+726 0 6200000
+667 0 6233333
+833 0 6266666
+1007 0 6300000
+1172 0 6333333
+1910 0 6366666
+1954 0 6400000
+1498 0 6433333
+1188 0 6466666
+784 0 6500000
+1005 0 6533333
+10030 1 6566666
+452 0 6600000
+763 0 6633333
+639 0 6666666
+671 0 6700000
+867 0 6733333
+963 0 6766666
+982 0 6800000
+995 0 6833333
+982 0 6866666
+747 0 6900000
+574 0 6933333
+12353 1 6966666
+474 0 7000000
+969 0 7033333
+633 0 7066666
+723 0 7100000
+1221 0 7133333
+674 0 7166666
+776 0 7200000
+572 0 7233333
+912 0 7266666
+564 0 7300000
+594 0 7333333
+16661 1 7366666
+518 0 7400000
+656 0 7433333
+625 0 7466666
+583 0 7500000
+584 0 7533333
+1027 0 7566666
+812 0 7600000
+729 0 7633333
+766 0 7666666
+901 0 7700000
+960 0 7733333
+12336 1 7766666
+944 0 7800000
+1398 0 7833333
+1625 0 7866666
+2103 0 7900000
+1630 0 7933333
+1228 0 7966666
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_mpeg4_352x288_512kbps_30fps.m4v b/media/codec2/hidl/1.0/vts/res/bbb_mpeg4_352x288_512kbps_30fps.m4v
new file mode 100644
index 0000000..b7ead00
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_mpeg4_352x288_512kbps_30fps.m4v
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_opus_stereo_128kbps_48000hz.info b/media/codec2/hidl/1.0/vts/res/bbb_opus_stereo_128kbps_48000hz.info
new file mode 100644
index 0000000..1ced12b
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_opus_stereo_128kbps_48000hz.info
@@ -0,0 +1,499 @@
+19 32 0
+8 32 0
+8 32 0
+529 1 0
+329 1 13500
+349 1 33500
+336 1 53500
+383 1 73500
+359 1 93500
+344 1 113500
+343 1 133500
+332 1 153500
+320 1 173500
+319 1 193500
+323 1 213500
+320 1 233500
+328 1 253500
+340 1 273500
+318 1 293500
+319 1 313500
+335 1 333500
+511 1 353500
+395 1 373500
+327 1 393500
+479 1 413500
+332 1 433500
+320 1 453500
+321 1 473500
+310 1 493500
+310 1 513500
+310 1 533500
+326 1 553500
+330 1 573500
+318 1 593500
+309 1 613500
+304 1 633500
+298 1 653500
+294 1 673500
+300 1 693500
+314 1 713500
+304 1 733500
+307 1 753500
+321 1 773500
+333 1 793500
+335 1 813500
+306 1 833500
+315 1 853500
+320 1 873500
+315 1 893500
+308 1 913500
+320 1 933500
+311 1 953500
+311 1 973500
+313 1 993500
+314 1 1013500
+308 1 1033500
+307 1 1053500
+317 1 1073500
+328 1 1093500
+317 1 1113500
+312 1 1133500
+308 1 1153500
+315 1 1173500
+320 1 1193500
+322 1 1213500
+323 1 1233500
+322 1 1253500
+322 1 1273500
+301 1 1293500
+303 1 1313500
+308 1 1333500
+299 1 1353500
+297 1 1373500
+293 1 1393500
+295 1 1413500
+297 1 1433500
+300 1 1453500
+294 1 1473500
+299 1 1493500
+296 1 1513500
+303 1 1533500
+313 1 1553500
+306 1 1573500
+303 1 1593500
+311 1 1613500
+307 1 1633500
+310 1 1653500
+339 1 1673500
+325 1 1693500
+320 1 1713500
+315 1 1733500
+316 1 1753500
+338 1 1773500
+325 1 1793500
+325 1 1813500
+328 1 1833500
+304 1 1853500
+297 1 1873500
+322 1 1893500
+311 1 1913500
+307 1 1933500
+300 1 1953500
+301 1 1973500
+309 1 1993500
+300 1 2013500
+306 1 2033500
+305 1 2053500
+298 1 2073500
+291 1 2093500
+301 1 2113500
+300 1 2133500
+439 1 2153500
+292 1 2173500
+308 1 2193500
+305 1 2213500
+298 1 2233500
+297 1 2253500
+293 1 2273500
+408 1 2293500
+298 1 2313500
+452 1 2333500
+297 1 2353500
+303 1 2373500
+300 1 2393500
+310 1 2413500
+299 1 2433500
+306 1 2453500
+316 1 2473500
+308 1 2493500
+313 1 2513500
+309 1 2533500
+310 1 2553500
+315 1 2573500
+309 1 2593500
+317 1 2613500
+311 1 2633500
+328 1 2653500
+333 1 2673500
+326 1 2693500
+323 1 2713500
+316 1 2733500
+325 1 2753500
+316 1 2773500
+319 1 2793500
+326 1 2813500
+320 1 2833500
+328 1 2853500
+312 1 2873500
+314 1 2893500
+309 1 2913500
+306 1 2933500
+295 1 2953500
+304 1 2973500
+326 1 2993500
+291 1 3013500
+299 1 3033500
+293 1 3053500
+288 1 3073500
+294 1 3093500
+292 1 3113500
+292 1 3133500
+288 1 3153500
+308 1 3173500
+304 1 3193500
+292 1 3213500
+382 1 3233500
+381 1 3253500
+299 1 3273500
+316 1 3293500
+308 1 3313500
+301 1 3333500
+297 1 3353500
+299 1 3373500
+294 1 3393500
+295 1 3413500
+317 1 3433500
+297 1 3453500
+309 1 3473500
+313 1 3493500
+320 1 3513500
+329 1 3533500
+330 1 3553500
+324 1 3573500
+324 1 3593500
+309 1 3613500
+304 1 3633500
+313 1 3653500
+312 1 3673500
+299 1 3693500
+295 1 3713500
+301 1 3733500
+295 1 3753500
+297 1 3773500
+302 1 3793500
+298 1 3813500
+299 1 3833500
+296 1 3853500
+292 1 3873500
+307 1 3893500
+303 1 3913500
+313 1 3933500
+318 1 3953500
+313 1 3973500
+353 1 3993500
+371 1 4013500
+292 1 4033500
+300 1 4053500
+381 1 4073500
+294 1 4093500
+301 1 4113500
+305 1 4133500
+299 1 4153500
+305 1 4173500
+322 1 4193500
+315 1 4213500
+326 1 4233500
+338 1 4253500
+320 1 4273500
+319 1 4293500
+327 1 4313500
+330 1 4333500
+310 1 4353500
+303 1 4373500
+299 1 4393500
+293 1 4413500
+293 1 4433500
+294 1 4453500
+295 1 4473500
+295 1 4493500
+323 1 4513500
+309 1 4533500
+309 1 4553500
+301 1 4573500
+473 1 4593500
+291 1 4613500
+297 1 4633500
+294 1 4653500
+293 1 4673500
+304 1 4693500
+292 1 4713500
+302 1 4733500
+296 1 4753500
+298 1 4773500
+301 1 4793500
+307 1 4813500
+285 1 4833500
+294 1 4853500
+304 1 4873500
+294 1 4893500
+295 1 4913500
+325 1 4933500
+319 1 4953500
+323 1 4973500
+313 1 4993500
+303 1 5013500
+296 1 5033500
+295 1 5053500
+290 1 5073500
+297 1 5093500
+296 1 5113500
+296 1 5133500
+292 1 5153500
+295 1 5173500
+287 1 5193500
+294 1 5213500
+290 1 5233500
+297 1 5253500
+297 1 5273500
+297 1 5293500
+292 1 5313500
+297 1 5333500
+290 1 5353500
+293 1 5373500
+293 1 5393500
+291 1 5413500
+292 1 5433500
+290 1 5453500
+291 1 5473500
+296 1 5493500
+295 1 5513500
+327 1 5533500
+293 1 5553500
+291 1 5573500
+291 1 5593500
+311 1 5613500
+291 1 5633500
+294 1 5653500
+296 1 5673500
+295 1 5693500
+289 1 5713500
+295 1 5733500
+295 1 5753500
+297 1 5773500
+292 1 5793500
+297 1 5813500
+292 1 5833500
+295 1 5853500
+296 1 5873500
+295 1 5893500
+303 1 5913500
+304 1 5933500
+301 1 5953500
+307 1 5973500
+304 1 5993500
+310 1 6013500
+310 1 6033500
+305 1 6053500
+301 1 6073500
+302 1 6093500
+305 1 6113500
+298 1 6133500
+300 1 6153500
+300 1 6173500
+292 1 6193500
+297 1 6213500
+301 1 6233500
+297 1 6253500
+297 1 6273500
+298 1 6293500
+297 1 6313500
+300 1 6333500
+293 1 6353500
+293 1 6373500
+297 1 6393500
+294 1 6413500
+307 1 6433500
+302 1 6453500
+307 1 6473500
+320 1 6493500
+330 1 6513500
+333 1 6533500
+337 1 6553500
+331 1 6573500
+323 1 6593500
+312 1 6613500
+326 1 6633500
+328 1 6653500
+332 1 6673500
+333 1 6693500
+340 1 6713500
+336 1 6733500
+324 1 6753500
+312 1 6773500
+301 1 6793500
+289 1 6813500
+302 1 6833500
+296 1 6853500
+299 1 6873500
+289 1 6893500
+295 1 6913500
+299 1 6933500
+374 1 6953500
+391 1 6973500
+365 1 6993500
+340 1 7013500
+330 1 7033500
+337 1 7053500
+328 1 7073500
+329 1 7093500
+319 1 7113500
+312 1 7133500
+308 1 7153500
+304 1 7173500
+312 1 7193500
+311 1 7213500
+316 1 7233500
+299 1 7253500
+330 1 7273500
+330 1 7293500
+330 1 7313500
+342 1 7333500
+439 1 7353500
+322 1 7373500
+298 1 7393500
+293 1 7413500
+310 1 7433500
+303 1 7453500
+317 1 7473500
+453 1 7493500
+377 1 7513500
+374 1 7533500
+292 1 7553500
+295 1 7573500
+274 1 7593500
+292 1 7613500
+291 1 7633500
+367 1 7653500
+295 1 7673500
+298 1 7693500
+297 1 7713500
+301 1 7733500
+292 1 7753500
+344 1 7773500
+296 1 7793500
+297 1 7813500
+306 1 7833500
+308 1 7853500
+305 1 7873500
+313 1 7893500
+306 1 7913500
+322 1 7933500
+313 1 7953500
+305 1 7973500
+304 1 7993500
+313 1 8013500
+324 1 8033500
+312 1 8053500
+318 1 8073500
+311 1 8093500
+302 1 8113500
+305 1 8133500
+312 1 8153500
+313 1 8173500
+312 1 8193500
+335 1 8213500
+333 1 8233500
+346 1 8253500
+339 1 8273500
+337 1 8293500
+341 1 8313500
+335 1 8333500
+325 1 8353500
+324 1 8373500
+317 1 8393500
+315 1 8413500
+303 1 8433500
+317 1 8453500
+452 1 8473500
+324 1 8493500
+321 1 8513500
+335 1 8533500
+327 1 8553500
+315 1 8573500
+321 1 8593500
+319 1 8613500
+308 1 8633500
+314 1 8653500
+322 1 8673500
+328 1 8693500
+320 1 8713500
+324 1 8733500
+331 1 8753500
+330 1 8773500
+328 1 8793500
+318 1 8813500
+314 1 8833500
+318 1 8853500
+318 1 8873500
+325 1 8893500
+338 1 8913500
+341 1 8933500
+333 1 8953500
+330 1 8973500
+338 1 8993500
+333 1 9013500
+330 1 9033500
+344 1 9053500
+479 1 9073500
+473 1 9093500
+333 1 9113500
+337 1 9133500
+495 1 9153500
+353 1 9173500
+352 1 9193500
+344 1 9213500
+336 1 9233500
+324 1 9253500
+321 1 9273500
+350 1 9293500
+347 1 9313500
+343 1 9333500
+345 1 9353500
+337 1 9373500
+335 1 9393500
+333 1 9413500
+336 1 9433500
+334 1 9453500
+333 1 9473500
+331 1 9493500
+329 1 9513500
+319 1 9533500
+321 1 9553500
+316 1 9573500
+322 1 9593500
+448 1 9613500
+312 1 9633500
+306 1 9653500
+301 1 9673500
+303 1 9693500
+296 1 9713500
+300 1 9733500
+295 1 9753500
+300 1 9773500
+297 1 9793500
+300 1 9813500
+297 1 9833500
+512 1 9853500
+292 1 9873500
+468 1 9893500
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_opus_stereo_128kbps_48000hz.opus b/media/codec2/hidl/1.0/vts/res/bbb_opus_stereo_128kbps_48000hz.opus
new file mode 100644
index 0000000..2b6b870
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_opus_stereo_128kbps_48000hz.opus
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_16khz_s16le.raw b/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_16khz_s16le.raw
new file mode 100644
index 0000000..4a2f41b
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_16khz_s16le.raw
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s16le.raw b/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s16le.raw
new file mode 100644
index 0000000..3149eb2
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s16le.raw
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s32le.info b/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s32le.info
new file mode 100644
index 0000000..10e24cc
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s32le.info
@@ -0,0 +1,10 @@
+16384 1 0
+16384 1 1024000
+16384 1 2048000
+16384 1 3072000
+16384 1 4096000
+16384 1 5120000
+16384 1 6144000
+16384 1 7168000
+16384 1 8192000
+10924 1 9216000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s32le.raw b/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s32le.raw
new file mode 100644
index 0000000..fd91b46
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_raw_1ch_8khz_s32le.raw
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_raw_2ch_48khz_s16le.raw b/media/codec2/hidl/1.0/vts/res/bbb_raw_2ch_48khz_s16le.raw
new file mode 100644
index 0000000..498b2ec
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_raw_2ch_48khz_s16le.raw
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vorbis_stereo_128kbps_48000hz.info b/media/codec2/hidl/1.0/vts/res/bbb_vorbis_stereo_128kbps_48000hz.info
new file mode 100644
index 0000000..d9a6d33
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vorbis_stereo_128kbps_48000hz.info
@@ -0,0 +1,520 @@
+30 32 0
+4140 32 0
+33 32 0
+52 1 0
+58 1 2666
+61 1 5333
+56 1 8000
+59 1 10666
+63 1 13333
+66 1 16000
+71 1 18666
+76 1 21333
+374 1 24000
+366 1 36000
+378 1 57333
+393 1 78666
+393 1 100000
+386 1 121333
+375 1 142666
+388 1 164000
+378 1 185333
+379 1 206666
+374 1 228000
+356 1 249333
+358 1 270666
+332 1 292000
+335 1 313333
+363 1 334666
+341 1 356000
+360 1 377333
+341 1 398666
+335 1 420000
+357 1 441333
+355 1 462666
+363 1 484000
+382 1 505333
+371 1 526666
+357 1 548000
+353 1 569333
+350 1 590666
+327 1 612000
+315 1 633333
+307 1 654666
+303 1 676000
+295 1 697333
+312 1 718666
+316 1 740000
+315 1 761333
+318 1 782666
+330 1 804000
+318 1 825333
+315 1 846666
+322 1 868000
+315 1 889333
+310 1 910666
+315 1 932000
+314 1 953333
+302 1 974666
+313 1 996000
+322 1 1017333
+323 1 1038666
+319 1 1060000
+325 1 1081333
+328 1 1102666
+330 1 1124000
+333 1 1145333
+330 1 1166666
+344 1 1188000
+331 1 1209333
+342 1 1230666
+339 1 1252000
+314 1 1273333
+285 1 1294666
+295 1 1316000
+302 1 1337333
+305 1 1358666
+309 1 1380000
+327 1 1401333
+304 1 1422666
+336 1 1444000
+350 1 1465333
+346 1 1486666
+352 1 1508000
+341 1 1529333
+343 1 1550666
+351 1 1572000
+319 1 1593333
+328 1 1614666
+328 1 1636000
+324 1 1657333
+338 1 1678666
+317 1 1700000
+328 1 1721333
+335 1 1742666
+341 1 1764000
+335 1 1785333
+348 1 1806666
+362 1 1828000
+361 1 1849333
+344 1 1870666
+340 1 1892000
+333 1 1913333
+329 1 1934666
+328 1 1956000
+323 1 1977333
+310 1 1998666
+318 1 2020000
+312 1 2041333
+295 1 2062666
+329 1 2084000
+318 1 2105333
+311 1 2126666
+317 1 2148000
+62 1 2169333
+75 1 2181333
+73 1 2184000
+332 1 2186666
+327 1 2198666
+332 1 2220000
+325 1 2241333
+329 1 2262666
+330 1 2284000
+61 1 2305333
+61 1 2317333
+70 1 2320000
+70 1 2322666
+319 1 2325333
+303 1 2337333
+292 1 2358666
+313 1 2380000
+318 1 2401333
+346 1 2422666
+328 1 2444000
+316 1 2465333
+341 1 2486666
+328 1 2508000
+338 1 2529333
+341 1 2550666
+337 1 2572000
+347 1 2593333
+384 1 2614666
+358 1 2636000
+363 1 2657333
+363 1 2678666
+358 1 2700000
+339 1 2721333
+369 1 2742666
+343 1 2764000
+348 1 2785333
+363 1 2806666
+350 1 2828000
+358 1 2849333
+352 1 2870666
+338 1 2892000
+335 1 2913333
+342 1 2934666
+338 1 2956000
+340 1 2977333
+292 1 2998666
+279 1 3020000
+299 1 3041333
+303 1 3062666
+298 1 3084000
+297 1 3105333
+280 1 3126666
+297 1 3148000
+290 1 3169333
+306 1 3190666
+301 1 3212000
+306 1 3233333
+289 1 3254666
+311 1 3276000
+317 1 3297333
+344 1 3318666
+308 1 3340000
+304 1 3361333
+304 1 3382666
+312 1 3404000
+305 1 3425333
+299 1 3446666
+301 1 3468000
+318 1 3489333
+313 1 3510666
+330 1 3532000
+325 1 3553333
+325 1 3574666
+321 1 3596000
+349 1 3617333
+288 1 3638666
+300 1 3660000
+312 1 3681333
+302 1 3702666
+278 1 3724000
+284 1 3745333
+286 1 3766666
+274 1 3788000
+295 1 3809333
+281 1 3830666
+288 1 3852000
+278 1 3873333
+306 1 3894666
+62 1 3916000
+59 1 3928000
+61 1 3930666
+55 1 3933333
+70 1 3936000
+72 1 3938666
+324 1 3941333
+309 1 3953333
+301 1 3974666
+301 1 3996000
+291 1 4017333
+289 1 4038666
+306 1 4060000
+305 1 4081333
+286 1 4102666
+294 1 4124000
+290 1 4145333
+297 1 4166666
+308 1 4188000
+296 1 4209333
+292 1 4230666
+287 1 4252000
+291 1 4273333
+298 1 4294666
+295 1 4316000
+294 1 4337333
+295 1 4358666
+275 1 4380000
+280 1 4401333
+288 1 4422666
+285 1 4444000
+274 1 4465333
+298 1 4486666
+301 1 4508000
+300 1 4529333
+305 1 4550666
+297 1 4572000
+59 1 4593333
+56 1 4605333
+57 1 4608000
+55 1 4610666
+58 1 4613333
+57 1 4616000
+58 1 4618666
+68 1 4621333
+67 1 4624000
+71 1 4626666
+289 1 4629333
+282 1 4641333
+273 1 4662666
+279 1 4684000
+286 1 4705333
+282 1 4726666
+284 1 4748000
+278 1 4769333
+281 1 4790666
+280 1 4812000
+263 1 4833333
+260 1 4854666
+271 1 4876000
+273 1 4897333
+282 1 4918666
+279 1 4940000
+297 1 4961333
+291 1 4982666
+309 1 5004000
+283 1 5025333
+292 1 5046666
+304 1 5068000
+296 1 5089333
+293 1 5110666
+282 1 5132000
+273 1 5153333
+284 1 5174666
+281 1 5196000
+265 1 5217333
+272 1 5238666
+277 1 5260000
+280 1 5281333
+276 1 5302666
+273 1 5324000
+278 1 5345333
+280 1 5366666
+280 1 5388000
+268 1 5409333
+282 1 5430666
+277 1 5452000
+274 1 5473333
+275 1 5494666
+270 1 5516000
+282 1 5537333
+279 1 5558666
+260 1 5580000
+272 1 5601333
+275 1 5622666
+273 1 5644000
+276 1 5665333
+288 1 5686666
+294 1 5708000
+271 1 5729333
+277 1 5750666
+288 1 5772000
+276 1 5793333
+282 1 5814666
+276 1 5836000
+275 1 5857333
+268 1 5878666
+270 1 5900000
+266 1 5921333
+268 1 5942666
+282 1 5964000
+279 1 5985333
+279 1 6006666
+287 1 6028000
+286 1 6049333
+280 1 6070666
+290 1 6092000
+266 1 6113333
+292 1 6134666
+264 1 6156000
+271 1 6177333
+277 1 6198666
+292 1 6220000
+298 1 6241333
+284 1 6262666
+287 1 6284000
+275 1 6305333
+291 1 6326666
+287 1 6348000
+283 1 6369333
+284 1 6390666
+271 1 6412000
+282 1 6433333
+277 1 6454666
+282 1 6476000
+285 1 6497333
+280 1 6518666
+271 1 6540000
+289 1 6561333
+287 1 6582666
+294 1 6604000
+277 1 6625333
+281 1 6646666
+274 1 6668000
+271 1 6689333
+279 1 6710666
+288 1 6732000
+280 1 6753333
+284 1 6774666
+278 1 6796000
+276 1 6817333
+275 1 6838666
+263 1 6860000
+266 1 6881333
+247 1 6902666
+269 1 6924000
+263 1 6945333
+283 1 6966666
+280 1 6988000
+281 1 7009333
+299 1 7030666
+285 1 7052000
+288 1 7073333
+299 1 7094666
+288 1 7116000
+279 1 7137333
+276 1 7158666
+277 1 7180000
+282 1 7201333
+285 1 7222666
+295 1 7244000
+294 1 7265333
+304 1 7286666
+282 1 7308000
+299 1 7329333
+283 1 7350666
+282 1 7372000
+287 1 7393333
+306 1 7414666
+304 1 7436000
+289 1 7457333
+299 1 7478666
+281 1 7500000
+281 1 7521333
+66 1 7542666
+63 1 7554666
+289 1 7557333
+270 1 7569333
+257 1 7590666
+246 1 7612000
+264 1 7633333
+280 1 7654666
+273 1 7676000
+285 1 7697333
+267 1 7718666
+275 1 7740000
+278 1 7761333
+293 1 7782666
+281 1 7804000
+297 1 7825333
+294 1 7846666
+286 1 7868000
+290 1 7889333
+290 1 7910666
+289 1 7932000
+286 1 7953333
+282 1 7974666
+306 1 7996000
+287 1 8017333
+312 1 8038666
+312 1 8060000
+307 1 8081333
+293 1 8102666
+289 1 8124000
+285 1 8145333
+290 1 8166666
+285 1 8188000
+311 1 8209333
+307 1 8230666
+314 1 8252000
+318 1 8273333
+319 1 8294666
+315 1 8316000
+300 1 8337333
+295 1 8358666
+291 1 8380000
+282 1 8401333
+295 1 8422666
+296 1 8444000
+288 1 8465333
+304 1 8486666
+299 1 8508000
+298 1 8529333
+305 1 8550666
+295 1 8572000
+296 1 8593333
+295 1 8614666
+287 1 8636000
+292 1 8657333
+308 1 8678666
+287 1 8700000
+307 1 8721333
+295 1 8742666
+292 1 8764000
+292 1 8785333
+279 1 8806666
+289 1 8828000
+303 1 8849333
+307 1 8870666
+310 1 8892000
+300 1 8913333
+299 1 8934666
+299 1 8956000
+288 1 8977333
+290 1 8998666
+291 1 9020000
+304 1 9041333
+299 1 9062666
+304 1 9084000
+290 1 9105333
+309 1 9126666
+301 1 9148000
+296 1 9169333
+288 1 9190666
+305 1 9212000
+317 1 9233333
+292 1 9254666
+300 1 9276000
+301 1 9297333
+295 1 9318666
+282 1 9340000
+296 1 9361333
+295 1 9382666
+287 1 9404000
+292 1 9425333
+301 1 9446666
+311 1 9468000
+301 1 9489333
+307 1 9510666
+300 1 9532000
+309 1 9553333
+298 1 9574666
+304 1 9596000
+60 1 9617333
+59 1 9629333
+64 1 9632000
+64 1 9634666
+77 1 9637333
+72 1 9640000
+306 1 9642666
+297 1 9654666
+294 1 9676000
+295 1 9697333
+308 1 9718666
+303 1 9740000
+308 1 9761333
+289 1 9782666
+300 1 9804000
+304 1 9825333
+308 1 9846666
+64 1 9868000
+63 1 9880000
+64 1 9882666
+64 1 9885333
+60 1 9888000
+74 1 9890666
+69 1 9893333
+68 1 9896000
+61 1 9898666
+71 1 9901333
+76 1 9904000
+73 1 9906666
+70 1 9909333
+72 1 9912000
+60 1 9914666
+69 1 9917333
+82 1 9920000
+278 1 9922666
+30 1 9934666
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis b/media/codec2/hidl/1.0/vts/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis
new file mode 100644
index 0000000..404c5f8
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vp8_176x144_240kbps_60fps.info b/media/codec2/hidl/1.0/vts/res/bbb_vp8_176x144_240kbps_60fps.info
new file mode 100644
index 0000000..901ea45
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vp8_176x144_240kbps_60fps.info
@@ -0,0 +1,60 @@
+10271 1 0
+106 0 17000
+134 0 33000
+149 0 50000
+152 0 67000
+159 0 83000
+114 0 100000
+723 0 117000
+175 0 133000
+186 0 150000
+201 0 167000
+270 0 183000
+383 0 200000
+255 0 217000
+286 0 233000
+273 0 250000
+1224 0 267000
+220 0 283000
+231 0 300000
+192 0 317000
+182 0 333000
+289 0 350000
+204 0 367000
+237 0 383000
+187 0 400000
+898 0 417000
+231 0 433000
+266 0 450000
+278 0 467000
+205 0 483000
+255 0 500000
+169 0 517000
+233 0 533000
+1011 0 550000
+202 0 567000
+251 0 583000
+223 0 600000
+283 0 617000
+362 0 633000
+217 0 650000
+245 0 667000
+960 0 683000
+233 0 700000
+286 0 717000
+272 0 733000
+254 0 750000
+331 0 767000
+218 0 783000
+261 0 800000
+981 0 817000
+226 0 833000
+226 0 850000
+279 0 867000
+225 0 883000
+295 0 900000
+175 0 917000
+249 0 933000
+996 0 950000
+169 0 967000
+224 0 983000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vp8_176x144_240kbps_60fps.vp8 b/media/codec2/hidl/1.0/vts/res/bbb_vp8_176x144_240kbps_60fps.vp8
new file mode 100644
index 0000000..6eba56c
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vp8_176x144_240kbps_60fps.vp8
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vp8_640x360_2mbps_30fps.info b/media/codec2/hidl/1.0/vts/res/bbb_vp8_640x360_2mbps_30fps.info
new file mode 100644
index 0000000..9c00c77
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vp8_640x360_2mbps_30fps.info
@@ -0,0 +1,300 @@
+86980 1 0
+6741 0 33000
+9433 0 67000
+9363 0 100000
+8671 0 133000
+9003 0 167000
+7751 0 200000
+13207 0 233000
+8542 0 267000
+9344 0 300000
+8069 0 333000
+8588 0 367000
+12087 0 400000
+7315 0 433000
+9654 0 467000
+13100 0 500000
+7832 0 533000
+10060 0 567000
+8540 0 600000
+8667 0 633000
+8532 0 667000
+6018 0 700000
+8520 0 733000
+15350 0 767000
+6110 0 800000
+7876 0 833000
+6133 0 867000
+9476 0 900000
+11002 0 933000
+7484 0 967000
+8760 0 1000000
+16515 0 1033000
+7482 0 1067000
+6983 0 1100000
+7561 0 1133000
+8263 0 1167000
+10682 0 1200000
+8108 0 1233000
+7924 0 1267000
+8693 0 1300000
+14190 0 1333000
+7393 0 1367000
+6864 0 1400000
+9431 0 1433000
+7674 0 1467000
+8458 0 1500000
+5899 0 1533000
+8259 0 1567000
+7963 0 1600000
+14779 0 1633000
+6877 0 1667000
+7268 0 1700000
+8526 0 1733000
+8467 0 1767000
+11200 0 1800000
+7261 0 1833000
+8280 0 1867000
+6718 0 1900000
+17742 0 1933000
+5206 0 1967000
+5700 0 2000000
+5872 0 2033000
+7915 0 2067000
+8493 0 2100000
+6545 0 2133000
+9072 0 2167000
+13200 0 2200000
+9632 0 2233000
+10016 0 2267000
+7824 0 2300000
+10628 0 2333000
+10401 0 2367000
+10892 0 2400000
+9023 0 2433000
+10734 0 2467000
+15045 0 2500000
+7940 0 2533000
+9657 0 2567000
+8743 0 2600000
+8074 0 2633000
+9445 0 2667000
+6494 0 2700000
+8601 0 2733000
+13478 0 2767000
+6942 0 2800000
+8002 0 2833000
+7940 0 2867000
+8320 0 2900000
+12215 0 2933000
+6668 0 2967000
+11384 0 3000000
+8378 0 3033000
+12908 0 3067000
+8420 0 3100000
+7502 0 3133000
+8482 0 3167000
+10968 0 3200000
+12338 0 3233000
+8657 0 3267000
+10468 0 3300000
+13878 0 3333000
+9374 0 3367000
+9857 0 3400000
+10381 0 3433000
+9984 0 3467000
+9956 0 3500000
+8905 0 3533000
+8672 0 3567000
+8122 0 3600000
+9677 0 3633000
+9812 0 3667000
+9622 0 3700000
+9023 0 3733000
+7147 0 3767000
+9146 0 3800000
+7488 0 3833000
+10812 0 3867000
+8340 0 3900000
+13280 0 3933000
+5167 0 3967000
+6991 0 4000000
+6543 0 4033000
+5952 0 4067000
+5164 0 4100000
+4011 0 4133000
+3794 0 4167000
+12959 0 4200000
+71020 1 4233000
+5351 0 4267000
+6283 0 4300000
+5080 0 4333000
+6707 0 4367000
+5857 0 4400000
+5221 0 4433000
+10972 0 4467000
+7023 0 4500000
+6907 0 4533000
+7851 0 4567000
+4843 0 4600000
+6085 0 4633000
+4868 0 4667000
+5093 0 4700000
+12807 0 4733000
+6330 0 4767000
+4209 0 4800000
+4596 0 4833000
+6316 0 4867000
+4954 0 4900000
+5533 0 4933000
+7749 0 4967000
+12486 0 5000000
+5468 0 5033000
+4353 0 5067000
+5786 0 5100000
+5551 0 5133000
+6711 0 5167000
+5688 0 5200000
+6258 0 5233000
+12975 0 5267000
+4873 0 5300000
+4552 0 5333000
+4844 0 5367000
+4774 0 5400000
+5025 0 5433000
+5204 0 5467000
+4814 0 5500000
+14835 0 5533000
+5343 0 5567000
+4808 0 5600000
+5071 0 5633000
+6324 0 5667000
+5243 0 5700000
+4995 0 5733000
+5134 0 5767000
+11054 0 5800000
+4807 0 5833000
+5118 0 5867000
+6424 0 5900000
+4984 0 5933000
+7187 0 5967000
+5505 0 6000000
+6941 0 6033000
+11517 0 6067000
+5646 0 6100000
+6832 0 6133000
+5294 0 6167000
+6200 0 6200000
+6328 0 6233000
+4348 0 6267000
+4607 0 6300000
+12958 0 6333000
+4308 0 6367000
+6084 0 6400000
+4494 0 6433000
+5338 0 6467000
+5742 0 6500000
+5472 0 6533000
+8459 0 6567000
+13075 0 6600000
+8986 0 6633000
+9583 0 6667000
+8792 0 6700000
+9004 0 6733000
+9632 0 6767000
+9393 0 6800000
+9259 0 6833000
+11927 0 6867000
+10323 0 6900000
+15248 0 6933000
+11244 0 6967000
+15558 0 7000000
+6197 0 7033000
+8044 0 7067000
+11432 0 7100000
+8737 0 7133000
+13885 0 7167000
+11158 0 7200000
+15152 0 7233000
+7025 0 7267000
+8025 0 7300000
+13362 0 7333000
+8090 0 7367000
+13637 0 7400000
+6148 0 7433000
+9270 0 7467000
+8633 0 7500000
+10673 0 7533000
+14208 0 7567000
+8084 0 7600000
+13783 0 7633000
+10660 0 7667000
+7466 0 7700000
+14433 0 7733000
+10934 0 7767000
+7239 0 7800000
+12548 0 7833000
+6564 0 7867000
+10761 0 7900000
+10992 0 7933000
+12924 0 7967000
+12348 0 8000000
+6770 0 8033000
+14288 0 8067000
+29345 1 8100000
+1822 0 8133000
+1087 0 8167000
+1109 0 8200000
+2007 0 8233000
+1798 0 8267000
+1635 0 8300000
+19607 0 8333000
+919 0 8367000
+2357 0 8400000
+3578 0 8433000
+4497 0 8467000
+4314 0 8500000
+3851 0 8533000
+3822 0 8567000
+4252 0 8600000
+4775 0 8633000
+12203 0 8667000
+5078 0 8700000
+5876 0 8733000
+6124 0 8767000
+4490 0 8800000
+3538 0 8833000
+3450 0 8867000
+3611 0 8900000
+2847 0 8933000
+2605 0 8967000
+12243 0 9000000
+1946 0 9033000
+1847 0 9067000
+2035 0 9100000
+2572 0 9133000
+2326 0 9167000
+2645 0 9200000
+2938 0 9233000
+2495 0 9267000
+2609 0 9300000
+9744 0 9333000
+1796 0 9367000
+1985 0 9400000
+1759 0 9433000
+2259 0 9467000
+2233 0 9500000
+2044 0 9533000
+2502 0 9567000
+2307 0 9600000
+2739 0 9633000
+11707 0 9667000
+5168 0 9700000
+4483 0 9733000
+3044 0 9767000
+4241 0 9800000
+4392 0 9833000
+4934 0 9867000
+5934 0 9900000
+5647 0 9933000
+5326 0 9967000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vp8_640x360_2mbps_30fps.vp8 b/media/codec2/hidl/1.0/vts/res/bbb_vp8_640x360_2mbps_30fps.vp8
new file mode 100644
index 0000000..6ec460c
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vp8_640x360_2mbps_30fps.vp8
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vp9_176x144_285kbps_60fps.info b/media/codec2/hidl/1.0/vts/res/bbb_vp9_176x144_285kbps_60fps.info
new file mode 100644
index 0000000..ca1a03c
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vp9_176x144_285kbps_60fps.info
@@ -0,0 +1,60 @@
+6939 1 0
+6818 0 17000
+310 0 33000
+273 0 50000
+267 0 67000
+239 0 83000
+232 0 100000
+222 0 117000
+186 0 133000
+194 0 150000
+189 0 167000
+18 0 183000
+2014 0 200000
+297 0 217000
+287 0 233000
+237 0 250000
+263 0 267000
+238 0 283000
+257 0 300000
+229 0 317000
+187 0 333000
+191 0 350000
+18 0 367000
+2203 0 383000
+265 0 400000
+224 0 417000
+254 0 433000
+252 0 450000
+273 0 467000
+208 0 483000
+154 0 500000
+182 0 517000
+138 0 533000
+18 0 550000
+2502 0 567000
+286 0 583000
+304 0 600000
+341 0 617000
+259 0 633000
+275 0 650000
+222 0 667000
+254 0 683000
+253 0 700000
+225 0 717000
+18 0 733000
+2501 0 750000
+282 0 767000
+298 0 783000
+252 0 800000
+242 0 817000
+250 0 833000
+260 0 850000
+218 0 867000
+213 0 883000
+144 0 900000
+18 0 917000
+233 0 933000
+254 0 950000
+229 0 967000
+239 0 983000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vp9_176x144_285kbps_60fps.vp9 b/media/codec2/hidl/1.0/vts/res/bbb_vp9_176x144_285kbps_60fps.vp9
new file mode 100644
index 0000000..2633c8a
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vp9_176x144_285kbps_60fps.vp9
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vp9_640x360_1600kbps_30fps.info b/media/codec2/hidl/1.0/vts/res/bbb_vp9_640x360_1600kbps_30fps.info
new file mode 100644
index 0000000..afe9679
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vp9_640x360_1600kbps_30fps.info
@@ -0,0 +1,300 @@
+54918 1 0
+46280 0 33000
+2006 0 67000
+2841 0 100000
+3044 0 133000
+3429 0 167000
+3196 0 200000
+2926 0 233000
+2821 0 267000
+1150 0 300000
+36 0 333000
+38084 0 367000
+3689 0 400000
+3473 0 433000
+3011 0 467000
+3090 0 500000
+2516 0 533000
+2771 0 567000
+3250 0 600000
+1159 0 633000
+34 0 667000
+39690 0 700000
+3615 0 733000
+2494 0 767000
+2893 0 800000
+3329 0 833000
+2939 0 867000
+2352 0 900000
+2732 0 933000
+1746 0 967000
+33 0 1000000
+41501 0 1033000
+2997 0 1067000
+2666 0 1100000
+3582 0 1133000
+2616 0 1167000
+2923 0 1200000
+2696 0 1233000
+1628 0 1267000
+1887 0 1300000
+33 0 1333000
+42876 0 1367000
+2588 0 1400000
+3316 0 1433000
+2287 0 1467000
+3375 0 1500000
+2108 0 1533000
+2961 0 1567000
+1730 0 1600000
+1800 0 1633000
+34 0 1667000
+43797 0 1700000
+2484 0 1733000
+2556 0 1767000
+2671 0 1800000
+2338 0 1833000
+3133 0 1867000
+2002 0 1900000
+1794 0 1933000
+1279 0 1967000
+32 0 2000000
+42642 0 2033000
+2686 0 2067000
+2202 0 2100000
+2145 0 2133000
+2566 0 2167000
+2190 0 2200000
+1580 0 2233000
+1711 0 2267000
+648 0 2300000
+32 0 2333000
+40409 0 2367000
+2628 0 2400000
+1973 0 2433000
+2360 0 2467000
+3043 0 2500000
+1730 0 2533000
+1456 0 2567000
+2312 0 2600000
+369 0 2633000
+32 0 2667000
+41391 0 2700000
+2967 0 2733000
+2454 0 2767000
+1825 0 2800000
+1853 0 2833000
+1746 0 2867000
+2347 0 2900000
+1362 0 2933000
+441 0 2967000
+34 0 3000000
+42503 0 3033000
+1877 0 3067000
+1690 0 3100000
+1367 0 3133000
+1520 0 3167000
+1240 0 3200000
+1094 0 3233000
+739 0 3267000
+392 0 3300000
+33 0 3333000
+35104 0 3367000
+1463 0 3400000
+2029 0 3433000
+1626 0 3467000
+1956 0 3500000
+799 0 3533000
+556 0 3567000
+584 0 3600000
+191 0 3633000
+36 0 3667000
+37652 0 3700000
+862 0 3733000
+524 0 3767000
+641 0 3800000
+584 0 3833000
+360 0 3867000
+365 0 3900000
+361 0 3933000
+154 0 3967000
+36 0 4000000
+125740 0 4033000
+332 0 4067000
+381 0 4100000
+420 0 4133000
+464 0 4167000
+288 0 4200000
+2660 0 4233000
+127564 1 4267000
+30696 0 4300000
+3423 0 4333000
+3310 0 4367000
+3513 0 4400000
+3735 0 4433000
+3358 0 4467000
+3108 0 4500000
+2800 0 4533000
+1751 0 4567000
+41 0 4600000
+39862 0 4633000
+3739 0 4667000
+3755 0 4700000
+3408 0 4733000
+3783 0 4767000
+3423 0 4800000
+2801 0 4833000
+2549 0 4867000
+1461 0 4900000
+40 0 4933000
+41667 0 4967000
+3623 0 5000000
+3356 0 5033000
+3424 0 5067000
+3548 0 5100000
+3119 0 5133000
+2905 0 5167000
+2772 0 5200000
+1623 0 5233000
+43 0 5267000
+46783 0 5300000
+3462 0 5333000
+3470 0 5367000
+3677 0 5400000
+3684 0 5433000
+3266 0 5467000
+3127 0 5500000
+2809 0 5533000
+1750 0 5567000
+40 0 5600000
+46215 0 5633000
+3599 0 5667000
+3558 0 5700000
+3544 0 5733000
+3632 0 5767000
+3548 0 5800000
+2968 0 5833000
+2715 0 5867000
+1729 0 5900000
+41 0 5933000
+45958 0 5967000
+3776 0 6000000
+3525 0 6033000
+3644 0 6067000
+3786 0 6100000
+3222 0 6133000
+2923 0 6167000
+2752 0 6200000
+1592 0 6233000
+41 0 6267000
+46031 0 6300000
+3520 0 6333000
+3380 0 6367000
+3371 0 6400000
+3427 0 6433000
+3135 0 6467000
+2988 0 6500000
+2730 0 6533000
+1671 0 6567000
+41 0 6600000
+45846 0 6633000
+3535 0 6667000
+3507 0 6700000
+3429 0 6733000
+3491 0 6767000
+3325 0 6800000
+2979 0 6833000
+2800 0 6867000
+1610 0 6900000
+40 0 6933000
+45958 0 6967000
+3762 0 7000000
+3254 0 7033000
+3408 0 7067000
+3860 0 7100000
+3198 0 7133000
+2966 0 7167000
+2882 0 7200000
+1763 0 7233000
+42 0 7267000
+46130 0 7300000
+3593 0 7333000
+3523 0 7367000
+3939 0 7400000
+3980 0 7433000
+3470 0 7467000
+3191 0 7500000
+2969 0 7533000
+1740 0 7567000
+41 0 7600000
+46300 0 7633000
+3739 0 7667000
+3781 0 7700000
+3964 0 7733000
+4023 0 7767000
+3480 0 7800000
+3065 0 7833000
+2934 0 7867000
+1805 0 7900000
+42 0 7933000
+38166 0 7967000
+4062 0 8000000
+3844 0 8033000
+4547 0 8067000
+934 0 8100000
+365 0 8133000
+181 0 8167000
+463 0 8200000
+419 0 8233000
+38 0 8267000
+9702 0 8300000
+344 0 8333000
+276 0 8367000
+1350 0 8400000
+1703 0 8433000
+1843 0 8467000
+1228 0 8500000
+35580 1 8533000
+27458 0 8567000
+2144 0 8600000
+2482 0 8633000
+2004 0 8667000
+2822 0 8700000
+2570 0 8733000
+1726 0 8767000
+1248 0 8800000
+844 0 8833000
+35 0 8867000
+14207 0 8900000
+1037 0 8933000
+749 0 8967000
+829 0 9000000
+915 0 9033000
+685 0 9067000
+767 0 9100000
+798 0 9133000
+342 0 9167000
+31 0 9200000
+12590 0 9233000
+923 0 9267000
+819 0 9300000
+776 0 9333000
+863 0 9367000
+729 0 9400000
+471 0 9433000
+638 0 9467000
+276 0 9500000
+38 0 9533000
+17272 0 9567000
+856 0 9600000
+1158 0 9633000
+2172 0 9667000
+2751 0 9700000
+2142 0 9733000
+1267 0 9767000
+1965 0 9800000
+1510 0 9833000
+34 0 9867000
+2692 0 9900000
+2778 0 9933000
+2585 0 9967000
diff --git a/media/codec2/hidl/1.0/vts/res/bbb_vp9_640x360_1600kbps_30fps.vp9 b/media/codec2/hidl/1.0/vts/res/bbb_vp9_640x360_1600kbps_30fps.vp9
new file mode 100644
index 0000000..c1e2001
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/bbb_vp9_640x360_1600kbps_30fps.vp9
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/sine_amrnb_1ch_12kbps_8000hz.amrnb b/media/codec2/hidl/1.0/vts/res/sine_amrnb_1ch_12kbps_8000hz.amrnb
new file mode 100644
index 0000000..3daf2e0
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/sine_amrnb_1ch_12kbps_8000hz.amrnb
Binary files differ
diff --git a/media/codec2/hidl/1.0/vts/res/sine_amrnb_1ch_12kbps_8000hz.info b/media/codec2/hidl/1.0/vts/res/sine_amrnb_1ch_12kbps_8000hz.info
new file mode 100644
index 0000000..b36e813
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/res/sine_amrnb_1ch_12kbps_8000hz.info
@@ -0,0 +1,833 @@
+32 1 0
+32 1 20000
+32 1 40000
+32 1 60000
+32 1 80000
+32 1 100000
+32 1 120000
+32 1 140000
+32 1 160000
+32 1 180000
+32 1 200000
+32 1 220000
+32 1 240000
+32 1 260000
+32 1 280000
+32 1 300000
+32 1 320000
+32 1 340000
+32 1 360000
+32 1 380000
+32 1 400000
+32 1 420000
+32 1 440000
+32 1 460000
+32 1 480000
+32 1 500000
+32 1 520000
+32 1 540000
+32 1 560000
+32 1 580000
+32 1 600000
+32 1 620000
+32 1 640000
+32 1 660000
+32 1 680000
+32 1 700000
+32 1 720000
+32 1 740000
+32 1 760000
+32 1 780000
+32 1 800000
+32 1 820000
+32 1 840000
+32 1 860000
+32 1 880000
+32 1 900000
+32 1 920000
+32 1 940000
+32 1 960000
+32 1 980000
+32 1 1000000
+32 1 1020000
+32 1 1040000
+32 1 1060000
+32 1 1080000
+32 1 1100000
+32 1 1120000
+32 1 1140000
+32 1 1160000
+32 1 1180000
+32 1 1200000
+32 1 1220000
+32 1 1240000
+32 1 1260000
+32 1 1280000
+32 1 1300000
+32 1 1320000
+32 1 1340000
+32 1 1360000
+32 1 1380000
+32 1 1400000
+32 1 1420000
+32 1 1440000
+32 1 1460000
+32 1 1480000
+32 1 1500000
+32 1 1520000
+32 1 1540000
+32 1 1560000
+32 1 1580000
+32 1 1600000
+32 1 1620000
+32 1 1640000
+32 1 1660000
+32 1 1680000
+32 1 1700000
+32 1 1720000
+32 1 1740000
+32 1 1760000
+32 1 1780000
+32 1 1800000
+32 1 1820000
+32 1 1840000
+32 1 1860000
+32 1 1880000
+32 1 1900000
+32 1 1920000
+32 1 1940000
+32 1 1960000
+32 1 1980000
+32 1 2000000
+32 1 2020000
+32 1 2040000
+32 1 2060000
+32 1 2080000
+32 1 2100000
+32 1 2120000
+32 1 2140000
+32 1 2160000
+32 1 2180000
+32 1 2200000
+32 1 2220000
+32 1 2240000
+32 1 2260000
+32 1 2280000
+32 1 2300000
+32 1 2320000
+32 1 2340000
+32 1 2360000
+32 1 2380000
+32 1 2400000
+32 1 2420000
+32 1 2440000
+32 1 2460000
+32 1 2480000
+32 1 2500000
+32 1 2520000
+32 1 2540000
+32 1 2560000
+32 1 2580000
+32 1 2600000
+32 1 2620000
+32 1 2640000
+32 1 2660000
+32 1 2680000
+32 1 2700000
+32 1 2720000
+32 1 2740000
+32 1 2760000
+32 1 2780000
+32 1 2800000
+32 1 2820000
+32 1 2840000
+32 1 2860000
+32 1 2880000
+32 1 2900000
+32 1 2920000
+32 1 2940000
+32 1 2960000
+32 1 2980000
+32 1 3000000
+32 1 3020000
+32 1 3040000
+32 1 3060000
+32 1 3080000
+32 1 3100000
+32 1 3120000
+32 1 3140000
+32 1 3160000
+32 1 3180000
+32 1 3200000
+32 1 3220000
+32 1 3240000
+32 1 3260000
+32 1 3280000
+32 1 3300000
+32 1 3320000
+32 1 3340000
+32 1 3360000
+32 1 3380000
+32 1 3400000
+32 1 3420000
+32 1 3440000
+32 1 3460000
+32 1 3480000
+32 1 3500000
+32 1 3520000
+32 1 3540000
+32 1 3560000
+32 1 3580000
+32 1 3600000
+32 1 3620000
+32 1 3640000
+32 1 3660000
+32 1 3680000
+32 1 3700000
+32 1 3720000
+32 1 3740000
+32 1 3760000
+32 1 3780000
+32 1 3800000
+32 1 3820000
+32 1 3840000
+32 1 3860000
+32 1 3880000
+32 1 3900000
+32 1 3920000
+32 1 3940000
+32 1 3960000
+32 1 3980000
+32 1 4000000
+32 1 4020000
+32 1 4040000
+32 1 4060000
+32 1 4080000
+32 1 4100000
+32 1 4120000
+32 1 4140000
+32 1 4160000
+32 1 4180000
+32 1 4200000
+32 1 4220000
+32 1 4240000
+32 1 4260000
+32 1 4280000
+32 1 4300000
+32 1 4320000
+32 1 4340000
+32 1 4360000
+32 1 4380000
+32 1 4400000
+32 1 4420000
+32 1 4440000
+32 1 4460000
+32 1 4480000
+32 1 4500000
+32 1 4520000
+32 1 4540000
+32 1 4560000
+32 1 4580000
+32 1 4600000
+32 1 4620000
+32 1 4640000
+32 1 4660000
+32 1 4680000
+32 1 4700000
+32 1 4720000
+32 1 4740000
+32 1 4760000
+32 1 4780000
+32 1 4800000
+32 1 4820000
+32 1 4840000
+32 1 4860000
+32 1 4880000
+32 1 4900000
+32 1 4920000
+32 1 4940000
+32 1 4960000
+32 1 4980000
+32 1 5000000
+32 1 5020000
+32 1 5040000
+32 1 5060000
+32 1 5080000
+32 1 5100000
+32 1 5120000
+32 1 5140000
+32 1 5160000
+32 1 5180000
+32 1 5200000
+32 1 5220000
+32 1 5240000
+32 1 5260000
+32 1 5280000
+32 1 5300000
+32 1 5320000
+32 1 5340000
+32 1 5360000
+32 1 5380000
+32 1 5400000
+32 1 5420000
+32 1 5440000
+32 1 5460000
+32 1 5480000
+32 1 5500000
+32 1 5520000
+32 1 5540000
+32 1 5560000
+32 1 5580000
+32 1 5600000
+32 1 5620000
+32 1 5640000
+32 1 5660000
+32 1 5680000
+32 1 5700000
+32 1 5720000
+32 1 5740000
+32 1 5760000
+32 1 5780000
+32 1 5800000
+32 1 5820000
+32 1 5840000
+32 1 5860000
+32 1 5880000
+32 1 5900000
+32 1 5920000
+32 1 5940000
+32 1 5960000
+32 1 5980000
+32 1 6000000
+32 1 6020000
+32 1 6040000
+32 1 6060000
+32 1 6080000
+32 1 6100000
+32 1 6120000
+32 1 6140000
+32 1 6160000
+32 1 6180000
+32 1 6200000
+32 1 6220000
+32 1 6240000
+32 1 6260000
+32 1 6280000
+32 1 6300000
+32 1 6320000
+32 1 6340000
+32 1 6360000
+32 1 6380000
+32 1 6400000
+32 1 6420000
+32 1 6440000
+32 1 6460000
+32 1 6480000
+32 1 6500000
+32 1 6520000
+32 1 6540000
+32 1 6560000
+32 1 6580000
+32 1 6600000
+32 1 6620000
+32 1 6640000
+32 1 6660000
+32 1 6680000
+32 1 6700000
+32 1 6720000
+32 1 6740000
+32 1 6760000
+32 1 6780000
+32 1 6800000
+32 1 6820000
+32 1 6840000
+32 1 6860000
+32 1 6880000
+32 1 6900000
+32 1 6920000
+32 1 6940000
+32 1 6960000
+32 1 6980000
+32 1 7000000
+32 1 7020000
+32 1 7040000
+32 1 7060000
+32 1 7080000
+32 1 7100000
+32 1 7120000
+32 1 7140000
+32 1 7160000
+32 1 7180000
+32 1 7200000
+32 1 7220000
+32 1 7240000
+32 1 7260000
+32 1 7280000
+32 1 7300000
+32 1 7320000
+32 1 7340000
+32 1 7360000
+32 1 7380000
+32 1 7400000
+32 1 7420000
+32 1 7440000
+32 1 7460000
+32 1 7480000
+32 1 7500000
+32 1 7520000
+32 1 7540000
+32 1 7560000
+32 1 7580000
+32 1 7600000
+32 1 7620000
+32 1 7640000
+32 1 7660000
+32 1 7680000
+32 1 7700000
+32 1 7720000
+32 1 7740000
+32 1 7760000
+32 1 7780000
+32 1 7800000
+32 1 7820000
+32 1 7840000
+32 1 7860000
+32 1 7880000
+32 1 7900000
+32 1 7920000
+32 1 7940000
+32 1 7960000
+32 1 7980000
+32 1 8000000
+32 1 8020000
+32 1 8040000
+32 1 8060000
+32 1 8080000
+32 1 8100000
+32 1 8120000
+32 1 8140000
+32 1 8160000
+32 1 8180000
+32 1 8200000
+32 1 8220000
+32 1 8240000
+32 1 8260000
+32 1 8280000
+32 1 8300000
+32 1 8320000
+32 1 8340000
+32 1 8360000
+32 1 8380000
+32 1 8400000
+32 1 8420000
+32 1 8440000
+32 1 8460000
+32 1 8480000
+32 1 8500000
+32 1 8520000
+32 1 8540000
+32 1 8560000
+32 1 8580000
+32 1 8600000
+32 1 8620000
+32 1 8640000
+32 1 8660000
+32 1 8680000
+32 1 8700000
+32 1 8720000
+32 1 8740000
+32 1 8760000
+32 1 8780000
+32 1 8800000
+32 1 8820000
+32 1 8840000
+32 1 8860000
+32 1 8880000
+32 1 8900000
+32 1 8920000
+32 1 8940000
+32 1 8960000
+32 1 8980000
+32 1 9000000
+32 1 9020000
+32 1 9040000
+32 1 9060000
+32 1 9080000
+32 1 9100000
+32 1 9120000
+32 1 9140000
+32 1 9160000
+32 1 9180000
+32 1 9200000
+32 1 9220000
+32 1 9240000
+32 1 9260000
+32 1 9280000
+32 1 9300000
+32 1 9320000
+32 1 9340000
+32 1 9360000
+32 1 9380000
+32 1 9400000
+32 1 9420000
+32 1 9440000
+32 1 9460000
+32 1 9480000
+32 1 9500000
+32 1 9520000
+32 1 9540000
+32 1 9560000
+32 1 9580000
+32 1 9600000
+32 1 9620000
+32 1 9640000
+32 1 9660000
+32 1 9680000
+32 1 9700000
+32 1 9720000
+32 1 9740000
+32 1 9760000
+32 1 9780000
+32 1 9800000
+32 1 9820000
+32 1 9840000
+32 1 9860000
+32 1 9880000
+32 1 9900000
+32 1 9920000
+32 1 9940000
+32 1 9960000
+32 1 9980000
+32 1 10000000
+32 1 10020000
+32 1 10040000
+32 1 10060000
+32 1 10080000
+32 1 10100000
+32 1 10120000
+32 1 10140000
+32 1 10160000
+32 1 10180000
+32 1 10200000
+32 1 10220000
+32 1 10240000
+32 1 10260000
+32 1 10280000
+32 1 10300000
+32 1 10320000
+32 1 10340000
+32 1 10360000
+32 1 10380000
+32 1 10400000
+32 1 10420000
+32 1 10440000
+32 1 10460000
+32 1 10480000
+32 1 10500000
+32 1 10520000
+32 1 10540000
+32 1 10560000
+32 1 10580000
+32 1 10600000
+32 1 10620000
+32 1 10640000
+32 1 10660000
+32 1 10680000
+32 1 10700000
+32 1 10720000
+32 1 10740000
+32 1 10760000
+32 1 10780000
+32 1 10800000
+32 1 10820000
+32 1 10840000
+32 1 10860000
+32 1 10880000
+32 1 10900000
+32 1 10920000
+32 1 10940000
+32 1 10960000
+32 1 10980000
+32 1 11000000
+32 1 11020000
+32 1 11040000
+32 1 11060000
+32 1 11080000
+32 1 11100000
+32 1 11120000
+32 1 11140000
+32 1 11160000
+32 1 11180000
+32 1 11200000
+32 1 11220000
+32 1 11240000
+32 1 11260000
+32 1 11280000
+32 1 11300000
+32 1 11320000
+32 1 11340000
+32 1 11360000
+32 1 11380000
+32 1 11400000
+32 1 11420000
+32 1 11440000
+32 1 11460000
+32 1 11480000
+32 1 11500000
+32 1 11520000
+32 1 11540000
+32 1 11560000
+32 1 11580000
+32 1 11600000
+32 1 11620000
+32 1 11640000
+32 1 11660000
+32 1 11680000
+32 1 11700000
+32 1 11720000
+32 1 11740000
+32 1 11760000
+32 1 11780000
+32 1 11800000
+32 1 11820000
+32 1 11840000
+32 1 11860000
+32 1 11880000
+32 1 11900000
+32 1 11920000
+32 1 11940000
+32 1 11960000
+32 1 11980000
+32 1 12000000
+32 1 12020000
+32 1 12040000
+32 1 12060000
+32 1 12080000
+32 1 12100000
+32 1 12120000
+32 1 12140000
+32 1 12160000
+32 1 12180000
+32 1 12200000
+32 1 12220000
+32 1 12240000
+32 1 12260000
+32 1 12280000
+32 1 12300000
+32 1 12320000
+32 1 12340000
+32 1 12360000
+32 1 12380000
+32 1 12400000
+32 1 12420000
+32 1 12440000
+32 1 12460000
+32 1 12480000
+32 1 12500000
+32 1 12520000
+32 1 12540000
+32 1 12560000
+32 1 12580000
+32 1 12600000
+32 1 12620000
+32 1 12640000
+32 1 12660000
+32 1 12680000
+32 1 12700000
+32 1 12720000
+32 1 12740000
+32 1 12760000
+32 1 12780000
+32 1 12800000
+32 1 12820000
+32 1 12840000
+32 1 12860000
+32 1 12880000
+32 1 12900000
+32 1 12920000
+32 1 12940000
+32 1 12960000
+32 1 12980000
+32 1 13000000
+32 1 13020000
+32 1 13040000
+32 1 13060000
+32 1 13080000
+32 1 13100000
+32 1 13120000
+32 1 13140000
+32 1 13160000
+32 1 13180000
+32 1 13200000
+32 1 13220000
+32 1 13240000
+32 1 13260000
+32 1 13280000
+32 1 13300000
+32 1 13320000
+32 1 13340000
+32 1 13360000
+32 1 13380000
+32 1 13400000
+32 1 13420000
+32 1 13440000
+32 1 13460000
+32 1 13480000
+32 1 13500000
+32 1 13520000
+32 1 13540000
+32 1 13560000
+32 1 13580000
+32 1 13600000
+32 1 13620000
+32 1 13640000
+32 1 13660000
+32 1 13680000
+32 1 13700000
+32 1 13720000
+32 1 13740000
+32 1 13760000
+32 1 13780000
+32 1 13800000
+32 1 13820000
+32 1 13840000
+32 1 13860000
+32 1 13880000
+32 1 13900000
+32 1 13920000
+32 1 13940000
+32 1 13960000
+32 1 13980000
+32 1 14000000
+32 1 14020000
+32 1 14040000
+32 1 14060000
+32 1 14080000
+32 1 14100000
+32 1 14120000
+32 1 14140000
+32 1 14160000
+32 1 14180000
+32 1 14200000
+32 1 14220000
+32 1 14240000
+32 1 14260000
+32 1 14280000
+32 1 14300000
+32 1 14320000
+32 1 14340000
+32 1 14360000
+32 1 14380000
+32 1 14400000
+32 1 14420000
+32 1 14440000
+32 1 14460000
+32 1 14480000
+32 1 14500000
+32 1 14520000
+32 1 14540000
+32 1 14560000
+32 1 14580000
+32 1 14600000
+32 1 14620000
+32 1 14640000
+32 1 14660000
+32 1 14680000
+32 1 14700000
+32 1 14720000
+32 1 14740000
+32 1 14760000
+32 1 14780000
+32 1 14800000
+32 1 14820000
+32 1 14840000
+32 1 14860000
+32 1 14880000
+32 1 14900000
+32 1 14920000
+32 1 14940000
+32 1 14960000
+32 1 14980000
+32 1 15000000
+32 1 15020000
+32 1 15040000
+32 1 15060000
+32 1 15080000
+32 1 15100000
+32 1 15120000
+32 1 15140000
+32 1 15160000
+32 1 15180000
+32 1 15200000
+32 1 15220000
+32 1 15240000
+32 1 15260000
+32 1 15280000
+32 1 15300000
+32 1 15320000
+32 1 15340000
+32 1 15360000
+32 1 15380000
+32 1 15400000
+32 1 15420000
+32 1 15440000
+32 1 15460000
+32 1 15480000
+32 1 15500000
+32 1 15520000
+32 1 15540000
+32 1 15560000
+32 1 15580000
+32 1 15600000
+32 1 15620000
+32 1 15640000
+32 1 15660000
+32 1 15680000
+32 1 15700000
+32 1 15720000
+32 1 15740000
+32 1 15760000
+32 1 15780000
+32 1 15800000
+32 1 15820000
+32 1 15840000
+32 1 15860000
+32 1 15880000
+32 1 15900000
+32 1 15920000
+32 1 15940000
+32 1 15960000
+32 1 15980000
+32 1 16000000
+32 1 16020000
+32 1 16040000
+32 1 16060000
+32 1 16080000
+32 1 16100000
+32 1 16120000
+32 1 16140000
+32 1 16160000
+32 1 16180000
+32 1 16200000
+32 1 16220000
+32 1 16240000
+32 1 16260000
+32 1 16280000
+32 1 16300000
+32 1 16320000
+32 1 16340000
+32 1 16360000
+32 1 16380000
+32 1 16400000
+32 1 16420000
+32 1 16440000
+32 1 16460000
+32 1 16480000
+32 1 16500000
+32 1 16520000
+32 1 16540000
+32 1 16560000
+32 1 16580000
+32 1 16600000
+32 1 16620000
+32 1 16640000
diff --git a/media/codec2/hidl/1.0/vts/video/Android.bp b/media/codec2/hidl/1.0/vts/video/Android.bp
new file mode 100644
index 0000000..6e57ee7
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/video/Android.bp
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+cc_test {
+ name: "VtsHidlC2V1_0TargetVideoDecTest",
+ defaults: ["VtsMediaC2V1_0Defaults"],
+ srcs: ["VtsHidlC2V1_0TargetVideoDecTest.cpp"],
+}
+
+cc_test {
+ name: "VtsHidlC2V1_0TargetVideoEncTest",
+ defaults: ["VtsMediaC2V1_0Defaults"],
+ srcs: ["VtsHidlC2V1_0TargetVideoEncTest.cpp"],
+}
+
diff --git a/media/codec2/hidl/1.0/vts/video/VtsHidlC2V1_0TargetVideoDecTest.cpp b/media/codec2/hidl/1.0/vts/video/VtsHidlC2V1_0TargetVideoDecTest.cpp
new file mode 100644
index 0000000..8420cab
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/video/VtsHidlC2V1_0TargetVideoDecTest.cpp
@@ -0,0 +1,891 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "codec2_hidl_hal_video_dec_test"
+
+#include <android-base/logging.h>
+#include <gtest/gtest.h>
+#include <stdio.h>
+#include <fstream>
+
+#include <codec2/hidl/client.h>
+#include <C2AllocatorIon.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2Buffer.h>
+#include <C2BufferPriv.h>
+
+using android::C2AllocatorIon;
+
+#include <VtsHalHidlTargetTestBase.h>
+#include "media_c2_video_hidl_test_common.h"
+#include "media_c2_hidl_test_common.h"
+
+struct FrameInfo {
+ int bytesCount;
+ uint32_t flags;
+ int64_t timestamp;
+};
+
+class LinearBuffer : public C2Buffer {
+ public:
+ explicit LinearBuffer(const std::shared_ptr<C2LinearBlock>& block)
+ : C2Buffer(
+ {block->share(block->offset(), block->size(), ::C2Fence())}) {}
+};
+
+static ComponentTestEnvironment* gEnv = nullptr;
+
+namespace {
+
+class Codec2VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
+ private:
+ typedef ::testing::VtsHalHidlTargetTestBase Super;
+
+ public:
+ ::std::string getTestCaseInfo() const override {
+ return ::std::string() +
+ "Component: " + gEnv->getComponent().c_str() + " | " +
+ "Instance: " + gEnv->getInstance().c_str() + " | " +
+ "Res: " + gEnv->getRes().c_str();
+ }
+
+ // google.codec2 Video test setup
+ virtual void SetUp() override {
+ Super::SetUp();
+ mDisableTest = false;
+ ALOGV("Codec2VideoDecHidlTest SetUp");
+ mClient = android::Codec2Client::CreateFromService(
+ gEnv->getInstance().c_str());
+ ASSERT_NE(mClient, nullptr);
+ mListener.reset(new CodecListener(
+ [this](std::list<std::unique_ptr<C2Work>>& workItems) {
+ handleWorkDone(workItems);
+ }));
+ ASSERT_NE(mListener, nullptr);
+ for (int i = 0; i < MAX_INPUT_BUFFERS; ++i) {
+ mWorkQueue.emplace_back(new C2Work);
+ }
+ mClient->createComponent(gEnv->getComponent().c_str(), mListener,
+ &mComponent);
+ ASSERT_NE(mComponent, nullptr);
+
+ std::shared_ptr<C2AllocatorStore> store =
+ android::GetCodec2PlatformAllocatorStore();
+ CHECK_EQ(store->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR,
+ &mLinearAllocator),
+ C2_OK);
+ mLinearPool = std::make_shared<C2PooledBlockPool>(mLinearAllocator,
+ mBlockPoolId++);
+ ASSERT_NE(mLinearPool, nullptr);
+
+ mCompName = unknown_comp;
+ struct StringToName {
+ const char* Name;
+ standardComp CompName;
+ };
+
+ const StringToName kStringToName[] = {
+ {"h263", h263}, {"avc", avc}, {"mpeg2", mpeg2}, {"mpeg4", mpeg4},
+ {"hevc", hevc}, {"vp8", vp8}, {"vp9", vp9},
+ };
+
+ const size_t kNumStringToName =
+ sizeof(kStringToName) / sizeof(kStringToName[0]);
+
+ std::string substring;
+ std::string comp;
+ substring = std::string(gEnv->getComponent());
+ /* TODO: better approach to find the component */
+ /* "c2.android." => 11th position */
+ size_t pos = 11;
+ size_t len = substring.find(".decoder", pos);
+ comp = substring.substr(pos, len - pos);
+
+ for (size_t i = 0; i < kNumStringToName; ++i) {
+ if (!strcasecmp(comp.c_str(), kStringToName[i].Name)) {
+ mCompName = kStringToName[i].CompName;
+ break;
+ }
+ }
+ mEos = false;
+ mFramesReceived = 0;
+ mTimestampUs = 0u;
+ mTimestampDevTest = false;
+ if (mCompName == unknown_comp) mDisableTest = true;
+ if (mDisableTest) std::cout << "[ WARN ] Test Disabled \n";
+ }
+
+ virtual void TearDown() override {
+ if (mComponent != nullptr) {
+ if (::testing::Test::HasFatalFailure()) return;
+ mComponent->release();
+ mComponent = nullptr;
+ }
+ Super::TearDown();
+ }
+
+ // callback function to process onWorkDone received by Listener
+ void handleWorkDone(std::list<std::unique_ptr<C2Work>>& workItems) {
+ for (std::unique_ptr<C2Work>& work : workItems) {
+ // handle configuration changes in work done
+ if (!work->worklets.empty() &&
+ (work->worklets.front()->output.configUpdate.size() != 0)) {
+ ALOGV("Config Update");
+ std::vector<std::unique_ptr<C2Param>> updates =
+ std::move(work->worklets.front()->output.configUpdate);
+ std::vector<C2Param*> configParam;
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ for (size_t i = 0; i < updates.size(); ++i) {
+ C2Param* param = updates[i].get();
+ if (param->index() ==
+ C2VideoSizeStreamInfo::output::PARAM_TYPE) {
+ ALOGV("Received C2VideoSizeStreamInfo");
+ configParam.push_back(param);
+ }
+ }
+ mComponent->config(configParam, C2_DONT_BLOCK, &failures);
+ ASSERT_EQ(failures.size(), 0u);
+ }
+
+ mFramesReceived++;
+ mEos = (work->worklets.front()->output.flags &
+ C2FrameData::FLAG_END_OF_STREAM) != 0;
+ auto frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ work->input.ordinal.frameIndex.peeku());
+
+ // For decoder components current timestamp always exceeds
+ // previous timestamp
+ typedef std::unique_lock<std::mutex> ULock;
+ bool codecConfig = ((work->worklets.front()->output.flags &
+ C2FrameData::FLAG_CODEC_CONFIG) != 0);
+ if (!codecConfig &&
+ !work->worklets.front()->output.buffers.empty()) {
+ EXPECT_GE(
+ (work->worklets.front()->output.ordinal.timestamp.peeku()),
+ mTimestampUs);
+ mTimestampUs =
+ work->worklets.front()->output.ordinal.timestamp.peeku();
+
+ ULock l(mQueueLock);
+ if (mTimestampDevTest) {
+ bool tsHit = false;
+ std::list<uint64_t>::iterator it = mTimestampUslist.begin();
+ while (it != mTimestampUslist.end()) {
+ if (*it == mTimestampUs) {
+ mTimestampUslist.erase(it);
+ tsHit = true;
+ break;
+ }
+ it++;
+ }
+ if (tsHit == false) {
+ if (mTimestampUslist.empty() == false) {
+ EXPECT_EQ(tsHit, true)
+ << "TimeStamp not recognized";
+ } else {
+ std::cout << "[ INFO ] Received non-zero "
+ "output / TimeStamp not recognized \n";
+ }
+ }
+ }
+ }
+
+ work->input.buffers.clear();
+ work->worklets.clear();
+ {
+ ULock l(mQueueLock);
+ mWorkQueue.push_back(std::move(work));
+ if (!mFlushedIndices.empty()) {
+ mFlushedIndices.erase(frameIndexIt);
+ }
+ mQueueCondition.notify_all();
+ }
+ }
+ }
+
+ enum standardComp {
+ h263,
+ avc,
+ mpeg2,
+ mpeg4,
+ hevc,
+ vp8,
+ vp9,
+ unknown_comp,
+ };
+
+ bool mEos;
+ bool mDisableTest;
+ bool mTimestampDevTest;
+ uint64_t mTimestampUs;
+ std::list<uint64_t> mTimestampUslist;
+ std::list<uint64_t> mFlushedIndices;
+ standardComp mCompName;
+ uint32_t mFramesReceived;
+ C2BlockPool::local_id_t mBlockPoolId;
+ std::shared_ptr<C2BlockPool> mLinearPool;
+ std::shared_ptr<C2Allocator> mLinearAllocator;
+
+ std::mutex mQueueLock;
+ std::condition_variable mQueueCondition;
+ std::list<std::unique_ptr<C2Work>> mWorkQueue;
+
+ std::shared_ptr<android::Codec2Client> mClient;
+ std::shared_ptr<android::Codec2Client::Listener> mListener;
+ std::shared_ptr<android::Codec2Client::Component> mComponent;
+
+ protected:
+ static void description(const std::string& description) {
+ RecordProperty("description", description);
+ }
+};
+
+void validateComponent(
+ const std::shared_ptr<android::Codec2Client::Component>& component,
+ Codec2VideoDecHidlTest::standardComp compName, bool& disableTest) {
+ // Validate its a C2 Component
+ if (component->getName().find("c2") == std::string::npos) {
+ ALOGE("Not a c2 component");
+ disableTest = true;
+ return;
+ }
+
+ // Validate its not an encoder and the component to be tested is video
+ if (component->getName().find("encoder") != std::string::npos) {
+ ALOGE("Expected Decoder, given Encoder");
+ disableTest = true;
+ return;
+ }
+ std::vector<std::unique_ptr<C2Param>> queried;
+ c2_status_t c2err =
+ component->query({}, {C2PortMediaTypeSetting::input::PARAM_TYPE},
+ C2_DONT_BLOCK, &queried);
+ if (c2err != C2_OK && queried.size() == 0) {
+ ALOGE("Query media type failed => %d", c2err);
+ } else {
+ std::string inputDomain =
+ ((C2StreamMediaTypeSetting::input*)queried[0].get())->m.value;
+ if (inputDomain.find("video/") == std::string::npos) {
+ ALOGE("Expected Video Component");
+ disableTest = true;
+ return;
+ }
+ }
+
+ // Validates component name
+ if (compName == Codec2VideoDecHidlTest::unknown_comp) {
+ ALOGE("Component InValid");
+ disableTest = true;
+ return;
+ }
+ ALOGV("Component Valid");
+}
+
+// number of elementary streams per component
+#define STREAM_COUNT 2
+// LookUpTable of clips and metadata for component testing
+void GetURLForComponent(Codec2VideoDecHidlTest::standardComp comp, char* mURL,
+ char* info, size_t streamIndex = 1) {
+ struct CompToURL {
+ Codec2VideoDecHidlTest::standardComp comp;
+ const char mURL[STREAM_COUNT][512];
+ const char info[STREAM_COUNT][512];
+ };
+ ASSERT_TRUE(streamIndex < STREAM_COUNT);
+
+ static const CompToURL kCompToURL[] = {
+ {Codec2VideoDecHidlTest::standardComp::avc,
+ {"bbb_avc_176x144_300kbps_60fps.h264",
+ "bbb_avc_640x360_768kbps_30fps.h264"},
+ {"bbb_avc_176x144_300kbps_60fps.info",
+ "bbb_avc_640x360_768kbps_30fps.info"}},
+ {Codec2VideoDecHidlTest::standardComp::hevc,
+ {"bbb_hevc_176x144_176kbps_60fps.hevc",
+ "bbb_hevc_640x360_1600kbps_30fps.hevc"},
+ {"bbb_hevc_176x144_176kbps_60fps.info",
+ "bbb_hevc_640x360_1600kbps_30fps.info"}},
+ {Codec2VideoDecHidlTest::standardComp::mpeg2,
+ {"bbb_mpeg2_176x144_105kbps_25fps.m2v",
+ "bbb_mpeg2_352x288_1mbps_60fps.m2v"},
+ {"bbb_mpeg2_176x144_105kbps_25fps.info",
+ "bbb_mpeg2_352x288_1mbps_60fps.info"}},
+ {Codec2VideoDecHidlTest::standardComp::h263,
+ {"", "bbb_h263_352x288_300kbps_12fps.h263"},
+ {"", "bbb_h263_352x288_300kbps_12fps.info"}},
+ {Codec2VideoDecHidlTest::standardComp::mpeg4,
+ {"", "bbb_mpeg4_352x288_512kbps_30fps.m4v"},
+ {"", "bbb_mpeg4_352x288_512kbps_30fps.info"}},
+ {Codec2VideoDecHidlTest::standardComp::vp8,
+ {"bbb_vp8_176x144_240kbps_60fps.vp8",
+ "bbb_vp8_640x360_2mbps_30fps.vp8"},
+ {"bbb_vp8_176x144_240kbps_60fps.info",
+ "bbb_vp8_640x360_2mbps_30fps.info"}},
+ {Codec2VideoDecHidlTest::standardComp::vp9,
+ {"bbb_vp9_176x144_285kbps_60fps.vp9",
+ "bbb_vp9_640x360_1600kbps_30fps.vp9"},
+ {"bbb_vp9_176x144_285kbps_60fps.info",
+ "bbb_vp9_640x360_1600kbps_30fps.info"}},
+ };
+
+ for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) {
+ if (kCompToURL[i].comp == comp) {
+ strcat(mURL, kCompToURL[i].mURL[streamIndex]);
+ strcat(info, kCompToURL[i].info[streamIndex]);
+ return;
+ }
+ }
+}
+
+void decodeNFrames(const std::shared_ptr<android::Codec2Client::Component> &component,
+ std::mutex &queueLock, std::condition_variable &queueCondition,
+ std::list<std::unique_ptr<C2Work>> &workQueue,
+ std::list<uint64_t> &flushedIndices,
+ std::shared_ptr<C2BlockPool> &linearPool,
+ std::ifstream& eleStream,
+ android::Vector<FrameInfo>* Info,
+ int offset, int range, bool signalEOS = true) {
+ typedef std::unique_lock<std::mutex> ULock;
+ int frameID = offset;
+ int maxRetry = 0;
+ while (1) {
+ if (frameID == (int)Info->size() || frameID == (offset + range)) break;
+ uint32_t flags = 0;
+ std::unique_ptr<C2Work> work;
+ // Prepare C2Work
+ while (!work && (maxRetry < MAX_RETRY)) {
+ ULock l(queueLock);
+ if (!workQueue.empty()) {
+ work.swap(workQueue.front());
+ workQueue.pop_front();
+ } else {
+ queueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+ if (!work && (maxRetry >= MAX_RETRY)) {
+ ASSERT_TRUE(false) << "Wait for generating C2Work exceeded timeout";
+ }
+ int64_t timestamp = (*Info)[frameID].timestamp;
+ if ((*Info)[frameID].flags) flags = (1 << ((*Info)[frameID].flags - 1));
+ if (signalEOS && ((frameID == (int)Info->size() - 1) ||
+ (frameID == (offset + range - 1))))
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+
+ work->input.flags = (C2FrameData::flags_t)flags;
+ work->input.ordinal.timestamp = timestamp;
+ work->input.ordinal.frameIndex = frameID;
+ {
+ ULock l(queueLock);
+ flushedIndices.emplace_back(frameID);
+ }
+
+ int size = (*Info)[frameID].bytesCount;
+ char* data = (char*)malloc(size);
+
+ eleStream.read(data, size);
+ ASSERT_EQ(eleStream.gcount(), size);
+
+ std::shared_ptr<C2LinearBlock> block;
+ ASSERT_EQ(C2_OK,
+ linearPool->fetchLinearBlock(
+ size, {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE},
+ &block));
+ ASSERT_TRUE(block);
+
+ // Write View
+ C2WriteView view = block->map().get();
+ if (view.error() != C2_OK) {
+ fprintf(stderr, "C2LinearBlock::map() failed : %d", view.error());
+ break;
+ }
+ ASSERT_EQ((size_t)size, view.capacity());
+ ASSERT_EQ(0u, view.offset());
+ ASSERT_EQ((size_t)size, view.size());
+
+ memcpy(view.base(), data, size);
+
+ work->input.buffers.clear();
+ work->input.buffers.emplace_back(new LinearBuffer(block));
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+ free(data);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+
+ // DO THE DECODING
+ ASSERT_EQ(component->queue(&items), C2_OK);
+ ALOGV("Frame #%d size = %d queued", frameID, size);
+ frameID++;
+ maxRetry = 0;
+ }
+}
+
+void waitOnInputConsumption(std::mutex& queueLock,
+ std::condition_variable& queueCondition,
+ std::list<std::unique_ptr<C2Work>>& workQueue,
+ size_t bufferCount = MAX_INPUT_BUFFERS) {
+ typedef std::unique_lock<std::mutex> ULock;
+ uint32_t queueSize;
+ uint32_t maxRetry = 0;
+ {
+ ULock l(queueLock);
+ queueSize = workQueue.size();
+ }
+ while ((maxRetry < MAX_RETRY) && (queueSize < bufferCount)) {
+ ULock l(queueLock);
+ if (queueSize != workQueue.size()) {
+ queueSize = workQueue.size();
+ maxRetry = 0;
+ } else {
+ queueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+}
+
+TEST_F(Codec2VideoDecHidlTest, validateCompName) {
+ if (mDisableTest) return;
+ ALOGV("Checks if the given component is a valid video component");
+ validateComponent(mComponent, mCompName, mDisableTest);
+ ASSERT_EQ(mDisableTest, false);
+}
+
+// Bitstream Test
+TEST_F(Codec2VideoDecHidlTest, DecodeTest) {
+ description("Decodes input file");
+ if (mDisableTest) return;
+
+ char mURL[512], info[512];
+ std::ifstream eleStream, eleInfo;
+
+ strcpy(mURL, gEnv->getRes().c_str());
+ strcpy(info, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL, info);
+
+ eleInfo.open(info);
+ ASSERT_EQ(eleInfo.is_open(), true) << mURL << " - file not found";
+ android::Vector<FrameInfo> Info;
+ int bytesCount = 0;
+ uint32_t flags = 0;
+ uint32_t timestamp = 0;
+ while (1) {
+ if (!(eleInfo >> bytesCount)) break;
+ eleInfo >> flags;
+ eleInfo >> timestamp;
+ bool codecConfig = flags ?
+ ((1 << (flags - 1)) & C2FrameData::FLAG_CODEC_CONFIG) != 0 : 0;
+ if (mTimestampDevTest && !codecConfig)
+ mTimestampUslist.push_back(timestamp);
+ Info.push_back({bytesCount, flags, timestamp});
+ }
+ eleInfo.close();
+
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ ALOGV("mURL : %s", mURL);
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ ASSERT_NO_FATAL_FAILURE(decodeNFrames(
+ mComponent, mQueueLock, mQueueCondition, mWorkQueue, mFlushedIndices,
+ mLinearPool, eleStream, &Info, 0, (int)Info.size()));
+
+ // blocking call to ensures application to Wait till all the inputs are
+ // consumed
+ if (!mEos) {
+ ALOGV("Waiting for input consumption");
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+ }
+
+ eleStream.close();
+ if (mFramesReceived != Info.size()) {
+ ALOGE("Input buffer count and Output buffer count mismatch");
+ ALOGV("framesReceived : %d inputFrames : %zu", mFramesReceived,
+ Info.size());
+ ASSERT_TRUE(false);
+ }
+
+ if (mTimestampDevTest) EXPECT_EQ(mTimestampUslist.empty(), true);
+}
+
+
+// Adaptive Test
+TEST_F(Codec2VideoDecHidlTest, AdaptiveDecodeTest) {
+ description("Adaptive Decode Test");
+ if (mDisableTest) return;
+ if (!(mCompName == avc || mCompName == hevc || mCompName == vp8 ||
+ mCompName == vp9 || mCompName == mpeg2))
+ return;
+
+ typedef std::unique_lock<std::mutex> ULock;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ mTimestampDevTest = true;
+ uint32_t timestampOffset = 0;
+ uint32_t offset = 0;
+ android::Vector<FrameInfo> Info;
+ for (uint32_t i = 0; i < STREAM_COUNT * 2; i++) {
+ char mURL[512], info[512];
+ std::ifstream eleStream, eleInfo;
+
+ strcpy(mURL, gEnv->getRes().c_str());
+ strcpy(info, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL, info, i % STREAM_COUNT);
+
+ eleInfo.open(info);
+ ASSERT_EQ(eleInfo.is_open(), true) << mURL << " - file not found";
+ int bytesCount = 0;
+ uint32_t flags = 0;
+ uint32_t timestamp = 0;
+ uint32_t timestampMax = 0;
+ while (1) {
+ if (!(eleInfo >> bytesCount)) break;
+ eleInfo >> flags;
+ eleInfo >> timestamp;
+ timestamp += timestampOffset;
+ Info.push_back({bytesCount, flags, timestamp});
+ bool codecConfig = flags ?
+ ((1 << (flags - 1)) & C2FrameData::FLAG_CODEC_CONFIG) != 0 : 0;
+
+ {
+ ULock l(mQueueLock);
+ if (mTimestampDevTest && !codecConfig)
+ mTimestampUslist.push_back(timestamp);
+ }
+ if (timestampMax < timestamp) timestampMax = timestamp;
+ }
+ timestampOffset = timestampMax;
+ eleInfo.close();
+
+ // Reset Total frames before second decode loop
+ // mFramesReceived = 0;
+ ALOGV("mURL : %s", mURL);
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ ASSERT_NO_FATAL_FAILURE(
+ decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mLinearPool, eleStream, &Info,
+ offset, (int)(Info.size() - offset), false));
+
+ eleStream.close();
+ offset = (int)Info.size();
+ }
+
+ // Send EOS
+ // TODO Add function to send EOS work item
+ int maxRetry = 0;
+ std::unique_ptr<C2Work> work;
+ while (!work && (maxRetry < MAX_RETRY)) {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+ ASSERT_NE(work, nullptr);
+ work->input.flags = (C2FrameData::flags_t)C2FrameData::FLAG_END_OF_STREAM;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+
+ // blocking call to ensures application to Wait till all the inputs are
+ // consumed
+ ALOGV("Waiting for input consumption");
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+
+ if (mFramesReceived != ((Info.size()) + 1)) {
+ ALOGE("Input buffer count and Output buffer count mismatch");
+ ALOGV("framesReceived : %d inputFrames : %zu", mFramesReceived,
+ Info.size() + 1);
+ ASSERT_TRUE(false);
+ }
+
+ if (mTimestampDevTest) EXPECT_EQ(mTimestampUslist.empty(), true);
+}
+
+// thumbnail test
+TEST_F(Codec2VideoDecHidlTest, ThumbnailTest) {
+ description("Test Request for thumbnail");
+ if (mDisableTest) return;
+
+ char mURL[512], info[512];
+ std::ifstream eleStream, eleInfo;
+
+ strcpy(mURL, gEnv->getRes().c_str());
+ strcpy(info, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL, info);
+
+ eleInfo.open(info);
+ ASSERT_EQ(eleInfo.is_open(), true);
+ android::Vector<FrameInfo> Info;
+ int bytesCount = 0;
+ uint32_t flags = 0;
+ uint32_t timestamp = 0;
+ while (1) {
+ if (!(eleInfo >> bytesCount)) break;
+ eleInfo >> flags;
+ eleInfo >> timestamp;
+ Info.push_back({bytesCount, flags, timestamp});
+ }
+ eleInfo.close();
+
+ for (size_t i = 0; i < MAX_ITERATIONS; i++) {
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ // request EOS for thumbnail
+ // signal EOS flag with last frame
+ size_t j = -1;
+ do {
+ j++;
+ flags = 0;
+ if (Info[j].flags) flags = 1u << (Info[j].flags - 1);
+
+ } while (!(flags & SYNC_FRAME));
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ ASSERT_NO_FATAL_FAILURE(decodeNFrames(
+ mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mLinearPool, eleStream, &Info, 0, j + 1));
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+ eleStream.close();
+ EXPECT_GE(mFramesReceived, 1U);
+ ASSERT_EQ(mEos, true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+ ASSERT_EQ(mComponent->release(), C2_OK);
+ }
+}
+
+TEST_F(Codec2VideoDecHidlTest, EOSTest) {
+ description("Test empty input buffer with EOS flag");
+ if (mDisableTest) return;
+ typedef std::unique_lock<std::mutex> ULock;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ std::unique_ptr<C2Work> work;
+ // Prepare C2Work
+ {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ ASSERT_TRUE(false) << "mWorkQueue Empty at the start of test";
+ }
+ }
+ ASSERT_NE(work, nullptr);
+
+ work->input.flags = (C2FrameData::flags_t)C2FrameData::FLAG_END_OF_STREAM;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+
+ {
+ typedef std::unique_lock<std::mutex> ULock;
+ ULock l(mQueueLock);
+ if (mWorkQueue.size() != MAX_INPUT_BUFFERS) {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ }
+ }
+ ASSERT_EQ(mEos, true);
+ ASSERT_EQ(mWorkQueue.size(), (size_t)MAX_INPUT_BUFFERS);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2VideoDecHidlTest, EmptyBufferTest) {
+ description("Tests empty input buffer");
+ if (mDisableTest) return;
+ typedef std::unique_lock<std::mutex> ULock;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ std::unique_ptr<C2Work> work;
+ // Prepare C2Work
+ {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ ASSERT_TRUE(false) << "mWorkQueue Empty at the start of test";
+ }
+ }
+ ASSERT_NE(work, nullptr);
+
+ work->input.flags = (C2FrameData::flags_t)0;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+
+ {
+ typedef std::unique_lock<std::mutex> ULock;
+ ULock l(mQueueLock);
+ if (mWorkQueue.size() != MAX_INPUT_BUFFERS) {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ }
+ }
+ ASSERT_EQ(mWorkQueue.size(), (size_t)MAX_INPUT_BUFFERS);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2VideoDecHidlTest, FlushTest) {
+ description("Tests Flush calls");
+ if (mDisableTest) return;
+ typedef std::unique_lock<std::mutex> ULock;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ char mURL[512], info[512];
+ std::ifstream eleStream, eleInfo;
+
+ strcpy(mURL, gEnv->getRes().c_str());
+ strcpy(info, gEnv->getRes().c_str());
+ GetURLForComponent(mCompName, mURL, info);
+
+ eleInfo.open(info);
+ ASSERT_EQ(eleInfo.is_open(), true);
+ android::Vector<FrameInfo> Info;
+ int bytesCount = 0;
+ uint32_t flags = 0;
+ uint32_t timestamp = 0;
+ mFlushedIndices.clear();
+ while (1) {
+ if (!(eleInfo >> bytesCount)) break;
+ eleInfo >> flags;
+ eleInfo >> timestamp;
+ Info.push_back({bytesCount, flags, timestamp});
+ }
+ eleInfo.close();
+
+ ALOGV("mURL : %s", mURL);
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ // Decode 128 frames and flush. here 128 is chosen to ensure there is a key
+ // frame after this so that the below section can be covered for all
+ // components
+ uint32_t numFramesFlushed = 128;
+ ASSERT_NO_FATAL_FAILURE(decodeNFrames(
+ mComponent, mQueueLock, mQueueCondition, mWorkQueue, mFlushedIndices,
+ mLinearPool, eleStream, &Info, 0, numFramesFlushed, false));
+ // flush
+ std::list<std::unique_ptr<C2Work>> flushedWork;
+ c2_status_t err =
+ mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
+ (size_t)MAX_INPUT_BUFFERS - flushedWork.size()));
+
+ {
+ // Update mFlushedIndices based on the index received from flush()
+ ULock l(mQueueLock);
+ for (std::unique_ptr<C2Work>& work : flushedWork) {
+ ASSERT_NE(work, nullptr);
+ auto frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ work->input.ordinal.frameIndex.peeku());
+ if (!mFlushedIndices.empty() &&
+ (frameIndexIt != mFlushedIndices.end())) {
+ mFlushedIndices.erase(frameIndexIt);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ mWorkQueue.push_back(std::move(work));
+ }
+ }
+ }
+ // Seek to next key frame and start decoding till the end
+ mFlushedIndices.clear();
+ int index = numFramesFlushed;
+ bool keyFrame = false;
+ flags = 0;
+ while (index < (int)Info.size()) {
+ if (Info[index].flags) flags = 1u << (Info[index].flags - 1);
+ if ((flags & SYNC_FRAME) == SYNC_FRAME) {
+ keyFrame = true;
+ break;
+ }
+ flags = 0;
+ eleStream.ignore(Info[index].bytesCount);
+ index++;
+ }
+ if (keyFrame) {
+ ASSERT_NO_FATAL_FAILURE(
+ decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mLinearPool, eleStream, &Info, index,
+ (int)Info.size() - index));
+ }
+ eleStream.close();
+ err = mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
+ (size_t)MAX_INPUT_BUFFERS - flushedWork.size()));
+ {
+ // Update mFlushedIndices based on the index received from flush()
+ ULock l(mQueueLock);
+ for (std::unique_ptr<C2Work>& work : flushedWork) {
+ ASSERT_NE(work, nullptr);
+ uint64_t frameIndex = work->input.ordinal.frameIndex.peeku();
+ std::list<uint64_t>::iterator frameIndexIt = std::find(
+ mFlushedIndices.begin(), mFlushedIndices.end(), frameIndex);
+ if (!mFlushedIndices.empty() &&
+ (frameIndexIt != mFlushedIndices.end())) {
+ mFlushedIndices.erase(frameIndexIt);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ mWorkQueue.push_back(std::move(work));
+ }
+ }
+ }
+ ASSERT_EQ(mFlushedIndices.empty(), true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+} // anonymous namespace
+
+// TODO : Video specific configuration Test
+int main(int argc, char** argv) {
+ gEnv = new ComponentTestEnvironment();
+ ::testing::AddGlobalTestEnvironment(gEnv);
+ ::testing::InitGoogleTest(&argc, argv);
+ gEnv->init(&argc, argv);
+ int status = gEnv->initFromOptions(argc, argv);
+ if (status == 0) {
+ int status = RUN_ALL_TESTS();
+ LOG(INFO) << "C2 Test result = " << status;
+ }
+ return status;
+}
diff --git a/media/codec2/hidl/1.0/vts/video/VtsHidlC2V1_0TargetVideoEncTest.cpp b/media/codec2/hidl/1.0/vts/video/VtsHidlC2V1_0TargetVideoEncTest.cpp
new file mode 100644
index 0000000..87b7902
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/video/VtsHidlC2V1_0TargetVideoEncTest.cpp
@@ -0,0 +1,712 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "codec2_hidl_hal_video_enc_test"
+
+#include <android-base/logging.h>
+#include <gtest/gtest.h>
+#include <stdio.h>
+#include <fstream>
+
+#include <codec2/hidl/client.h>
+#include <C2AllocatorIon.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2Buffer.h>
+#include <C2BufferPriv.h>
+
+using android::C2AllocatorIon;
+
+#include <VtsHalHidlTargetTestBase.h>
+#include "media_c2_video_hidl_test_common.h"
+#include "media_c2_hidl_test_common.h"
+
+class GraphicBuffer : public C2Buffer {
+public:
+ explicit GraphicBuffer(const std::shared_ptr<C2GraphicBlock> &block)
+ : C2Buffer({block->share(C2Rect(block->width(), block->height()),
+ ::C2Fence())}) {}
+};
+
+static ComponentTestEnvironment* gEnv = nullptr;
+
+namespace {
+
+class Codec2VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
+ private:
+ typedef ::testing::VtsHalHidlTargetTestBase Super;
+
+ public:
+ ::std::string getTestCaseInfo() const override {
+ return ::std::string() +
+ "Component: " + gEnv->getComponent().c_str() + " | " +
+ "Instance: " + gEnv->getInstance().c_str() + " | " +
+ "Res: " + gEnv->getRes().c_str();
+ }
+
+ // google.codec2 Video test setup
+ virtual void SetUp() override {
+ Super::SetUp();
+ mDisableTest = false;
+ ALOGV("Codec2VideoEncHidlTest SetUp");
+ mClient = android::Codec2Client::CreateFromService(
+ gEnv->getInstance().c_str());
+ ASSERT_NE(mClient, nullptr);
+ mListener.reset(new CodecListener(
+ [this](std::list<std::unique_ptr<C2Work>>& workItems) {
+ handleWorkDone(workItems);
+ }));
+ ASSERT_NE(mListener, nullptr);
+ for (int i = 0; i < MAX_INPUT_BUFFERS; ++i) {
+ mWorkQueue.emplace_back(new C2Work);
+ }
+ mClient->createComponent(gEnv->getComponent().c_str(), mListener,
+ &mComponent);
+ ASSERT_NE(mComponent, nullptr);
+
+ std::shared_ptr<C2AllocatorStore> store =
+ android::GetCodec2PlatformAllocatorStore();
+ CHECK_EQ(store->fetchAllocator(C2AllocatorStore::DEFAULT_GRAPHIC,
+ &mGraphicAllocator),
+ C2_OK);
+ mGraphicPool = std::make_shared<C2PooledBlockPool>(mGraphicAllocator,
+ mBlockPoolId++);
+ ASSERT_NE(mGraphicPool, nullptr);
+
+ mCompName = unknown_comp;
+ struct StringToName {
+ const char* Name;
+ standardComp CompName;
+ };
+
+ const StringToName kStringToName[] = {
+ {"h263", h263}, {"avc", avc}, {"mpeg4", mpeg4},
+ {"hevc", hevc}, {"vp8", vp8}, {"vp9", vp9},
+ };
+
+ const size_t kNumStringToName =
+ sizeof(kStringToName) / sizeof(kStringToName[0]);
+
+ std::string substring;
+ std::string comp;
+ substring = std::string(gEnv->getComponent());
+ /* TODO: better approach to find the component */
+ /* "c2.android." => 11th position */
+ size_t pos = 11;
+ size_t len = substring.find(".encoder", pos);
+ comp = substring.substr(pos, len - pos);
+
+ for (size_t i = 0; i < kNumStringToName; ++i) {
+ if (!strcasecmp(comp.c_str(), kStringToName[i].Name)) {
+ mCompName = kStringToName[i].CompName;
+ break;
+ }
+ }
+ mEos = false;
+ mCsd = false;
+ mConfig = false;
+ mFramesReceived = 0;
+ mFailedWorkReceived = 0;
+ if (mCompName == unknown_comp) mDisableTest = true;
+ if (mDisableTest) std::cout << "[ WARN ] Test Disabled \n";
+ }
+
+ virtual void TearDown() override {
+ if (mComponent != nullptr) {
+ if (::testing::Test::HasFatalFailure()) return;
+ mComponent->release();
+ mComponent = nullptr;
+ }
+ Super::TearDown();
+ }
+
+ void setupConfigParam(int32_t nWidth, int32_t nHeight);
+
+ // callback function to process onWorkDone received by Listener
+ void handleWorkDone(std::list<std::unique_ptr<C2Work>>& workItems) {
+ for (std::unique_ptr<C2Work>& work : workItems) {
+ // handle configuration changes in work done
+ if (!work->worklets.empty() &&
+ (work->worklets.front()->output.configUpdate.size() != 0)) {
+ ALOGV("Config Update");
+ std::vector<std::unique_ptr<C2Param>> updates =
+ std::move(work->worklets.front()->output.configUpdate);
+ std::vector<C2Param*> configParam;
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ for (size_t i = 0; i < updates.size(); ++i) {
+ C2Param* param = updates[i].get();
+ if (param->index() == C2StreamCsdInfo::output::PARAM_TYPE) {
+ mCsd = true;
+ }
+ }
+ }
+ mFramesReceived++;
+ if (work->result != C2_OK) mFailedWorkReceived++;
+ mEos = (work->worklets.front()->output.flags &
+ C2FrameData::FLAG_END_OF_STREAM) != 0;
+ auto frameIndexIt =
+ std::find(mFlushedIndices.begin(), mFlushedIndices.end(),
+ work->input.ordinal.frameIndex.peeku());
+ ALOGV("WorkDone: frameID received %d",
+ (int)work->worklets.front()->output.ordinal.frameIndex.peeku());
+ work->input.buffers.clear();
+ work->worklets.clear();
+ {
+ typedef std::unique_lock<std::mutex> ULock;
+ ULock l(mQueueLock);
+ mWorkQueue.push_back(std::move(work));
+ if (!mFlushedIndices.empty()) {
+ mFlushedIndices.erase(frameIndexIt);
+ }
+ mQueueCondition.notify_all();
+ }
+ }
+ }
+
+ enum standardComp {
+ h263,
+ avc,
+ mpeg4,
+ hevc,
+ vp8,
+ vp9,
+ unknown_comp,
+ };
+
+ bool mEos;
+ bool mCsd;
+ bool mDisableTest;
+ bool mConfig;
+ standardComp mCompName;
+ uint32_t mFramesReceived;
+ uint32_t mFailedWorkReceived;
+
+ std::list<uint64_t> mFlushedIndices;
+
+ C2BlockPool::local_id_t mBlockPoolId;
+ std::shared_ptr<C2BlockPool> mGraphicPool;
+ std::shared_ptr<C2Allocator> mGraphicAllocator;
+
+ std::mutex mQueueLock;
+ std::condition_variable mQueueCondition;
+ std::list<std::unique_ptr<C2Work>> mWorkQueue;
+
+ std::shared_ptr<android::Codec2Client> mClient;
+ std::shared_ptr<android::Codec2Client::Listener> mListener;
+ std::shared_ptr<android::Codec2Client::Component> mComponent;
+
+ protected:
+ static void description(const std::string& description) {
+ RecordProperty("description", description);
+ }
+};
+
+void validateComponent(
+ const std::shared_ptr<android::Codec2Client::Component>& component,
+ Codec2VideoEncHidlTest::standardComp compName, bool& disableTest) {
+ // Validate its a C2 Component
+ if (component->getName().find("c2") == std::string::npos) {
+ ALOGE("Not a c2 component");
+ disableTest = true;
+ return;
+ }
+
+ // Validate its not an encoder and the component to be tested is video
+ if (component->getName().find("decoder") != std::string::npos) {
+ ALOGE("Expected Encoder, given Decoder");
+ disableTest = true;
+ return;
+ }
+ std::vector<std::unique_ptr<C2Param>> queried;
+ c2_status_t c2err =
+ component->query({}, {C2PortMediaTypeSetting::input::PARAM_TYPE},
+ C2_DONT_BLOCK, &queried);
+ if (c2err != C2_OK && queried.size() == 0) {
+ ALOGE("Query media type failed => %d", c2err);
+ } else {
+ std::string inputDomain =
+ ((C2StreamMediaTypeSetting::input*)queried[0].get())->m.value;
+ if (inputDomain.find("video/") == std::string::npos) {
+ ALOGE("Expected Video Component");
+ disableTest = true;
+ return;
+ }
+ }
+
+ // Validates component name
+ if (compName == Codec2VideoEncHidlTest::unknown_comp) {
+ ALOGE("Component InValid");
+ disableTest = true;
+ return;
+ }
+ ALOGV("Component Valid");
+}
+
+// Set Default config param.
+void Codec2VideoEncHidlTest::setupConfigParam(int32_t nWidth, int32_t nHeight) {
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ C2VideoSizeStreamTuning::input inputSize(0u, nWidth, nHeight);
+ std::vector<C2Param*> configParam{&inputSize};
+ c2_status_t status =
+ mComponent->config(configParam, C2_DONT_BLOCK, &failures);
+ if (failures.size() == 0u ) mConfig = true;
+ ASSERT_EQ(status, C2_OK);
+}
+
+// LookUpTable of clips for component testing
+void GetURLForComponent(char* URL) {
+ strcat(URL, "bbb_352x288_420p_30fps_32frames.yuv");
+}
+
+void encodeNFrames(const std::shared_ptr<android::Codec2Client::Component> &component,
+ std::mutex &queueLock, std::condition_variable &queueCondition,
+ std::list<std::unique_ptr<C2Work>> &workQueue,
+ std::list<uint64_t> &flushedIndices,
+ std::shared_ptr<C2BlockPool> &graphicPool,
+ std::ifstream& eleStream, uint32_t frameID,
+ uint32_t nFrames, uint32_t nWidth, int32_t nHeight,
+ bool flushed = false,bool signalEOS = true) {
+ typedef std::unique_lock<std::mutex> ULock;
+
+ uint32_t maxRetry = 0;
+ int bytesCount = nWidth * nHeight * 3 >> 1;
+ int32_t timestampIncr = ENCODER_TIMESTAMP_INCREMENT;
+ uint64_t timestamp = 0;
+ while (1) {
+ if (nFrames == 0) break;
+ uint32_t flags = 0;
+ std::unique_ptr<C2Work> work;
+ // Prepare C2Work
+ while (!work && (maxRetry < MAX_RETRY)) {
+ ULock l(queueLock);
+ if (!workQueue.empty()) {
+ work.swap(workQueue.front());
+ workQueue.pop_front();
+ } else {
+ queueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+ if (!work && (maxRetry >= MAX_RETRY)) {
+ ASSERT_TRUE(false) << "Wait for generating C2Work exceeded timeout";
+ }
+ if (signalEOS && (nFrames == 1))
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ if (flushed) {
+ flags |= SYNC_FRAME;
+ flushed = false;
+ }
+
+ work->input.flags = (C2FrameData::flags_t)flags;
+ work->input.ordinal.timestamp = timestamp;
+ work->input.ordinal.frameIndex = frameID;
+ {
+ ULock l(queueLock);
+ flushedIndices.emplace_back(frameID);
+ }
+ char* data = (char*)malloc(bytesCount);
+ memset(data, 0, bytesCount);
+ if (eleStream.is_open()) {
+ eleStream.read(data, bytesCount);
+ ASSERT_EQ(eleStream.gcount(), bytesCount);
+ }
+ std::shared_ptr<C2GraphicBlock> block;
+ ASSERT_EQ(
+ C2_OK,
+ graphicPool->fetchGraphicBlock(
+ nWidth, nHeight, HAL_PIXEL_FORMAT_YV12,
+ {C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}, &block));
+ ASSERT_TRUE(block);
+ // Graphic View
+ C2GraphicView view = block->map().get();
+ if (view.error() != C2_OK) {
+ fprintf(stderr, "C2GraphicBlock::map() failed : %d", view.error());
+ break;
+ }
+
+ uint8_t* pY = view.data()[C2PlanarLayout::PLANE_Y];
+ uint8_t* pU = view.data()[C2PlanarLayout::PLANE_U];
+ uint8_t* pV = view.data()[C2PlanarLayout::PLANE_V];
+
+ memcpy(pY, data, nWidth * nHeight);
+ memcpy(pU, data + nWidth * nHeight, (nWidth * nHeight >> 2));
+ memcpy(pV, data + (nWidth * nHeight * 5 >> 2), nWidth * nHeight >> 2);
+
+ work->input.buffers.clear();
+ work->input.buffers.emplace_back(new GraphicBuffer(block));
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+ free(data);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+
+ // DO THE ENCODING
+ ASSERT_EQ(component->queue(&items), C2_OK);
+ ALOGV("Frame #%d size = %d queued", frameID, bytesCount);
+ nFrames--;
+ timestamp += timestampIncr;
+ frameID++;
+ maxRetry = 0;
+ }
+}
+
+void waitOnInputConsumption(std::mutex &queueLock,
+ std::condition_variable &queueCondition,
+ std::list<std::unique_ptr<C2Work>> &workQueue,
+ size_t bufferCount = MAX_INPUT_BUFFERS) {
+ typedef std::unique_lock<std::mutex> ULock;
+ uint32_t queueSize;
+ int maxRetry = 0;
+ {
+ ULock l(queueLock);
+ queueSize = workQueue.size();
+ }
+ while ((maxRetry < MAX_RETRY) && (queueSize < bufferCount)) {
+ ULock l(queueLock);
+ if (queueSize != workQueue.size()) {
+ queueSize = workQueue.size();
+ maxRetry = 0;
+ } else {
+ queueCondition.wait_for(l, TIME_OUT);
+ maxRetry++;
+ }
+ }
+}
+
+
+TEST_F(Codec2VideoEncHidlTest, validateCompName) {
+ if (mDisableTest) return;
+ ALOGV("Checks if the given component is a valid video component");
+ validateComponent(mComponent, mCompName, mDisableTest);
+ ASSERT_EQ(mDisableTest, false);
+}
+
+TEST_F(Codec2VideoEncHidlTest, EncodeTest) {
+ description("Encodes input file");
+ if (mDisableTest) return;
+
+ char mURL[512];
+ int32_t nWidth = ENC_DEFAULT_FRAME_WIDTH;
+ int32_t nHeight = ENC_DEFAULT_FRAME_HEIGHT;
+
+ strcpy(mURL, gEnv->getRes().c_str());
+ GetURLForComponent(mURL);
+
+ std::ifstream eleStream;
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true) << mURL << " file not found";
+ ALOGV("mURL : %s", mURL);
+
+ setupConfigParam(nWidth, nHeight);
+ if (!mConfig) {
+ std::cout << "[ WARN ] Test Skipped \n";
+ return;
+ }
+ ASSERT_EQ(mComponent->start(), C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mGraphicPool, eleStream,
+ 0, ENC_NUM_FRAMES, nWidth, nHeight));
+
+ // blocking call to ensures application to Wait till all the inputs are
+ // consumed
+ ALOGD("Waiting for input consumption");
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+
+ eleStream.close();
+ if (mFramesReceived != ENC_NUM_FRAMES) {
+ ALOGE("Input buffer count and Output buffer count mismatch");
+ ALOGE("framesReceived : %d inputFrames : %d", mFramesReceived,
+ ENC_NUM_FRAMES);
+ ASSERT_TRUE(false);
+ }
+
+ if (!mCsd && (mCompName != vp8 && mCompName != vp9)) {
+ ASSERT_TRUE(false) << "CSD Buffer not received";
+ }
+
+ if (mCsd && (mCompName == vp8 || mCompName == vp9)) {
+ ASSERT_TRUE(false) << "CSD Buffer not expected";
+ }
+
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2VideoEncHidlTest, EOSTest) {
+ description("Test empty input buffer with EOS flag");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ typedef std::unique_lock<std::mutex> ULock;
+ std::unique_ptr<C2Work> work;
+ {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ ALOGE("mWorkQueue Empty is not expected at the start of the test");
+ ASSERT_TRUE(false);
+ }
+ }
+ ASSERT_NE(work, nullptr);
+ work->input.flags = (C2FrameData::flags_t)C2FrameData::FLAG_END_OF_STREAM;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+ uint32_t queueSize;
+ {
+ ULock l(mQueueLock);
+ queueSize = mWorkQueue.size();
+ if (queueSize < MAX_INPUT_BUFFERS) {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ }
+ }
+ ASSERT_EQ(mEos, true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2VideoEncHidlTest, EmptyBufferTest) {
+ description("Tests empty input buffer");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ typedef std::unique_lock<std::mutex> ULock;
+ std::unique_ptr<C2Work> work;
+ {
+ ULock l(mQueueLock);
+ if (!mWorkQueue.empty()) {
+ work.swap(mWorkQueue.front());
+ mWorkQueue.pop_front();
+ } else {
+ ALOGE("mWorkQueue Empty is not expected at the start of the test");
+ ASSERT_TRUE(false);
+ }
+ }
+ ASSERT_NE(work, nullptr);
+ work->input.flags = (C2FrameData::flags_t)0;
+ work->input.ordinal.timestamp = 0;
+ work->input.ordinal.frameIndex = 0;
+ work->input.buffers.clear();
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ ASSERT_EQ(mComponent->queue(&items), C2_OK);
+ uint32_t queueSize;
+ {
+ ULock l(mQueueLock);
+ queueSize = mWorkQueue.size();
+ if (queueSize < MAX_INPUT_BUFFERS) {
+ mQueueCondition.wait_for(l, TIME_OUT);
+ }
+ }
+ ASSERT_EQ(mWorkQueue.size(), (uint32_t)MAX_INPUT_BUFFERS);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2VideoEncHidlTest, FlushTest) {
+ description("Test Request for flush");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ typedef std::unique_lock<std::mutex> ULock;
+ char mURL[512];
+ int32_t nWidth = ENC_DEFAULT_FRAME_WIDTH;
+ int32_t nHeight = ENC_DEFAULT_FRAME_HEIGHT;
+ strcpy(mURL, gEnv->getRes().c_str());
+ GetURLForComponent(mURL);
+ setupConfigParam(nWidth, nHeight);
+
+ // Setting default configuration
+ mFlushedIndices.clear();
+ std::ifstream eleStream;
+ uint32_t numFramesFlushed = 10;
+ uint32_t numFrames = ENC_NUM_FRAMES;
+ eleStream.open(mURL, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true);
+ ALOGV("mURL : %s", mURL);
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mGraphicPool, eleStream,
+ 0, numFramesFlushed, nWidth, nHeight));
+ std::list<std::unique_ptr<C2Work>> flushedWork;
+ c2_status_t err =
+ mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
+ (size_t)MAX_INPUT_BUFFERS - flushedWork.size()));
+ uint64_t frameIndex;
+ {
+ //Update mFlushedIndices based on the index received from flush()
+ ULock l(mQueueLock);
+ for (std::unique_ptr<C2Work>& work : flushedWork) {
+ ASSERT_NE(work, nullptr);
+ frameIndex = work->input.ordinal.frameIndex.peeku();
+ std::list<uint64_t>::iterator frameIndexIt = std::find(
+ mFlushedIndices.begin(), mFlushedIndices.end(), frameIndex);
+ if (!mFlushedIndices.empty() &&
+ (frameIndexIt != mFlushedIndices.end())) {
+ mFlushedIndices.erase(frameIndexIt);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ mWorkQueue.push_back(std::move(work));
+ }
+ }
+ }
+ mFlushedIndices.clear();
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mGraphicPool, eleStream,
+ numFramesFlushed, numFrames - numFramesFlushed,
+ nWidth, nHeight, true));
+ eleStream.close();
+ err = mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ ASSERT_EQ(err, C2_OK);
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
+ (size_t)MAX_INPUT_BUFFERS - flushedWork.size()));
+ {
+ //Update mFlushedIndices based on the index received from flush()
+ ULock l(mQueueLock);
+ for (std::unique_ptr<C2Work>& work : flushedWork) {
+ ASSERT_NE(work, nullptr);
+ frameIndex = work->input.ordinal.frameIndex.peeku();
+ std::list<uint64_t>::iterator frameIndexIt = std::find(
+ mFlushedIndices.begin(), mFlushedIndices.end(), frameIndex);
+ if (!mFlushedIndices.empty() &&
+ (frameIndexIt != mFlushedIndices.end())) {
+ mFlushedIndices.erase(frameIndexIt);
+ work->input.buffers.clear();
+ work->worklets.clear();
+ mWorkQueue.push_back(std::move(work));
+ }
+ }
+ }
+ ASSERT_EQ(mFlushedIndices.empty(), true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+TEST_F(Codec2VideoEncHidlTest, InvalidBufferTest) {
+ description("Tests feeding larger/smaller input buffer");
+ if (mDisableTest) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ std::ifstream eleStream;
+ int32_t nWidth = ENC_DEFAULT_FRAME_WIDTH / 2;
+ int32_t nHeight = ENC_DEFAULT_FRAME_HEIGHT / 2;
+ setupConfigParam(nWidth, nHeight);
+
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mGraphicPool, eleStream,
+ 0, 1, nWidth, nHeight, false, false));
+
+ // Feed larger input buffer.
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mGraphicPool, eleStream,
+ 1, 1, nWidth*2, nHeight*2, false, false));
+
+ // Feed smaller input buffer.
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mGraphicPool, eleStream,
+ 2, 1, nWidth/2, nHeight/2, false, true));
+
+ // blocking call to ensures application to Wait till all the inputs are
+ // consumed
+ ALOGD("Waiting for input consumption");
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+
+ if (mFramesReceived != 3) {
+ ALOGE("Input buffer count and Output buffer count mismatch");
+ ALOGE("framesReceived : %d inputFrames : 3", mFramesReceived);
+ ASSERT_TRUE(false);
+ }
+
+ if (mFailedWorkReceived == 0) {
+ ALOGE("Expected failed frame count mismatch");
+ ALOGE("failedFramesReceived : %d", mFailedWorkReceived);
+ ASSERT_TRUE(false);
+ }
+
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+}
+
+class Codec2VideoEncResolutionTest : public Codec2VideoEncHidlTest,
+ public ::testing::WithParamInterface<std::pair<int32_t, int32_t> > {
+};
+
+TEST_P(Codec2VideoEncResolutionTest, ResolutionTest) {
+ description("Tests encoding at different resolutions");
+ if (mDisableTest) return;
+
+ std::ifstream eleStream;
+ int32_t nWidth = GetParam().first;
+ int32_t nHeight = GetParam().second;
+ ALOGD("Trying encode for width %d height %d", nWidth, nHeight);
+ mConfig = false;
+ mEos = false;
+ setupConfigParam(nWidth, nHeight);
+ if (!mConfig) return;
+ ASSERT_EQ(mComponent->start(), C2_OK);
+
+ ASSERT_NO_FATAL_FAILURE(
+ encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
+ mFlushedIndices, mGraphicPool, eleStream, 0,
+ MAX_INPUT_BUFFERS, nWidth, nHeight));
+
+ ALOGD("Waiting for input consumption");
+ ASSERT_NO_FATAL_FAILURE(
+ waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
+
+ ASSERT_EQ(mEos, true);
+ ASSERT_EQ(mComponent->stop(), C2_OK);
+ ASSERT_EQ(mComponent->reset(), C2_OK);
+}
+INSTANTIATE_TEST_CASE_P(NonStdSizes, Codec2VideoEncResolutionTest, ::testing::Values(
+ std::make_pair(52, 18),
+ std::make_pair(365, 365),
+ std::make_pair(484, 362),
+ std::make_pair(244, 488)));
+
+} // anonymous namespace
+
+int main(int argc, char** argv) {
+ gEnv = new ComponentTestEnvironment();
+ ::testing::AddGlobalTestEnvironment(gEnv);
+ ::testing::InitGoogleTest(&argc, argv);
+ gEnv->init(&argc, argv);
+ int status = gEnv->initFromOptions(argc, argv);
+ if (status == 0) {
+ int status = RUN_ALL_TESTS();
+ LOG(INFO) << "C2 Test result = " << status;
+ }
+ return status;
+}
diff --git a/media/codec2/hidl/1.0/vts/video/media_c2_video_hidl_test_common.h b/media/codec2/hidl/1.0/vts/video/media_c2_video_hidl_test_common.h
new file mode 100644
index 0000000..1215b13
--- /dev/null
+++ b/media/codec2/hidl/1.0/vts/video/media_c2_video_hidl_test_common.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MEDIA_C2_VIDEO_HIDL_TEST_COMMON_H
+#define MEDIA_C2_VIDEO_HIDL_TEST_COMMON_H
+
+#define MAX_RETRY 20
+#define TIME_OUT 400ms
+#define MAX_INPUT_BUFFERS 8
+#define ENCODER_TIMESTAMP_INCREMENT 40000
+#define ENC_NUM_FRAMES 32
+#define ENC_DEFAULT_FRAME_WIDTH 352
+#define ENC_DEFAULT_FRAME_HEIGHT 288
+#define MAX_ITERATIONS 128
+
+/*
+ * Common video utils
+ */
+
+
+#endif // MEDIA_C2_VIDEO_HIDL_TEST_COMMON_H
diff --git a/media/codec2/hidl/client/Android.bp b/media/codec2/hidl/client/Android.bp
new file mode 100644
index 0000000..bdc02d2
--- /dev/null
+++ b/media/codec2/hidl/client/Android.bp
@@ -0,0 +1,38 @@
+cc_library {
+ name: "libcodec2_client",
+
+ srcs: [
+ "client.cpp",
+ ],
+
+ shared_libs: [
+ "android.hardware.graphics.bufferqueue@1.0",
+ "android.hardware.media.bufferpool@1.0",
+ "android.hardware.media.c2@1.0",
+ "libbase",
+ "libbinder",
+ "libcodec2",
+ "libcodec2_hidl@1.0",
+ "libcodec2_vndk",
+ "libcutils",
+ "libgui",
+ "libhidlbase",
+ "libhidltransport",
+ "liblog",
+ "libstagefright_bufferpool@1.0",
+ "libstagefright_bufferqueue_helper",
+ "libui",
+ "libutils",
+ ],
+
+ export_include_dirs: [
+ "include",
+ ],
+
+ export_shared_lib_headers: [
+ "libcodec2_hidl@1.0",
+ "libcodec2",
+ ],
+
+}
+
diff --git a/media/codec2/hidl/client/client.cpp b/media/codec2/hidl/client/client.cpp
new file mode 100644
index 0000000..ddeb4ff
--- /dev/null
+++ b/media/codec2/hidl/client/client.cpp
@@ -0,0 +1,1388 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2Client"
+#include <log/log.h>
+
+#include <codec2/hidl/client.h>
+
+#include <deque>
+#include <limits>
+#include <map>
+#include <type_traits>
+#include <vector>
+
+#include <android-base/properties.h>
+#include <bufferpool/ClientManager.h>
+#include <cutils/native_handle.h>
+#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
+#include <hidl/HidlSupport.h>
+#include <media/stagefright/bqhelper/WGraphicBufferProducer.h>
+#undef LOG
+
+#include <android/hardware/media/bufferpool/1.0/IClientManager.h>
+#include <android/hardware/media/c2/1.0/IComponent.h>
+#include <android/hardware/media/c2/1.0/IComponentInterface.h>
+#include <android/hardware/media/c2/1.0/IComponentListener.h>
+#include <android/hardware/media/c2/1.0/IComponentStore.h>
+#include <android/hardware/media/c2/1.0/IConfigurable.h>
+
+#include <C2Debug.h>
+#include <C2BufferPriv.h>
+#include <C2PlatformSupport.h>
+
+namespace android {
+
+using ::android::hardware::hidl_vec;
+using ::android::hardware::hidl_string;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::TWGraphicBufferProducer;
+
+using namespace ::android::hardware::media::c2::V1_0;
+using namespace ::android::hardware::media::c2::V1_0::utils;
+using namespace ::android::hardware::media::bufferpool::V1_0;
+using namespace ::android::hardware::media::bufferpool::V1_0::implementation;
+
+namespace /* unnamed */ {
+
+// c2_status_t value that corresponds to hwbinder transaction failure.
+constexpr c2_status_t C2_TRANSACTION_FAILED = C2_CORRUPTED;
+
+// List of known IComponentStore services in the decreasing order of preference.
+constexpr const char* kClientNames[] = {
+ "default",
+ "software",
+ };
+
+// Number of known IComponentStore services.
+constexpr size_t kNumClients = std::extent<decltype(kClientNames)>::value;
+
+typedef std::array<std::shared_ptr<Codec2Client>, kNumClients> ClientList;
+
+// Convenience methods to obtain known clients.
+std::shared_ptr<Codec2Client> getClient(size_t index) {
+ return Codec2Client::CreateFromService(kClientNames[index]);
+}
+
+ClientList getClientList() {
+ ClientList list;
+ for (size_t i = 0; i < list.size(); ++i) {
+ list[i] = getClient(i);
+ }
+ return list;
+}
+
+} // unnamed
+
+// Codec2ConfigurableClient
+
+const C2String& Codec2ConfigurableClient::getName() const {
+ return mName;
+}
+
+Codec2ConfigurableClient::Base* Codec2ConfigurableClient::base() const {
+ return static_cast<Base*>(mBase.get());
+}
+
+Codec2ConfigurableClient::Codec2ConfigurableClient(
+ const sp<Codec2ConfigurableClient::Base>& base) : mBase(base) {
+ Return<void> transStatus = base->getName(
+ [this](const hidl_string& name) {
+ mName = name.c_str();
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("Cannot obtain name from IConfigurable.");
+ }
+}
+
+c2_status_t Codec2ConfigurableClient::query(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const {
+ hidl_vec<ParamIndex> indices(
+ stackParams.size() + heapParamIndices.size());
+ size_t numIndices = 0;
+ for (C2Param* const& stackParam : stackParams) {
+ if (!stackParam) {
+ ALOGW("query -- null stack param encountered.");
+ continue;
+ }
+ indices[numIndices++] = static_cast<ParamIndex>(stackParam->index());
+ }
+ size_t numStackIndices = numIndices;
+ for (const C2Param::Index& index : heapParamIndices) {
+ indices[numIndices++] =
+ static_cast<ParamIndex>(static_cast<uint32_t>(index));
+ }
+ indices.resize(numIndices);
+ if (heapParams) {
+ heapParams->reserve(heapParams->size() + numIndices);
+ }
+ c2_status_t status;
+ Return<void> transStatus = base()->query(
+ indices,
+ mayBlock == C2_MAY_BLOCK,
+ [&status, &numStackIndices, &stackParams, heapParams](
+ Status s, const Params& p) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK && status != C2_BAD_INDEX) {
+ ALOGE("query -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ std::vector<C2Param*> paramPointers;
+ c2_status_t parseStatus = parseParamsBlob(¶mPointers, p);
+ if (parseStatus != C2_OK) {
+ ALOGE("query -- error while parsing params. "
+ "Error code = %d", static_cast<int>(status));
+ status = parseStatus;
+ return;
+ }
+ size_t i = 0;
+ for (auto it = paramPointers.begin(); it != paramPointers.end(); ) {
+ C2Param* paramPointer = *it;
+ if (numStackIndices > 0) {
+ --numStackIndices;
+ if (!paramPointer) {
+ ALOGW("query -- null stack param.");
+ ++it;
+ continue;
+ }
+ for (; i < stackParams.size() && !stackParams[i]; ) {
+ ++i;
+ }
+ if (i >= stackParams.size()) {
+ ALOGE("query -- unexpected error.");
+ status = C2_CORRUPTED;
+ return;
+ }
+ if (stackParams[i]->index() != paramPointer->index()) {
+ ALOGW("query -- param skipped. index = %d",
+ static_cast<int>(stackParams[i]->index()));
+ stackParams[i++]->invalidate();
+ continue;
+ }
+ if (!stackParams[i++]->updateFrom(*paramPointer)) {
+ ALOGW("query -- param update failed. index = %d",
+ static_cast<int>(paramPointer->index()));
+ }
+ } else {
+ if (!paramPointer) {
+ ALOGW("query -- null heap param.");
+ ++it;
+ continue;
+ }
+ if (!heapParams) {
+ ALOGW("query -- unexpected extra stack param.");
+ } else {
+ heapParams->emplace_back(C2Param::Copy(*paramPointer));
+ }
+ }
+ ++it;
+ }
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("query -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ return status;
+}
+
+c2_status_t Codec2ConfigurableClient::config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
+ Params hidlParams;
+ Status hidlStatus = createParamsBlob(&hidlParams, params);
+ if (hidlStatus != Status::OK) {
+ ALOGE("config -- bad input.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status;
+ Return<void> transStatus = base()->config(
+ hidlParams,
+ mayBlock == C2_MAY_BLOCK,
+ [&status, ¶ms, failures](
+ Status s,
+ const hidl_vec<SettingResult> f,
+ const Params& o) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK) {
+ ALOGD("config -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ size_t i = failures->size();
+ failures->resize(i + f.size());
+ for (const SettingResult& sf : f) {
+ status = objcpy(&(*failures)[i++], sf);
+ if (status != C2_OK) {
+ ALOGE("config -- invalid returned SettingResult. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ }
+ status = updateParamsFromBlob(params, o);
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("config -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ return status;
+}
+
+c2_status_t Codec2ConfigurableClient::querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params) const {
+ // TODO: Cache and query properly!
+ c2_status_t status;
+ Return<void> transStatus = base()->querySupportedParams(
+ std::numeric_limits<uint32_t>::min(),
+ std::numeric_limits<uint32_t>::max(),
+ [&status, params](
+ Status s,
+ const hidl_vec<ParamDescriptor>& p) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK) {
+ ALOGE("querySupportedParams -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ size_t i = params->size();
+ params->resize(i + p.size());
+ for (const ParamDescriptor& sp : p) {
+ status = objcpy(&(*params)[i++], sp);
+ if (status != C2_OK) {
+ ALOGE("querySupportedParams -- "
+ "invalid returned ParamDescriptor. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ }
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("querySupportedParams -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ return status;
+}
+
+c2_status_t Codec2ConfigurableClient::querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const {
+ hidl_vec<FieldSupportedValuesQuery> inFields(fields.size());
+ for (size_t i = 0; i < fields.size(); ++i) {
+ Status hidlStatus = objcpy(&inFields[i], fields[i]);
+ if (hidlStatus != Status::OK) {
+ ALOGE("querySupportedValues -- bad input");
+ return C2_TRANSACTION_FAILED;
+ }
+ }
+
+ c2_status_t status;
+ Return<void> transStatus = base()->querySupportedValues(
+ inFields,
+ mayBlock == C2_MAY_BLOCK,
+ [&status, &inFields, &fields](
+ Status s,
+ const hidl_vec<FieldSupportedValuesQueryResult>& r) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK) {
+ ALOGE("querySupportedValues -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ if (r.size() != fields.size()) {
+ ALOGE("querySupportedValues -- input and output lists "
+ "have different sizes.");
+ status = C2_CORRUPTED;
+ return;
+ }
+ for (size_t i = 0; i < fields.size(); ++i) {
+ status = objcpy(&fields[i], inFields[i], r[i]);
+ if (status != C2_OK) {
+ ALOGE("querySupportedValues -- invalid returned value. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ }
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("querySupportedValues -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ return status;
+}
+
+// Codec2Client::Component::HidlListener
+struct Codec2Client::Component::HidlListener : public IComponentListener {
+ std::weak_ptr<Component> component;
+ std::weak_ptr<Listener> base;
+
+ virtual Return<void> onWorkDone(const WorkBundle& workBundle) override {
+ std::list<std::unique_ptr<C2Work>> workItems;
+ c2_status_t status = objcpy(&workItems, workBundle);
+ if (status != C2_OK) {
+ ALOGI("onWorkDone -- received corrupted WorkBundle. "
+ "status = %d.", static_cast<int>(status));
+ return Void();
+ }
+ // release input buffers potentially held by the component from queue
+ size_t numDiscardedInputBuffers = 0;
+ std::shared_ptr<Codec2Client::Component> strongComponent = component.lock();
+ if (strongComponent) {
+ numDiscardedInputBuffers = strongComponent->handleOnWorkDone(workItems);
+ }
+ if (std::shared_ptr<Codec2Client::Listener> listener = base.lock()) {
+ listener->onWorkDone(component, workItems, numDiscardedInputBuffers);
+ } else {
+ ALOGD("onWorkDone -- listener died.");
+ }
+ return Void();
+ }
+
+ virtual Return<void> onTripped(
+ const hidl_vec<SettingResult>& settingResults) override {
+ std::vector<std::shared_ptr<C2SettingResult>> c2SettingResults(
+ settingResults.size());
+ c2_status_t status;
+ for (size_t i = 0; i < settingResults.size(); ++i) {
+ std::unique_ptr<C2SettingResult> c2SettingResult;
+ status = objcpy(&c2SettingResult, settingResults[i]);
+ if (status != C2_OK) {
+ ALOGI("onTripped -- received corrupted SettingResult. "
+ "status = %d.", static_cast<int>(status));
+ return Void();
+ }
+ c2SettingResults[i] = std::move(c2SettingResult);
+ }
+ if (std::shared_ptr<Codec2Client::Listener> listener = base.lock()) {
+ listener->onTripped(component, c2SettingResults);
+ } else {
+ ALOGD("onTripped -- listener died.");
+ }
+ return Void();
+ }
+
+ virtual Return<void> onError(Status s, uint32_t errorCode) override {
+ ALOGD("onError -- status = %d, errorCode = %u.",
+ static_cast<int>(s),
+ static_cast<unsigned>(errorCode));
+ if (std::shared_ptr<Listener> listener = base.lock()) {
+ listener->onError(component, s == Status::OK ?
+ errorCode : static_cast<c2_status_t>(s));
+ } else {
+ ALOGD("onError -- listener died.");
+ }
+ return Void();
+ }
+
+ virtual Return<void> onFramesRendered(
+ const hidl_vec<RenderedFrame>& renderedFrames) override {
+ std::shared_ptr<Listener> listener = base.lock();
+ std::vector<Codec2Client::Listener::RenderedFrame> rfs;
+ rfs.reserve(renderedFrames.size());
+ for (const RenderedFrame& rf : renderedFrames) {
+ if (rf.slotId >= 0) {
+ if (listener) {
+ rfs.emplace_back(rf.bufferQueueId,
+ rf.slotId,
+ rf.timestampNs);
+ }
+ } else {
+ std::shared_ptr<Codec2Client::Component> strongComponent =
+ component.lock();
+ if (strongComponent) {
+ uint64_t frameIndex = rf.bufferQueueId;
+ size_t bufferIndex = static_cast<size_t>(~rf.slotId);
+ ALOGV("Received death notification of input buffer: "
+ "frameIndex = %llu, bufferIndex = %zu.",
+ static_cast<long long unsigned>(frameIndex),
+ bufferIndex);
+ std::shared_ptr<C2Buffer> buffer =
+ strongComponent->freeInputBuffer(
+ frameIndex, bufferIndex);
+ if (buffer) {
+ listener->onInputBufferDone(buffer);
+ }
+ }
+ }
+ }
+ if (!rfs.empty()) {
+ if (listener) {
+ listener->onFramesRendered(rfs);
+ } else {
+ ALOGD("onFramesRendered -- listener died.");
+ }
+ }
+ return Void();
+ }
+};
+
+// Codec2Client
+Codec2Client::Base* Codec2Client::base() const {
+ return static_cast<Base*>(mBase.get());
+}
+
+Codec2Client::Codec2Client(const sp<Codec2Client::Base>& base, std::string instanceName) :
+ Codec2ConfigurableClient(base), mListed(false), mInstanceName(instanceName) {
+ Return<sp<IClientManager>> transResult = base->getPoolClientManager();
+ if (!transResult.isOk()) {
+ ALOGE("getPoolClientManager -- failed transaction.");
+ } else {
+ mHostPoolManager = static_cast<sp<IClientManager>>(transResult);
+ }
+}
+
+c2_status_t Codec2Client::createComponent(
+ const C2String& name,
+ const std::shared_ptr<Codec2Client::Listener>& listener,
+ std::shared_ptr<Codec2Client::Component>* const component) {
+
+ // TODO: Add support for Bufferpool
+
+
+ c2_status_t status;
+ sp<Component::HidlListener> hidlListener = new Component::HidlListener();
+ hidlListener->base = listener;
+ Return<void> transStatus = base()->createComponent(
+ name,
+ hidlListener,
+ ClientManager::getInstance(),
+ [&status, component, hidlListener](
+ Status s,
+ const sp<IComponent>& c) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK) {
+ return;
+ }
+ *component = std::make_shared<Codec2Client::Component>(c);
+ hidlListener->component = *component;
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("createComponent -- failed transaction.");
+ return C2_TRANSACTION_FAILED;
+ }
+
+ if (status != C2_OK) {
+ return status;
+ }
+
+ if (!*component) {
+ ALOGE("createComponent -- null component.");
+ return C2_CORRUPTED;
+ }
+
+ status = (*component)->setDeathListener(*component, listener);
+ if (status != C2_OK) {
+ ALOGE("createComponent -- setDeathListener returned error: %d.",
+ static_cast<int>(status));
+ }
+
+ (*component)->mBufferPoolSender.setReceiver(mHostPoolManager);
+ return status;
+}
+
+c2_status_t Codec2Client::createInterface(
+ const C2String& name,
+ std::shared_ptr<Codec2Client::Interface>* const interface) {
+ c2_status_t status;
+ Return<void> transStatus = base()->createInterface(
+ name,
+ [&status, interface](
+ Status s,
+ const sp<IComponentInterface>& i) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK) {
+ ALOGE("createInterface -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ *interface = std::make_shared<Codec2Client::Interface>(i);
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("createInterface -- failed transaction.");
+ return C2_TRANSACTION_FAILED;
+ }
+ return status;
+}
+
+c2_status_t Codec2Client::createInputSurface(
+ std::shared_ptr<Codec2Client::InputSurface>* const inputSurface) {
+ Return<sp<IInputSurface>> transResult = base()->createInputSurface();
+ if (!transResult.isOk()) {
+ ALOGE("createInputSurface -- failed transaction.");
+ return C2_TRANSACTION_FAILED;
+ }
+ sp<IInputSurface> result = static_cast<sp<IInputSurface>>(transResult);
+ if (!result) {
+ *inputSurface = nullptr;
+ return C2_OK;
+ }
+ *inputSurface = std::make_shared<InputSurface>(result);
+ if (!*inputSurface) {
+ ALOGE("createInputSurface -- unknown error.");
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+const std::vector<C2Component::Traits>& Codec2Client::listComponents() const {
+ std::lock_guard<std::mutex> lock(mMutex);
+ if (mListed) {
+ return mTraitsList;
+ }
+ Return<void> transStatus = base()->listComponents(
+ [this](const hidl_vec<IComponentStore::ComponentTraits>& t) {
+ mTraitsList.resize(t.size());
+ mAliasesBuffer.resize(t.size());
+ for (size_t i = 0; i < t.size(); ++i) {
+ c2_status_t status = objcpy(
+ &mTraitsList[i], &mAliasesBuffer[i], t[i]);
+ if (status != C2_OK) {
+ ALOGE("listComponents -- corrupted output.");
+ return;
+ }
+ }
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("listComponents -- failed transaction.");
+ }
+ mListed = true;
+ return mTraitsList;
+}
+
+c2_status_t Codec2Client::copyBuffer(
+ const std::shared_ptr<C2Buffer>& src,
+ const std::shared_ptr<C2Buffer>& dst) {
+ // TODO: Implement?
+ (void)src;
+ (void)dst;
+ ALOGE("copyBuffer not implemented");
+ return C2_OMITTED;
+}
+
+std::shared_ptr<C2ParamReflector>
+ Codec2Client::getParamReflector() {
+ // TODO: this is not meant to be exposed as C2ParamReflector on the client side; instead, it
+ // should reflect the HAL API.
+ struct SimpleParamReflector : public C2ParamReflector {
+ virtual std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex coreIndex) const {
+ hidl_vec<ParamIndex> indices(1);
+ indices[0] = static_cast<ParamIndex>(coreIndex.coreIndex());
+ std::unique_ptr<C2StructDescriptor> descriptor;
+ Return<void> transStatus = mBase->getStructDescriptors(
+ indices,
+ [&descriptor](
+ Status s,
+ const hidl_vec<StructDescriptor>& sd) {
+ c2_status_t status = static_cast<c2_status_t>(s);
+ if (status != C2_OK) {
+ ALOGE("getStructDescriptors -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ descriptor.reset();
+ return;
+ }
+ if (sd.size() != 1) {
+ ALOGD("getStructDescriptors -- returned vector of size %zu.",
+ sd.size());
+ descriptor.reset();
+ return;
+ }
+ status = objcpy(&descriptor, sd[0]);
+ if (status != C2_OK) {
+ ALOGD("getStructDescriptors -- failed to convert. "
+ "Error code = %d", static_cast<int>(status));
+ descriptor.reset();
+ return;
+ }
+ });
+ return descriptor;
+ }
+
+ SimpleParamReflector(sp<Base> base)
+ : mBase(base) { }
+
+ sp<Base> mBase;
+ };
+
+ return std::make_shared<SimpleParamReflector>(base());
+};
+
+std::shared_ptr<Codec2Client> Codec2Client::CreateFromService(
+ const char* instanceName, bool waitForService) {
+ if (!instanceName) {
+ return nullptr;
+ }
+ sp<Base> baseStore = waitForService ?
+ Base::getService(instanceName) :
+ Base::tryGetService(instanceName);
+ if (!baseStore) {
+ if (waitForService) {
+ ALOGE("Codec2.0 service inaccessible. Check the device manifest.");
+ } else {
+ ALOGW("Codec2.0 service not available right now. Try again later.");
+ }
+ return nullptr;
+ }
+ return std::make_shared<Codec2Client>(baseStore, instanceName);
+}
+
+c2_status_t Codec2Client::ForAllStores(
+ const std::string &key,
+ std::function<c2_status_t(const std::shared_ptr<Codec2Client>&)> predicate) {
+ c2_status_t status = C2_NO_INIT; // no IComponentStores present
+
+ // Cache the mapping key -> index of Codec2Client in getClient().
+ static std::mutex key2IndexMutex;
+ static std::map<std::string, size_t> key2Index;
+
+ // By default try all stores. However, try the last known client first. If the last known
+ // client fails, retry once. We do this by pushing the last known client in front of the
+ // list of all clients.
+ std::deque<size_t> indices;
+ for (size_t index = kNumClients; index > 0; ) {
+ indices.push_front(--index);
+ }
+
+ bool wasMapped = false;
+ std::unique_lock<std::mutex> lock(key2IndexMutex);
+ auto it = key2Index.find(key);
+ if (it != key2Index.end()) {
+ indices.push_front(it->second);
+ wasMapped = true;
+ }
+ lock.unlock();
+
+ for (size_t index : indices) {
+ std::shared_ptr<Codec2Client> client = getClient(index);
+ if (client) {
+ status = predicate(client);
+ if (status == C2_OK) {
+ lock.lock();
+ key2Index[key] = index; // update last known client index
+ return status;
+ }
+ }
+ if (wasMapped) {
+ ALOGI("Could not find '%s' in last instance. Retrying...", key.c_str());
+ wasMapped = false;
+ }
+ }
+ return status; // return the last status from a valid client
+}
+
+std::shared_ptr<Codec2Client::Component>
+ Codec2Client::CreateComponentByName(
+ const char* componentName,
+ const std::shared_ptr<Listener>& listener,
+ std::shared_ptr<Codec2Client>* owner) {
+ std::shared_ptr<Component> component;
+ c2_status_t status = ForAllStores(
+ componentName,
+ [owner, &component, componentName, &listener](
+ const std::shared_ptr<Codec2Client> &client) -> c2_status_t {
+ c2_status_t status = client->createComponent(componentName, listener, &component);
+ if (status == C2_OK) {
+ if (owner) {
+ *owner = client;
+ }
+ } else if (status != C2_NOT_FOUND) {
+ ALOGD("IComponentStore(%s)::createComponent('%s') returned %s",
+ client->getInstanceName().c_str(), componentName, asString(status));
+ }
+ return status;
+ });
+ if (status != C2_OK) {
+ ALOGI("Could not create component '%s' (%s)", componentName, asString(status));
+ }
+ return component;
+}
+
+std::shared_ptr<Codec2Client::Interface>
+ Codec2Client::CreateInterfaceByName(
+ const char* interfaceName,
+ std::shared_ptr<Codec2Client>* owner) {
+ std::shared_ptr<Interface> interface;
+ c2_status_t status = ForAllStores(
+ interfaceName,
+ [owner, &interface, interfaceName](
+ const std::shared_ptr<Codec2Client> &client) -> c2_status_t {
+ c2_status_t status = client->createInterface(interfaceName, &interface);
+ if (status == C2_OK) {
+ if (owner) {
+ *owner = client;
+ }
+ } else if (status != C2_NOT_FOUND) {
+ ALOGD("IComponentStore(%s)::createInterface('%s') returned %s",
+ client->getInstanceName().c_str(), interfaceName, asString(status));
+ }
+ return status;
+ });
+ if (status != C2_OK) {
+ ALOGI("Could not create interface '%s' (%s)", interfaceName, asString(status));
+ }
+ return interface;
+}
+
+std::shared_ptr<Codec2Client::InputSurface> Codec2Client::CreateInputSurface() {
+ uint32_t serviceMask = ::android::base::GetUintProperty(
+ "debug.stagefright.c2inputsurface", uint32_t(0));
+ for (size_t i = 0; i < kNumClients; ++i) {
+ if ((1 << i) & serviceMask) {
+ std::shared_ptr<Codec2Client> client = getClient(i);
+ std::shared_ptr<Codec2Client::InputSurface> inputSurface;
+ if (client &&
+ client->createInputSurface(&inputSurface) == C2_OK &&
+ inputSurface) {
+ return inputSurface;
+ }
+ }
+ }
+ ALOGW("Could not create an input surface from any Codec2.0 services.");
+ return nullptr;
+}
+
+const std::vector<C2Component::Traits>& Codec2Client::ListComponents() {
+ static std::vector<C2Component::Traits> traitsList = [](){
+ std::vector<C2Component::Traits> list;
+ size_t listSize = 0;
+ ClientList clientList = getClientList();
+ for (const std::shared_ptr<Codec2Client>& client : clientList) {
+ if (!client) {
+ continue;
+ }
+ listSize += client->listComponents().size();
+ }
+ list.reserve(listSize);
+ for (const std::shared_ptr<Codec2Client>& client : clientList) {
+ if (!client) {
+ continue;
+ }
+ list.insert(
+ list.end(),
+ client->listComponents().begin(),
+ client->listComponents().end());
+ }
+ return list;
+ }();
+
+ return traitsList;
+}
+
+// Codec2Client::Listener
+
+Codec2Client::Listener::~Listener() {
+}
+
+// Codec2Client::Component
+
+Codec2Client::Component::Base* Codec2Client::Component::base() const {
+ return static_cast<Base*>(mBase.get());
+}
+
+Codec2Client::Component::Component(const sp<Codec2Client::Component::Base>& base) :
+ Codec2Client::Configurable(base),
+ mBufferPoolSender(nullptr) {
+}
+
+Codec2Client::Component::~Component() {
+}
+
+c2_status_t Codec2Client::Component::createBlockPool(
+ C2Allocator::id_t id,
+ C2BlockPool::local_id_t* blockPoolId,
+ std::shared_ptr<Codec2Client::Configurable>* configurable) {
+ c2_status_t status;
+ Return<void> transStatus = base()->createBlockPool(
+ static_cast<uint32_t>(id),
+ [&status, blockPoolId, configurable](
+ Status s,
+ uint64_t pId,
+ const sp<IConfigurable>& c) {
+ status = static_cast<c2_status_t>(s);
+ configurable->reset();
+ if (status != C2_OK) {
+ ALOGE("createBlockPool -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ *blockPoolId = static_cast<C2BlockPool::local_id_t>(pId);
+ *configurable = std::make_shared<Codec2Client::Configurable>(c);
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("createBlockPool -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ return status;
+}
+
+c2_status_t Codec2Client::Component::destroyBlockPool(
+ C2BlockPool::local_id_t localId) {
+ Return<Status> transResult = base()->destroyBlockPool(
+ static_cast<uint64_t>(localId));
+ if (!transResult.isOk()) {
+ ALOGE("destroyBlockPool -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ return static_cast<c2_status_t>(static_cast<Status>(transResult));
+}
+
+size_t Codec2Client::Component::handleOnWorkDone(
+ const std::list<std::unique_ptr<C2Work>> &workItems) {
+ // Input buffers' lifetime management
+ std::vector<uint64_t> inputDone;
+ for (const std::unique_ptr<C2Work> &work : workItems) {
+ if (work) {
+ if (work->worklets.empty()
+ || !work->worklets.back()
+ || (work->worklets.back()->output.flags & C2FrameData::FLAG_INCOMPLETE) == 0) {
+ // input is complete
+ inputDone.emplace_back(work->input.ordinal.frameIndex.peeku());
+ }
+ }
+ }
+
+ size_t numDiscardedInputBuffers = 0;
+ {
+ std::lock_guard<std::mutex> lock(mInputBuffersMutex);
+ for (uint64_t inputIndex : inputDone) {
+ auto it = mInputBuffers.find(inputIndex);
+ if (it == mInputBuffers.end()) {
+ ALOGV("onWorkDone -- returned consumed/unknown "
+ "input frame: index %llu",
+ (long long)inputIndex);
+ } else {
+ ALOGV("onWorkDone -- processed input frame: "
+ "index %llu (containing %zu buffers)",
+ (long long)inputIndex, it->second.size());
+ mInputBuffers.erase(it);
+ mInputBufferCount.erase(inputIndex);
+ ++numDiscardedInputBuffers;
+ }
+ }
+ }
+
+ // Output bufferqueue-based blocks' lifetime management
+ mOutputBufferQueueMutex.lock();
+ sp<IGraphicBufferProducer> igbp = mOutputIgbp;
+ uint64_t bqId = mOutputBqId;
+ uint32_t generation = mOutputGeneration;
+ mOutputBufferQueueMutex.unlock();
+
+ if (igbp) {
+ holdBufferQueueBlocks(workItems, igbp, bqId, generation);
+ }
+ return numDiscardedInputBuffers;
+}
+
+std::shared_ptr<C2Buffer> Codec2Client::Component::freeInputBuffer(
+ uint64_t frameIndex,
+ size_t bufferIndex) {
+ std::shared_ptr<C2Buffer> buffer;
+ std::lock_guard<std::mutex> lock(mInputBuffersMutex);
+ auto it = mInputBuffers.find(frameIndex);
+ if (it == mInputBuffers.end()) {
+ ALOGI("freeInputBuffer -- Unrecognized input frame index %llu.",
+ static_cast<long long unsigned>(frameIndex));
+ return nullptr;
+ }
+ if (bufferIndex >= it->second.size()) {
+ ALOGI("freeInputBuffer -- Input buffer no. %zu is invalid in "
+ "input frame index %llu.",
+ bufferIndex, static_cast<long long unsigned>(frameIndex));
+ return nullptr;
+ }
+ buffer = it->second[bufferIndex];
+ if (!buffer) {
+ ALOGI("freeInputBuffer -- Input buffer no. %zu in "
+ "input frame index %llu has already been freed.",
+ bufferIndex, static_cast<long long unsigned>(frameIndex));
+ return nullptr;
+ }
+ it->second[bufferIndex] = nullptr;
+ if (--mInputBufferCount[frameIndex] == 0) {
+ mInputBuffers.erase(it);
+ mInputBufferCount.erase(frameIndex);
+ }
+ return buffer;
+}
+
+c2_status_t Codec2Client::Component::queue(
+ std::list<std::unique_ptr<C2Work>>* const items) {
+ // remember input buffers queued to hold reference to them
+ {
+ std::lock_guard<std::mutex> lock(mInputBuffersMutex);
+ for (const std::unique_ptr<C2Work> &work : *items) {
+ if (!work) {
+ continue;
+ }
+ if (work->input.buffers.size() == 0) {
+ continue;
+ }
+
+ uint64_t inputIndex = work->input.ordinal.frameIndex.peeku();
+ auto res = mInputBuffers.emplace(inputIndex, work->input.buffers);
+ if (!res.second) {
+ // TODO: append? - for now we are replacing
+ res.first->second = work->input.buffers;
+ ALOGI("queue -- duplicate input frame: index %llu. "
+ "Discarding the old input frame...",
+ (long long)inputIndex);
+ }
+ mInputBufferCount[inputIndex] = work->input.buffers.size();
+ ALOGV("queue -- queueing input frame: "
+ "index %llu (containing %zu buffers)",
+ (long long)inputIndex, work->input.buffers.size());
+ }
+ }
+
+ WorkBundle workBundle;
+ Status hidlStatus = objcpy(&workBundle, *items, &mBufferPoolSender);
+ if (hidlStatus != Status::OK) {
+ ALOGE("queue -- bad input.");
+ return C2_TRANSACTION_FAILED;
+ }
+ Return<Status> transStatus = base()->queue(workBundle);
+ if (!transStatus.isOk()) {
+ ALOGE("queue -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("queue -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ return status;
+}
+
+c2_status_t Codec2Client::Component::flush(
+ C2Component::flush_mode_t mode,
+ std::list<std::unique_ptr<C2Work>>* const flushedWork) {
+ (void)mode; // Flush mode isn't supported in HIDL yet.
+ c2_status_t status;
+ Return<void> transStatus = base()->flush(
+ [&status, flushedWork](
+ Status s, const WorkBundle& wb) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK) {
+ ALOGE("flush -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ status = objcpy(flushedWork, wb);
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("flush -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+
+ // Indices of flushed work items.
+ std::vector<uint64_t> flushedIndices;
+ for (const std::unique_ptr<C2Work> &work : *flushedWork) {
+ if (work) {
+ if (work->worklets.empty()
+ || !work->worklets.back()
+ || (work->worklets.back()->output.flags &
+ C2FrameData::FLAG_INCOMPLETE) == 0) {
+ // input is complete
+ flushedIndices.emplace_back(
+ work->input.ordinal.frameIndex.peeku());
+ }
+ }
+ }
+
+ // Input buffers' lifetime management
+ for (uint64_t flushedIndex : flushedIndices) {
+ std::lock_guard<std::mutex> lock(mInputBuffersMutex);
+ auto it = mInputBuffers.find(flushedIndex);
+ if (it == mInputBuffers.end()) {
+ ALOGV("flush -- returned consumed/unknown input frame: "
+ "index %llu",
+ (long long)flushedIndex);
+ } else {
+ ALOGV("flush -- returned unprocessed input frame: "
+ "index %llu (containing %zu buffers)",
+ (long long)flushedIndex, mInputBufferCount[flushedIndex]);
+ mInputBuffers.erase(it);
+ mInputBufferCount.erase(flushedIndex);
+ }
+ }
+
+ // Output bufferqueue-based blocks' lifetime management
+ mOutputBufferQueueMutex.lock();
+ sp<IGraphicBufferProducer> igbp = mOutputIgbp;
+ uint64_t bqId = mOutputBqId;
+ uint32_t generation = mOutputGeneration;
+ mOutputBufferQueueMutex.unlock();
+
+ if (igbp) {
+ holdBufferQueueBlocks(*flushedWork, igbp, bqId, generation);
+ }
+
+ return status;
+}
+
+c2_status_t Codec2Client::Component::drain(C2Component::drain_mode_t mode) {
+ Return<Status> transStatus = base()->drain(
+ mode == C2Component::DRAIN_COMPONENT_WITH_EOS);
+ if (!transStatus.isOk()) {
+ ALOGE("drain -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("drain -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ return status;
+}
+
+c2_status_t Codec2Client::Component::start() {
+ Return<Status> transStatus = base()->start();
+ if (!transStatus.isOk()) {
+ ALOGE("start -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("start -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ return status;
+}
+
+c2_status_t Codec2Client::Component::stop() {
+ Return<Status> transStatus = base()->stop();
+ if (!transStatus.isOk()) {
+ ALOGE("stop -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("stop -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ mInputBuffersMutex.lock();
+ mInputBuffers.clear();
+ mInputBufferCount.clear();
+ mInputBuffersMutex.unlock();
+ return status;
+}
+
+c2_status_t Codec2Client::Component::reset() {
+ Return<Status> transStatus = base()->reset();
+ if (!transStatus.isOk()) {
+ ALOGE("reset -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("reset -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ mInputBuffersMutex.lock();
+ mInputBuffers.clear();
+ mInputBufferCount.clear();
+ mInputBuffersMutex.unlock();
+ return status;
+}
+
+c2_status_t Codec2Client::Component::release() {
+ Return<Status> transStatus = base()->release();
+ if (!transStatus.isOk()) {
+ ALOGE("release -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("release -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ mInputBuffersMutex.lock();
+ mInputBuffers.clear();
+ mInputBufferCount.clear();
+ mInputBuffersMutex.unlock();
+ return status;
+}
+
+c2_status_t Codec2Client::Component::setOutputSurface(
+ C2BlockPool::local_id_t blockPoolId,
+ const sp<IGraphicBufferProducer>& surface,
+ uint32_t generation) {
+ sp<HGraphicBufferProducer> igbp = surface->getHalInterface();
+ if (!igbp) {
+ igbp = new TWGraphicBufferProducer<HGraphicBufferProducer>(surface);
+ }
+
+ Return<Status> transStatus = base()->setOutputSurface(
+ static_cast<uint64_t>(blockPoolId), igbp);
+ if (!transStatus.isOk()) {
+ ALOGE("setOutputSurface -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("setOutputSurface -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ } else {
+ std::lock_guard<std::mutex> lock(mOutputBufferQueueMutex);
+ if (mOutputIgbp != surface) {
+ mOutputIgbp = surface;
+ if (!surface) {
+ mOutputBqId = 0;
+ } else if (surface->getUniqueId(&mOutputBqId) != OK) {
+ ALOGE("setOutputSurface -- cannot obtain bufferqueue id.");
+ }
+ }
+ mOutputGeneration = generation;
+ }
+ return status;
+}
+
+status_t Codec2Client::Component::queueToOutputSurface(
+ const C2ConstGraphicBlock& block,
+ const QueueBufferInput& input,
+ QueueBufferOutput* output) {
+ uint32_t generation;
+ uint64_t bqId;
+ int32_t bqSlot;
+ if (!getBufferQueueAssignment(block, &generation, &bqId, &bqSlot) ||
+ bqId == 0) {
+ // Block not from bufferqueue -- it must be attached before queuing.
+
+ mOutputBufferQueueMutex.lock();
+ sp<IGraphicBufferProducer> outputIgbp = mOutputIgbp;
+ uint32_t outputGeneration = mOutputGeneration;
+ mOutputBufferQueueMutex.unlock();
+
+ status_t status = !attachToBufferQueue(block,
+ outputIgbp,
+ outputGeneration,
+ &bqSlot);
+ if (status != OK) {
+ ALOGW("queueToOutputSurface -- attaching failed.");
+ return INVALID_OPERATION;
+ }
+
+ status = outputIgbp->queueBuffer(static_cast<int>(bqSlot),
+ input, output);
+ if (status != OK) {
+ ALOGE("queueToOutputSurface -- queueBuffer() failed "
+ "on non-bufferqueue-based block. "
+ "Error code = %d.",
+ static_cast<int>(status));
+ return status;
+ }
+ return OK;
+ }
+
+ mOutputBufferQueueMutex.lock();
+ sp<IGraphicBufferProducer> outputIgbp = mOutputIgbp;
+ uint64_t outputBqId = mOutputBqId;
+ uint32_t outputGeneration = mOutputGeneration;
+ mOutputBufferQueueMutex.unlock();
+
+ if (!outputIgbp) {
+ ALOGV("queueToOutputSurface -- output surface is null.");
+ return NO_INIT;
+ }
+
+ if (bqId != outputBqId) {
+ ALOGV("queueToOutputSurface -- bufferqueue ids mismatch.");
+ return DEAD_OBJECT;
+ }
+
+ if (generation != outputGeneration) {
+ ALOGV("queueToOutputSurface -- generation numbers mismatch.");
+ return DEAD_OBJECT;
+ }
+
+ status_t status = outputIgbp->queueBuffer(static_cast<int>(bqSlot),
+ input, output);
+ if (status != OK) {
+ ALOGD("queueToOutputSurface -- queueBuffer() failed "
+ "on bufferqueue-based block. "
+ "Error code = %d.",
+ static_cast<int>(status));
+ return status;
+ }
+ if (!yieldBufferQueueBlock(block)) {
+ ALOGD("queueToOutputSurface -- cannot yield bufferqueue-based block "
+ "to the bufferqueue.");
+ return UNKNOWN_ERROR;
+ }
+ return OK;
+}
+
+c2_status_t Codec2Client::Component::connectToOmxInputSurface(
+ const sp<HGraphicBufferProducer>& producer,
+ const sp<HGraphicBufferSource>& source) {
+ Return<Status> transStatus = base()->connectToOmxInputSurface(
+ producer, source);
+ if (!transStatus.isOk()) {
+ ALOGE("connectToOmxInputSurface -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("connectToOmxInputSurface -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ return status;
+}
+
+c2_status_t Codec2Client::Component::disconnectFromInputSurface() {
+ Return<Status> transStatus = base()->disconnectFromInputSurface();
+ if (!transStatus.isOk()) {
+ ALOGE("disconnectToInputSurface -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ c2_status_t status =
+ static_cast<c2_status_t>(static_cast<Status>(transStatus));
+ if (status != C2_OK) {
+ ALOGE("disconnectFromInputSurface -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ }
+ return status;
+}
+
+c2_status_t Codec2Client::Component::setDeathListener(
+ const std::shared_ptr<Component>& component,
+ const std::shared_ptr<Listener>& listener) {
+
+ struct HidlDeathRecipient : public hardware::hidl_death_recipient {
+ std::weak_ptr<Component> component;
+ std::weak_ptr<Listener> base;
+
+ virtual void serviceDied(
+ uint64_t /* cookie */,
+ const wp<::android::hidl::base::V1_0::IBase>& /* who */
+ ) override {
+ if (std::shared_ptr<Codec2Client::Listener> listener = base.lock()) {
+ listener->onDeath(component);
+ } else {
+ ALOGW("onDeath -- listener died.");
+ }
+ }
+ };
+
+ sp<HidlDeathRecipient> deathRecipient = new HidlDeathRecipient();
+ deathRecipient->base = listener;
+ deathRecipient->component = component;
+
+ component->mDeathRecipient = deathRecipient;
+ Return<bool> transResult = component->base()->linkToDeath(
+ component->mDeathRecipient, 0);
+ if (!transResult.isOk()) {
+ ALOGE("setDeathListener -- failed transaction: linkToDeath.");
+ return C2_TRANSACTION_FAILED;
+ }
+ if (!static_cast<bool>(transResult)) {
+ ALOGE("setDeathListener -- linkToDeath call failed.");
+ return C2_CORRUPTED;
+ }
+ return C2_OK;
+}
+
+// Codec2Client::InputSurface
+
+Codec2Client::InputSurface::Base* Codec2Client::InputSurface::base() const {
+ return static_cast<Base*>(mBase.get());
+}
+
+Codec2Client::InputSurface::InputSurface(const sp<IInputSurface>& base) :
+ mBase(base),
+ mGraphicBufferProducer(new
+ ::android::hardware::graphics::bufferqueue::V1_0::utils::
+ H2BGraphicBufferProducer(base)) {
+}
+
+c2_status_t Codec2Client::InputSurface::connectToComponent(
+ const std::shared_ptr<Codec2Client::Component>& component,
+ std::shared_ptr<Connection>* connection) {
+ c2_status_t status;
+ Return<void> transStatus = base()->connectToComponent(
+ component->base(),
+ [&status, connection](
+ Status s,
+ const sp<IInputSurfaceConnection>& c) {
+ status = static_cast<c2_status_t>(s);
+ if (status != C2_OK) {
+ ALOGE("connectToComponent -- call failed. "
+ "Error code = %d", static_cast<int>(status));
+ return;
+ }
+ *connection = std::make_shared<Connection>(c);
+ });
+ if (!transStatus.isOk()) {
+ ALOGE("connect -- transaction failed.");
+ return C2_TRANSACTION_FAILED;
+ }
+ return status;
+}
+
+std::shared_ptr<Codec2Client::Configurable>
+ Codec2Client::InputSurface::getConfigurable() const {
+ Return<sp<IConfigurable>> transResult = base()->getConfigurable();
+ if (!transResult.isOk()) {
+ ALOGW("getConfigurable -- transaction failed.");
+ return nullptr;
+ }
+ if (!static_cast<sp<IConfigurable>>(transResult)) {
+ ALOGW("getConfigurable -- null pointer.");
+ return nullptr;
+ }
+ return std::make_shared<Configurable>(transResult);
+}
+
+const sp<IGraphicBufferProducer>&
+ Codec2Client::InputSurface::getGraphicBufferProducer() const {
+ return mGraphicBufferProducer;
+}
+
+const sp<IInputSurface>& Codec2Client::InputSurface::getHalInterface() const {
+ return mBase;
+}
+
+// Codec2Client::InputSurfaceConnection
+
+Codec2Client::InputSurfaceConnection::Base*
+ Codec2Client::InputSurfaceConnection::base() const {
+ return static_cast<Base*>(mBase.get());
+}
+
+Codec2Client::InputSurfaceConnection::InputSurfaceConnection(
+ const sp<Codec2Client::InputSurfaceConnection::Base>& base) :
+ mBase(base) {
+}
+
+c2_status_t Codec2Client::InputSurfaceConnection::disconnect() {
+ Return<Status> transResult = base()->disconnect();
+ return static_cast<c2_status_t>(static_cast<Status>(transResult));
+}
+
+} // namespace android
+
diff --git a/media/codec2/hidl/client/include/codec2/hidl/client.h b/media/codec2/hidl/client/include/codec2/hidl/client.h
new file mode 100644
index 0000000..3ab3967
--- /dev/null
+++ b/media/codec2/hidl/client/include/codec2/hidl/client.h
@@ -0,0 +1,485 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_HIDL_CLIENT_H_
+#define CODEC2_HIDL_CLIENT_H_
+
+#include <gui/IGraphicBufferProducer.h>
+#include <codec2/hidl/1.0/types.h>
+
+#include <C2PlatformSupport.h>
+#include <C2Component.h>
+#include <C2Buffer.h>
+#include <C2Param.h>
+#include <C2.h>
+
+#include <hidl/HidlSupport.h>
+#include <utils/StrongPointer.h>
+
+#include <functional>
+#include <map>
+#include <memory>
+#include <mutex>
+
+/**
+ * This file contains minimal interfaces for the framework to access Codec2.0.
+ *
+ * Codec2Client is the main class that contains the following inner classes:
+ * - Listener
+ * - Configurable
+ * - Interface
+ * - Component
+ *
+ * Classes in Codec2Client, interfaces in Codec2.0, and HIDL interfaces are
+ * related as follows:
+ * - Codec2Client <==> C2ComponentStore <==> IComponentStore
+ * - Codec2Client::Listener <==> C2Component::Listener <==> IComponentListener
+ * - Codec2Client::Configurable <==> [No equivalent] <==> IConfigurable
+ * - Codec2Client::Interface <==> C2ComponentInterface <==> IComponentInterface
+ * - Codec2Client::Component <==> C2Component <==> IComponent
+ *
+ * The entry point is Codec2Client::CreateFromService(), which creates a
+ * Codec2Client object. From Codec2Client, Interface and Component objects can
+ * be created by calling createComponent() and createInterface().
+ *
+ * createComponent() takes a Listener object, which must be implemented by the
+ * user.
+ *
+ * At the present, createBlockPool() is the only method that yields a
+ * Configurable object. Note, however, that Interface, Component and
+ * Codec2Client are all subclasses of Configurable.
+ */
+
+// Forward declaration of Codec2.0 HIDL interfaces
+namespace android {
+namespace hardware {
+namespace media {
+namespace c2 {
+namespace V1_0 {
+struct IConfigurable;
+struct IComponentInterface;
+struct IComponent;
+struct IComponentStore;
+struct IInputSurface;
+struct IInputSurfaceConnection;
+} // namespace V1_0
+} // namespace c2
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace bufferpool {
+namespace V1_0 {
+struct IClientManager;
+} // namespace V1_0
+} // namespace bufferpool
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+// Forward declarations of other classes
+namespace android {
+namespace hardware {
+namespace graphics {
+namespace bufferqueue {
+namespace V1_0 {
+struct IGraphicBufferProducer;
+} // namespace V1_0
+} // namespace bufferqueue
+} // namespace graphics
+namespace media {
+namespace omx {
+namespace V1_0 {
+struct IGraphicBufferSource;
+} // namespace V1_0
+} // namespace omx
+} // namespace media
+} // namespace hardware
+} // namespace android
+
+namespace android {
+
+// This class is supposed to be called Codec2Client::Configurable, but forward
+// declaration of an inner class is not possible.
+struct Codec2ConfigurableClient {
+
+ typedef ::android::hardware::media::c2::V1_0::IConfigurable Base;
+
+ const C2String& getName() const;
+
+ c2_status_t query(
+ const std::vector<C2Param*>& stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const;
+
+ c2_status_t config(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures);
+
+ c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const params
+ ) const;
+
+ c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery>& fields,
+ c2_blocking_t mayBlock) const;
+
+ // base cannot be null.
+ Codec2ConfigurableClient(const sp<Base>& base);
+
+protected:
+ C2String mName;
+ sp<Base> mBase;
+
+ Base* base() const;
+
+ friend struct Codec2Client;
+};
+
+struct Codec2Client : public Codec2ConfigurableClient {
+
+ typedef ::android::hardware::media::c2::V1_0::IComponentStore Base;
+
+ struct Listener;
+
+ typedef Codec2ConfigurableClient Configurable;
+
+ typedef Configurable Interface; // These two types may diverge in the future.
+
+ struct Component;
+
+ struct InputSurface;
+
+ struct InputSurfaceConnection;
+
+ typedef Codec2Client Store;
+
+ std::string getInstanceName() const { return mInstanceName; }
+
+ c2_status_t createComponent(
+ const C2String& name,
+ const std::shared_ptr<Listener>& listener,
+ std::shared_ptr<Component>* const component);
+
+ c2_status_t createInterface(
+ const C2String& name,
+ std::shared_ptr<Interface>* const interface);
+
+ c2_status_t createInputSurface(
+ std::shared_ptr<InputSurface>* const inputSurface);
+
+ const std::vector<C2Component::Traits>& listComponents() const;
+
+ c2_status_t copyBuffer(
+ const std::shared_ptr<C2Buffer>& src,
+ const std::shared_ptr<C2Buffer>& dst);
+
+ std::shared_ptr<C2ParamReflector> getParamReflector();
+
+ static std::shared_ptr<Codec2Client> CreateFromService(
+ const char* instanceName,
+ bool waitForService = true);
+
+ // Try to create a component with a given name from all known
+ // IComponentStore services.
+ static std::shared_ptr<Component> CreateComponentByName(
+ const char* componentName,
+ const std::shared_ptr<Listener>& listener,
+ std::shared_ptr<Codec2Client>* owner = nullptr);
+
+ // Try to create a component interface with a given name from all known
+ // IComponentStore services.
+ static std::shared_ptr<Interface> CreateInterfaceByName(
+ const char* interfaceName,
+ std::shared_ptr<Codec2Client>* owner = nullptr);
+
+ // List traits from all known IComponentStore services.
+ static const std::vector<C2Component::Traits>& ListComponents();
+
+ // Create an input surface.
+ static std::shared_ptr<InputSurface> CreateInputSurface();
+
+ // base cannot be null.
+ Codec2Client(const sp<Base>& base, std::string instanceName);
+
+protected:
+ Base* base() const;
+
+ // Finds the first store where the predicate returns OK, and returns the last
+ // predicate result. Uses key to remember the last store found, and if cached,
+ // it tries that store before trying all stores (one retry).
+ static c2_status_t ForAllStores(
+ const std::string& key,
+ std::function<c2_status_t(const std::shared_ptr<Codec2Client>&)> predicate);
+
+ mutable std::mutex mMutex;
+ mutable bool mListed;
+ std::string mInstanceName;
+ mutable std::vector<C2Component::Traits> mTraitsList;
+ mutable std::vector<std::unique_ptr<std::vector<std::string>>>
+ mAliasesBuffer;
+
+ sp<::android::hardware::media::bufferpool::V1_0::IClientManager>
+ mHostPoolManager;
+};
+
+struct Codec2Client::Listener {
+
+ // This is called when the component produces some output.
+ //
+ // numDiscardedInputBuffers is the number of input buffers contained in
+ // workItems that have just become unused. Note that workItems may contain
+ // more input buffers than numDiscardedInputBuffers because buffers that
+ // have been previously reported by onInputBufferDone() are not counted
+ // towards numDiscardedInputBuffers, but may still show up in workItems.
+ virtual void onWorkDone(
+ const std::weak_ptr<Component>& comp,
+ std::list<std::unique_ptr<C2Work>>& workItems,
+ size_t numDiscardedInputBuffers) = 0;
+
+ // This is called when the component goes into a tripped state.
+ virtual void onTripped(
+ const std::weak_ptr<Component>& comp,
+ const std::vector<std::shared_ptr<C2SettingResult>>& settingResults
+ ) = 0;
+
+ // This is called when the component encounters an error.
+ virtual void onError(
+ const std::weak_ptr<Component>& comp,
+ uint32_t errorCode) = 0;
+
+ // This is called when the process that hosts the component shuts down
+ // unexpectedly.
+ virtual void onDeath(
+ const std::weak_ptr<Component>& comp) = 0;
+
+ // This is called when an input buffer is no longer in use by the codec.
+ // Input buffers that have been returned by onWorkDone() or flush() will not
+ // trigger a call to this function.
+ virtual void onInputBufferDone(
+ const std::shared_ptr<C2Buffer>& buffer) = 0;
+
+ // This structure is used for transporting onFramesRendered() event to the
+ // client in the case where the output buffers are obtained from a
+ // bufferqueue.
+ struct RenderedFrame {
+ // The id of the bufferqueue.
+ uint64_t bufferQueueId;
+ // The slot of the buffer inside the bufferqueue.
+ int32_t slotId;
+ // The timestamp.
+ int64_t timestampNs;
+
+ RenderedFrame(uint64_t bufferQueueId, int32_t slotId,
+ int64_t timestampNs)
+ : bufferQueueId(bufferQueueId),
+ slotId(slotId),
+ timestampNs(timestampNs) {}
+ RenderedFrame(const RenderedFrame&) = default;
+ };
+
+ // This is called when the component becomes aware of frames being rendered.
+ virtual void onFramesRendered(
+ const std::vector<RenderedFrame>& renderedFrames) = 0;
+
+ virtual ~Listener();
+
+};
+
+struct Codec2Client::Component : public Codec2Client::Configurable {
+
+ typedef ::android::hardware::media::c2::V1_0::IComponent Base;
+
+ c2_status_t createBlockPool(
+ C2Allocator::id_t id,
+ C2BlockPool::local_id_t* blockPoolId,
+ std::shared_ptr<Configurable>* configurable);
+
+ c2_status_t destroyBlockPool(
+ C2BlockPool::local_id_t localId);
+
+ c2_status_t queue(
+ std::list<std::unique_ptr<C2Work>>* const items);
+
+ c2_status_t flush(
+ C2Component::flush_mode_t mode,
+ std::list<std::unique_ptr<C2Work>>* const flushedWork);
+
+ c2_status_t drain(C2Component::drain_mode_t mode);
+
+ c2_status_t start();
+
+ c2_status_t stop();
+
+ c2_status_t reset();
+
+ c2_status_t release();
+
+ typedef ::android::
+ IGraphicBufferProducer IGraphicBufferProducer;
+ typedef IGraphicBufferProducer::
+ QueueBufferInput QueueBufferInput;
+ typedef IGraphicBufferProducer::
+ QueueBufferOutput QueueBufferOutput;
+
+ typedef ::android::hardware::graphics::bufferqueue::V1_0::
+ IGraphicBufferProducer HGraphicBufferProducer;
+ typedef ::android::hardware::media::omx::V1_0::
+ IGraphicBufferSource HGraphicBufferSource;
+
+ // Set the output surface to be used with a blockpool previously created by
+ // createBlockPool().
+ c2_status_t setOutputSurface(
+ C2BlockPool::local_id_t blockPoolId,
+ const sp<IGraphicBufferProducer>& surface,
+ uint32_t generation);
+
+ // Extract a slot number from of the block, then call
+ // IGraphicBufferProducer::queueBuffer().
+ //
+ // If the output surface has not been set, NO_INIT will be returned.
+ //
+ // If the block does not come from a bufferqueue-based blockpool,
+ // attachBuffer() will be called, followed by queueBuffer().
+ //
+ // If the block has a bqId that does not match the id of the output surface,
+ // DEAD_OBJECT will be returned.
+ //
+ // If the call to queueBuffer() is successful but the block cannot be
+ // associated to the output surface for automatic cancellation upon
+ // destruction, UNKNOWN_ERROR will be returned.
+ //
+ // Otherwise, the return value from queueBuffer() will be returned.
+ status_t queueToOutputSurface(
+ const C2ConstGraphicBlock& block,
+ const QueueBufferInput& input,
+ QueueBufferOutput* output);
+
+ c2_status_t connectToOmxInputSurface(
+ const sp<HGraphicBufferProducer>& producer,
+ const sp<HGraphicBufferSource>& source);
+
+ c2_status_t disconnectFromInputSurface();
+
+ // base cannot be null.
+ Component(const sp<Base>& base);
+
+ ~Component();
+
+protected:
+ Base* base() const;
+
+ // Mutex for mInputBuffers and mInputBufferCount.
+ mutable std::mutex mInputBuffersMutex;
+
+ // Map: frameIndex -> vector of bufferIndices
+ //
+ // mInputBuffers[frameIndex][bufferIndex] may be null if the buffer in that
+ // slot has been freed.
+ mutable std::map<uint64_t, std::vector<std::shared_ptr<C2Buffer>>>
+ mInputBuffers;
+
+ // Map: frameIndex -> number of bufferIndices that have not been freed
+ //
+ // mInputBufferCount[frameIndex] keeps track of the number of non-null
+ // elements in mInputBuffers[frameIndex]. When mInputBufferCount[frameIndex]
+ // decreases to 0, frameIndex can be removed from both mInputBuffers and
+ // mInputBufferCount.
+ mutable std::map<uint64_t, size_t> mInputBufferCount;
+
+ ::android::hardware::media::c2::V1_0::utils::DefaultBufferPoolSender
+ mBufferPoolSender;
+
+ std::mutex mOutputBufferQueueMutex;
+ sp<IGraphicBufferProducer> mOutputIgbp;
+ uint64_t mOutputBqId;
+ uint32_t mOutputGeneration;
+
+ static c2_status_t setDeathListener(
+ const std::shared_ptr<Component>& component,
+ const std::shared_ptr<Listener>& listener);
+ sp<::android::hardware::hidl_death_recipient> mDeathRecipient;
+
+ friend struct Codec2Client;
+
+ struct HidlListener;
+ // Return the number of input buffers that should be discarded.
+ size_t handleOnWorkDone(const std::list<std::unique_ptr<C2Work>> &workItems);
+ // Remove an input buffer from mInputBuffers and return it.
+ std::shared_ptr<C2Buffer> freeInputBuffer(uint64_t frameIndex, size_t bufferIndex);
+
+};
+
+struct Codec2Client::InputSurface {
+public:
+ typedef ::android::hardware::media::c2::V1_0::IInputSurface Base;
+
+ typedef ::android::hardware::media::c2::V1_0::IInputSurfaceConnection
+ ConnectionBase;
+
+ typedef Codec2Client::InputSurfaceConnection Connection;
+
+ typedef ::android::IGraphicBufferProducer IGraphicBufferProducer;
+
+ c2_status_t connectToComponent(
+ const std::shared_ptr<Component>& component,
+ std::shared_ptr<Connection>* connection);
+
+ std::shared_ptr<Configurable> getConfigurable() const;
+
+ const sp<IGraphicBufferProducer>& getGraphicBufferProducer() const;
+
+ // Return the underlying IInputSurface.
+ const sp<Base>& getHalInterface() const;
+
+ // base cannot be null.
+ InputSurface(const sp<Base>& base);
+
+protected:
+ Base* base() const;
+ sp<Base> mBase;
+
+ sp<IGraphicBufferProducer> mGraphicBufferProducer;
+
+ friend struct Codec2Client;
+ friend struct Component;
+};
+
+struct Codec2Client::InputSurfaceConnection {
+
+ typedef ::android::hardware::media::c2::V1_0::IInputSurfaceConnection Base;
+
+ c2_status_t disconnect();
+
+ // base cannot be null.
+ InputSurfaceConnection(const sp<Base>& base);
+
+protected:
+ Base* base() const;
+ sp<Base> mBase;
+
+ friend struct Codec2Client::InputSurface;
+};
+
+} // namespace android
+
+#endif // CODEC2_HIDL_CLIENT_H_
+
diff --git a/media/codec2/hidl/services/Android.bp b/media/codec2/hidl/services/Android.bp
new file mode 100644
index 0000000..965971e
--- /dev/null
+++ b/media/codec2/hidl/services/Android.bp
@@ -0,0 +1,94 @@
+cc_binary {
+ name: "android.hardware.media.c2@1.0-service",
+ defaults: ["hidl_defaults"],
+ soc_specific: true,
+ relative_install_path: "hw",
+ srcs: [
+ "vendor.cpp",
+ ],
+
+ init_rc: ["android.hardware.media.c2@1.0-service.rc"],
+
+ shared_libs: [
+ "android.hardware.media.c2@1.0",
+ "android.hardware.media.omx@1.0",
+ "libavservices_minijail_vendor",
+ "libbinder",
+ "libcodec2_hidl@1.0",
+ "libcodec2_vndk",
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libstagefright_omx",
+ "libstagefright_xmlparser",
+ "libutils",
+ ],
+
+ arch: {
+ arm: {
+ required: ["codec2.vendor.base.policy"],
+ },
+ x86: {
+ required: ["codec2.vendor.base.policy"],
+ },
+ },
+
+ compile_multilib: "32",
+}
+
+cc_library_shared {
+ name: "libcodec2_serviceregistrant",
+ // need vendor version for update packaging, system version may have more dependencies
+ vendor_available: true,
+ srcs: [
+ "C2SoftwareCodecServiceRegistrant.cpp",
+ ],
+
+ header_libs: [
+ "libmedia_headers",
+ ],
+
+ shared_libs: [
+ "android.hardware.media.c2@1.0",
+ "libcodec2_hidl@1.0",
+ "libcodec2_vndk",
+ "liblog",
+ "libutils",
+ ],
+
+ // Codecs
+ runtime_libs: [
+ "libcodec2_soft_avcdec",
+ "libcodec2_soft_avcenc",
+ "libcodec2_soft_aacdec",
+ "libcodec2_soft_aacenc",
+ "libcodec2_soft_amrnbdec",
+ "libcodec2_soft_amrnbenc",
+ "libcodec2_soft_amrwbdec",
+ "libcodec2_soft_amrwbenc",
+ "libcodec2_soft_hevcdec",
+ "libcodec2_soft_g711alawdec",
+ "libcodec2_soft_g711mlawdec",
+ "libcodec2_soft_mpeg2dec",
+ "libcodec2_soft_h263dec",
+ "libcodec2_soft_h263enc",
+ "libcodec2_soft_mpeg4dec",
+ "libcodec2_soft_mpeg4enc",
+ "libcodec2_soft_mp3dec",
+ "libcodec2_soft_vorbisdec",
+ "libcodec2_soft_opusdec",
+ "libcodec2_soft_vp8dec",
+ "libcodec2_soft_vp9dec",
+ "libcodec2_soft_vp8enc",
+ "libcodec2_soft_vp9enc",
+ "libcodec2_soft_rawdec",
+ "libcodec2_soft_flacdec",
+ "libcodec2_soft_flacenc",
+ "libcodec2_soft_gsmdec",
+ "libcodec2_soft_xaacdec",
+ ],
+
+ compile_multilib: "32",
+}
+
diff --git a/media/codec2/hidl/services/Android.mk b/media/codec2/hidl/services/Android.mk
new file mode 100644
index 0000000..d9b28e7
--- /dev/null
+++ b/media/codec2/hidl/services/Android.mk
@@ -0,0 +1,24 @@
+LOCAL_PATH := $(call my-dir)
+
+# vendor service seccomp policy
+ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH), x86 x86_64 arm arm64))
+include $(CLEAR_VARS)
+LOCAL_MODULE := codec2.vendor.base.policy
+LOCAL_VENDOR_MODULE := true
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/seccomp_policy
+LOCAL_REQUIRED_MODULES := crash_dump.policy
+ifdef TARGET_2ND_ARCH
+ ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true)
+ LOCAL_SRC_FILES := seccomp_policy/codec2.vendor.base-$(TARGET_2ND_ARCH).policy
+ else
+ LOCAL_SRC_FILES := seccomp_policy/codec2.vendor.base-$(TARGET_ARCH).policy
+ endif
+else
+ LOCAL_SRC_FILES := seccomp_policy/codec2.vendor.base-$(TARGET_ARCH).policy
+endif
+include $(BUILD_PREBUILT)
+endif
+
+include $(call all-makefiles-under, $(LOCAL_PATH))
+
diff --git a/media/codec2/hidl/services/C2SoftwareCodecServiceRegistrant.cpp b/media/codec2/hidl/services/C2SoftwareCodecServiceRegistrant.cpp
new file mode 100644
index 0000000..e10ae6e
--- /dev/null
+++ b/media/codec2/hidl/services/C2SoftwareCodecServiceRegistrant.cpp
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SoftwareCodecServiceRegistrant"
+
+#include <C2PlatformSupport.h>
+#include <codec2/hidl/1.0/ComponentStore.h>
+#include <media/CodecServiceRegistrant.h>
+#include <log/log.h>
+
+extern "C" void RegisterCodecServices() {
+ using namespace ::android::hardware::media::c2::V1_0;
+ android::sp<IComponentStore> store =
+ new utils::ComponentStore(
+ android::GetCodec2PlatformComponentStore());
+ if (store == nullptr) {
+ ALOGE("Cannot create Codec2's IComponentStore software service.");
+ } else {
+ if (store->registerAsService("software") != android::OK) {
+ ALOGE("Cannot register Codec2's "
+ "IComponentStore software service.");
+ } else {
+ ALOGI("Codec2's IComponentStore software service created.");
+ }
+ }
+}
+
diff --git a/media/codec2/hidl/services/android.hardware.media.c2@1.0-service.rc b/media/codec2/hidl/services/android.hardware.media.c2@1.0-service.rc
new file mode 100644
index 0000000..8806bd1f
--- /dev/null
+++ b/media/codec2/hidl/services/android.hardware.media.c2@1.0-service.rc
@@ -0,0 +1,7 @@
+service android-hardware-media-c2-hal-1-0 /vendor/bin/hw/android.hardware.media.c2@1.0-service
+ class hal
+ user mediacodec
+ group camera mediadrm drmrpc
+ ioprio rt 4
+ writepid /dev/cpuset/foreground/tasks
+
diff --git a/media/codec2/hidl/services/seccomp_policy/codec2.software.base-arm.policy b/media/codec2/hidl/services/seccomp_policy/codec2.software.base-arm.policy
new file mode 100644
index 0000000..d5871d1
--- /dev/null
+++ b/media/codec2/hidl/services/seccomp_policy/codec2.software.base-arm.policy
@@ -0,0 +1,73 @@
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Organized by frequency of systemcall - in descending order for
+# best performance.
+futex: 1
+ioctl: 1
+write: 1
+prctl: 1
+clock_gettime: 1
+getpriority: 1
+read: 1
+close: 1
+writev: 1
+dup: 1
+ppoll: 1
+mmap2: 1
+getrandom: 1
+
+# mremap: Ensure |flags| are (MREMAP_MAYMOVE | MREMAP_FIXED) TODO: Once minijail
+# parser support for '<' is in this needs to be modified to also prevent
+# |old_address| and |new_address| from touching the exception vector page, which
+# on ARM is statically loaded at 0xffff 0000. See
+# http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211h/Babfeega.html
+# for more details.
+mremap: arg3 == 3
+munmap: 1
+mprotect: 1
+madvise: 1
+openat: 1
+sigaltstack: 1
+clone: 1
+setpriority: 1
+getuid32: 1
+fstat64: 1
+fstatfs64: 1
+pread64: 1
+faccessat: 1
+readlinkat: 1
+exit: 1
+rt_sigprocmask: 1
+set_tid_address: 1
+restart_syscall: 1
+exit_group: 1
+rt_sigreturn: 1
+pipe2: 1
+gettimeofday: 1
+sched_yield: 1
+nanosleep: 1
+lseek: 1
+_llseek: 1
+sched_get_priority_max: 1
+sched_get_priority_min: 1
+statfs64: 1
+sched_setscheduler: 1
+fstatat64: 1
+ugetrlimit: 1
+getdents64: 1
+getrandom: 1
+
+@include /system/etc/seccomp_policy/crash_dump.arm.policy
+
diff --git a/media/codec2/hidl/services/seccomp_policy/codec2.software.base-x86.policy b/media/codec2/hidl/services/seccomp_policy/codec2.software.base-x86.policy
new file mode 100644
index 0000000..20c7625
--- /dev/null
+++ b/media/codec2/hidl/services/seccomp_policy/codec2.software.base-x86.policy
@@ -0,0 +1,57 @@
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+read: 1
+mprotect: 1
+prctl: 1
+openat: 1
+getuid32: 1
+writev: 1
+ioctl: 1
+close: 1
+mmap2: 1
+fstat64: 1
+madvise: 1
+fstatat64: 1
+futex: 1
+munmap: 1
+faccessat: 1
+_llseek: 1
+lseek: 1
+clone: 1
+sigaltstack: 1
+setpriority: 1
+restart_syscall: 1
+exit: 1
+exit_group: 1
+rt_sigreturn: 1
+ugetrlimit: 1
+readlinkat: 1
+_llseek: 1
+fstatfs64: 1
+pread64: 1
+mremap: 1
+dup: 1
+set_tid_address: 1
+write: 1
+nanosleep: 1
+
+# Required by AddressSanitizer
+gettid: 1
+sched_yield: 1
+getpid: 1
+gettid: 1
+
+@include /system/etc/seccomp_policy/crash_dump.x86.policy
+
diff --git a/media/codec2/hidl/services/seccomp_policy/codec2.vendor.base-arm.policy b/media/codec2/hidl/services/seccomp_policy/codec2.vendor.base-arm.policy
new file mode 100644
index 0000000..d5871d1
--- /dev/null
+++ b/media/codec2/hidl/services/seccomp_policy/codec2.vendor.base-arm.policy
@@ -0,0 +1,73 @@
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Organized by frequency of systemcall - in descending order for
+# best performance.
+futex: 1
+ioctl: 1
+write: 1
+prctl: 1
+clock_gettime: 1
+getpriority: 1
+read: 1
+close: 1
+writev: 1
+dup: 1
+ppoll: 1
+mmap2: 1
+getrandom: 1
+
+# mremap: Ensure |flags| are (MREMAP_MAYMOVE | MREMAP_FIXED) TODO: Once minijail
+# parser support for '<' is in this needs to be modified to also prevent
+# |old_address| and |new_address| from touching the exception vector page, which
+# on ARM is statically loaded at 0xffff 0000. See
+# http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211h/Babfeega.html
+# for more details.
+mremap: arg3 == 3
+munmap: 1
+mprotect: 1
+madvise: 1
+openat: 1
+sigaltstack: 1
+clone: 1
+setpriority: 1
+getuid32: 1
+fstat64: 1
+fstatfs64: 1
+pread64: 1
+faccessat: 1
+readlinkat: 1
+exit: 1
+rt_sigprocmask: 1
+set_tid_address: 1
+restart_syscall: 1
+exit_group: 1
+rt_sigreturn: 1
+pipe2: 1
+gettimeofday: 1
+sched_yield: 1
+nanosleep: 1
+lseek: 1
+_llseek: 1
+sched_get_priority_max: 1
+sched_get_priority_min: 1
+statfs64: 1
+sched_setscheduler: 1
+fstatat64: 1
+ugetrlimit: 1
+getdents64: 1
+getrandom: 1
+
+@include /system/etc/seccomp_policy/crash_dump.arm.policy
+
diff --git a/media/codec2/hidl/services/seccomp_policy/codec2.vendor.base-x86.policy b/media/codec2/hidl/services/seccomp_policy/codec2.vendor.base-x86.policy
new file mode 100644
index 0000000..20c7625
--- /dev/null
+++ b/media/codec2/hidl/services/seccomp_policy/codec2.vendor.base-x86.policy
@@ -0,0 +1,57 @@
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+read: 1
+mprotect: 1
+prctl: 1
+openat: 1
+getuid32: 1
+writev: 1
+ioctl: 1
+close: 1
+mmap2: 1
+fstat64: 1
+madvise: 1
+fstatat64: 1
+futex: 1
+munmap: 1
+faccessat: 1
+_llseek: 1
+lseek: 1
+clone: 1
+sigaltstack: 1
+setpriority: 1
+restart_syscall: 1
+exit: 1
+exit_group: 1
+rt_sigreturn: 1
+ugetrlimit: 1
+readlinkat: 1
+_llseek: 1
+fstatfs64: 1
+pread64: 1
+mremap: 1
+dup: 1
+set_tid_address: 1
+write: 1
+nanosleep: 1
+
+# Required by AddressSanitizer
+gettid: 1
+sched_yield: 1
+getpid: 1
+gettid: 1
+
+@include /system/etc/seccomp_policy/crash_dump.x86.policy
+
diff --git a/media/codec2/hidl/services/vendor.cpp b/media/codec2/hidl/services/vendor.cpp
new file mode 100644
index 0000000..ef2f98e
--- /dev/null
+++ b/media/codec2/hidl/services/vendor.cpp
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "android.hardware.media.c2@1.0-service"
+
+#include <codec2/hidl/1.0/ComponentStore.h>
+#include <hidl/HidlTransportSupport.h>
+#include <binder/ProcessState.h>
+#include <minijail.h>
+
+#include <C2Component.h>
+
+// OmxStore is added for visibility by dumpstate.
+#include <media/stagefright/omx/1.0/OmxStore.h>
+
+// This is created by module "codec2.vendor.base.policy". This can be modified.
+static constexpr char kBaseSeccompPolicyPath[] =
+ "/vendor/etc/seccomp_policy/codec2.vendor.base.policy";
+
+// Additional device-specific seccomp permissions can be added in this file.
+static constexpr char kExtSeccompPolicyPath[] =
+ "/vendor/etc/seccomp_policy/codec2.vendor.ext.policy";
+
+class DummyC2Store : public C2ComponentStore {
+public:
+ DummyC2Store() = default;
+
+ virtual ~DummyC2Store() override = default;
+
+ virtual C2String getName() const override {
+ return "default";
+ }
+
+ virtual c2_status_t createComponent(
+ C2String /*name*/,
+ std::shared_ptr<C2Component>* const /*component*/) override {
+ return C2_NOT_FOUND;
+ }
+
+ virtual c2_status_t createInterface(
+ C2String /* name */,
+ std::shared_ptr<C2ComponentInterface>* const /* interface */) override {
+ return C2_NOT_FOUND;
+ }
+
+ virtual std::vector<std::shared_ptr<const C2Component::Traits>>
+ listComponents() override {
+ return {};
+ }
+
+ virtual c2_status_t copyBuffer(
+ std::shared_ptr<C2GraphicBuffer> /* src */,
+ std::shared_ptr<C2GraphicBuffer> /* dst */) override {
+ return C2_OMITTED;
+ }
+
+ virtual c2_status_t query_sm(
+ const std::vector<C2Param*>& /* stackParams */,
+ const std::vector<C2Param::Index>& /* heapParamIndices */,
+ std::vector<std::unique_ptr<C2Param>>* const /* heapParams */) const override {
+ return C2_OMITTED;
+ }
+
+ virtual c2_status_t config_sm(
+ const std::vector<C2Param*>& /* params */,
+ std::vector<std::unique_ptr<C2SettingResult>>* const /* failures */) override {
+ return C2_OMITTED;
+ }
+
+ virtual std::shared_ptr<C2ParamReflector> getParamReflector() const override {
+ return nullptr;
+ }
+
+ virtual c2_status_t querySupportedParams_nb(
+ std::vector<std::shared_ptr<C2ParamDescriptor>>* const /* params */) const override {
+ return C2_OMITTED;
+ }
+
+ virtual c2_status_t querySupportedValues_sm(
+ std::vector<C2FieldSupportedValuesQuery>& /* fields */) const override {
+ return C2_OMITTED;
+ }
+};
+
+int main(int /* argc */, char** /* argv */) {
+ ALOGD("android.hardware.media.c2@1.0-service starting...");
+
+ signal(SIGPIPE, SIG_IGN);
+ android::SetUpMinijail(kBaseSeccompPolicyPath, kExtSeccompPolicyPath);
+
+ // vndbinder is needed by BufferQueue.
+ android::ProcessState::initWithDriver("/dev/vndbinder");
+ android::ProcessState::self()->startThreadPool();
+
+ // Extra threads may be needed to handle a stacked IPC sequence that
+ // contains alternating binder and hwbinder calls. (See b/35283480.)
+ android::hardware::configureRpcThreadpool(8, true /* callerWillJoin */);
+
+ // Create IComponentStore service.
+ {
+ using namespace ::android::hardware::media::c2::V1_0;
+ android::sp<IComponentStore> store;
+
+ // Vendor's TODO: Replace this with
+ // store = new utils::ComponentStore(
+ // /* implementation of C2ComponentStore */);
+ ALOGD("Instantiating Codec2's dummy IComponentStore service...");
+ store = new utils::ComponentStore(
+ std::make_shared<DummyC2Store>());
+
+ if (store == nullptr) {
+ ALOGE("Cannot create Codec2's IComponentStore service.");
+ } else {
+ if (store->registerAsService("default") != android::OK) {
+ ALOGE("Cannot register Codec2's "
+ "IComponentStore service.");
+ } else {
+ ALOGI("Codec2's IComponentStore service created.");
+ }
+ }
+ }
+
+ // Register IOmxStore service.
+ {
+ using namespace ::android::hardware::media::omx::V1_0;
+ android::sp<IOmxStore> omxStore = new implementation::OmxStore();
+ if (omxStore == nullptr) {
+ ALOGE("Cannot create IOmxStore HAL service.");
+ } else if (omxStore->registerAsService() != android::OK) {
+ ALOGE("Cannot register IOmxStore HAL service.");
+ }
+ }
+
+ android::hardware::joinRpcThreadpool();
+ return 0;
+}
diff --git a/media/codec2/sfplugin/Android.bp b/media/codec2/sfplugin/Android.bp
new file mode 100644
index 0000000..f5578726
--- /dev/null
+++ b/media/codec2/sfplugin/Android.bp
@@ -0,0 +1,61 @@
+cc_library_shared {
+ name: "libsfplugin_ccodec",
+
+ srcs: [
+ "C2OMXNode.cpp",
+ "CCodec.cpp",
+ "CCodecBufferChannel.cpp",
+ "CCodecConfig.cpp",
+ "Codec2Buffer.cpp",
+ "Codec2InfoBuilder.cpp",
+ "ReflectedParamUpdater.cpp",
+ "SkipCutBuffer.cpp",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+
+ header_libs: [
+ "libcodec2_internal",
+ ],
+
+ shared_libs: [
+ "android.hardware.cas.native@1.0",
+ "android.hardware.graphics.bufferqueue@1.0",
+ "android.hardware.media.c2@1.0",
+ "android.hardware.media.omx@1.0",
+ "libbase",
+ "libbinder",
+ "libcodec2",
+ "libcodec2_client",
+ "libcodec2_vndk",
+ "libcutils",
+ "libgui",
+ "libhidlallocatorutils",
+ "libhidlbase",
+ "liblog",
+ "libmedia",
+ "libmedia_omx",
+ "libsfplugin_ccodec_utils",
+ "libstagefright_bufferqueue_helper",
+ "libstagefright_codecbase",
+ "libstagefright_foundation",
+ "libstagefright_omx_utils",
+ "libstagefright_xmlparser",
+ "libui",
+ "libutils",
+ ],
+
+ sanitize: {
+ cfi: true,
+ misc_undefined: [
+ "unsigned-integer-overflow",
+ "signed-integer-overflow",
+ ],
+ diag: {
+ cfi: true,
+ },
+ },
+}
diff --git a/media/codec2/sfplugin/C2OMXNode.cpp b/media/codec2/sfplugin/C2OMXNode.cpp
new file mode 100644
index 0000000..749fd7a
--- /dev/null
+++ b/media/codec2/sfplugin/C2OMXNode.cpp
@@ -0,0 +1,329 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef __LP64__
+#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS
+#endif
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2OMXNode"
+#include <log/log.h>
+
+#include <C2AllocatorGralloc.h>
+#include <C2BlockInternal.h>
+#include <C2Component.h>
+#include <C2PlatformSupport.h>
+
+#include <OMX_Component.h>
+#include <OMX_Index.h>
+#include <OMX_IndexExt.h>
+
+#include <media/stagefright/omx/OMXUtils.h>
+#include <media/stagefright/MediaErrors.h>
+#include <ui/Fence.h>
+#include <ui/GraphicBuffer.h>
+
+#include "C2OMXNode.h"
+
+namespace android {
+
+namespace {
+
+class Buffer2D : public C2Buffer {
+public:
+ explicit Buffer2D(C2ConstGraphicBlock block) : C2Buffer({ block }) {}
+};
+
+} // namespace
+
+C2OMXNode::C2OMXNode(const std::shared_ptr<Codec2Client::Component> &comp)
+ : mComp(comp), mFrameIndex(0), mWidth(0), mHeight(0),
+ mAdjustTimestampGapUs(0), mFirstInputFrame(true) {
+ // TODO: read from intf()
+ if (!strncmp(comp->getName().c_str(), "c2.android.", 11)) {
+ mUsage = GRALLOC_USAGE_SW_READ_OFTEN;
+ } else {
+ mUsage = GRALLOC_USAGE_HW_VIDEO_ENCODER;
+ }
+}
+
+status_t C2OMXNode::freeNode() {
+ mComp.reset();
+ return OK;
+}
+
+status_t C2OMXNode::sendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param) {
+ if (cmd == OMX_CommandStateSet && param == OMX_StateLoaded) {
+ // Reset first input frame so if C2OMXNode is recycled, the timestamp does not become
+ // negative. This is a workaround for HW codecs that do not handle timestamp rollover.
+ mFirstInputFrame = true;
+ }
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::getParameter(OMX_INDEXTYPE index, void *params, size_t size) {
+ status_t err = ERROR_UNSUPPORTED;
+ switch ((uint32_t)index) {
+ case OMX_IndexParamConsumerUsageBits: {
+ OMX_U32 *usage = (OMX_U32 *)params;
+ *usage = mUsage;
+ err = OK;
+ break;
+ }
+ case OMX_IndexParamPortDefinition: {
+ if (size < sizeof(OMX_PARAM_PORTDEFINITIONTYPE)) {
+ return BAD_VALUE;
+ }
+ OMX_PARAM_PORTDEFINITIONTYPE *pDef = (OMX_PARAM_PORTDEFINITIONTYPE *)params;
+ // TODO: read these from intf()
+ pDef->nBufferCountActual = 16;
+ pDef->eDomain = OMX_PortDomainVideo;
+ pDef->format.video.nFrameWidth = mWidth;
+ pDef->format.video.nFrameHeight = mHeight;
+ err = OK;
+ break;
+ }
+ default:
+ break;
+ }
+ return err;
+}
+
+status_t C2OMXNode::setParameter(OMX_INDEXTYPE index, const void *params, size_t size) {
+ // handle max/fixed frame duration control
+ if (index == (OMX_INDEXTYPE)OMX_IndexParamMaxFrameDurationForBitrateControl
+ && params != NULL
+ && size == sizeof(OMX_PARAM_U32TYPE)) {
+ // The incoming number is an int32_t contained in OMX_U32.
+ mAdjustTimestampGapUs = (int32_t)((OMX_PARAM_U32TYPE*)params)->nU32;
+ return OK;
+ }
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::getConfig(OMX_INDEXTYPE index, void *config, size_t size) {
+ (void)index;
+ (void)config;
+ (void)size;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::setConfig(OMX_INDEXTYPE index, const void *config, size_t size) {
+ (void)index;
+ (void)config;
+ (void)size;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::setPortMode(OMX_U32 portIndex, IOMX::PortMode mode) {
+ (void)portIndex;
+ (void)mode;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::prepareForAdaptivePlayback(
+ OMX_U32 portIndex, OMX_BOOL enable,
+ OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) {
+ (void)portIndex;
+ (void)enable;
+ (void)maxFrameWidth;
+ (void)maxFrameHeight;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::configureVideoTunnelMode(
+ OMX_U32 portIndex, OMX_BOOL tunneled,
+ OMX_U32 audioHwSync, native_handle_t **sidebandHandle) {
+ (void)portIndex;
+ (void)tunneled;
+ (void)audioHwSync;
+ *sidebandHandle = nullptr;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::getGraphicBufferUsage(OMX_U32 portIndex, OMX_U32* usage) {
+ (void)portIndex;
+ *usage = 0;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::setInputSurface(const sp<IOMXBufferSource> &bufferSource) {
+ c2_status_t err = GetCodec2PlatformAllocatorStore()->fetchAllocator(
+ C2PlatformAllocatorStore::GRALLOC,
+ &mAllocator);
+ if (err != OK) {
+ return UNKNOWN_ERROR;
+ }
+ mBufferSource = bufferSource;
+ return OK;
+}
+
+status_t C2OMXNode::allocateSecureBuffer(
+ OMX_U32 portIndex, size_t size, buffer_id *buffer,
+ void **bufferData, sp<NativeHandle> *nativeHandle) {
+ (void)portIndex;
+ (void)size;
+ (void)nativeHandle;
+ *buffer = 0;
+ *bufferData = nullptr;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::useBuffer(
+ OMX_U32 portIndex, const OMXBuffer &omxBuf, buffer_id *buffer) {
+ (void)portIndex;
+ (void)omxBuf;
+ *buffer = 0;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::freeBuffer(OMX_U32 portIndex, buffer_id buffer) {
+ (void)portIndex;
+ (void)buffer;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::fillBuffer(
+ buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd) {
+ (void)buffer;
+ (void)omxBuf;
+ (void)fenceFd;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::emptyBuffer(
+ buffer_id buffer, const OMXBuffer &omxBuf,
+ OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
+ // TODO: better fence handling
+ if (fenceFd >= 0) {
+ sp<Fence> fence = new Fence(fenceFd);
+ fence->waitForever(LOG_TAG);
+ }
+ std::shared_ptr<Codec2Client::Component> comp = mComp.lock();
+ if (!comp) {
+ return NO_INIT;
+ }
+
+ uint32_t c2Flags = (flags & OMX_BUFFERFLAG_EOS)
+ ? C2FrameData::FLAG_END_OF_STREAM : 0;
+ std::shared_ptr<C2GraphicBlock> block;
+
+ C2Handle *handle = nullptr;
+ if (omxBuf.mBufferType == OMXBuffer::kBufferTypeANWBuffer
+ && omxBuf.mGraphicBuffer != nullptr) {
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ handle = WrapNativeCodec2GrallocHandle(
+ native_handle_clone(omxBuf.mGraphicBuffer->handle),
+ omxBuf.mGraphicBuffer->width,
+ omxBuf.mGraphicBuffer->height,
+ omxBuf.mGraphicBuffer->format,
+ omxBuf.mGraphicBuffer->usage,
+ omxBuf.mGraphicBuffer->stride);
+ c2_status_t err = mAllocator->priorGraphicAllocation(handle, &alloc);
+ if (err != OK) {
+ return UNKNOWN_ERROR;
+ }
+ block = _C2BlockFactory::CreateGraphicBlock(alloc);
+ } else if (!(flags & OMX_BUFFERFLAG_EOS)) {
+ return BAD_VALUE;
+ }
+
+ std::unique_ptr<C2Work> work(new C2Work);
+ work->input.flags = (C2FrameData::flags_t)c2Flags;
+ work->input.ordinal.timestamp = timestamp;
+
+ // WORKAROUND: adjust timestamp based on gapUs
+ {
+ work->input.ordinal.customOrdinal = timestamp; // save input timestamp
+ if (mFirstInputFrame) {
+ // grab timestamps on first frame
+ mPrevInputTimestamp = timestamp;
+ mPrevCodecTimestamp = timestamp;
+ mFirstInputFrame = false;
+ } else if (mAdjustTimestampGapUs > 0) {
+ work->input.ordinal.timestamp =
+ mPrevCodecTimestamp
+ + c2_min((timestamp - mPrevInputTimestamp).peek(), mAdjustTimestampGapUs);
+ } else if (mAdjustTimestampGapUs < 0) {
+ work->input.ordinal.timestamp = mPrevCodecTimestamp - mAdjustTimestampGapUs;
+ }
+ mPrevInputTimestamp = work->input.ordinal.customOrdinal;
+ mPrevCodecTimestamp = work->input.ordinal.timestamp;
+ ALOGV("adjusting %lld to %lld (gap=%lld)",
+ work->input.ordinal.customOrdinal.peekll(),
+ work->input.ordinal.timestamp.peekll(),
+ (long long)mAdjustTimestampGapUs);
+ }
+
+ work->input.ordinal.frameIndex = mFrameIndex++;
+ work->input.buffers.clear();
+ if (block) {
+ std::shared_ptr<C2Buffer> c2Buffer(
+ // TODO: fence
+ new Buffer2D(block->share(
+ C2Rect(block->width(), block->height()), ::C2Fence())),
+ [buffer, source = getSource()](C2Buffer *ptr) {
+ delete ptr;
+ // TODO: fence
+ (void)source->onInputBufferEmptied(buffer, -1);
+ });
+ work->input.buffers.push_back(c2Buffer);
+ }
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+
+ c2_status_t err = comp->queue(&items);
+ if (err != C2_OK) {
+ return UNKNOWN_ERROR;
+ }
+
+ return OK;
+}
+
+status_t C2OMXNode::getExtensionIndex(
+ const char *parameterName, OMX_INDEXTYPE *index) {
+ (void)parameterName;
+ *index = OMX_IndexMax;
+ return ERROR_UNSUPPORTED;
+}
+
+status_t C2OMXNode::dispatchMessage(const omx_message& msg) {
+ if (msg.type != omx_message::EVENT) {
+ return ERROR_UNSUPPORTED;
+ }
+ if (msg.u.event_data.event != OMX_EventDataSpaceChanged) {
+ return ERROR_UNSUPPORTED;
+ }
+ android_dataspace dataSpace = (android_dataspace)msg.u.event_data.data1;
+ uint32_t pixelFormat = msg.u.event_data.data3;
+
+ // TODO: set dataspace on component to see if it impacts color aspects
+ ALOGD("dataspace changed to %#x pixel format: %#x", dataSpace, pixelFormat);
+ return OK;
+}
+
+sp<IOMXBufferSource> C2OMXNode::getSource() {
+ return mBufferSource;
+}
+
+void C2OMXNode::setFrameSize(uint32_t width, uint32_t height) {
+ mWidth = width;
+ mHeight = height;
+}
+
+} // namespace android
diff --git a/media/codec2/sfplugin/C2OMXNode.h b/media/codec2/sfplugin/C2OMXNode.h
new file mode 100644
index 0000000..b5a815e
--- /dev/null
+++ b/media/codec2/sfplugin/C2OMXNode.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2_OMX_NODE_H_
+#define C2_OMX_NODE_H_
+
+#include <atomic>
+
+#include <android/IOMXBufferSource.h>
+#include <media/IOMX.h>
+#include <media/OMXBuffer.h>
+#include <codec2/hidl/client.h>
+
+namespace android {
+
+/**
+ * IOmxNode implementation around codec 2.0 component, only to be used in
+ * IGraphicBufferSource::configure. Only subset of IOmxNode API is implemented
+ * and others are left as stub. As a result, one cannot expect this IOmxNode
+ * to work in any other usage than IGraphicBufferSource.
+ */
+struct C2OMXNode : public BnOMXNode {
+ explicit C2OMXNode(const std::shared_ptr<Codec2Client::Component> &comp);
+ ~C2OMXNode() override = default;
+
+ // IOMXNode
+ status_t freeNode() override;
+ status_t sendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param) override;
+ status_t getParameter(
+ OMX_INDEXTYPE index, void *params, size_t size) override;
+ status_t setParameter(
+ OMX_INDEXTYPE index, const void *params, size_t size) override;
+ status_t getConfig(
+ OMX_INDEXTYPE index, void *params, size_t size) override;
+ status_t setConfig(
+ OMX_INDEXTYPE index, const void *params, size_t size) override;
+ status_t setPortMode(OMX_U32 port_index, IOMX::PortMode mode) override;
+ status_t prepareForAdaptivePlayback(
+ OMX_U32 portIndex, OMX_BOOL enable,
+ OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) override;
+ status_t configureVideoTunnelMode(
+ OMX_U32 portIndex, OMX_BOOL tunneled,
+ OMX_U32 audioHwSync, native_handle_t **sidebandHandle) override;
+ status_t getGraphicBufferUsage(
+ OMX_U32 port_index, OMX_U32* usage) override;
+ status_t setInputSurface(
+ const sp<IOMXBufferSource> &bufferSource) override;
+ status_t allocateSecureBuffer(
+ OMX_U32 port_index, size_t size, buffer_id *buffer,
+ void **buffer_data, sp<NativeHandle> *native_handle) override;
+ status_t useBuffer(
+ OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) override;
+ status_t freeBuffer(
+ OMX_U32 port_index, buffer_id buffer) override;
+ status_t fillBuffer(
+ buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd) override;
+ status_t emptyBuffer(
+ buffer_id buffer, const OMXBuffer &omxBuf,
+ OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) override;
+ status_t getExtensionIndex(
+ const char *parameter_name,
+ OMX_INDEXTYPE *index) override;
+ status_t dispatchMessage(const omx_message &msg) override;
+
+ sp<IOMXBufferSource> getSource();
+ void setFrameSize(uint32_t width, uint32_t height);
+
+private:
+ std::weak_ptr<Codec2Client::Component> mComp;
+ sp<IOMXBufferSource> mBufferSource;
+ std::shared_ptr<C2Allocator> mAllocator;
+ std::atomic_uint64_t mFrameIndex;
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint64_t mUsage;
+
+ // WORKAROUND: timestamp adjustment
+
+ // if >0: this is the max timestamp gap, if <0: this is -1 times the fixed timestamp gap
+ // if 0: no timestamp adjustment is made
+ // note that C2OMXNode can be recycled between encoding sessions.
+ int32_t mAdjustTimestampGapUs;
+ bool mFirstInputFrame; // true for first input
+ c2_cntr64_t mPrevInputTimestamp; // input timestamp for previous frame
+ c2_cntr64_t mPrevCodecTimestamp; // adjusted (codec) timestamp for previous frame
+};
+
+} // namespace android
+
+#endif // C2_OMX_NODE_H_
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
new file mode 100644
index 0000000..f903bbb
--- /dev/null
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -0,0 +1,1746 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "CCodec"
+#include <utils/Log.h>
+
+#include <sstream>
+#include <thread>
+
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2ParamInternal.h>
+#include <C2PlatformSupport.h>
+
+#include <android/IGraphicBufferSource.h>
+#include <android/IOMXBufferSource.h>
+#include <android/hardware/media/omx/1.0/IGraphicBufferSource.h>
+#include <android/hardware/media/omx/1.0/IOmx.h>
+#include <android-base/stringprintf.h>
+#include <cutils/properties.h>
+#include <gui/IGraphicBufferProducer.h>
+#include <gui/Surface.h>
+#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
+#include <media/omx/1.0/WGraphicBufferSource.h>
+#include <media/openmax/OMX_IndexExt.h>
+#include <media/stagefright/BufferProducerWrapper.h>
+#include <media/stagefright/MediaCodecConstants.h>
+#include <media/stagefright/PersistentSurface.h>
+#include <media/stagefright/codec2/1.0/InputSurface.h>
+
+#include "C2OMXNode.h"
+#include "CCodec.h"
+#include "CCodecBufferChannel.h"
+#include "InputSurfaceWrapper.h"
+
+extern "C" android::PersistentSurface *CreateInputSurface();
+
+namespace android {
+
+using namespace std::chrono_literals;
+using ::android::hardware::graphics::bufferqueue::V1_0::utils::H2BGraphicBufferProducer;
+using android::base::StringPrintf;
+using BGraphicBufferSource = ::android::IGraphicBufferSource;
+using ::android::hardware::media::c2::V1_0::IInputSurface;
+
+namespace {
+
+class CCodecWatchdog : public AHandler {
+private:
+ enum {
+ kWhatWatch,
+ };
+ constexpr static int64_t kWatchIntervalUs = 3300000; // 3.3 secs
+
+public:
+ static sp<CCodecWatchdog> getInstance() {
+ static sp<CCodecWatchdog> instance(new CCodecWatchdog);
+ static std::once_flag flag;
+ // Call Init() only once.
+ std::call_once(flag, Init, instance);
+ return instance;
+ }
+
+ ~CCodecWatchdog() = default;
+
+ void watch(sp<CCodec> codec) {
+ bool shouldPost = false;
+ {
+ Mutexed<std::set<wp<CCodec>>>::Locked codecs(mCodecsToWatch);
+ // If a watch message is in flight, piggy-back this instance as well.
+ // Otherwise, post a new watch message.
+ shouldPost = codecs->empty();
+ codecs->emplace(codec);
+ }
+ if (shouldPost) {
+ ALOGV("posting watch message");
+ (new AMessage(kWhatWatch, this))->post(kWatchIntervalUs);
+ }
+ }
+
+protected:
+ void onMessageReceived(const sp<AMessage> &msg) {
+ switch (msg->what()) {
+ case kWhatWatch: {
+ Mutexed<std::set<wp<CCodec>>>::Locked codecs(mCodecsToWatch);
+ ALOGV("watch for %zu codecs", codecs->size());
+ for (auto it = codecs->begin(); it != codecs->end(); ++it) {
+ sp<CCodec> codec = it->promote();
+ if (codec == nullptr) {
+ continue;
+ }
+ codec->initiateReleaseIfStuck();
+ }
+ codecs->clear();
+ break;
+ }
+
+ default: {
+ TRESPASS("CCodecWatchdog: unrecognized message");
+ }
+ }
+ }
+
+private:
+ CCodecWatchdog() : mLooper(new ALooper) {}
+
+ static void Init(const sp<CCodecWatchdog> &thiz) {
+ ALOGV("Init");
+ thiz->mLooper->setName("CCodecWatchdog");
+ thiz->mLooper->registerHandler(thiz);
+ thiz->mLooper->start();
+ }
+
+ sp<ALooper> mLooper;
+
+ Mutexed<std::set<wp<CCodec>>> mCodecsToWatch;
+};
+
+class C2InputSurfaceWrapper : public InputSurfaceWrapper {
+public:
+ explicit C2InputSurfaceWrapper(
+ const std::shared_ptr<Codec2Client::InputSurface> &surface) :
+ mSurface(surface) {
+ }
+
+ ~C2InputSurfaceWrapper() override = default;
+
+ status_t connect(const std::shared_ptr<Codec2Client::Component> &comp) override {
+ if (mConnection != nullptr) {
+ return ALREADY_EXISTS;
+ }
+ return toStatusT(mSurface->connectToComponent(comp, &mConnection),
+ C2_OPERATION_InputSurface_connectToComponent);
+ }
+
+ void disconnect() override {
+ if (mConnection != nullptr) {
+ mConnection->disconnect();
+ mConnection = nullptr;
+ }
+ }
+
+ status_t start() override {
+ // InputSurface does not distinguish started state
+ return OK;
+ }
+
+ status_t signalEndOfInputStream() override {
+ C2InputSurfaceEosTuning eos(true);
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = mSurface->getConfigurable()->config({&eos}, C2_MAY_BLOCK, &failures);
+ if (err != C2_OK) {
+ return UNKNOWN_ERROR;
+ }
+ return OK;
+ }
+
+ status_t configure(Config &config __unused) {
+ // TODO
+ return OK;
+ }
+
+private:
+ std::shared_ptr<Codec2Client::InputSurface> mSurface;
+ std::shared_ptr<Codec2Client::InputSurfaceConnection> mConnection;
+};
+
+class GraphicBufferSourceWrapper : public InputSurfaceWrapper {
+public:
+// explicit GraphicBufferSourceWrapper(const sp<BGraphicBufferSource> &source) : mSource(source) {}
+ GraphicBufferSourceWrapper(
+ const sp<BGraphicBufferSource> &source,
+ uint32_t width,
+ uint32_t height)
+ : mSource(source), mWidth(width), mHeight(height) {
+ mDataSpace = HAL_DATASPACE_BT709;
+ }
+ ~GraphicBufferSourceWrapper() override = default;
+
+ status_t connect(const std::shared_ptr<Codec2Client::Component> &comp) override {
+ mNode = new C2OMXNode(comp);
+ mNode->setFrameSize(mWidth, mHeight);
+
+ // NOTE: we do not use/pass through color aspects from GraphicBufferSource as we
+ // communicate that directly to the component.
+ mSource->configure(mNode, mDataSpace);
+ return OK;
+ }
+
+ void disconnect() override {
+ if (mNode == nullptr) {
+ return;
+ }
+ sp<IOMXBufferSource> source = mNode->getSource();
+ if (source == nullptr) {
+ ALOGD("GBSWrapper::disconnect: node is not configured with OMXBufferSource.");
+ return;
+ }
+ source->onOmxIdle();
+ source->onOmxLoaded();
+ mNode.clear();
+ }
+
+ status_t GetStatus(const binder::Status &status) {
+ status_t err = OK;
+ if (!status.isOk()) {
+ err = status.serviceSpecificErrorCode();
+ if (err == OK) {
+ err = status.transactionError();
+ if (err == OK) {
+ // binder status failed, but there is no servie or transaction error
+ err = UNKNOWN_ERROR;
+ }
+ }
+ }
+ return err;
+ }
+
+ status_t start() override {
+ sp<IOMXBufferSource> source = mNode->getSource();
+ if (source == nullptr) {
+ return NO_INIT;
+ }
+ constexpr size_t kNumSlots = 16;
+ for (size_t i = 0; i < kNumSlots; ++i) {
+ source->onInputBufferAdded(i);
+ }
+
+ source->onOmxExecuting();
+ return OK;
+ }
+
+ status_t signalEndOfInputStream() override {
+ return GetStatus(mSource->signalEndOfInputStream());
+ }
+
+ status_t configure(Config &config) {
+ std::stringstream status;
+ status_t err = OK;
+
+ // handle each configuration granually, in case we need to handle part of the configuration
+ // elsewhere
+
+ // TRICKY: we do not unset frame delay repeating
+ if (config.mMinFps > 0 && config.mMinFps != mConfig.mMinFps) {
+ int64_t us = 1e6 / config.mMinFps + 0.5;
+ status_t res = GetStatus(mSource->setRepeatPreviousFrameDelayUs(us));
+ status << " minFps=" << config.mMinFps << " => repeatDelayUs=" << us;
+ if (res != OK) {
+ status << " (=> " << asString(res) << ")";
+ err = res;
+ }
+ mConfig.mMinFps = config.mMinFps;
+ }
+
+ // pts gap
+ if (config.mMinAdjustedFps > 0 || config.mFixedAdjustedFps > 0) {
+ if (mNode != nullptr) {
+ OMX_PARAM_U32TYPE ptrGapParam = {};
+ ptrGapParam.nSize = sizeof(OMX_PARAM_U32TYPE);
+ ptrGapParam.nU32 = (config.mMinAdjustedFps > 0)
+ ? c2_min(INT32_MAX + 0., 1e6 / config.mMinAdjustedFps + 0.5)
+ : c2_max(0. - INT32_MAX, -1e6 / config.mFixedAdjustedFps - 0.5);
+ (void)mNode->setParameter(
+ (OMX_INDEXTYPE)OMX_IndexParamMaxFrameDurationForBitrateControl,
+ &ptrGapParam, sizeof(ptrGapParam));
+ }
+ }
+
+ // max fps
+ // TRICKY: we do not unset max fps to 0 unless using fixed fps
+ if ((config.mMaxFps > 0 || (config.mFixedAdjustedFps > 0 && config.mMaxFps == 0))
+ && config.mMaxFps != mConfig.mMaxFps) {
+ status_t res = GetStatus(mSource->setMaxFps(config.mMaxFps));
+ status << " maxFps=" << config.mMaxFps;
+ if (res != OK) {
+ status << " (=> " << asString(res) << ")";
+ err = res;
+ }
+ mConfig.mMaxFps = config.mMaxFps;
+ }
+
+ if (config.mTimeOffsetUs != mConfig.mTimeOffsetUs) {
+ status_t res = GetStatus(mSource->setTimeOffsetUs(config.mTimeOffsetUs));
+ status << " timeOffset " << config.mTimeOffsetUs << "us";
+ if (res != OK) {
+ status << " (=> " << asString(res) << ")";
+ err = res;
+ }
+ mConfig.mTimeOffsetUs = config.mTimeOffsetUs;
+ }
+
+ if (config.mCaptureFps != mConfig.mCaptureFps || config.mCodedFps != mConfig.mCodedFps) {
+ status_t res =
+ GetStatus(mSource->setTimeLapseConfig(config.mCodedFps, config.mCaptureFps));
+ status << " timeLapse " << config.mCaptureFps << "fps as " << config.mCodedFps << "fps";
+ if (res != OK) {
+ status << " (=> " << asString(res) << ")";
+ err = res;
+ }
+ mConfig.mCaptureFps = config.mCaptureFps;
+ mConfig.mCodedFps = config.mCodedFps;
+ }
+
+ if (config.mStartAtUs != mConfig.mStartAtUs
+ || (config.mStopped != mConfig.mStopped && !config.mStopped)) {
+ status_t res = GetStatus(mSource->setStartTimeUs(config.mStartAtUs));
+ status << " start at " << config.mStartAtUs << "us";
+ if (res != OK) {
+ status << " (=> " << asString(res) << ")";
+ err = res;
+ }
+ mConfig.mStartAtUs = config.mStartAtUs;
+ mConfig.mStopped = config.mStopped;
+ }
+
+ // suspend-resume
+ if (config.mSuspended != mConfig.mSuspended) {
+ status_t res = GetStatus(mSource->setSuspend(config.mSuspended, config.mSuspendAtUs));
+ status << " " << (config.mSuspended ? "suspend" : "resume")
+ << " at " << config.mSuspendAtUs << "us";
+ if (res != OK) {
+ status << " (=> " << asString(res) << ")";
+ err = res;
+ }
+ mConfig.mSuspended = config.mSuspended;
+ mConfig.mSuspendAtUs = config.mSuspendAtUs;
+ }
+
+ if (config.mStopped != mConfig.mStopped && config.mStopped) {
+ status_t res = GetStatus(mSource->setStopTimeUs(config.mStopAtUs));
+ status << " stop at " << config.mStopAtUs << "us";
+ if (res != OK) {
+ status << " (=> " << asString(res) << ")";
+ err = res;
+ } else {
+ status << " delayUs";
+ res = GetStatus(mSource->getStopTimeOffsetUs(&config.mInputDelayUs));
+ if (res != OK) {
+ status << " (=> " << asString(res) << ")";
+ } else {
+ status << "=" << config.mInputDelayUs << "us";
+ }
+ mConfig.mInputDelayUs = config.mInputDelayUs;
+ }
+ mConfig.mStopAtUs = config.mStopAtUs;
+ mConfig.mStopped = config.mStopped;
+ }
+
+ // color aspects (android._color-aspects)
+
+ // consumer usage
+ ALOGD("ISConfig%s", status.str().c_str());
+ return err;
+ }
+
+private:
+ sp<BGraphicBufferSource> mSource;
+ sp<C2OMXNode> mNode;
+ uint32_t mWidth;
+ uint32_t mHeight;
+ Config mConfig;
+};
+
+class Codec2ClientInterfaceWrapper : public C2ComponentStore {
+ std::shared_ptr<Codec2Client> mClient;
+
+public:
+ Codec2ClientInterfaceWrapper(std::shared_ptr<Codec2Client> client)
+ : mClient(client) { }
+
+ virtual ~Codec2ClientInterfaceWrapper() = default;
+
+ virtual c2_status_t config_sm(
+ const std::vector<C2Param *> ¶ms,
+ std::vector<std::unique_ptr<C2SettingResult>> *const failures) {
+ return mClient->config(params, C2_MAY_BLOCK, failures);
+ };
+
+ virtual c2_status_t copyBuffer(
+ std::shared_ptr<C2GraphicBuffer>,
+ std::shared_ptr<C2GraphicBuffer>) {
+ return C2_OMITTED;
+ }
+
+ virtual c2_status_t createComponent(
+ C2String, std::shared_ptr<C2Component> *const component) {
+ component->reset();
+ return C2_OMITTED;
+ }
+
+ virtual c2_status_t createInterface(
+ C2String, std::shared_ptr<C2ComponentInterface> *const interface) {
+ interface->reset();
+ return C2_OMITTED;
+ }
+
+ virtual c2_status_t query_sm(
+ const std::vector<C2Param *> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ std::vector<std::unique_ptr<C2Param>> *const heapParams) const {
+ return mClient->query(stackParams, heapParamIndices, C2_MAY_BLOCK, heapParams);
+ }
+
+ virtual c2_status_t querySupportedParams_nb(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const {
+ return mClient->querySupportedParams(params);
+ }
+
+ virtual c2_status_t querySupportedValues_sm(
+ std::vector<C2FieldSupportedValuesQuery> &fields) const {
+ return mClient->querySupportedValues(fields, C2_MAY_BLOCK);
+ }
+
+ virtual C2String getName() const {
+ return mClient->getName();
+ }
+
+ virtual std::shared_ptr<C2ParamReflector> getParamReflector() const {
+ return mClient->getParamReflector();
+ }
+
+ virtual std::vector<std::shared_ptr<const C2Component::Traits>> listComponents() {
+ return std::vector<std::shared_ptr<const C2Component::Traits>>();
+ }
+};
+
+} // namespace
+
+// CCodec::ClientListener
+
+struct CCodec::ClientListener : public Codec2Client::Listener {
+
+ explicit ClientListener(const wp<CCodec> &codec) : mCodec(codec) {}
+
+ virtual void onWorkDone(
+ const std::weak_ptr<Codec2Client::Component>& component,
+ std::list<std::unique_ptr<C2Work>>& workItems,
+ size_t numDiscardedInputBuffers) override {
+ (void)component;
+ sp<CCodec> codec(mCodec.promote());
+ if (!codec) {
+ return;
+ }
+ codec->onWorkDone(workItems, numDiscardedInputBuffers);
+ }
+
+ virtual void onTripped(
+ const std::weak_ptr<Codec2Client::Component>& component,
+ const std::vector<std::shared_ptr<C2SettingResult>>& settingResult
+ ) override {
+ // TODO
+ (void)component;
+ (void)settingResult;
+ }
+
+ virtual void onError(
+ const std::weak_ptr<Codec2Client::Component>& component,
+ uint32_t errorCode) override {
+ // TODO
+ (void)component;
+ (void)errorCode;
+ }
+
+ virtual void onDeath(
+ const std::weak_ptr<Codec2Client::Component>& component) override {
+ { // Log the death of the component.
+ std::shared_ptr<Codec2Client::Component> comp = component.lock();
+ if (!comp) {
+ ALOGE("Codec2 component died.");
+ } else {
+ ALOGE("Codec2 component \"%s\" died.", comp->getName().c_str());
+ }
+ }
+
+ // Report to MediaCodec.
+ sp<CCodec> codec(mCodec.promote());
+ if (!codec || !codec->mCallback) {
+ return;
+ }
+ codec->mCallback->onError(DEAD_OBJECT, ACTION_CODE_FATAL);
+ }
+
+ virtual void onFramesRendered(
+ const std::vector<RenderedFrame>& renderedFrames) override {
+ // TODO
+ (void)renderedFrames;
+ }
+
+ virtual void onInputBufferDone(
+ const std::shared_ptr<C2Buffer>& buffer) override {
+ sp<CCodec> codec(mCodec.promote());
+ if (codec) {
+ codec->onInputBufferDone(buffer);
+ }
+ }
+
+private:
+ wp<CCodec> mCodec;
+};
+
+// CCodecCallbackImpl
+
+class CCodecCallbackImpl : public CCodecCallback {
+public:
+ explicit CCodecCallbackImpl(CCodec *codec) : mCodec(codec) {}
+ ~CCodecCallbackImpl() override = default;
+
+ void onError(status_t err, enum ActionCode actionCode) override {
+ mCodec->mCallback->onError(err, actionCode);
+ }
+
+ void onOutputFramesRendered(int64_t mediaTimeUs, nsecs_t renderTimeNs) override {
+ mCodec->mCallback->onOutputFramesRendered(
+ {RenderedFrameInfo(mediaTimeUs, renderTimeNs)});
+ }
+
+ void onWorkQueued(bool eos) override {
+ mCodec->onWorkQueued(eos);
+ }
+
+ void onOutputBuffersChanged() override {
+ mCodec->mCallback->onOutputBuffersChanged();
+ }
+
+private:
+ CCodec *mCodec;
+};
+
+// CCodec
+
+CCodec::CCodec()
+ : mChannel(new CCodecBufferChannel(std::make_shared<CCodecCallbackImpl>(this))),
+ mQueuedWorkCount(0) {
+}
+
+CCodec::~CCodec() {
+}
+
+std::shared_ptr<BufferChannelBase> CCodec::getBufferChannel() {
+ return mChannel;
+}
+
+status_t CCodec::tryAndReportOnError(std::function<status_t()> job) {
+ status_t err = job();
+ if (err != C2_OK) {
+ mCallback->onError(err, ACTION_CODE_FATAL);
+ }
+ return err;
+}
+
+void CCodec::initiateAllocateComponent(const sp<AMessage> &msg) {
+ auto setAllocating = [this] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != RELEASED) {
+ return INVALID_OPERATION;
+ }
+ state->set(ALLOCATING);
+ return OK;
+ };
+ if (tryAndReportOnError(setAllocating) != OK) {
+ return;
+ }
+
+ sp<RefBase> codecInfo;
+ CHECK(msg->findObject("codecInfo", &codecInfo));
+ // For Codec 2.0 components, componentName == codecInfo->getCodecName().
+
+ sp<AMessage> allocMsg(new AMessage(kWhatAllocate, this));
+ allocMsg->setObject("codecInfo", codecInfo);
+ allocMsg->post();
+}
+
+void CCodec::allocate(const sp<MediaCodecInfo> &codecInfo) {
+ if (codecInfo == nullptr) {
+ mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ return;
+ }
+ ALOGD("allocate(%s)", codecInfo->getCodecName());
+ mClientListener.reset(new ClientListener(this));
+
+ AString componentName = codecInfo->getCodecName();
+ std::shared_ptr<Codec2Client> client;
+
+ // set up preferred component store to access vendor store parameters
+ client = Codec2Client::CreateFromService("default", false);
+ if (client) {
+ ALOGI("setting up '%s' as default (vendor) store", client->getInstanceName().c_str());
+ SetPreferredCodec2ComponentStore(
+ std::make_shared<Codec2ClientInterfaceWrapper>(client));
+ }
+
+ std::shared_ptr<Codec2Client::Component> comp =
+ Codec2Client::CreateComponentByName(
+ componentName.c_str(),
+ mClientListener,
+ &client);
+ if (!comp) {
+ ALOGE("Failed Create component: %s", componentName.c_str());
+ Mutexed<State>::Locked state(mState);
+ state->set(RELEASED);
+ state.unlock();
+ mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ state.lock();
+ return;
+ }
+ ALOGI("Created component [%s]", componentName.c_str());
+ mChannel->setComponent(comp);
+ auto setAllocated = [this, comp, client] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != ALLOCATING) {
+ state->set(RELEASED);
+ return UNKNOWN_ERROR;
+ }
+ state->set(ALLOCATED);
+ state->comp = comp;
+ mClient = client;
+ return OK;
+ };
+ if (tryAndReportOnError(setAllocated) != OK) {
+ return;
+ }
+
+ // initialize config here in case setParameters is called prior to configure
+ Mutexed<Config>::Locked config(mConfig);
+ status_t err = config->initialize(mClient, comp);
+ if (err != OK) {
+ ALOGW("Failed to initialize configuration support");
+ // TODO: report error once we complete implementation.
+ }
+ config->queryConfiguration(comp);
+
+ mCallback->onComponentAllocated(componentName.c_str());
+}
+
+void CCodec::initiateConfigureComponent(const sp<AMessage> &format) {
+ auto checkAllocated = [this] {
+ Mutexed<State>::Locked state(mState);
+ return (state->get() != ALLOCATED) ? UNKNOWN_ERROR : OK;
+ };
+ if (tryAndReportOnError(checkAllocated) != OK) {
+ return;
+ }
+
+ sp<AMessage> msg(new AMessage(kWhatConfigure, this));
+ msg->setMessage("format", format);
+ msg->post();
+}
+
+void CCodec::configure(const sp<AMessage> &msg) {
+ std::shared_ptr<Codec2Client::Component> comp;
+ auto checkAllocated = [this, &comp] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != ALLOCATED) {
+ state->set(RELEASED);
+ return UNKNOWN_ERROR;
+ }
+ comp = state->comp;
+ return OK;
+ };
+ if (tryAndReportOnError(checkAllocated) != OK) {
+ return;
+ }
+
+ auto doConfig = [msg, comp, this]() -> status_t {
+ AString mime;
+ if (!msg->findString("mime", &mime)) {
+ return BAD_VALUE;
+ }
+
+ int32_t encoder;
+ if (!msg->findInt32("encoder", &encoder)) {
+ encoder = false;
+ }
+
+ // TODO: read from intf()
+ if ((!encoder) != (comp->getName().find("encoder") == std::string::npos)) {
+ return UNKNOWN_ERROR;
+ }
+
+ int32_t storeMeta;
+ if (encoder
+ && msg->findInt32("android._input-metadata-buffer-type", &storeMeta)
+ && storeMeta != kMetadataBufferTypeInvalid) {
+ if (storeMeta != kMetadataBufferTypeANWBuffer) {
+ ALOGD("Only ANW buffers are supported for legacy metadata mode");
+ return BAD_VALUE;
+ }
+ mChannel->setMetaMode(CCodecBufferChannel::MODE_ANW);
+ }
+
+ sp<RefBase> obj;
+ sp<Surface> surface;
+ if (msg->findObject("native-window", &obj)) {
+ surface = static_cast<Surface *>(obj.get());
+ setSurface(surface);
+ }
+
+ Mutexed<Config>::Locked config(mConfig);
+ config->mUsingSurface = surface != nullptr;
+
+ /*
+ * Handle input surface configuration
+ */
+ if ((config->mDomain & (Config::IS_VIDEO | Config::IS_IMAGE))
+ && (config->mDomain & Config::IS_ENCODER)) {
+ config->mISConfig.reset(new InputSurfaceWrapper::Config{});
+ {
+ config->mISConfig->mMinFps = 0;
+ int64_t value;
+ if (msg->findInt64("repeat-previous-frame-after", &value) && value > 0) {
+ config->mISConfig->mMinFps = 1e6 / value;
+ }
+ (void)msg->findFloat("max-fps-to-encoder", &config->mISConfig->mMaxFps);
+ config->mISConfig->mMinAdjustedFps = 0;
+ config->mISConfig->mFixedAdjustedFps = 0;
+ if (msg->findInt64("max-pts-gap-to-encoder", &value)) {
+ if (value < 0 && value >= INT32_MIN) {
+ config->mISConfig->mFixedAdjustedFps = -1e6 / value;
+ } else if (value > 0 && value <= INT32_MAX) {
+ config->mISConfig->mMinAdjustedFps = 1e6 / value;
+ }
+ }
+ }
+
+ {
+ double value;
+ if (msg->findDouble("time-lapse-fps", &value)) {
+ config->mISConfig->mCaptureFps = value;
+ (void)msg->findAsFloat(KEY_FRAME_RATE, &config->mISConfig->mCodedFps);
+ }
+ }
+
+ {
+ config->mISConfig->mSuspended = false;
+ config->mISConfig->mSuspendAtUs = -1;
+ int32_t value;
+ if (msg->findInt32("create-input-buffers-suspended", &value) && value) {
+ config->mISConfig->mSuspended = true;
+ }
+ }
+ }
+
+ /*
+ * Handle desired color format.
+ */
+ if ((config->mDomain & (Config::IS_VIDEO | Config::IS_IMAGE))) {
+ int32_t format = -1;
+ if (!msg->findInt32(KEY_COLOR_FORMAT, &format)) {
+ /*
+ * Also handle default color format (encoders require color format, so this is only
+ * needed for decoders.
+ */
+ if (!(config->mDomain & Config::IS_ENCODER)) {
+ format = (surface == nullptr) ? COLOR_FormatYUV420Planar : COLOR_FormatSurface;
+ }
+ }
+
+ if (format >= 0) {
+ msg->setInt32("android._color-format", format);
+ }
+ }
+
+ std::vector<std::unique_ptr<C2Param>> configUpdate;
+ status_t err = config->getConfigUpdateFromSdkParams(
+ comp, msg, Config::IS_CONFIG, C2_DONT_BLOCK, &configUpdate);
+ if (err != OK) {
+ ALOGW("failed to convert configuration to c2 params");
+ }
+ err = config->setParameters(comp, configUpdate, C2_DONT_BLOCK);
+ if (err != OK) {
+ ALOGW("failed to configure c2 params");
+ return err;
+ }
+
+ std::vector<std::unique_ptr<C2Param>> params;
+ C2StreamUsageTuning::input usage(0u, 0u);
+ C2StreamMaxBufferSizeInfo::input maxInputSize(0u, 0u);
+
+ std::initializer_list<C2Param::Index> indices {
+ };
+ c2_status_t c2err = comp->query(
+ { &usage, &maxInputSize },
+ indices,
+ C2_DONT_BLOCK,
+ ¶ms);
+ if (c2err != C2_OK && c2err != C2_BAD_INDEX) {
+ ALOGE("Failed to query component interface: %d", c2err);
+ return UNKNOWN_ERROR;
+ }
+ if (params.size() != indices.size()) {
+ ALOGE("Component returns wrong number of params: expected %zu actual %zu",
+ indices.size(), params.size());
+ return UNKNOWN_ERROR;
+ }
+ if (usage && (usage.value & C2MemoryUsage::CPU_READ)) {
+ config->mInputFormat->setInt32("using-sw-read-often", true);
+ }
+
+ // NOTE: we don't blindly use client specified input size if specified as clients
+ // at times specify too small size. Instead, mimic the behavior from OMX, where the
+ // client specified size is only used to ask for bigger buffers than component suggested
+ // size.
+ int32_t clientInputSize = 0;
+ bool clientSpecifiedInputSize =
+ msg->findInt32(KEY_MAX_INPUT_SIZE, &clientInputSize) && clientInputSize > 0;
+ // TEMP: enforce minimum buffer size of 1MB for video decoders
+ // and 16K / 4K for audio encoders/decoders
+ if (maxInputSize.value == 0) {
+ if (config->mDomain & Config::IS_AUDIO) {
+ maxInputSize.value = encoder ? 16384 : 4096;
+ } else if (!encoder) {
+ maxInputSize.value = 1048576u;
+ }
+ }
+
+ // verify that CSD fits into this size (if defined)
+ if ((config->mDomain & Config::IS_DECODER) && maxInputSize.value > 0) {
+ sp<ABuffer> csd;
+ for (size_t ix = 0; msg->findBuffer(StringPrintf("csd-%zu", ix).c_str(), &csd); ++ix) {
+ if (csd && csd->size() > maxInputSize.value) {
+ maxInputSize.value = csd->size();
+ }
+ }
+ }
+
+ // TODO: do this based on component requiring linear allocator for input
+ if ((config->mDomain & Config::IS_DECODER) || (config->mDomain & Config::IS_AUDIO)) {
+ if (clientSpecifiedInputSize) {
+ // Warn that we're overriding client's max input size if necessary.
+ if ((uint32_t)clientInputSize < maxInputSize.value) {
+ ALOGD("client requested max input size %d, which is smaller than "
+ "what component recommended (%u); overriding with component "
+ "recommendation.", clientInputSize, maxInputSize.value);
+ ALOGW("This behavior is subject to change. It is recommended that "
+ "app developers double check whether the requested "
+ "max input size is in reasonable range.");
+ } else {
+ maxInputSize.value = clientInputSize;
+ }
+ }
+ // Pass max input size on input format to the buffer channel (if supplied by the
+ // component or by a default)
+ if (maxInputSize.value) {
+ config->mInputFormat->setInt32(
+ KEY_MAX_INPUT_SIZE,
+ (int32_t)(c2_min(maxInputSize.value, uint32_t(INT32_MAX))));
+ }
+ }
+
+ if ((config->mDomain & (Config::IS_VIDEO | Config::IS_IMAGE))) {
+ // propagate HDR static info to output format for both encoders and decoders
+ // if component supports this info, we will update from component, but only the raw port,
+ // so don't propagate if component already filled it in.
+ sp<ABuffer> hdrInfo;
+ if (msg->findBuffer(KEY_HDR_STATIC_INFO, &hdrInfo)
+ && !config->mOutputFormat->findBuffer(KEY_HDR_STATIC_INFO, &hdrInfo)) {
+ config->mOutputFormat->setBuffer(KEY_HDR_STATIC_INFO, hdrInfo);
+ }
+
+ // Set desired color format from configuration parameter
+ int32_t format;
+ if (msg->findInt32("android._color-format", &format)) {
+ if (config->mDomain & Config::IS_ENCODER) {
+ config->mInputFormat->setInt32(KEY_COLOR_FORMAT, format);
+ } else {
+ config->mOutputFormat->setInt32(KEY_COLOR_FORMAT, format);
+ }
+ }
+ }
+
+ // propagate encoder delay and padding to output format
+ if ((config->mDomain & Config::IS_DECODER) && (config->mDomain & Config::IS_AUDIO)) {
+ int delay = 0;
+ if (msg->findInt32("encoder-delay", &delay)) {
+ config->mOutputFormat->setInt32("encoder-delay", delay);
+ }
+ int padding = 0;
+ if (msg->findInt32("encoder-padding", &padding)) {
+ config->mOutputFormat->setInt32("encoder-padding", padding);
+ }
+ }
+
+ // set channel-mask
+ if (config->mDomain & Config::IS_AUDIO) {
+ int32_t mask;
+ if (msg->findInt32(KEY_CHANNEL_MASK, &mask)) {
+ if (config->mDomain & Config::IS_ENCODER) {
+ config->mInputFormat->setInt32(KEY_CHANNEL_MASK, mask);
+ } else {
+ config->mOutputFormat->setInt32(KEY_CHANNEL_MASK, mask);
+ }
+ }
+ }
+
+ ALOGD("setup formats input: %s and output: %s",
+ config->mInputFormat->debugString().c_str(),
+ config->mOutputFormat->debugString().c_str());
+ return OK;
+ };
+ if (tryAndReportOnError(doConfig) != OK) {
+ return;
+ }
+
+ Mutexed<Config>::Locked config(mConfig);
+
+ mCallback->onComponentConfigured(config->mInputFormat, config->mOutputFormat);
+}
+
+void CCodec::initiateCreateInputSurface() {
+ status_t err = [this] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != ALLOCATED) {
+ return UNKNOWN_ERROR;
+ }
+ // TODO: read it from intf() properly.
+ if (state->comp->getName().find("encoder") == std::string::npos) {
+ return INVALID_OPERATION;
+ }
+ return OK;
+ }();
+ if (err != OK) {
+ mCallback->onInputSurfaceCreationFailed(err);
+ return;
+ }
+
+ (new AMessage(kWhatCreateInputSurface, this))->post();
+}
+
+void CCodec::createInputSurface() {
+ status_t err;
+ sp<IGraphicBufferProducer> bufferProducer;
+
+ sp<AMessage> inputFormat;
+ sp<AMessage> outputFormat;
+ {
+ Mutexed<Config>::Locked config(mConfig);
+ inputFormat = config->mInputFormat;
+ outputFormat = config->mOutputFormat;
+ }
+
+ std::shared_ptr<PersistentSurface> persistentSurface(CreateInputSurface());
+
+ if (persistentSurface->getHidlTarget()) {
+ sp<IInputSurface> inputSurface = IInputSurface::castFrom(
+ persistentSurface->getHidlTarget());
+ if (!inputSurface) {
+ ALOGE("Corrupted input surface");
+ mCallback->onInputSurfaceCreationFailed(UNKNOWN_ERROR);
+ return;
+ }
+ err = setupInputSurface(std::make_shared<C2InputSurfaceWrapper>(
+ std::make_shared<Codec2Client::InputSurface>(inputSurface)));
+ bufferProducer = new H2BGraphicBufferProducer(inputSurface);
+ } else {
+ int32_t width = 0;
+ (void)outputFormat->findInt32("width", &width);
+ int32_t height = 0;
+ (void)outputFormat->findInt32("height", &height);
+ err = setupInputSurface(std::make_shared<GraphicBufferSourceWrapper>(
+ persistentSurface->getBufferSource(), width, height));
+ bufferProducer = persistentSurface->getBufferProducer();
+ }
+
+ if (err != OK) {
+ ALOGE("Failed to set up input surface: %d", err);
+ mCallback->onInputSurfaceCreationFailed(err);
+ return;
+ }
+
+ mCallback->onInputSurfaceCreated(
+ inputFormat,
+ outputFormat,
+ new BufferProducerWrapper(bufferProducer));
+}
+
+status_t CCodec::setupInputSurface(const std::shared_ptr<InputSurfaceWrapper> &surface) {
+ Mutexed<Config>::Locked config(mConfig);
+ config->mUsingSurface = true;
+
+ // we are now using surface - apply default color aspects to input format - as well as
+ // get dataspace
+ bool inputFormatChanged = config->updateFormats(config->IS_INPUT);
+ ALOGD("input format %s to %s",
+ inputFormatChanged ? "changed" : "unchanged",
+ config->mInputFormat->debugString().c_str());
+
+ // configure dataspace
+ static_assert(sizeof(int32_t) == sizeof(android_dataspace), "dataspace size mismatch");
+ android_dataspace dataSpace = HAL_DATASPACE_UNKNOWN;
+ (void)config->mInputFormat->findInt32("android._dataspace", (int32_t*)&dataSpace);
+ surface->setDataSpace(dataSpace);
+
+ status_t err = mChannel->setInputSurface(surface);
+ if (err != OK) {
+ // undo input format update
+ config->mUsingSurface = false;
+ (void)config->updateFormats(config->IS_INPUT);
+ return err;
+ }
+ config->mInputSurface = surface;
+
+ if (config->mISConfig) {
+ surface->configure(*config->mISConfig);
+ } else {
+ ALOGD("ISConfig: no configuration");
+ }
+
+ return surface->start();
+}
+
+void CCodec::initiateSetInputSurface(const sp<PersistentSurface> &surface) {
+ sp<AMessage> msg = new AMessage(kWhatSetInputSurface, this);
+ msg->setObject("surface", surface);
+ msg->post();
+}
+
+void CCodec::setInputSurface(const sp<PersistentSurface> &surface) {
+ sp<AMessage> inputFormat;
+ sp<AMessage> outputFormat;
+ {
+ Mutexed<Config>::Locked config(mConfig);
+ inputFormat = config->mInputFormat;
+ outputFormat = config->mOutputFormat;
+ }
+ auto hidlTarget = surface->getHidlTarget();
+ if (hidlTarget) {
+ sp<IInputSurface> inputSurface =
+ IInputSurface::castFrom(hidlTarget);
+ if (!inputSurface) {
+ ALOGE("Failed to set input surface: Corrupted surface.");
+ mCallback->onInputSurfaceDeclined(UNKNOWN_ERROR);
+ return;
+ }
+ status_t err = setupInputSurface(std::make_shared<C2InputSurfaceWrapper>(
+ std::make_shared<Codec2Client::InputSurface>(inputSurface)));
+ if (err != OK) {
+ ALOGE("Failed to set up input surface: %d", err);
+ mCallback->onInputSurfaceDeclined(err);
+ return;
+ }
+ } else {
+ int32_t width = 0;
+ (void)outputFormat->findInt32("width", &width);
+ int32_t height = 0;
+ (void)outputFormat->findInt32("height", &height);
+ status_t err = setupInputSurface(std::make_shared<GraphicBufferSourceWrapper>(
+ surface->getBufferSource(), width, height));
+ if (err != OK) {
+ ALOGE("Failed to set up input surface: %d", err);
+ mCallback->onInputSurfaceDeclined(err);
+ return;
+ }
+ }
+ mCallback->onInputSurfaceAccepted(inputFormat, outputFormat);
+}
+
+void CCodec::initiateStart() {
+ auto setStarting = [this] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != ALLOCATED) {
+ return UNKNOWN_ERROR;
+ }
+ state->set(STARTING);
+ return OK;
+ };
+ if (tryAndReportOnError(setStarting) != OK) {
+ return;
+ }
+
+ (new AMessage(kWhatStart, this))->post();
+}
+
+void CCodec::start() {
+ std::shared_ptr<Codec2Client::Component> comp;
+ auto checkStarting = [this, &comp] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != STARTING) {
+ return UNKNOWN_ERROR;
+ }
+ comp = state->comp;
+ return OK;
+ };
+ if (tryAndReportOnError(checkStarting) != OK) {
+ return;
+ }
+
+ c2_status_t err = comp->start();
+ if (err != C2_OK) {
+ mCallback->onError(toStatusT(err, C2_OPERATION_Component_start),
+ ACTION_CODE_FATAL);
+ return;
+ }
+ sp<AMessage> inputFormat;
+ sp<AMessage> outputFormat;
+ {
+ Mutexed<Config>::Locked config(mConfig);
+ inputFormat = config->mInputFormat;
+ outputFormat = config->mOutputFormat;
+ }
+ status_t err2 = mChannel->start(inputFormat, outputFormat);
+ if (err2 != OK) {
+ mCallback->onError(err2, ACTION_CODE_FATAL);
+ return;
+ }
+
+ auto setRunning = [this] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != STARTING) {
+ return UNKNOWN_ERROR;
+ }
+ state->set(RUNNING);
+ return OK;
+ };
+ if (tryAndReportOnError(setRunning) != OK) {
+ return;
+ }
+ mCallback->onStartCompleted();
+
+ (void)mChannel->requestInitialInputBuffers();
+}
+
+void CCodec::initiateShutdown(bool keepComponentAllocated) {
+ if (keepComponentAllocated) {
+ initiateStop();
+ } else {
+ initiateRelease();
+ }
+}
+
+void CCodec::initiateStop() {
+ {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() == ALLOCATED
+ || state->get() == RELEASED
+ || state->get() == STOPPING
+ || state->get() == RELEASING) {
+ // We're already stopped, released, or doing it right now.
+ state.unlock();
+ mCallback->onStopCompleted();
+ state.lock();
+ return;
+ }
+ state->set(STOPPING);
+ }
+
+ mChannel->stop();
+ (new AMessage(kWhatStop, this))->post();
+}
+
+void CCodec::stop() {
+ std::shared_ptr<Codec2Client::Component> comp;
+ {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() == RELEASING) {
+ state.unlock();
+ // We're already stopped or release is in progress.
+ mCallback->onStopCompleted();
+ state.lock();
+ return;
+ } else if (state->get() != STOPPING) {
+ state.unlock();
+ mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ state.lock();
+ return;
+ }
+ comp = state->comp;
+ }
+ status_t err = comp->stop();
+ if (err != C2_OK) {
+ // TODO: convert err into status_t
+ mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ }
+
+ {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() == STOPPING) {
+ state->set(ALLOCATED);
+ }
+ }
+ mCallback->onStopCompleted();
+}
+
+void CCodec::initiateRelease(bool sendCallback /* = true */) {
+ {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() == RELEASED || state->get() == RELEASING) {
+ // We're already released or doing it right now.
+ if (sendCallback) {
+ state.unlock();
+ mCallback->onReleaseCompleted();
+ state.lock();
+ }
+ return;
+ }
+ if (state->get() == ALLOCATING) {
+ state->set(RELEASING);
+ // With the altered state allocate() would fail and clean up.
+ if (sendCallback) {
+ state.unlock();
+ mCallback->onReleaseCompleted();
+ state.lock();
+ }
+ return;
+ }
+ state->set(RELEASING);
+ }
+
+ mChannel->stop();
+ // thiz holds strong ref to this while the thread is running.
+ sp<CCodec> thiz(this);
+ std::thread([thiz, sendCallback] { thiz->release(sendCallback); }).detach();
+}
+
+void CCodec::release(bool sendCallback) {
+ std::shared_ptr<Codec2Client::Component> comp;
+ {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() == RELEASED) {
+ if (sendCallback) {
+ state.unlock();
+ mCallback->onReleaseCompleted();
+ state.lock();
+ }
+ return;
+ }
+ comp = state->comp;
+ }
+ comp->release();
+
+ {
+ Mutexed<State>::Locked state(mState);
+ state->set(RELEASED);
+ state->comp.reset();
+ }
+ if (sendCallback) {
+ mCallback->onReleaseCompleted();
+ }
+}
+
+status_t CCodec::setSurface(const sp<Surface> &surface) {
+ return mChannel->setSurface(surface);
+}
+
+void CCodec::signalFlush() {
+ status_t err = [this] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() == FLUSHED) {
+ return ALREADY_EXISTS;
+ }
+ if (state->get() != RUNNING) {
+ return UNKNOWN_ERROR;
+ }
+ state->set(FLUSHING);
+ return OK;
+ }();
+ switch (err) {
+ case ALREADY_EXISTS:
+ mCallback->onFlushCompleted();
+ return;
+ case OK:
+ break;
+ default:
+ mCallback->onError(err, ACTION_CODE_FATAL);
+ return;
+ }
+
+ mChannel->stop();
+ (new AMessage(kWhatFlush, this))->post();
+}
+
+void CCodec::flush() {
+ std::shared_ptr<Codec2Client::Component> comp;
+ auto checkFlushing = [this, &comp] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != FLUSHING) {
+ return UNKNOWN_ERROR;
+ }
+ comp = state->comp;
+ return OK;
+ };
+ if (tryAndReportOnError(checkFlushing) != OK) {
+ return;
+ }
+
+ std::list<std::unique_ptr<C2Work>> flushedWork;
+ c2_status_t err = comp->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
+ {
+ Mutexed<std::list<std::unique_ptr<C2Work>>>::Locked queue(mWorkDoneQueue);
+ flushedWork.splice(flushedWork.end(), *queue);
+ }
+ if (err != C2_OK) {
+ // TODO: convert err into status_t
+ mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ }
+
+ mChannel->flush(flushedWork);
+ subQueuedWorkCount(flushedWork.size());
+
+ {
+ Mutexed<State>::Locked state(mState);
+ state->set(FLUSHED);
+ }
+ mCallback->onFlushCompleted();
+}
+
+void CCodec::signalResume() {
+ auto setResuming = [this] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != FLUSHED) {
+ return UNKNOWN_ERROR;
+ }
+ state->set(RESUMING);
+ return OK;
+ };
+ if (tryAndReportOnError(setResuming) != OK) {
+ return;
+ }
+
+ (void)mChannel->start(nullptr, nullptr);
+
+ {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() != RESUMING) {
+ state.unlock();
+ mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ state.lock();
+ return;
+ }
+ state->set(RUNNING);
+ }
+
+ (void)mChannel->requestInitialInputBuffers();
+}
+
+void CCodec::signalSetParameters(const sp<AMessage> ¶ms) {
+ sp<AMessage> msg = new AMessage(kWhatSetParameters, this);
+ msg->setMessage("params", params);
+ msg->post();
+}
+
+void CCodec::setParameters(const sp<AMessage> ¶ms) {
+ std::shared_ptr<Codec2Client::Component> comp;
+ auto checkState = [this, &comp] {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() == RELEASED) {
+ return INVALID_OPERATION;
+ }
+ comp = state->comp;
+ return OK;
+ };
+ if (tryAndReportOnError(checkState) != OK) {
+ return;
+ }
+
+ Mutexed<Config>::Locked config(mConfig);
+
+ /**
+ * Handle input surface parameters
+ */
+ if ((config->mDomain & (Config::IS_VIDEO | Config::IS_IMAGE))
+ && (config->mDomain & Config::IS_ENCODER) && config->mInputSurface && config->mISConfig) {
+ (void)params->findInt64("time-offset-us", &config->mISConfig->mTimeOffsetUs);
+
+ if (params->findInt64("skip-frames-before", &config->mISConfig->mStartAtUs)) {
+ config->mISConfig->mStopped = false;
+ } else if (params->findInt64("stop-time-us", &config->mISConfig->mStopAtUs)) {
+ config->mISConfig->mStopped = true;
+ }
+
+ int32_t value;
+ if (params->findInt32("drop-input-frames", &value)) {
+ config->mISConfig->mSuspended = value;
+ config->mISConfig->mSuspendAtUs = -1;
+ (void)params->findInt64("drop-start-time-us", &config->mISConfig->mSuspendAtUs);
+ }
+
+ (void)config->mInputSurface->configure(*config->mISConfig);
+ if (config->mISConfig->mStopped) {
+ config->mInputFormat->setInt64(
+ "android._stop-time-offset-us", config->mISConfig->mInputDelayUs);
+ }
+ }
+
+ std::vector<std::unique_ptr<C2Param>> configUpdate;
+ (void)config->getConfigUpdateFromSdkParams(
+ comp, params, Config::IS_PARAM, C2_MAY_BLOCK, &configUpdate);
+ // Prefer to pass parameters to the buffer channel, so they can be synchronized with the frames.
+ // Parameter synchronization is not defined when using input surface. For now, route
+ // these directly to the component.
+ if (config->mInputSurface == nullptr
+ && (property_get_bool("debug.stagefright.ccodec_delayed_params", false)
+ || comp->getName().find("c2.android.") == 0)) {
+ mChannel->setParameters(configUpdate);
+ } else {
+ (void)config->setParameters(comp, configUpdate, C2_MAY_BLOCK);
+ }
+}
+
+void CCodec::signalEndOfInputStream() {
+ mCallback->onSignaledInputEOS(mChannel->signalEndOfInputStream());
+}
+
+void CCodec::signalRequestIDRFrame() {
+ std::shared_ptr<Codec2Client::Component> comp;
+ {
+ Mutexed<State>::Locked state(mState);
+ if (state->get() == RELEASED) {
+ ALOGD("no IDR request sent since component is released");
+ return;
+ }
+ comp = state->comp;
+ }
+ ALOGV("request IDR");
+ Mutexed<Config>::Locked config(mConfig);
+ std::vector<std::unique_ptr<C2Param>> params;
+ params.push_back(
+ std::make_unique<C2StreamRequestSyncFrameTuning::output>(0u, true));
+ config->setParameters(comp, params, C2_MAY_BLOCK);
+}
+
+void CCodec::onWorkDone(std::list<std::unique_ptr<C2Work>> &workItems,
+ size_t numDiscardedInputBuffers) {
+ if (!workItems.empty()) {
+ {
+ Mutexed<std::list<size_t>>::Locked numDiscardedInputBuffersQueue(
+ mNumDiscardedInputBuffersQueue);
+ numDiscardedInputBuffersQueue->insert(
+ numDiscardedInputBuffersQueue->end(),
+ workItems.size() - 1, 0);
+ numDiscardedInputBuffersQueue->emplace_back(
+ numDiscardedInputBuffers);
+ }
+ {
+ Mutexed<std::list<std::unique_ptr<C2Work>>>::Locked queue(mWorkDoneQueue);
+ queue->splice(queue->end(), workItems);
+ }
+ }
+ (new AMessage(kWhatWorkDone, this))->post();
+}
+
+void CCodec::onInputBufferDone(const std::shared_ptr<C2Buffer>& buffer) {
+ mChannel->onInputBufferDone(buffer);
+}
+
+void CCodec::onMessageReceived(const sp<AMessage> &msg) {
+ TimePoint now = std::chrono::steady_clock::now();
+ CCodecWatchdog::getInstance()->watch(this);
+ switch (msg->what()) {
+ case kWhatAllocate: {
+ // C2ComponentStore::createComponent() should return within 100ms.
+ setDeadline(now, 150ms, "allocate");
+ sp<RefBase> obj;
+ CHECK(msg->findObject("codecInfo", &obj));
+ allocate((MediaCodecInfo *)obj.get());
+ break;
+ }
+ case kWhatConfigure: {
+ // C2Component::commit_sm() should return within 5ms.
+ setDeadline(now, 250ms, "configure");
+ sp<AMessage> format;
+ CHECK(msg->findMessage("format", &format));
+ configure(format);
+ break;
+ }
+ case kWhatStart: {
+ // C2Component::start() should return within 500ms.
+ setDeadline(now, 550ms, "start");
+ mQueuedWorkCount = 0;
+ start();
+ break;
+ }
+ case kWhatStop: {
+ // C2Component::stop() should return within 500ms.
+ setDeadline(now, 550ms, "stop");
+ stop();
+
+ mQueuedWorkCount = 0;
+ Mutexed<NamedTimePoint>::Locked deadline(mQueueDeadline);
+ deadline->set(TimePoint::max(), "none");
+ break;
+ }
+ case kWhatFlush: {
+ // C2Component::flush_sm() should return within 5ms.
+ setDeadline(now, 50ms, "flush");
+ flush();
+ break;
+ }
+ case kWhatCreateInputSurface: {
+ // Surface operations may be briefly blocking.
+ setDeadline(now, 100ms, "createInputSurface");
+ createInputSurface();
+ break;
+ }
+ case kWhatSetInputSurface: {
+ // Surface operations may be briefly blocking.
+ setDeadline(now, 100ms, "setInputSurface");
+ sp<RefBase> obj;
+ CHECK(msg->findObject("surface", &obj));
+ sp<PersistentSurface> surface(static_cast<PersistentSurface *>(obj.get()));
+ setInputSurface(surface);
+ break;
+ }
+ case kWhatSetParameters: {
+ setDeadline(now, 50ms, "setParameters");
+ sp<AMessage> params;
+ CHECK(msg->findMessage("params", ¶ms));
+ setParameters(params);
+ break;
+ }
+ case kWhatWorkDone: {
+ std::unique_ptr<C2Work> work;
+ size_t numDiscardedInputBuffers;
+ bool shouldPost = false;
+ {
+ Mutexed<std::list<std::unique_ptr<C2Work>>>::Locked queue(mWorkDoneQueue);
+ if (queue->empty()) {
+ break;
+ }
+ work.swap(queue->front());
+ queue->pop_front();
+ shouldPost = !queue->empty();
+ }
+ {
+ Mutexed<std::list<size_t>>::Locked numDiscardedInputBuffersQueue(
+ mNumDiscardedInputBuffersQueue);
+ if (numDiscardedInputBuffersQueue->empty()) {
+ numDiscardedInputBuffers = 0;
+ } else {
+ numDiscardedInputBuffers = numDiscardedInputBuffersQueue->front();
+ numDiscardedInputBuffersQueue->pop_front();
+ }
+ }
+ if (shouldPost) {
+ (new AMessage(kWhatWorkDone, this))->post();
+ }
+
+ if (work->worklets.empty()
+ || !(work->worklets.front()->output.flags & C2FrameData::FLAG_INCOMPLETE)) {
+ subQueuedWorkCount(1);
+ }
+ // handle configuration changes in work done
+ Mutexed<Config>::Locked config(mConfig);
+ bool changed = false;
+ Config::Watcher<C2StreamInitDataInfo::output> initData =
+ config->watch<C2StreamInitDataInfo::output>();
+ if (!work->worklets.empty()
+ && (work->worklets.front()->output.flags
+ & C2FrameData::FLAG_DISCARD_FRAME) == 0) {
+
+ // copy buffer info to config
+ std::vector<std::unique_ptr<C2Param>> updates =
+ std::move(work->worklets.front()->output.configUpdate);
+ unsigned stream = 0;
+ for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) {
+ for (const std::shared_ptr<const C2Info> &info : buf->info()) {
+ // move all info into output-stream #0 domain
+ updates.emplace_back(C2Param::CopyAsStream(*info, true /* output */, stream));
+ }
+ for (const C2ConstGraphicBlock &block : buf->data().graphicBlocks()) {
+ // ALOGV("got output buffer with crop %u,%u+%u,%u and size %u,%u",
+ // block.crop().left, block.crop().top,
+ // block.crop().width, block.crop().height,
+ // block.width(), block.height());
+ updates.emplace_back(new C2StreamCropRectInfo::output(stream, block.crop()));
+ updates.emplace_back(new C2StreamPictureSizeInfo::output(
+ stream, block.width(), block.height()));
+ break; // for now only do the first block
+ }
+ ++stream;
+ }
+
+ changed = config->updateConfiguration(updates, config->mOutputDomain);
+
+ // copy standard infos to graphic buffers if not already present (otherwise, we
+ // may overwrite the actual intermediate value with a final value)
+ stream = 0;
+ const static std::vector<C2Param::Index> stdGfxInfos = {
+ C2StreamRotationInfo::output::PARAM_TYPE,
+ C2StreamColorAspectsInfo::output::PARAM_TYPE,
+ C2StreamDataSpaceInfo::output::PARAM_TYPE,
+ C2StreamHdrStaticInfo::output::PARAM_TYPE,
+ C2StreamPixelAspectRatioInfo::output::PARAM_TYPE,
+ C2StreamSurfaceScalingInfo::output::PARAM_TYPE
+ };
+ for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) {
+ if (buf->data().graphicBlocks().size()) {
+ for (C2Param::Index ix : stdGfxInfos) {
+ if (!buf->hasInfo(ix)) {
+ const C2Param *param =
+ config->getConfigParameterValue(ix.withStream(stream));
+ if (param) {
+ std::shared_ptr<C2Param> info(C2Param::Copy(*param));
+ buf->setInfo(std::static_pointer_cast<C2Info>(info));
+ }
+ }
+ }
+ }
+ ++stream;
+ }
+ }
+ mChannel->onWorkDone(
+ std::move(work), changed ? config->mOutputFormat : nullptr,
+ initData.hasChanged() ? initData.update().get() : nullptr,
+ numDiscardedInputBuffers);
+ break;
+ }
+ case kWhatWatch: {
+ // watch message already posted; no-op.
+ break;
+ }
+ default: {
+ ALOGE("unrecognized message");
+ break;
+ }
+ }
+ setDeadline(TimePoint::max(), 0ms, "none");
+}
+
+void CCodec::setDeadline(
+ const TimePoint &now,
+ const std::chrono::milliseconds &timeout,
+ const char *name) {
+ int32_t mult = std::max(1, property_get_int32("debug.stagefright.ccodec_timeout_mult", 1));
+ Mutexed<NamedTimePoint>::Locked deadline(mDeadline);
+ deadline->set(now + (timeout * mult), name);
+}
+
+void CCodec::initiateReleaseIfStuck() {
+ std::string name;
+ bool pendingDeadline = false;
+ for (Mutexed<NamedTimePoint> *deadlinePtr : { &mDeadline, &mQueueDeadline, &mEosDeadline }) {
+ Mutexed<NamedTimePoint>::Locked deadline(*deadlinePtr);
+ if (deadline->get() < std::chrono::steady_clock::now()) {
+ name = deadline->getName();
+ break;
+ }
+ if (deadline->get() != TimePoint::max()) {
+ pendingDeadline = true;
+ }
+ }
+ if (name.empty()) {
+ // We're not stuck.
+ if (pendingDeadline) {
+ // If we are not stuck yet but still has deadline coming up,
+ // post watch message to check back later.
+ (new AMessage(kWhatWatch, this))->post();
+ }
+ return;
+ }
+
+ ALOGW("previous call to %s exceeded timeout", name.c_str());
+ initiateRelease(false);
+ mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+}
+
+void CCodec::onWorkQueued(bool eos) {
+ ALOGV("queued work count +1 from %d", mQueuedWorkCount.load());
+ int32_t count = ++mQueuedWorkCount;
+ if (eos) {
+ CCodecWatchdog::getInstance()->watch(this);
+ Mutexed<NamedTimePoint>::Locked deadline(mEosDeadline);
+ deadline->set(std::chrono::steady_clock::now() + 3s, "eos");
+ }
+ // TODO: query and use input/pipeline/output delay combined
+ if (count >= 8) {
+ CCodecWatchdog::getInstance()->watch(this);
+ Mutexed<NamedTimePoint>::Locked deadline(mQueueDeadline);
+ deadline->set(std::chrono::steady_clock::now() + 3s, "queue");
+ }
+}
+
+void CCodec::subQueuedWorkCount(uint32_t count) {
+ ALOGV("queued work count -%u from %d", count, mQueuedWorkCount.load());
+ int32_t currentCount = (mQueuedWorkCount -= count);
+ if (currentCount == 0) {
+ Mutexed<NamedTimePoint>::Locked deadline(mEosDeadline);
+ deadline->set(TimePoint::max(), "none");
+ }
+ Mutexed<NamedTimePoint>::Locked deadline(mQueueDeadline);
+ deadline->set(TimePoint::max(), "none");
+}
+
+} // namespace android
+
+extern "C" android::CodecBase *CreateCodec() {
+ return new android::CCodec;
+}
+
+extern "C" android::PersistentSurface *CreateInputSurface() {
+ // Attempt to create a Codec2's input surface.
+ std::shared_ptr<android::Codec2Client::InputSurface> inputSurface =
+ android::Codec2Client::CreateInputSurface();
+ if (inputSurface) {
+ return new android::PersistentSurface(
+ inputSurface->getGraphicBufferProducer(),
+ static_cast<android::sp<android::hidl::base::V1_0::IBase>>(
+ inputSurface->getHalInterface()));
+ }
+
+ // Fall back to OMX.
+ using namespace android::hardware::media::omx::V1_0;
+ using namespace android::hardware::media::omx::V1_0::utils;
+ using namespace android::hardware::graphics::bufferqueue::V1_0::utils;
+ typedef android::hardware::media::omx::V1_0::Status OmxStatus;
+ android::sp<IOmx> omx = IOmx::getService();
+ typedef android::hardware::graphics::bufferqueue::V1_0::
+ IGraphicBufferProducer HGraphicBufferProducer;
+ typedef android::hardware::media::omx::V1_0::
+ IGraphicBufferSource HGraphicBufferSource;
+ OmxStatus s;
+ android::sp<HGraphicBufferProducer> gbp;
+ android::sp<HGraphicBufferSource> gbs;
+ android::Return<void> transStatus = omx->createInputSurface(
+ [&s, &gbp, &gbs](
+ OmxStatus status,
+ const android::sp<HGraphicBufferProducer>& producer,
+ const android::sp<HGraphicBufferSource>& source) {
+ s = status;
+ gbp = producer;
+ gbs = source;
+ });
+ if (transStatus.isOk() && s == OmxStatus::OK) {
+ return new android::PersistentSurface(
+ new H2BGraphicBufferProducer(gbp),
+ sp<::android::IGraphicBufferSource>(
+ new LWGraphicBufferSource(gbs)));
+ }
+
+ return nullptr;
+}
+
diff --git a/media/codec2/sfplugin/CCodec.h b/media/codec2/sfplugin/CCodec.h
new file mode 100644
index 0000000..78b009e
--- /dev/null
+++ b/media/codec2/sfplugin/CCodec.h
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C_CODEC_H_
+#define C_CODEC_H_
+
+#include <chrono>
+#include <list>
+#include <memory>
+#include <set>
+
+#include <C2Component.h>
+#include <codec2/hidl/client.h>
+
+#include <android/native_window.h>
+#include <media/hardware/MetadataBufferType.h>
+#include <media/stagefright/foundation/Mutexed.h>
+#include <media/stagefright/CodecBase.h>
+#include <media/stagefright/FrameRenderTracker.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/SkipCutBuffer.h>
+#include <utils/NativeHandle.h>
+#include <hardware/gralloc.h>
+#include <nativebase/nativebase.h>
+
+#include "CCodecConfig.h"
+
+namespace android {
+
+class CCodecBufferChannel;
+class InputSurfaceWrapper;
+struct MediaCodecInfo;
+
+class CCodec : public CodecBase {
+public:
+ CCodec();
+
+ virtual std::shared_ptr<BufferChannelBase> getBufferChannel() override;
+ virtual void initiateAllocateComponent(const sp<AMessage> &msg) override;
+ virtual void initiateConfigureComponent(const sp<AMessage> &msg) override;
+ virtual void initiateCreateInputSurface() override;
+ virtual void initiateSetInputSurface(const sp<PersistentSurface> &surface) override;
+ virtual void initiateStart() override;
+ virtual void initiateShutdown(bool keepComponentAllocated = false) override;
+
+ virtual status_t setSurface(const sp<Surface> &surface) override;
+
+ virtual void signalFlush() override;
+ virtual void signalResume() override;
+
+ virtual void signalSetParameters(const sp<AMessage> ¶ms) override;
+ virtual void signalEndOfInputStream() override;
+ virtual void signalRequestIDRFrame() override;
+
+ void initiateReleaseIfStuck();
+ void onWorkDone(std::list<std::unique_ptr<C2Work>> &workItems,
+ size_t numDiscardedInputBuffers);
+ void onInputBufferDone(const std::shared_ptr<C2Buffer>& buffer);
+
+protected:
+ virtual ~CCodec();
+
+ virtual void onMessageReceived(const sp<AMessage> &msg) override;
+
+private:
+ typedef std::chrono::time_point<std::chrono::steady_clock> TimePoint;
+
+ status_t tryAndReportOnError(std::function<status_t()> job);
+
+ void initiateStop();
+ void initiateRelease(bool sendCallback = true);
+
+ void allocate(const sp<MediaCodecInfo> &codecInfo);
+ void configure(const sp<AMessage> &msg);
+ void start();
+ void stop();
+ void flush();
+ void release(bool sendCallback);
+
+ void createInputSurface();
+ void setInputSurface(const sp<PersistentSurface> &surface);
+ status_t setupInputSurface(const std::shared_ptr<InputSurfaceWrapper> &surface);
+ void setParameters(const sp<AMessage> ¶ms);
+
+ void setDeadline(
+ const TimePoint &now,
+ const std::chrono::milliseconds &timeout,
+ const char *name);
+
+ void onWorkQueued(bool eos);
+ void subQueuedWorkCount(uint32_t count);
+
+ enum {
+ kWhatAllocate,
+ kWhatConfigure,
+ kWhatStart,
+ kWhatFlush,
+ kWhatStop,
+ kWhatRelease,
+ kWhatCreateInputSurface,
+ kWhatSetInputSurface,
+ kWhatSetParameters,
+
+ kWhatWorkDone,
+ kWhatWatch,
+ };
+
+ enum {
+ RELEASED,
+ ALLOCATED,
+ FLUSHED,
+ RUNNING,
+
+ ALLOCATING, // RELEASED -> ALLOCATED
+ STARTING, // ALLOCATED -> RUNNING
+ STOPPING, // RUNNING -> ALLOCATED
+ FLUSHING, // RUNNING -> FLUSHED
+ RESUMING, // FLUSHED -> RUNNING
+ RELEASING, // {ANY EXCEPT RELEASED} -> RELEASED
+ };
+
+ struct State {
+ inline State() : mState(RELEASED) {}
+ inline int get() const { return mState; }
+ inline void set(int newState) { mState = newState; }
+
+ std::shared_ptr<Codec2Client::Component> comp;
+ private:
+ int mState;
+ };
+
+ struct NamedTimePoint {
+ NamedTimePoint() : mTimePoint(TimePoint::max()), mName("") {}
+
+ inline void set(
+ const TimePoint &timePoint,
+ const char *name) {
+ mTimePoint = timePoint;
+ mName = name;
+ }
+
+ inline TimePoint get() const { return mTimePoint; }
+ inline const char *getName() const { return mName; }
+ private:
+ TimePoint mTimePoint;
+ const char *mName;
+ };
+
+ Mutexed<State> mState;
+ std::shared_ptr<CCodecBufferChannel> mChannel;
+
+ std::shared_ptr<Codec2Client> mClient;
+ std::shared_ptr<Codec2Client::Listener> mClientListener;
+ struct ClientListener;
+
+ Mutexed<NamedTimePoint> mDeadline;
+ std::atomic_int32_t mQueuedWorkCount;
+ Mutexed<NamedTimePoint> mQueueDeadline;
+ Mutexed<NamedTimePoint> mEosDeadline;
+ typedef CCodecConfig Config;
+ Mutexed<Config> mConfig;
+ Mutexed<std::list<std::unique_ptr<C2Work>>> mWorkDoneQueue;
+ Mutexed<std::list<size_t>> mNumDiscardedInputBuffersQueue;
+
+ friend class CCodecCallbackImpl;
+
+ DISALLOW_EVIL_CONSTRUCTORS(CCodec);
+};
+
+} // namespace android
+
+#endif // C_CODEC_H_
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
new file mode 100644
index 0000000..01b9c1e
--- /dev/null
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -0,0 +1,2791 @@
+/*
+ * Copyright 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "CCodecBufferChannel"
+#include <utils/Log.h>
+
+#include <numeric>
+
+#include <C2AllocatorGralloc.h>
+#include <C2PlatformSupport.h>
+#include <C2BlockInternal.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+
+#include <android/hardware/cas/native/1.0/IDescrambler.h>
+#include <android-base/stringprintf.h>
+#include <binder/MemoryDealer.h>
+#include <gui/Surface.h>
+#include <media/openmax/OMX_Core.h>
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/ALookup.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/foundation/AUtils.h>
+#include <media/stagefright/foundation/hexdump.h>
+#include <media/stagefright/MediaCodec.h>
+#include <media/stagefright/MediaCodecConstants.h>
+#include <media/MediaCodecBuffer.h>
+#include <system/window.h>
+
+#include "CCodecBufferChannel.h"
+#include "Codec2Buffer.h"
+#include "SkipCutBuffer.h"
+
+namespace android {
+
+using android::base::StringPrintf;
+using hardware::hidl_handle;
+using hardware::hidl_string;
+using hardware::hidl_vec;
+using namespace hardware::cas::V1_0;
+using namespace hardware::cas::native::V1_0;
+
+using CasStatus = hardware::cas::V1_0::Status;
+
+/**
+ * Base class for representation of buffers at one port.
+ */
+class CCodecBufferChannel::Buffers {
+public:
+ Buffers(const char *componentName, const char *name = "Buffers")
+ : mComponentName(componentName),
+ mChannelName(std::string(componentName) + ":" + name),
+ mName(mChannelName.c_str()) {
+ }
+ virtual ~Buffers() = default;
+
+ /**
+ * Set format for MediaCodec-facing buffers.
+ */
+ void setFormat(const sp<AMessage> &format) {
+ CHECK(format != nullptr);
+ mFormat = format;
+ }
+
+ /**
+ * Return a copy of current format.
+ */
+ sp<AMessage> dupFormat() {
+ return mFormat != nullptr ? mFormat->dup() : nullptr;
+ }
+
+ /**
+ * Returns true if the buffers are operating under array mode.
+ */
+ virtual bool isArrayMode() const { return false; }
+
+ /**
+ * Fills the vector with MediaCodecBuffer's if in array mode; otherwise,
+ * no-op.
+ */
+ virtual void getArray(Vector<sp<MediaCodecBuffer>> *) const {}
+
+protected:
+ std::string mComponentName; ///< name of component for debugging
+ std::string mChannelName; ///< name of channel for debugging
+ const char *mName; ///< C-string version of channel name
+ // Format to be used for creating MediaCodec-facing buffers.
+ sp<AMessage> mFormat;
+
+private:
+ DISALLOW_EVIL_CONSTRUCTORS(Buffers);
+};
+
+class CCodecBufferChannel::InputBuffers : public CCodecBufferChannel::Buffers {
+public:
+ InputBuffers(const char *componentName, const char *name = "Input[]")
+ : Buffers(componentName, name) { }
+ virtual ~InputBuffers() = default;
+
+ /**
+ * Set a block pool to obtain input memory blocks.
+ */
+ void setPool(const std::shared_ptr<C2BlockPool> &pool) { mPool = pool; }
+
+ /**
+ * Get a new MediaCodecBuffer for input and its corresponding index.
+ * Returns false if no new buffer can be obtained at the moment.
+ */
+ virtual bool requestNewBuffer(size_t *index, sp<MediaCodecBuffer> *buffer) = 0;
+
+ /**
+ * Release the buffer obtained from requestNewBuffer() and get the
+ * associated C2Buffer object back. Returns true if the buffer was on file
+ * and released successfully.
+ */
+ virtual bool releaseBuffer(
+ const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) = 0;
+
+ /**
+ * Release the buffer that is no longer used by the codec process. Return
+ * true if and only if the buffer was on file and released successfully.
+ */
+ virtual bool expireComponentBuffer(
+ const std::shared_ptr<C2Buffer> &c2buffer) = 0;
+
+ /**
+ * Flush internal state. After this call, no index or buffer previously
+ * returned from requestNewBuffer() is valid.
+ */
+ virtual void flush() = 0;
+
+ /**
+ * Return array-backed version of input buffers. The returned object
+ * shall retain the internal state so that it will honor index and
+ * buffer from previous calls of requestNewBuffer().
+ */
+ virtual std::unique_ptr<InputBuffers> toArrayMode(size_t size) = 0;
+
+protected:
+ // Pool to obtain blocks for input buffers.
+ std::shared_ptr<C2BlockPool> mPool;
+
+private:
+ DISALLOW_EVIL_CONSTRUCTORS(InputBuffers);
+};
+
+class CCodecBufferChannel::OutputBuffers : public CCodecBufferChannel::Buffers {
+public:
+ OutputBuffers(const char *componentName, const char *name = "Output")
+ : Buffers(componentName, name) { }
+ virtual ~OutputBuffers() = default;
+
+ /**
+ * Register output C2Buffer from the component and obtain corresponding
+ * index and MediaCodecBuffer object. Returns false if registration
+ * fails.
+ */
+ virtual status_t registerBuffer(
+ const std::shared_ptr<C2Buffer> &buffer,
+ size_t *index,
+ sp<MediaCodecBuffer> *clientBuffer) = 0;
+
+ /**
+ * Register codec specific data as a buffer to be consistent with
+ * MediaCodec behavior.
+ */
+ virtual status_t registerCsd(
+ const C2StreamCsdInfo::output * /* csd */,
+ size_t * /* index */,
+ sp<MediaCodecBuffer> * /* clientBuffer */) = 0;
+
+ /**
+ * Release the buffer obtained from registerBuffer() and get the
+ * associated C2Buffer object back. Returns true if the buffer was on file
+ * and released successfully.
+ */
+ virtual bool releaseBuffer(
+ const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) = 0;
+
+ /**
+ * Flush internal state. After this call, no index or buffer previously
+ * returned from registerBuffer() is valid.
+ */
+ virtual void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) = 0;
+
+ /**
+ * Return array-backed version of output buffers. The returned object
+ * shall retain the internal state so that it will honor index and
+ * buffer from previous calls of registerBuffer().
+ */
+ virtual std::unique_ptr<OutputBuffers> toArrayMode(size_t size) = 0;
+
+ /**
+ * Initialize SkipCutBuffer object.
+ */
+ void initSkipCutBuffer(
+ int32_t delay, int32_t padding, int32_t sampleRate, int32_t channelCount) {
+ CHECK(mSkipCutBuffer == nullptr);
+ mDelay = delay;
+ mPadding = padding;
+ mSampleRate = sampleRate;
+ setSkipCutBuffer(delay, padding, channelCount);
+ }
+
+ /**
+ * Update the SkipCutBuffer object. No-op if it's never initialized.
+ */
+ void updateSkipCutBuffer(int32_t sampleRate, int32_t channelCount) {
+ if (mSkipCutBuffer == nullptr) {
+ return;
+ }
+ int32_t delay = mDelay;
+ int32_t padding = mPadding;
+ if (sampleRate != mSampleRate) {
+ delay = ((int64_t)delay * sampleRate) / mSampleRate;
+ padding = ((int64_t)padding * sampleRate) / mSampleRate;
+ }
+ setSkipCutBuffer(delay, padding, channelCount);
+ }
+
+ /**
+ * Submit buffer to SkipCutBuffer object, if initialized.
+ */
+ void submit(const sp<MediaCodecBuffer> &buffer) {
+ if (mSkipCutBuffer != nullptr) {
+ mSkipCutBuffer->submit(buffer);
+ }
+ }
+
+ /**
+ * Transfer SkipCutBuffer object to the other Buffers object.
+ */
+ void transferSkipCutBuffer(const sp<SkipCutBuffer> &scb) {
+ mSkipCutBuffer = scb;
+ }
+
+protected:
+ sp<SkipCutBuffer> mSkipCutBuffer;
+
+private:
+ int32_t mDelay;
+ int32_t mPadding;
+ int32_t mSampleRate;
+
+ void setSkipCutBuffer(int32_t skip, int32_t cut, int32_t channelCount) {
+ if (mSkipCutBuffer != nullptr) {
+ size_t prevSize = mSkipCutBuffer->size();
+ if (prevSize != 0u) {
+ ALOGD("[%s] Replacing SkipCutBuffer holding %zu bytes", mName, prevSize);
+ }
+ }
+ mSkipCutBuffer = new SkipCutBuffer(skip, cut, channelCount);
+ }
+
+ DISALLOW_EVIL_CONSTRUCTORS(OutputBuffers);
+};
+
+namespace {
+
+// TODO: get this info from component
+const static size_t kMinInputBufferArraySize = 4;
+const static size_t kMaxPipelineCapacity = 18;
+const static size_t kChannelOutputDelay = 0;
+const static size_t kMinOutputBufferArraySize = kMaxPipelineCapacity +
+ kChannelOutputDelay;
+const static size_t kLinearBufferSize = 1048576;
+// This can fit 4K RGBA frame, and most likely client won't need more than this.
+const static size_t kMaxLinearBufferSize = 3840 * 2160 * 4;
+
+/**
+ * Simple local buffer pool backed by std::vector.
+ */
+class LocalBufferPool : public std::enable_shared_from_this<LocalBufferPool> {
+public:
+ /**
+ * Create a new LocalBufferPool object.
+ *
+ * \param poolCapacity max total size of buffers managed by this pool.
+ *
+ * \return a newly created pool object.
+ */
+ static std::shared_ptr<LocalBufferPool> Create(size_t poolCapacity) {
+ return std::shared_ptr<LocalBufferPool>(new LocalBufferPool(poolCapacity));
+ }
+
+ /**
+ * Return an ABuffer object whose size is at least |capacity|.
+ *
+ * \param capacity requested capacity
+ * \return nullptr if the pool capacity is reached
+ * an ABuffer object otherwise.
+ */
+ sp<ABuffer> newBuffer(size_t capacity) {
+ Mutex::Autolock lock(mMutex);
+ auto it = std::find_if(
+ mPool.begin(), mPool.end(),
+ [capacity](const std::vector<uint8_t> &vec) {
+ return vec.capacity() >= capacity;
+ });
+ if (it != mPool.end()) {
+ sp<ABuffer> buffer = new VectorBuffer(std::move(*it), shared_from_this());
+ mPool.erase(it);
+ return buffer;
+ }
+ if (mUsedSize + capacity > mPoolCapacity) {
+ while (!mPool.empty()) {
+ mUsedSize -= mPool.back().capacity();
+ mPool.pop_back();
+ }
+ if (mUsedSize + capacity > mPoolCapacity) {
+ ALOGD("mUsedSize = %zu, capacity = %zu, mPoolCapacity = %zu",
+ mUsedSize, capacity, mPoolCapacity);
+ return nullptr;
+ }
+ }
+ std::vector<uint8_t> vec(capacity);
+ mUsedSize += vec.capacity();
+ return new VectorBuffer(std::move(vec), shared_from_this());
+ }
+
+private:
+ /**
+ * ABuffer backed by std::vector.
+ */
+ class VectorBuffer : public ::android::ABuffer {
+ public:
+ /**
+ * Construct a VectorBuffer by taking the ownership of supplied vector.
+ *
+ * \param vec backing vector of the buffer. this object takes
+ * ownership at construction.
+ * \param pool a LocalBufferPool object to return the vector at
+ * destruction.
+ */
+ VectorBuffer(std::vector<uint8_t> &&vec, const std::shared_ptr<LocalBufferPool> &pool)
+ : ABuffer(vec.data(), vec.capacity()),
+ mVec(std::move(vec)),
+ mPool(pool) {
+ }
+
+ ~VectorBuffer() override {
+ std::shared_ptr<LocalBufferPool> pool = mPool.lock();
+ if (pool) {
+ // If pool is alive, return the vector back to the pool so that
+ // it can be recycled.
+ pool->returnVector(std::move(mVec));
+ }
+ }
+
+ private:
+ std::vector<uint8_t> mVec;
+ std::weak_ptr<LocalBufferPool> mPool;
+ };
+
+ Mutex mMutex;
+ size_t mPoolCapacity;
+ size_t mUsedSize;
+ std::list<std::vector<uint8_t>> mPool;
+
+ /**
+ * Private constructor to prevent constructing non-managed LocalBufferPool.
+ */
+ explicit LocalBufferPool(size_t poolCapacity)
+ : mPoolCapacity(poolCapacity), mUsedSize(0) {
+ }
+
+ /**
+ * Take back the ownership of vec from the destructed VectorBuffer and put
+ * it in front of the pool.
+ */
+ void returnVector(std::vector<uint8_t> &&vec) {
+ Mutex::Autolock lock(mMutex);
+ mPool.push_front(std::move(vec));
+ }
+
+ DISALLOW_EVIL_CONSTRUCTORS(LocalBufferPool);
+};
+
+sp<GraphicBlockBuffer> AllocateGraphicBuffer(
+ const std::shared_ptr<C2BlockPool> &pool,
+ const sp<AMessage> &format,
+ uint32_t pixelFormat,
+ const C2MemoryUsage &usage,
+ const std::shared_ptr<LocalBufferPool> &localBufferPool) {
+ int32_t width, height;
+ if (!format->findInt32("width", &width) || !format->findInt32("height", &height)) {
+ ALOGD("format lacks width or height");
+ return nullptr;
+ }
+
+ std::shared_ptr<C2GraphicBlock> block;
+ c2_status_t err = pool->fetchGraphicBlock(
+ width, height, pixelFormat, usage, &block);
+ if (err != C2_OK) {
+ ALOGD("fetch graphic block failed: %d", err);
+ return nullptr;
+ }
+
+ return GraphicBlockBuffer::Allocate(
+ format,
+ block,
+ [localBufferPool](size_t capacity) {
+ return localBufferPool->newBuffer(capacity);
+ });
+}
+
+class BuffersArrayImpl;
+
+/**
+ * Flexible buffer slots implementation.
+ */
+class FlexBuffersImpl {
+public:
+ FlexBuffersImpl(const char *name)
+ : mImplName(std::string(name) + ".Impl"),
+ mName(mImplName.c_str()) { }
+
+ /**
+ * Assign an empty slot for a buffer and return the index. If there's no
+ * empty slot, just add one at the end and return it.
+ *
+ * \param buffer[in] a new buffer to assign a slot.
+ * \return index of the assigned slot.
+ */
+ size_t assignSlot(const sp<Codec2Buffer> &buffer) {
+ for (size_t i = 0; i < mBuffers.size(); ++i) {
+ if (mBuffers[i].clientBuffer == nullptr
+ && mBuffers[i].compBuffer.expired()) {
+ mBuffers[i].clientBuffer = buffer;
+ return i;
+ }
+ }
+ mBuffers.push_back({ buffer, std::weak_ptr<C2Buffer>() });
+ return mBuffers.size() - 1;
+ }
+
+ /**
+ * Release the slot from the client, and get the C2Buffer object back from
+ * the previously assigned buffer. Note that the slot is not completely free
+ * until the returned C2Buffer object is freed.
+ *
+ * \param buffer[in] the buffer previously assigned a slot.
+ * \param c2buffer[in,out] pointer to C2Buffer to be populated. Ignored
+ * if null.
+ * \return true if the buffer is successfully released from a slot
+ * false otherwise
+ */
+ bool releaseSlot(const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) {
+ sp<Codec2Buffer> clientBuffer;
+ size_t index = mBuffers.size();
+ for (size_t i = 0; i < mBuffers.size(); ++i) {
+ if (mBuffers[i].clientBuffer == buffer) {
+ clientBuffer = mBuffers[i].clientBuffer;
+ mBuffers[i].clientBuffer.clear();
+ index = i;
+ break;
+ }
+ }
+ if (clientBuffer == nullptr) {
+ ALOGV("[%s] %s: No matching buffer found", mName, __func__);
+ return false;
+ }
+ std::shared_ptr<C2Buffer> result = clientBuffer->asC2Buffer();
+ mBuffers[index].compBuffer = result;
+ if (c2buffer) {
+ *c2buffer = result;
+ }
+ return true;
+ }
+
+ bool expireComponentBuffer(const std::shared_ptr<C2Buffer> &c2buffer) {
+ for (size_t i = 0; i < mBuffers.size(); ++i) {
+ std::shared_ptr<C2Buffer> compBuffer =
+ mBuffers[i].compBuffer.lock();
+ if (!compBuffer || compBuffer != c2buffer) {
+ continue;
+ }
+ mBuffers[i].clientBuffer = nullptr;
+ mBuffers[i].compBuffer.reset();
+ return true;
+ }
+ ALOGV("[%s] codec released an unknown buffer", mName);
+ return false;
+ }
+
+ void flush() {
+ ALOGV("[%s] buffers are flushed %zu", mName, mBuffers.size());
+ mBuffers.clear();
+ }
+
+private:
+ friend class BuffersArrayImpl;
+
+ std::string mImplName; ///< name for debugging
+ const char *mName; ///< C-string version of name
+
+ struct Entry {
+ sp<Codec2Buffer> clientBuffer;
+ std::weak_ptr<C2Buffer> compBuffer;
+ };
+ std::vector<Entry> mBuffers;
+};
+
+/**
+ * Static buffer slots implementation based on a fixed-size array.
+ */
+class BuffersArrayImpl {
+public:
+ BuffersArrayImpl()
+ : mImplName("BuffersArrayImpl"),
+ mName(mImplName.c_str()) { }
+
+ /**
+ * Initialize buffer array from the original |impl|. The buffers known by
+ * the client is preserved, and the empty slots are populated so that the
+ * array size is at least |minSize|.
+ *
+ * \param impl[in] FlexBuffersImpl object used so far.
+ * \param minSize[in] minimum size of the buffer array.
+ * \param allocate[in] function to allocate a client buffer for an empty slot.
+ */
+ void initialize(
+ const FlexBuffersImpl &impl,
+ size_t minSize,
+ std::function<sp<Codec2Buffer>()> allocate) {
+ mImplName = impl.mImplName + "[N]";
+ mName = mImplName.c_str();
+ for (size_t i = 0; i < impl.mBuffers.size(); ++i) {
+ sp<Codec2Buffer> clientBuffer = impl.mBuffers[i].clientBuffer;
+ bool ownedByClient = (clientBuffer != nullptr);
+ if (!ownedByClient) {
+ clientBuffer = allocate();
+ }
+ mBuffers.push_back({ clientBuffer, impl.mBuffers[i].compBuffer, ownedByClient });
+ }
+ ALOGV("[%s] converted %zu buffers to array mode of %zu", mName, mBuffers.size(), minSize);
+ for (size_t i = impl.mBuffers.size(); i < minSize; ++i) {
+ mBuffers.push_back({ allocate(), std::weak_ptr<C2Buffer>(), false });
+ }
+ }
+
+ /**
+ * Grab a buffer from the underlying array which matches the criteria.
+ *
+ * \param index[out] index of the slot.
+ * \param buffer[out] the matching buffer.
+ * \param match[in] a function to test whether the buffer matches the
+ * criteria or not.
+ * \return OK if successful,
+ * WOULD_BLOCK if slots are being used,
+ * NO_MEMORY if no slot matches the criteria, even though it's
+ * available
+ */
+ status_t grabBuffer(
+ size_t *index,
+ sp<Codec2Buffer> *buffer,
+ std::function<bool(const sp<Codec2Buffer> &)> match =
+ [](const sp<Codec2Buffer> &) { return true; }) {
+ // allBuffersDontMatch remains true if all buffers are available but
+ // match() returns false for every buffer.
+ bool allBuffersDontMatch = true;
+ for (size_t i = 0; i < mBuffers.size(); ++i) {
+ if (!mBuffers[i].ownedByClient && mBuffers[i].compBuffer.expired()) {
+ if (match(mBuffers[i].clientBuffer)) {
+ mBuffers[i].ownedByClient = true;
+ *buffer = mBuffers[i].clientBuffer;
+ (*buffer)->meta()->clear();
+ (*buffer)->setRange(0, (*buffer)->capacity());
+ *index = i;
+ return OK;
+ }
+ } else {
+ allBuffersDontMatch = false;
+ }
+ }
+ return allBuffersDontMatch ? NO_MEMORY : WOULD_BLOCK;
+ }
+
+ /**
+ * Return the buffer from the client, and get the C2Buffer object back from
+ * the buffer. Note that the slot is not completely free until the returned
+ * C2Buffer object is freed.
+ *
+ * \param buffer[in] the buffer previously grabbed.
+ * \param c2buffer[in,out] pointer to C2Buffer to be populated. Ignored
+ * if null.
+ * \return true if the buffer is successfully returned
+ * false otherwise
+ */
+ bool returnBuffer(const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) {
+ sp<Codec2Buffer> clientBuffer;
+ size_t index = mBuffers.size();
+ for (size_t i = 0; i < mBuffers.size(); ++i) {
+ if (mBuffers[i].clientBuffer == buffer) {
+ if (!mBuffers[i].ownedByClient) {
+ ALOGD("[%s] Client returned a buffer it does not own according to our record: %zu", mName, i);
+ }
+ clientBuffer = mBuffers[i].clientBuffer;
+ mBuffers[i].ownedByClient = false;
+ index = i;
+ break;
+ }
+ }
+ if (clientBuffer == nullptr) {
+ ALOGV("[%s] %s: No matching buffer found", mName, __func__);
+ return false;
+ }
+ ALOGV("[%s] %s: matching buffer found (index=%zu)", mName, __func__, index);
+ std::shared_ptr<C2Buffer> result = clientBuffer->asC2Buffer();
+ mBuffers[index].compBuffer = result;
+ if (c2buffer) {
+ *c2buffer = result;
+ }
+ return true;
+ }
+
+ bool expireComponentBuffer(const std::shared_ptr<C2Buffer> &c2buffer) {
+ for (size_t i = 0; i < mBuffers.size(); ++i) {
+ std::shared_ptr<C2Buffer> compBuffer =
+ mBuffers[i].compBuffer.lock();
+ if (!compBuffer) {
+ continue;
+ }
+ if (c2buffer == compBuffer) {
+ if (mBuffers[i].ownedByClient) {
+ // This should not happen.
+ ALOGD("[%s] codec released a buffer owned by client "
+ "(index %zu)", mName, i);
+ mBuffers[i].ownedByClient = false;
+ }
+ mBuffers[i].compBuffer.reset();
+ return true;
+ }
+ }
+ ALOGV("[%s] codec released an unknown buffer (array mode)", mName);
+ return false;
+ }
+
+ /**
+ * Populate |array| with the underlying buffer array.
+ *
+ * \param array[out] an array to be filled with the underlying buffer array.
+ */
+ void getArray(Vector<sp<MediaCodecBuffer>> *array) const {
+ array->clear();
+ for (const Entry &entry : mBuffers) {
+ array->push(entry.clientBuffer);
+ }
+ }
+
+ /**
+ * The client abandoned all known buffers, so reclaim the ownership.
+ */
+ void flush() {
+ for (Entry &entry : mBuffers) {
+ entry.ownedByClient = false;
+ }
+ }
+
+ void realloc(std::function<sp<Codec2Buffer>()> alloc) {
+ size_t size = mBuffers.size();
+ mBuffers.clear();
+ for (size_t i = 0; i < size; ++i) {
+ mBuffers.push_back({ alloc(), std::weak_ptr<C2Buffer>(), false });
+ }
+ }
+
+private:
+ std::string mImplName; ///< name for debugging
+ const char *mName; ///< C-string version of name
+
+ struct Entry {
+ const sp<Codec2Buffer> clientBuffer;
+ std::weak_ptr<C2Buffer> compBuffer;
+ bool ownedByClient;
+ };
+ std::vector<Entry> mBuffers;
+};
+
+class InputBuffersArray : public CCodecBufferChannel::InputBuffers {
+public:
+ InputBuffersArray(const char *componentName, const char *name = "Input[N]")
+ : InputBuffers(componentName, name) { }
+ ~InputBuffersArray() override = default;
+
+ void initialize(
+ const FlexBuffersImpl &impl,
+ size_t minSize,
+ std::function<sp<Codec2Buffer>()> allocate) {
+ mImpl.initialize(impl, minSize, allocate);
+ }
+
+ bool isArrayMode() const final { return true; }
+
+ std::unique_ptr<CCodecBufferChannel::InputBuffers> toArrayMode(
+ size_t) final {
+ return nullptr;
+ }
+
+ void getArray(Vector<sp<MediaCodecBuffer>> *array) const final {
+ mImpl.getArray(array);
+ }
+
+ bool requestNewBuffer(size_t *index, sp<MediaCodecBuffer> *buffer) override {
+ sp<Codec2Buffer> c2Buffer;
+ status_t err = mImpl.grabBuffer(index, &c2Buffer);
+ if (err == OK) {
+ c2Buffer->setFormat(mFormat);
+ *buffer = c2Buffer;
+ return true;
+ }
+ return false;
+ }
+
+ bool releaseBuffer(
+ const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
+ return mImpl.returnBuffer(buffer, c2buffer);
+ }
+
+ bool expireComponentBuffer(
+ const std::shared_ptr<C2Buffer> &c2buffer) override {
+ return mImpl.expireComponentBuffer(c2buffer);
+ }
+
+ void flush() override {
+ mImpl.flush();
+ }
+
+private:
+ BuffersArrayImpl mImpl;
+};
+
+class LinearInputBuffers : public CCodecBufferChannel::InputBuffers {
+public:
+ LinearInputBuffers(const char *componentName, const char *name = "1D-Input")
+ : InputBuffers(componentName, name),
+ mImpl(mName) { }
+
+ bool requestNewBuffer(size_t *index, sp<MediaCodecBuffer> *buffer) override {
+ int32_t capacity = kLinearBufferSize;
+ (void)mFormat->findInt32(KEY_MAX_INPUT_SIZE, &capacity);
+ if ((size_t)capacity > kMaxLinearBufferSize) {
+ ALOGD("client requested %d, capped to %zu", capacity, kMaxLinearBufferSize);
+ capacity = kMaxLinearBufferSize;
+ }
+ // TODO: proper max input size
+ // TODO: read usage from intf
+ sp<Codec2Buffer> newBuffer = alloc((size_t)capacity);
+ if (newBuffer == nullptr) {
+ return false;
+ }
+ *index = mImpl.assignSlot(newBuffer);
+ *buffer = newBuffer;
+ return true;
+ }
+
+ bool releaseBuffer(
+ const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
+ return mImpl.releaseSlot(buffer, c2buffer);
+ }
+
+ bool expireComponentBuffer(
+ const std::shared_ptr<C2Buffer> &c2buffer) override {
+ return mImpl.expireComponentBuffer(c2buffer);
+ }
+
+ void flush() override {
+ // This is no-op by default unless we're in array mode where we need to keep
+ // track of the flushed work.
+ mImpl.flush();
+ }
+
+ std::unique_ptr<CCodecBufferChannel::InputBuffers> toArrayMode(
+ size_t size) final {
+ int32_t capacity = kLinearBufferSize;
+ (void)mFormat->findInt32(C2_NAME_STREAM_MAX_BUFFER_SIZE_SETTING, &capacity);
+
+ std::unique_ptr<InputBuffersArray> array(
+ new InputBuffersArray(mComponentName.c_str(), "1D-Input[N]"));
+ array->setPool(mPool);
+ array->setFormat(mFormat);
+ array->initialize(
+ mImpl,
+ size,
+ [this, capacity] () -> sp<Codec2Buffer> { return alloc(capacity); });
+ return std::move(array);
+ }
+
+ virtual sp<Codec2Buffer> alloc(size_t size) const {
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ std::shared_ptr<C2LinearBlock> block;
+
+ c2_status_t err = mPool->fetchLinearBlock(size, usage, &block);
+ if (err != C2_OK) {
+ return nullptr;
+ }
+
+ return LinearBlockBuffer::Allocate(mFormat, block);
+ }
+
+private:
+ FlexBuffersImpl mImpl;
+};
+
+class EncryptedLinearInputBuffers : public LinearInputBuffers {
+public:
+ EncryptedLinearInputBuffers(
+ bool secure,
+ const sp<MemoryDealer> &dealer,
+ const sp<ICrypto> &crypto,
+ int32_t heapSeqNum,
+ size_t capacity,
+ const char *componentName, const char *name = "EncryptedInput")
+ : LinearInputBuffers(componentName, name),
+ mUsage({0, 0}),
+ mDealer(dealer),
+ mCrypto(crypto),
+ mHeapSeqNum(heapSeqNum) {
+ if (secure) {
+ mUsage = { C2MemoryUsage::READ_PROTECTED, 0 };
+ } else {
+ mUsage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ }
+ for (size_t i = 0; i < kMinInputBufferArraySize; ++i) {
+ sp<IMemory> memory = mDealer->allocate(capacity);
+ if (memory == nullptr) {
+ ALOGD("[%s] Failed to allocate memory from dealer: only %zu slots allocated", mName, i);
+ break;
+ }
+ mMemoryVector.push_back({std::weak_ptr<C2LinearBlock>(), memory});
+ }
+ }
+
+ ~EncryptedLinearInputBuffers() override {
+ }
+
+ sp<Codec2Buffer> alloc(size_t size) const override {
+ sp<IMemory> memory;
+ for (const Entry &entry : mMemoryVector) {
+ if (entry.block.expired()) {
+ memory = entry.memory;
+ break;
+ }
+ }
+ if (memory == nullptr) {
+ return nullptr;
+ }
+
+ std::shared_ptr<C2LinearBlock> block;
+ c2_status_t err = mPool->fetchLinearBlock(size, mUsage, &block);
+ if (err != C2_OK) {
+ return nullptr;
+ }
+
+ return new EncryptedLinearBlockBuffer(mFormat, block, memory, mHeapSeqNum);
+ }
+
+private:
+ C2MemoryUsage mUsage;
+ sp<MemoryDealer> mDealer;
+ sp<ICrypto> mCrypto;
+ int32_t mHeapSeqNum;
+ struct Entry {
+ std::weak_ptr<C2LinearBlock> block;
+ sp<IMemory> memory;
+ };
+ std::vector<Entry> mMemoryVector;
+};
+
+class GraphicMetadataInputBuffers : public CCodecBufferChannel::InputBuffers {
+public:
+ GraphicMetadataInputBuffers(const char *componentName, const char *name = "2D-MetaInput")
+ : InputBuffers(componentName, name),
+ mImpl(mName),
+ mStore(GetCodec2PlatformAllocatorStore()) { }
+ ~GraphicMetadataInputBuffers() override = default;
+
+ bool requestNewBuffer(size_t *index, sp<MediaCodecBuffer> *buffer) override {
+ std::shared_ptr<C2Allocator> alloc;
+ c2_status_t err = mStore->fetchAllocator(mPool->getAllocatorId(), &alloc);
+ if (err != C2_OK) {
+ return false;
+ }
+ sp<GraphicMetadataBuffer> newBuffer = new GraphicMetadataBuffer(mFormat, alloc);
+ if (newBuffer == nullptr) {
+ return false;
+ }
+ *index = mImpl.assignSlot(newBuffer);
+ *buffer = newBuffer;
+ return true;
+ }
+
+ bool releaseBuffer(
+ const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
+ return mImpl.releaseSlot(buffer, c2buffer);
+ }
+
+ bool expireComponentBuffer(
+ const std::shared_ptr<C2Buffer> &c2buffer) override {
+ return mImpl.expireComponentBuffer(c2buffer);
+ }
+
+ void flush() override {
+ // This is no-op by default unless we're in array mode where we need to keep
+ // track of the flushed work.
+ }
+
+ std::unique_ptr<CCodecBufferChannel::InputBuffers> toArrayMode(
+ size_t size) final {
+ std::shared_ptr<C2Allocator> alloc;
+ c2_status_t err = mStore->fetchAllocator(mPool->getAllocatorId(), &alloc);
+ if (err != C2_OK) {
+ return nullptr;
+ }
+ std::unique_ptr<InputBuffersArray> array(
+ new InputBuffersArray(mComponentName.c_str(), "2D-MetaInput[N]"));
+ array->setPool(mPool);
+ array->setFormat(mFormat);
+ array->initialize(
+ mImpl,
+ size,
+ [format = mFormat, alloc]() -> sp<Codec2Buffer> {
+ return new GraphicMetadataBuffer(format, alloc);
+ });
+ return std::move(array);
+ }
+
+private:
+ FlexBuffersImpl mImpl;
+ std::shared_ptr<C2AllocatorStore> mStore;
+};
+
+class GraphicInputBuffers : public CCodecBufferChannel::InputBuffers {
+public:
+ GraphicInputBuffers(const char *componentName, const char *name = "2D-BB-Input")
+ : InputBuffers(componentName, name),
+ mImpl(mName),
+ mLocalBufferPool(LocalBufferPool::Create(
+ kMaxLinearBufferSize * kMinInputBufferArraySize)) { }
+ ~GraphicInputBuffers() override = default;
+
+ bool requestNewBuffer(size_t *index, sp<MediaCodecBuffer> *buffer) override {
+ // TODO: proper max input size
+ // TODO: read usage from intf
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ sp<GraphicBlockBuffer> newBuffer = AllocateGraphicBuffer(
+ mPool, mFormat, HAL_PIXEL_FORMAT_YV12, usage, mLocalBufferPool);
+ if (newBuffer == nullptr) {
+ return false;
+ }
+ *index = mImpl.assignSlot(newBuffer);
+ *buffer = newBuffer;
+ return true;
+ }
+
+ bool releaseBuffer(
+ const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
+ return mImpl.releaseSlot(buffer, c2buffer);
+ }
+
+ bool expireComponentBuffer(
+ const std::shared_ptr<C2Buffer> &c2buffer) override {
+ return mImpl.expireComponentBuffer(c2buffer);
+ }
+ void flush() override {
+ // This is no-op by default unless we're in array mode where we need to keep
+ // track of the flushed work.
+ }
+
+ std::unique_ptr<CCodecBufferChannel::InputBuffers> toArrayMode(
+ size_t size) final {
+ std::unique_ptr<InputBuffersArray> array(
+ new InputBuffersArray(mComponentName.c_str(), "2D-BB-Input[N]"));
+ array->setPool(mPool);
+ array->setFormat(mFormat);
+ array->initialize(
+ mImpl,
+ size,
+ [pool = mPool, format = mFormat, lbp = mLocalBufferPool]() -> sp<Codec2Buffer> {
+ C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ return AllocateGraphicBuffer(
+ pool, format, HAL_PIXEL_FORMAT_YV12, usage, lbp);
+ });
+ return std::move(array);
+ }
+
+private:
+ FlexBuffersImpl mImpl;
+ std::shared_ptr<LocalBufferPool> mLocalBufferPool;
+};
+
+class DummyInputBuffers : public CCodecBufferChannel::InputBuffers {
+public:
+ DummyInputBuffers(const char *componentName, const char *name = "2D-Input")
+ : InputBuffers(componentName, name) { }
+
+ bool requestNewBuffer(size_t *, sp<MediaCodecBuffer> *) override {
+ return false;
+ }
+
+ bool releaseBuffer(
+ const sp<MediaCodecBuffer> &, std::shared_ptr<C2Buffer> *) override {
+ return false;
+ }
+
+ bool expireComponentBuffer(const std::shared_ptr<C2Buffer> &) override {
+ return false;
+ }
+ void flush() override {
+ }
+
+ std::unique_ptr<CCodecBufferChannel::InputBuffers> toArrayMode(
+ size_t) final {
+ return nullptr;
+ }
+
+ bool isArrayMode() const final { return true; }
+
+ void getArray(Vector<sp<MediaCodecBuffer>> *array) const final {
+ array->clear();
+ }
+};
+
+class OutputBuffersArray : public CCodecBufferChannel::OutputBuffers {
+public:
+ OutputBuffersArray(const char *componentName, const char *name = "Output[N]")
+ : OutputBuffers(componentName, name) { }
+ ~OutputBuffersArray() override = default;
+
+ void initialize(
+ const FlexBuffersImpl &impl,
+ size_t minSize,
+ std::function<sp<Codec2Buffer>()> allocate) {
+ mImpl.initialize(impl, minSize, allocate);
+ }
+
+ bool isArrayMode() const final { return true; }
+
+ std::unique_ptr<CCodecBufferChannel::OutputBuffers> toArrayMode(
+ size_t) final {
+ return nullptr;
+ }
+
+ status_t registerBuffer(
+ const std::shared_ptr<C2Buffer> &buffer,
+ size_t *index,
+ sp<MediaCodecBuffer> *clientBuffer) final {
+ sp<Codec2Buffer> c2Buffer;
+ status_t err = mImpl.grabBuffer(
+ index,
+ &c2Buffer,
+ [buffer](const sp<Codec2Buffer> &clientBuffer) {
+ return clientBuffer->canCopy(buffer);
+ });
+ if (err == WOULD_BLOCK) {
+ ALOGV("[%s] buffers temporarily not available", mName);
+ return err;
+ } else if (err != OK) {
+ ALOGD("[%s] grabBuffer failed: %d", mName, err);
+ return err;
+ }
+ c2Buffer->setFormat(mFormat);
+ if (!c2Buffer->copy(buffer)) {
+ ALOGD("[%s] copy buffer failed", mName);
+ return WOULD_BLOCK;
+ }
+ submit(c2Buffer);
+ *clientBuffer = c2Buffer;
+ ALOGV("[%s] grabbed buffer %zu", mName, *index);
+ return OK;
+ }
+
+ status_t registerCsd(
+ const C2StreamCsdInfo::output *csd,
+ size_t *index,
+ sp<MediaCodecBuffer> *clientBuffer) final {
+ sp<Codec2Buffer> c2Buffer;
+ status_t err = mImpl.grabBuffer(
+ index,
+ &c2Buffer,
+ [csd](const sp<Codec2Buffer> &clientBuffer) {
+ return clientBuffer->base() != nullptr
+ && clientBuffer->capacity() >= csd->flexCount();
+ });
+ if (err != OK) {
+ return err;
+ }
+ memcpy(c2Buffer->base(), csd->m.value, csd->flexCount());
+ c2Buffer->setRange(0, csd->flexCount());
+ c2Buffer->setFormat(mFormat);
+ *clientBuffer = c2Buffer;
+ return OK;
+ }
+
+ bool releaseBuffer(
+ const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
+ return mImpl.returnBuffer(buffer, c2buffer);
+ }
+
+ void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) override {
+ (void)flushedWork;
+ mImpl.flush();
+ if (mSkipCutBuffer != nullptr) {
+ mSkipCutBuffer->clear();
+ }
+ }
+
+ void getArray(Vector<sp<MediaCodecBuffer>> *array) const final {
+ mImpl.getArray(array);
+ }
+
+ void realloc(const std::shared_ptr<C2Buffer> &c2buffer) {
+ std::function<sp<Codec2Buffer>()> alloc;
+ switch (c2buffer->data().type()) {
+ case C2BufferData::LINEAR: {
+ uint32_t size = kLinearBufferSize;
+ const C2ConstLinearBlock &block = c2buffer->data().linearBlocks().front();
+ if (block.size() < kMaxLinearBufferSize / 2) {
+ size = block.size() * 2;
+ } else {
+ size = kMaxLinearBufferSize;
+ }
+ alloc = [format = mFormat, size] {
+ return new LocalLinearBuffer(format, new ABuffer(size));
+ };
+ break;
+ }
+
+ // TODO: add support
+ case C2BufferData::GRAPHIC: FALLTHROUGH_INTENDED;
+
+ case C2BufferData::INVALID: FALLTHROUGH_INTENDED;
+ case C2BufferData::LINEAR_CHUNKS: FALLTHROUGH_INTENDED;
+ case C2BufferData::GRAPHIC_CHUNKS: FALLTHROUGH_INTENDED;
+ default:
+ ALOGD("Unsupported type: %d", (int)c2buffer->data().type());
+ return;
+ }
+ mImpl.realloc(alloc);
+ }
+
+private:
+ BuffersArrayImpl mImpl;
+};
+
+class FlexOutputBuffers : public CCodecBufferChannel::OutputBuffers {
+public:
+ FlexOutputBuffers(const char *componentName, const char *name = "Output[]")
+ : OutputBuffers(componentName, name),
+ mImpl(mName) { }
+
+ status_t registerBuffer(
+ const std::shared_ptr<C2Buffer> &buffer,
+ size_t *index,
+ sp<MediaCodecBuffer> *clientBuffer) override {
+ sp<Codec2Buffer> newBuffer = wrap(buffer);
+ newBuffer->setFormat(mFormat);
+ *index = mImpl.assignSlot(newBuffer);
+ *clientBuffer = newBuffer;
+ ALOGV("[%s] registered buffer %zu", mName, *index);
+ return OK;
+ }
+
+ status_t registerCsd(
+ const C2StreamCsdInfo::output *csd,
+ size_t *index,
+ sp<MediaCodecBuffer> *clientBuffer) final {
+ sp<Codec2Buffer> newBuffer = new LocalLinearBuffer(
+ mFormat, ABuffer::CreateAsCopy(csd->m.value, csd->flexCount()));
+ *index = mImpl.assignSlot(newBuffer);
+ *clientBuffer = newBuffer;
+ return OK;
+ }
+
+ bool releaseBuffer(
+ const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
+ return mImpl.releaseSlot(buffer, c2buffer);
+ }
+
+ void flush(
+ const std::list<std::unique_ptr<C2Work>> &flushedWork) override {
+ (void) flushedWork;
+ // This is no-op by default unless we're in array mode where we need to keep
+ // track of the flushed work.
+ }
+
+ std::unique_ptr<CCodecBufferChannel::OutputBuffers> toArrayMode(
+ size_t size) override {
+ std::unique_ptr<OutputBuffersArray> array(new OutputBuffersArray(mComponentName.c_str()));
+ array->setFormat(mFormat);
+ array->transferSkipCutBuffer(mSkipCutBuffer);
+ array->initialize(
+ mImpl,
+ size,
+ [this]() { return allocateArrayBuffer(); });
+ return std::move(array);
+ }
+
+ /**
+ * Return an appropriate Codec2Buffer object for the type of buffers.
+ *
+ * \param buffer C2Buffer object to wrap.
+ *
+ * \return appropriate Codec2Buffer object to wrap |buffer|.
+ */
+ virtual sp<Codec2Buffer> wrap(const std::shared_ptr<C2Buffer> &buffer) = 0;
+
+ /**
+ * Return an appropriate Codec2Buffer object for the type of buffers, to be
+ * used as an empty array buffer.
+ *
+ * \return appropriate Codec2Buffer object which can copy() from C2Buffers.
+ */
+ virtual sp<Codec2Buffer> allocateArrayBuffer() = 0;
+
+private:
+ FlexBuffersImpl mImpl;
+};
+
+class LinearOutputBuffers : public FlexOutputBuffers {
+public:
+ LinearOutputBuffers(const char *componentName, const char *name = "1D-Output")
+ : FlexOutputBuffers(componentName, name) { }
+
+ void flush(
+ const std::list<std::unique_ptr<C2Work>> &flushedWork) override {
+ if (mSkipCutBuffer != nullptr) {
+ mSkipCutBuffer->clear();
+ }
+ FlexOutputBuffers::flush(flushedWork);
+ }
+
+ sp<Codec2Buffer> wrap(const std::shared_ptr<C2Buffer> &buffer) override {
+ if (buffer == nullptr) {
+ ALOGV("[%s] using a dummy buffer", mName);
+ return new LocalLinearBuffer(mFormat, new ABuffer(0));
+ }
+ if (buffer->data().type() != C2BufferData::LINEAR) {
+ ALOGV("[%s] non-linear buffer %d", mName, buffer->data().type());
+ // We expect linear output buffers from the component.
+ return nullptr;
+ }
+ if (buffer->data().linearBlocks().size() != 1u) {
+ ALOGV("[%s] no linear buffers", mName);
+ // We expect one and only one linear block from the component.
+ return nullptr;
+ }
+ sp<Codec2Buffer> clientBuffer = ConstLinearBlockBuffer::Allocate(mFormat, buffer);
+ submit(clientBuffer);
+ return clientBuffer;
+ }
+
+ sp<Codec2Buffer> allocateArrayBuffer() override {
+ // TODO: proper max output size
+ return new LocalLinearBuffer(mFormat, new ABuffer(kLinearBufferSize));
+ }
+};
+
+class GraphicOutputBuffers : public FlexOutputBuffers {
+public:
+ GraphicOutputBuffers(const char *componentName, const char *name = "2D-Output")
+ : FlexOutputBuffers(componentName, name) { }
+
+ sp<Codec2Buffer> wrap(const std::shared_ptr<C2Buffer> &buffer) override {
+ return new DummyContainerBuffer(mFormat, buffer);
+ }
+
+ sp<Codec2Buffer> allocateArrayBuffer() override {
+ return new DummyContainerBuffer(mFormat);
+ }
+};
+
+class RawGraphicOutputBuffers : public FlexOutputBuffers {
+public:
+ RawGraphicOutputBuffers(const char *componentName, const char *name = "2D-BB-Output")
+ : FlexOutputBuffers(componentName, name),
+ mLocalBufferPool(LocalBufferPool::Create(
+ kMaxLinearBufferSize * kMinOutputBufferArraySize)) { }
+ ~RawGraphicOutputBuffers() override = default;
+
+ sp<Codec2Buffer> wrap(const std::shared_ptr<C2Buffer> &buffer) override {
+ if (buffer == nullptr) {
+ sp<Codec2Buffer> c2buffer = ConstGraphicBlockBuffer::AllocateEmpty(
+ mFormat,
+ [lbp = mLocalBufferPool](size_t capacity) {
+ return lbp->newBuffer(capacity);
+ });
+ c2buffer->setRange(0, 0);
+ return c2buffer;
+ } else {
+ return ConstGraphicBlockBuffer::Allocate(
+ mFormat,
+ buffer,
+ [lbp = mLocalBufferPool](size_t capacity) {
+ return lbp->newBuffer(capacity);
+ });
+ }
+ }
+
+ sp<Codec2Buffer> allocateArrayBuffer() override {
+ return ConstGraphicBlockBuffer::AllocateEmpty(
+ mFormat,
+ [lbp = mLocalBufferPool](size_t capacity) {
+ return lbp->newBuffer(capacity);
+ });
+ }
+
+private:
+ std::shared_ptr<LocalBufferPool> mLocalBufferPool;
+};
+
+} // namespace
+
+CCodecBufferChannel::QueueGuard::QueueGuard(
+ CCodecBufferChannel::QueueSync &sync) : mSync(sync) {
+ Mutex::Autolock l(mSync.mGuardLock);
+ // At this point it's guaranteed that mSync is not under state transition,
+ // as we are holding its mutex.
+
+ Mutexed<CCodecBufferChannel::QueueSync::Counter>::Locked count(mSync.mCount);
+ if (count->value == -1) {
+ mRunning = false;
+ } else {
+ ++count->value;
+ mRunning = true;
+ }
+}
+
+CCodecBufferChannel::QueueGuard::~QueueGuard() {
+ if (mRunning) {
+ // We are not holding mGuardLock at this point so that QueueSync::stop() can
+ // keep holding the lock until mCount reaches zero.
+ Mutexed<CCodecBufferChannel::QueueSync::Counter>::Locked count(mSync.mCount);
+ --count->value;
+ count->cond.broadcast();
+ }
+}
+
+void CCodecBufferChannel::QueueSync::start() {
+ Mutex::Autolock l(mGuardLock);
+ // If stopped, it goes to running state; otherwise no-op.
+ Mutexed<Counter>::Locked count(mCount);
+ if (count->value == -1) {
+ count->value = 0;
+ }
+}
+
+void CCodecBufferChannel::QueueSync::stop() {
+ Mutex::Autolock l(mGuardLock);
+ Mutexed<Counter>::Locked count(mCount);
+ if (count->value == -1) {
+ // no-op
+ return;
+ }
+ // Holding mGuardLock here blocks creation of additional QueueGuard objects, so
+ // mCount can only decrement. In other words, threads that acquired the lock
+ // are allowed to finish execution but additional threads trying to acquire
+ // the lock at this point will block, and then get QueueGuard at STOPPED
+ // state.
+ while (count->value != 0) {
+ count.waitForCondition(count->cond);
+ }
+ count->value = -1;
+}
+
+// CCodecBufferChannel::PipelineCapacity
+
+CCodecBufferChannel::PipelineCapacity::PipelineCapacity()
+ : input(0), component(0),
+ mName("<UNKNOWN COMPONENT>") {
+}
+
+void CCodecBufferChannel::PipelineCapacity::initialize(
+ int newInput,
+ int newComponent,
+ const char* newName,
+ const char* callerTag) {
+ input.store(newInput, std::memory_order_relaxed);
+ component.store(newComponent, std::memory_order_relaxed);
+ mName = newName;
+ ALOGV("[%s] %s -- PipelineCapacity::initialize(): "
+ "pipeline availability initialized ==> "
+ "input = %d, component = %d",
+ mName, callerTag ? callerTag : "*",
+ newInput, newComponent);
+}
+
+bool CCodecBufferChannel::PipelineCapacity::allocate(const char* callerTag) {
+ int prevInput = input.fetch_sub(1, std::memory_order_relaxed);
+ int prevComponent = component.fetch_sub(1, std::memory_order_relaxed);
+ if (prevInput > 0 && prevComponent > 0) {
+ ALOGV("[%s] %s -- PipelineCapacity::allocate() returns true: "
+ "pipeline availability -1 all ==> "
+ "input = %d, component = %d",
+ mName, callerTag ? callerTag : "*",
+ prevInput - 1,
+ prevComponent - 1);
+ return true;
+ }
+ input.fetch_add(1, std::memory_order_relaxed);
+ component.fetch_add(1, std::memory_order_relaxed);
+ ALOGV("[%s] %s -- PipelineCapacity::allocate() returns false: "
+ "pipeline availability unchanged ==> "
+ "input = %d, component = %d",
+ mName, callerTag ? callerTag : "*",
+ prevInput,
+ prevComponent);
+ return false;
+}
+
+void CCodecBufferChannel::PipelineCapacity::free(const char* callerTag) {
+ int prevInput = input.fetch_add(1, std::memory_order_relaxed);
+ int prevComponent = component.fetch_add(1, std::memory_order_relaxed);
+ ALOGV("[%s] %s -- PipelineCapacity::free(): "
+ "pipeline availability +1 all ==> "
+ "input = %d, component = %d",
+ mName, callerTag ? callerTag : "*",
+ prevInput + 1,
+ prevComponent + 1);
+}
+
+int CCodecBufferChannel::PipelineCapacity::freeInputSlots(
+ size_t numDiscardedInputBuffers,
+ const char* callerTag) {
+ int prevInput = input.fetch_add(numDiscardedInputBuffers,
+ std::memory_order_relaxed);
+ ALOGV("[%s] %s -- PipelineCapacity::freeInputSlots(%zu): "
+ "pipeline availability +%zu input ==> "
+ "input = %d, component = %d",
+ mName, callerTag ? callerTag : "*",
+ numDiscardedInputBuffers,
+ numDiscardedInputBuffers,
+ prevInput + static_cast<int>(numDiscardedInputBuffers),
+ component.load(std::memory_order_relaxed));
+ return prevInput + static_cast<int>(numDiscardedInputBuffers);
+}
+
+int CCodecBufferChannel::PipelineCapacity::freeComponentSlot(
+ const char* callerTag) {
+ int prevComponent = component.fetch_add(1, std::memory_order_relaxed);
+ ALOGV("[%s] %s -- PipelineCapacity::freeComponentSlot(): "
+ "pipeline availability +1 component ==> "
+ "input = %d, component = %d",
+ mName, callerTag ? callerTag : "*",
+ input.load(std::memory_order_relaxed),
+ prevComponent + 1);
+ return prevComponent + 1;
+}
+
+// CCodecBufferChannel::ReorderStash
+
+CCodecBufferChannel::ReorderStash::ReorderStash() {
+ clear();
+}
+
+void CCodecBufferChannel::ReorderStash::clear() {
+ mPending.clear();
+ mStash.clear();
+ mDepth = 0;
+ mKey = C2Config::ORDINAL;
+}
+
+void CCodecBufferChannel::ReorderStash::setDepth(uint32_t depth) {
+ mPending.splice(mPending.end(), mStash);
+ mDepth = depth;
+}
+void CCodecBufferChannel::ReorderStash::setKey(C2Config::ordinal_key_t key) {
+ mPending.splice(mPending.end(), mStash);
+ mKey = key;
+}
+
+bool CCodecBufferChannel::ReorderStash::pop(Entry *entry) {
+ if (mPending.empty()) {
+ return false;
+ }
+ entry->buffer = mPending.front().buffer;
+ entry->timestamp = mPending.front().timestamp;
+ entry->flags = mPending.front().flags;
+ entry->ordinal = mPending.front().ordinal;
+ mPending.pop_front();
+ return true;
+}
+
+void CCodecBufferChannel::ReorderStash::emplace(
+ const std::shared_ptr<C2Buffer> &buffer,
+ int64_t timestamp,
+ int32_t flags,
+ const C2WorkOrdinalStruct &ordinal) {
+ for (auto it = mStash.begin(); it != mStash.end(); ++it) {
+ if (less(ordinal, it->ordinal)) {
+ mStash.emplace(it, buffer, timestamp, flags, ordinal);
+ return;
+ }
+ }
+ mStash.emplace_back(buffer, timestamp, flags, ordinal);
+ while (!mStash.empty() && mStash.size() > mDepth) {
+ mPending.push_back(mStash.front());
+ mStash.pop_front();
+ }
+}
+
+void CCodecBufferChannel::ReorderStash::defer(
+ const CCodecBufferChannel::ReorderStash::Entry &entry) {
+ mPending.push_front(entry);
+}
+
+bool CCodecBufferChannel::ReorderStash::hasPending() const {
+ return !mPending.empty();
+}
+
+bool CCodecBufferChannel::ReorderStash::less(
+ const C2WorkOrdinalStruct &o1, const C2WorkOrdinalStruct &o2) {
+ switch (mKey) {
+ case C2Config::ORDINAL: return o1.frameIndex < o2.frameIndex;
+ case C2Config::TIMESTAMP: return o1.timestamp < o2.timestamp;
+ case C2Config::CUSTOM: return o1.customOrdinal < o2.customOrdinal;
+ default:
+ ALOGD("Unrecognized key; default to timestamp");
+ return o1.frameIndex < o2.frameIndex;
+ }
+}
+
+// CCodecBufferChannel
+
+CCodecBufferChannel::CCodecBufferChannel(
+ const std::shared_ptr<CCodecCallback> &callback)
+ : mHeapSeqNum(-1),
+ mCCodecCallback(callback),
+ mFrameIndex(0u),
+ mFirstValidFrameIndex(0u),
+ mMetaMode(MODE_NONE),
+ mAvailablePipelineCapacity(),
+ mInputMetEos(false) {
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+ buffers->reset(new DummyInputBuffers(""));
+}
+
+CCodecBufferChannel::~CCodecBufferChannel() {
+ if (mCrypto != nullptr && mDealer != nullptr && mHeapSeqNum >= 0) {
+ mCrypto->unsetHeap(mHeapSeqNum);
+ }
+}
+
+void CCodecBufferChannel::setComponent(
+ const std::shared_ptr<Codec2Client::Component> &component) {
+ mComponent = component;
+ mComponentName = component->getName() + StringPrintf("#%d", int(uintptr_t(component.get()) % 997));
+ mName = mComponentName.c_str();
+}
+
+status_t CCodecBufferChannel::setInputSurface(
+ const std::shared_ptr<InputSurfaceWrapper> &surface) {
+ ALOGV("[%s] setInputSurface", mName);
+ mInputSurface = surface;
+ return mInputSurface->connect(mComponent);
+}
+
+status_t CCodecBufferChannel::signalEndOfInputStream() {
+ if (mInputSurface == nullptr) {
+ return INVALID_OPERATION;
+ }
+ return mInputSurface->signalEndOfInputStream();
+}
+
+status_t CCodecBufferChannel::queueInputBufferInternal(const sp<MediaCodecBuffer> &buffer) {
+ int64_t timeUs;
+ CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
+
+ if (mInputMetEos) {
+ ALOGD("[%s] buffers after EOS ignored (%lld us)", mName, (long long)timeUs);
+ return OK;
+ }
+
+ int32_t flags = 0;
+ int32_t tmp = 0;
+ bool eos = false;
+ if (buffer->meta()->findInt32("eos", &tmp) && tmp) {
+ eos = true;
+ mInputMetEos = true;
+ ALOGV("[%s] input EOS", mName);
+ }
+ if (buffer->meta()->findInt32("csd", &tmp) && tmp) {
+ flags |= C2FrameData::FLAG_CODEC_CONFIG;
+ }
+ ALOGV("[%s] queueInputBuffer: buffer->size() = %zu", mName, buffer->size());
+ std::unique_ptr<C2Work> work(new C2Work);
+ work->input.ordinal.timestamp = timeUs;
+ work->input.ordinal.frameIndex = mFrameIndex++;
+ // WORKAROUND: until codecs support handling work after EOS and max output sizing, use timestamp
+ // manipulation to achieve image encoding via video codec, and to constrain encoded output.
+ // Keep client timestamp in customOrdinal
+ work->input.ordinal.customOrdinal = timeUs;
+ work->input.buffers.clear();
+
+ if (buffer->size() > 0u) {
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+ std::shared_ptr<C2Buffer> c2buffer;
+ if (!(*buffers)->releaseBuffer(buffer, &c2buffer)) {
+ return -ENOENT;
+ }
+ work->input.buffers.push_back(c2buffer);
+ } else {
+ mAvailablePipelineCapacity.freeInputSlots(1, "queueInputBufferInternal");
+ if (eos) {
+ flags |= C2FrameData::FLAG_END_OF_STREAM;
+ }
+ }
+ work->input.flags = (C2FrameData::flags_t)flags;
+ // TODO: fill info's
+
+ work->input.configUpdate = std::move(mParamsToBeSet);
+ work->worklets.clear();
+ work->worklets.emplace_back(new C2Worklet);
+
+ std::list<std::unique_ptr<C2Work>> items;
+ items.push_back(std::move(work));
+ c2_status_t err = mComponent->queue(&items);
+
+ if (err == C2_OK && eos && buffer->size() > 0u) {
+ mCCodecCallback->onWorkQueued(false);
+ work.reset(new C2Work);
+ work->input.ordinal.timestamp = timeUs;
+ work->input.ordinal.frameIndex = mFrameIndex++;
+ // WORKAROUND: keep client timestamp in customOrdinal
+ work->input.ordinal.customOrdinal = timeUs;
+ work->input.buffers.clear();
+ work->input.flags = C2FrameData::FLAG_END_OF_STREAM;
+
+ items.clear();
+ items.push_back(std::move(work));
+ err = mComponent->queue(&items);
+ }
+ if (err == C2_OK) {
+ mCCodecCallback->onWorkQueued(eos);
+ }
+
+ feedInputBufferIfAvailableInternal();
+ return err;
+}
+
+status_t CCodecBufferChannel::setParameters(std::vector<std::unique_ptr<C2Param>> ¶ms) {
+ QueueGuard guard(mSync);
+ if (!guard.isRunning()) {
+ ALOGD("[%s] setParameters is only supported in the running state.", mName);
+ return -ENOSYS;
+ }
+ mParamsToBeSet.insert(mParamsToBeSet.end(),
+ std::make_move_iterator(params.begin()),
+ std::make_move_iterator(params.end()));
+ params.clear();
+ return OK;
+}
+
+status_t CCodecBufferChannel::queueInputBuffer(const sp<MediaCodecBuffer> &buffer) {
+ QueueGuard guard(mSync);
+ if (!guard.isRunning()) {
+ ALOGD("[%s] No more buffers should be queued at current state.", mName);
+ return -ENOSYS;
+ }
+ return queueInputBufferInternal(buffer);
+}
+
+status_t CCodecBufferChannel::queueSecureInputBuffer(
+ const sp<MediaCodecBuffer> &buffer, bool secure, const uint8_t *key,
+ const uint8_t *iv, CryptoPlugin::Mode mode, CryptoPlugin::Pattern pattern,
+ const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
+ AString *errorDetailMsg) {
+ QueueGuard guard(mSync);
+ if (!guard.isRunning()) {
+ ALOGD("[%s] No more buffers should be queued at current state.", mName);
+ return -ENOSYS;
+ }
+
+ if (!hasCryptoOrDescrambler()) {
+ return -ENOSYS;
+ }
+ sp<EncryptedLinearBlockBuffer> encryptedBuffer((EncryptedLinearBlockBuffer *)buffer.get());
+
+ ssize_t result = -1;
+ ssize_t codecDataOffset = 0;
+ if (mCrypto != nullptr) {
+ ICrypto::DestinationBuffer destination;
+ if (secure) {
+ destination.mType = ICrypto::kDestinationTypeNativeHandle;
+ destination.mHandle = encryptedBuffer->handle();
+ } else {
+ destination.mType = ICrypto::kDestinationTypeSharedMemory;
+ destination.mSharedMemory = mDecryptDestination;
+ }
+ ICrypto::SourceBuffer source;
+ encryptedBuffer->fillSourceBuffer(&source);
+ result = mCrypto->decrypt(
+ key, iv, mode, pattern, source, buffer->offset(),
+ subSamples, numSubSamples, destination, errorDetailMsg);
+ if (result < 0) {
+ return result;
+ }
+ if (destination.mType == ICrypto::kDestinationTypeSharedMemory) {
+ encryptedBuffer->copyDecryptedContent(mDecryptDestination, result);
+ }
+ } else {
+ // Here we cast CryptoPlugin::SubSample to hardware::cas::native::V1_0::SubSample
+ // directly, the structure definitions should match as checked in DescramblerImpl.cpp.
+ hidl_vec<SubSample> hidlSubSamples;
+ hidlSubSamples.setToExternal((SubSample *)subSamples, numSubSamples, false /*own*/);
+
+ hardware::cas::native::V1_0::SharedBuffer srcBuffer;
+ encryptedBuffer->fillSourceBuffer(&srcBuffer);
+
+ DestinationBuffer dstBuffer;
+ if (secure) {
+ dstBuffer.type = BufferType::NATIVE_HANDLE;
+ dstBuffer.secureMemory = hidl_handle(encryptedBuffer->handle());
+ } else {
+ dstBuffer.type = BufferType::SHARED_MEMORY;
+ dstBuffer.nonsecureMemory = srcBuffer;
+ }
+
+ CasStatus status = CasStatus::OK;
+ hidl_string detailedError;
+ ScramblingControl sctrl = ScramblingControl::UNSCRAMBLED;
+
+ if (key != nullptr) {
+ sctrl = (ScramblingControl)key[0];
+ // Adjust for the PES offset
+ codecDataOffset = key[2] | (key[3] << 8);
+ }
+
+ auto returnVoid = mDescrambler->descramble(
+ sctrl,
+ hidlSubSamples,
+ srcBuffer,
+ 0,
+ dstBuffer,
+ 0,
+ [&status, &result, &detailedError] (
+ CasStatus _status, uint32_t _bytesWritten,
+ const hidl_string& _detailedError) {
+ status = _status;
+ result = (ssize_t)_bytesWritten;
+ detailedError = _detailedError;
+ });
+
+ if (!returnVoid.isOk() || status != CasStatus::OK || result < 0) {
+ ALOGI("[%s] descramble failed, trans=%s, status=%d, result=%zd",
+ mName, returnVoid.description().c_str(), status, result);
+ return UNKNOWN_ERROR;
+ }
+
+ if (result < codecDataOffset) {
+ ALOGD("invalid codec data offset: %zd, result %zd", codecDataOffset, result);
+ return BAD_VALUE;
+ }
+
+ ALOGV("[%s] descramble succeeded, %zd bytes", mName, result);
+
+ if (dstBuffer.type == BufferType::SHARED_MEMORY) {
+ encryptedBuffer->copyDecryptedContentFromMemory(result);
+ }
+ }
+
+ buffer->setRange(codecDataOffset, result - codecDataOffset);
+ return queueInputBufferInternal(buffer);
+}
+
+void CCodecBufferChannel::feedInputBufferIfAvailable() {
+ QueueGuard guard(mSync);
+ if (!guard.isRunning()) {
+ ALOGV("[%s] We're not running --- no input buffer reported", mName);
+ return;
+ }
+ feedInputBufferIfAvailableInternal();
+}
+
+void CCodecBufferChannel::feedInputBufferIfAvailableInternal() {
+ while (!mInputMetEos &&
+ !mReorderStash.lock()->hasPending() &&
+ mAvailablePipelineCapacity.allocate("feedInputBufferIfAvailable")) {
+ sp<MediaCodecBuffer> inBuffer;
+ size_t index;
+ {
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+ if (!(*buffers)->requestNewBuffer(&index, &inBuffer)) {
+ ALOGV("[%s] no new buffer available", mName);
+ mAvailablePipelineCapacity.free("feedInputBufferIfAvailable");
+ break;
+ }
+ }
+ ALOGV("[%s] new input index = %zu [%p]", mName, index, inBuffer.get());
+ mCallback->onInputBufferAvailable(index, inBuffer);
+ }
+}
+
+status_t CCodecBufferChannel::renderOutputBuffer(
+ const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) {
+ std::shared_ptr<C2Buffer> c2Buffer;
+ {
+ Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
+ if (*buffers) {
+ (*buffers)->releaseBuffer(buffer, &c2Buffer);
+ }
+ }
+ if (!c2Buffer) {
+ return INVALID_OPERATION;
+ }
+ sendOutputBuffers();
+
+#if 0
+ const std::vector<std::shared_ptr<const C2Info>> infoParams = c2Buffer->info();
+ ALOGV("[%s] queuing gfx buffer with %zu infos", mName, infoParams.size());
+ for (const std::shared_ptr<const C2Info> &info : infoParams) {
+ AString res;
+ for (size_t ix = 0; ix + 3 < info->size(); ix += 4) {
+ if (ix) res.append(", ");
+ res.append(*((int32_t*)info.get() + (ix / 4)));
+ }
+ ALOGV(" [%s]", res.c_str());
+ }
+#endif
+ std::shared_ptr<const C2StreamRotationInfo::output> rotation =
+ std::static_pointer_cast<const C2StreamRotationInfo::output>(
+ c2Buffer->getInfo(C2StreamRotationInfo::output::PARAM_TYPE));
+ bool flip = rotation && (rotation->flip & 1);
+ uint32_t quarters = ((rotation ? rotation->value : 0) / 90) & 3;
+ uint32_t transform = 0;
+ switch (quarters) {
+ case 0: // no rotation
+ transform = flip ? HAL_TRANSFORM_FLIP_H : 0;
+ break;
+ case 1: // 90 degrees counter-clockwise
+ transform = flip ? (HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90)
+ : HAL_TRANSFORM_ROT_270;
+ break;
+ case 2: // 180 degrees
+ transform = flip ? HAL_TRANSFORM_FLIP_V : HAL_TRANSFORM_ROT_180;
+ break;
+ case 3: // 90 degrees clockwise
+ transform = flip ? (HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90)
+ : HAL_TRANSFORM_ROT_90;
+ break;
+ }
+
+ std::shared_ptr<const C2StreamSurfaceScalingInfo::output> surfaceScaling =
+ std::static_pointer_cast<const C2StreamSurfaceScalingInfo::output>(
+ c2Buffer->getInfo(C2StreamSurfaceScalingInfo::output::PARAM_TYPE));
+ uint32_t videoScalingMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
+ if (surfaceScaling) {
+ videoScalingMode = surfaceScaling->value;
+ }
+
+ // Use dataspace from format as it has the default aspects already applied
+ android_dataspace_t dataSpace = HAL_DATASPACE_UNKNOWN; // this is 0
+ (void)buffer->format()->findInt32("android._dataspace", (int32_t *)&dataSpace);
+
+ // HDR static info
+ std::shared_ptr<const C2StreamHdrStaticInfo::output> hdrStaticInfo =
+ std::static_pointer_cast<const C2StreamHdrStaticInfo::output>(
+ c2Buffer->getInfo(C2StreamHdrStaticInfo::output::PARAM_TYPE));
+
+ {
+ Mutexed<OutputSurface>::Locked output(mOutputSurface);
+ if (output->surface == nullptr) {
+ ALOGI("[%s] cannot render buffer without surface", mName);
+ return OK;
+ }
+ }
+
+ std::vector<C2ConstGraphicBlock> blocks = c2Buffer->data().graphicBlocks();
+ if (blocks.size() != 1u) {
+ ALOGD("[%s] expected 1 graphic block, but got %zu", mName, blocks.size());
+ return UNKNOWN_ERROR;
+ }
+ const C2ConstGraphicBlock &block = blocks.front();
+
+ // TODO: revisit this after C2Fence implementation.
+ android::IGraphicBufferProducer::QueueBufferInput qbi(
+ timestampNs,
+ false, // droppable
+ dataSpace,
+ Rect(blocks.front().crop().left,
+ blocks.front().crop().top,
+ blocks.front().crop().right(),
+ blocks.front().crop().bottom()),
+ videoScalingMode,
+ transform,
+ Fence::NO_FENCE, 0);
+ if (hdrStaticInfo) {
+ struct android_smpte2086_metadata smpte2086_meta = {
+ .displayPrimaryRed = {
+ hdrStaticInfo->mastering.red.x, hdrStaticInfo->mastering.red.y
+ },
+ .displayPrimaryGreen = {
+ hdrStaticInfo->mastering.green.x, hdrStaticInfo->mastering.green.y
+ },
+ .displayPrimaryBlue = {
+ hdrStaticInfo->mastering.blue.x, hdrStaticInfo->mastering.blue.y
+ },
+ .whitePoint = {
+ hdrStaticInfo->mastering.white.x, hdrStaticInfo->mastering.white.y
+ },
+ .maxLuminance = hdrStaticInfo->mastering.maxLuminance,
+ .minLuminance = hdrStaticInfo->mastering.minLuminance,
+ };
+
+ struct android_cta861_3_metadata cta861_meta = {
+ .maxContentLightLevel = hdrStaticInfo->maxCll,
+ .maxFrameAverageLightLevel = hdrStaticInfo->maxFall,
+ };
+
+ HdrMetadata hdr;
+ hdr.validTypes = HdrMetadata::SMPTE2086 | HdrMetadata::CTA861_3;
+ hdr.smpte2086 = smpte2086_meta;
+ hdr.cta8613 = cta861_meta;
+ qbi.setHdrMetadata(hdr);
+ }
+ android::IGraphicBufferProducer::QueueBufferOutput qbo;
+ status_t result = mComponent->queueToOutputSurface(block, qbi, &qbo);
+ if (result != OK) {
+ ALOGI("[%s] queueBuffer failed: %d", mName, result);
+ return result;
+ }
+ ALOGV("[%s] queue buffer successful", mName);
+
+ int64_t mediaTimeUs = 0;
+ (void)buffer->meta()->findInt64("timeUs", &mediaTimeUs);
+ mCCodecCallback->onOutputFramesRendered(mediaTimeUs, timestampNs);
+
+ return OK;
+}
+
+status_t CCodecBufferChannel::discardBuffer(const sp<MediaCodecBuffer> &buffer) {
+ ALOGV("[%s] discardBuffer: %p", mName, buffer.get());
+ bool released = false;
+ {
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+ if (*buffers && (*buffers)->releaseBuffer(buffer, nullptr)) {
+ buffers.unlock();
+ released = true;
+ mAvailablePipelineCapacity.freeInputSlots(1, "discardBuffer");
+ }
+ }
+ {
+ Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
+ if (*buffers && (*buffers)->releaseBuffer(buffer, nullptr)) {
+ buffers.unlock();
+ released = true;
+ }
+ }
+ if (released) {
+ feedInputBufferIfAvailable();
+ sendOutputBuffers();
+ } else {
+ ALOGD("[%s] MediaCodec discarded an unknown buffer", mName);
+ }
+ return OK;
+}
+
+void CCodecBufferChannel::getInputBufferArray(Vector<sp<MediaCodecBuffer>> *array) {
+ array->clear();
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+
+ if (!(*buffers)->isArrayMode()) {
+ *buffers = (*buffers)->toArrayMode(kMinInputBufferArraySize);
+ }
+
+ (*buffers)->getArray(array);
+}
+
+void CCodecBufferChannel::getOutputBufferArray(Vector<sp<MediaCodecBuffer>> *array) {
+ array->clear();
+ Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
+
+ if (!(*buffers)->isArrayMode()) {
+ *buffers = (*buffers)->toArrayMode(kMinOutputBufferArraySize);
+ }
+
+ (*buffers)->getArray(array);
+}
+
+status_t CCodecBufferChannel::start(
+ const sp<AMessage> &inputFormat, const sp<AMessage> &outputFormat) {
+ C2StreamBufferTypeSetting::input iStreamFormat(0u);
+ C2StreamBufferTypeSetting::output oStreamFormat(0u);
+ C2PortReorderBufferDepthTuning::output reorderDepth;
+ C2PortReorderKeySetting::output reorderKey;
+ c2_status_t err = mComponent->query(
+ {
+ &iStreamFormat,
+ &oStreamFormat,
+ &reorderDepth,
+ &reorderKey,
+ },
+ {},
+ C2_DONT_BLOCK,
+ nullptr);
+ if (err == C2_BAD_INDEX) {
+ if (!iStreamFormat || !oStreamFormat) {
+ return UNKNOWN_ERROR;
+ }
+ } else if (err != C2_OK) {
+ return UNKNOWN_ERROR;
+ }
+
+ {
+ Mutexed<ReorderStash>::Locked reorder(mReorderStash);
+ reorder->clear();
+ if (reorderDepth) {
+ reorder->setDepth(reorderDepth.value);
+ }
+ if (reorderKey) {
+ reorder->setKey(reorderKey.value);
+ }
+ }
+ // TODO: get this from input format
+ bool secure = mComponent->getName().find(".secure") != std::string::npos;
+
+ std::shared_ptr<C2AllocatorStore> allocatorStore = GetCodec2PlatformAllocatorStore();
+ int poolMask = property_get_int32(
+ "debug.stagefright.c2-poolmask",
+ 1 << C2PlatformAllocatorStore::ION |
+ 1 << C2PlatformAllocatorStore::BUFFERQUEUE);
+
+ if (inputFormat != nullptr) {
+ bool graphic = (iStreamFormat.value == C2FormatVideo);
+ std::shared_ptr<C2BlockPool> pool;
+ {
+ Mutexed<BlockPools>::Locked pools(mBlockPools);
+
+ // set default allocator ID.
+ pools->inputAllocatorId = (graphic) ? C2PlatformAllocatorStore::GRALLOC
+ : C2PlatformAllocatorStore::ION;
+
+ // query C2PortAllocatorsTuning::input from component. If an allocator ID is obtained
+ // from component, create the input block pool with given ID. Otherwise, use default IDs.
+ std::vector<std::unique_ptr<C2Param>> params;
+ err = mComponent->query({ },
+ { C2PortAllocatorsTuning::input::PARAM_TYPE },
+ C2_DONT_BLOCK,
+ ¶ms);
+ if ((err != C2_OK && err != C2_BAD_INDEX) || params.size() != 1) {
+ ALOGD("[%s] Query input allocators returned %zu params => %s (%u)",
+ mName, params.size(), asString(err), err);
+ } else if (err == C2_OK && params.size() == 1) {
+ C2PortAllocatorsTuning::input *inputAllocators =
+ C2PortAllocatorsTuning::input::From(params[0].get());
+ if (inputAllocators && inputAllocators->flexCount() > 0) {
+ std::shared_ptr<C2Allocator> allocator;
+ // verify allocator IDs and resolve default allocator
+ allocatorStore->fetchAllocator(inputAllocators->m.values[0], &allocator);
+ if (allocator) {
+ pools->inputAllocatorId = allocator->getId();
+ } else {
+ ALOGD("[%s] component requested invalid input allocator ID %u",
+ mName, inputAllocators->m.values[0]);
+ }
+ }
+ }
+
+ // TODO: use C2Component wrapper to associate this pool with ourselves
+ if ((poolMask >> pools->inputAllocatorId) & 1) {
+ err = CreateCodec2BlockPool(pools->inputAllocatorId, nullptr, &pool);
+ ALOGD("[%s] Created input block pool with allocatorID %u => poolID %llu - %s (%d)",
+ mName, pools->inputAllocatorId,
+ (unsigned long long)(pool ? pool->getLocalId() : 111000111),
+ asString(err), err);
+ } else {
+ err = C2_NOT_FOUND;
+ }
+ if (err != C2_OK) {
+ C2BlockPool::local_id_t inputPoolId =
+ graphic ? C2BlockPool::BASIC_GRAPHIC : C2BlockPool::BASIC_LINEAR;
+ err = GetCodec2BlockPool(inputPoolId, nullptr, &pool);
+ ALOGD("[%s] Using basic input block pool with poolID %llu => got %llu - %s (%d)",
+ mName, (unsigned long long)inputPoolId,
+ (unsigned long long)(pool ? pool->getLocalId() : 111000111),
+ asString(err), err);
+ if (err != C2_OK) {
+ return NO_MEMORY;
+ }
+ }
+ pools->inputPool = pool;
+ }
+
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+ if (graphic) {
+ if (mInputSurface) {
+ buffers->reset(new DummyInputBuffers(mName));
+ } else if (mMetaMode == MODE_ANW) {
+ buffers->reset(new GraphicMetadataInputBuffers(mName));
+ } else {
+ buffers->reset(new GraphicInputBuffers(mName));
+ }
+ } else {
+ if (hasCryptoOrDescrambler()) {
+ int32_t capacity = kLinearBufferSize;
+ (void)inputFormat->findInt32(KEY_MAX_INPUT_SIZE, &capacity);
+ if ((size_t)capacity > kMaxLinearBufferSize) {
+ ALOGD("client requested %d, capped to %zu", capacity, kMaxLinearBufferSize);
+ capacity = kMaxLinearBufferSize;
+ }
+ if (mDealer == nullptr) {
+ mDealer = new MemoryDealer(
+ align(capacity, MemoryDealer::getAllocationAlignment())
+ * (kMinInputBufferArraySize + 1),
+ "EncryptedLinearInputBuffers");
+ mDecryptDestination = mDealer->allocate((size_t)capacity);
+ }
+ if (mCrypto != nullptr && mHeapSeqNum < 0) {
+ mHeapSeqNum = mCrypto->setHeap(mDealer->getMemoryHeap());
+ } else {
+ mHeapSeqNum = -1;
+ }
+ buffers->reset(new EncryptedLinearInputBuffers(
+ secure, mDealer, mCrypto, mHeapSeqNum, (size_t)capacity, mName));
+ } else {
+ buffers->reset(new LinearInputBuffers(mName));
+ }
+ }
+ (*buffers)->setFormat(inputFormat);
+
+ if (err == C2_OK) {
+ (*buffers)->setPool(pool);
+ } else {
+ // TODO: error
+ }
+ }
+
+ if (outputFormat != nullptr) {
+ sp<IGraphicBufferProducer> outputSurface;
+ uint32_t outputGeneration;
+ {
+ Mutexed<OutputSurface>::Locked output(mOutputSurface);
+ outputSurface = output->surface ?
+ output->surface->getIGraphicBufferProducer() : nullptr;
+ outputGeneration = output->generation;
+ }
+
+ bool graphic = (oStreamFormat.value == C2FormatVideo);
+ C2BlockPool::local_id_t outputPoolId_;
+
+ {
+ Mutexed<BlockPools>::Locked pools(mBlockPools);
+
+ // set default allocator ID.
+ pools->outputAllocatorId = (graphic) ? C2PlatformAllocatorStore::GRALLOC
+ : C2PlatformAllocatorStore::ION;
+
+ // query C2PortAllocatorsTuning::output from component, or use default allocator if
+ // unsuccessful.
+ std::vector<std::unique_ptr<C2Param>> params;
+ err = mComponent->query({ },
+ { C2PortAllocatorsTuning::output::PARAM_TYPE },
+ C2_DONT_BLOCK,
+ ¶ms);
+ if ((err != C2_OK && err != C2_BAD_INDEX) || params.size() != 1) {
+ ALOGD("[%s] Query output allocators returned %zu params => %s (%u)",
+ mName, params.size(), asString(err), err);
+ } else if (err == C2_OK && params.size() == 1) {
+ C2PortAllocatorsTuning::output *outputAllocators =
+ C2PortAllocatorsTuning::output::From(params[0].get());
+ if (outputAllocators && outputAllocators->flexCount() > 0) {
+ std::shared_ptr<C2Allocator> allocator;
+ // verify allocator IDs and resolve default allocator
+ allocatorStore->fetchAllocator(outputAllocators->m.values[0], &allocator);
+ if (allocator) {
+ pools->outputAllocatorId = allocator->getId();
+ } else {
+ ALOGD("[%s] component requested invalid output allocator ID %u",
+ mName, outputAllocators->m.values[0]);
+ }
+ }
+ }
+
+ // use bufferqueue if outputting to a surface.
+ // query C2PortSurfaceAllocatorTuning::output from component, or use default allocator
+ // if unsuccessful.
+ if (outputSurface) {
+ params.clear();
+ err = mComponent->query({ },
+ { C2PortSurfaceAllocatorTuning::output::PARAM_TYPE },
+ C2_DONT_BLOCK,
+ ¶ms);
+ if ((err != C2_OK && err != C2_BAD_INDEX) || params.size() != 1) {
+ ALOGD("[%s] Query output surface allocator returned %zu params => %s (%u)",
+ mName, params.size(), asString(err), err);
+ } else if (err == C2_OK && params.size() == 1) {
+ C2PortSurfaceAllocatorTuning::output *surfaceAllocator =
+ C2PortSurfaceAllocatorTuning::output::From(params[0].get());
+ if (surfaceAllocator) {
+ std::shared_ptr<C2Allocator> allocator;
+ // verify allocator IDs and resolve default allocator
+ allocatorStore->fetchAllocator(surfaceAllocator->value, &allocator);
+ if (allocator) {
+ pools->outputAllocatorId = allocator->getId();
+ } else {
+ ALOGD("[%s] component requested invalid surface output allocator ID %u",
+ mName, surfaceAllocator->value);
+ err = C2_BAD_VALUE;
+ }
+ }
+ }
+ if (pools->outputAllocatorId == C2PlatformAllocatorStore::GRALLOC
+ && err != C2_OK
+ && ((poolMask >> C2PlatformAllocatorStore::BUFFERQUEUE) & 1)) {
+ pools->outputAllocatorId = C2PlatformAllocatorStore::BUFFERQUEUE;
+ }
+ }
+
+ if ((poolMask >> pools->outputAllocatorId) & 1) {
+ err = mComponent->createBlockPool(
+ pools->outputAllocatorId, &pools->outputPoolId, &pools->outputPoolIntf);
+ ALOGI("[%s] Created output block pool with allocatorID %u => poolID %llu - %s",
+ mName, pools->outputAllocatorId,
+ (unsigned long long)pools->outputPoolId,
+ asString(err));
+ } else {
+ err = C2_NOT_FOUND;
+ }
+ if (err != C2_OK) {
+ // use basic pool instead
+ pools->outputPoolId =
+ graphic ? C2BlockPool::BASIC_GRAPHIC : C2BlockPool::BASIC_LINEAR;
+ }
+
+ // Configure output block pool ID as parameter C2PortBlockPoolsTuning::output to
+ // component.
+ std::unique_ptr<C2PortBlockPoolsTuning::output> poolIdsTuning =
+ C2PortBlockPoolsTuning::output::AllocUnique({ pools->outputPoolId });
+
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ err = mComponent->config({ poolIdsTuning.get() }, C2_MAY_BLOCK, &failures);
+ ALOGD("[%s] Configured output block pool ids %llu => %s",
+ mName, (unsigned long long)poolIdsTuning->m.values[0], asString(err));
+ outputPoolId_ = pools->outputPoolId;
+ }
+
+ Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
+
+ if (graphic) {
+ if (outputSurface) {
+ buffers->reset(new GraphicOutputBuffers(mName));
+ } else {
+ buffers->reset(new RawGraphicOutputBuffers(mName));
+ }
+ } else {
+ buffers->reset(new LinearOutputBuffers(mName));
+ }
+ (*buffers)->setFormat(outputFormat->dup());
+
+
+ // Try to set output surface to created block pool if given.
+ if (outputSurface) {
+ mComponent->setOutputSurface(
+ outputPoolId_,
+ outputSurface,
+ outputGeneration);
+ }
+
+ if (oStreamFormat.value == C2BufferData::LINEAR
+ && mComponentName.find("c2.qti.") == std::string::npos) {
+ // WORKAROUND: if we're using early CSD workaround we convert to
+ // array mode, to appease apps assuming the output
+ // buffers to be of the same size.
+ (*buffers) = (*buffers)->toArrayMode(kMinOutputBufferArraySize);
+
+ int32_t channelCount;
+ int32_t sampleRate;
+ if (outputFormat->findInt32(KEY_CHANNEL_COUNT, &channelCount)
+ && outputFormat->findInt32(KEY_SAMPLE_RATE, &sampleRate)) {
+ int32_t delay = 0;
+ int32_t padding = 0;;
+ if (!outputFormat->findInt32("encoder-delay", &delay)) {
+ delay = 0;
+ }
+ if (!outputFormat->findInt32("encoder-padding", &padding)) {
+ padding = 0;
+ }
+ if (delay || padding) {
+ // We need write access to the buffers, and we're already in
+ // array mode.
+ (*buffers)->initSkipCutBuffer(delay, padding, sampleRate, channelCount);
+ }
+ }
+ }
+ }
+
+ // Set up pipeline control. This has to be done after mInputBuffers and
+ // mOutputBuffers are initialized to make sure that lingering callbacks
+ // about buffers from the previous generation do not interfere with the
+ // newly initialized pipeline capacity.
+
+ // Query delays
+ C2PortRequestedDelayTuning::input inputDelay;
+ C2PortRequestedDelayTuning::output outputDelay;
+ C2RequestedPipelineDelayTuning pipelineDelay;
+#if 0
+ err = mComponent->query(
+ { &inputDelay, &pipelineDelay, &outputDelay },
+ {},
+ C2_DONT_BLOCK,
+ nullptr);
+ mAvailablePipelineCapacity.initialize(
+ inputDelay,
+ inputDelay + pipelineDelay,
+ inputDelay + pipelineDelay + outputDelay,
+ mName);
+#else
+ mAvailablePipelineCapacity.initialize(
+ kMinInputBufferArraySize,
+ kMaxPipelineCapacity,
+ mName);
+#endif
+
+ mInputMetEos = false;
+ mSync.start();
+ return OK;
+}
+
+status_t CCodecBufferChannel::requestInitialInputBuffers() {
+ if (mInputSurface) {
+ return OK;
+ }
+
+ C2StreamFormatConfig::output oStreamFormat(0u);
+ c2_status_t err = mComponent->query({ &oStreamFormat }, {}, C2_DONT_BLOCK, nullptr);
+ if (err != C2_OK) {
+ return UNKNOWN_ERROR;
+ }
+ std::vector<sp<MediaCodecBuffer>> toBeQueued;
+ // TODO: use proper buffer depth instead of this random value
+ for (size_t i = 0; i < kMinInputBufferArraySize; ++i) {
+ size_t index;
+ sp<MediaCodecBuffer> buffer;
+ {
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+ if (!(*buffers)->requestNewBuffer(&index, &buffer)) {
+ if (i == 0) {
+ ALOGW("[%s] start: cannot allocate memory at all", mName);
+ return NO_MEMORY;
+ } else {
+ ALOGV("[%s] start: cannot allocate memory, only %zu buffers allocated",
+ mName, i);
+ }
+ break;
+ }
+ }
+ if (buffer) {
+ Mutexed<std::list<sp<ABuffer>>>::Locked configs(mFlushedConfigs);
+ ALOGV("[%s] input buffer %zu available", mName, index);
+ bool post = true;
+ if (!configs->empty()) {
+ sp<ABuffer> config = configs->front();
+ if (buffer->capacity() >= config->size()) {
+ memcpy(buffer->base(), config->data(), config->size());
+ buffer->setRange(0, config->size());
+ buffer->meta()->clear();
+ buffer->meta()->setInt64("timeUs", 0);
+ buffer->meta()->setInt32("csd", 1);
+ post = false;
+ } else {
+ ALOGD("[%s] buffer capacity too small for the config (%zu < %zu)",
+ mName, buffer->capacity(), config->size());
+ }
+ } else if (oStreamFormat.value == C2BufferData::LINEAR && i == 0
+ && mComponentName.find("c2.qti.") == std::string::npos) {
+ // WORKAROUND: Some apps expect CSD available without queueing
+ // any input. Queue an empty buffer to get the CSD.
+ buffer->setRange(0, 0);
+ buffer->meta()->clear();
+ buffer->meta()->setInt64("timeUs", 0);
+ post = false;
+ }
+ if (mAvailablePipelineCapacity.allocate("requestInitialInputBuffers")) {
+ if (post) {
+ mCallback->onInputBufferAvailable(index, buffer);
+ } else {
+ toBeQueued.emplace_back(buffer);
+ }
+ } else {
+ ALOGD("[%s] pipeline is full while requesting %zu-th input buffer",
+ mName, i);
+ }
+ }
+ }
+ for (const sp<MediaCodecBuffer> &buffer : toBeQueued) {
+ if (queueInputBufferInternal(buffer) != OK) {
+ mAvailablePipelineCapacity.freeComponentSlot("requestInitialInputBuffers");
+ }
+ }
+ return OK;
+}
+
+void CCodecBufferChannel::stop() {
+ mSync.stop();
+ mFirstValidFrameIndex = mFrameIndex.load(std::memory_order_relaxed);
+ if (mInputSurface != nullptr) {
+ mInputSurface->disconnect();
+ mInputSurface.reset();
+ }
+}
+
+void CCodecBufferChannel::flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) {
+ ALOGV("[%s] flush", mName);
+ {
+ Mutexed<std::list<sp<ABuffer>>>::Locked configs(mFlushedConfigs);
+ for (const std::unique_ptr<C2Work> &work : flushedWork) {
+ if (!(work->input.flags & C2FrameData::FLAG_CODEC_CONFIG)) {
+ continue;
+ }
+ if (work->input.buffers.empty()
+ || work->input.buffers.front()->data().linearBlocks().empty()) {
+ ALOGD("[%s] no linear codec config data found", mName);
+ continue;
+ }
+ C2ReadView view =
+ work->input.buffers.front()->data().linearBlocks().front().map().get();
+ if (view.error() != C2_OK) {
+ ALOGD("[%s] failed to map flushed codec config data: %d", mName, view.error());
+ continue;
+ }
+ configs->push_back(ABuffer::CreateAsCopy(view.data(), view.capacity()));
+ ALOGV("[%s] stashed flushed codec config data (size=%u)", mName, view.capacity());
+ }
+ }
+ {
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+ (*buffers)->flush();
+ }
+ {
+ Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
+ (*buffers)->flush(flushedWork);
+ }
+}
+
+void CCodecBufferChannel::onWorkDone(
+ std::unique_ptr<C2Work> work, const sp<AMessage> &outputFormat,
+ const C2StreamInitDataInfo::output *initData,
+ size_t numDiscardedInputBuffers) {
+ if (handleWork(std::move(work), outputFormat, initData)) {
+ mAvailablePipelineCapacity.freeInputSlots(numDiscardedInputBuffers,
+ "onWorkDone");
+ feedInputBufferIfAvailable();
+ }
+}
+
+void CCodecBufferChannel::onInputBufferDone(
+ const std::shared_ptr<C2Buffer>& buffer) {
+ bool newInputSlotAvailable;
+ {
+ Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
+ newInputSlotAvailable = (*buffers)->expireComponentBuffer(buffer);
+ if (newInputSlotAvailable) {
+ mAvailablePipelineCapacity.freeInputSlots(1, "onInputBufferDone");
+ }
+ }
+ if (newInputSlotAvailable) {
+ feedInputBufferIfAvailable();
+ }
+}
+
+bool CCodecBufferChannel::handleWork(
+ std::unique_ptr<C2Work> work,
+ const sp<AMessage> &outputFormat,
+ const C2StreamInitDataInfo::output *initData) {
+ if ((work->input.ordinal.frameIndex - mFirstValidFrameIndex.load()).peek() < 0) {
+ // Discard frames from previous generation.
+ ALOGD("[%s] Discard frames from previous generation.", mName);
+ return false;
+ }
+
+ if (work->worklets.size() != 1u
+ || !work->worklets.front()
+ || !(work->worklets.front()->output.flags & C2FrameData::FLAG_INCOMPLETE)) {
+ mAvailablePipelineCapacity.freeComponentSlot("handleWork");
+ }
+
+ if (work->result == C2_NOT_FOUND) {
+ ALOGD("[%s] flushed work; ignored.", mName);
+ return true;
+ }
+
+ if (work->result != C2_OK) {
+ ALOGD("[%s] work failed to complete: %d", mName, work->result);
+ mCCodecCallback->onError(work->result, ACTION_CODE_FATAL);
+ return false;
+ }
+
+ // NOTE: MediaCodec usage supposedly have only one worklet
+ if (work->worklets.size() != 1u) {
+ ALOGI("[%s] onWorkDone: incorrect number of worklets: %zu",
+ mName, work->worklets.size());
+ mCCodecCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ return false;
+ }
+
+ const std::unique_ptr<C2Worklet> &worklet = work->worklets.front();
+
+ std::shared_ptr<C2Buffer> buffer;
+ // NOTE: MediaCodec usage supposedly have only one output stream.
+ if (worklet->output.buffers.size() > 1u) {
+ ALOGI("[%s] onWorkDone: incorrect number of output buffers: %zu",
+ mName, worklet->output.buffers.size());
+ mCCodecCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ return false;
+ } else if (worklet->output.buffers.size() == 1u) {
+ buffer = worklet->output.buffers[0];
+ if (!buffer) {
+ ALOGD("[%s] onWorkDone: nullptr found in buffers; ignored.", mName);
+ }
+ }
+
+ while (!worklet->output.configUpdate.empty()) {
+ std::unique_ptr<C2Param> param;
+ worklet->output.configUpdate.back().swap(param);
+ worklet->output.configUpdate.pop_back();
+ switch (param->coreIndex().coreIndex()) {
+ case C2PortReorderBufferDepthTuning::CORE_INDEX: {
+ C2PortReorderBufferDepthTuning::output reorderDepth;
+ if (reorderDepth.updateFrom(*param)) {
+ mReorderStash.lock()->setDepth(reorderDepth.value);
+ ALOGV("[%s] onWorkDone: updated reorder depth to %u",
+ mName, reorderDepth.value);
+ } else {
+ ALOGD("[%s] onWorkDone: failed to read reorder depth", mName);
+ }
+ break;
+ }
+ case C2PortReorderKeySetting::CORE_INDEX: {
+ C2PortReorderKeySetting::output reorderKey;
+ if (reorderKey.updateFrom(*param)) {
+ mReorderStash.lock()->setKey(reorderKey.value);
+ ALOGV("[%s] onWorkDone: updated reorder key to %u",
+ mName, reorderKey.value);
+ } else {
+ ALOGD("[%s] onWorkDone: failed to read reorder key", mName);
+ }
+ break;
+ }
+ default:
+ ALOGV("[%s] onWorkDone: unrecognized config update (%08X)",
+ mName, param->index());
+ break;
+ }
+ }
+
+ if (outputFormat != nullptr) {
+ Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
+ ALOGD("[%s] onWorkDone: output format changed to %s",
+ mName, outputFormat->debugString().c_str());
+ (*buffers)->setFormat(outputFormat);
+
+ AString mediaType;
+ if (outputFormat->findString(KEY_MIME, &mediaType)
+ && mediaType == MIMETYPE_AUDIO_RAW) {
+ int32_t channelCount;
+ int32_t sampleRate;
+ if (outputFormat->findInt32(KEY_CHANNEL_COUNT, &channelCount)
+ && outputFormat->findInt32(KEY_SAMPLE_RATE, &sampleRate)) {
+ (*buffers)->updateSkipCutBuffer(sampleRate, channelCount);
+ }
+ }
+ }
+
+ int32_t flags = 0;
+ if (worklet->output.flags & C2FrameData::FLAG_END_OF_STREAM) {
+ flags |= MediaCodec::BUFFER_FLAG_EOS;
+ ALOGV("[%s] onWorkDone: output EOS", mName);
+ }
+
+ sp<MediaCodecBuffer> outBuffer;
+ size_t index;
+
+ // WORKAROUND: adjust output timestamp based on client input timestamp and codec
+ // input timestamp. Codec output timestamp (in the timestamp field) shall correspond to
+ // the codec input timestamp, but client output timestamp should (reported in timeUs)
+ // shall correspond to the client input timesamp (in customOrdinal). By using the
+ // delta between the two, this allows for some timestamp deviation - e.g. if one input
+ // produces multiple output.
+ c2_cntr64_t timestamp =
+ worklet->output.ordinal.timestamp + work->input.ordinal.customOrdinal
+ - work->input.ordinal.timestamp;
+ ALOGV("[%s] onWorkDone: input %lld, codec %lld => output %lld => %lld",
+ mName,
+ work->input.ordinal.customOrdinal.peekll(),
+ work->input.ordinal.timestamp.peekll(),
+ worklet->output.ordinal.timestamp.peekll(),
+ timestamp.peekll());
+
+ if (initData != nullptr) {
+ Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
+ if ((*buffers)->registerCsd(initData, &index, &outBuffer) == OK) {
+ outBuffer->meta()->setInt64("timeUs", timestamp.peek());
+ outBuffer->meta()->setInt32("flags", MediaCodec::BUFFER_FLAG_CODECCONFIG);
+ ALOGV("[%s] onWorkDone: csd index = %zu [%p]", mName, index, outBuffer.get());
+
+ buffers.unlock();
+ mCallback->onOutputBufferAvailable(index, outBuffer);
+ buffers.lock();
+ } else {
+ ALOGD("[%s] onWorkDone: unable to register csd", mName);
+ buffers.unlock();
+ mCCodecCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ buffers.lock();
+ return false;
+ }
+ }
+
+ if (!buffer && !flags) {
+ ALOGV("[%s] onWorkDone: Not reporting output buffer (%lld)",
+ mName, work->input.ordinal.frameIndex.peekull());
+ return true;
+ }
+
+ if (buffer) {
+ for (const std::shared_ptr<const C2Info> &info : buffer->info()) {
+ // TODO: properly translate these to metadata
+ switch (info->coreIndex().coreIndex()) {
+ case C2StreamPictureTypeMaskInfo::CORE_INDEX:
+ if (((C2StreamPictureTypeMaskInfo *)info.get())->value & C2PictureTypeKeyFrame) {
+ flags |= MediaCodec::BUFFER_FLAG_SYNCFRAME;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ {
+ Mutexed<ReorderStash>::Locked reorder(mReorderStash);
+ reorder->emplace(buffer, timestamp.peek(), flags, worklet->output.ordinal);
+ if (flags & MediaCodec::BUFFER_FLAG_EOS) {
+ // Flush reorder stash
+ reorder->setDepth(0);
+ }
+ }
+ sendOutputBuffers();
+ return true;
+}
+
+void CCodecBufferChannel::sendOutputBuffers() {
+ ReorderStash::Entry entry;
+ sp<MediaCodecBuffer> outBuffer;
+ size_t index;
+
+ while (true) {
+ {
+ Mutexed<ReorderStash>::Locked reorder(mReorderStash);
+ if (!reorder->hasPending()) {
+ break;
+ }
+ if (!reorder->pop(&entry)) {
+ break;
+ }
+ }
+ Mutexed<std::unique_ptr<OutputBuffers>>::Locked buffers(mOutputBuffers);
+ status_t err = (*buffers)->registerBuffer(entry.buffer, &index, &outBuffer);
+ if (err != OK) {
+ if (err != WOULD_BLOCK) {
+ OutputBuffersArray *array = (OutputBuffersArray *)buffers->get();
+ array->realloc(entry.buffer);
+ mCCodecCallback->onOutputBuffersChanged();
+ }
+ buffers.unlock();
+ ALOGV("[%s] sendOutputBuffers: unable to register output buffer", mName);
+ mReorderStash.lock()->defer(entry);
+ return;
+ }
+ buffers.unlock();
+
+ outBuffer->meta()->setInt64("timeUs", entry.timestamp);
+ outBuffer->meta()->setInt32("flags", entry.flags);
+ ALOGV("[%s] sendOutputBuffers: out buffer index = %zu [%p] => %p + %zu",
+ mName, index, outBuffer.get(), outBuffer->data(), outBuffer->size());
+ mCallback->onOutputBufferAvailable(index, outBuffer);
+ }
+}
+
+status_t CCodecBufferChannel::setSurface(const sp<Surface> &newSurface) {
+ static std::atomic_uint32_t surfaceGeneration{0};
+ uint32_t generation = (getpid() << 10) |
+ ((surfaceGeneration.fetch_add(1, std::memory_order_relaxed) + 1)
+ & ((1 << 10) - 1));
+
+ sp<IGraphicBufferProducer> producer;
+ if (newSurface) {
+ newSurface->setScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
+ newSurface->setMaxDequeuedBufferCount(kMinOutputBufferArraySize);
+ producer = newSurface->getIGraphicBufferProducer();
+ producer->setGenerationNumber(generation);
+ } else {
+ ALOGE("[%s] setting output surface to null", mName);
+ return INVALID_OPERATION;
+ }
+
+ std::shared_ptr<Codec2Client::Configurable> outputPoolIntf;
+ C2BlockPool::local_id_t outputPoolId;
+ {
+ Mutexed<BlockPools>::Locked pools(mBlockPools);
+ outputPoolId = pools->outputPoolId;
+ outputPoolIntf = pools->outputPoolIntf;
+ }
+
+ if (outputPoolIntf) {
+ if (mComponent->setOutputSurface(
+ outputPoolId,
+ producer,
+ generation) != C2_OK) {
+ ALOGI("[%s] setSurface: component setOutputSurface failed", mName);
+ return INVALID_OPERATION;
+ }
+ }
+
+ {
+ Mutexed<OutputSurface>::Locked output(mOutputSurface);
+ output->surface = newSurface;
+ output->generation = generation;
+ }
+
+ return OK;
+}
+
+void CCodecBufferChannel::setMetaMode(MetaMode mode) {
+ mMetaMode = mode;
+}
+
+status_t toStatusT(c2_status_t c2s, c2_operation_t c2op) {
+ // C2_OK is always translated to OK.
+ if (c2s == C2_OK) {
+ return OK;
+ }
+
+ // Operation-dependent translation
+ // TODO: Add as necessary
+ switch (c2op) {
+ case C2_OPERATION_Component_start:
+ switch (c2s) {
+ case C2_NO_MEMORY:
+ return NO_MEMORY;
+ default:
+ return UNKNOWN_ERROR;
+ }
+ default:
+ break;
+ }
+
+ // Backup operation-agnostic translation
+ switch (c2s) {
+ case C2_BAD_INDEX:
+ return BAD_INDEX;
+ case C2_BAD_VALUE:
+ return BAD_VALUE;
+ case C2_BLOCKING:
+ return WOULD_BLOCK;
+ case C2_DUPLICATE:
+ return ALREADY_EXISTS;
+ case C2_NO_INIT:
+ return NO_INIT;
+ case C2_NO_MEMORY:
+ return NO_MEMORY;
+ case C2_NOT_FOUND:
+ return NAME_NOT_FOUND;
+ case C2_TIMED_OUT:
+ return TIMED_OUT;
+ case C2_BAD_STATE:
+ case C2_CANCELED:
+ case C2_CANNOT_DO:
+ case C2_CORRUPTED:
+ case C2_OMITTED:
+ case C2_REFUSED:
+ return UNKNOWN_ERROR;
+ default:
+ return -static_cast<status_t>(c2s);
+ }
+}
+
+} // namespace android
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.h b/media/codec2/sfplugin/CCodecBufferChannel.h
new file mode 100644
index 0000000..431baaa
--- /dev/null
+++ b/media/codec2/sfplugin/CCodecBufferChannel.h
@@ -0,0 +1,417 @@
+/*
+ * Copyright 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CCODEC_BUFFER_CHANNEL_H_
+
+#define CCODEC_BUFFER_CHANNEL_H_
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include <C2Buffer.h>
+#include <C2Component.h>
+#include <Codec2Mapper.h>
+
+#include <codec2/hidl/client.h>
+#include <media/stagefright/bqhelper/GraphicBufferSource.h>
+#include <media/stagefright/codec2/1.0/InputSurface.h>
+#include <media/stagefright/foundation/Mutexed.h>
+#include <media/stagefright/CodecBase.h>
+#include <media/ICrypto.h>
+
+#include "InputSurfaceWrapper.h"
+
+namespace android {
+
+class CCodecCallback {
+public:
+ virtual ~CCodecCallback() = default;
+ virtual void onError(status_t err, enum ActionCode actionCode) = 0;
+ virtual void onOutputFramesRendered(int64_t mediaTimeUs, nsecs_t renderTimeNs) = 0;
+ virtual void onWorkQueued(bool eos) = 0;
+ virtual void onOutputBuffersChanged() = 0;
+};
+
+/**
+ * BufferChannelBase implementation for CCodec.
+ */
+class CCodecBufferChannel
+ : public BufferChannelBase, public std::enable_shared_from_this<CCodecBufferChannel> {
+public:
+ explicit CCodecBufferChannel(const std::shared_ptr<CCodecCallback> &callback);
+ virtual ~CCodecBufferChannel();
+
+ // BufferChannelBase interface
+ virtual status_t queueInputBuffer(const sp<MediaCodecBuffer> &buffer) override;
+ virtual status_t queueSecureInputBuffer(
+ const sp<MediaCodecBuffer> &buffer,
+ bool secure,
+ const uint8_t *key,
+ const uint8_t *iv,
+ CryptoPlugin::Mode mode,
+ CryptoPlugin::Pattern pattern,
+ const CryptoPlugin::SubSample *subSamples,
+ size_t numSubSamples,
+ AString *errorDetailMsg) override;
+ virtual status_t renderOutputBuffer(
+ const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) override;
+ virtual status_t discardBuffer(const sp<MediaCodecBuffer> &buffer) override;
+ virtual void getInputBufferArray(Vector<sp<MediaCodecBuffer>> *array) override;
+ virtual void getOutputBufferArray(Vector<sp<MediaCodecBuffer>> *array) override;
+
+ // Methods below are interface for CCodec to use.
+
+ /**
+ * Set the component object for buffer processing.
+ */
+ void setComponent(const std::shared_ptr<Codec2Client::Component> &component);
+
+ /**
+ * Set output graphic surface for rendering.
+ */
+ status_t setSurface(const sp<Surface> &surface);
+
+ /**
+ * Set GraphicBufferSource object from which the component extracts input
+ * buffers.
+ */
+ status_t setInputSurface(const std::shared_ptr<InputSurfaceWrapper> &surface);
+
+ /**
+ * Signal EOS to input surface.
+ */
+ status_t signalEndOfInputStream();
+
+ /**
+ * Set parameters.
+ */
+ status_t setParameters(std::vector<std::unique_ptr<C2Param>> ¶ms);
+
+ /**
+ * Start queueing buffers to the component. This object should never queue
+ * buffers before this call has completed.
+ */
+ status_t start(const sp<AMessage> &inputFormat, const sp<AMessage> &outputFormat);
+
+ /**
+ * Request initial input buffers to be filled by client.
+ */
+ status_t requestInitialInputBuffers();
+
+ /**
+ * Stop queueing buffers to the component. This object should never queue
+ * buffers after this call, until start() is called.
+ */
+ void stop();
+
+ void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork);
+
+ /**
+ * Notify input client about work done.
+ *
+ * @param workItems finished work item.
+ * @param outputFormat new output format if it has changed, otherwise nullptr
+ * @param initData new init data (CSD) if it has changed, otherwise nullptr
+ * @param numDiscardedInputBuffers the number of input buffers that are
+ * returned for the first time (not previously returned by
+ * onInputBufferDone()).
+ */
+ void onWorkDone(
+ std::unique_ptr<C2Work> work, const sp<AMessage> &outputFormat,
+ const C2StreamInitDataInfo::output *initData,
+ size_t numDiscardedInputBuffers);
+
+ /**
+ * Make an input buffer available for the client as it is no longer needed
+ * by the codec.
+ *
+ * @param buffer The buffer that becomes unused.
+ */
+ void onInputBufferDone(const std::shared_ptr<C2Buffer>& buffer);
+
+ enum MetaMode {
+ MODE_NONE,
+ MODE_ANW,
+ };
+
+ void setMetaMode(MetaMode mode);
+
+ // Internal classes
+ class Buffers;
+ class InputBuffers;
+ class OutputBuffers;
+
+private:
+ class QueueGuard;
+
+ /**
+ * Special mutex-like object with the following properties:
+ *
+ * - At STOPPED state (initial, or after stop())
+ * - QueueGuard object gets created at STOPPED state, and the client is
+ * supposed to return immediately.
+ * - At RUNNING state (after start())
+ * - Each QueueGuard object
+ */
+ class QueueSync {
+ public:
+ /**
+ * At construction the sync object is in STOPPED state.
+ */
+ inline QueueSync() {}
+ ~QueueSync() = default;
+
+ /**
+ * Transition to RUNNING state when stopped. No-op if already in RUNNING
+ * state.
+ */
+ void start();
+
+ /**
+ * At RUNNING state, wait until all QueueGuard object created during
+ * RUNNING state are destroyed, and then transition to STOPPED state.
+ * No-op if already in STOPPED state.
+ */
+ void stop();
+
+ private:
+ Mutex mGuardLock;
+
+ struct Counter {
+ inline Counter() : value(-1) {}
+ int32_t value;
+ Condition cond;
+ };
+ Mutexed<Counter> mCount;
+
+ friend class CCodecBufferChannel::QueueGuard;
+ };
+
+ class QueueGuard {
+ public:
+ QueueGuard(QueueSync &sync);
+ ~QueueGuard();
+ inline bool isRunning() { return mRunning; }
+
+ private:
+ QueueSync &mSync;
+ bool mRunning;
+ };
+
+ void feedInputBufferIfAvailable();
+ void feedInputBufferIfAvailableInternal();
+ status_t queueInputBufferInternal(const sp<MediaCodecBuffer> &buffer);
+ bool handleWork(
+ std::unique_ptr<C2Work> work, const sp<AMessage> &outputFormat,
+ const C2StreamInitDataInfo::output *initData);
+ void sendOutputBuffers();
+
+ QueueSync mSync;
+ sp<MemoryDealer> mDealer;
+ sp<IMemory> mDecryptDestination;
+ int32_t mHeapSeqNum;
+
+ std::shared_ptr<Codec2Client::Component> mComponent;
+ std::string mComponentName; ///< component name for debugging
+ const char *mName; ///< C-string version of component name
+ std::shared_ptr<CCodecCallback> mCCodecCallback;
+ std::shared_ptr<C2BlockPool> mInputAllocator;
+ QueueSync mQueueSync;
+ std::vector<std::unique_ptr<C2Param>> mParamsToBeSet;
+
+ Mutexed<std::unique_ptr<InputBuffers>> mInputBuffers;
+ Mutexed<std::list<sp<ABuffer>>> mFlushedConfigs;
+ Mutexed<std::unique_ptr<OutputBuffers>> mOutputBuffers;
+
+ std::atomic_uint64_t mFrameIndex;
+ std::atomic_uint64_t mFirstValidFrameIndex;
+
+ sp<MemoryDealer> makeMemoryDealer(size_t heapSize);
+
+ struct OutputSurface {
+ sp<Surface> surface;
+ uint32_t generation;
+ };
+ Mutexed<OutputSurface> mOutputSurface;
+
+ struct BlockPools {
+ C2Allocator::id_t inputAllocatorId;
+ std::shared_ptr<C2BlockPool> inputPool;
+ C2Allocator::id_t outputAllocatorId;
+ C2BlockPool::local_id_t outputPoolId;
+ std::shared_ptr<Codec2Client::Configurable> outputPoolIntf;
+ };
+ Mutexed<BlockPools> mBlockPools;
+
+ std::shared_ptr<InputSurfaceWrapper> mInputSurface;
+
+ MetaMode mMetaMode;
+
+ // PipelineCapacity is used in the input buffer gating logic.
+ //
+ // There are three criteria that need to be met before
+ // onInputBufferAvailable() is called:
+ // 1. The number of input buffers that have been received by
+ // CCodecBufferChannel but not returned via onWorkDone() or
+ // onInputBufferDone() does not exceed a certain limit. (Let us call this
+ // number the "input" capacity.)
+ // 2. The number of work items that have been received by
+ // CCodecBufferChannel whose outputs have not been returned from the
+ // component (by calling onWorkDone()) does not exceed a certain limit.
+ // (Let us call this the "component" capacity.)
+ //
+ // These three criteria guarantee that a new input buffer that arrives from
+ // the invocation of onInputBufferAvailable() will not
+ // 1. overload CCodecBufferChannel's input buffers;
+ // 2. overload the component; or
+ //
+ struct PipelineCapacity {
+ // The number of available input capacity.
+ std::atomic_int input;
+ // The number of available component capacity.
+ std::atomic_int component;
+
+ PipelineCapacity();
+ // Set the values of #input and #component.
+ void initialize(int newInput, int newComponent,
+ const char* newName = "<UNKNOWN COMPONENT>",
+ const char* callerTag = nullptr);
+
+ // Return true and decrease #input and #component by one if
+ // they are all greater than zero; return false otherwise.
+ //
+ // callerTag is used for logging only.
+ //
+ // allocate() is called by CCodecBufferChannel to check whether it can
+ // receive another input buffer. If the return value is true,
+ // onInputBufferAvailable() and onOutputBufferAvailable() can be called
+ // afterwards.
+ bool allocate(const char* callerTag = nullptr);
+
+ // Increase #input and #component by one.
+ //
+ // callerTag is used for logging only.
+ //
+ // free() is called by CCodecBufferChannel after allocate() returns true
+ // but onInputBufferAvailable() cannot be called for any reasons. It
+ // essentially undoes an allocate() call.
+ void free(const char* callerTag = nullptr);
+
+ // Increase #input by @p numDiscardedInputBuffers.
+ //
+ // callerTag is used for logging only.
+ //
+ // freeInputSlots() is called by CCodecBufferChannel when onWorkDone()
+ // or onInputBufferDone() is called. @p numDiscardedInputBuffers is
+ // provided in onWorkDone(), and is 1 in onInputBufferDone().
+ int freeInputSlots(size_t numDiscardedInputBuffers,
+ const char* callerTag = nullptr);
+
+ // Increase #component by one and return the updated value.
+ //
+ // callerTag is used for logging only.
+ //
+ // freeComponentSlot() is called by CCodecBufferChannel when
+ // onWorkDone() is called.
+ int freeComponentSlot(const char* callerTag = nullptr);
+
+ private:
+ // Component name. Used for logging.
+ const char* mName;
+ };
+ PipelineCapacity mAvailablePipelineCapacity;
+
+ class ReorderStash {
+ public:
+ struct Entry {
+ inline Entry() : buffer(nullptr), timestamp(0), flags(0), ordinal({0, 0, 0}) {}
+ inline Entry(
+ const std::shared_ptr<C2Buffer> &b,
+ int64_t t,
+ int32_t f,
+ const C2WorkOrdinalStruct &o)
+ : buffer(b), timestamp(t), flags(f), ordinal(o) {}
+ std::shared_ptr<C2Buffer> buffer;
+ int64_t timestamp;
+ int32_t flags;
+ C2WorkOrdinalStruct ordinal;
+ };
+
+ ReorderStash();
+
+ void clear();
+ void setDepth(uint32_t depth);
+ void setKey(C2Config::ordinal_key_t key);
+ bool pop(Entry *entry);
+ void emplace(
+ const std::shared_ptr<C2Buffer> &buffer,
+ int64_t timestamp,
+ int32_t flags,
+ const C2WorkOrdinalStruct &ordinal);
+ void defer(const Entry &entry);
+ bool hasPending() const;
+
+ private:
+ std::list<Entry> mPending;
+ std::list<Entry> mStash;
+ uint32_t mDepth;
+ C2Config::ordinal_key_t mKey;
+
+ bool less(const C2WorkOrdinalStruct &o1, const C2WorkOrdinalStruct &o2);
+ };
+ Mutexed<ReorderStash> mReorderStash;
+
+ std::atomic_bool mInputMetEos;
+
+ inline bool hasCryptoOrDescrambler() {
+ return mCrypto != nullptr || mDescrambler != nullptr;
+ }
+};
+
+// Conversion of a c2_status_t value to a status_t value may depend on the
+// operation that returns the c2_status_t value.
+enum c2_operation_t {
+ C2_OPERATION_NONE,
+ C2_OPERATION_Component_connectToOmxInputSurface,
+ C2_OPERATION_Component_createBlockPool,
+ C2_OPERATION_Component_destroyBlockPool,
+ C2_OPERATION_Component_disconnectFromInputSurface,
+ C2_OPERATION_Component_drain,
+ C2_OPERATION_Component_flush,
+ C2_OPERATION_Component_queue,
+ C2_OPERATION_Component_release,
+ C2_OPERATION_Component_reset,
+ C2_OPERATION_Component_setOutputSurface,
+ C2_OPERATION_Component_start,
+ C2_OPERATION_Component_stop,
+ C2_OPERATION_ComponentStore_copyBuffer,
+ C2_OPERATION_ComponentStore_createComponent,
+ C2_OPERATION_ComponentStore_createInputSurface,
+ C2_OPERATION_ComponentStore_createInterface,
+ C2_OPERATION_Configurable_config,
+ C2_OPERATION_Configurable_query,
+ C2_OPERATION_Configurable_querySupportedParams,
+ C2_OPERATION_Configurable_querySupportedValues,
+ C2_OPERATION_InputSurface_connectToComponent,
+ C2_OPERATION_InputSurfaceConnection_disconnect,
+};
+
+status_t toStatusT(c2_status_t c2s, c2_operation_t c2op = C2_OPERATION_NONE);
+
+} // namespace android
+
+#endif // CCODEC_BUFFER_CHANNEL_H_
diff --git a/media/codec2/sfplugin/CCodecConfig.cpp b/media/codec2/sfplugin/CCodecConfig.cpp
new file mode 100644
index 0000000..8dbfd0e
--- /dev/null
+++ b/media/codec2/sfplugin/CCodecConfig.cpp
@@ -0,0 +1,1588 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "CCodecConfig"
+#include <cutils/properties.h>
+#include <log/log.h>
+
+#include <C2Component.h>
+#include <C2Debug.h>
+#include <C2Param.h>
+#include <util/C2InterfaceHelper.h>
+
+#include <media/stagefright/MediaCodecConstants.h>
+
+#include "CCodecConfig.h"
+#include "Codec2Mapper.h"
+
+#define DRC_DEFAULT_MOBILE_REF_LEVEL 64 /* 64*-0.25dB = -16 dB below full scale for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_CUT 127 /* maximum compression of dynamic range for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_BOOST 127 /* maximum compression of dynamic range for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_HEAVY 1 /* switch for heavy compression for mobile conf */
+#define DRC_DEFAULT_MOBILE_DRC_EFFECT 3 /* MPEG-D DRC effect type; 3 => Limited playback range */
+#define DRC_DEFAULT_MOBILE_ENC_LEVEL (-1) /* encoder target level; -1 => the value is unknown, otherwise dB step value (e.g. 64 for -16 dB) */
+// names of properties that can be used to override the default DRC settings
+#define PROP_DRC_OVERRIDE_REF_LEVEL "aac_drc_reference_level"
+#define PROP_DRC_OVERRIDE_CUT "aac_drc_cut"
+#define PROP_DRC_OVERRIDE_BOOST "aac_drc_boost"
+#define PROP_DRC_OVERRIDE_HEAVY "aac_drc_heavy"
+#define PROP_DRC_OVERRIDE_ENC_LEVEL "aac_drc_enc_target_level"
+#define PROP_DRC_OVERRIDE_EFFECT "ro.aac_drc_effect_type"
+
+namespace android {
+
+// CCodecConfig
+
+namespace {
+
+/**
+ * mapping between SDK and Codec 2.0 configurations.
+ */
+struct ConfigMapper {
+ /**
+ * Value mapper (C2Value => C2Value)
+ */
+ typedef std::function<C2Value(C2Value)> Mapper;
+
+ /// shorthand
+ typedef CCodecConfig::Domain Domain;
+
+ ConfigMapper(std::string mediaKey, C2String c2struct, C2String c2field)
+ : mDomain(Domain::ALL), mMediaKey(mediaKey), mStruct(c2struct), mField(c2field) { }
+
+ /// Limits this parameter to the given domain
+ ConfigMapper &limitTo(uint32_t domain) {
+ C2_CHECK(domain & Domain::GUARD_BIT);
+ mDomain = Domain(mDomain & domain);
+ return *this;
+ }
+
+ /// Adds SDK => Codec 2.0 mapper (should not be in the SDK format)
+ ConfigMapper &withMapper(Mapper mapper) {
+ C2_CHECK(!mMapper);
+ C2_CHECK(!mReverse);
+ mMapper = mapper;
+ return *this;
+ }
+
+ /// Adds SDK <=> Codec 2.0 value mappers
+ ConfigMapper &withMappers(Mapper mapper, Mapper reverse) {
+ C2_CHECK(!mMapper);
+ C2_CHECK(!mReverse);
+ mMapper = mapper;
+ mReverse = reverse;
+ return *this;
+ }
+
+ /// Adds SDK <=> Codec 2.0 value mappers based on C2Mapper
+ template<typename C2Type, typename SdkType=int32_t>
+ ConfigMapper &withC2Mappers() {
+ C2_CHECK(!mMapper);
+ C2_CHECK(!mReverse);
+ mMapper = [](C2Value v) -> C2Value {
+ SdkType sdkValue;
+ C2Type c2Value;
+ if (v.get(&sdkValue) && C2Mapper::map(sdkValue, &c2Value)) {
+ return c2Value;
+ }
+ return C2Value();
+ };
+ mReverse = [](C2Value v) -> C2Value {
+ SdkType sdkValue;
+ C2Type c2Value;
+ using C2ValueType=typename _c2_reduce_enum_to_underlying_type<C2Type>::type;
+ if (v.get((C2ValueType*)&c2Value) && C2Mapper::map(c2Value, &sdkValue)) {
+ return sdkValue;
+ }
+ return C2Value();
+ };
+ return *this;
+ }
+
+ /// Maps from SDK values in an AMessage to a suitable C2Value.
+ C2Value mapFromMessage(const AMessage::ItemData &item) const {
+ C2Value value;
+ int32_t int32Value;
+ int64_t int64Value;
+ float floatValue;
+ double doubleValue;
+ if (item.find(&int32Value)) {
+ value = int32Value;
+ } else if (item.find(&int64Value)) {
+ value = int64Value;
+ } else if (item.find(&floatValue)) {
+ value = floatValue;
+ } else if (item.find(&doubleValue)) {
+ value = (float)doubleValue;
+ }
+ if (value.type() != C2Value::NO_INIT && mMapper) {
+ value = mMapper(value);
+ }
+ return value;
+ }
+
+ /// Maps from a C2Value to an SDK value in an AMessage.
+ AMessage::ItemData mapToMessage(C2Value value) const {
+ AMessage::ItemData item;
+ int32_t int32Value;
+ uint32_t uint32Value;
+ int64_t int64Value;
+ uint64_t uint64Value;
+ float floatValue;
+ if (value.type() != C2Value::NO_INIT && mReverse) {
+ value = mReverse(value);
+ }
+ if (value.get(&int32Value)) {
+ item.set(int32Value);
+ } else if (value.get(&uint32Value) && uint32Value <= uint32_t(INT32_MAX)) {
+ // SDK does not support unsigned values
+ item.set((int32_t)uint32Value);
+ } else if (value.get(&int64Value)) {
+ item.set(int64Value);
+ } else if (value.get(&uint64Value) && uint64Value <= uint64_t(INT64_MAX)) {
+ // SDK does not support unsigned values
+ item.set((int64_t)uint64Value);
+ } else if (value.get(&floatValue)) {
+ item.set(floatValue);
+ }
+ return item;
+ }
+
+ Domain domain() const { return mDomain; }
+ std::string mediaKey() const { return mMediaKey; }
+ std::string path() const { return mField.size() ? mStruct + '.' + mField : mStruct; }
+ Mapper mapper() const { return mMapper; }
+ Mapper reverse() const { return mReverse; }
+
+private:
+ Domain mDomain; ///< parameter domain (mask) containing port, kind and config domains
+ std::string mMediaKey; ///< SDK key
+ C2String mStruct; ///< Codec 2.0 struct name
+ C2String mField; ///< Codec 2.0 field name
+ Mapper mMapper; ///< optional SDK => Codec 2.0 value mapper
+ Mapper mReverse; ///< optional Codec 2.0 => SDK value mapper
+};
+
+template <typename PORT, typename STREAM>
+AString QueryMediaTypeImpl(
+ const std::shared_ptr<Codec2Client::Component> &component) {
+ AString mediaType;
+ std::vector<std::unique_ptr<C2Param>> queried;
+ c2_status_t c2err = component->query(
+ {}, { PORT::PARAM_TYPE, STREAM::PARAM_TYPE }, C2_DONT_BLOCK, &queried);
+ if (c2err != C2_OK && queried.size() == 0) {
+ ALOGD("Query media type failed => %s", asString(c2err));
+ } else {
+ PORT *portMediaType =
+ PORT::From(queried[0].get());
+ if (portMediaType) {
+ mediaType = AString(
+ portMediaType->m.value,
+ strnlen(portMediaType->m.value, portMediaType->flexCount()));
+ } else {
+ STREAM *streamMediaType = STREAM::From(queried[0].get());
+ if (streamMediaType) {
+ mediaType = AString(
+ streamMediaType->m.value,
+ strnlen(streamMediaType->m.value, streamMediaType->flexCount()));
+ }
+ }
+ ALOGD("read media type: %s", mediaType.c_str());
+ }
+ return mediaType;
+}
+
+AString QueryMediaType(
+ bool input, const std::shared_ptr<Codec2Client::Component> &component) {
+ typedef C2PortMediaTypeSetting P;
+ typedef C2StreamMediaTypeSetting S;
+ if (input) {
+ return QueryMediaTypeImpl<P::input, S::input>(component);
+ } else {
+ return QueryMediaTypeImpl<P::output, S::output>(component);
+ }
+}
+
+} // namespace
+
+/**
+ * Set of standard parameters used by CCodec that are exposed to MediaCodec.
+ */
+struct StandardParams {
+ typedef CCodecConfig::Domain Domain;
+
+ // standard (MediaCodec) params are keyed by media format key
+ typedef std::string SdkKey;
+
+ /// used to return reference to no config mappers in getConfigMappersForSdkKey
+ static const std::vector<ConfigMapper> NO_MAPPERS;
+
+ /// Returns Codec 2.0 equivalent parameters for an SDK format key.
+ const std::vector<ConfigMapper> &getConfigMappersForSdkKey(std::string key) const {
+ auto it = mConfigMappers.find(key);
+ if (it == mConfigMappers.end()) {
+ ALOGD("no c2 equivalents for %s", key.c_str());
+ return NO_MAPPERS;
+ }
+ ALOGV("found %zu eqs for %s", it->second.size(), key.c_str());
+ return it->second;
+ }
+
+ /**
+ * Adds a SDK <=> Codec 2.0 parameter mapping. Multiple Codec 2.0 parameters may map to a
+ * single SDK key, in which case they shall be ordered from least authoritative to most
+ * authoritative. When constructing SDK formats, the last mapped Codec 2.0 parameter that
+ * is supported by the component will determine the exposed value. (TODO: perhaps restrict this
+ * by domain.)
+ */
+ void add(const ConfigMapper &cm) {
+ auto it = mConfigMappers.find(cm.mediaKey());
+ ALOGV("%c%c%c%c %c%c%c %04x %9s %s => %s",
+ ((cm.domain() & Domain::IS_INPUT) ? 'I' : ' '),
+ ((cm.domain() & Domain::IS_OUTPUT) ? 'O' : ' '),
+ ((cm.domain() & Domain::IS_CODED) ? 'C' : ' '),
+ ((cm.domain() & Domain::IS_RAW) ? 'R' : ' '),
+ ((cm.domain() & Domain::IS_CONFIG) ? 'c' : ' '),
+ ((cm.domain() & Domain::IS_PARAM) ? 'p' : ' '),
+ ((cm.domain() & Domain::IS_READ) ? 'r' : ' '),
+ cm.domain(),
+ it == mConfigMappers.end() ? "adding" : "extending",
+ cm.mediaKey().c_str(), cm.path().c_str());
+ if (it == mConfigMappers.end()) {
+ std::vector<ConfigMapper> eqs = { cm };
+ mConfigMappers.emplace(cm.mediaKey(), eqs);
+ } else {
+ it->second.push_back(cm);
+ }
+ }
+
+ /**
+ * Returns all paths for a specific domain.
+ *
+ * \param any maximum domain mask. Returned parameters must match at least one of the domains
+ * in the mask.
+ * \param all minimum domain mask. Returned parameters must match all of the domains in the
+ * mask. This is restricted to the bits of the maximum mask.
+ */
+ std::vector<std::string> getPathsForDomain(
+ Domain any, Domain all = Domain::ALL) const {
+ std::vector<std::string> res;
+ for (const std::pair<std::string, std::vector<ConfigMapper>> &el : mConfigMappers) {
+ for (const ConfigMapper &cm : el.second) {
+ ALOGV("filtering %s %x %x %x %x", cm.path().c_str(), cm.domain(), any,
+ (cm.domain() & any), (cm.domain() & any & all));
+ if ((cm.domain() & any) && ((cm.domain() & any & all) == (any & all))) {
+ res.push_back(cm.path());
+ }
+ }
+ }
+ return res;
+ }
+
+ /**
+ * Returns SDK <=> Codec 2.0 mappings.
+ *
+ * TODO: replace these with better methods as this exposes the inner structure.
+ */
+ const std::map<SdkKey, std::vector<ConfigMapper>> getKeys() const {
+ return mConfigMappers;
+ }
+
+private:
+ std::map<SdkKey, std::vector<ConfigMapper>> mConfigMappers;
+};
+
+const std::vector<ConfigMapper> StandardParams::NO_MAPPERS;
+
+
+CCodecConfig::CCodecConfig()
+ : mInputFormat(new AMessage),
+ mOutputFormat(new AMessage),
+ mUsingSurface(false) { }
+
+void CCodecConfig::initializeStandardParams() {
+ typedef Domain D;
+ mStandardParams = std::make_shared<StandardParams>();
+ std::function<void(const ConfigMapper &)> add =
+ [params = mStandardParams](const ConfigMapper &cm) {
+ params->add(cm);
+ };
+ std::function<void(const ConfigMapper &)> deprecated = add;
+
+ // allow int32 or float SDK values and represent them as float
+ ConfigMapper::Mapper makeFloat = [](C2Value v) -> C2Value {
+ // convert from i32 to float
+ int32_t i32Value;
+ float fpValue;
+ if (v.get(&i32Value)) {
+ return (float)i32Value;
+ } else if (v.get(&fpValue)) {
+ return fpValue;
+ }
+ return C2Value();
+ };
+
+ ConfigMapper::Mapper negate = [](C2Value v) -> C2Value {
+ int32_t value;
+ if (v.get(&value)) {
+ return -value;
+ }
+ return C2Value();
+ };
+
+ add(ConfigMapper(KEY_MIME, C2_PARAMKEY_INPUT_MEDIA_TYPE, "value")
+ .limitTo(D::INPUT & D::READ));
+ add(ConfigMapper(KEY_MIME, C2_PARAMKEY_OUTPUT_MEDIA_TYPE, "value")
+ .limitTo(D::OUTPUT & D::READ));
+
+ add(ConfigMapper(KEY_BIT_RATE, C2_PARAMKEY_BITRATE, "value")
+ .limitTo(D::ENCODER & D::OUTPUT));
+ // we also need to put the bitrate in the max bitrate field
+ add(ConfigMapper(KEY_MAX_BIT_RATE, C2_PARAMKEY_BITRATE, "value")
+ .limitTo(D::ENCODER & D::READ & D::OUTPUT));
+ add(ConfigMapper(PARAMETER_KEY_VIDEO_BITRATE, C2_PARAMKEY_BITRATE, "value")
+ .limitTo(D::ENCODER & D::VIDEO & D::PARAM));
+ add(ConfigMapper(KEY_BITRATE_MODE, C2_PARAMKEY_BITRATE_MODE, "value")
+ .limitTo(D::ENCODER & D::CODED)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ C2Config::bitrate_mode_t mode;
+ if (v.get(&value) && C2Mapper::map(value, &mode)) {
+ return mode;
+ }
+ return C2Value();
+ }));
+ // remove when codecs switch to PARAMKEY and new modes
+ deprecated(ConfigMapper(KEY_BITRATE_MODE, "coded.bitrate-mode", "value")
+ .limitTo(D::ENCODER));
+ add(ConfigMapper(KEY_FRAME_RATE, C2_PARAMKEY_FRAME_RATE, "value")
+ .limitTo(D::VIDEO)
+ .withMappers(makeFloat, [](C2Value v) -> C2Value {
+ // read back always as int
+ float value;
+ if (v.get(&value)) {
+ return (int32_t)value;
+ }
+ return C2Value();
+ }));
+
+ add(ConfigMapper(KEY_MAX_INPUT_SIZE, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE, "value")
+ .limitTo(D::INPUT));
+ // remove when codecs switch to PARAMKEY
+ deprecated(ConfigMapper(KEY_MAX_INPUT_SIZE, "coded.max-frame-size", "value")
+ .limitTo(D::INPUT));
+
+ // Rotation
+ // Note: SDK rotation is clock-wise, while C2 rotation is counter-clock-wise
+ add(ConfigMapper(KEY_ROTATION, C2_PARAMKEY_VUI_ROTATION, "value")
+ .limitTo(D::VIDEO & D::CODED)
+ .withMappers(negate, negate));
+ add(ConfigMapper(KEY_ROTATION, C2_PARAMKEY_ROTATION, "value")
+ .limitTo(D::VIDEO & D::RAW)
+ .withMappers(negate, negate));
+
+ // android 'video-scaling'
+ add(ConfigMapper("android._video-scaling", C2_PARAMKEY_SURFACE_SCALING_MODE, "value")
+ .limitTo(D::VIDEO & D::DECODER & D::RAW));
+
+ // Color Aspects
+ //
+ // configure default for decoders
+ add(ConfigMapper(KEY_COLOR_RANGE, C2_PARAMKEY_DEFAULT_COLOR_ASPECTS, "range")
+ .limitTo((D::VIDEO | D::IMAGE) & D::DECODER & D::CODED & (D::CONFIG | D::PARAM))
+ .withC2Mappers<C2Color::range_t>());
+ add(ConfigMapper(KEY_COLOR_TRANSFER, C2_PARAMKEY_DEFAULT_COLOR_ASPECTS, "transfer")
+ .limitTo((D::VIDEO | D::IMAGE) & D::DECODER & D::CODED & (D::CONFIG | D::PARAM))
+ .withC2Mappers<C2Color::transfer_t>());
+ add(ConfigMapper("color-primaries", C2_PARAMKEY_DEFAULT_COLOR_ASPECTS, "primaries")
+ .limitTo((D::VIDEO | D::IMAGE) & D::DECODER & D::CODED & (D::CONFIG | D::PARAM)));
+ add(ConfigMapper("color-matrix", C2_PARAMKEY_DEFAULT_COLOR_ASPECTS, "matrix")
+ .limitTo((D::VIDEO | D::IMAGE) & D::DECODER & D::CODED & (D::CONFIG | D::PARAM)));
+
+ // read back final for decoder output (also, configure final aspects as well. This should be
+ // overwritten based on coded/default values if component supports color aspects, but is used
+ // as final values if component does not support aspects at all)
+ add(ConfigMapper(KEY_COLOR_RANGE, C2_PARAMKEY_COLOR_ASPECTS, "range")
+ .limitTo((D::VIDEO | D::IMAGE) & D::DECODER & D::RAW)
+ .withC2Mappers<C2Color::range_t>());
+ add(ConfigMapper(KEY_COLOR_TRANSFER, C2_PARAMKEY_COLOR_ASPECTS, "transfer")
+ .limitTo((D::VIDEO | D::IMAGE) & D::DECODER & D::RAW)
+ .withC2Mappers<C2Color::transfer_t>());
+ add(ConfigMapper("color-primaries", C2_PARAMKEY_COLOR_ASPECTS, "primaries")
+ .limitTo((D::VIDEO | D::IMAGE) & D::DECODER & D::RAW));
+ add(ConfigMapper("color-matrix", C2_PARAMKEY_COLOR_ASPECTS, "matrix")
+ .limitTo((D::VIDEO | D::IMAGE) & D::DECODER & D::RAW));
+
+ // configure source aspects for encoders and read them back on the coded(!) port.
+ // This is to ensure muxing the desired aspects into the container.
+ add(ConfigMapper(KEY_COLOR_RANGE, C2_PARAMKEY_COLOR_ASPECTS, "range")
+ .limitTo((D::VIDEO | D::IMAGE) & D::ENCODER & D::CODED)
+ .withC2Mappers<C2Color::range_t>());
+ add(ConfigMapper(KEY_COLOR_TRANSFER, C2_PARAMKEY_COLOR_ASPECTS, "transfer")
+ .limitTo((D::VIDEO | D::IMAGE) & D::ENCODER & D::CODED)
+ .withC2Mappers<C2Color::transfer_t>());
+ add(ConfigMapper("color-primaries", C2_PARAMKEY_COLOR_ASPECTS, "primaries")
+ .limitTo((D::VIDEO | D::IMAGE) & D::ENCODER & D::CODED));
+ add(ConfigMapper("color-matrix", C2_PARAMKEY_COLOR_ASPECTS, "matrix")
+ .limitTo((D::VIDEO | D::IMAGE) & D::ENCODER & D::CODED));
+
+ // read back coded aspects for encoders (on the raw port), but also configure
+ // desired aspects here.
+ add(ConfigMapper(KEY_COLOR_RANGE, C2_PARAMKEY_VUI_COLOR_ASPECTS, "range")
+ .limitTo((D::VIDEO | D::IMAGE) & D::ENCODER & D::RAW)
+ .withC2Mappers<C2Color::range_t>());
+ add(ConfigMapper(KEY_COLOR_TRANSFER, C2_PARAMKEY_VUI_COLOR_ASPECTS, "transfer")
+ .limitTo((D::VIDEO | D::IMAGE) & D::ENCODER & D::RAW)
+ .withC2Mappers<C2Color::transfer_t>());
+ add(ConfigMapper("color-primaries", C2_PARAMKEY_VUI_COLOR_ASPECTS, "primaries")
+ .limitTo((D::VIDEO | D::IMAGE) & D::ENCODER & D::RAW));
+ add(ConfigMapper("color-matrix", C2_PARAMKEY_VUI_COLOR_ASPECTS, "matrix")
+ .limitTo((D::VIDEO | D::IMAGE) & D::ENCODER & D::RAW));
+
+ // Dataspace
+ add(ConfigMapper("android._dataspace", C2_PARAMKEY_DATA_SPACE, "value")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+
+ // HDR
+ add(ConfigMapper("smpte2086.red.x", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.red.x")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.red.y", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.red.y")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.green.x", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.green.x")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.green.y", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.green.y")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.blue.x", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.blue.x")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.blue.y", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.blue.y")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.white.x", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.white.x")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.white.y", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.white.y")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.max-luminance", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.max-luminance")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("smpte2086.min-luminance", C2_PARAMKEY_HDR_STATIC_INFO, "mastering.min-luminance")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("cta861.max-cll", C2_PARAMKEY_HDR_STATIC_INFO, "max-cll")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper("cta861.max-fall", C2_PARAMKEY_HDR_STATIC_INFO, "max-fall")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+
+ add(ConfigMapper(std::string(KEY_FEATURE_) + FEATURE_SecurePlayback,
+ C2_PARAMKEY_SECURE_MODE, "value"));
+
+ add(ConfigMapper("prepend-sps-pps-to-idr-frames",
+ C2_PARAMKEY_PREPEND_HEADER_MODE, "value")
+ .limitTo(D::ENCODER & D::VIDEO)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ if (v.get(&value) && value) {
+ return C2Value(C2Config::PREPEND_HEADER_TO_ALL_SYNC);
+ } else {
+ return C2Value(C2Config::PREPEND_HEADER_TO_NONE);
+ }
+ }));
+ // remove when codecs switch to PARAMKEY
+ deprecated(ConfigMapper("prepend-sps-pps-to-idr-frames",
+ "coding.add-csd-to-sync-frames", "value")
+ .limitTo(D::ENCODER & D::VIDEO));
+ // convert to timestamp base
+ add(ConfigMapper(KEY_I_FRAME_INTERVAL, C2_PARAMKEY_SYNC_FRAME_INTERVAL, "value")
+ .withMapper([](C2Value v) -> C2Value {
+ // convert from i32 to float
+ int32_t i32Value;
+ float fpValue;
+ if (v.get(&i32Value)) {
+ return int64_t(1000000) * i32Value;
+ } else if (v.get(&fpValue)) {
+ return int64_t(c2_min(1000000 * fpValue + 0.5, (double)INT64_MAX));
+ }
+ return C2Value();
+ }));
+ // remove when codecs switch to proper coding.gop (add support for calculating gop)
+ deprecated(ConfigMapper("i-frame-period", "coding.gop", "intra-period")
+ .limitTo(D::ENCODER & D::VIDEO));
+ add(ConfigMapper(KEY_INTRA_REFRESH_PERIOD, C2_PARAMKEY_INTRA_REFRESH, "period")
+ .limitTo(D::VIDEO & D::ENCODER)
+ .withMappers(makeFloat, [](C2Value v) -> C2Value {
+ // read back always as int
+ float value;
+ if (v.get(&value)) {
+ return (int32_t)value;
+ }
+ return C2Value();
+ }));
+ add(ConfigMapper(KEY_QUALITY, C2_PARAMKEY_QUALITY, "value"));
+ deprecated(ConfigMapper(PARAMETER_KEY_REQUEST_SYNC_FRAME,
+ "coding.request-sync", "value")
+ .limitTo(D::PARAM & D::ENCODER)
+ .withMapper([](C2Value) -> C2Value { return uint32_t(1); }));
+ add(ConfigMapper(PARAMETER_KEY_REQUEST_SYNC_FRAME,
+ C2_PARAMKEY_REQUEST_SYNC_FRAME, "value")
+ .limitTo(D::PARAM & D::ENCODER)
+ .withMapper([](C2Value) -> C2Value { return uint32_t(1); }));
+
+ add(ConfigMapper(KEY_OPERATING_RATE, C2_PARAMKEY_OPERATING_RATE, "value")
+ .limitTo(D::PARAM | D::CONFIG) // write-only
+ .withMapper(makeFloat));
+ // C2 priorities are inverted
+ add(ConfigMapper(KEY_PRIORITY, C2_PARAMKEY_PRIORITY, "value")
+ .withMappers(negate, negate));
+ // remove when codecs switch to PARAMKEY
+ deprecated(ConfigMapper(KEY_OPERATING_RATE, "ctrl.operating-rate", "value")
+ .withMapper(makeFloat));
+ deprecated(ConfigMapper(KEY_PRIORITY, "ctrl.priority", "value"));
+
+ add(ConfigMapper(KEY_WIDTH, C2_PARAMKEY_PICTURE_SIZE, "width")
+ .limitTo(D::VIDEO | D::IMAGE));
+ add(ConfigMapper(KEY_HEIGHT, C2_PARAMKEY_PICTURE_SIZE, "height")
+ .limitTo(D::VIDEO | D::IMAGE));
+
+ add(ConfigMapper("crop-left", C2_PARAMKEY_CROP_RECT, "left")
+ .limitTo(D::VIDEO | D::IMAGE));
+ add(ConfigMapper("crop-top", C2_PARAMKEY_CROP_RECT, "top")
+ .limitTo(D::VIDEO | D::IMAGE));
+ add(ConfigMapper("crop-width", C2_PARAMKEY_CROP_RECT, "width")
+ .limitTo(D::VIDEO | D::IMAGE));
+ add(ConfigMapper("crop-height", C2_PARAMKEY_CROP_RECT, "height")
+ .limitTo(D::VIDEO | D::IMAGE));
+
+ add(ConfigMapper(KEY_MAX_WIDTH, C2_PARAMKEY_MAX_PICTURE_SIZE, "width")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+ add(ConfigMapper(KEY_MAX_HEIGHT, C2_PARAMKEY_MAX_PICTURE_SIZE, "height")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW));
+
+ add(ConfigMapper("csd-0", C2_PARAMKEY_INIT_DATA, "value")
+ .limitTo(D::OUTPUT & D::READ));
+
+ add(ConfigMapper(C2_PARAMKEY_TEMPORAL_LAYERING, C2_PARAMKEY_TEMPORAL_LAYERING, "")
+ .limitTo(D::ENCODER & D::VIDEO & D::OUTPUT));
+
+ // Pixel Format (use local key for actual pixel format as we don't distinguish between
+ // SDK layouts for flexible format and we need the actual SDK color format in the media format)
+ add(ConfigMapper("android._color-format", C2_PARAMKEY_PIXEL_FORMAT, "value")
+ .limitTo((D::VIDEO | D::IMAGE) & D::RAW)
+ .withMappers([](C2Value v) -> C2Value {
+ int32_t value;
+ if (v.get(&value)) {
+ switch (value) {
+ case COLOR_FormatSurface:
+ return (uint32_t)HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
+ case COLOR_FormatYUV420Flexible:
+ return (uint32_t)HAL_PIXEL_FORMAT_YCBCR_420_888;
+ case COLOR_FormatYUV420Planar:
+ case COLOR_FormatYUV420SemiPlanar:
+ case COLOR_FormatYUV420PackedPlanar:
+ case COLOR_FormatYUV420PackedSemiPlanar:
+ return (uint32_t)HAL_PIXEL_FORMAT_YV12;
+ default:
+ // TODO: support some sort of passthrough
+ break;
+ }
+ }
+ return C2Value();
+ }, [](C2Value v) -> C2Value {
+ uint32_t value;
+ if (v.get(&value)) {
+ switch (value) {
+ case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
+ return COLOR_FormatSurface;
+ case HAL_PIXEL_FORMAT_YV12:
+ case HAL_PIXEL_FORMAT_YCBCR_420_888:
+ return COLOR_FormatYUV420Flexible;
+ default:
+ // TODO: support some sort of passthrough
+ break;
+ }
+ }
+ return C2Value();
+ }));
+
+ add(ConfigMapper(KEY_CHANNEL_COUNT, C2_PARAMKEY_CHANNEL_COUNT, "value")
+ .limitTo(D::AUDIO)); // read back to both formats
+ add(ConfigMapper(KEY_CHANNEL_COUNT, C2_PARAMKEY_CODED_CHANNEL_COUNT, "value")
+ .limitTo(D::AUDIO & D::CODED));
+
+ add(ConfigMapper(KEY_SAMPLE_RATE, C2_PARAMKEY_SAMPLE_RATE, "value")
+ .limitTo(D::AUDIO)); // read back to both port formats
+ add(ConfigMapper(KEY_SAMPLE_RATE, C2_PARAMKEY_CODED_SAMPLE_RATE, "value")
+ .limitTo(D::AUDIO & D::CODED));
+
+ add(ConfigMapper(KEY_PCM_ENCODING, C2_PARAMKEY_PCM_ENCODING, "value")
+ .limitTo(D::AUDIO));
+
+ add(ConfigMapper(KEY_IS_ADTS, C2_PARAMKEY_AAC_PACKAGING, "value")
+ .limitTo(D::AUDIO & D::CODED)
+ .withMappers([](C2Value v) -> C2Value {
+ int32_t value;
+ if (v.get(&value) && value) {
+ return C2Config::AAC_PACKAGING_ADTS;
+ }
+ return C2Value();
+ }, [](C2Value v) -> C2Value {
+ uint32_t value;
+ if (v.get(&value) && value == C2Config::AAC_PACKAGING_ADTS) {
+ return (int32_t)1;
+ }
+ return C2Value();
+ }));
+
+ std::shared_ptr<C2Mapper::ProfileLevelMapper> mapper =
+ C2Mapper::GetProfileLevelMapper(mCodingMediaType);
+
+ add(ConfigMapper(KEY_PROFILE, C2_PARAMKEY_PROFILE_LEVEL, "profile")
+ .limitTo(D::CODED)
+ .withMappers([mapper](C2Value v) -> C2Value {
+ C2Config::profile_t c2 = PROFILE_UNUSED;
+ int32_t sdk;
+ if (mapper && v.get(&sdk) && mapper->mapProfile(sdk, &c2)) {
+ return c2;
+ }
+ return PROFILE_UNUSED;
+ }, [mapper](C2Value v) -> C2Value {
+ C2Config::profile_t c2;
+ int32_t sdk;
+ using C2ValueType=typename _c2_reduce_enum_to_underlying_type<decltype(c2)>::type;
+ if (mapper && v.get((C2ValueType*)&c2) && mapper->mapProfile(c2, &sdk)) {
+ return sdk;
+ }
+ return C2Value();
+ }));
+
+ add(ConfigMapper(KEY_LEVEL, C2_PARAMKEY_PROFILE_LEVEL, "level")
+ .limitTo(D::CODED)
+ .withMappers([mapper](C2Value v) -> C2Value {
+ C2Config::level_t c2 = LEVEL_UNUSED;
+ int32_t sdk;
+ if (mapper && v.get(&sdk) && mapper->mapLevel(sdk, &c2)) {
+ return c2;
+ }
+ return LEVEL_UNUSED;
+ }, [mapper](C2Value v) -> C2Value {
+ C2Config::level_t c2;
+ int32_t sdk;
+ using C2ValueType=typename _c2_reduce_enum_to_underlying_type<decltype(c2)>::type;
+ if (mapper && v.get((C2ValueType*)&c2) && mapper->mapLevel(c2, &sdk)) {
+ return sdk;
+ }
+ return C2Value();
+ }));
+
+ // convert to dBFS and add default
+ add(ConfigMapper(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL, C2_PARAMKEY_DRC_TARGET_REFERENCE_LEVEL, "value")
+ .limitTo(D::AUDIO & D::DECODER)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ if (!v.get(&value) || value < 0) {
+ value = property_get_int32(PROP_DRC_OVERRIDE_REF_LEVEL, DRC_DEFAULT_MOBILE_REF_LEVEL);
+ }
+ return float(-0.25 * c2_min(value, 127));
+ }));
+
+ // convert to 0-1 (%) and add default
+ add(ConfigMapper(KEY_AAC_DRC_ATTENUATION_FACTOR, C2_PARAMKEY_DRC_ATTENUATION_FACTOR, "value")
+ .limitTo(D::AUDIO & D::DECODER)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ if (!v.get(&value) || value < 0) {
+ value = property_get_int32(PROP_DRC_OVERRIDE_CUT, DRC_DEFAULT_MOBILE_DRC_CUT);
+ }
+ return float(c2_min(value, 127) / 127.);
+ }));
+
+ // convert to 0-1 (%) and add default
+ add(ConfigMapper(KEY_AAC_DRC_BOOST_FACTOR, C2_PARAMKEY_DRC_BOOST_FACTOR, "value")
+ .limitTo(D::AUDIO & D::DECODER)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ if (!v.get(&value) || value < 0) {
+ value = property_get_int32(PROP_DRC_OVERRIDE_BOOST, DRC_DEFAULT_MOBILE_DRC_BOOST);
+ }
+ return float(c2_min(value, 127) / 127.);
+ }));
+
+ // convert to compression type and add default
+ add(ConfigMapper(KEY_AAC_DRC_HEAVY_COMPRESSION, C2_PARAMKEY_DRC_COMPRESSION_MODE, "value")
+ .limitTo(D::AUDIO & D::DECODER)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ if (!v.get(&value) || value < 0) {
+ value = property_get_int32(PROP_DRC_OVERRIDE_HEAVY, DRC_DEFAULT_MOBILE_DRC_HEAVY);
+ }
+ return value == 1 ? C2Config::DRC_COMPRESSION_HEAVY : C2Config::DRC_COMPRESSION_LIGHT;
+ }));
+
+ // convert to dBFS and add default
+ add(ConfigMapper(KEY_AAC_ENCODED_TARGET_LEVEL, C2_PARAMKEY_DRC_ENCODED_TARGET_LEVEL, "value")
+ .limitTo(D::AUDIO & D::DECODER)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ if (!v.get(&value) || value < 0) {
+ value = property_get_int32(PROP_DRC_OVERRIDE_ENC_LEVEL, DRC_DEFAULT_MOBILE_ENC_LEVEL);
+ }
+ return float(-0.25 * c2_min(value, 127));
+ }));
+
+ // convert to effect type (these map to SDK values) and add default
+ add(ConfigMapper(KEY_AAC_DRC_EFFECT_TYPE, C2_PARAMKEY_DRC_EFFECT_TYPE, "value")
+ .limitTo(D::AUDIO & D::DECODER)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ if (!v.get(&value) || value < -1 || value > 8) {
+ value = property_get_int32(PROP_DRC_OVERRIDE_EFFECT, DRC_DEFAULT_MOBILE_DRC_EFFECT);
+ // ensure value is within range
+ if (value < -1 || value > 8) {
+ value = DRC_DEFAULT_MOBILE_DRC_EFFECT;
+ }
+ }
+ return value;
+ }));
+
+ add(ConfigMapper(KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT, C2_PARAMKEY_MAX_CHANNEL_COUNT, "value")
+ .limitTo(D::AUDIO));
+
+ add(ConfigMapper(KEY_AAC_SBR_MODE, C2_PARAMKEY_AAC_SBR_MODE, "value")
+ .limitTo(D::AUDIO & D::ENCODER & D::CONFIG)
+ .withMapper([](C2Value v) -> C2Value {
+ int32_t value;
+ if (!v.get(&value) || value < 0) {
+ return C2Config::AAC_SBR_AUTO;
+ }
+ switch (value) {
+ case 0: return C2Config::AAC_SBR_OFF;
+ case 1: return C2Config::AAC_SBR_SINGLE_RATE;
+ case 2: return C2Config::AAC_SBR_DUAL_RATE;
+ default: return C2Config::AAC_SBR_AUTO + 1; // invalid value
+ }
+ }));
+
+ add(ConfigMapper(KEY_QUALITY, C2_PARAMKEY_QUALITY, "value"));
+ add(ConfigMapper(KEY_FLAC_COMPRESSION_LEVEL, C2_PARAMKEY_COMPLEXITY, "value")
+ .limitTo(D::AUDIO & D::ENCODER));
+ add(ConfigMapper("complexity", C2_PARAMKEY_COMPLEXITY, "value")
+ .limitTo(D::ENCODER));
+
+ add(ConfigMapper(KEY_GRID_COLUMNS, C2_PARAMKEY_TILE_LAYOUT, "columns")
+ .limitTo(D::IMAGE));
+ add(ConfigMapper(KEY_GRID_ROWS, C2_PARAMKEY_TILE_LAYOUT, "rows")
+ .limitTo(D::IMAGE));
+ add(ConfigMapper(KEY_TILE_WIDTH, C2_PARAMKEY_TILE_LAYOUT, "tile.width")
+ .limitTo(D::IMAGE));
+ add(ConfigMapper(KEY_TILE_HEIGHT, C2_PARAMKEY_TILE_LAYOUT, "tile.height")
+ .limitTo(D::IMAGE));
+
+ add(ConfigMapper(KEY_LATENCY, C2_PARAMKEY_PIPELINE_DELAY_REQUEST, "value")
+ .limitTo(D::VIDEO & D::ENCODER));
+
+ add(ConfigMapper(C2_PARAMKEY_INPUT_TIME_STRETCH, C2_PARAMKEY_INPUT_TIME_STRETCH, "value"));
+
+ /* still to do
+ constexpr char KEY_PUSH_BLANK_BUFFERS_ON_STOP[] = "push-blank-buffers-on-shutdown";
+
+ not yet used by MediaCodec, but defined as MediaFormat
+ KEY_AUDIO_SESSION_ID // we use "audio-hw-sync"
+ KEY_OUTPUT_REORDER_DEPTH
+ */
+}
+
+status_t CCodecConfig::initialize(
+ const std::shared_ptr<Codec2Client> &client,
+ const std::shared_ptr<Codec2Client::Component> &component) {
+ C2ComponentDomainSetting domain(C2Component::DOMAIN_OTHER);
+ C2ComponentKindSetting kind(C2Component::KIND_OTHER);
+
+ std::vector<std::unique_ptr<C2Param>> queried;
+ c2_status_t c2err = component->query({ &domain, &kind }, {}, C2_DONT_BLOCK, &queried);
+ if (c2err != C2_OK) {
+ ALOGD("Query domain & kind failed => %s", asString(c2err));
+ // TEMP: determine kind from component name
+ if (kind.value == C2Component::KIND_OTHER) {
+ if (component->getName().find("encoder") != std::string::npos) {
+ kind.value = C2Component::KIND_ENCODER;
+ } else if (component->getName().find("decoder") != std::string::npos) {
+ kind.value = C2Component::KIND_DECODER;
+ }
+ }
+
+ // TEMP: determine domain from media type (port (preferred) or stream #0)
+ if (domain.value == C2Component::DOMAIN_OTHER) {
+ AString mediaType = QueryMediaType(true /* input */, component);
+ if (mediaType.startsWith("audio/")) {
+ domain.value = C2Component::DOMAIN_AUDIO;
+ } else if (mediaType.startsWith("video/")) {
+ domain.value = C2Component::DOMAIN_VIDEO;
+ } else if (mediaType.startsWith("image/")) {
+ domain.value = C2Component::DOMAIN_IMAGE;
+ }
+ }
+ }
+
+ mDomain = (domain.value == C2Component::DOMAIN_VIDEO ? Domain::IS_VIDEO :
+ domain.value == C2Component::DOMAIN_IMAGE ? Domain::IS_IMAGE :
+ domain.value == C2Component::DOMAIN_AUDIO ? Domain::IS_AUDIO : Domain::OTHER_DOMAIN)
+ | (kind.value == C2Component::KIND_DECODER ? Domain::IS_DECODER :
+ kind.value == C2Component::KIND_ENCODER ? Domain::IS_ENCODER : Domain::OTHER_KIND);
+
+ mInputDomain = Domain(((mDomain & IS_DECODER) ? IS_CODED : IS_RAW) | IS_INPUT);
+ mOutputDomain = Domain(((mDomain & IS_ENCODER) ? IS_CODED : IS_RAW) | IS_OUTPUT);
+
+ ALOGV("domain is %#x (%u %u)", mDomain, domain.value, kind.value);
+
+ std::vector<C2Param::Index> paramIndices;
+ switch (kind.value) {
+ case C2Component::KIND_DECODER:
+ mCodingMediaType = QueryMediaType(true /* input */, component).c_str();
+ break;
+ case C2Component::KIND_ENCODER:
+ mCodingMediaType = QueryMediaType(false /* input */, component).c_str();
+ break;
+ default:
+ mCodingMediaType = "";
+ }
+
+ c2err = component->querySupportedParams(&mParamDescs);
+ if (c2err != C2_OK) {
+ ALOGD("Query supported params failed after returning %zu values => %s",
+ mParamDescs.size(), asString(c2err));
+ return UNKNOWN_ERROR;
+ }
+ for (const std::shared_ptr<C2ParamDescriptor> &desc : mParamDescs) {
+ mSupportedIndices.emplace(desc->index());
+ }
+
+ mReflector = client->getParamReflector();
+ if (mReflector == nullptr) {
+ ALOGE("Failed to get param reflector");
+ return UNKNOWN_ERROR;
+ }
+
+ // enumerate all fields
+ mParamUpdater = std::make_shared<ReflectedParamUpdater>();
+ mParamUpdater->clear();
+ mParamUpdater->supportWholeParam(
+ C2_PARAMKEY_TEMPORAL_LAYERING, C2StreamTemporalLayeringTuning::CORE_INDEX);
+ mParamUpdater->addParamDesc(mReflector, mParamDescs);
+
+ // TEMP: add some standard fields even if not reflected
+ if (kind.value == C2Component::KIND_ENCODER) {
+ mParamUpdater->addStandardParam<C2StreamInitDataInfo::output>(C2_PARAMKEY_INIT_DATA);
+ }
+ if (domain.value == C2Component::DOMAIN_IMAGE || domain.value == C2Component::DOMAIN_VIDEO) {
+ if (kind.value != C2Component::KIND_ENCODER) {
+ addLocalParam<C2StreamPictureSizeInfo::output>(C2_PARAMKEY_PICTURE_SIZE);
+ addLocalParam<C2StreamCropRectInfo::output>(C2_PARAMKEY_CROP_RECT);
+ addLocalParam(
+ new C2StreamPixelAspectRatioInfo::output(0u, 1u, 1u),
+ C2_PARAMKEY_PIXEL_ASPECT_RATIO);
+ addLocalParam(new C2StreamRotationInfo::output(0u, 0), C2_PARAMKEY_ROTATION);
+ addLocalParam(new C2StreamColorAspectsInfo::output(0u), C2_PARAMKEY_COLOR_ASPECTS);
+ addLocalParam<C2StreamDataSpaceInfo::output>(C2_PARAMKEY_DATA_SPACE);
+ addLocalParam<C2StreamHdrStaticInfo::output>(C2_PARAMKEY_HDR_STATIC_INFO);
+ addLocalParam(new C2StreamSurfaceScalingInfo::output(0u, VIDEO_SCALING_MODE_SCALE_TO_FIT),
+ C2_PARAMKEY_SURFACE_SCALING_MODE);
+ } else {
+ addLocalParam(new C2StreamColorAspectsInfo::input(0u), C2_PARAMKEY_COLOR_ASPECTS);
+ }
+ }
+
+ initializeStandardParams();
+
+ // subscribe to all supported standard (exposed) params
+ // TODO: limit this to params that are actually in the domain
+ std::vector<std::string> formatKeys = mStandardParams->getPathsForDomain(Domain(1 << 30));
+ std::vector<C2Param::Index> indices;
+ mParamUpdater->getParamIndicesForKeys(formatKeys, &indices);
+ mSubscribedIndices.insert(indices.begin(), indices.end());
+
+ // also subscribe to some non-SDK standard parameters
+ // for number of input/output buffers
+ mSubscribedIndices.emplace(C2PortSuggestedBufferCountTuning::input::PARAM_TYPE);
+ mSubscribedIndices.emplace(C2PortSuggestedBufferCountTuning::output::PARAM_TYPE);
+ mSubscribedIndices.emplace(C2ActualPipelineDelayTuning::PARAM_TYPE);
+ mSubscribedIndices.emplace(C2PortActualDelayTuning::input::PARAM_TYPE);
+ mSubscribedIndices.emplace(C2PortActualDelayTuning::output::PARAM_TYPE);
+ // for output buffer array allocation
+ mSubscribedIndices.emplace(C2StreamMaxBufferSizeInfo::output::PARAM_TYPE);
+ // init data (CSD)
+ mSubscribedIndices.emplace(C2StreamInitDataInfo::output::PARAM_TYPE);
+
+ return OK;
+}
+
+status_t CCodecConfig::subscribeToConfigUpdate(
+ const std::shared_ptr<Codec2Client::Component> &component,
+ const std::vector<C2Param::Index> &indices,
+ c2_blocking_t blocking) {
+ mSubscribedIndices.insert(indices.begin(), indices.end());
+ // TODO: enable this when components no longer crash on this config
+ if (mSubscribedIndices.size() != mSubscribedIndicesSize && false) {
+ std::vector<uint32_t> indices;
+ for (C2Param::Index ix : mSubscribedIndices) {
+ indices.push_back(ix);
+ }
+ std::unique_ptr<C2SubscribedParamIndicesTuning> subscribeTuning =
+ C2SubscribedParamIndicesTuning::AllocUnique(indices);
+ std::vector<std::unique_ptr<C2SettingResult>> results;
+ c2_status_t c2Err = component->config({ subscribeTuning.get() }, blocking, &results);
+ if (c2Err != C2_OK && c2Err != C2_BAD_INDEX) {
+ ALOGD("Failed to subscribe to parameters => %s", asString(c2Err));
+ // TODO: error
+ }
+ ALOGV("Subscribed to %zu params", mSubscribedIndices.size());
+ mSubscribedIndicesSize = mSubscribedIndices.size();
+ }
+ return OK;
+}
+
+status_t CCodecConfig::queryConfiguration(
+ const std::shared_ptr<Codec2Client::Component> &component) {
+ // query all subscribed parameters
+ std::vector<C2Param::Index> indices(mSubscribedIndices.begin(), mSubscribedIndices.end());
+ std::vector<std::unique_ptr<C2Param>> queried;
+ c2_status_t c2Err = component->query({}, indices, C2_MAY_BLOCK, &queried);
+ if (c2Err != OK) {
+ ALOGI("query failed after returning %zu values (%s)", queried.size(), asString(c2Err));
+ // TODO: error
+ }
+
+ updateConfiguration(queried, ALL);
+ return OK;
+}
+
+bool CCodecConfig::updateConfiguration(
+ std::vector<std::unique_ptr<C2Param>> &configUpdate, Domain domain) {
+ ALOGV("updating configuration with %zu params", configUpdate.size());
+ bool changed = false;
+ for (std::unique_ptr<C2Param> &p : configUpdate) {
+ if (p && *p) {
+ auto insertion = mCurrentConfig.emplace(p->index(), nullptr);
+ if (insertion.second || *insertion.first->second != *p) {
+ if (mSupportedIndices.count(p->index()) || mLocalParams.count(p->index())) {
+ // only track changes in supported (reflected or local) indices
+ changed = true;
+ } else {
+ ALOGV("an unlisted config was %s: %#x",
+ insertion.second ? "added" : "updated", p->index());
+ }
+ }
+ insertion.first->second = std::move(p);
+ }
+ }
+
+ ALOGV("updated configuration has %zu params (%s)", mCurrentConfig.size(),
+ changed ? "CHANGED" : "no change");
+ if (changed) {
+ return updateFormats(domain);
+ }
+ return false;
+}
+
+bool CCodecConfig::updateFormats(Domain domain) {
+ // get addresses of params in the current config
+ std::vector<C2Param*> paramPointers;
+ for (const auto &it : mCurrentConfig) {
+ paramPointers.push_back(it.second.get());
+ }
+
+ ReflectedParamUpdater::Dict reflected = mParamUpdater->getParams(paramPointers);
+ ALOGD("c2 config is %s", reflected.debugString().c_str());
+
+ bool changed = false;
+ if (domain & mInputDomain) {
+ sp<AMessage> oldFormat = mInputFormat;
+ mInputFormat = mInputFormat->dup(); // trigger format changed
+ mInputFormat->extend(getSdkFormatForDomain(reflected, mInputDomain));
+ if (mInputFormat->countEntries() != oldFormat->countEntries()
+ || mInputFormat->changesFrom(oldFormat)->countEntries() > 0) {
+ changed = true;
+ } else {
+ mInputFormat = oldFormat; // no change
+ }
+ }
+ if (domain & mOutputDomain) {
+ sp<AMessage> oldFormat = mOutputFormat;
+ mOutputFormat = mOutputFormat->dup(); // trigger output format changed
+ mOutputFormat->extend(getSdkFormatForDomain(reflected, mOutputDomain));
+ if (mOutputFormat->countEntries() != oldFormat->countEntries()
+ || mOutputFormat->changesFrom(oldFormat)->countEntries() > 0) {
+ changed = true;
+ } else {
+ mOutputFormat = oldFormat; // no change
+ }
+ }
+ ALOGV_IF(changed, "format(s) changed");
+ return changed;
+}
+
+sp<AMessage> CCodecConfig::getSdkFormatForDomain(
+ const ReflectedParamUpdater::Dict &reflected, Domain portDomain) const {
+ sp<AMessage> msg = new AMessage;
+ for (const std::pair<std::string, std::vector<ConfigMapper>> &el : mStandardParams->getKeys()) {
+ for (const ConfigMapper &cm : el.second) {
+ if ((cm.domain() & portDomain) == 0 // input-output-coded-raw
+ || (cm.domain() & mDomain) != mDomain // component domain + kind (these must match)
+ || (cm.domain() & IS_READ) == 0) {
+ continue;
+ }
+ auto it = reflected.find(cm.path());
+ if (it == reflected.end()) {
+ continue;
+ }
+ C2Value c2Value;
+ sp<ABuffer> bufValue;
+ AString strValue;
+ AMessage::ItemData item;
+ if (it->second.find(&c2Value)) {
+ item = cm.mapToMessage(c2Value);
+ } else if (it->second.find(&bufValue)) {
+ item.set(bufValue);
+ } else if (it->second.find(&strValue)) {
+ item.set(strValue);
+ } else {
+ ALOGD("unexpected untyped query value for key: %s", cm.path().c_str());
+ continue;
+ }
+ msg->setItem(el.first.c_str(), item);
+ }
+ }
+
+ { // convert from Codec 2.0 rect to MediaFormat rect and add crop rect if not present
+ int32_t left, top, width, height;
+ if (msg->findInt32("crop-left", &left) && msg->findInt32("crop-width", &width)
+ && msg->findInt32("crop-top", &top) && msg->findInt32("crop-height", &height)
+ && left >= 0 && width >=0 && width <= INT32_MAX - left
+ && top >= 0 && height >=0 && height <= INT32_MAX - top) {
+ msg->removeEntryAt(msg->findEntryByName("crop-left"));
+ msg->removeEntryAt(msg->findEntryByName("crop-top"));
+ msg->removeEntryAt(msg->findEntryByName("crop-width"));
+ msg->removeEntryAt(msg->findEntryByName("crop-height"));
+ msg->setRect("crop", left, top, left + width - 1, top + height - 1);
+ } else if (msg->findInt32("width", &width) && msg->findInt32("height", &height)) {
+ msg->setRect("crop", 0, 0, width - 1, height - 1);
+ }
+ }
+
+ { // convert temporal layering to schema
+ sp<ABuffer> tmp;
+ if (msg->findBuffer(C2_PARAMKEY_TEMPORAL_LAYERING, &tmp) && tmp != nullptr) {
+ C2StreamTemporalLayeringTuning *layering =
+ C2StreamTemporalLayeringTuning::From(C2Param::From(tmp->data(), tmp->size()));
+ if (layering && layering->m.layerCount > 0
+ && layering->m.bLayerCount < layering->m.layerCount) {
+ // check if this is webrtc compatible
+ AString mime;
+ if (msg->findString(KEY_MIME, &mime) &&
+ mime.equalsIgnoreCase(MIMETYPE_VIDEO_VP8) &&
+ layering->m.bLayerCount == 0 &&
+ (layering->m.layerCount == 1
+ || (layering->m.layerCount == 2
+ && layering->flexCount() >= 1
+ && layering->m.bitrateRatios[0] == .6f)
+ || (layering->m.layerCount == 3
+ && layering->flexCount() >= 2
+ && layering->m.bitrateRatios[0] == .4f
+ && layering->m.bitrateRatios[1] == .6f)
+ || (layering->m.layerCount == 4
+ && layering->flexCount() >= 3
+ && layering->m.bitrateRatios[0] == .25f
+ && layering->m.bitrateRatios[1] == .4f
+ && layering->m.bitrateRatios[2] == .6f))) {
+ msg->setString(KEY_TEMPORAL_LAYERING, AStringPrintf(
+ "webrtc.vp8.%u-layer", layering->m.layerCount));
+ } else if (layering->m.bLayerCount) {
+ msg->setString(KEY_TEMPORAL_LAYERING, AStringPrintf(
+ "android.generic.%u+%u",
+ layering->m.layerCount - layering->m.bLayerCount,
+ layering->m.bLayerCount));
+ } else if (layering->m.bLayerCount) {
+ msg->setString(KEY_TEMPORAL_LAYERING, AStringPrintf(
+ "android.generic.%u", layering->m.layerCount));
+ }
+ }
+ msg->removeEntryAt(msg->findEntryByName(C2_PARAMKEY_TEMPORAL_LAYERING));
+ }
+ }
+
+ { // convert color info
+ C2Color::primaries_t primaries;
+ C2Color::matrix_t matrix;
+ if (msg->findInt32("color-primaries", (int32_t*)&primaries)
+ && msg->findInt32("color-matrix", (int32_t*)&matrix)) {
+ int32_t standard;
+
+ if (C2Mapper::map(primaries, matrix, &standard)) {
+ msg->setInt32(KEY_COLOR_STANDARD, standard);
+ }
+
+ msg->removeEntryAt(msg->findEntryByName("color-primaries"));
+ msg->removeEntryAt(msg->findEntryByName("color-matrix"));
+ }
+
+
+ // calculate dataspace for raw graphic buffers if not specified by component, or if
+ // using surface with unspecified aspects (as those must be defaulted which may change
+ // the dataspace)
+ if ((portDomain & IS_RAW) && (mDomain & (IS_IMAGE | IS_VIDEO))) {
+ android_dataspace dataspace;
+ ColorAspects aspects = {
+ ColorAspects::RangeUnspecified, ColorAspects::PrimariesUnspecified,
+ ColorAspects::TransferUnspecified, ColorAspects::MatrixUnspecified
+ };
+ ColorUtils::getColorAspectsFromFormat(msg, aspects);
+ ColorAspects origAspects = aspects;
+ if (mUsingSurface) {
+ // get image size (default to HD)
+ int32_t width = 1280;
+ int32_t height = 720;
+ int32_t left, top, right, bottom;
+ if (msg->findRect("crop", &left, &top, &right, &bottom)) {
+ width = right - left + 1;
+ height = bottom - top + 1;
+ } else {
+ (void)msg->findInt32(KEY_WIDTH, &width);
+ (void)msg->findInt32(KEY_HEIGHT, &height);
+ }
+ ColorUtils::setDefaultCodecColorAspectsIfNeeded(aspects, width, height);
+ ColorUtils::setColorAspectsIntoFormat(aspects, msg);
+ }
+
+ if (!msg->findInt32("android._dataspace", (int32_t*)&dataspace)
+ || aspects.mRange != origAspects.mRange
+ || aspects.mPrimaries != origAspects.mPrimaries
+ || aspects.mTransfer != origAspects.mTransfer
+ || aspects.mMatrixCoeffs != origAspects.mMatrixCoeffs) {
+ dataspace = ColorUtils::getDataSpaceForColorAspects(aspects, true /* mayExpand */);
+ msg->setInt32("android._dataspace", dataspace);
+ }
+ }
+
+ // HDR static info
+
+ C2HdrStaticMetadataStruct hdr;
+ if (msg->findFloat("smpte2086.red.x", &hdr.mastering.red.x)
+ && msg->findFloat("smpte2086.red.y", &hdr.mastering.red.y)
+ && msg->findFloat("smpte2086.green.x", &hdr.mastering.green.x)
+ && msg->findFloat("smpte2086.green.y", &hdr.mastering.green.y)
+ && msg->findFloat("smpte2086.blue.x", &hdr.mastering.blue.x)
+ && msg->findFloat("smpte2086.blue.y", &hdr.mastering.blue.y)
+ && msg->findFloat("smpte2086.white.x", &hdr.mastering.white.x)
+ && msg->findFloat("smpte2086.white.y", &hdr.mastering.white.y)
+ && msg->findFloat("smpte2086.max-luminance", &hdr.mastering.maxLuminance)
+ && msg->findFloat("smpte2086.min-luminance", &hdr.mastering.minLuminance)
+ && msg->findFloat("cta861.max-cll", &hdr.maxCll)
+ && msg->findFloat("cta861.max-fall", &hdr.maxFall)) {
+ if (hdr.mastering.red.x >= 0 && hdr.mastering.red.x <= 1
+ && hdr.mastering.red.y >= 0 && hdr.mastering.red.y <= 1
+ && hdr.mastering.green.x >= 0 && hdr.mastering.green.x <= 1
+ && hdr.mastering.green.y >= 0 && hdr.mastering.green.y <= 1
+ && hdr.mastering.blue.x >= 0 && hdr.mastering.blue.x <= 1
+ && hdr.mastering.blue.y >= 0 && hdr.mastering.blue.y <= 1
+ && hdr.mastering.white.x >= 0 && hdr.mastering.white.x <= 1
+ && hdr.mastering.white.y >= 0 && hdr.mastering.white.y <= 1
+ && hdr.mastering.maxLuminance >= 0 && hdr.mastering.maxLuminance <= 65535
+ && hdr.mastering.minLuminance >= 0 && hdr.mastering.minLuminance <= 6.5535
+ && hdr.maxCll >= 0 && hdr.maxCll <= 65535
+ && hdr.maxFall >= 0 && hdr.maxFall <= 65535) {
+ HDRStaticInfo meta;
+ meta.mID = meta.kType1;
+ meta.sType1.mR.x = hdr.mastering.red.x / 0.00002 + 0.5;
+ meta.sType1.mR.y = hdr.mastering.red.y / 0.00002 + 0.5;
+ meta.sType1.mG.x = hdr.mastering.green.x / 0.00002 + 0.5;
+ meta.sType1.mG.y = hdr.mastering.green.y / 0.00002 + 0.5;
+ meta.sType1.mB.x = hdr.mastering.blue.x / 0.00002 + 0.5;
+ meta.sType1.mB.y = hdr.mastering.blue.y / 0.00002 + 0.5;
+ meta.sType1.mW.x = hdr.mastering.white.x / 0.00002 + 0.5;
+ meta.sType1.mW.y = hdr.mastering.white.y / 0.00002 + 0.5;
+ meta.sType1.mMaxDisplayLuminance = hdr.mastering.maxLuminance + 0.5;
+ meta.sType1.mMinDisplayLuminance = hdr.mastering.minLuminance / 0.0001 + 0.5;
+ meta.sType1.mMaxContentLightLevel = hdr.maxCll + 0.5;
+ meta.sType1.mMaxFrameAverageLightLevel = hdr.maxFall + 0.5;
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.red.x"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.red.y"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.green.x"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.green.y"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.blue.x"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.blue.y"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.white.x"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.white.y"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.max-luminance"));
+ msg->removeEntryAt(msg->findEntryByName("smpte2086.min-luminance"));
+ msg->removeEntryAt(msg->findEntryByName("cta861.max-cll"));
+ msg->removeEntryAt(msg->findEntryByName("cta861.max-fall"));
+ msg->setBuffer(KEY_HDR_STATIC_INFO, ABuffer::CreateAsCopy(&meta, sizeof(meta)));
+ } else {
+ ALOGD("found invalid HDR static metadata %s", msg->debugString(8).c_str());
+ }
+ }
+ }
+
+ ALOGV("converted to SDK values as %s", msg->debugString().c_str());
+ return msg;
+}
+
+/// converts an AMessage value to a ParamUpdater value
+static void convert(const AMessage::ItemData &from, ReflectedParamUpdater::Value *to) {
+ int32_t int32Value;
+ int64_t int64Value;
+ sp<ABuffer> bufValue;
+ AString strValue;
+ float floatValue;
+ double doubleValue;
+
+ if (from.find(&int32Value)) {
+ to->set(int32Value);
+ } else if (from.find(&int64Value)) {
+ to->set(int64Value);
+ } else if (from.find(&bufValue)) {
+ to->set(bufValue);
+ } else if (from.find(&strValue)) {
+ to->set(strValue);
+ } else if (from.find(&floatValue)) {
+ to->set(C2Value(floatValue));
+ } else if (from.find(&doubleValue)) {
+ // convert double to float
+ to->set(C2Value((float)doubleValue));
+ }
+ // ignore all other AMessage types
+}
+
+/// relaxes Codec 2.0 specific value types to SDK types (mainly removes signedness and counterness
+/// from 32/64-bit values.)
+static void relaxValues(ReflectedParamUpdater::Value &item) {
+ C2Value c2Value;
+ int32_t int32Value;
+ int64_t int64Value;
+ (void)item.find(&c2Value);
+ if (c2Value.get(&int32Value) || c2Value.get((uint32_t*)&int32Value)
+ || c2Value.get((c2_cntr32_t*)&int32Value)) {
+ item.set(int32Value);
+ } else if (c2Value.get(&int64Value)
+ || c2Value.get((uint64_t*)&int64Value)
+ || c2Value.get((c2_cntr64_t*)&int64Value)) {
+ item.set(int64Value);
+ }
+}
+
+ReflectedParamUpdater::Dict CCodecConfig::getReflectedFormat(
+ const sp<AMessage> ¶ms_, Domain configDomain) const {
+ // create a modifiable copy of params
+ sp<AMessage> params = params_->dup();
+ ALOGV("filtering with config domain %x", configDomain);
+
+ // convert some macro parameters to Codec 2.0 specific expressions
+
+ { // make i-frame-interval frame based
+ float iFrameInterval;
+ if (params->findAsFloat(KEY_I_FRAME_INTERVAL, &iFrameInterval)) {
+ float frameRate;
+ if (params->findAsFloat(KEY_FRAME_RATE, &frameRate)) {
+ params->setInt32("i-frame-period",
+ (frameRate <= 0 || iFrameInterval < 0)
+ ? -1 /* no sync frames */
+ : (int32_t)c2_min(iFrameInterval * frameRate + 0.5,
+ (float)INT32_MAX));
+ }
+ }
+ }
+
+ if (mDomain == (IS_VIDEO | IS_ENCODER)) {
+ // convert capture-rate into input-time-stretch
+ float frameRate, captureRate;
+ if (params->findAsFloat(KEY_FRAME_RATE, &frameRate)) {
+ if (!params->findAsFloat("time-lapse-fps", &captureRate)
+ && !params->findAsFloat(KEY_CAPTURE_RATE, &captureRate)) {
+ captureRate = frameRate;
+ }
+ if (captureRate > 0 && frameRate > 0) {
+ params->setFloat(C2_PARAMKEY_INPUT_TIME_STRETCH, captureRate / frameRate);
+ }
+ }
+ }
+
+ { // reflect temporal layering into a binary blob
+ AString schema;
+ if (params->findString(KEY_TEMPORAL_LAYERING, &schema)) {
+ unsigned int numLayers = 0;
+ unsigned int numBLayers = 0;
+ int tags;
+ char dummy;
+ std::unique_ptr<C2StreamTemporalLayeringTuning::output> layering;
+ if (sscanf(schema.c_str(), "webrtc.vp8.%u-layer%c", &numLayers, &dummy) == 1
+ && numLayers > 0) {
+ switch (numLayers) {
+ case 1:
+ layering = C2StreamTemporalLayeringTuning::output::AllocUnique(
+ {}, 0u, 1u, 0u);
+ break;
+ case 2:
+ layering = C2StreamTemporalLayeringTuning::output::AllocUnique(
+ { .6f }, 0u, 2u, 0u);
+ break;
+ case 3:
+ layering = C2StreamTemporalLayeringTuning::output::AllocUnique(
+ { .4f, .6f }, 0u, 3u, 0u);
+ break;
+ default:
+ layering = C2StreamTemporalLayeringTuning::output::AllocUnique(
+ { .25f, .4f, .6f }, 0u, 4u, 0u);
+ break;
+ }
+ } else if ((tags = sscanf(schema.c_str(), "android.generic.%u%c%u%c",
+ &numLayers, &dummy, &numBLayers, &dummy))
+ && (tags == 1 || (tags == 3 && dummy == '+'))
+ && numLayers > 0 && numLayers < UINT32_MAX - numBLayers) {
+ layering = C2StreamTemporalLayeringTuning::output::AllocUnique(
+ {}, 0u, numLayers + numBLayers, numBLayers);
+ } else {
+ ALOGD("Ignoring unsupported ts-schema [%s]", schema.c_str());
+ }
+ if (layering) {
+ params->setBuffer(C2_PARAMKEY_TEMPORAL_LAYERING,
+ ABuffer::CreateAsCopy(layering.get(), layering->size()));
+ }
+ }
+ }
+
+ { // convert from MediaFormat rect to Codec 2.0 rect
+ int32_t offset;
+ int32_t end;
+ AMessage::ItemData item;
+ if (params->findInt32("crop-left", &offset) && params->findInt32("crop-right", &end)
+ && offset >= 0 && end >= offset - 1) {
+ size_t ix = params->findEntryByName("crop-right");
+ params->setEntryNameAt(ix, "crop-width");
+ item.set(end - offset + 1);
+ params->setEntryAt(ix, item);
+ }
+ if (params->findInt32("crop-top", &offset) && params->findInt32("crop-bottom", &end)
+ && offset >= 0 && end >= offset - 1) {
+ size_t ix = params->findEntryByName("crop-bottom");
+ params->setEntryNameAt(ix, "crop-height");
+ item.set(end - offset + 1);
+ params->setEntryAt(ix, item);
+ }
+ }
+
+ { // convert color info
+ int32_t standard;
+ if (params->findInt32(KEY_COLOR_STANDARD, &standard)) {
+ C2Color::primaries_t primaries;
+ C2Color::matrix_t matrix;
+
+ if (C2Mapper::map(standard, &primaries, &matrix)) {
+ params->setInt32("color-primaries", primaries);
+ params->setInt32("color-matrix", matrix);
+ }
+ }
+
+ sp<ABuffer> hdrMeta;
+ if (params->findBuffer(KEY_HDR_STATIC_INFO, &hdrMeta)
+ && hdrMeta->size() == sizeof(HDRStaticInfo)) {
+ HDRStaticInfo *meta = (HDRStaticInfo*)hdrMeta->data();
+ if (meta->mID == meta->kType1) {
+ params->setFloat("smpte2086.red.x", meta->sType1.mR.x * 0.00002);
+ params->setFloat("smpte2086.red.y", meta->sType1.mR.y * 0.00002);
+ params->setFloat("smpte2086.green.x", meta->sType1.mG.x * 0.00002);
+ params->setFloat("smpte2086.green.y", meta->sType1.mG.y * 0.00002);
+ params->setFloat("smpte2086.blue.x", meta->sType1.mB.x * 0.00002);
+ params->setFloat("smpte2086.blue.y", meta->sType1.mB.y * 0.00002);
+ params->setFloat("smpte2086.white.x", meta->sType1.mW.x * 0.00002);
+ params->setFloat("smpte2086.white.y", meta->sType1.mW.y * 0.00002);
+ params->setFloat("smpte2086.max-luminance", meta->sType1.mMaxDisplayLuminance);
+ params->setFloat("smpte2086.min-luminance", meta->sType1.mMinDisplayLuminance * 0.0001);
+ params->setFloat("cta861.max-cll", meta->sType1.mMaxContentLightLevel);
+ params->setFloat("cta861.max-fall", meta->sType1.mMaxFrameAverageLightLevel);
+ }
+ }
+ }
+
+ // this is to verify that we set proper signedness for standard parameters
+ bool beVeryStrict = property_get_bool("debug.stagefright.ccodec_strict_type", false);
+ // this is to allow vendors to use the wrong signedness for standard parameters
+ bool beVeryLax = property_get_bool("debug.stagefright.ccodec_lax_type", false);
+
+ ReflectedParamUpdater::Dict filtered;
+ for (size_t ix = 0; ix < params->countEntries(); ++ix) {
+ AMessage::Type type;
+ AString name = params->getEntryNameAt(ix, &type);
+ AMessage::ItemData msgItem = params->getEntryAt(ix);
+ ReflectedParamUpdater::Value item;
+ convert(msgItem, &item); // convert item to param updater item
+
+ if (name.startsWith("vendor.")) {
+ // vendor params pass through as is
+ filtered.emplace(name.c_str(), item);
+ continue;
+ }
+ // standard parameters may get modified, filtered or duplicated
+ for (const ConfigMapper &cm : mStandardParams->getConfigMappersForSdkKey(name.c_str())) {
+ // note: we ignore port domain for configuration
+ if ((cm.domain() & configDomain)
+ // component domain + kind (these must match)
+ && (cm.domain() & mDomain) == mDomain) {
+ // map arithmetic values, pass through string or buffer
+ switch (type) {
+ case AMessage::kTypeBuffer:
+ case AMessage::kTypeString:
+ break;
+ case AMessage::kTypeInt32:
+ case AMessage::kTypeInt64:
+ case AMessage::kTypeFloat:
+ case AMessage::kTypeDouble:
+ // for now only map settings with mappers as we are not creating
+ // signed <=> unsigned mappers
+ // TODO: be precise about signed unsigned
+ if (beVeryStrict || cm.mapper()) {
+ item.set(cm.mapFromMessage(params->getEntryAt(ix)));
+ // also allow to relax type strictness
+ if (beVeryLax) {
+ relaxValues(item);
+ }
+ }
+ break;
+ default:
+ continue;
+ }
+ filtered.emplace(cm.path(), item);
+ }
+ }
+ }
+ ALOGV("filtered %s to %s", params->debugString(4).c_str(),
+ filtered.debugString(4).c_str());
+ return filtered;
+}
+
+status_t CCodecConfig::getConfigUpdateFromSdkParams(
+ std::shared_ptr<Codec2Client::Component> component,
+ const sp<AMessage> &sdkParams, Domain configDomain,
+ c2_blocking_t blocking,
+ std::vector<std::unique_ptr<C2Param>> *configUpdate) const {
+ ReflectedParamUpdater::Dict params = getReflectedFormat(sdkParams, configDomain);
+
+ std::vector<C2Param::Index> indices;
+ mParamUpdater->getParamIndicesFromMessage(params, &indices);
+ if (indices.empty()) {
+ ALOGD("no recognized params in: %s", params.debugString().c_str());
+ return OK;
+ }
+
+ configUpdate->clear();
+ std::vector<C2Param::Index> supportedIndices;
+ for (C2Param::Index ix : indices) {
+ if (mSupportedIndices.count(ix)) {
+ supportedIndices.push_back(ix);
+ } else if (mLocalParams.count(ix)) {
+ // query local parameter here
+ auto it = mCurrentConfig.find(ix);
+ if (it != mCurrentConfig.end()) {
+ configUpdate->emplace_back(C2Param::Copy(*it->second));
+ }
+ }
+ }
+
+ c2_status_t err = component->query({ }, supportedIndices, blocking, configUpdate);
+ if (err != C2_OK) {
+ ALOGD("query failed after returning %zu params => %s", configUpdate->size(), asString(err));
+ }
+
+ if (configUpdate->size()) {
+ mParamUpdater->updateParamsFromMessage(params, configUpdate);
+ }
+ return OK;
+}
+
+status_t CCodecConfig::setParameters(
+ std::shared_ptr<Codec2Client::Component> component,
+ std::vector<std::unique_ptr<C2Param>> &configUpdate,
+ c2_blocking_t blocking) {
+ status_t result = OK;
+ if (configUpdate.empty()) {
+ return OK;
+ }
+
+ std::vector<C2Param::Index> indices;
+ std::vector<C2Param *> paramVector;
+ for (const std::unique_ptr<C2Param> ¶m : configUpdate) {
+ if (mSupportedIndices.count(param->index())) {
+ // component parameter
+ paramVector.push_back(param.get());
+ indices.push_back(param->index());
+ } else if (mLocalParams.count(param->index())) {
+ // handle local parameter here
+ LocalParamValidator validator = mLocalParams.find(param->index())->second;
+ c2_status_t err = C2_OK;
+ std::unique_ptr<C2Param> copy = C2Param::Copy(*param);
+ if (validator) {
+ err = validator(copy);
+ }
+ if (err == C2_OK) {
+ ALOGV("updated local parameter value for %s",
+ mParamUpdater->getParamName(param->index()).c_str());
+
+ mCurrentConfig[param->index()] = std::move(copy);
+ } else {
+ ALOGD("failed to set parameter value for %s => %s",
+ mParamUpdater->getParamName(param->index()).c_str(), asString(err));
+ result = BAD_VALUE;
+ }
+ }
+ }
+ // update subscribed param indices
+ subscribeToConfigUpdate(component, indices, blocking);
+
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ c2_status_t err = component->config(paramVector, blocking, &failures);
+ if (err != C2_OK) {
+ ALOGD("config failed => %s", asString(err));
+ // This is non-fatal.
+ }
+ for (const std::unique_ptr<C2SettingResult> &failure : failures) {
+ switch (failure->failure) {
+ case C2SettingResult::BAD_VALUE:
+ ALOGD("Bad parameter value");
+ result = BAD_VALUE;
+ break;
+ default:
+ ALOGV("failure = %d", int(failure->failure));
+ break;
+ }
+ }
+
+ // Re-query parameter values in case config could not update them and update the current
+ // configuration.
+ configUpdate.clear();
+ err = component->query({}, indices, blocking, &configUpdate);
+ if (err != C2_OK) {
+ ALOGD("query failed after returning %zu params => %s", configUpdate.size(), asString(err));
+ }
+ (void)updateConfiguration(configUpdate, ALL);
+
+ // TODO: error value
+ return result;
+}
+
+const C2Param *CCodecConfig::getConfigParameterValue(C2Param::Index index) const {
+ auto it = mCurrentConfig.find(index);
+ if (it == mCurrentConfig.end()) {
+ return nullptr;
+ } else {
+ return it->second.get();
+ }
+}
+
+} // namespace android
diff --git a/media/codec2/sfplugin/CCodecConfig.h b/media/codec2/sfplugin/CCodecConfig.h
new file mode 100644
index 0000000..3bafe3f
--- /dev/null
+++ b/media/codec2/sfplugin/CCodecConfig.h
@@ -0,0 +1,345 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C_CODEC_CONFIG_H_
+#define C_CODEC_CONFIG_H_
+
+#include <map>
+#include <memory>
+#include <set>
+#include <vector>
+
+#include <C2Component.h>
+#include <codec2/hidl/client.h>
+
+#include <utils/RefBase.h>
+
+#include "InputSurfaceWrapper.h"
+#include "ReflectedParamUpdater.h"
+
+namespace android {
+
+struct AMessage;
+struct StandardParams;
+
+/**
+ * Struct managing the codec configuration for CCodec.
+ */
+struct CCodecConfig {
+
+ /**
+ * Domain consists of a bitmask divided into fields, and specifiers work by excluding other
+ * values in those domains.
+ *
+ * Component domains are composed by or-ing the individual IS_ constants, e.g.
+ * IS_DECODER | IS_AUDIO.
+ *
+ * Config specifiers are composed by or-ing the individual mask constants, and
+ * and-ing these groups: e.g. (DECODER | ENCODER) & AUDIO.
+ *
+ * The naming of these constants was to limit the length of mask names as these are used more
+ * commonly as masks.
+ */
+ enum Domain : uint32_t {
+ // component domain (domain & kind)
+ GUARD_BIT = (1 << 1), ///< this is to prevent against accidental && or || usage
+ IS_AUDIO = (1 << 2), ///< for audio codecs
+ IS_VIDEO = (1 << 3), ///< for video codecs
+ IS_IMAGE = (1 << 4), ///< for image codecs
+ OTHER_DOMAIN = (1 << 5), ///< for other domains
+
+ IS_ENCODER = (1 << 6), ///< for encoders
+ IS_DECODER = (1 << 7), ///< for decoders
+ OTHER_KIND = (1 << 8), ///< for other domains
+
+ // config domain
+ IS_PARAM = (1 << 9), ///< for setParameter
+ IS_CONFIG = (1 << 10), ///< for configure
+ IS_READ = (1 << 11), ///< for getFormat
+
+ // port domain
+ IS_INPUT = (1 << 12), ///< for input port (getFormat)
+ IS_OUTPUT = (1 << 13), ///< for output port (getFormat)
+ IS_RAW = (1 << 14), ///< for raw port (input-encoder, output-decoder)
+ IS_CODED = (1 << 15), ///< for coded port (input-decoder, output-encoder)
+
+ ALL = ~0U,
+ NONE = 0,
+
+ AUDIO = ~(IS_IMAGE | IS_VIDEO | OTHER_DOMAIN),
+ VIDEO = ~(IS_AUDIO | IS_IMAGE | OTHER_DOMAIN),
+ IMAGE = ~(IS_AUDIO | IS_VIDEO | OTHER_DOMAIN),
+
+ DECODER = ~(IS_ENCODER | OTHER_KIND),
+ ENCODER = ~(IS_DECODER | OTHER_KIND),
+
+ PARAM = ~(IS_CONFIG | IS_READ),
+ CONFIG = ~(IS_PARAM | IS_READ),
+ READ = ~(IS_CONFIG | IS_PARAM),
+
+ INPUT = ~(IS_OUTPUT | IS_RAW | IS_CODED),
+ OUTPUT = ~(IS_INPUT | IS_RAW | IS_CODED),
+ RAW = ~(IS_INPUT | IS_OUTPUT | IS_CODED),
+ CODED = ~(IS_INPUT | IS_RAW | IS_OUTPUT),
+ };
+
+ // things required to manage formats
+ std::vector<std::shared_ptr<C2ParamDescriptor>> mParamDescs;
+ std::shared_ptr<C2ParamReflector> mReflector;
+
+ std::shared_ptr<ReflectedParamUpdater> mParamUpdater;
+
+ Domain mDomain; // component domain
+ Domain mInputDomain; // input port domain
+ Domain mOutputDomain; // output port domain
+ std::string mCodingMediaType; // media type of the coded stream
+
+ // standard MediaCodec to Codec 2.0 params mapping
+ std::shared_ptr<StandardParams> mStandardParams;
+
+ std::set<C2Param::Index> mSupportedIndices; ///< indices supported by the component
+ std::set<C2Param::Index> mSubscribedIndices; ///< indices to subscribe to
+ size_t mSubscribedIndicesSize; ///< count of currently subscribed indices
+
+ sp<AMessage> mInputFormat;
+ sp<AMessage> mOutputFormat;
+
+ bool mUsingSurface; ///< using input or output surface
+
+ std::shared_ptr<InputSurfaceWrapper> mInputSurface;
+ std::unique_ptr<InputSurfaceWrapper::Config> mISConfig;
+
+ /// the current configuration. Updated after configure() and based on configUpdate in
+ /// onWorkDone
+ std::map<C2Param::Index, std::unique_ptr<C2Param>> mCurrentConfig;
+
+ typedef std::function<c2_status_t(std::unique_ptr<C2Param>&)> LocalParamValidator;
+
+ /// Parameter indices tracked in current config that are not supported by the component.
+ /// these are provided so that optional parameters can remain in the current configuration.
+ /// as such, these parameters have no dependencies. TODO: use C2InterfaceHelper for this.
+ /// For now support a validation function.
+ std::map<C2Param::Index, LocalParamValidator> mLocalParams;
+
+ CCodecConfig();
+
+ /// initializes the members required to manage the format: descriptors, reflector,
+ /// reflected param helper, domain, standard params, and subscribes to standard
+ /// indices.
+ status_t initialize(
+ const std::shared_ptr<Codec2Client> &client,
+ const std::shared_ptr<Codec2Client::Component> &component);
+
+
+ /**
+ * Adds a locally maintained parameter. This is used for output configuration that can be
+ * appended to the output buffers in case it is not supported by the component.
+ */
+ template<typename T>
+ bool addLocalParam(
+ const std::string &name,
+ C2ParamDescriptor::attrib_t attrib = C2ParamDescriptor::IS_READ_ONLY,
+ std::function<c2_status_t(std::unique_ptr<T>&)> validator_ =
+ std::function<c2_status_t(std::unique_ptr<T>&)>()) {
+ C2Param::Index index = T::PARAM_TYPE;
+ if (mSupportedIndices.count(index) || mLocalParams.count(index)) {
+ if (mSupportedIndices.count(index)) {
+ mSubscribedIndices.emplace(index);
+ }
+ ALOGD("ignoring local param %s (%#x) as it is already %s",
+ name.c_str(), (uint32_t)index, mSupportedIndices.count(index) ? "supported" : "local");
+ return false; // already supported by the component or already added
+ }
+
+ // wrap typed validator into untyped validator
+ LocalParamValidator validator;
+ if (validator_) {
+ validator = [validator_](std::unique_ptr<C2Param>& p){
+ c2_status_t res = C2_BAD_VALUE;
+ std::unique_ptr<T> typed(static_cast<T*>(p.release()));
+ // if parameter is correctly typed
+ if (T::From(typed.get())) {
+ res = validator_(typed);
+ p.reset(typed.release());
+ }
+ return res;
+ };
+ }
+
+ mLocalParams.emplace(index, validator);
+ mParamUpdater->addStandardParam<T>(name, attrib);
+ return true;
+ }
+
+ /**
+ * Adds a locally maintained parameter with a default value.
+ */
+ template<typename T>
+ bool addLocalParam(
+ std::unique_ptr<T> default_,
+ const std::string &name,
+ C2ParamDescriptor::attrib_t attrib = C2ParamDescriptor::IS_READ_ONLY,
+ std::function<c2_status_t(std::unique_ptr<T>&)> validator_ =
+ std::function<c2_status_t(std::unique_ptr<T>&)>()) {
+ if (addLocalParam<T>(name, attrib, validator_)) {
+ if (validator_) {
+ c2_status_t err = validator_(default_);
+ if (err != C2_OK) {
+ ALOGD("default value for %s is invalid => %s", name.c_str(), asString(err));
+ return false;
+ }
+ }
+ mCurrentConfig[T::PARAM_TYPE] = std::move(default_);
+ return true;
+ }
+ return false;
+ }
+
+ template<typename T>
+ bool addLocalParam(
+ T *default_, const std::string &name,
+ C2ParamDescriptor::attrib_t attrib = C2ParamDescriptor::IS_READ_ONLY,
+ std::function<c2_status_t(std::unique_ptr<T>&)> validator_ =
+ std::function<c2_status_t(std::unique_ptr<T>&)>()) {
+ return addLocalParam(std::unique_ptr<T>(default_), name, attrib, validator_);
+ }
+
+ /// Applies configuration updates, and updates format in the specific domain.
+ /// Returns true if formats were updated
+ /// \param domain input/output bitmask
+ bool updateConfiguration(
+ std::vector<std::unique_ptr<C2Param>> &configUpdate, Domain domain);
+
+ /// Updates formats in the specific domain. Returns true if any of the formats have changed.
+ /// \param domain input/output bitmask
+ bool updateFormats(Domain domain);
+
+ /**
+ * Applies SDK configurations in a specific configuration domain.
+ * Updates relevant input/output formats and subscribes to parameters specified in the
+ * configuration.
+ * \param domain config/setParam bitmask
+ * \param blocking blocking mode to use with the component
+ */
+ status_t getConfigUpdateFromSdkParams(
+ std::shared_ptr<Codec2Client::Component> component,
+ const sp<AMessage> &sdkParams, Domain domain,
+ c2_blocking_t blocking,
+ std::vector<std::unique_ptr<C2Param>> *configUpdate) const;
+
+ /**
+ * Applies a configuration update to the component.
+ * Updates relevant input/output formats and subscribes to parameters specified in the
+ * configuration.
+ * \param blocking blocking mode to use with the component
+ */
+ status_t setParameters(
+ std::shared_ptr<Codec2Client::Component> component,
+ std::vector<std::unique_ptr<C2Param>> &configUpdate,
+ c2_blocking_t blocking);
+
+ /// Queries subscribed indices (which contains all SDK-exposed values) and updates
+ /// input/output formats.
+ status_t queryConfiguration(
+ const std::shared_ptr<Codec2Client::Component> &component);
+
+ /// Queries a configuration parameter value. Returns nullptr if the parameter is not
+ /// part of the current configuration
+ const C2Param *getConfigParameterValue(C2Param::Index index) const;
+
+ /**
+ * Object that can be used to access configuration parameters and if they change.
+ */
+ template<typename T>
+ struct Watcher {
+ ~Watcher() = default;
+
+ /// returns true if the value of this configuration has changed
+ bool hasChanged() const {
+ const C2Param *value = mParent->getConfigParameterValue(mIndex);
+ if (value && mValue) {
+ return *value != *mValue;
+ } else {
+ return value != mValue.get();
+ }
+ }
+
+ /// updates the current value and returns it
+ std::shared_ptr<const T> update() {
+ const C2Param *value = mParent->getConfigParameterValue(mIndex);
+ if (value) {
+ mValue = std::shared_ptr<const T>(T::From(C2Param::Copy(*value).release()));
+ }
+ return mValue;
+ }
+
+ private:
+ Watcher(C2Param::Index index, const CCodecConfig *parent)
+ : mParent(parent), mIndex(index) {
+ update();
+ }
+
+ friend struct CCodecConfig;
+
+ const CCodecConfig *mParent;
+ std::shared_ptr<const T> mValue;
+ C2Param::Index mIndex;
+ };
+
+ /**
+ * Returns a watcher object for a parameter.
+ */
+ template<typename T>
+ Watcher<T> watch(C2Param::Index index = T::PARAM_TYPE) const {
+ if (index.type() != T::PARAM_TYPE) {
+ __builtin_trap();
+ }
+ return Watcher<T>(index, this);
+ }
+
+private:
+
+ /// initializes the standard MediaCodec to Codec 2.0 params mapping
+ void initializeStandardParams();
+
+ /// Adds indices to the subscribed indices, and updated subscription to component
+ /// \param blocking blocking mode to use with the component
+ status_t subscribeToConfigUpdate(
+ const std::shared_ptr<Codec2Client::Component> &component,
+ const std::vector<C2Param::Index> &indices,
+ c2_blocking_t blocking = C2_DONT_BLOCK);
+
+ /// Gets SDK format from codec 2.0 reflected configuration
+ /// \param domain input/output bitmask
+ sp<AMessage> getSdkFormatForDomain(
+ const ReflectedParamUpdater::Dict &reflected, Domain domain) const;
+
+ /**
+ * Converts a set of configuration parameters in an AMessage to a list of path-based Codec
+ * 2.0 configuration parameters.
+ *
+ * \param domain config/setParam bitmask
+ */
+ ReflectedParamUpdater::Dict getReflectedFormat(
+ const sp<AMessage> &config, Domain domain) const;
+};
+
+DEFINE_ENUM_OPERATORS(CCodecConfig::Domain)
+
+} // namespace android
+
+#endif // C_CODEC_H_
+
diff --git a/media/codec2/sfplugin/Codec2Buffer.cpp b/media/codec2/sfplugin/Codec2Buffer.cpp
new file mode 100644
index 0000000..bf6062e
--- /dev/null
+++ b/media/codec2/sfplugin/Codec2Buffer.cpp
@@ -0,0 +1,810 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2Buffer"
+#include <utils/Log.h>
+
+#include <hidlmemory/FrameworkUtils.h>
+#include <media/hardware/HardwareAPI.h>
+#include <media/stagefright/MediaCodecConstants.h>
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/foundation/AUtils.h>
+#include <nativebase/nativebase.h>
+
+#include <C2AllocatorGralloc.h>
+#include <C2BlockInternal.h>
+#include <C2Debug.h>
+
+#include "Codec2Buffer.h"
+
+namespace android {
+
+// Codec2Buffer
+
+bool Codec2Buffer::canCopyLinear(const std::shared_ptr<C2Buffer> &buffer) const {
+ if (const_cast<Codec2Buffer *>(this)->base() == nullptr) {
+ return false;
+ }
+ if (!buffer) {
+ // Nothing to copy, so we can copy by doing nothing.
+ return true;
+ }
+ if (buffer->data().type() != C2BufferData::LINEAR) {
+ return false;
+ }
+ if (buffer->data().linearBlocks().size() == 0u) {
+ // Nothing to copy, so we can copy by doing nothing.
+ return true;
+ } else if (buffer->data().linearBlocks().size() > 1u) {
+ // We don't know how to copy more than one blocks.
+ return false;
+ }
+ if (buffer->data().linearBlocks()[0].size() > capacity()) {
+ // It won't fit.
+ return false;
+ }
+ return true;
+}
+
+bool Codec2Buffer::copyLinear(const std::shared_ptr<C2Buffer> &buffer) {
+ // We assume that all canCopyLinear() checks passed.
+ if (!buffer || buffer->data().linearBlocks().size() == 0u
+ || buffer->data().linearBlocks()[0].size() == 0u) {
+ setRange(0, 0);
+ return true;
+ }
+ C2ReadView view = buffer->data().linearBlocks()[0].map().get();
+ if (view.error() != C2_OK) {
+ ALOGD("Error while mapping: %d", view.error());
+ return false;
+ }
+ if (view.capacity() > capacity()) {
+ ALOGD("C2ConstLinearBlock lied --- it actually doesn't fit: view(%u) > this(%zu)",
+ view.capacity(), capacity());
+ return false;
+ }
+ memcpy(base(), view.data(), view.capacity());
+ setRange(0, view.capacity());
+ return true;
+}
+
+void Codec2Buffer::setImageData(const sp<ABuffer> &imageData) {
+ meta()->setBuffer("image-data", imageData);
+ format()->setBuffer("image-data", imageData);
+ MediaImage2 *img = (MediaImage2*)imageData->data();
+ if (img->mNumPlanes > 0 && img->mType != img->MEDIA_IMAGE_TYPE_UNKNOWN) {
+ int32_t stride = img->mPlane[0].mRowInc;
+ format()->setInt32(KEY_STRIDE, stride);
+ if (img->mNumPlanes > 1 && stride > 0) {
+ int32_t vstride = (img->mPlane[1].mOffset - img->mPlane[0].mOffset) / stride;
+ format()->setInt32(KEY_SLICE_HEIGHT, vstride);
+ }
+ }
+}
+
+// LocalLinearBuffer
+
+bool LocalLinearBuffer::canCopy(const std::shared_ptr<C2Buffer> &buffer) const {
+ return canCopyLinear(buffer);
+}
+
+bool LocalLinearBuffer::copy(const std::shared_ptr<C2Buffer> &buffer) {
+ return copyLinear(buffer);
+}
+
+// DummyContainerBuffer
+
+DummyContainerBuffer::DummyContainerBuffer(
+ const sp<AMessage> &format, const std::shared_ptr<C2Buffer> &buffer)
+ : Codec2Buffer(format, new ABuffer(nullptr, 1)),
+ mBufferRef(buffer) {
+ setRange(0, buffer ? 1 : 0);
+}
+
+std::shared_ptr<C2Buffer> DummyContainerBuffer::asC2Buffer() {
+ return std::move(mBufferRef);
+}
+
+bool DummyContainerBuffer::canCopy(const std::shared_ptr<C2Buffer> &) const {
+ return !mBufferRef;
+}
+
+bool DummyContainerBuffer::copy(const std::shared_ptr<C2Buffer> &buffer) {
+ mBufferRef = buffer;
+ setRange(0, mBufferRef ? 1 : 0);
+ return true;
+}
+
+// LinearBlockBuffer
+
+// static
+sp<LinearBlockBuffer> LinearBlockBuffer::Allocate(
+ const sp<AMessage> &format, const std::shared_ptr<C2LinearBlock> &block) {
+ C2WriteView writeView(block->map().get());
+ if (writeView.error() != C2_OK) {
+ return nullptr;
+ }
+ return new LinearBlockBuffer(format, std::move(writeView), block);
+}
+
+std::shared_ptr<C2Buffer> LinearBlockBuffer::asC2Buffer() {
+ return C2Buffer::CreateLinearBuffer(mBlock->share(offset(), size(), C2Fence()));
+}
+
+bool LinearBlockBuffer::canCopy(const std::shared_ptr<C2Buffer> &buffer) const {
+ return canCopyLinear(buffer);
+}
+
+bool LinearBlockBuffer::copy(const std::shared_ptr<C2Buffer> &buffer) {
+ return copyLinear(buffer);
+}
+
+LinearBlockBuffer::LinearBlockBuffer(
+ const sp<AMessage> &format,
+ C2WriteView&& writeView,
+ const std::shared_ptr<C2LinearBlock> &block)
+ : Codec2Buffer(format, new ABuffer(writeView.data(), writeView.size())),
+ mWriteView(writeView),
+ mBlock(block) {
+}
+
+// ConstLinearBlockBuffer
+
+// static
+sp<ConstLinearBlockBuffer> ConstLinearBlockBuffer::Allocate(
+ const sp<AMessage> &format, const std::shared_ptr<C2Buffer> &buffer) {
+ if (!buffer
+ || buffer->data().type() != C2BufferData::LINEAR
+ || buffer->data().linearBlocks().size() != 1u) {
+ return nullptr;
+ }
+ C2ReadView readView(buffer->data().linearBlocks()[0].map().get());
+ if (readView.error() != C2_OK) {
+ return nullptr;
+ }
+ return new ConstLinearBlockBuffer(format, std::move(readView), buffer);
+}
+
+ConstLinearBlockBuffer::ConstLinearBlockBuffer(
+ const sp<AMessage> &format,
+ C2ReadView&& readView,
+ const std::shared_ptr<C2Buffer> &buffer)
+ : Codec2Buffer(format, new ABuffer(
+ // NOTE: ABuffer only takes non-const pointer but this data is
+ // supposed to be read-only.
+ const_cast<uint8_t *>(readView.data()), readView.capacity())),
+ mReadView(readView),
+ mBufferRef(buffer) {
+}
+
+std::shared_ptr<C2Buffer> ConstLinearBlockBuffer::asC2Buffer() {
+ return std::move(mBufferRef);
+}
+
+// GraphicView2MediaImageConverter
+
+namespace {
+
+class GraphicView2MediaImageConverter {
+public:
+ /**
+ * Creates a C2GraphicView <=> MediaImage converter
+ *
+ * \param view C2GraphicView object
+ * \param colorFormat desired SDK color format for the MediaImage (if this is a flexible format,
+ * an attempt is made to simply represent the graphic view as a flexible SDK format
+ * without a memcpy)
+ */
+ GraphicView2MediaImageConverter(
+ const C2GraphicView &view, int32_t colorFormat)
+ : mInitCheck(NO_INIT),
+ mView(view),
+ mWidth(view.width()),
+ mHeight(view.height()),
+ mColorFormat(colorFormat),
+ mAllocatedDepth(0),
+ mBackBufferSize(0),
+ mMediaImage(new ABuffer(sizeof(MediaImage2))) {
+ if (view.error() != C2_OK) {
+ ALOGD("Converter: view.error() = %d", view.error());
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ MediaImage2 *mediaImage = (MediaImage2 *)mMediaImage->base();
+ const C2PlanarLayout &layout = view.layout();
+ if (layout.numPlanes == 0) {
+ ALOGD("Converter: 0 planes");
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ mAllocatedDepth = layout.planes[0].allocatedDepth;
+ uint32_t bitDepth = layout.planes[0].bitDepth;
+
+ // align width and height to support subsampling cleanly
+ uint32_t mStride = align(mWidth, 2) * divUp(layout.planes[0].allocatedDepth, 8u);
+ uint32_t mVStride = align(mHeight, 2);
+
+ switch (layout.type) {
+ case C2PlanarLayout::TYPE_YUV:
+ mediaImage->mType = MediaImage2::MEDIA_IMAGE_TYPE_YUV;
+ if (layout.numPlanes != 3) {
+ ALOGD("Converter: %d planes for YUV layout", layout.numPlanes);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ if (layout.planes[0].channel != C2PlaneInfo::CHANNEL_Y
+ || layout.planes[1].channel != C2PlaneInfo::CHANNEL_CB
+ || layout.planes[2].channel != C2PlaneInfo::CHANNEL_CR
+ || layout.planes[0].colSampling != 1
+ || layout.planes[0].rowSampling != 1
+ || layout.planes[1].colSampling != 2
+ || layout.planes[1].rowSampling != 2
+ || layout.planes[2].colSampling != 2
+ || layout.planes[2].rowSampling != 2) {
+ ALOGD("Converter: not YUV420 for YUV layout");
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ switch (mColorFormat) {
+ case COLOR_FormatYUV420Flexible:
+ { // try to map directly. check if the planes are near one another
+ const uint8_t *minPtr = mView.data()[0];
+ const uint8_t *maxPtr = mView.data()[0];
+ int32_t planeSize = 0;
+ for (uint32_t i = 0; i < layout.numPlanes; ++i) {
+ const C2PlaneInfo &plane = layout.planes[i];
+ ssize_t minOffset = plane.minOffset(mWidth, mHeight);
+ ssize_t maxOffset = plane.maxOffset(mWidth, mHeight);
+ if (minPtr > mView.data()[i] + minOffset) {
+ minPtr = mView.data()[i] + minOffset;
+ }
+ if (maxPtr < mView.data()[i] + maxOffset) {
+ maxPtr = mView.data()[i] + maxOffset;
+ }
+ planeSize += std::abs(plane.rowInc) * align(mHeight, 64)
+ / plane.rowSampling / plane.colSampling * divUp(mAllocatedDepth, 8u);
+ }
+
+ if ((maxPtr - minPtr + 1) <= planeSize) {
+ // FIXME: this is risky as reading/writing data out of bound results in
+ // an undefined behavior, but gralloc does assume a contiguous
+ // mapping
+ for (uint32_t i = 0; i < layout.numPlanes; ++i) {
+ const C2PlaneInfo &plane = layout.planes[i];
+ mediaImage->mPlane[i].mOffset = mView.data()[i] - minPtr;
+ mediaImage->mPlane[i].mColInc = plane.colInc;
+ mediaImage->mPlane[i].mRowInc = plane.rowInc;
+ mediaImage->mPlane[i].mHorizSubsampling = plane.colSampling;
+ mediaImage->mPlane[i].mVertSubsampling = plane.rowSampling;
+ }
+ mWrapped = new ABuffer(const_cast<uint8_t *>(minPtr), maxPtr - minPtr + 1);
+ break;
+ }
+ }
+ [[fallthrough]];
+
+ case COLOR_FormatYUV420Planar:
+ case COLOR_FormatYUV420PackedPlanar:
+ mediaImage->mPlane[mediaImage->Y].mOffset = 0;
+ mediaImage->mPlane[mediaImage->Y].mColInc = 1;
+ mediaImage->mPlane[mediaImage->Y].mRowInc = mStride;
+ mediaImage->mPlane[mediaImage->Y].mHorizSubsampling = 1;
+ mediaImage->mPlane[mediaImage->Y].mVertSubsampling = 1;
+
+ mediaImage->mPlane[mediaImage->U].mOffset = mStride * mVStride;
+ mediaImage->mPlane[mediaImage->U].mColInc = 1;
+ mediaImage->mPlane[mediaImage->U].mRowInc = mStride / 2;
+ mediaImage->mPlane[mediaImage->U].mHorizSubsampling = 2;
+ mediaImage->mPlane[mediaImage->U].mVertSubsampling = 2;
+
+ mediaImage->mPlane[mediaImage->V].mOffset = mStride * mVStride * 5 / 4;
+ mediaImage->mPlane[mediaImage->V].mColInc = 1;
+ mediaImage->mPlane[mediaImage->V].mRowInc = mStride / 2;
+ mediaImage->mPlane[mediaImage->V].mHorizSubsampling = 2;
+ mediaImage->mPlane[mediaImage->V].mVertSubsampling = 2;
+ break;
+
+ case COLOR_FormatYUV420SemiPlanar:
+ case COLOR_FormatYUV420PackedSemiPlanar:
+ mediaImage->mPlane[mediaImage->Y].mOffset = 0;
+ mediaImage->mPlane[mediaImage->Y].mColInc = 1;
+ mediaImage->mPlane[mediaImage->Y].mRowInc = mStride;
+ mediaImage->mPlane[mediaImage->Y].mHorizSubsampling = 1;
+ mediaImage->mPlane[mediaImage->Y].mVertSubsampling = 1;
+
+ mediaImage->mPlane[mediaImage->U].mOffset = mStride * mVStride;
+ mediaImage->mPlane[mediaImage->U].mColInc = 2;
+ mediaImage->mPlane[mediaImage->U].mRowInc = mStride;
+ mediaImage->mPlane[mediaImage->U].mHorizSubsampling = 2;
+ mediaImage->mPlane[mediaImage->U].mVertSubsampling = 2;
+
+ mediaImage->mPlane[mediaImage->V].mOffset = mStride * mVStride + 1;
+ mediaImage->mPlane[mediaImage->V].mColInc = 2;
+ mediaImage->mPlane[mediaImage->V].mRowInc = mStride;
+ mediaImage->mPlane[mediaImage->V].mHorizSubsampling = 2;
+ mediaImage->mPlane[mediaImage->V].mVertSubsampling = 2;
+ break;
+
+ default:
+ ALOGD("Converter: incompactible color format (%d) for YUV layout", mColorFormat);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ break;
+ case C2PlanarLayout::TYPE_YUVA:
+ mediaImage->mType = MediaImage2::MEDIA_IMAGE_TYPE_YUVA;
+ // We don't have an SDK YUVA format
+ ALOGD("Converter: incompactible color format (%d) for YUVA layout", mColorFormat);
+ mInitCheck = BAD_VALUE;
+ return;
+ case C2PlanarLayout::TYPE_RGB:
+ mediaImage->mType = MediaImage2::MEDIA_IMAGE_TYPE_RGB;
+ switch (mColorFormat) {
+ // TODO media image
+ case COLOR_FormatRGBFlexible:
+ case COLOR_Format24bitBGR888:
+ case COLOR_Format24bitRGB888:
+ break;
+ default:
+ ALOGD("Converter: incompactible color format (%d) for RGB layout", mColorFormat);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ if (layout.numPlanes != 3) {
+ ALOGD("Converter: %d planes for RGB layout", layout.numPlanes);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ break;
+ case C2PlanarLayout::TYPE_RGBA:
+ mediaImage->mType = MediaImage2::MEDIA_IMAGE_TYPE_RGBA;
+ switch (mColorFormat) {
+ // TODO media image
+ case COLOR_FormatRGBAFlexible:
+ case COLOR_Format32bitABGR8888:
+ case COLOR_Format32bitARGB8888:
+ case COLOR_Format32bitBGRA8888:
+ break;
+ default:
+ ALOGD("Incompactible color format (%d) for RGBA layout", mColorFormat);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ if (layout.numPlanes != 4) {
+ ALOGD("Converter: %d planes for RGBA layout", layout.numPlanes);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ break;
+ default:
+ mediaImage->mType = MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN;
+ ALOGD("Unknown layout");
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ mediaImage->mNumPlanes = layout.numPlanes;
+ mediaImage->mWidth = mWidth;
+ mediaImage->mHeight = mHeight;
+ mediaImage->mBitDepth = bitDepth;
+ mediaImage->mBitDepthAllocated = mAllocatedDepth;
+
+ uint32_t bufferSize = 0;
+ for (uint32_t i = 0; i < layout.numPlanes; ++i) {
+ const C2PlaneInfo &plane = layout.planes[i];
+ if (plane.allocatedDepth < plane.bitDepth
+ || plane.rightShift != plane.allocatedDepth - plane.bitDepth) {
+ ALOGD("rightShift value of %u unsupported", plane.rightShift);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ if (plane.allocatedDepth > 8 && plane.endianness != C2PlaneInfo::NATIVE) {
+ ALOGD("endianness value of %u unsupported", plane.endianness);
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ if (plane.allocatedDepth != mAllocatedDepth || plane.bitDepth != bitDepth) {
+ ALOGV("different allocatedDepth/bitDepth per plane unsupported");
+ mInitCheck = BAD_VALUE;
+ return;
+ }
+ bufferSize += mStride * mVStride
+ / plane.rowSampling / plane.colSampling;
+ }
+
+ mBackBufferSize = bufferSize;
+ mInitCheck = OK;
+ }
+
+ status_t initCheck() const { return mInitCheck; }
+
+ uint32_t backBufferSize() const { return mBackBufferSize; }
+
+ /**
+ * Wrap C2GraphicView using a MediaImage2. Note that if not wrapped, the content is not mapped
+ * in this function --- the caller should use CopyGraphicView2MediaImage() function to copy the
+ * data into a backing buffer explicitly.
+ *
+ * \return media buffer. This is null if wrapping failed.
+ */
+ sp<ABuffer> wrap() const {
+ if (mBackBuffer == nullptr) {
+ return mWrapped;
+ }
+ return nullptr;
+ }
+
+ bool setBackBuffer(const sp<ABuffer> &backBuffer) {
+ if (backBuffer->capacity() < mBackBufferSize) {
+ return false;
+ }
+ backBuffer->setRange(0, mBackBufferSize);
+ mBackBuffer = backBuffer;
+ return true;
+ }
+
+ /**
+ * Copy C2GraphicView to MediaImage2.
+ */
+ status_t copyToMediaImage() {
+ if (mInitCheck != OK) {
+ return mInitCheck;
+ }
+ return ImageCopy(mBackBuffer->base(), getMediaImage(), mView);
+ }
+
+ const sp<ABuffer> &imageData() const { return mMediaImage; }
+
+private:
+ status_t mInitCheck;
+
+ const C2GraphicView mView;
+ uint32_t mWidth;
+ uint32_t mHeight;
+ int32_t mColorFormat; ///< SDK color format for MediaImage
+ sp<ABuffer> mWrapped; ///< wrapped buffer (if we can map C2Buffer to an ABuffer)
+ uint32_t mAllocatedDepth;
+ uint32_t mBackBufferSize;
+ sp<ABuffer> mMediaImage;
+ std::function<sp<ABuffer>(size_t)> mAlloc;
+
+ sp<ABuffer> mBackBuffer; ///< backing buffer if we have to copy C2Buffer <=> ABuffer
+
+ MediaImage2 *getMediaImage() {
+ return (MediaImage2 *)mMediaImage->base();
+ }
+};
+
+} // namespace
+
+// GraphicBlockBuffer
+
+// static
+sp<GraphicBlockBuffer> GraphicBlockBuffer::Allocate(
+ const sp<AMessage> &format,
+ const std::shared_ptr<C2GraphicBlock> &block,
+ std::function<sp<ABuffer>(size_t)> alloc) {
+ C2GraphicView view(block->map().get());
+ if (view.error() != C2_OK) {
+ ALOGD("C2GraphicBlock::map failed: %d", view.error());
+ return nullptr;
+ }
+
+ int32_t colorFormat = COLOR_FormatYUV420Flexible;
+ (void)format->findInt32("color-format", &colorFormat);
+
+ GraphicView2MediaImageConverter converter(view, colorFormat);
+ if (converter.initCheck() != OK) {
+ ALOGD("Converter init failed: %d", converter.initCheck());
+ return nullptr;
+ }
+ bool wrapped = true;
+ sp<ABuffer> buffer = converter.wrap();
+ if (buffer == nullptr) {
+ buffer = alloc(converter.backBufferSize());
+ if (!converter.setBackBuffer(buffer)) {
+ ALOGD("Converter failed to set back buffer");
+ return nullptr;
+ }
+ wrapped = false;
+ }
+ return new GraphicBlockBuffer(
+ format,
+ buffer,
+ std::move(view),
+ block,
+ converter.imageData(),
+ wrapped);
+}
+
+GraphicBlockBuffer::GraphicBlockBuffer(
+ const sp<AMessage> &format,
+ const sp<ABuffer> &buffer,
+ C2GraphicView &&view,
+ const std::shared_ptr<C2GraphicBlock> &block,
+ const sp<ABuffer> &imageData,
+ bool wrapped)
+ : Codec2Buffer(format, buffer),
+ mView(view),
+ mBlock(block),
+ mImageData(imageData),
+ mWrapped(wrapped) {
+ setImageData(imageData);
+}
+
+std::shared_ptr<C2Buffer> GraphicBlockBuffer::asC2Buffer() {
+ uint32_t width = mView.width();
+ uint32_t height = mView.height();
+ if (!mWrapped) {
+ (void)ImageCopy(mView, base(), imageData());
+ }
+ return C2Buffer::CreateGraphicBuffer(
+ mBlock->share(C2Rect(width, height), C2Fence()));
+}
+
+// GraphicMetadataBuffer
+GraphicMetadataBuffer::GraphicMetadataBuffer(
+ const sp<AMessage> &format,
+ const std::shared_ptr<C2Allocator> &alloc)
+ : Codec2Buffer(format, new ABuffer(sizeof(VideoNativeMetadata))),
+ mAlloc(alloc) {
+ ((VideoNativeMetadata *)base())->pBuffer = nullptr;
+}
+
+std::shared_ptr<C2Buffer> GraphicMetadataBuffer::asC2Buffer() {
+#ifndef __LP64__
+ VideoNativeMetadata *meta = (VideoNativeMetadata *)base();
+ ANativeWindowBuffer *buffer = (ANativeWindowBuffer *)meta->pBuffer;
+ if (buffer == nullptr) {
+ ALOGD("VideoNativeMetadata contains null buffer");
+ return nullptr;
+ }
+
+ ALOGV("VideoNativeMetadata: %dx%d", buffer->width, buffer->height);
+ C2Handle *handle = WrapNativeCodec2GrallocHandle(
+ native_handle_clone(buffer->handle),
+ buffer->width,
+ buffer->height,
+ buffer->format,
+ buffer->usage,
+ buffer->stride);
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ c2_status_t err = mAlloc->priorGraphicAllocation(handle, &alloc);
+ if (err != C2_OK) {
+ ALOGD("Failed to wrap VideoNativeMetadata into C2GraphicAllocation");
+ return nullptr;
+ }
+ std::shared_ptr<C2GraphicBlock> block = _C2BlockFactory::CreateGraphicBlock(alloc);
+
+ meta->pBuffer = 0;
+ // TODO: fence
+ return C2Buffer::CreateGraphicBuffer(
+ block->share(C2Rect(buffer->width, buffer->height), C2Fence()));
+#else
+ ALOGE("GraphicMetadataBuffer does not work on 64-bit arch");
+ return nullptr;
+#endif
+}
+
+// ConstGraphicBlockBuffer
+
+// static
+sp<ConstGraphicBlockBuffer> ConstGraphicBlockBuffer::Allocate(
+ const sp<AMessage> &format,
+ const std::shared_ptr<C2Buffer> &buffer,
+ std::function<sp<ABuffer>(size_t)> alloc) {
+ if (!buffer
+ || buffer->data().type() != C2BufferData::GRAPHIC
+ || buffer->data().graphicBlocks().size() != 1u) {
+ ALOGD("C2Buffer precond fail");
+ return nullptr;
+ }
+ std::unique_ptr<const C2GraphicView> view(std::make_unique<const C2GraphicView>(
+ buffer->data().graphicBlocks()[0].map().get()));
+ std::unique_ptr<const C2GraphicView> holder;
+
+ int32_t colorFormat = COLOR_FormatYUV420Flexible;
+ (void)format->findInt32("color-format", &colorFormat);
+
+ GraphicView2MediaImageConverter converter(*view, colorFormat);
+ if (converter.initCheck() != OK) {
+ ALOGD("Converter init failed: %d", converter.initCheck());
+ return nullptr;
+ }
+ bool wrapped = true;
+ sp<ABuffer> aBuffer = converter.wrap();
+ if (aBuffer == nullptr) {
+ aBuffer = alloc(converter.backBufferSize());
+ if (!converter.setBackBuffer(aBuffer)) {
+ ALOGD("Converter failed to set back buffer");
+ return nullptr;
+ }
+ wrapped = false;
+ converter.copyToMediaImage();
+ // We don't need the view.
+ holder = std::move(view);
+ }
+ return new ConstGraphicBlockBuffer(
+ format,
+ aBuffer,
+ std::move(view),
+ buffer,
+ converter.imageData(),
+ wrapped);
+}
+
+// static
+sp<ConstGraphicBlockBuffer> ConstGraphicBlockBuffer::AllocateEmpty(
+ const sp<AMessage> &format,
+ std::function<sp<ABuffer>(size_t)> alloc) {
+ int32_t width, height;
+ if (!format->findInt32("width", &width)
+ || !format->findInt32("height", &height)) {
+ ALOGD("format had no width / height");
+ return nullptr;
+ }
+ sp<ABuffer> aBuffer(alloc(width * height * 4));
+ return new ConstGraphicBlockBuffer(
+ format,
+ aBuffer,
+ nullptr,
+ nullptr,
+ nullptr,
+ false);
+}
+
+ConstGraphicBlockBuffer::ConstGraphicBlockBuffer(
+ const sp<AMessage> &format,
+ const sp<ABuffer> &aBuffer,
+ std::unique_ptr<const C2GraphicView> &&view,
+ const std::shared_ptr<C2Buffer> &buffer,
+ const sp<ABuffer> &imageData,
+ bool wrapped)
+ : Codec2Buffer(format, aBuffer),
+ mView(std::move(view)),
+ mBufferRef(buffer),
+ mWrapped(wrapped) {
+ if (imageData != nullptr) {
+ setImageData(imageData);
+ }
+}
+
+std::shared_ptr<C2Buffer> ConstGraphicBlockBuffer::asC2Buffer() {
+ mView.reset();
+ return std::move(mBufferRef);
+}
+
+bool ConstGraphicBlockBuffer::canCopy(const std::shared_ptr<C2Buffer> &buffer) const {
+ if (mWrapped || mBufferRef) {
+ ALOGD("ConstGraphicBlockBuffer::canCopy: %swrapped ; buffer ref %s",
+ mWrapped ? "" : "not ", mBufferRef ? "exists" : "doesn't exist");
+ return false;
+ }
+ if (!buffer) {
+ // Nothing to copy, so we can copy by doing nothing.
+ return true;
+ }
+ if (buffer->data().type() != C2BufferData::GRAPHIC) {
+ ALOGD("ConstGraphicBlockBuffer::canCopy: buffer precondition unsatisfied");
+ return false;
+ }
+ if (buffer->data().graphicBlocks().size() == 0) {
+ return true;
+ } else if (buffer->data().graphicBlocks().size() != 1u) {
+ ALOGD("ConstGraphicBlockBuffer::canCopy: too many blocks");
+ return false;
+ }
+
+ int32_t colorFormat = COLOR_FormatYUV420Flexible;
+ // FIXME: format() is not const, but we cannot change it, so do a const cast here
+ const_cast<ConstGraphicBlockBuffer *>(this)->format()->findInt32("color-format", &colorFormat);
+
+ GraphicView2MediaImageConverter converter(
+ buffer->data().graphicBlocks()[0].map().get(), colorFormat);
+ if (converter.initCheck() != OK) {
+ ALOGD("ConstGraphicBlockBuffer::canCopy: converter init failed: %d", converter.initCheck());
+ return false;
+ }
+ if (converter.backBufferSize() > capacity()) {
+ ALOGD("ConstGraphicBlockBuffer::canCopy: insufficient capacity: req %u has %zu",
+ converter.backBufferSize(), capacity());
+ return false;
+ }
+ return true;
+}
+
+bool ConstGraphicBlockBuffer::copy(const std::shared_ptr<C2Buffer> &buffer) {
+ if (!buffer || buffer->data().graphicBlocks().size() == 0) {
+ setRange(0, 0);
+ return true;
+ }
+ int32_t colorFormat = COLOR_FormatYUV420Flexible;
+ format()->findInt32("color-format", &colorFormat);
+
+ GraphicView2MediaImageConverter converter(
+ buffer->data().graphicBlocks()[0].map().get(), colorFormat);
+ if (converter.initCheck() != OK) {
+ ALOGD("ConstGraphicBlockBuffer::copy: converter init failed: %d", converter.initCheck());
+ return false;
+ }
+ sp<ABuffer> aBuffer = new ABuffer(base(), capacity());
+ if (!converter.setBackBuffer(aBuffer)) {
+ ALOGD("ConstGraphicBlockBuffer::copy: set back buffer failed");
+ return false;
+ }
+ converter.copyToMediaImage();
+ setImageData(converter.imageData());
+ mBufferRef = buffer;
+ return true;
+}
+
+// EncryptedLinearBlockBuffer
+
+EncryptedLinearBlockBuffer::EncryptedLinearBlockBuffer(
+ const sp<AMessage> &format,
+ const std::shared_ptr<C2LinearBlock> &block,
+ const sp<IMemory> &memory,
+ int32_t heapSeqNum)
+ : Codec2Buffer(format, new ABuffer(memory->pointer(), memory->size())),
+ mBlock(block),
+ mMemory(memory),
+ mHeapSeqNum(heapSeqNum) {
+}
+
+std::shared_ptr<C2Buffer> EncryptedLinearBlockBuffer::asC2Buffer() {
+ return C2Buffer::CreateLinearBuffer(mBlock->share(offset(), size(), C2Fence()));
+}
+
+void EncryptedLinearBlockBuffer::fillSourceBuffer(
+ ICrypto::SourceBuffer *source) {
+ source->mSharedMemory = mMemory;
+ source->mHeapSeqNum = mHeapSeqNum;
+}
+
+void EncryptedLinearBlockBuffer::fillSourceBuffer(
+ hardware::cas::native::V1_0::SharedBuffer *source) {
+ ssize_t offset;
+ size_t size;
+
+ mHidlMemory = hardware::fromHeap(mMemory->getMemory(&offset, &size));
+ source->heapBase = *mHidlMemory;
+ source->offset = offset;
+ source->size = size;
+}
+
+bool EncryptedLinearBlockBuffer::copyDecryptedContent(
+ const sp<IMemory> &decrypted, size_t length) {
+ C2WriteView view = mBlock->map().get();
+ if (view.error() != C2_OK) {
+ return false;
+ }
+ if (view.size() < length) {
+ return false;
+ }
+ memcpy(view.data(), decrypted->pointer(), length);
+ return true;
+}
+
+bool EncryptedLinearBlockBuffer::copyDecryptedContentFromMemory(size_t length) {
+ return copyDecryptedContent(mMemory, length);
+}
+
+native_handle_t *EncryptedLinearBlockBuffer::handle() const {
+ return const_cast<native_handle_t *>(mBlock->handle());
+}
+
+} // namespace android
diff --git a/media/codec2/sfplugin/Codec2Buffer.h b/media/codec2/sfplugin/Codec2Buffer.h
new file mode 100644
index 0000000..481975f
--- /dev/null
+++ b/media/codec2/sfplugin/Codec2Buffer.h
@@ -0,0 +1,403 @@
+/*
+ * Copyright 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_BUFFER_H_
+
+#define CODEC2_BUFFER_H_
+
+#include <C2Buffer.h>
+
+#include <android/hardware/cas/native/1.0/types.h>
+#include <binder/IMemory.h>
+#include <media/hardware/VideoAPI.h>
+#include <media/MediaCodecBuffer.h>
+#include <media/ICrypto.h>
+
+namespace android {
+
+/**
+ * Copies a graphic view into a media image.
+ *
+ * \param imgBase base of MediaImage
+ * \param img MediaImage data
+ * \param view graphic view
+ *
+ * \return OK on success
+ */
+status_t ImageCopy(uint8_t *imgBase, const MediaImage2 *img, const C2GraphicView &view);
+
+/**
+ * Copies a media image into a graphic view.
+ *
+ * \param view graphic view
+ * \param imgBase base of MediaImage
+ * \param img MediaImage data
+ *
+ * \return OK on success
+ */
+status_t ImageCopy(C2GraphicView &view, const uint8_t *imgBase, const MediaImage2 *img);
+
+class Codec2Buffer : public MediaCodecBuffer {
+public:
+ using MediaCodecBuffer::MediaCodecBuffer;
+ ~Codec2Buffer() override = default;
+
+ /**
+ * \return C2Buffer object represents this buffer.
+ */
+ virtual std::shared_ptr<C2Buffer> asC2Buffer() = 0;
+
+ /**
+ * Test if we can copy the content of |buffer| into this object.
+ *
+ * \param buffer C2Buffer object to copy.
+ * \return true if the content of buffer can be copied over to this buffer
+ * false otherwise.
+ */
+ virtual bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const {
+ (void)buffer;
+ return false;
+ }
+
+ /**
+ * Copy the content of |buffer| into this object. This method assumes that
+ * canCopy() check already passed.
+ *
+ * \param buffer C2Buffer object to copy.
+ * \return true if successful
+ * false otherwise.
+ */
+ virtual bool copy(const std::shared_ptr<C2Buffer> &buffer) {
+ (void)buffer;
+ return false;
+ }
+
+protected:
+ /**
+ * canCopy() implementation for linear buffers.
+ */
+ bool canCopyLinear(const std::shared_ptr<C2Buffer> &buffer) const;
+
+ /**
+ * copy() implementation for linear buffers.
+ */
+ bool copyLinear(const std::shared_ptr<C2Buffer> &buffer);
+
+ /**
+ * sets MediaImage data for flexible graphic buffers
+ */
+ void setImageData(const sp<ABuffer> &imageData);
+};
+
+/**
+ * MediaCodecBuffer implementation on top of local linear buffer. This cannot
+ * cross process boundary so asC2Buffer() returns only nullptr.
+ */
+class LocalLinearBuffer : public Codec2Buffer {
+public:
+ using Codec2Buffer::Codec2Buffer;
+
+ std::shared_ptr<C2Buffer> asC2Buffer() override { return nullptr; }
+ bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override;
+ bool copy(const std::shared_ptr<C2Buffer> &buffer) override;
+};
+
+/**
+ * MediaCodecBuffer implementation to be used only as a dummy wrapper around a
+ * C2Buffer object.
+ */
+class DummyContainerBuffer : public Codec2Buffer {
+public:
+ DummyContainerBuffer(
+ const sp<AMessage> &format,
+ const std::shared_ptr<C2Buffer> &buffer = nullptr);
+
+ std::shared_ptr<C2Buffer> asC2Buffer() override;
+ bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override;
+ bool copy(const std::shared_ptr<C2Buffer> &buffer) override;
+
+private:
+ std::shared_ptr<C2Buffer> mBufferRef;
+};
+
+/**
+ * MediaCodecBuffer implementation wraps around C2LinearBlock.
+ */
+class LinearBlockBuffer : public Codec2Buffer {
+public:
+ /**
+ * Allocate a new LinearBufferBlock wrapping around C2LinearBlock object.
+ *
+ * \param format mandatory buffer format for MediaCodecBuffer
+ * \param block C2LinearBlock object to wrap around.
+ * \return LinearBlockBuffer object with writable mapping.
+ * nullptr if unsuccessful.
+ */
+ static sp<LinearBlockBuffer> Allocate(
+ const sp<AMessage> &format, const std::shared_ptr<C2LinearBlock> &block);
+
+ virtual ~LinearBlockBuffer() = default;
+
+ std::shared_ptr<C2Buffer> asC2Buffer() override;
+ bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override;
+ bool copy(const std::shared_ptr<C2Buffer> &buffer) override;
+
+private:
+ LinearBlockBuffer(
+ const sp<AMessage> &format,
+ C2WriteView &&writeView,
+ const std::shared_ptr<C2LinearBlock> &block);
+ LinearBlockBuffer() = delete;
+
+ C2WriteView mWriteView;
+ std::shared_ptr<C2LinearBlock> mBlock;
+};
+
+/**
+ * MediaCodecBuffer implementation wraps around C2ConstLinearBlock.
+ */
+class ConstLinearBlockBuffer : public Codec2Buffer {
+public:
+ /**
+ * Allocate a new ConstLinearBlockBuffer wrapping around C2Buffer object.
+ *
+ * \param format mandatory buffer format for MediaCodecBuffer
+ * \param buffer linear C2Buffer object to wrap around.
+ * \return ConstLinearBlockBuffer object with readable mapping.
+ * nullptr if unsuccessful.
+ */
+ static sp<ConstLinearBlockBuffer> Allocate(
+ const sp<AMessage> &format, const std::shared_ptr<C2Buffer> &buffer);
+
+ virtual ~ConstLinearBlockBuffer() = default;
+
+ std::shared_ptr<C2Buffer> asC2Buffer() override;
+
+private:
+ ConstLinearBlockBuffer(
+ const sp<AMessage> &format,
+ C2ReadView &&readView,
+ const std::shared_ptr<C2Buffer> &buffer);
+ ConstLinearBlockBuffer() = delete;
+
+ C2ReadView mReadView;
+ std::shared_ptr<C2Buffer> mBufferRef;
+};
+
+/**
+ * MediaCodecBuffer implementation wraps around C2GraphicBlock.
+ *
+ * This object exposes the underlying bits via accessor APIs and "image-data"
+ * metadata, created automatically at allocation time.
+ */
+class GraphicBlockBuffer : public Codec2Buffer {
+public:
+ /**
+ * Allocate a new GraphicBlockBuffer wrapping around C2GraphicBlock object.
+ * If |block| is not in good color formats, it allocates YV12 local buffer
+ * and copies the content over at asC2Buffer().
+ *
+ * \param format mandatory buffer format for MediaCodecBuffer
+ * \param block C2GraphicBlock object to wrap around.
+ * \param alloc a function to allocate backing ABuffer if needed.
+ * \return GraphicBlockBuffer object with writable mapping.
+ * nullptr if unsuccessful.
+ */
+ static sp<GraphicBlockBuffer> Allocate(
+ const sp<AMessage> &format,
+ const std::shared_ptr<C2GraphicBlock> &block,
+ std::function<sp<ABuffer>(size_t)> alloc);
+
+ std::shared_ptr<C2Buffer> asC2Buffer() override;
+
+ virtual ~GraphicBlockBuffer() = default;
+
+private:
+ GraphicBlockBuffer(
+ const sp<AMessage> &format,
+ const sp<ABuffer> &buffer,
+ C2GraphicView &&view,
+ const std::shared_ptr<C2GraphicBlock> &block,
+ const sp<ABuffer> &imageData,
+ bool wrapped);
+ GraphicBlockBuffer() = delete;
+
+ inline MediaImage2 *imageData() { return (MediaImage2 *)mImageData->data(); }
+
+ C2GraphicView mView;
+ std::shared_ptr<C2GraphicBlock> mBlock;
+ sp<ABuffer> mImageData;
+ const bool mWrapped;
+};
+
+/**
+ * MediaCodecBuffer implementation wraps around VideoNativeMetadata.
+ */
+class GraphicMetadataBuffer : public Codec2Buffer {
+public:
+ /**
+ * Construct a new GraphicMetadataBuffer with local linear buffer for
+ * VideoNativeMetadata.
+ *
+ * \param format mandatory buffer format for MediaCodecBuffer
+ */
+ GraphicMetadataBuffer(
+ const sp<AMessage> &format, const std::shared_ptr<C2Allocator> &alloc);
+
+ std::shared_ptr<C2Buffer> asC2Buffer() override;
+
+ virtual ~GraphicMetadataBuffer() = default;
+
+private:
+ GraphicMetadataBuffer() = delete;
+
+ std::shared_ptr<C2Allocator> mAlloc;
+};
+
+/**
+ * MediaCodecBuffer implementation wraps around graphic C2Buffer object.
+ *
+ * This object exposes the underlying bits via accessor APIs and "image-data"
+ * metadata, created automatically at allocation time.
+ */
+class ConstGraphicBlockBuffer : public Codec2Buffer {
+public:
+ /**
+ * Allocate a new ConstGraphicBlockBuffer wrapping around C2Buffer object.
+ * If |buffer| is not in good color formats, it allocates YV12 local buffer
+ * and copies the content of |buffer| over to expose.
+ *
+ * \param format mandatory buffer format for MediaCodecBuffer
+ * \param buffer graphic C2Buffer object to wrap around.
+ * \param alloc a function to allocate backing ABuffer if needed.
+ * \return ConstGraphicBlockBuffer object with readable mapping.
+ * nullptr if unsuccessful.
+ */
+ static sp<ConstGraphicBlockBuffer> Allocate(
+ const sp<AMessage> &format,
+ const std::shared_ptr<C2Buffer> &buffer,
+ std::function<sp<ABuffer>(size_t)> alloc);
+
+ /**
+ * Allocate a new ConstGraphicBlockBuffer which allocates YV12 local buffer
+ * and copies the content of |buffer| over to expose.
+ *
+ * \param format mandatory buffer format for MediaCodecBuffer
+ * \param alloc a function to allocate backing ABuffer if needed.
+ * \return ConstGraphicBlockBuffer object with no wrapping buffer.
+ */
+ static sp<ConstGraphicBlockBuffer> AllocateEmpty(
+ const sp<AMessage> &format,
+ std::function<sp<ABuffer>(size_t)> alloc);
+
+ std::shared_ptr<C2Buffer> asC2Buffer() override;
+ bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override;
+ bool copy(const std::shared_ptr<C2Buffer> &buffer) override;
+
+ virtual ~ConstGraphicBlockBuffer() = default;
+
+private:
+ ConstGraphicBlockBuffer(
+ const sp<AMessage> &format,
+ const sp<ABuffer> &aBuffer,
+ std::unique_ptr<const C2GraphicView> &&view,
+ const std::shared_ptr<C2Buffer> &buffer,
+ const sp<ABuffer> &imageData,
+ bool wrapped);
+ ConstGraphicBlockBuffer() = delete;
+
+ sp<ABuffer> mImageData;
+ std::unique_ptr<const C2GraphicView> mView;
+ std::shared_ptr<C2Buffer> mBufferRef;
+ const bool mWrapped;
+};
+
+/**
+ * MediaCodecBuffer implementation wraps around C2LinearBlock for component
+ * and IMemory for client. Underlying C2LinearBlock won't be mapped for secure
+ * usecases..
+ */
+class EncryptedLinearBlockBuffer : public Codec2Buffer {
+public:
+ /**
+ * Construct a new EncryptedLinearBufferBlock wrapping around C2LinearBlock
+ * object and writable IMemory region.
+ *
+ * \param format mandatory buffer format for MediaCodecBuffer
+ * \param block C2LinearBlock object to wrap around.
+ * \param memory IMemory object to store encrypted content.
+ * \param heapSeqNum Heap sequence number from ICrypto; -1 if N/A
+ */
+ EncryptedLinearBlockBuffer(
+ const sp<AMessage> &format,
+ const std::shared_ptr<C2LinearBlock> &block,
+ const sp<IMemory> &memory,
+ int32_t heapSeqNum = -1);
+ EncryptedLinearBlockBuffer() = delete;
+
+ virtual ~EncryptedLinearBlockBuffer() = default;
+
+ std::shared_ptr<C2Buffer> asC2Buffer() override;
+
+ /**
+ * Fill the source buffer structure with appropriate value based on
+ * internal IMemory object.
+ *
+ * \param source source buffer structure to fill.
+ */
+ void fillSourceBuffer(ICrypto::SourceBuffer *source);
+ void fillSourceBuffer(
+ hardware::cas::native::V1_0::SharedBuffer *source);
+
+ /**
+ * Copy the content of |decrypted| into C2LinearBlock inside. This shall
+ * only be called in non-secure usecases.
+ *
+ * \param decrypted decrypted content to copy from.
+ * \param length length of the content
+ * \return true if successful
+ * false otherwise.
+ */
+ bool copyDecryptedContent(const sp<IMemory> &decrypted, size_t length);
+
+ /**
+ * Copy the content of internal IMemory object into C2LinearBlock inside.
+ * This shall only be called in non-secure usecases.
+ *
+ * \param length length of the content
+ * \return true if successful
+ * false otherwise.
+ */
+ bool copyDecryptedContentFromMemory(size_t length);
+
+ /**
+ * Return native handle of secure buffer understood by ICrypto.
+ *
+ * \return secure buffer handle
+ */
+ native_handle_t *handle() const;
+
+private:
+
+ std::shared_ptr<C2LinearBlock> mBlock;
+ sp<IMemory> mMemory;
+ sp<hardware::HidlMemory> mHidlMemory;
+ int32_t mHeapSeqNum;
+};
+
+} // namespace android
+
+#endif // CODEC2_BUFFER_H_
diff --git a/media/codec2/sfplugin/Codec2InfoBuilder.cpp b/media/codec2/sfplugin/Codec2InfoBuilder.cpp
new file mode 100644
index 0000000..f36027e
--- /dev/null
+++ b/media/codec2/sfplugin/Codec2InfoBuilder.cpp
@@ -0,0 +1,590 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2InfoBuilder"
+#include <log/log.h>
+
+#include <strings.h>
+
+#include <C2Component.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2PlatformSupport.h>
+#include <Codec2Mapper.h>
+
+#include <OMX_Audio.h>
+#include <OMX_AudioExt.h>
+#include <OMX_IndexExt.h>
+#include <OMX_Types.h>
+#include <OMX_Video.h>
+#include <OMX_VideoExt.h>
+#include <OMX_AsString.h>
+
+#include <android/hardware/media/omx/1.0/IOmx.h>
+#include <android/hardware/media/omx/1.0/IOmxObserver.h>
+#include <android/hardware/media/omx/1.0/IOmxNode.h>
+#include <android/hardware/media/omx/1.0/types.h>
+
+#include <android-base/properties.h>
+#include <codec2/hidl/client.h>
+#include <cutils/native_handle.h>
+#include <media/omx/1.0/WOmxNode.h>
+#include <media/stagefright/MediaCodecConstants.h>
+#include <media/stagefright/foundation/MediaDefs.h>
+#include <media/stagefright/omx/OMXUtils.h>
+#include <media/stagefright/xmlparser/MediaCodecsXmlParser.h>
+
+#include "Codec2InfoBuilder.h"
+
+namespace android {
+
+using Traits = C2Component::Traits;
+
+namespace /* unnamed */ {
+
+bool hasPrefix(const std::string& s, const char* prefix) {
+ size_t prefixLen = strlen(prefix);
+ return s.compare(0, prefixLen, prefix) == 0;
+}
+
+bool hasSuffix(const std::string& s, const char* suffix) {
+ size_t suffixLen = strlen(suffix);
+ return suffixLen > s.size() ? false :
+ s.compare(s.size() - suffixLen, suffixLen, suffix) == 0;
+}
+
+// Constants from ACodec
+constexpr OMX_U32 kPortIndexInput = 0;
+constexpr OMX_U32 kPortIndexOutput = 1;
+constexpr OMX_U32 kMaxIndicesToCheck = 32;
+
+status_t queryOmxCapabilities(
+ const char* name, const char* mime, bool isEncoder,
+ MediaCodecInfo::CapabilitiesWriter* caps) {
+
+ const char *role = GetComponentRole(isEncoder, mime);
+ if (role == nullptr) {
+ return BAD_VALUE;
+ }
+
+ using namespace ::android::hardware::media::omx::V1_0;
+ using ::android::hardware::Return;
+ using ::android::hardware::Void;
+ using ::android::hardware::hidl_vec;
+ using ::android::hardware::media::omx::V1_0::utils::LWOmxNode;
+
+ sp<IOmx> omx = IOmx::getService();
+ if (!omx) {
+ ALOGW("Could not obtain IOmx service.");
+ return NO_INIT;
+ }
+
+ struct Observer : IOmxObserver {
+ virtual Return<void> onMessages(const hidl_vec<Message>&) override {
+ return Void();
+ }
+ };
+
+ sp<Observer> observer = new Observer();
+ Status status;
+ sp<IOmxNode> tOmxNode;
+ Return<void> transStatus = omx->allocateNode(
+ name, observer,
+ [&status, &tOmxNode](Status s, const sp<IOmxNode>& n) {
+ status = s;
+ tOmxNode = n;
+ });
+ if (!transStatus.isOk()) {
+ ALOGW("IOmx::allocateNode -- transaction failed.");
+ return NO_INIT;
+ }
+ if (status != Status::OK) {
+ ALOGW("IOmx::allocateNode -- error returned: %d.",
+ static_cast<int>(status));
+ return NO_INIT;
+ }
+
+ sp<LWOmxNode> omxNode = new LWOmxNode(tOmxNode);
+
+ status_t err = SetComponentRole(omxNode, role);
+ if (err != OK) {
+ omxNode->freeNode();
+ ALOGW("Failed to SetComponentRole: component = %s, role = %s.",
+ name, role);
+ return err;
+ }
+
+ bool isVideo = hasPrefix(mime, "video/") == 0;
+ bool isImage = hasPrefix(mime, "image/") == 0;
+
+ if (isVideo || isImage) {
+ OMX_VIDEO_PARAM_PROFILELEVELTYPE param;
+ InitOMXParams(¶m);
+ param.nPortIndex = isEncoder ? kPortIndexOutput : kPortIndexInput;
+
+ for (OMX_U32 index = 0; index <= kMaxIndicesToCheck; ++index) {
+ param.nProfileIndex = index;
+ status_t err = omxNode->getParameter(
+ OMX_IndexParamVideoProfileLevelQuerySupported,
+ ¶m, sizeof(param));
+ if (err != OK) {
+ break;
+ }
+ caps->addProfileLevel(param.eProfile, param.eLevel);
+
+ // AVC components may not list the constrained profiles explicitly, but
+ // decoders that support a profile also support its constrained version.
+ // Encoders must explicitly support constrained profiles.
+ if (!isEncoder && strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC) == 0) {
+ if (param.eProfile == OMX_VIDEO_AVCProfileHigh) {
+ caps->addProfileLevel(OMX_VIDEO_AVCProfileConstrainedHigh, param.eLevel);
+ } else if (param.eProfile == OMX_VIDEO_AVCProfileBaseline) {
+ caps->addProfileLevel(OMX_VIDEO_AVCProfileConstrainedBaseline, param.eLevel);
+ }
+ }
+
+ if (index == kMaxIndicesToCheck) {
+ ALOGW("[%s] stopping checking profiles after %u: %x/%x",
+ name, index,
+ param.eProfile, param.eLevel);
+ }
+ }
+
+ // Color format query
+ // return colors in the order reported by the OMX component
+ // prefix "flexible" standard ones with the flexible equivalent
+ OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat;
+ InitOMXParams(&portFormat);
+ portFormat.nPortIndex = isEncoder ? kPortIndexInput : kPortIndexOutput;
+ for (OMX_U32 index = 0; index <= kMaxIndicesToCheck; ++index) {
+ portFormat.nIndex = index;
+ status_t err = omxNode->getParameter(
+ OMX_IndexParamVideoPortFormat,
+ &portFormat, sizeof(portFormat));
+ if (err != OK) {
+ break;
+ }
+
+ OMX_U32 flexibleEquivalent;
+ if (IsFlexibleColorFormat(
+ omxNode, portFormat.eColorFormat, false /* usingNativeWindow */,
+ &flexibleEquivalent)) {
+ caps->addColorFormat(flexibleEquivalent);
+ }
+ caps->addColorFormat(portFormat.eColorFormat);
+
+ if (index == kMaxIndicesToCheck) {
+ ALOGW("[%s] stopping checking formats after %u: %s(%x)",
+ name, index,
+ asString(portFormat.eColorFormat), portFormat.eColorFormat);
+ }
+ }
+ } else if (strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC) == 0) {
+ // More audio codecs if they have profiles.
+ OMX_AUDIO_PARAM_ANDROID_PROFILETYPE param;
+ InitOMXParams(¶m);
+ param.nPortIndex = isEncoder ? kPortIndexOutput : kPortIndexInput;
+ for (OMX_U32 index = 0; index <= kMaxIndicesToCheck; ++index) {
+ param.nProfileIndex = index;
+ status_t err = omxNode->getParameter(
+ (OMX_INDEXTYPE)OMX_IndexParamAudioProfileQuerySupported,
+ ¶m, sizeof(param));
+ if (err != OK) {
+ break;
+ }
+ // For audio, level is ignored.
+ caps->addProfileLevel(param.eProfile, 0 /* level */);
+
+ if (index == kMaxIndicesToCheck) {
+ ALOGW("[%s] stopping checking profiles after %u: %x",
+ name, index,
+ param.eProfile);
+ }
+ }
+
+ // NOTE: Without Android extensions, OMX does not provide a way to query
+ // AAC profile support
+ if (param.nProfileIndex == 0) {
+ ALOGW("component %s doesn't support profile query.", name);
+ }
+ }
+
+ if (isVideo && !isEncoder) {
+ native_handle_t *sidebandHandle = nullptr;
+ if (omxNode->configureVideoTunnelMode(
+ kPortIndexOutput, OMX_TRUE, 0, &sidebandHandle) == OK) {
+ // tunneled playback includes adaptive playback
+ caps->addFlags(MediaCodecInfo::Capabilities::kFlagSupportsAdaptivePlayback
+ | MediaCodecInfo::Capabilities::kFlagSupportsTunneledPlayback);
+ } else if (omxNode->setPortMode(
+ kPortIndexOutput, IOMX::kPortModeDynamicANWBuffer) == OK ||
+ omxNode->prepareForAdaptivePlayback(
+ kPortIndexOutput, OMX_TRUE,
+ 1280 /* width */, 720 /* height */) == OK) {
+ caps->addFlags(MediaCodecInfo::Capabilities::kFlagSupportsAdaptivePlayback);
+ }
+ }
+
+ if (isVideo && isEncoder) {
+ OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE params;
+ InitOMXParams(¶ms);
+ params.nPortIndex = kPortIndexOutput;
+ // TODO: should we verify if fallback is supported?
+ if (omxNode->getConfig(
+ (OMX_INDEXTYPE)OMX_IndexConfigAndroidIntraRefresh,
+ ¶ms, sizeof(params)) == OK) {
+ caps->addFlags(MediaCodecInfo::Capabilities::kFlagSupportsIntraRefresh);
+ }
+ }
+
+ omxNode->freeNode();
+ return OK;
+}
+
+void buildOmxInfo(const MediaCodecsXmlParser& parser,
+ MediaCodecListWriter* writer) {
+ uint32_t omxRank = ::android::base::GetUintProperty(
+ "debug.stagefright.omx_default_rank", uint32_t(0x100));
+ for (const MediaCodecsXmlParser::Codec& codec : parser.getCodecMap()) {
+ const std::string &name = codec.first;
+ if (!hasPrefix(codec.first, "OMX.")) {
+ continue;
+ }
+ const MediaCodecsXmlParser::CodecProperties &properties = codec.second;
+ bool encoder = properties.isEncoder;
+ std::unique_ptr<MediaCodecInfoWriter> info =
+ writer->addMediaCodecInfo();
+ info->setName(name.c_str());
+ info->setOwner("default");
+ info->setEncoder(encoder);
+ info->setRank(omxRank);
+ for (const MediaCodecsXmlParser::Type& type : properties.typeMap) {
+ const std::string &mime = type.first;
+ std::unique_ptr<MediaCodecInfo::CapabilitiesWriter> caps =
+ info->addMime(mime.c_str());
+ const MediaCodecsXmlParser::AttributeMap &attrMap = type.second;
+ for (const MediaCodecsXmlParser::Attribute& attr : attrMap) {
+ const std::string &key = attr.first;
+ const std::string &value = attr.second;
+ if (hasPrefix(key, "feature-") &&
+ !hasPrefix(key, "feature-bitrate-modes")) {
+ caps->addDetail(key.c_str(), hasPrefix(value, "1") ? 1 : 0);
+ } else {
+ caps->addDetail(key.c_str(), value.c_str());
+ }
+ }
+ status_t err = queryOmxCapabilities(
+ name.c_str(),
+ mime.c_str(),
+ encoder,
+ caps.get());
+ if (err != OK) {
+ ALOGE("Failed to query capabilities for %s (mime: %s). Error: %d",
+ name.c_str(),
+ mime.c_str(),
+ static_cast<int>(err));
+ }
+ }
+ }
+}
+
+} // unnamed namespace
+
+status_t Codec2InfoBuilder::buildMediaCodecList(MediaCodecListWriter* writer) {
+ // TODO: Remove run-time configurations once all codecs are working
+ // properly. (Assume "full" behavior eventually.)
+ //
+ // debug.stagefright.ccodec supports 5 values.
+ // 0 - Only OMX components are available.
+ // 1 - Audio decoders and encoders with prefix "c2.android." are available
+ // and ranked first.
+ // All other components with prefix "c2.android." are available with
+ // their normal ranks.
+ // Components with prefix "c2.vda." are available with their normal
+ // ranks.
+ // All other components with suffix ".avc.decoder" or ".avc.encoder"
+ // are available but ranked last.
+ // 2 - Components with prefix "c2.android." are available and ranked
+ // first.
+ // Components with prefix "c2.vda." are available with their normal
+ // ranks.
+ // All other components with suffix ".avc.decoder" or ".avc.encoder"
+ // are available but ranked last.
+ // 3 - Components with prefix "c2.android." are available and ranked
+ // first.
+ // All other components are available with their normal ranks.
+ // 4 - All components are available with their normal ranks.
+ //
+ // The default value (boot time) is 1.
+ //
+ // Note: Currently, OMX components have default rank 0x100, while all
+ // Codec2.0 software components have default rank 0x200.
+ int option = ::android::base::GetIntProperty("debug.stagefright.ccodec", 1);
+
+ // Obtain Codec2Client
+ std::vector<Traits> traits = Codec2Client::ListComponents();
+
+ MediaCodecsXmlParser parser(
+ MediaCodecsXmlParser::defaultSearchDirs,
+ option == 0 ? "media_codecs.xml" :
+ "media_codecs_c2.xml",
+ option == 0 ? "media_codecs_performance.xml" :
+ "media_codecs_performance_c2.xml");
+ if (parser.getParsingStatus() != OK) {
+ ALOGD("XML parser no good");
+ return OK;
+ }
+
+ bool surfaceTest(Codec2Client::CreateInputSurface());
+ if (option == 0 || !surfaceTest) {
+ buildOmxInfo(parser, writer);
+ }
+
+ for (const Traits& trait : traits) {
+ C2Component::rank_t rank = trait.rank;
+
+ std::shared_ptr<Codec2Client::Interface> intf =
+ Codec2Client::CreateInterfaceByName(trait.name.c_str());
+ if (!intf || parser.getCodecMap().count(intf->getName()) == 0) {
+ ALOGD("%s not found in xml", trait.name.c_str());
+ continue;
+ }
+ std::string canonName = intf->getName();
+
+ // TODO: Remove this block once all codecs are enabled by default.
+ switch (option) {
+ case 0:
+ continue;
+ case 1:
+ if (hasPrefix(canonName, "c2.vda.")) {
+ break;
+ }
+ if (hasPrefix(canonName, "c2.android.")) {
+ if (trait.domain == C2Component::DOMAIN_AUDIO) {
+ rank = 1;
+ break;
+ }
+ break;
+ }
+ if (hasSuffix(canonName, ".avc.decoder") ||
+ hasSuffix(canonName, ".avc.encoder")) {
+ rank = std::numeric_limits<decltype(rank)>::max();
+ break;
+ }
+ continue;
+ case 2:
+ if (hasPrefix(canonName, "c2.vda.")) {
+ break;
+ }
+ if (hasPrefix(canonName, "c2.android.")) {
+ rank = 1;
+ break;
+ }
+ if (hasSuffix(canonName, ".avc.decoder") ||
+ hasSuffix(canonName, ".avc.encoder")) {
+ rank = std::numeric_limits<decltype(rank)>::max();
+ break;
+ }
+ continue;
+ case 3:
+ if (hasPrefix(canonName, "c2.android.")) {
+ rank = 1;
+ }
+ break;
+ }
+
+ std::unique_ptr<MediaCodecInfoWriter> codecInfo = writer->addMediaCodecInfo();
+ codecInfo->setName(trait.name.c_str());
+ codecInfo->setOwner("codec2");
+ bool encoder = trait.kind == C2Component::KIND_ENCODER;
+ codecInfo->setEncoder(encoder);
+ codecInfo->setRank(rank);
+ const MediaCodecsXmlParser::CodecProperties &codec =
+ parser.getCodecMap().at(canonName);
+
+ for (auto typeIt = codec.typeMap.begin(); typeIt != codec.typeMap.end(); ++typeIt) {
+ const std::string &mediaType = typeIt->first;
+ const MediaCodecsXmlParser::AttributeMap &attrMap = typeIt->second;
+ std::unique_ptr<MediaCodecInfo::CapabilitiesWriter> caps =
+ codecInfo->addMime(mediaType.c_str());
+ for (auto attrIt = attrMap.begin(); attrIt != attrMap.end(); ++attrIt) {
+ std::string key, value;
+ std::tie(key, value) = *attrIt;
+ if (key.find("feature-") == 0 && key.find("feature-bitrate-modes") != 0) {
+ caps->addDetail(key.c_str(), std::stoi(value));
+ } else {
+ caps->addDetail(key.c_str(), value.c_str());
+ }
+ }
+
+ bool gotProfileLevels = false;
+ if (intf) {
+ std::shared_ptr<C2Mapper::ProfileLevelMapper> mapper =
+ C2Mapper::GetProfileLevelMapper(trait.mediaType);
+ // if we don't know the media type, pass through all values unmapped
+
+ // TODO: we cannot find levels that are local 'maxima' without knowing the coding
+ // e.g. H.263 level 45 and level 30 could be two values for highest level as
+ // they don't include one another. For now we use the last supported value.
+ C2StreamProfileLevelInfo pl(encoder /* output */, 0u);
+ std::vector<C2FieldSupportedValuesQuery> profileQuery = {
+ C2FieldSupportedValuesQuery::Possible(C2ParamField(&pl, &pl.profile))
+ };
+
+ c2_status_t err = intf->querySupportedValues(profileQuery, C2_DONT_BLOCK);
+ ALOGV("query supported profiles -> %s | %s",
+ asString(err), asString(profileQuery[0].status));
+ if (err == C2_OK && profileQuery[0].status == C2_OK) {
+ if (profileQuery[0].values.type == C2FieldSupportedValues::VALUES) {
+ for (C2Value::Primitive profile : profileQuery[0].values.values) {
+ pl.profile = (C2Config::profile_t)profile.ref<uint32_t>();
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ err = intf->config({&pl}, C2_DONT_BLOCK, &failures);
+ ALOGV("set profile to %u -> %s", pl.profile, asString(err));
+ std::vector<C2FieldSupportedValuesQuery> levelQuery = {
+ C2FieldSupportedValuesQuery::Current(C2ParamField(&pl, &pl.level))
+ };
+ err = intf->querySupportedValues(levelQuery, C2_DONT_BLOCK);
+ ALOGV("query supported levels -> %s | %s",
+ asString(err), asString(levelQuery[0].status));
+ if (err == C2_OK && levelQuery[0].status == C2_OK) {
+ if (levelQuery[0].values.type == C2FieldSupportedValues::VALUES
+ && levelQuery[0].values.values.size() > 0) {
+ C2Value::Primitive level = levelQuery[0].values.values.back();
+ pl.level = (C2Config::level_t)level.ref<uint32_t>();
+ ALOGV("supporting level: %u", pl.level);
+ int32_t sdkProfile, sdkLevel;
+ if (mapper && mapper->mapProfile(pl.profile, &sdkProfile)
+ && mapper->mapLevel(pl.level, &sdkLevel)) {
+ caps->addProfileLevel(
+ (uint32_t)sdkProfile, (uint32_t)sdkLevel);
+ gotProfileLevels = true;
+ } else if (!mapper) {
+ caps->addProfileLevel(pl.profile, pl.level);
+ gotProfileLevels = true;
+ }
+
+ // for H.263 also advertise the second highest level if the
+ // codec supports level 45, as level 45 only covers level 10
+ // TODO: move this to some form of a setting so it does not
+ // have to be here
+ if (mediaType == MIMETYPE_VIDEO_H263) {
+ C2Config::level_t nextLevel = C2Config::LEVEL_UNUSED;
+ for (C2Value::Primitive v : levelQuery[0].values.values) {
+ C2Config::level_t level =
+ (C2Config::level_t)v.ref<uint32_t>();
+ if (level < C2Config::LEVEL_H263_45
+ && level > nextLevel) {
+ nextLevel = level;
+ }
+ }
+ if (nextLevel != C2Config::LEVEL_UNUSED
+ && nextLevel != pl.level
+ && mapper
+ && mapper->mapProfile(pl.profile, &sdkProfile)
+ && mapper->mapLevel(nextLevel, &sdkLevel)) {
+ caps->addProfileLevel(
+ (uint32_t)sdkProfile, (uint32_t)sdkLevel);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!gotProfileLevels) {
+ if (mediaType == MIMETYPE_VIDEO_VP9) {
+ if (encoder) {
+ caps->addProfileLevel(VP9Profile0, VP9Level41);
+ } else {
+ caps->addProfileLevel(VP9Profile0, VP9Level5);
+ caps->addProfileLevel(VP9Profile2, VP9Level5);
+ caps->addProfileLevel(VP9Profile2HDR, VP9Level5);
+ }
+ } else if (mediaType == MIMETYPE_VIDEO_HEVC && !encoder) {
+ caps->addProfileLevel(HEVCProfileMain, HEVCMainTierLevel51);
+ caps->addProfileLevel(HEVCProfileMainStill, HEVCMainTierLevel51);
+ } else if (mediaType == MIMETYPE_VIDEO_VP8) {
+ if (encoder) {
+ caps->addProfileLevel(VP8ProfileMain, VP8Level_Version0);
+ } else {
+ caps->addProfileLevel(VP8ProfileMain, VP8Level_Version0);
+ }
+ } else if (mediaType == MIMETYPE_VIDEO_AVC) {
+ if (encoder) {
+ caps->addProfileLevel(AVCProfileBaseline, AVCLevel41);
+// caps->addProfileLevel(AVCProfileConstrainedBaseline, AVCLevel41);
+ caps->addProfileLevel(AVCProfileMain, AVCLevel41);
+ } else {
+ caps->addProfileLevel(AVCProfileBaseline, AVCLevel52);
+ caps->addProfileLevel(AVCProfileConstrainedBaseline, AVCLevel52);
+ caps->addProfileLevel(AVCProfileMain, AVCLevel52);
+ caps->addProfileLevel(AVCProfileConstrainedHigh, AVCLevel52);
+ caps->addProfileLevel(AVCProfileHigh, AVCLevel52);
+ }
+ } else if (mediaType == MIMETYPE_VIDEO_MPEG4) {
+ if (encoder) {
+ caps->addProfileLevel(MPEG4ProfileSimple, MPEG4Level2);
+ } else {
+ caps->addProfileLevel(MPEG4ProfileSimple, MPEG4Level3);
+ }
+ } else if (mediaType == MIMETYPE_VIDEO_H263) {
+ if (encoder) {
+ caps->addProfileLevel(H263ProfileBaseline, H263Level45);
+ } else {
+ caps->addProfileLevel(H263ProfileBaseline, H263Level30);
+ caps->addProfileLevel(H263ProfileBaseline, H263Level45);
+ caps->addProfileLevel(H263ProfileISWV2, H263Level30);
+ caps->addProfileLevel(H263ProfileISWV2, H263Level45);
+ }
+ } else if (mediaType == MIMETYPE_VIDEO_MPEG2 && !encoder) {
+ caps->addProfileLevel(MPEG2ProfileSimple, MPEG2LevelHL);
+ caps->addProfileLevel(MPEG2ProfileMain, MPEG2LevelHL);
+ }
+ }
+
+ // TODO: get this from intf() as well, but how do we map them to
+ // MediaCodec color formats?
+ if (mediaType.find("video") != std::string::npos) {
+ // vendor video codecs prefer opaque format
+ if (trait.name.find("android") == std::string::npos) {
+ caps->addColorFormat(COLOR_FormatSurface);
+ }
+ caps->addColorFormat(COLOR_FormatYUV420Flexible);
+ caps->addColorFormat(COLOR_FormatYUV420Planar);
+ caps->addColorFormat(COLOR_FormatYUV420SemiPlanar);
+ caps->addColorFormat(COLOR_FormatYUV420PackedPlanar);
+ caps->addColorFormat(COLOR_FormatYUV420PackedSemiPlanar);
+ // framework video encoders must support surface format, though it is unclear
+ // that they will be able to map it if it is opaque
+ if (encoder && trait.name.find("android") != std::string::npos) {
+ caps->addColorFormat(COLOR_FormatSurface);
+ }
+ }
+ }
+ }
+ return OK;
+}
+
+} // namespace android
+
+extern "C" android::MediaCodecListBuilderBase *CreateBuilder() {
+ return new android::Codec2InfoBuilder;
+}
+
diff --git a/media/codec2/sfplugin/Codec2InfoBuilder.h b/media/codec2/sfplugin/Codec2InfoBuilder.h
new file mode 100644
index 0000000..30c189e
--- /dev/null
+++ b/media/codec2/sfplugin/Codec2InfoBuilder.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_INFO_BUILDER_H_
+#define CODEC2_INFO_BUILDER_H_
+
+#include <media/stagefright/MediaCodecList.h>
+#include <utils/Errors.h>
+
+namespace android {
+
+class Codec2InfoBuilder : public MediaCodecListBuilderBase {
+public:
+ Codec2InfoBuilder() = default;
+ ~Codec2InfoBuilder() override = default;
+ status_t buildMediaCodecList(MediaCodecListWriter* writer) override;
+};
+
+} // namespace android
+
+#endif // CODEC2_INFO_BUILDER_H_
diff --git a/media/codec2/sfplugin/InputSurfaceWrapper.h b/media/codec2/sfplugin/InputSurfaceWrapper.h
new file mode 100644
index 0000000..d9c4eec
--- /dev/null
+++ b/media/codec2/sfplugin/InputSurfaceWrapper.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INPUT_SURFACE_WRAPPER_H_
+#define INPUT_SURFACE_WRAPPER_H_
+
+#include <codec2/hidl/client.h>
+#include <system/graphics.h>
+
+namespace android {
+
+/**
+ * Wrapper interface around InputSurface.
+ */
+class InputSurfaceWrapper {
+public:
+ InputSurfaceWrapper()
+ : mDataSpace(HAL_DATASPACE_UNKNOWN) {
+ }
+
+ virtual ~InputSurfaceWrapper() = default;
+
+ /**
+ * Connect the surface with |comp|. A surface can
+ * connect to at most one component at a time.
+ *
+ * \return OK successfully connected to |comp|
+ * \return ALREADY_EXISTS already connected to another component.
+ */
+ virtual status_t connect(
+ const std::shared_ptr<Codec2Client::Component> &comp) = 0;
+
+ /**
+ * Disconnect the surface from the component if any.
+ */
+ virtual void disconnect() = 0;
+
+ /**
+ * Start pushing buffers to the surface.
+ */
+ virtual status_t start() = 0;
+
+ /**
+ * Ref: GraphicBufferSource::signalEndOfInputStream.
+ */
+ virtual status_t signalEndOfInputStream() = 0;
+
+ /// Input Surface configuration
+ struct Config {
+ // IN PARAMS (GBS)
+ float mMinFps; // minimum fps (repeat frame to achieve this)
+ float mMaxFps; // max fps (via frame drop)
+ float mCaptureFps; // capture fps
+ float mCodedFps; // coded fps
+ bool mSuspended; // suspended
+ int64_t mTimeOffsetUs; // time offset (input => codec)
+ int64_t mSuspendAtUs; // suspend/resume time
+ int64_t mStartAtUs; // start time
+ bool mStopped; // stopped
+ int64_t mStopAtUs; // stop time
+
+ // OUT PARAMS (GBS)
+ int64_t mInputDelayUs; // delay between encoder input and surface input
+
+ // IN PARAMS (CODEC WRAPPER)
+ float mFixedAdjustedFps; // fixed fps via PTS manipulation
+ float mMinAdjustedFps; // minimum fps via PTS manipulation
+ };
+
+ /**
+ * Configures input surface.
+ *
+ * \param config configuration. This can be updated during this call to provide output
+ * parameters, but not to provide configured parameters (to avoid continually
+ * reconfiguring)
+ */
+ virtual status_t configure(Config &config) = 0;
+
+ /**
+ * Configures desired data space.
+ *
+ * \param dataSpace desired data space
+ */
+ inline void setDataSpace(android_dataspace dataSpace) {
+ mDataSpace = dataSpace;
+ }
+
+protected:
+ android_dataspace mDataSpace;
+};
+
+} // namespace android
+
+#endif // INPUT_SURFACE_WRAPPER_H_
diff --git a/media/codec2/sfplugin/ReflectedParamUpdater.cpp b/media/codec2/sfplugin/ReflectedParamUpdater.cpp
new file mode 100644
index 0000000..880d4a5
--- /dev/null
+++ b/media/codec2/sfplugin/ReflectedParamUpdater.cpp
@@ -0,0 +1,575 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "ReflectedParamUpdater"
+#include <utils/Log.h>
+
+#include <iostream>
+#include <set>
+#include <sstream>
+
+#include <C2Debug.h>
+#include <C2ParamInternal.h>
+
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/AString.h>
+#include <media/stagefright/foundation/hexdump.h>
+
+#include "ReflectedParamUpdater.h"
+
+namespace android {
+
+std::string ReflectedParamUpdater::Dict::debugString(size_t indent_) const {
+ std::string indent(indent_, ' ');
+ std::stringstream s;
+ s << "Dict {" << std::endl;
+
+ for (const auto &it : *this) {
+ s << indent << " ";
+
+ C2Value c2Value;
+ int32_t int32Value;
+ uint32_t uint32Value;
+ int64_t int64Value;
+ uint64_t uint64Value;
+ float floatValue;
+ sp<ABuffer> bufValue;
+ AString strValue;
+ if (it.second.find(&c2Value)) {
+ switch (c2Value.type()) {
+ case C2Value::INT32:
+ (void)c2Value.get(&int32Value);
+ s << "c2::i32 " << it.first << " = " << int32Value;
+ break;
+ case C2Value::UINT32:
+ (void)c2Value.get(&uint32Value);
+ s << "c2::u32 " << it.first << " = " << uint32Value;
+ break;
+ case C2Value::CNTR32:
+ // dump counter value as unsigned
+ (void)c2Value.get((c2_cntr32_t*)&uint32Value);
+ s << "c2::c32 " << it.first << " = " << uint32Value;
+ break;
+ case C2Value::INT64:
+ (void)c2Value.get(&int64Value);
+ s << "c2::i64 " << it.first << " = " << int64Value;
+ break;
+ case C2Value::UINT64:
+ (void)c2Value.get(&uint64Value);
+ s << "c2::u64 " << it.first << " = " << uint64Value;
+ break;
+ case C2Value::CNTR64:
+ // dump counter value as unsigned
+ (void)c2Value.get((c2_cntr64_t*)&uint64Value);
+ s << "c2::c64 " << it.first << " = " << uint64Value;
+ break;
+ case C2Value::FLOAT:
+ (void)c2Value.get(&floatValue);
+ s << "c2::float " << it.first << " = " << floatValue;
+ break;
+ default:
+ // dump unsupported values for debugging, these should not be used
+ s << "c2::unsupported " << it.first;
+ }
+ } else if (it.second.find(&int32Value)) {
+ s << "int32_t " << it.first << " = " << int32Value;
+ } else if (it.second.find(&int64Value)) {
+ s << "int64_t " << it.first << " = " << int64Value;
+ } else if (it.second.find(&strValue)) {
+ s << "string " << it.first << " = \"" << strValue.c_str() << "\"";
+ } else if (it.second.find(&bufValue)) {
+ s << "Buffer " << it.first << " = ";
+ if (bufValue != nullptr && bufValue->data() != nullptr && bufValue->size() <= 64) {
+ s << "{" << std::endl;
+ AString tmp;
+ hexdump(bufValue->data(), bufValue->size(), indent_ + 4, &tmp);
+ s << tmp.c_str() << indent << " }";
+ } else {
+ s << (void*)bufValue.get();
+ }
+ } else {
+ // dump unsupported values for debugging, this should never happen.
+ s << "unsupported " << it.first;
+ }
+ s << std::endl;
+ }
+ s << indent << "}";
+
+ return s.str();
+}
+
+void ReflectedParamUpdater::addParamDesc(
+ const std::shared_ptr<C2ParamReflector> &reflector,
+ const std::vector<std::shared_ptr<C2ParamDescriptor>> ¶mDescs) {
+ for (const std::shared_ptr<C2ParamDescriptor> &desc : paramDescs) {
+ std::unique_ptr<C2StructDescriptor> structDesc = reflector->describe(
+ desc->index().coreIndex());
+ if (structDesc == nullptr) {
+ ALOGD("Could not describe %s", desc->name().c_str());
+ continue;
+ }
+ addParamDesc(desc, *structDesc, reflector, true /* markVendor */);
+ }
+
+ // TEMP: also add vendor parameters as non-vendor
+ for (const std::shared_ptr<C2ParamDescriptor> &desc : paramDescs) {
+ if (!desc->index().isVendor()) {
+ continue;
+ }
+ std::unique_ptr<C2StructDescriptor> structDesc = reflector->describe(
+ desc->index().coreIndex());
+ if (structDesc) {
+ addParamDesc(desc, *structDesc, reflector, false /* markVendor */);
+ }
+ }
+}
+
+void ReflectedParamUpdater::addParamStructDesc(
+ std::shared_ptr<C2ParamDescriptor> desc,
+ C2String path,
+ size_t offset,
+ const C2StructDescriptor &structDesc,
+ const std::shared_ptr<C2ParamReflector> &reflector) {
+ for (auto it = structDesc.begin(); it != structDesc.end(); ++it) {
+ C2String fieldName = path + "." + it->name();
+ if (it->type() & C2FieldDescriptor::STRUCT_FLAG) {
+ if (reflector == nullptr || it->extent() != 1) {
+ ALOGD("ignored struct field %s", fieldName.c_str());
+ continue;
+ }
+ std::unique_ptr<C2StructDescriptor> structDesc_ = reflector->describe(
+ C2Param::CoreIndex(it->type()).coreIndex());
+ if (structDesc_ == nullptr) {
+ ALOGD("Could not describe structure of %s", fieldName.c_str());
+ continue;
+ }
+ addParamStructDesc(desc, fieldName, offset + _C2ParamInspector::GetOffset(*it),
+ *structDesc_, reflector);
+ continue;
+ }
+
+ // verify extent and type
+ switch (it->type()) {
+ case C2FieldDescriptor::INT32:
+ case C2FieldDescriptor::UINT32:
+ case C2FieldDescriptor::CNTR32:
+ case C2FieldDescriptor::INT64:
+ case C2FieldDescriptor::UINT64:
+ case C2FieldDescriptor::CNTR64:
+ case C2FieldDescriptor::FLOAT:
+ if (it->extent() != 1) {
+ ALOGD("extent() != 1 for single value type: %s", fieldName.c_str());
+ continue;
+ }
+ break;
+ case C2FieldDescriptor::STRING:
+ case C2FieldDescriptor::BLOB:
+ break;
+
+ default:
+ ALOGD("Unrecognized type: %s", fieldName.c_str());
+ continue;
+ }
+
+ ALOGV("%s registered", fieldName.c_str());
+ // TODO: get the proper size by iterating through the fields.
+ // only insert fields the very first time
+ mMap.emplace(fieldName, FieldDesc {
+ desc,
+ std::make_unique<C2FieldDescriptor>(
+ it->type(), it->extent(), it->name(),
+ _C2ParamInspector::GetOffset(*it),
+ _C2ParamInspector::GetSize(*it)),
+ offset,
+ });
+ }
+}
+
+void ReflectedParamUpdater::addParamDesc(
+ std::shared_ptr<C2ParamDescriptor> desc, const C2StructDescriptor &structDesc,
+ const std::shared_ptr<C2ParamReflector> &reflector, bool markVendor) {
+ C2String paramName = desc->name();
+
+ // prefix vendor parameters
+ if (desc->index().isVendor() && markVendor) {
+ paramName = "vendor." + paramName;
+ }
+ mParamNames.emplace(desc->index(), paramName);
+
+ // also allow setting whole parameters in a binary fashion via ByteBuffer
+ // this is opt-in for now
+ auto it = mWholeParams.find(paramName);
+ if (it != mWholeParams.end() && it->second.coreIndex() == desc->index().coreIndex()) {
+ mMap.emplace(paramName, FieldDesc{ desc, nullptr, 0 /* offset */ });
+ // don't add fields of whole parameters.
+ return;
+ }
+
+ addParamStructDesc(desc, paramName, 0 /* offset */, structDesc, reflector);
+}
+
+void ReflectedParamUpdater::supportWholeParam(std::string name, C2Param::CoreIndex index) {
+ mWholeParams.emplace(name, index);
+}
+
+std::string ReflectedParamUpdater::getParamName(C2Param::Index index) const {
+ auto it = mParamNames.find(index);
+ if (it != mParamNames.end()) {
+ return it->second;
+ }
+
+ std::stringstream ret;
+ ret << "<unknown " << index << ">";
+ return ret.str();
+}
+
+void ReflectedParamUpdater::getParamIndicesFromMessage(
+ const Dict ¶ms,
+ std::vector<C2Param::Index> *vec /* nonnull */) const {
+ CHECK(vec != nullptr);
+ vec->clear();
+ std::set<C2Param::Index> indices;
+ parseMessageAndDoWork(
+ params,
+ [&indices](const std::string &, const FieldDesc &desc, const void *, size_t) {
+ indices.insert(desc.paramDesc->index());
+ });
+ for (const C2Param::Index &index : indices) {
+ vec->push_back(index);
+ }
+}
+
+void ReflectedParamUpdater::getParamIndicesForKeys(
+ const std::vector<std::string> &keys,
+ std::vector<C2Param::Index> *vec /* nonnull */) const {
+ CHECK(vec != nullptr);
+ vec->clear();
+ std::set<C2Param::Index> indices;
+
+ std::set<std::string> keyMap(keys.begin(), keys.end());
+
+ ALOGV("in getParamIndicesForKeys with %zu keys and map of %zu entries",
+ keyMap.size(), mMap.size());
+ for (const std::pair<const std::string, FieldDesc> &kv : mMap) {
+ const std::string &name = kv.first;
+ const FieldDesc &desc = kv.second;
+ ALOGV("count of %s is %zu", name.c_str(), keyMap.count(name));
+ if (keyMap.count(name) > 0) {
+ indices.insert(desc.paramDesc->index());
+ }
+ }
+
+ for (const C2Param::Index &index : indices) {
+ vec->push_back(index);
+ }
+}
+
+void ReflectedParamUpdater::updateParamsFromMessage(
+ const Dict ¶ms,
+ std::vector<std::unique_ptr<C2Param>> *vec /* nonnull */) const {
+ CHECK(vec != nullptr);
+
+ std::map<C2Param::Index, std::unique_ptr<C2Param>*> paramsMap;
+ for (std::unique_ptr<C2Param> ¶m : *vec) {
+ if (param && *param) {
+ paramsMap[param->index()] = ¶m;
+ }
+ }
+
+ parseMessageAndDoWork(
+ params,
+ [¶msMap](const std::string &name, const FieldDesc &desc, const void *ptr, size_t size) {
+ std::unique_ptr<C2Param> *param = nullptr;
+ auto paramIt = paramsMap.find(desc.paramDesc->index());
+ if (paramIt == paramsMap.end()) {
+ ALOGD("%s found, but param #%d isn't present to update",
+ name.c_str(), (int32_t)desc.paramDesc->index());
+ return;
+ }
+ param = paramIt->second;
+
+ struct _C2Param : public C2Param {
+ using C2Param::C2Param;
+ _C2Param(uint32_t size, uint32_t index) : C2Param(size, index) { }
+ };
+
+ // we will handle whole param updates as part of a flexible param update using
+ // a zero offset.
+ size_t offset = 0;
+ size_t minOffset = 0;
+
+ // if this descriptor has a field, use the offset and size and ensure that offset
+ // is not part of the header
+ if (desc.fieldDesc) {
+ minOffset = sizeof(C2Param);
+ offset = sizeof(C2Param) + desc.offset
+ + _C2ParamInspector::GetOffset(*desc.fieldDesc);
+ }
+
+ // reallocate or trim flexible param (or whole param) as necessary
+ if (!desc.fieldDesc /* whole param */ || desc.fieldDesc->extent() == 0) {
+ // reallocate param if more space is needed
+ if (param->get()->size() < offset + size) {
+ if (size > INT32_MAX - offset || offset < minOffset) {
+ // size too long or offset too early - abandon
+ return;
+ }
+ C2Param *newParam = (C2Param *)::operator new(offset + size);
+ new (newParam) _C2Param(offset + size, param->get()->index());
+ if (offset > sizeof(C2Param)) {
+ memcpy(newParam + 1, param->get() + 1, offset - sizeof(C2Param));
+ }
+ param->reset(newParam);
+ } else if (param->get()->size() > offset + size) {
+ // trim parameter size
+ _C2ParamInspector::TrimParam(param->get(), offset + size);
+ }
+ } else if (desc.fieldDesc->type() == C2FieldDescriptor::BLOB) {
+ // zero fill blobs if updating with smaller blob
+ if (desc.fieldDesc->extent() > size) {
+ memset((uint8_t *)(param->get()) + offset + size, 0,
+ desc.fieldDesc->extent() - size);
+ }
+ }
+
+ memcpy((uint8_t *)(param->get()) + offset, ptr, size);
+ });
+}
+
+void ReflectedParamUpdater::parseMessageAndDoWork(
+ const Dict ¶ms,
+ std::function<void(const std::string &, const FieldDesc &, const void *, size_t)> work) const {
+ for (const std::pair<const std::string, FieldDesc> &kv : mMap) {
+ const std::string &name = kv.first;
+ const FieldDesc &desc = kv.second;
+ auto param = params.find(name);
+ if (param == params.end()) {
+ continue;
+ }
+
+ // handle whole parameters
+ if (!desc.fieldDesc) {
+ sp<ABuffer> tmp;
+ if (param->second.find(&tmp) && tmp != nullptr) {
+ C2Param *tmpAsParam = C2Param::From(tmp->data(), tmp->size());
+ if (tmpAsParam && tmpAsParam->type().type() == desc.paramDesc->index().type()) {
+ work(name, desc, tmp->data(), tmp->size());
+ } else {
+ ALOGD("Param blob does not match param for '%s' (%p, %x vs %x)",
+ name.c_str(), tmpAsParam, tmpAsParam ? tmpAsParam->type().type() : 0xDEADu,
+ desc.paramDesc->index().type());
+ }
+ }
+ continue;
+ }
+
+ int32_t int32Value;
+ int64_t int64Value;
+ C2Value c2Value;
+
+ C2FieldDescriptor::type_t fieldType = desc.fieldDesc->type();
+ size_t fieldExtent = desc.fieldDesc->extent();
+ switch (fieldType) {
+ case C2FieldDescriptor::INT32:
+ if ((param->second.find(&c2Value) && c2Value.get(&int32Value))
+ || param->second.find(&int32Value)) {
+ work(name, desc, &int32Value, sizeof(int32Value));
+ }
+ break;
+ case C2FieldDescriptor::UINT32:
+ if ((param->second.find(&c2Value) && c2Value.get((uint32_t*)&int32Value))
+ || param->second.find(&int32Value)) {
+ work(name, desc, &int32Value, sizeof(int32Value));
+ }
+ break;
+ case C2FieldDescriptor::CNTR32:
+ if ((param->second.find(&c2Value) && c2Value.get((c2_cntr32_t*)&int32Value))
+ || param->second.find(&int32Value)) {
+ work(name, desc, &int32Value, sizeof(int32Value));
+ }
+ break;
+ case C2FieldDescriptor::INT64:
+ if ((param->second.find(&c2Value) && c2Value.get(&int64Value))
+ || param->second.find(&int64Value)) {
+ work(name, desc, &int64Value, sizeof(int64Value));
+ }
+ break;
+ case C2FieldDescriptor::UINT64:
+ if ((param->second.find(&c2Value) && c2Value.get((uint64_t*)&int64Value))
+ || param->second.find(&int64Value)) {
+ work(name, desc, &int64Value, sizeof(int64Value));
+ }
+ break;
+ case C2FieldDescriptor::CNTR64:
+ if ((param->second.find(&c2Value) && c2Value.get((c2_cntr64_t*)&int64Value))
+ || param->second.find(&int64Value)) {
+ work(name, desc, &int64Value, sizeof(int64Value));
+ }
+ break;
+ case C2FieldDescriptor::FLOAT: {
+ float tmp;
+ if (param->second.find(&c2Value) && c2Value.get(&tmp)) {
+ work(name, desc, &tmp, sizeof(tmp));
+ }
+ break;
+ }
+ case C2FieldDescriptor::STRING: {
+ AString tmp;
+ if (!param->second.find(&tmp)) {
+ break;
+ }
+ if (fieldExtent > 0 && tmp.size() >= fieldExtent) {
+ AString truncated(tmp, 0, fieldExtent - 1);
+ ALOGD("String value too long to fit: original \"%s\" truncated to \"%s\"",
+ tmp.c_str(), truncated.c_str());
+ tmp = truncated;
+ }
+ work(name, desc, tmp.c_str(), tmp.size() + 1);
+ break;
+ }
+
+ case C2FieldDescriptor::BLOB: {
+ sp<ABuffer> tmp;
+ if (!param->second.find(&tmp) || tmp == nullptr) {
+ break;
+ }
+
+ if (fieldExtent > 0 && tmp->size() > fieldExtent) {
+ ALOGD("Blob value too long to fit. Truncating.");
+ tmp->setRange(tmp->offset(), fieldExtent);
+ }
+ work(name, desc, tmp->data(), tmp->size());
+ break;
+ }
+
+ default:
+ ALOGD("Unsupported data type for %s", name.c_str());
+ break;
+ }
+ }
+}
+
+ReflectedParamUpdater::Dict
+ReflectedParamUpdater::getParams(const std::vector<std::unique_ptr<C2Param>> ¶ms_) const {
+ std::vector<C2Param*> params;
+ params.resize(params_.size());
+ std::transform(params_.begin(), params_.end(), params.begin(),
+ [](const std::unique_ptr<C2Param>& p) -> C2Param* { return p.get(); });
+ return getParams(params);
+}
+
+ReflectedParamUpdater::Dict
+ReflectedParamUpdater::getParams(const std::vector<C2Param*> ¶ms) const {
+ Dict ret;
+
+ // convert vector to map
+ std::map<C2Param::Index, C2Param *> paramsMap;
+ for (C2Param *param : params) {
+ if (param != nullptr && *param) {
+ paramsMap[param->index()] = param;
+ }
+ }
+
+ for (const std::pair<const std::string, FieldDesc> &kv : mMap) {
+ const std::string &name = kv.first;
+ const FieldDesc &desc = kv.second;
+ if (paramsMap.count(desc.paramDesc->index()) == 0) {
+ continue;
+ }
+ C2Param *param = paramsMap[desc.paramDesc->index()];
+ Value value;
+
+ // handle whole params first
+ if (!desc.fieldDesc) {
+ sp<ABuffer> buf = ABuffer::CreateAsCopy(param, param->size());
+ value.set(buf);
+ ret.emplace(name, value);
+ continue;
+ }
+
+ size_t offset = sizeof(C2Param) + desc.offset
+ + _C2ParamInspector::GetOffset(*desc.fieldDesc);
+ uint8_t *data = (uint8_t *)param + offset;
+ C2FieldDescriptor::type_t fieldType = desc.fieldDesc->type();
+ switch (fieldType) {
+ case C2FieldDescriptor::STRING: {
+ size_t length = desc.fieldDesc->extent();
+ if (length == 0) {
+ length = param->size() - offset;
+ }
+
+ if (param->size() < length || param->size() - length < offset) {
+ ALOGD("param too small for string: length %zu size %zu offset %zu",
+ length, param->size(), offset);
+ break;
+ }
+ value.set(AString((char *)data, strnlen((char *)data, length)));
+ break;
+ }
+
+ case C2FieldDescriptor::BLOB: {
+ size_t length = desc.fieldDesc->extent();
+ if (length == 0) {
+ length = param->size() - offset;
+ }
+
+ if (param->size() < length || param->size() - length < offset) {
+ ALOGD("param too small for blob: length %zu size %zu offset %zu",
+ length, param->size(), offset);
+ break;
+ }
+
+ sp<ABuffer> buf = ABuffer::CreateAsCopy(data, length);
+ value.set(buf);
+ break;
+ }
+
+ default: {
+ size_t valueSize = C2Value::SizeFor((C2Value::type_t)fieldType);
+ if (param->size() < valueSize || param->size() - valueSize < offset) {
+ ALOGD("param too small for c2value: size %zu offset %zu",
+ param->size(), offset);
+ break;
+ }
+
+ C2Value c2Value;
+ switch (fieldType) {
+ case C2FieldDescriptor::INT32: c2Value = *((int32_t *)data); break;
+ case C2FieldDescriptor::UINT32: c2Value = *((uint32_t *)data); break;
+ case C2FieldDescriptor::CNTR32: c2Value = *((c2_cntr32_t *)data); break;
+ case C2FieldDescriptor::INT64: c2Value = *((int64_t *)data); break;
+ case C2FieldDescriptor::UINT64: c2Value = *((uint64_t *)data); break;
+ case C2FieldDescriptor::CNTR64: c2Value = *((c2_cntr64_t *)data); break;
+ case C2FieldDescriptor::FLOAT: c2Value = *((float *)data); break;
+ default:
+ ALOGD("Unsupported data type for %s", name.c_str());
+ continue;
+ }
+ value.set(c2Value);
+ }
+ }
+ ret.emplace(name, value);
+ }
+ return ret;
+}
+
+void ReflectedParamUpdater::clear() {
+ mMap.clear();
+}
+
+} // namespace android
diff --git a/media/codec2/sfplugin/ReflectedParamUpdater.h b/media/codec2/sfplugin/ReflectedParamUpdater.h
new file mode 100644
index 0000000..5436ba5
--- /dev/null
+++ b/media/codec2/sfplugin/ReflectedParamUpdater.h
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef REFLECTED_PARAM_BUILDER_H_
+#define REFLECTED_PARAM_BUILDER_H_
+
+#include <map>
+#include <memory>
+
+#include <C2.h>
+#include <C2Param.h>
+
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/AData.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/foundation/AString.h>
+
+namespace android {
+
+/**
+ * Utility class to query and update Codec 2.0 configuration values. Use custom dictionary as
+ * AMessage cannot represent all types of Codec 2.0 parameters and C2Value cannot represent
+ * all types of SDK values. We want to be precise when setting standard parameters (use C2Value
+ * for arithmetic values), but also support int32 and int64 for SDK values specifically for
+ * vendor parameters (as SDK API does not allow specifying proper type.) When querying fields,
+ * we can use C2Values as they are defined.
+ *
+ * Item => Codec 2.0 value mappings:
+ * CValue::type => type
+ * int32 => int32, ctr32 or uint32
+ * int64 => int64, ctr64 or uint64
+ * AString => string
+ * ABuffer => blob
+ * 'Rect' => C2RectStruct (not exposed in SDK as a rectangle)
+ */
+class ReflectedParamUpdater {
+public:
+ ReflectedParamUpdater() = default;
+ ~ReflectedParamUpdater() = default;
+
+ /**
+ * Element for values
+ */
+ struct Value : public AData<C2Value, int32_t, int64_t, AString, sp<ABuffer>>::Basic {
+ // allow construction from base types
+ Value() = default;
+ explicit Value(C2Value i) { set(i); }
+ explicit Value(int32_t i) { set(i); }
+ explicit Value(int64_t i) { set(i); }
+ explicit Value(const AString &i) { set(i); }
+ explicit Value(const sp<ABuffer> &i) { set(i); }
+ };
+
+ struct Dict : public std::map<std::string, Value> {
+ Dict() = default;
+ std::string debugString(size_t indent = 0) const;
+ };
+
+ /**
+ * Enumerates all fields of the parameter descriptors supplied, so that this opbject can later
+ * query and update these.
+ *
+ * For now only first-level fields are supported. Also, array fields are not supported.
+ *
+ * \param reflector C2ParamReflector object for C2Param reflection.
+ * \param paramDescs vector of C2ParamDescriptor objects that this object
+ * would recognize when building params.
+ */
+ void addParamDesc(
+ const std::shared_ptr<C2ParamReflector> &reflector,
+ const std::vector<std::shared_ptr<C2ParamDescriptor>> ¶mDescs);
+
+ /**
+ * Adds fields of a standard parameter (that may not be supported by the parameter reflector
+ * or may not be listed as a supported value by the component). If the parameter name is
+ * used for another parameter, this operation is a no-op. (Technically, this is by fields).
+ *
+ * \param T standard parameter type
+ * \param name parameter name
+ */
+ template<typename T>
+ void addStandardParam(const std::string &name, C2ParamDescriptor::attrib_t attrib =
+ C2ParamDescriptor::IS_READ_ONLY) {
+ addParamDesc(std::make_shared<C2ParamDescriptor>(
+ C2Param::Index(T::PARAM_TYPE), attrib, name.c_str()),
+ C2StructDescriptor((T*)nullptr), nullptr /* descriptor */);
+ }
+
+ /**
+ * Adds fields of a structure (or a parameater) described by the struct descriptor. If
+ * reflector is provided, fields of sub-structures are also added. Otherwise, only top-level
+ * fundamental typed fields (arithmetic, string and blob) are added.
+ *
+ * \param paramDesc parameter descriptor
+ * \param fieldDesc field descriptor
+ * \param path path/name of the structure (field or parent parameter)
+ * \param offset offset of the structure in the parameter
+ * \param reflector C2ParamReflector object for C2Param reflection (may be null)
+ */
+ void addParamStructDesc(
+ std::shared_ptr<C2ParamDescriptor> paramDesc, C2String path, size_t offset,
+ const C2StructDescriptor &structDesc,
+ const std::shared_ptr<C2ParamReflector> &reflector);
+
+ /**
+ * Adds fields of a parameter described by the struct descriptor. If reflector is provided,
+ * fields of sub-structures are also added. Otherwise, only top-level fundamental typed fields
+ * (arithmetic, string and blob) are added.
+ *
+ * \param paramDesc parameter descriptor
+ * \param fieldDesc field descriptor
+ * \param reflector C2ParamReflector object for C2Param reflection (may be null)
+ * \param markVendor TEMP if true, prefix vendor parameter names with "vendor."
+ */
+ void addParamDesc(
+ std::shared_ptr<C2ParamDescriptor> paramDesc, const C2StructDescriptor &structDesc,
+ const std::shared_ptr<C2ParamReflector> &reflector,
+ bool markVendor = true);
+
+ /**
+ * Add support for setting a parameter as a binary blob.
+ *
+ * \param name name of the parameter
+ * \param coreIndex parameter (core) index
+ */
+ void supportWholeParam(std::string name, C2Param::CoreIndex coreIndex);
+
+ /**
+ * Returns the name of the parameter for an index.
+ */
+ std::string getParamName(C2Param::Index index) const;
+
+ /**
+ * Get list of param indices from field names and values in AMessage object.
+ *
+ * TODO: This should be in the order that they are listed by the component.
+ *
+ * \param params[in] Dict object with field name to value pairs.
+ * \param vec[out] vector to store the indices from |params|.
+ */
+ void getParamIndicesFromMessage(
+ const Dict ¶ms,
+ std::vector<C2Param::Index> *vec /* nonnull */) const;
+
+ /**
+ * Get list of param indices from field names (only) in AMessage object.
+ *
+ * \param params[in] Vector object with field names.
+ * \param vec[out] vector to store the indices from |params|.
+ */
+ void getParamIndicesForKeys(
+ const std::vector<std::string> &keys,
+ std::vector<C2Param::Index> *vec /* nonnull */) const;
+
+ /**
+ * Update C2Param objects from field name and value in AMessage object.
+ *
+ * \param params[in] Dict object with field name to value pairs.
+ * \param vec[in,out] vector of the C2Param objects to be updated.
+ */
+ void updateParamsFromMessage(
+ const Dict ¶ms,
+ std::vector<std::unique_ptr<C2Param>> *vec /* nonnull */) const;
+
+ /**
+ * Get fields from C2Param objects in AMessage object.
+ *
+ * \param params[in] vector of the C2Param objects to be queried
+ * \return a Dict object containing the known parameters
+ */
+ Dict getParams(
+ const std::vector<C2Param*> ¶ms /* nonnull */) const;
+
+ Dict getParams(
+ const std::vector<std::unique_ptr<C2Param>> ¶ms /* nonnull */) const;
+
+ /**
+ * Clear param descriptors in this object.
+ */
+ void clear();
+
+private:
+ struct FieldDesc {
+ std::shared_ptr<C2ParamDescriptor> paramDesc;
+ std::unique_ptr<C2FieldDescriptor> fieldDesc;
+ size_t offset;
+ };
+ std::map<std::string, FieldDesc> mMap;
+ std::map<C2Param::Index, std::string> mParamNames;
+ std::map<std::string, C2Param::CoreIndex> mWholeParams;
+
+ void parseMessageAndDoWork(
+ const Dict ¶ms,
+ std::function<void(const std::string &, const FieldDesc &, const void *, size_t)> work) const;
+
+ C2_DO_NOT_COPY(ReflectedParamUpdater);
+};
+
+} // namespace android
+
+#endif // REFLECTED_PARAM_BUILDER_H_
diff --git a/media/codec2/sfplugin/SkipCutBuffer.cpp b/media/codec2/sfplugin/SkipCutBuffer.cpp
new file mode 100644
index 0000000..5762440
--- /dev/null
+++ b/media/codec2/sfplugin/SkipCutBuffer.cpp
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "SkipCutBuffer"
+#include <utils/Log.h>
+
+#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/MediaBuffer.h>
+#include <media/stagefright/SkipCutBuffer.h>
+
+namespace android {
+
+SkipCutBuffer::SkipCutBuffer(size_t skip, size_t cut, size_t num16BitChannels) {
+
+ mWriteHead = 0;
+ mReadHead = 0;
+ mCapacity = 0;
+ mCutBuffer = nullptr;
+
+ if (num16BitChannels == 0 || num16BitChannels > INT32_MAX / 2) {
+ ALOGW("# channels out of range: %zu, using passthrough instead", num16BitChannels);
+ return;
+ }
+ size_t frameSize = num16BitChannels * 2;
+ if (skip > INT32_MAX / frameSize || cut > INT32_MAX / frameSize
+ || cut * frameSize > INT32_MAX - 4096) {
+ ALOGW("out of range skip/cut: %zu/%zu, using passthrough instead",
+ skip, cut);
+ return;
+ }
+ skip *= frameSize;
+ cut *= frameSize;
+
+ mFrontPadding = mSkip = skip;
+ mBackPadding = cut;
+ mCapacity = cut + 4096;
+ mCutBuffer = new (std::nothrow) char[mCapacity];
+ ALOGV("skipcutbuffer %zu %zu %d", skip, cut, mCapacity);
+}
+
+SkipCutBuffer::~SkipCutBuffer() {
+ delete[] mCutBuffer;
+}
+
+void SkipCutBuffer::submit(MediaBuffer *buffer) {
+ if (mCutBuffer == nullptr) {
+ // passthrough mode
+ return;
+ }
+
+ int32_t offset = buffer->range_offset();
+ int32_t buflen = buffer->range_length();
+
+ // drop the initial data from the buffer if needed
+ if (mFrontPadding > 0) {
+ // still data left to drop
+ int32_t to_drop = (buflen < mFrontPadding) ? buflen : mFrontPadding;
+ offset += to_drop;
+ buflen -= to_drop;
+ buffer->set_range(offset, buflen);
+ mFrontPadding -= to_drop;
+ }
+
+
+ // append data to cutbuffer
+ char *src = ((char*) buffer->data()) + offset;
+ write(src, buflen);
+
+
+ // the mediabuffer is now empty. Fill it from cutbuffer, always leaving
+ // at least mBackPadding bytes in the cutbuffer
+ char *dst = (char*) buffer->data();
+ size_t copied = read(dst, buffer->size());
+ buffer->set_range(0, copied);
+}
+
+template <typename T>
+void SkipCutBuffer::submitInternal(const sp<T>& buffer) {
+ if (mCutBuffer == nullptr) {
+ // passthrough mode
+ return;
+ }
+
+ int32_t offset = buffer->offset();
+ int32_t buflen = buffer->size();
+
+ // drop the initial data from the buffer if needed
+ if (mFrontPadding > 0) {
+ // still data left to drop
+ int32_t to_drop = (buflen < mFrontPadding) ? buflen : mFrontPadding;
+ offset += to_drop;
+ buflen -= to_drop;
+ buffer->setRange(offset, buflen);
+ mFrontPadding -= to_drop;
+ }
+
+
+ // append data to cutbuffer
+ char *src = (char*) buffer->data();
+ write(src, buflen);
+
+
+ // the mediabuffer is now empty. Fill it from cutbuffer, always leaving
+ // at least mBackPadding bytes in the cutbuffer
+ char *dst = (char*) buffer->base();
+ size_t copied = read(dst, buffer->capacity());
+ buffer->setRange(0, copied);
+}
+
+void SkipCutBuffer::submit(const sp<ABuffer>& buffer) {
+ submitInternal(buffer);
+}
+
+void SkipCutBuffer::submit(const sp<MediaCodecBuffer>& buffer) {
+ submitInternal(buffer);
+}
+
+void SkipCutBuffer::clear() {
+ mWriteHead = mReadHead = 0;
+ mFrontPadding = mSkip;
+}
+
+void SkipCutBuffer::write(const char *src, size_t num) {
+ int32_t sizeused = (mWriteHead - mReadHead);
+ if (sizeused < 0) sizeused += mCapacity;
+
+ // Everything must fit. Make sure the buffer is a little larger than needed,
+ // so there is no ambiguity as to whether mWriteHead == mReadHead means buffer
+ // full or empty
+ size_t available = mCapacity - sizeused - 32;
+ if (available < num) {
+ int32_t newcapacity = mCapacity + (num - available);
+ char * newbuffer = new char[newcapacity];
+ memcpy(newbuffer, mCutBuffer, mCapacity);
+ delete [] mCutBuffer;
+ mCapacity = newcapacity;
+ mCutBuffer = newbuffer;
+ ALOGV("reallocated buffer at size %d", newcapacity);
+ }
+
+ size_t copyfirst = (mCapacity - mWriteHead);
+ if (copyfirst > num) copyfirst = num;
+ if (copyfirst) {
+ memcpy(mCutBuffer + mWriteHead, src, copyfirst);
+ num -= copyfirst;
+ src += copyfirst;
+ mWriteHead += copyfirst;
+ CHECK_LE(mWriteHead, mCapacity);
+ if (mWriteHead == mCapacity) mWriteHead = 0;
+ if (num) {
+ memcpy(mCutBuffer, src, num);
+ mWriteHead += num;
+ }
+ }
+}
+
+size_t SkipCutBuffer::read(char *dst, size_t num) {
+ int32_t available = (mWriteHead - mReadHead);
+ if (available < 0) available += mCapacity;
+
+ available -= mBackPadding;
+ if (available <=0) {
+ return 0;
+ }
+ if (available < int32_t(num)) {
+ num = available;
+ }
+
+ size_t copyfirst = (mCapacity - mReadHead);
+ if (copyfirst > num) copyfirst = num;
+ if (copyfirst) {
+ memcpy(dst, mCutBuffer + mReadHead, copyfirst);
+ num -= copyfirst;
+ dst += copyfirst;
+ mReadHead += copyfirst;
+ CHECK_LE(mReadHead, mCapacity);
+ if (mReadHead == mCapacity) mReadHead = 0;
+ if (num) {
+ memcpy(dst, mCutBuffer, num);
+ mReadHead += num;
+ }
+ }
+ return available;
+}
+
+size_t SkipCutBuffer::size() {
+ int32_t available = (mWriteHead - mReadHead);
+ if (available < 0) available += mCapacity;
+ return available;
+}
+
+} // namespace android
diff --git a/media/codec2/sfplugin/SkipCutBuffer.h b/media/codec2/sfplugin/SkipCutBuffer.h
new file mode 100644
index 0000000..0fb5690
--- /dev/null
+++ b/media/codec2/sfplugin/SkipCutBuffer.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SKIP_CUT_BUFFER_H_
+
+#define SKIP_CUT_BUFFER_H_
+
+#include <media/MediaCodecBuffer.h>
+#include <media/stagefright/MediaBuffer.h>
+#include <media/stagefright/foundation/ABuffer.h>
+
+namespace android {
+
+/**
+ * utility class to cut the start and end off a stream of data in MediaBuffers
+ *
+ */
+class SkipCutBuffer: public RefBase {
+ public:
+ // 'skip' is the number of frames to skip from the beginning
+ // 'cut' is the number of frames to cut from the end
+ // 'num16BitChannels' is the number of channels, which are assumed to be 16 bit wide each
+ SkipCutBuffer(size_t skip, size_t cut, size_t num16Channels);
+
+ // Submit one MediaBuffer for skipping and cutting. This may consume all or
+ // some of the data in the buffer, or it may add data to it.
+ // After this, the caller should continue processing the buffer as usual.
+ void submit(MediaBuffer *buffer);
+ void submit(const sp<ABuffer>& buffer); // same as above, but with an ABuffer
+ void submit(const sp<MediaCodecBuffer>& buffer); // same as above, but with an ABuffer
+ void clear();
+ size_t size(); // how many bytes are currently stored in the buffer
+
+ protected:
+ virtual ~SkipCutBuffer();
+
+ private:
+ void write(const char *src, size_t num);
+ size_t read(char *dst, size_t num);
+ template <typename T>
+ void submitInternal(const sp<T>& buffer);
+ int32_t mSkip;
+ int32_t mFrontPadding;
+ int32_t mBackPadding;
+ int32_t mWriteHead;
+ int32_t mReadHead;
+ int32_t mCapacity;
+ char* mCutBuffer;
+ DISALLOW_EVIL_CONSTRUCTORS(SkipCutBuffer);
+};
+
+} // namespace android
+
+#endif // OMX_CODEC_H_
diff --git a/media/codec2/sfplugin/tests/Android.bp b/media/codec2/sfplugin/tests/Android.bp
new file mode 100644
index 0000000..be7f55c
--- /dev/null
+++ b/media/codec2/sfplugin/tests/Android.bp
@@ -0,0 +1,52 @@
+cc_test {
+ name: "ccodec_unit_test",
+
+ srcs: [
+ "ReflectedParamUpdater_test.cpp",
+ ],
+
+ include_dirs: [
+ "frameworks/av/media/codec2/sfplugin",
+ ],
+
+ shared_libs: [
+ "libcodec2",
+ "libsfplugin_ccodec",
+ "libstagefright_foundation",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+}
+
+cc_test {
+ name: "mc_sanity_test",
+
+ srcs: [
+ "MediaCodec_sanity_test.cpp",
+ ],
+
+ include_dirs: [
+ "frameworks/av/media/codec2/sfplugin",
+ ],
+
+ shared_libs: [
+ "libbinder",
+ "libcodec2",
+ "libgui",
+ "libmedia",
+ "libmedia_omx",
+ "libsfplugin_ccodec",
+ "libstagefright",
+ "libstagefright_foundation",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+}
diff --git a/media/codec2/sfplugin/tests/MediaCodec_sanity_test.cpp b/media/codec2/sfplugin/tests/MediaCodec_sanity_test.cpp
new file mode 100644
index 0000000..ba3687b
--- /dev/null
+++ b/media/codec2/sfplugin/tests/MediaCodec_sanity_test.cpp
@@ -0,0 +1,453 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+
+#include <algorithm>
+
+#include <binder/ProcessState.h>
+#include <gtest/gtest.h>
+#include <gui/Surface.h>
+#include <media/ICrypto.h>
+#include <media/MediaCodecBuffer.h>
+#include <media/hardware/VideoAPI.h>
+#include <media/stagefright/MediaCodec.h>
+#include <media/stagefright/MediaCodecConstants.h>
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/AMessage.h>
+
+namespace android {
+
+class MediaCodecSanityTest : public ::testing::Test {
+public:
+ MediaCodecSanityTest()
+ : looper(new ALooper),
+ cfg(new AMessage),
+ ifmt(new AMessage),
+ ofmt(new AMessage) {
+ ProcessState::self()->startThreadPool();
+ looper->start();
+ }
+
+ ~MediaCodecSanityTest() {
+ if (codec != nullptr) {
+ codec->release();
+ }
+ looper->stop();
+ }
+
+ sp<ALooper> looper;
+ sp<MediaCodec> codec;
+ sp<AMessage> cfg;
+ sp<AMessage> ifmt;
+ sp<AMessage> ofmt;
+};
+
+const static size_t kLinearBufferSize = 1048576;
+
+// data for a codec input frame
+struct FrameData {
+ const uint8_t *data;
+ size_t size;
+ template<size_t N>
+ constexpr FrameData(const uint8_t(&data_)[N]) : data(data_), size(N) { }
+};
+
+// one yellow frame of 240x180 (albeit 4:4:4)
+const uint8_t avcStream_A1[] = { // IDR frame
+ 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x0d, 0xac, 0xd9, 0x41, 0x41, 0xfa, 0x10, 0x00, 0x00,
+ 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03, 0x20, 0xf1, 0x42, 0x99, 0x60,
+
+ 0x00, 0x00, 0x00, 0x01, 0x68, 0xeb, 0xe3, 0xcb, 0x22, 0xc0,
+
+ 0x00, 0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0x2b, 0xff, 0xfe, 0xd8, 0xe7, 0xf3, 0x2c, 0xa5, 0x60,
+ 0xca, 0xbb, 0xf1, 0x5c, 0x44, 0x7c, 0x9a, 0xa5, 0xc3, 0xab, 0x2f, 0x77, 0x0a, 0x94, 0x0d, 0x19,
+ 0x43, 0x3b, 0x4f, 0x25, 0xea, 0x66, 0x00, 0x01, 0x24, 0xcd, 0x35, 0x5f, 0xc2, 0x34, 0x89, 0xd1,
+ 0xa5, 0x60, 0x09, 0x98, 0x00, 0x01, 0x1b, 0x0e, 0xcb, 0x0d, 0x04, 0x86, 0x94, 0xe2, 0x32, 0x3c,
+ 0xdd, 0x0f,
+};
+
+FrameData avcStream_A[] __unused = { avcStream_A1 };
+
+// AVC stream of 2 yellow frames (240x180)
+const uint8_t avcStream_B1[] = { // IDR frame
+ 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x0c, 0xac, 0xd9, 0x41, 0x41, 0xfa, 0x10, 0x00, 0x00,
+ 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x02, 0x80, 0xf1, 0x42, 0x99, 0x60,
+
+ 0x00, 0x00, 0x00, 0x01, 0x68, 0xeb, 0xe3, 0xcb, 0x22, 0xc0,
+
+ 0x00, 0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0x33, 0xff, 0xfe, 0xdf, 0x32, 0xf8, 0x14, 0xd6, 0x25,
+ 0xd0, 0x74, 0x42, 0x50, 0x84, 0x6f, 0xf4, 0xc2, 0x5c, 0x76, 0x37, 0x17, 0x72, 0xac, 0x52, 0xfc,
+ 0xd6, 0x1f, 0xd2, 0xd0, 0x60, 0xb2, 0x20, 0x00, 0x10, 0x3d, 0x2a, 0xc0, 0xe4, 0x27, 0xcb, 0xce,
+ 0xea, 0x25, 0x00, 0x81, 0x00, 0x00, 0x0f, 0x40, 0xbc, 0x81, 0x15, 0xc1, 0x65, 0x20, 0x80, 0x81,
+ 0x7a, 0x57, 0x51,
+};
+
+const uint8_t avcStream_B2[] = { // P frame
+ 0x00, 0x00, 0x00, 0x01, 0x41, 0x9a, 0x21, 0x6c, 0x42, 0xbf, 0xfe, 0x38, 0x40, 0x00, 0x0d, 0x48,
+};
+
+FrameData avcStream_B[] = { avcStream_B1, avcStream_B2 };
+
+class MediaCodecInputBufferSizeTest : public MediaCodecSanityTest,
+ public ::testing::WithParamInterface<int32_t> {
+};
+
+TEST_P(MediaCodecInputBufferSizeTest, TestAvcDecoder) {
+ codec = MediaCodec::CreateByComponentName(looper, "c2.android.avc.decoder");
+ cfg->setInt32("width", 320);
+ cfg->setInt32("height", 240);
+ cfg->setString("mime", MIMETYPE_VIDEO_AVC);
+
+ const int32_t InputSize = GetParam();
+ if (InputSize >= 0) {
+ cfg->setInt32("max-input-size", InputSize);
+ }
+
+ EXPECT_EQ(codec->configure(cfg, nullptr, nullptr, 0), OK);
+ EXPECT_EQ(codec->getInputFormat(&ifmt), OK);
+ int32_t maxInputSize;
+ ASSERT_TRUE(ifmt->findInt32("max-input-size", &maxInputSize));
+ if (InputSize > 0) {
+ EXPECT_EQ(maxInputSize, InputSize);
+ } else {
+ EXPECT_GE(maxInputSize, 1 << 20); // 1 MB
+ }
+ EXPECT_EQ(codec->start(), OK);
+ size_t ix;
+ EXPECT_EQ(codec->dequeueInputBuffer(&ix, 1000000), OK);
+ sp<MediaCodecBuffer> buf;
+ EXPECT_EQ(codec->getInputBuffer(ix, &buf), OK);
+ EXPECT_GE(buf->size(), (size_t)maxInputSize);
+ EXPECT_LE(buf->size(), (size_t)maxInputSize + 4096u);
+}
+
+TEST_P(MediaCodecInputBufferSizeTest, TestVideoDecoder) {
+ codec = MediaCodec::CreateByComponentName(looper, "c2.android.vp8.decoder");
+ cfg->setInt32("width", 320);
+ cfg->setInt32("height", 240);
+ cfg->setString("mime", MIMETYPE_VIDEO_VP8);
+
+ const int32_t InputSize = GetParam();
+ if (InputSize >= 0) {
+ cfg->setInt32("max-input-size", InputSize);
+ }
+
+ EXPECT_EQ(codec->configure(cfg, nullptr, nullptr, 0), OK);
+ EXPECT_EQ(codec->getInputFormat(&ifmt), OK);
+ int32_t maxInputSize;
+ ASSERT_TRUE(ifmt->findInt32("max-input-size", &maxInputSize));
+ if (InputSize > 0) {
+ EXPECT_EQ(maxInputSize, InputSize);
+ } else {
+ EXPECT_GE(maxInputSize, 1 << 20); // 1 MB
+ }
+ EXPECT_EQ(codec->start(), OK);
+ size_t ix;
+ EXPECT_EQ(codec->dequeueInputBuffer(&ix, 1000000), OK);
+ sp<MediaCodecBuffer> buf;
+ EXPECT_EQ(codec->getInputBuffer(ix, &buf), OK);
+ EXPECT_GE(buf->size(), (size_t)maxInputSize);
+ EXPECT_LE(buf->size(), (size_t)maxInputSize + 4096u);
+}
+
+TEST_P(MediaCodecInputBufferSizeTest, TestAudioDecoder) {
+ codec = MediaCodec::CreateByComponentName(looper, "c2.android.aac.decoder");
+ cfg->setInt32("sample-rate", 44100);
+ cfg->setInt32("channel-count", 2);
+ cfg->setString("mime", MIMETYPE_AUDIO_AAC);
+
+ const int32_t InputSize = GetParam();
+ if (InputSize >= 0) {
+ cfg->setInt32("max-input-size", InputSize);
+ }
+
+ EXPECT_EQ(codec->configure(cfg, nullptr, nullptr, 0), OK);
+ EXPECT_EQ(codec->getInputFormat(&ifmt), OK);
+ int32_t maxInputSize;
+ if (InputSize > 0) {
+ ASSERT_TRUE(ifmt->findInt32("max-input-size", &maxInputSize));
+ EXPECT_EQ(maxInputSize, InputSize);
+ } else {
+ if (ifmt->findInt32("max-input-size", &maxInputSize)) {
+ EXPECT_EQ(maxInputSize, 1 << 19); // 512 KB
+ }
+ maxInputSize = kLinearBufferSize; // input size is set by channel
+ }
+
+ EXPECT_EQ(codec->start(), OK);
+ size_t ix;
+ EXPECT_EQ(codec->dequeueInputBuffer(&ix, 1000000), OK);
+ sp<MediaCodecBuffer> buf;
+ EXPECT_EQ(codec->getInputBuffer(ix, &buf), OK);
+ EXPECT_GE(buf->size(), (size_t)maxInputSize);
+ EXPECT_LE(buf->size(), (size_t)maxInputSize + 4096u);
+}
+
+INSTANTIATE_TEST_CASE_P(InputSizes, MediaCodecInputBufferSizeTest, ::testing::Values(-1, 1234, 12345678));
+
+TEST_F(MediaCodecSanityTest, TestAvcDecoderHdrStaticInfo) {
+ codec = MediaCodec::CreateByComponentName(looper, "c2.android.avc.decoder");
+ cfg->setInt32("width", 320);
+ cfg->setInt32("height", 240);
+ cfg->setString("mime", MIMETYPE_VIDEO_AVC);
+ HDRStaticInfo info = { .mID = HDRStaticInfo::kType1, .sType1 = {
+ .mR = { .x = 35400, .y = 14600 }, .mG = { .x = 8500, .y = 39850 },
+ .mB = { .x = 6550, .y = 2300 }, .mW = { .x = 15635, .y = 16450 },
+ .mMaxDisplayLuminance = 1000, .mMinDisplayLuminance = 1000,
+ .mMaxContentLightLevel = 1000, .mMaxFrameAverageLightLevel = 120 }
+ };
+ cfg->setBuffer("hdr-static-info", ABuffer::CreateAsCopy(&info, sizeof(info)));
+
+ EXPECT_EQ(codec->configure(cfg, nullptr, nullptr, 0), OK);
+ EXPECT_EQ(codec->getOutputFormat(&ofmt), OK);
+ sp<ABuffer> oinfo;
+ ASSERT_TRUE(ofmt->findBuffer("hdr-static-info", &oinfo));
+ ASSERT_EQ(oinfo->size(), sizeof(info));
+ EXPECT_EQ(memcmp(oinfo->data(), &info, sizeof(info)), 0);
+
+ EXPECT_EQ(codec->start(), OK);
+ // assume we can submit all input before dequeuing output
+ size_t frameIx = 0;
+ size_t ix;
+ sp<MediaCodecBuffer> buf;
+ for (const FrameData &frame : avcStream_B) {
+ EXPECT_EQ(codec->dequeueInputBuffer(&ix, 1000000), OK);
+ EXPECT_EQ(codec->getInputBuffer(ix, &buf), OK);
+ ASSERT_GE(buf->capacity(), frame.size);
+ memcpy(buf->base(), frame.data, frame.size);
+ EXPECT_EQ(buf->setRange(0, frame.size), OK);
+ bool eos = ++frameIx == NELEM(avcStream_B);
+ EXPECT_EQ(codec->queueInputBuffer(ix, 0, frame.size, frameIx * 33333,
+ eos ? BUFFER_FLAG_END_OF_STREAM : 0), OK);
+ }
+
+ size_t offset, size;
+ int64_t ts;
+ uint32_t flags;
+ bool mInfoFormatChangedOk = true;
+ bool mInfoBuffersChangedOk = true;
+ while (true) {
+ status_t err = codec->dequeueOutputBuffer(&ix, &offset, &size, &ts, &flags, 1000000);
+ if (err == INFO_FORMAT_CHANGED && mInfoFormatChangedOk) {
+ mInfoFormatChangedOk = false;
+ } else if (err == INFO_OUTPUT_BUFFERS_CHANGED && mInfoBuffersChangedOk) {
+ mInfoBuffersChangedOk = false;
+ } else {
+ ASSERT_EQ(err, OK);
+ break;
+ }
+ }
+ EXPECT_EQ(codec->getOutputBuffer(ix, &buf), OK);
+ EXPECT_EQ(codec->getOutputFormat(ix, &ofmt), OK);
+ ASSERT_TRUE(ofmt->findBuffer("hdr-static-info", &oinfo));
+ ASSERT_EQ(oinfo->size(), sizeof(info));
+ EXPECT_EQ(memcmp(oinfo->data(), &info, sizeof(info)), 0);
+}
+
+TEST_F(MediaCodecSanityTest, TestVideoDecoderHdrStaticInfo) {
+ codec = MediaCodec::CreateByComponentName(looper, "c2.android.mpeg4.decoder");
+ cfg->setInt32("width", 320);
+ cfg->setInt32("height", 240);
+ cfg->setString("mime", MIMETYPE_VIDEO_MPEG4);
+ HDRStaticInfo info = { .mID = HDRStaticInfo::kType1, .sType1 = {
+ .mR = { .x = 35400, .y = 14600 }, .mG = { .x = 8500, .y = 39850 },
+ .mB = { .x = 6550, .y = 2300 }, .mW = { .x = 15635, .y = 16450 },
+ .mMaxDisplayLuminance = 1000, .mMinDisplayLuminance = 1000,
+ .mMaxContentLightLevel = 1000, .mMaxFrameAverageLightLevel = 120 }
+ };
+ cfg->setBuffer("hdr-static-info", ABuffer::CreateAsCopy(&info, sizeof(info)));
+
+ EXPECT_EQ(codec->configure(cfg, nullptr, nullptr, 0), OK);
+ EXPECT_EQ(codec->getOutputFormat(&ofmt), OK);
+ sp<ABuffer> oinfo;
+ ASSERT_TRUE(ofmt->findBuffer("hdr-static-info", &oinfo));
+ ASSERT_EQ(oinfo->size(), sizeof(info));
+ EXPECT_EQ(memcmp(oinfo->data(), &info, sizeof(info)), 0);
+}
+
+class MediaCodecByteBufferTest : public MediaCodecSanityTest,
+ public ::testing::WithParamInterface<int32_t> {
+};
+
+TEST_P(MediaCodecByteBufferTest, TestVideoDecoder420Planar) {
+ codec = MediaCodec::CreateByComponentName(looper, "c2.android.avc.decoder");
+// codec = MediaCodec::CreateByComponentName(looper, "OMX.google.h264.decoder");
+ cfg->setInt32("width", 320);
+ cfg->setInt32("height", 240);
+ cfg->setString("mime", MIMETYPE_VIDEO_AVC);
+ const int32_t Color = GetParam();
+ if (Color >= 0) {
+ cfg->setInt32("color-format", Color);
+ }
+ int32_t xcolor = Color == -1 ? COLOR_FormatYUV420Planar : Color;
+
+ EXPECT_EQ(codec->configure(cfg, nullptr, nullptr, 0), OK);
+ EXPECT_EQ(codec->getOutputFormat(&ofmt), OK);
+ int32_t ocolor = -1;
+ EXPECT_TRUE(ofmt->findInt32("color-format", &ocolor));
+ EXPECT_EQ(ocolor, xcolor);
+
+ EXPECT_EQ(codec->start(), OK);
+ // assume we can submit all input before dequeuing output
+ size_t frameIx = 0;
+ size_t ix;
+ sp<MediaCodecBuffer> buf;
+ for (const FrameData &frame : avcStream_A) {
+ EXPECT_EQ(codec->dequeueInputBuffer(&ix, 1000000), OK);
+ EXPECT_EQ(codec->getInputBuffer(ix, &buf), OK);
+ ASSERT_GE(buf->capacity(), frame.size);
+ memcpy(buf->base(), frame.data, frame.size);
+ EXPECT_EQ(buf->setRange(0, frame.size), OK);
+ bool eos = ++frameIx == NELEM(avcStream_A);
+ EXPECT_EQ(codec->queueInputBuffer(ix, 0, frame.size, frameIx * 33333,
+ eos ? BUFFER_FLAG_END_OF_STREAM : 0), OK);
+ }
+
+ size_t offset, size;
+ int64_t ts;
+ uint32_t flags;
+ bool mInfoFormatChangedOk = true;
+ bool mInfoBuffersChangedOk = true;
+ while (true) {
+ status_t err = codec->dequeueOutputBuffer(&ix, &offset, &size, &ts, &flags, 1000000);
+ if (err == INFO_FORMAT_CHANGED && mInfoFormatChangedOk) {
+ mInfoFormatChangedOk = false;
+ } else if (err == INFO_OUTPUT_BUFFERS_CHANGED && mInfoBuffersChangedOk) {
+ mInfoBuffersChangedOk = false;
+ } else {
+ ASSERT_EQ(err, OK);
+ break;
+ }
+ }
+ EXPECT_EQ(codec->getOutputBuffer(ix, &buf), OK);
+ EXPECT_EQ(codec->getOutputFormat(ix, &ofmt), OK);
+ ASSERT_TRUE(ofmt->findInt32("color-format", &ocolor));
+ EXPECT_EQ(ocolor, xcolor) << ofmt->debugString(8).c_str() << buf->meta()->debugString(8).c_str();
+ // expect an image-data in both format and meta
+ sp<ABuffer> imgBuf, imgBuf2;
+ ASSERT_TRUE(ofmt->findBuffer("image-data", &imgBuf));
+ ASSERT_TRUE(buf->meta()->findBuffer("image-data", &imgBuf2));
+ EXPECT_EQ(imgBuf->size(), sizeof(MediaImage2));
+ ASSERT_EQ(imgBuf->size(), imgBuf2->size());
+ EXPECT_EQ(0, memcmp(imgBuf->data(), imgBuf2->data(), imgBuf->size()));
+ MediaImage2 *img = (MediaImage2*)imgBuf->data();
+ EXPECT_EQ(img->mType, img->MEDIA_IMAGE_TYPE_YUV);
+ EXPECT_EQ(img->mNumPlanes, 3u);
+ EXPECT_EQ(img->mWidth, 320u);
+ EXPECT_EQ(img->mHeight, 240u);
+ EXPECT_EQ(img->mBitDepth, 8u);
+ EXPECT_EQ(img->mBitDepthAllocated, 8u);
+
+ // read strides from format
+ int32_t stride, vstride;
+ ofmt->findInt32("stride", &stride) || ofmt->findInt32("width", &stride);
+ ofmt->findInt32("slice-height", &vstride) || ofmt->findInt32("height", &vstride);
+
+ EXPECT_EQ(img->mPlane[img->Y].mHorizSubsampling, 1u);
+ EXPECT_EQ(img->mPlane[img->Y].mVertSubsampling, 1u);
+ EXPECT_EQ(img->mPlane[img->U].mHorizSubsampling, 2u);
+ EXPECT_EQ(img->mPlane[img->U].mVertSubsampling, 2u);
+ EXPECT_EQ(img->mPlane[img->V].mHorizSubsampling, 2u);
+ EXPECT_EQ(img->mPlane[img->V].mVertSubsampling, 2u);
+
+ switch (xcolor) {
+ // defined formats
+ case COLOR_FormatYUV420Planar:
+ case COLOR_FormatYUV420PackedPlanar:
+ EXPECT_EQ(img->mPlane[img->Y].mOffset, 0u);
+ EXPECT_EQ(img->mPlane[img->Y].mColInc, 1);
+ EXPECT_EQ(img->mPlane[img->Y].mRowInc, stride);
+
+ EXPECT_EQ(img->mPlane[img->U].mOffset, (uint32_t)(stride * vstride));
+ EXPECT_EQ(img->mPlane[img->U].mColInc, 1);
+ EXPECT_EQ(img->mPlane[img->U].mRowInc, stride / 2);
+
+ EXPECT_EQ(img->mPlane[img->V].mOffset, (uint32_t)(stride * vstride * 5 / 4));
+ EXPECT_EQ(img->mPlane[img->V].mColInc, 1);
+ EXPECT_EQ(img->mPlane[img->V].mRowInc, stride / 2);
+
+ EXPECT_GE(size, (size_t)(stride * vstride * 5 / 4 + stride / 2 * 119 + 160));
+ EXPECT_LE(size, (size_t)(stride * vstride * 3 / 2));
+ break;
+
+ case COLOR_FormatYUV420SemiPlanar:
+ case COLOR_FormatYUV420PackedSemiPlanar:
+ EXPECT_EQ(img->mPlane[img->Y].mOffset, 0u);
+ EXPECT_EQ(img->mPlane[img->Y].mColInc, 1);
+ EXPECT_EQ(img->mPlane[img->Y].mRowInc, stride);
+
+ EXPECT_EQ(img->mPlane[img->U].mOffset, (uint32_t)(stride * vstride));
+ EXPECT_EQ(img->mPlane[img->U].mColInc, 2);
+ EXPECT_EQ(img->mPlane[img->U].mRowInc, stride);
+
+ EXPECT_EQ(img->mPlane[img->V].mOffset, (uint32_t)(stride * vstride + 1));
+ EXPECT_EQ(img->mPlane[img->V].mColInc, 2);
+ EXPECT_EQ(img->mPlane[img->V].mRowInc, stride);
+
+ EXPECT_GE(size, (size_t)(stride * vstride + stride * 119 + 320));
+ EXPECT_LE(size, (size_t)(stride * vstride * 3 / 2));
+ break;
+
+ case COLOR_FormatYUV420Flexible:
+ // anything goes, but stride should match Y plane
+ EXPECT_EQ(img->mPlane[img->Y].mRowInc, stride);
+
+ EXPECT_GE(size,
+ std::max({
+ img->mPlane[img->Y].mOffset + 239 * img->mPlane[img->Y].mRowInc
+ + 319 * img->mPlane[img->Y].mColInc + 1,
+ img->mPlane[img->U].mOffset + 119 * img->mPlane[img->U].mRowInc
+ + 159 * img->mPlane[img->U].mColInc + 1,
+ img->mPlane[img->V].mOffset + 119 * img->mPlane[img->V].mRowInc
+ + 159 * img->mPlane[img->V].mColInc + 1 }));
+ break;
+
+ default:
+ break;
+ }
+
+ // validate all pixels
+#if 0
+ fprintf(stderr, "MediaImage { F(%ux%u) @%u+%d+%d @%u+%d+%d @%u+%d+%d }\n",
+ img->mWidth, img->mHeight,
+ img->mPlane[0].mOffset, img->mPlane[0].mColInc, img->mPlane[0].mRowInc,
+ img->mPlane[1].mOffset, img->mPlane[1].mColInc, img->mPlane[1].mRowInc,
+ img->mPlane[2].mOffset, img->mPlane[2].mColInc, img->mPlane[2].mRowInc);
+#endif
+ for (ix = 0; ix < 3; ++ix) {
+ const static uint8_t expected[] = { 210, 16, 146 };
+ for (uint32_t y = 0; y < img->mHeight / img->mPlane[ix].mVertSubsampling ; ++y) {
+ for (uint32_t x = 0; x < img->mWidth / img->mPlane[ix].mHorizSubsampling; ++x) {
+ uint8_t val = buf->data()[img->mPlane[ix].mOffset + img->mPlane[ix].mColInc * x
+ + img->mPlane[ix].mRowInc * y];
+ ASSERT_EQ(val, expected[ix]) << "incorrect value for plane "
+ << ix << " at x=" << x << ", y=" << y;
+ }
+ }
+ }
+}
+
+INSTANTIATE_TEST_CASE_P(InputSizes, MediaCodecByteBufferTest, ::testing::Values(
+ -1,
+ COLOR_FormatYUV420Planar,
+ COLOR_FormatYUV420SemiPlanar,
+ COLOR_FormatYUV420PackedPlanar,
+ COLOR_FormatYUV420PackedSemiPlanar,
+ COLOR_FormatYUV420Flexible));
+
+} // namespace android
diff --git a/media/codec2/sfplugin/tests/ReflectedParamUpdater_test.cpp b/media/codec2/sfplugin/tests/ReflectedParamUpdater_test.cpp
new file mode 100644
index 0000000..c7db0e3
--- /dev/null
+++ b/media/codec2/sfplugin/tests/ReflectedParamUpdater_test.cpp
@@ -0,0 +1,352 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define __C2_GENERATE_GLOBAL_VARS__
+
+#include <set>
+
+#include <gtest/gtest.h>
+
+#include <C2ParamDef.h>
+
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/hexdump.h>
+#include <ReflectedParamUpdater.h>
+
+namespace android {
+
+namespace {
+
+enum {
+ kParamIndexTestStart = 0x1000,
+ kParamIndexInt,
+ kParamIndexString,
+ kParamIndexComposite,
+ kParamIndexFlexString,
+
+ kParamIndexLong = C2Param::TYPE_INDEX_VENDOR_START,
+};
+
+typedef C2GlobalParam<C2Info, C2Int32Value, kParamIndexInt> C2IntInfo;
+typedef C2GlobalParam<C2Info, C2Int64Value, kParamIndexLong> C2LongInfo;
+
+struct C2FixedSizeStringStruct {
+ char value[12];
+
+ DEFINE_AND_DESCRIBE_BASE_C2STRUCT(FixedSizeString)
+ C2FIELD(value, "value")
+};
+typedef C2GlobalParam<C2Info, C2FixedSizeStringStruct, kParamIndexString> C2StringInfo;
+
+struct C2CompositeStruct {
+ int32_t i32;
+ uint64_t u64;
+ char str[12];
+ uint8_t blob[8];
+ uint8_t flexBlob[];
+
+ C2CompositeStruct() = default;
+
+ DEFINE_AND_DESCRIBE_BASE_FLEX_C2STRUCT(Composite, flexBlob)
+ C2FIELD(i32, "i32")
+ C2FIELD(u64, "u64")
+ C2FIELD(str, "str")
+ C2FIELD(blob, "blob")
+ C2FIELD(flexBlob, "flex-blob")
+};
+static_assert(C2CompositeStruct::FLEX_SIZE == 1, "");
+static_assert(_C2FlexHelper<C2CompositeStruct>::FLEX_SIZE == 1, "");
+typedef C2GlobalParam<C2Info, C2CompositeStruct, kParamIndexComposite> C2CompositeInfo;
+
+typedef C2GlobalParam<C2Info, C2StringValue, kParamIndexFlexString> C2FlexStringInfo;
+
+#define SUPPORTED_TYPES \
+ C2IntInfo, \
+ C2LongInfo, \
+ C2StringInfo, \
+ C2CompositeInfo, \
+ C2FlexStringInfo
+
+template<typename... TYPES> struct describe_impl;
+template<typename T, typename... TYPES> struct describe_impl<T, TYPES...> {
+ static std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex index) {
+ if (index == T::CORE_INDEX) {
+ return std::make_unique<C2StructDescriptor>(T::CORE_INDEX, T::FieldList());
+ } else {
+ return describe_impl<TYPES...>::describe(index);
+ }
+ }
+};
+
+template<> struct describe_impl<> {
+ static std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex) {
+ return nullptr;
+ }
+};
+
+template<typename T> const char *GetName() { return nullptr; }
+template<> const char *GetName<C2IntInfo>() { return "int"; }
+template<> const char *GetName<C2LongInfo>() { return "long"; }
+template<> const char *GetName<C2StringInfo>() { return "string"; }
+template<> const char *GetName<C2CompositeInfo>() { return "composite"; }
+template<> const char *GetName<C2FlexStringInfo>() { return "flex-string"; }
+
+template<typename... TYPES> struct fill_descriptors_impl;
+template<typename T, typename... TYPES> struct fill_descriptors_impl<T, TYPES...> {
+ static void fill(std::vector<std::shared_ptr<C2ParamDescriptor>> *vec) {
+ fill_descriptors_impl<TYPES...>::fill(vec);
+ vec->push_back(std::make_shared<C2ParamDescriptor>(
+ T::PARAM_TYPE, C2ParamDescriptor::IS_PERSISTENT, GetName<T>()));
+ }
+};
+
+template<> struct fill_descriptors_impl<> {
+ static void fill(std::vector<std::shared_ptr<C2ParamDescriptor>> *) {}
+};
+
+template<typename T> T *CastParam(const std::unique_ptr<C2Param> ¶m) {
+ return (T *)param.get();
+}
+
+class ParamReflector : public C2ParamReflector {
+public:
+ ParamReflector() = default;
+ ~ParamReflector() override = default;
+
+ std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex paramIndex) const override {
+ return describe_impl<SUPPORTED_TYPES>::describe(paramIndex);
+ }
+};
+
+} // namespace
+
+class ReflectedParamUpdaterTest : public ::testing::Test {
+public:
+ ReflectedParamUpdaterTest() : mReflector(new ParamReflector) {
+ fill_descriptors_impl<SUPPORTED_TYPES>::fill(&mDescriptors);
+ }
+
+ std::shared_ptr<C2ParamReflector> mReflector;
+ std::vector<std::shared_ptr<C2ParamDescriptor>> mDescriptors;
+};
+
+TEST_F(ReflectedParamUpdaterTest, SingleValueTest) {
+ ReflectedParamUpdater updater;
+
+ ReflectedParamUpdater::Dict msg;
+ msg.emplace("int.value", int32_t(12));
+ msg.emplace("vendor.long.value", int64_t(34));
+
+ updater.addParamDesc(mReflector, mDescriptors);
+
+ std::vector<C2Param::Index> indices;
+ updater.getParamIndicesFromMessage(msg, &indices);
+ EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2IntInfo::PARAM_TYPE; }));
+ EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2LongInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2StringInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2CompositeInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2FlexStringInfo::PARAM_TYPE; }));
+
+ std::vector<std::unique_ptr<C2Param>> params;
+ params.emplace_back(new C2IntInfo);
+ params.emplace_back(new C2LongInfo);
+ EXPECT_EQ(0, CastParam<C2IntInfo>(params[0])->value);
+ EXPECT_EQ(0, CastParam<C2LongInfo>(params[1])->value);
+
+ updater.updateParamsFromMessage(msg, ¶ms);
+ EXPECT_EQ(12, CastParam<C2IntInfo>(params[0])->value);
+ EXPECT_EQ(34, CastParam<C2LongInfo>(params[1])->value);
+
+ C2Value c2Value;
+ int32_t int32Value = 0;
+ int64_t int64Value = 0;
+ msg = updater.getParams(params);
+ ASSERT_EQ(1u, msg.count("int.value"));
+ EXPECT_EQ(true, msg["int.value"].find(&c2Value));
+ EXPECT_EQ(true, c2Value.get(&int32Value));
+ EXPECT_EQ(12, int32Value);
+
+ ASSERT_EQ(1u, msg.count("vendor.long.value"));
+ EXPECT_EQ(true, msg["vendor.long.value"].find(&c2Value));
+ EXPECT_EQ(true, c2Value.get(&int64Value));
+ EXPECT_EQ(34, int64Value);
+}
+
+TEST_F(ReflectedParamUpdaterTest, StringTest) {
+ ReflectedParamUpdater updater;
+
+ ReflectedParamUpdater::Dict msg;
+ msg.emplace("string.value", AString("56"));
+ msg.emplace("flex-string.value", AString("Some string"));
+ updater.addParamDesc(mReflector, mDescriptors);
+
+ std::vector<C2Param::Index> indices;
+ updater.getParamIndicesFromMessage(msg, &indices);
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2IntInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2LongInfo::PARAM_TYPE; }));
+ EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2StringInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2CompositeInfo::PARAM_TYPE; }));
+ EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2FlexStringInfo::PARAM_TYPE; }));
+
+ std::vector<std::unique_ptr<C2Param>> params;
+ params.emplace_back(new C2StringInfo);
+ EXPECT_EQ(0, CastParam<C2StringInfo>(params[0])->value[0]);
+ params.emplace_back(C2FlexStringInfo::AllocUnique(0));
+ EXPECT_EQ(0u, CastParam<C2FlexStringInfo>(params[1])->flexCount());
+ char *flexStringData = &CastParam<C2FlexStringInfo>(params[1])->m.value[0];
+
+ updater.updateParamsFromMessage(msg, ¶ms);
+ EXPECT_STREQ("56", CastParam<C2StringInfo>(params[0])->value);
+ EXPECT_EQ(12u, CastParam<C2FlexStringInfo>(params[0])->flexCount());
+ EXPECT_STREQ("Some string", CastParam<C2FlexStringInfo>(params[1])->m.value);
+ EXPECT_NE(flexStringData, &CastParam<C2FlexStringInfo>(params[1])->m.value[0]);
+ flexStringData = &CastParam<C2FlexStringInfo>(params[1])->m.value[0];
+
+ // verify truncation and in-place update
+ msg["string.value"] = ReflectedParamUpdater::Value(AString("1234567890ABCDE"));
+ msg["flex-string.value"] = ReflectedParamUpdater::Value(AString("abc"));
+ updater.updateParamsFromMessage(msg, ¶ms);
+ EXPECT_STREQ("1234567890A", CastParam<C2StringInfo>(params[0])->value);
+ EXPECT_EQ(4u, CastParam<C2FlexStringInfo>(params[1])->flexCount());
+ EXPECT_STREQ("abc", CastParam<C2FlexStringInfo>(params[1])->m.value);
+ EXPECT_EQ(flexStringData, &CastParam<C2FlexStringInfo>(params[1])->m.value[0]);
+
+ AString strValue;
+ msg = updater.getParams(params);
+ ASSERT_EQ(1u, msg.count("string.value"));
+ EXPECT_EQ(true, msg["string.value"].find(&strValue));
+ EXPECT_STREQ("1234567890A", strValue.c_str());
+
+ ASSERT_EQ(1u, msg.count("flex-string.value"));
+ EXPECT_EQ(true, msg["flex-string.value"].find(&strValue));
+ EXPECT_STREQ("abc", strValue.c_str());
+}
+
+TEST_F(ReflectedParamUpdaterTest, CompositeTest) {
+ ReflectedParamUpdater updater;
+
+ ReflectedParamUpdater::Dict msg;
+ msg.emplace("composite.i32", int32_t(78));
+ msg.emplace("composite.u64", int64_t(910));
+ msg.emplace("composite.str", AString("1112"));
+ msg.emplace("composite.blob", ABuffer::CreateAsCopy("buffer08", 8));
+ msg.emplace("composite.flex-blob", ABuffer::CreateAsCopy("flex-buffer-14", 14));
+
+ updater.addParamDesc(mReflector, mDescriptors);
+
+ std::vector<C2Param::Index> indices;
+ updater.getParamIndicesFromMessage(msg, &indices);
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2IntInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2LongInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2StringInfo::PARAM_TYPE; }));
+ EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2CompositeInfo::PARAM_TYPE; }));
+
+ std::vector<std::unique_ptr<C2Param>> params;
+ params.emplace_back(C2CompositeInfo::AllocUnique(0));
+ EXPECT_EQ(0, CastParam<C2CompositeInfo>(params[0])->m.i32);
+ EXPECT_EQ(0u, CastParam<C2CompositeInfo>(params[0])->m.u64);
+ EXPECT_EQ(0, CastParam<C2CompositeInfo>(params[0])->m.str[0]);
+ EXPECT_EQ(0, memcmp("\0\0\0\0\0\0\0\0", CastParam<C2CompositeInfo>(params[0])->m.blob, 8));
+ EXPECT_EQ(0u, CastParam<C2CompositeInfo>(params[0])->flexCount());
+ uint8_t *flexBlobData = &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0];
+
+ updater.updateParamsFromMessage(msg, ¶ms);
+ EXPECT_EQ(78, CastParam<C2CompositeInfo>(params[0])->m.i32);
+ EXPECT_EQ(910u, CastParam<C2CompositeInfo>(params[0])->m.u64);
+ EXPECT_STREQ("1112", CastParam<C2CompositeInfo>(params[0])->m.str);
+ EXPECT_EQ(0, memcmp("buffer08", CastParam<C2CompositeInfo>(params[0])->m.blob, 8));
+ AString hex;
+ hexdump(CastParam<C2CompositeInfo>(params[0])->m.blob, 8, 0, &hex);
+ printf("%s\n", hex.c_str());
+ ASSERT_EQ(14u, CastParam<C2CompositeInfo>(params[0])->flexCount());
+ EXPECT_EQ(0, memcmp("flex-buffer-14", CastParam<C2CompositeInfo>(params[0])->m.flexBlob, 14));
+ EXPECT_NE(flexBlobData, &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0]);
+ flexBlobData = &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0];
+
+ // test setting and zero extending shorter blob than allowed
+ msg.clear();
+ msg.emplace("composite.blob", ABuffer::CreateAsCopy("buf05", 5));
+ updater.updateParamsFromMessage(msg, ¶ms);
+ EXPECT_EQ(0, memcmp("buf05\0\0\0", CastParam<C2CompositeInfo>(params[0])->m.blob, 8));
+ ASSERT_EQ(14u, CastParam<C2CompositeInfo>(params[0])->flexCount());
+ EXPECT_EQ(0, memcmp("flex-buffer-14", CastParam<C2CompositeInfo>(params[0])->m.flexBlob, 14));
+ EXPECT_EQ(flexBlobData, &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0]);
+
+ // test setting and trimming larger blob than allowed
+ msg.clear();
+ msg.emplace("composite.blob", ABuffer::CreateAsCopy("ReallyLongBuffer", 16));
+ updater.updateParamsFromMessage(msg, ¶ms);
+ EXPECT_EQ(0, memcmp("ReallyLo", CastParam<C2CompositeInfo>(params[0])->m.blob, 8));
+ ASSERT_EQ(14u, CastParam<C2CompositeInfo>(params[0])->flexCount());
+ EXPECT_EQ(0, memcmp("flex-buffer-14", CastParam<C2CompositeInfo>(params[0])->m.flexBlob, 14));
+ EXPECT_EQ(flexBlobData, &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0]);
+
+ // test trimming flex blob in-place
+ msg.clear();
+ msg.emplace("composite.flex-blob", ABuffer::CreateAsCopy("buf05", 5));
+ updater.updateParamsFromMessage(msg, ¶ms);
+ ASSERT_EQ(5u, CastParam<C2CompositeInfo>(params[0])->flexCount());
+ EXPECT_EQ(0, memcmp("buf05", CastParam<C2CompositeInfo>(params[0])->m.flexBlob, 5));
+ EXPECT_EQ(flexBlobData, &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0]);
+}
+
+TEST_F(ReflectedParamUpdaterTest, CompositePartialTest) {
+ ReflectedParamUpdater updater;
+
+ ReflectedParamUpdater::Dict msg;
+ msg.emplace("composite.i32", C2Value(1314));
+ msg.emplace("composite.str", AString("1516"));
+
+ updater.addParamDesc(mReflector, mDescriptors);
+
+ std::vector<C2Param::Index> indices;
+ updater.getParamIndicesFromMessage(msg, &indices);
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2IntInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2LongInfo::PARAM_TYPE; }));
+ EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2StringInfo::PARAM_TYPE; }));
+ EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
+ [](const auto &value) { return (uint32_t)value == C2CompositeInfo::PARAM_TYPE; }));
+
+ std::vector<std::unique_ptr<C2Param>> params;
+ params.emplace_back(C2CompositeInfo::AllocUnique(12u));
+ EXPECT_EQ(0, CastParam<C2CompositeInfo>(params[0])->m.i32);
+ EXPECT_EQ(0u, CastParam<C2CompositeInfo>(params[0])->m.u64);
+ EXPECT_EQ(0, CastParam<C2CompositeInfo>(params[0])->m.str[0]);
+
+ updater.updateParamsFromMessage(msg, ¶ms);
+ EXPECT_EQ(1314, CastParam<C2CompositeInfo>(params[0])->m.i32);
+ EXPECT_EQ(0u, CastParam<C2CompositeInfo>(params[0])->m.u64);
+ EXPECT_STREQ("1516", CastParam<C2CompositeInfo>(params[0])->m.str);
+}
+
+} // namespace android
diff --git a/media/codec2/sfplugin/utils/Android.bp b/media/codec2/sfplugin/utils/Android.bp
new file mode 100644
index 0000000..bd4983c
--- /dev/null
+++ b/media/codec2/sfplugin/utils/Android.bp
@@ -0,0 +1,39 @@
+cc_library_shared {
+ name: "libsfplugin_ccodec_utils",
+ vendor_available: true,
+
+ srcs: [
+ "Codec2BufferUtils.cpp",
+ "Codec2Mapper.cpp",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+
+ export_include_dirs: [
+ ".",
+ ],
+
+ shared_libs: [
+ "libbase",
+ "libcodec2",
+ "libcodec2_vndk",
+ "libcutils",
+ "liblog",
+ "libstagefright_foundation",
+ "libutils",
+ ],
+
+ sanitize: {
+ cfi: true,
+ misc_undefined: [
+ "unsigned-integer-overflow",
+ "signed-integer-overflow",
+ ],
+ diag: {
+ cfi: true,
+ },
+ },
+}
diff --git a/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp b/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
new file mode 100644
index 0000000..b7519da
--- /dev/null
+++ b/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
@@ -0,0 +1,400 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2BufferUtils"
+#include <utils/Log.h>
+
+#include <list>
+#include <mutex>
+
+#include <media/hardware/HardwareAPI.h>
+#include <media/stagefright/foundation/AUtils.h>
+
+#include <C2Debug.h>
+
+#include "Codec2BufferUtils.h"
+
+namespace android {
+
+namespace {
+
+/**
+ * A flippable, optimizable memcpy. Constructs such as (from ? src : dst) do not work as the results are
+ * always const.
+ */
+template<bool ToA, size_t S>
+struct MemCopier {
+ template<typename A, typename B>
+ inline static void copy(A *a, const B *b, size_t size) {
+ __builtin_memcpy(a, b, size);
+ }
+};
+
+template<size_t S>
+struct MemCopier<false, S> {
+ template<typename A, typename B>
+ inline static void copy(const A *a, B *b, size_t size) {
+ MemCopier<true, S>::copy(b, a, size);
+ }
+};
+
+/**
+ * Copies between a MediaImage and a graphic view.
+ *
+ * \param ToMediaImage whether to copy to (or from) the MediaImage
+ * \param view graphic view (could be ConstGraphicView or GraphicView depending on direction)
+ * \param img MediaImage data
+ * \param imgBase base of MediaImage (could be const uint8_t* or uint8_t* depending on direction)
+ */
+template<bool ToMediaImage, typename View, typename ImagePixel>
+static status_t _ImageCopy(View &view, const MediaImage2 *img, ImagePixel *imgBase) {
+ // TODO: more efficient copying --- e.g. one row at a time, copying
+ // interleaved planes together, etc.
+ const C2PlanarLayout &layout = view.layout();
+ const size_t bpp = divUp(img->mBitDepthAllocated, 8u);
+ if (view.width() != img->mWidth
+ || view.height() != img->mHeight) {
+ return BAD_VALUE;
+ }
+ for (uint32_t i = 0; i < layout.numPlanes; ++i) {
+ typename std::conditional<ToMediaImage, uint8_t, const uint8_t>::type *imgRow =
+ imgBase + img->mPlane[i].mOffset;
+ typename std::conditional<ToMediaImage, const uint8_t, uint8_t>::type *viewRow =
+ viewRow = view.data()[i];
+ const C2PlaneInfo &plane = layout.planes[i];
+ if (plane.colSampling != img->mPlane[i].mHorizSubsampling
+ || plane.rowSampling != img->mPlane[i].mVertSubsampling
+ || plane.allocatedDepth != img->mBitDepthAllocated
+ || plane.allocatedDepth < plane.bitDepth
+ // MediaImage only supports MSB values
+ || plane.rightShift != plane.allocatedDepth - plane.bitDepth
+ || (bpp > 1 && plane.endianness != plane.NATIVE)) {
+ return BAD_VALUE;
+ }
+
+ uint32_t planeW = img->mWidth / plane.colSampling;
+ uint32_t planeH = img->mHeight / plane.rowSampling;
+ for (uint32_t row = 0; row < planeH; ++row) {
+ decltype(imgRow) imgPtr = imgRow;
+ decltype(viewRow) viewPtr = viewRow;
+ for (uint32_t col = 0; col < planeW; ++col) {
+ MemCopier<ToMediaImage, 0>::copy(imgPtr, viewPtr, bpp);
+ imgPtr += img->mPlane[i].mColInc;
+ viewPtr += plane.colInc;
+ }
+ imgRow += img->mPlane[i].mRowInc;
+ viewRow += plane.rowInc;
+ }
+ }
+ return OK;
+}
+
+} // namespace
+
+status_t ImageCopy(uint8_t *imgBase, const MediaImage2 *img, const C2GraphicView &view) {
+ return _ImageCopy<true>(view, img, imgBase);
+}
+
+status_t ImageCopy(C2GraphicView &view, const uint8_t *imgBase, const MediaImage2 *img) {
+ return _ImageCopy<false>(view, img, imgBase);
+}
+
+bool IsYUV420(const C2GraphicView &view) {
+ const C2PlanarLayout &layout = view.layout();
+ return (layout.numPlanes == 3
+ && layout.type == C2PlanarLayout::TYPE_YUV
+ && layout.planes[layout.PLANE_Y].channel == C2PlaneInfo::CHANNEL_Y
+ && layout.planes[layout.PLANE_Y].allocatedDepth == 8
+ && layout.planes[layout.PLANE_Y].bitDepth == 8
+ && layout.planes[layout.PLANE_Y].rightShift == 0
+ && layout.planes[layout.PLANE_Y].colSampling == 1
+ && layout.planes[layout.PLANE_Y].rowSampling == 1
+ && layout.planes[layout.PLANE_U].channel == C2PlaneInfo::CHANNEL_CB
+ && layout.planes[layout.PLANE_U].allocatedDepth == 8
+ && layout.planes[layout.PLANE_U].bitDepth == 8
+ && layout.planes[layout.PLANE_U].rightShift == 0
+ && layout.planes[layout.PLANE_U].colSampling == 2
+ && layout.planes[layout.PLANE_U].rowSampling == 2
+ && layout.planes[layout.PLANE_V].channel == C2PlaneInfo::CHANNEL_CR
+ && layout.planes[layout.PLANE_V].allocatedDepth == 8
+ && layout.planes[layout.PLANE_V].bitDepth == 8
+ && layout.planes[layout.PLANE_V].rightShift == 0
+ && layout.planes[layout.PLANE_V].colSampling == 2
+ && layout.planes[layout.PLANE_V].rowSampling == 2);
+}
+
+MediaImage2 CreateYUV420PlanarMediaImage2(
+ uint32_t width, uint32_t height, uint32_t stride, uint32_t vstride) {
+ return MediaImage2 {
+ .mType = MediaImage2::MEDIA_IMAGE_TYPE_YUV,
+ .mNumPlanes = 3,
+ .mWidth = width,
+ .mHeight = height,
+ .mBitDepth = 8,
+ .mBitDepthAllocated = 8,
+ .mPlane = {
+ {
+ .mOffset = 0,
+ .mColInc = 1,
+ .mRowInc = (int32_t)stride,
+ .mHorizSubsampling = 1,
+ .mVertSubsampling = 1,
+ },
+ {
+ .mOffset = stride * vstride,
+ .mColInc = 1,
+ .mRowInc = (int32_t)stride / 2,
+ .mHorizSubsampling = 2,
+ .mVertSubsampling = 2,
+ },
+ {
+ .mOffset = stride * vstride * 5 / 4,
+ .mColInc = 1,
+ .mRowInc = (int32_t)stride / 2,
+ .mHorizSubsampling = 2,
+ .mVertSubsampling = 2,
+ }
+ },
+ };
+}
+
+MediaImage2 CreateYUV420SemiPlanarMediaImage2(
+ uint32_t width, uint32_t height, uint32_t stride, uint32_t vstride) {
+ return MediaImage2 {
+ .mType = MediaImage2::MEDIA_IMAGE_TYPE_YUV,
+ .mNumPlanes = 3,
+ .mWidth = width,
+ .mHeight = height,
+ .mBitDepth = 8,
+ .mBitDepthAllocated = 8,
+ .mPlane = {
+ {
+ .mOffset = 0,
+ .mColInc = 1,
+ .mRowInc = (int32_t)stride,
+ .mHorizSubsampling = 1,
+ .mVertSubsampling = 1,
+ },
+ {
+ .mOffset = stride * vstride,
+ .mColInc = 2,
+ .mRowInc = (int32_t)stride,
+ .mHorizSubsampling = 2,
+ .mVertSubsampling = 2,
+ },
+ {
+ .mOffset = stride * vstride + 1,
+ .mColInc = 2,
+ .mRowInc = (int32_t)stride,
+ .mHorizSubsampling = 2,
+ .mVertSubsampling = 2,
+ }
+ },
+ };
+}
+
+status_t ConvertRGBToPlanarYUV(
+ uint8_t *dstY, size_t dstStride, size_t dstVStride, size_t bufferSize,
+ const C2GraphicView &src) {
+ CHECK(dstY != nullptr);
+ CHECK((src.width() & 1) == 0);
+ CHECK((src.height() & 1) == 0);
+
+ if (dstStride * dstVStride * 3 / 2 > bufferSize) {
+ ALOGD("conversion buffer is too small for converting from RGB to YUV");
+ return NO_MEMORY;
+ }
+
+ uint8_t *dstU = dstY + dstStride * dstVStride;
+ uint8_t *dstV = dstU + (dstStride >> 1) * (dstVStride >> 1);
+
+ const C2PlanarLayout &layout = src.layout();
+ const uint8_t *pRed = src.data()[C2PlanarLayout::PLANE_R];
+ const uint8_t *pGreen = src.data()[C2PlanarLayout::PLANE_G];
+ const uint8_t *pBlue = src.data()[C2PlanarLayout::PLANE_B];
+
+#define CLIP3(x,y,z) (((z) < (x)) ? (x) : (((z) > (y)) ? (y) : (z)))
+ for (size_t y = 0; y < src.height(); ++y) {
+ for (size_t x = 0; x < src.width(); ++x) {
+ uint8_t red = *pRed;
+ uint8_t green = *pGreen;
+ uint8_t blue = *pBlue;
+
+ // using ITU-R BT.601 conversion matrix
+ unsigned luma =
+ CLIP3(0, (((red * 66 + green * 129 + blue * 25) >> 8) + 16), 255);
+
+ dstY[x] = luma;
+
+ if ((x & 1) == 0 && (y & 1) == 0) {
+ unsigned U =
+ CLIP3(0, (((-red * 38 - green * 74 + blue * 112) >> 8) + 128), 255);
+
+ unsigned V =
+ CLIP3(0, (((red * 112 - green * 94 - blue * 18) >> 8) + 128), 255);
+
+ dstU[x >> 1] = U;
+ dstV[x >> 1] = V;
+ }
+ pRed += layout.planes[C2PlanarLayout::PLANE_R].colInc;
+ pGreen += layout.planes[C2PlanarLayout::PLANE_G].colInc;
+ pBlue += layout.planes[C2PlanarLayout::PLANE_B].colInc;
+ }
+
+ if ((y & 1) == 0) {
+ dstU += dstStride >> 1;
+ dstV += dstStride >> 1;
+ }
+
+ pRed -= layout.planes[C2PlanarLayout::PLANE_R].colInc * src.width();
+ pGreen -= layout.planes[C2PlanarLayout::PLANE_G].colInc * src.width();
+ pBlue -= layout.planes[C2PlanarLayout::PLANE_B].colInc * src.width();
+ pRed += layout.planes[C2PlanarLayout::PLANE_R].rowInc;
+ pGreen += layout.planes[C2PlanarLayout::PLANE_G].rowInc;
+ pBlue += layout.planes[C2PlanarLayout::PLANE_B].rowInc;
+
+ dstY += dstStride;
+ }
+ return OK;
+}
+
+namespace {
+
+/**
+ * A block of raw allocated memory.
+ */
+struct MemoryBlockPoolBlock {
+ MemoryBlockPoolBlock(size_t size)
+ : mData(new uint8_t[size]), mSize(mData ? size : 0) { }
+
+ ~MemoryBlockPoolBlock() {
+ delete[] mData;
+ }
+
+ const uint8_t *data() const {
+ return mData;
+ }
+
+ size_t size() const {
+ return mSize;
+ }
+
+ C2_DO_NOT_COPY(MemoryBlockPoolBlock);
+
+private:
+ uint8_t *mData;
+ size_t mSize;
+};
+
+/**
+ * A simple raw memory block pool implementation.
+ */
+struct MemoryBlockPoolImpl {
+ void release(std::list<MemoryBlockPoolBlock>::const_iterator block) {
+ std::lock_guard<std::mutex> lock(mMutex);
+ // return block to free blocks if it is the current size; otherwise, discard
+ if (block->size() == mCurrentSize) {
+ mFreeBlocks.splice(mFreeBlocks.begin(), mBlocksInUse, block);
+ } else {
+ mBlocksInUse.erase(block);
+ }
+ }
+
+ std::list<MemoryBlockPoolBlock>::const_iterator fetch(size_t size) {
+ std::lock_guard<std::mutex> lock(mMutex);
+ mFreeBlocks.remove_if([size](const MemoryBlockPoolBlock &block) -> bool {
+ return block.size() != size;
+ });
+ mCurrentSize = size;
+ if (mFreeBlocks.empty()) {
+ mBlocksInUse.emplace_front(size);
+ } else {
+ mBlocksInUse.splice(mBlocksInUse.begin(), mFreeBlocks, mFreeBlocks.begin());
+ }
+ return mBlocksInUse.begin();
+ }
+
+ MemoryBlockPoolImpl() = default;
+
+ C2_DO_NOT_COPY(MemoryBlockPoolImpl);
+
+private:
+ std::mutex mMutex;
+ std::list<MemoryBlockPoolBlock> mFreeBlocks;
+ std::list<MemoryBlockPoolBlock> mBlocksInUse;
+ size_t mCurrentSize;
+};
+
+} // namespace
+
+struct MemoryBlockPool::Impl : MemoryBlockPoolImpl {
+};
+
+struct MemoryBlock::Impl {
+ Impl(std::list<MemoryBlockPoolBlock>::const_iterator block,
+ std::shared_ptr<MemoryBlockPoolImpl> pool)
+ : mBlock(block), mPool(pool) {
+ }
+
+ ~Impl() {
+ mPool->release(mBlock);
+ }
+
+ const uint8_t *data() const {
+ return mBlock->data();
+ }
+
+ size_t size() const {
+ return mBlock->size();
+ }
+
+private:
+ std::list<MemoryBlockPoolBlock>::const_iterator mBlock;
+ std::shared_ptr<MemoryBlockPoolImpl> mPool;
+};
+
+MemoryBlock MemoryBlockPool::fetch(size_t size) {
+ std::list<MemoryBlockPoolBlock>::const_iterator poolBlock = mImpl->fetch(size);
+ return MemoryBlock(std::make_shared<MemoryBlock::Impl>(
+ poolBlock, std::static_pointer_cast<MemoryBlockPoolImpl>(mImpl)));
+}
+
+MemoryBlockPool::MemoryBlockPool()
+ : mImpl(std::make_shared<MemoryBlockPool::Impl>()) {
+}
+
+MemoryBlock::MemoryBlock(std::shared_ptr<MemoryBlock::Impl> impl)
+ : mImpl(impl) {
+}
+
+MemoryBlock::MemoryBlock() = default;
+
+MemoryBlock::~MemoryBlock() = default;
+
+const uint8_t* MemoryBlock::data() const {
+ return mImpl ? mImpl->data() : nullptr;
+}
+
+size_t MemoryBlock::size() const {
+ return mImpl ? mImpl->size() : 0;
+}
+
+MemoryBlock MemoryBlock::Allocate(size_t size) {
+ return MemoryBlockPool().fetch(size);
+}
+
+} // namespace android
diff --git a/media/codec2/sfplugin/utils/Codec2BufferUtils.h b/media/codec2/sfplugin/utils/Codec2BufferUtils.h
new file mode 100644
index 0000000..eaf6776
--- /dev/null
+++ b/media/codec2/sfplugin/utils/Codec2BufferUtils.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CODEC2_BUFFER_UTILS_H_
+#define CODEC2_BUFFER_UTILS_H_
+
+#include <C2Buffer.h>
+#include <C2ParamDef.h>
+
+#include <media/hardware/VideoAPI.h>
+#include <utils/Errors.h>
+
+namespace android {
+
+/**
+ * Converts an RGB view to planar YUV 420 media image.
+ *
+ * \param dstY pointer to media image buffer
+ * \param dstStride stride in bytes
+ * \param dstVStride vertical stride in pixels
+ * \param bufferSize media image buffer size
+ * \param src source image
+ *
+ * \retval NO_MEMORY media image is too small
+ * \retval OK on success
+ */
+status_t ConvertRGBToPlanarYUV(
+ uint8_t *dstY, size_t dstStride, size_t dstVStride, size_t bufferSize,
+ const C2GraphicView &src);
+
+/**
+ * Returns a planar YUV 420 8-bit media image descriptor.
+ *
+ * \param width width of image in pixels
+ * \param height height of image in pixels
+ * \param stride stride of image in pixels
+ * \param vstride vertical stride of image in pixels
+ */
+MediaImage2 CreateYUV420PlanarMediaImage2(
+ uint32_t width, uint32_t height, uint32_t stride, uint32_t vstride);
+
+/**
+ * Returns a semiplanar YUV 420 8-bit media image descriptor.
+ *
+ * \param width width of image in pixels
+ * \param height height of image in pixels
+ * \param stride stride of image in pixels
+ * \param vstride vertical stride of image in pixels
+ */
+MediaImage2 CreateYUV420SemiPlanarMediaImage2(
+ uint32_t width, uint32_t height, uint32_t stride, uint32_t vstride);
+
+/**
+ * Copies a graphic view into a media image.
+ *
+ * \param imgBase base of MediaImage
+ * \param img MediaImage data
+ * \param view graphic view
+ *
+ * \return OK on success
+ */
+status_t ImageCopy(uint8_t *imgBase, const MediaImage2 *img, const C2GraphicView &view);
+
+/**
+ * Copies a media image into a graphic view.
+ *
+ * \param view graphic view
+ * \param imgBase base of MediaImage
+ * \param img MediaImage data
+ *
+ * \return OK on success
+ */
+status_t ImageCopy(C2GraphicView &view, const uint8_t *imgBase, const MediaImage2 *img);
+
+/**
+ * Returns true iff a view has a YUV 420 888 layout.
+ */
+bool IsYUV420(const C2GraphicView &view);
+
+/**
+ * A raw memory block to use for internal buffers.
+ *
+ * TODO: replace this with C2LinearBlocks from a private C2BlockPool
+ */
+struct MemoryBlock : public C2MemoryBlock<uint8_t> {
+ virtual const uint8_t* data() const override;
+ virtual size_t size() const override;
+
+ inline uint8_t *data() {
+ return const_cast<uint8_t*>(const_cast<const MemoryBlock*>(this)->data());
+ }
+
+ // allocates an unmanaged block (not in a pool)
+ static MemoryBlock Allocate(size_t);
+
+ // memory block with no actual memory (size is 0, data is null)
+ MemoryBlock();
+
+ struct Impl;
+ MemoryBlock(std::shared_ptr<Impl> impl);
+ virtual ~MemoryBlock();
+
+private:
+ std::shared_ptr<Impl> mImpl;
+};
+
+/**
+ * A raw memory mini-pool.
+ */
+struct MemoryBlockPool {
+ /**
+ * Fetches a block with a given size.
+ *
+ * \param size size in bytes
+ */
+ MemoryBlock fetch(size_t size);
+
+ MemoryBlockPool();
+ ~MemoryBlockPool() = default;
+
+private:
+ struct Impl;
+ std::shared_ptr<Impl> mImpl;
+};
+
+} // namespace android
+
+#endif // CODEC2_BUFFER_UTILS_H_
diff --git a/media/codec2/sfplugin/utils/Codec2Mapper.cpp b/media/codec2/sfplugin/utils/Codec2Mapper.cpp
new file mode 100644
index 0000000..97e17e8
--- /dev/null
+++ b/media/codec2/sfplugin/utils/Codec2Mapper.cpp
@@ -0,0 +1,815 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Codec2Mapper"
+#include <utils/Log.h>
+
+#include <media/stagefright/MediaCodecConstants.h>
+#include <media/stagefright/SurfaceUtils.h>
+#include <media/stagefright/foundation/ALookup.h>
+#include <media/stagefright/foundation/ColorUtils.h>
+#include <media/stagefright/foundation/MediaDefs.h>
+
+#include <stdint.h> // for INT32_MAX
+
+#include "Codec2Mapper.h"
+
+using namespace android;
+
+namespace {
+
+ALookup<C2Config::profile_t, int32_t> sAacProfiles = {
+ { C2Config::PROFILE_AAC_LC, AACObjectLC },
+ { C2Config::PROFILE_AAC_MAIN, AACObjectMain },
+ { C2Config::PROFILE_AAC_SSR, AACObjectSSR },
+ { C2Config::PROFILE_AAC_LTP, AACObjectLTP },
+ { C2Config::PROFILE_AAC_HE, AACObjectHE },
+ { C2Config::PROFILE_AAC_SCALABLE, AACObjectScalable },
+ { C2Config::PROFILE_AAC_ER_LC, AACObjectERLC },
+ { C2Config::PROFILE_AAC_ER_SCALABLE, AACObjectERScalable },
+ { C2Config::PROFILE_AAC_LD, AACObjectLD },
+ { C2Config::PROFILE_AAC_HE_PS, AACObjectHE_PS },
+ { C2Config::PROFILE_AAC_ELD, AACObjectELD },
+ { C2Config::PROFILE_AAC_XHE, AACObjectXHE },
+};
+
+ALookup<C2Config::level_t, int32_t> sAvcLevels = {
+ { C2Config::LEVEL_AVC_1, AVCLevel1 },
+ { C2Config::LEVEL_AVC_1B, AVCLevel1b },
+ { C2Config::LEVEL_AVC_1_1, AVCLevel11 },
+ { C2Config::LEVEL_AVC_1_2, AVCLevel12 },
+ { C2Config::LEVEL_AVC_1_3, AVCLevel13 },
+ { C2Config::LEVEL_AVC_2, AVCLevel2 },
+ { C2Config::LEVEL_AVC_2_1, AVCLevel21 },
+ { C2Config::LEVEL_AVC_2_2, AVCLevel22 },
+ { C2Config::LEVEL_AVC_3, AVCLevel3 },
+ { C2Config::LEVEL_AVC_3_1, AVCLevel31 },
+ { C2Config::LEVEL_AVC_3_2, AVCLevel32 },
+ { C2Config::LEVEL_AVC_4, AVCLevel4 },
+ { C2Config::LEVEL_AVC_4_1, AVCLevel41 },
+ { C2Config::LEVEL_AVC_4_2, AVCLevel42 },
+ { C2Config::LEVEL_AVC_5, AVCLevel5 },
+ { C2Config::LEVEL_AVC_5_1, AVCLevel51 },
+ { C2Config::LEVEL_AVC_5_2, AVCLevel52 },
+
+};
+
+ALookup<C2Config::profile_t, int32_t> sAvcProfiles = {
+ // treat restricted profiles as full profile if there is no equivalent - which works for
+ // decoders, but not for encoders
+ { C2Config::PROFILE_AVC_BASELINE, AVCProfileBaseline },
+ { C2Config::PROFILE_AVC_CONSTRAINED_BASELINE, AVCProfileConstrainedBaseline },
+ { C2Config::PROFILE_AVC_MAIN, AVCProfileMain },
+ { C2Config::PROFILE_AVC_EXTENDED, AVCProfileExtended },
+ { C2Config::PROFILE_AVC_HIGH, AVCProfileHigh },
+ { C2Config::PROFILE_AVC_PROGRESSIVE_HIGH, AVCProfileHigh },
+ { C2Config::PROFILE_AVC_CONSTRAINED_HIGH, AVCProfileConstrainedHigh },
+ { C2Config::PROFILE_AVC_HIGH_10, AVCProfileHigh10 },
+ { C2Config::PROFILE_AVC_PROGRESSIVE_HIGH_10, AVCProfileHigh10 },
+ { C2Config::PROFILE_AVC_HIGH_422, AVCProfileHigh422 },
+ { C2Config::PROFILE_AVC_HIGH_444_PREDICTIVE, AVCProfileHigh444 },
+ { C2Config::PROFILE_AVC_HIGH_10_INTRA, AVCProfileHigh10 },
+ { C2Config::PROFILE_AVC_HIGH_422_INTRA, AVCProfileHigh422 },
+ { C2Config::PROFILE_AVC_HIGH_444_INTRA, AVCProfileHigh444 },
+ { C2Config::PROFILE_AVC_CAVLC_444_INTRA, AVCProfileHigh444 },
+};
+
+ALookup<C2Config::bitrate_mode_t, int32_t> sBitrateModes = {
+ { C2Config::BITRATE_CONST, BITRATE_MODE_CBR },
+ { C2Config::BITRATE_VARIABLE, BITRATE_MODE_VBR },
+ { C2Config::BITRATE_IGNORE, BITRATE_MODE_CQ },
+};
+
+ALookup<C2Color::matrix_t, ColorAspects::MatrixCoeffs> sColorMatricesSf = {
+ { C2Color::MATRIX_UNSPECIFIED, ColorAspects::MatrixUnspecified },
+ { C2Color::MATRIX_BT709, ColorAspects::MatrixBT709_5 },
+ { C2Color::MATRIX_FCC47_73_682, ColorAspects::MatrixBT470_6M },
+ { C2Color::MATRIX_BT601, ColorAspects::MatrixBT601_6 },
+ { C2Color::MATRIX_SMPTE240M, ColorAspects::MatrixSMPTE240M },
+ { C2Color::MATRIX_BT2020, ColorAspects::MatrixBT2020 },
+ { C2Color::MATRIX_BT2020_CONSTANT, ColorAspects::MatrixBT2020Constant },
+ { C2Color::MATRIX_OTHER, ColorAspects::MatrixOther },
+};
+
+ALookup<C2Color::primaries_t, ColorAspects::Primaries> sColorPrimariesSf = {
+ { C2Color::PRIMARIES_UNSPECIFIED, ColorAspects::PrimariesUnspecified },
+ { C2Color::PRIMARIES_BT709, ColorAspects::PrimariesBT709_5 },
+ { C2Color::PRIMARIES_BT470_M, ColorAspects::PrimariesBT470_6M },
+ { C2Color::PRIMARIES_BT601_625, ColorAspects::PrimariesBT601_6_625 },
+ { C2Color::PRIMARIES_BT601_525, ColorAspects::PrimariesBT601_6_525 },
+ { C2Color::PRIMARIES_GENERIC_FILM, ColorAspects::PrimariesGenericFilm },
+ { C2Color::PRIMARIES_BT2020, ColorAspects::PrimariesBT2020 },
+// { C2Color::PRIMARIES_RP431, ColorAspects::Primaries... },
+// { C2Color::PRIMARIES_EG432, ColorAspects::Primaries... },
+// { C2Color::PRIMARIES_EBU3213, ColorAspects::Primaries... },
+ { C2Color::PRIMARIES_OTHER, ColorAspects::PrimariesOther },
+};
+
+ALookup<C2Color::range_t, int32_t> sColorRanges = {
+ { C2Color::RANGE_FULL, COLOR_RANGE_FULL },
+ { C2Color::RANGE_LIMITED, COLOR_RANGE_LIMITED },
+};
+
+ALookup<C2Color::range_t, ColorAspects::Range> sColorRangesSf = {
+ { C2Color::RANGE_UNSPECIFIED, ColorAspects::RangeUnspecified },
+ { C2Color::RANGE_FULL, ColorAspects::RangeFull },
+ { C2Color::RANGE_LIMITED, ColorAspects::RangeLimited },
+ { C2Color::RANGE_OTHER, ColorAspects::RangeOther },
+};
+
+ALookup<C2Color::transfer_t, int32_t> sColorTransfers = {
+ { C2Color::TRANSFER_LINEAR, COLOR_TRANSFER_LINEAR },
+ { C2Color::TRANSFER_170M, COLOR_TRANSFER_SDR_VIDEO },
+ { C2Color::TRANSFER_ST2084, COLOR_TRANSFER_ST2084 },
+ { C2Color::TRANSFER_HLG, COLOR_TRANSFER_HLG },
+};
+
+ALookup<C2Color::transfer_t, ColorAspects::Transfer> sColorTransfersSf = {
+ { C2Color::TRANSFER_UNSPECIFIED, ColorAspects::TransferUnspecified },
+ { C2Color::TRANSFER_LINEAR, ColorAspects::TransferLinear },
+ { C2Color::TRANSFER_SRGB, ColorAspects::TransferSRGB },
+ { C2Color::TRANSFER_170M, ColorAspects::TransferSMPTE170M },
+ { C2Color::TRANSFER_GAMMA22, ColorAspects::TransferGamma22 },
+ { C2Color::TRANSFER_GAMMA28, ColorAspects::TransferGamma28 },
+ { C2Color::TRANSFER_ST2084, ColorAspects::TransferST2084 },
+ { C2Color::TRANSFER_HLG, ColorAspects::TransferHLG },
+ { C2Color::TRANSFER_240M, ColorAspects::TransferSMPTE240M },
+ { C2Color::TRANSFER_XVYCC, ColorAspects::TransferXvYCC },
+ { C2Color::TRANSFER_BT1361, ColorAspects::TransferBT1361 },
+ { C2Color::TRANSFER_ST428, ColorAspects::TransferST428 },
+ { C2Color::TRANSFER_OTHER, ColorAspects::TransferOther },
+};
+
+ALookup<C2Config::level_t, int32_t> sDolbyVisionLevels = {
+ { C2Config::LEVEL_DV_MAIN_HD_24, DolbyVisionLevelHd24 },
+ { C2Config::LEVEL_DV_MAIN_HD_30, DolbyVisionLevelHd30 },
+ { C2Config::LEVEL_DV_MAIN_FHD_24, DolbyVisionLevelFhd24 },
+ { C2Config::LEVEL_DV_MAIN_FHD_30, DolbyVisionLevelFhd30 },
+ { C2Config::LEVEL_DV_MAIN_FHD_60, DolbyVisionLevelFhd60 },
+ { C2Config::LEVEL_DV_MAIN_UHD_24, DolbyVisionLevelUhd24 },
+ { C2Config::LEVEL_DV_MAIN_UHD_30, DolbyVisionLevelUhd30 },
+ { C2Config::LEVEL_DV_MAIN_UHD_48, DolbyVisionLevelUhd48 },
+ { C2Config::LEVEL_DV_MAIN_UHD_60, DolbyVisionLevelUhd60 },
+
+ // high tiers are not yet supported on android, for now map them to main tier
+ { C2Config::LEVEL_DV_HIGH_HD_24, DolbyVisionLevelHd24 },
+ { C2Config::LEVEL_DV_HIGH_HD_30, DolbyVisionLevelHd30 },
+ { C2Config::LEVEL_DV_HIGH_FHD_24, DolbyVisionLevelFhd24 },
+ { C2Config::LEVEL_DV_HIGH_FHD_30, DolbyVisionLevelFhd30 },
+ { C2Config::LEVEL_DV_HIGH_FHD_60, DolbyVisionLevelFhd60 },
+ { C2Config::LEVEL_DV_HIGH_UHD_24, DolbyVisionLevelUhd24 },
+ { C2Config::LEVEL_DV_HIGH_UHD_30, DolbyVisionLevelUhd30 },
+ { C2Config::LEVEL_DV_HIGH_UHD_48, DolbyVisionLevelUhd48 },
+ { C2Config::LEVEL_DV_HIGH_UHD_60, DolbyVisionLevelUhd60 },
+};
+
+ALookup<C2Config::profile_t, int32_t> sDolbyVisionProfiles = {
+ { C2Config::PROFILE_DV_AV_PER, DolbyVisionProfileDvavPer },
+ { C2Config::PROFILE_DV_AV_PEN, DolbyVisionProfileDvavPen },
+ { C2Config::PROFILE_DV_HE_DER, DolbyVisionProfileDvheDer },
+ { C2Config::PROFILE_DV_HE_DEN, DolbyVisionProfileDvheDen },
+ { C2Config::PROFILE_DV_HE_04, DolbyVisionProfileDvheDtr },
+ { C2Config::PROFILE_DV_HE_05, DolbyVisionProfileDvheStn },
+ { C2Config::PROFILE_DV_HE_DTH, DolbyVisionProfileDvheDth },
+ { C2Config::PROFILE_DV_HE_07, DolbyVisionProfileDvheDtb },
+ { C2Config::PROFILE_DV_HE_08, DolbyVisionProfileDvheSt },
+ { C2Config::PROFILE_DV_AV_09, DolbyVisionProfileDvavSe },
+};
+
+ALookup<C2Config::level_t, int32_t> sH263Levels = {
+ { C2Config::LEVEL_H263_10, H263Level10 },
+ { C2Config::LEVEL_H263_20, H263Level20 },
+ { C2Config::LEVEL_H263_30, H263Level30 },
+ { C2Config::LEVEL_H263_40, H263Level40 },
+ { C2Config::LEVEL_H263_45, H263Level45 },
+ { C2Config::LEVEL_H263_50, H263Level50 },
+ { C2Config::LEVEL_H263_60, H263Level60 },
+ { C2Config::LEVEL_H263_70, H263Level70 },
+};
+
+ALookup<C2Config::profile_t, int32_t> sH263Profiles = {
+ { C2Config::PROFILE_H263_BASELINE, H263ProfileBaseline },
+ { C2Config::PROFILE_H263_H320, H263ProfileH320Coding },
+ { C2Config::PROFILE_H263_V1BC, H263ProfileBackwardCompatible },
+ { C2Config::PROFILE_H263_ISWV2, H263ProfileISWV2 },
+ { C2Config::PROFILE_H263_ISWV3, H263ProfileISWV3 },
+ { C2Config::PROFILE_H263_HIGH_COMPRESSION, H263ProfileHighCompression },
+ { C2Config::PROFILE_H263_INTERNET, H263ProfileInternet },
+ { C2Config::PROFILE_H263_INTERLACE, H263ProfileInterlace },
+ { C2Config::PROFILE_H263_HIGH_LATENCY, H263ProfileHighLatency },
+};
+
+ALookup<C2Config::level_t, int32_t> sHevcLevels = {
+ { C2Config::LEVEL_HEVC_MAIN_1, HEVCMainTierLevel1 },
+ { C2Config::LEVEL_HEVC_MAIN_2, HEVCMainTierLevel2 },
+ { C2Config::LEVEL_HEVC_MAIN_2_1, HEVCMainTierLevel21 },
+ { C2Config::LEVEL_HEVC_MAIN_3, HEVCMainTierLevel3 },
+ { C2Config::LEVEL_HEVC_MAIN_3_1, HEVCMainTierLevel31 },
+ { C2Config::LEVEL_HEVC_MAIN_4, HEVCMainTierLevel4 },
+ { C2Config::LEVEL_HEVC_MAIN_4_1, HEVCMainTierLevel41 },
+ { C2Config::LEVEL_HEVC_MAIN_5, HEVCMainTierLevel5 },
+ { C2Config::LEVEL_HEVC_MAIN_5_1, HEVCMainTierLevel51 },
+ { C2Config::LEVEL_HEVC_MAIN_5_2, HEVCMainTierLevel52 },
+ { C2Config::LEVEL_HEVC_MAIN_6, HEVCMainTierLevel6 },
+ { C2Config::LEVEL_HEVC_MAIN_6_1, HEVCMainTierLevel61 },
+ { C2Config::LEVEL_HEVC_MAIN_6_2, HEVCMainTierLevel62 },
+
+ { C2Config::LEVEL_HEVC_HIGH_4, HEVCHighTierLevel4 },
+ { C2Config::LEVEL_HEVC_HIGH_4_1, HEVCHighTierLevel41 },
+ { C2Config::LEVEL_HEVC_HIGH_5, HEVCHighTierLevel5 },
+ { C2Config::LEVEL_HEVC_HIGH_5_1, HEVCHighTierLevel51 },
+ { C2Config::LEVEL_HEVC_HIGH_5_2, HEVCHighTierLevel52 },
+ { C2Config::LEVEL_HEVC_HIGH_6, HEVCHighTierLevel6 },
+ { C2Config::LEVEL_HEVC_HIGH_6_1, HEVCHighTierLevel61 },
+ { C2Config::LEVEL_HEVC_HIGH_6_2, HEVCHighTierLevel62 },
+
+ // map high tier levels below 4 to main tier
+ { C2Config::LEVEL_HEVC_MAIN_1, HEVCHighTierLevel1 },
+ { C2Config::LEVEL_HEVC_MAIN_2, HEVCHighTierLevel2 },
+ { C2Config::LEVEL_HEVC_MAIN_2_1, HEVCHighTierLevel21 },
+ { C2Config::LEVEL_HEVC_MAIN_3, HEVCHighTierLevel3 },
+ { C2Config::LEVEL_HEVC_MAIN_3_1, HEVCHighTierLevel31 },
+};
+
+ALookup<C2Config::profile_t, int32_t> sHevcProfiles = {
+ { C2Config::PROFILE_HEVC_MAIN, HEVCProfileMain },
+ { C2Config::PROFILE_HEVC_MAIN_10, HEVCProfileMain10 },
+ { C2Config::PROFILE_HEVC_MAIN_STILL, HEVCProfileMainStill },
+ { C2Config::PROFILE_HEVC_MAIN_INTRA, HEVCProfileMain },
+ { C2Config::PROFILE_HEVC_MAIN_10_INTRA, HEVCProfileMain10 },
+};
+
+ALookup<C2Config::level_t, int32_t> sMpeg2Levels = {
+ { C2Config::LEVEL_MP2V_LOW, MPEG2LevelLL },
+ { C2Config::LEVEL_MP2V_MAIN, MPEG2LevelML },
+ { C2Config::LEVEL_MP2V_HIGH_1440, MPEG2LevelH14 },
+ { C2Config::LEVEL_MP2V_HIGH, MPEG2LevelHL },
+ { C2Config::LEVEL_MP2V_HIGHP, MPEG2LevelHP },
+};
+
+ALookup<C2Config::profile_t, int32_t> sMpeg2Profiles = {
+ { C2Config::PROFILE_MP2V_SIMPLE, MPEG2ProfileSimple },
+ { C2Config::PROFILE_MP2V_MAIN, MPEG2ProfileMain },
+ { C2Config::PROFILE_MP2V_SNR_SCALABLE, MPEG2ProfileSNR },
+ { C2Config::PROFILE_MP2V_SPATIALLY_SCALABLE, MPEG2ProfileSpatial },
+ { C2Config::PROFILE_MP2V_HIGH, MPEG2ProfileHigh },
+ { C2Config::PROFILE_MP2V_422, MPEG2Profile422 },
+};
+
+ALookup<C2Config::level_t, int32_t> sMpeg4Levels = {
+ { C2Config::LEVEL_MP4V_0, MPEG4Level0 },
+ { C2Config::LEVEL_MP4V_0B, MPEG4Level0b },
+ { C2Config::LEVEL_MP4V_1, MPEG4Level1 },
+ { C2Config::LEVEL_MP4V_2, MPEG4Level2 },
+ { C2Config::LEVEL_MP4V_3, MPEG4Level3 },
+ { C2Config::LEVEL_MP4V_3B, MPEG4Level3b },
+ { C2Config::LEVEL_MP4V_4, MPEG4Level4 },
+ { C2Config::LEVEL_MP4V_4A, MPEG4Level4a },
+ { C2Config::LEVEL_MP4V_5, MPEG4Level5 },
+ { C2Config::LEVEL_MP4V_6, MPEG4Level6 },
+};
+
+ALookup<C2Config::profile_t, int32_t> sMpeg4Profiles = {
+ { C2Config::PROFILE_MP4V_SIMPLE, MPEG4ProfileSimple },
+ { C2Config::PROFILE_MP4V_SIMPLE_SCALABLE, MPEG4ProfileSimpleScalable },
+ { C2Config::PROFILE_MP4V_CORE, MPEG4ProfileCore },
+ { C2Config::PROFILE_MP4V_MAIN, MPEG4ProfileMain },
+ { C2Config::PROFILE_MP4V_NBIT, MPEG4ProfileNbit },
+ { C2Config::PROFILE_MP4V_ARTS, MPEG4ProfileAdvancedRealTime },
+ { C2Config::PROFILE_MP4V_CORE_SCALABLE, MPEG4ProfileCoreScalable },
+ { C2Config::PROFILE_MP4V_ACE, MPEG4ProfileAdvancedCoding },
+ { C2Config::PROFILE_MP4V_ADVANCED_CORE, MPEG4ProfileAdvancedCore },
+ { C2Config::PROFILE_MP4V_ADVANCED_SIMPLE, MPEG4ProfileAdvancedSimple },
+};
+
+ALookup<C2Config::pcm_encoding_t, int32_t> sPcmEncodings = {
+ { C2Config::PCM_8, kAudioEncodingPcm8bit },
+ { C2Config::PCM_16, kAudioEncodingPcm16bit },
+ { C2Config::PCM_FLOAT, kAudioEncodingPcmFloat },
+};
+
+ALookup<C2Config::level_t, int32_t> sVp9Levels = {
+ { C2Config::LEVEL_VP9_1, VP9Level1 },
+ { C2Config::LEVEL_VP9_1_1, VP9Level11 },
+ { C2Config::LEVEL_VP9_2, VP9Level2 },
+ { C2Config::LEVEL_VP9_2_1, VP9Level21 },
+ { C2Config::LEVEL_VP9_3, VP9Level3 },
+ { C2Config::LEVEL_VP9_3_1, VP9Level31 },
+ { C2Config::LEVEL_VP9_4, VP9Level4 },
+ { C2Config::LEVEL_VP9_4_1, VP9Level41 },
+ { C2Config::LEVEL_VP9_5, VP9Level5 },
+ { C2Config::LEVEL_VP9_5_1, VP9Level51 },
+ { C2Config::LEVEL_VP9_5_2, VP9Level52 },
+ { C2Config::LEVEL_VP9_6, VP9Level6 },
+ { C2Config::LEVEL_VP9_6_1, VP9Level61 },
+ { C2Config::LEVEL_VP9_6_2, VP9Level62 },
+};
+
+ALookup<C2Config::profile_t, int32_t> sVp9Profiles = {
+ { C2Config::PROFILE_VP9_0, VP9Profile0 },
+ { C2Config::PROFILE_VP9_1, VP9Profile1 },
+ { C2Config::PROFILE_VP9_2, VP9Profile2 },
+ { C2Config::PROFILE_VP9_3, VP9Profile3 },
+};
+
+/**
+ * A helper that passes through vendor extension profile and level values.
+ */
+struct ProfileLevelMapperHelper : C2Mapper::ProfileLevelMapper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) = 0;
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) = 0;
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) = 0;
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) = 0;
+
+ template<typename T, typename U>
+ bool passThroughMap(T from, U *to) {
+ // allow (and pass through) vendor extensions
+ if (from >= (T)C2_PROFILE_LEVEL_VENDOR_START && from < (T)INT32_MAX) {
+ *to = (U)from;
+ return true;
+ }
+ return simpleMap(from, to);
+ }
+
+ virtual bool mapLevel(C2Config::level_t from, int32_t *to) {
+ return passThroughMap(from, to);
+ }
+
+ virtual bool mapLevel(int32_t from, C2Config::level_t *to) {
+ return passThroughMap(from, to);
+ }
+
+ virtual bool mapProfile(C2Config::profile_t from, int32_t *to) {
+ return passThroughMap(from, to);
+ }
+
+ virtual bool mapProfile(int32_t from, C2Config::profile_t *to) {
+ return passThroughMap(from, to);
+ }
+};
+
+// AAC only uses profiles, map all levels to unused or 0
+struct AacProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t, int32_t *to) {
+ *to = 0;
+ return true;
+ }
+ virtual bool simpleMap(int32_t, C2Config::level_t *to) {
+ *to = C2Config::LEVEL_UNUSED;
+ return true;
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sAacProfiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sAacProfiles.map(from, to);
+ }
+};
+
+struct AvcProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
+ return sAvcLevels.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) {
+ return sAvcLevels.map(from, to);
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sAvcProfiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sAvcProfiles.map(from, to);
+ }
+};
+
+struct DolbyVisionProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
+ return sDolbyVisionLevels.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) {
+ return sDolbyVisionLevels.map(from, to);
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sDolbyVisionProfiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sDolbyVisionProfiles.map(from, to);
+ }
+};
+
+struct H263ProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
+ return sH263Levels.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) {
+ return sH263Levels.map(from, to);
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sH263Profiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sH263Profiles.map(from, to);
+ }
+};
+
+struct HevcProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
+ return sHevcLevels.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) {
+ return sHevcLevels.map(from, to);
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sHevcProfiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sHevcProfiles.map(from, to);
+ }
+};
+
+struct Mpeg2ProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
+ return sMpeg2Levels.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) {
+ return sMpeg2Levels.map(from, to);
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sMpeg2Profiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sMpeg2Profiles.map(from, to);
+ }
+};
+
+struct Mpeg4ProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
+ return sMpeg4Levels.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) {
+ return sMpeg4Levels.map(from, to);
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sMpeg4Profiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sMpeg4Profiles.map(from, to);
+ }
+};
+
+// VP8 has no profiles and levels in Codec 2.0, but we use main profile and level 0 in MediaCodec
+// map all profiles and levels to that.
+struct Vp8ProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t, int32_t *to) {
+ *to = VP8Level_Version0;
+ return true;
+ }
+ virtual bool simpleMap(int32_t, C2Config::level_t *to) {
+ *to = C2Config::LEVEL_UNUSED;
+ return true;
+ }
+ virtual bool simpleMap(C2Config::profile_t, int32_t *to) {
+ *to = VP8ProfileMain;
+ return true;
+ }
+ virtual bool simpleMap(int32_t, C2Config::profile_t *to) {
+ *to = C2Config::PROFILE_UNUSED;
+ return true;
+ }
+};
+
+struct Vp9ProfileLevelMapper : ProfileLevelMapperHelper {
+ virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
+ return sVp9Levels.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::level_t *to) {
+ return sVp9Levels.map(from, to);
+ }
+ virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
+ return sVp9Profiles.map(from, to);
+ }
+ virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
+ return sVp9Profiles.map(from, to);
+ }
+};
+
+} // namespace
+
+// static
+std::shared_ptr<C2Mapper::ProfileLevelMapper>
+C2Mapper::GetProfileLevelMapper(std::string mediaType) {
+ std::transform(mediaType.begin(), mediaType.begin(), mediaType.end(), ::tolower);
+ if (mediaType == MIMETYPE_AUDIO_AAC) {
+ return std::make_shared<AacProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_VIDEO_AVC) {
+ return std::make_shared<AvcProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_VIDEO_DOLBY_VISION) {
+ return std::make_shared<DolbyVisionProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_VIDEO_H263) {
+ return std::make_shared<H263ProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_VIDEO_HEVC) {
+ return std::make_shared<HevcProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_VIDEO_MPEG2) {
+ return std::make_shared<Mpeg2ProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_VIDEO_MPEG4) {
+ return std::make_shared<Mpeg4ProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_VIDEO_VP8) {
+ return std::make_shared<Vp8ProfileLevelMapper>();
+ } else if (mediaType == MIMETYPE_VIDEO_VP9) {
+ return std::make_shared<Vp9ProfileLevelMapper>();
+ }
+ return nullptr;
+}
+
+// static
+bool C2Mapper::map(C2Config::bitrate_mode_t from, int32_t *to) {
+ return sBitrateModes.map(from, to);
+}
+
+// static
+bool C2Mapper::map(int32_t from, C2Config::bitrate_mode_t *to) {
+ return sBitrateModes.map(from, to);
+}
+
+// static
+bool C2Mapper::map(C2Config::pcm_encoding_t from, int32_t *to) {
+ return sPcmEncodings.map(from, to);
+}
+
+// static
+bool C2Mapper::map(int32_t from, C2Config::pcm_encoding_t *to) {
+ return sPcmEncodings.map(from, to);
+}
+
+// static
+bool C2Mapper::map(C2Color::range_t from, int32_t *to) {
+ bool res = true;
+ // map SDK defined values directly. For other values, use wrapping from ColorUtils.
+ if (!sColorRanges.map(from, to)) {
+ ColorAspects::Range sfRange;
+
+ // map known constants and keep vendor extensions. all other values are mapped to 'Other'
+ if (!sColorRangesSf.map(from, &sfRange)) {
+ // use static cast and ensure it is in the extension range
+ if (from < C2Color::RANGE_VENDOR_START || from > C2Color::RANGE_OTHER) {
+ sfRange = ColorAspects::RangeOther;
+ res = false;
+ }
+ }
+
+ *to = ColorUtils::wrapColorAspectsIntoColorRange(sfRange);
+ }
+ return res;
+}
+
+// static
+bool C2Mapper::map(int32_t from, C2Color::range_t *to) {
+ // map SDK defined values directly. For other values, use wrapping from ColorUtils.
+ if (!sColorRanges.map(from, to)) {
+ ColorAspects::Range sfRange;
+ (void)ColorUtils::unwrapColorAspectsFromColorRange(from, &sfRange);
+
+ // map known constants and keep vendor extensions. all other values are mapped to 'Other'
+ if (!sColorRangesSf.map(sfRange, to)) {
+ // use static cast and ensure it is in the extension range
+ *to = (C2Color::range_t)sfRange;
+ if (*to < C2Color::RANGE_VENDOR_START || *to > C2Color::RANGE_OTHER) {
+ *to = C2Color::RANGE_OTHER;
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+// static
+bool C2Mapper::map(C2Color::range_t from, ColorAspects::Range *to) {
+ return sColorRangesSf.map(from, to);
+}
+
+// static
+bool C2Mapper::map(ColorAspects::Range from, C2Color::range_t *to) {
+ return sColorRangesSf.map(from, to);
+}
+
+// static
+bool C2Mapper::map(C2Color::primaries_t primaries, C2Color::matrix_t matrix, int32_t *standard) {
+ ColorAspects::Primaries sfPrimaries;
+ ColorAspects::MatrixCoeffs sfMatrix;
+ bool res = true;
+
+ // map known constants and keep vendor extensions. all other values are mapped to 'Other'
+ if (!sColorPrimariesSf.map(primaries, &sfPrimaries)) {
+ // ensure it is in the extension range and use static cast
+ if (primaries < C2Color::PRIMARIES_VENDOR_START || primaries > C2Color::PRIMARIES_OTHER) {
+ // undefined non-extension values map to 'Other'
+ sfPrimaries = ColorAspects::PrimariesOther;
+ res = false;
+ } else {
+ sfPrimaries = (ColorAspects::Primaries)primaries;
+ }
+ }
+
+ if (!sColorMatricesSf.map(matrix, &sfMatrix)) {
+ // use static cast and ensure it is in the extension range
+ if (matrix < C2Color::MATRIX_VENDOR_START || matrix > C2Color::MATRIX_OTHER) {
+ // undefined non-extension values map to 'Other'
+ sfMatrix = ColorAspects::MatrixOther;
+ res = false;
+ } else {
+ sfMatrix = (ColorAspects::MatrixCoeffs)matrix;
+ }
+ }
+
+ *standard = ColorUtils::wrapColorAspectsIntoColorStandard(sfPrimaries, sfMatrix);
+
+ return res;
+}
+
+// static
+bool C2Mapper::map(int32_t standard, C2Color::primaries_t *primaries, C2Color::matrix_t *matrix) {
+ // first map to stagefright foundation aspects => these actually map nearly 1:1 to
+ // Codec 2.0 aspects
+ ColorAspects::Primaries sfPrimaries;
+ ColorAspects::MatrixCoeffs sfMatrix;
+ bool res = true;
+ (void)ColorUtils::unwrapColorAspectsFromColorStandard(standard, &sfPrimaries, &sfMatrix);
+
+ // map known constants and keep vendor extensions. all other values are mapped to 'Other'
+ if (!sColorPrimariesSf.map(sfPrimaries, primaries)) {
+ // use static cast and ensure it is in the extension range
+ *primaries = (C2Color::primaries_t)sfPrimaries;
+ if (*primaries < C2Color::PRIMARIES_VENDOR_START || *primaries > C2Color::PRIMARIES_OTHER) {
+ *primaries = C2Color::PRIMARIES_OTHER;
+ res = false;
+ }
+ }
+
+ if (!sColorMatricesSf.map(sfMatrix, matrix)) {
+ // use static cast and ensure it is in the extension range
+ *matrix = (C2Color::matrix_t)sfMatrix;
+ if (*matrix < C2Color::MATRIX_VENDOR_START || *matrix > C2Color::MATRIX_OTHER) {
+ *matrix = C2Color::MATRIX_OTHER;
+ res = false;
+ }
+ }
+
+ return res;
+}
+
+// static
+bool C2Mapper::map(C2Color::primaries_t from, ColorAspects::Primaries *to) {
+ return sColorPrimariesSf.map(from, to);
+}
+
+// static
+bool C2Mapper::map(ColorAspects::Primaries from, C2Color::primaries_t *to) {
+ return sColorPrimariesSf.map(from, to);
+}
+
+// static
+bool C2Mapper::map(C2Color::matrix_t from, ColorAspects::MatrixCoeffs *to) {
+ return sColorMatricesSf.map(from, to);
+}
+
+// static
+bool C2Mapper::map(ColorAspects::MatrixCoeffs from, C2Color::matrix_t *to) {
+ return sColorMatricesSf.map(from, to);
+}
+
+// static
+bool C2Mapper::map(C2Color::transfer_t from, int32_t *to) {
+ bool res = true;
+ // map SDK defined values directly. For other values, use wrapping from ColorUtils.
+ if (!sColorTransfers.map(from, to)) {
+ ColorAspects::Transfer sfTransfer;
+
+ // map known constants and keep vendor extensions. all other values are mapped to 'Other'
+ if (!sColorTransfersSf.map(from, &sfTransfer)) {
+ // use static cast and ensure it is in the extension range
+ if (from < C2Color::TRANSFER_VENDOR_START || from > C2Color::TRANSFER_OTHER) {
+ sfTransfer = ColorAspects::TransferOther;
+ res = false;
+ }
+ }
+
+ *to = ColorUtils::wrapColorAspectsIntoColorTransfer(sfTransfer);
+ }
+ return res;
+}
+
+// static
+bool C2Mapper::map(int32_t from, C2Color::transfer_t *to) {
+ // map SDK defined values directly. For other values, use wrapping from ColorUtils.
+ if (!sColorTransfers.map(from, to)) {
+ ColorAspects::Transfer sfTransfer;
+ (void)ColorUtils::unwrapColorAspectsFromColorTransfer(from, &sfTransfer);
+
+ // map known constants and keep vendor extensions. all other values are mapped to 'Other'
+ if (!sColorTransfersSf.map(sfTransfer, to)) {
+ // use static cast and ensure it is in the extension range
+ *to = (C2Color::transfer_t)sfTransfer;
+ if (*to < C2Color::TRANSFER_VENDOR_START || *to > C2Color::TRANSFER_OTHER) {
+ *to = C2Color::TRANSFER_OTHER;
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+// static
+bool C2Mapper::map(
+ C2Color::range_t range, C2Color::primaries_t primaries,
+ C2Color::matrix_t matrix, C2Color::transfer_t transfer, uint32_t *dataSpace) {
+#if 0
+ // pure reimplementation
+ *dataSpace = HAL_DATASPACE_UNKNOWN; // this is 0
+
+ switch (range) {
+ case C2Color::RANGE_FULL: *dataSpace |= HAL_DATASPACE_RANGE_FULL; break;
+ case C2Color::RANGE_LIMITED: *dataSpace |= HAL_DATASPACE_RANGE_LIMITED; break;
+ default: break;
+ }
+
+ switch (transfer) {
+ case C2Color::TRANSFER_LINEAR: *dataSpace |= HAL_DATASPACE_TRANSFER_LINEAR; break;
+ case C2Color::TRANSFER_SRGB: *dataSpace |= HAL_DATASPACE_TRANSFER_SRGB; break;
+ case C2Color::TRANSFER_170M: *dataSpace |= HAL_DATASPACE_TRANSFER_SMPTE_170M; break;
+ case C2Color::TRANSFER_GAMMA22: *dataSpace |= HAL_DATASPACE_TRANSFER_GAMMA2_2; break;
+ case C2Color::TRANSFER_GAMMA28: *dataSpace |= HAL_DATASPACE_TRANSFER_GAMMA2_8; break;
+ case C2Color::TRANSFER_ST2084: *dataSpace |= HAL_DATASPACE_TRANSFER_ST2084; break;
+ case C2Color::TRANSFER_HLG: *dataSpace |= HAL_DATASPACE_TRANSFER_HLG; break;
+ default: break;
+ }
+
+ switch (primaries) {
+ case C2Color::PRIMARIES_BT601_525:
+ *dataSpace |= (matrix == C2Color::MATRIX_SMPTE240M
+ || matrix == C2Color::MATRIX_BT709)
+ ? HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED
+ : HAL_DATASPACE_STANDARD_BT601_525;
+ break;
+ case C2Color::PRIMARIES_BT601_625:
+ *dataSpace |= (matrix == C2Color::MATRIX_SMPTE240M
+ || matrix == C2Color::MATRIX_BT709)
+ ? HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED
+ : HAL_DATASPACE_STANDARD_BT601_625;
+ break;
+ case C2Color::PRIMARIES_BT2020:
+ *dataSpace |= (matrix == C2Color::MATRIX_BT2020CONSTANT
+ ? HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE
+ : HAL_DATASPACE_STANDARD_BT2020);
+ break;
+ case C2Color::PRIMARIES_BT470_M:
+ *dataSpace |= HAL_DATASPACE_STANDARD_BT470M;
+ break;
+ case C2Color::PRIMARIES_BT709:
+ *dataSpace |= HAL_DATASPACE_STANDARD_BT709;
+ break;
+ default: break;
+ }
+#else
+ // for now use legacy implementation
+ ColorAspects aspects;
+ if (!sColorRangesSf.map(range, &aspects.mRange)) {
+ aspects.mRange = ColorAspects::RangeUnspecified;
+ }
+ if (!sColorPrimariesSf.map(primaries, &aspects.mPrimaries)) {
+ aspects.mPrimaries = ColorAspects::PrimariesUnspecified;
+ }
+ if (!sColorMatricesSf.map(matrix, &aspects.mMatrixCoeffs)) {
+ aspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
+ }
+ if (!sColorTransfersSf.map(transfer, &aspects.mTransfer)) {
+ aspects.mTransfer = ColorAspects::TransferUnspecified;
+ }
+ *dataSpace = ColorUtils::getDataSpaceForColorAspects(aspects, true /* mayExpand */);
+#endif
+ return true;
+}
+
+// static
+bool C2Mapper::map(C2Color::transfer_t from, ColorAspects::Transfer *to) {
+ return sColorTransfersSf.map(from, to);
+}
+
+// static
+bool C2Mapper::map(ColorAspects::Transfer from, C2Color::transfer_t *to) {
+ return sColorTransfersSf.map(from, to);
+}
diff --git a/media/codec2/sfplugin/utils/Codec2Mapper.h b/media/codec2/sfplugin/utils/Codec2Mapper.h
new file mode 100644
index 0000000..1eeb92e
--- /dev/null
+++ b/media/codec2/sfplugin/utils/Codec2Mapper.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_CODEC2_MAPPER_H_
+#define ANDROID_CODEC2_MAPPER_H_
+
+#include <C2Config.h>
+
+#include <media/stagefright/foundation/ColorUtils.h>
+
+#include <memory>
+
+namespace android {
+
+ /**
+ * Utility class to map Codec 2.0 values to android values.
+ */
+ struct C2Mapper {
+ struct ProfileLevelMapper {
+ virtual bool mapProfile(C2Config::profile_t, int32_t*) = 0;
+ virtual bool mapProfile(int32_t, C2Config::profile_t*) = 0;
+ virtual bool mapLevel(C2Config::level_t, int32_t*) = 0;
+ virtual bool mapLevel(int32_t, C2Config::level_t*) = 0;
+ virtual ~ProfileLevelMapper() = default;
+ };
+
+ static std::shared_ptr<ProfileLevelMapper>
+ GetProfileLevelMapper(std::string mediaType);
+
+ // convert between bitrates
+ static bool map(C2Config::bitrate_mode_t, int32_t*);
+ static bool map(int32_t, C2Config::bitrate_mode_t*);
+
+ // convert between pcm encodings
+ static bool map(C2Config::pcm_encoding_t, int32_t*);
+ static bool map(int32_t, C2Config::pcm_encoding_t*);
+
+ // convert between picture types
+ static bool map(C2Config::picture_type_t, int32_t*);
+ static bool map(int32_t, C2Config::picture_type_t*);
+
+ // convert between color aspects
+ static bool map(C2Color::range_t, int32_t*);
+ static bool map(int32_t, C2Color::range_t*);
+ static bool map(C2Color::primaries_t, C2Color::matrix_t, int32_t*);
+ static bool map(int32_t, C2Color::primaries_t*, C2Color::matrix_t*);
+ static bool map(C2Color::transfer_t, int32_t*);
+ static bool map(int32_t, C2Color::transfer_t*);
+
+ static bool map(
+ C2Color::range_t, C2Color::primaries_t, C2Color::matrix_t, C2Color::transfer_t,
+ uint32_t *dataSpace);
+
+ static bool map(C2Color::range_t, ColorAspects::Range*);
+ static bool map(ColorAspects::Range, C2Color::range_t*);
+ static bool map(C2Color::primaries_t, ColorAspects::Primaries*);
+ static bool map(ColorAspects::Primaries, C2Color::primaries_t*);
+ static bool map(C2Color::matrix_t, ColorAspects::MatrixCoeffs*);
+ static bool map(ColorAspects::MatrixCoeffs, C2Color::matrix_t*);
+ static bool map(C2Color::transfer_t, ColorAspects::Transfer*);
+ static bool map(ColorAspects::Transfer, C2Color::transfer_t*);
+ };
+}
+
+#endif // ANDROID_CODEC2_MAPPER_H_
diff --git a/media/codec2/tests/Android.bp b/media/codec2/tests/Android.bp
new file mode 100644
index 0000000..fce6e21
--- /dev/null
+++ b/media/codec2/tests/Android.bp
@@ -0,0 +1,79 @@
+cc_test {
+ name: "codec2_core_param_test",
+
+ srcs: [
+ "C2Param_test.cpp",
+ ],
+
+ include_dirs: [
+ "frameworks/av/media/codec2/vndk/include",
+ ],
+
+ header_libs: [
+ "libcodec2_headers",
+ ],
+
+ // param tests must not depend on any codec2 libraries as all params should be templated
+ shared_libs: [
+ ],
+
+ static_libs: [
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+}
+
+cc_test {
+ name: "codec2_vndk_test",
+
+ srcs: [
+ "C2_test.cpp",
+ "C2SampleComponent_test.cpp",
+ "C2UtilTest.cpp",
+ "vndk/C2BufferTest.cpp",
+ ],
+
+ include_dirs: [
+ ],
+
+ shared_libs: [
+ "libcodec2",
+ "libcodec2_vndk",
+ "libcutils",
+ "liblog",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+}
+
+cc_test {
+ name: "codec2_vndk_interface_test",
+
+ srcs: [
+ "C2ComponentInterface_test.cpp",
+ ],
+
+ header_libs: [
+ "media_plugin_headers",
+ ],
+
+ shared_libs: [
+ "libcutils",
+ "liblog",
+ "libcodec2",
+ "libcodec2_vndk",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+}
diff --git a/media/codec2/tests/C2ComponentInterface_test.cpp b/media/codec2/tests/C2ComponentInterface_test.cpp
new file mode 100644
index 0000000..e907964
--- /dev/null
+++ b/media/codec2/tests/C2ComponentInterface_test.cpp
@@ -0,0 +1,706 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "C2ComponentInterface_test"
+
+#include <dlfcn.h>
+#include <stdio.h>
+
+#include <gtest/gtest.h>
+#include <utils/Log.h>
+
+#include <C2Component.h>
+#include <C2Config.h>
+#include <util/C2InterfaceHelper.h>
+#include <C2Param.h>
+
+#if !defined(UNUSED)
+#define UNUSED(expr) \
+ do { \
+ (void)(expr); \
+ } while (0)
+
+#endif //!defined(UNUSED)
+
+namespace android {
+
+template <class T> std::unique_ptr<T> alloc_unique_cstr(const char *cstr) {
+ size_t len = strlen(cstr);
+ std::unique_ptr<T> ptr = T::AllocUnique(len);
+ memcpy(ptr->m.value, cstr, len);
+ return ptr;
+}
+
+class C2CompIntfTest : public ::testing::Test {
+protected:
+ C2CompIntfTest() {}
+ ~C2CompIntfTest() override {}
+
+ void setComponent(std::shared_ptr<C2ComponentInterface> intf) {
+ mIntf = intf;
+ }
+
+ void resetResults() {
+ mIntf = nullptr;
+ mParamResults.clear();
+ }
+
+ template <typename T> void testUnsupportedParam();
+
+ template <typename T> void testSupportedParam();
+
+ // testReadOnlyParam() and testWritableParam() are the main functions for testing a parameter.
+ // A caller should find out if a tested parameter is read-only or writable before calling them
+ // and it must call one of the corresponded them.
+
+ // If a parameter is read-only this is called.
+ // Test read-only parameter |preParam|. The test expects failure while config() with |newParam|,
+ // and make sure |preParam| stay unchanged.
+ template <typename T>
+ void testReadOnlyParam(const T &preParam, const T &newParam);
+
+ // If a parameter is writable this is called.
+ // Test one filed |writableField| for given writable parameter |param|.
+ // |validValues| contains all values obtained from querySupportedValues() for |writableField|.
+ // The test checks validity for config() with each value, and make sure values are config-ed
+ // by query() them out. |invalidValues| contains some values which are not in |validValues|.
+ // The test expects C2_BAD_VALUE while config() with these values,
+ // and |param| should stay unchanged.
+ template <typename TParam, typename TRealField, typename TField>
+ void testWritableParam(TParam *const param, TRealField *const writableField,
+ const std::vector<TField> &validValues,
+ const std::vector<TField> &invalidValues);
+
+ // Test all the defined parameters in C2Param.h.
+ void testMain(std::shared_ptr<C2ComponentInterface> intf,
+ const std::string &componentName);
+
+ // Check permission of parameter type |T| for testing interface.
+ // This should be called first of the testing per parameter type,
+ // therefore different testing process is applied according to the permission type.
+ template <typename T>
+ void checkParamPermission(
+ int *const writable,
+ const std::vector<std::shared_ptr<C2ParamDescriptor>> &supportedParams);
+
+private:
+ enum ParamPermission : int {
+ WRITABLE,
+ READONLY,
+ UNSUPPORTED,
+ };
+
+ struct paramTestInfo {
+ std::string name;
+ int result;
+ paramTestInfo(const char *name_, int result_)
+ : name(name_), result(result_) {}
+ };
+
+ // queryOnStack() and queryonHeap() both call an interface's query_vb() and
+ // check if a component has a parameter whose type is |T|.
+ // If a component has, the value should be copied into an argument, that is
+ // |p| in queryOnStack() and |heapParams| in queryOnHeap().
+ // The return value is c2_status_t (e.g. C2_OK).
+ template <typename T> c2_status_t queryOnStack(T *const p);
+
+ template <typename T>
+ c2_status_t queryOnHeap(const T &p,
+ std::vector<std::unique_ptr<C2Param>> *const heapParams);
+
+ // Get a value whose type is |T| in a component. The value is copied to |param|.
+ // This should be called only if a component has the parameter.
+ template <typename T> void getValue(T *const param);
+
+ // Check if the parameter's value in component is equal to |expected| and
+ // queryOnStack() and queryOnHeap() are succeeded. When this function called,
+ // it should be guaranteed a component has the parameter.
+ template <typename T> void queryParamAsExpected(const T &expected);
+
+ // Test if query functions works correctly for supported parameters.
+ // "Support" means here a component has the parameter.
+ template <typename T> void querySupportedParam();
+
+ // Test query functions works correctly for unsupported parameters.
+ // "Unsupport" means here a component doesn't have the parameter.
+ template <typename T> void queryUnsupportedParam();
+
+ // Execute an interface's config_vb(). |T| is a single parameter type, not std::vector.
+ // config() creates std::vector<C2Param *> {p} and passes it to config_vb().
+ template <typename T>
+ c2_status_t
+ config(T *const p,
+ std::vector<std::unique_ptr<C2SettingResult>> *const failures);
+
+ // Test if config works correctly for read-only parameters.
+ // Because the failure of config() is assumed, |newParam| doesn't matter.
+ template <typename T> void configReadOnlyParam(const T &newParam);
+
+ // Test if config works correctly for writable parameters.
+ // This changes the parameter's value to |newParam|.
+ // |stConfig| is a return value of config().
+ template <typename T> void configWritableParamValidValue(const T &newParam, c2_status_t *stConfig);
+
+ // Test if config works correctly in the case an invalid value |newParam| is tried to write
+ // to an writable parameter.
+ template <typename T> void configWritableParamInvalidValue(const T &newParam);
+
+ // Create values for testing from |validValueInfos|. The values are returned as arguments.
+ // |validValues| : valid values, which can be written for the parameter.
+ // |InvalidValues| : invalid values, which cannot be written for the parameter.
+ // config() should be failed if these values are used as new values.
+ // This function should be called only for writable and supported parameters.
+ template <typename TField>
+ void getTestValues(const C2FieldSupportedValues &validValueInfos,
+ std::vector<TField> *const validValues,
+ std::vector<TField> *const invalidValues);
+
+ // Output the summary of test results. Categorizes parameters with their configuration.
+ void outputResults(const std::string &name);
+
+ std::shared_ptr<C2ComponentInterface> mIntf;
+ std::vector<paramTestInfo> mParamResults;
+ std::string mCurrentParamName;
+};
+
+// factory function
+// TODO(hiroh): Add factory functions for other types.
+template <typename T> std::unique_ptr<T> makeParam() {
+ return std::make_unique<T>();
+}
+
+template <> std::unique_ptr<C2PortMimeConfig::input> makeParam() {
+ // TODO(hiroh): Set more precise length.
+ return C2PortMimeConfig::input::AllocUnique(100);
+}
+
+#define TRACED_FAILURE(func) \
+ do { \
+ SCOPED_TRACE(mCurrentParamName); \
+ func; \
+ if (::testing::Test::HasFatalFailure()) { \
+ return; \
+ } \
+ } while (false)
+
+template <typename T> c2_status_t C2CompIntfTest::queryOnStack(T *const p) {
+ std::vector<C2Param*> stackParams{p};
+ return mIntf->query_vb(stackParams, {}, C2_DONT_BLOCK, nullptr);
+}
+
+template <typename T>
+c2_status_t C2CompIntfTest::queryOnHeap(
+ const T &p, std::vector<std::unique_ptr<C2Param>> *const heapParams) {
+ uint32_t index = p.index() & ~0x03FE0000;
+ if (p.forStream()) {
+ index |= ((p.stream() << 17) & 0x01FE0000) | 0x02000000;
+ }
+ return mIntf->query_vb({}, {index}, C2_DONT_BLOCK, heapParams);
+}
+
+template <typename T> void C2CompIntfTest::getValue(T *const param) {
+ // When getValue() is called, a component has to have the parameter.
+ ASSERT_EQ(C2_OK, queryOnStack(param));
+}
+
+template <typename T>
+void C2CompIntfTest::queryParamAsExpected(const T &expected) {
+ // TODO(hiroh): Don't create param on stack and call queryOnStack for flex params.
+ // Note that all the current supported parameters are non-flex params.
+ T stack;
+ std::unique_ptr<T> pHeap = makeParam<T>();
+ std::vector<std::unique_ptr<C2Param>> heapParams;
+
+ ASSERT_EQ(C2_OK, queryOnStack(&stack));
+
+ // |stack| is a parameter value. The parameter size shouldn't be 0.
+ EXPECT_NE(0u, stack.size());
+ EXPECT_EQ(stack, expected);
+
+ ASSERT_EQ(C2_OK, queryOnHeap(*pHeap, &heapParams));
+
+ // |*heapParams[0]| is a parameter value. The size of |heapParams| has to be one.
+ ASSERT_EQ(1u, heapParams.size());
+ EXPECT_TRUE(heapParams[0]);
+ EXPECT_EQ(*heapParams[0], expected);
+}
+
+template <typename T> void C2CompIntfTest::querySupportedParam() {
+ std::unique_ptr<T> param = makeParam<T>();
+ // The current parameter's value is acquired by getValue(), which should be succeeded.
+ getValue(param.get());
+ queryParamAsExpected(*param);
+}
+
+template <typename T> void C2CompIntfTest::queryUnsupportedParam() {
+ // TODO(hiroh): Don't create param on stack and call queryOnStack for flex params.
+ // Note that all the current supported parameters are non-flex params.
+ T stack;
+ std::unique_ptr<T> pHeap = makeParam<T>();
+ std::vector<std::unique_ptr<C2Param>> heapParams;
+ // If a component doesn't have the parameter, queryOnStack() and queryOnHeap()
+ // should return C2_BAD_INDEX.
+ ASSERT_EQ(C2_BAD_INDEX, queryOnStack(&stack));
+ EXPECT_FALSE(stack);
+ ASSERT_EQ(C2_BAD_INDEX, queryOnHeap(*pHeap, &heapParams));
+ EXPECT_EQ(0u, heapParams.size());
+}
+
+template <typename T>
+c2_status_t C2CompIntfTest::config(
+ T *const p, std::vector<std::unique_ptr<C2SettingResult>> *const failures) {
+ std::vector<C2Param*> params{p};
+ return mIntf->config_vb(params, C2_DONT_BLOCK, failures);
+}
+
+// Create a new parameter copied from |p|.
+template <typename T> std::unique_ptr<T> makeParamFrom(const T &p) {
+ std::unique_ptr<T> retP = makeParam<T>();
+ EXPECT_TRUE(retP->updateFrom(p));
+ EXPECT_TRUE(memcmp(retP.get(), &p, sizeof(T)) == 0);
+ return retP;
+}
+
+template <typename T>
+void C2CompIntfTest::configReadOnlyParam(const T &newParam) {
+ std::unique_ptr<T> p = makeParamFrom(newParam);
+
+ std::vector<C2Param*> params{p.get()};
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+
+ // config_vb should be failed because a parameter is read-only.
+ ASSERT_EQ(C2_BAD_VALUE, mIntf->config_vb(params, C2_DONT_BLOCK, &failures));
+ ASSERT_EQ(1u, failures.size());
+ EXPECT_EQ(C2SettingResult::READ_ONLY, failures[0]->failure);
+}
+
+template <typename T>
+void C2CompIntfTest::configWritableParamValidValue(const T &newParam, c2_status_t *configResult) {
+ std::unique_ptr<T> p = makeParamFrom(newParam);
+
+ std::vector<C2Param*> params{p.get()};
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ // In most cases, config_vb return C2_OK and the parameter's value should be changed
+ // to |newParam|, which is confirmed in a caller of configWritableParamValueValue().
+ // However, this can return ~~~~ and the parameter's values is not changed,
+ // because there may be dependent limitations between fields or between parameters.
+ // TODO(hiroh): I have to fill the return value. Comments in C2Component.h doesn't mention
+ // about the return value when conflict happens. I set C2_BAD_VALUE to it temporarily now.
+ c2_status_t stConfig = mIntf->config_vb(params, C2_DONT_BLOCK, &failures);
+ if (stConfig == C2_OK) {
+ EXPECT_EQ(0u, failures.size());
+ } else {
+ ASSERT_EQ(C2_BAD_VALUE, stConfig);
+ EXPECT_EQ(1u, failures.size());
+ EXPECT_EQ(C2SettingResult::CONFLICT, failures[0]->failure);
+ }
+ *configResult = stConfig;
+}
+
+template <typename T>
+void C2CompIntfTest::configWritableParamInvalidValue(const T &newParam) {
+ std::unique_ptr<T> p = makeParamFrom(newParam);
+
+ std::vector<C2Param*> params{p.get()};
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ // Although a parameter is writable, config_vb should be failed,
+ // because a new value is invalid.
+ ASSERT_EQ(C2_BAD_VALUE, mIntf->config_vb(params, C2_DONT_BLOCK, &failures));
+ ASSERT_EQ(1u, failures.size());
+ EXPECT_EQ(C2SettingResult::BAD_VALUE, failures[0]->failure);
+}
+
+// There is only used enum type for the field type, that is C2DomainKind.
+// If another field type is added, it is necessary to add function for that.
+template <>
+void C2CompIntfTest::getTestValues(
+ const C2FieldSupportedValues &validValueInfos,
+ std::vector<C2DomainKind> *const validValues,
+ std::vector<C2DomainKind> *const invalidValues) {
+ UNUSED(validValueInfos);
+ validValues->emplace_back(C2DomainVideo);
+ validValues->emplace_back(C2DomainAudio);
+ validValues->emplace_back(C2DomainOther);
+
+ // There is no invalid value.
+ UNUSED(invalidValues);
+}
+
+template <typename TField>
+void C2CompIntfTest::getTestValues(
+ const C2FieldSupportedValues &validValueInfos,
+ std::vector<TField> *const validValues,
+ std::vector<TField> *const invalidValues) {
+ using TStorage = typename _c2_reduce_enum_to_underlying_type<TField>::type;
+
+ // The supported values are represented by C2Values. C2Value::Primitive needs to
+ // be transformed to a primitive value. This function is one to do that.
+ auto prim2Value = [](const C2Value::Primitive &prim) -> TField {
+ return (TField)prim.ref<TStorage>();
+ static_assert(std::is_same<TStorage, int32_t>::value ||
+ std::is_same<TStorage, uint32_t>::value ||
+ std::is_same<TStorage, int64_t>::value ||
+ std::is_same<TStorage, uint64_t>::value ||
+ std::is_same<TStorage, float>::value, "Invalid TField type.");
+ };
+
+ // The size of validValueInfos is one.
+ const auto &c2FSV = validValueInfos;
+
+ switch (c2FSV.type) {
+ case C2FieldSupportedValues::type_t::EMPTY: {
+ invalidValues->emplace_back(TField(0));
+ // TODO(hiroh) : Should other invalid values be tested?
+ break;
+ }
+ case C2FieldSupportedValues::type_t::RANGE: {
+ const auto &range = c2FSV.range;
+ auto rmin = prim2Value(range.min);
+ auto rmax = prim2Value(range.max);
+ auto rstep = prim2Value(range.step);
+
+ ASSERT_LE(rmin, rmax);
+
+ if (rstep != 0) {
+ // Increase linear
+ for (auto v = rmin; v <= rmax; v = TField(v + rstep)) {
+ validValues->emplace_back(v);
+ }
+ if (rmin > std::numeric_limits<TField>::min()) {
+ invalidValues->emplace_back(TField(rmin - 1));
+ }
+ if (rmax < std::numeric_limits<TField>::max()) {
+ invalidValues->emplace_back(TField(rmax + 1));
+ }
+ const unsigned int N = validValues->size();
+ if (N >= 2) {
+ if (std::is_same<TField, float>::value) {
+ invalidValues->emplace_back(TField((validValues->at(0) + validValues->at(1)) / 2));
+ invalidValues->emplace_back(TField((validValues->at(N - 2) + validValues->at(N - 1)) / 2));
+ } else {
+ if (rstep > 1) {
+ invalidValues->emplace_back(TField(validValues->at(0) + 1));
+ invalidValues->emplace_back(TField(validValues->at(N - 1) - 1));
+ }
+ }
+ }
+ } else {
+ // There should be two cases, except linear case.
+ // 1. integer geometric case
+ // 2. float geometric case
+
+ auto num = prim2Value(range.num);
+ auto denom = prim2Value(range.denom);
+
+ // If both range.num and range.denom are 1 and step is 0, we should use
+ // VALUES, shouldn't we?
+ ASSERT_FALSE(num == 1 && denom == 1);
+
+ // (num / denom) is not less than 1.
+ ASSERT_FALSE(denom == 0);
+ ASSERT_LE(denom, num);
+ for (auto v = rmin; v <= rmax; v = TField(v * num / denom)) {
+ validValues->emplace_back(v);
+ }
+
+ if (rmin > std::numeric_limits<TField>::min()) {
+ invalidValues->emplace_back(TField(rmin - 1));
+ }
+ if (rmax < std::numeric_limits<TField>::max()) {
+ invalidValues->emplace_back(TField(rmax + 1));
+ }
+
+ const unsigned int N = validValues->size();
+ if (N >= 2) {
+ if (std::is_same<TField, float>::value) {
+ invalidValues->emplace_back(TField((validValues->at(0) + validValues->at(1)) / 2));
+ invalidValues->emplace_back(TField((validValues->at(N - 2) + validValues->at(N - 1)) / 2));
+ } else {
+ if (validValues->at(1) - validValues->at(0) > 1) {
+ invalidValues->emplace_back(TField(validValues->at(0) + 1));
+ }
+ if (validValues->at(N - 1) - validValues->at(N - 2) > 1) {
+ invalidValues->emplace_back(TField(validValues->at(N - 1) - 1));
+ }
+ }
+ }
+ }
+ break;
+ }
+ case C2FieldSupportedValues::type_t::VALUES: {
+ for (const C2Value::Primitive &prim : c2FSV.values) {
+ validValues->emplace_back(prim2Value(prim));
+ }
+ auto minv = *std::min_element(validValues->begin(), validValues->end());
+ auto maxv = *std::max_element(validValues->begin(), validValues->end());
+ if (minv - 1 > std::numeric_limits<TField>::min()) {
+ invalidValues->emplace_back(TField(minv - 1));
+ }
+ if (maxv + 1 < std::numeric_limits<TField>::max()) {
+ invalidValues->emplace_back(TField(maxv + 1));
+ }
+ break;
+ }
+ case C2FieldSupportedValues::type_t::FLAGS: {
+ // TODO(hiroh) : Implement the case that param.type is FLAGS.
+ break;
+ }
+ }
+}
+
+template <typename T>
+void C2CompIntfTest::testReadOnlyParam(const T &preParam, const T &newParam) {
+ TRACED_FAILURE(configReadOnlyParam(newParam));
+ // Parameter value must not be changed
+ TRACED_FAILURE(queryParamAsExpected(preParam));
+}
+
+template <typename TParam, typename TRealField, typename TField>
+void C2CompIntfTest::testWritableParam(
+ TParam *const param, TRealField *const writableField,
+ const std::vector<TField> &validValues,
+ const std::vector<TField> &invalidValues) {
+ c2_status_t stConfig;
+
+ // Get the parameter's value in the beginning in order to reset the value at the end.
+ TRACED_FAILURE(getValue(param));
+ std::unique_ptr<TParam> defaultParam = makeParamFrom(*param);
+
+ // Test valid values
+ for (const auto &val : validValues) {
+ std::unique_ptr<TParam> preParam = makeParamFrom(*param);
+
+ // Param is try to be changed
+ *writableField = val;
+ TRACED_FAILURE(configWritableParamValidValue(*param, &stConfig));
+ if (stConfig == C2_OK) {
+ TRACED_FAILURE(queryParamAsExpected(*param));
+ } else {
+ // Param is unchanged because a field value conflicts with other field or parameter.
+ TRACED_FAILURE(queryParamAsExpected(*preParam));
+ }
+ }
+
+ // Store the current parameter in order to test |param| is unchanged
+ // after trying to write an invalid value.
+ std::unique_ptr<TParam> lastValidParam = makeParamFrom(*param);
+
+ // Test invalid values
+ for (const auto &val : invalidValues) {
+ // Param is changed
+ *writableField = val;
+ TRACED_FAILURE(configWritableParamInvalidValue(*param));
+ TRACED_FAILURE(queryParamAsExpected(*lastValidParam));
+ }
+ // Reset the parameter by config().
+ TRACED_FAILURE(configWritableParamValidValue(*defaultParam, &stConfig));
+}
+
+template <typename T> void C2CompIntfTest::testUnsupportedParam() {
+ TRACED_FAILURE(queryUnsupportedParam<T>());
+}
+
+template <typename T> void C2CompIntfTest::testSupportedParam() {
+ TRACED_FAILURE(querySupportedParam<T>());
+}
+
+bool isSupportedParam(
+ const C2Param ¶m,
+ const std::vector<std::shared_ptr<C2ParamDescriptor>> &sParams) {
+ for (const auto &pd : sParams) {
+ if (param.type() == pd->index().type()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+template <typename T>
+void C2CompIntfTest::checkParamPermission(
+ int *const result,
+ const std::vector<std::shared_ptr<C2ParamDescriptor>> &supportedParams) {
+ std::unique_ptr<T> param = makeParam<T>();
+
+ if (!isSupportedParam(*param, supportedParams)) {
+ // If a parameter isn't supported, it just finish after calling testUnsupportedParam().
+ testUnsupportedParam<T>();
+ *result = ParamPermission::UNSUPPORTED;
+ return;
+ }
+
+ testSupportedParam<T>();
+
+ TRACED_FAILURE(getValue(param.get()));
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ // Config does not change the parameter, because param is the present param.
+ // This config is executed to find out if a parameter is read-only or writable.
+ c2_status_t stStack = config(param.get(), &failures);
+ if (stStack == C2_BAD_VALUE) {
+ // Read-only
+ std::unique_ptr<T> newParam = makeParam<T>();
+ testReadOnlyParam(*param, *newParam);
+ *result = ParamPermission::READONLY;
+ } else {
+ // Writable
+ EXPECT_EQ(stStack, C2_OK);
+ *result = ParamPermission::WRITABLE;
+ }
+}
+
+void C2CompIntfTest::outputResults(const std::string &name) {
+ std::vector<std::string> params[3];
+ for (const auto &testInfo : mParamResults) {
+ int result = testInfo.result;
+ ASSERT_TRUE(0 <= result && result <= 2);
+ params[result].emplace_back(testInfo.name);
+ }
+ const char *resultString[] = {"Writable", "Read-Only", "Unsupported"};
+ printf("\n----TEST RESULTS (%s)----\n\n", name.c_str());
+ for (int i = 0; i < 3; i++) {
+ printf("[ %s ]\n", resultString[i]);
+ for (const auto &t : params[i]) {
+ printf("%s\n", t.c_str());
+ }
+ printf("\n");
+ }
+}
+
+#define TEST_GENERAL_WRITABLE_FIELD(TParam_, field_type_name_, field_name_) \
+ do { \
+ std::unique_ptr<TParam_> param = makeParam<TParam_>(); \
+ std::vector<C2FieldSupportedValuesQuery> validValueInfos = { \
+ C2FieldSupportedValuesQuery::Current( \
+ C2ParamField(param.get(), &field_type_name_::field_name_)) \
+ }; \
+ ASSERT_EQ(C2_OK, \
+ mIntf->querySupportedValues_vb(validValueInfos, C2_DONT_BLOCK)); \
+ ASSERT_EQ(1u, validValueInfos.size()); \
+ std::vector<decltype(param->field_name_)> validValues; \
+ std::vector<decltype(param->field_name_)> invalidValues; \
+ getTestValues(validValueInfos[0].values, &validValues, &invalidValues); \
+ testWritableParam(param.get(), ¶m->field_name_, validValues,\
+ invalidValues); \
+ } while (0)
+
+#define TEST_VSSTRUCT_WRITABLE_FIELD(TParam_, field_type_name_) \
+ do { \
+ TEST_GENERAL_WRITABLE_FIELD(TParam_, field_type_name_, width); \
+ TEST_GENERAL_WRITABLE_FIELD(TParam_, field_type_name_, height); \
+ } while (0)
+
+#define TEST_U32_WRITABLE_FIELD(TParam_, field_type_name_) \
+ TEST_GENERAL_WRITABLE_FIELD(TParam_, field_type_name_, value)
+
+#define TEST_ENUM_WRITABLE_FIELD(TParam_, field_type_name_) \
+ TEST_GENERAL_WRITABLE_FIELD(TParam_, field_type_name_, value)
+
+// TODO(hiroh): Support parameters based on char[] and uint32_t[].
+//#define TEST_STRING_WRITABLE_FIELD(TParam_, field_type_name_)
+// TEST_GENERAL_WRITABLE_FIELD(TParam_, field_type_name_, m.value)
+//#define TEST_U32ARRAY_WRITABLE_FIELD(Tparam_, field_type_name_)
+// TEST_GENERAL_WRITABLE_FIELD(Tparam_, uint32_t[], field_type_name_, values)
+
+#define EACH_TEST(TParam_, field_type_name_, test_name) \
+ do { \
+ int result = 0; \
+ this->mCurrentParamName = #TParam_; \
+ checkParamPermission<TParam_>(&result, supportedParams); \
+ if (result == ParamPermission::WRITABLE) { \
+ test_name(TParam_, field_type_name_); \
+ } \
+ mParamResults.emplace_back(#TParam_, result); \
+ } while (0)
+
+#define EACH_TEST_SELF(type_, test_name) EACH_TEST(type_, type_, test_name)
+#define EACH_TEST_INPUT(type_, test_name) EACH_TEST(type_::input, type_, test_name)
+#define EACH_TEST_OUTPUT(type_, test_name) EACH_TEST(type_::output, type_, test_name)
+void C2CompIntfTest::testMain(std::shared_ptr<C2ComponentInterface> intf,
+ const std::string &componentName) {
+ setComponent(intf);
+
+ std::vector<std::shared_ptr<C2ParamDescriptor>> supportedParams;
+ ASSERT_EQ(C2_OK, mIntf->querySupportedParams_nb(&supportedParams));
+
+ EACH_TEST_SELF(C2ComponentLatencyInfo, TEST_U32_WRITABLE_FIELD);
+ EACH_TEST_SELF(C2ComponentTemporalInfo, TEST_U32_WRITABLE_FIELD);
+ EACH_TEST_INPUT(C2PortLatencyInfo, TEST_U32_WRITABLE_FIELD);
+ EACH_TEST_OUTPUT(C2PortLatencyInfo, TEST_U32_WRITABLE_FIELD);
+ EACH_TEST_INPUT(C2StreamFormatConfig, TEST_U32_WRITABLE_FIELD);
+ EACH_TEST_OUTPUT(C2StreamFormatConfig, TEST_U32_WRITABLE_FIELD);
+ EACH_TEST_INPUT(C2PortStreamCountConfig, TEST_U32_WRITABLE_FIELD);
+ EACH_TEST_OUTPUT(C2PortStreamCountConfig, TEST_U32_WRITABLE_FIELD);
+
+ EACH_TEST_SELF(C2ComponentDomainInfo, TEST_ENUM_WRITABLE_FIELD);
+
+ // TODO(hiroh): Support parameters based on uint32_t[] and char[].
+ // EACH_TEST_INPUT(C2PortMimeConfig, TEST_STRING_WRITABLE_FIELD);
+ // EACH_TEST_OUTPUT(C2PortMimeConfig, TEST_STRING_WRITABLE_FIELD);
+ // EACH_TEST_INPUT(C2StreamMimeConfig, TEST_STRING_WRITABLE_FIELD);
+ // EACH_TEST_OUTPUT(C2StreamMimeConfig, TEST_STRING_WRITABLE_FIELD);
+
+ // EACH_TEST_SELF(C2SupportedParamsInfo, TEST_U32ARRAY_WRITABLE_FIELD);
+ // EACH_TEST_SELF(C2RequiredParamsInfo, TEST_U32ARRAY_WRITABLE_FIELD);
+ // EACH_TEST_SELF(C2ReadOnlyParamsInfo, TEST_U32ARRAY_WRITABLE_FIELD);
+ // EACH_TEST_SELF(C2RequestedInfosInfo, TEST_U32ARRAY_WRITABLE_FIELD);
+
+ EACH_TEST_INPUT(C2VideoSizeStreamInfo, TEST_VSSTRUCT_WRITABLE_FIELD);
+ EACH_TEST_OUTPUT(C2VideoSizeStreamInfo, TEST_VSSTRUCT_WRITABLE_FIELD);
+ EACH_TEST_INPUT(C2VideoSizeStreamTuning, TEST_VSSTRUCT_WRITABLE_FIELD);
+ EACH_TEST_OUTPUT(C2VideoSizeStreamTuning, TEST_VSSTRUCT_WRITABLE_FIELD);
+ EACH_TEST_INPUT(C2MaxVideoSizeHintPortSetting, TEST_VSSTRUCT_WRITABLE_FIELD);
+ EACH_TEST_OUTPUT(C2MaxVideoSizeHintPortSetting, TEST_VSSTRUCT_WRITABLE_FIELD);
+
+ outputResults(componentName);
+ resetResults();
+}
+
+TEST_F(C2CompIntfTest, C2V4L2CodecIntf) {
+
+ // Read a shared object library.
+ void* compLib = dlopen("system/lib/libv4l2_codec2.so", RTLD_NOW);
+
+ if (!compLib) {
+ printf("Cannot open library: %s.\n", dlerror());
+ FAIL();
+ return;
+ }
+
+ typedef C2ComponentStore* create_t();
+ create_t* create_store= (create_t*) dlsym(compLib, "create_store");
+ const char* dlsym_error = dlerror();
+ if (dlsym_error) {
+ printf("Cannot load symbol create: %s.\n", dlsym_error);
+ FAIL();
+ return;
+ }
+
+ typedef void destroy_t(C2ComponentStore*);
+ destroy_t* destroy_store = (destroy_t*) dlsym(compLib, "destroy_store");
+ dlsym_error = dlerror();
+ if (dlsym_error) {
+ printf("Cannot load symbol destroy: %s.\n", dlsym_error);
+ FAIL();
+ return;
+ }
+
+ std::shared_ptr<C2ComponentStore> componentStore(create_store(), destroy_store);
+ std::shared_ptr<C2ComponentInterface> componentIntf;
+ componentStore->createInterface("v4l2.decoder", &componentIntf);
+ auto componentName = "C2V4L2Codec";
+ testMain(componentIntf, componentName);
+}
+
+} // namespace android
diff --git a/media/codec2/tests/C2Param_test.cpp b/media/codec2/tests/C2Param_test.cpp
new file mode 100644
index 0000000..564d4d2
--- /dev/null
+++ b/media/codec2/tests/C2Param_test.cpp
@@ -0,0 +1,2515 @@
+/*
+ * Copyright 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2Param_test"
+
+#include <gtest/gtest.h>
+
+#define __C2_GENERATE_GLOBAL_VARS__
+#include <C2ParamDef.h>
+
+#include <list>
+
+void PrintTo(const _C2FieldId &id, ::std::ostream* os) {
+ *os << "@" << id._mOffset << "+" << id._mSize;
+}
+
+void PrintTo(const C2FieldDescriptor &fd, ::std::ostream *os) {
+ using FD=C2FieldDescriptor;
+ switch (fd.type()) {
+ case FD::INT32: *os << "i32"; break;
+ case FD::INT64: *os << "i64"; break;
+ case FD::UINT32: *os << "u32"; break;
+ case FD::UINT64: *os << "u64"; break;
+ case FD::FLOAT: *os << "float"; break;
+ case FD::STRING: *os << "char"; break;
+ case FD::BLOB: *os << "u8"; break;
+ default:
+ if (fd.type() & FD::STRUCT_FLAG) {
+ *os << "struct-" << (fd.type() & ~FD::STRUCT_FLAG);
+ } else {
+ *os << "type-" << fd.type();
+ }
+ }
+ *os << " " << fd.name();
+ if (fd.extent() > 1) {
+ *os << "[" << fd.extent() << "]";
+ } else if (fd.extent() == 0) {
+ *os << "[]";
+ }
+ *os << " (";
+ PrintTo(fd._mFieldId, os);
+ *os << "*" << fd.extent() << ")";
+}
+
+enum C2ParamIndexType : C2Param::type_index_t {
+ kParamIndexNumber,
+ kParamIndexNumbers,
+ kParamIndexNumber2,
+ kParamIndexVendorStart = C2Param::TYPE_INDEX_VENDOR_START,
+ kParamIndexVendorNumbers,
+};
+
+void ffff(int(*)(int)) {}
+
+/* ============================= STRUCT DECLARATION AND DESCRIPTION ============================= */
+
+typedef C2FieldDescriptor FD;
+
+class C2ParamTest : public ::testing::Test {
+};
+
+class C2ParamTest_ParamFieldList
+ : public ::testing::TestWithParam<std::vector<C2FieldDescriptor>> {
+};
+
+enum {
+ kParamIndexSize,
+ kParamIndexTestA,
+ kParamIndexTestB,
+ kParamIndexTestFlexS32,
+ kParamIndexTestFlexEndS32,
+ kParamIndexTestFlexS64,
+ kParamIndexTestFlexEndS64,
+ kParamIndexTestFlexSize,
+ kParamIndexTestFlexEndSize,
+};
+
+struct C2SizeStruct {
+ int32_t width;
+ int32_t height;
+ enum : uint32_t { CORE_INDEX = kParamIndexSize }; // <= needed for C2FieldDescriptor
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST;
+ static const std::vector<C2FieldDescriptor> FieldList(); // <= needed for C2FieldDescriptor
+ const static FD::type_t TYPE = (FD::type_t)(CORE_INDEX | FD::STRUCT_FLAG);
+};
+
+DEFINE_NO_NAMED_VALUES_FOR(C2SizeStruct)
+
+// Test 1. define a structure without any helper methods
+
+bool operator==(const C2FieldDescriptor &a, const C2FieldDescriptor &b) {
+ return a.type() == b.type()
+ && a.extent() == b.extent()
+ && a.name() == b.name()
+ && a._mFieldId == b._mFieldId;
+}
+
+struct C2TestStruct_A {
+ int32_t signed32;
+ int64_t signed64[2];
+ uint32_t unsigned32[1];
+ uint64_t unsigned64;
+ float fp32;
+ C2SizeStruct sz[3];
+ uint8_t blob[100];
+ char string[100];
+ bool yesNo[100];
+
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST;
+ static const std::vector<C2FieldDescriptor> FieldList();
+ // enum : uint32_t { CORE_INDEX = kParamIndexTest };
+ // typedef C2TestStruct_A _type;
+} __attribute__((packed));
+
+const std::vector<C2FieldDescriptor> C2TestStruct_A::FieldList() {
+ return _FIELD_LIST;
+}
+const std::vector<C2FieldDescriptor> C2TestStruct_A::_FIELD_LIST =
+ { { FD::INT32, 1, "s32", 0, 4 },
+ { FD::INT64, 2, "s64", 4, 8 },
+ { FD::UINT32, 1, "u32", 20, 4 },
+ { FD::UINT64, 1, "u64", 24, 8 },
+ { FD::FLOAT, 1, "fp", 32, 4 },
+ { C2SizeStruct::TYPE, 3, "size", 36, 8 },
+ { FD::BLOB, 100, "blob", 60, 1 },
+ { FD::STRING, 100, "str", 160, 1 },
+ { FD::BLOB, 100, "y-n", 260, 1 } };
+
+TEST_P(C2ParamTest_ParamFieldList, VerifyStruct) {
+ std::vector<C2FieldDescriptor> fields = GetParam(), expected = C2TestStruct_A::_FIELD_LIST;
+
+ // verify first field descriptor
+ EXPECT_EQ(FD::INT32, fields[0].type());
+ EXPECT_STREQ("s32", fields[0].name().c_str());
+ EXPECT_EQ(1u, fields[0].extent());
+ EXPECT_EQ(_C2FieldId(0, 4), fields[0]._mFieldId);
+
+ EXPECT_EQ(expected[0], fields[0]);
+ EXPECT_EQ(expected[1], fields[1]);
+ EXPECT_EQ(expected[2], fields[2]);
+ EXPECT_EQ(expected[3], fields[3]);
+ EXPECT_EQ(expected[4], fields[4]);
+ EXPECT_EQ(expected[5], fields[5]);
+ EXPECT_EQ(expected[6], fields[6]);
+ EXPECT_EQ(expected[7], fields[7]);
+ for (size_t i = 8; i < fields.size() && i < expected.size(); ++i) {
+ EXPECT_EQ(expected[i], fields[i]);
+ }
+}
+
+INSTANTIATE_TEST_CASE_P(InitializerList, C2ParamTest_ParamFieldList, ::testing::Values(C2TestStruct_A::_FIELD_LIST));
+
+// define fields using C2FieldDescriptor pointer constructor
+const std::vector<C2FieldDescriptor> C2TestStruct_A_FD_PTR_fieldList =
+ { C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->signed32, "s32"),
+ C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->signed64, "s64"),
+ C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->unsigned32, "u32"),
+ C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->unsigned64, "u64"),
+ C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->fp32, "fp"),
+ C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->sz, "size"),
+ C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->blob, "blob"),
+ C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->string, "str"),
+ // C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->yesNo, "y-n")
+ };
+
+INSTANTIATE_TEST_CASE_P(PointerConstructor, C2ParamTest_ParamFieldList, ::testing::Values(C2TestStruct_A_FD_PTR_fieldList));
+
+// define fields using C2FieldDescriptor member-pointer constructor
+const std::vector<C2FieldDescriptor> C2TestStruct_A_FD_MEM_PTR_fieldList =
+ { C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::signed32, "s32"),
+ C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::signed64, "s64"),
+ C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::unsigned32, "u32"),
+ C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::unsigned64, "u64"),
+ C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::fp32, "fp"),
+ C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::sz, "size"),
+ C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::blob, "blob"),
+ C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::string, "str"),
+ // C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::yesNo, "y-n")
+ };
+
+INSTANTIATE_TEST_CASE_P(MemberPointerConstructor, C2ParamTest_ParamFieldList, ::testing::Values(C2TestStruct_A_FD_MEM_PTR_fieldList));
+
+// Test 2. define a structure with two-step helper methods
+
+struct C2TestAStruct {
+ int32_t signed32;
+ int64_t signed64[2];
+ uint32_t unsigned32[1];
+ uint64_t unsigned64;
+ float fp32;
+ C2SizeStruct sz[3];
+ uint8_t blob[100];
+ char string[100];
+ bool yesNo[100];
+
+private: // test access level
+ DEFINE_C2STRUCT(TestA)
+} C2_PACK;
+
+DESCRIBE_C2STRUCT(TestA, {
+ C2FIELD(signed32, "s32")
+ C2FIELD(signed64, "s64")
+ C2FIELD(unsigned32, "u32")
+ C2FIELD(unsigned64, "u64")
+ C2FIELD(fp32, "fp")
+ C2FIELD(sz, "size")
+ C2FIELD(blob, "blob")
+ C2FIELD(string, "str")
+ // C2FIELD(yesNo, "y-n")
+}) // ; optional
+
+INSTANTIATE_TEST_CASE_P(DescribeStruct2Step, C2ParamTest_ParamFieldList, ::testing::Values(C2TestAStruct::FieldList()));
+
+// Test 3. define a structure with one-step helper method
+
+struct C2TestBStruct {
+ int32_t signed32;
+ int64_t signed64[2];
+ uint32_t unsigned32[1];
+ uint64_t unsigned64;
+ float fp32;
+ C2SizeStruct sz[3];
+ uint8_t blob[100];
+ char string[100];
+ bool yesNo[100];
+
+private: // test access level
+ DEFINE_AND_DESCRIBE_C2STRUCT(TestB)
+
+ C2FIELD(signed32, "s32")
+ C2FIELD(signed64, "s64")
+ C2FIELD(unsigned32, "u32")
+ C2FIELD(unsigned64, "u64")
+ C2FIELD(fp32, "fp")
+ C2FIELD(sz, "size")
+ C2FIELD(blob, "blob")
+ C2FIELD(string, "str")
+ // C2FIELD(yesNo, "y-n")
+};
+
+INSTANTIATE_TEST_CASE_P(DescribeStruct1Step, C2ParamTest_ParamFieldList, ::testing::Values(C2TestBStruct::FieldList()));
+
+// Test 4. flexible members
+
+template<typename T>
+class C2ParamTest_FlexParamFieldList : public ::testing::Test {
+protected:
+ using type_t=FD::type_t;
+
+ // static std::vector<std::vector<C2FieldDescriptor>>
+ static std::vector<std::vector<C2FieldDescriptor>>
+ GetLists();
+
+ constexpr static type_t FlexType =
+ std::is_same<T, int32_t>::value ? FD::INT32 :
+ std::is_same<T, int64_t>::value ? FD::INT64 :
+ std::is_same<T, uint32_t>::value ? FD::UINT32 :
+ std::is_same<T, uint64_t>::value ? FD::UINT64 :
+ std::is_same<T, float>::value ? FD::FLOAT :
+ std::is_same<T, uint8_t>::value ? FD::BLOB :
+ std::is_same<T, char>::value ? FD::STRING :
+ std::is_same<T, C2SizeStruct>::value ? C2SizeStruct::TYPE : (type_t)0;
+ constexpr static size_t FLEX_SIZE = sizeof(T);
+};
+
+typedef ::testing::Types<int32_t, int64_t, C2SizeStruct> FlexTypes;
+TYPED_TEST_CASE(C2ParamTest_FlexParamFieldList, FlexTypes);
+
+TYPED_TEST(C2ParamTest_FlexParamFieldList, VerifyStruct) {
+ for (auto a : this->GetLists()) {
+ std::vector<C2FieldDescriptor> fields = a;
+ if (fields.size() > 1) {
+ EXPECT_EQ(2u, fields.size());
+ EXPECT_EQ(C2FieldDescriptor(FD::INT32, 1, "s32", 0, 4), fields[0]);
+ EXPECT_EQ(C2FieldDescriptor(this->FlexType, 0, "flex", 4, this->FLEX_SIZE),
+ fields[1]);
+ } else {
+ EXPECT_EQ(1u, fields.size());
+ EXPECT_EQ(C2FieldDescriptor(this->FlexType, 0, "flex", 0, this->FLEX_SIZE),
+ fields[0]);
+ }
+ }
+}
+
+struct C2TestStruct_FlexS32 {
+ int32_t mFlex[];
+
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST;
+ static const std::vector<C2FieldDescriptor> FieldList();
+ // enum : uint32_t { CORE_INDEX = kParamIndexTestFlex, FLEX_SIZE = 4 };
+ // typedef C2TestStruct_FlexS32 _type;
+ // typedef int32_t FlexType;
+};
+
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexS32::FieldList() {
+ return _FIELD_LIST;
+}
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexS32::_FIELD_LIST = {
+ { FD::INT32, 0, "flex", 0, 4 }
+};
+
+struct C2TestStruct_FlexEndS32 {
+ int32_t signed32;
+ int32_t mFlex[];
+
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST;
+ static const std::vector<C2FieldDescriptor> FieldList();
+ // enum : uint32_t { CORE_INDEX = kParamIndexTestFlexEnd, FLEX_SIZE = 4 };
+ // typedef C2TestStruct_FlexEnd _type;
+ // typedef int32_t FlexType;
+};
+
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexEndS32::FieldList() {
+ return _FIELD_LIST;
+}
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexEndS32::_FIELD_LIST = {
+ { FD::INT32, 1, "s32", 0, 4 },
+ { FD::INT32, 0, "flex", 4, 4 },
+};
+
+const static std::vector<C2FieldDescriptor> C2TestStruct_FlexEndS32_ptr_fieldList = {
+ C2FieldDescriptor(&((C2TestStruct_FlexEndS32*)0)->signed32, "s32"),
+ C2FieldDescriptor(&((C2TestStruct_FlexEndS32*)0)->mFlex, "flex"),
+};
+
+struct C2TestFlexS32Struct {
+ int32_t mFlexSigned32[];
+private: // test access level
+ C2TestFlexS32Struct() {}
+
+ DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TestFlexS32, mFlexSigned32)
+ C2FIELD(mFlexSigned32, "flex")
+};
+
+struct C2TestFlexEndS32Struct {
+ int32_t signed32;
+ int32_t mFlexSigned32[];
+private: // test access level
+ C2TestFlexEndS32Struct() {}
+
+ DEFINE_FLEX_C2STRUCT(TestFlexEndS32, mFlexSigned32)
+} C2_PACK;
+
+DESCRIBE_C2STRUCT(TestFlexEndS32, {
+ C2FIELD(signed32, "s32")
+ C2FIELD(mFlexSigned32, "flex")
+}) // ; optional
+
+template<>
+std::vector<std::vector<C2FieldDescriptor>>
+//std::vector<std::vector<C2FieldDescriptor>>
+C2ParamTest_FlexParamFieldList<int32_t>::GetLists() {
+ return {
+ C2TestStruct_FlexS32::FieldList(),
+ C2TestStruct_FlexEndS32::FieldList(),
+ C2TestStruct_FlexEndS32_ptr_fieldList,
+ C2TestFlexS32Struct::FieldList(),
+ C2TestFlexEndS32Struct::FieldList(),
+ };
+}
+
+struct C2TestStruct_FlexS64 {
+ int64_t mFlexSigned64[];
+
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST;
+ static const std::vector<C2FieldDescriptor> FieldList();
+ // enum : uint32_t { CORE_INDEX = kParamIndexTestFlexS64, FLEX_SIZE = 8 };
+ // typedef C2TestStruct_FlexS64 _type;
+ // typedef int64_t FlexType;
+};
+
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexS64::FieldList() {
+ return _FIELD_LIST;
+}
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexS64::_FIELD_LIST = {
+ { FD::INT64, 0, "flex", 0, 8 }
+};
+
+struct C2TestStruct_FlexEndS64 {
+ int32_t signed32;
+ int64_t mSigned64Flex[];
+
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST;
+ static const std::vector<C2FieldDescriptor> FieldList();
+ // enum : uint32_t { CORE_INDEX = C2TestStruct_FlexEndS64, FLEX_SIZE = 8 };
+ // typedef C2TestStruct_FlexEndS64 _type;
+ // typedef int64_t FlexType;
+};
+
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexEndS64::FieldList() {
+ return _FIELD_LIST;
+}
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexEndS64::_FIELD_LIST = {
+ { FD::INT32, 1, "s32", 0, 4 },
+ { FD::INT64, 0, "flex", 4, 8 },
+};
+
+struct C2TestFlexS64Struct {
+ int64_t mFlexSigned64[];
+ C2TestFlexS64Struct() {}
+
+ DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TestFlexS64, mFlexSigned64)
+ C2FIELD(mFlexSigned64, "flex")
+};
+
+struct C2TestFlexEndS64Struct {
+ int32_t signed32;
+ int64_t mFlexSigned64[];
+ C2TestFlexEndS64Struct() {}
+
+ DEFINE_FLEX_C2STRUCT(TestFlexEndS64, mFlexSigned64)
+} C2_PACK;
+
+DESCRIBE_C2STRUCT(TestFlexEndS64, {
+ C2FIELD(signed32, "s32")
+ C2FIELD(mFlexSigned64, "flex")
+}) // ; optional
+
+template<>
+std::vector<std::vector<C2FieldDescriptor>>
+//std::vector<std::vector<C2FieldDescriptor>>
+C2ParamTest_FlexParamFieldList<int64_t>::GetLists() {
+ return {
+ C2TestStruct_FlexS64::FieldList(),
+ C2TestStruct_FlexEndS64::FieldList(),
+ C2TestFlexS64Struct::FieldList(),
+ C2TestFlexEndS64Struct::FieldList(),
+ };
+}
+
+struct C2TestStruct_FlexSize {
+ C2SizeStruct mFlexSize[];
+
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST;
+ static const std::vector<C2FieldDescriptor> FieldList();
+ // enum : uint32_t { CORE_INDEX = kParamIndexTestFlexSize, FLEX_SIZE = 8 };
+ // typedef C2TestStruct_FlexSize _type;
+ // typedef C2SizeStruct FlexType;
+};
+
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexSize::FieldList() {
+ return _FIELD_LIST;
+}
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexSize::_FIELD_LIST = {
+ { C2SizeStruct::TYPE, 0, "flex", 0, sizeof(C2SizeStruct) }
+};
+
+struct C2TestStruct_FlexEndSize {
+ int32_t signed32;
+ C2SizeStruct mSizeFlex[];
+
+ const static std::vector<C2FieldDescriptor> _FIELD_LIST;
+ static const std::vector<C2FieldDescriptor> FieldList();
+ // enum : uint32_t { CORE_INDEX = C2TestStruct_FlexEndSize, FLEX_SIZE = 8 };
+ // typedef C2TestStruct_FlexEndSize _type;
+ // typedef C2SizeStruct FlexType;
+};
+
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexEndSize::FieldList() {
+ return _FIELD_LIST;
+}
+const std::vector<C2FieldDescriptor> C2TestStruct_FlexEndSize::_FIELD_LIST = {
+ { FD::INT32, 1, "s32", 0, 4 },
+ { C2SizeStruct::TYPE, 0, "flex", 4, sizeof(C2SizeStruct) },
+};
+
+struct C2TestFlexSizeStruct {
+ C2SizeStruct mFlexSize[];
+ C2TestFlexSizeStruct() {}
+
+ DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TestFlexSize, mFlexSize)
+ C2FIELD(mFlexSize, "flex")
+};
+
+struct C2TestFlexEndSizeStruct {
+ int32_t signed32;
+ C2SizeStruct mFlexSize[];
+ C2TestFlexEndSizeStruct() {}
+
+ DEFINE_FLEX_C2STRUCT(TestFlexEndSize, mFlexSize)
+} C2_PACK;
+
+DESCRIBE_C2STRUCT(TestFlexEndSize, {
+ C2FIELD(signed32, "s32")
+ C2FIELD(mFlexSize, "flex")
+}) // ; optional
+
+struct C2TestBaseFlexEndSizeStruct {
+ int32_t signed32;
+ C2SizeStruct mFlexSize[];
+ C2TestBaseFlexEndSizeStruct() {}
+
+ DEFINE_BASE_FLEX_C2STRUCT(TestBaseFlexEndSize, mFlexSize)
+} C2_PACK;
+
+DESCRIBE_C2STRUCT(TestBaseFlexEndSize, {
+ C2FIELD(signed32, "s32")
+ C2FIELD(mFlexSize, "flex")
+}) // ; optional
+
+struct C2TestBaseFlexEndSize2Struct {
+ int32_t signed32;
+ C2SizeStruct mFlexSize[];
+ C2TestBaseFlexEndSize2Struct() {}
+
+ DEFINE_AND_DESCRIBE_BASE_FLEX_C2STRUCT(TestBaseFlexEndSize2, mFlexSize)
+ C2FIELD(signed32, "s32")
+ C2FIELD(mFlexSize, "flex")
+};
+
+template<>
+std::vector<std::vector<C2FieldDescriptor>>
+//std::vector<std::vector<C2FieldDescriptor>>
+C2ParamTest_FlexParamFieldList<C2SizeStruct>::GetLists() {
+ return {
+ C2TestStruct_FlexSize::FieldList(),
+ C2TestStruct_FlexEndSize::FieldList(),
+ C2TestFlexSizeStruct::FieldList(),
+ C2TestFlexEndSizeStruct::FieldList(),
+ C2TestBaseFlexEndSizeStruct::FieldList(),
+ C2TestBaseFlexEndSize2Struct::FieldList(),
+ };
+}
+
+TEST_F(C2ParamTest, FieldId) {
+ // pointer constructor
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&((C2TestStruct_A*)0)->signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&((C2TestStruct_A*)0)->signed64));
+ EXPECT_EQ(_C2FieldId(20, 4), _C2FieldId(&((C2TestStruct_A*)0)->unsigned32));
+ EXPECT_EQ(_C2FieldId(24, 8), _C2FieldId(&((C2TestStruct_A*)0)->unsigned64));
+ EXPECT_EQ(_C2FieldId(32, 4), _C2FieldId(&((C2TestStruct_A*)0)->fp32));
+ EXPECT_EQ(_C2FieldId(36, 8), _C2FieldId(&((C2TestStruct_A*)0)->sz));
+ EXPECT_EQ(_C2FieldId(60, 1), _C2FieldId(&((C2TestStruct_A*)0)->blob));
+ EXPECT_EQ(_C2FieldId(160, 1), _C2FieldId(&((C2TestStruct_A*)0)->string));
+ EXPECT_EQ(_C2FieldId(260, 1), _C2FieldId(&((C2TestStruct_A*)0)->yesNo));
+
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&((C2TestFlexEndSizeStruct*)0)->signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&((C2TestFlexEndSizeStruct*)0)->mFlexSize));
+
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&((C2TestBaseFlexEndSizeStruct*)0)->signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&((C2TestBaseFlexEndSizeStruct*)0)->mFlexSize));
+
+ // member pointer constructor
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::signed64));
+ EXPECT_EQ(_C2FieldId(20, 4), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::unsigned32));
+ EXPECT_EQ(_C2FieldId(24, 8), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::unsigned64));
+ EXPECT_EQ(_C2FieldId(32, 4), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::fp32));
+ EXPECT_EQ(_C2FieldId(36, 8), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::sz));
+ EXPECT_EQ(_C2FieldId(60, 1), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::blob));
+ EXPECT_EQ(_C2FieldId(160, 1), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::string));
+ EXPECT_EQ(_C2FieldId(260, 1), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::yesNo));
+
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId((C2TestFlexEndSizeStruct*)0, &C2TestFlexEndSizeStruct::signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId((C2TestFlexEndSizeStruct*)0, &C2TestFlexEndSizeStruct::mFlexSize));
+
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId((C2TestBaseFlexEndSizeStruct*)0, &C2TestBaseFlexEndSizeStruct::signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId((C2TestBaseFlexEndSizeStruct*)0, &C2TestBaseFlexEndSizeStruct::mFlexSize));
+
+ // member pointer sans type pointer
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&C2TestStruct_A::signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&C2TestStruct_A::signed64));
+ EXPECT_EQ(_C2FieldId(20, 4), _C2FieldId(&C2TestStruct_A::unsigned32));
+ EXPECT_EQ(_C2FieldId(24, 8), _C2FieldId(&C2TestStruct_A::unsigned64));
+ EXPECT_EQ(_C2FieldId(32, 4), _C2FieldId(&C2TestStruct_A::fp32));
+ EXPECT_EQ(_C2FieldId(36, 8), _C2FieldId(&C2TestStruct_A::sz));
+ EXPECT_EQ(_C2FieldId(60, 1), _C2FieldId(&C2TestStruct_A::blob));
+ EXPECT_EQ(_C2FieldId(160, 1), _C2FieldId(&C2TestStruct_A::string));
+ EXPECT_EQ(_C2FieldId(260, 1), _C2FieldId(&C2TestStruct_A::yesNo));
+
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&C2TestFlexEndSizeStruct::signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&C2TestFlexEndSizeStruct::mFlexSize));
+
+ EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&C2TestBaseFlexEndSizeStruct::signed32));
+ EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&C2TestBaseFlexEndSizeStruct::mFlexSize));
+
+ typedef C2GlobalParam<C2Info, C2TestAStruct> C2TestAInfo;
+ typedef C2GlobalParam<C2Info, C2TestFlexEndSizeStruct> C2TestFlexEndSizeInfo;
+ typedef C2GlobalParam<C2Info, C2TestBaseFlexEndSizeStruct, kParamIndexTestFlexEndSize> C2TestFlexEndSizeInfoFromBase;
+
+ // pointer constructor in C2Param
+ EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId(&((C2TestAInfo*)0)->signed32));
+ EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId(&((C2TestAInfo*)0)->signed64));
+ EXPECT_EQ(_C2FieldId(28, 4), _C2FieldId(&((C2TestAInfo*)0)->unsigned32));
+ EXPECT_EQ(_C2FieldId(32, 8), _C2FieldId(&((C2TestAInfo*)0)->unsigned64));
+ EXPECT_EQ(_C2FieldId(40, 4), _C2FieldId(&((C2TestAInfo*)0)->fp32));
+ EXPECT_EQ(_C2FieldId(44, 8), _C2FieldId(&((C2TestAInfo*)0)->sz));
+ EXPECT_EQ(_C2FieldId(68, 1), _C2FieldId(&((C2TestAInfo*)0)->blob));
+ EXPECT_EQ(_C2FieldId(168, 1), _C2FieldId(&((C2TestAInfo*)0)->string));
+ EXPECT_EQ(_C2FieldId(268, 1), _C2FieldId(&((C2TestAInfo*)0)->yesNo));
+
+ EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId(&((C2TestFlexEndSizeInfo*)0)->m.signed32));
+ EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId(&((C2TestFlexEndSizeInfo*)0)->m.mFlexSize));
+
+ EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId(&((C2TestFlexEndSizeInfoFromBase*)0)->m.signed32));
+ EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId(&((C2TestFlexEndSizeInfoFromBase*)0)->m.mFlexSize));
+
+ // member pointer in C2Param
+ EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::signed32));
+ EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::signed64));
+ EXPECT_EQ(_C2FieldId(28, 4), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::unsigned32));
+ EXPECT_EQ(_C2FieldId(32, 8), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::unsigned64));
+ EXPECT_EQ(_C2FieldId(40, 4), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::fp32));
+ EXPECT_EQ(_C2FieldId(44, 8), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::sz));
+ EXPECT_EQ(_C2FieldId(68, 1), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::blob));
+ EXPECT_EQ(_C2FieldId(168, 1), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::string));
+ EXPECT_EQ(_C2FieldId(268, 1), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::yesNo));
+
+ // NOTE: cannot use a member pointer for flex params due to introduction of 'm'
+ // EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId(&C2TestFlexEndSizeInfo::m.signed32));
+ // EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId(&C2TestFlexEndSizeInfo::m.mFlexSize));
+
+ // EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId(&C2TestFlexEndSizeInfoFromBase::m.signed32));
+ // EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId(&C2TestFlexEndSizeInfoFromBase::m.mFlexSize));
+
+
+}
+
+struct S32 {
+ template<typename T, class B=typename std::remove_extent<T>::type>
+ inline S32(const T*) {
+ static_assert(!std::is_array<T>::value, "should not be an array");
+ static_assert(std::is_same<B, int32_t>::value, "should be int32_t");
+ }
+};
+
+struct FLX {
+ template<typename U, typename T, class B=typename std::remove_extent<T>::type>
+ inline FLX(const T*, const U*) {
+ static_assert(std::is_array<T>::value, "should be an array");
+ static_assert(std::extent<T>::value == 0, "should be an array of 0 extent");
+ static_assert(std::is_same<B, U>::value, "should be type U");
+ }
+};
+
+struct MP {
+ template<typename U, typename T, typename ExpectedU, typename UnexpectedU>
+ inline MP(T U::*, const ExpectedU*, const UnexpectedU*) {
+ static_assert(!std::is_same<U, UnexpectedU>::value, "should not be member pointer of the base type");
+ static_assert(std::is_same<U, ExpectedU>::value, "should be member pointer of the derived type");
+ }
+
+ template<typename U, typename T, typename B, typename D>
+ inline MP(T D::*, const D*) { }
+};
+
+void compiledStatic_arrayTypePropagationTest() {
+ (void)S32(&((C2TestFlexEndS32Struct *)0)->signed32);
+ (void)FLX(&((C2TestFlexEndS32Struct *)0)->mFlexSigned32, (int32_t*)0);
+ (void)FLX(&((C2TestFlexS32Struct *)0)->mFlexSigned32, (int32_t*)0);
+
+ typedef C2GlobalParam<C2Info, C2TestAStruct> C2TestAInfo;
+
+ // TRICKY: &derivedClass::baseMember has type of baseClass::*
+ static_assert(std::is_same<decltype(&C2TestAInfo::signed32), int32_t C2TestAStruct::*>::value,
+ "base member pointer should have base class in type");
+
+ // therefore, member pointer expands to baseClass::* in templates
+ (void)MP(&C2TestAInfo::signed32,
+ (C2TestAStruct*)0 /* expected */, (C2TestAInfo*)0 /* unexpected */);
+ // but can be cast to derivedClass::*
+ (void)MP((int32_t C2TestAInfo::*)&C2TestAInfo::signed32,
+ (C2TestAInfo*)0 /* expected */, (C2TestAStruct*)0 /* unexpected */);
+
+ // TRICKY: baseClass::* does not autoconvert to derivedClass::* even in templates
+ // (void)MP(&C2TestAInfo::signed32, (C2TestAInfo*)0);
+}
+
+TEST_F(C2ParamTest, MemberPointerCast) {
+ typedef C2GlobalParam<C2Info, C2TestAStruct> C2TestAInfo;
+
+ static_assert(offsetof(C2TestAInfo, signed32) == 8, "offset should be 8");
+ constexpr int32_t C2TestAStruct::* s32ptr = &C2TestAInfo::signed32;
+ constexpr int32_t C2TestAInfo::* s32ptr_derived = (int32_t C2TestAStruct::*)&C2TestAInfo::signed32;
+ constexpr int32_t C2TestAInfo::* s32ptr_cast2derived = (int32_t C2TestAInfo::*)s32ptr;
+ C2TestAInfo *info = (C2TestAInfo *)256;
+ C2TestAStruct *strukt = (C2TestAStruct *)info;
+ int32_t *info_s32_derived = &(info->*s32ptr_derived);
+ int32_t *info_s32_cast2derived = &(info->*s32ptr_cast2derived);
+ int32_t *info_s32 = &(info->*s32ptr);
+ int32_t *strukt_s32 = &(strukt->*s32ptr);
+
+ EXPECT_EQ(256u, (uintptr_t)info);
+ EXPECT_EQ(264u, (uintptr_t)strukt);
+ EXPECT_EQ(264u, (uintptr_t)info_s32_derived);
+ EXPECT_EQ(264u, (uintptr_t)info_s32_cast2derived);
+ EXPECT_EQ(264u, (uintptr_t)info_s32);
+ EXPECT_EQ(264u, (uintptr_t)strukt_s32);
+
+ typedef C2GlobalParam<C2Info, C2TestFlexEndSizeStruct> C2TestFlexEndSizeInfo;
+ static_assert(offsetof(C2TestFlexEndSizeInfo, m.signed32) == 8, "offset should be 8");
+ static_assert(offsetof(C2TestFlexEndSizeInfo, m.mFlexSize) == 12, "offset should be 12");
+
+ typedef C2GlobalParam<C2Info, C2TestBaseFlexEndSizeStruct, kParamIndexTestFlexEndSize> C2TestFlexEndSizeInfoFromBase;
+ static_assert(offsetof(C2TestFlexEndSizeInfoFromBase, m.signed32) == 8, "offset should be 8");
+ static_assert(offsetof(C2TestFlexEndSizeInfoFromBase, m.mFlexSize) == 12, "offset should be 12");
+}
+
+/* ===================================== PARAM USAGE TESTS ===================================== */
+
+struct C2NumberStruct {
+ int32_t mNumber;
+ C2NumberStruct() {}
+ C2NumberStruct(int32_t _number) : mNumber(_number) {}
+
+ DEFINE_AND_DESCRIBE_C2STRUCT(Number)
+ C2FIELD(mNumber, "number")
+};
+
+struct C2NumberBaseStruct {
+ int32_t mNumber;
+ C2NumberBaseStruct() {}
+ C2NumberBaseStruct(int32_t _number) : mNumber(_number) {}
+
+ DEFINE_AND_DESCRIBE_BASE_C2STRUCT(NumberBase)
+ C2FIELD(mNumber, "number")
+};
+
+struct C2NumbersStruct {
+ int32_t mNumbers[];
+ C2NumbersStruct() {}
+
+ DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(Numbers, mNumbers)
+ C2FIELD(mNumbers, "numbers")
+};
+static_assert(sizeof(C2NumbersStruct) == 0, "C2NumbersStruct has incorrect size");
+
+typedef C2GlobalParam<C2Info, C2NumberStruct> C2NumberInfo;
+
+typedef C2GlobalParam<C2Tuning, C2NumberStruct> C2NumberTuning;
+typedef C2PortParam<C2Tuning, C2NumberStruct> C2NumberPortTuning;
+typedef C2StreamParam<C2Tuning, C2NumberStruct> C2NumberStreamTuning;
+
+typedef C2GlobalParam<C2Tuning, C2NumbersStruct> C2NumbersTuning;
+typedef C2PortParam<C2Tuning, C2NumbersStruct> C2NumbersPortTuning;
+typedef C2StreamParam<C2Tuning, C2NumbersStruct> C2NumbersStreamTuning;
+
+//
+#if 0
+
+void test() {
+ C2NumberStruct s(10);
+ (void)C2NumberStruct::FieldList();
+};
+
+typedef C2StreamParam<C2Tuning, C2Int64Value, kParamIndexNumberB> C2NumberConfig4;
+typedef C2PortParam<C2Tuning, C2Int32Value, kParamIndexNumber> C2NumberConfig3;
+typedef C2GlobalParam<C2Tuning, C2StringValue, kParamIndexNumber> C2VideoNameConfig;
+
+void test3() {
+ C2NumberConfig3 s(10);
+ s.value = 11;
+ s = 12;
+ (void)C2NumberConfig3::FieldList();
+ std::shared_ptr<C2VideoNameConfig> n = C2VideoNameConfig::AllocShared(25);
+ strcpy(n->m.value, "lajos");
+ C2NumberConfig4 t(false, 0, 11);
+ t.value = 15;
+};
+
+struct C2NumbersStruct {
+ int32_t mNumbers[];
+ enum { CORE_INDEX = kParamIndexNumber };
+ const static std::vector<C2FieldDescriptor> FieldList();
+ static const std::vector<C2FieldDescriptor> FieldList();
+ C2NumbersStruct() {}
+
+ FLEX(C2NumbersStruct, mNumbers);
+};
+
+static_assert(sizeof(C2NumbersStruct) == 0, "yes");
+
+
+typedef C2GlobalParam<C2Info, C2NumbersStruct> C2NumbersInfo;
+
+const std::vector<C2FieldDescriptor> C2NumbersStruct::FieldList() {
+ return _FIELD_LIST;
+}
+const std::vector<C2FieldDescriptor> C2NumbersStruct::_FIELD_LIST =
+// { { FD::INT32, 0, "widths" } };
+ { C2FieldDescriptor(&((C2NumbersStruct*)(nullptr))->mNumbers, "number") };
+
+typedef C2PortParam<C2Tuning, C2NumberStruct> C2NumberConfig;
+
+std::vector<C2FieldDescriptor> myList = C2NumberConfig::FieldList();
+
+ std::unique_ptr<C2ParamDescriptor> __test_describe(uint32_t paramType) {
+ std::list<C2FieldDescriptor> fields = describeC2Params<C2NumberConfig>();
+
+ auto widths = C2NumbersInfo::AllocShared(5);
+ widths->flexCount();
+ widths->m.mNumbers[4] = 1;
+
+ test();
+ test3();
+
+ C2NumberConfig outputWidth(false, 123);
+
+ C2Param::Index index(paramType);
+ switch (paramType) {
+ case C2NumberConfig::CORE_INDEX:
+ return std::unique_ptr<C2ParamDescriptor>(new C2ParamDescriptor{
+ true /* isRequired */,
+ "number",
+ index,
+ });
+ }
+ return nullptr;
+ }
+
+
+} // namespace android
+
+#endif
+//
+
+template<typename T>
+bool canSetPort(T &o, bool output) { return o.setPort(output); }
+bool canSetPort(...) { return false; }
+
+template<typename S, typename=decltype(((S*)0)->setPort(true))>
+static std::true_type _canCallSetPort(int);
+template<typename>
+static std::false_type _canCallSetPort(...);
+#define canCallSetPort(x) decltype(_canCallSetPort<std::remove_reference<decltype(x)>::type>(0))::value
+
+/* ======================================= STATIC TESTS ======================================= */
+
+static_assert(_C2Comparable<int>::value, "int is not comparable");
+static_assert(!_C2Comparable<void>::value, "void is comparable");
+
+struct C2_HIDE _test0 {
+ bool operator==(const _test0&);
+ bool operator!=(const _test0&);
+};
+struct C2_HIDE _test1 {
+ bool operator==(const _test1&);
+};
+struct C2_HIDE _test2 {
+ bool operator!=(const _test2&);
+};
+static_assert(_C2Comparable<_test0>::value, "class with == and != is not comparable");
+static_assert(_C2Comparable<_test1>::value, "class with == is not comparable");
+static_assert(_C2Comparable<_test2>::value, "class with != is not comparable");
+
+/* ======================================= C2PARAM TESTS ======================================= */
+
+struct _C2ParamInspector {
+ static void StaticTest();
+ static void StaticFromBaseTest();
+ static void StaticFlexTest();
+ static void StaticFlexFromBaseTest();
+};
+
+// TEST_F(_C2ParamInspector, StaticTest) {
+void _C2ParamInspector::StaticTest() {
+ typedef C2Param::Index I;
+
+ // C2NumberStruct: CORE_INDEX = kIndex (args)
+ static_assert(C2NumberStruct::CORE_INDEX == kParamIndexNumber, "bad index");
+ static_assert(sizeof(C2NumberStruct) == 4, "bad size");
+
+ // C2NumberTuning: kIndex | tun | global (args)
+ static_assert(C2NumberTuning::CORE_INDEX == kParamIndexNumber, "bad index");
+ static_assert(C2NumberTuning::PARAM_TYPE == (kParamIndexNumber | I::KIND_TUNING | I::DIR_GLOBAL), "bad index");
+ static_assert(sizeof(C2NumberTuning) == 12, "bad size");
+
+ static_assert(offsetof(C2NumberTuning, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumberTuning, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumberTuning, mNumber) == 8, "bad offset");
+
+ // C2NumberPortTuning: kIndex | tun | port (bool, args)
+ static_assert(sizeof(C2NumberPortTuning) == 12, "bad size");
+ // C2NumberPortTuning::input: kIndex | tun | port | input (args)
+ // C2NumberPortTuning::output: kIndex | tun | port | output (args)
+ static_assert(C2NumberPortTuning::input::CORE_INDEX ==
+ kParamIndexNumber, "bad index");
+ static_assert(C2NumberPortTuning::input::PARAM_TYPE ==
+ (kParamIndexNumber | I::KIND_TUNING | I::DIR_INPUT), "bad index");
+ static_assert(C2NumberPortTuning::output::CORE_INDEX ==
+ kParamIndexNumber, "bad index");
+ static_assert(C2NumberPortTuning::output::PARAM_TYPE ==
+ (kParamIndexNumber | I::KIND_TUNING | I::DIR_OUTPUT), "bad index");
+ static_assert(sizeof(C2NumberPortTuning::input) == 12, "bad size");
+ static_assert(sizeof(C2NumberPortTuning::output) == 12, "bad size");
+ static_assert(offsetof(C2NumberPortTuning::input, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumberPortTuning::input, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumberPortTuning::input, mNumber) == 8, "bad offset");
+ static_assert(offsetof(C2NumberPortTuning::output, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumberPortTuning::output, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumberPortTuning::output, mNumber) == 8, "bad offset");
+
+ // C2NumberStreamTuning: kIndex | tun | str (bool, uint, args)
+ static_assert(sizeof(C2NumberStreamTuning) == 12u, "bad size");
+ // C2NumberStreamTuning::input kIndex | tun | str | input (int, args)
+ // C2NumberStreamTuning::output kIx | tun | str | output (int, args)
+ static_assert(C2NumberStreamTuning::input::CORE_INDEX ==
+ kParamIndexNumber, "bad index");
+ static_assert(C2NumberStreamTuning::input::PARAM_TYPE ==
+ (kParamIndexNumber | I::KIND_TUNING | I::DIR_INPUT | I::IS_STREAM_FLAG), "bad index");
+ static_assert(C2NumberStreamTuning::output::CORE_INDEX ==
+ kParamIndexNumber, "bad index");
+ static_assert(C2NumberStreamTuning::output::PARAM_TYPE ==
+ (kParamIndexNumber | I::KIND_TUNING | I::DIR_OUTPUT | I::IS_STREAM_FLAG), "bad index");
+ static_assert(sizeof(C2NumberStreamTuning::input) == 12u, "bad size");
+ static_assert(sizeof(C2NumberStreamTuning::output) == 12u, "bad size");
+ static_assert(offsetof(C2NumberStreamTuning::input, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumberStreamTuning::input, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumberStreamTuning::input, mNumber) == 8, "bad offset");
+ static_assert(offsetof(C2NumberStreamTuning::output, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumberStreamTuning::output, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumberStreamTuning::output, mNumber) == 8, "bad offset");
+}
+
+void _C2ParamInspector::StaticFromBaseTest() {
+ enum { kParamIndexMy = 3102 };
+ typedef C2NumberBaseStruct C2MyStruct;
+ typedef C2GlobalParam<C2Setting, C2MyStruct, kParamIndexMy> C2MySetting;
+ typedef C2PortParam<C2Setting, C2MyStruct, kParamIndexMy> C2MyPortSetting;
+ typedef C2StreamParam<C2Setting, C2MyStruct, kParamIndexMy> C2MyStreamSetting;
+
+ typedef C2Param::Index I;
+
+ // C2MyStruct has no CORE_INDEX
+ //static_assert(C2MyStruct::CORE_INDEX == kParamIndexMy, "bad index");
+ static_assert(sizeof(C2MyStruct) == 4, "bad size");
+
+ // C2MySetting: kIndex | tun | global (args)
+ static_assert(C2MySetting::CORE_INDEX == kParamIndexMy, "bad index");
+ static_assert(C2MySetting::PARAM_TYPE == (kParamIndexMy | I::KIND_SETTING | I::DIR_GLOBAL), "bad index");
+ static_assert(sizeof(C2MySetting) == 12, "bad size");
+
+ static_assert(offsetof(C2MySetting, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MySetting, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MySetting, mNumber) == 8, "bad offset");
+
+ // C2MyPortSetting: kIndex | tun | port (bool, args)
+ static_assert(sizeof(C2MyPortSetting) == 12, "bad size");
+ // C2MyPortSetting::input: kIndex | tun | port | input (args)
+ // C2MyPortSetting::output: kIndex | tun | port | output (args)
+ static_assert(C2MyPortSetting::input::CORE_INDEX ==
+ kParamIndexMy, "bad index");
+ static_assert(C2MyPortSetting::input::PARAM_TYPE ==
+ (kParamIndexMy | I::KIND_SETTING | I::DIR_INPUT), "bad index");
+ static_assert(C2MyPortSetting::output::CORE_INDEX ==
+ kParamIndexMy, "bad index");
+ static_assert(C2MyPortSetting::output::PARAM_TYPE ==
+ (kParamIndexMy | I::KIND_SETTING | I::DIR_OUTPUT), "bad index");
+ static_assert(sizeof(C2MyPortSetting::input) == 12, "bad size");
+ static_assert(sizeof(C2MyPortSetting::output) == 12, "bad size");
+ static_assert(offsetof(C2MyPortSetting::input, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyPortSetting::input, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyPortSetting::input, mNumber) == 8, "bad offset");
+ static_assert(offsetof(C2MyPortSetting::output, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyPortSetting::output, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyPortSetting::output, mNumber) == 8, "bad offset");
+
+ // C2MyStreamSetting: kIndex | tun | str (bool, uint, args)
+ static_assert(sizeof(C2MyStreamSetting) == 12u, "bad size");
+ // C2MyStreamSetting::input kIndex | tun | str | input (int, args)
+ // C2MyStreamSetting::output kIx | tun | str | output (int, args)
+ static_assert(C2MyStreamSetting::input::CORE_INDEX ==
+ kParamIndexMy, "bad index");
+ static_assert(C2MyStreamSetting::input::PARAM_TYPE ==
+ (kParamIndexMy | I::KIND_SETTING | I::DIR_INPUT | I::IS_STREAM_FLAG), "bad index");
+ static_assert(C2MyStreamSetting::output::CORE_INDEX ==
+ kParamIndexMy, "bad index");
+ static_assert(C2MyStreamSetting::output::PARAM_TYPE ==
+ (kParamIndexMy | I::KIND_SETTING | I::DIR_OUTPUT | I::IS_STREAM_FLAG), "bad index");
+ static_assert(sizeof(C2MyStreamSetting::input) == 12u, "bad size");
+ static_assert(sizeof(C2MyStreamSetting::output) == 12u, "bad size");
+ static_assert(offsetof(C2MyStreamSetting::input, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyStreamSetting::input, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyStreamSetting::input, mNumber) == 8, "bad offset");
+ static_assert(offsetof(C2MyStreamSetting::output, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyStreamSetting::output, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyStreamSetting::output, mNumber) == 8, "bad offset");
+}
+
+void _C2ParamInspector::StaticFlexTest() {
+ typedef C2Param::Index I;
+
+ // C2NumbersStruct: CORE_INDEX = kIndex (args)
+ static_assert(C2NumbersStruct::CORE_INDEX == (I::IS_FLEX_FLAG | kParamIndexNumbers), "bad index");
+ static_assert(sizeof(C2NumbersStruct) == 0, "bad size");
+
+ // C2NumbersTuning: kIndex | tun | global (args)
+ static_assert(C2NumbersTuning::CORE_INDEX == (I::IS_FLEX_FLAG | kParamIndexNumbers), "bad index");
+ static_assert(C2NumbersTuning::PARAM_TYPE == (I::IS_FLEX_FLAG | kParamIndexNumbers | I::KIND_TUNING | I::DIR_GLOBAL), "bad index");
+ static_assert(sizeof(C2NumbersTuning) == 8, "bad size");
+
+ static_assert(offsetof(C2NumbersTuning, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumbersTuning, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumbersTuning, m.mNumbers) == 8, "bad offset");
+
+ // C2NumbersPortTuning: kIndex | tun | port (bool, args)
+ static_assert(sizeof(C2NumbersPortTuning) == 8, "bad size");
+ // C2NumbersPortTuning::input: kIndex | tun | port | input (args)
+ // C2NumbersPortTuning::output: kIndex | tun | port | output (args)
+ static_assert(C2NumbersPortTuning::input::CORE_INDEX ==
+ (I::IS_FLEX_FLAG | kParamIndexNumbers), "bad index");
+ static_assert(C2NumbersPortTuning::input::PARAM_TYPE ==
+ (I::IS_FLEX_FLAG | kParamIndexNumbers | I::KIND_TUNING | I::DIR_INPUT), "bad index");
+ static_assert(C2NumbersPortTuning::output::CORE_INDEX ==
+ (I::IS_FLEX_FLAG | kParamIndexNumbers), "bad index");
+ static_assert(C2NumbersPortTuning::output::PARAM_TYPE ==
+ (I::IS_FLEX_FLAG | kParamIndexNumbers | I::KIND_TUNING | I::DIR_OUTPUT), "bad index");
+ static_assert(sizeof(C2NumbersPortTuning::input) == 8, "bad size");
+ static_assert(sizeof(C2NumbersPortTuning::output) == 8, "bad size");
+ static_assert(offsetof(C2NumbersPortTuning::input, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumbersPortTuning::input, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumbersPortTuning::input, m.mNumbers) == 8, "bad offset");
+ static_assert(offsetof(C2NumbersPortTuning::output, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumbersPortTuning::output, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumbersPortTuning::output, m.mNumbers) == 8, "bad offset");
+
+ // C2NumbersStreamTuning: kIndex | tun | str (bool, uint, args)
+ static_assert(sizeof(C2NumbersStreamTuning) == 8, "bad size");
+ // C2NumbersStreamTuning::input kIndex | tun | str | input (int, args)
+ // C2NumbersStreamTuning::output kIx | tun | str | output (int, args)
+ static_assert(C2NumbersStreamTuning::input::CORE_INDEX ==
+ (I::IS_FLEX_FLAG | kParamIndexNumbers), "bad index");
+ static_assert(C2NumbersStreamTuning::input::PARAM_TYPE ==
+ (I::IS_FLEX_FLAG | kParamIndexNumbers | I::KIND_TUNING | I::DIR_INPUT | I::IS_STREAM_FLAG), "bad index");
+ static_assert(C2NumbersStreamTuning::output::CORE_INDEX ==
+ (I::IS_FLEX_FLAG | kParamIndexNumbers), "bad index");
+ static_assert(C2NumbersStreamTuning::output::PARAM_TYPE ==
+ (I::IS_FLEX_FLAG | kParamIndexNumbers | I::KIND_TUNING | I::DIR_OUTPUT | I::IS_STREAM_FLAG), "bad index");
+ static_assert(sizeof(C2NumbersStreamTuning::input) == 8, "bad size");
+ static_assert(sizeof(C2NumbersStreamTuning::output) == 8, "bad size");
+ static_assert(offsetof(C2NumbersStreamTuning::input, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumbersStreamTuning::input, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumbersStreamTuning::input, m.mNumbers) == 8, "bad offset");
+ static_assert(offsetof(C2NumbersStreamTuning::output, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2NumbersStreamTuning::output, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2NumbersStreamTuning::output, m.mNumbers) == 8, "bad offset");
+}
+
+template<bool, unsigned ...N>
+struct _print_as_warning { };
+
+template<unsigned ...N>
+struct _print_as_warning<true, N...> : std::true_type { };
+
+#define static_assert_equals(a, b, msg) \
+static_assert(_print_as_warning<(a) == (b), a, b>::value, msg)
+
+void _C2ParamInspector::StaticFlexFromBaseTest() {
+ enum { kParamIndexMy = 1203 };
+ typedef C2TestBaseFlexEndSizeStruct C2MyStruct;
+ typedef C2GlobalParam<C2Info, C2MyStruct, kParamIndexMy> C2MyInfo;
+ typedef C2PortParam<C2Info, C2MyStruct, kParamIndexMy> C2MyPortInfo;
+ typedef C2StreamParam<C2Info, C2MyStruct, kParamIndexMy> C2MyStreamInfo;
+
+ typedef C2Param::Index I;
+
+ // C2MyStruct has no CORE_INDEX
+ //static_assert(C2MyStruct::CORE_INDEX == (I::IS_FLEX_FLAG | kParamIndexMy), "bad index");
+ static_assert(sizeof(C2MyStruct) == 4, "bad size");
+
+ // C2MyInfo: kIndex | tun | global (args)
+ static_assert_equals(C2MyInfo::CORE_INDEX, (I::IS_FLEX_FLAG | kParamIndexMy), "bad index");
+ static_assert_equals(C2MyInfo::PARAM_TYPE, (I::IS_FLEX_FLAG | kParamIndexMy | I::KIND_INFO | I::DIR_GLOBAL), "bad index");
+ static_assert(sizeof(C2MyInfo) == 12, "bad size");
+
+ static_assert(offsetof(C2MyInfo, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyInfo, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyInfo, m.signed32) == 8, "bad offset");
+
+ // C2MyPortInfo: kIndex | tun | port (bool, args)
+ static_assert(sizeof(C2MyPortInfo) == 12, "bad size");
+ // C2MyPortInfo::input: kIndex | tun | port | input (args)
+ // C2MyPortInfo::output: kIndex | tun | port | output (args)
+ static_assert(C2MyPortInfo::input::CORE_INDEX ==
+ (I::IS_FLEX_FLAG | kParamIndexMy), "bad index");
+ static_assert(C2MyPortInfo::input::PARAM_TYPE ==
+ (I::IS_FLEX_FLAG | kParamIndexMy | I::KIND_INFO | I::DIR_INPUT), "bad index");
+ static_assert(C2MyPortInfo::output::CORE_INDEX ==
+ (I::IS_FLEX_FLAG | kParamIndexMy), "bad index");
+ static_assert(C2MyPortInfo::output::PARAM_TYPE ==
+ (I::IS_FLEX_FLAG | kParamIndexMy | I::KIND_INFO | I::DIR_OUTPUT), "bad index");
+ static_assert(sizeof(C2MyPortInfo::input) == 12, "bad size");
+ static_assert(sizeof(C2MyPortInfo::output) == 12, "bad size");
+ static_assert(offsetof(C2MyPortInfo::input, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyPortInfo::input, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyPortInfo::input, m.signed32) == 8, "bad offset");
+ static_assert(offsetof(C2MyPortInfo::output, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyPortInfo::output, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyPortInfo::output, m.signed32) == 8, "bad offset");
+
+ // C2MyStreamInfo: kIndex | tun | str (bool, uint, args)
+ static_assert(sizeof(C2MyStreamInfo) == 12, "bad size");
+ // C2MyStreamInfo::input kIndex | tun | str | input (int, args)
+ // C2MyStreamInfo::output kIx | tun | str | output (int, args)
+ static_assert(C2MyStreamInfo::input::CORE_INDEX ==
+ (I::IS_FLEX_FLAG | kParamIndexMy), "bad index");
+ static_assert(C2MyStreamInfo::input::PARAM_TYPE ==
+ (I::IS_FLEX_FLAG | kParamIndexMy | I::KIND_INFO | I::DIR_INPUT | I::IS_STREAM_FLAG), "bad index");
+ static_assert(C2MyStreamInfo::output::CORE_INDEX ==
+ (I::IS_FLEX_FLAG | kParamIndexMy), "bad index");
+ static_assert(C2MyStreamInfo::output::PARAM_TYPE ==
+ (I::IS_FLEX_FLAG | kParamIndexMy | I::KIND_INFO | I::DIR_OUTPUT | I::IS_STREAM_FLAG), "bad index");
+ static_assert(sizeof(C2MyStreamInfo::input) == 12, "bad size");
+ static_assert(sizeof(C2MyStreamInfo::output) == 12, "bad size");
+ static_assert(offsetof(C2MyStreamInfo::input, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyStreamInfo::input, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyStreamInfo::input, m.signed32) == 8, "bad offset");
+ static_assert(offsetof(C2MyStreamInfo::output, _mSize) == 0, "bad size");
+ static_assert(offsetof(C2MyStreamInfo::output, _mIndex) == 4, "bad offset");
+ static_assert(offsetof(C2MyStreamInfo::output, m.signed32) == 8, "bad offset");
+}
+
+TEST_F(C2ParamTest, ParamOpsTest) {
+ const C2NumberStruct str(100);
+ C2NumberStruct bstr;
+
+ {
+ EXPECT_EQ(100, str.mNumber);
+ bstr.mNumber = 100;
+
+ C2Param::CoreIndex index = C2NumberStruct::CORE_INDEX;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_FALSE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumber);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumber);
+ }
+
+ const C2NumberTuning tun(100);
+ C2NumberTuning btun;
+
+ {
+ C2NumberInfo inf(100);
+ std::unique_ptr<C2NumbersTuning> tun_ = C2NumbersTuning::AllocUnique(1);
+
+ EXPECT_EQ(tun.coreIndex(), inf.coreIndex());
+ EXPECT_NE(tun.coreIndex(), tun_->coreIndex());
+ EXPECT_NE(tun.type(), inf.type());
+ EXPECT_NE(tun.type(), tun_->type());
+ }
+
+ {
+ // flags & invariables
+ for (const auto &p : { tun, btun }) {
+ EXPECT_TRUE((bool)p);
+ EXPECT_FALSE(!p);
+ EXPECT_EQ(12u, p.size());
+
+ EXPECT_FALSE(p.isVendor());
+ EXPECT_FALSE(p.isFlexible());
+ EXPECT_TRUE(p.isGlobal());
+ EXPECT_FALSE(p.forInput());
+ EXPECT_FALSE(p.forOutput());
+ EXPECT_FALSE(p.forStream());
+ EXPECT_FALSE(p.forPort());
+ }
+
+ // value
+ EXPECT_EQ(100, tun.mNumber);
+ EXPECT_EQ(0, btun.mNumber);
+ EXPECT_FALSE(tun == btun);
+ EXPECT_FALSE(tun.operator==(btun));
+ EXPECT_TRUE(tun != btun);
+ EXPECT_TRUE(tun.operator!=(btun));
+ btun.mNumber = 100;
+ EXPECT_EQ(tun, btun);
+
+ // index
+ EXPECT_EQ(C2Param::Type(tun.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(tun.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(tun.type(), C2NumberTuning::PARAM_TYPE);
+ EXPECT_EQ(tun.stream(), ~0u);
+
+ C2Param::CoreIndex index = C2NumberTuning::CORE_INDEX;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_FALSE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumber);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumber);
+
+ C2Param::Type type = C2NumberTuning::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_FALSE(type.isFlexible());
+ EXPECT_TRUE(type.isGlobal());
+ EXPECT_FALSE(type.forInput());
+ EXPECT_FALSE(type.forOutput());
+ EXPECT_FALSE(type.forStream());
+ EXPECT_FALSE(type.forPort());
+
+ EXPECT_EQ(C2NumberTuning::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&tun), &tun);
+ EXPECT_EQ(C2NumberPortTuning::From(&tun), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&tun), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&tun), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::From(&tun), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&tun), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&tun), nullptr);
+
+ EXPECT_EQ(*(C2Param::Copy(btun)), btun);
+ btun.invalidate();
+ EXPECT_FALSE(C2Param::Copy(btun));
+ }
+
+ const C2NumberPortTuning outp1(true, 100), inp1(false, 100);
+ C2NumberPortTuning boutp1, binp1, binp3(false, 100);
+ const C2NumberPortTuning::input inp2(100);
+ C2NumberPortTuning::input binp2;
+ const C2NumberPortTuning::output outp2(100);
+ C2NumberPortTuning::output boutp2;
+
+ EXPECT_EQ(inp1.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(outp1.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(binp1.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(boutp1.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(inp2.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(outp2.coreIndex(), tun.coreIndex());
+
+ EXPECT_EQ(inp1.type(), inp2.type());
+ EXPECT_EQ(outp1.type(), outp2.type());
+ EXPECT_NE(inp1.type(), outp1.type());
+ EXPECT_NE(inp2.type(), outp2.type());
+ EXPECT_NE(inp1.type(), binp1.type());
+ EXPECT_NE(outp1.type(), boutp1.type());
+ EXPECT_NE(inp1.type(), tun.type());
+ EXPECT_NE(inp2.type(), tun.type());
+
+ {
+ static_assert(canCallSetPort(binp3), "should be able to");
+ static_assert(canCallSetPort(binp1), "should be able to");
+ static_assert(!canCallSetPort(inp1), "should not be able to (const)");
+ static_assert(!canCallSetPort(inp2), "should not be able to (const & type)");
+ static_assert(!canCallSetPort(binp2), "should not be able to (type)");
+
+ // flags & invariables
+ for (const auto &p : { outp1, inp1, boutp1 }) {
+ EXPECT_EQ(12u, p.size());
+ EXPECT_FALSE(p.isVendor());
+ EXPECT_FALSE(p.isFlexible());
+ EXPECT_FALSE(p.isGlobal());
+ EXPECT_FALSE(p.forStream());
+ EXPECT_TRUE(p.forPort());
+ }
+ for (const auto &p : { inp2, binp2 }) {
+ EXPECT_EQ(12u, p.size());
+ EXPECT_FALSE(p.isVendor());
+ EXPECT_FALSE(p.isFlexible());
+ EXPECT_FALSE(p.isGlobal());
+ EXPECT_FALSE(p.forStream());
+ EXPECT_TRUE(p.forPort());
+ }
+ for (const auto &p : { outp2, boutp2 }) {
+ EXPECT_EQ(12u, p.size());
+ EXPECT_FALSE(p.isVendor());
+ EXPECT_FALSE(p.isFlexible());
+ EXPECT_FALSE(p.isGlobal());
+ EXPECT_FALSE(p.forStream());
+ EXPECT_TRUE(p.forPort());
+ }
+
+ // port specific flags & invariables
+ EXPECT_FALSE(outp1.forInput());
+ EXPECT_TRUE(outp1.forOutput());
+
+ EXPECT_TRUE(inp1.forInput());
+ EXPECT_FALSE(inp1.forOutput());
+
+ for (const auto &p : { outp1, inp1 }) {
+ EXPECT_TRUE((bool)p);
+ EXPECT_FALSE(!p);
+ EXPECT_EQ(100, p.mNumber);
+ }
+ for (const auto &p : { outp2, boutp2 }) {
+ EXPECT_TRUE((bool)p);
+ EXPECT_FALSE(!p);
+
+ EXPECT_FALSE(p.forInput());
+ EXPECT_TRUE(p.forOutput());
+ }
+ for (const auto &p : { inp2, binp2 }) {
+ EXPECT_TRUE((bool)p);
+ EXPECT_FALSE(!p);
+
+ EXPECT_TRUE(p.forInput());
+ EXPECT_FALSE(p.forOutput());
+ }
+ for (const auto &p : { boutp1 } ) {
+ EXPECT_FALSE((bool)p);
+ EXPECT_TRUE(!p);
+
+ EXPECT_FALSE(p.forInput());
+ EXPECT_FALSE(p.forOutput());
+ EXPECT_EQ(0, p.mNumber);
+ }
+
+ // values
+ EXPECT_EQ(100, inp2.mNumber);
+ EXPECT_EQ(100, outp2.mNumber);
+ EXPECT_EQ(0, binp1.mNumber);
+ EXPECT_EQ(0, binp2.mNumber);
+ EXPECT_EQ(0, boutp1.mNumber);
+ EXPECT_EQ(0, boutp2.mNumber);
+
+ EXPECT_TRUE(inp1 != outp1);
+ EXPECT_TRUE(inp1 == inp2);
+ EXPECT_TRUE(outp1 == outp2);
+ EXPECT_TRUE(binp1 == boutp1);
+ EXPECT_TRUE(binp2 != boutp2);
+
+ EXPECT_TRUE(inp1 != binp1);
+ binp1.mNumber = 100;
+ EXPECT_TRUE(inp1 != binp1);
+ binp1.setPort(false /* output */);
+ EXPECT_TRUE((bool)binp1);
+ EXPECT_FALSE(!binp1);
+ EXPECT_TRUE(inp1 == binp1);
+
+ EXPECT_TRUE(inp2 != binp2);
+ binp2.mNumber = 100;
+ EXPECT_TRUE(inp2 == binp2);
+
+ binp1.setPort(true /* output */);
+ EXPECT_TRUE(outp1 == binp1);
+
+ EXPECT_TRUE(outp1 != boutp1);
+ boutp1.mNumber = 100;
+ EXPECT_TRUE(outp1 != boutp1);
+ boutp1.setPort(true /* output */);
+ EXPECT_TRUE((bool)boutp1);
+ EXPECT_FALSE(!boutp1);
+ EXPECT_TRUE(outp1 == boutp1);
+
+ EXPECT_TRUE(outp2 != boutp2);
+ boutp2.mNumber = 100;
+ EXPECT_TRUE(outp2 == boutp2);
+
+ boutp1.setPort(false /* output */);
+ EXPECT_TRUE(inp1 == boutp1);
+
+ // index
+ EXPECT_EQ(C2Param::Type(inp1.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(inp1.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(inp1.type(), C2NumberPortTuning::input::PARAM_TYPE);
+ EXPECT_EQ(inp1.stream(), ~0u);
+
+ EXPECT_EQ(C2Param::Type(inp2.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(inp2.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(inp2.type(), C2NumberPortTuning::input::PARAM_TYPE);
+ EXPECT_EQ(inp2.stream(), ~0u);
+
+ EXPECT_EQ(C2Param::Type(outp1.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(outp1.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(outp1.type(), C2NumberPortTuning::output::PARAM_TYPE);
+ EXPECT_EQ(outp1.stream(), ~0u);
+
+ EXPECT_EQ(C2Param::Type(outp2.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(outp2.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(outp2.type(), C2NumberPortTuning::output::PARAM_TYPE);
+ EXPECT_EQ(outp2.stream(), ~0u);
+
+ C2Param::CoreIndex index = C2NumberPortTuning::input::PARAM_TYPE;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_FALSE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumber);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumber);
+
+ index = C2NumberPortTuning::output::PARAM_TYPE;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_FALSE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumber);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumber);
+
+ C2Param::Type type = C2NumberPortTuning::input::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_FALSE(type.isFlexible());
+ EXPECT_FALSE(type.isGlobal());
+ EXPECT_TRUE(type.forInput());
+ EXPECT_FALSE(type.forOutput());
+ EXPECT_FALSE(type.forStream());
+ EXPECT_TRUE(type.forPort());
+
+ type = C2NumberPortTuning::output::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_FALSE(type.isFlexible());
+ EXPECT_FALSE(type.isGlobal());
+ EXPECT_FALSE(type.forInput());
+ EXPECT_TRUE(type.forOutput());
+ EXPECT_FALSE(type.forStream());
+ EXPECT_TRUE(type.forPort());
+
+ EXPECT_EQ(C2NumberPortTuning::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::input::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&inp1), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&inp2), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&outp1), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&outp2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::From(&inp1), &inp1);
+ EXPECT_EQ(C2NumberPortTuning::From(&inp2), (C2NumberPortTuning*)&inp2);
+ EXPECT_EQ(C2NumberPortTuning::From(&outp1), &outp1);
+ EXPECT_EQ(C2NumberPortTuning::From(&outp2), (C2NumberPortTuning*)&outp2);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&inp1), (C2NumberPortTuning::input*)&inp1);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&inp2), &inp2);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&outp1), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&outp2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&inp1), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&inp2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&outp1), (C2NumberPortTuning::output*)&outp1);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&outp2), &outp2);
+ EXPECT_EQ(C2NumberStreamTuning::From(&inp1), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::From(&inp2), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::From(&outp1), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::From(&outp2), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&inp1), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&inp2), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&outp1), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&outp2), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&inp1), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&inp2), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&outp1), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&outp2), nullptr);
+
+ EXPECT_EQ(*(C2Param::Copy(inp1)), inp1);
+ EXPECT_EQ(*(C2Param::Copy(inp2)), inp2);
+ EXPECT_EQ(*(C2Param::Copy(outp1)), outp1);
+ EXPECT_EQ(*(C2Param::Copy(outp2)), outp2);
+ }
+
+ const C2NumberStreamTuning outs1(true, 1u, 100), ins1(false, 1u, 100);
+ C2NumberStreamTuning bouts1, bins1, bins3(false, 1u, 100);
+ const C2NumberStreamTuning::input ins2(1u, 100);
+ C2NumberStreamTuning::input bins2;
+ const C2NumberStreamTuning::output outs2(1u, 100);
+ C2NumberStreamTuning::output bouts2;
+
+ EXPECT_EQ(ins1.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(outs1.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(bins1.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(bouts1.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(ins2.coreIndex(), tun.coreIndex());
+ EXPECT_EQ(outs2.coreIndex(), tun.coreIndex());
+
+ EXPECT_EQ(ins1.type(), ins2.type());
+ EXPECT_EQ(ins1.type(), bins2.type());
+ EXPECT_EQ(outs1.type(), outs2.type());
+ EXPECT_EQ(outs1.type(), bouts2.type());
+ EXPECT_NE(ins1.type(), outs1.type());
+ EXPECT_NE(ins2.type(), outs2.type());
+ EXPECT_NE(ins1.type(), bins1.type());
+ EXPECT_NE(outs1.type(), bouts1.type());
+ EXPECT_NE(ins1.type(), tun.type());
+ EXPECT_NE(ins2.type(), tun.type());
+
+ {
+ static_assert(canCallSetPort(bins3), "should be able to");
+ static_assert(canCallSetPort(bins1), "should be able to");
+ static_assert(!canCallSetPort(ins1), "should not be able to (const)");
+ static_assert(!canCallSetPort(ins2), "should not be able to (const & type)");
+ static_assert(!canCallSetPort(bins2), "should not be able to (type)");
+
+ // flags & invariables
+ for (const auto &p : { outs1, ins1, bouts1 }) {
+ EXPECT_EQ(12u, p.size());
+ EXPECT_FALSE(p.isVendor());
+ EXPECT_FALSE(p.isFlexible());
+ EXPECT_FALSE(p.isGlobal());
+ EXPECT_TRUE(p.forStream());
+ EXPECT_FALSE(p.forPort());
+ }
+ for (const auto &p : { ins2, bins2 }) {
+ EXPECT_EQ(12u, p.size());
+ EXPECT_FALSE(p.isVendor());
+ EXPECT_FALSE(p.isFlexible());
+ EXPECT_FALSE(p.isGlobal());
+ EXPECT_TRUE(p.forStream());
+ EXPECT_FALSE(p.forPort());
+ }
+ for (const auto &p : { outs2, bouts2 }) {
+ EXPECT_EQ(12u, p.size());
+ EXPECT_FALSE(p.isVendor());
+ EXPECT_FALSE(p.isFlexible());
+ EXPECT_FALSE(p.isGlobal());
+ EXPECT_TRUE(p.forStream());
+ EXPECT_FALSE(p.forPort());
+ }
+
+ // port specific flags & invariables
+ EXPECT_FALSE(outs1.forInput());
+ EXPECT_TRUE(outs1.forOutput());
+
+ EXPECT_TRUE(ins1.forInput());
+ EXPECT_FALSE(ins1.forOutput());
+
+ for (const auto &p : { outs1, ins1 }) {
+ EXPECT_TRUE((bool)p);
+ EXPECT_FALSE(!p);
+ EXPECT_EQ(100, p.mNumber);
+ EXPECT_EQ(1u, p.stream());
+ }
+ for (const auto &p : { outs2, bouts2 }) {
+ EXPECT_TRUE((bool)p);
+ EXPECT_FALSE(!p);
+
+ EXPECT_FALSE(p.forInput());
+ EXPECT_TRUE(p.forOutput());
+ }
+ for (const auto &p : { ins2, bins2 }) {
+ EXPECT_TRUE((bool)p);
+ EXPECT_FALSE(!p);
+
+ EXPECT_TRUE(p.forInput());
+ EXPECT_FALSE(p.forOutput());
+ }
+ for (const auto &p : { bouts1 } ) {
+ EXPECT_FALSE((bool)p);
+ EXPECT_TRUE(!p);
+
+ EXPECT_FALSE(p.forInput());
+ EXPECT_FALSE(p.forOutput());
+ EXPECT_EQ(0, p.mNumber);
+ }
+
+ // values
+ EXPECT_EQ(100, ins2.mNumber);
+ EXPECT_EQ(100, outs2.mNumber);
+ EXPECT_EQ(0, bins1.mNumber);
+ EXPECT_EQ(0, bins2.mNumber);
+ EXPECT_EQ(0, bouts1.mNumber);
+ EXPECT_EQ(0, bouts2.mNumber);
+
+ EXPECT_EQ(1u, ins2.stream());
+ EXPECT_EQ(1u, outs2.stream());
+ EXPECT_EQ(0u, bins1.stream());
+ EXPECT_EQ(0u, bins2.stream());
+ EXPECT_EQ(0u, bouts1.stream());
+ EXPECT_EQ(0u, bouts2.stream());
+
+ EXPECT_TRUE(ins1 != outs1);
+ EXPECT_TRUE(ins1 == ins2);
+ EXPECT_TRUE(outs1 == outs2);
+ EXPECT_TRUE(bins1 == bouts1);
+ EXPECT_TRUE(bins2 != bouts2);
+
+ EXPECT_TRUE(ins1 != bins1);
+ bins1.mNumber = 100;
+ EXPECT_TRUE(ins1 != bins1);
+ bins1.setPort(false /* output */);
+ EXPECT_TRUE(ins1 != bins1);
+ bins1.setStream(1u);
+ EXPECT_TRUE(ins1 == bins1);
+
+ EXPECT_TRUE(ins2 != bins2);
+ bins2.mNumber = 100;
+ EXPECT_TRUE(ins2 != bins2);
+ bins2.setStream(1u);
+ EXPECT_TRUE(ins2 == bins2);
+
+ bins1.setPort(true /* output */);
+ EXPECT_TRUE(outs1 == bins1);
+
+ EXPECT_TRUE(outs1 != bouts1);
+ bouts1.mNumber = 100;
+ EXPECT_TRUE(outs1 != bouts1);
+ bouts1.setPort(true /* output */);
+ EXPECT_TRUE(outs1 != bouts1);
+ bouts1.setStream(1u);
+ EXPECT_TRUE(outs1 == bouts1);
+
+ EXPECT_TRUE(outs2 != bouts2);
+ bouts2.mNumber = 100;
+ EXPECT_TRUE(outs2 != bouts2);
+ bouts2.setStream(1u);
+ EXPECT_TRUE(outs2 == bouts2);
+
+ bouts1.setPort(false /* output */);
+ EXPECT_TRUE(ins1 == bouts1);
+
+ // index
+ EXPECT_EQ(C2Param::Type(ins1.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(ins1.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(ins1.type(), C2NumberStreamTuning::input::PARAM_TYPE);
+
+ EXPECT_EQ(C2Param::Type(ins2.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(ins2.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(ins2.type(), C2NumberStreamTuning::input::PARAM_TYPE);
+
+ EXPECT_EQ(C2Param::Type(outs1.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(outs1.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(outs1.type(), C2NumberStreamTuning::output::PARAM_TYPE);
+
+ EXPECT_EQ(C2Param::Type(outs2.type()).coreIndex(), C2NumberStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(outs2.type()).typeIndex(), kParamIndexNumber);
+ EXPECT_EQ(outs2.type(), C2NumberStreamTuning::output::PARAM_TYPE);
+
+ C2Param::CoreIndex index = C2NumberStreamTuning::input::PARAM_TYPE;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_FALSE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumber);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumber);
+
+ index = C2NumberStreamTuning::output::PARAM_TYPE;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_FALSE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumber);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumber);
+
+ C2Param::Type type = C2NumberStreamTuning::input::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_FALSE(type.isFlexible());
+ EXPECT_FALSE(type.isGlobal());
+ EXPECT_TRUE(type.forInput());
+ EXPECT_FALSE(type.forOutput());
+ EXPECT_TRUE(type.forStream());
+ EXPECT_FALSE(type.forPort());
+
+ type = C2NumberStreamTuning::output::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_FALSE(type.isFlexible());
+ EXPECT_FALSE(type.isGlobal());
+ EXPECT_FALSE(type.forInput());
+ EXPECT_TRUE(type.forOutput());
+ EXPECT_TRUE(type.forStream());
+ EXPECT_FALSE(type.forPort());
+
+ EXPECT_EQ(C2NumberPortTuning::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::input::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&ins1), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&ins2), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&outs1), nullptr);
+ EXPECT_EQ(C2NumberTuning::From(&outs2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::From(&ins1), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::From(&ins2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::From(&outs1), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::From(&outs2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&ins1), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&ins2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&outs1), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::input::From(&outs2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&ins1), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&ins2), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&outs1), nullptr);
+ EXPECT_EQ(C2NumberPortTuning::output::From(&outs2), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::From(&ins1), &ins1);
+ EXPECT_EQ(C2NumberStreamTuning::From(&ins2), (C2NumberStreamTuning*)&ins2);
+ EXPECT_EQ(C2NumberStreamTuning::From(&outs1), &outs1);
+ EXPECT_EQ(C2NumberStreamTuning::From(&outs2), (C2NumberStreamTuning*)&outs2);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&ins1), (C2NumberStreamTuning::input*)&ins1);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&ins2), &ins2);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&outs1), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::input::From(&outs2), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&ins1), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&ins2), nullptr);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&outs1), (C2NumberStreamTuning::output*)&outs1);
+ EXPECT_EQ(C2NumberStreamTuning::output::From(&outs2), &outs2);
+
+ EXPECT_EQ(*(C2Param::Copy(ins1)), ins1);
+ EXPECT_EQ(*(C2Param::Copy(ins2)), ins2);
+ EXPECT_EQ(*(C2Param::Copy(outs1)), outs1);
+ EXPECT_EQ(*(C2Param::Copy(outs2)), outs2);
+ }
+
+ {
+ uint32_t videoWidth[] = { 12u, C2NumberStreamTuning::output::PARAM_TYPE, 100 };
+ C2Param *p1 = C2Param::From(videoWidth, sizeof(videoWidth));
+ EXPECT_NE(p1, nullptr);
+ EXPECT_EQ(12u, p1->size());
+ EXPECT_EQ(p1->type(), C2NumberStreamTuning::output::PARAM_TYPE);
+
+ p1 = C2Param::From(videoWidth, sizeof(videoWidth) + 2);
+ EXPECT_EQ(p1, nullptr);
+
+ p1 = C2Param::From(videoWidth, sizeof(videoWidth) - 2);
+ EXPECT_EQ(p1, nullptr);
+
+ p1 = C2Param::From(videoWidth, 3);
+ EXPECT_EQ(p1, nullptr);
+
+ p1 = C2Param::From(videoWidth, 0);
+ EXPECT_EQ(p1, nullptr);
+ }
+}
+
+void StaticTestAddCoreIndex() {
+ struct nobase {};
+ struct base { enum : uint32_t { CORE_INDEX = 1 }; };
+ static_assert(_C2AddCoreIndex<nobase, 2>::CORE_INDEX == 2, "should be 2");
+ static_assert(_C2AddCoreIndex<base, 1>::CORE_INDEX == 1, "should be 1");
+}
+
+class TestFlexHelper {
+ struct _Flex {
+ int32_t a;
+ char b[];
+ _Flex() {}
+ FLEX(_Flex, b);
+ };
+
+ struct _BoFlex {
+ _Flex a;
+ _BoFlex() {}
+ FLEX(_BoFlex, a);
+ };
+
+ struct _NonFlex {
+ };
+
+
+ static void StaticTest() {
+ static_assert(std::is_same<_C2FlexHelper<char>::FlexType, void>::value, "should be void");
+ static_assert(std::is_same<_C2FlexHelper<char[]>::FlexType, char>::value, "should be char");
+ static_assert(std::is_same<_C2FlexHelper<_Flex>::FlexType, char>::value, "should be char");
+
+ static_assert(std::is_same<_C2FlexHelper<_BoFlex>::FlexType, char>::value, "should be void");
+
+ static_assert(_C2Flexible<_Flex>::value, "should be flexible");
+ static_assert(!_C2Flexible<_NonFlex>::value, "should not be flexible");
+ }
+};
+
+TEST_F(C2ParamTest, FlexParamOpsTest) {
+// const C2NumbersStruct str{100};
+ C2NumbersStruct bstr;
+ {
+// EXPECT_EQ(100, str->m.mNumbers[0]);
+ (void)&bstr.mNumbers[0];
+
+ C2Param::CoreIndex index = C2NumbersStruct::CORE_INDEX;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_TRUE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumbers | C2Param::CoreIndex::IS_FLEX_FLAG);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumbers);
+ }
+
+ std::unique_ptr<C2NumbersTuning> tun_ = C2NumbersTuning::AllocUnique(1);
+ tun_->m.mNumbers[0] = 100;
+ std::unique_ptr<const C2NumbersTuning> tun = std::move(tun_);
+ std::shared_ptr<C2NumbersTuning> btun = C2NumbersTuning::AllocShared(1);
+
+ {
+ // flags & invariables
+ const C2NumbersTuning *T[] = { tun.get(), btun.get() };
+ for (const auto p : T) {
+ EXPECT_TRUE((bool)(*p));
+ EXPECT_FALSE(!(*p));
+ EXPECT_EQ(12u, p->size());
+
+ EXPECT_FALSE(p->isVendor());
+ EXPECT_TRUE(p->isFlexible());
+ EXPECT_TRUE(p->isGlobal());
+ EXPECT_FALSE(p->forInput());
+ EXPECT_FALSE(p->forOutput());
+ EXPECT_FALSE(p->forStream());
+ EXPECT_FALSE(p->forPort());
+ }
+
+ // value
+ EXPECT_EQ(100, tun->m.mNumbers[0]);
+ EXPECT_EQ(0, btun->m.mNumbers[0]);
+ EXPECT_FALSE(*tun == *btun);
+ EXPECT_FALSE(tun->operator==(*btun));
+ EXPECT_TRUE(*tun != *btun);
+ EXPECT_TRUE(tun->operator!=(*btun));
+ btun->m.mNumbers[0] = 100;
+ EXPECT_EQ(*tun, *btun);
+
+ // index
+ EXPECT_EQ(C2Param::Type(tun->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(tun->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(tun->type(), C2NumbersTuning::PARAM_TYPE);
+ EXPECT_EQ(tun->stream(), ~0u);
+
+ C2Param::CoreIndex index = C2NumbersTuning::CORE_INDEX;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_TRUE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumbers | C2Param::CoreIndex::IS_FLEX_FLAG);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumbers);
+
+ C2Param::Type type = C2NumbersTuning::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_TRUE(type.isFlexible());
+ EXPECT_TRUE(type.isGlobal());
+ EXPECT_FALSE(type.forInput());
+ EXPECT_FALSE(type.forOutput());
+ EXPECT_FALSE(type.forStream());
+ EXPECT_FALSE(type.forPort());
+
+ EXPECT_EQ(C2NumbersTuning::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(tun.get()), tun.get());
+ EXPECT_EQ(C2NumbersPortTuning::From(tun.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::input::From(tun.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(tun.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::From(tun.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(tun.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(tun.get()), nullptr);
+
+ EXPECT_EQ(*(C2Param::Copy(*tun)), *tun);
+ }
+
+ std::unique_ptr<C2NumbersPortTuning> outp1_(C2NumbersPortTuning::AllocUnique(1, true)),
+ inp1_ = C2NumbersPortTuning::AllocUnique(1, false);
+ outp1_->m.mNumbers[0] = 100;
+ inp1_->m.mNumbers[0] = 100;
+ std::unique_ptr<const C2NumbersPortTuning> outp1 = std::move(outp1_);
+ std::unique_ptr<const C2NumbersPortTuning> inp1 = std::move(inp1_);
+ std::shared_ptr<C2NumbersPortTuning> boutp1(C2NumbersPortTuning::AllocShared(1)),
+ binp1 = C2NumbersPortTuning::AllocShared(1),
+ binp3 = C2NumbersPortTuning::AllocShared(1, false);
+ binp3->m.mNumbers[0] = 100;
+ std::unique_ptr<C2NumbersPortTuning::input> inp2_(C2NumbersPortTuning::input::AllocUnique(1));
+ inp2_->m.mNumbers[0] = 100;
+ std::unique_ptr<const C2NumbersPortTuning::input> inp2 = std::move(inp2_);
+ std::shared_ptr<C2NumbersPortTuning::input> binp2(C2NumbersPortTuning::input::AllocShared(1));
+ std::unique_ptr<C2NumbersPortTuning::output> outp2_(C2NumbersPortTuning::output::AllocUnique(1));
+ outp2_->m.mNumbers[0] = 100;
+ std::unique_ptr<const C2NumbersPortTuning::output> outp2 = std::move(outp2_);
+ std::shared_ptr<C2NumbersPortTuning::output> boutp2(C2NumbersPortTuning::output::AllocShared(1));
+
+ {
+ static_assert(canCallSetPort(*binp3), "should be able to");
+ static_assert(canCallSetPort(*binp1), "should be able to");
+ static_assert(!canCallSetPort(*inp1), "should not be able to (const)");
+ static_assert(!canCallSetPort(*inp2), "should not be able to (const & type)");
+ static_assert(!canCallSetPort(*binp2), "should not be able to (type)");
+
+ // flags & invariables
+ const C2NumbersPortTuning *P[] = { outp1.get(), inp1.get(), boutp1.get() };
+ for (const auto p : P) {
+ EXPECT_EQ(12u, p->size());
+ EXPECT_FALSE(p->isVendor());
+ EXPECT_TRUE(p->isFlexible());
+ EXPECT_FALSE(p->isGlobal());
+ EXPECT_FALSE(p->forStream());
+ EXPECT_TRUE(p->forPort());
+ }
+ const C2NumbersPortTuning::input *PI[] = { inp2.get(), binp2.get() };
+ for (const auto p : PI) {
+ EXPECT_EQ(12u, p->size());
+ EXPECT_FALSE(p->isVendor());
+ EXPECT_TRUE(p->isFlexible());
+ EXPECT_FALSE(p->isGlobal());
+ EXPECT_FALSE(p->forStream());
+ EXPECT_TRUE(p->forPort());
+ }
+ const C2NumbersPortTuning::output *PO[] = { outp2.get(), boutp2.get() };
+ for (const auto p : PO) {
+ EXPECT_EQ(12u, p->size());
+ EXPECT_FALSE(p->isVendor());
+ EXPECT_TRUE(p->isFlexible());
+ EXPECT_FALSE(p->isGlobal());
+ EXPECT_FALSE(p->forStream());
+ EXPECT_TRUE(p->forPort());
+ }
+
+ // port specific flags & invariables
+ EXPECT_FALSE(outp1->forInput());
+ EXPECT_TRUE(outp1->forOutput());
+
+ EXPECT_TRUE(inp1->forInput());
+ EXPECT_FALSE(inp1->forOutput());
+
+ const C2NumbersPortTuning *P2[] = { outp1.get(), inp1.get() };
+ for (const auto p : P2) {
+ EXPECT_TRUE((bool)(*p));
+ EXPECT_FALSE(!(*p));
+ EXPECT_EQ(100, p->m.mNumbers[0]);
+ }
+ for (const auto p : PO) {
+ EXPECT_TRUE((bool)(*p));
+ EXPECT_FALSE(!(*p));
+
+ EXPECT_FALSE(p->forInput());
+ EXPECT_TRUE(p->forOutput());
+ }
+ for (const auto p : PI) {
+ EXPECT_TRUE((bool)(*p));
+ EXPECT_FALSE(!(*p));
+
+ EXPECT_TRUE(p->forInput());
+ EXPECT_FALSE(p->forOutput());
+ }
+ const C2NumbersPortTuning *P3[] = { boutp1.get() };
+ for (const auto p : P3) {
+ EXPECT_FALSE((bool)(*p));
+ EXPECT_TRUE(!(*p));
+
+ EXPECT_FALSE(p->forInput());
+ EXPECT_FALSE(p->forOutput());
+ EXPECT_EQ(0, p->m.mNumbers[0]);
+ }
+
+ // values
+ EXPECT_EQ(100, inp2->m.mNumbers[0]);
+ EXPECT_EQ(100, outp2->m.mNumbers[0]);
+ EXPECT_EQ(0, binp1->m.mNumbers[0]);
+ EXPECT_EQ(0, binp2->m.mNumbers[0]);
+ EXPECT_EQ(0, boutp1->m.mNumbers[0]);
+ EXPECT_EQ(0, boutp2->m.mNumbers[0]);
+
+ EXPECT_TRUE(*inp1 != *outp1);
+ EXPECT_TRUE(*inp1 == *inp2);
+ EXPECT_TRUE(*outp1 == *outp2);
+ EXPECT_TRUE(*binp1 == *boutp1);
+ EXPECT_TRUE(*binp2 != *boutp2);
+
+ EXPECT_TRUE(*inp1 != *binp1);
+ binp1->m.mNumbers[0] = 100;
+ EXPECT_TRUE(*inp1 != *binp1);
+ binp1->setPort(false /* output */);
+ EXPECT_TRUE((bool)*binp1);
+ EXPECT_FALSE(!*binp1);
+ EXPECT_TRUE(*inp1 == *binp1);
+
+ EXPECT_TRUE(*inp2 != *binp2);
+ binp2->m.mNumbers[0] = 100;
+ EXPECT_TRUE(*inp2 == *binp2);
+
+ binp1->setPort(true /* output */);
+ EXPECT_TRUE(*outp1 == *binp1);
+
+ EXPECT_TRUE(*outp1 != *boutp1);
+ boutp1->m.mNumbers[0] = 100;
+ EXPECT_TRUE(*outp1 != *boutp1);
+ boutp1->setPort(true /* output */);
+ EXPECT_TRUE((bool)*boutp1);
+ EXPECT_FALSE(!*boutp1);
+ EXPECT_TRUE(*outp1 == *boutp1);
+
+ EXPECT_TRUE(*outp2 != *boutp2);
+ boutp2->m.mNumbers[0] = 100;
+ EXPECT_TRUE(*outp2 == *boutp2);
+
+ boutp1->setPort(false /* output */);
+ EXPECT_TRUE(*inp1 == *boutp1);
+
+ // index
+ EXPECT_EQ(C2Param::Type(inp1->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(inp1->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(inp1->type(), C2NumbersPortTuning::input::PARAM_TYPE);
+ EXPECT_EQ(inp1->stream(), ~0u);
+
+ EXPECT_EQ(C2Param::Type(inp2->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(inp2->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(inp2->type(), C2NumbersPortTuning::input::PARAM_TYPE);
+ EXPECT_EQ(inp2->stream(), ~0u);
+
+ EXPECT_EQ(C2Param::Type(outp1->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(outp1->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(outp1->type(), C2NumbersPortTuning::output::PARAM_TYPE);
+ EXPECT_EQ(outp1->stream(), ~0u);
+
+ EXPECT_EQ(C2Param::Type(outp2->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(outp2->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(outp2->type(), C2NumbersPortTuning::output::PARAM_TYPE);
+ EXPECT_EQ(outp2->stream(), ~0u);
+
+ C2Param::CoreIndex index = C2NumbersPortTuning::input::PARAM_TYPE;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_TRUE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumbers | C2Param::CoreIndex::IS_FLEX_FLAG);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumbers);
+
+ index = C2NumbersPortTuning::output::PARAM_TYPE;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_TRUE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumbers | C2Param::CoreIndex::IS_FLEX_FLAG);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumbers);
+
+ C2Param::Type type = C2NumbersPortTuning::input::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_TRUE(type.isFlexible());
+ EXPECT_FALSE(type.isGlobal());
+ EXPECT_TRUE(type.forInput());
+ EXPECT_FALSE(type.forOutput());
+ EXPECT_FALSE(type.forStream());
+ EXPECT_TRUE(type.forPort());
+
+ type = C2NumbersPortTuning::output::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_TRUE(type.isFlexible());
+ EXPECT_FALSE(type.isGlobal());
+ EXPECT_FALSE(type.forInput());
+ EXPECT_TRUE(type.forOutput());
+ EXPECT_FALSE(type.forStream());
+ EXPECT_TRUE(type.forPort());
+
+ EXPECT_EQ(C2NumbersPortTuning::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::input::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(inp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(inp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(outp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(outp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::From(inp1.get()), inp1.get());
+ EXPECT_EQ(C2NumbersPortTuning::From(inp2.get()), (C2NumbersPortTuning*)inp2.get());
+ EXPECT_EQ(C2NumbersPortTuning::From(outp1.get()), outp1.get());
+ EXPECT_EQ(C2NumbersPortTuning::From(outp2.get()), (C2NumbersPortTuning*)outp2.get());
+ EXPECT_EQ(C2NumbersPortTuning::input::From(inp1.get()), (C2NumbersPortTuning::input*)inp1.get());
+ EXPECT_EQ(C2NumbersPortTuning::input::From(inp2.get()), inp2.get());
+ EXPECT_EQ(C2NumbersPortTuning::input::From(outp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::input::From(outp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(inp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(inp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(outp1.get()), (C2NumbersPortTuning::output*)outp1.get());
+ EXPECT_EQ(C2NumbersPortTuning::output::From(outp2.get()), outp2.get());
+ EXPECT_EQ(C2NumbersStreamTuning::From(inp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::From(inp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::From(outp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::From(outp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(inp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(inp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(outp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(outp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(inp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(inp2.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(outp1.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(outp2.get()), nullptr);
+
+ EXPECT_EQ(*(C2Param::Copy(*inp1)), *inp1);
+ EXPECT_EQ(*(C2Param::Copy(*inp2)), *inp2);
+ EXPECT_EQ(*(C2Param::Copy(*outp1)), *outp1);
+ EXPECT_EQ(*(C2Param::Copy(*outp2)), *outp2);
+ }
+
+ std::unique_ptr<C2NumbersStreamTuning> outs1_(C2NumbersStreamTuning::AllocUnique(1, true, 1u));
+ outs1_->m.mNumbers[0] = 100;
+ std::unique_ptr<const C2NumbersStreamTuning> outs1 = std::move(outs1_);
+ std::unique_ptr<C2NumbersStreamTuning> ins1_(C2NumbersStreamTuning::AllocUnique(1, false, 1u));
+ ins1_->m.mNumbers[0] = 100;
+ std::unique_ptr<const C2NumbersStreamTuning> ins1 = std::move(ins1_);
+ std::shared_ptr<C2NumbersStreamTuning> bouts1(C2NumbersStreamTuning::AllocShared(1));
+ std::shared_ptr<C2NumbersStreamTuning> bins1(C2NumbersStreamTuning::AllocShared(1));
+ std::shared_ptr<C2NumbersStreamTuning> bins3(C2NumbersStreamTuning::AllocShared(1, false, 1u));
+ bins3->m.mNumbers[0] = 100;
+ std::unique_ptr<C2NumbersStreamTuning::input> ins2_(C2NumbersStreamTuning::input::AllocUnique(1, 1u));
+ ins2_->m.mNumbers[0] = 100;
+ std::unique_ptr<const C2NumbersStreamTuning::input> ins2 = std::move(ins2_);
+ std::shared_ptr<C2NumbersStreamTuning::input> bins2(C2NumbersStreamTuning::input::AllocShared(1));
+ std::unique_ptr<C2NumbersStreamTuning::output> outs2_(C2NumbersStreamTuning::output::AllocUnique(1, 1u));
+ outs2_->m.mNumbers[0] = 100;
+ std::unique_ptr<const C2NumbersStreamTuning::output> outs2 = std::move(outs2_);
+ std::shared_ptr<C2NumbersStreamTuning::output> bouts2(C2NumbersStreamTuning::output::AllocShared(1));
+
+ {
+ static_assert(canCallSetPort(*bins3), "should be able to");
+ static_assert(canCallSetPort(*bins1), "should be able to");
+ static_assert(!canCallSetPort(*ins1), "should not be able to (const)");
+ static_assert(!canCallSetPort(*ins2), "should not be able to (const & type)");
+ static_assert(!canCallSetPort(*bins2), "should not be able to (type)");
+
+ // flags & invariables
+ const C2NumbersStreamTuning *S[] = { outs1.get(), ins1.get(), bouts1.get() };
+ for (const auto p : S) {
+ EXPECT_EQ(12u, p->size());
+ EXPECT_FALSE(p->isVendor());
+ EXPECT_TRUE(p->isFlexible());
+ EXPECT_FALSE(p->isGlobal());
+ EXPECT_TRUE(p->forStream());
+ EXPECT_FALSE(p->forPort());
+ }
+ const C2NumbersStreamTuning::input *SI[] = { ins2.get(), bins2.get() };
+ for (const auto p : SI) {
+ EXPECT_EQ(12u, p->size());
+ EXPECT_FALSE(p->isVendor());
+ EXPECT_TRUE(p->isFlexible());
+ EXPECT_FALSE(p->isGlobal());
+ EXPECT_TRUE(p->forStream());
+ EXPECT_FALSE(p->forPort());
+ }
+ const C2NumbersStreamTuning::output *SO[] = { outs2.get(), bouts2.get() };
+ for (const auto p : SO) {
+ EXPECT_EQ(12u, p->size());
+ EXPECT_FALSE(p->isVendor());
+ EXPECT_TRUE(p->isFlexible());
+ EXPECT_FALSE(p->isGlobal());
+ EXPECT_TRUE(p->forStream());
+ EXPECT_FALSE(p->forPort());
+ }
+
+ // port specific flags & invariables
+ EXPECT_FALSE(outs1->forInput());
+ EXPECT_TRUE(outs1->forOutput());
+
+ EXPECT_TRUE(ins1->forInput());
+ EXPECT_FALSE(ins1->forOutput());
+
+ const C2NumbersStreamTuning *S2[] = { outs1.get(), ins1.get() };
+ for (const auto p : S2) {
+ EXPECT_TRUE((bool)(*p));
+ EXPECT_FALSE(!(*p));
+ EXPECT_EQ(100, p->m.mNumbers[0]);
+ EXPECT_EQ(1u, p->stream());
+ }
+ for (const auto p : SO) {
+ EXPECT_TRUE((bool)(*p));
+ EXPECT_FALSE(!(*p));
+
+ EXPECT_FALSE(p->forInput());
+ EXPECT_TRUE(p->forOutput());
+ }
+ for (const auto p : SI) {
+ EXPECT_TRUE((bool)(*p));
+ EXPECT_FALSE(!(*p));
+
+ EXPECT_TRUE(p->forInput());
+ EXPECT_FALSE(p->forOutput());
+ }
+ const C2NumbersStreamTuning *S3[] = { bouts1.get() };
+ for (const auto p : S3) {
+ EXPECT_FALSE((bool)(*p));
+ EXPECT_TRUE(!(*p));
+
+ EXPECT_FALSE(p->forInput());
+ EXPECT_FALSE(p->forOutput());
+ EXPECT_EQ(0, p->m.mNumbers[0]);
+ }
+
+ // values
+ EXPECT_EQ(100, ins2->m.mNumbers[0]);
+ EXPECT_EQ(100, outs2->m.mNumbers[0]);
+ EXPECT_EQ(0, bins1->m.mNumbers[0]);
+ EXPECT_EQ(0, bins2->m.mNumbers[0]);
+ EXPECT_EQ(0, bouts1->m.mNumbers[0]);
+ EXPECT_EQ(0, bouts2->m.mNumbers[0]);
+
+ EXPECT_EQ(1u, ins2->stream());
+ EXPECT_EQ(1u, outs2->stream());
+ EXPECT_EQ(0u, bins1->stream());
+ EXPECT_EQ(0u, bins2->stream());
+ EXPECT_EQ(0u, bouts1->stream());
+ EXPECT_EQ(0u, bouts2->stream());
+
+ EXPECT_TRUE(*ins1 != *outs1);
+ EXPECT_TRUE(*ins1 == *ins2);
+ EXPECT_TRUE(*outs1 == *outs2);
+ EXPECT_TRUE(*bins1 == *bouts1);
+ EXPECT_TRUE(*bins2 != *bouts2);
+
+ EXPECT_TRUE(*ins1 != *bins1);
+ bins1->m.mNumbers[0] = 100;
+ EXPECT_TRUE(*ins1 != *bins1);
+ bins1->setPort(false /* output */);
+ EXPECT_TRUE(*ins1 != *bins1);
+ bins1->setStream(1u);
+ EXPECT_TRUE(*ins1 == *bins1);
+
+ EXPECT_TRUE(*ins2 != *bins2);
+ bins2->m.mNumbers[0] = 100;
+ EXPECT_TRUE(*ins2 != *bins2);
+ bins2->setStream(1u);
+ EXPECT_TRUE(*ins2 == *bins2);
+
+ bins1->setPort(true /* output */);
+ EXPECT_TRUE(*outs1 == *bins1);
+
+ EXPECT_TRUE(*outs1 != *bouts1);
+ bouts1->m.mNumbers[0] = 100;
+ EXPECT_TRUE(*outs1 != *bouts1);
+ bouts1->setPort(true /* output */);
+ EXPECT_TRUE(*outs1 != *bouts1);
+ bouts1->setStream(1u);
+ EXPECT_TRUE(*outs1 == *bouts1);
+
+ EXPECT_TRUE(*outs2 != *bouts2);
+ bouts2->m.mNumbers[0] = 100;
+ EXPECT_TRUE(*outs2 != *bouts2);
+ bouts2->setStream(1u);
+ EXPECT_TRUE(*outs2 == *bouts2);
+
+ bouts1->setPort(false /* output */);
+ EXPECT_TRUE(*ins1 == *bouts1);
+
+ // index
+ EXPECT_EQ(C2Param::Type(ins1->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(ins1->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(ins1->type(), C2NumbersStreamTuning::input::PARAM_TYPE);
+
+ EXPECT_EQ(C2Param::Type(ins2->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(ins2->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(ins2->type(), C2NumbersStreamTuning::input::PARAM_TYPE);
+
+ EXPECT_EQ(C2Param::Type(outs1->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(outs1->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(outs1->type(), C2NumbersStreamTuning::output::PARAM_TYPE);
+
+ EXPECT_EQ(C2Param::Type(outs2->type()).coreIndex(), C2NumbersStruct::CORE_INDEX);
+ EXPECT_EQ(C2Param::Type(outs2->type()).typeIndex(), kParamIndexNumbers);
+ EXPECT_EQ(outs2->type(), C2NumbersStreamTuning::output::PARAM_TYPE);
+
+ C2Param::CoreIndex index = C2NumbersStreamTuning::input::PARAM_TYPE;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_TRUE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumbers | C2Param::CoreIndex::IS_FLEX_FLAG);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumbers);
+
+ index = C2NumbersStreamTuning::output::PARAM_TYPE;
+ EXPECT_FALSE(index.isVendor());
+ EXPECT_TRUE(index.isFlexible());
+ EXPECT_EQ(index.coreIndex(), kParamIndexNumbers | C2Param::CoreIndex::IS_FLEX_FLAG);
+ EXPECT_EQ(index.typeIndex(), kParamIndexNumbers);
+
+ C2Param::Type type = C2NumbersStreamTuning::input::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_TRUE(type.isFlexible());
+ EXPECT_FALSE(type.isGlobal());
+ EXPECT_TRUE(type.forInput());
+ EXPECT_FALSE(type.forOutput());
+ EXPECT_TRUE(type.forStream());
+ EXPECT_FALSE(type.forPort());
+
+ type = C2NumbersStreamTuning::output::PARAM_TYPE;
+ EXPECT_FALSE(type.isVendor());
+ EXPECT_TRUE(type.isFlexible());
+ EXPECT_FALSE(type.isGlobal());
+ EXPECT_FALSE(type.forInput());
+ EXPECT_TRUE(type.forOutput());
+ EXPECT_TRUE(type.forStream());
+ EXPECT_FALSE(type.forPort());
+
+ EXPECT_EQ(C2NumbersPortTuning::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::input::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(nullptr), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(ins1.get()), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(ins2.get()), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(outs1.get()), nullptr);
+ EXPECT_EQ(C2NumbersTuning::From(outs2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::From(ins1.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::From(ins2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::From(outs1.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::From(outs2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::input::From(ins1.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::input::From(ins2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::input::From(outs1.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::input::From(outs2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(ins1.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(ins2.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(outs1.get()), nullptr);
+ EXPECT_EQ(C2NumbersPortTuning::output::From(outs2.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::From(ins1.get()), ins1.get());
+ EXPECT_EQ(C2NumbersStreamTuning::From(ins2.get()), (C2NumbersStreamTuning*)ins2.get());
+ EXPECT_EQ(C2NumbersStreamTuning::From(outs1.get()), outs1.get());
+ EXPECT_EQ(C2NumbersStreamTuning::From(outs2.get()), (C2NumbersStreamTuning*)outs2.get());
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(ins1.get()), (C2NumbersStreamTuning::input*)ins1.get());
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(ins2.get()), ins2.get());
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(outs1.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::input::From(outs2.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(ins1.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(ins2.get()), nullptr);
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(outs1.get()), (C2NumbersStreamTuning::output*)outs1.get());
+ EXPECT_EQ(C2NumbersStreamTuning::output::From(outs2.get()), outs2.get());
+
+ EXPECT_EQ(*(C2Param::Copy(*ins1)), *ins1);
+ EXPECT_EQ(*(C2Param::Copy(*ins2)), *ins2);
+ EXPECT_EQ(*(C2Param::Copy(*outs1)), *outs1);
+ EXPECT_EQ(*(C2Param::Copy(*outs2)), *outs2);
+ }
+
+ {
+ C2Int32Value int32Value(INT32_MIN);
+ static_assert(std::is_same<decltype(int32Value.value), int32_t>::value, "should be int32_t");
+ EXPECT_EQ(INT32_MIN, int32Value.value);
+ std::vector<C2FieldDescriptor> fields = int32Value.FieldList();
+ EXPECT_EQ(1u, fields.size());
+ EXPECT_EQ(FD::INT32, fields.cbegin()->type());
+ EXPECT_EQ(1u, fields.cbegin()->extent());
+ EXPECT_EQ(C2String("value"), fields.cbegin()->name());
+ }
+
+ {
+ C2Uint32Value uint32Value(UINT32_MAX);
+ static_assert(std::is_same<decltype(uint32Value.value), uint32_t>::value, "should be uint32_t");
+ EXPECT_EQ(UINT32_MAX, uint32Value.value);
+ std::vector<C2FieldDescriptor> fields = uint32Value.FieldList();
+ EXPECT_EQ(1u, fields.size());
+ EXPECT_EQ(FD::UINT32, fields.cbegin()->type());
+ EXPECT_EQ(1u, fields.cbegin()->extent());
+ EXPECT_EQ(C2String("value"), fields.cbegin()->name());
+ }
+
+ {
+ C2Int64Value int64Value(INT64_MIN);
+ static_assert(std::is_same<decltype(int64Value.value), int64_t>::value, "should be int64_t");
+ EXPECT_EQ(INT64_MIN, int64Value.value);
+ std::vector<C2FieldDescriptor> fields = int64Value.FieldList();
+ EXPECT_EQ(1u, fields.size());
+ EXPECT_EQ(FD::INT64, fields.cbegin()->type());
+ EXPECT_EQ(1u, fields.cbegin()->extent());
+ EXPECT_EQ(C2String("value"), fields.cbegin()->name());
+ }
+
+ {
+ C2Uint64Value uint64Value(UINT64_MAX);
+ static_assert(std::is_same<decltype(uint64Value.value), uint64_t>::value, "should be uint64_t");
+ EXPECT_EQ(UINT64_MAX, uint64Value.value);
+ std::vector<C2FieldDescriptor> fields = uint64Value.FieldList();
+ EXPECT_EQ(1u, fields.size());
+ EXPECT_EQ(FD::UINT64, fields.cbegin()->type());
+ EXPECT_EQ(1u, fields.cbegin()->extent());
+ EXPECT_EQ(C2String("value"), fields.cbegin()->name());
+ }
+
+ {
+ C2FloatValue floatValue(123.4f);
+ static_assert(std::is_same<decltype(floatValue.value), float>::value, "should be float");
+ EXPECT_EQ(123.4f, floatValue.value);
+ std::vector<C2FieldDescriptor> fields = floatValue.FieldList();
+ EXPECT_EQ(1u, fields.size());
+ EXPECT_EQ(FD::FLOAT, fields.cbegin()->type());
+ EXPECT_EQ(1u, fields.cbegin()->extent());
+ EXPECT_EQ(C2String("value"), fields.cbegin()->name());
+ }
+
+ {
+ uint8_t initValue[] = "ABCD";
+ typedef C2GlobalParam<C2Setting, C2BlobValue, 0> BlobSetting;
+ std::unique_ptr<BlobSetting> blobValue = BlobSetting::AllocUnique(6, C2ConstMemoryBlock<uint8_t>(initValue));
+ static_assert(std::is_same<decltype(blobValue->m.value), uint8_t[]>::value, "should be uint8_t[]");
+ EXPECT_EQ(0, memcmp(blobValue->m.value, "ABCD\0", 6));
+ EXPECT_EQ(6u, blobValue->flexCount());
+ std::vector<C2FieldDescriptor> fields = blobValue->FieldList();
+ EXPECT_EQ(1u, fields.size());
+ EXPECT_EQ(FD::BLOB, fields.cbegin()->type());
+ EXPECT_EQ(0u, fields.cbegin()->extent());
+ EXPECT_EQ(C2String("value"), fields.cbegin()->name());
+
+ blobValue = BlobSetting::AllocUnique(3, C2ConstMemoryBlock<uint8_t>(initValue));
+ EXPECT_EQ(0, memcmp(blobValue->m.value, "ABC", 3));
+ EXPECT_EQ(3u, blobValue->flexCount());
+ }
+
+ {
+ constexpr char initValue[] = "ABCD";
+ typedef C2GlobalParam<C2Setting, C2StringValue, 0> StringSetting;
+ std::unique_ptr<StringSetting> stringValue = StringSetting::AllocUnique(6, C2ConstMemoryBlock<char>(initValue));
+ stringValue = StringSetting::AllocUnique(6, initValue);
+ static_assert(std::is_same<decltype(stringValue->m.value), char[]>::value, "should be char[]");
+ EXPECT_EQ(0, memcmp(stringValue->m.value, "ABCD\0", 6));
+ EXPECT_EQ(6u, stringValue->flexCount());
+ std::vector<C2FieldDescriptor> fields = stringValue->FieldList();
+ EXPECT_EQ(1u, fields.size());
+ EXPECT_EQ(FD::STRING, fields.cbegin()->type());
+ EXPECT_EQ(0u, fields.cbegin()->extent());
+ EXPECT_EQ(C2String("value"), fields.cbegin()->name());
+
+ stringValue = StringSetting::AllocUnique(3, C2ConstMemoryBlock<char>(initValue));
+ EXPECT_EQ(0, memcmp(stringValue->m.value, "AB", 3));
+ EXPECT_EQ(3u, stringValue->flexCount());
+
+ stringValue = StringSetting::AllocUnique(11, "initValue");
+ EXPECT_EQ(0, memcmp(stringValue->m.value, "initValue\0", 11));
+ EXPECT_EQ(11u, stringValue->flexCount());
+
+ stringValue = StringSetting::AllocUnique(initValue);
+ EXPECT_EQ(0, memcmp(stringValue->m.value, "ABCD", 5));
+ EXPECT_EQ(5u, stringValue->flexCount());
+
+ stringValue = StringSetting::AllocUnique({ 'A', 'B', 'C', 'D' });
+ EXPECT_EQ(0, memcmp(stringValue->m.value, "ABC", 4));
+ EXPECT_EQ(4u, stringValue->flexCount());
+ }
+
+ {
+ uint32_t videoWidth[] = { 12u, C2NumbersStreamTuning::output::PARAM_TYPE, 100 };
+ C2Param *p1 = C2Param::From(videoWidth, sizeof(videoWidth));
+ EXPECT_NE(nullptr, p1);
+ EXPECT_EQ(12u, p1->size());
+ EXPECT_EQ(p1->type(), C2NumbersStreamTuning::output::PARAM_TYPE);
+
+ C2NumbersStreamTuning::output *vst = C2NumbersStreamTuning::output::From(p1);
+ EXPECT_NE(nullptr, vst);
+ if (vst) {
+ EXPECT_EQ(1u, vst->flexCount());
+ EXPECT_EQ(100, vst->m.mNumbers[0]);
+ }
+
+ p1 = C2Param::From(videoWidth, sizeof(videoWidth) + 2);
+ EXPECT_EQ(nullptr, p1);
+
+ p1 = C2Param::From(videoWidth, sizeof(videoWidth) - 2);
+ EXPECT_EQ(nullptr, p1);
+
+ p1 = C2Param::From(videoWidth, 3);
+ EXPECT_EQ(nullptr, p1);
+
+ p1 = C2Param::From(videoWidth, 0);
+ EXPECT_EQ(nullptr, p1);
+ }
+
+ {
+ uint32_t videoWidth[] = { 16u, C2NumbersPortTuning::input::PARAM_TYPE, 101, 102 };
+
+ C2Param *p1 = C2Param::From(videoWidth, sizeof(videoWidth));
+ EXPECT_NE(nullptr, p1);
+ EXPECT_EQ(16u, p1->size());
+ EXPECT_EQ(p1->type(), C2NumbersPortTuning::input::PARAM_TYPE);
+
+ C2NumbersPortTuning::input *vpt = C2NumbersPortTuning::input::From(p1);
+ EXPECT_NE(nullptr, vpt);
+ if (vpt) {
+ EXPECT_EQ(2u, vpt->flexCount());
+ EXPECT_EQ(101, vpt->m.mNumbers[0]);
+ EXPECT_EQ(102, vpt->m.mNumbers[1]);
+ }
+
+ p1 = C2Param::From(videoWidth, sizeof(videoWidth) + 2);
+ EXPECT_EQ(nullptr, p1);
+
+ p1 = C2Param::From(videoWidth, sizeof(videoWidth) - 2);
+ EXPECT_EQ(nullptr, p1);
+
+ p1 = C2Param::From(videoWidth, 3);
+ EXPECT_EQ(nullptr, p1);
+
+ p1 = C2Param::From(videoWidth, 0);
+ EXPECT_EQ(nullptr, p1);
+ }
+}
+
+TEST_F(C2ParamTest, C2ValueTest) {
+ C2Value val;
+ int32_t i32 = -32;
+ int64_t i64 = -64;
+ uint32_t u32 = 32;
+ uint64_t u64 = 64;
+ float fp = 1.5f;
+
+ EXPECT_EQ(C2Value::NO_INIT, val.type());
+ EXPECT_EQ(false, val.get(&i32));
+ EXPECT_EQ(-32, i32);
+ EXPECT_EQ(false, val.get(&i64));
+ EXPECT_EQ(-64, i64);
+ EXPECT_EQ(false, val.get(&u32));
+ EXPECT_EQ(32u, u32);
+ EXPECT_EQ(false, val.get(&u64));
+ EXPECT_EQ(64u, u64);
+ EXPECT_EQ(false, val.get(&fp));
+ EXPECT_EQ(1.5f, fp);
+
+ val = int32_t(-3216);
+ EXPECT_EQ(C2Value::INT32, val.type());
+ EXPECT_EQ(true, val.get(&i32));
+ EXPECT_EQ(-3216, i32);
+ EXPECT_EQ(false, val.get(&i64));
+ EXPECT_EQ(-64, i64);
+ EXPECT_EQ(false, val.get(&u32));
+ EXPECT_EQ(32u, u32);
+ EXPECT_EQ(false, val.get(&u64));
+ EXPECT_EQ(64u, u64);
+ EXPECT_EQ(false, val.get(&fp));
+ EXPECT_EQ(1.5f, fp);
+
+ val = uint32_t(3216);
+ EXPECT_EQ(C2Value::UINT32, val.type());
+ EXPECT_EQ(false, val.get(&i32));
+ EXPECT_EQ(-3216, i32);
+ EXPECT_EQ(false, val.get(&i64));
+ EXPECT_EQ(-64, i64);
+ EXPECT_EQ(true, val.get(&u32));
+ EXPECT_EQ(3216u, u32);
+ EXPECT_EQ(false, val.get(&u64));
+ EXPECT_EQ(64u, u64);
+ EXPECT_EQ(false, val.get(&fp));
+ EXPECT_EQ(1.5f, fp);
+
+ val = int64_t(-6432);
+ EXPECT_EQ(C2Value::INT64, val.type());
+ EXPECT_EQ(false, val.get(&i32));
+ EXPECT_EQ(-3216, i32);
+ EXPECT_EQ(true, val.get(&i64));
+ EXPECT_EQ(-6432, i64);
+ EXPECT_EQ(false, val.get(&u32));
+ EXPECT_EQ(3216u, u32);
+ EXPECT_EQ(false, val.get(&u64));
+ EXPECT_EQ(64u, u64);
+ EXPECT_EQ(false, val.get(&fp));
+ EXPECT_EQ(1.5f, fp);
+
+ val = uint64_t(6432);
+ EXPECT_EQ(C2Value::UINT64, val.type());
+ EXPECT_EQ(false, val.get(&i32));
+ EXPECT_EQ(-3216, i32);
+ EXPECT_EQ(false, val.get(&i64));
+ EXPECT_EQ(-6432, i64);
+ EXPECT_EQ(false, val.get(&u32));
+ EXPECT_EQ(3216u, u32);
+ EXPECT_EQ(true, val.get(&u64));
+ EXPECT_EQ(6432u, u64);
+ EXPECT_EQ(false, val.get(&fp));
+ EXPECT_EQ(1.5f, fp);
+
+ val = 15.25f;
+ EXPECT_EQ(C2Value::FLOAT, val.type());
+ EXPECT_EQ(false, val.get(&i32));
+ EXPECT_EQ(-3216, i32);
+ EXPECT_EQ(false, val.get(&i64));
+ EXPECT_EQ(-6432, i64);
+ EXPECT_EQ(false, val.get(&u32));
+ EXPECT_EQ(3216u, u32);
+ EXPECT_EQ(false, val.get(&u64));
+ EXPECT_EQ(6432u, u64);
+ EXPECT_EQ(true, val.get(&fp));
+ EXPECT_EQ(15.25f, fp);
+}
+
diff --git a/media/codec2/tests/C2SampleComponent_test.cpp b/media/codec2/tests/C2SampleComponent_test.cpp
new file mode 100644
index 0000000..cd354ad
--- /dev/null
+++ b/media/codec2/tests/C2SampleComponent_test.cpp
@@ -0,0 +1,432 @@
+/*
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2SampleComponent_test"
+
+#include <gtest/gtest.h>
+
+#define __C2_GENERATE_GLOBAL_VARS__
+#include <C2Component.h>
+#include <C2Config.h>
+#include <C2Debug.h>
+#include <C2Enum.h>
+
+#include <unordered_map>
+
+class C2SampleComponentTest : public ::testing::Test {
+};
+
+void PrintTo(const C2FieldDescriptor &fd, ::std::ostream *os) {
+ using FD=C2FieldDescriptor;
+ switch (fd.type()) {
+ case FD::INT32: *os << "i32"; break;
+ case FD::INT64: *os << "i64"; break;
+ case FD::UINT32: *os << "u32"; break;
+ case FD::UINT64: *os << "u64"; break;
+ case FD::FLOAT: *os << "float"; break;
+ case FD::STRING: *os << "char"; break;
+ case FD::BLOB: *os << "u8"; break;
+ default:
+ if (fd.type() & FD::STRUCT_FLAG) {
+ *os << "struct-" << (fd.type() & ~FD::STRUCT_FLAG);
+ } else {
+ *os << "type-" << fd.type();
+ }
+ }
+ *os << " " << fd.name();
+ if (fd.extent() > 1) {
+ *os << "[" << fd.extent() << "]";
+ } else if (fd.extent() == 0) {
+ *os << "[]";
+ }
+ *os << " (" << fd._mFieldId << "*" << fd.extent() << ")";
+}
+
+C2ENUM(
+ MetadataType, int32_t,
+ kInvalid = -1,
+ kNone = 0,
+ kGralloc,
+ kNativeHandle,
+ kANativeWindow,
+ kCamera,
+)
+
+enum {
+ kParamIndexVideoConfig = 0x1234,
+};
+
+struct C2VideoConfigStruct {
+ int32_t width;
+ uint32_t height;
+ MetadataType metadataType;
+ int32_t supportedFormats[];
+
+ C2VideoConfigStruct() {}
+
+ DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(VideoConfig, supportedFormats)
+ C2FIELD(width, "width")
+ C2FIELD(height, "height")
+ C2FIELD(metadataType, "metadata-type")
+ C2FIELD(supportedFormats, "formats")
+};
+
+typedef C2PortParam<C2Tuning, C2VideoConfigStruct> C2VideoConfigPortTuning;
+
+class MyComponentInstance : public C2ComponentInterface {
+public:
+ virtual C2String getName() const override {
+ /// \todo this seems too specific
+ return "sample.interface";
+ };
+
+ virtual c2_node_id_t getId() const override {
+ /// \todo how are these shared?
+ return 0;
+ }
+
+ virtual c2_status_t config_vb(
+ const std::vector<C2Param*> ¶ms,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) override {
+ (void)params;
+ (void)failures;
+ (void)mayBlock;
+ return C2_OMITTED;
+ }
+
+ virtual c2_status_t createTunnel_sm(c2_node_id_t targetComponent) override {
+ (void)targetComponent;
+ return C2_OMITTED;
+ }
+
+ virtual c2_status_t query_vb(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const override {
+ for (C2Param* const param : stackParams) {
+ (void)mayBlock;
+ if (!*param) { // param is already invalid - remember it
+ continue;
+ }
+
+ // note: this does not handle stream params (should use index...)
+ if (!mMyParams.count(param->index())) {
+ continue; // not my param
+ }
+
+ C2Param & myParam = mMyParams.find(param->index())->second;
+ if (myParam.size() != param->size()) { // incorrect size
+ param->invalidate();
+ continue;
+ }
+
+ param->updateFrom(myParam);
+ }
+
+ for (const C2Param::Index index : heapParamIndices) {
+ if (mMyParams.count(index)) {
+ C2Param & myParam = mMyParams.find(index)->second;
+ std::unique_ptr<C2Param> paramCopy(C2Param::Copy(myParam));
+ heapParams->push_back(std::move(paramCopy));
+ }
+ }
+
+ return C2_OK;
+ }
+
+ std::unordered_map<uint32_t, C2Param &> mMyParams;
+
+ C2ComponentDomainInfo mDomainInfo;
+
+ MyComponentInstance() {
+ mMyParams.insert({mDomainInfo.index(), mDomainInfo});
+ }
+
+ virtual c2_status_t releaseTunnel_sm(c2_node_id_t targetComponent) override {
+ (void)targetComponent;
+ return C2_OMITTED;
+ }
+
+ class MyParamReflector : public C2ParamReflector {
+ const MyComponentInstance *instance;
+
+ public:
+ MyParamReflector(const MyComponentInstance *i) : instance(i) { }
+
+ virtual std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex paramIndex) const override {
+ switch (paramIndex.typeIndex()) {
+ case decltype(instance->mDomainInfo)::CORE_INDEX:
+ default:
+ return std::unique_ptr<C2StructDescriptor>(new C2StructDescriptor{
+ instance->mDomainInfo.type(),
+ decltype(instance->mDomainInfo)::FieldList(),
+ });
+ }
+ return nullptr;
+ }
+ };
+
+ virtual c2_status_t querySupportedValues_vb(
+ std::vector<C2FieldSupportedValuesQuery> &fields,
+ c2_blocking_t mayBlock) const override {
+ (void)mayBlock;
+ for (C2FieldSupportedValuesQuery &query : fields) {
+ if (query.field() == C2ParamField(&mDomainInfo, &C2ComponentDomainInfo::value)) {
+ query.values = C2FieldSupportedValues(
+ false /* flag */,
+ &mDomainInfo.value
+ //,
+ //{(int32_t)C2DomainVideo}
+ );
+ query.status = C2_OK;
+ } else {
+ query.status = C2_BAD_INDEX;
+ }
+ }
+ return C2_OK;
+ }
+
+ std::shared_ptr<C2ParamReflector> getParamReflector() const {
+ return std::shared_ptr<C2ParamReflector>(new MyParamReflector(this));
+ }
+
+ virtual c2_status_t querySupportedParams_nb(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) const override {
+ params->push_back(std::make_shared<C2ParamDescriptor>(
+ true /* required */, "_domain", &mDomainInfo));
+ params->push_back(std::shared_ptr<C2ParamDescriptor>(
+ new C2ParamDescriptor(true /* required */, "_domain", &mDomainInfo)));
+ return C2_OK;
+ }
+
+ virtual ~MyComponentInstance() override = default;
+};
+
+template<typename E, bool S=std::is_enum<E>::value>
+struct getter {
+ int32_t get(const C2FieldSupportedValues::Primitive &p, int32_t*) {
+ return p.i32;
+ }
+ int64_t get(const C2FieldSupportedValues::Primitive &p, int64_t*) {
+ return p.i64;
+ }
+ uint32_t get(const C2FieldSupportedValues::Primitive &p, uint32_t*) {
+ return p.u32;
+ }
+ uint64_t get(const C2FieldSupportedValues::Primitive &p, uint64_t*) {
+ return p.u64;
+ }
+ float get(const C2FieldSupportedValues::Primitive &p, float*) {
+ return p.fp;
+ }
+};
+
+template<typename E>
+struct getter<E, true> {
+ typename std::underlying_type<E>::type get(const C2FieldSupportedValues::Primitive &p, E*) {
+ using u=typename std::underlying_type<E>::type;
+ return getter<u>().get(p, (u*)0);
+ }
+};
+
+template<typename T, bool E=std::is_enum<T>::value>
+struct lax_underlying_type {
+ typedef typename std::underlying_type<T>::type type;
+};
+
+template<typename T>
+struct lax_underlying_type<T, false> {
+ typedef T type;
+};
+
+template<typename E>
+typename lax_underlying_type<E>::type get(
+ const C2FieldSupportedValues::Primitive &p, E*) {
+ return getter<E>().get(p, (E*)0);
+}
+
+template<typename T>
+void dumpFSV(const C2FieldSupportedValues &sv, T*t) {
+ using namespace std;
+ cout << (std::is_enum<T>::value ? (std::is_signed<typename lax_underlying_type<T>::type>::value ? "i" : "u")
+ : std::is_integral<T>::value ? std::is_signed<T>::value ? "i" : "u" : "f")
+ << (8 * sizeof(T));
+ if (sv.type == sv.RANGE) {
+ cout << ".range(" << get(sv.range.min, t);
+ if (get(sv.range.step, t) != std::is_integral<T>::value) {
+ cout << ":" << get(sv.range.step, t);
+ }
+ if (get(sv.range.num, t) != 1 || get(sv.range.denom, t) != 1) {
+ cout << ":" << get(sv.range.num, t) << "/" << get(sv.range.denom, t);
+ }
+ cout << get(sv.range.max, t) << ")";
+ }
+ if (sv.values.size()) {
+ cout << (sv.type == sv.FLAGS ? ".flags(" : ".list(");
+ const char *sep = "";
+ for (const C2FieldSupportedValues::Primitive &p : sv.values) {
+ cout << sep << get(p, t);
+ sep = ",";
+ }
+ cout << ")";
+ }
+ cout << endl;
+}
+
+void dumpType(C2Param::Type type) {
+ using namespace std;
+ cout << (type.isVendor() ? "Vendor" : "C2");
+ if (type.forInput()) {
+ cout << "Input";
+ } else if (type.forOutput()) {
+ cout << "Output";
+ } else if (type.forPort() && !type.forStream()) {
+ cout << "Port";
+ }
+ if (type.forStream()) {
+ cout << "Stream";
+ }
+
+ if (type.isFlexible()) {
+ cout << "Flex";
+ }
+
+ cout << type.typeIndex();
+
+ switch (type.kind()) {
+ case C2Param::INFO: cout << "Info"; break;
+ case C2Param::SETTING: cout << "Setting"; break;
+ case C2Param::TUNING: cout << "Tuning"; break;
+ case C2Param::STRUCT: cout << "Struct"; break;
+ default: cout << "Kind" << (int32_t)type.kind(); break;
+ }
+}
+
+void dumpType(C2Param::CoreIndex type) {
+ using namespace std;
+ cout << (type.isVendor() ? "Vendor" : "C2");
+ if (type.isFlexible()) {
+ cout << "Flex";
+ }
+
+ cout << type.typeIndex() << "Struct";
+}
+
+void dumpType(C2FieldDescriptor::type_t type) {
+ using namespace std;
+ switch (type) {
+ case C2FieldDescriptor::BLOB: cout << "blob "; break;
+ case C2FieldDescriptor::FLOAT: cout << "float "; break;
+ case C2FieldDescriptor::INT32: cout << "int32_t "; break;
+ case C2FieldDescriptor::INT64: cout << "int64_t "; break;
+ case C2FieldDescriptor::UINT32: cout << "uint32_t "; break;
+ case C2FieldDescriptor::UINT64: cout << "uint64_t "; break;
+ case C2FieldDescriptor::STRING: cout << "char "; break;
+ default:
+ cout << "struct ";
+ dumpType((C2Param::Type)type);
+ break;
+ }
+}
+
+void dumpStruct(const C2StructDescriptor &sd) {
+ using namespace std;
+ cout << "struct ";
+ dumpType(sd.coreIndex());
+ cout << " {" << endl;
+ //C2FieldDescriptor &f;
+ for (const C2FieldDescriptor &f : sd) {
+ PrintTo(f, &cout);
+ cout << endl;
+
+ if (f.namedValues().size()) {
+ cout << ".named(";
+ const char *sep = "";
+ for (const C2FieldDescriptor::NamedValueType &p : f.namedValues()) {
+ cout << sep << p.first << "=";
+ switch (f.type()) {
+ case C2FieldDescriptor::INT32: cout << get(p.second, (int32_t *)0); break;
+ case C2FieldDescriptor::INT64: cout << get(p.second, (int64_t *)0); break;
+ case C2FieldDescriptor::UINT32: cout << get(p.second, (uint32_t *)0); break;
+ case C2FieldDescriptor::UINT64: cout << get(p.second, (uint64_t *)0); break;
+ case C2FieldDescriptor::FLOAT: cout << get(p.second, (float *)0); break;
+ default: cout << "???"; break;
+ }
+ sep = ",";
+ }
+ cout << ")";
+ }
+ }
+
+ cout << "};" << endl;
+}
+
+void dumpDesc(const C2ParamDescriptor &pd) {
+ using namespace std;
+ if (pd.isRequired()) {
+ cout << "required ";
+ }
+ if (pd.isPersistent()) {
+ cout << "persistent ";
+ }
+ cout << "struct ";
+ dumpType(C2Param::Type(pd.index().type()));
+ cout << " " << pd.name() << ";" << endl;
+}
+
+TEST_F(C2SampleComponentTest, ReflectorTest) {
+ C2ComponentDomainInfo domainInfo;
+ std::shared_ptr<MyComponentInstance> myComp(new MyComponentInstance);
+ std::shared_ptr<C2ComponentInterface> comp = myComp;
+
+ std::unique_ptr<C2StructDescriptor> desc{
+ myComp->getParamReflector()->describe(C2ComponentDomainInfo::CORE_INDEX)};
+ dumpStruct(*desc);
+
+ std::vector<C2FieldSupportedValuesQuery> query = {
+ { C2ParamField(&domainInfo, &C2ComponentDomainInfo::value),
+ C2FieldSupportedValuesQuery::CURRENT },
+ C2FieldSupportedValuesQuery(C2ParamField(&domainInfo, &C2ComponentDomainInfo::value),
+ C2FieldSupportedValuesQuery::CURRENT),
+ C2FieldSupportedValuesQuery::Current(C2ParamField(&domainInfo, &C2ComponentDomainInfo::value)),
+ };
+
+ EXPECT_EQ(C2_OK, comp->querySupportedValues_vb(query, C2_DONT_BLOCK));
+
+ for (const C2FieldSupportedValuesQuery &q : query) {
+ dumpFSV(q.values, &domainInfo.value);
+ }
+}
+
+TEST_F(C2SampleComponentTest, FieldSupportedValuesTest) {
+ typedef C2GlobalParam<C2Info, C2Uint32Value, 0> Uint32TestInfo;
+ Uint32TestInfo t;
+ std::vector<C2FieldSupportedValues> values;
+ values.push_back(C2FieldSupportedValues(0, 10, 1)); // min, max, step
+ values.push_back(C2FieldSupportedValues(1, 64, 2, 1)); // min, max, num, den
+ values.push_back(C2FieldSupportedValues(false, {1, 2, 3})); // flags, std::initializer_list
+ uint32_t val[] = {1, 3, 5, 7};
+ std::vector<uint32_t> v(std::begin(val), std::end(val));
+ values.push_back(C2FieldSupportedValues(false, v)); // flags, std::vector
+
+ for (const C2FieldSupportedValues &sv : values) {
+ dumpFSV(sv, &t.value);
+ }
+}
+
diff --git a/media/codec2/tests/C2UtilTest.cpp b/media/codec2/tests/C2UtilTest.cpp
new file mode 100644
index 0000000..59cd313
--- /dev/null
+++ b/media/codec2/tests/C2UtilTest.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2UtilTest"
+
+#include <gtest/gtest.h>
+
+#define __C2_GENERATE_GLOBAL_VARS__
+#include <_C2MacroUtils.h>
+#include <C2Enum.h>
+
+/** \file
+ * Tests for vndk/util.
+ */
+
+/* --------------------------------------- _C2MacroUtils --------------------------------------- */
+
+static_assert(0 == _C2_ARGC(), "should be 0");
+static_assert(1 == _C2_ARGC(1), "should be 1");
+static_assert(2 == _C2_ARGC(1, 2), "should be 2");
+static_assert(64 == _C2_ARGC(
+ 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), "should be 64");
+
+static_assert(0 == _C2_ARGC(,), "should be 0");
+static_assert(1 == _C2_ARGC(1,), "should be 1");
+static_assert(2 == _C2_ARGC(1, 2,), "should be 2");
+static_assert(64 == _C2_ARGC(
+ 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,), "should be 64");
+
+/* ---------------------------------------- _C2EnumUtils ---------------------------------------- */
+
+class C2UtilTest : public ::testing::Test {
+};
+
+C2ENUM(Enum1, uint32_t,
+ Enum1Value1,
+ Enum1Value2,
+ Enum1Value4 = Enum1Value2 + 2,
+);
+
+C2ENUM_CUSTOM_PREFIX(Enum2, uint32_t, "Enum",
+ Enum2Value1,
+ Enum2Value2,
+ Enum2Value4 = Enum1Value2 + 2,
+);
+
+C2ENUM_CUSTOM_NAMES(Enum3, uint8_t,
+ ({ { "value1", Enum3Value1 },
+ { "value2", Enum3Value2 },
+ { "value4", Enum3Value4 },
+ { "invalid", Invalid } }),
+ Enum3Value1,
+ Enum3Value2,
+ Enum3Value4 = Enum3Value2 + 2,
+ Invalid,
+);
+
+TEST_F(C2UtilTest, EnumUtilsTest) {
+ std::vector<std::pair<C2String, Enum3>> pairs ( { { "value1", Enum3Value1 },
+ { "value2", Enum3Value2 },
+ { "value4", Enum3Value4 },
+ { "invalid", Invalid } });
+ Enum3 e3;
+ C2FieldDescriptor::namedValuesFor(e3);
+
+ // upper case
+ EXPECT_EQ("yes", _C2EnumUtils::camelCaseToDashed("YES"));
+ EXPECT_EQ("no", _C2EnumUtils::camelCaseToDashed("NO"));
+ EXPECT_EQ("yes-no", _C2EnumUtils::camelCaseToDashed("YES_NO"));
+ EXPECT_EQ("yes-no", _C2EnumUtils::camelCaseToDashed("YES__NO"));
+ EXPECT_EQ("a2dp", _C2EnumUtils::camelCaseToDashed("A2DP"));
+ EXPECT_EQ("mp2-ts", _C2EnumUtils::camelCaseToDashed("MP2_TS"));
+ EXPECT_EQ("block-2d", _C2EnumUtils::camelCaseToDashed("BLOCK_2D"));
+ EXPECT_EQ("mpeg-2-ts", _C2EnumUtils::camelCaseToDashed("MPEG_2_TS"));
+ EXPECT_EQ("_hidden-value", _C2EnumUtils::camelCaseToDashed("_HIDDEN_VALUE"));
+ EXPECT_EQ("__hidden-value2", _C2EnumUtils::camelCaseToDashed("__HIDDEN_VALUE2"));
+ EXPECT_EQ("__hidden-value-2", _C2EnumUtils::camelCaseToDashed("__HIDDEN_VALUE_2"));
+
+ // camel case
+ EXPECT_EQ("yes", _C2EnumUtils::camelCaseToDashed("Yes"));
+ EXPECT_EQ("no", _C2EnumUtils::camelCaseToDashed("No"));
+ EXPECT_EQ("yes-no", _C2EnumUtils::camelCaseToDashed("YesNo"));
+ EXPECT_EQ("yes-no", _C2EnumUtils::camelCaseToDashed("Yes_No"));
+ EXPECT_EQ("mp2-ts", _C2EnumUtils::camelCaseToDashed("MP2Ts"));
+ EXPECT_EQ("block-2d", _C2EnumUtils::camelCaseToDashed("Block2D"));
+ EXPECT_EQ("mpeg-2-ts", _C2EnumUtils::camelCaseToDashed("Mpeg2ts"));
+ EXPECT_EQ("_hidden-value", _C2EnumUtils::camelCaseToDashed("_HiddenValue"));
+ EXPECT_EQ("__hidden-value-2", _C2EnumUtils::camelCaseToDashed("__HiddenValue2"));
+
+ // mixed case
+ EXPECT_EQ("mp2t-s", _C2EnumUtils::camelCaseToDashed("MP2T_s"));
+ EXPECT_EQ("block-2d", _C2EnumUtils::camelCaseToDashed("Block_2D"));
+ EXPECT_EQ("block-2-d", _C2EnumUtils::camelCaseToDashed("Block2_D"));
+ EXPECT_EQ("mpeg-2-ts", _C2EnumUtils::camelCaseToDashed("Mpeg_2ts"));
+ EXPECT_EQ("mpeg-2-ts", _C2EnumUtils::camelCaseToDashed("Mpeg_2_TS"));
+ EXPECT_EQ("_hidden-value", _C2EnumUtils::camelCaseToDashed("_Hidden__VALUE"));
+ EXPECT_EQ("__hidden-value-2", _C2EnumUtils::camelCaseToDashed("__HiddenValue_2"));
+ EXPECT_EQ("_2", _C2EnumUtils::camelCaseToDashed("_2"));
+ EXPECT_EQ("__23", _C2EnumUtils::camelCaseToDashed("__23"));
+}
+
diff --git a/media/codec2/tests/C2_test.cpp b/media/codec2/tests/C2_test.cpp
new file mode 100644
index 0000000..2ada9f9
--- /dev/null
+++ b/media/codec2/tests/C2_test.cpp
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2_test"
+
+#include <gtest/gtest.h>
+
+#include <C2.h>
+
+/* ======================================= STATIC TESTS ======================================= */
+
+template<int N>
+struct c2_const_checker
+{
+ inline constexpr static int num() { return N; }
+};
+
+constexpr auto min_i32_i32 = c2_min(int32_t(1), int32_t(2));
+static_assert(std::is_same<decltype(min_i32_i32), const int32_t>::value, "should be int32_t");
+constexpr auto min_i32_i64 = c2_min(int32_t(3), int64_t(2));
+static_assert(std::is_same<decltype(min_i32_i64), const int64_t>::value, "should be int64_t");
+constexpr auto min_i8_i32 = c2_min(int8_t(0xff), int32_t(0xffffffff));
+static_assert(std::is_same<decltype(min_i8_i32), const int32_t>::value, "should be int32_t");
+
+static_assert(c2_const_checker<min_i32_i32>::num() == 1, "should be 1");
+static_assert(c2_const_checker<min_i32_i64>::num() == 2, "should be 2");
+static_assert(c2_const_checker<min_i8_i32>::num() == 0xffffffff, "should be 0xffffffff");
+
+constexpr auto min_u32_u32 = c2_min(uint32_t(1), uint32_t(2));
+static_assert(std::is_same<decltype(min_u32_u32), const uint32_t>::value, "should be uint32_t");
+constexpr auto min_u32_u64 = c2_min(uint32_t(3), uint64_t(2));
+static_assert(std::is_same<decltype(min_u32_u64), const uint32_t>::value, "should be uint32_t");
+constexpr auto min_u32_u8 = c2_min(uint32_t(0xffffffff), uint8_t(0xff));
+static_assert(std::is_same<decltype(min_u32_u8), const uint8_t>::value, "should be uint8_t");
+
+static_assert(c2_const_checker<min_u32_u32>::num() == 1, "should be 1");
+static_assert(c2_const_checker<min_u32_u64>::num() == 2, "should be 2");
+static_assert(c2_const_checker<min_u32_u8>::num() == 0xff, "should be 0xff");
+
+constexpr auto max_i32_i32 = c2_max(int32_t(1), int32_t(2));
+static_assert(std::is_same<decltype(max_i32_i32), const int32_t>::value, "should be int32_t");
+constexpr auto max_i32_i64 = c2_max(int32_t(3), int64_t(2));
+static_assert(std::is_same<decltype(max_i32_i64), const int64_t>::value, "should be int64_t");
+constexpr auto max_i8_i32 = c2_max(int8_t(0xff), int32_t(0xffffffff));
+static_assert(std::is_same<decltype(max_i8_i32), const int32_t>::value, "should be int32_t");
+
+static_assert(c2_const_checker<max_i32_i32>::num() == 2, "should be 2");
+static_assert(c2_const_checker<max_i32_i64>::num() == 3, "should be 3");
+static_assert(c2_const_checker<max_i8_i32>::num() == 0xffffffff, "should be 0xffffffff");
+
+constexpr auto max_u32_u32 = c2_max(uint32_t(1), uint32_t(2));
+static_assert(std::is_same<decltype(max_u32_u32), const uint32_t>::value, "should be uint32_t");
+constexpr auto max_u32_u64 = c2_max(uint32_t(3), uint64_t(2));
+static_assert(std::is_same<decltype(max_u32_u64), const uint64_t>::value, "should be uint64_t");
+constexpr auto max_u32_u8 = c2_max(uint32_t(0x7fffffff), uint8_t(0xff));
+static_assert(std::is_same<decltype(max_u32_u8), const uint32_t>::value, "should be uint32_t");
+
+static_assert(c2_const_checker<max_u32_u32>::num() == 2, "should be 2");
+static_assert(c2_const_checker<max_u32_u64>::num() == 3, "should be 3");
+static_assert(c2_const_checker<max_u32_u8>::num() == 0x7fffffff, "should be 0x7fffffff");
+
+/* ======================================= COUNTER TESTS ======================================= */
+
+void c2_cntr_static_test() {
+ // sanity checks for construction/assignment
+ constexpr c2_cntr32_t c32_a(123);
+ constexpr c2_cntr64_t c64_a(-456);
+ c2_cntr32_t c32_b __unused = c64_a;
+ // c32_b = 64.; // DISALLOWED
+ // c2_cntr64_t c64_b = c32_a; // DISALLOWED
+
+ // sanity checks for some constexpr operators
+ static_assert(std::is_same<decltype(c32_a + c64_a), decltype(c64_a + c32_a)>::value, "+ should result same type");
+ static_assert(c32_a + c64_a == c2_cntr32_t(-333), "123 + -456 = -333");
+ static_assert(c32_a + c32_a == c2_cntr32_t(246), "123 + 123 = 246");
+ static_assert(c64_a + c32_a == c2_cntr32_t(-333), "-456 + 123 = 579");
+ static_assert(std::is_same<decltype(c32_a + 1), decltype(1 + c32_a)>::value, "+ should result same type");
+ static_assert(c32_a + 456 == c2_cntr32_t(579), "123 + 456 = 579");
+ static_assert(456 + c64_a == c2_cntr64_t(0), "456 + -456 = 0");
+ static_assert(std::is_same<decltype(c32_a - c64_a), decltype(c64_a - c32_a)>::value, "- should result same type");
+ static_assert(c32_a - c64_a == c2_cntr32_t(579), "123 - -456 = 579");
+ static_assert(c32_a - c32_a == c2_cntr32_t(0), "123 - 123 = 0");
+ static_assert(c64_a - c32_a == c2_cntr32_t(-579), "-456 - 123 = -579");
+ static_assert(std::is_same<decltype(c32_a - 1), decltype(1 - c32_a)>::value, "- should result same type");
+ static_assert(c32_a - 456 == c2_cntr32_t(-333), "123 - 456 = -333");
+ static_assert(456 - c64_a == c2_cntr64_t(912), "456 - -456 = 912");
+ static_assert(std::is_same<decltype(c32_a * c64_a), decltype(c64_a * c32_a)>::value, "* should result same type");
+ static_assert(c32_a * c64_a == c2_cntr32_t(-56088), "123 * -456 = -56088");
+ static_assert(c32_a * c32_a == c2_cntr32_t(15129), "123 * 123 = 15129");
+ static_assert(c64_a * c32_a == c2_cntr32_t(-56088), "-456 * 123 = -56088");
+ static_assert(std::is_same<decltype(c32_a * 1), decltype(1 * c32_a)>::value, "* should result same type");
+ static_assert(c32_a * 456 == c2_cntr32_t(56088), "123 * 456 = 56088");
+ static_assert(456 * c64_a == c2_cntr64_t(-207936), "456 * -456 = -207936");
+
+ static_assert((c32_a << 26u) == c2_cntr32_t(0xEC000000), "123 << 26 = 0xEC000000");
+
+ // sanity checks for unary operators
+ static_assert(c2_cntr32_t(1) == +c2_cntr32_t(1), "1 == +1");
+ static_assert(c2_cntr32_t(1) == -c2_cntr32_t(-1), "1 == --1");
+
+ // sanity checks for comparison
+ using c8_t = c2_cntr_t<uint8_t>;
+ static_assert(c8_t(-0x80) > c8_t(0x7f), "80 > 7F");
+ static_assert(c8_t(-0x80) >= c8_t(0x7f), "80 >= 7F");
+ static_assert(c8_t(0x7f) > c8_t(0x7e), "7F > 7E");
+ static_assert(c8_t(0x7f) >= c8_t(0x7e), "7F >= 7E");
+ static_assert(!(c8_t(-0x80) > c8_t(0)), "80 !> 00");
+ static_assert(!(c8_t(-0x80) >= c8_t(0)), "80 !>= 00");
+ static_assert(!(c8_t(-0x80) > c8_t(-0x80)), "80 !> 80");
+ static_assert(c8_t(-0x80) >= c8_t(-0x80), "80 >= 80");
+
+ static_assert(c8_t(-0x80) == c8_t(0x80), "80 == 80");
+ static_assert(!(c8_t(-0x80) == c8_t(0)), "80 != 0");
+ static_assert(c8_t(-0x80) != c8_t(0x7f), "80 != 7F");
+ static_assert(!(c8_t(0x7f) != c8_t(0x7f)), "80 != 7F");
+
+ static_assert(c8_t(0x7f) < c8_t(-0x80), "7F < 80");
+ static_assert(c8_t(0x7f) <= c8_t(-0x80), "7F < 80");
+ static_assert(c8_t(0x7e) < c8_t(0x7f), "7E < 7F");
+ static_assert(c8_t(0x7e) <= c8_t(0x7f), "7E < 7F");
+ static_assert(!(c8_t(-0x40) < c8_t(0x40)), "-40 !< 40");
+ static_assert(!(c8_t(-0x40) <= c8_t(0x40)), "-40 !<= 40");
+ static_assert(!(c8_t(-0x40) < c8_t(-0x40)), "-40 !< -40");
+ static_assert(c8_t(-0x40) <= c8_t(-0x40), "-40 <= -40");
+
+ static_assert(c2_cntr32_t(-0x7fffffff - 1) > c2_cntr32_t(0x7fffffff), "80 > 7F");
+ static_assert(!(c2_cntr32_t(-0x7fffffff - 1) > c2_cntr32_t(0)), "80 !> 00");
+ static_assert(c2_cntr32_t(1) == c2_cntr32_t(c2_cntr64_t(0x100000001ul)), "1 == 1");
+}
+
+class C2Test : public ::testing::Test {
+};
+
+TEST_F(C2Test, CounterTest) {
+ c2_cntr32_t c32_a(123);
+ c2_cntr64_t c64_a(-456);
+ EXPECT_EQ(c32_a += 3, c2_cntr32_t(126));
+ EXPECT_EQ(c32_a += c64_a, c2_cntr32_t(-330));
+ EXPECT_EQ(c32_a <<= 2u, c2_cntr32_t(-1320));
+ EXPECT_EQ(c64_a *= 3, c2_cntr64_t(-1368));
+ EXPECT_EQ(c32_a -= c64_a, c2_cntr32_t(48));
+ EXPECT_EQ(c32_a -= 40, c2_cntr32_t(8));
+ EXPECT_EQ(c32_a *= c32_a, c2_cntr32_t(64));
+}
+
diff --git a/media/codec2/tests/vndk/C2BufferTest.cpp b/media/codec2/tests/vndk/C2BufferTest.cpp
new file mode 100644
index 0000000..780994a
--- /dev/null
+++ b/media/codec2/tests/vndk/C2BufferTest.cpp
@@ -0,0 +1,768 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include <C2AllocatorIon.h>
+#include <C2AllocatorGralloc.h>
+#include <C2Buffer.h>
+#include <C2BufferPriv.h>
+#include <C2ParamDef.h>
+
+#include <system/graphics.h>
+
+namespace android {
+
+class C2BufferUtilsTest : public ::testing::Test {
+ static void StaticSegmentTest() {
+ // constructor
+ static_assert(C2Segment(123u, 456u).offset == 123, "");
+ static_assert(C2Segment(123u, 456u).size == 456, "");
+
+ // empty
+ static_assert(!C2Segment(123u, 456u).isEmpty(), "");
+ static_assert(C2Segment(123u, 0u).isEmpty(), "");
+
+ // valid
+ static_assert(C2Segment(123u, 456u).isValid(), "");
+ static_assert(C2Segment(123u, ~123u).isValid(), "");
+ static_assert(!C2Segment(123u, 1 + ~123u).isValid(), "");
+
+ // bool()
+ static_assert(C2Segment(123u, 456u), "");
+ static_assert((bool)C2Segment(123u, ~123u), "");
+ static_assert(!bool(C2Segment(123u, 1 + ~123u)), "");
+ static_assert(!bool(C2Segment(123u, 0)), "");
+
+ // !
+ static_assert(!!C2Segment(123u, 456u), "");
+ static_assert(!!C2Segment(123u, ~123u), "");
+ static_assert(!C2Segment(123u, 1 + ~123u), "");
+ static_assert(!C2Segment(123u, 0), "");
+
+ // contains
+ static_assert(C2Segment(123u, ~123u).contains(C2Segment(123u, 0)), "");
+ static_assert(!C2Segment(123u, 1 + ~123u).contains(C2Segment(123u, 0)), "");
+ static_assert(C2Segment(123u, ~123u).contains(C2Segment(123u, ~123u)), "");
+ static_assert(!C2Segment(123u, ~123u).contains(C2Segment(123u, 1 + ~123u)), "");
+ static_assert(!C2Segment(123u, 1 + ~123u).contains(C2Segment(123u, 1 + ~123u)), "");
+ static_assert(!C2Segment(123u, ~123u).contains(C2Segment(122u, 2u)), "");
+ static_assert(C2Segment(123u, ~123u).contains(C2Segment(123u, 2u)), "");
+ static_assert(C2Segment(123u, 3u).contains(C2Segment(124u, 2u)), "");
+ static_assert(!C2Segment(123u, 3u).contains(C2Segment(125u, 2u)), "");
+
+ // ==
+ static_assert(C2Segment(123u, 456u) == C2Segment(123u, 456u), "");
+ static_assert(!(C2Segment(123u, 456u) == C2Segment(123u, 457u)), "");
+ static_assert(!(C2Segment(123u, 456u) == C2Segment(123u, 455u)), "");
+ static_assert(!(C2Segment(123u, 456u) == C2Segment(122u, 456u)), "");
+ static_assert(!(C2Segment(123u, 456u) == C2Segment(124u, 456u)), "");
+ static_assert(!(C2Segment(123u, 0u) == C2Segment(124u, 0u)), "");
+ static_assert(C2Segment(123u, 0u) == C2Segment(123u, 0u), "");
+ static_assert(C2Segment(123u, 1 + ~123u) == C2Segment(124u, 1 + ~124u), "");
+
+ // !=
+ static_assert(!(C2Segment(123u, 456u) != C2Segment(123u, 456u)), "");
+ static_assert(C2Segment(123u, 456u) != C2Segment(123u, 457u), "");
+ static_assert(C2Segment(123u, 456u) != C2Segment(123u, 455u), "");
+ static_assert(C2Segment(123u, 456u) != C2Segment(122u, 456u), "");
+ static_assert(C2Segment(123u, 456u) != C2Segment(124u, 456u), "");
+ static_assert(C2Segment(123u, 0u) != C2Segment(124u, 0u), "");
+ static_assert(!(C2Segment(123u, 0u) != C2Segment(123u, 0u)), "");
+ static_assert(!(C2Segment(123u, 1 + ~123u) != C2Segment(124u, 1 + ~124u)), "");
+
+ // <=
+ static_assert(C2Segment(123u, 456u) <= C2Segment(123u, 456u), "");
+ static_assert(C2Segment(123u, 456u) <= C2Segment(123u, 457u), "");
+ static_assert(C2Segment(123u, 456u) <= C2Segment(122u, 457u), "");
+ static_assert(!(C2Segment(123u, 457u) <= C2Segment(123u, 456u)), "");
+ static_assert(!(C2Segment(122u, 457u) <= C2Segment(123u, 456u)), "");
+ static_assert(!(C2Segment(123u, 457u) <= C2Segment(124u, 457u)), "");
+ static_assert(!(C2Segment(122u, 457u) <= C2Segment(123u, 457u)), "");
+ static_assert(!(C2Segment(122u, 0u) <= C2Segment(123u, 0u)), "");
+ static_assert(C2Segment(123u, 0u) <= C2Segment(122u, 1u), "");
+ static_assert(C2Segment(122u, 0u) <= C2Segment(122u, 1u), "");
+ static_assert(!(C2Segment(122u, ~122u) <= C2Segment(122u, 1 + ~122u)), "");
+ static_assert(!(C2Segment(122u, 1 + ~122u) <= C2Segment(122u, ~122u)), "");
+ static_assert(!(C2Segment(122u, 1 + ~122u) <= C2Segment(122u, 1 + ~122u)), "");
+
+ // <
+ static_assert(!(C2Segment(123u, 456u) < C2Segment(123u, 456u)), "");
+ static_assert(C2Segment(123u, 456u) < C2Segment(123u, 457u), "");
+ static_assert(C2Segment(123u, 456u) < C2Segment(122u, 457u), "");
+ static_assert(!(C2Segment(123u, 457u) < C2Segment(123u, 456u)), "");
+ static_assert(!(C2Segment(122u, 457u) < C2Segment(123u, 456u)), "");
+ static_assert(!(C2Segment(123u, 457u) < C2Segment(124u, 457u)), "");
+ static_assert(!(C2Segment(122u, 457u) < C2Segment(123u, 457u)), "");
+ static_assert(!(C2Segment(122u, 0u) < C2Segment(123u, 0u)), "");
+ static_assert(C2Segment(123u, 0u) < C2Segment(122u, 1u), "");
+ static_assert(C2Segment(122u, 0u) < C2Segment(122u, 1u), "");
+ static_assert(!(C2Segment(122u, ~122u) < C2Segment(122u, 1 + ~122u)), "");
+ static_assert(!(C2Segment(122u, 1 + ~122u) < C2Segment(122u, ~122u)), "");
+ static_assert(!(C2Segment(122u, 1 + ~122u) < C2Segment(122u, 1 + ~122u)), "");
+
+ // <=
+ static_assert(C2Segment(123u, 456u) >= C2Segment(123u, 456u), "");
+ static_assert(C2Segment(123u, 457u) >= C2Segment(123u, 456u), "");
+ static_assert(C2Segment(122u, 457u) >= C2Segment(123u, 456u), "");
+ static_assert(!(C2Segment(123u, 456u) >= C2Segment(123u, 457u)), "");
+ static_assert(!(C2Segment(123u, 456u) >= C2Segment(122u, 457u)), "");
+ static_assert(!(C2Segment(124u, 457u) >= C2Segment(123u, 457u)), "");
+ static_assert(!(C2Segment(123u, 457u) >= C2Segment(122u, 457u)), "");
+ static_assert(!(C2Segment(123u, 0u) >= C2Segment(122u, 0u)), "");
+ static_assert(C2Segment(122u, 1u) >= C2Segment(123u, 0u), "");
+ static_assert(C2Segment(122u, 1u) >= C2Segment(122u, 0u), "");
+ static_assert(!(C2Segment(122u, 1 + ~122u) >= C2Segment(122u, ~122u)), "");
+ static_assert(!(C2Segment(122u, ~122u) >= C2Segment(122u, 1 + ~122u)), "");
+ static_assert(!(C2Segment(122u, 1 + ~122u) >= C2Segment(122u, 1 + ~122u)), "");
+
+ // <
+ static_assert(!(C2Segment(123u, 456u) > C2Segment(123u, 456u)), "");
+ static_assert(C2Segment(123u, 457u) > C2Segment(123u, 456u), "");
+ static_assert(C2Segment(122u, 457u) > C2Segment(123u, 456u), "");
+ static_assert(!(C2Segment(123u, 456u) > C2Segment(123u, 457u)), "");
+ static_assert(!(C2Segment(123u, 456u) > C2Segment(122u, 457u)), "");
+ static_assert(!(C2Segment(124u, 457u) > C2Segment(123u, 457u)), "");
+ static_assert(!(C2Segment(123u, 457u) > C2Segment(122u, 457u)), "");
+ static_assert(!(C2Segment(123u, 0u) > C2Segment(122u, 0u)), "");
+ static_assert(C2Segment(122u, 1u) > C2Segment(123u, 0u), "");
+ static_assert(C2Segment(122u, 1u) > C2Segment(122u, 0u), "");
+ static_assert(!(C2Segment(122u, 1 + ~122u) > C2Segment(122u, ~122u)), "");
+ static_assert(!(C2Segment(122u, ~122u) > C2Segment(122u, 1 + ~122u)), "");
+ static_assert(!(C2Segment(122u, 1 + ~122u) > C2Segment(122u, 1 + ~122u)), "");
+
+ // end
+ static_assert(C2Segment(123u, 456u).end() == 579u, "");
+ static_assert(C2Segment(123u, 0u).end() == 123u, "");
+ static_assert(C2Segment(123u, ~123u).end() == 0xffffffffu, "");
+ static_assert(C2Segment(123u, 1 + ~123u).end() == 0u, "");
+
+ // intersect
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(123u, 456u)) == C2Segment(123u, 456u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(123u, 460u)) == C2Segment(123u, 456u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(124u, 460u)) == C2Segment(124u, 455u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(579u, 460u)) == C2Segment(579u, 0u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(589u, 460u)) == C2Segment(589u, ~9u /* -10 */), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(123u, 455u)) == C2Segment(123u, 455u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(122u, 456u)) == C2Segment(123u, 455u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(0u, 123u)) == C2Segment(123u, 0u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(0u, 0u)) == C2Segment(123u, ~122u /* -123 */), "");
+
+ // normalize (change invalid segments to empty segments)
+ static_assert(C2Segment(123u, 456u).normalize() == C2Segment(123u, 456u), "");
+ static_assert(C2Segment(123u, ~123u).normalize() == C2Segment(123u, ~123u), "");
+ static_assert(C2Segment(123u, 1 + ~123u).normalize() == C2Segment(123u, 0u), "");
+
+ // note: normalize cannot be used to make this work
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(150u, ~150u)).normalize() == C2Segment(150u, 429u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(150u, 1 + ~150u)).normalize() != C2Segment(150u, 429u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(150u, 1 + ~150u)).normalize() == C2Segment(150u, 0u), "");
+
+ // saturate (change invalid segments to full segments up to max)
+ static_assert(C2Segment(123u, 456u).saturate() == C2Segment(123u, 456u), "");
+ static_assert(C2Segment(123u, ~123u).saturate() == C2Segment(123u, ~123u), "");
+ static_assert(C2Segment(123u, 1 + ~123u).saturate() == C2Segment(123u, ~123u), "");
+
+ // note: saturate can be used to make this work but only partially
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(150u, 1 + ~150u).saturate()).normalize() == C2Segment(150u, 429u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(0u, 100u).saturate()).normalize() == C2Segment(123u, 0u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(1000u, 100u).saturate()).normalize() != C2Segment(579u, 0u), "");
+ static_assert(C2Segment(123u, 456u).intersect(C2Segment(1000u, 100u).saturate()).normalize() == C2Segment(1000u, 0u), "");
+
+ }
+
+ static void StaticLinearRangeAndCapacityTest() {
+ class TestCapacity : public _C2LinearCapacityAspect {
+ using _C2LinearCapacityAspect::_C2LinearCapacityAspect;
+ friend class C2BufferUtilsTest;
+ };
+
+ class TestRange : public _C2LinearRangeAspect {
+ using _C2LinearRangeAspect::_C2LinearRangeAspect;
+ friend class C2BufferUtilsTest;
+ };
+
+ // _C2LinearCapacityAspect
+ static_assert(TestCapacity(0u).capacity() == 0u, "");
+ constexpr TestCapacity cap(123u);
+ static_assert(TestCapacity(&cap).capacity() == 123u, "");
+ static_assert(TestCapacity(nullptr).capacity() == 0u, "");
+
+ // _C2LinearCapacityRange
+ static_assert(TestRange(&cap).capacity() == 123u, "");
+ static_assert(TestRange(&cap).offset() == 0u, "");
+ static_assert(TestRange(&cap).size() == 123u, "");
+ static_assert(TestRange(&cap).endOffset() == 123u, "");
+
+ constexpr TestRange range(&cap, 50u, 100u);
+
+ static_assert(range.capacity() == 123u, "");
+ static_assert(range.offset() == 50u, "");
+ static_assert(range.size() == 73u, "");
+ static_assert(range.endOffset() == 123u, "");
+
+ static_assert(TestRange(&cap, 20u, 30u).capacity() == 123u, "");
+ static_assert(TestRange(&cap, 20u, 30u).offset() == 20u, "");
+ static_assert(TestRange(&cap, 20u, 30u).size() == 30u, "");
+ static_assert(TestRange(&cap, 20u, 30u).endOffset() == 50u, "");
+
+ static_assert(TestRange(&cap, 200u, 30u).capacity() == 123u, "");
+ static_assert(TestRange(&cap, 200u, 30u).offset() == 123u, "");
+ static_assert(TestRange(&cap, 200u, 30u).size() == 0u, "");
+ static_assert(TestRange(&cap, 200u, 30u).endOffset() == 123u, "");
+
+ }
+
+};
+
+
+class C2BufferTest : public ::testing::Test {
+public:
+ C2BufferTest()
+ : mBlockPoolId(C2BlockPool::PLATFORM_START),
+ mLinearAllocator(std::make_shared<C2AllocatorIon>('i')),
+ mSize(0u),
+ mAddr(nullptr),
+ mGraphicAllocator(std::make_shared<C2AllocatorGralloc>('g')) {
+ }
+
+ ~C2BufferTest() = default;
+
+ void allocateLinear(size_t capacity) {
+ c2_status_t err = mLinearAllocator->newLinearAllocation(
+ capacity,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &mLinearAllocation);
+ if (err != C2_OK) {
+ mLinearAllocation.reset();
+ FAIL() << "C2Allocator::newLinearAllocation() failed: " << err;
+ }
+ }
+
+ void mapLinear(size_t offset, size_t size, uint8_t **addr) {
+ ASSERT_TRUE(mLinearAllocation);
+ c2_status_t err = mLinearAllocation->map(
+ offset,
+ size,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ // TODO: fence
+ nullptr,
+ &mAddr);
+ if (err != C2_OK) {
+ mAddr = nullptr;
+ FAIL() << "C2LinearAllocation::map() failed: " << err;
+ }
+ ASSERT_NE(nullptr, mAddr);
+ mSize = size;
+ *addr = (uint8_t *)mAddr;
+ }
+
+ void unmapLinear() {
+ ASSERT_TRUE(mLinearAllocation);
+ ASSERT_NE(nullptr, mAddr);
+ ASSERT_NE(0u, mSize);
+
+ // TODO: fence
+ ASSERT_EQ(C2_OK, mLinearAllocation->unmap(mAddr, mSize, nullptr));
+ mSize = 0u;
+ mAddr = nullptr;
+ }
+
+ std::shared_ptr<C2BlockPool> makeLinearBlockPool() {
+ return std::make_shared<C2PooledBlockPool>(mLinearAllocator, mBlockPoolId++);
+ }
+
+ void allocateGraphic(uint32_t width, uint32_t height) {
+ c2_status_t err = mGraphicAllocator->newGraphicAllocation(
+ width,
+ height,
+ HAL_PIXEL_FORMAT_YCBCR_420_888,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &mGraphicAllocation);
+ if (err != C2_OK) {
+ mGraphicAllocation.reset();
+ FAIL() << "C2Allocator::newGraphicAllocation() failed: " << err;
+ }
+ }
+
+ void mapGraphic(C2Rect rect, C2PlanarLayout *layout, uint8_t **addr) {
+ ASSERT_TRUE(mGraphicAllocation);
+ c2_status_t err = mGraphicAllocation->map(
+ rect,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ // TODO: fence
+ nullptr,
+ layout,
+ addr);
+ if (err != C2_OK) {
+ addr[C2PlanarLayout::PLANE_Y] = nullptr;
+ addr[C2PlanarLayout::PLANE_U] = nullptr;
+ addr[C2PlanarLayout::PLANE_V] = nullptr;
+ FAIL() << "C2GraphicAllocation::map() failed: " << err;
+ }
+ mMappedRect = rect;
+ memcpy(mAddrGraphic, addr, sizeof(uint8_t*) * C2PlanarLayout::MAX_NUM_PLANES);
+ }
+
+ void unmapGraphic() {
+ ASSERT_TRUE(mGraphicAllocation);
+
+ // TODO: fence
+ ASSERT_EQ(C2_OK, mGraphicAllocation->unmap(mAddrGraphic, mMappedRect, nullptr));
+ }
+
+ std::shared_ptr<C2BlockPool> makeGraphicBlockPool() {
+ return std::make_shared<C2BasicGraphicBlockPool>(mGraphicAllocator);
+ }
+
+private:
+ C2BlockPool::local_id_t mBlockPoolId;
+ std::shared_ptr<C2Allocator> mLinearAllocator;
+ std::shared_ptr<C2LinearAllocation> mLinearAllocation;
+ size_t mSize;
+ void *mAddr;
+ C2Rect mMappedRect;
+ uint8_t* mAddrGraphic[C2PlanarLayout::MAX_NUM_PLANES];
+
+ std::shared_ptr<C2Allocator> mGraphicAllocator;
+ std::shared_ptr<C2GraphicAllocation> mGraphicAllocation;
+};
+
+TEST_F(C2BufferTest, LinearAllocationTest) {
+ constexpr size_t kCapacity = 1024u * 1024u;
+
+ allocateLinear(kCapacity);
+
+ uint8_t *addr = nullptr;
+ mapLinear(0u, kCapacity, &addr);
+ ASSERT_NE(nullptr, addr);
+
+ for (size_t i = 0; i < kCapacity; ++i) {
+ addr[i] = i % 100u;
+ }
+
+ unmapLinear();
+ addr = nullptr;
+
+ mapLinear(kCapacity / 3, kCapacity / 3, &addr);
+ ASSERT_NE(nullptr, addr);
+ for (size_t i = 0; i < kCapacity / 3; ++i) {
+ ASSERT_EQ((i + kCapacity / 3) % 100, addr[i]) << " at i = " << i;
+ }
+}
+
+TEST_F(C2BufferTest, BlockPoolTest) {
+ constexpr size_t kCapacity = 1024u * 1024u;
+
+ std::shared_ptr<C2BlockPool> blockPool(makeLinearBlockPool());
+
+ std::shared_ptr<C2LinearBlock> block;
+ ASSERT_EQ(C2_OK, blockPool->fetchLinearBlock(
+ kCapacity,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &block));
+ ASSERT_TRUE(block);
+
+ C2Acquirable<C2WriteView> writeViewHolder = block->map();
+ C2WriteView writeView = writeViewHolder.get();
+ ASSERT_EQ(C2_OK, writeView.error());
+ ASSERT_EQ(kCapacity, writeView.capacity());
+ ASSERT_EQ(0u, writeView.offset());
+ ASSERT_EQ(kCapacity, writeView.size());
+
+ uint8_t *data = writeView.data();
+ ASSERT_NE(nullptr, data);
+ for (size_t i = 0; i < writeView.size(); ++i) {
+ data[i] = i % 100u;
+ }
+
+ writeView.setOffset(kCapacity / 3);
+ data = writeView.data();
+ ASSERT_NE(nullptr, data);
+ for (size_t i = 0; i < writeView.size(); ++i) {
+ ASSERT_EQ((i + kCapacity / 3) % 100u, data[i]) << " at i = " << i
+ << "; data = " << static_cast<void *>(data);
+ }
+
+ C2Fence fence;
+ C2ConstLinearBlock constBlock = block->share(
+ kCapacity / 3, kCapacity / 3, fence);
+
+ C2Acquirable<C2ReadView> readViewHolder = constBlock.map();
+ C2ReadView readView = readViewHolder.get();
+ ASSERT_EQ(C2_OK, readView.error());
+ ASSERT_EQ(kCapacity / 3, readView.capacity());
+
+ // TODO: fence
+ const uint8_t *constData = readView.data();
+ ASSERT_NE(nullptr, constData);
+ for (size_t i = 0; i < readView.capacity(); ++i) {
+ ASSERT_EQ((i + kCapacity / 3) % 100u, constData[i]) << " at i = " << i
+ << "; data = " << static_cast<void *>(data)
+ << "; constData = " << static_cast<const void *>(constData);
+ }
+
+ readView = readView.subView(333u, 100u);
+ ASSERT_EQ(C2_OK, readView.error());
+ ASSERT_EQ(100u, readView.capacity());
+
+ constData = readView.data();
+ ASSERT_NE(nullptr, constData);
+ for (size_t i = 0; i < readView.capacity(); ++i) {
+ ASSERT_EQ((i + 333u + kCapacity / 3) % 100u, constData[i]) << " at i = " << i;
+ }
+}
+
+void fillPlane(const C2Rect rect, const C2PlaneInfo info, uint8_t *addr, uint8_t value) {
+ for (uint32_t row = 0; row < rect.height / info.rowSampling; ++row) {
+ int32_t rowOffset = (row + rect.top / info.rowSampling) * info.rowInc;
+ for (uint32_t col = 0; col < rect.width / info.colSampling; ++col) {
+ int32_t colOffset = (col + rect.left / info.colSampling) * info.colInc;
+ addr[rowOffset + colOffset] = value;
+ }
+ }
+}
+
+bool verifyPlane(const C2Rect rect, const C2PlaneInfo info, const uint8_t *addr, uint8_t value) {
+ for (uint32_t row = 0; row < rect.height / info.rowSampling; ++row) {
+ int32_t rowOffset = (row + rect.top / info.rowSampling) * info.rowInc;
+ for (uint32_t col = 0; col < rect.width / info.colSampling; ++col) {
+ int32_t colOffset = (col + rect.left / info.colSampling) * info.colInc;
+ if (addr[rowOffset + colOffset] != value) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+TEST_F(C2BufferTest, GraphicAllocationTest) {
+ constexpr uint32_t kWidth = 320;
+ constexpr uint32_t kHeight = 240;
+
+ allocateGraphic(kWidth, kHeight);
+
+ uint8_t *addr[C2PlanarLayout::MAX_NUM_PLANES];
+ C2Rect rect(kWidth, kHeight);
+ C2PlanarLayout layout;
+ mapGraphic(rect, &layout, addr);
+ ASSERT_NE(nullptr, addr[C2PlanarLayout::PLANE_Y]);
+ ASSERT_NE(nullptr, addr[C2PlanarLayout::PLANE_U]);
+ ASSERT_NE(nullptr, addr[C2PlanarLayout::PLANE_V]);
+
+ uint8_t *y = addr[C2PlanarLayout::PLANE_Y];
+ C2PlaneInfo yInfo = layout.planes[C2PlanarLayout::PLANE_Y];
+ uint8_t *u = addr[C2PlanarLayout::PLANE_U];
+ C2PlaneInfo uInfo = layout.planes[C2PlanarLayout::PLANE_U];
+ uint8_t *v = addr[C2PlanarLayout::PLANE_V];
+ C2PlaneInfo vInfo = layout.planes[C2PlanarLayout::PLANE_V];
+
+ fillPlane(rect, yInfo, y, 0);
+ fillPlane(rect, uInfo, u, 0);
+ fillPlane(rect, vInfo, v, 0);
+ fillPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), yInfo, y, 0x12);
+ fillPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), uInfo, u, 0x34);
+ fillPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), vInfo, v, 0x56);
+
+ unmapGraphic();
+
+ mapGraphic(rect, &layout, addr);
+ ASSERT_NE(nullptr, addr[C2PlanarLayout::PLANE_Y]);
+ ASSERT_NE(nullptr, addr[C2PlanarLayout::PLANE_U]);
+ ASSERT_NE(nullptr, addr[C2PlanarLayout::PLANE_V]);
+
+ y = addr[C2PlanarLayout::PLANE_Y];
+ yInfo = layout.planes[C2PlanarLayout::PLANE_Y];
+ u = addr[C2PlanarLayout::PLANE_U];
+ uInfo = layout.planes[C2PlanarLayout::PLANE_U];
+ v = addr[C2PlanarLayout::PLANE_V];
+ vInfo = layout.planes[C2PlanarLayout::PLANE_V];
+
+ ASSERT_TRUE(verifyPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), yInfo, y, 0x12));
+ ASSERT_TRUE(verifyPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), uInfo, u, 0x34));
+ ASSERT_TRUE(verifyPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), vInfo, v, 0x56));
+ ASSERT_TRUE(verifyPlane({ kWidth, kHeight / 4 }, yInfo, y, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth, kHeight / 4 }, uInfo, u, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth, kHeight / 4 }, vInfo, v, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth / 4, kHeight }, yInfo, y, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth / 4, kHeight }, uInfo, u, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth / 4, kHeight }, vInfo, v, 0));
+}
+
+TEST_F(C2BufferTest, GraphicBlockPoolTest) {
+ constexpr uint32_t kWidth = 320;
+ constexpr uint32_t kHeight = 240;
+
+ std::shared_ptr<C2BlockPool> blockPool(makeGraphicBlockPool());
+
+ std::shared_ptr<C2GraphicBlock> block;
+ ASSERT_EQ(C2_OK, blockPool->fetchGraphicBlock(
+ kWidth,
+ kHeight,
+ HAL_PIXEL_FORMAT_YCBCR_420_888,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &block));
+ ASSERT_TRUE(block);
+
+ C2Acquirable<C2GraphicView> graphicViewHolder = block->map();
+ C2GraphicView graphicView = graphicViewHolder.get();
+ ASSERT_EQ(C2_OK, graphicView.error());
+ ASSERT_EQ(kWidth, graphicView.width());
+ ASSERT_EQ(kHeight, graphicView.height());
+
+ uint8_t *const *data = graphicView.data();
+ C2PlanarLayout layout = graphicView.layout();
+ ASSERT_NE(nullptr, data);
+
+ uint8_t *y = data[C2PlanarLayout::PLANE_Y];
+ C2PlaneInfo yInfo = layout.planes[C2PlanarLayout::PLANE_Y];
+ uint8_t *u = data[C2PlanarLayout::PLANE_U];
+ C2PlaneInfo uInfo = layout.planes[C2PlanarLayout::PLANE_U];
+ uint8_t *v = data[C2PlanarLayout::PLANE_V];
+ C2PlaneInfo vInfo = layout.planes[C2PlanarLayout::PLANE_V];
+
+ fillPlane({ kWidth, kHeight }, yInfo, y, 0);
+ fillPlane({ kWidth, kHeight }, uInfo, u, 0);
+ fillPlane({ kWidth, kHeight }, vInfo, v, 0);
+ fillPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), yInfo, y, 0x12);
+ fillPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), uInfo, u, 0x34);
+ fillPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), vInfo, v, 0x56);
+
+ C2Fence fence;
+ C2ConstGraphicBlock constBlock = block->share(C2Rect(kWidth, kHeight), fence);
+ block.reset();
+
+ C2Acquirable<const C2GraphicView> constViewHolder = constBlock.map();
+ const C2GraphicView constGraphicView = constViewHolder.get();
+ ASSERT_EQ(C2_OK, constGraphicView.error());
+ ASSERT_EQ(kWidth, constGraphicView.width());
+ ASSERT_EQ(kHeight, constGraphicView.height());
+
+ const uint8_t *const *constData = constGraphicView.data();
+ layout = graphicView.layout();
+ ASSERT_NE(nullptr, constData);
+
+ const uint8_t *cy = constData[C2PlanarLayout::PLANE_Y];
+ yInfo = layout.planes[C2PlanarLayout::PLANE_Y];
+ const uint8_t *cu = constData[C2PlanarLayout::PLANE_U];
+ uInfo = layout.planes[C2PlanarLayout::PLANE_U];
+ const uint8_t *cv = constData[C2PlanarLayout::PLANE_V];
+ vInfo = layout.planes[C2PlanarLayout::PLANE_V];
+
+ ASSERT_TRUE(verifyPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), yInfo, cy, 0x12));
+ ASSERT_TRUE(verifyPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), uInfo, cu, 0x34));
+ ASSERT_TRUE(verifyPlane(C2Rect(kWidth / 2, kHeight / 2).at(kWidth / 4, kHeight / 4), vInfo, cv, 0x56));
+ ASSERT_TRUE(verifyPlane({ kWidth, kHeight / 4 }, yInfo, cy, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth, kHeight / 4 }, uInfo, cu, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth, kHeight / 4 }, vInfo, cv, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth / 4, kHeight }, yInfo, cy, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth / 4, kHeight }, uInfo, cu, 0));
+ ASSERT_TRUE(verifyPlane({ kWidth / 4, kHeight }, vInfo, cv, 0));
+}
+
+class BufferData : public C2BufferData {
+public:
+ explicit BufferData(const std::vector<C2ConstLinearBlock> &blocks) : C2BufferData(blocks) {}
+ explicit BufferData(const std::vector<C2ConstGraphicBlock> &blocks) : C2BufferData(blocks) {}
+};
+
+class Buffer : public C2Buffer {
+public:
+ explicit Buffer(const std::vector<C2ConstLinearBlock> &blocks) : C2Buffer(blocks) {}
+ explicit Buffer(const std::vector<C2ConstGraphicBlock> &blocks) : C2Buffer(blocks) {}
+};
+
+TEST_F(C2BufferTest, BufferDataTest) {
+ std::shared_ptr<C2BlockPool> linearBlockPool(makeLinearBlockPool());
+ std::shared_ptr<C2BlockPool> graphicBlockPool(makeGraphicBlockPool());
+
+ constexpr uint32_t kWidth1 = 320;
+ constexpr uint32_t kHeight1 = 240;
+ constexpr C2Rect kCrop1(kWidth1, kHeight1);
+ constexpr uint32_t kWidth2 = 176;
+ constexpr uint32_t kHeight2 = 144;
+ constexpr C2Rect kCrop2(kWidth2, kHeight2);
+ constexpr size_t kCapacity1 = 1024u;
+ constexpr size_t kCapacity2 = 2048u;
+
+ std::shared_ptr<C2LinearBlock> linearBlock1;
+ std::shared_ptr<C2LinearBlock> linearBlock2;
+ ASSERT_EQ(C2_OK, linearBlockPool->fetchLinearBlock(
+ kCapacity1,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &linearBlock1));
+ ASSERT_EQ(C2_OK, linearBlockPool->fetchLinearBlock(
+ kCapacity2,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &linearBlock2));
+ std::shared_ptr<C2GraphicBlock> graphicBlock1;
+ std::shared_ptr<C2GraphicBlock> graphicBlock2;
+ ASSERT_EQ(C2_OK, graphicBlockPool->fetchGraphicBlock(
+ kWidth1,
+ kHeight1,
+ HAL_PIXEL_FORMAT_YCBCR_420_888,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &graphicBlock1));
+ ASSERT_EQ(C2_OK, graphicBlockPool->fetchGraphicBlock(
+ kWidth2,
+ kHeight2,
+ HAL_PIXEL_FORMAT_YCBCR_420_888,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &graphicBlock2));
+
+ std::shared_ptr<C2BufferData> data(new BufferData({ linearBlock1->share(0, kCapacity1, C2Fence()) }));
+ EXPECT_EQ(C2BufferData::LINEAR, data->type());
+ ASSERT_EQ(1u, data->linearBlocks().size());
+ EXPECT_EQ(linearBlock1->handle(), data->linearBlocks().front().handle());
+ EXPECT_TRUE(data->graphicBlocks().empty());
+
+ data.reset(new BufferData({
+ linearBlock1->share(0, kCapacity1, C2Fence()),
+ linearBlock2->share(0, kCapacity2, C2Fence()),
+ }));
+ EXPECT_EQ(C2BufferData::LINEAR_CHUNKS, data->type());
+ ASSERT_EQ(2u, data->linearBlocks().size());
+ EXPECT_EQ(linearBlock1->handle(), data->linearBlocks().front().handle());
+ EXPECT_EQ(linearBlock2->handle(), data->linearBlocks().back().handle());
+ EXPECT_TRUE(data->graphicBlocks().empty());
+
+ data.reset(new BufferData({ graphicBlock1->share(kCrop1, C2Fence()) }));
+ EXPECT_EQ(C2BufferData::GRAPHIC, data->type());
+ ASSERT_EQ(1u, data->graphicBlocks().size());
+ EXPECT_EQ(graphicBlock1->handle(), data->graphicBlocks().front().handle());
+ EXPECT_TRUE(data->linearBlocks().empty());
+
+ data.reset(new BufferData({
+ graphicBlock1->share(kCrop1, C2Fence()),
+ graphicBlock2->share(kCrop2, C2Fence()),
+ }));
+ EXPECT_EQ(C2BufferData::GRAPHIC_CHUNKS, data->type());
+ ASSERT_EQ(2u, data->graphicBlocks().size());
+ EXPECT_EQ(graphicBlock1->handle(), data->graphicBlocks().front().handle());
+ EXPECT_EQ(graphicBlock2->handle(), data->graphicBlocks().back().handle());
+ EXPECT_TRUE(data->linearBlocks().empty());
+}
+
+void DestroyCallback(const C2Buffer * /* buf */, void *arg) {
+ std::function<void(void)> *cb = (std::function<void(void)> *)arg;
+ (*cb)();
+}
+
+enum : uint32_t {
+ kParamIndexNumber1,
+ kParamIndexNumber2,
+};
+
+typedef C2GlobalParam<C2Info, C2Int32Value, kParamIndexNumber1> C2Number1Info;
+typedef C2GlobalParam<C2Info, C2Int32Value, kParamIndexNumber2> C2Number2Info;
+
+TEST_F(C2BufferTest, BufferTest) {
+ std::shared_ptr<C2BlockPool> alloc(makeLinearBlockPool());
+ constexpr size_t kCapacity = 1024u;
+ std::shared_ptr<C2LinearBlock> block;
+
+ ASSERT_EQ(C2_OK, alloc->fetchLinearBlock(
+ kCapacity,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &block));
+
+ std::atomic_bool destroyed(false);
+ std::function<void(void)> arg = [&destroyed](){ destroyed = true; };
+
+ std::shared_ptr<C2Buffer> buffer(new Buffer( { block->share(0, kCapacity, C2Fence()) }));
+ ASSERT_EQ(C2_OK, buffer->registerOnDestroyNotify(&DestroyCallback, &arg));
+ EXPECT_FALSE(destroyed);
+ ASSERT_EQ(C2_DUPLICATE, buffer->registerOnDestroyNotify(&DestroyCallback, &arg));
+ buffer.reset();
+ EXPECT_TRUE(destroyed);
+
+ buffer.reset(new Buffer( { block->share(0, kCapacity, C2Fence()) }));
+ destroyed = false;
+ ASSERT_EQ(C2_OK, buffer->registerOnDestroyNotify(&DestroyCallback, &arg));
+ EXPECT_FALSE(destroyed);
+ ASSERT_EQ(C2_NOT_FOUND, buffer->unregisterOnDestroyNotify(&DestroyCallback, nullptr));
+ ASSERT_EQ(C2_OK, buffer->unregisterOnDestroyNotify(&DestroyCallback, &arg));
+ EXPECT_FALSE(destroyed);
+ ASSERT_EQ(C2_NOT_FOUND, buffer->unregisterOnDestroyNotify(&DestroyCallback, &arg));
+ buffer.reset();
+ EXPECT_FALSE(destroyed);
+
+ std::shared_ptr<C2Info> info1(new C2Number1Info(1));
+ std::shared_ptr<C2Info> info2(new C2Number2Info(2));
+ buffer.reset(new Buffer( { block->share(0, kCapacity, C2Fence()) }));
+ EXPECT_TRUE(buffer->info().empty());
+ EXPECT_FALSE(buffer->hasInfo(info1->type()));
+ EXPECT_FALSE(buffer->hasInfo(info2->type()));
+
+ ASSERT_EQ(C2_OK, buffer->setInfo(info1));
+ EXPECT_EQ(1u, buffer->info().size());
+ EXPECT_EQ(*info1, *buffer->info().front());
+ EXPECT_TRUE(buffer->hasInfo(info1->type()));
+ EXPECT_FALSE(buffer->hasInfo(info2->type()));
+
+ ASSERT_EQ(C2_OK, buffer->setInfo(info2));
+ EXPECT_EQ(2u, buffer->info().size());
+ EXPECT_TRUE(buffer->hasInfo(info1->type()));
+ EXPECT_TRUE(buffer->hasInfo(info2->type()));
+
+ std::shared_ptr<C2Info> removed = buffer->removeInfo(info1->type());
+ ASSERT_TRUE(removed);
+ EXPECT_EQ(*removed, *info1);
+ EXPECT_EQ(1u, buffer->info().size());
+ EXPECT_EQ(*info2, *buffer->info().front());
+ EXPECT_FALSE(buffer->hasInfo(info1->type()));
+ EXPECT_TRUE(buffer->hasInfo(info2->type()));
+
+ removed = buffer->removeInfo(info1->type());
+ ASSERT_FALSE(removed);
+ EXPECT_EQ(1u, buffer->info().size());
+ EXPECT_FALSE(buffer->hasInfo(info1->type()));
+ EXPECT_TRUE(buffer->hasInfo(info2->type()));
+
+ std::shared_ptr<C2Info> info3(new C2Number2Info(3));
+ ASSERT_EQ(C2_OK, buffer->setInfo(info3));
+ EXPECT_EQ(1u, buffer->info().size());
+ EXPECT_FALSE(buffer->hasInfo(info1->type()));
+ EXPECT_TRUE(buffer->hasInfo(info2->type()));
+
+ removed = buffer->removeInfo(info2->type());
+ ASSERT_TRUE(removed);
+ EXPECT_EQ(*info3, *removed);
+ EXPECT_TRUE(buffer->info().empty());
+ EXPECT_FALSE(buffer->hasInfo(info1->type()));
+ EXPECT_FALSE(buffer->hasInfo(info2->type()));
+}
+
+TEST_F(C2BufferTest, MultipleLinearMapTest) {
+ std::shared_ptr<C2BlockPool> pool(makeLinearBlockPool());
+ constexpr size_t kCapacity = 524288u;
+ for (int i = 0; i < 100; ++i) {
+ std::vector<C2WriteView> wViews;
+ std::vector<C2ReadView> rViews;
+ for (int j = 0; j < 16; ++j) {
+ std::shared_ptr<C2LinearBlock> block;
+ ASSERT_EQ(C2_OK, pool->fetchLinearBlock(
+ kCapacity,
+ { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE },
+ &block));
+ wViews.push_back(block->map().get());
+ C2ConstLinearBlock cBlock = block->share(0, kCapacity / 2, C2Fence());
+ rViews.push_back(cBlock.map().get());
+ }
+ }
+}
+
+} // namespace android
diff --git a/media/codec2/vndk/Android.bp b/media/codec2/vndk/Android.bp
new file mode 100644
index 0000000..0eb90be
--- /dev/null
+++ b/media/codec2/vndk/Android.bp
@@ -0,0 +1,102 @@
+cc_library_headers {
+ name: "libcodec2_internal",
+
+ export_include_dirs: [
+ "internal",
+ ],
+
+ // TODO: Remove this when this module is moved back to frameworks/av.
+ vendor_available: true,
+}
+
+// !!!DO NOT DEPEND ON THIS SHARED LIBRARY DIRECTLY!!!
+// use libcodec2-impl-defaults instead
+cc_library_shared {
+ name: "libcodec2_vndk",
+ vendor_available: true,
+
+ srcs: [
+ "C2AllocatorIon.cpp",
+ "C2AllocatorGralloc.cpp",
+ "C2Buffer.cpp",
+ "C2Config.cpp",
+ "C2PlatformStorePluginLoader.cpp",
+ "C2Store.cpp",
+ "platform/C2BqBuffer.cpp",
+ "util/C2Debug.cpp",
+ "util/C2InterfaceHelper.cpp",
+ "util/C2InterfaceUtils.cpp",
+ "util/C2ParamUtils.cpp",
+ ],
+
+ export_include_dirs: [
+ "include",
+ ],
+
+ export_shared_lib_headers: [
+ "libbase",
+ "android.hardware.media.bufferpool@1.0",
+ ],
+
+ local_include_dirs: [
+ "internal",
+ ],
+
+ header_libs: [
+ "media_plugin_headers",
+ "libcodec2_headers",
+ ],
+
+ shared_libs: [
+ "android.hardware.graphics.allocator@2.0",
+ "android.hardware.graphics.bufferqueue@1.0",
+ "android.hardware.graphics.mapper@2.0",
+ "android.hardware.media.bufferpool@1.0",
+ "libbase",
+ "libbinder",
+ "libcutils",
+ "libdl",
+ "libhardware",
+ "libhidlbase",
+ "libion",
+ "libfmq",
+ "liblog",
+ "libstagefright_bufferqueue_helper",
+ "libstagefright_foundation",
+ "libstagefright_bufferpool@1.0",
+ "libui",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+}
+
+// public dependency for implementing Codec 2 components
+cc_defaults {
+ name: "libcodec2-impl-defaults",
+
+ shared_libs: [
+ "libbase", // for C2_LOG
+ "liblog", // for ALOG
+ "libcodec2",
+ "libcodec2_vndk",
+ "libutils",
+ ],
+}
+
+// public dependency for implementing Codec 2 framework utilities
+// THIS IS ONLY FOR FRAMEWORK USE ONLY
+cc_defaults {
+ name: "libcodec2-internal-defaults",
+ defaults: ["libcodec2-impl-defaults"],
+
+ shared_libs: [
+ "libcutils", // for properties
+ ],
+
+ // TODO: separate internal headers so they can be exposed here
+}
+
diff --git a/media/codec2/vndk/C2AllocatorGralloc.cpp b/media/codec2/vndk/C2AllocatorGralloc.cpp
new file mode 100644
index 0000000..22e8d84
--- /dev/null
+++ b/media/codec2/vndk/C2AllocatorGralloc.cpp
@@ -0,0 +1,743 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2AllocatorGralloc"
+#include <utils/Log.h>
+
+#include <android/hardware/graphics/allocator/2.0/IAllocator.h>
+#include <android/hardware/graphics/mapper/2.0/IMapper.h>
+#include <cutils/native_handle.h>
+#include <hardware/gralloc.h>
+
+#include <C2AllocatorGralloc.h>
+#include <C2Buffer.h>
+#include <C2PlatformSupport.h>
+
+namespace android {
+
+namespace {
+ enum : uint64_t {
+ /**
+ * Usage mask that is passed through from gralloc to Codec 2.0 usage.
+ */
+ PASSTHROUGH_USAGE_MASK =
+ ~(GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK | GRALLOC_USAGE_PROTECTED)
+ };
+
+ // verify that passthrough mask is within the platform mask
+ static_assert((~C2MemoryUsage::PLATFORM_MASK & PASSTHROUGH_USAGE_MASK) == 0, "");
+}
+
+C2MemoryUsage C2AndroidMemoryUsage::FromGrallocUsage(uint64_t usage) {
+ // gralloc does not support WRITE_PROTECTED
+ return C2MemoryUsage(
+ ((usage & GRALLOC_USAGE_SW_READ_MASK) ? C2MemoryUsage::CPU_READ : 0) |
+ ((usage & GRALLOC_USAGE_SW_WRITE_MASK) ? C2MemoryUsage::CPU_WRITE : 0) |
+ ((usage & GRALLOC_USAGE_PROTECTED) ? C2MemoryUsage::READ_PROTECTED : 0) |
+ (usage & PASSTHROUGH_USAGE_MASK));
+}
+
+uint64_t C2AndroidMemoryUsage::asGrallocUsage() const {
+ // gralloc does not support WRITE_PROTECTED
+ return (((expected & C2MemoryUsage::CPU_READ) ? GRALLOC_USAGE_SW_READ_OFTEN : 0) |
+ ((expected & C2MemoryUsage::CPU_WRITE) ? GRALLOC_USAGE_SW_WRITE_OFTEN : 0) |
+ ((expected & C2MemoryUsage::READ_PROTECTED) ? GRALLOC_USAGE_PROTECTED : 0) |
+ (expected & PASSTHROUGH_USAGE_MASK));
+}
+
+using ::android::hardware::graphics::allocator::V2_0::IAllocator;
+using ::android::hardware::graphics::common::V1_0::BufferUsage;
+using ::android::hardware::graphics::common::V1_0::PixelFormat;
+using ::android::hardware::graphics::mapper::V2_0::BufferDescriptor;
+using ::android::hardware::graphics::mapper::V2_0::Error;
+using ::android::hardware::graphics::mapper::V2_0::IMapper;
+using ::android::hardware::graphics::mapper::V2_0::YCbCrLayout;
+using ::android::hardware::hidl_handle;
+using ::android::hardware::hidl_vec;
+
+namespace {
+
+struct BufferDescriptorInfo {
+ IMapper::BufferDescriptorInfo mapperInfo;
+ uint32_t stride;
+};
+
+}
+
+/* ===================================== GRALLOC ALLOCATION ==================================== */
+static c2_status_t maperr2error(Error maperr) {
+ switch (maperr) {
+ case Error::NONE: return C2_OK;
+ case Error::BAD_DESCRIPTOR: return C2_BAD_VALUE;
+ case Error::BAD_BUFFER: return C2_BAD_VALUE;
+ case Error::BAD_VALUE: return C2_BAD_VALUE;
+ case Error::NO_RESOURCES: return C2_NO_MEMORY;
+ case Error::UNSUPPORTED: return C2_CANNOT_DO;
+ }
+ return C2_CORRUPTED;
+}
+
+static
+bool native_handle_is_invalid(const native_handle_t *const handle) {
+ // perform basic validation of a native handle
+ if (handle == nullptr) {
+ // null handle is considered valid
+ return false;
+ }
+ return ((size_t)handle->version != sizeof(native_handle_t) ||
+ handle->numFds < 0 ||
+ handle->numInts < 0 ||
+ // for sanity assume handles must occupy less memory than INT_MAX bytes
+ handle->numFds > int((INT_MAX - handle->version) / sizeof(int)) - handle->numInts);
+}
+
+class C2HandleGralloc : public C2Handle {
+private:
+ struct ExtraData {
+ uint32_t width;
+ uint32_t height;
+ uint32_t format;
+ uint32_t usage_lo;
+ uint32_t usage_hi;
+ uint32_t stride;
+ uint32_t generation;
+ uint32_t igbp_id_lo;
+ uint32_t igbp_id_hi;
+ uint32_t igbp_slot;
+ uint32_t magic;
+ };
+
+ enum {
+ NUM_INTS = sizeof(ExtraData) / sizeof(int),
+ };
+ const static uint32_t MAGIC = '\xc2gr\x00';
+
+ static
+ const ExtraData* getExtraData(const C2Handle *const handle) {
+ if (handle == nullptr
+ || native_handle_is_invalid(handle)
+ || handle->numInts < NUM_INTS) {
+ return nullptr;
+ }
+ return reinterpret_cast<const ExtraData*>(
+ &handle->data[handle->numFds + handle->numInts - NUM_INTS]);
+ }
+
+ static
+ ExtraData *getExtraData(C2Handle *const handle) {
+ return const_cast<ExtraData *>(getExtraData(const_cast<const C2Handle *const>(handle)));
+ }
+
+public:
+ void getIgbpData(uint32_t *generation, uint64_t *igbp_id, uint32_t *igbp_slot) const {
+ const ExtraData *ed = getExtraData(this);
+ *generation = ed->generation;
+ *igbp_id = unsigned(ed->igbp_id_lo) | uint64_t(unsigned(ed->igbp_id_hi)) << 32;
+ *igbp_slot = ed->igbp_slot;
+ }
+
+ static bool isValid(const C2Handle *const o) {
+ if (o == nullptr) { // null handle is always valid
+ return true;
+ }
+ const ExtraData *xd = getExtraData(o);
+ // we cannot validate width/height/format/usage without accessing gralloc driver
+ return xd != nullptr && xd->magic == MAGIC;
+ }
+
+ static C2HandleGralloc* WrapNativeHandle(
+ const native_handle_t *const handle,
+ uint32_t width, uint32_t height, uint32_t format, uint64_t usage,
+ uint32_t stride, uint32_t generation, uint64_t igbp_id = 0, uint32_t igbp_slot = 0) {
+ //CHECK(handle != nullptr);
+ if (native_handle_is_invalid(handle) ||
+ handle->numInts > int((INT_MAX - handle->version) / sizeof(int)) - NUM_INTS - handle->numFds) {
+ return nullptr;
+ }
+ ExtraData xd = {
+ width, height, format, uint32_t(usage & 0xFFFFFFFF), uint32_t(usage >> 32),
+ stride, generation, uint32_t(igbp_id & 0xFFFFFFFF), uint32_t(igbp_id >> 32),
+ igbp_slot, MAGIC
+ };
+ native_handle_t *res = native_handle_create(handle->numFds, handle->numInts + NUM_INTS);
+ if (res != nullptr) {
+ memcpy(&res->data, &handle->data, sizeof(int) * (handle->numFds + handle->numInts));
+ *getExtraData(res) = xd;
+ }
+ return reinterpret_cast<C2HandleGralloc *>(res);
+ }
+
+ static native_handle_t* UnwrapNativeHandle(
+ const C2Handle *const handle) {
+ const ExtraData *xd = getExtraData(handle);
+ if (xd == nullptr || xd->magic != MAGIC) {
+ return nullptr;
+ }
+ native_handle_t *res = native_handle_create(handle->numFds, handle->numInts - NUM_INTS);
+ if (res != nullptr) {
+ memcpy(&res->data, &handle->data, sizeof(int) * (res->numFds + res->numInts));
+ }
+ return res;
+ }
+
+ static native_handle_t* UnwrapNativeHandle(
+ const C2Handle *const handle,
+ uint32_t *generation, uint64_t *igbp_id, uint32_t *igbp_slot) {
+ const ExtraData *xd = getExtraData(handle);
+ if (xd == nullptr || xd->magic != MAGIC) {
+ return nullptr;
+ }
+ *generation = xd->generation;
+ *igbp_id = unsigned(xd->igbp_id_lo) | uint64_t(unsigned(xd->igbp_id_hi)) << 32;
+ *igbp_slot = xd->igbp_slot;
+ native_handle_t *res = native_handle_create(handle->numFds, handle->numInts - NUM_INTS);
+ if (res != nullptr) {
+ memcpy(&res->data, &handle->data, sizeof(int) * (res->numFds + res->numInts));
+ }
+ return res;
+ }
+
+ static const C2HandleGralloc* Import(
+ const C2Handle *const handle,
+ uint32_t *width, uint32_t *height, uint32_t *format,
+ uint64_t *usage, uint32_t *stride,
+ uint32_t *generation, uint64_t *igbp_id, uint32_t *igbp_slot) {
+ const ExtraData *xd = getExtraData(handle);
+ if (xd == nullptr) {
+ return nullptr;
+ }
+ *width = xd->width;
+ *height = xd->height;
+ *format = xd->format;
+ *usage = xd->usage_lo | (uint64_t(xd->usage_hi) << 32);
+ *stride = xd->stride;
+ *generation = xd->generation;
+ *igbp_id = xd->igbp_id_lo | (uint64_t(xd->igbp_id_hi) << 32);
+ *igbp_slot = xd->igbp_slot;
+ return reinterpret_cast<const C2HandleGralloc *>(handle);
+ }
+};
+
+native_handle_t *UnwrapNativeCodec2GrallocHandle(const C2Handle *const handle) {
+ return C2HandleGralloc::UnwrapNativeHandle(handle);
+}
+
+native_handle_t *UnwrapNativeCodec2GrallocHandle(
+ const C2Handle *const handle,
+ uint32_t *generation, uint64_t *igbp_id, uint32_t *igbp_slot) {
+ return C2HandleGralloc::UnwrapNativeHandle(handle, generation, igbp_id, igbp_slot);
+}
+
+C2Handle *WrapNativeCodec2GrallocHandle(
+ const native_handle_t *const handle,
+ uint32_t width, uint32_t height, uint32_t format, uint64_t usage, uint32_t stride,
+ uint32_t generation, uint64_t igbp_id, uint32_t igbp_slot) {
+ return C2HandleGralloc::WrapNativeHandle(handle, width, height, format, usage, stride,
+ generation, igbp_id, igbp_slot);
+}
+
+class C2AllocationGralloc : public C2GraphicAllocation {
+public:
+ virtual ~C2AllocationGralloc() override;
+
+ virtual c2_status_t map(
+ C2Rect rect, C2MemoryUsage usage, C2Fence *fence,
+ C2PlanarLayout *layout /* nonnull */, uint8_t **addr /* nonnull */) override;
+ virtual c2_status_t unmap(
+ uint8_t **addr /* nonnull */, C2Rect rect, C2Fence *fence /* nullable */) override;
+ virtual C2Allocator::id_t getAllocatorId() const override { return mAllocatorId; }
+ virtual const C2Handle *handle() const override { return mLockedHandle ? : mHandle; }
+ virtual bool equals(const std::shared_ptr<const C2GraphicAllocation> &other) const override;
+
+ // internal methods
+ // |handle| will be moved.
+ C2AllocationGralloc(
+ const BufferDescriptorInfo &info,
+ const sp<IMapper> &mapper,
+ hidl_handle &hidlHandle,
+ const C2HandleGralloc *const handle,
+ C2Allocator::id_t allocatorId);
+ int dup() const;
+ c2_status_t status() const;
+
+private:
+ const BufferDescriptorInfo mInfo;
+ const sp<IMapper> mMapper;
+ const hidl_handle mHidlHandle;
+ const C2HandleGralloc *mHandle;
+ buffer_handle_t mBuffer;
+ const C2HandleGralloc *mLockedHandle;
+ bool mLocked;
+ C2Allocator::id_t mAllocatorId;
+ std::mutex mMappedLock;
+};
+
+C2AllocationGralloc::C2AllocationGralloc(
+ const BufferDescriptorInfo &info,
+ const sp<IMapper> &mapper,
+ hidl_handle &hidlHandle,
+ const C2HandleGralloc *const handle,
+ C2Allocator::id_t allocatorId)
+ : C2GraphicAllocation(info.mapperInfo.width, info.mapperInfo.height),
+ mInfo(info),
+ mMapper(mapper),
+ mHidlHandle(std::move(hidlHandle)),
+ mHandle(handle),
+ mBuffer(nullptr),
+ mLockedHandle(nullptr),
+ mLocked(false),
+ mAllocatorId(allocatorId) {
+}
+
+C2AllocationGralloc::~C2AllocationGralloc() {
+ if (!mBuffer) {
+ return;
+ }
+ if (mLocked) {
+ // implementation ignores addresss and rect
+ uint8_t* addr[C2PlanarLayout::MAX_NUM_PLANES] = {};
+ unmap(addr, C2Rect(), nullptr);
+ }
+ mMapper->freeBuffer(const_cast<native_handle_t *>(mBuffer));
+ native_handle_delete(const_cast<native_handle_t*>(
+ reinterpret_cast<const native_handle_t*>(mHandle)));
+}
+
+c2_status_t C2AllocationGralloc::map(
+ C2Rect rect, C2MemoryUsage usage, C2Fence *fence,
+ C2PlanarLayout *layout /* nonnull */, uint8_t **addr /* nonnull */) {
+ uint64_t grallocUsage = static_cast<C2AndroidMemoryUsage>(usage).asGrallocUsage();
+ ALOGV("mapping buffer with usage %#llx => %#llx",
+ (long long)usage.expected, (long long)grallocUsage);
+
+ // TODO
+ (void) fence;
+
+ std::lock_guard<std::mutex> lock(mMappedLock);
+ if (mBuffer && mLocked) {
+ ALOGD("already mapped");
+ return C2_DUPLICATE;
+ }
+ if (!layout || !addr) {
+ ALOGD("wrong param");
+ return C2_BAD_VALUE;
+ }
+
+ c2_status_t err = C2_OK;
+ if (!mBuffer) {
+ mMapper->importBuffer(
+ mHidlHandle, [&err, this](const auto &maperr, const auto &buffer) {
+ err = maperr2error(maperr);
+ if (err == C2_OK) {
+ mBuffer = static_cast<buffer_handle_t>(buffer);
+ }
+ });
+ if (err != C2_OK) {
+ ALOGD("importBuffer failed: %d", err);
+ return err;
+ }
+ if (mBuffer == nullptr) {
+ ALOGD("importBuffer returned null buffer");
+ return C2_CORRUPTED;
+ }
+ uint32_t generation = 0;
+ uint64_t igbp_id = 0;
+ uint32_t igbp_slot = 0;
+ if (mHandle) {
+ mHandle->getIgbpData(&generation, &igbp_id, &igbp_slot);
+ }
+ mLockedHandle = C2HandleGralloc::WrapNativeHandle(
+ mBuffer, mInfo.mapperInfo.width, mInfo.mapperInfo.height,
+ (uint32_t)mInfo.mapperInfo.format, mInfo.mapperInfo.usage, mInfo.stride,
+ generation, igbp_id, igbp_slot);
+ }
+
+ // UGLY HACK: assume YCbCr 4:2:0 8-bit format (and lockable via lockYCbCr) if we don't
+ // recognize the format
+ PixelFormat format = mInfo.mapperInfo.format;
+ if (format != PixelFormat::RGBA_8888 && format != PixelFormat::RGBX_8888) {
+ format = PixelFormat::YCBCR_420_888;
+ }
+
+ switch (format) {
+ case PixelFormat::YCBCR_420_888:
+ case PixelFormat::YV12: {
+ YCbCrLayout ycbcrLayout;
+ mMapper->lockYCbCr(
+ const_cast<native_handle_t *>(mBuffer), grallocUsage,
+ { (int32_t)rect.left, (int32_t)rect.top, (int32_t)rect.width, (int32_t)rect.height },
+ // TODO: fence
+ hidl_handle(),
+ [&err, &ycbcrLayout](const auto &maperr, const auto &mapLayout) {
+ err = maperr2error(maperr);
+ if (err == C2_OK) {
+ ycbcrLayout = mapLayout;
+ }
+ });
+ if (err != C2_OK) {
+ ALOGD("lockYCbCr failed: %d", err);
+ return err;
+ }
+ addr[C2PlanarLayout::PLANE_Y] = (uint8_t *)ycbcrLayout.y;
+ addr[C2PlanarLayout::PLANE_U] = (uint8_t *)ycbcrLayout.cb;
+ addr[C2PlanarLayout::PLANE_V] = (uint8_t *)ycbcrLayout.cr;
+ layout->type = C2PlanarLayout::TYPE_YUV;
+ layout->numPlanes = 3;
+ layout->rootPlanes = 3;
+ layout->planes[C2PlanarLayout::PLANE_Y] = {
+ C2PlaneInfo::CHANNEL_Y, // channel
+ 1, // colInc
+ (int32_t)ycbcrLayout.yStride, // rowInc
+ 1, // mColSampling
+ 1, // mRowSampling
+ 8, // allocatedDepth
+ 8, // bitDepth
+ 0, // rightShift
+ C2PlaneInfo::NATIVE, // endianness
+ C2PlanarLayout::PLANE_Y, // rootIx
+ 0, // offset
+ };
+ layout->planes[C2PlanarLayout::PLANE_U] = {
+ C2PlaneInfo::CHANNEL_CB, // channel
+ (int32_t)ycbcrLayout.chromaStep, // colInc
+ (int32_t)ycbcrLayout.cStride, // rowInc
+ 2, // mColSampling
+ 2, // mRowSampling
+ 8, // allocatedDepth
+ 8, // bitDepth
+ 0, // rightShift
+ C2PlaneInfo::NATIVE, // endianness
+ C2PlanarLayout::PLANE_U, // rootIx
+ 0, // offset
+ };
+ layout->planes[C2PlanarLayout::PLANE_V] = {
+ C2PlaneInfo::CHANNEL_CR, // channel
+ (int32_t)ycbcrLayout.chromaStep, // colInc
+ (int32_t)ycbcrLayout.cStride, // rowInc
+ 2, // mColSampling
+ 2, // mRowSampling
+ 8, // allocatedDepth
+ 8, // bitDepth
+ 0, // rightShift
+ C2PlaneInfo::NATIVE, // endianness
+ C2PlanarLayout::PLANE_V, // rootIx
+ 0, // offset
+ };
+ // handle interleaved formats
+ intptr_t uvOffset = addr[C2PlanarLayout::PLANE_V] - addr[C2PlanarLayout::PLANE_U];
+ if (uvOffset > 0 && uvOffset < (intptr_t)ycbcrLayout.chromaStep) {
+ layout->rootPlanes = 2;
+ layout->planes[C2PlanarLayout::PLANE_V].rootIx = C2PlanarLayout::PLANE_U;
+ layout->planes[C2PlanarLayout::PLANE_V].offset = uvOffset;
+ } else if (uvOffset < 0 && uvOffset > -(intptr_t)ycbcrLayout.chromaStep) {
+ layout->rootPlanes = 2;
+ layout->planes[C2PlanarLayout::PLANE_U].rootIx = C2PlanarLayout::PLANE_V;
+ layout->planes[C2PlanarLayout::PLANE_U].offset = -uvOffset;
+ }
+ break;
+ }
+
+ case PixelFormat::RGBA_8888:
+ // TODO: alpha channel
+ // fall-through
+ case PixelFormat::RGBX_8888: {
+ void *pointer = nullptr;
+ mMapper->lock(
+ const_cast<native_handle_t *>(mBuffer),
+ grallocUsage,
+ { (int32_t)rect.left, (int32_t)rect.top, (int32_t)rect.width, (int32_t)rect.height },
+ // TODO: fence
+ hidl_handle(),
+ [&err, &pointer](const auto &maperr, const auto &mapPointer) {
+ err = maperr2error(maperr);
+ if (err == C2_OK) {
+ pointer = mapPointer;
+ }
+ });
+ if (err != C2_OK) {
+ ALOGD("lock failed: %d", err);
+ return err;
+ }
+ addr[C2PlanarLayout::PLANE_R] = (uint8_t *)pointer;
+ addr[C2PlanarLayout::PLANE_G] = (uint8_t *)pointer + 1;
+ addr[C2PlanarLayout::PLANE_B] = (uint8_t *)pointer + 2;
+ layout->type = C2PlanarLayout::TYPE_RGB;
+ layout->numPlanes = 3;
+ layout->rootPlanes = 1;
+ layout->planes[C2PlanarLayout::PLANE_R] = {
+ C2PlaneInfo::CHANNEL_R, // channel
+ 4, // colInc
+ 4 * (int32_t)mInfo.stride, // rowInc
+ 1, // mColSampling
+ 1, // mRowSampling
+ 8, // allocatedDepth
+ 8, // bitDepth
+ 0, // rightShift
+ C2PlaneInfo::NATIVE, // endianness
+ C2PlanarLayout::PLANE_R, // rootIx
+ 0, // offset
+ };
+ layout->planes[C2PlanarLayout::PLANE_G] = {
+ C2PlaneInfo::CHANNEL_G, // channel
+ 4, // colInc
+ 4 * (int32_t)mInfo.stride, // rowInc
+ 1, // mColSampling
+ 1, // mRowSampling
+ 8, // allocatedDepth
+ 8, // bitDepth
+ 0, // rightShift
+ C2PlaneInfo::NATIVE, // endianness
+ C2PlanarLayout::PLANE_R, // rootIx
+ 1, // offset
+ };
+ layout->planes[C2PlanarLayout::PLANE_B] = {
+ C2PlaneInfo::CHANNEL_B, // channel
+ 4, // colInc
+ 4 * (int32_t)mInfo.stride, // rowInc
+ 1, // mColSampling
+ 1, // mRowSampling
+ 8, // allocatedDepth
+ 8, // bitDepth
+ 0, // rightShift
+ C2PlaneInfo::NATIVE, // endianness
+ C2PlanarLayout::PLANE_R, // rootIx
+ 2, // offset
+ };
+ break;
+ }
+ default: {
+ ALOGD("unsupported pixel format: %d", mInfo.mapperInfo.format);
+ return C2_OMITTED;
+ }
+ }
+ mLocked = true;
+
+ return C2_OK;
+}
+
+c2_status_t C2AllocationGralloc::unmap(
+ uint8_t **addr, C2Rect rect, C2Fence *fence /* nullable */) {
+ // TODO: check addr and size, use fence
+ (void)addr;
+ (void)rect;
+
+ std::lock_guard<std::mutex> lock(mMappedLock);
+ c2_status_t err = C2_OK;
+ mMapper->unlock(
+ const_cast<native_handle_t *>(mBuffer),
+ [&err, &fence](const auto &maperr, const auto &releaseFence) {
+ // TODO
+ (void) fence;
+ (void) releaseFence;
+ err = maperr2error(maperr);
+ if (err == C2_OK) {
+ // TODO: fence
+ }
+ });
+ if (err == C2_OK) {
+ mLocked = false;
+ }
+ return err;
+}
+
+bool C2AllocationGralloc::equals(const std::shared_ptr<const C2GraphicAllocation> &other) const {
+ return other && other->handle() == handle();
+}
+
+/* ===================================== GRALLOC ALLOCATOR ==================================== */
+class C2AllocatorGralloc::Impl {
+public:
+ Impl(id_t id, bool bufferQueue);
+
+ id_t getId() const {
+ return mTraits->id;
+ }
+
+ C2String getName() const {
+ return mTraits->name;
+ }
+
+ std::shared_ptr<const C2Allocator::Traits> getTraits() const {
+ return mTraits;
+ }
+
+ c2_status_t newGraphicAllocation(
+ uint32_t width, uint32_t height, uint32_t format, const C2MemoryUsage &usage,
+ std::shared_ptr<C2GraphicAllocation> *allocation);
+
+ c2_status_t priorGraphicAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2GraphicAllocation> *allocation);
+
+ c2_status_t status() const { return mInit; }
+
+private:
+ std::shared_ptr<C2Allocator::Traits> mTraits;
+ c2_status_t mInit;
+ sp<IAllocator> mAllocator;
+ sp<IMapper> mMapper;
+ const bool mBufferQueue;
+};
+
+void _UnwrapNativeCodec2GrallocMetadata(
+ const C2Handle *const handle,
+ uint32_t *width, uint32_t *height, uint32_t *format,uint64_t *usage, uint32_t *stride,
+ uint32_t *generation, uint64_t *igbp_id, uint32_t *igbp_slot) {
+ (void)C2HandleGralloc::Import(handle, width, height, format, usage, stride,
+ generation, igbp_id, igbp_slot);
+}
+
+C2AllocatorGralloc::Impl::Impl(id_t id, bool bufferQueue)
+ : mInit(C2_OK), mBufferQueue(bufferQueue) {
+ // TODO: get this from allocator
+ C2MemoryUsage minUsage = { 0, 0 }, maxUsage = { ~(uint64_t)0, ~(uint64_t)0 };
+ Traits traits = { "android.allocator.gralloc", id, C2Allocator::GRAPHIC, minUsage, maxUsage };
+ mTraits = std::make_shared<C2Allocator::Traits>(traits);
+
+ // gralloc allocator is a singleton, so all objects share a global service
+ mAllocator = IAllocator::getService();
+ mMapper = IMapper::getService();
+ if (mAllocator == nullptr || mMapper == nullptr) {
+ mInit = C2_CORRUPTED;
+ }
+}
+
+c2_status_t C2AllocatorGralloc::Impl::newGraphicAllocation(
+ uint32_t width, uint32_t height, uint32_t format, const C2MemoryUsage &usage,
+ std::shared_ptr<C2GraphicAllocation> *allocation) {
+ uint64_t grallocUsage = static_cast<C2AndroidMemoryUsage>(usage).asGrallocUsage();
+ ALOGV("allocating buffer with usage %#llx => %#llx",
+ (long long)usage.expected, (long long)grallocUsage);
+
+ BufferDescriptorInfo info = {
+ {
+ width,
+ height,
+ 1u, // layerCount
+ (PixelFormat)format,
+ grallocUsage,
+ },
+ 0u, // stride placeholder
+ };
+ c2_status_t err = C2_OK;
+ BufferDescriptor desc;
+ mMapper->createDescriptor(
+ info.mapperInfo, [&err, &desc](const auto &maperr, const auto &descriptor) {
+ err = maperr2error(maperr);
+ if (err == C2_OK) {
+ desc = descriptor;
+ }
+ });
+ if (err != C2_OK) {
+ return err;
+ }
+
+ // IAllocator shares IMapper error codes.
+ hidl_handle buffer;
+ mAllocator->allocate(
+ desc,
+ 1u,
+ [&err, &buffer, &info](const auto &maperr, const auto &stride, auto &buffers) {
+ err = maperr2error(maperr);
+ if (err != C2_OK) {
+ return;
+ }
+ if (buffers.size() != 1u) {
+ err = C2_CORRUPTED;
+ return;
+ }
+ info.stride = stride;
+ buffer = std::move(buffers[0]);
+ });
+ if (err != C2_OK) {
+ return err;
+ }
+
+
+ allocation->reset(new C2AllocationGralloc(
+ info, mMapper, buffer,
+ C2HandleGralloc::WrapNativeHandle(
+ buffer.getNativeHandle(),
+ info.mapperInfo.width, info.mapperInfo.height,
+ (uint32_t)info.mapperInfo.format, info.mapperInfo.usage, info.stride,
+ 0, 0, mBufferQueue ? ~0 : 0),
+ mTraits->id));
+ return C2_OK;
+}
+
+c2_status_t C2AllocatorGralloc::Impl::priorGraphicAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2GraphicAllocation> *allocation) {
+ BufferDescriptorInfo info;
+ info.mapperInfo.layerCount = 1u;
+ uint32_t generation;
+ uint64_t igbp_id;
+ uint32_t igbp_slot;
+ const C2HandleGralloc *grallocHandle = C2HandleGralloc::Import(
+ handle,
+ &info.mapperInfo.width, &info.mapperInfo.height,
+ (uint32_t *)&info.mapperInfo.format, (uint64_t *)&info.mapperInfo.usage, &info.stride,
+ &generation, &igbp_id, &igbp_slot);
+ if (grallocHandle == nullptr) {
+ return C2_BAD_VALUE;
+ }
+
+ hidl_handle hidlHandle;
+ hidlHandle.setTo(C2HandleGralloc::UnwrapNativeHandle(grallocHandle), true);
+
+ allocation->reset(new C2AllocationGralloc(info, mMapper, hidlHandle, grallocHandle, mTraits->id));
+ return C2_OK;
+}
+
+C2AllocatorGralloc::C2AllocatorGralloc(id_t id, bool bufferQueue)
+ : mImpl(new Impl(id, bufferQueue)) {}
+
+C2AllocatorGralloc::~C2AllocatorGralloc() { delete mImpl; }
+
+C2Allocator::id_t C2AllocatorGralloc::getId() const {
+ return mImpl->getId();
+}
+
+C2String C2AllocatorGralloc::getName() const {
+ return mImpl->getName();
+}
+
+std::shared_ptr<const C2Allocator::Traits> C2AllocatorGralloc::getTraits() const {
+ return mImpl->getTraits();
+}
+
+c2_status_t C2AllocatorGralloc::newGraphicAllocation(
+ uint32_t width, uint32_t height, uint32_t format, C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicAllocation> *allocation) {
+ return mImpl->newGraphicAllocation(width, height, format, usage, allocation);
+}
+
+c2_status_t C2AllocatorGralloc::priorGraphicAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2GraphicAllocation> *allocation) {
+ return mImpl->priorGraphicAllocation(handle, allocation);
+}
+
+c2_status_t C2AllocatorGralloc::status() const {
+ return mImpl->status();
+}
+
+bool C2AllocatorGralloc::isValid(const C2Handle* const o) {
+ return C2HandleGralloc::isValid(o);
+}
+
+} // namespace android
diff --git a/media/codec2/vndk/C2AllocatorIon.cpp b/media/codec2/vndk/C2AllocatorIon.cpp
new file mode 100644
index 0000000..736aac5
--- /dev/null
+++ b/media/codec2/vndk/C2AllocatorIon.cpp
@@ -0,0 +1,561 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2AllocatorIon"
+#include <utils/Log.h>
+
+#include <list>
+
+#include <ion/ion.h>
+#include <sys/mman.h>
+#include <unistd.h> // getpagesize, size_t, close, dup
+
+#include <C2AllocatorIon.h>
+#include <C2Buffer.h>
+#include <C2Debug.h>
+#include <C2ErrnoUtils.h>
+
+namespace android {
+
+namespace {
+ constexpr size_t USAGE_LRU_CACHE_SIZE = 1024;
+}
+
+/* size_t <=> int(lo), int(hi) conversions */
+constexpr inline int size2intLo(size_t s) {
+ return int(s & 0xFFFFFFFF);
+}
+
+constexpr inline int size2intHi(size_t s) {
+ // cast to uint64_t as size_t may be 32 bits wide
+ return int((uint64_t(s) >> 32) & 0xFFFFFFFF);
+}
+
+constexpr inline size_t ints2size(int intLo, int intHi) {
+ // convert in 2 stages to 64 bits as intHi may be negative
+ return size_t(unsigned(intLo)) | size_t(uint64_t(unsigned(intHi)) << 32);
+}
+
+/* ========================================= ION HANDLE ======================================== */
+/**
+ * ION handle
+ *
+ * There can be only a sole ion client per process, this is captured in the ion fd that is passed
+ * to the constructor, but this should be managed by the ion buffer allocator/mapper.
+ *
+ * ion uses ion_user_handle_t for buffers. We don't store this in the native handle as
+ * it requires an ion_free to decref. Instead, we share the buffer to get an fd that also holds
+ * a refcount.
+ *
+ * This handle will not capture mapped fd-s as updating that would require a global mutex.
+ */
+
+struct C2HandleIon : public C2Handle {
+ // ion handle owns ionFd(!) and bufferFd
+ C2HandleIon(int bufferFd, size_t size)
+ : C2Handle(cHeader),
+ mFds{ bufferFd },
+ mInts{ int(size & 0xFFFFFFFF), int((uint64_t(size) >> 32) & 0xFFFFFFFF), kMagic } { }
+
+ static bool isValid(const C2Handle * const o);
+
+ int bufferFd() const { return mFds.mBuffer; }
+ size_t size() const {
+ return size_t(unsigned(mInts.mSizeLo))
+ | size_t(uint64_t(unsigned(mInts.mSizeHi)) << 32);
+ }
+
+protected:
+ struct {
+ int mBuffer; // shared ion buffer
+ } mFds;
+ struct {
+ int mSizeLo; // low 32-bits of size
+ int mSizeHi; // high 32-bits of size
+ int mMagic;
+ } mInts;
+
+private:
+ typedef C2HandleIon _type;
+ enum {
+ kMagic = '\xc2io\x00',
+ numFds = sizeof(mFds) / sizeof(int),
+ numInts = sizeof(mInts) / sizeof(int),
+ version = sizeof(C2Handle)
+ };
+ //constexpr static C2Handle cHeader = { version, numFds, numInts, {} };
+ const static C2Handle cHeader;
+};
+
+const C2Handle C2HandleIon::cHeader = {
+ C2HandleIon::version,
+ C2HandleIon::numFds,
+ C2HandleIon::numInts,
+ {}
+};
+
+// static
+bool C2HandleIon::isValid(const C2Handle * const o) {
+ if (!o || memcmp(o, &cHeader, sizeof(cHeader))) {
+ return false;
+ }
+ const C2HandleIon *other = static_cast<const C2HandleIon*>(o);
+ return other->mInts.mMagic == kMagic;
+}
+
+// TODO: is the dup of an ion fd identical to ion_share?
+
+/* ======================================= ION ALLOCATION ====================================== */
+class C2AllocationIon : public C2LinearAllocation {
+public:
+ /* Interface methods */
+ virtual c2_status_t map(
+ size_t offset, size_t size, C2MemoryUsage usage, C2Fence *fence,
+ void **addr /* nonnull */) override;
+ virtual c2_status_t unmap(void *addr, size_t size, C2Fence *fenceFd) override;
+ virtual ~C2AllocationIon() override;
+ virtual const C2Handle *handle() const override;
+ virtual id_t getAllocatorId() const override;
+ virtual bool equals(const std::shared_ptr<C2LinearAllocation> &other) const override;
+
+ // internal methods
+ C2AllocationIon(int ionFd, size_t size, size_t align, unsigned heapMask, unsigned flags, C2Allocator::id_t id);
+ C2AllocationIon(int ionFd, size_t size, int shareFd, C2Allocator::id_t id);
+
+ c2_status_t status() const;
+
+protected:
+ class Impl;
+ Impl *mImpl;
+
+ // TODO: we could make this encapsulate shared_ptr and copiable
+ C2_DO_NOT_COPY(C2AllocationIon);
+};
+
+class C2AllocationIon::Impl {
+private:
+ /**
+ * Constructs an ion allocation.
+ *
+ * \note We always create an ion allocation, even if the allocation or import fails
+ * so that we can capture the error.
+ *
+ * \param ionFd ion client (ownership transferred to created object)
+ * \param capacity size of allocation
+ * \param bufferFd buffer handle (ownership transferred to created object). Must be
+ * invalid if err is not 0.
+ * \param buffer ion buffer user handle (ownership transferred to created object). Must be
+ * invalid if err is not 0.
+ * \param err errno during buffer allocation or import
+ */
+ Impl(int ionFd, size_t capacity, int bufferFd, ion_user_handle_t buffer, C2Allocator::id_t id, int err)
+ : mIonFd(ionFd),
+ mHandle(bufferFd, capacity),
+ mBuffer(buffer),
+ mId(id),
+ mInit(c2_map_errno<ENOMEM, EACCES, EINVAL>(err)),
+ mMapFd(-1) {
+ if (mInit != C2_OK) {
+ // close ionFd now on error
+ if (mIonFd >= 0) {
+ close(mIonFd);
+ mIonFd = -1;
+ }
+ // C2_CHECK(bufferFd < 0);
+ // C2_CHECK(buffer < 0);
+ }
+ }
+
+public:
+ /**
+ * Constructs an ion allocation by importing a shared buffer fd.
+ *
+ * \param ionFd ion client (ownership transferred to created object)
+ * \param capacity size of allocation
+ * \param bufferFd buffer handle (ownership transferred to created object)
+ *
+ * \return created ion allocation (implementation) which may be invalid if the
+ * import failed.
+ */
+ static Impl *Import(int ionFd, size_t capacity, int bufferFd, C2Allocator::id_t id) {
+ ion_user_handle_t buffer = -1;
+ int ret = ion_import(ionFd, bufferFd, &buffer);
+ return new Impl(ionFd, capacity, bufferFd, buffer, id, ret);
+ }
+
+ /**
+ * Constructs an ion allocation by allocating an ion buffer.
+ *
+ * \param ionFd ion client (ownership transferred to created object)
+ * \param size size of allocation
+ * \param align desired alignment of allocation
+ * \param heapMask mask of heaps considered
+ * \param flags ion allocation flags
+ *
+ * \return created ion allocation (implementation) which may be invalid if the
+ * allocation failed.
+ */
+ static Impl *Alloc(int ionFd, size_t size, size_t align, unsigned heapMask, unsigned flags, C2Allocator::id_t id) {
+ int bufferFd = -1;
+ ion_user_handle_t buffer = -1;
+ size_t alignedSize = align == 0 ? size : (size + align - 1) & ~(align - 1);
+ int ret = ion_alloc(ionFd, alignedSize, align, heapMask, flags, &buffer);
+ ALOGV("ion_alloc(ionFd = %d, size = %zu, align = %zu, prot = %d, flags = %d) "
+ "returned (%d) ; buffer = %d",
+ ionFd, alignedSize, align, heapMask, flags, ret, buffer);
+ if (ret == 0) {
+ // get buffer fd for native handle constructor
+ ret = ion_share(ionFd, buffer, &bufferFd);
+ if (ret != 0) {
+ ion_free(ionFd, buffer);
+ buffer = -1;
+ }
+ }
+ return new Impl(ionFd, alignedSize, bufferFd, buffer, id, ret);
+ }
+
+ c2_status_t map(size_t offset, size_t size, C2MemoryUsage usage, C2Fence *fence, void **addr) {
+ (void)fence; // TODO: wait for fence
+ *addr = nullptr;
+ if (!mMappings.empty()) {
+ ALOGV("multiple map");
+ // TODO: technically we should return DUPLICATE here, but our block views don't
+ // actually unmap, so we end up remapping an ion buffer multiple times.
+ //
+ // return C2_DUPLICATE;
+ }
+ if (size == 0) {
+ return C2_BAD_VALUE;
+ }
+
+ int prot = PROT_NONE;
+ int flags = MAP_SHARED;
+ if (usage.expected & C2MemoryUsage::CPU_READ) {
+ prot |= PROT_READ;
+ }
+ if (usage.expected & C2MemoryUsage::CPU_WRITE) {
+ prot |= PROT_WRITE;
+ }
+
+ size_t alignmentBytes = offset % PAGE_SIZE;
+ size_t mapOffset = offset - alignmentBytes;
+ size_t mapSize = size + alignmentBytes;
+ Mapping map = { nullptr, alignmentBytes, mapSize };
+
+ c2_status_t err = C2_OK;
+ if (mMapFd == -1) {
+ int ret = ion_map(mIonFd, mBuffer, mapSize, prot,
+ flags, mapOffset, (unsigned char**)&map.addr, &mMapFd);
+ ALOGV("ion_map(ionFd = %d, handle = %d, size = %zu, prot = %d, flags = %d, "
+ "offset = %zu) returned (%d)",
+ mIonFd, mBuffer, mapSize, prot, flags, mapOffset, ret);
+ if (ret) {
+ mMapFd = -1;
+ map.addr = *addr = nullptr;
+ err = c2_map_errno<EINVAL>(-ret);
+ } else {
+ *addr = (uint8_t *)map.addr + alignmentBytes;
+ }
+ } else {
+ map.addr = mmap(nullptr, mapSize, prot, flags, mMapFd, mapOffset);
+ ALOGV("mmap(size = %zu, prot = %d, flags = %d, mapFd = %d, offset = %zu) "
+ "returned (%d)",
+ mapSize, prot, flags, mMapFd, mapOffset, errno);
+ if (map.addr == MAP_FAILED) {
+ map.addr = *addr = nullptr;
+ err = c2_map_errno<EINVAL>(errno);
+ } else {
+ *addr = (uint8_t *)map.addr + alignmentBytes;
+ }
+ }
+ if (map.addr) {
+ mMappings.push_back(map);
+ }
+ return err;
+ }
+
+ c2_status_t unmap(void *addr, size_t size, C2Fence *fence) {
+ if (mMapFd < 0 || mMappings.empty()) {
+ ALOGD("tried to unmap unmapped buffer");
+ return C2_NOT_FOUND;
+ }
+ for (auto it = mMappings.begin(); it != mMappings.end(); ++it) {
+ if (addr != (uint8_t *)it->addr + it->alignmentBytes ||
+ size + it->alignmentBytes != it->size) {
+ continue;
+ }
+ int err = munmap(it->addr, it->size);
+ if (err != 0) {
+ ALOGD("munmap failed");
+ return c2_map_errno<EINVAL>(errno);
+ }
+ if (fence) {
+ *fence = C2Fence(); // not using fences
+ }
+ (void)mMappings.erase(it);
+ ALOGV("successfully unmapped: %d", mBuffer);
+ return C2_OK;
+ }
+ ALOGD("unmap failed to find specified map");
+ return C2_BAD_VALUE;
+ }
+
+ ~Impl() {
+ if (!mMappings.empty()) {
+ ALOGD("Dangling mappings!");
+ for (const Mapping &map : mMappings) {
+ (void)munmap(map.addr, map.size);
+ }
+ }
+ if (mMapFd >= 0) {
+ close(mMapFd);
+ mMapFd = -1;
+ }
+ if (mInit == C2_OK) {
+ (void)ion_free(mIonFd, mBuffer);
+ native_handle_close(&mHandle);
+ }
+ if (mIonFd >= 0) {
+ close(mIonFd);
+ }
+ }
+
+ c2_status_t status() const {
+ return mInit;
+ }
+
+ const C2Handle *handle() const {
+ return &mHandle;
+ }
+
+ C2Allocator::id_t getAllocatorId() const {
+ return mId;
+ }
+
+ ion_user_handle_t ionHandle() const {
+ return mBuffer;
+ }
+
+private:
+ int mIonFd;
+ C2HandleIon mHandle;
+ ion_user_handle_t mBuffer;
+ C2Allocator::id_t mId;
+ c2_status_t mInit;
+ int mMapFd; // only one for now
+ struct Mapping {
+ void *addr;
+ size_t alignmentBytes;
+ size_t size;
+ };
+ std::list<Mapping> mMappings;
+};
+
+c2_status_t C2AllocationIon::map(
+ size_t offset, size_t size, C2MemoryUsage usage, C2Fence *fence, void **addr) {
+ return mImpl->map(offset, size, usage, fence, addr);
+}
+
+c2_status_t C2AllocationIon::unmap(void *addr, size_t size, C2Fence *fence) {
+ return mImpl->unmap(addr, size, fence);
+}
+
+c2_status_t C2AllocationIon::status() const {
+ return mImpl->status();
+}
+
+C2Allocator::id_t C2AllocationIon::getAllocatorId() const {
+ return mImpl->getAllocatorId();
+}
+
+bool C2AllocationIon::equals(const std::shared_ptr<C2LinearAllocation> &other) const {
+ if (!other || other->getAllocatorId() != getAllocatorId()) {
+ return false;
+ }
+ // get user handle to compare objects
+ std::shared_ptr<C2AllocationIon> otherAsIon = std::static_pointer_cast<C2AllocationIon>(other);
+ return mImpl->ionHandle() == otherAsIon->mImpl->ionHandle();
+}
+
+const C2Handle *C2AllocationIon::handle() const {
+ return mImpl->handle();
+}
+
+C2AllocationIon::~C2AllocationIon() {
+ delete mImpl;
+}
+
+C2AllocationIon::C2AllocationIon(int ionFd, size_t size, size_t align,
+ unsigned heapMask, unsigned flags, C2Allocator::id_t id)
+ : C2LinearAllocation(size),
+ mImpl(Impl::Alloc(ionFd, size, align, heapMask, flags, id)) { }
+
+C2AllocationIon::C2AllocationIon(int ionFd, size_t size, int shareFd, C2Allocator::id_t id)
+ : C2LinearAllocation(size),
+ mImpl(Impl::Import(ionFd, size, shareFd, id)) { }
+
+/* ======================================= ION ALLOCATOR ====================================== */
+C2AllocatorIon::C2AllocatorIon(id_t id)
+ : mInit(C2_OK),
+ mIonFd(ion_open()) {
+ if (mIonFd < 0) {
+ switch (errno) {
+ case ENOENT: mInit = C2_OMITTED; break;
+ default: mInit = c2_map_errno<EACCES>(errno); break;
+ }
+ } else {
+ C2MemoryUsage minUsage = { 0, 0 };
+ C2MemoryUsage maxUsage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
+ Traits traits = { "android.allocator.ion", id, LINEAR, minUsage, maxUsage };
+ mTraits = std::make_shared<Traits>(traits);
+ mBlockSize = ::getpagesize();
+ }
+}
+
+C2AllocatorIon::~C2AllocatorIon() {
+ if (mInit == C2_OK) {
+ ion_close(mIonFd);
+ }
+}
+
+C2Allocator::id_t C2AllocatorIon::getId() const {
+ std::lock_guard<std::mutex> lock(mUsageMapperLock);
+ return mTraits->id;
+}
+
+C2String C2AllocatorIon::getName() const {
+ std::lock_guard<std::mutex> lock(mUsageMapperLock);
+ return mTraits->name;
+}
+
+std::shared_ptr<const C2Allocator::Traits> C2AllocatorIon::getTraits() const {
+ std::lock_guard<std::mutex> lock(mUsageMapperLock);
+ return mTraits;
+}
+
+void C2AllocatorIon::setUsageMapper(
+ const UsageMapperFn &mapper, uint64_t minUsage, uint64_t maxUsage, uint64_t blockSize) {
+ std::lock_guard<std::mutex> lock(mUsageMapperLock);
+ mUsageMapperCache.clear();
+ mUsageMapperLru.clear();
+ mUsageMapper = mapper;
+ Traits traits = {
+ mTraits->name, mTraits->id, LINEAR,
+ C2MemoryUsage(minUsage), C2MemoryUsage(maxUsage)
+ };
+ mTraits = std::make_shared<Traits>(traits);
+ mBlockSize = blockSize;
+}
+
+std::size_t C2AllocatorIon::MapperKeyHash::operator()(const MapperKey &k) const {
+ return std::hash<uint64_t>{}(k.first) ^ std::hash<size_t>{}(k.second);
+}
+
+c2_status_t C2AllocatorIon::mapUsage(
+ C2MemoryUsage usage, size_t capacity, size_t *align, unsigned *heapMask, unsigned *flags) {
+ std::lock_guard<std::mutex> lock(mUsageMapperLock);
+ c2_status_t res = C2_OK;
+ // align capacity
+ capacity = (capacity + mBlockSize - 1) & ~(mBlockSize - 1);
+ MapperKey key = std::make_pair(usage.expected, capacity);
+ auto entry = mUsageMapperCache.find(key);
+ if (entry == mUsageMapperCache.end()) {
+ if (mUsageMapper) {
+ res = mUsageMapper(usage, capacity, align, heapMask, flags);
+ } else {
+ *align = 0; // TODO make this 1
+ *heapMask = ~0; // default mask
+ *flags = 0; // default flags
+ res = C2_NO_INIT;
+ }
+ // add usage to cache
+ MapperValue value = std::make_tuple(*align, *heapMask, *flags, res);
+ mUsageMapperLru.emplace_front(key, value);
+ mUsageMapperCache.emplace(std::make_pair(key, mUsageMapperLru.begin()));
+ if (mUsageMapperCache.size() > USAGE_LRU_CACHE_SIZE) {
+ // remove LRU entry
+ MapperKey lruKey = mUsageMapperLru.front().first;
+ mUsageMapperCache.erase(lruKey);
+ mUsageMapperLru.pop_back();
+ }
+ } else {
+ // move entry to MRU
+ mUsageMapperLru.splice(mUsageMapperLru.begin(), mUsageMapperLru, entry->second);
+ const MapperValue &value = entry->second->second;
+ std::tie(*align, *heapMask, *flags, res) = value;
+ }
+ return res;
+}
+
+c2_status_t C2AllocatorIon::newLinearAllocation(
+ uint32_t capacity, C2MemoryUsage usage, std::shared_ptr<C2LinearAllocation> *allocation) {
+ if (allocation == nullptr) {
+ return C2_BAD_VALUE;
+ }
+
+ allocation->reset();
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+
+ size_t align = 0;
+ unsigned heapMask = ~0;
+ unsigned flags = 0;
+ c2_status_t ret = mapUsage(usage, capacity, &align, &heapMask, &flags);
+ if (ret && ret != C2_NO_INIT) {
+ return ret;
+ }
+
+ std::shared_ptr<C2AllocationIon> alloc
+ = std::make_shared<C2AllocationIon>(dup(mIonFd), capacity, align, heapMask, flags, mTraits->id);
+ ret = alloc->status();
+ if (ret == C2_OK) {
+ *allocation = alloc;
+ }
+ return ret;
+}
+
+c2_status_t C2AllocatorIon::priorLinearAllocation(
+ const C2Handle *handle, std::shared_ptr<C2LinearAllocation> *allocation) {
+ *allocation = nullptr;
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+
+ if (!C2HandleIon::isValid(handle)) {
+ return C2_BAD_VALUE;
+ }
+
+ // TODO: get capacity and validate it
+ const C2HandleIon *h = static_cast<const C2HandleIon*>(handle);
+ std::shared_ptr<C2AllocationIon> alloc
+ = std::make_shared<C2AllocationIon>(dup(mIonFd), h->size(), h->bufferFd(), mTraits->id);
+ c2_status_t ret = alloc->status();
+ if (ret == C2_OK) {
+ *allocation = alloc;
+ native_handle_delete(const_cast<native_handle_t*>(
+ reinterpret_cast<const native_handle_t*>(handle)));
+ }
+ return ret;
+}
+
+bool C2AllocatorIon::isValid(const C2Handle* const o) {
+ return C2HandleIon::isValid(o);
+}
+
+} // namespace android
+
diff --git a/media/codec2/vndk/C2Buffer.cpp b/media/codec2/vndk/C2Buffer.cpp
new file mode 100644
index 0000000..47366ca
--- /dev/null
+++ b/media/codec2/vndk/C2Buffer.cpp
@@ -0,0 +1,1304 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2Buffer"
+#include <utils/Log.h>
+
+#include <list>
+#include <map>
+#include <mutex>
+
+#include <C2AllocatorIon.h>
+#include <C2AllocatorGralloc.h>
+#include <C2BufferPriv.h>
+#include <C2BlockInternal.h>
+#include <bufferpool/ClientManager.h>
+
+namespace {
+
+using android::C2AllocatorGralloc;
+using android::C2AllocatorIon;
+using android::hardware::media::bufferpool::BufferPoolData;
+using android::hardware::media::bufferpool::V1_0::ResultStatus;
+using android::hardware::media::bufferpool::V1_0::implementation::BufferPoolAllocation;
+using android::hardware::media::bufferpool::V1_0::implementation::BufferPoolAllocator;
+using android::hardware::media::bufferpool::V1_0::implementation::ClientManager;
+using android::hardware::media::bufferpool::V1_0::implementation::ConnectionId;
+using android::hardware::media::bufferpool::V1_0::implementation::INVALID_CONNECTIONID;
+
+// This anonymous namespace contains the helper classes that allow our implementation to create
+// block/buffer objects.
+//
+// Inherit from the parent, share with the friend.
+class ReadViewBuddy : public C2ReadView {
+ using C2ReadView::C2ReadView;
+ friend class ::C2ConstLinearBlock;
+};
+
+class WriteViewBuddy : public C2WriteView {
+ using C2WriteView::C2WriteView;
+ friend class ::C2LinearBlock;
+};
+
+class ConstLinearBlockBuddy : public C2ConstLinearBlock {
+ using C2ConstLinearBlock::C2ConstLinearBlock;
+ friend class ::C2LinearBlock;
+};
+
+class LinearBlockBuddy : public C2LinearBlock {
+ using C2LinearBlock::C2LinearBlock;
+ friend class ::C2BasicLinearBlockPool;
+};
+
+class AcquirableReadViewBuddy : public C2Acquirable<C2ReadView> {
+ using C2Acquirable::C2Acquirable;
+ friend class ::C2ConstLinearBlock;
+};
+
+class AcquirableWriteViewBuddy : public C2Acquirable<C2WriteView> {
+ using C2Acquirable::C2Acquirable;
+ friend class ::C2LinearBlock;
+};
+
+class GraphicViewBuddy : public C2GraphicView {
+ using C2GraphicView::C2GraphicView;
+ friend class ::C2ConstGraphicBlock;
+ friend class ::C2GraphicBlock;
+};
+
+class AcquirableConstGraphicViewBuddy : public C2Acquirable<const C2GraphicView> {
+ using C2Acquirable::C2Acquirable;
+ friend class ::C2ConstGraphicBlock;
+};
+
+class AcquirableGraphicViewBuddy : public C2Acquirable<C2GraphicView> {
+ using C2Acquirable::C2Acquirable;
+ friend class ::C2GraphicBlock;
+};
+
+class ConstGraphicBlockBuddy : public C2ConstGraphicBlock {
+ using C2ConstGraphicBlock::C2ConstGraphicBlock;
+ friend class ::C2GraphicBlock;
+};
+
+class GraphicBlockBuddy : public C2GraphicBlock {
+ using C2GraphicBlock::C2GraphicBlock;
+ friend class ::C2BasicGraphicBlockPool;
+};
+
+class BufferDataBuddy : public C2BufferData {
+ using C2BufferData::C2BufferData;
+ friend class ::C2Buffer;
+};
+
+} // namespace
+
+/* ========================================== 1D BLOCK ========================================= */
+
+/**
+ * This class is the base class for all 1D block and view implementations.
+ *
+ * This is basically just a placeholder for the underlying 1D allocation and the range of the
+ * alloted portion to this block. There is also a placeholder for a blockpool data.
+ */
+class C2_HIDE _C2Block1DImpl : public _C2LinearRangeAspect {
+public:
+ _C2Block1DImpl(const std::shared_ptr<C2LinearAllocation> &alloc,
+ const std::shared_ptr<_C2BlockPoolData> &poolData = nullptr,
+ size_t offset = 0, size_t size = ~(size_t)0)
+ : _C2LinearRangeAspect(alloc.get(), offset, size),
+ mAllocation(alloc),
+ mPoolData(poolData) { }
+
+ _C2Block1DImpl(const _C2Block1DImpl &other, size_t offset = 0, size_t size = ~(size_t)0)
+ : _C2LinearRangeAspect(&other, offset, size),
+ mAllocation(other.mAllocation),
+ mPoolData(other.mPoolData) { }
+
+ /** returns pool data */
+ std::shared_ptr<_C2BlockPoolData> poolData() const {
+ return mPoolData;
+ }
+
+ /** returns native handle */
+ const C2Handle *handle() const {
+ return mAllocation ? mAllocation->handle() : nullptr;
+ }
+
+ /** returns the allocator's ID */
+ C2Allocator::id_t getAllocatorId() const {
+ // BAD_ID can only happen if this Impl class is initialized for a view - never for a block.
+ return mAllocation ? mAllocation->getAllocatorId() : C2Allocator::BAD_ID;
+ }
+
+ std::shared_ptr<C2LinearAllocation> getAllocation() const {
+ return mAllocation;
+ }
+
+private:
+ std::shared_ptr<C2LinearAllocation> mAllocation;
+ std::shared_ptr<_C2BlockPoolData> mPoolData;
+};
+
+/**
+ * This class contains the mapped data pointer, and the potential error.
+ *
+ * range is the mapped range of the underlying allocation (which is part of the allotted
+ * range).
+ */
+class C2_HIDE _C2MappedBlock1DImpl : public _C2Block1DImpl {
+public:
+ _C2MappedBlock1DImpl(const _C2Block1DImpl &block, uint8_t *data,
+ size_t offset = 0, size_t size = ~(size_t)0)
+ : _C2Block1DImpl(block, offset, size), mData(data), mError(C2_OK) { }
+
+ _C2MappedBlock1DImpl(c2_status_t error)
+ : _C2Block1DImpl(nullptr), mData(nullptr), mError(error) {
+ // CHECK(error != C2_OK);
+ }
+
+ const uint8_t *data() const {
+ return mData;
+ }
+
+ uint8_t *data() {
+ return mData;
+ }
+
+ c2_status_t error() const {
+ return mError;
+ }
+
+private:
+ uint8_t *mData;
+ c2_status_t mError;
+};
+
+/**
+ * Block implementation.
+ */
+class C2Block1D::Impl : public _C2Block1DImpl {
+ using _C2Block1DImpl::_C2Block1DImpl;
+};
+
+const C2Handle *C2Block1D::handle() const {
+ return mImpl->handle();
+};
+
+C2Allocator::id_t C2Block1D::getAllocatorId() const {
+ return mImpl->getAllocatorId();
+};
+
+C2Block1D::C2Block1D(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range)
+ // always clamp subrange to parent (impl) range for safety
+ : _C2LinearRangeAspect(impl.get(), range.offset(), range.size()), mImpl(impl) {
+}
+
+/**
+ * Read view implementation.
+ *
+ * range of Impl is the mapped range of the underlying allocation (which is part of the allotted
+ * range). range of View is 0 to capacity() (not represented as an actual range). This maps to a
+ * subrange of Impl range starting at mImpl->offset() + _mOffset.
+ */
+class C2ReadView::Impl : public _C2MappedBlock1DImpl {
+ using _C2MappedBlock1DImpl::_C2MappedBlock1DImpl;
+};
+
+C2ReadView::C2ReadView(std::shared_ptr<Impl> impl, uint32_t offset, uint32_t size)
+ : _C2LinearCapacityAspect(C2LinearCapacity(impl->size()).range(offset, size).size()),
+ mImpl(impl),
+ mOffset(C2LinearCapacity(impl->size()).range(offset, size).offset()) { }
+
+C2ReadView::C2ReadView(c2_status_t error)
+ : _C2LinearCapacityAspect(0u), mImpl(std::make_shared<Impl>(error)), mOffset(0u) {
+ // CHECK(error != C2_OK);
+}
+
+const uint8_t *C2ReadView::data() const {
+ return mImpl->error() ? nullptr : mImpl->data() + mOffset;
+}
+
+c2_status_t C2ReadView::error() const {
+ return mImpl->error();
+}
+
+C2ReadView C2ReadView::subView(size_t offset, size_t size) const {
+ C2LinearRange subRange(*this, offset, size);
+ return C2ReadView(mImpl, mOffset + subRange.offset(), subRange.size());
+}
+
+/**
+ * Write view implementation.
+ */
+class C2WriteView::Impl : public _C2MappedBlock1DImpl {
+ using _C2MappedBlock1DImpl::_C2MappedBlock1DImpl;
+};
+
+C2WriteView::C2WriteView(std::shared_ptr<Impl> impl)
+// UGLY: _C2LinearRangeAspect requires a bona-fide object for capacity to prevent spoofing, so
+// this is what we have to do.
+// TODO: use childRange
+ : _C2EditableLinearRangeAspect(std::make_unique<C2LinearCapacity>(impl->size()).get()), mImpl(impl) { }
+
+C2WriteView::C2WriteView(c2_status_t error)
+ : _C2EditableLinearRangeAspect(nullptr), mImpl(std::make_shared<Impl>(error)) {}
+
+uint8_t *C2WriteView::base() { return mImpl->data(); }
+
+uint8_t *C2WriteView::data() { return mImpl->data() + offset(); }
+
+c2_status_t C2WriteView::error() const { return mImpl->error(); }
+
+/**
+ * Const linear block implementation.
+ */
+C2ConstLinearBlock::C2ConstLinearBlock(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range, C2Fence fence)
+ : C2Block1D(impl, range), mFence(fence) { }
+
+C2Acquirable<C2ReadView> C2ConstLinearBlock::map() const {
+ void *base = nullptr;
+ uint32_t len = size();
+ c2_status_t error = mImpl->getAllocation()->map(
+ offset(), len, { C2MemoryUsage::CPU_READ, 0 }, nullptr, &base);
+ // TODO: wait on fence
+ if (error == C2_OK) {
+ std::shared_ptr<ReadViewBuddy::Impl> rvi = std::shared_ptr<ReadViewBuddy::Impl>(
+ new ReadViewBuddy::Impl(*mImpl, (uint8_t *)base, offset(), len),
+ [base, len](ReadViewBuddy::Impl *i) {
+ (void)i->getAllocation()->unmap(base, len, nullptr);
+ delete i;
+ });
+ return AcquirableReadViewBuddy(error, C2Fence(), ReadViewBuddy(rvi, 0, len));
+ } else {
+ return AcquirableReadViewBuddy(error, C2Fence(), ReadViewBuddy(error));
+ }
+}
+
+C2ConstLinearBlock C2ConstLinearBlock::subBlock(size_t offset_, size_t size_) const {
+ C2LinearRange subRange(*mImpl, offset_, size_);
+ return C2ConstLinearBlock(mImpl, subRange, mFence);
+}
+
+/**
+ * Linear block implementation.
+ */
+C2LinearBlock::C2LinearBlock(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range)
+ : C2Block1D(impl, range) { }
+
+C2Acquirable<C2WriteView> C2LinearBlock::map() {
+ void *base = nullptr;
+ uint32_t len = size();
+ c2_status_t error = mImpl->getAllocation()->map(
+ offset(), len, { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE }, nullptr, &base);
+ // TODO: wait on fence
+ if (error == C2_OK) {
+ std::shared_ptr<WriteViewBuddy::Impl> rvi = std::shared_ptr<WriteViewBuddy::Impl>(
+ new WriteViewBuddy::Impl(*mImpl, (uint8_t *)base, 0, len),
+ [base, len](WriteViewBuddy::Impl *i) {
+ (void)i->getAllocation()->unmap(base, len, nullptr);
+ delete i;
+ });
+ return AcquirableWriteViewBuddy(error, C2Fence(), WriteViewBuddy(rvi));
+ } else {
+ return AcquirableWriteViewBuddy(error, C2Fence(), WriteViewBuddy(error));
+ }
+}
+
+C2ConstLinearBlock C2LinearBlock::share(size_t offset_, size_t size_, C2Fence fence) {
+ return ConstLinearBlockBuddy(mImpl, C2LinearRange(*this, offset_, size_), fence);
+}
+
+C2BasicLinearBlockPool::C2BasicLinearBlockPool(
+ const std::shared_ptr<C2Allocator> &allocator)
+ : mAllocator(allocator) { }
+
+c2_status_t C2BasicLinearBlockPool::fetchLinearBlock(
+ uint32_t capacity,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2LinearBlock> *block /* nonnull */) {
+ block->reset();
+
+ std::shared_ptr<C2LinearAllocation> alloc;
+ c2_status_t err = mAllocator->newLinearAllocation(capacity, usage, &alloc);
+ if (err != C2_OK) {
+ return err;
+ }
+
+ *block = _C2BlockFactory::CreateLinearBlock(alloc);
+
+ return C2_OK;
+}
+
+struct C2_HIDE C2PooledBlockPoolData : _C2BlockPoolData {
+
+ virtual type_t getType() const override {
+ return TYPE_BUFFERPOOL;
+ }
+
+ void getBufferPoolData(std::shared_ptr<BufferPoolData> *data) const {
+ *data = mData;
+ }
+
+ C2PooledBlockPoolData(const std::shared_ptr<BufferPoolData> &data) : mData(data) {}
+
+ virtual ~C2PooledBlockPoolData() override {}
+
+private:
+ std::shared_ptr<BufferPoolData> mData;
+};
+
+bool _C2BlockFactory::GetBufferPoolData(
+ const std::shared_ptr<const _C2BlockPoolData> &data,
+ std::shared_ptr<BufferPoolData> *bufferPoolData) {
+ if (data && data->getType() == _C2BlockPoolData::TYPE_BUFFERPOOL) {
+ const std::shared_ptr<const C2PooledBlockPoolData> poolData =
+ std::static_pointer_cast<const C2PooledBlockPoolData>(data);
+ poolData->getBufferPoolData(bufferPoolData);
+ return true;
+ }
+ return false;
+}
+
+std::shared_ptr<C2LinearBlock> _C2BlockFactory::CreateLinearBlock(
+ const std::shared_ptr<C2LinearAllocation> &alloc,
+ const std::shared_ptr<_C2BlockPoolData> &data, size_t offset, size_t size) {
+ std::shared_ptr<C2Block1D::Impl> impl =
+ std::make_shared<C2Block1D::Impl>(alloc, data, offset, size);
+ return std::shared_ptr<C2LinearBlock>(new C2LinearBlock(impl, *impl));
+}
+
+std::shared_ptr<_C2BlockPoolData> _C2BlockFactory::GetLinearBlockPoolData(
+ const C2Block1D &block) {
+ if (block.mImpl) {
+ return block.mImpl->poolData();
+ }
+ return nullptr;
+}
+
+std::shared_ptr<C2LinearBlock> _C2BlockFactory::CreateLinearBlock(
+ const C2Handle *handle) {
+ // TODO: get proper allocator? and mutex?
+ static std::unique_ptr<C2AllocatorIon> sAllocator = std::make_unique<C2AllocatorIon>(0);
+
+ std::shared_ptr<C2LinearAllocation> alloc;
+ if (C2AllocatorIon::isValid(handle)) {
+ c2_status_t err = sAllocator->priorLinearAllocation(handle, &alloc);
+ if (err == C2_OK) {
+ std::shared_ptr<C2LinearBlock> block = _C2BlockFactory::CreateLinearBlock(alloc);
+ return block;
+ }
+ }
+ return nullptr;
+}
+
+std::shared_ptr<C2LinearBlock> _C2BlockFactory::CreateLinearBlock(
+ const C2Handle *cHandle, const std::shared_ptr<BufferPoolData> &data) {
+ // TODO: get proper allocator? and mutex?
+ static std::unique_ptr<C2AllocatorIon> sAllocator = std::make_unique<C2AllocatorIon>(0);
+
+ std::shared_ptr<C2LinearAllocation> alloc;
+ if (C2AllocatorIon::isValid(cHandle)) {
+ native_handle_t *handle = native_handle_clone(cHandle);
+ if (handle) {
+ c2_status_t err = sAllocator->priorLinearAllocation(handle, &alloc);
+ const std::shared_ptr<C2PooledBlockPoolData> poolData =
+ std::make_shared<C2PooledBlockPoolData>(data);
+ if (err == C2_OK && poolData) {
+ // TODO: config params?
+ std::shared_ptr<C2LinearBlock> block =
+ _C2BlockFactory::CreateLinearBlock(alloc, poolData);
+ return block;
+ }
+ }
+ }
+ return nullptr;
+};
+
+/**
+ * Wrapped C2Allocator which is injected to buffer pool on behalf of
+ * C2BlockPool.
+ */
+class _C2BufferPoolAllocator : public BufferPoolAllocator {
+public:
+ _C2BufferPoolAllocator(const std::shared_ptr<C2Allocator> &allocator)
+ : mAllocator(allocator) {}
+
+ ~_C2BufferPoolAllocator() override {}
+
+ ResultStatus allocate(const std::vector<uint8_t> ¶ms,
+ std::shared_ptr<BufferPoolAllocation> *alloc,
+ size_t *allocSize) override;
+
+ bool compatible(const std::vector<uint8_t> &newParams,
+ const std::vector<uint8_t> &oldParams) override;
+
+ // Methods for codec2 component (C2BlockPool).
+ /**
+ * Transforms linear allocation parameters for C2Allocator to parameters
+ * for buffer pool.
+ *
+ * @param capacity size of linear allocation
+ * @param usage memory usage pattern for linear allocation
+ * @param params allocation parameters for buffer pool
+ */
+ void getLinearParams(uint32_t capacity, C2MemoryUsage usage,
+ std::vector<uint8_t> *params);
+
+ /**
+ * Transforms graphic allocation parameters for C2Allocator to parameters
+ * for buffer pool.
+ *
+ * @param width width of graphic allocation
+ * @param height height of graphic allocation
+ * @param format color format of graphic allocation
+ * @param params allocation parameter for buffer pool
+ */
+ void getGraphicParams(uint32_t width, uint32_t height,
+ uint32_t format, C2MemoryUsage usage,
+ std::vector<uint8_t> *params);
+
+ /**
+ * Transforms an existing native handle to an C2LinearAllcation.
+ * Wrapper to C2Allocator#priorLinearAllocation
+ */
+ c2_status_t priorLinearAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2LinearAllocation> *c2Allocation);
+
+ /**
+ * Transforms an existing native handle to an C2GraphicAllcation.
+ * Wrapper to C2Allocator#priorGraphicAllocation
+ */
+ c2_status_t priorGraphicAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2GraphicAllocation> *c2Allocation);
+
+private:
+ static constexpr int kMaxIntParams = 5; // large enough number;
+
+ enum AllocType : uint8_t {
+ ALLOC_NONE = 0,
+
+ ALLOC_LINEAR,
+ ALLOC_GRAPHIC,
+ };
+
+ union AllocParams {
+ struct {
+ AllocType allocType;
+ C2MemoryUsage usage;
+ uint32_t params[kMaxIntParams];
+ } data;
+ uint8_t array[0];
+
+ AllocParams() : data{ALLOC_NONE, {0, 0}, {0}} {}
+ AllocParams(C2MemoryUsage usage, uint32_t capacity)
+ : data{ALLOC_LINEAR, usage, {[0] = capacity}} {}
+ AllocParams(
+ C2MemoryUsage usage,
+ uint32_t width, uint32_t height, uint32_t format)
+ : data{ALLOC_GRAPHIC, usage, {width, height, format}} {}
+ };
+
+ const std::shared_ptr<C2Allocator> mAllocator;
+};
+
+struct LinearAllocationDtor {
+ LinearAllocationDtor(const std::shared_ptr<C2LinearAllocation> &alloc)
+ : mAllocation(alloc) {}
+
+ void operator()(BufferPoolAllocation *poolAlloc) { delete poolAlloc; }
+
+ const std::shared_ptr<C2LinearAllocation> mAllocation;
+};
+
+struct GraphicAllocationDtor {
+ GraphicAllocationDtor(const std::shared_ptr<C2GraphicAllocation> &alloc)
+ : mAllocation(alloc) {}
+
+ void operator()(BufferPoolAllocation *poolAlloc) { delete poolAlloc; }
+
+ const std::shared_ptr<C2GraphicAllocation> mAllocation;
+};
+
+ResultStatus _C2BufferPoolAllocator::allocate(
+ const std::vector<uint8_t> ¶ms,
+ std::shared_ptr<BufferPoolAllocation> *alloc,
+ size_t *allocSize) {
+ AllocParams c2Params;
+ memcpy(&c2Params, params.data(), std::min(sizeof(AllocParams), params.size()));
+ c2_status_t status = C2_BAD_VALUE;
+ switch(c2Params.data.allocType) {
+ case ALLOC_NONE:
+ break;
+ case ALLOC_LINEAR: {
+ std::shared_ptr<C2LinearAllocation> c2Linear;
+ status = mAllocator->newLinearAllocation(
+ c2Params.data.params[0], c2Params.data.usage, &c2Linear);
+ if (status == C2_OK && c2Linear) {
+ BufferPoolAllocation *ptr = new BufferPoolAllocation(c2Linear->handle());
+ if (ptr) {
+ *alloc = std::shared_ptr<BufferPoolAllocation>(
+ ptr, LinearAllocationDtor(c2Linear));
+ if (*alloc) {
+ *allocSize = (size_t)c2Params.data.params[0];
+ return ResultStatus::OK;
+ }
+ delete ptr;
+ }
+ return ResultStatus::NO_MEMORY;
+ }
+ break;
+ }
+ case ALLOC_GRAPHIC: {
+ std::shared_ptr<C2GraphicAllocation> c2Graphic;
+ status = mAllocator->newGraphicAllocation(
+ c2Params.data.params[0],
+ c2Params.data.params[1],
+ c2Params.data.params[2],
+ c2Params.data.usage, &c2Graphic);
+ if (status == C2_OK && c2Graphic) {
+ BufferPoolAllocation *ptr = new BufferPoolAllocation(c2Graphic->handle());
+ if (ptr) {
+ *alloc = std::shared_ptr<BufferPoolAllocation>(
+ ptr, GraphicAllocationDtor(c2Graphic));
+ if (*alloc) {
+ *allocSize = c2Params.data.params[0] * c2Params.data.params[1];
+ return ResultStatus::OK;
+ }
+ delete ptr;
+ }
+ return ResultStatus::NO_MEMORY;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ return ResultStatus::CRITICAL_ERROR;
+}
+
+bool _C2BufferPoolAllocator::compatible(
+ const std::vector<uint8_t> &newParams,
+ const std::vector<uint8_t> &oldParams) {
+ AllocParams newAlloc;
+ AllocParams oldAlloc;
+ memcpy(&newAlloc, newParams.data(), std::min(sizeof(AllocParams), newParams.size()));
+ memcpy(&oldAlloc, oldParams.data(), std::min(sizeof(AllocParams), oldParams.size()));
+
+ // TODO: support not exact matching. e.g) newCapacity < oldCapacity
+ if (newAlloc.data.allocType == oldAlloc.data.allocType &&
+ newAlloc.data.usage.expected == oldAlloc.data.usage.expected) {
+ for (int i = 0; i < kMaxIntParams; ++i) {
+ if (newAlloc.data.params[i] != oldAlloc.data.params[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+void _C2BufferPoolAllocator::getLinearParams(
+ uint32_t capacity, C2MemoryUsage usage, std::vector<uint8_t> *params) {
+ AllocParams c2Params(usage, capacity);
+ params->assign(c2Params.array, c2Params.array + sizeof(AllocParams));
+}
+
+void _C2BufferPoolAllocator::getGraphicParams(
+ uint32_t width, uint32_t height, uint32_t format, C2MemoryUsage usage,
+ std::vector<uint8_t> *params) {
+ AllocParams c2Params(usage, width, height, format);
+ params->assign(c2Params.array, c2Params.array + sizeof(AllocParams));
+}
+
+c2_status_t _C2BufferPoolAllocator::priorLinearAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2LinearAllocation> *c2Allocation) {
+ return mAllocator->priorLinearAllocation(handle, c2Allocation);
+}
+
+c2_status_t _C2BufferPoolAllocator::priorGraphicAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2GraphicAllocation> *c2Allocation) {
+ return mAllocator->priorGraphicAllocation(handle, c2Allocation);
+}
+
+class C2PooledBlockPool::Impl {
+public:
+ Impl(const std::shared_ptr<C2Allocator> &allocator)
+ : mInit(C2_OK),
+ mBufferPoolManager(ClientManager::getInstance()),
+ mAllocator(std::make_shared<_C2BufferPoolAllocator>(allocator)) {
+ if (mAllocator && mBufferPoolManager) {
+ if (mBufferPoolManager->create(
+ mAllocator, &mConnectionId) == ResultStatus::OK) {
+ return;
+ }
+ }
+ mInit = C2_NO_INIT;
+ }
+
+ ~Impl() {
+ if (mInit == C2_OK) {
+ mBufferPoolManager->close(mConnectionId);
+ }
+ }
+
+ c2_status_t fetchLinearBlock(
+ uint32_t capacity, C2MemoryUsage usage,
+ std::shared_ptr<C2LinearBlock> *block /* nonnull */) {
+ block->reset();
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+ std::vector<uint8_t> params;
+ mAllocator->getLinearParams(capacity, usage, ¶ms);
+ std::shared_ptr<BufferPoolData> bufferPoolData;
+ native_handle_t *cHandle = nullptr;
+ ResultStatus status = mBufferPoolManager->allocate(
+ mConnectionId, params, &cHandle, &bufferPoolData);
+ if (status == ResultStatus::OK) {
+ native_handle_t *handle = native_handle_clone(cHandle);
+ if (handle) {
+ std::shared_ptr<C2LinearAllocation> alloc;
+ std::shared_ptr<C2PooledBlockPoolData> poolData =
+ std::make_shared<C2PooledBlockPoolData>(bufferPoolData);
+ c2_status_t err = mAllocator->priorLinearAllocation(handle, &alloc);
+ if (err == C2_OK && poolData && alloc) {
+ *block = _C2BlockFactory::CreateLinearBlock(alloc, poolData, 0, capacity);
+ if (*block) {
+ return C2_OK;
+ }
+ }
+ }
+ return C2_NO_MEMORY;
+ }
+ if (status == ResultStatus::NO_MEMORY) {
+ return C2_NO_MEMORY;
+ }
+ return C2_CORRUPTED;
+ }
+
+ c2_status_t fetchGraphicBlock(
+ uint32_t width, uint32_t height, uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block) {
+ block->reset();
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+ std::vector<uint8_t> params;
+ mAllocator->getGraphicParams(width, height, format, usage, ¶ms);
+ std::shared_ptr<BufferPoolData> bufferPoolData;
+ native_handle_t *cHandle = nullptr;
+ ResultStatus status = mBufferPoolManager->allocate(
+ mConnectionId, params, &cHandle, &bufferPoolData);
+ if (status == ResultStatus::OK) {
+ native_handle_t *handle = native_handle_clone(cHandle);
+ if (handle) {
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ std::shared_ptr<C2PooledBlockPoolData> poolData =
+ std::make_shared<C2PooledBlockPoolData>(bufferPoolData);
+ c2_status_t err = mAllocator->priorGraphicAllocation(
+ handle, &alloc);
+ if (err == C2_OK && poolData && alloc) {
+ *block = _C2BlockFactory::CreateGraphicBlock(
+ alloc, poolData, C2Rect(width, height));
+ if (*block) {
+ return C2_OK;
+ }
+ }
+ }
+ return C2_NO_MEMORY;
+ }
+ if (status == ResultStatus::NO_MEMORY) {
+ return C2_NO_MEMORY;
+ }
+ return C2_CORRUPTED;
+ }
+
+ ConnectionId getConnectionId() {
+ return mInit != C2_OK ? INVALID_CONNECTIONID : mConnectionId;
+ }
+
+private:
+ c2_status_t mInit;
+ const android::sp<ClientManager> mBufferPoolManager;
+ ConnectionId mConnectionId; // locally
+ const std::shared_ptr<_C2BufferPoolAllocator> mAllocator;
+};
+
+C2PooledBlockPool::C2PooledBlockPool(
+ const std::shared_ptr<C2Allocator> &allocator, const local_id_t localId)
+ : mAllocator(allocator), mLocalId(localId), mImpl(new Impl(allocator)) {}
+
+C2PooledBlockPool::~C2PooledBlockPool() {
+}
+
+c2_status_t C2PooledBlockPool::fetchLinearBlock(
+ uint32_t capacity,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2LinearBlock> *block /* nonnull */) {
+ if (mImpl) {
+ return mImpl->fetchLinearBlock(capacity, usage, block);
+ }
+ return C2_CORRUPTED;
+}
+
+c2_status_t C2PooledBlockPool::fetchGraphicBlock(
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block) {
+ if (mImpl) {
+ return mImpl->fetchGraphicBlock(width, height, format, usage, block);
+ }
+ return C2_CORRUPTED;
+}
+
+int64_t C2PooledBlockPool::getConnectionId() {
+ if (mImpl) {
+ return mImpl->getConnectionId();
+ }
+ return 0;
+}
+
+/* ========================================== 2D BLOCK ========================================= */
+
+/**
+ * Implementation that is shared between all 2D blocks and views.
+ *
+ * For blocks' Impl's crop is always the allotted crop, even if it is a sub block.
+ *
+ * For views' Impl's crop is the mapped portion - which for now is always the
+ * allotted crop.
+ */
+class C2_HIDE _C2Block2DImpl : public _C2PlanarSectionAspect {
+public:
+ /**
+ * Impl's crop is always the or part of the allotted crop of the allocation.
+ */
+ _C2Block2DImpl(const std::shared_ptr<C2GraphicAllocation> &alloc,
+ const std::shared_ptr<_C2BlockPoolData> &poolData = nullptr,
+ const C2Rect &allottedCrop = C2Rect(~0u, ~0u))
+ : _C2PlanarSectionAspect(alloc.get(), allottedCrop),
+ mAllocation(alloc),
+ mPoolData(poolData) { }
+
+ virtual ~_C2Block2DImpl() = default;
+
+ /** returns pool data */
+ std::shared_ptr<_C2BlockPoolData> poolData() const {
+ return mPoolData;
+ }
+
+ /** returns native handle */
+ const C2Handle *handle() const {
+ return mAllocation ? mAllocation->handle() : nullptr;
+ }
+
+ /** returns the allocator's ID */
+ C2Allocator::id_t getAllocatorId() const {
+ // BAD_ID can only happen if this Impl class is initialized for a view - never for a block.
+ return mAllocation ? mAllocation->getAllocatorId() : C2Allocator::BAD_ID;
+ }
+
+ std::shared_ptr<C2GraphicAllocation> getAllocation() const {
+ return mAllocation;
+ }
+
+private:
+ std::shared_ptr<C2GraphicAllocation> mAllocation;
+ std::shared_ptr<_C2BlockPoolData> mPoolData;
+};
+
+class C2_HIDE _C2MappingBlock2DImpl
+ : public _C2Block2DImpl, public std::enable_shared_from_this<_C2MappingBlock2DImpl> {
+public:
+ using _C2Block2DImpl::_C2Block2DImpl;
+
+ virtual ~_C2MappingBlock2DImpl() override = default;
+
+ /**
+ * This class contains the mapped data pointer, and the potential error.
+ */
+ struct Mapped {
+ private:
+ friend class _C2MappingBlock2DImpl;
+
+ Mapped(const std::shared_ptr<_C2Block2DImpl> &impl, bool writable, C2Fence *fence __unused)
+ : mImpl(impl), mWritable(writable) {
+ memset(mData, 0, sizeof(mData));
+ const C2Rect crop = mImpl->crop();
+ // gralloc requires mapping the whole region of interest as we cannot
+ // map multiple regions
+ mError = mImpl->getAllocation()->map(
+ crop,
+ { C2MemoryUsage::CPU_READ, writable ? C2MemoryUsage::CPU_WRITE : 0 },
+ nullptr,
+ &mLayout,
+ mData);
+ if (mError != C2_OK) {
+ memset(&mLayout, 0, sizeof(mLayout));
+ memset(mData, 0, sizeof(mData));
+ memset(mOffsetData, 0, sizeof(mData));
+ } else {
+ // TODO: validate plane layout and
+ // adjust data pointers to the crop region's top left corner.
+ // fail if it is not on a subsampling boundary
+ for (size_t planeIx = 0; planeIx < mLayout.numPlanes; ++planeIx) {
+ const uint32_t colSampling = mLayout.planes[planeIx].colSampling;
+ const uint32_t rowSampling = mLayout.planes[planeIx].rowSampling;
+ if (crop.left % colSampling || crop.right() % colSampling
+ || crop.top % rowSampling || crop.bottom() % rowSampling) {
+ // cannot calculate data pointer
+ mImpl->getAllocation()->unmap(mData, crop, nullptr);
+ memset(&mLayout, 0, sizeof(mLayout));
+ memset(mData, 0, sizeof(mData));
+ memset(mOffsetData, 0, sizeof(mData));
+ mError = C2_BAD_VALUE;
+ return;
+ }
+ mOffsetData[planeIx] =
+ mData[planeIx] + (ssize_t)crop.left * mLayout.planes[planeIx].colInc
+ + (ssize_t)crop.top * mLayout.planes[planeIx].rowInc;
+ }
+ }
+ }
+
+ explicit Mapped(c2_status_t error)
+ : mImpl(nullptr), mWritable(false), mError(error) {
+ // CHECK(error != C2_OK);
+ memset(&mLayout, 0, sizeof(mLayout));
+ memset(mData, 0, sizeof(mData));
+ memset(mOffsetData, 0, sizeof(mData));
+ }
+
+ public:
+ ~Mapped() {
+ if (mData[0] != nullptr) {
+ mImpl->getAllocation()->unmap(mData, mImpl->crop(), nullptr);
+ }
+ }
+
+ /** returns mapping status */
+ c2_status_t error() const { return mError; }
+
+ /** returns data pointer */
+ uint8_t *const *data() const { return mOffsetData; }
+
+ /** returns the plane layout */
+ C2PlanarLayout layout() const { return mLayout; }
+
+ /** returns whether the mapping is writable */
+ bool writable() const { return mWritable; }
+
+ private:
+ const std::shared_ptr<_C2Block2DImpl> mImpl;
+ bool mWritable;
+ c2_status_t mError;
+ uint8_t *mData[C2PlanarLayout::MAX_NUM_PLANES];
+ uint8_t *mOffsetData[C2PlanarLayout::MAX_NUM_PLANES];
+ C2PlanarLayout mLayout;
+ };
+
+ /**
+ * Maps the allotted region.
+ *
+ * If already mapped and it is currently in use, returns the existing mapping.
+ * If fence is provided, an acquire fence is stored there.
+ */
+ std::shared_ptr<Mapped> map(bool writable, C2Fence *fence) {
+ std::lock_guard<std::mutex> lock(mMappedLock);
+ std::shared_ptr<Mapped> existing = mMapped.lock();
+ if (!existing) {
+ existing = std::shared_ptr<Mapped>(new Mapped(shared_from_this(), writable, fence));
+ mMapped = existing;
+ } else {
+ // if we mapped the region read-only, we cannot remap it read-write
+ if (writable && !existing->writable()) {
+ existing = std::shared_ptr<Mapped>(new Mapped(C2_CANNOT_DO));
+ }
+ if (fence != nullptr) {
+ *fence = C2Fence();
+ }
+ }
+ return existing;
+ }
+
+private:
+ std::weak_ptr<Mapped> mMapped;
+ std::mutex mMappedLock;
+};
+
+class C2_HIDE _C2MappedBlock2DImpl : public _C2Block2DImpl {
+public:
+ _C2MappedBlock2DImpl(const _C2Block2DImpl &impl,
+ std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping)
+ : _C2Block2DImpl(impl), mMapping(mapping) {
+ }
+
+ virtual ~_C2MappedBlock2DImpl() override = default;
+
+ std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping() const { return mMapping; }
+
+private:
+ std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mMapping;
+};
+
+/**
+ * Block implementation.
+ */
+class C2Block2D::Impl : public _C2MappingBlock2DImpl {
+public:
+ using _C2MappingBlock2DImpl::_C2MappingBlock2DImpl;
+ virtual ~Impl() override = default;
+};
+
+const C2Handle *C2Block2D::handle() const {
+ return mImpl->handle();
+}
+
+C2Allocator::id_t C2Block2D::getAllocatorId() const {
+ return mImpl->getAllocatorId();
+}
+
+C2Block2D::C2Block2D(std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion)
+ // always clamp subsection to parent (impl) crop for safety
+ : _C2PlanarSectionAspect(impl.get(), section.crop()), mImpl(impl) {
+}
+
+/**
+ * Graphic view implementation.
+ *
+ * range of Impl is the mapped range of the underlying allocation. range of View is the current
+ * crop.
+ */
+class C2GraphicView::Impl : public _C2MappedBlock2DImpl {
+public:
+ using _C2MappedBlock2DImpl::_C2MappedBlock2DImpl;
+ virtual ~Impl() override = default;
+};
+
+C2GraphicView::C2GraphicView(std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion)
+ : _C2EditablePlanarSectionAspect(impl.get(), section.crop()), mImpl(impl) {
+}
+
+const uint8_t *const *C2GraphicView::data() const {
+ return mImpl->mapping()->data();
+}
+
+uint8_t *const *C2GraphicView::data() {
+ return mImpl->mapping()->data();
+}
+
+const C2PlanarLayout C2GraphicView::layout() const {
+ return mImpl->mapping()->layout();
+}
+
+const C2GraphicView C2GraphicView::subView(const C2Rect &rect) const {
+ return C2GraphicView(mImpl, C2PlanarSection(*mImpl, rect));
+}
+
+C2GraphicView C2GraphicView::subView(const C2Rect &rect) {
+ return C2GraphicView(mImpl, C2PlanarSection(*mImpl, rect));
+}
+
+c2_status_t C2GraphicView::error() const {
+ return mImpl->mapping()->error();
+}
+
+/**
+ * Const graphic block implementation.
+ */
+C2ConstGraphicBlock::C2ConstGraphicBlock(
+ std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion, C2Fence fence)
+ : C2Block2D(impl, section), mFence(fence) { }
+
+C2Acquirable<const C2GraphicView> C2ConstGraphicBlock::map() const {
+ C2Fence fence;
+ std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping =
+ mImpl->map(false /* writable */, &fence);
+ std::shared_ptr<GraphicViewBuddy::Impl> gvi =
+ std::shared_ptr<GraphicViewBuddy::Impl>(new GraphicViewBuddy::Impl(*mImpl, mapping));
+ return AcquirableConstGraphicViewBuddy(
+ mapping->error(), fence, GraphicViewBuddy(gvi, C2PlanarSection(*mImpl, crop())));
+}
+
+C2ConstGraphicBlock C2ConstGraphicBlock::subBlock(const C2Rect &rect) const {
+ return C2ConstGraphicBlock(mImpl, C2PlanarSection(*mImpl, crop().intersect(rect)), mFence);
+}
+
+/**
+ * Graphic block implementation.
+ */
+C2GraphicBlock::C2GraphicBlock(
+ std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion)
+ : C2Block2D(impl, section) { }
+
+C2Acquirable<C2GraphicView> C2GraphicBlock::map() {
+ C2Fence fence;
+ std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping =
+ mImpl->map(true /* writable */, &fence);
+ std::shared_ptr<GraphicViewBuddy::Impl> gvi =
+ std::shared_ptr<GraphicViewBuddy::Impl>(new GraphicViewBuddy::Impl(*mImpl, mapping));
+ return AcquirableGraphicViewBuddy(
+ mapping->error(), fence, GraphicViewBuddy(gvi, C2PlanarSection(*mImpl, crop())));
+}
+
+C2ConstGraphicBlock C2GraphicBlock::share(const C2Rect &crop, C2Fence fence) {
+ return ConstGraphicBlockBuddy(mImpl, C2PlanarSection(*mImpl, crop), fence);
+}
+
+/**
+ * Basic block pool implementations.
+ */
+C2BasicGraphicBlockPool::C2BasicGraphicBlockPool(
+ const std::shared_ptr<C2Allocator> &allocator)
+ : mAllocator(allocator) {}
+
+c2_status_t C2BasicGraphicBlockPool::fetchGraphicBlock(
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block /* nonnull */) {
+ block->reset();
+
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ c2_status_t err = mAllocator->newGraphicAllocation(width, height, format, usage, &alloc);
+ if (err != C2_OK) {
+ return err;
+ }
+
+ *block = _C2BlockFactory::CreateGraphicBlock(alloc);
+
+ return C2_OK;
+}
+
+std::shared_ptr<C2GraphicBlock> _C2BlockFactory::CreateGraphicBlock(
+ const std::shared_ptr<C2GraphicAllocation> &alloc,
+ const std::shared_ptr<_C2BlockPoolData> &data, const C2Rect &allottedCrop) {
+ std::shared_ptr<C2Block2D::Impl> impl =
+ std::make_shared<C2Block2D::Impl>(alloc, data, allottedCrop);
+ return std::shared_ptr<C2GraphicBlock>(new C2GraphicBlock(impl, *impl));
+}
+
+std::shared_ptr<_C2BlockPoolData> _C2BlockFactory::GetGraphicBlockPoolData(
+ const C2Block2D &block) {
+ if (block.mImpl) {
+ return block.mImpl->poolData();
+ }
+ return nullptr;
+}
+
+std::shared_ptr<C2GraphicBlock> _C2BlockFactory::CreateGraphicBlock(
+ const C2Handle *cHandle,
+ const std::shared_ptr<BufferPoolData> &data) {
+ // TODO: get proper allocator? and mutex?
+ static std::unique_ptr<C2AllocatorGralloc> sAllocator = std::make_unique<C2AllocatorGralloc>(0);
+
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ if (C2AllocatorGralloc::isValid(cHandle)) {
+ native_handle_t *handle = native_handle_clone(cHandle);
+ if (handle) {
+ c2_status_t err = sAllocator->priorGraphicAllocation(handle, &alloc);
+ const std::shared_ptr<C2PooledBlockPoolData> poolData =
+ std::make_shared<C2PooledBlockPoolData>(data);
+ if (err == C2_OK && poolData) {
+ // TODO: config setup?
+ std::shared_ptr<C2GraphicBlock> block =
+ _C2BlockFactory::CreateGraphicBlock(alloc, poolData);
+ return block;
+ }
+ }
+ }
+ return nullptr;
+};
+
+
+/* ========================================== BUFFER ========================================= */
+
+class C2BufferData::Impl {
+public:
+ explicit Impl(const std::vector<C2ConstLinearBlock> &blocks)
+ : mType(blocks.size() == 1 ? LINEAR : LINEAR_CHUNKS),
+ mLinearBlocks(blocks) {
+ }
+
+ explicit Impl(const std::vector<C2ConstGraphicBlock> &blocks)
+ : mType(blocks.size() == 1 ? GRAPHIC : GRAPHIC_CHUNKS),
+ mGraphicBlocks(blocks) {
+ }
+
+ type_t type() const { return mType; }
+ const std::vector<C2ConstLinearBlock> &linearBlocks() const { return mLinearBlocks; }
+ const std::vector<C2ConstGraphicBlock> &graphicBlocks() const { return mGraphicBlocks; }
+
+private:
+ type_t mType;
+ std::vector<C2ConstLinearBlock> mLinearBlocks;
+ std::vector<C2ConstGraphicBlock> mGraphicBlocks;
+};
+
+C2BufferData::C2BufferData(const std::vector<C2ConstLinearBlock> &blocks) : mImpl(new Impl(blocks)) {}
+C2BufferData::C2BufferData(const std::vector<C2ConstGraphicBlock> &blocks) : mImpl(new Impl(blocks)) {}
+
+C2BufferData::type_t C2BufferData::type() const { return mImpl->type(); }
+
+const std::vector<C2ConstLinearBlock> C2BufferData::linearBlocks() const {
+ return mImpl->linearBlocks();
+}
+
+const std::vector<C2ConstGraphicBlock> C2BufferData::graphicBlocks() const {
+ return mImpl->graphicBlocks();
+}
+
+class C2Buffer::Impl {
+public:
+ Impl(C2Buffer *thiz, const std::vector<C2ConstLinearBlock> &blocks)
+ : mThis(thiz), mData(blocks) {}
+ Impl(C2Buffer *thiz, const std::vector<C2ConstGraphicBlock> &blocks)
+ : mThis(thiz), mData(blocks) {}
+
+ ~Impl() {
+ for (const auto &pair : mNotify) {
+ pair.first(mThis, pair.second);
+ }
+ }
+
+ const C2BufferData &data() const { return mData; }
+
+ c2_status_t registerOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg) {
+ auto it = std::find_if(
+ mNotify.begin(), mNotify.end(),
+ [onDestroyNotify, arg] (const auto &pair) {
+ return pair.first == onDestroyNotify && pair.second == arg;
+ });
+ if (it != mNotify.end()) {
+ return C2_DUPLICATE;
+ }
+ mNotify.emplace_back(onDestroyNotify, arg);
+ return C2_OK;
+ }
+
+ c2_status_t unregisterOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg) {
+ auto it = std::find_if(
+ mNotify.begin(), mNotify.end(),
+ [onDestroyNotify, arg] (const auto &pair) {
+ return pair.first == onDestroyNotify && pair.second == arg;
+ });
+ if (it == mNotify.end()) {
+ return C2_NOT_FOUND;
+ }
+ mNotify.erase(it);
+ return C2_OK;
+ }
+
+ std::vector<std::shared_ptr<const C2Info>> info() const {
+ std::vector<std::shared_ptr<const C2Info>> result(mInfos.size());
+ std::transform(
+ mInfos.begin(), mInfos.end(), result.begin(),
+ [] (const auto &elem) { return elem.second; });
+ return result;
+ }
+
+ c2_status_t setInfo(const std::shared_ptr<C2Info> &info) {
+ // To "update" you need to erase the existing one if any, and then insert.
+ (void) mInfos.erase(info->coreIndex());
+ (void) mInfos.insert({ info->coreIndex(), info });
+ return C2_OK;
+ }
+
+ bool hasInfo(C2Param::Type index) const {
+ return mInfos.count(index.coreIndex()) > 0;
+ }
+
+ std::shared_ptr<const C2Info> getInfo(C2Param::Type index) const {
+ auto it = mInfos.find(index.coreIndex());
+ if (it == mInfos.end()) {
+ return nullptr;
+ }
+ return std::const_pointer_cast<const C2Info>(it->second);
+ }
+
+ std::shared_ptr<C2Info> removeInfo(C2Param::Type index) {
+ auto it = mInfos.find(index.coreIndex());
+ if (it == mInfos.end()) {
+ return nullptr;
+ }
+ std::shared_ptr<C2Info> ret = it->second;
+ (void) mInfos.erase(it);
+ return ret;
+ }
+
+private:
+ C2Buffer * const mThis;
+ BufferDataBuddy mData;
+ std::map<C2Param::CoreIndex, std::shared_ptr<C2Info>> mInfos;
+ std::list<std::pair<OnDestroyNotify, void *>> mNotify;
+};
+
+C2Buffer::C2Buffer(const std::vector<C2ConstLinearBlock> &blocks)
+ : mImpl(new Impl(this, blocks)) {}
+
+C2Buffer::C2Buffer(const std::vector<C2ConstGraphicBlock> &blocks)
+ : mImpl(new Impl(this, blocks)) {}
+
+const C2BufferData C2Buffer::data() const { return mImpl->data(); }
+
+c2_status_t C2Buffer::registerOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg) {
+ return mImpl->registerOnDestroyNotify(onDestroyNotify, arg);
+}
+
+c2_status_t C2Buffer::unregisterOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg) {
+ return mImpl->unregisterOnDestroyNotify(onDestroyNotify, arg);
+}
+
+const std::vector<std::shared_ptr<const C2Info>> C2Buffer::info() const {
+ return mImpl->info();
+}
+
+c2_status_t C2Buffer::setInfo(const std::shared_ptr<C2Info> &info) {
+ return mImpl->setInfo(info);
+}
+
+bool C2Buffer::hasInfo(C2Param::Type index) const {
+ return mImpl->hasInfo(index);
+}
+
+std::shared_ptr<const C2Info> C2Buffer::getInfo(C2Param::Type index) const {
+ return mImpl->getInfo(index);
+}
+
+std::shared_ptr<C2Info> C2Buffer::removeInfo(C2Param::Type index) {
+ return mImpl->removeInfo(index);
+}
+
+// static
+std::shared_ptr<C2Buffer> C2Buffer::CreateLinearBuffer(const C2ConstLinearBlock &block) {
+ return std::shared_ptr<C2Buffer>(new C2Buffer({ block }));
+}
+
+// static
+std::shared_ptr<C2Buffer> C2Buffer::CreateGraphicBuffer(const C2ConstGraphicBlock &block) {
+ return std::shared_ptr<C2Buffer>(new C2Buffer({ block }));
+}
+
diff --git a/media/codec2/vndk/C2Config.cpp b/media/codec2/vndk/C2Config.cpp
new file mode 100644
index 0000000..da12903
--- /dev/null
+++ b/media/codec2/vndk/C2Config.cpp
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2Config"
+#include <utils/Log.h>
+
+/**
+ * Define and initialize global config field descriptors in this cpp file
+ */
+#define __C2_GENERATE_GLOBAL_VARS__
+#include <C2Config.h>
+
+DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(C2Config::profile_t, ({
+ { "unused", C2Config::PROFILE_UNUSED },
+ { "aac-lc", C2Config::PROFILE_AAC_LC },
+ { "aac-main", C2Config::PROFILE_AAC_MAIN },
+ { "aac-ssr", C2Config::PROFILE_AAC_SSR },
+ { "aac-ltp", C2Config::PROFILE_AAC_LTP },
+ { "aac-he", C2Config::PROFILE_AAC_HE },
+ { "aac-scalable", C2Config::PROFILE_AAC_SCALABLE },
+ { "aac-er-lc", C2Config::PROFILE_AAC_ER_LC },
+ { "aac-er-scalable", C2Config::PROFILE_AAC_ER_SCALABLE },
+ { "aac-ld", C2Config::PROFILE_AAC_LD },
+ { "aac-he-ps", C2Config::PROFILE_AAC_HE_PS },
+ { "aac-eld", C2Config::PROFILE_AAC_ELD },
+ { "aac-xhe", C2Config::PROFILE_AAC_XHE },
+ { "mp2v-simple", C2Config::PROFILE_MP2V_SIMPLE },
+ { "mp2v-main", C2Config::PROFILE_MP2V_MAIN },
+ { "mp2v-snr-scalable", C2Config::PROFILE_MP2V_SNR_SCALABLE },
+ { "mp2v-spatially-scalable", C2Config::PROFILE_MP2V_SPATIALLY_SCALABLE },
+ { "mp2v-high", C2Config::PROFILE_MP2V_HIGH },
+ { "mp2v-422", C2Config::PROFILE_MP2V_422 },
+ { "mp2v-multiview", C2Config::PROFILE_MP2V_MULTIVIEW },
+ { "h263-baseline", C2Config::PROFILE_H263_BASELINE },
+ { "h263-h320", C2Config::PROFILE_H263_H320 },
+ { "h263-v1bc", C2Config::PROFILE_H263_V1BC },
+ { "h263-iswv2", C2Config::PROFILE_H263_ISWV2 },
+ { "h263-iswv3", C2Config::PROFILE_H263_ISWV3 },
+ { "h263-high-compression", C2Config::PROFILE_H263_HIGH_COMPRESSION },
+ { "h263-internet", C2Config::PROFILE_H263_INTERNET },
+ { "h263-interlace", C2Config::PROFILE_H263_INTERLACE },
+ { "h263-high-latency", C2Config::PROFILE_H263_HIGH_LATENCY },
+ { "mp4v-simple", C2Config::PROFILE_MP4V_SIMPLE },
+ { "mp4v-simple-scalable", C2Config::PROFILE_MP4V_SIMPLE_SCALABLE },
+ { "mp4v-core", C2Config::PROFILE_MP4V_CORE },
+ { "mp4v-main", C2Config::PROFILE_MP4V_MAIN },
+ { "mp4v-nbit", C2Config::PROFILE_MP4V_NBIT },
+ { "mp4v-arts", C2Config::PROFILE_MP4V_ARTS },
+ { "mp4v-core-scalable", C2Config::PROFILE_MP4V_CORE_SCALABLE },
+ { "mp4v-ace", C2Config::PROFILE_MP4V_ACE },
+ { "mp4v-advanced-core", C2Config::PROFILE_MP4V_ADVANCED_CORE },
+ { "mp4v-simple-studio", C2Config::PROFILE_MP4V_SIMPLE_STUDIO },
+ { "mp4v-core-studio", C2Config::PROFILE_MP4V_CORE_STUDIO },
+ { "mp4v-advanced-simple", C2Config::PROFILE_MP4V_ADVANCED_SIMPLE },
+ { "mp4v-fgs", C2Config::PROFILE_MP4V_FGS },
+ { "avc-baseline", C2Config::PROFILE_AVC_BASELINE },
+ { "avc-constrained-baseline", C2Config::PROFILE_AVC_CONSTRAINED_BASELINE },
+ { "avc-main", C2Config::PROFILE_AVC_MAIN },
+ { "avc-extended", C2Config::PROFILE_AVC_EXTENDED },
+ { "avc-high", C2Config::PROFILE_AVC_HIGH },
+ { "avc-progressive-high", C2Config::PROFILE_AVC_PROGRESSIVE_HIGH },
+ { "avc-constrained-high", C2Config::PROFILE_AVC_CONSTRAINED_HIGH },
+ { "avc-high-10", C2Config::PROFILE_AVC_HIGH_10 },
+ { "avc-progressive-high-10", C2Config::PROFILE_AVC_PROGRESSIVE_HIGH_10 },
+ { "avc-high-422", C2Config::PROFILE_AVC_HIGH_422 },
+ { "avc-high-444-predictive", C2Config::PROFILE_AVC_HIGH_444_PREDICTIVE },
+ { "avc-high-10-intra", C2Config::PROFILE_AVC_HIGH_10_INTRA },
+ { "avc-high-422-intra", C2Config::PROFILE_AVC_HIGH_422_INTRA },
+ { "avc-high-444-intra", C2Config::PROFILE_AVC_HIGH_444_INTRA },
+ { "avc-cavlc-444-intra", C2Config::PROFILE_AVC_CAVLC_444_INTRA },
+ { "avc-scalable-baseline", C2Config::PROFILE_AVC_SCALABLE_BASELINE },
+ { "avc-scalable-constrained-baseline", C2Config::PROFILE_AVC_SCALABLE_CONSTRAINED_BASELINE },
+ { "avc-scalable-high", C2Config::PROFILE_AVC_SCALABLE_HIGH },
+ { "avc-scalable-constrained-high", C2Config::PROFILE_AVC_SCALABLE_CONSTRAINED_HIGH },
+ { "avc-scalable-high-intra", C2Config::PROFILE_AVC_SCALABLE_HIGH_INTRA },
+ { "avc-multiview-high", C2Config::PROFILE_AVC_MULTIVIEW_HIGH },
+ { "avc-stereo-high", C2Config::PROFILE_AVC_STEREO_HIGH },
+ { "avc-mfc-high", C2Config::PROFILE_AVC_MFC_HIGH },
+ { "avc-multiview-depth-high", C2Config::PROFILE_AVC_MULTIVIEW_DEPTH_HIGH },
+ { "avc-mfc-depth-high", C2Config::PROFILE_AVC_MFC_DEPTH_HIGH },
+ { "avc-enhanced-multiview-depth-high", C2Config::PROFILE_AVC_ENHANCED_MULTIVIEW_DEPTH_HIGH },
+ { "hevc-main", C2Config::PROFILE_HEVC_MAIN },
+ { "hevc-main-10", C2Config::PROFILE_HEVC_MAIN_10 },
+ { "hevc-main-still", C2Config::PROFILE_HEVC_MAIN_STILL },
+ { "hevc-mono", C2Config::PROFILE_HEVC_MONO },
+ { "hevc-mono-12", C2Config::PROFILE_HEVC_MONO_12 },
+ { "hevc-mono-16", C2Config::PROFILE_HEVC_MONO_16 },
+ { "hevc-main-12", C2Config::PROFILE_HEVC_MAIN_12 },
+ { "hevc-main-422-10", C2Config::PROFILE_HEVC_MAIN_422_10 },
+ { "hevc-main-422-12", C2Config::PROFILE_HEVC_MAIN_422_12 },
+ { "hevc-main-444", C2Config::PROFILE_HEVC_MAIN_444 },
+ { "hevc-main-444-10", C2Config::PROFILE_HEVC_MAIN_444_10 },
+ { "hevc-main-444-12", C2Config::PROFILE_HEVC_MAIN_444_12 },
+ { "hevc-main-intra", C2Config::PROFILE_HEVC_MAIN_INTRA },
+ { "hevc-main-10-intra", C2Config::PROFILE_HEVC_MAIN_10_INTRA },
+ { "hevc-main-12-intra", C2Config::PROFILE_HEVC_MAIN_12_INTRA },
+ { "hevc-main-422-10-intra", C2Config::PROFILE_HEVC_MAIN_422_10_INTRA },
+ { "hevc-main-422-12-intra", C2Config::PROFILE_HEVC_MAIN_422_12_INTRA },
+ { "hevc-main-444-intra", C2Config::PROFILE_HEVC_MAIN_444_INTRA },
+ { "hevc-main-444-10-intra", C2Config::PROFILE_HEVC_MAIN_444_10_INTRA },
+ { "hevc-main-444-12-intra", C2Config::PROFILE_HEVC_MAIN_444_12_INTRA },
+ { "hevc-main-444-16-intra", C2Config::PROFILE_HEVC_MAIN_444_16_INTRA },
+ { "hevc-main-444-still", C2Config::PROFILE_HEVC_MAIN_444_STILL },
+ { "hevc-main-444-16-still", C2Config::PROFILE_HEVC_MAIN_444_16_STILL },
+ { "hevc-high-444", C2Config::PROFILE_HEVC_HIGH_444 },
+ { "hevc-high-444-10", C2Config::PROFILE_HEVC_HIGH_444_10 },
+ { "hevc-high-444-14", C2Config::PROFILE_HEVC_HIGH_444_14 },
+ { "hevc-high-444-16-intra", C2Config::PROFILE_HEVC_HIGH_444_16_INTRA },
+ { "hevc-sx-main", C2Config::PROFILE_HEVC_SX_MAIN },
+ { "hevc-sx-main-10", C2Config::PROFILE_HEVC_SX_MAIN_10 },
+ { "hevc-sx-main-444", C2Config::PROFILE_HEVC_SX_MAIN_444 },
+ { "hevc-sx-main-444-10", C2Config::PROFILE_HEVC_SX_MAIN_444_10 },
+ { "hevc-sx-high-444", C2Config::PROFILE_HEVC_SX_HIGH_444 },
+ { "hevc-sx-high-444-10", C2Config::PROFILE_HEVC_SX_HIGH_444_10 },
+ { "hevc-sx-high-444-14", C2Config::PROFILE_HEVC_SX_HIGH_444_14 },
+ { "hevc-multiview-main", C2Config::PROFILE_HEVC_MULTIVIEW_MAIN },
+ { "hevc-scalable-main", C2Config::PROFILE_HEVC_SCALABLE_MAIN },
+ { "hevc-scalable-main-10", C2Config::PROFILE_HEVC_SCALABLE_MAIN_10 },
+ { "hevc-scalable-mono", C2Config::PROFILE_HEVC_SCALABLE_MONO },
+ { "hevc-scalable-mono-12", C2Config::PROFILE_HEVC_SCALABLE_MONO_12 },
+ { "hevc-scalable-mono-16", C2Config::PROFILE_HEVC_SCALABLE_MONO_16 },
+ { "hevc-scalable-main-444", C2Config::PROFILE_HEVC_SCALABLE_MAIN_444 },
+ { "hevc-3d-main", C2Config::PROFILE_HEVC_3D_MAIN },
+ { "vp9-0", C2Config::PROFILE_VP9_0 },
+ { "vp9-1", C2Config::PROFILE_VP9_1 },
+ { "vp9-2", C2Config::PROFILE_VP9_2 },
+ { "vp9-3", C2Config::PROFILE_VP9_3 },
+}))
+
+DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(C2Config::level_t, ({
+ { "unused", C2Config::LEVEL_UNUSED },
+ { "mp2v-low", C2Config::LEVEL_MP2V_LOW },
+ { "mp2v-main", C2Config::LEVEL_MP2V_MAIN },
+ { "mp2v-high-1440", C2Config::LEVEL_MP2V_HIGH_1440 },
+ { "mp2v-high", C2Config::LEVEL_MP2V_HIGH },
+ { "mp2v-highp", C2Config::LEVEL_MP2V_HIGHP },
+ { "h263-10", C2Config::LEVEL_H263_10 },
+ { "h263-20", C2Config::LEVEL_H263_20 },
+ { "h263-30", C2Config::LEVEL_H263_30 },
+ { "h263-40", C2Config::LEVEL_H263_40 },
+ { "h263-45", C2Config::LEVEL_H263_45 },
+ { "h263-50", C2Config::LEVEL_H263_50 },
+ { "h263-60", C2Config::LEVEL_H263_60 },
+ { "h263-70", C2Config::LEVEL_H263_70 },
+ { "mp4v-0", C2Config::LEVEL_MP4V_0 },
+ { "mp4v-0b", C2Config::LEVEL_MP4V_0B },
+ { "mp4v-1", C2Config::LEVEL_MP4V_1 },
+ { "mp4v-2", C2Config::LEVEL_MP4V_2 },
+ { "mp4v-3", C2Config::LEVEL_MP4V_3 },
+ { "mp4v-3b", C2Config::LEVEL_MP4V_3B },
+ { "mp4v-4", C2Config::LEVEL_MP4V_4 },
+ { "mp4v-4a", C2Config::LEVEL_MP4V_4A },
+ { "mp4v-5", C2Config::LEVEL_MP4V_5 },
+ { "mp4v-6", C2Config::LEVEL_MP4V_6 },
+ { "avc-1", C2Config::LEVEL_AVC_1 },
+ { "avc-1b", C2Config::LEVEL_AVC_1B },
+ { "avc-1.1", C2Config::LEVEL_AVC_1_1 },
+ { "avc-1.2", C2Config::LEVEL_AVC_1_2 },
+ { "avc-1.3", C2Config::LEVEL_AVC_1_3 },
+ { "avc-2", C2Config::LEVEL_AVC_2 },
+ { "avc-2.1", C2Config::LEVEL_AVC_2_1 },
+ { "avc-2.2", C2Config::LEVEL_AVC_2_2 },
+ { "avc-3", C2Config::LEVEL_AVC_3 },
+ { "avc-3.1", C2Config::LEVEL_AVC_3_1 },
+ { "avc-3.2", C2Config::LEVEL_AVC_3_2 },
+ { "avc-4", C2Config::LEVEL_AVC_4 },
+ { "avc-4.1", C2Config::LEVEL_AVC_4_1 },
+ { "avc-4.2", C2Config::LEVEL_AVC_4_2 },
+ { "avc-5", C2Config::LEVEL_AVC_5 },
+ { "avc-5.1", C2Config::LEVEL_AVC_5_1 },
+ { "avc-5.2", C2Config::LEVEL_AVC_5_2 },
+ { "hevc-main-1", C2Config::LEVEL_HEVC_MAIN_1 },
+ { "hevc-main-2", C2Config::LEVEL_HEVC_MAIN_2 },
+ { "hevc-main-2.1", C2Config::LEVEL_HEVC_MAIN_2_1 },
+ { "hevc-main-3", C2Config::LEVEL_HEVC_MAIN_3 },
+ { "hevc-main-3.1", C2Config::LEVEL_HEVC_MAIN_3_1 },
+ { "hevc-main-4", C2Config::LEVEL_HEVC_MAIN_4 },
+ { "hevc-main-4.1", C2Config::LEVEL_HEVC_MAIN_4_1 },
+ { "hevc-main-5", C2Config::LEVEL_HEVC_MAIN_5 },
+ { "hevc-main-5.1", C2Config::LEVEL_HEVC_MAIN_5_1 },
+ { "hevc-main-5.2", C2Config::LEVEL_HEVC_MAIN_5_2 },
+ { "hevc-main-6", C2Config::LEVEL_HEVC_MAIN_6 },
+ { "hevc-main-6.1", C2Config::LEVEL_HEVC_MAIN_6_1 },
+ { "hevc-main-6.2", C2Config::LEVEL_HEVC_MAIN_6_2 },
+ { "hevc-high-4", C2Config::LEVEL_HEVC_HIGH_4 },
+ { "hevc-high-4.1", C2Config::LEVEL_HEVC_HIGH_4_1 },
+ { "hevc-high-5", C2Config::LEVEL_HEVC_HIGH_5 },
+ { "hevc-high-5.1", C2Config::LEVEL_HEVC_HIGH_5_1 },
+ { "hevc-high-5.2", C2Config::LEVEL_HEVC_HIGH_5_2 },
+ { "hevc-high-6", C2Config::LEVEL_HEVC_HIGH_6 },
+ { "hevc-high-6.1", C2Config::LEVEL_HEVC_HIGH_6_1 },
+ { "hevc-high-6.2", C2Config::LEVEL_HEVC_HIGH_6_2 },
+ { "vp9-1", C2Config::LEVEL_VP9_1 },
+ { "vp9-1.1", C2Config::LEVEL_VP9_1_1 },
+ { "vp9-2", C2Config::LEVEL_VP9_2 },
+ { "vp9-2.1", C2Config::LEVEL_VP9_2_1 },
+ { "vp9-3", C2Config::LEVEL_VP9_3 },
+ { "vp9-3.1", C2Config::LEVEL_VP9_3_1 },
+ { "vp9-4", C2Config::LEVEL_VP9_4 },
+ { "vp9-4.1", C2Config::LEVEL_VP9_4_1 },
+ { "vp9-5", C2Config::LEVEL_VP9_5 },
+ { "vp9-5.1", C2Config::LEVEL_VP9_5_1 },
+ { "vp9-5.2", C2Config::LEVEL_VP9_5_2 },
+ { "vp9-6", C2Config::LEVEL_VP9_6 },
+ { "vp9-6.1", C2Config::LEVEL_VP9_6_1 },
+ { "vp9-6.2", C2Config::LEVEL_VP9_6_2 },
+}))
+
+DEFINE_C2_ENUM_VALUE_CUSTOM_HELPER(C2BufferData::type_t, ({
+ { "invalid", C2BufferData::INVALID },
+ { "linear", C2BufferData::LINEAR },
+ { "linear-chunks", C2BufferData::LINEAR_CHUNKS },
+ { "graphic", C2BufferData::GRAPHIC },
+ { "graphic-chunks", C2BufferData::GRAPHIC_CHUNKS },
+}))
+
+
diff --git a/media/codec2/vndk/C2PlatformStorePluginLoader.cpp b/media/codec2/vndk/C2PlatformStorePluginLoader.cpp
new file mode 100644
index 0000000..7a460f4
--- /dev/null
+++ b/media/codec2/vndk/C2PlatformStorePluginLoader.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2PlatformStorePluginLoader"
+
+#include <dlfcn.h>
+
+#include <utils/Log.h>
+
+#include "C2PlatformStorePluginLoader.h"
+
+/* static */ android::Mutex C2PlatformStorePluginLoader::sMutex;
+/* static */ std::unique_ptr<C2PlatformStorePluginLoader> C2PlatformStorePluginLoader::sInstance;
+
+C2PlatformStorePluginLoader::C2PlatformStorePluginLoader(const char *libPath)
+ : mCreateBlockPool(nullptr) {
+ mLibHandle = dlopen(libPath, RTLD_NOW | RTLD_NODELETE);
+ if (mLibHandle == nullptr) {
+ ALOGD("Failed to load library: %s (%s)", libPath, dlerror());
+ return;
+ }
+ mCreateBlockPool = (CreateBlockPoolFunc)dlsym(mLibHandle, "CreateBlockPool");
+ if (mCreateBlockPool == nullptr) {
+ ALOGD("Failed to find symbol: CreateBlockPool (%s)", dlerror());
+ }
+ mCreateAllocator = (CreateAllocatorFunc)dlsym(mLibHandle, "CreateAllocator");
+ if (mCreateAllocator == nullptr) {
+ ALOGD("Failed to find symbol: CreateAllocator (%s)", dlerror());
+ }
+}
+
+C2PlatformStorePluginLoader::~C2PlatformStorePluginLoader() {
+ if (mLibHandle != nullptr) {
+ ALOGV("Closing handle");
+ dlclose(mLibHandle);
+ }
+}
+
+c2_status_t C2PlatformStorePluginLoader::createBlockPool(
+ ::C2Allocator::id_t allocatorId, ::C2BlockPool::local_id_t blockPoolId,
+ std::shared_ptr<C2BlockPool>* pool) {
+ if (mCreateBlockPool == nullptr) {
+ ALOGD("Handle or CreateBlockPool symbol is null");
+ return C2_NOT_FOUND;
+ }
+
+ std::shared_ptr<::C2BlockPool> ptr(mCreateBlockPool(allocatorId, blockPoolId));
+ if (ptr) {
+ *pool = ptr;
+ return C2_OK;
+ }
+ ALOGD("Failed to CreateBlockPool by allocator id: %u", allocatorId);
+ return C2_BAD_INDEX;
+}
+
+c2_status_t C2PlatformStorePluginLoader::createAllocator(
+ ::C2Allocator::id_t allocatorId, std::shared_ptr<C2Allocator>* const allocator) {
+ if (mCreateAllocator == nullptr) {
+ ALOGD("Handle or CreateAllocator symbol is null");
+ return C2_NOT_FOUND;
+ }
+
+ c2_status_t res = C2_CORRUPTED;
+ allocator->reset(mCreateAllocator(allocatorId, &res));
+ if (res != C2_OK) {
+ ALOGD("Failed to CreateAllocator by id: %u, res: %d", allocatorId, res);
+ allocator->reset();
+ return res;
+ }
+ return C2_OK;
+}
+
+// static
+const std::unique_ptr<C2PlatformStorePluginLoader>& C2PlatformStorePluginLoader::GetInstance() {
+ android::Mutex::Autolock _l(sMutex);
+ if (!sInstance) {
+ ALOGV("Loading library");
+ sInstance.reset(new C2PlatformStorePluginLoader("libstagefright_ccodec_ext.so"));
+ }
+ return sInstance;
+}
diff --git a/media/codec2/vndk/C2Store.cpp b/media/codec2/vndk/C2Store.cpp
new file mode 100644
index 0000000..33019ed
--- /dev/null
+++ b/media/codec2/vndk/C2Store.cpp
@@ -0,0 +1,974 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "C2Store"
+#define LOG_NDEBUG 0
+#include <utils/Log.h>
+
+#include <C2AllocatorGralloc.h>
+#include <C2AllocatorIon.h>
+#include <C2BufferPriv.h>
+#include <C2BqBufferPriv.h>
+#include <C2Component.h>
+#include <C2Config.h>
+#include <C2PlatformStorePluginLoader.h>
+#include <C2PlatformSupport.h>
+#include <util/C2InterfaceHelper.h>
+
+#include <dlfcn.h>
+#include <unistd.h> // getpagesize
+
+#include <map>
+#include <memory>
+#include <mutex>
+
+namespace android {
+
+/**
+ * Returns the preferred component store in this process to access its interface.
+ */
+std::shared_ptr<C2ComponentStore> GetPreferredCodec2ComponentStore();
+
+/**
+ * The platform allocator store provides basic allocator-types for the framework based on ion and
+ * gralloc. Allocators are not meant to be updatable.
+ *
+ * \todo Provide allocator based on ashmem
+ * \todo Move ion allocation into its HIDL or provide some mapping from memory usage to ion flags
+ * \todo Make this allocator store extendable
+ */
+class C2PlatformAllocatorStoreImpl : public C2PlatformAllocatorStore {
+public:
+ C2PlatformAllocatorStoreImpl();
+
+ virtual c2_status_t fetchAllocator(
+ id_t id, std::shared_ptr<C2Allocator> *const allocator) override;
+
+ virtual std::vector<std::shared_ptr<const C2Allocator::Traits>> listAllocators_nb()
+ const override {
+ return std::vector<std::shared_ptr<const C2Allocator::Traits>>(); /// \todo
+ }
+
+ virtual C2String getName() const override {
+ return "android.allocator-store";
+ }
+
+ void setComponentStore(std::shared_ptr<C2ComponentStore> store);
+
+ ~C2PlatformAllocatorStoreImpl() override = default;
+
+private:
+ /// returns a shared-singleton ion allocator
+ std::shared_ptr<C2Allocator> fetchIonAllocator();
+
+ /// returns a shared-singleton gralloc allocator
+ std::shared_ptr<C2Allocator> fetchGrallocAllocator();
+
+ /// returns a shared-singleton bufferqueue supporting gralloc allocator
+ std::shared_ptr<C2Allocator> fetchBufferQueueAllocator();
+
+ /// component store to use
+ std::mutex _mComponentStoreSetLock; // protects the entire updating _mComponentStore and its
+ // dependencies
+ std::mutex _mComponentStoreReadLock; // must protect only read/write of _mComponentStore
+ std::shared_ptr<C2ComponentStore> _mComponentStore;
+};
+
+C2PlatformAllocatorStoreImpl::C2PlatformAllocatorStoreImpl() {
+}
+
+c2_status_t C2PlatformAllocatorStoreImpl::fetchAllocator(
+ id_t id, std::shared_ptr<C2Allocator> *const allocator) {
+ allocator->reset();
+ switch (id) {
+ // TODO: should we implement a generic registry for all, and use that?
+ case C2PlatformAllocatorStore::ION:
+ case C2AllocatorStore::DEFAULT_LINEAR:
+ *allocator = fetchIonAllocator();
+ break;
+
+ case C2PlatformAllocatorStore::GRALLOC:
+ case C2AllocatorStore::DEFAULT_GRAPHIC:
+ *allocator = fetchGrallocAllocator();
+ break;
+
+ case C2PlatformAllocatorStore::BUFFERQUEUE:
+ *allocator = fetchBufferQueueAllocator();
+ break;
+
+ default:
+ // Try to create allocator from platform store plugins.
+ c2_status_t res =
+ C2PlatformStorePluginLoader::GetInstance()->createAllocator(id, allocator);
+ if (res != C2_OK) {
+ return res;
+ }
+ break;
+ }
+ if (*allocator == nullptr) {
+ return C2_NO_MEMORY;
+ }
+ return C2_OK;
+}
+
+namespace {
+
+std::mutex gIonAllocatorMutex;
+std::weak_ptr<C2AllocatorIon> gIonAllocator;
+
+void UseComponentStoreForIonAllocator(
+ const std::shared_ptr<C2AllocatorIon> allocator,
+ std::shared_ptr<C2ComponentStore> store) {
+ C2AllocatorIon::UsageMapperFn mapper;
+ uint64_t minUsage = 0;
+ uint64_t maxUsage = C2MemoryUsage(C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE).expected;
+ size_t blockSize = getpagesize();
+
+ // query min and max usage as well as block size via supported values
+ C2StoreIonUsageInfo usageInfo;
+ std::vector<C2FieldSupportedValuesQuery> query = {
+ C2FieldSupportedValuesQuery::Possible(C2ParamField::Make(usageInfo, usageInfo.usage)),
+ C2FieldSupportedValuesQuery::Possible(C2ParamField::Make(usageInfo, usageInfo.capacity)),
+ };
+ c2_status_t res = store->querySupportedValues_sm(query);
+ if (res == C2_OK) {
+ if (query[0].status == C2_OK) {
+ const C2FieldSupportedValues &fsv = query[0].values;
+ if (fsv.type == C2FieldSupportedValues::FLAGS && !fsv.values.empty()) {
+ minUsage = fsv.values[0].u64;
+ maxUsage = 0;
+ for (C2Value::Primitive v : fsv.values) {
+ maxUsage |= v.u64;
+ }
+ }
+ }
+ if (query[1].status == C2_OK) {
+ const C2FieldSupportedValues &fsv = query[1].values;
+ if (fsv.type == C2FieldSupportedValues::RANGE && fsv.range.step.u32 > 0) {
+ blockSize = fsv.range.step.u32;
+ }
+ }
+
+ mapper = [store](C2MemoryUsage usage, size_t capacity,
+ size_t *align, unsigned *heapMask, unsigned *flags) -> c2_status_t {
+ if (capacity > UINT32_MAX) {
+ return C2_BAD_VALUE;
+ }
+ C2StoreIonUsageInfo usageInfo = { usage.expected, capacity };
+ std::vector<std::unique_ptr<C2SettingResult>> failures; // TODO: remove
+ c2_status_t res = store->config_sm({&usageInfo}, &failures);
+ if (res == C2_OK) {
+ *align = usageInfo.minAlignment;
+ *heapMask = usageInfo.heapMask;
+ *flags = usageInfo.allocFlags;
+ }
+ return res;
+ };
+ }
+
+ allocator->setUsageMapper(mapper, minUsage, maxUsage, blockSize);
+}
+
+}
+
+void C2PlatformAllocatorStoreImpl::setComponentStore(std::shared_ptr<C2ComponentStore> store) {
+ // technically this set lock is not needed, but is here for safety in case we add more
+ // getter orders
+ std::lock_guard<std::mutex> lock(_mComponentStoreSetLock);
+ {
+ std::lock_guard<std::mutex> lock(_mComponentStoreReadLock);
+ _mComponentStore = store;
+ }
+ std::shared_ptr<C2AllocatorIon> allocator;
+ {
+ std::lock_guard<std::mutex> lock(gIonAllocatorMutex);
+ allocator = gIonAllocator.lock();
+ }
+ if (allocator) {
+ UseComponentStoreForIonAllocator(allocator, store);
+ }
+}
+
+std::shared_ptr<C2Allocator> C2PlatformAllocatorStoreImpl::fetchIonAllocator() {
+ std::lock_guard<std::mutex> lock(gIonAllocatorMutex);
+ std::shared_ptr<C2AllocatorIon> allocator = gIonAllocator.lock();
+ if (allocator == nullptr) {
+ std::shared_ptr<C2ComponentStore> componentStore;
+ {
+ std::lock_guard<std::mutex> lock(_mComponentStoreReadLock);
+ componentStore = _mComponentStore;
+ }
+ allocator = std::make_shared<C2AllocatorIon>(C2PlatformAllocatorStore::ION);
+ UseComponentStoreForIonAllocator(allocator, componentStore);
+ gIonAllocator = allocator;
+ }
+ return allocator;
+}
+
+std::shared_ptr<C2Allocator> C2PlatformAllocatorStoreImpl::fetchGrallocAllocator() {
+ static std::mutex mutex;
+ static std::weak_ptr<C2Allocator> grallocAllocator;
+ std::lock_guard<std::mutex> lock(mutex);
+ std::shared_ptr<C2Allocator> allocator = grallocAllocator.lock();
+ if (allocator == nullptr) {
+ allocator = std::make_shared<C2AllocatorGralloc>(C2PlatformAllocatorStore::GRALLOC);
+ grallocAllocator = allocator;
+ }
+ return allocator;
+}
+
+std::shared_ptr<C2Allocator> C2PlatformAllocatorStoreImpl::fetchBufferQueueAllocator() {
+ static std::mutex mutex;
+ static std::weak_ptr<C2Allocator> grallocAllocator;
+ std::lock_guard<std::mutex> lock(mutex);
+ std::shared_ptr<C2Allocator> allocator = grallocAllocator.lock();
+ if (allocator == nullptr) {
+ allocator = std::make_shared<C2AllocatorGralloc>(
+ C2PlatformAllocatorStore::BUFFERQUEUE, true);
+ grallocAllocator = allocator;
+ }
+ return allocator;
+}
+
+namespace {
+ std::mutex gPreferredComponentStoreMutex;
+ std::shared_ptr<C2ComponentStore> gPreferredComponentStore;
+
+ std::mutex gPlatformAllocatorStoreMutex;
+ std::weak_ptr<C2PlatformAllocatorStoreImpl> gPlatformAllocatorStore;
+}
+
+std::shared_ptr<C2AllocatorStore> GetCodec2PlatformAllocatorStore() {
+ std::lock_guard<std::mutex> lock(gPlatformAllocatorStoreMutex);
+ std::shared_ptr<C2PlatformAllocatorStoreImpl> store = gPlatformAllocatorStore.lock();
+ if (store == nullptr) {
+ store = std::make_shared<C2PlatformAllocatorStoreImpl>();
+ store->setComponentStore(GetPreferredCodec2ComponentStore());
+ gPlatformAllocatorStore = store;
+ }
+ return store;
+}
+
+void SetPreferredCodec2ComponentStore(std::shared_ptr<C2ComponentStore> componentStore) {
+ static std::mutex mutex;
+ std::lock_guard<std::mutex> lock(mutex); // don't interleve set-s
+
+ // update preferred store
+ {
+ std::lock_guard<std::mutex> lock(gPreferredComponentStoreMutex);
+ gPreferredComponentStore = componentStore;
+ }
+
+ // update platform allocator's store as well if it is alive
+ std::shared_ptr<C2PlatformAllocatorStoreImpl> allocatorStore;
+ {
+ std::lock_guard<std::mutex> lock(gPlatformAllocatorStoreMutex);
+ allocatorStore = gPlatformAllocatorStore.lock();
+ }
+ if (allocatorStore) {
+ allocatorStore->setComponentStore(componentStore);
+ }
+}
+
+std::shared_ptr<C2ComponentStore> GetPreferredCodec2ComponentStore() {
+ std::lock_guard<std::mutex> lock(gPreferredComponentStoreMutex);
+ return gPreferredComponentStore ? gPreferredComponentStore : GetCodec2PlatformComponentStore();
+}
+
+namespace {
+
+class _C2BlockPoolCache {
+public:
+ _C2BlockPoolCache() : mBlockPoolSeqId(C2BlockPool::PLATFORM_START + 1) {}
+
+ c2_status_t _createBlockPool(
+ C2PlatformAllocatorStore::id_t allocatorId,
+ std::shared_ptr<const C2Component> component,
+ C2BlockPool::local_id_t poolId,
+ std::shared_ptr<C2BlockPool> *pool) {
+ std::shared_ptr<C2AllocatorStore> allocatorStore =
+ GetCodec2PlatformAllocatorStore();
+ std::shared_ptr<C2Allocator> allocator;
+ c2_status_t res = C2_NOT_FOUND;
+
+ switch(allocatorId) {
+ case C2PlatformAllocatorStore::ION:
+ case C2AllocatorStore::DEFAULT_LINEAR:
+ res = allocatorStore->fetchAllocator(
+ C2AllocatorStore::DEFAULT_LINEAR, &allocator);
+ if (res == C2_OK) {
+ std::shared_ptr<C2BlockPool> ptr =
+ std::make_shared<C2PooledBlockPool>(
+ allocator, poolId);
+ *pool = ptr;
+ mBlockPools[poolId] = ptr;
+ mComponents[poolId] = component;
+ }
+ break;
+ case C2PlatformAllocatorStore::GRALLOC:
+ case C2AllocatorStore::DEFAULT_GRAPHIC:
+ res = allocatorStore->fetchAllocator(
+ C2AllocatorStore::DEFAULT_GRAPHIC, &allocator);
+ if (res == C2_OK) {
+ std::shared_ptr<C2BlockPool> ptr =
+ std::make_shared<C2PooledBlockPool>(allocator, poolId);
+ *pool = ptr;
+ mBlockPools[poolId] = ptr;
+ mComponents[poolId] = component;
+ }
+ break;
+ case C2PlatformAllocatorStore::BUFFERQUEUE:
+ res = allocatorStore->fetchAllocator(
+ C2PlatformAllocatorStore::BUFFERQUEUE, &allocator);
+ if (res == C2_OK) {
+ std::shared_ptr<C2BlockPool> ptr =
+ std::make_shared<C2BufferQueueBlockPool>(
+ allocator, poolId);
+ *pool = ptr;
+ mBlockPools[poolId] = ptr;
+ mComponents[poolId] = component;
+ }
+ break;
+ default:
+ // Try to create block pool from platform store plugins.
+ std::shared_ptr<C2BlockPool> ptr;
+ res = C2PlatformStorePluginLoader::GetInstance()->createBlockPool(
+ allocatorId, poolId, &ptr);
+ if (res == C2_OK) {
+ *pool = ptr;
+ mBlockPools[poolId] = ptr;
+ mComponents[poolId] = component;
+ }
+ break;
+ }
+ return res;
+ }
+
+ c2_status_t createBlockPool(
+ C2PlatformAllocatorStore::id_t allocatorId,
+ std::shared_ptr<const C2Component> component,
+ std::shared_ptr<C2BlockPool> *pool) {
+ return _createBlockPool(allocatorId, component, mBlockPoolSeqId++, pool);
+ }
+
+ bool getBlockPool(
+ C2BlockPool::local_id_t blockPoolId,
+ std::shared_ptr<const C2Component> component,
+ std::shared_ptr<C2BlockPool> *pool) {
+ // TODO: use one iterator for multiple blockpool type scalability.
+ std::shared_ptr<C2BlockPool> ptr;
+ auto it = mBlockPools.find(blockPoolId);
+ if (it != mBlockPools.end()) {
+ ptr = it->second.lock();
+ if (!ptr) {
+ mBlockPools.erase(it);
+ mComponents.erase(blockPoolId);
+ } else {
+ auto found = mComponents.find(blockPoolId);
+ if (component == found->second.lock()) {
+ *pool = ptr;
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+private:
+ C2BlockPool::local_id_t mBlockPoolSeqId;
+
+ std::map<C2BlockPool::local_id_t, std::weak_ptr<C2BlockPool>> mBlockPools;
+ std::map<C2BlockPool::local_id_t, std::weak_ptr<const C2Component>> mComponents;
+};
+
+static std::unique_ptr<_C2BlockPoolCache> sBlockPoolCache =
+ std::make_unique<_C2BlockPoolCache>();
+static std::mutex sBlockPoolCacheMutex;
+
+} // anynymous namespace
+
+c2_status_t GetCodec2BlockPool(
+ C2BlockPool::local_id_t id, std::shared_ptr<const C2Component> component,
+ std::shared_ptr<C2BlockPool> *pool) {
+ pool->reset();
+ std::lock_guard<std::mutex> lock(sBlockPoolCacheMutex);
+ std::shared_ptr<C2AllocatorStore> allocatorStore = GetCodec2PlatformAllocatorStore();
+ std::shared_ptr<C2Allocator> allocator;
+ c2_status_t res = C2_NOT_FOUND;
+
+ if (id >= C2BlockPool::PLATFORM_START) {
+ if (sBlockPoolCache->getBlockPool(id, component, pool)) {
+ return C2_OK;
+ }
+ }
+
+ switch (id) {
+ case C2BlockPool::BASIC_LINEAR:
+ res = allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR, &allocator);
+ if (res == C2_OK) {
+ *pool = std::make_shared<C2BasicLinearBlockPool>(allocator);
+ }
+ break;
+ case C2BlockPool::BASIC_GRAPHIC:
+ res = allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_GRAPHIC, &allocator);
+ if (res == C2_OK) {
+ *pool = std::make_shared<C2BasicGraphicBlockPool>(allocator);
+ }
+ break;
+ // TODO: remove this. this is temporary
+ case C2BlockPool::PLATFORM_START:
+ res = sBlockPoolCache->_createBlockPool(
+ C2PlatformAllocatorStore::BUFFERQUEUE, component, id, pool);
+ break;
+ default:
+ break;
+ }
+ return res;
+}
+
+c2_status_t CreateCodec2BlockPool(
+ C2PlatformAllocatorStore::id_t allocatorId,
+ std::shared_ptr<const C2Component> component,
+ std::shared_ptr<C2BlockPool> *pool) {
+ pool->reset();
+
+ std::lock_guard<std::mutex> lock(sBlockPoolCacheMutex);
+ return sBlockPoolCache->createBlockPool(allocatorId, component, pool);
+}
+
+class C2PlatformComponentStore : public C2ComponentStore {
+public:
+ virtual std::vector<std::shared_ptr<const C2Component::Traits>> listComponents() override;
+ virtual std::shared_ptr<C2ParamReflector> getParamReflector() const override;
+ virtual C2String getName() const override;
+ virtual c2_status_t querySupportedValues_sm(
+ std::vector<C2FieldSupportedValuesQuery> &fields) const override;
+ virtual c2_status_t querySupportedParams_nb(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const override;
+ virtual c2_status_t query_sm(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ std::vector<std::unique_ptr<C2Param>> *const heapParams) const override;
+ virtual c2_status_t createInterface(
+ C2String name, std::shared_ptr<C2ComponentInterface> *const interface) override;
+ virtual c2_status_t createComponent(
+ C2String name, std::shared_ptr<C2Component> *const component) override;
+ virtual c2_status_t copyBuffer(
+ std::shared_ptr<C2GraphicBuffer> src, std::shared_ptr<C2GraphicBuffer> dst) override;
+ virtual c2_status_t config_sm(
+ const std::vector<C2Param*> ¶ms,
+ std::vector<std::unique_ptr<C2SettingResult>> *const failures) override;
+ C2PlatformComponentStore();
+
+ virtual ~C2PlatformComponentStore() override = default;
+
+private:
+
+ /**
+ * An object encapsulating a loaded component module.
+ *
+ * \todo provide a way to add traits to known components here to avoid loading the .so-s
+ * for listComponents
+ */
+ struct ComponentModule : public C2ComponentFactory,
+ public std::enable_shared_from_this<ComponentModule> {
+ virtual c2_status_t createComponent(
+ c2_node_id_t id, std::shared_ptr<C2Component> *component,
+ ComponentDeleter deleter = std::default_delete<C2Component>()) override;
+ virtual c2_status_t createInterface(
+ c2_node_id_t id, std::shared_ptr<C2ComponentInterface> *interface,
+ InterfaceDeleter deleter = std::default_delete<C2ComponentInterface>()) override;
+
+ /**
+ * \returns the traits of the component in this module.
+ */
+ std::shared_ptr<const C2Component::Traits> getTraits();
+
+ /**
+ * Creates an uninitialized component module.
+ *
+ * \param name[in] component name.
+ *
+ * \note Only used by ComponentLoader.
+ */
+ ComponentModule()
+ : mInit(C2_NO_INIT),
+ mLibHandle(nullptr),
+ createFactory(nullptr),
+ destroyFactory(nullptr),
+ mComponentFactory(nullptr) {
+ }
+
+ /**
+ * Initializes a component module with a given library path. Must be called exactly once.
+ *
+ * \note Only used by ComponentLoader.
+ *
+ * \param alias[in] module alias
+ * \param libPath[in] library path
+ *
+ * \retval C2_OK the component module has been successfully loaded
+ * \retval C2_NO_MEMORY not enough memory to loading the component module
+ * \retval C2_NOT_FOUND could not locate the component module
+ * \retval C2_CORRUPTED the component module could not be loaded (unexpected)
+ * \retval C2_REFUSED permission denied to load the component module (unexpected)
+ * \retval C2_TIMED_OUT could not load the module within the time limit (unexpected)
+ */
+ c2_status_t init(std::string alias, std::string libPath);
+
+ virtual ~ComponentModule() override;
+
+ protected:
+ std::recursive_mutex mLock; ///< lock protecting mTraits
+ std::shared_ptr<C2Component::Traits> mTraits; ///< cached component traits
+
+ c2_status_t mInit; ///< initialization result
+
+ void *mLibHandle; ///< loaded library handle
+ C2ComponentFactory::CreateCodec2FactoryFunc createFactory; ///< loaded create function
+ C2ComponentFactory::DestroyCodec2FactoryFunc destroyFactory; ///< loaded destroy function
+ C2ComponentFactory *mComponentFactory; ///< loaded/created component factory
+ };
+
+ /**
+ * An object encapsulating a loadable component module.
+ *
+ * \todo make this also work for enumerations
+ */
+ struct ComponentLoader {
+ /**
+ * Load the component module.
+ *
+ * This method simply returns the component module if it is already currently loaded, or
+ * attempts to load it if it is not.
+ *
+ * \param module[out] pointer to the shared pointer where the loaded module shall be stored.
+ * This will be nullptr on error.
+ *
+ * \retval C2_OK the component module has been successfully loaded
+ * \retval C2_NO_MEMORY not enough memory to loading the component module
+ * \retval C2_NOT_FOUND could not locate the component module
+ * \retval C2_CORRUPTED the component module could not be loaded
+ * \retval C2_REFUSED permission denied to load the component module
+ */
+ c2_status_t fetchModule(std::shared_ptr<ComponentModule> *module) {
+ c2_status_t res = C2_OK;
+ std::lock_guard<std::mutex> lock(mMutex);
+ std::shared_ptr<ComponentModule> localModule = mModule.lock();
+ if (localModule == nullptr) {
+ localModule = std::make_shared<ComponentModule>();
+ res = localModule->init(mAlias, mLibPath);
+ if (res == C2_OK) {
+ mModule = localModule;
+ }
+ }
+ *module = localModule;
+ return res;
+ }
+
+ /**
+ * Creates a component loader for a specific library path (or name).
+ */
+ ComponentLoader(std::string alias, std::string libPath)
+ : mAlias(alias), mLibPath(libPath) {}
+
+ private:
+ std::mutex mMutex; ///< mutex guarding the module
+ std::weak_ptr<ComponentModule> mModule; ///< weak reference to the loaded module
+ std::string mAlias; ///< component alias
+ std::string mLibPath; ///< library path
+ };
+
+ struct Interface : public C2InterfaceHelper {
+ std::shared_ptr<C2StoreIonUsageInfo> mIonUsageInfo;
+
+ Interface(std::shared_ptr<C2ReflectorHelper> reflector)
+ : C2InterfaceHelper(reflector) {
+ setDerivedInstance(this);
+
+ struct Setter {
+ static C2R setIonUsage(bool /* mayBlock */, C2P<C2StoreIonUsageInfo> &me) {
+ me.set().heapMask = ~0;
+ me.set().allocFlags = 0;
+ me.set().minAlignment = 0;
+ return C2R::Ok();
+ }
+ };
+
+ addParameter(
+ DefineParam(mIonUsageInfo, "ion-usage")
+ .withDefault(new C2StoreIonUsageInfo())
+ .withFields({
+ C2F(mIonUsageInfo, usage).flags({C2MemoryUsage::CPU_READ | C2MemoryUsage::CPU_WRITE}),
+ C2F(mIonUsageInfo, capacity).inRange(0, UINT32_MAX, 1024),
+ C2F(mIonUsageInfo, heapMask).any(),
+ C2F(mIonUsageInfo, allocFlags).flags({}),
+ C2F(mIonUsageInfo, minAlignment).equalTo(0)
+ })
+ .withSetter(Setter::setIonUsage)
+ .build());
+ }
+ };
+
+ /**
+ * Retrieves the component loader for a component.
+ *
+ * \return a non-ref-holding pointer to the component loader.
+ *
+ * \retval C2_OK the component loader has been successfully retrieved
+ * \retval C2_NO_MEMORY not enough memory to locate the component loader
+ * \retval C2_NOT_FOUND could not locate the component to be loaded
+ * \retval C2_CORRUPTED the component loader could not be identified due to some modules being
+ * corrupted (this can happen if the name does not refer to an already
+ * identified component but some components could not be loaded due to
+ * bad library)
+ * \retval C2_REFUSED permission denied to find the component loader for the named component
+ * (this can happen if the name does not refer to an already identified
+ * component but some components could not be loaded due to lack of
+ * permissions)
+ */
+ c2_status_t findComponent(C2String name, ComponentLoader **loader);
+
+ std::map<C2String, ComponentLoader> mComponents; ///< map of name -> components
+ std::vector<C2String> mComponentsList; ///< list of components
+ std::shared_ptr<C2ReflectorHelper> mReflector;
+ Interface mInterface;
+};
+
+c2_status_t C2PlatformComponentStore::ComponentModule::init(
+ std::string alias, std::string libPath) {
+ ALOGV("in %s", __func__);
+ ALOGV("loading dll");
+ mLibHandle = dlopen(libPath.c_str(), RTLD_NOW|RTLD_NODELETE);
+ if (mLibHandle == nullptr) {
+ // could be access/symbol or simply not being there
+ ALOGD("could not dlopen %s: %s", libPath.c_str(), dlerror());
+ mInit = C2_CORRUPTED;
+ } else {
+ createFactory =
+ (C2ComponentFactory::CreateCodec2FactoryFunc)dlsym(mLibHandle, "CreateCodec2Factory");
+ destroyFactory =
+ (C2ComponentFactory::DestroyCodec2FactoryFunc)dlsym(mLibHandle, "DestroyCodec2Factory");
+
+ mComponentFactory = createFactory();
+ if (mComponentFactory == nullptr) {
+ ALOGD("could not create factory in %s", libPath.c_str());
+ mInit = C2_NO_MEMORY;
+ } else {
+ mInit = C2_OK;
+ }
+ }
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+
+ std::shared_ptr<C2ComponentInterface> intf;
+ c2_status_t res = createInterface(0, &intf);
+ if (res != C2_OK) {
+ ALOGD("failed to create interface: %d", res);
+ return mInit;
+ }
+
+ std::shared_ptr<C2Component::Traits> traits(new (std::nothrow) C2Component::Traits);
+ if (traits) {
+ if (alias != intf->getName()) {
+ ALOGV("%s is alias to %s", alias.c_str(), intf->getName().c_str());
+ }
+ traits->name = alias;
+ // TODO: get this from interface properly.
+ bool encoder = (traits->name.find("encoder") != std::string::npos);
+ uint32_t mediaTypeIndex = encoder ? C2PortMimeConfig::output::PARAM_TYPE
+ : C2PortMimeConfig::input::PARAM_TYPE;
+ std::vector<std::unique_ptr<C2Param>> params;
+ res = intf->query_vb({}, { mediaTypeIndex }, C2_MAY_BLOCK, ¶ms);
+ if (res != C2_OK) {
+ ALOGD("failed to query interface: %d", res);
+ return mInit;
+ }
+ if (params.size() != 1u) {
+ ALOGD("failed to query interface: unexpected vector size: %zu", params.size());
+ return mInit;
+ }
+ C2PortMimeConfig *mediaTypeConfig = (C2PortMimeConfig *)(params[0].get());
+ if (mediaTypeConfig == nullptr) {
+ ALOGD("failed to query media type");
+ return mInit;
+ }
+ traits->mediaType = mediaTypeConfig->m.value;
+ // TODO: get this properly.
+ traits->rank = 0x200;
+
+ // TODO: define these values properly
+ bool decoder = (traits->name.find("decoder") != std::string::npos);
+ traits->kind =
+ decoder ? C2Component::KIND_DECODER :
+ encoder ? C2Component::KIND_ENCODER :
+ C2Component::KIND_OTHER;
+ if (strncmp(traits->mediaType.c_str(), "audio/", 6) == 0) {
+ traits->domain = C2Component::DOMAIN_AUDIO;
+ } else if (strncmp(traits->mediaType.c_str(), "video/", 6) == 0) {
+ traits->domain = C2Component::DOMAIN_VIDEO;
+ } else if (strncmp(traits->mediaType.c_str(), "image/", 6) == 0) {
+ traits->domain = C2Component::DOMAIN_IMAGE;
+ } else {
+ traits->domain = C2Component::DOMAIN_OTHER;
+ }
+ }
+ mTraits = traits;
+
+ return mInit;
+}
+
+C2PlatformComponentStore::ComponentModule::~ComponentModule() {
+ ALOGV("in %s", __func__);
+ if (destroyFactory && mComponentFactory) {
+ destroyFactory(mComponentFactory);
+ }
+ if (mLibHandle) {
+ ALOGV("unloading dll");
+ dlclose(mLibHandle);
+ }
+}
+
+c2_status_t C2PlatformComponentStore::ComponentModule::createInterface(
+ c2_node_id_t id, std::shared_ptr<C2ComponentInterface> *interface,
+ std::function<void(::C2ComponentInterface*)> deleter) {
+ interface->reset();
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+ std::shared_ptr<ComponentModule> module = shared_from_this();
+ c2_status_t res = mComponentFactory->createInterface(
+ id, interface, [module, deleter](C2ComponentInterface *p) mutable {
+ // capture module so that we ensure we still have it while deleting interface
+ deleter(p); // delete interface first
+ module.reset(); // remove module ref (not technically needed)
+ });
+ return res;
+}
+
+c2_status_t C2PlatformComponentStore::ComponentModule::createComponent(
+ c2_node_id_t id, std::shared_ptr<C2Component> *component,
+ std::function<void(::C2Component*)> deleter) {
+ component->reset();
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+ std::shared_ptr<ComponentModule> module = shared_from_this();
+ c2_status_t res = mComponentFactory->createComponent(
+ id, component, [module, deleter](C2Component *p) mutable {
+ // capture module so that we ensure we still have it while deleting component
+ deleter(p); // delete component first
+ module.reset(); // remove module ref (not technically needed)
+ });
+ return res;
+}
+
+std::shared_ptr<const C2Component::Traits> C2PlatformComponentStore::ComponentModule::getTraits() {
+ std::unique_lock<std::recursive_mutex> lock(mLock);
+ return mTraits;
+}
+
+C2PlatformComponentStore::C2PlatformComponentStore()
+ : mReflector(std::make_shared<C2ReflectorHelper>()),
+ mInterface(mReflector) {
+
+ auto emplace = [this](const char *alias, const char *libPath) {
+ // ComponentLoader is neither copiable nor movable, so it must be
+ // constructed in-place. Now ComponentLoader takes two arguments in
+ // constructor, so we need to use piecewise_construct to achieve this
+ // behavior.
+ mComponents.emplace(
+ std::piecewise_construct,
+ std::forward_as_tuple(alias),
+ std::forward_as_tuple(alias, libPath));
+ mComponentsList.emplace_back(alias);
+ };
+ // TODO: move this also into a .so so it can be updated
+ emplace("c2.android.avc.decoder", "libstagefright_soft_c2avcdec.so");
+ emplace("c2.android.avc.encoder", "libstagefright_soft_c2avcenc.so");
+ emplace("c2.android.aac.decoder", "libstagefright_soft_c2aacdec.so");
+ emplace("c2.android.aac.encoder", "libstagefright_soft_c2aacenc.so");
+ emplace("c2.android.amrnb.decoder", "libstagefright_soft_c2amrnbdec.so");
+ emplace("c2.android.amrnb.encoder", "libstagefright_soft_c2amrnbenc.so");
+ emplace("c2.android.amrwb.decoder", "libstagefright_soft_c2amrwbdec.so");
+ emplace("c2.android.amrwb.encoder", "libstagefright_soft_c2amrwbenc.so");
+ emplace("c2.android.hevc.decoder", "libstagefright_soft_c2hevcdec.so");
+ emplace("c2.android.g711.alaw.decoder", "libstagefright_soft_c2g711alawdec.so");
+ emplace("c2.android.g711.mlaw.decoder", "libstagefright_soft_c2g711mlawdec.so");
+ emplace("c2.android.mpeg2.decoder", "libstagefright_soft_c2mpeg2dec.so");
+ emplace("c2.android.h263.decoder", "libstagefright_soft_c2h263dec.so");
+ emplace("c2.android.h263.encoder", "libstagefright_soft_c2h263enc.so");
+ emplace("c2.android.mpeg4.decoder", "libstagefright_soft_c2mpeg4dec.so");
+ emplace("c2.android.mpeg4.encoder", "libstagefright_soft_c2mpeg4enc.so");
+ emplace("c2.android.mp3.decoder", "libstagefright_soft_c2mp3dec.so");
+ emplace("c2.android.vorbis.decoder", "libstagefright_soft_c2vorbisdec.so");
+ emplace("c2.android.opus.decoder", "libstagefright_soft_c2opusdec.so");
+ emplace("c2.android.vp8.decoder", "libstagefright_soft_c2vp8dec.so");
+ emplace("c2.android.vp9.decoder", "libstagefright_soft_c2vp9dec.so");
+ emplace("c2.android.vp8.encoder", "libstagefright_soft_c2vp8enc.so");
+ emplace("c2.android.vp9.encoder", "libstagefright_soft_c2vp9enc.so");
+ emplace("c2.android.raw.decoder", "libstagefright_soft_c2rawdec.so");
+ emplace("c2.android.flac.decoder", "libstagefright_soft_c2flacdec.so");
+ emplace("c2.android.flac.encoder", "libstagefright_soft_c2flacenc.so");
+ emplace("c2.android.gsm.decoder", "libstagefright_soft_c2gsmdec.so");
+ emplace("c2.android.xaac.decoder", "libstagefright_soft_c2xaacdec.so");
+
+ // "Aliases"
+ // TODO: use aliases proper from C2Component::Traits
+ emplace("OMX.google.h264.decoder", "libstagefright_soft_c2avcdec.so");
+ emplace("OMX.google.h264.encoder", "libstagefright_soft_c2avcenc.so");
+ emplace("OMX.google.aac.decoder", "libstagefright_soft_c2aacdec.so");
+ emplace("OMX.google.aac.encoder", "libstagefright_soft_c2aacenc.so");
+ emplace("OMX.google.amrnb.decoder", "libstagefright_soft_c2amrnbdec.so");
+ emplace("OMX.google.amrnb.encoder", "libstagefright_soft_c2amrnbenc.so");
+ emplace("OMX.google.amrwb.decoder", "libstagefright_soft_c2amrwbdec.so");
+ emplace("OMX.google.amrwb.encoder", "libstagefright_soft_c2amrwbenc.so");
+ emplace("OMX.google.hevc.decoder", "libstagefright_soft_c2hevcdec.so");
+ emplace("OMX.google.g711.alaw.decoder", "libstagefright_soft_c2g711alawdec.so");
+ emplace("OMX.google.g711.mlaw.decoder", "libstagefright_soft_c2g711mlawdec.so");
+ emplace("OMX.google.mpeg2.decoder", "libstagefright_soft_c2mpeg2dec.so");
+ emplace("OMX.google.h263.decoder", "libstagefright_soft_c2h263dec.so");
+ emplace("OMX.google.h263.encoder", "libstagefright_soft_c2h263enc.so");
+ emplace("OMX.google.mpeg4.decoder", "libstagefright_soft_c2mpeg4dec.so");
+ emplace("OMX.google.mpeg4.encoder", "libstagefright_soft_c2mpeg4enc.so");
+ emplace("OMX.google.mp3.decoder", "libstagefright_soft_c2mp3dec.so");
+ emplace("OMX.google.vorbis.decoder", "libstagefright_soft_c2vorbisdec.so");
+ emplace("OMX.google.opus.decoder", "libstagefright_soft_c2opusdec.so");
+ emplace("OMX.google.vp8.decoder", "libstagefright_soft_c2vp8dec.so");
+ emplace("OMX.google.vp9.decoder", "libstagefright_soft_c2vp9dec.so");
+ emplace("OMX.google.vp8.encoder", "libstagefright_soft_c2vp8enc.so");
+ emplace("OMX.google.vp9.encoder", "libstagefright_soft_c2vp9enc.so");
+ emplace("OMX.google.raw.decoder", "libstagefright_soft_c2rawdec.so");
+ emplace("OMX.google.flac.decoder", "libstagefright_soft_c2flacdec.so");
+ emplace("OMX.google.flac.encoder", "libstagefright_soft_c2flacenc.so");
+ emplace("OMX.google.gsm.decoder", "libstagefright_soft_c2gsmdec.so");
+ emplace("OMX.google.xaac.decoder", "libstagefright_soft_c2xaacdec.so");
+}
+
+c2_status_t C2PlatformComponentStore::copyBuffer(
+ std::shared_ptr<C2GraphicBuffer> src, std::shared_ptr<C2GraphicBuffer> dst) {
+ (void)src;
+ (void)dst;
+ return C2_OMITTED;
+}
+
+c2_status_t C2PlatformComponentStore::query_sm(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ std::vector<std::unique_ptr<C2Param>> *const heapParams) const {
+ return mInterface.query(stackParams, heapParamIndices, C2_MAY_BLOCK, heapParams);
+}
+
+c2_status_t C2PlatformComponentStore::config_sm(
+ const std::vector<C2Param*> ¶ms,
+ std::vector<std::unique_ptr<C2SettingResult>> *const failures) {
+ return mInterface.config(params, C2_MAY_BLOCK, failures);
+}
+
+std::vector<std::shared_ptr<const C2Component::Traits>> C2PlatformComponentStore::listComponents() {
+ // This method SHALL return within 500ms.
+ std::vector<std::shared_ptr<const C2Component::Traits>> list;
+ for (const C2String &alias : mComponentsList) {
+ ComponentLoader &loader = mComponents.at(alias);
+ std::shared_ptr<ComponentModule> module;
+ c2_status_t res = loader.fetchModule(&module);
+ if (res == C2_OK) {
+ std::shared_ptr<const C2Component::Traits> traits = module->getTraits();
+ if (traits) {
+ list.push_back(traits);
+ }
+ }
+ }
+ return list;
+}
+
+c2_status_t C2PlatformComponentStore::findComponent(C2String name, ComponentLoader **loader) {
+ *loader = nullptr;
+ auto pos = mComponents.find(name);
+ // TODO: check aliases
+ if (pos == mComponents.end()) {
+ return C2_NOT_FOUND;
+ }
+ *loader = &pos->second;
+ return C2_OK;
+}
+
+c2_status_t C2PlatformComponentStore::createComponent(
+ C2String name, std::shared_ptr<C2Component> *const component) {
+ // This method SHALL return within 100ms.
+ component->reset();
+ ComponentLoader *loader;
+ c2_status_t res = findComponent(name, &loader);
+ if (res == C2_OK) {
+ std::shared_ptr<ComponentModule> module;
+ res = loader->fetchModule(&module);
+ if (res == C2_OK) {
+ // TODO: get a unique node ID
+ res = module->createComponent(0, component);
+ }
+ }
+ return res;
+}
+
+c2_status_t C2PlatformComponentStore::createInterface(
+ C2String name, std::shared_ptr<C2ComponentInterface> *const interface) {
+ // This method SHALL return within 100ms.
+ interface->reset();
+ ComponentLoader *loader;
+ c2_status_t res = findComponent(name, &loader);
+ if (res == C2_OK) {
+ std::shared_ptr<ComponentModule> module;
+ res = loader->fetchModule(&module);
+ if (res == C2_OK) {
+ // TODO: get a unique node ID
+ res = module->createInterface(0, interface);
+ }
+ }
+ return res;
+}
+
+c2_status_t C2PlatformComponentStore::querySupportedParams_nb(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const {
+ return mInterface.querySupportedParams(params);
+}
+
+c2_status_t C2PlatformComponentStore::querySupportedValues_sm(
+ std::vector<C2FieldSupportedValuesQuery> &fields) const {
+ return mInterface.querySupportedValues(fields, C2_MAY_BLOCK);
+}
+
+C2String C2PlatformComponentStore::getName() const {
+ return "android.componentStore.platform";
+}
+
+std::shared_ptr<C2ParamReflector> C2PlatformComponentStore::getParamReflector() const {
+ return mReflector;
+}
+
+std::shared_ptr<C2ComponentStore> GetCodec2PlatformComponentStore() {
+ static std::mutex mutex;
+ static std::weak_ptr<C2ComponentStore> platformStore;
+ std::lock_guard<std::mutex> lock(mutex);
+ std::shared_ptr<C2ComponentStore> store = platformStore.lock();
+ if (store == nullptr) {
+ store = std::make_shared<C2PlatformComponentStore>();
+ platformStore = store;
+ }
+ return store;
+}
+
+} // namespace android
diff --git a/media/codec2/vndk/include/C2AllocatorGralloc.h b/media/codec2/vndk/include/C2AllocatorGralloc.h
new file mode 100644
index 0000000..05d989e
--- /dev/null
+++ b/media/codec2/vndk/include/C2AllocatorGralloc.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef STAGEFRIGHT_CODEC2_ALLOCATOR_GRALLOC_H_
+#define STAGEFRIGHT_CODEC2_ALLOCATOR_GRALLOC_H_
+
+#include <functional>
+
+#include <C2Buffer.h>
+
+namespace android {
+
+/**
+ * Unwrap the native handle from a Codec2 handle allocated by C2AllocatorGralloc.
+ *
+ * @param handle a handle allocated by C2AllocatorGralloc. This includes handles returned for a
+ * graphic block allocation handle returned.
+ *
+ * @return a new NON-OWNING native handle that must be deleted using native_handle_delete.
+ */
+native_handle_t *UnwrapNativeCodec2GrallocHandle(const C2Handle *const handle);
+
+/**
+ * Wrap the gralloc handle and metadata into Codec2 handle recognized by
+ * C2AllocatorGralloc.
+ *
+ * @return a new NON-OWNING C2Handle that must be deleted using native_handle_delete.
+ */
+C2Handle *WrapNativeCodec2GrallocHandle(
+ const native_handle_t *const handle,
+ uint32_t width, uint32_t height, uint32_t format, uint64_t usage, uint32_t stride,
+ uint32_t generation = 0, uint64_t igbp_id = 0, uint32_t igbp_slot = 0);
+
+/**
+ * \todo Get this from the buffer
+ */
+void _UnwrapNativeCodec2GrallocMetadata(
+ const C2Handle *const handle,
+ uint32_t *width, uint32_t *height, uint32_t *format, uint64_t *usage, uint32_t *stride,
+ uint32_t *generation, uint64_t *igbp_id, uint32_t *igbp_slot);
+
+class C2AllocatorGralloc : public C2Allocator {
+public:
+ virtual id_t getId() const override;
+
+ virtual C2String getName() const override;
+
+ virtual std::shared_ptr<const Traits> getTraits() const override;
+
+ virtual c2_status_t newGraphicAllocation(
+ uint32_t width, uint32_t height, uint32_t format, C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicAllocation> *allocation) override;
+
+ virtual c2_status_t priorGraphicAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2GraphicAllocation> *allocation) override;
+
+ C2AllocatorGralloc(id_t id, bool bufferQueue = false);
+
+ c2_status_t status() const;
+
+ virtual ~C2AllocatorGralloc() override;
+
+ static bool isValid(const C2Handle* const o);
+
+private:
+ class Impl;
+ Impl *mImpl;
+};
+
+} // namespace android
+
+#endif // STAGEFRIGHT_CODEC2_ALLOCATOR_GRALLOC_H_
diff --git a/media/codec2/vndk/include/C2AllocatorIon.h b/media/codec2/vndk/include/C2AllocatorIon.h
new file mode 100644
index 0000000..1b2051f
--- /dev/null
+++ b/media/codec2/vndk/include/C2AllocatorIon.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef STAGEFRIGHT_CODEC2_ALLOCATOR_ION_H_
+#define STAGEFRIGHT_CODEC2_ALLOCATOR_ION_H_
+
+#include <functional>
+#include <list>
+#include <mutex>
+#include <tuple>
+#include <unordered_map>
+
+#include <C2Buffer.h>
+
+namespace android {
+
+class C2AllocatorIon : public C2Allocator {
+public:
+ // Usage mapper function used by the allocator
+ // (usage, capacity) => (align, heapMask, flags)
+ //
+ // capacity is aligned to the default block-size (defaults to page size) to reduce caching
+ // overhead
+ typedef std::function<c2_status_t(C2MemoryUsage, size_t,
+ /* => */ size_t*, unsigned*, unsigned*)> UsageMapperFn;
+
+ virtual id_t getId() const override;
+
+ virtual C2String getName() const override;
+
+ virtual std::shared_ptr<const Traits> getTraits() const override;
+
+ virtual c2_status_t newLinearAllocation(
+ uint32_t capacity, C2MemoryUsage usage,
+ std::shared_ptr<C2LinearAllocation> *allocation) override;
+
+ virtual c2_status_t priorLinearAllocation(
+ const C2Handle *handle,
+ std::shared_ptr<C2LinearAllocation> *allocation) override;
+
+ C2AllocatorIon(id_t id);
+
+ virtual c2_status_t status() const { return mInit; }
+
+ virtual ~C2AllocatorIon() override;
+
+ static bool isValid(const C2Handle* const o);
+
+ /**
+ * Updates the usage mapper for subsequent new allocations, as well as the supported
+ * minimum and maximum usage masks and default block-size to use for the mapper.
+ *
+ * \param mapper this method is called to map Codec 2.0 buffer usage to ion flags
+ * required by the ion device
+ * \param minUsage minimum buffer usage required for supported allocations (defaults to 0)
+ * \param maxUsage maximum buffer usage supported by the ion allocator (defaults to SW_READ
+ * | SW_WRITE)
+ * \param blockSize alignment used prior to calling |mapper| for the buffer capacity.
+ * This also helps reduce the size of cache required for caching mapper results.
+ * (defaults to the page size)
+ */
+ void setUsageMapper(
+ const UsageMapperFn &mapper, uint64_t minUsage, uint64_t maxUsage, uint64_t blockSize);
+
+private:
+ c2_status_t mapUsage(C2MemoryUsage usage, size_t size,
+ /* => */ size_t *align, unsigned *heapMask, unsigned *flags);
+
+ c2_status_t mInit;
+ int mIonFd;
+
+ // this locks mTraits, mBlockSize, mUsageMapper, mUsageMapperLru and mUsageMapperCache
+ mutable std::mutex mUsageMapperLock;
+ std::shared_ptr<const Traits> mTraits;
+ size_t mBlockSize;
+ UsageMapperFn mUsageMapper;
+ typedef std::pair<uint64_t, size_t> MapperKey;
+ struct MapperKeyHash {
+ std::size_t operator()(const MapperKey &) const;
+ };
+ typedef std::tuple<size_t, unsigned, unsigned, c2_status_t> MapperValue;
+ typedef std::pair<MapperKey, MapperValue> MapperKeyValue;
+ typedef std::list<MapperKeyValue>::iterator MapperKeyValuePointer;
+ std::list<MapperKeyValue> mUsageMapperLru;
+ std::unordered_map<MapperKey, MapperKeyValuePointer, MapperKeyHash> mUsageMapperCache;
+};
+
+} // namespace android
+
+#endif // STAGEFRIGHT_CODEC2_ALLOCATOR_ION_H_
diff --git a/media/codec2/vndk/include/C2BqBufferPriv.h b/media/codec2/vndk/include/C2BqBufferPriv.h
new file mode 100644
index 0000000..9271a71
--- /dev/null
+++ b/media/codec2/vndk/include/C2BqBufferPriv.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef STAGEFRIGHT_CODEC2_BQ_BUFFER_PRIV_H_
+#define STAGEFRIGHT_CODEC2_BQ_BUFFER_PRIV_H_
+
+#include <functional>
+
+#include <C2Buffer.h>
+#include <media/stagefright/bqhelper/WGraphicBufferProducer.h>
+
+class C2BufferQueueBlockPool : public C2BlockPool {
+public:
+ C2BufferQueueBlockPool(const std::shared_ptr<C2Allocator> &allocator, const local_id_t localId);
+
+ virtual ~C2BufferQueueBlockPool() override;
+
+ virtual C2Allocator::id_t getAllocatorId() const override {
+ return mAllocator->getId();
+ };
+
+ virtual local_id_t getLocalId() const override {
+ return mLocalId;
+ };
+
+ virtual c2_status_t fetchGraphicBlock(
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block /* nonnull */) override;
+
+ typedef std::function<void(uint64_t producer, int32_t slot, int64_t nsecs)> OnRenderCallback;
+
+ /**
+ * Sets render callback.
+ *
+ * \param renderCallbak callback to call for all dequeue buffer.
+ */
+ virtual void setRenderCallback(const OnRenderCallback &renderCallback = OnRenderCallback());
+
+ /**
+ * Configures an IGBP in order to create blocks. A newly created block is
+ * dequeued from the configured IGBP. Unique Id of IGBP and the slot number of
+ * blocks are passed via native_handle. Managing IGBP is responsibility of caller.
+ * When IGBP is not configured, block will be created via allocator.
+ * Since zero is not used for Unique Id of IGBP, if IGBP is not configured or producer
+ * is configured as nullptr, unique id which is bundled in native_handle is zero.
+ *
+ * \param producer the IGBP, which will be used to fetch blocks
+ */
+ virtual void configureProducer(const android::sp<android::HGraphicBufferProducer> &producer);
+
+private:
+ const std::shared_ptr<C2Allocator> mAllocator;
+ const local_id_t mLocalId;
+
+ class Impl;
+ std::shared_ptr<Impl> mImpl;
+
+ friend struct C2BufferQueueBlockPoolData;
+};
+
+#endif // STAGEFRIGHT_CODEC2_BUFFER_PRIV_H_
diff --git a/media/codec2/vndk/include/C2BufferPriv.h b/media/codec2/vndk/include/C2BufferPriv.h
new file mode 100644
index 0000000..d0b9152
--- /dev/null
+++ b/media/codec2/vndk/include/C2BufferPriv.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef STAGEFRIGHT_CODEC2_BUFFER_PRIV_H_
+#define STAGEFRIGHT_CODEC2_BUFFER_PRIV_H_
+
+#include <functional>
+
+#include <C2Buffer.h>
+#include <android/hardware/media/bufferpool/1.0/IAccessor.h>
+
+class C2BasicLinearBlockPool : public C2BlockPool {
+public:
+ explicit C2BasicLinearBlockPool(const std::shared_ptr<C2Allocator> &allocator);
+
+ virtual ~C2BasicLinearBlockPool() override = default;
+
+ virtual C2Allocator::id_t getAllocatorId() const override {
+ return mAllocator->getId();
+ }
+
+ virtual local_id_t getLocalId() const override {
+ return BASIC_LINEAR;
+ }
+
+ virtual c2_status_t fetchLinearBlock(
+ uint32_t capacity,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2LinearBlock> *block /* nonnull */) override;
+
+ // TODO: fetchCircularBlock
+
+private:
+ const std::shared_ptr<C2Allocator> mAllocator;
+};
+
+class C2BasicGraphicBlockPool : public C2BlockPool {
+public:
+ explicit C2BasicGraphicBlockPool(const std::shared_ptr<C2Allocator> &allocator);
+
+ virtual ~C2BasicGraphicBlockPool() override = default;
+
+ virtual C2Allocator::id_t getAllocatorId() const override {
+ return mAllocator->getId();
+ }
+
+ virtual local_id_t getLocalId() const override {
+ return BASIC_GRAPHIC;
+ }
+
+ virtual c2_status_t fetchGraphicBlock(
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block /* nonnull */) override;
+
+private:
+ const std::shared_ptr<C2Allocator> mAllocator;
+};
+
+class C2PooledBlockPool : public C2BlockPool {
+public:
+ C2PooledBlockPool(const std::shared_ptr<C2Allocator> &allocator, const local_id_t localId);
+
+ virtual ~C2PooledBlockPool() override;
+
+ virtual C2Allocator::id_t getAllocatorId() const override {
+ return mAllocator->getId();
+ }
+
+ virtual local_id_t getLocalId() const override {
+ return mLocalId;
+ }
+
+ virtual c2_status_t fetchLinearBlock(
+ uint32_t capacity,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2LinearBlock> *block /* nonnull */) override;
+
+ virtual c2_status_t fetchGraphicBlock(
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block) override;
+
+ /**
+ * Retrieves the connection Id for underlying bufferpool
+ */
+ int64_t getConnectionId();
+
+ /**
+ * Retrieves the accessor which is used by underlying bufferpool. (It can be
+ * passed to receiving process.)
+ *
+ * \param accessor IAccessor will be written to this out parameter.
+ *
+ * \return true IAcessor is writen successfully.
+ * \return false IAccessor is not written.
+ */
+ bool getAccessor(android::sp<android::hardware::media::bufferpool::V1_0::IAccessor> *accessor);
+
+private:
+ const std::shared_ptr<C2Allocator> mAllocator;
+ const local_id_t mLocalId;
+
+ class Impl;
+ std::unique_ptr<Impl> mImpl;
+};
+
+#endif // STAGEFRIGHT_CODEC2_BUFFER_PRIV_H_
diff --git a/media/codec2/vndk/include/C2ComponentFactory.h b/media/codec2/vndk/include/C2ComponentFactory.h
new file mode 100644
index 0000000..f6d8b98
--- /dev/null
+++ b/media/codec2/vndk/include/C2ComponentFactory.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef STAGEFRIGHT_CODEC2_COMPONENT_FACTORY_H_
+#define STAGEFRIGHT_CODEC2_COMPONENT_FACTORY_H_
+
+#include <C2Component.h>
+
+#include <functional>
+#include <memory>
+
+/**
+ * Component factory object that enables to create a component and/or interface from a dynamically
+ * linked library. This is needed because the component/interfaces are managed objects, but we
+ * cannot safely create a managed object and pass it in C.
+ *
+ * Components/interfaces typically inherit from std::enable_shared_from_this, but C requires
+ * passing simple pointer, and shared_ptr constructor needs to know the class to be constructed
+ * derives from enable_shared_from_this.
+ *
+ */
+class C2ComponentFactory {
+public:
+ typedef std::function<void(::C2Component*)> ComponentDeleter;
+ typedef std::function<void(::C2ComponentInterface*)> InterfaceDeleter;
+
+ /**
+ * Creates a component.
+ *
+ * This method SHALL return within 100ms.
+ *
+ * \param id component ID for the created component
+ * \param component shared pointer where the created component is stored. Cleared on
+ * failure and updated on success.
+ *
+ * \retval C2_OK the component was created successfully
+ * \retval C2_TIMED_OUT could not create the component within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the creation of the component (unexpected)
+ *
+ * \retval C2_NO_MEMORY not enough memory to create the component
+ */
+ virtual c2_status_t createComponent(
+ c2_node_id_t id, std::shared_ptr<C2Component>* const component,
+ ComponentDeleter deleter = std::default_delete<C2Component>()) = 0;
+
+ /**
+ * Creates a component interface.
+ *
+ * This method SHALL return within 100ms.
+ *
+ * \param id component interface ID for the created interface
+ * \param interface shared pointer where the created interface is stored. Cleared on
+ * failure and updated on success.
+ *
+ * \retval C2_OK the component interface was created successfully
+ * \retval C2_TIMED_OUT could not create the component interface within the time limit
+ * (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the creation of the component interface
+ * (unexpected)
+ *
+ * \retval C2_NO_MEMORY not enough memory to create the component interface
+ */
+ virtual c2_status_t createInterface(
+ c2_node_id_t id, std::shared_ptr<C2ComponentInterface>* const interface,
+ InterfaceDeleter deleter = std::default_delete<C2ComponentInterface>()) = 0;
+
+ virtual ~C2ComponentFactory() = default;
+
+ typedef ::C2ComponentFactory* (*CreateCodec2FactoryFunc)(void);
+ typedef void (*DestroyCodec2FactoryFunc)(::C2ComponentFactory*);
+};
+
+
+#endif // STAGEFRIGHT_CODEC2_COMPONENT_FACTORY_H_
diff --git a/media/codec2/vndk/include/C2Debug.h b/media/codec2/vndk/include/C2Debug.h
new file mode 100644
index 0000000..af1cdab
--- /dev/null
+++ b/media/codec2/vndk/include/C2Debug.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_DEBUG_H_
+#define C2UTILS_DEBUG_H_
+
+#include <util/C2Debug-log.h>
+
+// To allow arbitrary ordering of C2Debug.h and API headers and to keep debug utilities separately
+// from the API definitions, we provide API header specific debug headers.
+#ifdef C2PARAM_H_
+#include <util/C2Debug-param.h>
+#endif
+
+#endif // C2UTILS_DEBUG_H_
diff --git a/media/codec2/vndk/include/C2ErrnoUtils.h b/media/codec2/vndk/include/C2ErrnoUtils.h
new file mode 100644
index 0000000..5b995f6
--- /dev/null
+++ b/media/codec2/vndk/include/C2ErrnoUtils.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef STAGEFRIGHT_CODEC2_ERRNO_UTILS_H_
+#define STAGEFRIGHT_CODEC2_ERRNO_UTILS_H_
+
+#include <errno.h>
+#include <C2.h>
+
+// standard ERRNO mappings
+template<int N> constexpr c2_status_t _c2_errno2status_impl();
+template<> constexpr c2_status_t _c2_errno2status_impl<0>() { return C2_OK; }
+template<> constexpr c2_status_t _c2_errno2status_impl<EINVAL>() { return C2_BAD_VALUE; }
+template<> constexpr c2_status_t _c2_errno2status_impl<EACCES>() { return C2_REFUSED; }
+template<> constexpr c2_status_t _c2_errno2status_impl<EPERM>() { return C2_REFUSED; }
+template<> constexpr c2_status_t _c2_errno2status_impl<ENOMEM>() { return C2_NO_MEMORY; }
+
+// map standard errno-s to the equivalent c2_status_t
+template<int... N> struct _c2_map_errno_impl;
+template<int E, int ... N> struct _c2_map_errno_impl<E, N...> {
+ static c2_status_t map(int result) {
+ if (result == E) {
+ return _c2_errno2status_impl <E>();
+ } else {
+ return _c2_map_errno_impl<N...>::map(result);
+ }
+ }
+};
+template<> struct _c2_map_errno_impl<> {
+ static c2_status_t map(int result) {
+ return result == 0 ? C2_OK : C2_CORRUPTED;
+ }
+};
+
+template<int... N>
+c2_status_t c2_map_errno(int result) {
+ return _c2_map_errno_impl<N...>::map(result);
+}
+
+#endif // STAGEFRIGHT_CODEC2_ERRNO_UTILS_H_
+
diff --git a/media/codec2/vndk/include/C2PlatformStorePluginLoader.h b/media/codec2/vndk/include/C2PlatformStorePluginLoader.h
new file mode 100644
index 0000000..4c10643
--- /dev/null
+++ b/media/codec2/vndk/include/C2PlatformStorePluginLoader.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef STAGEFRIGHT_C2_PLATFORM_STORE_PLUGIN_LOADER_H_
+
+#define STAGEFRIGHT_C2_PLATFORM_STORE_PLUGIN_LOADER_H_
+
+#include <memory>
+
+#include <utils/Mutex.h>
+
+#include <C2.h>
+#include <C2Buffer.h>
+
+/**
+ * Extern C interface for creating block pool from platform store extension.
+ *
+ * \param alloctorId the ID of the backing allocator type.
+ * \parem blockPoolId the ID of created block pool.
+ *
+ * \return pointer of created C2BlockPool, nullptr on error.
+ */
+typedef ::C2BlockPool* (*CreateBlockPoolFunc)(::C2Allocator::id_t, ::C2BlockPool::local_id_t);
+
+/**
+ * Extern C interface for creating allocator from platform store extension.
+ *
+ * \param alloctorId the ID of the allocator to create.
+ * \param status the returned status from creating allocator.
+ *
+ * \return pointer of created C2Allocator, nullptr on error.
+ */
+typedef ::C2Allocator* (*CreateAllocatorFunc)(::C2Allocator::id_t, ::c2_status_t*);
+
+class C2PlatformStorePluginLoader {
+public:
+ static const std::unique_ptr<C2PlatformStorePluginLoader>& GetInstance();
+ ~C2PlatformStorePluginLoader();
+
+ /**
+ * Creates block pool from platform store extension.
+ *
+ * \param alloctorId the ID of the backing allocator type.
+ * \param blockPoolId the ID of created block pool.
+ * \param pool shared pointer where the created block pool is stored.
+ *
+ * \retval C2_OK the block pool was created successfully.
+ * \retval C2_NOT_FOUND the extension symbol was not found.
+ * \retval C2_BAD_INDEX the input allocatorId is not defined in platform store extension.
+ */
+ c2_status_t createBlockPool(::C2Allocator::id_t allocatorId,
+ ::C2BlockPool::local_id_t blockPoolId,
+ std::shared_ptr<C2BlockPool>* pool);
+
+ /**
+ * Creates allocator from platform store extension.
+ *
+ * Note that this allocator is not created as shared singleton as C2AllocatorStore does, because
+ * C interface only allows raw pointer transmission for extension.
+ *
+ * \param alloctorId the ID of the allocator to create.
+ * \param allocator shared pointer where the created allocator is stored.
+ *
+ * \retval C2_OK the allocator was created successfully.
+ * \retval C2_TIMED_OUT could not create the allocator within the time limit (unexpected)
+ * \retval C2_CORRUPTED some unknown error prevented the creation of the allocator (unexpected)
+ * \retval C2_NOT_FOUND the extension symbol was not found.
+ * \retval C2_BAD_INDEX the input allocatorId is not defined in platform store extension.
+ * \retval C2_NO_MEMORY not enough memory to create the allocator
+ */
+ c2_status_t createAllocator(::C2Allocator::id_t allocatorId,
+ std::shared_ptr<C2Allocator>* const allocator);
+
+private:
+ explicit C2PlatformStorePluginLoader(const char *libPath);
+
+ static android::Mutex sMutex;
+ static std::unique_ptr<C2PlatformStorePluginLoader> sInstance;
+
+ void *mLibHandle;
+ CreateBlockPoolFunc mCreateBlockPool;
+ CreateAllocatorFunc mCreateAllocator;
+};
+
+#endif // STAGEFRIGHT_C2_PLATFORM_STORE_PLUGIN_LOADER_H_
diff --git a/media/codec2/vndk/include/C2PlatformSupport.h b/media/codec2/vndk/include/C2PlatformSupport.h
new file mode 100644
index 0000000..f31282c
--- /dev/null
+++ b/media/codec2/vndk/include/C2PlatformSupport.h
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef STAGEFRIGHT_CODEC2_PLATFORM_SUPPORT_H_
+#define STAGEFRIGHT_CODEC2_PLATFORM_SUPPORT_H_
+
+#include <C2Component.h>
+#include <C2ComponentFactory.h>
+
+#include <memory>
+
+namespace android {
+
+/**
+ * Returns the platform allocator store.
+ * \retval nullptr if the platform allocator store could not be obtained
+ */
+std::shared_ptr<C2AllocatorStore> GetCodec2PlatformAllocatorStore();
+
+/**
+ * Platform allocator store IDs
+ */
+class C2PlatformAllocatorStore : public C2AllocatorStore {
+public:
+ enum : id_t {
+ /**
+ * ID of the ion backed platform allocator.
+ *
+ * C2Handle consists of:
+ * fd shared ion buffer handle
+ * int size (lo 32 bits)
+ * int size (hi 32 bits)
+ * int magic '\xc2io\x00'
+ */
+ ION = PLATFORM_START,
+
+ /**
+ * ID of the gralloc backed platform allocator.
+ *
+ * C2Handle layout is not public. Use C2AllocatorGralloc::UnwrapNativeCodec2GrallocHandle
+ * to get the underlying gralloc handle from a C2Handle, and WrapNativeCodec2GrallocHandle
+ * to create a C2Handle from a gralloc handle - for C2Allocator::priorAllocation.
+ */
+ GRALLOC,
+
+ /**
+ * ID of the bufferqueue backed platform allocator.
+ *
+ * C2Handle layout is not public. Use C2AllocatorGralloc::UnwrapNativeCodec2GrallocHandle
+ * to get the underlying handle from a C2Handle, and WrapNativeCodec2GrallocHandle
+ * to create a C2Handle from a handle - for C2Allocator::priorAllocation.
+ */
+ BUFFERQUEUE,
+
+ /**
+ * ID of indicating the end of platform allocator definition.
+ *
+ * \note always put this macro in the last place.
+ *
+ * Extended platform store plugin should use this macro as the start ID of its own allocator
+ * types.
+ */
+ PLATFORM_END,
+ };
+};
+
+/**
+ * Retrieves a block pool for a component.
+ *
+ * \param id the local ID of the block pool
+ * \param component the component using the block pool (must be non-null)
+ * \param pool pointer to where the obtained block pool shall be stored on success. nullptr
+ * will be stored here on failure
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_BAD_VALUE the component is null
+ * \retval C2_NOT_FOUND if the block pool does not exist
+ * \retval C2_NO_MEMORY not enough memory to fetch the block pool (this return value is only
+ * possible for basic pools)
+ * \retval C2_TIMED_OUT the operation timed out (this return value is only possible for basic pools)
+ * \retval C2_REFUSED no permission to complete any required allocation (this return value is only
+ * possible for basic pools)
+ * \retval C2_CORRUPTED some unknown, unrecoverable error occured during operation (unexpected,
+ * this return value is only possible for basic pools)
+ */
+c2_status_t GetCodec2BlockPool(
+ C2BlockPool::local_id_t id, std::shared_ptr<const C2Component> component,
+ std::shared_ptr<C2BlockPool> *pool);
+
+/**
+ * Creates a block pool.
+ * \param allocatorId the allocator ID which is used to allocate blocks
+ * \param component the component using the block pool (must be non-null)
+ * \param pool pointer to where the created block pool shall be store on success.
+ * nullptr will be stored here on failure
+ *
+ * \retval C2_OK the operation was successful
+ * \retval C2_BAD_VALUE the component is null
+ * \retval C2_NOT_FOUND if the allocator does not exist
+ * \retval C2_NO_MEMORY not enough memory to create a block pool
+ */
+c2_status_t CreateCodec2BlockPool(
+ C2PlatformAllocatorStore::id_t allocatorId,
+ std::shared_ptr<const C2Component> component,
+ std::shared_ptr<C2BlockPool> *pool);
+
+/**
+ * Returns the platform component store.
+ * \retval nullptr if the platform component store could not be obtained
+ */
+std::shared_ptr<C2ComponentStore> GetCodec2PlatformComponentStore();
+
+/**
+ * Sets the preferred component store in this process for the sole purpose of accessing its
+ * interface. If this is not called, the default IComponentStore HAL (if exists) is the preferred
+ * store for this purpose. If the default IComponentStore HAL is not present, the platform
+ * component store is used.
+ */
+void SetPreferredCodec2ComponentStore(std::shared_ptr<C2ComponentStore> store);
+
+} // namespace android
+
+#endif // STAGEFRIGHT_CODEC2_PLATFORM_SUPPORT_H_
diff --git a/media/codec2/vndk/include/android-C2Debug-log.h b/media/codec2/vndk/include/android-C2Debug-log.h
new file mode 100644
index 0000000..5910228
--- /dev/null
+++ b/media/codec2/vndk/include/android-C2Debug-log.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_ANDROID_DEBUG_LOG_H_
+#define C2UTILS_ANDROID_DEBUG_LOG_H_
+
+/*
+ * Android provides logging and debug macros. Redefine them with C2 prefix and add support for
+ * opting out of verbose logs.
+ */
+
+#ifdef C2_LOG_TAG
+#define LOG_TAG C2_LOG_TAG
+#endif
+
+#include <android-base/logging.h>
+
+#ifdef C2_LOG_VERBOSE
+#define C2_LOG(LEVEL) LOG(::android::base::LEVEL)
+#else
+/**
+ * Use as follows:
+ *
+ * #define C2_LOG_TAG "tag"
+ * //#define C2_LOG_VERBOSE // enable verbose logs in this file
+ * #include <C2Debug.h>
+ *
+ * C2_LOG(DEBUG) << expr ...;
+ *
+ * Log levels are: VERBOSE, DEBUG, INFO, WARNING, ERROR, FATAL (aborts).
+ *
+ * No endl is required.
+ */
+#define C2_LOG(LEVEL) \
+ (::android::base::LEVEL != ::android::base::VERBOSE) && LOG(::android::base::LEVEL)
+#endif
+
+#define C2_CHECK CHECK
+#define C2_CHECK_LT CHECK_LT
+#define C2_CHECK_LE CHECK_LE
+#define C2_CHECK_EQ CHECK_EQ
+#define C2_CHECK_GE CHECK_GE
+#define C2_CHECK_GT CHECK_GT
+#define C2_CHECK_NE CHECK_NE
+
+#define C2_DCHECK DCHECK
+#define C2_DCHECK_LT DCHECK_LT
+#define C2_DCHECK_LE DCHECK_LE
+#define C2_DCHECK_EQ DCHECK_EQ
+#define C2_DCHECK_GE DCHECK_GE
+#define C2_DCHECK_GT DCHECK_GT
+#define C2_DCHECK_NE DCHECK_NE
+
+#endif // C2UTILS_ANDROID_DEBUG_LOG_H_
diff --git a/media/codec2/vndk/include/util/C2Debug-base.h b/media/codec2/vndk/include/util/C2Debug-base.h
new file mode 100644
index 0000000..a040e42
--- /dev/null
+++ b/media/codec2/vndk/include/util/C2Debug-base.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_DEBUG_BASE_H_
+#define C2UTILS_DEBUG_BASE_H_
+
+#include <iostream>
+
+/**
+ * Debug print utilities for Codec 2.0 base objects.
+ */
+
+#define C2_DECLARE_AS_STRING_AND_DEFINE_STREAM_OUT(type) \
+const char *asString(type i, const char *def = "??"); \
+inline std::ostream& operator<<(std::ostream& os, const type &i) { \
+ return os << asString(i); \
+}
+
+C2_DECLARE_AS_STRING_AND_DEFINE_STREAM_OUT(c2_status_t)
+
+
+#endif // C2UTILS_DEBUG_BASE_H_
+
diff --git a/media/codec2/vndk/include/util/C2Debug-interface.h b/media/codec2/vndk/include/util/C2Debug-interface.h
new file mode 100644
index 0000000..3f31875
--- /dev/null
+++ b/media/codec2/vndk/include/util/C2Debug-interface.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_DEBUG_INTERFACE_H_
+#define C2UTILS_DEBUG_INTERFACE_H_
+
+#include <util/C2Debug-base.h>
+#include <util/C2InterfaceUtils.h>
+
+#include <iostream>
+
+template<typename T>
+std::ostream& operator<<(std::ostream& os, const C2SupportedRange<T> &i);
+
+template<typename T>
+std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<T> &i);
+
+template<typename T>
+std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<T> &i);
+
+#endif // C2UTILS_DEBUG_INTERFACE_H_
diff --git a/media/codec2/vndk/include/util/C2Debug-log.h b/media/codec2/vndk/include/util/C2Debug-log.h
new file mode 100644
index 0000000..195c4c1
--- /dev/null
+++ b/media/codec2/vndk/include/util/C2Debug-log.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_DEBUG_LOG_H_
+#define C2UTILS_DEBUG_LOG_H_
+
+// Platform specific debug utilities
+#ifdef __ANDROID__
+#include <android-C2Debug-log.h>
+#else
+// TODO: implement base debug utils
+#endif
+
+#endif // C2UTILS_DEBUG_LOG_H_
diff --git a/media/codec2/vndk/include/util/C2Debug-param.h b/media/codec2/vndk/include/util/C2Debug-param.h
new file mode 100644
index 0000000..e1c1de0
--- /dev/null
+++ b/media/codec2/vndk/include/util/C2Debug-param.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_DEBUG_PARAM_H_
+#define C2UTILS_DEBUG_PARAM_H_
+
+#include <C2Param.h>
+#include <util/C2Debug-base.h>
+
+#include <iostream>
+
+/**
+ * Debug/print declarations for objects defined in C2Param.h
+ */
+C2_DECLARE_AS_STRING_AND_DEFINE_STREAM_OUT(C2FieldDescriptor::type_t)
+
+std::ostream& operator<<(std::ostream& os, const C2Param::CoreIndex &i);
+std::ostream& operator<<(std::ostream& os, const C2Param::Type &i);
+std::ostream& operator<<(std::ostream& os, const C2Param::Index &i);
+std::ostream& operator<<(std::ostream& os, const _C2FieldId &i);
+std::ostream& operator<<(std::ostream& os, const C2FieldDescriptor &i);
+std::ostream& operator<<(std::ostream& os, const C2ParamField &i);
+
+#endif // C2UTILS_DEBUG_PARAM_H_
diff --git a/media/codec2/vndk/include/util/C2InterfaceHelper.h b/media/codec2/vndk/include/util/C2InterfaceHelper.h
new file mode 100644
index 0000000..bfb43af
--- /dev/null
+++ b/media/codec2/vndk/include/util/C2InterfaceHelper.h
@@ -0,0 +1,752 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_INTERFACE_HELPER_H_
+#define C2UTILS_INTERFACE_HELPER_H_
+
+#include <C2Component.h>
+#include <util/C2InterfaceUtils.h>
+
+#include <map>
+#include <mutex>
+#include <vector>
+
+#include <stddef.h>
+
+/**
+ * Interface Helper
+ */
+using C2R = C2SettingResultsBuilder;
+
+template<typename T, bool E=std::is_enum<T>::value>
+struct _c2_reduce_enum_to_underlying_type {
+ typedef T type;
+};
+
+template<typename T>
+struct _c2_reduce_enum_to_underlying_type<T, true> {
+ typedef typename std::underlying_type<T>::type type;
+};
+
+/**
+ * Helper class to implement parameter reflectors. This class is dynamic and is designed to be
+ * shared by multiple interfaces. This allows interfaces to add structure descriptors as needed.
+ */
+class C2ReflectorHelper : public C2ParamReflector {
+public:
+ C2ReflectorHelper() = default;
+ virtual ~C2ReflectorHelper() = default;
+ virtual std::unique_ptr<C2StructDescriptor> describe(
+ C2Param::CoreIndex paramIndex) const override;
+
+ /**
+ * Adds support for describing the given parameters.
+ *
+ * \param Params types of codec 2.0 structs (or parameters) to describe
+ */
+ template<typename... Params>
+ C2_INLINE void addStructDescriptors() {
+ std::vector<C2StructDescriptor> structs;
+ addStructDescriptors(structs, (_Tuple<Params...> *)nullptr);
+ }
+
+ /**
+ * Adds support for describing a specific struct.
+ *
+ * \param strukt descriptor for the struct that will be moved out.
+ */
+ void addStructDescriptor(C2StructDescriptor &&strukt);
+
+private:
+ template<typename... Params>
+ class C2_HIDE _Tuple { };
+
+ /**
+ * Adds support for describing the given descriptors.
+ *
+ * \param structs List of structure descriptors to add support for
+ */
+ void addStructDescriptors(
+ std::vector<C2StructDescriptor> &structs, _Tuple<> *);
+
+ /**
+ * Utility method that adds support for describing the given descriptors in a recursive manner
+ * one structure at a time using a list of structure descriptors temporary.
+ *
+ * \param T the type of codec 2.0 struct to describe
+ * \param Params rest of the structs
+ * \param structs Temporary list of structure descriptors used to optimize the operation.
+ */
+ template<typename T, typename... Params>
+ C2_INLINE void addStructDescriptors(
+ std::vector<C2StructDescriptor> &structs, _Tuple<T, Params...> *) {
+ structs.emplace_back((T*)nullptr);
+ addStructDescriptors(structs, (_Tuple<Params...> *)nullptr);
+ }
+
+ mutable std::mutex _mMutex;
+ std::map<C2Param::CoreIndex, const C2StructDescriptor> _mStructs; ///< descriptors
+};
+
+/**
+ * Utility class that implements the codec 2.0 interface API-s for some parameters.
+ *
+ * This class must be subclassed.
+ */
+class C2InterfaceHelper {
+public:
+ /**
+ * Returns the base offset of a field at |offset| that could be part of an array or part of a
+ * sub-structure.
+ *
+ * This method does not do field size verification, e.g. if offset if obtained from a structure,
+ * it will not stop at the structure boundary - this is okay, as we just want the base offset
+ * here, which is the same.
+ */
+ static
+ size_t GetBaseOffset(const std::shared_ptr<C2ParamReflector> &reflector,
+ C2Param::CoreIndex index, size_t offset);
+
+ /**
+ * The interface helper class uses references to std::shared_ptr<T> config parameters.
+ * Internally, these need to be generalized to std::shared_ptr<C2Param> refs, but the cast is
+ * not allowed (as these are references). As such, this class never returns pointer to the
+ * shared_ptrs.
+ */
+ struct ParamRef {
+ template<typename T, typename enable=
+ typename std::enable_if<std::is_convertible<T, C2Param>::value>::type>
+ inline C2_HIDE ParamRef(std::shared_ptr<T> ¶m)
+ : _mRef(reinterpret_cast<std::shared_ptr<C2Param>*>(¶m)) { }
+
+ // used by comparison operator for containers
+ operator std::shared_ptr<C2Param> *() const { return _mRef; }
+
+ /**
+ * Returns a shared pointer to the parameter.
+ */
+ std::shared_ptr<C2Param> get() const { return *_mRef; }
+
+ private:
+ std::shared_ptr<C2Param> *_mRef;
+ };
+
+ /**
+ * Field helper.
+ *
+ * Contains additional information for the field: possible values, and currently supported
+ * values.
+ */
+ class FieldHelper {
+ public:
+ /**
+ * Creates helper for a field with given possible values.
+ *
+ * \param param parameter reference. The parameter does not have to be initialized at this
+ * point.
+ * \param field field identifier
+ * \param values possible values for the field
+ */
+ FieldHelper(const ParamRef ¶m, const _C2FieldId &field,
+ std::unique_ptr<C2FieldSupportedValues> &&values);
+
+ /**
+ * Creates a param-field identifier for this field. This method is called after the
+ * underlying parameter has been initialized.
+ *
+ * \aram index
+ *
+ * @return C2ParamField
+ */
+ C2ParamField makeParamField(C2Param::Index index) const;
+
+ /**
+ * Sets the currently supported values for this field.
+ *
+ * \param values currently supported values that will be moved out
+ */
+ void setSupportedValues(std::unique_ptr<C2FieldSupportedValues> &&values);
+
+ /**
+ * Gets the currently supported values for this field. This defaults to the possible values
+ * if currently supported values were never set.
+ */
+ const C2FieldSupportedValues *getSupportedValues() const;
+
+ /**
+ * Gets the possible values for this field.
+ */
+ const C2FieldSupportedValues *getPossibleValues() const;
+
+ protected:
+ // TODO: move to impl for safety
+ ParamRef mParam;
+ _C2FieldId mFieldId;
+ std::unique_ptr<C2FieldSupportedValues> mPossible;
+ std::unique_ptr<C2FieldSupportedValues> mSupported; ///< if different from possible
+ };
+
+ template<typename T>
+ struct C2_HIDE Param;
+ class ParamHelper;
+
+ /**
+ * Factory is an interface to get the parameter helpers from a std::shared_ptr<T> &.
+ */
+ class Factory {
+ // \todo this may be already in ParamHelper
+ virtual std::shared_ptr<C2ParamReflector> getReflector() const = 0;
+
+ virtual std::shared_ptr<ParamHelper> getParamHelper(const ParamRef ¶m) const = 0;
+
+ public:
+ virtual ~Factory() = default;
+
+ template<typename T>
+ Param<T> get(std::shared_ptr<T> ¶m, std::shared_ptr<T> altValue = nullptr) const {
+ return Param<T>(getParamHelper(ParamRef(param)),
+ altValue == nullptr ? param : altValue,
+ getReflector());
+ }
+ };
+
+ /**
+ * Typed field helper.
+ */
+ template<typename T>
+ struct Field {
+ /**
+ * Constructor.
+ *
+ * \param helper helper for this field
+ * \param index parameter index (this is needed as it is not available during parameter
+ * construction) \todo remove
+ */
+ Field(std::shared_ptr<FieldHelper> helper, C2Param::Index index);
+
+ bool supportsAtAll(T value) const {
+ return C2FieldSupportedValuesHelper<T>(*_mHelper->getPossibleValues()).supports(value);
+ }
+
+ bool supportsNow(T value) const {
+ return C2FieldSupportedValuesHelper<T>(*_mHelper->getSupportedValues()).supports(value);
+ }
+
+ /**
+ * Creates a conflict resolution suggestion builder for this field.
+ */
+ C2ParamFieldValuesBuilder<T> shouldBe() const;
+
+ /**
+ * Creates a currently supported values builder for this field. This is only supported
+ * for non-const fields to disallow setting supported values for dependencies.
+ */
+ C2ParamFieldValuesBuilder<T> mustBe();
+
+ operator C2ParamField() const {
+ return _mField;
+ }
+
+ // TODO
+ C2R validatePossible(const T &value __unused) const {
+ /// TODO
+ return C2R::Ok();
+ }
+
+ private:
+ std::shared_ptr<FieldHelper> _mHelper;
+ C2ParamField _mField;
+ };
+
+ class ParamHelper {
+ public:
+ ParamHelper(ParamRef param, C2StringLiteral name, C2StructDescriptor &&);
+ ParamHelper(ParamHelper &&);
+ ~ParamHelper();
+
+ /**
+ * Finds a field descriptor.
+ */
+ std::shared_ptr<FieldHelper> findField(size_t baseOffs, size_t baseSize) const;
+
+ /// returns the parameter ref for this parameter
+ const ParamRef ref() const;
+
+ /// returns the current value of this parameter as modifiable. The constness of this
+ /// object determines the constness of the returned value.
+ std::shared_ptr<C2Param> value();
+
+ /// returns the current value of this parameter as const
+ std::shared_ptr<const C2Param> value() const;
+
+ /**
+ * Performs a configuration change request for this parameter.
+ *
+ * \param value the value that is being assigned to this parameter.
+ * This could be pointing to the current value of the
+ * parameter. This must not change.
+ * \param mayBlock whether blocking is allowed
+ * \param endValue the resulting value
+ * \param factory parameter factory (to access dependencies)
+ * \param failures vector of failures to append any failures from this
+ * operation
+ *
+ * \retval C2_OK configuration was successful
+ * \retval C2_BAD_VALUE value is incorrect (TBD)
+ * \retval C2_NO_MEMORY not enough memory to perform the assignment
+ * \retval C2_TIMED_OUT configuration timed out
+ * \retval C2_BLOCKING configuration requires blocking to be allowed
+ * \retval C2_CORRUPTED interface is corrupted
+ */
+ c2_status_t trySet(
+ const C2Param *value, bool mayBlock,
+ bool *changed,
+ Factory &factory,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures);
+
+ /// returns parameter indices that depend on this parameter
+ const std::vector<C2Param::Index> getDownDependencies() const;
+
+ /// adds a dependent parameter
+ void addDownDependency(C2Param::Index index);
+
+ /// returns that parameter refs for parameters that depend on this
+ const std::vector<ParamRef> getDependenciesAsRefs() const;
+
+ /// returns and moves out stored struct descriptor
+ C2StructDescriptor retrieveStructDescriptor();
+
+ /// returns the name of this parameter
+ C2String name() const;
+
+ /// returns the index of this parameter
+ C2Param::Index index() const;
+
+ /// returns the parameter descriptor
+ std::shared_ptr<const C2ParamDescriptor> getDescriptor() const;
+
+ /**
+ * Validates param helper.
+ *
+ * For now, this fills field info for const params.
+ *
+ * \retval C2_CORRUPTED the parameter cannot be added as such
+ */
+ c2_status_t validate(const std::shared_ptr<C2ParamReflector> &reflector);
+
+ protected:
+ typedef C2ParamDescriptor::attrib_t attrib_t;
+ attrib_t& attrib();
+
+ /// sets the default value of this parameter
+ void setDefaultValue(std::shared_ptr<C2Param> default_);
+
+ /// sets the setter method
+ void setSetter(std::function<C2R(const C2Param *, bool, bool *, Factory &)> setter);
+
+ /// sets the getter method
+ void setGetter(std::function<std::shared_ptr<C2Param>(bool)> getter);
+
+ /// sets the dependencies
+ void setDependencies(std::vector<C2Param::Index> indices, std::vector<ParamRef> refs);
+
+ /// sets the fields and their supported values
+ void setFields(std::vector<C2ParamFieldValues> &&fields);
+
+ /// build this into a final ParamHelper object
+ std::shared_ptr<ParamHelper> build();
+
+ class Impl;
+ std::unique_ptr<Impl> mImpl;
+ };
+
+ /**
+ * Typed parameter helper. This provides access to members as well as field helpers.
+ */
+ template<typename T>
+ struct C2_HIDE Param {
+ Param(
+ std::shared_ptr<ParamHelper> helper, std::shared_ptr<T> ¶m,
+ std::shared_ptr<C2ParamReflector> reflector)
+ : v(*param.get()),
+ _mTypedParam(param),
+ _mHelper(helper),
+ _mReflector(reflector) { }
+
+ template<typename S>
+ using FieldType = Field<
+ typename _c2_reduce_enum_to_underlying_type<
+ typename std::remove_const<
+ typename std::remove_extent<S>::type>::type>::type>;
+
+ template<typename S>
+ FieldType<S> F(S &field) {
+ size_t offs = (uintptr_t)&field - (uintptr_t)&get();
+ // this must fall either within sizeof(T) + FLEX_SIZE or param->size()
+ // size_t size = sizeof(field);
+ // mParam may be null
+ size_t baseSize = sizeof(typename std::remove_extent<S>::type);
+ size_t baseOffs = GetBaseOffset(
+ _mReflector, T::CORE_INDEX, offs - sizeof(C2Param));
+ if (~baseOffs == 0) {
+ // C2_LOG(FATAL) << "unknown field at offset " << offs << " size " << sizeof(S)
+ // << " base-size " << baseSize;
+ // __builtin_trap();
+ } else {
+ baseOffs += sizeof(C2Param);
+ }
+
+ std::shared_ptr<FieldHelper> helper = _mHelper->findField(baseOffs, baseSize);
+ return FieldType<S>(helper, _mTypedParam->index());
+ }
+
+ // const Param have const Fields; however, remove const from S
+ template<typename S>
+ const FieldType<S> F(S &field) const {
+ return const_cast<const FieldType<S>>(const_cast<Param *>(this)->F(field));
+ }
+
+ /// Returns a const ref value of this const param.
+ const T &get() const {
+ return *_mTypedParam.get();
+ }
+
+ /// Returns a modifiable ref value of this non-const param.
+ T &set() {
+ return *_mTypedParam.get();
+ }
+
+ /// Const-reference to the value.s
+ T const &v;
+
+ private:
+ std::shared_ptr<T> _mTypedParam;
+ std::shared_ptr<ParamHelper> _mHelper;
+ std::shared_ptr<C2ParamReflector> _mReflector;
+ };
+
+ template<typename T>
+ using C2P = Param<T>;
+
+ /**
+ * Templated move builder class for a parameter helper.
+ */
+ template<typename T>
+ class C2_HIDE ParamBuilder : private ParamHelper {
+ public:
+ /** Construct the parameter builder from minimal info required. */
+ ParamBuilder(std::shared_ptr<T> ¶m, C2StringLiteral name)
+ : ParamHelper(param, name, C2StructDescriptor((T*)nullptr)),
+ mTypedParam(¶m) {
+ attrib() = attrib_t::IS_PERSISTENT;
+ }
+
+ /** Makes this parameter required. */
+ inline ParamBuilder &required() {
+ attrib() |= attrib_t::IS_REQUIRED;
+ return *this;
+ }
+
+ /** Makes this parameter transient (not persistent). */
+ inline ParamBuilder &transient() {
+ attrib() &= ~attrib_t::IS_PERSISTENT;
+ return *this;
+ }
+
+ /** Makes this parameter hidden (not exposed in JAVA API). */
+ inline ParamBuilder &hidden() {
+ attrib() |= attrib_t::IS_HIDDEN;
+ return *this;
+ }
+
+ /** Makes this parameter internal (not exposed to query/settings). */
+ inline ParamBuilder &internal() {
+ attrib() |= attrib_t::IS_INTERNAL;
+ return *this;
+ }
+
+ /** Adds default value. Must be added exactly once. */
+ inline ParamBuilder &withDefault(std::shared_ptr<T> default_) {
+ // CHECK(!mDefaultValue);
+ // WARN_IF(!default_); // could be nullptr if OOM
+ // technically, this could be in the parent
+ *mTypedParam = std::shared_ptr<T>(T::From(C2Param::Copy(*default_).release()));
+ setDefaultValue(default_);
+ std::shared_ptr<T> *typedParam = mTypedParam;
+ setGetter([typedParam](bool) -> std::shared_ptr<C2Param> {
+ return std::static_pointer_cast<C2Param>(*typedParam);
+ });
+ return *this;
+ }
+
+ /** Adds default value. Must be added exactly once. */
+ inline ParamBuilder &withDefault(T *default_) {
+ return withDefault(std::shared_ptr<T>(default_));
+ }
+
+ /** Adds all fields to this parameter with their possible values. */
+ inline ParamBuilder &withFields(std::vector<C2ParamFieldValues> &&fields_) {
+ setFields(std::move(fields_));
+ return *this;
+ }
+
+ /**
+ * Adds a constant value (also as default). Must be added exactly once.
+ *
+ * Const parameters by definition have no dependencies.
+ */
+ inline ParamBuilder &withConstValue(std::shared_ptr<T> default_) {
+ attrib() |= attrib_t::IS_CONST;
+ setSetter([default_](
+ const C2Param *value, bool mayBlock __unused, bool *changed, Factory &) -> C2R {
+ *changed = false;
+ const T *typedValue = T::From(value);
+ if (typedValue == nullptr) {
+ return C2R::Corrupted(); // TODO BadValue/Invalid. This should not happen here.
+ }
+ if (*typedValue != *default_) {
+ return C2R::Corrupted(); // TODO ReadOnly(*default_);
+ }
+ *changed = false;
+ return C2R::Ok();
+ });
+ return withDefault(default_);
+ }
+
+ /** Adds constant value (also as default). Must be added exactly once. */
+ inline ParamBuilder &withConstValue(T *default_) {
+ return withConstValue(std::shared_ptr<T>(default_));
+ }
+
+ /**
+ * Use a strict setter.
+ *
+ * \param fn strict setter
+ * \param deps dependencies (references)
+ */
+ template<typename ... Deps>
+ inline ParamBuilder &withSetter(
+ C2R (*fn)(bool, const C2P<T> &, C2P<T> &, const C2P<Deps> &...),
+ std::shared_ptr<Deps>& ... deps) {
+ attrib() |= attrib_t::IS_STRICT;
+ std::shared_ptr<T> *typedParam = mTypedParam;
+ setSetter([typedParam, fn, &deps...](
+ const C2Param *value, bool mayBlock, bool *changed, Factory &factory) -> C2R {
+ *changed = false;
+ const T *typedValue = T::From(value);
+ if (typedValue == nullptr) {
+ return C2R::Corrupted(); // TODO BadValue/Invalid. This should not happen here.
+ }
+ // Do copy-on-change for parameters in this helper so change can be detected by
+ // a change of the pointer. Do this by working on a proposed value.
+ std::shared_ptr<T> proposedValue =
+ std::shared_ptr<T>(T::From(C2Param::Copy(*value).release()));
+ if (proposedValue == nullptr) {
+ return C2R::NoMemory(value->index());
+ }
+ C2P<T> oldValue = factory.get(*typedParam);
+ // Get a parameter helper with value pointing to proposedValue
+ C2P<T> helper = factory.get(*typedParam, proposedValue);
+ C2R result = fn(mayBlock, oldValue, helper, factory.get(deps)...);
+
+ // If value changed, copy result to current value
+ if (helper.get() != *typedParam->get()) {
+ *typedParam = proposedValue;
+ *changed = true;
+ }
+ return result;
+ });
+ setDependencies(std::vector<C2Param::Index>{ deps->index()... },
+ std::vector<ParamRef>{ ParamRef(deps)... });
+ return *this;
+ }
+
+ /**
+ * Use a non-strict setter.
+ *
+ * \param fn non-strict setter
+ * \param deps dependencies (references)
+ */
+ template<typename ... Deps>
+ inline ParamBuilder &withSetter(
+ C2R (*fn)(bool, C2P<T> &, const C2P<Deps> &...), std::shared_ptr<Deps>& ... deps) {
+ std::shared_ptr<T> *typedParam = mTypedParam;
+ setSetter([typedParam, fn, &deps...](
+ const C2Param *value, bool mayBlock, bool *changed, Factory &factory) -> C2R {
+ *changed = false;
+ const T *typedValue = T::From(value);
+ if (typedValue == nullptr) {
+ return C2R::Corrupted(); // TODO BadValue/Invalid. This should not happen here.
+ }
+ // Do copy-on-change for parameters in this helper so change can be detected by
+ // a change of the pointer. Do this by working on a proposed value.
+ std::shared_ptr<T> proposedValue =
+ std::shared_ptr<T>(T::From(C2Param::Copy(*value).release()));
+ if (proposedValue == nullptr) {
+ return C2R::NoMemory(value->index());
+ }
+ // Get a parameter helper with value pointing to proposedValue
+ C2P<T> helper = factory.get(*typedParam, proposedValue);
+ C2R result = fn(mayBlock, helper, factory.get(deps)...);
+
+ // If value changed, copy result to current value
+ if (helper.get() != *typedParam->get()) {
+ *typedParam = proposedValue;
+ *changed = true;
+ }
+ return result;
+ });
+ setDependencies(std::vector<C2Param::Index>{ deps->index()... },
+ std::vector<ParamRef>{ ParamRef(deps)... });
+ return *this;
+ }
+
+ /**
+ * Marks this a calculated (read-only) field.
+ *
+ * \param fn non-strict setter (calculator)
+ * \param deps dependencies (references)
+ */
+ template<typename ... Deps>
+ inline ParamBuilder &calculatedAs(
+ C2R (*fn)(bool, C2P<T> &, const C2P<Deps> &...), std::shared_ptr<Deps>& ... deps) {
+ attrib() |= attrib_t::IS_READ_ONLY;
+ return withSetter(fn, std::forward<decltype(deps)>(deps)...);
+ }
+
+ inline std::shared_ptr<ParamHelper> build() {
+ return ParamHelper::build();
+ }
+
+ protected:
+ std::shared_ptr<T> *mTypedParam;
+ };
+
+ template<typename T>
+ static ParamBuilder<T> DefineParam(std::shared_ptr<T> ¶m, C2StringLiteral name) {
+ return ParamBuilder<T>(param, name);
+ }
+
+public:
+ c2_status_t query(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const;
+
+ /**
+ * Helper implementing config calls as well as other configuration updates.
+ *
+ * This method is virtual, so implementations may provide wrappers around it (and perform
+ * actions just before and after a configuration).
+ *
+ * \param params
+ * \param mayBlock
+ * \param failures
+ * \param updateParams if true, the updated parameter values are copied back into the arguments
+ * passed in |params|
+ * \param changes pointed to a vector to receive settings with their values changed. If not
+ * null, settings with their values changed are added to this.
+ * \return result from config
+ */
+ virtual c2_status_t config(
+ const std::vector<C2Param*> ¶ms, c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures,
+ bool updateParams = true,
+ std::vector<std::shared_ptr<C2Param>> *changes = nullptr);
+
+ c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const;
+
+ c2_status_t querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery> &fields, c2_blocking_t mayBlock) const;
+
+ std::shared_ptr<C2ReflectorHelper> getReflector() {
+ return mReflector;
+ }
+
+ typedef std::unique_lock<std::mutex> Lock;
+
+ /**
+ * Locks the interface and returns a lock. This lock must be unlocked or released without
+ * calling any other blocking call.
+ */
+ Lock lock() const;
+
+private:
+ void setInterfaceAddressBounds(uintptr_t start, uintptr_t end) {
+ // TODO: exclude this helper
+ (void)start;
+ (void)end;
+ }
+
+protected:
+ mutable std::mutex mMutex;
+ std::shared_ptr<C2ReflectorHelper> mReflector;
+ struct FactoryImpl;
+ std::shared_ptr<FactoryImpl> _mFactory;
+
+ C2InterfaceHelper(std::shared_ptr<C2ReflectorHelper> reflector);
+
+ /**
+ * Adds a parameter to this interface.
+ * \note This method CHECKs.
+ *
+ * \param param parameter to add.
+ */
+ void addParameter(std::shared_ptr<ParamHelper> param);
+
+ /**
+ * Returns the dependency index for a parameter.
+ *
+ * \param ix the index of the parameter
+ */
+ size_t getDependencyIndex_l(C2Param::Index ix) const;
+
+ virtual ~C2InterfaceHelper() = default;
+
+ /**
+ * Sets subclass instance's address and size.
+ *
+ * \todo allow subclass to specify parameter address range directly (e.g. do not assume that
+ * they are local to the subclass instance)
+ *
+ * \param T type of the derived instance
+ * \param instance pointer to the derived instance
+ */
+ template<typename T>
+ inline C2_HIDE void setDerivedInstance(T *instance) {
+ setInterfaceAddressBounds((uintptr_t)instance, (uintptr_t)(instance + 1));
+ }
+
+ C2_DO_NOT_COPY(C2InterfaceHelper);
+};
+
+/**
+ * Creates a C2ParamFieldValuesBuilder class for a field of a parameter
+ *
+ * \param spParam a configuration parameter in an interface class subclassed from C2InterfaceHelper.
+ * \param field a field of such parameter
+ */
+#define C2F(spParam, field) \
+ C2ParamFieldValuesBuilder< \
+ typename _c2_reduce_enum_to_underlying_type< \
+ typename std::remove_reference< \
+ typename std::remove_extent< \
+ decltype(spParam->field)>::type>::type>::type>( \
+ C2ParamField(spParam.get(), &spParam->field))
+
+#endif // C2UTILS_INTERFACE_HELPER_H_
diff --git a/media/codec2/vndk/include/util/C2InterfaceUtils.h b/media/codec2/vndk/include/util/C2InterfaceUtils.h
new file mode 100644
index 0000000..e9037e5
--- /dev/null
+++ b/media/codec2/vndk/include/util/C2InterfaceUtils.h
@@ -0,0 +1,1135 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_INTERFACE_UTILS_H_
+#define C2UTILS_INTERFACE_UTILS_H_
+
+#include <C2Param.h>
+#include <C2Work.h>
+
+#include <cmath>
+#include <iterator>
+#include <limits>
+#include <type_traits>
+
+/**
+ * Helper class to map underlying types to C2Value types as well as to print field values. This is
+ * generally the same as simply the underlying type except for characters (STRING) and bytes (BLOB).
+ */
+template<typename T>
+struct C2_HIDE _C2FieldValueHelper {
+ typedef T ValueType;
+ inline static std::ostream& put(std::ostream &os, const C2Value::Primitive &p) {
+ return os << p.ref<T>();
+ }
+};
+
+template<>
+struct C2_HIDE _C2FieldValueHelper<uint8_t> {
+ typedef uint32_t ValueType;
+ static std::ostream& put(std::ostream &os, const C2Value::Primitive &p);
+};
+
+template<>
+struct C2_HIDE _C2FieldValueHelper<char> {
+ typedef int32_t ValueType;
+ static std::ostream& put(std::ostream &os, const C2Value::Primitive &p);
+};
+
+/**
+ * Supported value range utility for a field of a given type.
+ *
+ * This mimics C2FieldSupportedValue for RANGE type.
+ */
+template<typename T>
+class C2SupportedRange {
+ typedef typename _C2FieldValueHelper<T>::ValueType ValueType;
+
+//private:
+ constexpr static T MIN_VALUE = std::numeric_limits<T>::min();
+ constexpr static T MAX_VALUE = std::numeric_limits<T>::max();
+ constexpr static T MIN_STEP = std::is_floating_point<T>::value ? 0 : 1;
+
+public:
+ /**
+ * Constructs an empty range with no supported values.
+ *
+ * \note This is a specializated supported range representation that is only used for
+ * this object - it is equivalent to the EMPTY type in C2FieldSupportedValues.
+ */
+ inline static constexpr C2SupportedRange<T> None() {
+ return C2SupportedRange(MAX_VALUE, MIN_VALUE);
+ }
+
+ /**
+ * Constructs a range with all values supported.
+ */
+ inline static constexpr C2SupportedRange<T> Any() {
+ return C2SupportedRange(MIN_VALUE, MAX_VALUE);
+ }
+
+ /**
+ * Constructs a range with a single supported value.
+ *
+ * \param value the sole supported value
+ */
+ inline static constexpr C2SupportedRange<T> EqualTo(T value) {
+ return C2SupportedRange(value, value);
+ }
+
+ /**
+ * Constructs a range with supported values greater than a given value.
+ *
+ * \param value the given value
+ */
+ inline static C2SupportedRange<T> GreaterThan(T value) {
+ return (value == MAX_VALUE ? None() :
+ std::is_floating_point<T>::value ?
+ C2SupportedRange(std::nextafter(value, MAX_VALUE), MAX_VALUE) :
+ C2SupportedRange(value + MIN_STEP, MAX_VALUE));
+ }
+
+ /**
+ * Constructs a range with supported values greater than or equal to a given value.
+ *
+ * \param value the given value
+ */
+ inline static constexpr C2SupportedRange<T> GreaterThanOrEqualTo(T value) {
+ return C2SupportedRange(value, MAX_VALUE);
+ }
+
+ /**
+ * Constructs a range with supported values greater than or equal to (aka not less than) a given
+ * value.
+ *
+ * \param value the given value
+ */
+ inline static constexpr C2SupportedRange<T> NotLessThan(T value) {
+ return GreaterThanOrEqualTo(value);
+ }
+
+ /**
+ * Constructs a range with supported values less than or equal to a given value.
+ *
+ * \param value the given value
+ */
+ inline static constexpr C2SupportedRange<T> LessThanOrEqualTo(T value) {
+ return C2SupportedRange(MIN_VALUE, value);
+ }
+
+ /**
+ * Constructs a range with supported values less than or equal to (aka not greater than) a given
+ * value.
+ *
+ * \param value the given value
+ */
+ inline static constexpr C2SupportedRange<T> NotGreaterThan(T value) {
+ return LessThanOrEqualTo(value);
+ }
+
+ /**
+ * Constructs a range with supported values less than a given value.
+ *
+ * \param value the given value
+ */
+ inline static C2SupportedRange<T> LessThan(T value) {
+ return (value == MIN_VALUE ? None() :
+ std::is_floating_point<T>::value ?
+ C2SupportedRange(MIN_VALUE, std::nextafter(value, MIN_VALUE)) :
+ C2SupportedRange(MIN_VALUE, value - MIN_STEP));
+ }
+
+ /**
+ * Constructs a continuous or arithmetic range between two values.
+ *
+ * \param min the lower value
+ * \param max the higher value (if this is lower than |min| the range will be empty)
+ * \param step the step of the arithmetic range. (If this is 0 for floating point types or 1 for
+ * integer types, the constructed range is continuous)
+ */
+ inline static constexpr
+ C2SupportedRange<T> InRange(T min, T max, T step = MIN_STEP) {
+ return C2SupportedRange(min, max, step);
+ }
+
+ /**
+ * Constructs a range over a geometric series between two values.
+ *
+ * \param min the lower bound of the range. This value is always part of the constructed range
+ * as long as it is not greater than |max|.
+ * \param max the upper bound of the range. This value is only part of the constructed
+ * range if it is part of the geometric series.
+ * \param num the numerator of the geometric series.
+ * \param denom the denominator of the geometric series.
+ */
+ inline static constexpr
+ C2SupportedRange<T> InSeries(T min, T max, T num, T denom) {
+ return C2SupportedRange(min, max, 0, num, denom);
+ }
+
+ /**
+ * Constructs a range over a multiply-accumulate series between two values.
+ *
+ * \param min the lower bound of the range. This value is always part of the constructed range
+ * as long as it is not greater than |max|.
+ * \param max the upper bound of the range. This value is only part of the constructed
+ * range if it is part of the series.
+ * \param step the accumulator of the multiply-accumulate series
+ * \param num the numerator of the multiply-accumulate series.
+ * \param denom the denominator of the multiply-accumulate series.
+ */
+ inline static constexpr
+ C2SupportedRange<T> InMacSeries(T min, T max, T step, T num, T denom) {
+ return C2SupportedRange(min, max, step, num, denom);
+ }
+
+ /**
+ * Constructs a range from a generic C2FieldSupportedValues object. This will be an empty
+ * range if the supported values are not of RANGE type.
+ *
+ * \param values the supported values object
+ */
+ C2SupportedRange(const C2FieldSupportedValues &values);
+
+ /**
+ * Returns whether this range is empty.
+ */
+ inline constexpr bool isEmpty() const {
+ return _mMin > _mMax;
+ }
+
+ /**
+ * Returns whether this range is valid.
+ *
+ * Ranges are valid if they are continuous or monotonic.
+ */
+ inline constexpr bool isValid() const {
+ // TODO: handle overflow or negative series
+ return _mDenom > 0 && _mNum >= _mDenom && _mMin * (_mDenom - _mNum) < _mStep * _mDenom;
+ }
+
+ /**
+ * Returns whether a value is part of this range.
+ *
+ * \param value the value to check.
+ */
+ bool contains(T value) const;
+
+ /**
+ * Returns a new range that is the intersection of this range and another, if it is
+ * representable as a range object.
+ *
+ * \param limit the other range
+ */
+ C2SupportedRange<T> limitedTo(const C2SupportedRange<T> &limit) const;
+
+ /**
+ * Converts this object to a C2FieldSupportedValues object.
+ */
+ inline operator C2FieldSupportedValues() const {
+ return C2FieldSupportedValues(_mMin, _mMax, _mStep, _mNum, _mDenom);
+ }
+
+ /**
+ * Returns the lower bound and starting point of this range.
+ */
+ inline C2_HIDE constexpr T min() const { return _mMin; }
+
+ /**
+ * Returns the upper bound of this range.
+ */
+ inline C2_HIDE constexpr T max() const { return _mMax; }
+
+ /**
+ * Returns the step of this range.
+ */
+ inline C2_HIDE constexpr T step() const { return _mStep; }
+
+ /**
+ * Returns the numerator of this range.
+ */
+ inline C2_HIDE constexpr T num() const { return _mNum; }
+
+ /**
+ * Returns the denominator of this range.
+ */
+ inline C2_HIDE constexpr T denom() const { return _mDenom; }
+
+private:
+ /**
+ * Returns whether x[i...] is all values between _mMin and _mMax.
+ */
+ inline C2_HIDE constexpr bool isSimpleRange() const {
+ return _mStep == MIN_STEP && _mNum == 1 && _mDenom == 1;
+ }
+
+ /**
+ * Returns whether x[i...] is defined as such:
+ * x[i + 1] = x[i] + _mStep, where _mStep > 0 and _mMin <= x[i] <= _mMax
+ */
+ inline C2_HIDE constexpr bool isArithmeticSeries() const {
+ return _mStep > MIN_STEP && _mNum == 1 && _mDenom == 1;
+ }
+
+ /**
+ * Returns whether x[i...] is defined as such:
+ * x[i] = x[0] * (_mNum / _mDenom) ^ i (with rounding), where _mNum > _mDenom > 0 and x[0] > 0
+ */
+ inline C2_HIDE constexpr bool isGeometricSeries() const {
+ return _mMin > 0 && _mStep == 0 && _mNum > _mDenom && _mDenom > 0;
+ }
+
+ /**
+ * Returns whether x[i...] is defined as such:
+ * x[i + 1] = x[i] * _mNum / _mDenom + _mStep (with rounding), while x[i + 1] > x[i], where
+ * _mStep != 0, _mDenom > 0 and _mNum > 0
+ */
+ inline C2_HIDE constexpr bool isMacSeries() const {
+ return _mStep != 0 && _mNum > 0 && _mDenom > 0;
+ }
+
+ /**
+ * Constructs an arithmetic or continuous range.
+ *
+ * \param min the lower value
+ * \param max the higher value (if this is lower than |min| the range will be empty)
+ * \param step the step of the arithmetic range. (If this is 0 for floating point types or 1 for
+ * integer types, the constructed range is continuous)
+ */
+ constexpr C2_HIDE C2SupportedRange(T min, T max, T step = T(std::is_floating_point<T>::value ? 0 : 1))
+ : _mMin(min), _mMax(max), _mStep(step), _mNum(1), _mDenom(1) { }
+
+ /**
+ * Constructs a range over a geomertic sor multiply-accumulate series.
+ *
+ * \param min the lower bound of the range. This value is always part of the constructed range
+ * as long as it is not greater than |max|.
+ * \param max the upper bound of the range. This value is only part of the constructed
+ * range if it is part of the geometric series.
+ * \param step the accumulator of the multiply-accumulate series. This is 0 for a pure geometric
+ * series
+ * \param num the numerator of the geometric series.
+ * \param denom the denominator of the geometric series.
+ */
+ constexpr C2_HIDE C2SupportedRange(T min, T max, T step, T num, T den)
+ : _mMin(min), _mMax(max), _mStep(step), _mNum(num), _mDenom(den) { }
+
+ T _mMin; ///< lower bound and starting point
+ T _mMax; ///< upper bound
+ T _mStep; ///< step of an arithmetic series (0 if continuous floating point range)
+ T _mNum; ///< numerator of a geometric series
+ T _mDenom; ///< denominator of a geometric series
+};
+
+/**
+ * Ordered supported flag set for a field of a given type.
+ */
+template<typename T>
+class C2SupportedFlags {
+ typedef typename _C2FieldValueHelper<T>::ValueType ValueType;
+
+public:
+ /**
+ * Constructs an empty flag set.
+ *
+ * \note This is a specializated supported flags representation that is only used for
+ * this object - it is equivalent to the EMPTY type in C2FieldSupportedValues.
+ */
+ static inline C2SupportedFlags<T> None() {
+ return C2SupportedFlags(std::initializer_list<C2Value::Primitive>());
+ }
+
+ /**
+ * Constructs a flags set of given flags.
+ *
+ * \param flags the ordered set of flags as an initializer list.
+ * \param min minimum set of flags to be set.
+ */
+ static inline C2SupportedFlags<T> Flags(const std::initializer_list<T> flags, T min = T(0)) {
+ return C2SupportedFlags(min, flags);
+ }
+
+ /**
+ * Constructs a flags set of given flags.
+ *
+ * \param flags the ordered set of flags.
+ * \param min minimum set of flags to be set.
+ */
+ static inline C2SupportedFlags<T> Flags(const std::vector<T> &flags, T min = T(0)) {
+ return C2SupportedFlags(min, flags);
+ }
+
+ /**
+ * Constructs a flag set from a generic C2FieldSupportedValues object. This will be an empty
+ * set if the supported values are not of FLAGS type.
+ *
+ * \param values the supported values object
+ */
+ C2SupportedFlags<T>(const C2FieldSupportedValues &values) {
+ if (values.type == C2FieldSupportedValues::FLAGS) {
+ _mValues.insert(_mValues.end(), values.values.begin(), values.values.end());
+ }
+ }
+
+ /**
+ * Returns whether this set is empty.
+ */
+ constexpr bool isEmpty() const {
+ return _mValues.empty();
+ }
+
+ /**
+ * Returns whether a value is part of this set.
+ *
+ * \param value the value to check.
+ */
+ bool contains(T value) const;
+
+ /**
+ * Returns a new flag set that is the intersection of this set and another.
+ *
+ * \param limit the other value set
+ */
+ C2SupportedFlags<T> limitedTo(const C2SupportedFlags<T> &limit) const;
+
+ /**
+ * Converts this object to a C2FieldSupportedValues object.
+ */
+ operator C2FieldSupportedValues() const {
+ return C2FieldSupportedValues(!isEmpty() /* flags */, _mValues);
+ }
+
+ /**
+ * Returns the ordered set of flags of this object.
+ */
+ const std::vector<T> flags() const;
+
+ /**
+ * Returns the minimum set of flags for this object.
+ */
+ T min() const;
+
+ /**
+ * Clears this supported value set.
+ */
+ inline void clear() {
+ _mValues.clear();
+ }
+
+private:
+ /**
+ * Constructs a flag set directly from an internal representation.
+ *
+ * \param values a vector containing the minimum flag set followed by the set of flags
+ */
+ C2SupportedFlags(std::vector<C2Value::Primitive> &&values)
+ : _mValues(values) {
+ }
+
+ /**
+ * Constructs a flag set from a set of flags and a minimum flag set.
+ *
+ * \param flags the set
+ */
+ C2SupportedFlags(T min, const std::vector<T> &flags) {
+ _mValues.emplace_back(min);
+ for (T elem : flags) {
+ _mValues.emplace_back(elem);
+ }
+ }
+
+ /**
+ * Constructs a flag set from a set of initializer list values and a minimum flag set
+ *
+ * \param flags the set
+ */
+ C2SupportedFlags(T min, const std::initializer_list<T> flags) {
+ _mValues.emplace_back(min);
+ for (T elem : flags) {
+ _mValues.emplace_back(elem);
+ }
+ }
+
+ std::vector<C2Value::Primitive> _mValues; ///< the minimum flag set followed by the set of flags
+};
+
+/**
+ * Ordered supported value set for a field of a given type.
+ */
+template<typename T>
+class C2SupportedValueSet {
+ typedef typename _C2FieldValueHelper<T>::ValueType ValueType;
+
+public:
+ /**
+ * Constructs an empty value set.
+ *
+ * \note This is a specializated supported range representation that is only used for
+ * this object - it is equivalent to the EMPTY type in C2FieldSupportedValues.
+ */
+ static inline C2SupportedValueSet<T> None() {
+ return C2SupportedValueSet({ });
+ }
+
+ /**
+ * Constructs a value set of given values.
+ *
+ * \param values the ordered set of values as an initializer list.
+ */
+ static inline C2SupportedValueSet<T> OneOf(const std::initializer_list<T> values) {
+ return C2SupportedValueSet(values);
+ }
+
+ /**
+ * Constructs a value set of given values.
+ *
+ * \param values the ordered set of values.
+ */
+ static inline C2SupportedValueSet<T> OneOf(const std::vector<T> &values) {
+ return C2SupportedValueSet(values);
+ }
+
+ /**
+ * Constructs a value set from a generic C2FieldSupportedValues object. This will be an empty
+ * set if the supported values are not of VALUES type.
+ *
+ * \param values the supported values object
+ */
+ C2SupportedValueSet<T>(const C2FieldSupportedValues &values) {
+ if (values.type == C2FieldSupportedValues::VALUES) {
+ _mValues.insert(_mValues.end(), values.values.begin(), values.values.end());
+ }
+ }
+
+ /**
+ * Returns whether this range is empty.
+ */
+ constexpr bool isEmpty() const {
+ return _mValues.empty();
+ }
+
+ /**
+ * Returns whether a value is part of this set.
+ *
+ * \param value the value to check.
+ */
+ bool contains(T value) const;
+
+ /**
+ * Returns a new value set that is the intersection of this set and another.
+ *
+ * \param limit the other value set
+ */
+ C2SupportedValueSet<T> limitedTo(const C2SupportedValueSet<T> &limit) const;
+
+ /**
+ * Returns a new value set that is the intersection of this set and a value range.
+ *
+ * \param limit the other range
+ */
+ C2SupportedValueSet<T> limitedTo(const C2SupportedRange<T> &limit) const;
+
+ /**
+ * Returns a new value set that is the intersection of this set and a flag set.
+ *
+ * \param limit the other flag set
+ */
+ C2SupportedValueSet<T> limitedTo(const C2SupportedFlags<T> &limit) const;
+
+ /**
+ * Converts this object to a C2FieldSupportedValues object.
+ */
+ operator C2FieldSupportedValues() const {
+ return C2FieldSupportedValues(false /* flags */, _mValues);
+ }
+
+ /**
+ * Returns the ordered set of values of this object.
+ */
+ const std::vector<T> values() const;
+
+ /**
+ * Clears this supported value set.
+ */
+ inline void clear() {
+ _mValues.clear();
+ }
+
+private:
+ /**
+ * Constructs a value set from a set of C2Value::Primitive values.
+ *
+ * \param values the set
+ */
+ C2SupportedValueSet(std::vector<C2Value::Primitive> &&values)
+ : _mValues(values) {
+ }
+
+ /**
+ * Constructs a value set from a set of values.
+ *
+ * \param values the set
+ */
+ C2SupportedValueSet(const std::vector<T> &values) {
+ for (T elem : values) {
+ _mValues.emplace_back(elem);
+ }
+ }
+
+ /**
+ * Constructs a value set from a set of initializer list values
+ *
+ * \param values the set
+ */
+ C2SupportedValueSet(const std::initializer_list<T> values) {
+ for (T elem : values) {
+ _mValues.emplace_back(elem);
+ }
+ }
+
+ std::vector<C2Value::Primitive> _mValues; ///< the supported set of values
+};
+
+/**
+ * Helper class to handle C2FieldSupporteValues object for fields of various types.
+ */
+template<typename T>
+class C2FieldSupportedValuesHelper;
+
+// templated operator must be predeclared for friend declaration
+template<typename T>
+std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<T> &i);
+
+template<typename T>
+class C2FieldSupportedValuesHelper {
+public:
+ /**
+ * Creates a helper for a specific type from a generic C2FieldSupportedValues struct.
+ */
+ C2FieldSupportedValuesHelper(const C2FieldSupportedValues &values);
+
+ // TRICKY: needed for std::unique_ptr<Impl> declaration
+ ~C2FieldSupportedValuesHelper();
+
+ // support copy constructor/operator
+ C2FieldSupportedValuesHelper(const C2FieldSupportedValuesHelper &);
+ C2FieldSupportedValuesHelper& operator=(const C2FieldSupportedValuesHelper &);
+
+ bool supports(T value) const;
+
+private:
+ // use pimpl as implementation may change in the future
+ struct Impl;
+ std::unique_ptr<Impl> _mImpl;
+
+ friend std::ostream& operator<< <T>(std::ostream& os, const C2FieldSupportedValuesHelper<T> &i);
+ //friend std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper &i);
+};
+
+/**
+ * Builder for supported values for a field of a given type.
+ *
+ * This builder can be used to successively restrict the supported values for a field. Upon
+ * creation, there are no supported values specified - which for this builder means that all
+ * values are supported.
+ */
+template<typename T>
+class C2ParamFieldValuesBuilder {
+public:
+ /**
+ * Creates a builder with no defined values - but implicitly any value allowed.
+ */
+ C2ParamFieldValuesBuilder(const C2ParamField &field);
+
+ /**
+ * Get C2ParamFieldValues from this builder.
+ */
+ operator C2ParamFieldValues() const;
+
+ /**
+ * Define the supported values as the currently supported values of this builder.
+ */
+ C2ParamFieldValuesBuilder<T> &any();
+
+ /**
+ * Restrict (and thus define) the supported values to none.
+ *
+ * \note This really should not be used from the builder as all params must have supported
+ * values, but is here in case this is really the case.
+ */
+ C2ParamFieldValuesBuilder<T> &none();
+
+ /**
+ * Restrict (and thus define) the supported values to |value| alone.
+ */
+ C2ParamFieldValuesBuilder<T> &equalTo(T value);
+
+ /**
+ * Restrict (and thus define) the supported values to values greater than |value|.
+ */
+ inline C2ParamFieldValuesBuilder<T> &greaterThan(T value) {
+ return limitTo(C2SupportedRange<T>::GreaterThan(value));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values greater than or equal to |value|.
+ */
+ C2ParamFieldValuesBuilder<T> &greaterThanOrEqualTo(T value) {
+ return limitTo(C2SupportedRange<T>::GreaterThanOrEqualTo(value));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values greater than or equal to |value|.
+ */
+ C2ParamFieldValuesBuilder<T> ¬LessThan(T value) {
+ return limitTo(C2SupportedRange<T>::NotLessThan(value));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values less than or equal to |value|.
+ */
+ C2ParamFieldValuesBuilder<T> &lessThanOrEqualTo(T value) {
+ return limitTo(C2SupportedRange<T>::LessThanOrEqualTo(value));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values less than or equal to |value|.
+ */
+ C2ParamFieldValuesBuilder<T> ¬GreaterThan(T value) {
+ return limitTo(C2SupportedRange<T>::NotGreaterThan(value));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values less than |value|.
+ */
+ C2ParamFieldValuesBuilder<T> &lessThan(T value) {
+ return limitTo(C2SupportedRange<T>::LessThan(value));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values in the range of [ |min|, |max| ]
+ * with optional |step|.
+ */
+ C2ParamFieldValuesBuilder<T> &inRange(
+ T min, T max, T step = std::is_floating_point<T>::value ? T(0) : T(1)) {
+ return limitTo(C2SupportedRange<T>::InRange(min, max, step));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values in the geometric series starting
+ * from |min| with factor |num| / |denom|, not greater than |max|.
+ */
+ C2ParamFieldValuesBuilder<T> &inSeries(T min, T max, T num, T denom) {
+ return limitTo(C2SupportedRange<T>::InSeries(min, max, num, denom));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values in the multiply-accumulate series
+ * starting from |min| with factor |num| / |denom| and |step|, not greater than |max|.
+ */
+ C2ParamFieldValuesBuilder<T> &inMacSeries(T min, T max, T step, T num, T denom) {
+ return limitTo(C2SupportedRange<T>::InMacSeries(min, max, step, num, denom));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values in |values|.
+ */
+ C2ParamFieldValuesBuilder<T> &oneOf(const std::initializer_list<T> values) {
+ return limitTo(C2SupportedValueSet<T>::OneOf(values));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to values in |values|.
+ */
+ C2ParamFieldValuesBuilder<T> &oneOf(const std::vector<T> &values) {
+ return limitTo(C2SupportedValueSet<T>::OneOf(values));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to flags in |flags| with at least |min|
+ * set.
+ */
+ C2ParamFieldValuesBuilder<T> &flags(const std::vector<T> &flags, T min = T(0)) {
+ return limitTo(C2SupportedFlags<T>::Flags(flags, min));
+ }
+
+ /**
+ * Restrict (and thus define) the supported values to flags in |values| with at least |min|
+ * set.
+ */
+ C2ParamFieldValuesBuilder<T> &flags(const std::initializer_list<T> flags, T min = T(0)) {
+ return limitTo(C2SupportedFlags<T>::Flags(flags, min));
+ }
+
+ virtual ~C2ParamFieldValuesBuilder();
+
+ // support copy constructor/operator
+ C2ParamFieldValuesBuilder(const C2ParamFieldValuesBuilder &);
+ C2ParamFieldValuesBuilder& operator=(const C2ParamFieldValuesBuilder &);
+
+private:
+ /**
+ * Restrict (and thus define) the supported values to a value set.
+ */
+ C2ParamFieldValuesBuilder<T> &limitTo(const C2SupportedValueSet<T> &limit);
+
+ /**
+ * Restrict (and thus define) the supported values to a value set.
+ */
+ C2ParamFieldValuesBuilder<T> &limitTo(const C2SupportedFlags<T> &limit);
+
+ /**
+ * Restrict (and thus define) the supported values to a range.
+ */
+ C2ParamFieldValuesBuilder<T> &limitTo(const C2SupportedRange<T> &limit);
+
+ struct Impl;
+ std::unique_ptr<Impl> _mImpl;
+};
+
+/**
+ * Builder for a list of setting conflicts.
+ */
+class C2SettingConflictsBuilder {
+public:
+ /**
+ * Creates an empty list of setting conflicts.
+ */
+ C2SettingConflictsBuilder();
+
+ /**
+ * Creates a list containing a single setting conflict.
+ */
+ C2SettingConflictsBuilder(C2ParamFieldValues &&conflict);
+
+ /**
+ * Adds a conflict to the current list of conflicts and returns this
+ */
+ C2SettingConflictsBuilder& with(C2ParamFieldValues &&conflict);
+
+ /**
+ * Gets the current list of conflicts (and moves them out of this builder.)
+ * (this is why it is not const)
+ */
+ std::vector<C2ParamFieldValues> retrieveConflicts();
+
+ /**
+ * Returns whether the current list is empty.
+ */
+ inline bool empty() const { return _mConflicts.empty(); }
+
+ inline operator bool() const { return empty(); }
+
+private:
+ std::vector<C2ParamFieldValues> _mConflicts;
+};
+
+/**
+ * Setting result builder for a parameter.
+ */
+struct C2SettingResultBuilder {
+ /**
+ * Creates a read-only setting result failure.
+ *
+ * This does not take FSV as only the current value of the field is supported.
+ */
+ static C2SettingResult ReadOnly(const C2ParamField ¶m);
+
+ /**
+ * Creates a bad-value or infoinformational bad-value setting result failure.
+ *
+ * This does not take FSV as the value is outside of the possible values. As such, there are no
+ * conflicts for this case either.
+ */
+ static C2SettingResult BadValue(const C2ParamField ¶mField, bool isInfo = false);
+
+ /**
+ * Creates a conflict (or informational conflict) setting result failure.
+ *
+ * This takes FSV so use paramFieldValues and optional conflicts.
+ */
+ static C2SettingResult Conflict(
+ C2ParamFieldValues &¶mFieldValues, C2SettingConflictsBuilder &conflicts,
+ bool isInfo = false);
+
+ // TODO: retrieve results
+
+
+private:
+ C2ParamField _mParamField;
+ C2SettingResult _mResult;
+
+ C2SettingResultBuilder(const C2SettingResultBuilder &) = delete;
+};
+
+/**
+ * Setting results (PLURAL) builder.
+ *
+ * Setting results contain a failure status along with a list of failing fields or params.
+ */
+struct C2SettingResultsBuilder {
+ C2SettingResultsBuilder(const C2SettingResultsBuilder&) = delete;
+ C2SettingResultsBuilder(C2SettingResultsBuilder&&) = default;
+ C2SettingResultsBuilder &operator=(C2SettingResultsBuilder&&) = default;
+
+ /** \returns (default) successful result with no details. */
+ inline static C2SettingResultsBuilder Ok() {
+ return C2SettingResultsBuilder(C2_OK);
+ }
+
+ /** \returns Interface is in bad state, with no further details. */
+ inline static C2SettingResultsBuilder BadState() {
+ return C2SettingResultsBuilder(C2_BAD_STATE);
+ }
+
+ /** \returns Interface connection timed out, with no further details. */
+ inline static C2SettingResultsBuilder TimedOut() {
+ return C2SettingResultsBuilder(C2_TIMED_OUT);
+ }
+
+ /** \returns Interface connection is corrupted, with no further details. */
+ inline static C2SettingResultsBuilder Corrupted() {
+ return C2SettingResultsBuilder(C2_CORRUPTED);
+ }
+
+ inline static C2SettingResultsBuilder NoMemory(C2Param::Index index_ __unused) {
+ // TODO: try to add failure result
+ return C2SettingResultsBuilder(C2_NO_MEMORY);
+ }
+
+ // TODO: this should not be a constructor
+ /** Creates a builder with a single bad value setting result. */
+ C2SettingResultsBuilder(C2SettingResult &&result);
+
+ /** Combines this results with other results. */
+ C2SettingResultsBuilder plus(C2SettingResultsBuilder&& results);
+
+ /** Retrieve (get and move out) failures and return the failure status. */
+ c2_status_t retrieveFailures(std::vector<std::unique_ptr<C2SettingResult>>* const failures);
+
+private:
+ /** Setting results based on a single status. This is used when actual setting could not be
+ * attempted to get a single C2SettingResult, or when a setting succeeded without
+ * 'complaints'. */
+ C2SettingResultsBuilder(c2_status_t status);
+ // status must be one of OK, BAD_STATE, TIMED_OUT, CORRUPTED or NO_MEMORY
+ // mainly: BLOCKING, BAD_INDEX, BAD_VALUE and NO_MEMORY requires a setting attempt, but
+ // NO_MEMORY may not allow us to create a results structure.
+
+ /**
+ * One of OK, BAD_INDEX, BAD_VALUE, BAD_STATE, NO_MEMORY, TIMED_OUT, BLOCKING or CORRUPTED.
+ */
+ c2_status_t _mStatus __unused;
+
+ /**
+ * Vector of individual setting result details.
+ */
+ std::vector<std::unique_ptr<C2SettingResult>> _mResults;
+};
+
+/**
+ * Utility class to enumerate fields of parameters.
+ */
+struct C2FieldUtils {
+ struct _Inspector;
+
+ /**
+ * An extended field descriptor object with structural information (lineage back to the root of
+ * the param).
+ */
+ struct Info {
+ typedef C2FieldDescriptor::type_t type_t; ///< field type
+ typedef C2FieldDescriptor::NamedValuesType NamedValuesType; ///< named values list type
+
+ /// returns the name of the field
+ C2String name() const;
+
+ /// returns the type of this field
+ type_t type() const;
+
+ /**
+ * Returns the defined name-value pairings for this field. The returned reference is
+ * only valid during the validity of this object
+ */
+ const NamedValuesType &namedValues() const;
+
+ /**
+ * The index of this field. E.g. param.field or param.field[0] has an index of 0, and
+ * param.struct[2].field[3] has an index of 3.
+ */
+ size_t index() const;
+
+ /// returns the length of the field in case it is an array. Returns 0 for
+ /// T[] arrays if this info comes from a C2Param::Index object, and the currently used
+ /// extent if it comes from a C2Param object. Returns 1 for T[1] arrays as well as if the
+ /// field is not an array.
+ size_t extent() const;
+
+ /**
+ * The (structural) depth of this field. E.g. param.field or param.field[0] has a depth of
+ * 0, and param.struct.field or param.struct[0].field[0] has a depth of 1.
+ */
+ size_t depth() const;
+
+ /**
+ * Returns the offset of this field in the parameter in bytes.
+ */
+ size_t offset() const;
+
+ /**
+ * Returns the size of this field in bytes.
+ */
+ size_t size() const;
+
+ /**
+ * The offset of this field's array. E.g. for param.struct[2].field[3] this is the offset
+ * of its smallest sibling: param.struct[2].field[0].
+ */
+ size_t arrayOffset() const;
+
+ /**
+ * Returns the size of this field's array. This is equivalent to extent() * size()
+ */
+ size_t arraySize() const;
+
+ /**
+ * The offset of the base field. The base field is a cousin of the current field where
+ * all indices are 0. E.g. the the base field for param.struct[2].field[3] is
+ * param.struct[0].field[0]. Base fields are used to specify supported values for
+ * all cousin fields.
+ */
+ size_t baseFieldOffset() const;
+
+ /**
+ * Returns whether this field is an arithmetic (integral, counter or float) field.
+ */
+ bool isArithmetic() const;
+
+ /**
+ * Returns whether this field can have a flexible extent. extent() returns the current
+ * extent.
+ */
+ bool isFlexible() const;
+
+ /// returns whether this info is valid
+ inline bool isValid() const { return _mImpl != nullptr; }
+
+ /// returns the info for the parent of this field, or an invalid Info object if it has no
+ /// parents
+ Info parent() const;
+
+ /// returns whether this info is valid
+ inline operator bool() const { return isValid(); }
+
+ struct Impl;
+ Info(std::shared_ptr<Impl>);
+
+ private:
+ std::shared_ptr<Impl> _mImpl;
+ friend struct _Inspector;
+ };
+
+ /**
+ * An (input) iterator object over fields using Info objects.
+ */
+ struct Iterator {
+ typedef Info const value_type;
+ typedef ptrdiff_t difference_type;
+ typedef Info const * pointer;
+ typedef Info const reference;
+ typedef std::input_iterator_tag iterator_category;
+
+ /// return Info at current position
+ virtual reference operator*() const;
+
+ /// move to the next field
+ virtual Iterator& operator++();
+
+ virtual bool operator==(const Iterator &) const;
+ inline bool operator!=(const Iterator &other) const { return !operator==(other); }
+
+ virtual ~Iterator() = default;
+
+ struct Impl;
+ Iterator(std::shared_ptr<Impl>);
+
+ protected:
+ std::shared_ptr<Impl> mImpl;
+ };
+
+ /**
+ * An (input) iterable object representing a list of fields.
+ */
+ struct List {
+ /// returns an iterator to the beginning of the list
+ virtual Iterator begin() const;
+
+ /// returns an iterator to the end of the list
+ virtual Iterator end() const;
+
+ virtual ~List() = default;
+
+ struct Impl;
+ List(std::shared_ptr<Impl>);
+
+ protected:
+ std::shared_ptr<Impl> mImpl;
+ };
+
+ /**
+ * Enumerates all (base) fields at index 0 of the parameter. The order of iteration is the
+ * following:
+ * Fields of a structure are enumerated in field order. However, sub-fields of a structure
+ * are enumerated directly after the structure field, and prior to sibling fields.
+ *
+ * In essence the order of enumeration is first by increasing offset, then by decreasing size.
+ *
+ * \param param parameter to enumerate its fields
+ * \param reflector parameter reflector used for enumeration
+ *
+ * \return an iterable object
+ */
+ static List enumerateFields(
+ const C2Param ¶m,
+ const std::shared_ptr<C2ParamReflector> &reflector);
+
+ /**
+ * Enumerates all cousin fields up to depth - level for a field. If level is 0, it enumerates
+ * only the field. For level 1, it enumerates all fields in its current array (which may be
+ * itself if extent is 1). The order of iteration is by increasing field offset.
+ */
+ static List enumerateCousins(
+ const Info &field,
+ uint32_t level = ~0);
+
+ /**
+ * Locates the field in a parameter and returns a list of 2 elements - the most-specific field
+ * array of the parameter that contains the entire field. If the field is not a valid field
+ * specifier for this parameter (e.g. it is outside the bounds of the parameter), it returns
+ * an empty list.
+ */
+ static std::vector<Info> locateField(
+ const C2Param ¶m, const _C2FieldId &field,
+ const std::shared_ptr<C2ParamReflector> &reflector);
+
+ static std::vector<Info> locateField(
+ const C2ParamField &pf, const std::shared_ptr<C2ParamReflector> &reflector);
+
+};
+
+#include <util/C2Debug-interface.h>
+
+#endif // C2UTILS_INTERFACE_UTILS_H_
diff --git a/media/codec2/vndk/include/util/C2ParamUtils.h b/media/codec2/vndk/include/util/C2ParamUtils.h
new file mode 100644
index 0000000..b51bd94
--- /dev/null
+++ b/media/codec2/vndk/include/util/C2ParamUtils.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef C2UTILS_PARAM_UTILS_H_
+#define C2UTILS_PARAM_UTILS_H_
+
+#include <utility>
+#include <vector>
+
+/** \file
+ * Utilities for parameter handling to be used by Codec2 implementations.
+ */
+
+/// \cond INTERNAL
+
+struct C2Param;
+
+class C2ParamUtils {
+ friend class C2UtilTest_ParamUtilsTest_Test;
+
+public:
+
+ /// safe(r) parsing from parameter blob
+ static
+ C2Param *ParseFirst(const uint8_t *blob, size_t size);
+};
+
+/// \endcond
+
+#endif // C2UTILS_PARAM_UTILS_H_
+
diff --git a/media/codec2/vndk/internal/C2BlockInternal.h b/media/codec2/vndk/internal/C2BlockInternal.h
new file mode 100644
index 0000000..2abf3ac
--- /dev/null
+++ b/media/codec2/vndk/internal/C2BlockInternal.h
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_STAGEFRIGHT_C2BLOCK_INTERNAL_H_
+#define ANDROID_STAGEFRIGHT_C2BLOCK_INTERNAL_H_
+
+#include <android/hardware/graphics/bufferqueue/1.0/IGraphicBufferProducer.h>
+
+#include <C2Buffer.h>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace bufferpool {
+
+struct BufferPoolData;
+
+}
+}
+}
+}
+
+/**
+ * Stores informations from C2BlockPool implementations which are required by C2Block.
+ */
+struct C2_HIDE _C2BlockPoolData {
+ enum type_t : int {
+ TYPE_BUFFERPOOL = 0,
+ TYPE_BUFFERQUEUE,
+ };
+
+ virtual type_t getType() const = 0;
+
+protected:
+ _C2BlockPoolData() = default;
+
+ virtual ~_C2BlockPoolData() = default;
+};
+
+struct C2BufferQueueBlockPoolData;
+
+/**
+ * Internal only interface for creating blocks by block pool/buffer passing implementations.
+ *
+ * \todo this must be hidden
+ */
+struct _C2BlockFactory {
+ /**
+ * Create a linear block from an allocation for an allotted range.
+ *
+ * \param alloc parent allocation
+ * \param data blockpool data
+ * \param offset allotted range offset
+ * \param size allotted size
+ *
+ * \return shared pointer to the linear block. nullptr if there was not enough memory to
+ * create this block.
+ */
+ static
+ std::shared_ptr<C2LinearBlock> CreateLinearBlock(
+ const std::shared_ptr<C2LinearAllocation> &alloc,
+ const std::shared_ptr<_C2BlockPoolData> &data = nullptr,
+ size_t offset = 0,
+ size_t size = ~(size_t)0);
+
+ /**
+ * Create a graphic block from an allocation for an allotted section.
+ *
+ * \param alloc parent allocation
+ * \param data blockpool data
+ * \param crop allotted crop region
+ *
+ * \return shared pointer to the graphic block. nullptr if there was not enough memory to
+ * create this block.
+ */
+ static
+ std::shared_ptr<C2GraphicBlock> CreateGraphicBlock(
+ const std::shared_ptr<C2GraphicAllocation> &alloc,
+ const std::shared_ptr<_C2BlockPoolData> &data = nullptr,
+ const C2Rect &allottedCrop = C2Rect(~0u, ~0u));
+
+ /**
+ * Return a block pool data from 1D block.
+ *
+ * \param shared pointer to the 1D block which is already created.
+ */
+ static
+ std::shared_ptr<_C2BlockPoolData> GetLinearBlockPoolData(
+ const C2Block1D& block);
+
+ /**
+ * Return a block pool data from 2D block.
+ *
+ * \param shared pointer to the 2D block which is already created.
+ */
+ static
+ std::shared_ptr<_C2BlockPoolData> GetGraphicBlockPoolData(
+ const C2Block2D& block);
+
+ /**
+ * Create a linear block from the received native handle.
+ *
+ * \param handle native handle to a linear block
+ *
+ * \return shared pointer to the linear block. nullptr if there was not enough memory to
+ * create this block.
+ */
+ static
+ std::shared_ptr<C2LinearBlock> CreateLinearBlock(
+ const C2Handle *handle);
+
+ /**
+ * Create a graphic block from the received native handle.
+ *
+ * \param handle native handle to a graphic block
+ *
+ * \return shared pointer to the graphic block. nullptr if there was not enough memory to
+ * create this block.
+ */
+ static
+ std::shared_ptr<C2GraphicBlock> CreateGraphicBlock(
+ const C2Handle *handle);
+
+ /**
+ * Create a linear block from the received bufferpool data.
+ *
+ * \param data bufferpool data to a linear block
+ *
+ * \return shared pointer to the linear block. nullptr if there was not enough memory to
+ * create this block.
+ */
+ static
+ std::shared_ptr<C2LinearBlock> CreateLinearBlock(
+ const C2Handle *handle,
+ const std::shared_ptr<android::hardware::media::bufferpool::BufferPoolData> &data);
+
+ /**
+ * Create a graphic block from the received bufferpool data.
+ *
+ * \param data bufferpool data to a graphic block
+ *
+ * \return shared pointer to the graphic block. nullptr if there was not enough memory to
+ * create this block.
+ */
+ static
+ std::shared_ptr<C2GraphicBlock> CreateGraphicBlock(
+ const C2Handle *handle,
+ const std::shared_ptr<android::hardware::media::bufferpool::BufferPoolData> &data);
+
+ /**
+ * Get bufferpool data from the blockpool data.
+ *
+ * \param poolData blockpool data
+ * \param bufferPoolData pointer to bufferpool data where the bufferpool
+ * data is stored.
+ *
+ * \return {\code true} when there is valid bufferpool data, {\code false} otherwise.
+ */
+ static
+ bool GetBufferPoolData(
+ const std::shared_ptr<const _C2BlockPoolData> &poolData,
+ std::shared_ptr<android::hardware::media::bufferpool::BufferPoolData> *bufferPoolData);
+
+ /*
+ * Life Cycle Management of BufferQueue-Based Blocks
+ * =================================================
+ *
+ * A block that is created by a bufferqueue-based blockpool requires some
+ * special treatment when it is destroyed. In particular, if the block
+ * corresponds to a held (dequeued/attached) GraphicBuffer in a slot of a
+ * bufferqueue, its destruction should trigger a call to
+ * IGraphicBufferProducer::cancelBuffer(). On the other hand, if the
+ * GraphicBuffer is not held, i.e., if it has been queued or detached,
+ * cancelBuffer() should not be called upon the destruction of the block.
+ *
+ * _C2BlockPoolData created by a bufferqueue-based blockpool includes two
+ * main pieces of information:
+ * - "held" status: Whether cancelBuffer() should be called upon
+ * destruction of the block.
+ * - bufferqueue assignment: The quadruple (igbp, generation, bqId,
+ * bqSlot), where igbp is the IGraphicBufferProducer instance of the
+ * bufferqueue, generation is the latest generation number, of the
+ * bufferqueue, bqId is the globally unique id of the bufferqueue, and
+ * bqSlot is the slot in the bufferqueue.
+ *
+ * igbp is the instance of IGraphicBufferProducer on which cancelBuffer()
+ * will be called if "held" status is true when the block is destroyed.
+ * (bqSlot is an input to cancelBuffer().) However, only generation, bqId
+ * and bqSlot are retained when a block is transferred from one process to
+ * another. It is the responsibility of both the sending and receiving
+ * processes to maintain consistency of "held" status and igbp. Below are
+ * functions provided for this purpose:
+ *
+ * - GetBufferQueueData(): Returns generation, bqId and bqSlot.
+ * - HoldBlockFromBufferQueue(): Sets "held" status to true.
+ * - YieldBlockToBufferQueue(): Sets "held" status to false.
+ * - AssignBlockToBufferQueue(): Sets the bufferqueue assignment and
+ * "held" status.
+ *
+ * All these functions operate on _C2BlockPoolData, which can be obtained by
+ * calling GetGraphicBlockPoolData().
+ *
+ * HoldBlockFromBufferQueue() will mark the block as held, while
+ * YieldBlockToBufferQueue() will do the opposite. These two functions do
+ * not modify the bufferqueue assignment, so it is not wrong to call
+ * HoldBlockFromBufferQueue() after YieldBlockToBufferQueue() if it can be
+ * guaranteed that the block is not destroyed during the period between the
+ * two calls.
+ *
+ * AssingBlockToBufferQueue() has a "held" status as an optional argument.
+ * The default value is true.
+ *
+ * Maintaining Consistency with IGraphicBufferProducer Operations
+ * ==============================================================
+ *
+ * dequeueBuffer()
+ * - This function is called by the blockpool. It should not be called
+ * manually. The blockpool will automatically generate the correct
+ * information for _C2BlockPoolData, with "held" status set to true.
+ *
+ * queueBuffer()
+ * - After queueBuffer() is called, YieldBlockToBufferQueue() should be
+ * called.
+ *
+ * attachBuffer()
+ * - After attachBuffer() is called, AssignBlockToBufferQueue() should be
+ * called with "held" status set to true.
+ *
+ * detachBuffer()
+ * - After detachBuffer() is called, HoldBlockFromBufferQueue() should be
+ * called.
+ */
+
+ /**
+ * Get bufferqueue data from the blockpool data.
+ *
+ * Calling this function with \p generation set to nullptr will return
+ * whether the block comes from a bufferqueue-based blockpool, but will not
+ * fill in the values for \p generation, \p bqId or \p bqSlot.
+ *
+ * \param[in] poolData blockpool data.
+ * \param[out] generation Generation number attached to the buffer.
+ * \param[out] bqId Id of the bufferqueue owning the buffer (block).
+ * \param[out] bqSlot Slot number of the buffer.
+ *
+ * \return \c true when there is valid bufferqueue data;
+ * \c false otherwise.
+ */
+ static
+ bool GetBufferQueueData(
+ const std::shared_ptr<_C2BlockPoolData>& poolData,
+ uint32_t* generation = nullptr,
+ uint64_t* bqId = nullptr,
+ int32_t* bqSlot = nullptr);
+
+ /**
+ * Set bufferqueue assignment and "held" status to a block created by a
+ * bufferqueue-based blockpool.
+ *
+ * \param poolData blockpool data associated to the block.
+ * \param igbp \c IGraphicBufferProducer instance from the designated
+ * bufferqueue.
+ * \param generation Generation number that the buffer belongs to.
+ * \param bqId Id of the bufferqueue that will own the buffer (block).
+ * \param bqSlot Slot number of the buffer.
+ * \param held Whether the block is held. This "held" status can be
+ * changed later by calling YieldBlockToBufferQueue() or
+ * HoldBlockFromBufferQueue().
+ *
+ * \return \c true if \p poolData is valid bufferqueue data;
+ * \c false otherwise.
+ *
+ * Note: \p generation should match the latest generation number set on the
+ * bufferqueue, and \p bqId should match the unique id for the bufferqueue
+ * (obtainable by calling igbp->getUniqueId()).
+ */
+ static
+ bool AssignBlockToBufferQueue(
+ const std::shared_ptr<_C2BlockPoolData>& poolData,
+ const ::android::sp<::android::hardware::graphics::bufferqueue::
+ V1_0::IGraphicBufferProducer>& igbp,
+ uint32_t generation,
+ uint64_t bqId,
+ int32_t bqSlot,
+ bool held = true);
+
+ /**
+ * Hold a block from the designated bufferqueue. This causes the destruction
+ * of the block to trigger a call to cancelBuffer().
+ *
+ * This function assumes that \p poolData comes from a bufferqueue-based
+ * block. It does not check if that is the case.
+ *
+ * \param poolData blockpool data associated to the block.
+ * \param igbp \c IGraphicBufferProducer instance to be assigned to the
+ * block. This is not needed when the block is local.
+ *
+ * \return The previous held status.
+ */
+ static
+ bool HoldBlockFromBufferQueue(
+ const std::shared_ptr<_C2BlockPoolData>& poolData,
+ const ::android::sp<::android::hardware::graphics::bufferqueue::
+ V1_0::IGraphicBufferProducer>& igbp = nullptr);
+
+ /**
+ * Yield a block to the designated bufferqueue. This causes the destruction
+ * of the block not to trigger a call to cancelBuffer();
+ *
+ * This function assumes that \p poolData comes from a bufferqueue-based
+ * block. It does not check if that is the case.
+ *
+ * \param poolData blockpool data associated to the block.
+ *
+ * \return The previous held status.
+ */
+ static
+ bool YieldBlockToBufferQueue(
+ const std::shared_ptr<_C2BlockPoolData>& poolData);
+
+};
+
+#endif // ANDROID_STAGEFRIGHT_C2BLOCK_INTERNAL_H_
+
diff --git a/media/codec2/vndk/internal/C2ParamInternal.h b/media/codec2/vndk/internal/C2ParamInternal.h
new file mode 100644
index 0000000..24a8f27
--- /dev/null
+++ b/media/codec2/vndk/internal/C2ParamInternal.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_STAGEFRIGHT_C2PARAM_INTERNAL_H_
+#define ANDROID_STAGEFRIGHT_C2PARAM_INTERNAL_H_
+
+#include <C2Param.h>
+
+struct C2_HIDE _C2ParamInspector {
+ inline static uint32_t GetOffset(const C2FieldDescriptor &fd) {
+ return fd._mFieldId._mOffset;
+ }
+
+ inline static void SetOffset(C2FieldDescriptor &fd, uint32_t offset) {
+ fd._mFieldId._mOffset = offset;
+ }
+
+ inline static uint32_t GetEndOffset(const C2FieldDescriptor &fd, uint32_t paramSize = 0) {
+ uint32_t endOffset = fd._mFieldId._mOffset + fd._mExtent * fd._mFieldId._mSize;
+ /// for flex parameters return paramSize if given
+ return fd._mExtent ? endOffset : std::max(endOffset, paramSize);
+ }
+
+ inline static uint32_t GetSize(const C2FieldDescriptor &fd) {
+ return fd._mFieldId._mSize;
+ }
+
+ inline static uint32_t GetIndex(const C2ParamField &pf) {
+ return pf._mIndex;
+ }
+
+ inline static uint32_t GetOffset(const C2ParamField &pf) {
+ return pf._mFieldId._mOffset;
+ }
+
+ inline static uint32_t GetSize(const C2ParamField &pf) {
+ return pf._mFieldId._mSize;
+ }
+
+ inline static uint32_t GetOffset(const _C2FieldId &f) {
+ return f._mOffset;
+ }
+
+ inline static uint32_t GetSize(const _C2FieldId &f) {
+ return f._mSize;
+ }
+
+ inline static _C2FieldId GetField(const C2FieldDescriptor &fd) {
+ return fd._mFieldId;
+ }
+
+ inline static uint32_t GetAttrib(const C2ParamDescriptor &pd) {
+ return pd._mAttrib;
+ }
+
+ inline static _C2FieldId GetField(const C2ParamField &pf) {
+ return pf._mFieldId;
+ }
+
+ inline static
+ C2ParamField CreateParamField(C2Param::Index index, uint32_t offset, uint32_t size) {
+ return C2ParamField(index, offset, size);
+ }
+
+ inline static
+ C2ParamField CreateParamField(C2Param::Index index, _C2FieldId field) {
+ return C2ParamField(index, field._mOffset, field._mSize);
+ }
+
+ inline static
+ void TrimParam(C2Param *param, uint32_t newSize) {
+ if (param && *param && param->size() > newSize && newSize >= sizeof(C2Param)) {
+ param->_mSize = newSize;
+ }
+ }
+
+ inline static void AddNamedValues(
+ C2FieldDescriptor &fd, C2FieldDescriptor::NamedValuesType &&namedValues) {
+ fd._mNamedValues = std::move(namedValues);
+ }
+
+ inline static
+ C2StructDescriptor CreateStructDescriptor(C2Param::CoreIndex index,
+ std::vector<C2FieldDescriptor> &&fields) {
+ return C2StructDescriptor(index, std::move(fields));
+ }
+
+ inline static
+ C2FieldDescriptor OffsetFieldDescriptor(const C2FieldDescriptor &fd, size_t offset) {
+ return C2FieldDescriptor(fd, offset);
+ }
+
+ // expose attributes
+ typedef C2ParamDescriptor::attrib_t attrib_t;
+};
+
+#endif // ANDROID_STAGEFRIGHT_C2PARAM_INTERNAL_H_
+
diff --git a/media/codec2/vndk/platform/C2BqBuffer.cpp b/media/codec2/vndk/platform/C2BqBuffer.cpp
new file mode 100644
index 0000000..7a26035
--- /dev/null
+++ b/media/codec2/vndk/platform/C2BqBuffer.cpp
@@ -0,0 +1,494 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "C2BqBuffer"
+#include <utils/Log.h>
+
+#include <gui/BufferQueueDefs.h>
+#include <list>
+#include <map>
+#include <mutex>
+
+#include <C2AllocatorGralloc.h>
+#include <C2BqBufferPriv.h>
+#include <C2BlockInternal.h>
+
+using ::android::AnwBuffer;
+using ::android::BufferQueueDefs::NUM_BUFFER_SLOTS;
+using ::android::C2AllocatorGralloc;
+using ::android::C2AndroidMemoryUsage;
+using ::android::Fence;
+using ::android::GraphicBuffer;
+using ::android::HGraphicBufferProducer;
+using ::android::IGraphicBufferProducer;
+using ::android::hidl_handle;
+using ::android::sp;
+using ::android::status_t;
+using ::android::wp;
+
+using ::android::hardware::Return;
+using ::android::hardware::graphics::common::V1_0::PixelFormat;
+
+struct C2BufferQueueBlockPoolData : public _C2BlockPoolData {
+
+ bool held;
+ bool local;
+ uint32_t generation;
+ uint64_t bqId;
+ int32_t bqSlot;
+ sp<HGraphicBufferProducer> igbp;
+ std::shared_ptr<C2BufferQueueBlockPool::Impl> localPool;
+
+ virtual type_t getType() const override {
+ return TYPE_BUFFERQUEUE;
+ }
+
+ // Create a remote BlockPoolData.
+ C2BufferQueueBlockPoolData(
+ uint32_t generation, uint64_t bqId, int32_t bqSlot,
+ const sp<HGraphicBufferProducer>& producer = nullptr);
+
+ // Create a local BlockPoolData.
+ C2BufferQueueBlockPoolData(
+ uint32_t generation, uint64_t bqId, int32_t bqSlot,
+ const std::shared_ptr<C2BufferQueueBlockPool::Impl>& pool);
+
+ virtual ~C2BufferQueueBlockPoolData() override;
+
+};
+
+bool _C2BlockFactory::GetBufferQueueData(
+ const std::shared_ptr<_C2BlockPoolData>& data,
+ uint32_t* generation, uint64_t* bqId, int32_t* bqSlot) {
+ if (data && data->getType() == _C2BlockPoolData::TYPE_BUFFERQUEUE) {
+ if (generation) {
+ const std::shared_ptr<C2BufferQueueBlockPoolData> poolData =
+ std::static_pointer_cast<C2BufferQueueBlockPoolData>(data);
+ *generation = poolData->generation;
+ if (bqId) {
+ *bqId = poolData->bqId;
+ }
+ if (bqSlot) {
+ *bqSlot = poolData->bqSlot;
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+bool _C2BlockFactory::AssignBlockToBufferQueue(
+ const std::shared_ptr<_C2BlockPoolData>& data,
+ const sp<HGraphicBufferProducer>& igbp,
+ uint32_t generation,
+ uint64_t bqId,
+ int32_t bqSlot,
+ bool held) {
+ if (data && data->getType() == _C2BlockPoolData::TYPE_BUFFERQUEUE) {
+ const std::shared_ptr<C2BufferQueueBlockPoolData> poolData =
+ std::static_pointer_cast<C2BufferQueueBlockPoolData>(data);
+ poolData->igbp = igbp;
+ poolData->generation = generation;
+ poolData->bqId = bqId;
+ poolData->bqSlot = bqSlot;
+ poolData->held = held;
+ return true;
+ }
+ return false;
+}
+
+bool _C2BlockFactory::HoldBlockFromBufferQueue(
+ const std::shared_ptr<_C2BlockPoolData>& data,
+ const sp<HGraphicBufferProducer>& igbp) {
+ const std::shared_ptr<C2BufferQueueBlockPoolData> poolData =
+ std::static_pointer_cast<C2BufferQueueBlockPoolData>(data);
+ if (!poolData->local) {
+ poolData->igbp = igbp;
+ }
+ if (poolData->held) {
+ poolData->held = true;
+ return false;
+ }
+ poolData->held = true;
+ return true;
+}
+
+bool _C2BlockFactory::YieldBlockToBufferQueue(
+ const std::shared_ptr<_C2BlockPoolData>& data) {
+ const std::shared_ptr<C2BufferQueueBlockPoolData> poolData =
+ std::static_pointer_cast<C2BufferQueueBlockPoolData>(data);
+ if (!poolData->held) {
+ poolData->held = false;
+ return false;
+ }
+ poolData->held = false;
+ return true;
+}
+
+std::shared_ptr<C2GraphicBlock> _C2BlockFactory::CreateGraphicBlock(
+ const C2Handle *handle) {
+ // TODO: get proper allocator? and mutex?
+ static std::unique_ptr<C2AllocatorGralloc> sAllocator = std::make_unique<C2AllocatorGralloc>(0);
+
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ if (C2AllocatorGralloc::isValid(handle)) {
+ uint32_t width;
+ uint32_t height;
+ uint32_t format;
+ uint64_t usage;
+ uint32_t stride;
+ uint32_t generation;
+ uint64_t bqId;
+ uint32_t bqSlot;
+ android::_UnwrapNativeCodec2GrallocMetadata(
+ handle, &width, &height, &format, &usage, &stride, &generation, &bqId, &bqSlot);
+ c2_status_t err = sAllocator->priorGraphicAllocation(handle, &alloc);
+ if (err == C2_OK) {
+ std::shared_ptr<C2GraphicBlock> block;
+ if (bqId || bqSlot) {
+ // BQBBP
+ std::shared_ptr<C2BufferQueueBlockPoolData> poolData =
+ std::make_shared<C2BufferQueueBlockPoolData>(generation,
+ bqId,
+ (int32_t)bqSlot);
+ block = _C2BlockFactory::CreateGraphicBlock(alloc, poolData);
+ } else {
+ block = _C2BlockFactory::CreateGraphicBlock(alloc);
+ }
+ return block;
+ }
+ }
+ return nullptr;
+}
+
+class C2BufferQueueBlockPool::Impl
+ : public std::enable_shared_from_this<C2BufferQueueBlockPool::Impl> {
+private:
+ c2_status_t fetchFromIgbp_l(
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block /* nonnull */) {
+ // We have an IGBP now.
+ sp<Fence> fence = new Fence();
+ C2AndroidMemoryUsage androidUsage = usage;
+ status_t status;
+ PixelFormat pixelFormat = static_cast<PixelFormat>(format);
+ int slot;
+ ALOGV("tries to dequeue buffer");
+ Return<void> transStatus = mProducer->dequeueBuffer(
+ width, height, pixelFormat, androidUsage.asGrallocUsage(), true,
+ [&status, &slot, &fence](
+ int32_t tStatus, int32_t tSlot, hidl_handle const& tFence,
+ HGraphicBufferProducer::FrameEventHistoryDelta const& tTs) {
+ status = tStatus;
+ slot = tSlot;
+ if (!android::conversion::convertTo(fence.get(), tFence) &&
+ status == android::NO_ERROR) {
+ status = android::BAD_VALUE;
+ }
+ (void) tTs;
+ });
+ // dequeueBuffer returns flag.
+ if (!transStatus.isOk() || status < android::OK) {
+ ALOGD("cannot dequeue buffer %d", status);
+ if (transStatus.isOk() && status == android::INVALID_OPERATION) {
+ // Too many buffer dequeued. retrying after some time is required.
+ return C2_TIMED_OUT;
+ } else {
+ return C2_BAD_VALUE;
+ }
+ }
+ ALOGV("dequeued a buffer successfully");
+ native_handle_t* nh = nullptr;
+ hidl_handle fenceHandle;
+ if (fence) {
+ android::conversion::wrapAs(&fenceHandle, &nh, *fence);
+ }
+ if (fence) {
+ static constexpr int kFenceWaitTimeMs = 10;
+
+ status_t status = fence->wait(kFenceWaitTimeMs);
+ if (status == -ETIME) {
+ // fence is not signalled yet.
+ (void)mProducer->cancelBuffer(slot, fenceHandle).isOk();
+ return C2_TIMED_OUT;
+ }
+ if (status != android::NO_ERROR) {
+ ALOGD("buffer fence wait error %d", status);
+ (void)mProducer->cancelBuffer(slot, fenceHandle).isOk();
+ return C2_BAD_VALUE;
+ } else if (mRenderCallback) {
+ nsecs_t signalTime = fence->getSignalTime();
+ if (signalTime >= 0 && signalTime < INT64_MAX) {
+ mRenderCallback(mProducerId, slot, signalTime);
+ } else {
+ ALOGV("got fence signal time of %lld", (long long)signalTime);
+ }
+ }
+ }
+
+ sp<GraphicBuffer> &slotBuffer = mBuffers[slot];
+ if (status & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION || !slotBuffer) {
+ if (!slotBuffer) {
+ slotBuffer = new GraphicBuffer();
+ }
+ // N.B. This assumes requestBuffer# returns an existing allocation
+ // instead of a new allocation.
+ Return<void> transStatus = mProducer->requestBuffer(
+ slot,
+ [&status, &slotBuffer](int32_t tStatus, AnwBuffer const& tBuffer){
+ status = tStatus;
+ if (!android::conversion::convertTo(slotBuffer.get(), tBuffer) &&
+ status == android::NO_ERROR) {
+ status = android::BAD_VALUE;
+ }
+ });
+
+ if (!transStatus.isOk()) {
+ return C2_BAD_VALUE;
+ } else if (status != android::NO_ERROR) {
+ slotBuffer.clear();
+ (void)mProducer->cancelBuffer(slot, fenceHandle).isOk();
+ return C2_BAD_VALUE;
+ }
+ }
+ if (slotBuffer) {
+ native_handle_t *grallocHandle = native_handle_clone(slotBuffer->handle);
+
+ if (grallocHandle) {
+ ALOGV("buffer wraps %llu %d", (unsigned long long)mProducerId, slot);
+ C2Handle *c2Handle = android::WrapNativeCodec2GrallocHandle(
+ grallocHandle,
+ slotBuffer->width,
+ slotBuffer->height,
+ slotBuffer->format,
+ slotBuffer->usage,
+ slotBuffer->stride,
+ slotBuffer->getGenerationNumber(),
+ mProducerId, slot);
+ if (c2Handle) {
+ // Moved everything to c2Handle.
+ native_handle_delete(grallocHandle);
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ c2_status_t err = mAllocator->priorGraphicAllocation(c2Handle, &alloc);
+ if (err != C2_OK) {
+ return err;
+ }
+ std::shared_ptr<C2BufferQueueBlockPoolData> poolData =
+ std::make_shared<C2BufferQueueBlockPoolData>(
+ slotBuffer->getGenerationNumber(),
+ mProducerId, slot, shared_from_this());
+ *block = _C2BlockFactory::CreateGraphicBlock(alloc, poolData);
+ return C2_OK;
+ }
+ native_handle_close(grallocHandle);
+ native_handle_delete(grallocHandle);
+ }
+ // Block was not created. call requestBuffer# again next time.
+ slotBuffer.clear();
+ (void)mProducer->cancelBuffer(slot, fenceHandle).isOk();
+ }
+ return C2_BAD_VALUE;
+ }
+
+public:
+ Impl(const std::shared_ptr<C2Allocator> &allocator)
+ : mInit(C2_OK), mProducerId(0), mAllocator(allocator) {
+ }
+
+ ~Impl() {
+ bool noInit = false;
+ for (int i = 0; i < NUM_BUFFER_SLOTS; ++i) {
+ if (!noInit && mProducer) {
+ Return<int32_t> transResult =
+ mProducer->detachBuffer(static_cast<int32_t>(i));
+ noInit = !transResult.isOk() ||
+ static_cast<int32_t>(transResult) == android::NO_INIT;
+ }
+ mBuffers[i].clear();
+ }
+ }
+
+ c2_status_t fetchGraphicBlock(
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block /* nonnull */) {
+ block->reset();
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+
+ static int kMaxIgbpRetry = 20; // TODO: small number can cause crash in releasing.
+ static int kMaxIgbpRetryDelayUs = 10000;
+
+ int curTry = 0;
+
+ while (curTry++ < kMaxIgbpRetry) {
+ std::unique_lock<std::mutex> lock(mMutex);
+ // TODO: return C2_NO_INIT
+ if (mProducerId == 0) {
+ std::shared_ptr<C2GraphicAllocation> alloc;
+ c2_status_t err = mAllocator->newGraphicAllocation(
+ width, height, format, usage, &alloc);
+ if (err != C2_OK) {
+ return err;
+ }
+ std::shared_ptr<C2BufferQueueBlockPoolData> poolData =
+ std::make_shared<C2BufferQueueBlockPoolData>(
+ 0, (uint64_t)0, ~0, shared_from_this());
+ // TODO: config?
+ *block = _C2BlockFactory::CreateGraphicBlock(alloc, poolData);
+ ALOGV("allocated a buffer successfully");
+
+ return C2_OK;
+ }
+ c2_status_t status = fetchFromIgbp_l(width, height, format, usage, block);
+ if (status == C2_TIMED_OUT) {
+ lock.unlock();
+ ::usleep(kMaxIgbpRetryDelayUs);
+ continue;
+ }
+ return status;
+ }
+ return C2_TIMED_OUT;
+ }
+
+ void setRenderCallback(const OnRenderCallback &renderCallback) {
+ std::lock_guard<std::mutex> lock(mMutex);
+ mRenderCallback = renderCallback;
+ }
+
+ void configureProducer(const sp<HGraphicBufferProducer> &producer) {
+ int32_t status = android::OK;
+ uint64_t producerId = 0;
+ if (producer) {
+ Return<void> transStatus = producer->getUniqueId(
+ [&status, &producerId](int32_t tStatus, int64_t tProducerId) {
+ status = tStatus;
+ producerId = tProducerId;
+ });
+ if (!transStatus.isOk()) {
+ ALOGD("configureProducer -- failed to connect to the producer");
+ return;
+ }
+ }
+ {
+ std::lock_guard<std::mutex> lock(mMutex);
+ bool noInit = false;
+ for (int i = 0; i < NUM_BUFFER_SLOTS; ++i) {
+ if (!noInit && mProducer) {
+ Return<int32_t> transResult =
+ mProducer->detachBuffer(static_cast<int32_t>(i));
+ noInit = !transResult.isOk() ||
+ static_cast<int32_t>(transResult) == android::NO_INIT;
+ }
+ mBuffers[i].clear();
+ }
+ if (producer && status == android::OK) {
+ mProducer = producer;
+ mProducerId = producerId;
+ } else {
+ mProducer = nullptr;
+ mProducerId = 0;
+ }
+ }
+ }
+
+private:
+ friend struct C2BufferQueueBlockPoolData;
+
+ void cancel(uint64_t igbp_id, int32_t igbp_slot) {
+ std::lock_guard<std::mutex> lock(mMutex);
+ if (igbp_id == mProducerId && mProducer) {
+ (void)mProducer->cancelBuffer(igbp_slot, nullptr).isOk();
+ }
+ }
+
+ c2_status_t mInit;
+ uint64_t mProducerId;
+ OnRenderCallback mRenderCallback;
+
+ const std::shared_ptr<C2Allocator> mAllocator;
+
+ std::mutex mMutex;
+ sp<HGraphicBufferProducer> mProducer;
+
+ sp<GraphicBuffer> mBuffers[NUM_BUFFER_SLOTS];
+};
+
+C2BufferQueueBlockPoolData::C2BufferQueueBlockPoolData(
+ uint32_t generation, uint64_t bqId, int32_t bqSlot,
+ const sp<HGraphicBufferProducer>& producer) :
+ held(producer && bqId != 0), local(false),
+ generation(generation), bqId(bqId), bqSlot(bqSlot),
+ igbp(producer),
+ localPool() {
+}
+
+C2BufferQueueBlockPoolData::C2BufferQueueBlockPoolData(
+ uint32_t generation, uint64_t bqId, int32_t bqSlot,
+ const std::shared_ptr<C2BufferQueueBlockPool::Impl>& pool) :
+ held(true), local(true),
+ generation(generation), bqId(bqId), bqSlot(bqSlot),
+ igbp(pool ? pool->mProducer : nullptr),
+ localPool(pool) {
+}
+
+C2BufferQueueBlockPoolData::~C2BufferQueueBlockPoolData() {
+ if (!held || bqId == 0) {
+ return;
+ }
+ if (local && localPool) {
+ localPool->cancel(bqId, bqSlot);
+ } else if (igbp) {
+ igbp->cancelBuffer(bqSlot, nullptr);
+ }
+}
+
+C2BufferQueueBlockPool::C2BufferQueueBlockPool(
+ const std::shared_ptr<C2Allocator> &allocator, const local_id_t localId)
+ : mAllocator(allocator), mLocalId(localId), mImpl(new Impl(allocator)) {}
+
+C2BufferQueueBlockPool::~C2BufferQueueBlockPool() {}
+
+c2_status_t C2BufferQueueBlockPool::fetchGraphicBlock(
+ uint32_t width,
+ uint32_t height,
+ uint32_t format,
+ C2MemoryUsage usage,
+ std::shared_ptr<C2GraphicBlock> *block /* nonnull */) {
+ if (mImpl) {
+ return mImpl->fetchGraphicBlock(width, height, format, usage, block);
+ }
+ return C2_CORRUPTED;
+}
+
+void C2BufferQueueBlockPool::configureProducer(const sp<HGraphicBufferProducer> &producer) {
+ if (mImpl) {
+ mImpl->configureProducer(producer);
+ }
+}
+
+void C2BufferQueueBlockPool::setRenderCallback(const OnRenderCallback &renderCallback) {
+ if (mImpl) {
+ mImpl->setRenderCallback(renderCallback);
+ }
+}
diff --git a/media/codec2/vndk/util/C2Debug.cpp b/media/codec2/vndk/util/C2Debug.cpp
new file mode 100644
index 0000000..b4aa719
--- /dev/null
+++ b/media/codec2/vndk/util/C2Debug.cpp
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <C2ParamInternal.h>
+#include <util/C2Debug-interface.h>
+#include <util/C2Debug-param.h>
+#include <util/C2InterfaceUtils.h>
+
+#include <iostream>
+
+#include <android-base/stringprintf.h>
+
+using android::base::StringPrintf;
+
+/* -------------------------------- asString -------------------------------- */
+
+const char *asString(c2_status_t i, const char *def) {
+ switch (i) {
+ case C2_OK: return "OK";
+ case C2_BAD_VALUE: return "BAD_VALUE";
+ case C2_BAD_INDEX: return "BAD_INDEX";
+ case C2_CANNOT_DO: return "CANNOT_DO";
+ case C2_DUPLICATE: return "DUPLICATE";
+ case C2_NOT_FOUND: return "NOT_FOUND";
+ case C2_BAD_STATE: return "BAD_STATE";
+ case C2_BLOCKING: return "BLOCKING";
+ case C2_CANCELED: return "CANCELED";
+ case C2_NO_MEMORY: return "NO_MEMORY";
+ case C2_REFUSED: return "REFUSED";
+ case C2_TIMED_OUT: return "TIMED_OUT";
+ case C2_OMITTED: return "OMITTED";
+ case C2_CORRUPTED: return "CORRUPTED";
+ case C2_NO_INIT: return "NO_INIT";
+ default: return def;
+ }
+}
+
+const char *asString(C2FieldDescriptor::type_t i, const char *def) {
+ switch (i) {
+ case C2FieldDescriptor::BLOB: return "u8";
+ case C2FieldDescriptor::CNTR32: return "c32";
+ case C2FieldDescriptor::CNTR64: return "c64";
+ case C2FieldDescriptor::FLOAT: return "fp";
+ case C2FieldDescriptor::INT32: return "i32";
+ case C2FieldDescriptor::INT64: return "i64";
+ case C2FieldDescriptor::STRING: return "chr";
+ case C2FieldDescriptor::UINT32: return "u32";
+ case C2FieldDescriptor::UINT64: return "u64";
+ default: return (i & C2FieldDescriptor::STRUCT_FLAG) ? "struct" : def;
+ }
+}
+
+/* ------------------------------ C2ParamField ------------------------------ */
+
+static std::string attribParamCoreIndex(const C2Param::CoreIndex &i) {
+ return StringPrintf("%c%c%03x",
+ i.isFlexible() ? 'F' : '-',
+ i.isVendor() ? 'V' : '-',
+ i.coreIndex());
+}
+
+static std::string attribParamIndex(
+ const C2Param::Type &i, bool addStream, unsigned streamId) {
+ std::string v = StringPrintf("%c%c",
+ i.forInput() ? 'I' : i.forOutput() ? 'O' : '-',
+ i.forStream() ? 'S' : i.forPort() ? 'P' : 'G');
+ if (addStream) {
+ if (i.forStream()) {
+ v += StringPrintf("%02d", streamId);
+ } else {
+ v += "--";
+ }
+ }
+
+ return v
+ + StringPrintf("%c ",
+ i.kind() == C2Param::STRUCT ? 'S' :
+ i.kind() == C2Param::INFO ? 'i' :
+ i.kind() == C2Param::TUNING ? 't' :
+ i.kind() == C2Param::SETTING ? 's' :
+ i.kind() == C2Param::NONE ? '-' : '?')
+ + attribParamCoreIndex(i);
+}
+
+std::ostream& operator<<(std::ostream& os, const C2Param::CoreIndex &i) {
+ return os << "Param::CoreIndex(" << attribParamCoreIndex(i) << ")";
+}
+
+std::ostream& operator<<(std::ostream& os, const C2Param::Type &i) {
+ return os << StringPrintf("Param::Type(%08x: ", i.type())
+ << attribParamIndex(i, false, 0) << ")";
+}
+
+std::ostream& operator<<(std::ostream& os, const C2Param::Index &i) {
+ return os << StringPrintf("Param::Index(%08x: ", (uint32_t)i)
+ << attribParamIndex(i, true, i.stream()) << ")";
+}
+
+static std::string attribFieldId(const _C2FieldId &i) {
+ return StringPrintf("Field(@%02x+%02x)",
+ _C2ParamInspector::GetOffset(i),
+ _C2ParamInspector::GetSize(i));
+}
+
+
+std::ostream& operator<<(std::ostream& os, const _C2FieldId &i) {
+ return os << "<" << attribFieldId(i) << ">";
+}
+
+
+std::ostream& operator<<(std::ostream& os, const C2FieldDescriptor &i) {
+ os << attribFieldId(_C2ParamInspector::GetField(i)) << " ";
+ if (i.namedValues().size()) {
+ os << "enum ";
+ }
+ return os << asString(i.type()) << " " << i.name()
+ << StringPrintf("[%zu]", i.extent());
+}
+
+
+std::ostream& operator<<(std::ostream& os, const C2ParamField &i) {
+ os << "<" << C2Param::Index(_C2ParamInspector::GetIndex(i))
+ << StringPrintf("::Field(@%02x+%02x)>",
+ _C2ParamInspector::GetOffset(i),
+ _C2ParamInspector::GetSize(i));
+ return os;
+}
+
+
+/* -------------------------- _C2FieldValueHelper -------------------------- */
+
+std::ostream& _C2FieldValueHelper<char>::put(std::ostream &os, const C2Value::Primitive &p) {
+ if (isprint(p.i32)) {
+ return os << StringPrintf("'%c'", p.i32);
+ } else {
+ return os << StringPrintf("'\\x%02x'", (uint32_t)p.i32);
+ }
+}
+
+std::ostream& _C2FieldValueHelper<uint8_t>::put(std::ostream &os, const C2Value::Primitive &p) {
+ return os << StringPrintf("0x%02x", p.u32);
+}
+
+/* ---------------------- C2FieldSupportedValuesHelper ---------------------- */
+
+template<typename T>
+std::ostream& operator<<(std::ostream &os, const c2_cntr_t<T> &v) {
+ return os << "ctr(" << v.peeku() << ")";
+}
+
+template<typename T>
+std::ostream& operator<<(std::ostream& os, const C2SupportedRange<T> &i) {
+ os << "Range(";
+ _C2FieldValueHelper<T>::put(os, i.min());
+ os << "..";
+ _C2FieldValueHelper<T>::put(os, i.max());
+ os << " *= " << i.num() << " /= " << i.denom() << " += " << i.step() << ")";
+ return os;
+}
+template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<char> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint8_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<int32_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint32_t> &i);
+//template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<c2_cntr32_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<int64_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<uint64_t> &i);
+//template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<c2_cntr64_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedRange<float> &i);
+
+template<typename T>
+std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<T> &i) {
+ os << "Flags[";
+ if (!i.isEmpty()) {
+ os << "min=";
+ _C2FieldValueHelper<T>::put(os, i.min());
+ }
+ bool comma = false;
+ for (const T &v : i.flags()) {
+ if (comma) {
+ os << ", ";
+ }
+ _C2FieldValueHelper<T>::put(os, v);
+ comma = true;
+ }
+ os << "]";
+ return os;
+}
+template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<char> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint8_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<int32_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint32_t> &i);
+//template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<c2_cntr32_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<int64_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<uint64_t> &i);
+//template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<c2_cntr64_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedFlags<float> &i);
+
+template<typename T>
+std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<T> &i) {
+ os << "Values[";
+ bool comma = false;
+ for (const T &v : i.values()) {
+ if (comma) {
+ os << ", ";
+ }
+ _C2FieldValueHelper<T>::put(os, v);
+ comma = true;
+ }
+ os << "]";
+ return os;
+}
+template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<char> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint8_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<int32_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint32_t> &i);
+//template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<c2_cntr32_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<int64_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<uint64_t> &i);
+//template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<c2_cntr64_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2SupportedValueSet<float> &i);
+
+template<typename T>
+struct C2FieldSupportedValuesHelper<T>::Impl {
+ Impl(const C2FieldSupportedValues &values);
+
+private:
+ typedef typename _C2FieldValueHelper<T>::ValueType ValueType;
+ C2FieldSupportedValues::type_t _mType;
+ C2SupportedRange<ValueType> _mRange;
+ C2SupportedValueSet<ValueType> _mValues;
+ C2SupportedFlags<ValueType> _mFlags;
+
+public:
+// friend std::ostream& operator<< <T>(std::ostream& os, const C2FieldSupportedValuesHelper<T>::Impl &i);
+// friend std::ostream& operator<<(std::ostream& os, const Impl &i);
+ std::ostream& streamOut(std::ostream& os) const;
+};
+
+template<typename T>
+std::ostream& C2FieldSupportedValuesHelper<T>::Impl::streamOut(std::ostream& os) const {
+ if (_mType == C2FieldSupportedValues::RANGE) {
+ os << _mRange;
+ } else if (_mType == C2FieldSupportedValues::VALUES) {
+ os << _mValues;
+ } else if (_mType == C2FieldSupportedValues::FLAGS) {
+ os << _mFlags;
+ } else {
+ os << "Unknown FSV type: " << (uint32_t)_mType;
+ }
+ return os;
+}
+
+template<typename T>
+std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<T> &i) {
+ return i._mImpl->streamOut(os);
+}
+template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<char> &i);
+template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint8_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<int32_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint32_t> &i);
+//template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<c2_cntr32_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<int64_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<uint64_t> &i);
+//template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<c2_cntr64_t> &i);
+template std::ostream& operator<<(std::ostream& os, const C2FieldSupportedValuesHelper<float> &i);
+
diff --git a/media/codec2/vndk/util/C2InterfaceHelper.cpp b/media/codec2/vndk/util/C2InterfaceHelper.cpp
new file mode 100644
index 0000000..e447fbe
--- /dev/null
+++ b/media/codec2/vndk/util/C2InterfaceHelper.cpp
@@ -0,0 +1,841 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <C2Debug.h>
+#include <C2ParamInternal.h>
+#include <util/C2InterfaceHelper.h>
+
+#include <android-base/stringprintf.h>
+
+using ::android::base::StringPrintf;
+
+/* --------------------------------- ReflectorHelper --------------------------------- */
+
+void C2ReflectorHelper::addStructDescriptors(
+ std::vector<C2StructDescriptor> &structs, _Tuple<> *) {
+ std::lock_guard<std::mutex> lock(_mMutex);
+ for (C2StructDescriptor &strukt : structs) {
+ // TODO: check if structure descriptions conflict with existing ones
+ addStructDescriptor(std::move(strukt));
+ }
+}
+
+std::unique_ptr<C2StructDescriptor>
+C2ReflectorHelper::describe(C2Param::CoreIndex paramIndex) const {
+ std::lock_guard<std::mutex> lock(_mMutex);
+ auto it = _mStructs.find(paramIndex);
+ if (it == _mStructs.end()) {
+ return nullptr;
+ } else {
+ return std::make_unique<C2StructDescriptor>(it->second);
+ }
+};
+
+void C2ReflectorHelper::addStructDescriptor(C2StructDescriptor &&strukt) {
+ if (_mStructs.find(strukt.coreIndex()) != _mStructs.end()) {
+ // already added
+ // TODO: validate that descriptor matches stored descriptor
+ }
+ // validate that all struct fields are known to this reflector
+ for (const C2FieldDescriptor &fd : strukt) {
+ if (fd.type() & C2FieldDescriptor::STRUCT_FLAG) {
+ C2Param::CoreIndex coreIndex = fd.type() &~ C2FieldDescriptor::STRUCT_FLAG;
+ if (_mStructs.find(coreIndex) == _mStructs.end()) {
+ C2_LOG(INFO) << "missing struct descriptor #" << coreIndex << " for field "
+ << fd.name() << " of struct #" << strukt.coreIndex();
+ }
+ }
+ }
+ _mStructs.emplace(strukt.coreIndex(), strukt);
+}
+
+
+/* ---------------------------- ParamHelper ---------------------------- */
+
+class C2InterfaceHelper::ParamHelper::Impl {
+public:
+ Impl(ParamRef param, C2StringLiteral name, C2StructDescriptor &&strukt)
+ : mParam(param), mName(name), _mStruct(strukt) { }
+
+ Impl(Impl&&) = default;
+
+ void addDownDependency(C2Param::Index index) {
+ mDownDependencies.push_back(index);
+ }
+
+ C2InterfaceHelper::ParamHelper::attrib_t& attrib() {
+ return mAttrib;
+ }
+
+ void build() {
+ // move dependencies into descriptor
+ mDescriptor = std::make_shared<C2ParamDescriptor>(
+ index(), (C2ParamDescriptor::attrib_t)mAttrib,
+ std::move(mName), std::move(mDependencies));
+ }
+
+ void createFieldsAndSupportedValues(const std::shared_ptr<C2ParamReflector> &reflector) {
+ for (const C2FieldUtils::Info &f :
+ C2FieldUtils::enumerateFields(*mDefaultValue, reflector)) {
+ if (!f.isArithmetic()) {
+ continue;
+ }
+ std::unique_ptr<C2FieldSupportedValues> fsvPointer;
+
+ // create a breakable structure
+ do {
+ C2FieldSupportedValues fsv;
+ switch (f.type()) {
+ case C2FieldDescriptor::INT32: fsv = C2SupportedRange<int32_t>::Any(); break;
+ case C2FieldDescriptor::UINT32: fsv = C2SupportedRange<uint32_t>::Any(); break;
+ case C2FieldDescriptor::INT64: fsv = C2SupportedRange<int64_t>::Any(); break;
+ case C2FieldDescriptor::UINT64: fsv = C2SupportedRange<uint64_t>::Any(); break;
+ case C2FieldDescriptor::FLOAT: fsv = C2SupportedRange<float>::Any(); break;
+ case C2FieldDescriptor::BLOB: fsv = C2SupportedRange<uint8_t>::Any(); break;
+ case C2FieldDescriptor::STRING: fsv = C2SupportedRange<char>::Any(); break;
+ default:
+ continue; // break out of do {} while
+ }
+ fsvPointer = std::make_unique<C2FieldSupportedValues>(fsv);
+ } while (false);
+
+ mFields.emplace_hint(
+ mFields.end(),
+ _C2FieldId(f.offset(), f.size()),
+ std::make_shared<FieldHelper>(
+ mParam, _C2FieldId(f.offset(), f.size()), std::move(fsvPointer)));
+ }
+ }
+
+ /**
+ * Finds a field descriptor.
+ */
+ std::shared_ptr<FieldHelper> findField(size_t baseOffs, size_t baseSize) const {
+ auto it = mFields.find(_C2FieldId(baseOffs, baseSize));
+ if (it == mFields.end()) {
+ return nullptr;
+ }
+ return it->second;
+ }
+
+ const std::vector<ParamRef> getDependenciesAsRefs() const {
+ return mDependenciesAsRefs;
+ }
+
+ std::shared_ptr<const C2ParamDescriptor> getDescriptor() const {
+ return mDescriptor;
+ }
+
+ const std::vector<C2Param::Index> getDownDependencies() const {
+ return mDownDependencies;
+ }
+
+ C2Param::Index index() const {
+ if (!mDefaultValue) {
+ fprintf(stderr, "%s missing default value\n", mName.c_str());
+ }
+ return mDefaultValue->index();
+ }
+
+ C2String name() const {
+ return mName;
+ }
+
+ const ParamRef ref() const {
+ return mParam;
+ }
+
+ C2StructDescriptor retrieveStructDescriptor() {
+ return std::move(_mStruct);
+ }
+
+ void setDefaultValue(std::shared_ptr<C2Param> default_) {
+ mDefaultValue = default_;
+ }
+
+ void setDependencies(std::vector<C2Param::Index> indices, std::vector<ParamRef> refs) {
+ mDependencies = indices;
+ mDependenciesAsRefs = refs;
+ }
+
+ void setFields(std::vector<C2ParamFieldValues> &&fields) {
+ // do not allow adding fields multiple times, or to const values
+ if (!mFields.empty()) {
+ C2_LOG(FATAL) << "Trying to add fields to param " << mName << " multiple times";
+ } else if (mAttrib & attrib_t::IS_CONST) {
+ C2_LOG(FATAL) << "Trying to add fields to const param " << mName;
+ }
+
+ for (C2ParamFieldValues &pfv : fields) {
+ mFields.emplace_hint(
+ mFields.end(),
+ // _C2FieldId constructor
+ _C2ParamInspector::GetField(pfv.paramOrField),
+ // Field constructor
+ std::make_shared<FieldHelper>(mParam,
+ _C2ParamInspector::GetField(pfv.paramOrField),
+ std::move(pfv.values)));
+ }
+ }
+
+ void setGetter(std::function<std::shared_ptr<C2Param>(bool)> getter) {
+ mGetter = getter;
+ }
+
+ void setSetter(std::function<C2R(const C2Param *, bool, bool *, Factory &)> setter) {
+ mSetter = setter;
+ }
+
+ c2_status_t trySet(
+ const C2Param *value, bool mayBlock, bool *changed, Factory &f,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
+ C2R result = mSetter(value, mayBlock, changed, f);
+ return result.retrieveFailures(failures);
+ }
+
+ c2_status_t validate(const std::shared_ptr<C2ParamReflector> &reflector) {
+ if (!mSetter && mFields.empty()) {
+ C2_LOG(WARNING) << "Param " << mName << " has no setter, making it const";
+ // dependencies are empty in this case
+ mAttrib |= attrib_t::IS_CONST;
+ } else if (!mSetter) {
+ C2_LOG(FATAL) << "Param " << mName << " has no setter";
+ }
+
+ if (mAttrib & attrib_t::IS_CONST) {
+ createFieldsAndSupportedValues(reflector);
+ } else {
+ // TODO: update default based on setter and verify that FSV covers the values
+ }
+
+ if (mFields.empty()) {
+ C2_LOG(FATAL) << "Param " << mName << " has no fields";
+ }
+
+ return C2_OK;
+ }
+
+ std::shared_ptr<C2Param> value() {
+ return mParam.get();
+ }
+
+ std::shared_ptr<const C2Param> value() const {
+ return mParam.get();
+ }
+
+private:
+ typedef _C2ParamInspector::attrib_t attrib_t;
+ ParamRef mParam;
+ C2String mName;
+ C2StructDescriptor _mStruct;
+ std::shared_ptr<C2Param> mDefaultValue;
+ attrib_t mAttrib;
+ std::function<C2R(const C2Param *, bool, bool *, Factory &)> mSetter;
+ std::function<std::shared_ptr<C2Param>(bool)> mGetter;
+ std::vector<C2Param::Index> mDependencies;
+ std::vector<ParamRef> mDependenciesAsRefs;
+ std::vector<C2Param::Index> mDownDependencies; // TODO: this does not work for stream dependencies
+ std::map<_C2FieldId, std::shared_ptr<FieldHelper>> mFields;
+ std::shared_ptr<C2ParamDescriptor> mDescriptor;
+};
+
+C2InterfaceHelper::ParamHelper::ParamHelper(
+ ParamRef param, C2StringLiteral name, C2StructDescriptor &&strukt)
+ : mImpl(std::make_unique<C2InterfaceHelper::ParamHelper::Impl>(
+ param, name, std::move(strukt))) { }
+
+C2InterfaceHelper::ParamHelper::ParamHelper(C2InterfaceHelper::ParamHelper &&) = default;
+
+C2InterfaceHelper::ParamHelper::~ParamHelper() = default;
+
+void C2InterfaceHelper::ParamHelper::addDownDependency(C2Param::Index index) {
+ return mImpl->addDownDependency(index);
+}
+
+C2InterfaceHelper::ParamHelper::attrib_t& C2InterfaceHelper::ParamHelper::attrib() {
+ return mImpl->attrib();
+}
+
+std::shared_ptr<C2InterfaceHelper::ParamHelper> C2InterfaceHelper::ParamHelper::build() {
+ mImpl->build();
+ return std::make_shared<C2InterfaceHelper::ParamHelper>(std::move(*this));
+}
+
+std::shared_ptr<C2InterfaceHelper::FieldHelper>
+C2InterfaceHelper::ParamHelper::findField(size_t baseOffs, size_t baseSize) const {
+ return mImpl->findField(baseOffs, baseSize);
+}
+
+const std::vector<C2InterfaceHelper::ParamRef>
+C2InterfaceHelper::ParamHelper::getDependenciesAsRefs() const {
+ return mImpl->getDependenciesAsRefs();
+}
+
+std::shared_ptr<const C2ParamDescriptor>
+C2InterfaceHelper::ParamHelper::getDescriptor() const {
+ return mImpl->getDescriptor();
+}
+
+const std::vector<C2Param::Index> C2InterfaceHelper::ParamHelper::getDownDependencies() const {
+ return mImpl->getDownDependencies();
+}
+
+C2Param::Index C2InterfaceHelper::ParamHelper::index() const {
+ return mImpl->index();
+}
+
+C2String C2InterfaceHelper::ParamHelper::name() const {
+ return mImpl->name();
+}
+
+const C2InterfaceHelper::ParamRef C2InterfaceHelper::ParamHelper::ref() const {
+ return mImpl->ref();
+}
+
+C2StructDescriptor C2InterfaceHelper::ParamHelper::retrieveStructDescriptor() {
+ return mImpl->retrieveStructDescriptor();
+}
+
+void C2InterfaceHelper::ParamHelper::setDefaultValue(std::shared_ptr<C2Param> default_) {
+ mImpl->setDefaultValue(default_);
+}
+
+void C2InterfaceHelper::ParamHelper::setDependencies(
+ std::vector<C2Param::Index> indices, std::vector<ParamRef> refs) {
+ mImpl->setDependencies(indices, refs);
+}
+
+void C2InterfaceHelper::ParamHelper::setFields(std::vector<C2ParamFieldValues> &&fields) {
+ return mImpl->setFields(std::move(fields));
+}
+
+void C2InterfaceHelper::ParamHelper::setGetter(
+ std::function<std::shared_ptr<C2Param>(bool)> getter) {
+ mImpl->setGetter(getter);
+}
+
+void C2InterfaceHelper::ParamHelper::setSetter(
+ std::function<C2R(const C2Param *, bool, bool *, Factory &)> setter) {
+ mImpl->setSetter(setter);
+}
+
+c2_status_t C2InterfaceHelper::ParamHelper::trySet(
+ const C2Param *value, bool mayBlock, bool *changed, Factory &f,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
+ return mImpl->trySet(value, mayBlock, changed, f, failures);
+}
+
+c2_status_t C2InterfaceHelper::ParamHelper::validate(
+ const std::shared_ptr<C2ParamReflector> &reflector) {
+ return mImpl->validate(reflector);
+}
+
+std::shared_ptr<C2Param> C2InterfaceHelper::ParamHelper::value() {
+ return mImpl->value();
+}
+
+std::shared_ptr<const C2Param> C2InterfaceHelper::ParamHelper::value() const {
+ return mImpl->value();
+}
+
+/* ---------------------------- FieldHelper ---------------------------- */
+
+C2ParamField C2InterfaceHelper::FieldHelper::makeParamField(C2Param::Index index) const {
+ return _C2ParamInspector::CreateParamField(index, mFieldId);
+}
+
+C2InterfaceHelper::FieldHelper::FieldHelper(const ParamRef ¶m, const _C2FieldId &field,
+ std::unique_ptr<C2FieldSupportedValues> &&values)
+ : mParam(param),
+ mFieldId(field),
+ mPossible(std::move(values)) {
+ C2_LOG(VERBOSE) << "Creating field helper " << field << " "
+ << C2FieldSupportedValuesHelper<uint32_t>(*mPossible);
+}
+
+void C2InterfaceHelper::FieldHelper::setSupportedValues(
+ std::unique_ptr<C2FieldSupportedValues> &&values) {
+ mSupported = std::move(values);
+}
+
+const C2FieldSupportedValues *C2InterfaceHelper::FieldHelper::getSupportedValues() const {
+ return (mSupported ? mSupported : mPossible).get();
+}
+
+const C2FieldSupportedValues *C2InterfaceHelper::FieldHelper::getPossibleValues() const {
+ return mPossible.get();
+}
+
+
+/* ---------------------------- Field ---------------------------- */
+
+/**
+ * Wrapper around field-supported-values builder that gets stored in the
+ * field helper when the builder goes out of scope.
+ */
+template<typename T>
+struct SupportedValuesBuilder : C2ParamFieldValuesBuilder<T> {
+ SupportedValuesBuilder(
+ C2ParamField &field, std::shared_ptr<C2InterfaceHelper::FieldHelper> helper)
+ : C2ParamFieldValuesBuilder<T>(field), _mHelper(helper), _mField(field) {
+ }
+
+ /**
+ * Save builder values on destruction.
+ */
+ virtual ~SupportedValuesBuilder() override {
+ _mHelper->setSupportedValues(std::move(C2ParamFieldValues(*this).values));
+ }
+
+private:
+ std::shared_ptr<C2InterfaceHelper::FieldHelper> _mHelper;
+ C2ParamField _mField;
+};
+
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> C2InterfaceHelper::Field<T>::shouldBe() const {
+ return C2ParamFieldValuesBuilder<T>(_mField);
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> C2InterfaceHelper::Field<T>::mustBe() {
+ return SupportedValuesBuilder<T>(_mField, _mHelper);
+}
+
+/*
+template<typename T> C2SettingResultsBuilder C2InterfaceHelper::Field<T>::validatePossible(T &value)
+const {
+ /// TODO
+ return C2SettingResultsBuilder::Ok();
+}
+*/
+
+template<typename T>
+C2InterfaceHelper::Field<T>::Field(std::shared_ptr<FieldHelper> helper, C2Param::Index index)
+ : _mHelper(helper), _mField(helper->makeParamField(index)) { }
+
+template struct C2InterfaceHelper::Field<uint8_t>;
+template struct C2InterfaceHelper::Field<char>;
+template struct C2InterfaceHelper::Field<int32_t>;
+template struct C2InterfaceHelper::Field<uint32_t>;
+//template struct C2InterfaceHelper::Field<c2_cntr32_t>;
+template struct C2InterfaceHelper::Field<int64_t>;
+template struct C2InterfaceHelper::Field<uint64_t>;
+//template struct C2InterfaceHelper::Field<c2_cntr64_t>;
+template struct C2InterfaceHelper::Field<float>;
+
+/* --------------------------------- Factory --------------------------------- */
+
+struct C2InterfaceHelper::FactoryImpl : public C2InterfaceHelper::Factory {
+ virtual std::shared_ptr<C2ParamReflector> getReflector() const override {
+ return _mReflector;
+ }
+
+ virtual std::shared_ptr<ParamHelper>
+ getParamHelper(const ParamRef ¶m) const override {
+ return _mParams.find(param)->second;
+ }
+
+public:
+ FactoryImpl(std::shared_ptr<C2ParamReflector> reflector)
+ : _mReflector(reflector) { }
+
+ virtual ~FactoryImpl() = default;
+
+ void addParam(std::shared_ptr<ParamHelper> param) {
+ _mParams.insert({ param->ref(), param });
+ _mIndexToHelper.insert({param->index(), param});
+
+ // add down-dependencies (and validate dependencies as a result)
+ size_t ix = 0;
+ for (const ParamRef &ref : param->getDependenciesAsRefs()) {
+ // dependencies must already be defined
+ if (!_mParams.count(ref)) {
+ C2_LOG(FATAL) << "Parameter " << param->name() << " has a dependency at index "
+ << ix << " that is not yet defined";
+ }
+ _mParams.find(ref)->second->addDownDependency(param->index());
+ ++ix;
+ }
+
+ _mDependencyIndex.emplace(param->index(), _mDependencyIndex.size());
+ }
+
+ std::shared_ptr<ParamHelper> getParam(C2Param::Index ix) const {
+ // TODO: handle streams separately
+ const auto it = _mIndexToHelper.find(ix);
+ if (it == _mIndexToHelper.end()) {
+ return nullptr;
+ }
+ return it->second;
+ }
+
+ /**
+ * TODO: this could return a copy using proper pointer cast.
+ */
+ std::shared_ptr<C2Param> getParamValue(C2Param::Index ix) const {
+ std::shared_ptr<ParamHelper> helper = getParam(ix);
+ return helper ? helper->value() : nullptr;
+ }
+
+ c2_status_t querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const {
+ for (const auto &it : _mParams) {
+ // TODO: change querySupportedParams signature?
+ params->push_back(
+ std::const_pointer_cast<C2ParamDescriptor>(it.second->getDescriptor()));
+ }
+ // TODO: handle errors
+ return C2_OK;
+ }
+
+ size_t getDependencyIndex(C2Param::Index ix) {
+ // in this version of the helper there is only a single stream so
+ // we can look up directly by index
+ auto it = _mDependencyIndex.find(ix);
+ return it == _mDependencyIndex.end() ? SIZE_MAX : it->second;
+ }
+
+private:
+ std::map<ParamRef, std::shared_ptr<ParamHelper>> _mParams;
+ std::map<C2Param::Index, std::shared_ptr<ParamHelper>> _mIndexToHelper;
+ std::shared_ptr<C2ParamReflector> _mReflector;
+ std::map<C2Param::Index, size_t> _mDependencyIndex;
+};
+
+/* --------------------------------- Helper --------------------------------- */
+
+namespace {
+
+static std::string asString(C2Param *p) {
+ char addr[20];
+ sprintf(addr, "%p:[", p);
+ std::string v = addr;
+ for (size_t i = 0; i < p->size(); ++i) {
+ char d[4];
+ sprintf(d, " %02x", *(((uint8_t *)p) + i));
+ v += d + (i == 0);
+ }
+ return v + "]";
+}
+
+}
+
+C2InterfaceHelper::C2InterfaceHelper(std::shared_ptr<C2ReflectorHelper> reflector)
+ : mReflector(reflector),
+ _mFactory(std::make_shared<FactoryImpl>(reflector)) { }
+
+
+size_t C2InterfaceHelper::GetBaseOffset(const std::shared_ptr<C2ParamReflector> &reflector,
+ C2Param::CoreIndex index, size_t offset) {
+ std::unique_ptr<C2StructDescriptor> param = reflector->describe(index);
+ if (param == nullptr) {
+ return ~(size_t)0; // param structure not described
+ }
+
+ for (const C2FieldDescriptor &field : *param) {
+ size_t fieldOffset = _C2ParamInspector::GetOffset(field);
+ size_t fieldSize = _C2ParamInspector::GetSize(field);
+ size_t fieldExtent = field.extent();
+ if (offset < fieldOffset) {
+ return ~(size_t)0; // not found
+ }
+ if (offset == fieldOffset) {
+ // exact match
+ return offset;
+ }
+ if (field.extent() == 0 || offset < fieldOffset + fieldSize * fieldExtent) {
+ // reduce to first element in case of array
+ offset = fieldOffset + (offset - fieldOffset) % fieldSize;
+ if (field.type() >= C2FieldDescriptor::STRUCT_FLAG) {
+ // this offset is within a field
+ offset = GetBaseOffset(
+ reflector, field.type() & ~C2FieldDescriptor::STRUCT_FLAG,
+ offset - fieldOffset);
+ return ~offset ? fieldOffset + offset : offset;
+ }
+ }
+ }
+ return ~(size_t)0; // not found
+}
+
+void C2InterfaceHelper::addParameter(std::shared_ptr<ParamHelper> param) {
+ std::lock_guard<std::mutex> lock(mMutex);
+ mReflector->addStructDescriptor(param->retrieveStructDescriptor());
+ c2_status_t err = param->validate(mReflector);
+ if (err != C2_CORRUPTED) {
+ _mFactory->addParam(param);
+
+ // run setter to ensure correct values
+ bool changed = false;
+ std::vector<std::unique_ptr<C2SettingResult>> failures;
+ (void)param->trySet(param->value().get(), C2_MAY_BLOCK, &changed, *_mFactory, &failures);
+ }
+}
+
+c2_status_t C2InterfaceHelper::config(
+ const std::vector<C2Param*> ¶ms, c2_blocking_t mayBlock,
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures, bool updateParams,
+ std::vector<std::shared_ptr<C2Param>> *changes __unused /* TODO */) {
+ std::lock_guard<std::mutex> lock(mMutex);
+ bool paramWasInvalid = false; // TODO is this the same as bad value?
+ bool paramNotFound = false;
+ bool paramBadValue = false;
+ bool paramNoMemory = false;
+ bool paramBlocking = false;
+ bool paramTimedOut = false;
+ bool paramCorrupted = false;
+
+ // dependencies
+ // down dependencies are marked dirty, but params set are not immediately
+ // marked dirty (unless they become down dependency) so that we can
+ // avoid setting them if they did not change
+
+ // TODO: there could be multiple indices for the same dependency index
+ // { depIx, paramIx } may be a suitable key
+ std::map<size_t, std::pair<C2Param::Index, bool>> dependencies;
+
+ // we cannot determine the last valid parameter, so add an extra
+ // loop iteration after the last parameter
+ for (size_t p_ix = 0; p_ix <= params.size(); ++p_ix) {
+ C2Param *p = nullptr;
+ C2Param::Index paramIx = 0u;
+ size_t paramDepIx = SIZE_MAX;
+ bool last = p_ix == params.size();
+ if (!last) {
+ p = params[p_ix];
+ if (!*p) {
+ paramWasInvalid = true;
+ p->invalidate();
+ continue;
+ }
+
+ paramIx = p->index();
+ paramDepIx = getDependencyIndex_l(paramIx);
+ if (paramDepIx == SIZE_MAX) {
+ // unsupported parameter
+ paramNotFound = true;
+ continue;
+ }
+
+ //
+ // first insert - mark not dirty
+ // it may have been marked dirty by a dependency update
+ // this does not overrwrite(!)
+ (void)dependencies.insert({ paramDepIx, { paramIx, false /* dirty */ }});
+ auto it = dependencies.find(paramDepIx);
+ C2_LOG(VERBOSE) << "marking dependency for setting at #" << paramDepIx << ": "
+ << it->second.first << ", update "
+ << (it->second.second ? "always (dirty)" : "only if changed");
+ } else {
+ // process any remaining dependencies
+ if (dependencies.empty()) {
+ continue;
+ }
+ C2_LOG(VERBOSE) << "handling dirty down dependencies after last setting";
+ }
+
+ // process any dirtied down-dependencies until the next param
+ while (dependencies.size() && dependencies.begin()->first <= paramDepIx) {
+ auto min = dependencies.begin();
+ C2Param::Index ix = min->second.first;
+ bool dirty = min->second.second;
+ dependencies.erase(min);
+
+ std::shared_ptr<ParamHelper> param = _mFactory->getParam(ix);
+ C2_LOG(VERBOSE) << "old value " << asString(param->value().get());
+ if (!last) {
+ C2_LOG(VERBOSE) << "new value " << asString(p);
+ }
+ if (!last && !dirty && ix == paramIx && *param->value() == *p) {
+ // no change in value - and dependencies were not updated
+ // no need to update
+ C2_LOG(VERBOSE) << "ignoring setting unchanged param " << ix;
+ continue;
+ }
+
+ // apply setting
+ bool changed = false;
+ C2_LOG(VERBOSE) << "setting param " << ix;
+ std::shared_ptr<C2Param> oldValue = param->value();
+ c2_status_t res = param->trySet(
+ (!last && paramIx == ix) ? p : param->value().get(), mayBlock,
+ &changed, *_mFactory, failures);
+ std::shared_ptr<C2Param> newValue = param->value();
+ C2_CHECK_EQ(oldValue == newValue, *oldValue == *newValue);
+ switch (res) {
+ case C2_OK: break;
+ case C2_BAD_VALUE: paramBadValue = true; break;
+ case C2_NO_MEMORY: paramNoMemory = true; break;
+ case C2_TIMED_OUT: paramTimedOut = true; break;
+ case C2_BLOCKING: paramBlocking = true; break;
+ case C2_CORRUPTED: paramCorrupted = true; break;
+ default: ;// TODO fatal
+ }
+
+ // copy back result for configured values (or invalidate if it does not fit or match)
+ if (updateParams && !last && paramIx == ix) {
+ if (!p->updateFrom(*param->value())) {
+ p->invalidate();
+ }
+ }
+
+ // compare ptrs as params are copy on write
+ if (changed) {
+ C2_LOG(VERBOSE) << "param " << ix << " value changed";
+ // value changed update down-dependencies and mark them dirty
+ for (const C2Param::Index ix : param->getDownDependencies()) {
+ C2_LOG(VERBOSE) << 1;
+ auto insert_res = dependencies.insert(
+ { getDependencyIndex_l(ix), { ix, true /* dirty */ }});
+ if (!insert_res.second) {
+ (*insert_res.first).second.second = true; // mark dirty
+ }
+
+ auto it = dependencies.find(getDependencyIndex_l(ix));
+ C2_CHECK(it->second.second);
+ C2_LOG(VERBOSE) << "marking down dependencies to update at #"
+ << getDependencyIndex_l(ix) << ": " << it->second.first;
+ }
+ }
+ }
+ }
+
+ return (paramCorrupted ? C2_CORRUPTED :
+ paramBlocking ? C2_BLOCKING :
+ paramTimedOut ? C2_TIMED_OUT :
+ paramNoMemory ? C2_NO_MEMORY :
+ (paramBadValue || paramWasInvalid) ? C2_BAD_VALUE :
+ paramNotFound ? C2_BAD_INDEX : C2_OK);
+}
+
+size_t C2InterfaceHelper::getDependencyIndex_l(C2Param::Index ix) const {
+ return _mFactory->getDependencyIndex(ix);
+}
+
+c2_status_t C2InterfaceHelper::query(
+ const std::vector<C2Param*> &stackParams,
+ const std::vector<C2Param::Index> &heapParamIndices,
+ c2_blocking_t mayBlock __unused /* TODO */,
+ std::vector<std::unique_ptr<C2Param>>* const heapParams) const {
+ std::lock_guard<std::mutex> lock(mMutex);
+ bool paramWasInvalid = false;
+ bool paramNotFound = false;
+ bool paramDidNotFit = false;
+ bool paramNoMemory = false;
+
+ for (C2Param* const p : stackParams) {
+ if (!*p) {
+ paramWasInvalid = true;
+ p->invalidate();
+ } else {
+ std::shared_ptr<C2Param> value = _mFactory->getParamValue(p->index());
+ if (!value) {
+ paramNotFound = true;
+ p->invalidate();
+ } else if (!p->updateFrom(*value)) {
+ paramDidNotFit = true;
+ p->invalidate();
+ }
+ }
+ }
+
+ for (const C2Param::Index ix : heapParamIndices) {
+ std::shared_ptr<C2Param> value = _mFactory->getParamValue(ix);
+ if (value) {
+ std::unique_ptr<C2Param> p = C2Param::Copy(*value);
+ if (p != nullptr) {
+ heapParams->push_back(std::move(p));
+ } else {
+ paramNoMemory = true;
+ }
+ } else {
+ paramNotFound = true;
+ }
+ }
+
+ return paramNoMemory ? C2_NO_MEMORY :
+ paramNotFound ? C2_BAD_INDEX :
+ // the following errors are not marked in the return value
+ paramDidNotFit ? C2_OK :
+ paramWasInvalid ? C2_OK : C2_OK;
+}
+
+c2_status_t C2InterfaceHelper::querySupportedParams(
+ std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const {
+ std::lock_guard<std::mutex> lock(mMutex);
+ return _mFactory->querySupportedParams(params);
+}
+
+
+c2_status_t C2InterfaceHelper::querySupportedValues(
+ std::vector<C2FieldSupportedValuesQuery> &fields, c2_blocking_t mayBlock __unused) const {
+ std::lock_guard<std::mutex> lock(mMutex);
+ for (C2FieldSupportedValuesQuery &query : fields) {
+ C2_LOG(VERBOSE) << "querying field " << query.field();
+ C2Param::Index ix = _C2ParamInspector::GetIndex(query.field());
+ std::shared_ptr<ParamHelper> param = _mFactory->getParam(ix);
+ if (!param) {
+ C2_LOG(VERBOSE) << "bad param";
+ query.status = C2_BAD_INDEX;
+ continue;
+ }
+ size_t offs = GetBaseOffset(
+ mReflector, ix,
+ _C2ParamInspector::GetOffset(query.field()) - sizeof(C2Param));
+ if (~offs == 0) {
+ C2_LOG(VERBOSE) << "field could not be found";
+ query.status = C2_NOT_FOUND;
+ continue;
+ }
+ offs += sizeof(C2Param);
+ C2_LOG(VERBOSE) << "field resolved to "
+ << StringPrintf("@%02zx+%02x", offs, _C2ParamInspector::GetSize(query.field()));
+ std::shared_ptr<FieldHelper> field =
+ param->findField(offs, _C2ParamInspector::GetSize(query.field()));
+ if (!field) {
+ C2_LOG(VERBOSE) << "bad field";
+ query.status = C2_NOT_FOUND;
+ continue;
+ }
+
+ const C2FieldSupportedValues *values = nullptr;
+ switch (query.type()) {
+ case C2FieldSupportedValuesQuery::CURRENT:
+ values = field->getSupportedValues();
+ break;
+ case C2FieldSupportedValuesQuery::POSSIBLE:
+ values = field->getPossibleValues();
+ break;
+ default:
+ C2_LOG(VERBOSE) << "bad query type: " << query.type();
+ query.status = C2_BAD_VALUE;
+ }
+ if (values) {
+ query.values = *values;
+ query.status = C2_OK;
+ } else {
+ C2_LOG(DEBUG) << "no values published by component";
+ query.status = C2_CORRUPTED;
+ }
+ }
+ return C2_OK;
+}
+
+std::unique_lock<std::mutex> C2InterfaceHelper::lock() const {
+ return std::unique_lock<std::mutex>(mMutex);
+}
diff --git a/media/codec2/vndk/util/C2InterfaceUtils.cpp b/media/codec2/vndk/util/C2InterfaceUtils.cpp
new file mode 100644
index 0000000..61ec911
--- /dev/null
+++ b/media/codec2/vndk/util/C2InterfaceUtils.cpp
@@ -0,0 +1,1292 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-parameter"
+#pragma clang diagnostic ignored "-Wunused-variable"
+#pragma clang diagnostic ignored "-Wunused-value"
+
+#define C2_LOG_VERBOSE
+
+#include <C2Debug.h>
+#include <C2Param.h>
+#include <C2ParamDef.h>
+#include <C2ParamInternal.h>
+#include <util/C2InterfaceUtils.h>
+
+#include <cmath>
+#include <limits>
+#include <map>
+#include <type_traits>
+
+#include <android-base/stringprintf.h>
+
+std::ostream& operator<<(std::ostream& os, const _C2FieldId &i);
+
+std::ostream& operator<<(std::ostream& os, const C2ParamField &i);
+
+/* ---------------------------- C2SupportedRange ---------------------------- */
+
+/**
+ * Helper class for supported values range calculations.
+ */
+template<typename T, bool FP=std::is_floating_point<T>::value>
+struct _C2TypedSupportedRangeHelper {
+ /**
+ * type of range size: a - b if a >= b and a and b are of type T
+ */
+ typedef typename std::make_unsigned<T>::type DiffType;
+
+ /**
+ * calculate (high - low) mod step
+ */
+ static DiffType mod(T low, T high, T step) {
+ return DiffType(high - low) % DiffType(step);
+ }
+};
+
+template<typename T>
+struct _C2TypedSupportedRangeHelper<T, true> {
+ typedef T DiffType;
+
+ static DiffType mod(T low, T high, T step) {
+ return fmod(high - low, step);
+ }
+};
+
+template<typename T>
+C2SupportedRange<T>::C2SupportedRange(const C2FieldSupportedValues &values) {
+ if (values.type == C2FieldSupportedValues::RANGE) {
+ _mMin = values.range.min.ref<ValueType>();
+ _mMax = values.range.max.ref<ValueType>();
+ _mStep = values.range.step.ref<ValueType>();
+ _mNum = values.range.num.ref<ValueType>();
+ _mDenom = values.range.denom.ref<ValueType>();
+ } else {
+ _mMin = MAX_VALUE;
+ _mMax = MIN_VALUE;
+ _mStep = MIN_STEP;
+ _mNum = 0;
+ _mDenom = 0;
+ }
+}
+
+template<typename T>
+bool C2SupportedRange<T>::contains(T value) const {
+ // value must fall between min and max
+ if (value < _mMin || value > _mMax) {
+ return false;
+ }
+ // simple ranges contain all values between min and max
+ if (isSimpleRange()) {
+ return true;
+ }
+ // min is always part of the range
+ if (value == _mMin) {
+ return true;
+ }
+ // stepped ranges require (val - min) % step to be zero
+ if (isArithmeticSeries()) {
+ return _C2TypedSupportedRangeHelper<T>::mod(_mMin, value, _mStep) == 0;
+ }
+ // pure geometric series require (val / min) to be integer multiple of (num/denom)
+ if (isGeometricSeries()) {
+ if (value <= 0) {
+ return false;
+ }
+ double log2base = log2(_mNum / _mDenom);
+ double power = llround(log2(value / double(_mMin)) / log2base);
+ // TODO: validate that result falls within precision (other than round)
+ return value == T(_mMin * pow(_mNum / _mDenom, power) + MIN_STEP / 2);
+ }
+ // multiply-accumulate series require validating by walking through the series
+ if (isMacSeries()) {
+ double lastValue = _mMin;
+ double base = _mNum / _mDenom;
+ while (true) {
+ // this cast is safe as _mMin <= lastValue <= _mMax
+ if (T(lastValue + MIN_STEP / 2) == value) {
+ return true;
+ }
+ double nextValue = fma(lastValue, base, _mStep);
+ if (nextValue <= lastValue || nextValue > _mMax) {
+ return false; // series is no longer monotonic or within range
+ }
+ lastValue = nextValue;
+ };
+ }
+ // if we are here, this must be an invalid range
+ return false;
+}
+
+template<typename T>
+C2SupportedRange<T> C2SupportedRange<T>::limitedTo(const C2SupportedRange<T> &limit) const {
+ // TODO - this only works for simple ranges
+ return C2SupportedRange(std::max(_mMin, limit._mMin), std::min(_mMax, limit._mMax),
+ std::max(_mStep, limit._mStep));
+}
+
+template class C2SupportedRange<uint8_t>;
+template class C2SupportedRange<char>;
+template class C2SupportedRange<int32_t>;
+template class C2SupportedRange<uint32_t>;
+//template class C2SupportedRange<c2_cntr32_t>;
+template class C2SupportedRange<int64_t>;
+template class C2SupportedRange<uint64_t>;
+//template class C2SupportedRange<c2_cntr64_t>;
+template class C2SupportedRange<float>;
+
+/* -------------------------- C2SupportedFlags -------------------------- */
+
+/**
+ * Ordered supported flag set for a field of a given type.
+ */
+// float flags are not supported, but define a few methods to support generic supported values code
+template<>
+bool C2SupportedFlags<float>::contains(float value) const {
+ return false;
+}
+
+template<>
+const std::vector<float> C2SupportedFlags<float>::flags() const {
+ return std::vector<float>();
+}
+
+template<>
+C2SupportedFlags<float> C2SupportedFlags<float>::limitedTo(const C2SupportedFlags<float> &limit) const {
+ std::vector<C2Value::Primitive> values;
+ return C2SupportedFlags(std::move(values));
+}
+
+template<>
+float C2SupportedFlags<float>::min() const {
+ return 0;
+}
+
+template<typename T>
+bool C2SupportedFlags<T>::contains(T value) const {
+ // value must contain the minimal mask
+ T minMask = min();
+ if (~value & minMask) {
+ return false;
+ }
+ value &= ~minMask;
+ // otherwise, remove flags from value and see if we arrive at 0
+ for (const C2Value::Primitive &v : _mValues) {
+ if (value == 0) {
+ break;
+ }
+ if ((~value & v.ref<ValueType>()) == 0) {
+ value &= ~v.ref<ValueType>();
+ }
+ }
+ return value == 0;
+}
+
+template<typename T>
+const std::vector<T> C2SupportedFlags<T>::flags() const {
+ std::vector<T> vals(c2_max(_mValues.size(), 1u) - 1);
+ if (!_mValues.empty()) {
+ std::transform(_mValues.cbegin() + 1, _mValues.cend(), vals.begin(),
+ [](const C2Value::Primitive &p)->T {
+ return p.ref<ValueType>();
+ });
+ }
+ return vals;
+}
+
+template<typename T>
+C2SupportedFlags<T> C2SupportedFlags<T>::limitedTo(const C2SupportedFlags<T> &limit) const {
+ std::vector<C2Value::Primitive> values = _mValues; // make a copy
+ T minMask = min() | limit.min();
+ // minimum mask must be covered by both this and other
+ if (limit.contains(minMask) && contains(minMask)) {
+ values[0] = minMask;
+ // keep only flags that are covered by limit
+ std::remove_if(values.begin(), values.end(), [&limit, minMask](const C2Value::Primitive &v) -> bool {
+ T value = v.ref<ValueType>() | minMask;
+ return value == minMask || !limit.contains(value); });
+ // we also need to do it vice versa
+ for (const C2Value::Primitive &v : _mValues) {
+ T value = v.ref<ValueType>() | minMask;
+ if (value != minMask && contains(value)) {
+ values.emplace_back((ValueType)value);
+ }
+ }
+ }
+ return C2SupportedFlags(std::move(values));
+}
+
+template<typename T>
+T C2SupportedFlags<T>::min() const {
+ if (!_mValues.empty()) {
+ return _mValues.front().template ref<ValueType>();
+ } else {
+ return T(0);
+ }
+}
+
+template class C2SupportedFlags<uint8_t>;
+template class C2SupportedFlags<char>;
+template class C2SupportedFlags<int32_t>;
+template class C2SupportedFlags<uint32_t>;
+//template class C2SupportedFlags<c2_cntr32_t>;
+template class C2SupportedFlags<int64_t>;
+template class C2SupportedFlags<uint64_t>;
+//template class C2SupportedFlags<c2_cntr64_t>;
+
+/* -------------------------- C2SupportedValueSet -------------------------- */
+
+/**
+ * Ordered supported value set for a field of a given type.
+ */
+template<typename T>
+bool C2SupportedValueSet<T>::contains(T value) const {
+ return std::find_if(_mValues.cbegin(), _mValues.cend(),
+ [value](const C2Value::Primitive &p) -> bool {
+ return value == p.ref<ValueType>();
+ }) != _mValues.cend();
+}
+
+template<typename T>
+C2SupportedValueSet<T> C2SupportedValueSet<T>::limitedTo(const C2SupportedValueSet<T> &limit) const {
+ std::vector<C2Value::Primitive> values = _mValues; // make a copy
+ std::remove_if(values.begin(), values.end(), [&limit](const C2Value::Primitive &v) -> bool {
+ return !limit.contains(v.ref<ValueType>()); });
+ return C2SupportedValueSet(std::move(values));
+}
+
+template<typename T>
+C2SupportedValueSet<T> C2SupportedValueSet<T>::limitedTo(const C2SupportedRange<T> &limit) const {
+ std::vector<C2Value::Primitive> values = _mValues; // make a copy
+ std::remove_if(values.begin(), values.end(), [&limit](const C2Value::Primitive &v) -> bool {
+ return !limit.contains(v.ref<ValueType>()); });
+ return C2SupportedValueSet(std::move(values));
+}
+
+template<typename T>
+C2SupportedValueSet<T> C2SupportedValueSet<T>::limitedTo(const C2SupportedFlags<T> &limit) const {
+ std::vector<C2Value::Primitive> values = _mValues; // make a copy
+ std::remove_if(values.begin(), values.end(), [&limit](const C2Value::Primitive &v) -> bool {
+ return !limit.contains(v.ref<ValueType>()); });
+ return C2SupportedValueSet(std::move(values));
+}
+
+template<typename T>
+const std::vector<T> C2SupportedValueSet<T>::values() const {
+ std::vector<T> vals(_mValues.size());
+ std::transform(_mValues.cbegin(), _mValues.cend(), vals.begin(), [](const C2Value::Primitive &p) -> T {
+ return p.ref<ValueType>();
+ });
+ return vals;
+}
+
+template class C2SupportedValueSet<uint8_t>;
+template class C2SupportedValueSet<char>;
+template class C2SupportedValueSet<int32_t>;
+template class C2SupportedValueSet<uint32_t>;
+//template class C2SupportedValueSet<c2_cntr32_t>;
+template class C2SupportedValueSet<int64_t>;
+template class C2SupportedValueSet<uint64_t>;
+//template class C2SupportedValueSet<c2_cntr64_t>;
+template class C2SupportedValueSet<float>;
+
+/* ---------------------- C2FieldSupportedValuesHelper ---------------------- */
+
+template<typename T>
+struct C2FieldSupportedValuesHelper<T>::Impl {
+ Impl(const C2FieldSupportedValues &values)
+ : _mType(values.type),
+ _mRange(values),
+ _mValues(values),
+ _mFlags(values) { }
+
+ bool supports(T value) const;
+
+private:
+ typedef typename _C2FieldValueHelper<T>::ValueType ValueType;
+ C2FieldSupportedValues::type_t _mType;
+ C2SupportedRange<ValueType> _mRange;
+ C2SupportedValueSet<ValueType> _mValues;
+ C2SupportedValueSet<ValueType> _mFlags;
+
+// friend std::ostream& operator<< <T>(std::ostream& os, const C2FieldSupportedValuesHelper<T>::Impl &i);
+// friend std::ostream& operator<<(std::ostream& os, const Impl &i);
+ std::ostream& streamOut(std::ostream& os) const;
+};
+
+template<typename T>
+bool C2FieldSupportedValuesHelper<T>::Impl::supports(T value) const {
+ switch (_mType) {
+ case C2FieldSupportedValues::RANGE: return _mRange.contains(value);
+ case C2FieldSupportedValues::VALUES: return _mValues.contains(value);
+ case C2FieldSupportedValues::FLAGS: return _mFlags.contains(value);
+ default: return false;
+ }
+}
+
+template<typename T>
+C2FieldSupportedValuesHelper<T>::C2FieldSupportedValuesHelper(const C2FieldSupportedValues &values)
+ : _mImpl(std::make_unique<C2FieldSupportedValuesHelper<T>::Impl>(values)) { }
+
+template<typename T>
+C2FieldSupportedValuesHelper<T>::~C2FieldSupportedValuesHelper() = default;
+
+template<typename T>
+bool C2FieldSupportedValuesHelper<T>::supports(T value) const {
+ return _mImpl->supports(value);
+}
+
+template class C2FieldSupportedValuesHelper<uint8_t>;
+template class C2FieldSupportedValuesHelper<char>;
+template class C2FieldSupportedValuesHelper<int32_t>;
+template class C2FieldSupportedValuesHelper<uint32_t>;
+//template class C2FieldSupportedValuesHelper<c2_cntr32_t>;
+template class C2FieldSupportedValuesHelper<int64_t>;
+template class C2FieldSupportedValuesHelper<uint64_t>;
+//template class C2FieldSupportedValuesHelper<c2_cntr64_t>;
+template class C2FieldSupportedValuesHelper<float>;
+
+/* ----------------------- C2ParamFieldValuesBuilder ----------------------- */
+
+template<typename T>
+struct C2ParamFieldValuesBuilder<T>::Impl {
+ Impl(const C2ParamField &field)
+ : _mParamField(field),
+ _mType(type_t::RANGE),
+ _mDefined(false),
+ _mRange(C2SupportedRange<T>::Any()),
+ _mValues(C2SupportedValueSet<T>::None()),
+ _mFlags(C2SupportedFlags<T>::None()) { }
+
+ /**
+ * Get C2ParamFieldValues from this builder.
+ */
+ operator C2ParamFieldValues() const {
+ if (!_mDefined) {
+ return C2ParamFieldValues(_mParamField);
+ }
+ switch (_mType) {
+ case type_t::EMPTY:
+ case type_t::VALUES:
+ return C2ParamFieldValues(_mParamField, (C2FieldSupportedValues)_mValues);
+ case type_t::RANGE:
+ return C2ParamFieldValues(_mParamField, (C2FieldSupportedValues)_mRange);
+ case type_t::FLAGS:
+ return C2ParamFieldValues(_mParamField, (C2FieldSupportedValues)_mFlags);
+ default:
+ // TRESPASS
+ // should never get here
+ return C2ParamFieldValues(_mParamField);
+ }
+ }
+
+ /** Define the supported values as the currently supported values of this builder. */
+ void any() {
+ _mDefined = true;
+ }
+
+ /** Restrict (and thus define) the supported values to none. */
+ void none() {
+ _mDefined = true;
+ _mType = type_t::VALUES;
+ _mValues.clear();
+ }
+
+ /** Restrict (and thus define) the supported values to |value| alone. */
+ void equalTo(T value) {
+ return limitTo(C2SupportedValueSet<T>::OneOf({value}));
+ }
+
+ /** Restrict (and thus define) the supported values to a value set. */
+ void limitTo(const C2SupportedValueSet<T> &limit) {
+ if (!_mDefined) {
+ C2_LOG(VERBOSE) << "NA.limitTo(" << C2FieldSupportedValuesHelper<T>(limit) << ")";
+
+ // shortcut for first limit applied
+ _mDefined = true;
+ _mValues = limit;
+ _mType = _mValues.isEmpty() ? type_t::EMPTY : type_t::VALUES;
+ } else {
+ switch (_mType) {
+ case type_t::EMPTY:
+ case type_t::VALUES:
+ C2_LOG(VERBOSE) << "(" << C2FieldSupportedValuesHelper<T>(_mValues) << ").limitTo("
+ << C2FieldSupportedValuesHelper<T>(limit) << ")";
+
+ _mValues = _mValues.limitedTo(limit);
+ _mType = _mValues.isEmpty() ? type_t::EMPTY : type_t::VALUES;
+ break;
+ case type_t::RANGE:
+ C2_LOG(VERBOSE) << "(" << C2FieldSupportedValuesHelper<T>(_mRange) << ").limitTo("
+ << C2FieldSupportedValuesHelper<T>(limit) << ")";
+
+ _mValues = limit.limitedTo(_mRange);
+ _mType = _mValues.isEmpty() ? type_t::EMPTY : type_t::VALUES;
+ break;
+ case type_t::FLAGS:
+ C2_LOG(VERBOSE) << "(" << C2FieldSupportedValuesHelper<T>(_mRange) << ").limitTo("
+ << C2FieldSupportedValuesHelper<T>(limit) << ")";
+
+ _mValues = limit.limitedTo(_mFlags);
+ _mType = _mValues.isEmpty() ? type_t::EMPTY : type_t::VALUES;
+ break;
+ default:
+ C2_LOG(FATAL); // should not be here
+ }
+ // TODO: support flags
+ }
+ C2_LOG(VERBOSE) << " = " << _mType << ":" << C2FieldSupportedValuesHelper<T>(_mValues);
+ }
+
+ /** Restrict (and thus define) the supported values to a flag set. */
+ void limitTo(const C2SupportedFlags<T> &limit) {
+ if (!_mDefined) {
+ C2_LOG(VERBOSE) << "NA.limitTo(" << C2FieldSupportedValuesHelper<T>(limit) << ")";
+
+ // shortcut for first limit applied
+ _mDefined = true;
+ _mFlags = limit;
+ _mType = _mFlags.isEmpty() ? type_t::EMPTY : type_t::FLAGS;
+ } else {
+ switch (_mType) {
+ case type_t::EMPTY:
+ case type_t::VALUES:
+ C2_LOG(VERBOSE) << "(" << C2FieldSupportedValuesHelper<T>(_mValues) << ").limitTo("
+ << C2FieldSupportedValuesHelper<T>(limit) << ")";
+
+ _mValues = _mValues.limitedTo(limit);
+ _mType = _mValues.isEmpty() ? type_t::EMPTY : type_t::VALUES;
+ C2_LOG(VERBOSE) << " = " << _mType << ":" << C2FieldSupportedValuesHelper<T>(_mValues);
+ break;
+ case type_t::FLAGS:
+ C2_LOG(VERBOSE) << "(" << C2FieldSupportedValuesHelper<T>(_mFlags) << ").limitTo("
+ << C2FieldSupportedValuesHelper<T>(limit) << ")";
+
+ _mFlags = _mFlags.limitedTo(limit);
+ _mType = _mFlags.isEmpty() ? type_t::EMPTY : type_t::FLAGS;
+ C2_LOG(VERBOSE) << " = " << _mType << ":" << C2FieldSupportedValuesHelper<T>(_mFlags);
+ break;
+ case type_t::RANGE:
+ C2_LOG(FATAL) << "limiting ranges to flags is not supported";
+ _mType = type_t::EMPTY;
+ break;
+ default:
+ C2_LOG(FATAL); // should not be here
+ }
+ }
+ }
+
+ void limitTo(const C2SupportedRange<T> &limit) {
+ if (!_mDefined) {
+ C2_LOG(VERBOSE) << "NA.limitTo(" << C2FieldSupportedValuesHelper<T>(limit) << ")";
+
+ // shortcut for first limit applied
+ _mDefined = true;
+ _mRange = limit;
+ _mType = _mRange.isEmpty() ? type_t::EMPTY : type_t::RANGE;
+ C2_LOG(VERBOSE) << " = " << _mType << ":" << C2FieldSupportedValuesHelper<T>(_mRange);
+ } else {
+ switch (_mType) {
+ case type_t::EMPTY:
+ case type_t::VALUES:
+ C2_LOG(VERBOSE) << "(" << C2FieldSupportedValuesHelper<T>(_mValues) << ").limitTo("
+ << C2FieldSupportedValuesHelper<T>(limit) << ")";
+ _mValues = _mValues.limitedTo(limit);
+ _mType = _mValues.isEmpty() ? type_t::EMPTY : type_t::VALUES;
+ C2_LOG(VERBOSE) << " = " << _mType << ":" << C2FieldSupportedValuesHelper<T>(_mValues);
+ break;
+ case type_t::FLAGS:
+ C2_LOG(FATAL) << "limiting flags to ranges is not supported";
+ _mType = type_t::EMPTY;
+ break;
+ case type_t::RANGE:
+ C2_LOG(VERBOSE) << "(" << C2FieldSupportedValuesHelper<T>(_mRange) << ").limitTo("
+ << C2FieldSupportedValuesHelper<T>(limit) << ")";
+ _mRange = _mRange.limitedTo(limit);
+ C2_DCHECK(_mValues.isEmpty());
+ _mType = _mRange.isEmpty() ? type_t::EMPTY : type_t::RANGE;
+ C2_LOG(VERBOSE) << " = " << _mType << ":" << C2FieldSupportedValuesHelper<T>(_mRange);
+ break;
+ default:
+ C2_LOG(FATAL); // should not be here
+ }
+ }
+ }
+
+private:
+ void instantiate() __unused {
+ (void)_mValues.values(); // instantiate non-const values()
+ }
+
+ void instantiate() const __unused {
+ (void)_mValues.values(); // instantiate const values()
+ }
+
+ typedef C2FieldSupportedValues::type_t type_t;
+
+ C2ParamField _mParamField;
+ type_t _mType;
+ bool _mDefined;
+ C2SupportedRange<T> _mRange;
+ C2SupportedValueSet<T> _mValues;
+ C2SupportedFlags<T> _mFlags;
+
+};
+
+template<typename T>
+C2ParamFieldValuesBuilder<T>::operator C2ParamFieldValues() const {
+ return (C2ParamFieldValues)(*_mImpl.get());
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T>::C2ParamFieldValuesBuilder(const C2ParamField &field)
+ : _mImpl(std::make_unique<C2ParamFieldValuesBuilder<T>::Impl>(field)) { }
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> &C2ParamFieldValuesBuilder<T>::any() {
+ _mImpl->any();
+ return *this;
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> &C2ParamFieldValuesBuilder<T>::none() {
+ _mImpl->none();
+ return *this;
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> &C2ParamFieldValuesBuilder<T>::equalTo(T value) {
+ _mImpl->equalTo(value);
+ return *this;
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> &C2ParamFieldValuesBuilder<T>::limitTo(const C2SupportedValueSet<T> &limit) {
+ _mImpl->limitTo(limit);
+ return *this;
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> &C2ParamFieldValuesBuilder<T>::limitTo(const C2SupportedFlags<T> &limit) {
+ _mImpl->limitTo(limit);
+ return *this;
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> &C2ParamFieldValuesBuilder<T>::limitTo(const C2SupportedRange<T> &limit) {
+ _mImpl->limitTo(limit);
+ return *this;
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T>::C2ParamFieldValuesBuilder(const C2ParamFieldValuesBuilder<T> &other)
+ : _mImpl(std::make_unique<C2ParamFieldValuesBuilder<T>::Impl>(*other._mImpl.get())) { }
+
+template<typename T>
+C2ParamFieldValuesBuilder<T> &C2ParamFieldValuesBuilder<T>::operator=(
+ const C2ParamFieldValuesBuilder<T> &other) {
+ _mImpl = std::make_unique<C2ParamFieldValuesBuilder<T>::Impl>(*other._mImpl.get());
+ return *this;
+}
+
+template<typename T>
+C2ParamFieldValuesBuilder<T>::~C2ParamFieldValuesBuilder() = default;
+
+template class C2ParamFieldValuesBuilder<uint8_t>;
+template class C2ParamFieldValuesBuilder<char>;
+template class C2ParamFieldValuesBuilder<int32_t>;
+template class C2ParamFieldValuesBuilder<uint32_t>;
+//template class C2ParamFieldValuesBuilder<c2_cntr32_t>;
+template class C2ParamFieldValuesBuilder<int64_t>;
+template class C2ParamFieldValuesBuilder<uint64_t>;
+//template class C2ParamFieldValuesBuilder<c2_cntr64_t>;
+template class C2ParamFieldValuesBuilder<float>;
+
+/* ------------------------- C2SettingResultBuilder ------------------------- */
+
+C2SettingConflictsBuilder::C2SettingConflictsBuilder() : _mConflicts() { }
+
+C2SettingConflictsBuilder::C2SettingConflictsBuilder(C2ParamFieldValues &&conflict) {
+ _mConflicts.emplace_back(std::move(conflict));
+}
+
+C2SettingConflictsBuilder& C2SettingConflictsBuilder::with(C2ParamFieldValues &&conflict) {
+ _mConflicts.emplace_back(std::move(conflict));
+ return *this;
+}
+
+std::vector<C2ParamFieldValues> C2SettingConflictsBuilder::retrieveConflicts() {
+ return std::move(_mConflicts);
+}
+
+/* ------------------------- C2SettingResult/sBuilder ------------------------- */
+
+C2SettingResult C2SettingResultBuilder::ReadOnly(const C2ParamField ¶m) {
+ return C2SettingResult { C2SettingResult::READ_ONLY, { param }, { } };
+}
+
+C2SettingResult C2SettingResultBuilder::BadValue(const C2ParamField ¶mField, bool isInfo) {
+ return { isInfo ? C2SettingResult::INFO_BAD_VALUE : C2SettingResult::BAD_VALUE,
+ { paramField }, { } };
+}
+
+C2SettingResult C2SettingResultBuilder::Conflict(
+ C2ParamFieldValues &¶mFieldValues, C2SettingConflictsBuilder &conflicts, bool isInfo) {
+ C2_CHECK(!conflicts.empty());
+ if (isInfo) {
+ return C2SettingResult {
+ C2SettingResult::INFO_CONFLICT,
+ std::move(paramFieldValues), conflicts.retrieveConflicts()
+ };
+ } else {
+ return C2SettingResult {
+ C2SettingResult::CONFLICT,
+ std::move(paramFieldValues), conflicts.retrieveConflicts()
+ };
+ }
+}
+
+C2SettingResultsBuilder::C2SettingResultsBuilder(C2SettingResult &&result)
+ : _mStatus(C2_BAD_VALUE) {
+ _mResults.emplace_back(new C2SettingResult(std::move(result)));
+}
+
+C2SettingResultsBuilder C2SettingResultsBuilder::plus(C2SettingResultsBuilder&& results) {
+ for (std::unique_ptr<C2SettingResult> &r : results._mResults) {
+ _mResults.emplace_back(std::move(r));
+ }
+ results._mResults.clear();
+ // TODO: mStatus
+ return std::move(*this);
+}
+
+c2_status_t C2SettingResultsBuilder::retrieveFailures(
+ std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
+ for (std::unique_ptr<C2SettingResult> &r : _mResults) {
+ failures->emplace_back(std::move(r));
+ }
+ _mResults.clear();
+ return _mStatus;
+}
+
+C2SettingResultsBuilder::C2SettingResultsBuilder(c2_status_t status) : _mStatus(status) {
+ // status must be one of OK, BAD_STATE, TIMED_OUT or CORRUPTED
+ // mainly: BLOCKING, BAD_INDEX, BAD_VALUE and NO_MEMORY requires a setting attempt
+}
+
+#pragma clang diagnostic pop
+
+/* ------------------------- C2FieldUtils ------------------------- */
+
+struct C2_HIDE C2FieldUtils::_Inspector {
+ /// returns the implementation object
+ inline static std::shared_ptr<Info::Impl> GetImpl(const Info &info) {
+ return info._mImpl;
+ }
+};
+
+/* ------------------------- C2FieldUtils::Info ------------------------- */
+
+struct C2_HIDE C2FieldUtils::Info::Impl {
+ C2FieldDescriptor field;
+ std::shared_ptr<Impl> parent;
+ uint32_t index;
+ uint32_t depth;
+ uint32_t baseFieldOffset;
+ uint32_t arrayOffset;
+ uint32_t usedExtent;
+
+ /// creates a copy of this object including copies of its parent chain
+ Impl clone() const;
+
+ /// creates a copy of a shared pointer to an object
+ static std::shared_ptr<Impl> Clone(const std::shared_ptr<Impl> &);
+
+ Impl(const C2FieldDescriptor &field_, std::shared_ptr<Impl> parent_,
+ uint32_t index_, uint32_t depth_, uint32_t baseFieldOffset_,
+ uint32_t arrayOffset_, uint32_t usedExtent_)
+ : field(field_), parent(parent_), index(index_), depth(depth_),
+ baseFieldOffset(baseFieldOffset_), arrayOffset(arrayOffset_), usedExtent(usedExtent_) { }
+};
+
+std::shared_ptr<C2FieldUtils::Info::Impl> C2FieldUtils::Info::Impl::Clone(const std::shared_ptr<Impl> &info) {
+ if (info) {
+ return std::make_shared<Impl>(info->clone());
+ }
+ return nullptr;
+}
+
+C2FieldUtils::Info::Impl C2FieldUtils::Info::Impl::clone() const {
+ Impl res = Impl(*this);
+ res.parent = Clone(res.parent);
+ return res;
+}
+
+C2FieldUtils::Info::Info(std::shared_ptr<Impl> impl)
+ : _mImpl(impl) { }
+
+size_t C2FieldUtils::Info::arrayOffset() const {
+ return _mImpl->arrayOffset;
+}
+
+size_t C2FieldUtils::Info::arraySize() const {
+ return extent() * size();
+}
+
+size_t C2FieldUtils::Info::baseFieldOffset() const {
+ return _mImpl->baseFieldOffset;
+};
+
+size_t C2FieldUtils::Info::depth() const {
+ return _mImpl->depth;
+}
+
+size_t C2FieldUtils::Info::extent() const {
+ return _mImpl->usedExtent;
+}
+
+size_t C2FieldUtils::Info::index() const {
+ return _mImpl->index;
+}
+
+bool C2FieldUtils::Info::isArithmetic() const {
+ switch (_mImpl->field.type()) {
+ case C2FieldDescriptor::BLOB:
+ case C2FieldDescriptor::CNTR32:
+ case C2FieldDescriptor::CNTR64:
+ case C2FieldDescriptor::FLOAT:
+ case C2FieldDescriptor::INT32:
+ case C2FieldDescriptor::INT64:
+ case C2FieldDescriptor::STRING:
+ case C2FieldDescriptor::UINT32:
+ case C2FieldDescriptor::UINT64:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool C2FieldUtils::Info::isFlexible() const {
+ return _mImpl->field.extent() == 0;
+}
+
+C2String C2FieldUtils::Info::name() const {
+ return _mImpl->field.name();
+}
+
+const C2FieldUtils::Info::NamedValuesType &C2FieldUtils::Info::namedValues() const {
+ return _mImpl->field.namedValues();
+}
+
+size_t C2FieldUtils::Info::offset() const {
+ return _C2ParamInspector::GetOffset(_mImpl->field);
+}
+
+C2FieldUtils::Info C2FieldUtils::Info::parent() const {
+ return Info(_mImpl->parent);
+};
+
+size_t C2FieldUtils::Info::size() const {
+ return _C2ParamInspector::GetSize(_mImpl->field);
+}
+
+C2FieldUtils::Info::type_t C2FieldUtils::Info::type() const {
+ return _mImpl->field.type();
+}
+
+/* ------------------------- C2FieldUtils::Iterator ------------------------- */
+
+struct C2_HIDE C2FieldUtils::Iterator::Impl : public _C2ParamInspector {
+ Impl() = default;
+
+ virtual ~Impl() = default;
+
+ /// implements object equality
+ virtual bool equals(const std::shared_ptr<Impl> &other) const {
+ return other != nullptr && mHead == other->mHead;
+ };
+
+ /// returns the info pointed to by this iterator
+ virtual value_type get() const {
+ return Info(mHead);
+ }
+
+ /// increments this iterator
+ virtual void increment() {
+ // note: this cannot be abstract as we instantiate this for List::end(). increment to end()
+ // instead.
+ mHead.reset();
+ }
+
+protected:
+ Impl(std::shared_ptr<C2FieldUtils::Info::Impl> head)
+ : mHead(head) { }
+
+ std::shared_ptr<Info::Impl> mHead; ///< current field
+};
+
+C2FieldUtils::Iterator::Iterator(std::shared_ptr<Impl> impl)
+ : mImpl(impl) { }
+
+C2FieldUtils::Iterator::value_type C2FieldUtils::Iterator::operator*() const {
+ return mImpl->get();
+}
+
+C2FieldUtils::Iterator& C2FieldUtils::Iterator::operator++() {
+ mImpl->increment();
+ return *this;
+}
+
+bool C2FieldUtils::Iterator::operator==(const Iterator &other) const {
+ return mImpl->equals(other.mImpl);
+}
+
+/* ------------------------- C2FieldUtils::List ------------------------- */
+
+struct C2_HIDE C2FieldUtils::List::Impl {
+ virtual std::shared_ptr<Iterator::Impl> begin() const = 0;
+
+ /// returns an iterator to the end of the list
+ virtual std::shared_ptr<Iterator::Impl> end() const {
+ return std::make_shared<Iterator::Impl>();
+ }
+
+ virtual ~Impl() = default;
+};
+
+C2FieldUtils::List::List(std::shared_ptr<Impl> impl)
+ : mImpl(impl) { }
+
+C2FieldUtils::Iterator C2FieldUtils::List::begin() const {
+ return C2FieldUtils::Iterator(mImpl->begin());
+}
+
+C2FieldUtils::Iterator C2FieldUtils::List::end() const {
+ return C2FieldUtils::Iterator(mImpl->end());
+}
+
+/* ------------------------- C2FieldUtils::enumerateFields ------------------------- */
+
+namespace {
+
+/**
+ * Iterator base class helper that allows descending into the field hierarchy.
+ */
+struct C2FieldUtilsFieldsIteratorHelper : public C2FieldUtils::Iterator::Impl {
+ virtual ~C2FieldUtilsFieldsIteratorHelper() override = default;
+
+ /// returns the base-field's offset of the parent field (or the param offset if no parent)
+ static inline uint32_t GetParentBaseFieldOffset(
+ const std::shared_ptr<C2FieldUtils::Info::Impl> parent) {
+ return parent == nullptr ? sizeof(C2Param) : parent->baseFieldOffset;
+ }
+
+ /// returns the offset of the parent field (or the param)
+ static inline uint32_t GetParentOffset(const std::shared_ptr<C2FieldUtils::Info::Impl> parent) {
+ return parent == nullptr ? sizeof(C2Param) : GetOffset(parent->field);
+ }
+
+protected:
+ C2FieldUtilsFieldsIteratorHelper(
+ std::shared_ptr<C2ParamReflector> reflector,
+ uint32_t paramSize,
+ std::shared_ptr<C2FieldUtils::Info::Impl> head = nullptr)
+ : C2FieldUtils::Iterator::Impl(head),
+ mParamSize(paramSize),
+ mReflector(reflector) { }
+
+ /// returns a leaf info object at a specific index for a child field
+ std::shared_ptr<C2FieldUtils::Info::Impl> makeLeaf(
+ const C2FieldDescriptor &field, uint32_t index) {
+ uint32_t parentOffset = GetParentOffset(mHead);
+ uint32_t arrayOffset = parentOffset + GetOffset(field);
+ uint32_t usedExtent = field.extent() ? :
+ (std::max(arrayOffset, mParamSize) - arrayOffset) / GetSize(field);
+
+ return std::make_shared<C2FieldUtils::Info::Impl>(
+ OffsetFieldDescriptor(field, parentOffset + index * GetSize(field)),
+ mHead /* parent */, index, mHead == nullptr ? 0 : mHead->depth + 1,
+ GetParentBaseFieldOffset(mHead) + GetOffset(field),
+ arrayOffset, usedExtent);
+ }
+
+ /// returns whether this struct index have been traversed to get to this field
+ bool visited(C2Param::CoreIndex index) const {
+ for (const std::shared_ptr<C2StructDescriptor> &sd : mHistory) {
+ if (sd->coreIndex() == index) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ uint32_t mParamSize;
+ std::shared_ptr<C2ParamReflector> mReflector;
+ std::vector<std::shared_ptr<C2StructDescriptor>> mHistory; // structure types visited
+};
+
+/**
+ * Iterator implementing enumerateFields() that visits each base field.
+ */
+struct C2FieldUtilsFieldsIterator : public C2FieldUtilsFieldsIteratorHelper {
+ /// enumerate base fields of a parameter
+ C2FieldUtilsFieldsIterator(const C2Param ¶m, std::shared_ptr<C2ParamReflector> reflector)
+ : C2FieldUtilsFieldsIteratorHelper(reflector, param.size()) {
+ descendInto(param.coreIndex());
+ }
+
+ /// enumerate base fields of a field
+ C2FieldUtilsFieldsIterator(std::shared_ptr<C2FieldUtilsFieldsIterator> impl)
+ : C2FieldUtilsFieldsIteratorHelper(impl->mReflector, impl->mParamSize, impl->mHead) {
+ mHistory = impl->mHistory;
+ if (mHead->field.type() & C2FieldDescriptor::STRUCT_FLAG) {
+ C2Param::CoreIndex index = { mHead->field.type() &~C2FieldDescriptor::STRUCT_FLAG };
+ if (!visited(index)) {
+ descendInto(index);
+ }
+ }
+ }
+
+ virtual ~C2FieldUtilsFieldsIterator() override = default;
+
+ /// Increments this iterator by visiting each base field.
+ virtual void increment() override {
+ // don't go past end
+ if (mHead == nullptr || _mFields.empty()) {
+ return;
+ }
+
+ // descend into structures
+ if (mHead->field.type() & C2FieldDescriptor::STRUCT_FLAG) {
+ C2Param::CoreIndex index = { mHead->field.type() &~C2FieldDescriptor::STRUCT_FLAG };
+ // do not recurse into the same structs
+ if (!visited(index) && descendInto(index)) {
+ return;
+ }
+ }
+
+ // ascend after the last field in the current struct
+ while (!mHistory.empty() && _mFields.back() == mHistory.back()->end()) {
+ mHead = mHead->parent;
+ mHistory.pop_back();
+ _mFields.pop_back();
+ }
+
+ // done if history is now empty
+ if (_mFields.empty()) {
+ // we could be traversing a sub-tree so clear head
+ mHead.reset();
+ return;
+ }
+
+ // move to the next field in the current struct
+ C2StructDescriptor::field_iterator next = _mFields.back();
+ mHead->field = OffsetFieldDescriptor(*next, GetParentOffset(mHead->parent));
+ mHead->index = 0; // reset index just in case for correctness
+ mHead->baseFieldOffset = GetParentBaseFieldOffset(mHead->parent) + GetOffset(*next);
+ mHead->arrayOffset = GetOffset(mHead->field);
+ mHead->usedExtent = mHead->field.extent() ? :
+ (std::max(mHead->arrayOffset, mParamSize) - mHead->arrayOffset)
+ / GetSize(mHead->field);
+ ++_mFields.back();
+ }
+
+private:
+ /// If the current field is a known, valid (untraversed) structure, it modifies this iterator
+ /// to point to the first field of the structure and returns true. Otherwise, it does not
+ /// modify this iterator and returns false.
+ bool descendInto(C2Param::CoreIndex index) {
+ std::unique_ptr<C2StructDescriptor> descUnique = mReflector->describe(index);
+ // descend into known structs (as long as they have at least one field)
+ if (descUnique && descUnique->begin() != descUnique->end()) {
+ std::shared_ptr<C2StructDescriptor> desc(std::move(descUnique));
+ mHistory.emplace_back(desc);
+ C2StructDescriptor::field_iterator first = desc->begin();
+ mHead = makeLeaf(*first, 0 /* index */);
+ _mFields.emplace_back(++first);
+ return true;
+ }
+ return false;
+ }
+
+ /// next field pointers for each depth.
+ /// note: _mFields may be shorted than mHistory, if iterating at a depth
+ std::vector<C2StructDescriptor::field_iterator> _mFields;
+};
+
+/**
+ * Iterable implementing enumerateFields().
+ */
+struct C2FieldUtilsFieldIterable : public C2FieldUtils::List::Impl {
+ /// returns an iterator to the beginning of the list
+ virtual std::shared_ptr<C2FieldUtils::Iterator::Impl> begin() const override {
+ return std::make_shared<C2FieldUtilsFieldsIterator>(*_mParam, _mReflector);
+ };
+
+ C2FieldUtilsFieldIterable(const C2Param ¶m, std::shared_ptr<C2ParamReflector> reflector)
+ : _mParam(¶m), _mReflector(reflector) { }
+
+private:
+ const C2Param *_mParam;
+ std::shared_ptr<C2ParamReflector> _mReflector;
+};
+
+}
+
+C2FieldUtils::List C2FieldUtils::enumerateFields(
+ const C2Param ¶m, const std::shared_ptr<C2ParamReflector> &reflector) {
+ return C2FieldUtils::List(std::make_shared<C2FieldUtilsFieldIterable>(param, reflector));
+}
+
+/* ------------------------- C2FieldUtils::enumerate siblings ------------------------- */
+
+namespace {
+
+struct C2FieldUtilsCousinsIterator : public C2FieldUtils::Iterator::Impl {
+ C2FieldUtilsCousinsIterator(
+ const std::shared_ptr<C2FieldUtils::Info::Impl> &info, size_t level)
+ // clone info chain as this iterator will change it
+ : C2FieldUtils::Iterator::Impl(C2FieldUtils::Info::Impl::Clone(info)) {
+ if (level == 0) {
+ return;
+ }
+
+ // store parent chain (up to level) for quick access
+ std::shared_ptr<C2FieldUtils::Info::Impl> node = mHead;
+ size_t ix = 0;
+ for (; ix < level && node; ++ix) {
+ node->index = 0;
+ _mPath.emplace_back(node);
+ node = node->parent;
+ }
+ setupPath(ix);
+ }
+
+ virtual ~C2FieldUtilsCousinsIterator() override = default;
+
+ /// Increments this iterator by visiting each index.
+ virtual void increment() override {
+ size_t ix = 0;
+ while (ix < _mPath.size()) {
+ if (++_mPath[ix]->index < _mPath[ix]->usedExtent) {
+ setupPath(ix + 1);
+ return;
+ }
+ _mPath[ix++]->index = 0;
+ }
+ mHead.reset();
+ }
+
+private:
+ /// adjusts field offsets along the path up to the specific level - 1.
+ /// This in-fact has to be done down the path from parent to child as child fields must
+ /// fall within parent fields.
+ void setupPath(size_t level) {
+ C2_CHECK_LE(level, _mPath.size());
+ uint32_t oldArrayOffset = level ? _mPath[level - 1]->arrayOffset : 0 /* unused */;
+ while (level) {
+ --level;
+ C2FieldUtils::Info::Impl &path = *_mPath[level];
+ uint32_t size = GetSize(path.field);
+ uint32_t offset = path.arrayOffset + size * path.index;
+ SetOffset(path.field, offset);
+ if (level) {
+ // reset child's array offset to fall within current index, but hold onto the
+ // original value of the arrayOffset so that we can adjust subsequent children.
+ // This is because the modulo is only defined within the current array.
+ uint32_t childArrayOffset =
+ offset + (_mPath[level - 1]->arrayOffset - oldArrayOffset) % size;
+ oldArrayOffset = _mPath[level - 1]->arrayOffset;
+ _mPath[level - 1]->arrayOffset = childArrayOffset;
+ }
+ }
+ }
+
+ std::vector<std::shared_ptr<C2FieldUtils::Info::Impl>> _mPath;
+};
+
+/**
+ * Iterable implementing enumerateFields().
+ */
+struct C2FieldUtilsCousinsIterable : public C2FieldUtils::List::Impl {
+ /// returns an iterator to the beginning of the list
+ virtual std::shared_ptr<C2FieldUtils::Iterator::Impl> begin() const override {
+ return std::make_shared<C2FieldUtilsCousinsIterator>(_mHead, _mLevel);
+ };
+
+ C2FieldUtilsCousinsIterable(const C2FieldUtils::Info &field, uint32_t level)
+ : _mHead(C2FieldUtils::_Inspector::GetImpl(field)), _mLevel(level) { }
+
+private:
+ std::shared_ptr<C2FieldUtils::Info::Impl> _mHead;
+ size_t _mLevel;
+};
+
+}
+
+C2FieldUtils::List C2FieldUtils::enumerateCousins(const C2FieldUtils::Info &field, uint32_t level) {
+ return C2FieldUtils::List(std::make_shared<C2FieldUtilsCousinsIterable>(field, level));
+}
+
+/* ------------------------- C2FieldUtils::locateField ------------------------- */
+
+namespace {
+
+/**
+ * Iterator implementing locateField().
+ */
+struct C2FieldUtilsFieldLocator : public C2FieldUtilsFieldsIteratorHelper {
+ C2FieldUtilsFieldLocator(
+ C2Param::CoreIndex index, const _C2FieldId &field, uint32_t paramSize,
+ std::shared_ptr<C2ParamReflector> reflector)
+ : C2FieldUtilsFieldsIteratorHelper(reflector, paramSize),
+ _mField(field) {
+ while (descendInto(index)) {
+ if ((mHead->field.type() & C2FieldDescriptor::STRUCT_FLAG) == 0) {
+ break;
+ }
+ index = C2Param::CoreIndex(mHead->field.type() &~ C2FieldDescriptor::STRUCT_FLAG);
+ }
+ }
+
+ void increment() {
+ mHead = _mTail;
+ _mTail = nullptr;
+ }
+
+private:
+ /// If the current field is a known, valid (untraversed) structure, it modifies this iterator
+ /// to point to the field at the beginning/end of the given field of the structure and returns
+ /// true. Otherwise, including if no such field exists in the structure, it does not modify this
+ /// iterator and returns false.
+ bool descendInto(C2Param::CoreIndex index) {
+ // check that the boundaries of the field to be located are still within the same parent
+ // field
+ if (mHead != _mTail) {
+ return false;
+ }
+
+ std::unique_ptr<C2StructDescriptor> descUnique = mReflector->describe(index);
+ // descend into known structs (as long as they have at least one field)
+ if (descUnique && descUnique->begin() != descUnique->end()) {
+ std::shared_ptr<C2StructDescriptor> desc(std::move(descUnique));
+ mHistory.emplace_back(desc);
+
+ uint32_t parentOffset = GetParentOffset(mHead);
+
+ // locate field using a dummy field descriptor
+ C2FieldDescriptor dummy = {
+ C2FieldDescriptor::BLOB, 1 /* extent */, "name",
+ GetOffset(_mField) - parentOffset, GetSize(_mField)
+ };
+
+ // locate first field where offset is greater than dummy offset (which is one past)
+ auto it = std::upper_bound(
+ desc->cbegin(), desc->cend(), dummy,
+ [](const C2FieldDescriptor &a, const C2FieldDescriptor &b) -> bool {
+ return _C2ParamInspector::GetOffset(a) < _C2ParamInspector::GetOffset(b);
+ });
+ if (it == desc->begin()) {
+ // field is prior to first field
+ return false;
+ }
+ --it;
+ const C2FieldDescriptor &field = *it;
+
+ // check that dummy end-offset is within this field
+ uint32_t structSize = std::max(mParamSize, parentOffset) - parentOffset;
+ if (GetEndOffset(dummy) > GetEndOffset(field, structSize)) {
+ return false;
+ }
+
+ uint32_t startIndex = (GetOffset(dummy) - GetOffset(field)) / GetSize(field);
+ uint32_t endIndex =
+ (GetEndOffset(dummy) - GetOffset(field) + GetSize(field) - 1) / GetSize(field);
+ if (endIndex > startIndex) {
+ // Field size could be zero, in which case end index is still on start index.
+ // However, for all other cases, endIndex was rounded up to the next index, so
+ // decrement it.
+ --endIndex;
+ }
+ std::shared_ptr<C2FieldUtils::Info::Impl> startLeaf =
+ makeLeaf(field, startIndex);
+ if (endIndex == startIndex) {
+ _mTail = startLeaf;
+ mHead = startLeaf;
+ } else {
+ _mTail = makeLeaf(field, endIndex);
+ mHead = startLeaf;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ _C2FieldId _mField;
+ std::shared_ptr<C2FieldUtils::Info::Impl> _mTail;
+};
+
+/**
+ * Iterable implementing locateField().
+ */
+struct C2FieldUtilsFieldLocation : public C2FieldUtils::List::Impl {
+ /// returns an iterator to the beginning of the list
+ virtual std::shared_ptr<C2FieldUtils::Iterator::Impl> begin() const override {
+ return std::make_shared<C2FieldUtilsFieldLocator>(
+ _mIndex, _mField, _mParamSize, _mReflector);
+ };
+
+ C2FieldUtilsFieldLocation(
+ const C2ParamField &pf, std::shared_ptr<C2ParamReflector> reflector)
+ : _mIndex(C2Param::CoreIndex(_C2ParamInspector::GetIndex(pf))),
+ _mField(_C2ParamInspector::GetField(pf)),
+ _mParamSize(0),
+ _mReflector(reflector) { }
+
+
+ C2FieldUtilsFieldLocation(
+ const C2Param ¶m, const _C2FieldId &field,
+ std::shared_ptr<C2ParamReflector> reflector)
+ : _mIndex(param.coreIndex()),
+ _mField(field),
+ _mParamSize(param.size()),
+ _mReflector(reflector) { }
+
+private:
+ C2Param::CoreIndex _mIndex;
+ _C2FieldId _mField;
+ uint32_t _mParamSize;
+ std::shared_ptr<C2ParamReflector> _mReflector;
+};
+
+}
+
+std::vector<C2FieldUtils::Info> C2FieldUtils::locateField(
+ const C2ParamField &pf, const std::shared_ptr<C2ParamReflector> &reflector) {
+ C2FieldUtils::List location = { std::make_shared<C2FieldUtilsFieldLocation>(pf, reflector) };
+ return std::vector<Info>(location.begin(), location.end());
+}
+
+std::vector<C2FieldUtils::Info> C2FieldUtils::locateField(
+ const C2Param ¶m, const _C2FieldId &field,
+ const std::shared_ptr<C2ParamReflector> &reflector) {
+ C2FieldUtils::List location = {
+ std::make_shared<C2FieldUtilsFieldLocation>(param, field, reflector)
+ };
+ return std::vector<Info>(location.begin(), location.end());
+}
+
diff --git a/media/codec2/vndk/util/C2ParamUtils.cpp b/media/codec2/vndk/util/C2ParamUtils.cpp
new file mode 100644
index 0000000..80573d8
--- /dev/null
+++ b/media/codec2/vndk/util/C2ParamUtils.cpp
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define __C2_GENERATE_GLOBAL_VARS__ // to be able to implement the methods defined
+#include <C2Enum.h>
+#include <util/C2Debug-log.h>
+#include <util/C2ParamUtils.h>
+
+#include <utility>
+#include <vector>
+
+/** \file
+ * Utilities for parameter handling to be used by Codec2 implementations.
+ */
+
+/// \cond INTERNAL
+
+/* ---------------------------- UTILITIES FOR ENUMERATION REFLECTION ---------------------------- */
+
+static size_t countLeadingUnderscores(C2StringLiteral a) {
+ size_t i = 0;
+ while (a[i] == '_') {
+ ++i;
+ }
+ return i;
+}
+
+static size_t countMatching(C2StringLiteral a, const C2String &b) {
+ for (size_t i = 0; i < b.size(); ++i) {
+ if (!a[i] || a[i] != b[i]) {
+ return i;
+ }
+ }
+ return b.size();
+}
+
+// ABCDef => abc-def
+// ABCD2ef => abcd2-ef // 0
+// ABCD2Ef => ancd2-ef // -1
+// AbcDef => abc-def // -1
+// Abc2Def => abc-2def
+// Abc2def => abc-2-def
+// _Yo => _yo
+// _yo => _yo
+// C2_yo => c2-yo
+// C2__yo => c2-yo
+
+//static
+C2String _C2EnumUtils::camelCaseToDashed(C2String name) {
+ enum {
+ kNone = '.',
+ kLower = 'a',
+ kUpper = 'A',
+ kDigit = '1',
+ kDash = '-',
+ kUnderscore = '_',
+ } type = kNone;
+ size_t word_start = 0;
+ for (size_t ix = 0; ix < name.size(); ++ix) {
+ C2_LOG(VERBOSE) << name.substr(0, word_start) << "|"
+ << name.substr(word_start, ix - word_start) << "["
+ << name.substr(ix, 1) << "]" << name.substr(ix + 1)
+ << ": " << (char)type;
+ if (isupper(name[ix])) {
+ if (type == kLower) {
+ name.insert(ix++, 1, '-');
+ word_start = ix;
+ }
+ name[ix] = tolower(name[ix]);
+ type = kUpper;
+ } else if (islower(name[ix])) {
+ if (type == kDigit && ix > 0) {
+ name.insert(ix++, 1, '-');
+ word_start = ix;
+ } else if (type == kUpper && ix > word_start + 1) {
+ name.insert(ix++ - 1, 1, '-');
+ word_start = ix - 1;
+ }
+ type = kLower;
+ } else if (isdigit(name[ix])) {
+ if (type == kLower) {
+ name.insert(ix++, 1, '-');
+ word_start = ix;
+ }
+ type = kDigit;
+ } else if (name[ix] == '_') {
+ if (type == kDash) {
+ name.erase(ix--, 1);
+ } else if (type != kNone && type != kUnderscore) {
+ name[ix] = '-';
+ type = kDash;
+ word_start = ix + 1;
+ } else {
+ type = kUnderscore;
+ word_start = ix + 1;
+ }
+ } else {
+ name.resize(ix);
+ }
+ }
+ C2_LOG(VERBOSE) << "=> " << name;
+ return name;
+}
+
+//static
+std::vector<C2String> _C2EnumUtils::sanitizeEnumValueNames(
+ const std::vector<C2StringLiteral> names,
+ C2StringLiteral _prefix) {
+ std::vector<C2String> sanitizedNames;
+ C2String prefix;
+ size_t extraUnderscores = 0;
+ bool first = true;
+ if (_prefix) {
+ extraUnderscores = countLeadingUnderscores(_prefix);
+ prefix = _prefix + extraUnderscores;
+ first = false;
+ C2_LOG(VERBOSE) << "prefix:" << prefix << ", underscores:" << extraUnderscores;
+ }
+
+ // calculate prefix and minimum leading underscores
+ for (C2StringLiteral s : names) {
+ C2_LOG(VERBOSE) << s;
+ size_t underscores = countLeadingUnderscores(s);
+ if (first) {
+ extraUnderscores = underscores;
+ prefix = s + underscores;
+ first = false;
+ } else {
+ size_t matching = countMatching(
+ s + underscores,
+ prefix);
+ prefix.resize(matching);
+ extraUnderscores = std::min(underscores, extraUnderscores);
+ }
+ C2_LOG(VERBOSE) << "prefix:" << prefix << ", underscores:" << extraUnderscores;
+ if (prefix.size() == 0 && extraUnderscores == 0) {
+ break;
+ }
+ }
+
+ // we swallow the first underscore after upper case prefixes
+ bool upperCasePrefix = true;
+ for (size_t i = 0; i < prefix.size(); ++i) {
+ if (islower(prefix[i])) {
+ upperCasePrefix = false;
+ break;
+ }
+ }
+
+ for (C2StringLiteral s : names) {
+ size_t underscores = countLeadingUnderscores(s);
+ C2String sanitized = C2String(s, underscores - extraUnderscores);
+ sanitized.append(s + prefix.size() + underscores +
+ (upperCasePrefix && s[prefix.size() + underscores] == '_'));
+ sanitizedNames.push_back(camelCaseToDashed(sanitized));
+ }
+
+ for (C2String s : sanitizedNames) {
+ C2_LOG(VERBOSE) << s;
+ }
+
+ return sanitizedNames;
+}
+
+//static
+std::vector<C2String> _C2EnumUtils::parseEnumValuesFromString(C2StringLiteral value) {
+ std::vector<C2String> foundNames;
+ size_t pos = 0, len = strlen(value);
+ do {
+ size_t endPos = strcspn(value + pos, " ,=") + pos;
+ if (endPos > pos) {
+ foundNames.emplace_back(value + pos, endPos - pos);
+ }
+ if (value[endPos] && value[endPos] != ',') {
+ endPos += strcspn(value + endPos, ",");
+ }
+ pos = strspn(value + endPos, " ,") + endPos;
+ } while (pos < len);
+ return foundNames;
+}
+
+/// safe(r) parsing from parameter blob
+//static
+C2Param *C2ParamUtils::ParseFirst(const uint8_t *blob, size_t size) {
+ // _mSize must fit into size, but really C2Param must also to be a valid param
+ if (size < sizeof(C2Param)) {
+ return nullptr;
+ }
+ // _mSize must match length
+ C2Param *param = (C2Param*)blob;
+ if (param->size() > size) {
+ return nullptr;
+ }
+ return param;
+}
+
diff --git a/media/extractors/flac/Android.bp b/media/extractors/flac/Android.bp
index eda7b61..4d0a4cc 100644
--- a/media/extractors/flac/Android.bp
+++ b/media/extractors/flac/Android.bp
@@ -8,12 +8,14 @@
],
shared_libs: [
+ "libbinder_ndk",
"liblog",
"libmediaextractor",
"libmediandk",
],
static_libs: [
+ "libaudioutils",
"libFLAC",
"libstagefright_foundation",
"libstagefright_metadatautils",
diff --git a/media/extractors/flac/FLACExtractor.cpp b/media/extractors/flac/FLACExtractor.cpp
index be6d9fd..d54aaef 100644
--- a/media/extractors/flac/FLACExtractor.cpp
+++ b/media/extractors/flac/FLACExtractor.cpp
@@ -24,6 +24,8 @@
// libFLAC parser
#include "FLAC/stream_decoder.h"
+#include <android/binder_ibinder.h> // for AIBinder_getCallingUid
+#include <audio_utils/primitives.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/NdkMediaFormat.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -35,9 +37,20 @@
#include <media/stagefright/MetaData.h>
#include <media/stagefright/MetaDataUtils.h>
#include <media/stagefright/MediaBufferBase.h>
+#include <private/android_filesystem_config.h> // for AID_MEDIA
+#include <system/audio.h>
namespace android {
+// MediaServer is capable of handling float extractor output, but general processes
+// may not be able to do so.
+// TODO: Improve API to set extractor float output.
+// (Note: duplicated with WAVExtractor.cpp)
+static inline bool shouldExtractorOutputFloat(int bitsPerSample)
+{
+ return bitsPerSample > 16 && AIBinder_getCallingUid() == AID_MEDIA;
+}
+
class FLACParser;
class FLACSource : public MediaTrackHelperV2 {
@@ -45,7 +58,8 @@
public:
FLACSource(
DataSourceHelper *dataSource,
- AMediaFormat *meta);
+ AMediaFormat *meta,
+ bool outputFloat);
virtual media_status_t start();
virtual media_status_t stop();
@@ -60,6 +74,7 @@
private:
DataSourceHelper *mDataSource;
AMediaFormat *mTrackMetadata;
+ const bool mOutputFloat;
FLACParser *mParser;
bool mInitCheck;
bool mStarted;
@@ -76,11 +91,12 @@
public:
enum {
- kMaxChannels = 8,
+ kMaxChannels = FCC_8,
};
explicit FLACParser(
DataSourceHelper *dataSource,
+ bool outputFloat,
// If metadata pointers aren't provided, we don't fill them
AMediaFormat *fileMetadata = 0,
AMediaFormat *trackMetadata = 0);
@@ -120,6 +136,7 @@
private:
DataSourceHelper *mDataSource;
+ const bool mOutputFloat;
AMediaFormat *mFileMetadata;
AMediaFormat *mTrackMetadata;
bool mInitCheck;
@@ -170,6 +187,7 @@
const FLAC__Frame *frame, const FLAC__int32 * const buffer[]);
void metadataCallback(const FLAC__StreamMetadata *metadata);
void errorCallback(FLAC__StreamDecoderErrorStatus status);
+ size_t getOutputSampleSize() const { return mOutputFloat ? sizeof(float) : sizeof(int16_t); }
// FLAC parser callbacks as C-callable functions
static FLAC__StreamDecoderReadStatus read_callback(
@@ -381,122 +399,51 @@
mErrorStatus = status;
}
-// Copy samples from FLAC native 32-bit non-interleaved to 16-bit interleaved.
+// Copy samples from FLAC native 32-bit non-interleaved to 16-bit signed
+// or 32-bit float interleaved.
// These are candidates for optimization if needed.
-
-static void copyMono8(
- int16_t *dst,
- const int * src[FLACParser::kMaxChannels],
+static void copyTo16Signed(
+ short *dst,
+ const int *const *src,
unsigned nSamples,
- unsigned /* nChannels */) {
- for (unsigned i = 0; i < nSamples; ++i) {
- *dst++ = src[0][i] << 8;
- }
-}
-
-static void copyStereo8(
- int16_t *dst,
- const int * src[FLACParser::kMaxChannels],
- unsigned nSamples,
- unsigned /* nChannels */) {
- for (unsigned i = 0; i < nSamples; ++i) {
- *dst++ = src[0][i] << 8;
- *dst++ = src[1][i] << 8;
- }
-}
-
-static void copyMultiCh8(int16_t *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels)
-{
+ unsigned nChannels,
+ unsigned bitsPerSample) {
+ const unsigned leftShift = 16 - bitsPerSample;
for (unsigned i = 0; i < nSamples; ++i) {
for (unsigned c = 0; c < nChannels; ++c) {
- *dst++ = src[c][i] << 8;
+ *dst++ = src[c][i] << leftShift;
}
}
}
-static void copyMono16(
- int16_t *dst,
- const int * src[FLACParser::kMaxChannels],
+static void copyToFloat(
+ float *dst,
+ const int *const *src,
unsigned nSamples,
- unsigned /* nChannels */) {
- for (unsigned i = 0; i < nSamples; ++i) {
- *dst++ = src[0][i];
- }
-}
-
-static void copyStereo16(
- int16_t *dst,
- const int * src[FLACParser::kMaxChannels],
- unsigned nSamples,
- unsigned /* nChannels */) {
- for (unsigned i = 0; i < nSamples; ++i) {
- *dst++ = src[0][i];
- *dst++ = src[1][i];
- }
-}
-
-static void copyMultiCh16(int16_t *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels)
-{
+ unsigned nChannels,
+ unsigned bitsPerSample) {
+ const unsigned leftShift = 32 - bitsPerSample;
for (unsigned i = 0; i < nSamples; ++i) {
for (unsigned c = 0; c < nChannels; ++c) {
- *dst++ = src[c][i];
+ *dst++ = float_from_i32(src[c][i] << leftShift);
}
}
}
-// 24-bit versions should do dithering or noise-shaping, here or in AudioFlinger
-
-static void copyMono24(
- int16_t *dst,
- const int * src[FLACParser::kMaxChannels],
- unsigned nSamples,
- unsigned /* nChannels */) {
- for (unsigned i = 0; i < nSamples; ++i) {
- *dst++ = src[0][i] >> 8;
- }
-}
-
-static void copyStereo24(
- int16_t *dst,
- const int * src[FLACParser::kMaxChannels],
- unsigned nSamples,
- unsigned /* nChannels */) {
- for (unsigned i = 0; i < nSamples; ++i) {
- *dst++ = src[0][i] >> 8;
- *dst++ = src[1][i] >> 8;
- }
-}
-
-static void copyMultiCh24(int16_t *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels)
-{
- for (unsigned i = 0; i < nSamples; ++i) {
- for (unsigned c = 0; c < nChannels; ++c) {
- *dst++ = src[c][i] >> 8;
- }
- }
-}
-
-static void copyTrespass(
- int16_t * /* dst */,
- const int *[FLACParser::kMaxChannels] /* src */,
- unsigned /* nSamples */,
- unsigned /* nChannels */) {
- TRESPASS();
-}
-
// FLACParser
FLACParser::FLACParser(
DataSourceHelper *dataSource,
+ bool outputFloat,
AMediaFormat *fileMetadata,
AMediaFormat *trackMetadata)
: mDataSource(dataSource),
+ mOutputFloat(outputFloat),
mFileMetadata(fileMetadata),
mTrackMetadata(trackMetadata),
mInitCheck(false),
mMaxBufferSize(0),
mGroup(NULL),
- mCopy(copyTrespass),
mDecoder(NULL),
mCurrentPos(0LL),
mEOF(false),
@@ -590,29 +537,6 @@
ALOGE("unsupported sample rate %u", getSampleRate());
return NO_INIT;
}
- // configure the appropriate copy function, defaulting to trespass
- static const struct {
- unsigned mChannels;
- unsigned mBitsPerSample;
- void (*mCopy)(int16_t *dst, const int * src[kMaxChannels], unsigned nSamples, unsigned nChannels);
- } table[] = {
- { 1, 8, copyMono8 },
- { 2, 8, copyStereo8 },
- { 8, 8, copyMultiCh8 },
- { 1, 16, copyMono16 },
- { 2, 16, copyStereo16 },
- { 8, 16, copyMultiCh16 },
- { 1, 24, copyMono24 },
- { 2, 24, copyStereo24 },
- { 8, 24, copyMultiCh24 },
- };
- for (unsigned i = 0; i < sizeof(table)/sizeof(table[0]); ++i) {
- if (table[i].mChannels >= getChannels() &&
- table[i].mBitsPerSample == getBitsPerSample()) {
- mCopy = table[i].mCopy;
- break;
- }
- }
// populate track metadata
if (mTrackMetadata != 0) {
AMediaFormat_setString(mTrackMetadata,
@@ -623,8 +547,6 @@
AMEDIAFORMAT_KEY_SAMPLE_RATE, getSampleRate());
AMediaFormat_setInt32(mTrackMetadata,
AMEDIAFORMAT_KEY_BITS_PER_SAMPLE, getBitsPerSample());
- AMediaFormat_setInt32(mTrackMetadata,
- AMEDIAFORMAT_KEY_PCM_ENCODING, kAudioEncodingPcm16bit);
// sample rate is non-zero, so division by zero not possible
AMediaFormat_setInt64(mTrackMetadata,
AMEDIAFORMAT_KEY_DURATION, (getTotalSamples() * 1000000LL) / getSampleRate());
@@ -644,7 +566,7 @@
{
CHECK(mGroup == NULL);
mGroup = new MediaBufferGroup;
- mMaxBufferSize = getMaxBlockSize() * getChannels() * sizeof(int16_t);
+ mMaxBufferSize = getMaxBlockSize() * getChannels() * getOutputSampleSize();
mGroup->add_buffer(MediaBufferBase::Create(mMaxBufferSize));
}
@@ -697,12 +619,24 @@
if (err != OK) {
return NULL;
}
- size_t bufferSize = blocksize * getChannels() * sizeof(int16_t);
+ const size_t bufferSize = blocksize * getChannels() * getOutputSampleSize();
CHECK(bufferSize <= mMaxBufferSize);
- int16_t *data = (int16_t *) buffer->data();
buffer->set_range(0, bufferSize);
// copy PCM from FLAC write buffer to our media buffer, with interleaving
- (*mCopy)(data, mWriteBuffer, blocksize, getChannels());
+ const unsigned bitsPerSample = getBitsPerSample();
+ if (mOutputFloat) {
+ copyToFloat(reinterpret_cast<float*>(buffer->data()),
+ mWriteBuffer,
+ blocksize,
+ getChannels(),
+ bitsPerSample);
+ } else {
+ copyTo16Signed(reinterpret_cast<short*>(buffer->data()),
+ mWriteBuffer,
+ blocksize,
+ getChannels(),
+ bitsPerSample);
+ }
// fill in buffer metadata
CHECK(mWriteHeader.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
FLAC__uint64 sampleNumber = mWriteHeader.number.sample_number;
@@ -716,17 +650,16 @@
FLACSource::FLACSource(
DataSourceHelper *dataSource,
- AMediaFormat *trackMetadata)
+ AMediaFormat *trackMetadata,
+ bool outputFloat)
: mDataSource(dataSource),
mTrackMetadata(trackMetadata),
- mParser(0),
- mInitCheck(false),
+ mOutputFloat(outputFloat),
+ mParser(new FLACParser(mDataSource, outputFloat)),
+ mInitCheck(mParser->initCheck()),
mStarted(false)
{
ALOGV("FLACSource::FLACSource");
- // re-use the same track metadata passed into constructor from FLACExtractor
- mParser = new FLACParser(mDataSource);
- mInitCheck = mParser->initCheck();
}
FLACSource::~FLACSource()
@@ -762,7 +695,12 @@
media_status_t FLACSource::getFormat(AMediaFormat *meta)
{
- return AMediaFormat_copy(meta, mTrackMetadata);
+ const media_status_t status = AMediaFormat_copy(meta, mTrackMetadata);
+ if (status == OK) {
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_PCM_ENCODING,
+ mOutputFloat ? kAudioEncodingPcmFloat : kAudioEncodingPcm16bit);
+ }
+ return status;
}
media_status_t FLACSource::read(
@@ -804,7 +742,7 @@
// FLACParser will fill in the metadata for us
mFileMetadata = AMediaFormat_new();
mTrackMetadata = AMediaFormat_new();
- mParser = new FLACParser(mDataSource, mFileMetadata, mTrackMetadata);
+ mParser = new FLACParser(mDataSource, false /* outputFloat */, mFileMetadata, mTrackMetadata);
mInitCheck = mParser->initCheck();
}
@@ -827,7 +765,9 @@
if (mInitCheck != OK || index > 0) {
return NULL;
}
- return new FLACSource(mDataSource, mTrackMetadata);
+
+ return new FLACSource(
+ mDataSource, mTrackMetadata, shouldExtractorOutputFloat(mParser->getBitsPerSample()));
}
media_status_t FLACExtractor::getTrackMetaData(
@@ -836,7 +776,13 @@
if (mInitCheck != OK || index > 0) {
return AMEDIA_ERROR_UNKNOWN;
}
- return AMediaFormat_copy(meta, mTrackMetadata);
+ const media_status_t status = AMediaFormat_copy(meta, mTrackMetadata);
+ if (status == OK) {
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_PCM_ENCODING,
+ shouldExtractorOutputFloat(mParser->getBitsPerSample())
+ ? kAudioEncodingPcmFloat : kAudioEncodingPcm16bit);
+ }
+ return status;
}
media_status_t FLACExtractor::getMetaData(AMediaFormat *meta)
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index b362b4a..337ff2a 100644
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -38,6 +38,7 @@
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/foundation/AudioPresentationInfo.h>
#include <media/stagefright/foundation/AUtils.h>
#include <media/stagefright/foundation/ByteUtils.h>
#include <media/stagefright/foundation/ColorUtils.h>
@@ -465,6 +466,7 @@
AMediaFormat_getInt64(track->meta, AMEDIAFORMAT_KEY_DURATION, &duration) &&
AMediaFormat_getInt32(track->meta, AMEDIAFORMAT_KEY_SAMPLE_RATE, &samplerate)) {
+ // elst has to be processed only the first time this function is called
track->has_elst = false;
if (track->elst_segment_duration > INT64_MAX) {
@@ -472,27 +474,24 @@
}
int64_t segment_duration = track->elst_segment_duration;
int64_t media_time = track->elst_media_time;
- int64_t halfscale = mHeaderTimescale / 2;
+ int64_t halfscale = track->timescale / 2;
+
ALOGV("segment_duration = %" PRId64 ", media_time = %" PRId64
- ", halfscale = %" PRId64 ", timescale = %d",
- segment_duration,
- media_time,
- halfscale,
- mHeaderTimescale);
+ ", halfscale = %" PRId64 ", mdhd_timescale = %d, track_timescale = %u",
+ segment_duration, media_time,
+ halfscale, mHeaderTimescale, track->timescale);
+
+ if ((uint32_t)samplerate != track->timescale){
+ ALOGV("samplerate:%" PRId32 ", track->timescale and samplerate are different!", samplerate);
+ }
int64_t delay;
- // delay = ((media_time * samplerate) + halfscale) / mHeaderTimescale;
+ // delay = ((media_time * samplerate) + halfscale) / track->timescale;
if (__builtin_mul_overflow(media_time, samplerate, &delay) ||
__builtin_add_overflow(delay, halfscale, &delay) ||
- (delay /= mHeaderTimescale, false) ||
- /* the calculated delay should be small, but some apps
- * appear to write a bogus edit list that causes a really
- * large delay, resulting in playback problems.
- * Ignore such edit lists.
- * (4096 is enough to drop 4 full samples)
- */
- delay > 4096 ||
- delay < 0) {
+ (delay /= track->timescale, false) ||
+ delay > INT32_MAX ||
+ delay < INT32_MIN) {
ALOGW("ignoring edit list with bogus values");
return;
}
@@ -508,33 +507,43 @@
int64_t segment_end;
int64_t padding;
- // padding = scaled_duration - ((segment_duration + media_time) * 1000000);
- if (__builtin_add_overflow(segment_duration, media_time, &segment_end) ||
- __builtin_mul_overflow(segment_end, 1000000, &segment_end) ||
- __builtin_sub_overflow(scaled_duration, segment_end, &padding)) {
+ int64_t segment_duration_e6;
+ int64_t media_time_scaled_e6;
+ int64_t media_time_scaled;
+ // padding = scaled_duration - ((segment_duration * 1000000) +
+ // ((media_time * mHeaderTimeScale * 1000000)/track->timescale) )
+ // segment_duration is based on timescale in movie header box(mdhd)
+ // media_time is based on timescale track header/media timescale
+ if (__builtin_mul_overflow(segment_duration, 1000000, &segment_duration_e6) ||
+ __builtin_mul_overflow(media_time, mHeaderTimescale, &media_time_scaled) ||
+ __builtin_mul_overflow(media_time_scaled, 1000000, &media_time_scaled_e6)) {
+ return;
+ }
+ media_time_scaled_e6 /= track->timescale;
+ if(__builtin_add_overflow(segment_duration_e6, media_time_scaled_e6, &segment_end) ||
+ __builtin_sub_overflow(scaled_duration, segment_end, &padding)) {
return;
}
ALOGV("segment_end = %" PRId64 ", padding = %" PRId64, segment_end, padding);
-
+ int64_t paddingsamples = 0;
if (padding < 0) {
// track duration from media header (which is what AMEDIAFORMAT_KEY_DURATION is)
// might be slightly shorter than the segment duration, which would make the
// padding negative. Clamp to zero.
padding = 0;
- }
-
- int64_t paddingsamples;
- int64_t halfscale_e6;
- int64_t timescale_e6;
- // paddingsamples = ((padding * samplerate) + (halfscale * 1000000))
- // / (mHeaderTimescale * 1000000);
- if (__builtin_mul_overflow(padding, samplerate, &paddingsamples) ||
- __builtin_mul_overflow(halfscale, 1000000, &halfscale_e6) ||
- __builtin_mul_overflow(mHeaderTimescale, 1000000, ×cale_e6) ||
- __builtin_add_overflow(paddingsamples, halfscale_e6, &paddingsamples) ||
- (paddingsamples /= timescale_e6, false) ||
- paddingsamples > INT32_MAX) {
- return;
+ } else {
+ int64_t halfscale_e6;
+ int64_t timescale_e6;
+ // paddingsamples = ((padding * samplerate) + (halfscale * 1000000))
+ // / (mHeaderTimescale * 1000000);
+ if (__builtin_mul_overflow(padding, samplerate, &paddingsamples) ||
+ __builtin_mul_overflow(halfscale, 1000000, &halfscale_e6) ||
+ __builtin_mul_overflow(mHeaderTimescale, 1000000, ×cale_e6) ||
+ __builtin_add_overflow(paddingsamples, halfscale_e6, &paddingsamples) ||
+ (paddingsamples /= timescale_e6, false) ||
+ paddingsamples > INT32_MAX) {
+ return;
+ }
}
ALOGV("paddingsamples = %" PRId64, paddingsamples);
AMediaFormat_setInt32(track->meta, AMEDIAFORMAT_KEY_ENCODER_PADDING, paddingsamples);
@@ -2745,6 +2754,75 @@
AMediaFormat_setString(mLastTrack->meta, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_AUDIO_AC4);
AMediaFormat_setInt32(mLastTrack->meta, AMEDIAFORMAT_KEY_CHANNEL_COUNT, channelCount);
AMediaFormat_setInt32(mLastTrack->meta, AMEDIAFORMAT_KEY_SAMPLE_RATE, sampleRate);
+
+ AudioPresentationCollection presentations;
+ // translate the AC4 presentation information to audio presentations for this track
+ AC4DSIParser::AC4Presentations ac4Presentations = parser.getPresentations();
+ if (!ac4Presentations.empty()) {
+ for (const auto& ac4Presentation : ac4Presentations) {
+ auto& presentation = ac4Presentation.second;
+ if (!presentation.mEnabled) {
+ continue;
+ }
+ AudioPresentationV1 ap;
+ ap.mPresentationId = presentation.mGroupIndex;
+ ap.mProgramId = presentation.mProgramID;
+ ap.mLanguage = presentation.mLanguage;
+ if (presentation.mPreVirtualized) {
+ ap.mMasteringIndication = MASTERED_FOR_HEADPHONE;
+ } else {
+ switch (presentation.mChannelMode) {
+ case AC4Parser::AC4Presentation::kChannelMode_Mono:
+ case AC4Parser::AC4Presentation::kChannelMode_Stereo:
+ ap.mMasteringIndication = MASTERED_FOR_STEREO;
+ break;
+ case AC4Parser::AC4Presentation::kChannelMode_3_0:
+ case AC4Parser::AC4Presentation::kChannelMode_5_0:
+ case AC4Parser::AC4Presentation::kChannelMode_5_1:
+ case AC4Parser::AC4Presentation::kChannelMode_7_0_34:
+ case AC4Parser::AC4Presentation::kChannelMode_7_1_34:
+ case AC4Parser::AC4Presentation::kChannelMode_7_0_52:
+ case AC4Parser::AC4Presentation::kChannelMode_7_1_52:
+ ap.mMasteringIndication = MASTERED_FOR_SURROUND;
+ break;
+ case AC4Parser::AC4Presentation::kChannelMode_7_0_322:
+ case AC4Parser::AC4Presentation::kChannelMode_7_1_322:
+ case AC4Parser::AC4Presentation::kChannelMode_7_0_4:
+ case AC4Parser::AC4Presentation::kChannelMode_7_1_4:
+ case AC4Parser::AC4Presentation::kChannelMode_9_0_4:
+ case AC4Parser::AC4Presentation::kChannelMode_9_1_4:
+ case AC4Parser::AC4Presentation::kChannelMode_22_2:
+ ap.mMasteringIndication = MASTERED_FOR_3D;
+ break;
+ default:
+ ALOGE("Invalid channel mode in AC4 presentation");
+ return ERROR_MALFORMED;
+ }
+ }
+
+ ap.mAudioDescriptionAvailable = (presentation.mContentClassifier ==
+ AC4Parser::AC4Presentation::kVisuallyImpaired);
+ ap.mSpokenSubtitlesAvailable = (presentation.mContentClassifier ==
+ AC4Parser::AC4Presentation::kVoiceOver);
+ ap.mDialogueEnhancementAvailable = presentation.mHasDialogEnhancements;
+ if (!ap.mLanguage.empty()) {
+ ap.mLabels.emplace(ap.mLanguage, presentation.mDescription);
+ }
+ presentations.push_back(std::move(ap));
+ }
+ }
+
+ if (presentations.empty()) {
+ // Clear audio presentation info in metadata.
+ AMediaFormat_setBuffer(
+ mLastTrack->meta, AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_INFO, nullptr, 0);
+ } else {
+ std::ostringstream outStream(std::ios::out);
+ serializeAudioPresentations(presentations, &outStream);
+ AMediaFormat_setBuffer(
+ mLastTrack->meta, AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_INFO,
+ outStream.str().data(), outStream.str().size());
+ }
return OK;
}
@@ -3634,7 +3712,7 @@
if (year < 10000) {
sprintf(tmp, "%u", year);
- AMediaFormat_setString(mFileMetaData, "year", tmp);
+ AMediaFormat_setString(mFileMetaData, AMEDIAFORMAT_KEY_YEAR, tmp);
}
break;
}
@@ -4708,7 +4786,7 @@
off64_t offset, bool isSubsampleEncryption, uint32_t flags) {
int32_t ivlength;
- CHECK(AMediaFormat_getInt32(mFormat, "crypto-defaultivsize", &ivlength));
+ CHECK(AMediaFormat_getInt32(mFormat, AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE, &ivlength));
// only 0, 8 and 16 byte initialization vectors are supported
if (ivlength != 0 && ivlength != 8 && ivlength != 16) {
diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
index a74ddaa..605b13a 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
@@ -272,9 +272,6 @@
off64_t size;
if (mDataSource->getSize(&size) == OK && (haveAudio || haveVideo)) {
- sp<AnotherPacketSource> impl = haveVideo
- ? mParser->getSource(ATSParser::VIDEO)
- : mParser->getSource(ATSParser::AUDIO);
size_t prevSyncSize = 1;
int64_t durationUs = -1;
List<int64_t> durations;
@@ -308,17 +305,32 @@
}
}
}
- status_t err;
- int64_t bufferedDurationUs;
- bufferedDurationUs = impl->getBufferedDurationUs(&err);
- if (err == ERROR_END_OF_STREAM) {
- durationUs = bufferedDurationUs;
+
+ bool found = false;
+ for (int i = 0; i < ATSParser::NUM_SOURCE_TYPES; ++i) {
+ ATSParser::SourceType type = static_cast<ATSParser::SourceType>(i);
+ sp<AnotherPacketSource> impl = mParser->getSource(type);
+ if (impl == NULL) {
+ continue;
+ }
+
+ int64_t trackDurationUs = durationUs;
+
+ status_t err;
+ int64_t bufferedDurationUs = impl->getBufferedDurationUs(&err);
+ if (err == ERROR_END_OF_STREAM) {
+ trackDurationUs = bufferedDurationUs;
+ }
+ if (trackDurationUs > 0) {
+ ALOGV("[SourceType%d] durationUs=%" PRId64 "", type, trackDurationUs);
+ const sp<MetaData> meta = impl->getFormat();
+ meta->setInt64(kKeyDuration, trackDurationUs);
+ impl->setFormat(meta);
+
+ found = true;
+ }
}
- if (durationUs > 0) {
- const sp<MetaData> meta = impl->getFormat();
- meta->setInt64(kKeyDuration, durationUs);
- impl->setFormat(meta);
- } else {
+ if (!found) {
estimateDurationsFromTimesUsAtEnd();
}
}
diff --git a/media/extractors/wav/Android.bp b/media/extractors/wav/Android.bp
index d8b4144..185bb32 100644
--- a/media/extractors/wav/Android.bp
+++ b/media/extractors/wav/Android.bp
@@ -7,12 +7,14 @@
],
shared_libs: [
+ "libbinder_ndk",
"liblog",
"libmediaextractor",
"libmediandk",
],
static_libs: [
+ "libaudioutils",
"libfifo",
"libstagefright_foundation",
],
diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp
index ddc7031..86500ef 100644
--- a/media/extractors/wav/WAVExtractor.cpp
+++ b/media/extractors/wav/WAVExtractor.cpp
@@ -20,6 +20,7 @@
#include "WAVExtractor.h"
+#include <android/binder_ibinder.h> // for AIBinder_getCallingUid
#include <audio_utils/primitives.h>
#include <media/DataSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -27,13 +28,26 @@
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MetaData.h>
+#include <private/android_filesystem_config.h> // for AID_MEDIA
+#include <system/audio.h>
#include <utils/String8.h>
#include <cutils/bitops.h>
#define CHANNEL_MASK_USE_CHANNEL_ORDER 0
+// NOTE: This code assumes the device processor is little endian.
+
namespace android {
+// MediaServer is capable of handling float extractor output, but general processes
+// may not be able to do so.
+// TODO: Improve API to set extractor float output.
+// (Note: duplicated with FLACExtractor.cpp)
+static inline bool shouldExtractorOutputFloat(int bitsPerSample)
+{
+ return bitsPerSample > 16 && AIBinder_getCallingUid() == AID_MEDIA;
+}
+
enum {
WAVE_FORMAT_PCM = 0x0001,
WAVE_FORMAT_IEEE_FLOAT = 0x0003,
@@ -59,7 +73,7 @@
DataSourceHelper *dataSource,
AMediaFormat *meta,
uint16_t waveFormat,
- int32_t bitsPerSample,
+ bool outputFloat,
off64_t offset, size_t size);
virtual media_status_t start();
@@ -80,6 +94,7 @@
DataSourceHelper *mDataSource;
AMediaFormat *mMeta;
uint16_t mWaveFormat;
+ const bool mOutputFloat;
int32_t mSampleRate;
int32_t mNumChannels;
int32_t mBitsPerSample;
@@ -126,7 +141,7 @@
return new WAVSource(
mDataSource, mTrackMeta,
- mWaveFormat, mBitsPerSample, mDataOffset, mDataSize);
+ mWaveFormat, shouldExtractorOutputFloat(mBitsPerSample), mDataOffset, mDataSize);
}
media_status_t WAVExtractor::getTrackMetaData(
@@ -136,7 +151,13 @@
return AMEDIA_ERROR_UNKNOWN;
}
- return AMediaFormat_copy(meta, mTrackMeta);
+ const media_status_t status = AMediaFormat_copy(meta, mTrackMeta);
+ if (status == OK) {
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_PCM_ENCODING,
+ shouldExtractorOutputFloat(mBitsPerSample)
+ ? kAudioEncodingPcmFloat : kAudioEncodingPcm16bit);
+ }
+ return status;
}
status_t WAVExtractor::init() {
@@ -199,13 +220,13 @@
mNumChannels = U16_LE_AT(&formatSpec[2]);
- if (mNumChannels < 1 || mNumChannels > 8) {
+ if (mNumChannels < 1 || mNumChannels > FCC_8) {
ALOGE("Unsupported number of channels (%d)", mNumChannels);
return AMEDIA_ERROR_UNSUPPORTED;
}
if (mWaveFormat != WAVE_FORMAT_EXTENSIBLE) {
- if (mNumChannels != 1 && mNumChannels != 2) {
+ if (mNumChannels != 1 && mNumChannels != FCC_2) {
ALOGW("More than 2 channels (%d) in non-WAVE_EXT, unknown channel mask",
mNumChannels);
}
@@ -312,9 +333,6 @@
AMediaFormat_setInt32(mTrackMeta, AMEDIAFORMAT_KEY_CHANNEL_MASK, mChannelMask);
AMediaFormat_setInt32(mTrackMeta, AMEDIAFORMAT_KEY_SAMPLE_RATE, mSampleRate);
AMediaFormat_setInt32(mTrackMeta, AMEDIAFORMAT_KEY_BITS_PER_SAMPLE, mBitsPerSample);
- AMediaFormat_setInt32(mTrackMeta, AMEDIAFORMAT_KEY_PCM_ENCODING,
- kAudioEncodingPcm16bit);
-
int64_t durationUs = 0;
if (mWaveFormat == WAVE_FORMAT_MSGSM) {
// 65 bytes decode to 320 8kHz samples
@@ -353,22 +371,19 @@
DataSourceHelper *dataSource,
AMediaFormat *meta,
uint16_t waveFormat,
- int32_t bitsPerSample,
+ bool outputFloat,
off64_t offset, size_t size)
: mDataSource(dataSource),
mMeta(meta),
mWaveFormat(waveFormat),
- mSampleRate(0),
- mNumChannels(0),
- mBitsPerSample(bitsPerSample),
+ mOutputFloat(outputFloat),
mOffset(offset),
mSize(size),
mStarted(false),
mGroup(NULL) {
CHECK(AMediaFormat_getInt32(mMeta, AMEDIAFORMAT_KEY_SAMPLE_RATE, &mSampleRate));
CHECK(AMediaFormat_getInt32(mMeta, AMEDIAFORMAT_KEY_CHANNEL_COUNT, &mNumChannels));
-
- AMediaFormat_setInt32(mMeta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, kMaxFrameSize);
+ CHECK(AMediaFormat_getInt32(mMeta, AMEDIAFORMAT_KEY_BITS_PER_SAMPLE, &mBitsPerSample));
}
WAVSource::~WAVSource() {
@@ -385,11 +400,6 @@
// some WAV files may have large audio buffers that use shared memory transfer.
mGroup = new MediaBufferGroup(4 /* buffers */, kMaxFrameSize);
- if (mBitsPerSample == 8) {
- // As a temporary buffer for 8->16 bit conversion.
- mGroup->add_buffer(MediaBufferBase::Create(kMaxFrameSize));
- }
-
mCurrentPos = mOffset;
mStarted = true;
@@ -413,7 +423,13 @@
media_status_t WAVSource::getFormat(AMediaFormat *meta) {
ALOGV("WAVSource::getFormat");
- return AMediaFormat_copy(meta, mMeta);
+ const media_status_t status = AMediaFormat_copy(meta, mMeta);
+ if (status == OK) {
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, kMaxFrameSize);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_PCM_ENCODING,
+ mOutputFloat ? kAudioEncodingPcmFloat : kAudioEncodingPcm16bit);
+ }
+ return status;
}
media_status_t WAVSource::read(
@@ -449,12 +465,16 @@
return AMEDIA_ERROR_UNKNOWN;
}
- // make sure that maxBytesToRead is multiple of 3, in 24-bit case
- size_t maxBytesToRead =
- mBitsPerSample == 8 ? kMaxFrameSize / 2 :
- (mBitsPerSample == 24 ? 3*(kMaxFrameSize/3): kMaxFrameSize);
+ // maxBytesToRead may be reduced so that in-place data conversion will fit in buffer size.
+ const size_t bufferSize = buffer->size();
+ size_t maxBytesToRead;
+ if (mOutputFloat) { // destination is float at 4 bytes per sample, source may be less.
+ maxBytesToRead = (mBitsPerSample / 8) * (bufferSize / 4);
+ } else { // destination is int16_t at 2 bytes per sample, only source of 8 bits is less.
+ maxBytesToRead = mBitsPerSample == 8 ? bufferSize / 2 : bufferSize;
+ }
- size_t maxBytesAvailable =
+ const size_t maxBytesAvailable =
(mCurrentPos - mOffset >= (off64_t)mSize)
? 0 : mSize - (mCurrentPos - mOffset);
@@ -490,38 +510,57 @@
// TODO: add capability to return data as float PCM instead of 16 bit PCM.
if (mWaveFormat == WAVE_FORMAT_PCM) {
- if (mBitsPerSample == 8) {
- // Convert 8-bit unsigned samples to 16-bit signed.
-
- // Create new buffer with 2 byte wide samples
- MediaBufferBase *tmp;
- CHECK_EQ(mGroup->acquire_buffer(&tmp), (status_t)OK);
- tmp->set_range(0, 2 * n);
-
- memcpy_to_i16_from_u8((int16_t *)tmp->data(), (const uint8_t *)buffer->data(), n);
- buffer->release();
- buffer = tmp;
- } else if (mBitsPerSample == 24) {
- // Convert 24-bit signed samples to 16-bit signed in place
- const size_t numSamples = n / 3;
-
- memcpy_to_i16_from_p24((int16_t *)buffer->data(), (const uint8_t *)buffer->data(), numSamples);
- buffer->set_range(0, 2 * numSamples);
- } else if (mBitsPerSample == 32) {
- // Convert 32-bit signed samples to 16-bit signed in place
- const size_t numSamples = n / 4;
-
- memcpy_to_i16_from_i32((int16_t *)buffer->data(), (const int32_t *)buffer->data(), numSamples);
- buffer->set_range(0, 2 * numSamples);
+ if (mOutputFloat) {
+ float *fdest = (float *)buffer->data();
+ switch (mBitsPerSample) {
+ case 8: {
+ buffer->set_range(0, 4 * n);
+ memcpy_to_float_from_u8(fdest, (const uint8_t *)buffer->data(), n);
+ } break;
+ case 16: {
+ const size_t numSamples = n / 2;
+ buffer->set_range(0, 4 * numSamples);
+ memcpy_to_float_from_i16(fdest, (const int16_t *)buffer->data(), numSamples);
+ } break;
+ case 24: {
+ const size_t numSamples = n / 3;
+ buffer->set_range(0, 4 * numSamples);
+ memcpy_to_float_from_p24(fdest, (const uint8_t *)buffer->data(), numSamples);
+ } break;
+ case 32: { // buffer range is correct
+ const size_t numSamples = n / 4;
+ memcpy_to_float_from_i32(fdest, (const int32_t *)buffer->data(), numSamples);
+ } break;
+ }
+ } else {
+ int16_t *idest = (int16_t *)buffer->data();
+ switch (mBitsPerSample) {
+ case 8: {
+ buffer->set_range(0, 2 * n);
+ memcpy_to_i16_from_u8(idest, (const uint8_t *)buffer->data(), n);
+ } break;
+ case 16:
+ break; // no translation needed
+ case 24: {
+ const size_t numSamples = n / 3;
+ buffer->set_range(0, 2 * numSamples);
+ memcpy_to_i16_from_p24(idest, (const uint8_t *)buffer->data(), numSamples);
+ } break;
+ case 32: {
+ const size_t numSamples = n / 4;
+ buffer->set_range(0, 2 * numSamples);
+ memcpy_to_i16_from_i32(idest, (const int32_t *)buffer->data(), numSamples);
+ } break;
+ }
}
} else if (mWaveFormat == WAVE_FORMAT_IEEE_FLOAT) {
- if (mBitsPerSample == 32) {
- // Convert 32-bit float samples to 16-bit signed in place
+ if (!mOutputFloat) { // mBitsPerSample == 32
+ int16_t *idest = (int16_t *)buffer->data();
const size_t numSamples = n / 4;
-
- memcpy_to_i16_from_float((int16_t *)buffer->data(), (const float *)buffer->data(), numSamples);
+ memcpy_to_i16_from_float(idest, (const float *)buffer->data(), numSamples);
buffer->set_range(0, 2 * numSamples);
}
+ // Note: if output encoding is float, no need to convert if source is float.
}
int64_t timeStampUs = 0;
diff --git a/media/libaaudio/Android.bp b/media/libaaudio/Android.bp
index f00f7a8..4857008 100644
--- a/media/libaaudio/Android.bp
+++ b/media/libaaudio/Android.bp
@@ -32,6 +32,7 @@
cc_library_headers {
name: "libaaudio_headers",
export_include_dirs: ["include"],
+ version_script: "libaaudio.map.txt",
}
subdirs = ["*"]
diff --git a/media/libaaudio/examples/loopback/src/LoopbackAnalyzer.h b/media/libaaudio/examples/loopback/src/LoopbackAnalyzer.h
index 64deb60..9711b86 100644
--- a/media/libaaudio/examples/loopback/src/LoopbackAnalyzer.h
+++ b/media/libaaudio/examples/loopback/src/LoopbackAnalyzer.h
@@ -34,12 +34,123 @@
// Tag for machine readable results as property = value pairs
#define LOOPBACK_RESULT_TAG "RESULT: "
-#define LOOPBACK_SAMPLE_RATE 48000
-#define MILLIS_PER_SECOND 1000
+constexpr int32_t kDefaultSampleRate = 48000;
+constexpr int32_t kMillisPerSecond = 1000;
+constexpr int32_t kMinLatencyMillis = 4; // arbitrary and very low
+constexpr int32_t kMaxLatencyMillis = 400; // arbitrary and generous
+constexpr double kMaxEchoGain = 10.0; // based on experiments, otherwise too noisy
+constexpr double kMinimumConfidence = 0.5;
-#define MAX_ZEROTH_PARTIAL_BINS 40
-constexpr double MAX_ECHO_GAIN = 10.0; // based on experiments, otherwise autocorrelation too noisy
+static void printAudioScope(float sample) {
+ const int maxStars = 80; // arbitrary, fits on one line
+ char c = '*';
+ if (sample < -1.0) {
+ sample = -1.0;
+ c = '$';
+ } else if (sample > 1.0) {
+ sample = 1.0;
+ c = '$';
+ }
+ int numSpaces = (int) (((sample + 1.0) * 0.5) * maxStars);
+ for (int i = 0; i < numSpaces; i++) {
+ putchar(' ');
+ }
+ printf("%c\n", c);
+}
+
+/*
+
+FIR filter designed with
+http://t-filter.appspot.com
+
+sampling frequency: 48000 Hz
+
+* 0 Hz - 8000 Hz
+ gain = 1.2
+ desired ripple = 5 dB
+ actual ripple = 5.595266169703693 dB
+
+* 12000 Hz - 20000 Hz
+ gain = 0
+ desired attenuation = -40 dB
+ actual attenuation = -37.58691566571914 dB
+
+*/
+
+#define FILTER_TAP_NUM 11
+
+static const float sFilterTaps8000[FILTER_TAP_NUM] = {
+ -0.05944219353343189f,
+ -0.07303434839503208f,
+ -0.037690487672689066f,
+ 0.1870480506596512f,
+ 0.3910337357836833f,
+ 0.5333672385425637f,
+ 0.3910337357836833f,
+ 0.1870480506596512f,
+ -0.037690487672689066f,
+ -0.07303434839503208f,
+ -0.05944219353343189f
+};
+
+class LowPassFilter {
+public:
+
+ /*
+ * Filter one input sample.
+ * @return filtered output
+ */
+ float filter(float input) {
+ float output = 0.0f;
+ mX[mCursor] = input;
+ // Index backwards over x.
+ int xIndex = mCursor + FILTER_TAP_NUM;
+ // Write twice so we avoid having to wrap in the middle of the convolution.
+ mX[xIndex] = input;
+ for (int i = 0; i < FILTER_TAP_NUM; i++) {
+ output += sFilterTaps8000[i] * mX[xIndex--];
+ }
+ if (++mCursor >= FILTER_TAP_NUM) {
+ mCursor = 0;
+ }
+ return output;
+ }
+
+ /**
+ * @return true if PASSED
+ */
+ bool test() {
+ // Measure the impulse of the filter at different phases so we exercise
+ // all the wraparound cases in the FIR.
+ for (int offset = 0; offset < (FILTER_TAP_NUM * 2); offset++ ) {
+ // printf("LowPassFilter: cursor = %d\n", mCursor);
+ // Offset by one each time.
+ if (filter(0.0f) != 0.0f) {
+ printf("ERROR: filter should return 0.0 before impulse response\n");
+ return false;
+ }
+ for (int i = 0; i < FILTER_TAP_NUM; i++) {
+ float output = filter((i == 0) ? 1.0f : 0.0f); // impulse
+ if (output != sFilterTaps8000[i]) {
+ printf("ERROR: filter should return impulse response\n");
+ return false;
+ }
+ }
+ for (int i = 0; i < FILTER_TAP_NUM; i++) {
+ if (filter(0.0f) != 0.0f) {
+ printf("ERROR: filter should return 0.0 after impulse response\n");
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+private:
+ float mX[FILTER_TAP_NUM * 2]{}; // twice as big as needed to avoid wrapping
+ int32_t mCursor = 0;
+};
// A narrow impulse seems to have better immunity against over estimating the
// latency due to detecting subharmonics by the auto-correlator.
@@ -78,6 +189,12 @@
int64_t mSeed = 99887766;
};
+
+typedef struct LatencyReport_s {
+ double latencyInFrames;
+ double confidence;
+} LatencyReport;
+
static double calculateCorrelation(const float *a,
const float *b,
int windowSize)
@@ -101,127 +218,75 @@
return correlation;
}
-static int calculateCorrelations(const float *haystack, int haystackSize,
- const float *needle, int needleSize,
- float *results, int resultSize)
-{
- int maxCorrelations = haystackSize - needleSize;
- int numCorrelations = std::min(maxCorrelations, resultSize);
-
- for (int ic = 0; ic < numCorrelations; ic++) {
- double correlation = calculateCorrelation(&haystack[ic], needle, needleSize);
- results[ic] = correlation;
- }
-
- return numCorrelations;
-}
-
-/*==========================================================================================*/
-/**
- * Scan until we get a correlation of a single scan that goes over the tolerance level,
- * peaks then drops back down.
- */
-static double findFirstMatch(const float *haystack, int haystackSize,
- const float *needle, int needleSize, double threshold )
-{
- int ic;
- // How many correlations can we calculate?
- int numCorrelations = haystackSize - needleSize;
- double maxCorrelation = 0.0;
- int peakIndex = -1;
- double location = -1.0;
- const double backThresholdScaler = 0.5;
-
- for (ic = 0; ic < numCorrelations; ic++) {
- double correlation = calculateCorrelation(&haystack[ic], needle, needleSize);
-
- if( (correlation > maxCorrelation) ) {
- maxCorrelation = correlation;
- peakIndex = ic;
- }
-
- //printf("PaQa_FindFirstMatch: ic = %4d, correlation = %8f, maxSum = %8f\n",
- // ic, correlation, maxSum );
- // Are we past what we were looking for?
- if((maxCorrelation > threshold) && (correlation < backThresholdScaler * maxCorrelation)) {
- location = peakIndex;
- break;
- }
- }
-
- return location;
-}
-
-typedef struct LatencyReport_s {
- double latencyInFrames;
- double confidence;
-} LatencyReport;
-
-// Apply a technique similar to Harmonic Product Spectrum Analysis to find echo fundamental.
-// Using first echo instead of the original impulse for a better match.
-static int measureLatencyFromEchos(const float *haystack, int haystackSize,
- const float *needle, int needleSize,
- LatencyReport *report) {
- const double threshold = 0.1;
- // printf("%s: haystackSize = %d, needleSize = %d\n", __func__, haystackSize, needleSize);
-
- // Find first peak
- int first = (int) (findFirstMatch(haystack,
- haystackSize,
- needle,
- needleSize,
- threshold) + 0.5);
-
- // Use first echo as the needle for the other echos because
- // it will be more similar.
- needle = &haystack[first];
- int again = (int) (findFirstMatch(haystack,
- haystackSize,
- needle,
- needleSize,
- threshold) + 0.5);
- first = again;
-
+static int measureLatencyFromEchos(const float *data,
+ int32_t numFloats,
+ int32_t sampleRate,
+ LatencyReport *report) {
// Allocate results array
- int remaining = haystackSize - first;
- const int maxReasonableLatencyFrames = 48000 * 2; // arbitrary but generous value
- int numCorrelations = std::min(remaining, maxReasonableLatencyFrames);
- float *correlations = new float[numCorrelations];
- float *harmonicSums = new float[numCorrelations](); // set to zero
+ const int minReasonableLatencyFrames = sampleRate * kMinLatencyMillis / kMillisPerSecond;
+ const int maxReasonableLatencyFrames = sampleRate * kMaxLatencyMillis / kMillisPerSecond;
+ int32_t maxCorrelationSize = maxReasonableLatencyFrames * 3;
+ int numCorrelations = std::min(numFloats, maxCorrelationSize);
+ float *correlations = new float[numCorrelations]{};
+ float *harmonicSums = new float[numCorrelations]{};
- // Generate correlation for every position.
- numCorrelations = calculateCorrelations(&haystack[first], remaining,
- needle, needleSize,
- correlations, numCorrelations);
+ // Perform sliding auto-correlation.
+ // Skip first frames to avoid huge peak at zero offset.
+ for (int i = minReasonableLatencyFrames; i < numCorrelations; i++) {
+ int32_t remaining = numFloats - i;
+ float correlation = (float) calculateCorrelation(&data[i], data, remaining);
+ correlations[i] = correlation;
+ // printf("correlation[%d] = %f\n", ic, correlation);
+ }
- // Add higher harmonics mapped onto lower harmonics.
- // This reinforces the "fundamental" echo.
+ // Apply a technique similar to Harmonic Product Spectrum Analysis to find echo fundamental.
+ // Add higher harmonics mapped onto lower harmonics. This reinforces the "fundamental" echo.
const int numEchoes = 8;
for (int partial = 1; partial < numEchoes; partial++) {
- for (int i = 0; i < numCorrelations; i++) {
+ for (int i = minReasonableLatencyFrames; i < numCorrelations; i++) {
harmonicSums[i / partial] += correlations[i] / partial;
}
}
// Find highest peak in correlation array.
float maxCorrelation = 0.0;
- float sumOfPeaks = 0.0;
int peakIndex = 0;
- const int skip = MAX_ZEROTH_PARTIAL_BINS; // skip low bins
- for (int i = skip; i < numCorrelations; i++) {
+ for (int i = 0; i < numCorrelations; i++) {
if (harmonicSums[i] > maxCorrelation) {
maxCorrelation = harmonicSums[i];
- sumOfPeaks += maxCorrelation;
peakIndex = i;
// printf("maxCorrelation = %f at %d\n", maxCorrelation, peakIndex);
}
}
-
report->latencyInFrames = peakIndex;
- if (sumOfPeaks < 0.0001) {
+/*
+ {
+ int32_t topPeak = peakIndex * 7 / 2;
+ for (int i = 0; i < topPeak; i++) {
+ float sample = harmonicSums[i];
+ printf("%4d: %7.5f ", i, sample);
+ printAudioScope(sample);
+ }
+ }
+*/
+
+ // Calculate confidence.
+ if (maxCorrelation < 0.001) {
report->confidence = 0.0;
} else {
- report->confidence = maxCorrelation / sumOfPeaks;
+ // Compare peak to average value around peak.
+ int32_t numSamples = std::min(numCorrelations, peakIndex * 2);
+ if (numSamples <= 0) {
+ report->confidence = 0.0;
+ } else {
+ double sum = 0.0;
+ for (int i = 0; i < numSamples; i++) {
+ sum += harmonicSums[i];
+ }
+ const double average = sum / numSamples;
+ const double ratio = average / maxCorrelation; // will be < 1.0
+ report->confidence = 1.0 - sqrt(ratio);
+ }
}
delete[] correlations;
@@ -317,7 +382,9 @@
}
assert(info.channels == 1);
+ assert(info.format == SF_FORMAT_FLOAT);
+ setSampleRate(info.samplerate);
allocate(info.frames);
mFrameCounter = sf_readf_float(sndFile, mData, info.frames);
@@ -325,11 +392,49 @@
return mFrameCounter;
}
+ /**
+ * Square the samples so they are all positive and so the peaks are emphasized.
+ */
+ void square() {
+ for (int i = 0; i < mFrameCounter; i++) {
+ const float sample = mData[i];
+ mData[i] = sample * sample;
+ }
+ }
+
+ /**
+ * Low pass filter the recording using a simple FIR filter.
+ * Note that the lowpass filter cutoff tracks the sample rate.
+ * That is OK because the impulse width is a fixed number of samples.
+ */
+ void lowPassFilter() {
+ for (int i = 0; i < mFrameCounter; i++) {
+ mData[i] = mLowPassFilter.filter(mData[i]);
+ }
+ }
+
+ /**
+ * Remove DC offset using a one-pole one-zero IIR filter.
+ */
+ void dcBlocker() {
+ const float R = 0.996; // narrow notch at zero Hz
+ float x1 = 0.0;
+ float y1 = 0.0;
+ for (int i = 0; i < mFrameCounter; i++) {
+ const float x = mData[i];
+ const float y = x - x1 + (R * y1);
+ mData[i] = y;
+ y1 = y;
+ x1 = x;
+ }
+ }
+
private:
- float *mData = nullptr;
- int32_t mFrameCounter = 0;
- int32_t mMaxFrames = 0;
- int32_t mSampleRate = 48000; // common default
+ float *mData = nullptr;
+ int32_t mFrameCounter = 0;
+ int32_t mMaxFrames = 0;
+ int32_t mSampleRate = kDefaultSampleRate; // common default
+ LowPassFilter mLowPassFilter;
};
// ====================================================================================
@@ -349,8 +454,12 @@
virtual void printStatus() {};
- virtual int getResult() {
- return -1;
+ int32_t getResult() {
+ return mResult;
+ }
+
+ void setResult(int32_t result) {
+ mResult = result;
}
virtual bool isDone() {
@@ -379,7 +488,7 @@
static float measurePeakAmplitude(float *inputData, int inputChannelCount, int numFrames) {
float peak = 0.0f;
for (int i = 0; i < numFrames; i++) {
- float pos = fabs(*inputData);
+ const float pos = fabs(*inputData);
if (pos > peak) {
peak = pos;
}
@@ -390,7 +499,8 @@
private:
- int32_t mSampleRate = LOOPBACK_SAMPLE_RATE;
+ int32_t mSampleRate = kDefaultSampleRate;
+ int32_t mResult = 0;
};
class PeakDetector {
@@ -409,24 +519,6 @@
float mPrevious = 0.0f;
};
-
-static void printAudioScope(float sample) {
- const int maxStars = 80; // arbitrary, fits on one line
- char c = '*';
- if (sample < -1.0) {
- sample = -1.0;
- c = '$';
- } else if (sample > 1.0) {
- sample = 1.0;
- c = '$';
- }
- int numSpaces = (int) (((sample + 1.0) * 0.5) * maxStars);
- for (int i = 0; i < numSpaces; i++) {
- putchar(' ');
- }
- printf("%c\n", c);
-}
-
// ====================================================================================
/**
* Measure latency given a loopback stream data.
@@ -447,17 +539,13 @@
}
void reset() override {
- mDownCounter = 200;
+ mDownCounter = getSampleRate() / 2;
mLoopCounter = 0;
mMeasuredLoopGain = 0.0f;
mEchoGain = 1.0f;
mState = STATE_INITIAL_SILENCE;
}
- virtual int getResult() {
- return mState == STATE_DONE ? 0 : -1;
- }
-
virtual bool isDone() {
return mState == STATE_DONE || mState == STATE_FAILED;
}
@@ -470,34 +558,57 @@
return mEchoGain;
}
- void report() override {
+ bool testLowPassFilter() {
+ LowPassFilter filter;
+ return filter.test();
+ }
+ void report() override {
printf("EchoAnalyzer ---------------\n");
+ if (getResult() != 0) {
+ printf(LOOPBACK_RESULT_TAG "result = %d\n", getResult());
+ return;
+ }
+
+ // printf("LowPassFilter test %s\n", testLowPassFilter() ? "PASSED" : "FAILED");
+
printf(LOOPBACK_RESULT_TAG "measured.gain = %8f\n", mMeasuredLoopGain);
printf(LOOPBACK_RESULT_TAG "echo.gain = %8f\n", mEchoGain);
printf(LOOPBACK_RESULT_TAG "test.state = %8d\n", mState);
printf(LOOPBACK_RESULT_TAG "test.state.name = %8s\n", convertStateToText(mState));
+
if (mState == STATE_WAITING_FOR_SILENCE) {
printf("WARNING - Stuck waiting for silence. Input may be too noisy!\n");
- }
- if (mMeasuredLoopGain >= 0.9999) {
+ setResult(ERROR_NOISY);
+ } else if (mMeasuredLoopGain >= 0.9999) {
printf(" ERROR - clipping, turn down volume slightly\n");
+ setResult(ERROR_CLIPPING);
+ } else if (mState != STATE_DONE && mState != STATE_GATHERING_ECHOS) {
+ printf("WARNING - Bad state. Check volume on device.\n");
+ setResult(ERROR_INVALID_STATE);
} else {
- const float *needle = s_Impulse;
- int needleSize = (int) (sizeof(s_Impulse) / sizeof(float));
- float *haystack = mAudioRecording.getData();
- int haystackSize = mAudioRecording.size();
- measureLatencyFromEchos(haystack, haystackSize, needle, needleSize, &mLatencyReport);
- if (mLatencyReport.confidence < 0.01) {
- printf(" ERROR - confidence too low = %f\n", mLatencyReport.confidence);
- } else {
- double latencyMillis = 1000.0 * mLatencyReport.latencyInFrames / getSampleRate();
- printf(LOOPBACK_RESULT_TAG "latency.frames = %8.2f\n",
- mLatencyReport.latencyInFrames);
- printf(LOOPBACK_RESULT_TAG "latency.msec = %8.2f\n",
- latencyMillis);
- printf(LOOPBACK_RESULT_TAG "latency.confidence = %8.6f\n",
- mLatencyReport.confidence);
+ // Cleanup the signal to improve the auto-correlation.
+ mAudioRecording.dcBlocker();
+ mAudioRecording.square();
+ mAudioRecording.lowPassFilter();
+
+ printf("Please wait several seconds for auto-correlation to complete.\n");
+ measureLatencyFromEchos(mAudioRecording.getData(),
+ mAudioRecording.size(),
+ getSampleRate(),
+ &mLatencyReport);
+
+ double latencyMillis = kMillisPerSecond * (double) mLatencyReport.latencyInFrames
+ / getSampleRate();
+ printf(LOOPBACK_RESULT_TAG "latency.frames = %8.2f\n",
+ mLatencyReport.latencyInFrames);
+ printf(LOOPBACK_RESULT_TAG "latency.msec = %8.2f\n",
+ latencyMillis);
+ printf(LOOPBACK_RESULT_TAG "latency.confidence = %8.6f\n",
+ mLatencyReport.confidence);
+ if (mLatencyReport.confidence < kMinimumConfidence) {
+ printf(" ERROR - confidence too low!\n");
+ setResult(ERROR_CONFIDENCE);
}
}
}
@@ -523,6 +634,11 @@
sendImpulses(outputData, outputChannelCount, kImpulseSizeInFrames);
}
+ // @return number of frames for a typical block of processing
+ int32_t getBlockFrames() {
+ return getSampleRate() / 8;
+ }
+
void process(float *inputData, int inputChannelCount,
float *outputData, int outputChannelCount,
int numFrames) override {
@@ -540,10 +656,11 @@
for (int i = 0; i < numSamples; i++) {
outputData[i] = 0;
}
- if (mDownCounter-- <= 0) {
+ mDownCounter -= numFrames;
+ if (mDownCounter <= 0) {
nextState = STATE_MEASURING_GAIN;
//printf("%5d: switch to STATE_MEASURING_GAIN\n", mLoopCounter);
- mDownCounter = 8;
+ mDownCounter = getBlockFrames() * 2;
}
break;
@@ -552,15 +669,16 @@
peak = measurePeakAmplitude(inputData, inputChannelCount, numFrames);
// If we get several in a row then go to next state.
if (peak > mPulseThreshold) {
- if (mDownCounter-- <= 0) {
+ mDownCounter -= numFrames;
+ if (mDownCounter <= 0) {
//printf("%5d: switch to STATE_WAITING_FOR_SILENCE, measured peak = %f\n",
// mLoopCounter, peak);
- mDownCounter = 8;
+ mDownCounter = getBlockFrames();
mMeasuredLoopGain = peak; // assumes original pulse amplitude is one
mSilenceThreshold = peak * 0.1; // scale silence to measured pulse
// Calculate gain that will give us a nice decaying echo.
mEchoGain = mDesiredEchoGain / mMeasuredLoopGain;
- if (mEchoGain > MAX_ECHO_GAIN) {
+ if (mEchoGain > kMaxEchoGain) {
printf("ERROR - loop gain too low. Increase the volume.\n");
nextState = STATE_FAILED;
} else {
@@ -568,7 +686,7 @@
}
}
} else if (numFrames > kImpulseSizeInFrames){ // ignore short callbacks
- mDownCounter = 8;
+ mDownCounter = getBlockFrames();
}
break;
@@ -581,13 +699,14 @@
peak = measurePeakAmplitude(inputData, inputChannelCount, numFrames);
// If we get several in a row then go to next state.
if (peak < mSilenceThreshold) {
- if (mDownCounter-- <= 0) {
+ mDownCounter -= numFrames;
+ if (mDownCounter <= 0) {
nextState = STATE_SENDING_PULSE;
//printf("%5d: switch to STATE_SENDING_PULSE\n", mLoopCounter);
- mDownCounter = 8;
+ mDownCounter = getBlockFrames();
}
} else {
- mDownCounter = 8;
+ mDownCounter = getBlockFrames();
}
break;
@@ -620,11 +739,11 @@
}
if (numWritten < numFrames) {
nextState = STATE_DONE;
- //printf("%5d: switch to STATE_DONE\n", mLoopCounter);
}
break;
case STATE_DONE:
+ case STATE_FAILED:
default:
break;
}
@@ -638,11 +757,22 @@
}
int load(const char *fileName) override {
- return mAudioRecording.load(fileName);
+ int result = mAudioRecording.load(fileName);
+ setSampleRate(mAudioRecording.getSampleRate());
+ mState = STATE_DONE;
+ return result;
}
private:
+ enum error_code {
+ ERROR_OK = 0,
+ ERROR_NOISY = -99,
+ ERROR_CLIPPING,
+ ERROR_CONFIDENCE,
+ ERROR_INVALID_STATE
+ };
+
enum echo_state {
STATE_INITIAL_SILENCE,
STATE_MEASURING_GAIN,
@@ -708,10 +838,6 @@
class SineAnalyzer : public LoopbackProcessor {
public:
- virtual int getResult() {
- return mState == STATE_LOCKED ? 0 : -1;
- }
-
void report() override {
printf("SineAnalyzer ------------------\n");
printf(LOOPBACK_RESULT_TAG "peak.amplitude = %8f\n", mPeakAmplitude);
@@ -724,10 +850,9 @@
float signalToNoiseDB = 10.0 * log(signalToNoise);
printf(LOOPBACK_RESULT_TAG "signal.to.noise.db = %8.2f\n", signalToNoiseDB);
if (signalToNoiseDB < MIN_SNRATIO_DB) {
- printf("WARNING - signal to noise ratio is too low! < %d dB\n", MIN_SNRATIO_DB);
+ printf("ERROR - signal to noise ratio is too low! < %d dB. Adjust volume.\n", MIN_SNRATIO_DB);
+ setResult(ERROR_NOISY);
}
- printf(LOOPBACK_RESULT_TAG "phase.offset = %8.5f\n", mPhaseOffset);
- printf(LOOPBACK_RESULT_TAG "ref.phase = %8.5f\n", mPhase);
printf(LOOPBACK_RESULT_TAG "frames.accumulated = %8d\n", mFramesAccumulated);
printf(LOOPBACK_RESULT_TAG "sine.period = %8d\n", mSinePeriod);
printf(LOOPBACK_RESULT_TAG "test.state = %8d\n", mState);
@@ -736,10 +861,15 @@
bool gotLock = (mState == STATE_LOCKED) || (mGlitchCount > 0);
if (!gotLock) {
printf("ERROR - failed to lock on reference sine tone\n");
+ setResult(ERROR_NO_LOCK);
} else {
// Only print if meaningful.
printf(LOOPBACK_RESULT_TAG "glitch.count = %8d\n", mGlitchCount);
printf(LOOPBACK_RESULT_TAG "max.glitch = %8f\n", mMaxGlitchDelta);
+ if (mGlitchCount > 0) {
+ printf("ERROR - number of glitches > 0\n");
+ setResult(ERROR_GLITCHES);
+ }
}
}
@@ -913,6 +1043,13 @@
private:
+ enum error_code {
+ OK,
+ ERROR_NO_LOCK = -80,
+ ERROR_GLITCHES,
+ ERROR_NOISY
+ };
+
enum sine_state_t {
STATE_IDLE,
STATE_MEASURE_NOISE,
@@ -963,8 +1100,6 @@
sine_state_t mState = STATE_IDLE;
};
-
-#undef LOOPBACK_SAMPLE_RATE
#undef LOOPBACK_RESULT_TAG
#endif /* AAUDIO_EXAMPLES_LOOPBACK_ANALYSER_H */
diff --git a/media/libaaudio/examples/loopback/src/loopback.cpp b/media/libaaudio/examples/loopback/src/loopback.cpp
index 124efd8..2a02b20 100644
--- a/media/libaaudio/examples/loopback/src/loopback.cpp
+++ b/media/libaaudio/examples/loopback/src/loopback.cpp
@@ -35,11 +35,14 @@
#include "AAudioExampleUtils.h"
#include "LoopbackAnalyzer.h"
+// V0.4.00 = rectify and low-pass filter the echos, use auto-correlation on entire echo
+#define APP_VERSION "0.4.00"
+
// Tag for machine readable results as property = value pairs
#define RESULT_TAG "RESULT: "
#define FILENAME_ALL "/data/loopback_all.wav"
#define FILENAME_ECHOS "/data/loopback_echos.wav"
-#define APP_VERSION "0.3.00"
+#define FILENAME_PROCESSED "/data/loopback_processed.wav"
constexpr int kLogPeriodMillis = 1000;
constexpr int kNumInputChannels = 1;
@@ -173,7 +176,8 @@
int64_t inputFramesWritten = AAudioStream_getFramesWritten(myData->inputStream);
int64_t inputFramesRead = AAudioStream_getFramesRead(myData->inputStream);
int64_t framesAvailable = inputFramesWritten - inputFramesRead;
- actualFramesRead = readFormattedData(myData, numFrames);
+
+ actualFramesRead = readFormattedData(myData, numFrames); // READ
if (actualFramesRead < 0) {
result = AAUDIO_CALLBACK_RESULT_STOP;
} else {
@@ -193,6 +197,7 @@
}
myData->insufficientReadCount++;
myData->insufficientReadFrames += numFrames - actualFramesRead; // deficit
+ // printf("Error insufficientReadCount = %d\n",(int)myData->insufficientReadCount);
}
int32_t numSamples = actualFramesRead * myData->actualInputChannelCount;
@@ -355,6 +360,9 @@
printf("%s - Audio loopback using AAudio V" APP_VERSION "\n", argv[0]);
+ // Use LOW_LATENCY as the default to match input default.
+ argParser.setPerformanceMode(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
+
for (int i = 1; i < argc; i++) {
const char *arg = argv[i];
if (argParser.parseArg(arg)) {
@@ -403,7 +411,7 @@
}
int32_t requestedDuration = argParser.getDurationSeconds();
- int32_t requestedDurationMillis = requestedDuration * MILLIS_PER_SECOND;
+ int32_t requestedDurationMillis = requestedDuration * kMillisPerSecond;
int32_t timeMillis = 0;
int32_t recordingDuration = std::min(60 * 5, requestedDuration);
@@ -420,9 +428,11 @@
loopbackData.loopbackProcessor = &loopbackData.echoAnalyzer;
int read = loopbackData.loopbackProcessor->load(FILENAME_ECHOS);
- printf("main() read %d mono samples from %s on Android device\n", read, FILENAME_ECHOS);
+ printf("main() read %d mono samples from %s on Android device, rate = %d\n",
+ read, FILENAME_ECHOS,
+ loopbackData.loopbackProcessor->getSampleRate());
loopbackData.loopbackProcessor->report();
- return 0;
+ goto report_result;
}
break;
default:
@@ -580,45 +590,6 @@
printf("input error = %d = %s\n",
loopbackData.inputError, AAudio_convertResultToText(loopbackData.inputError));
- if (loopbackData.inputError == AAUDIO_OK) {
- if (testMode == TEST_SINE_MAGNITUDE) {
- printAudioGraph(loopbackData.audioRecording, 200);
- // Print again so we don't have to scroll past waveform.
- printf("OUTPUT Stream ----------------------------------------\n");
- argParser.compareWithStream(outputStream);
- printf("INPUT Stream ----------------------------------------\n");
- argParser.compareWithStream(inputStream);
- }
-
- loopbackData.loopbackProcessor->report();
- }
-
- {
- int32_t framesRead = AAudioStream_getFramesRead(inputStream);
- int32_t framesWritten = AAudioStream_getFramesWritten(inputStream);
- printf("Callback Results ---------------------------------------- INPUT\n");
- printf(" input overruns = %8d\n", AAudioStream_getXRunCount(inputStream));
- printf(" framesWritten = %8d\n", framesWritten);
- printf(" framesRead = %8d\n", framesRead);
- printf(" myFramesRead = %8d\n", (int) loopbackData.framesReadTotal);
- printf(" written - read = %8d\n", (int) (framesWritten - framesRead));
- printf(" insufficient # = %8d\n", (int) loopbackData.insufficientReadCount);
- if (loopbackData.insufficientReadCount > 0) {
- printf(" insuffic. frames = %8d\n", (int) loopbackData.insufficientReadFrames);
- }
- }
- {
- int32_t framesRead = AAudioStream_getFramesRead(outputStream);
- int32_t framesWritten = AAudioStream_getFramesWritten(outputStream);
- printf("Callback Results ---------------------------------------- OUTPUT\n");
- printf(" output underruns = %8d\n", AAudioStream_getXRunCount(outputStream));
- printf(" myFramesWritten = %8d\n", (int) loopbackData.framesWrittenTotal);
- printf(" framesWritten = %8d\n", framesWritten);
- printf(" framesRead = %8d\n", framesRead);
- printf(" min numFrames = %8d\n", (int) loopbackData.minNumFrames);
- printf(" max numFrames = %8d\n", (int) loopbackData.maxNumFrames);
- }
-
written = loopbackData.loopbackProcessor->save(FILENAME_ECHOS);
if (written > 0) {
printf("main() wrote %8d mono samples to \"%s\" on Android device\n",
@@ -631,10 +602,46 @@
written, FILENAME_ALL);
}
- if (loopbackData.loopbackProcessor->getResult() < 0) {
- printf("ERROR: LOOPBACK PROCESSING FAILED. Maybe because the volume was too low.\n");
- result = loopbackData.loopbackProcessor->getResult();
+ if (loopbackData.inputError == AAUDIO_OK) {
+ if (testMode == TEST_SINE_MAGNITUDE) {
+ printAudioGraph(loopbackData.audioRecording, 200);
+ }
+
+ loopbackData.loopbackProcessor->report();
}
+
+ {
+ int32_t framesRead = AAudioStream_getFramesRead(inputStream);
+ int32_t framesWritten = AAudioStream_getFramesWritten(inputStream);
+ const int64_t framesAvailable = framesWritten - framesRead;
+ printf("Callback Results ---------------------------------------- INPUT\n");
+ printf(" input overruns = %8d\n", AAudioStream_getXRunCount(inputStream));
+ printf(" framesWritten = %8d\n", framesWritten);
+ printf(" framesRead = %8d\n", framesRead);
+ printf(" myFramesRead = %8d\n", (int) loopbackData.framesReadTotal);
+ printf(" written - read = %8d\n", (int) framesAvailable);
+ printf(" insufficient # = %8d\n", (int) loopbackData.insufficientReadCount);
+ if (loopbackData.insufficientReadCount > 0) {
+ printf(" insuffic. frames = %8d\n", (int) loopbackData.insufficientReadFrames);
+ }
+ int32_t actualInputCapacity = AAudioStream_getBufferCapacityInFrames(inputStream);
+ if (framesAvailable > 2 * actualInputCapacity) {
+ printf(" WARNING: written - read > 2*capacity !\n");
+ }
+ }
+
+ {
+ int32_t framesRead = AAudioStream_getFramesRead(outputStream);
+ int32_t framesWritten = AAudioStream_getFramesWritten(outputStream);
+ printf("Callback Results ---------------------------------------- OUTPUT\n");
+ printf(" output underruns = %8d\n", AAudioStream_getXRunCount(outputStream));
+ printf(" myFramesWritten = %8d\n", (int) loopbackData.framesWrittenTotal);
+ printf(" framesWritten = %8d\n", framesWritten);
+ printf(" framesRead = %8d\n", framesRead);
+ printf(" min numFrames = %8d\n", (int) loopbackData.minNumFrames);
+ printf(" max numFrames = %8d\n", (int) loopbackData.maxNumFrames);
+ }
+
if (loopbackData.insufficientReadCount > 3) {
printf("ERROR: LOOPBACK PROCESSING FAILED. insufficientReadCount too high\n");
result = AAUDIO_ERROR_UNAVAILABLE;
@@ -646,13 +653,23 @@
delete[] loopbackData.inputFloatData;
delete[] loopbackData.inputShortData;
+report_result:
+ written = loopbackData.loopbackProcessor->save(FILENAME_PROCESSED);
+ if (written > 0) {
+ printf("main() wrote %8d processed samples to \"%s\" on Android device\n",
+ written, FILENAME_PROCESSED);
+ }
+
+ if (loopbackData.loopbackProcessor->getResult() < 0) {
+ result = loopbackData.loopbackProcessor->getResult();
+ }
printf(RESULT_TAG "result = %d \n", result); // machine readable
printf("result is %s\n", AAudio_convertResultToText(result)); // human readable
if (result != AAUDIO_OK) {
- printf("FAILURE\n");
+ printf("TEST FAILED\n");
return EXIT_FAILURE;
} else {
- printf("SUCCESS\n");
+ printf("TEST PASSED\n");
return EXIT_SUCCESS;
}
}
diff --git a/media/libaaudio/examples/utils/AAudioArgsParser.h b/media/libaaudio/examples/utils/AAudioArgsParser.h
index ece9e6a..a5dc55f 100644
--- a/media/libaaudio/examples/utils/AAudioArgsParser.h
+++ b/media/libaaudio/examples/utils/AAudioArgsParser.h
@@ -130,10 +130,12 @@
}
int32_t getBufferCapacity() const {
+ printf("%s() returns %d\n", __func__, mBufferCapacity);
return mBufferCapacity;
}
void setBufferCapacity(int32_t frames) {
+ printf("%s(%d)\n", __func__, frames);
mBufferCapacity = frames;
}
@@ -197,7 +199,7 @@
* @param builder
*/
void applyParameters(AAudioStreamBuilder *builder) const {
- AAudioStreamBuilder_setBufferCapacityInFrames(builder, mBufferCapacity);
+ AAudioStreamBuilder_setBufferCapacityInFrames(builder, getBufferCapacity());
AAudioStreamBuilder_setChannelCount(builder, mChannelCount);
AAudioStreamBuilder_setDeviceId(builder, mDeviceId);
AAudioStreamBuilder_setFormat(builder, mFormat);
@@ -281,7 +283,7 @@
if (strlen(arg) > 2) {
policy = atoi(&arg[2]);
}
- if (!AAudio_setMMapPolicy(policy)) {
+ if (AAudio_setMMapPolicy(policy) != AAUDIO_OK) {
printf("ERROR: invalid MMAP policy mode %i\n", policy);
}
} break;
diff --git a/media/libaaudio/src/fifo/FifoControllerBase.cpp b/media/libaaudio/src/fifo/FifoControllerBase.cpp
index 9885cb0..66e247f 100644
--- a/media/libaaudio/src/fifo/FifoControllerBase.cpp
+++ b/media/libaaudio/src/fifo/FifoControllerBase.cpp
@@ -38,7 +38,7 @@
fifo_frames_t FifoControllerBase::getReadIndex() {
// % works with non-power of two sizes
- return (fifo_frames_t) (getReadCounter() % mCapacity);
+ return (fifo_frames_t) ((uint64_t)getReadCounter() % mCapacity);
}
void FifoControllerBase::advanceReadIndex(fifo_frames_t numFrames) {
@@ -51,7 +51,7 @@
fifo_frames_t FifoControllerBase::getWriteIndex() {
// % works with non-power of two sizes
- return (fifo_frames_t) (getWriteCounter() % mCapacity);
+ return (fifo_frames_t) ((uint64_t)getWriteCounter() % mCapacity);
}
void FifoControllerBase::advanceWriteIndex(fifo_frames_t numFrames) {
diff --git a/media/libaaudio/tests/test_atomic_fifo.cpp b/media/libaaudio/tests/test_atomic_fifo.cpp
index a09b74c..130ef43 100644
--- a/media/libaaudio/tests/test_atomic_fifo.cpp
+++ b/media/libaaudio/tests/test_atomic_fifo.cpp
@@ -23,12 +23,12 @@
#include "fifo/FifoController.h"
using android::fifo_frames_t;
+using android::fifo_counter_t;
using android::FifoController;
using android::FifoBuffer;
using android::WrappingBuffer;
-//void foo() {
-TEST(test_fifi_controller, fifo_indices) {
+TEST(test_fifo_controller, fifo_indices) {
// Values are arbitrary primes designed to trigger edge cases.
constexpr int capacity = 83;
constexpr int threshold = 47;
@@ -73,18 +73,59 @@
ASSERT_EQ(threshold - advance2, fifoController.getEmptyFramesAvailable());
}
+TEST(test_fifo_controller, fifo_wrap_around_zero) {
+ constexpr int capacity = 7; // arbitrary prime
+ constexpr int threshold = capacity;
+ FifoController fifoController(capacity, threshold);
+ ASSERT_EQ(capacity, fifoController.getCapacity());
+ ASSERT_EQ(threshold, fifoController.getThreshold());
+
+ fifoController.setReadCounter(-10); // a bit less than negative capacity
+ for (int i = 0; i < 20; i++) {
+ EXPECT_EQ(i - 10, fifoController.getReadCounter());
+ EXPECT_GE(fifoController.getReadIndex(), 0);
+ EXPECT_LT(fifoController.getReadIndex(), capacity);
+ fifoController.advanceReadIndex(1);
+ }
+
+ fifoController.setWriteCounter(-10);
+ for (int i = 0; i < 20; i++) {
+ EXPECT_EQ(i - 10, fifoController.getWriteCounter());
+ EXPECT_GE(fifoController.getWriteIndex(), 0);
+ EXPECT_LT(fifoController.getWriteIndex(), capacity);
+ fifoController.advanceWriteIndex(1);
+ }
+}
+
+
// TODO consider using a template for other data types.
+
+// Create a big array and then use a region in the middle for the unit tests.
+// Then we can scan the rest of the array to see if it got clobbered.
+static constexpr fifo_frames_t kBigArraySize = 1024;
+static constexpr fifo_frames_t kFifoDataOffset = 128; // starting index of FIFO data
+static constexpr int16_t kSafeDataValue = 0x7654; // original value of BigArray
+
class TestFifoBuffer {
public:
explicit TestFifoBuffer(fifo_frames_t capacity, fifo_frames_t threshold = 0)
- : mFifoBuffer(sizeof(int16_t), capacity) {
+ : mFifoBuffer(sizeof(int16_t), capacity,
+ &mReadIndex,
+ &mWriteIndex,
+ &mVeryBigArray[kFifoDataOffset]) // address of start of FIFO data
+ {
+
+ // Assume a frame is one int16_t.
// For reading and writing.
- mData = new int16_t[capacity];
if (threshold <= 0) {
threshold = capacity;
}
mFifoBuffer.setThreshold(threshold);
mThreshold = threshold;
+
+ for (fifo_frames_t i = 0; i < kBigArraySize; i++) {
+ mVeryBigArray[i] = kSafeDataValue;
+ }
}
void checkMisc() {
@@ -92,26 +133,70 @@
ASSERT_EQ(mThreshold, mFifoBuffer.getThreshold());
}
+ void verifyAddressInRange(void *p, void *valid, size_t numBytes) {
+ uintptr_t p_int = (uintptr_t) p;
+ uintptr_t valid_int = (uintptr_t) valid;
+ EXPECT_GE(p_int, valid_int);
+ EXPECT_LT(p_int, (valid_int + numBytes));
+ }
+
+ void verifyStorageIntegrity() {
+ for (fifo_frames_t i = 0; i < kFifoDataOffset; i++) {
+ EXPECT_EQ(mVeryBigArray[i], kSafeDataValue);
+ }
+ fifo_frames_t firstFrameAfter = kFifoDataOffset + mFifoBuffer.getBufferCapacityInFrames();
+ for (fifo_frames_t i = firstFrameAfter; i < kBigArraySize; i++) {
+ EXPECT_EQ(mVeryBigArray[i], kSafeDataValue);
+ }
+ }
+
// Verify that the available frames in each part add up correctly.
- void checkWrappingBuffer() {
+ void verifyWrappingBuffer() {
WrappingBuffer wrappingBuffer;
+
+
+ // Does the sum of the two parts match the available value returned?
+ // For EmptyRoom
fifo_frames_t framesAvailable =
mFifoBuffer.getEmptyFramesAvailable();
fifo_frames_t wrapAvailable = mFifoBuffer.getEmptyRoomAvailable(&wrappingBuffer);
EXPECT_EQ(framesAvailable, wrapAvailable);
fifo_frames_t bothAvailable = wrappingBuffer.numFrames[0] + wrappingBuffer.numFrames[1];
EXPECT_EQ(framesAvailable, bothAvailable);
-
+ // For FullData
framesAvailable =
mFifoBuffer.getFullFramesAvailable();
wrapAvailable = mFifoBuffer.getFullDataAvailable(&wrappingBuffer);
EXPECT_EQ(framesAvailable, wrapAvailable);
bothAvailable = wrappingBuffer.numFrames[0] + wrappingBuffer.numFrames[1];
EXPECT_EQ(framesAvailable, bothAvailable);
+
+ // Are frame counts in legal range?
+ fifo_frames_t capacity = mFifoBuffer.getBufferCapacityInFrames();
+ EXPECT_GE(wrappingBuffer.numFrames[0], 0);
+ EXPECT_LE(wrappingBuffer.numFrames[0], capacity);
+ EXPECT_GE(wrappingBuffer.numFrames[1], 0);
+ EXPECT_LE(wrappingBuffer.numFrames[1], capacity);
+
+ // Are addresses within the FIFO data area?
+ size_t validBytes = capacity * sizeof(int16_t);
+ if (wrappingBuffer.numFrames[0]) {
+ verifyAddressInRange(wrappingBuffer.data[0], mFifoStorage, validBytes);
+ uint8_t *last = ((uint8_t *)wrappingBuffer.data[0])
+ + mFifoBuffer.convertFramesToBytes(wrappingBuffer.numFrames[0]) - 1;
+ verifyAddressInRange(last, mFifoStorage, validBytes);
+ }
+ if (wrappingBuffer.numFrames[1]) {
+ verifyAddressInRange(wrappingBuffer.data[1], mFifoStorage, validBytes);
+ uint8_t *last = ((uint8_t *)wrappingBuffer.data[1])
+ + mFifoBuffer.convertFramesToBytes(wrappingBuffer.numFrames[1]) - 1;
+ verifyAddressInRange(last, mFifoStorage, validBytes);
+ }
+
}
// Write data but do not overflow.
- void writeData(fifo_frames_t numFrames) {
+ void writeMultipleDataFrames(fifo_frames_t numFrames) {
fifo_frames_t framesAvailable =
mFifoBuffer.getEmptyFramesAvailable();
fifo_frames_t framesToWrite = std::min(framesAvailable, numFrames);
@@ -122,8 +207,8 @@
ASSERT_EQ(framesToWrite, actual);
}
- // Read data but do not underflow.
- void verifyData(fifo_frames_t numFrames) {
+ // Read whatever data is available, Do not underflow.
+ void verifyMultipleDataFrames(fifo_frames_t numFrames) {
fifo_frames_t framesAvailable =
mFifoBuffer.getFullFramesAvailable();
fifo_frames_t framesToRead = std::min(framesAvailable, numFrames);
@@ -134,20 +219,35 @@
}
}
+ // Read specified number of frames
+ void verifyRequestedData(fifo_frames_t numFrames) {
+ fifo_frames_t framesAvailable =
+ mFifoBuffer.getFullFramesAvailable();
+ ASSERT_LE(numFrames, framesAvailable);
+ fifo_frames_t framesToRead = std::min(framesAvailable, numFrames);
+ fifo_frames_t actual = mFifoBuffer.read(mData, framesToRead);
+ ASSERT_EQ(actual, numFrames);
+ for (int i = 0; i < actual; i++) {
+ ASSERT_EQ(mNextVerifyIndex++, mData[i]);
+ }
+ }
+
// Wrap around the end of the buffer.
void checkWrappingWriteRead() {
constexpr int frames1 = 43;
constexpr int frames2 = 15;
- writeData(frames1);
- checkWrappingBuffer();
- verifyData(frames1);
- checkWrappingBuffer();
+ writeMultipleDataFrames(frames1);
+ verifyWrappingBuffer();
+ verifyRequestedData(frames1);
+ verifyWrappingBuffer();
- writeData(frames2);
- checkWrappingBuffer();
- verifyData(frames2);
- checkWrappingBuffer();
+ writeMultipleDataFrames(frames2);
+ verifyWrappingBuffer();
+ verifyRequestedData(frames2);
+ verifyWrappingBuffer();
+
+ verifyStorageIntegrity();
}
// Write and Read a specific amount of data.
@@ -156,10 +256,12 @@
// Wrap around with the smaller region in the second half.
const int frames1 = capacity - 4;
const int frames2 = 7; // arbitrary, small
- writeData(frames1);
- verifyData(frames1);
- writeData(frames2);
- verifyData(frames2);
+ writeMultipleDataFrames(frames1);
+ verifyRequestedData(frames1);
+ writeMultipleDataFrames(frames2);
+ verifyRequestedData(frames2);
+
+ verifyStorageIntegrity();
}
// Write and Read a specific amount of data.
@@ -168,10 +270,12 @@
// Wrap around with the larger region in the second half.
const int frames1 = capacity - 4;
const int frames2 = capacity - 9; // arbitrary, large
- writeData(frames1);
- verifyData(frames1);
- writeData(frames2);
- verifyData(frames2);
+ writeMultipleDataFrames(frames1);
+ verifyRequestedData(frames1);
+ writeMultipleDataFrames(frames2);
+ verifyRequestedData(frames2);
+
+ verifyStorageIntegrity();
}
// Randomly read or write up to the maximum amount of data.
@@ -180,30 +284,67 @@
fifo_frames_t framesEmpty =
mFifoBuffer.getEmptyFramesAvailable();
fifo_frames_t numFrames = (fifo_frames_t)(drand48() * framesEmpty);
- writeData(numFrames);
+ writeMultipleDataFrames(numFrames);
fifo_frames_t framesFull =
mFifoBuffer.getFullFramesAvailable();
numFrames = (fifo_frames_t)(drand48() * framesFull);
- verifyData(numFrames);
+ verifyMultipleDataFrames(numFrames);
}
+
+ verifyStorageIntegrity();
+ }
+
+ // Write and Read a specific amount of data.
+ void checkNegativeCounters() {
+ fifo_counter_t counter = -9876;
+ mFifoBuffer.setWriteCounter(counter);
+ mFifoBuffer.setReadCounter(counter);
+ checkWrappingWriteRead();
+ }
+
+ // Wrap over the boundary at 0x7FFFFFFFFFFFFFFF
+ // Note that the behavior of a signed overflow is technically undefined.
+ void checkHalfWrap() {
+ fifo_counter_t counter = INT64_MAX - 10;
+ mFifoBuffer.setWriteCounter(counter);
+ mFifoBuffer.setReadCounter(counter);
+ ASSERT_GT(mFifoBuffer.getWriteCounter(), 0);
+ checkWrappingWriteRead();
+ ASSERT_LT(mFifoBuffer.getWriteCounter(), 0); // did we wrap past INT64_MAX?
+ }
+
+ // Wrap over the boundary at 0xFFFFFFFFFFFFFFFF
+ void checkFullWrap() {
+ fifo_counter_t counter = -10;
+ mFifoBuffer.setWriteCounter(counter);
+ mFifoBuffer.setReadCounter(counter);
+ ASSERT_LT(mFifoBuffer.getWriteCounter(), 0);
+ writeMultipleDataFrames(20);
+ ASSERT_GT(mFifoBuffer.getWriteCounter(), 0); // did we wrap past zero?
+ verifyStorageIntegrity();
}
FifoBuffer mFifoBuffer;
- int16_t *mData;
fifo_frames_t mNextWriteIndex = 0;
fifo_frames_t mNextVerifyIndex = 0;
fifo_frames_t mThreshold;
+
+ fifo_counter_t mReadIndex = 0;
+ fifo_counter_t mWriteIndex = 0;
+ int16_t mVeryBigArray[kBigArraySize]; // Use the middle of this array for the FIFO.
+ int16_t *mFifoStorage = &mVeryBigArray[kFifoDataOffset]; // Start here for storage.
+ int16_t mData[kBigArraySize]{};
};
-TEST(test_fifo_buffer, fifo_read_write) {
+TEST(test_fifo_buffer, fifo_write_read) {
constexpr int capacity = 51; // arbitrary
TestFifoBuffer tester(capacity);
tester.checkMisc();
tester.checkWriteRead();
}
-TEST(test_fifo_buffer, fifo_wrapping_read_write) {
+TEST(test_fifo_buffer, fifo_wrapping_write_read) {
constexpr int capacity = 59; // arbitrary, a little bigger this time
TestFifoBuffer tester(capacity);
tester.checkWrappingWriteRead();
@@ -227,3 +368,21 @@
TestFifoBuffer tester(capacity, threshold);
tester.checkRandomWriteRead();
}
+
+TEST(test_fifo_buffer, fifo_negative_counters) {
+ constexpr int capacity = 49; // arbitrary
+ TestFifoBuffer tester(capacity);
+ tester.checkNegativeCounters();
+}
+
+TEST(test_fifo_buffer, fifo_half_wrap) {
+ constexpr int capacity = 57; // arbitrary
+ TestFifoBuffer tester(capacity);
+ tester.checkHalfWrap();
+}
+
+TEST(test_fifo_buffer, fifo_full_wrap) {
+ constexpr int capacity = 57; // arbitrary
+ TestFifoBuffer tester(capacity);
+ tester.checkFullWrap();
+}
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index 038c854..3223647 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -211,7 +211,7 @@
mBufferMemory.clear();
IPCThreadState::self()->flushCommands();
ALOGV("%s(%d): releasing session id %d",
- __func__, mId, mSessionId);
+ __func__, mPortId, mSessionId);
AudioSystem::releaseAudioSessionId(mSessionId, -1 /*pid*/);
}
}
@@ -239,7 +239,7 @@
pid_t callingPid;
pid_t myPid;
- // Note mId is not valid until the track is created, so omit mId in ALOG for set.
+ // Note mPortId is not valid until the track is created, so omit mPortId in ALOG for set.
ALOGV("%s(): inputSource %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, "
"notificationFrames %u, sessionId %d, transferType %d, flags %#x, opPackageName %s "
"uid %d, pid %d",
@@ -356,7 +356,7 @@
// create the IAudioRecord
status = createRecord_l(0 /*epoch*/, mOpPackageName);
- ALOGV("%s(%d): status %d", __func__, mId, status);
+ ALOGV("%s(%d): status %d", __func__, mPortId, status);
if (status != NO_ERROR) {
if (mAudioRecordThread != 0) {
@@ -393,7 +393,7 @@
status_t AudioRecord::start(AudioSystem::sync_event_t event, audio_session_t triggerSession)
{
- ALOGV("%s(%d): sync event %d trigger session %d", __func__, mId, event, triggerSession);
+ ALOGV("%s(%d): sync event %d trigger session %d", __func__, mPortId, event, triggerSession);
AutoMutex lock(mLock);
if (mActive) {
@@ -434,7 +434,7 @@
if (status != NO_ERROR) {
mActive = false;
- ALOGE("%s(%d): status %d", __func__, mId, status);
+ ALOGE("%s(%d): status %d", __func__, mPortId, status);
} else {
sp<AudioRecordThread> t = mAudioRecordThread;
if (t != 0) {
@@ -458,7 +458,7 @@
void AudioRecord::stop()
{
AutoMutex lock(mLock);
- ALOGV("%s(%d): mActive:%d\n", __func__, mId, mActive);
+ ALOGV("%s(%d): mActive:%d\n", __func__, mPortId, mActive);
if (!mActive) {
return;
}
@@ -638,7 +638,7 @@
result.append(" AudioRecord::dump\n");
result.appendFormat(" id(%d) status(%d), active(%d), session Id(%d)\n",
- mId, mStatus, mActive, mSessionId);
+ mPortId, mStatus, mActive, mSessionId);
result.appendFormat(" flags(%#x), req. flags(%#x), audio source(%d)\n",
mFlags, mOrigFlags, mAttributes.source);
result.appendFormat(" format(%#x), channel mask(%#x), channel count(%u), sample rate(%u)\n",
@@ -680,7 +680,7 @@
status_t status;
if (audioFlinger == 0) {
- ALOGE("%s(%d): Could not get audioflinger", __func__, mId);
+ ALOGE("%s(%d): Could not get audioflinger", __func__, mPortId);
status = NO_INIT;
goto exit;
}
@@ -708,7 +708,7 @@
(mTransfer == TRANSFER_OBTAIN);
if (!useCaseAllowed) {
ALOGW("%s(%d): AUDIO_INPUT_FLAG_FAST denied, incompatible transfer = %s",
- __func__, mId,
+ __func__, mPortId,
convertTransferToText(mTransfer));
mFlags = (audio_input_flags_t) (mFlags & ~(AUDIO_INPUT_FLAG_FAST |
AUDIO_INPUT_FLAG_RAW));
@@ -744,7 +744,7 @@
if (status != NO_ERROR) {
ALOGE("%s(%d): AudioFlinger could not create record track, status: %d",
- __func__, mId, status);
+ __func__, mPortId, status);
goto exit;
}
ALOG_ASSERT(record != 0);
@@ -755,7 +755,7 @@
mAwaitBoost = false;
if (output.flags & AUDIO_INPUT_FLAG_FAST) {
ALOGI("%s(%d): AUDIO_INPUT_FLAG_FAST successful; frameCount %zu -> %zu",
- __func__, mId,
+ __func__, mPortId,
mReqFrameCount, output.frameCount);
mAwaitBoost = true;
}
@@ -765,13 +765,13 @@
mSampleRate = output.sampleRate;
if (output.cblk == 0) {
- ALOGE("%s(%d): Could not get control block", __func__, mId);
+ ALOGE("%s(%d): Could not get control block", __func__, mPortId);
status = NO_INIT;
goto exit;
}
iMemPointer = output.cblk ->pointer();
if (iMemPointer == NULL) {
- ALOGE("%s(%d): Could not get control block pointer", __func__, mId);
+ ALOGE("%s(%d): Could not get control block pointer", __func__, mPortId);
status = NO_INIT;
goto exit;
}
@@ -786,7 +786,7 @@
} else {
buffers = output.buffers->pointer();
if (buffers == NULL) {
- ALOGE("%s(%d): Could not get buffer pointer", __func__, mId);
+ ALOGE("%s(%d): Could not get buffer pointer", __func__, mPortId);
status = NO_INIT;
goto exit;
}
@@ -800,14 +800,14 @@
mAudioRecord = record;
mCblkMemory = output.cblk;
mBufferMemory = output.buffers;
- mId = output.trackId;
+ mPortId = output.portId;
IPCThreadState::self()->flushCommands();
mCblk = cblk;
// note that output.frameCount is the (possibly revised) value of mReqFrameCount
if (output.frameCount < mReqFrameCount || (mReqFrameCount == 0 && output.frameCount == 0)) {
ALOGW("%s(%d): Requested frameCount %zu but received frameCount %zu",
- __func__, mId,
+ __func__, mPortId,
mReqFrameCount, output.frameCount);
}
@@ -815,7 +815,7 @@
// The computation is done on server side.
if (mNotificationFramesReq > 0 && output.notificationFrameCount != mNotificationFramesReq) {
ALOGW("%s(%d): Server adjusted notificationFrames from %u to %zu for frameCount %zu",
- __func__, mId,
+ __func__, mPortId,
mNotificationFramesReq, output.notificationFrameCount, output.frameCount);
}
mNotificationFramesAct = (uint32_t)output.notificationFrameCount;
@@ -883,7 +883,7 @@
timeout.tv_nsec = (long) (ms % 1000) * 1000000;
requested = &timeout;
} else {
- ALOGE("%s(%d): invalid waitCount %d", __func__, mId, waitCount);
+ ALOGE("%s(%d): invalid waitCount %d", __func__, mPortId, waitCount);
requested = NULL;
}
return obtainBuffer(audioBuffer, requested, NULL /*elapsed*/, nonContig);
@@ -993,7 +993,7 @@
// sanity-check. user is most-likely passing an error code, and it would
// make the return value ambiguous (actualSize vs error).
ALOGE("%s(%d) (buffer=%p, size=%zu (%zu)",
- __func__, mId, buffer, userSize, userSize);
+ __func__, mPortId, buffer, userSize, userSize);
return BAD_VALUE;
}
@@ -1050,7 +1050,7 @@
pollUs <<= 1;
} while (tryCounter-- > 0);
if (tryCounter < 0) {
- ALOGE("%s(%d): did not receive expected priority boost on time", __func__, mId);
+ ALOGE("%s(%d): did not receive expected priority boost on time", __func__, mPortId);
}
// Run again immediately
return 0;
@@ -1174,7 +1174,7 @@
timeout.tv_sec = ns / 1000000000LL;
timeout.tv_nsec = ns % 1000000000LL;
ALOGV("%s(%d): timeout %ld.%03d",
- __func__, mId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000);
+ __func__, mPortId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000);
requested = &timeout;
}
@@ -1187,17 +1187,17 @@
status_t err = obtainBuffer(&audioBuffer, requested, NULL, &nonContig);
LOG_ALWAYS_FATAL_IF((err != NO_ERROR) != (audioBuffer.frameCount == 0),
"%s(%d): obtainBuffer() err=%d frameCount=%zu",
- __func__, mId, err, audioBuffer.frameCount);
+ __func__, mPortId, err, audioBuffer.frameCount);
requested = &ClientProxy::kNonBlocking;
size_t avail = audioBuffer.frameCount + nonContig;
ALOGV("%s(%d): obtainBuffer(%u) returned %zu = %zu + %zu err %d",
- __func__, mId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err);
+ __func__, mPortId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err);
if (err != NO_ERROR) {
if (err == TIMED_OUT || err == WOULD_BLOCK || err == -EINTR) {
break;
}
ALOGE("%s(%d): Error %d obtaining an audio buffer, giving up.",
- __func__, mId, err);
+ __func__, mPortId, err);
return NS_NEVER;
}
@@ -1220,7 +1220,7 @@
// Sanity check on returned size
if (ssize_t(readSize) < 0 || readSize > reqSize) {
ALOGE("%s(%d): EVENT_MORE_DATA requested %zu bytes but callback returned %zd bytes",
- __func__, mId, reqSize, ssize_t(readSize));
+ __func__, mPortId, reqSize, ssize_t(readSize));
return NS_NEVER;
}
@@ -1280,7 +1280,7 @@
status_t AudioRecord::restoreRecord_l(const char *from)
{
- ALOGW("%s(%d): dead IAudioRecord, creating a new one from %s()", __func__, mId, from);
+ ALOGW("%s(%d): dead IAudioRecord, creating a new one from %s()", __func__, mPortId, from);
++mSequence;
const int INITIAL_RETRIES = 3;
@@ -1311,7 +1311,7 @@
}
if (result != NO_ERROR) {
- ALOGW("%s(%d): failed status %d, retries %d", __func__, mId, result, retries);
+ ALOGW("%s(%d): failed status %d, retries %d", __func__, mPortId, result, retries);
if (--retries > 0) {
// leave time for an eventual race condition to clear before retrying
usleep(500000);
@@ -1330,18 +1330,18 @@
status_t AudioRecord::addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback)
{
if (callback == 0) {
- ALOGW("%s(%d): adding NULL callback!", __func__, mId);
+ ALOGW("%s(%d): adding NULL callback!", __func__, mPortId);
return BAD_VALUE;
}
AutoMutex lock(mLock);
if (mDeviceCallback.unsafe_get() == callback.get()) {
- ALOGW("%s(%d): adding same callback!", __func__, mId);
+ ALOGW("%s(%d): adding same callback!", __func__, mPortId);
return INVALID_OPERATION;
}
status_t status = NO_ERROR;
if (mInput != AUDIO_IO_HANDLE_NONE) {
if (mDeviceCallback != 0) {
- ALOGW("%s(%d): callback already present!", __func__, mId);
+ ALOGW("%s(%d): callback already present!", __func__, mPortId);
AudioSystem::removeAudioDeviceCallback(this, mInput);
}
status = AudioSystem::addAudioDeviceCallback(this, mInput);
@@ -1354,12 +1354,12 @@
const sp<AudioSystem::AudioDeviceCallback>& callback)
{
if (callback == 0) {
- ALOGW("%s(%d): removing NULL callback!", __func__, mId);
+ ALOGW("%s(%d): removing NULL callback!", __func__, mPortId);
return BAD_VALUE;
}
AutoMutex lock(mLock);
if (mDeviceCallback.unsafe_get() != callback.get()) {
- ALOGW("%s(%d): removing different callback!", __func__, mId);
+ ALOGW("%s(%d): removing different callback!", __func__, mPortId);
return INVALID_OPERATION;
}
mDeviceCallback.clear();
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index e260fd8..efe65bb 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -917,11 +917,11 @@
config, flags, selectedDeviceId, portId);
}
-status_t AudioSystem::startInput(audio_port_handle_t portId, bool *silenced)
+status_t AudioSystem::startInput(audio_port_handle_t portId)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
- return aps->startInput(portId, silenced);
+ return aps->startInput(portId);
}
status_t AudioSystem::stopInput(audio_port_handle_t portId)
@@ -1298,6 +1298,24 @@
return aps->setSurroundFormatEnabled(audioFormat, enabled);
}
+
+status_t AudioSystem::setAssistantUid(uid_t uid)
+{
+ const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
+ if (aps == 0) return PERMISSION_DENIED;
+
+ return aps->setAssistantUid(uid);
+}
+
+status_t AudioSystem::setA11yServicesUids(const std::vector<uid_t>& uids)
+{
+ const sp <IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
+ if (aps == 0) return PERMISSION_DENIED;
+
+ return aps->setA11yServicesUids(uids);
+}
+
+
// ---------------------------------------------------------------------------
int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index 8b35a85..02324ac 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -344,7 +344,7 @@
mSharedBuffer.clear();
IPCThreadState::self()->flushCommands();
ALOGV("%s(%d), releasing session id %d from %d on behalf of %d",
- __func__, mId,
+ __func__, mPortId,
mSessionId, IPCThreadState::self()->getCallingPid(), mClientPid);
AudioSystem::releaseAudioSessionId(mSessionId, mClientPid);
}
@@ -377,7 +377,7 @@
pid_t callingPid;
pid_t myPid;
- // Note mId is not valid until the track is created, so omit mId in ALOG for set.
+ // Note mPortId is not valid until the track is created, so omit mPortId in ALOG for set.
ALOGV("%s(): streamType %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, "
"flags #%x, notificationFrames %d, sessionId %d, transferType %d, uid %d, pid %d",
__func__,
@@ -658,7 +658,7 @@
status_t AudioTrack::start()
{
AutoMutex lock(mLock);
- ALOGV("%s(%d): prior state:%s", __func__, mId, stateToString(mState));
+ ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState));
if (mState == STATE_ACTIVE) {
return INVALID_OPERATION;
@@ -699,7 +699,7 @@
// It is possible since flush and stop are asynchronous that the server
// is still active at this point.
ALOGV("%s(%d): server read:%lld cumulative flushed:%lld client written:%lld",
- __func__, mId,
+ __func__, mPortId,
(long long)(mFramesWrittenServerOffset
+ mStartEts.mPosition[ExtendedTimestamp::LOCATION_SERVER]),
(long long)mStartEts.mFlushed,
@@ -760,7 +760,7 @@
// Start our local VolumeHandler for restoration purposes.
mVolumeHandler->setStarted();
} else {
- ALOGE("%s(%d): status %d", __func__, mId, status);
+ ALOGE("%s(%d): status %d", __func__, mPortId, status);
mState = previousState;
if (t != 0) {
if (previousState != STATE_STOPPING) {
@@ -778,7 +778,7 @@
void AudioTrack::stop()
{
AutoMutex lock(mLock);
- ALOGV("%s(%d): prior state:%s", __func__, mId, stateToString(mState));
+ ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState));
if (mState != STATE_ACTIVE && mState != STATE_PAUSED) {
return;
@@ -789,7 +789,7 @@
} else {
mState = STATE_STOPPED;
ALOGD_IF(mSharedBuffer == nullptr,
- "%s(%d): called with %u frames delivered", __func__, mId, mReleased.value());
+ "%s(%d): called with %u frames delivered", __func__, mPortId, mReleased.value());
mReleased = 0;
}
@@ -810,6 +810,10 @@
if (t != 0) {
if (!isOffloaded_l()) {
t->pause();
+ } else if (mTransfer == TRANSFER_SYNC_NOTIF_CALLBACK) {
+ // causes wake up of the playback thread, that will callback the client for
+ // EVENT_STREAM_END in processAudioBuffer()
+ t->wake();
}
} else {
setpriority(PRIO_PROCESS, 0, mPreviousPriority);
@@ -826,7 +830,7 @@
void AudioTrack::flush()
{
AutoMutex lock(mLock);
- ALOGV("%s(%d): prior state:%s", __func__, mId, stateToString(mState));
+ ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState));
if (mSharedBuffer != 0) {
return;
@@ -859,7 +863,7 @@
void AudioTrack::pause()
{
AutoMutex lock(mLock);
- ALOGV("%s(%d): prior state:%s", __func__, mId, stateToString(mState));
+ ALOGV("%s(%d): prior state:%s", __func__, mPortId, stateToString(mState));
if (mState == STATE_ACTIVE) {
mState = STATE_PAUSED;
@@ -887,7 +891,7 @@
uint32_t halFrames;
AudioSystem::getRenderPosition(mOutput, &halFrames, &mPausedPosition);
ALOGV("%s(%d): for offload, cache current position %u",
- __func__, mId, mPausedPosition);
+ __func__, mPortId, mPausedPosition);
}
}
}
@@ -941,7 +945,7 @@
status_t AudioTrack::setSampleRate(uint32_t rate)
{
AutoMutex lock(mLock);
- ALOGV("%s(%d): prior state:%s rate:%u", __func__, mId, stateToString(mState), rate);
+ ALOGV("%s(%d): prior state:%s rate:%u", __func__, mPortId, stateToString(mState), rate);
if (rate == mSampleRate) {
return NO_ERROR;
@@ -1009,7 +1013,7 @@
}
ALOGV("%s(%d): mSampleRate:%u mSpeed:%f mPitch:%f",
- __func__, mId, mSampleRate, playbackRate.mSpeed, playbackRate.mPitch);
+ __func__, mPortId, mSampleRate, playbackRate.mSpeed, playbackRate.mPitch);
// pitch is emulated by adjusting speed and sampleRate
const uint32_t effectiveRate = adjustSampleRate(mSampleRate, playbackRate.mPitch);
const float effectiveSpeed = adjustSpeed(playbackRate.mSpeed, playbackRate.mPitch);
@@ -1019,17 +1023,17 @@
playbackRateTemp.mPitch = effectivePitch;
ALOGV("%s(%d) (effective) mSampleRate:%u mSpeed:%f mPitch:%f",
- __func__, mId, effectiveRate, effectiveSpeed, effectivePitch);
+ __func__, mPortId, effectiveRate, effectiveSpeed, effectivePitch);
if (!isAudioPlaybackRateValid(playbackRateTemp)) {
ALOGW("%s(%d) (%f, %f) failed (effective rate out of bounds)",
- __func__, mId, playbackRate.mSpeed, playbackRate.mPitch);
+ __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch);
return BAD_VALUE;
}
// Check if the buffer size is compatible.
if (!isSampleRateSpeedAllowed_l(effectiveRate, effectiveSpeed)) {
ALOGW("%s(%d) (%f, %f) failed (buffer size)",
- __func__, mId, playbackRate.mSpeed, playbackRate.mPitch);
+ __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch);
return BAD_VALUE;
}
@@ -1037,13 +1041,13 @@
if ((uint64_t)effectiveRate > (uint64_t)mSampleRate *
(uint64_t)AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
ALOGW("%s(%d) (%f, %f) failed. Resample rate exceeds max accepted value",
- __func__, mId, playbackRate.mSpeed, playbackRate.mPitch);
+ __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch);
return BAD_VALUE;
}
if ((uint64_t)effectiveRate * (uint64_t)AUDIO_RESAMPLER_UP_RATIO_MAX < (uint64_t)mSampleRate) {
ALOGW("%s(%d) (%f, %f) failed. Resample rate below min accepted value",
- __func__, mId, playbackRate.mSpeed, playbackRate.mPitch);
+ __func__, mPortId, playbackRate.mSpeed, playbackRate.mPitch);
return BAD_VALUE;
}
mPlaybackRate = playbackRate;
@@ -1245,7 +1249,7 @@
if (isOffloaded_l() && ((mState == STATE_PAUSED) || (mState == STATE_PAUSED_STOPPING))) {
ALOGV("%s(%d): called in paused state, return cached position %u",
- __func__, mId, mPausedPosition);
+ __func__, mPortId, mPausedPosition);
*position = mPausedPosition;
return NO_ERROR;
}
@@ -1391,7 +1395,7 @@
{
status_t status = AudioSystem::getLatency(mOutput, &mAfLatency);
if (status != NO_ERROR) {
- ALOGW("%s(%d): getLatency(%d) failed status %d", __func__, mId, mOutput, status);
+ ALOGW("%s(%d): getLatency(%d) failed status %d", __func__, mPortId, mOutput, status);
} else {
// FIXME don't believe this lie
mLatency = mAfLatency + (1000LL * mFrameCount) / mSampleRate;
@@ -1421,7 +1425,7 @@
const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
if (audioFlinger == 0) {
ALOGE("%s(%d): Could not get audioflinger",
- __func__, mId);
+ __func__, mPortId);
status = NO_INIT;
goto exit;
}
@@ -1447,7 +1451,7 @@
if (!fastAllowed) {
ALOGW("%s(%d): AUDIO_OUTPUT_FLAG_FAST denied by client,"
" not shared buffer and transfer = %s",
- __func__, mId,
+ __func__, mPortId,
convertTransferToText(mTransfer));
mFlags = (audio_output_flags_t) (mFlags & ~AUDIO_OUTPUT_FLAG_FAST);
}
@@ -1497,7 +1501,7 @@
if (status != NO_ERROR || output.outputId == AUDIO_IO_HANDLE_NONE) {
ALOGE("%s(%d): AudioFlinger could not create track, status: %d output %d",
- __func__, mId, status, output.outputId);
+ __func__, mPortId, status, output.outputId);
if (status == NO_ERROR) {
status = NO_INIT;
}
@@ -1518,7 +1522,7 @@
mAfFrameCount = output.afFrameCount;
mAfSampleRate = output.afSampleRate;
mAfLatency = output.afLatencyMs;
- mId = output.trackId;
+ mPortId = output.portId;
mLatency = mAfLatency + (1000LL * mFrameCount) / mSampleRate;
@@ -1528,13 +1532,13 @@
// FIXME compare to AudioRecord
sp<IMemory> iMem = track->getCblk();
if (iMem == 0) {
- ALOGE("%s(%d): Could not get control block", __func__, mId);
+ ALOGE("%s(%d): Could not get control block", __func__, mPortId);
status = NO_INIT;
goto exit;
}
void *iMemPointer = iMem->pointer();
if (iMemPointer == NULL) {
- ALOGE("%s(%d): Could not get control block pointer", __func__, mId);
+ ALOGE("%s(%d): Could not get control block pointer", __func__, mPortId);
status = NO_INIT;
goto exit;
}
@@ -1554,13 +1558,13 @@
if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
if (output.flags & AUDIO_OUTPUT_FLAG_FAST) {
ALOGI("%s(%d): AUDIO_OUTPUT_FLAG_FAST successful; frameCount %zu -> %zu",
- __func__, mId, mReqFrameCount, mFrameCount);
+ __func__, mPortId, mReqFrameCount, mFrameCount);
if (!mThreadCanCallJava) {
mAwaitBoost = true;
}
} else {
ALOGW("%s(%d): AUDIO_OUTPUT_FLAG_FAST denied by server; frameCount %zu -> %zu",
- __func__, mId, mReqFrameCount, mFrameCount);
+ __func__, mPortId, mReqFrameCount, mFrameCount);
}
}
mFlags = output.flags;
@@ -1588,7 +1592,7 @@
} else {
buffers = mSharedBuffer->pointer();
if (buffers == NULL) {
- ALOGE("%s(%d): Could not get buffer pointer", __func__, mId);
+ ALOGE("%s(%d): Could not get buffer pointer", __func__, mPortId);
status = NO_INIT;
goto exit;
}
@@ -1677,7 +1681,7 @@
timeout.tv_nsec = (long) (ms % 1000) * 1000000;
requested = &timeout;
} else {
- ALOGE("%s(%d): invalid waitCount %d", __func__, mId, waitCount);
+ ALOGE("%s(%d): invalid waitCount %d", __func__, mPortId, waitCount);
requested = NULL;
}
return obtainBuffer(audioBuffer, requested, NULL /*elapsed*/, nonContig);
@@ -1788,7 +1792,7 @@
int32_t flags = android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags);
if ((mState == STATE_ACTIVE) && (flags & CBLK_DISABLED)) {
ALOGW("%s(%d): releaseBuffer() track %p disabled due to previous underrun, restarting",
- __func__, mId, this);
+ __func__, mPortId, this);
// FIXME ignoring status
mAudioTrack->start();
}
@@ -1816,7 +1820,7 @@
// Sanity-check: user is most-likely passing an error code, and it would
// make the return value ambiguous (actualSize vs error).
ALOGE("%s(%d): AudioTrack::write(buffer=%p, size=%zu (%zd)",
- __func__, mId, buffer, userSize, userSize);
+ __func__, mPortId, buffer, userSize, userSize);
return BAD_VALUE;
}
@@ -1889,7 +1893,7 @@
} while (tryCounter-- > 0);
if (tryCounter < 0) {
ALOGE("%s(%d): did not receive expected priority boost on time",
- __func__, mId);
+ __func__, mPortId);
}
// Run again immediately
return 0;
@@ -2131,7 +2135,7 @@
timeout.tv_sec = ns / 1000000000LL;
timeout.tv_nsec = ns % 1000000000LL;
ALOGV("%s(%d): timeout %ld.%03d",
- __func__, mId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000);
+ __func__, mPortId, timeout.tv_sec, (int) timeout.tv_nsec / 1000000);
requested = &timeout;
}
@@ -2144,11 +2148,11 @@
status_t err = obtainBuffer(&audioBuffer, requested, NULL, &nonContig);
LOG_ALWAYS_FATAL_IF((err != NO_ERROR) != (audioBuffer.frameCount == 0),
"%s(%d): obtainBuffer() err=%d frameCount=%zu",
- __func__, mId, err, audioBuffer.frameCount);
+ __func__, mPortId, err, audioBuffer.frameCount);
requested = &ClientProxy::kNonBlocking;
size_t avail = audioBuffer.frameCount + nonContig;
ALOGV("%s(%d): obtainBuffer(%u) returned %zu = %zu + %zu err %d",
- __func__, mId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err);
+ __func__, mPortId, mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err);
if (err != NO_ERROR) {
if (err == TIMED_OUT || err == WOULD_BLOCK || err == -EINTR ||
(isOffloaded() && (err == DEAD_OBJECT))) {
@@ -2156,7 +2160,7 @@
return 1000000;
}
ALOGE("%s(%d): Error %d obtaining an audio buffer, giving up.",
- __func__, mId, err);
+ __func__, mPortId, err);
return NS_NEVER;
}
@@ -2188,7 +2192,7 @@
// Sanity check on returned size
if (ssize_t(writtenSize) < 0 || writtenSize > reqSize) {
ALOGE("%s(%d): EVENT_MORE_DATA requested %zu bytes but callback returned %zd bytes",
- __func__, mId, reqSize, ssize_t(writtenSize));
+ __func__, mPortId, reqSize, ssize_t(writtenSize));
return NS_NEVER;
}
@@ -2292,7 +2296,7 @@
status_t AudioTrack::restoreTrack_l(const char *from)
{
ALOGW("%s(%d): dead IAudioTrack, %s, creating a new one from %s()",
- __func__, mId, isOffloadedOrDirect_l() ? "Offloaded or Direct" : "PCM", from);
+ __func__, mPortId, isOffloadedOrDirect_l() ? "Offloaded or Direct" : "PCM", from);
++mSequence;
// refresh the audio configuration cache in this process to make sure we get new
@@ -2350,7 +2354,7 @@
} else {
mStaticProxy->setBufferPosition(bufferPosition);
if (bufferPosition == mFrameCount) {
- ALOGD("%s(%d): restoring track at end of static buffer", __func__, mId);
+ ALOGD("%s(%d): restoring track at end of static buffer", __func__, mPortId);
}
}
}
@@ -2380,7 +2384,7 @@
mFramesWrittenAtRestore = mFramesWrittenServerOffset;
}
if (result != NO_ERROR) {
- ALOGW("%s(%d): failed status %d, retries %d", __func__, mId, result, retries);
+ ALOGW("%s(%d): failed status %d, retries %d", __func__, mPortId, result, retries);
if (--retries > 0) {
// leave time for an eventual race condition to clear before retrying
usleep(500000);
@@ -2410,7 +2414,7 @@
// in which case the use of uint32_t for these counters has bigger issues.
ALOGE_IF(delta < 0,
"%s(%d): detected illegal retrograde motion by the server: mServer advanced by %d",
- __func__, mId, delta);
+ __func__, mPortId, delta);
mServer = newServer;
if (delta > 0) { // avoid retrograde
mPosition += delta;
@@ -2433,7 +2437,7 @@
"%s(%d): denied "
"mAfLatency:%u mAfFrameCount:%zu mAfSampleRate:%u sampleRate:%u speed:%f "
"mFrameCount:%zu < minFrameCount:%zu",
- __func__, mId,
+ __func__, mPortId,
mAfLatency, mAfFrameCount, mAfSampleRate, sampleRate, speed,
mFrameCount, minFrameCount);
return allowed;
@@ -2452,7 +2456,7 @@
param.addInt(String8(AudioParameter::keyPresentationId), presentationId);
param.addInt(String8(AudioParameter::keyProgramId), programId);
ALOGV("%s(%d): PresentationId/ProgramId[%s]",
- __func__, mId, param.toString().string());
+ __func__, mPortId, param.toString().string());
return mAudioTrack->setParameters(param.toString());
}
@@ -2479,7 +2483,7 @@
} else {
// warn only if not an expected restore failure.
ALOGW_IF(!((isOffloadedOrDirect_l() || mDoNotReconnect) && status == DEAD_OBJECT),
- "%s(%d): applyVolumeShaper failed: %d", __func__, mId, status);
+ "%s(%d): applyVolumeShaper failed: %d", __func__, mPortId, status);
}
return status;
}
@@ -2521,7 +2525,7 @@
}
status_t status = mProxy->getTimestamp(timestamp);
LOG_ALWAYS_FATAL_IF(status != OK, "%s(%d): status %d not allowed from proxy getTimestamp",
- __func__, mId, status);
+ __func__, mPortId, status);
bool found = false;
timestamp->mPosition[ExtendedTimestamp::LOCATION_CLIENT] = mFramesWritten;
timestamp->mTimeNs[ExtendedTimestamp::LOCATION_CLIENT] = 0;
@@ -2565,7 +2569,7 @@
break; // offloaded tracks handled below
default:
LOG_ALWAYS_FATAL("%s(%d): Invalid mState in getTimestamp(): %d",
- __func__, mId, mState);
+ __func__, mPortId, mState);
break;
}
@@ -2600,7 +2604,7 @@
if (location == ExtendedTimestamp::LOCATION_SERVER) {
ALOGW_IF(mPreviousLocation == ExtendedTimestamp::LOCATION_KERNEL,
"%s(%d): location moved from kernel to server",
- __func__, mId);
+ __func__, mPortId);
// check that the last kernel OK time info exists and the positions
// are valid (if they predate the current track, the positions may
// be zero or negative).
@@ -2616,7 +2620,7 @@
(ets.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK]
- ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK]);
ALOGV("%s(%d): frame adjustment:%lld timestamp:%s",
- __func__, mId, (long long)frames, ets.toString().c_str());
+ __func__, mPortId, (long long)frames, ets.toString().c_str());
if (frames >= ets.mPosition[location]) {
timestamp.mPosition = 0;
} else {
@@ -2625,7 +2629,7 @@
} else if (location == ExtendedTimestamp::LOCATION_KERNEL) {
ALOGV_IF(mPreviousLocation == ExtendedTimestamp::LOCATION_SERVER,
"%s(%d): location moved from server to kernel",
- __func__, mId);
+ __func__, mPortId);
}
// We update the timestamp time even when paused.
@@ -2649,7 +2653,7 @@
mPreviousLocation = location;
} else {
// right after AudioTrack is started, one may not find a timestamp
- ALOGV("%s(%d): getBestTimestamp did not find timestamp", __func__, mId);
+ ALOGV("%s(%d): getBestTimestamp did not find timestamp", __func__, mPortId);
}
}
if (status == INVALID_OPERATION) {
@@ -2660,7 +2664,7 @@
// "zero" for NuPlayer). We don't convert for track restoration as position
// does not reset.
ALOGV("%s(%d): timestamp server offset:%lld restore frames:%lld",
- __func__, mId,
+ __func__, mPortId,
(long long)mFramesWrittenServerOffset, (long long)mFramesWrittenAtRestore);
if (mFramesWrittenServerOffset != mFramesWrittenAtRestore) {
status = WOULD_BLOCK;
@@ -2668,7 +2672,7 @@
}
}
if (status != NO_ERROR) {
- ALOGV_IF(status != WOULD_BLOCK, "%s(%d): getTimestamp error:%#x", __func__, mId, status);
+ ALOGV_IF(status != WOULD_BLOCK, "%s(%d): getTimestamp error:%#x", __func__, mPortId, status);
return status;
}
if (isOffloadedOrDirect_l()) {
@@ -2709,7 +2713,7 @@
ALOGW_IF(!mTimestampStartupGlitchReported,
"%s(%d): startup glitch detected"
" deltaTimeUs(%lld) deltaPositionUs(%lld) tsmPosition(%u)",
- __func__, mId,
+ __func__, mPortId,
(long long)deltaTimeUs, (long long)deltaPositionByUs,
timestamp.mPosition);
mTimestampStartupGlitchReported = true;
@@ -2779,7 +2783,7 @@
if (currentTimeNanos < limitNs) {
ALOGD("%s(%d): correcting timestamp time for pause, "
"currentTimeNanos: %lld < limitNs: %lld < mStartNs: %lld",
- __func__, mId,
+ __func__, mPortId,
(long long)currentTimeNanos, (long long)limitNs, (long long)mStartNs);
timestamp.mTime = convertNsToTimespec(limitNs);
currentTimeNanos = limitNs;
@@ -2788,7 +2792,7 @@
// retrograde check
if (currentTimeNanos < previousTimeNanos) {
ALOGW("%s(%d): retrograde timestamp time corrected, %lld < %lld",
- __func__, mId,
+ __func__, mPortId,
(long long)currentTimeNanos, (long long)previousTimeNanos);
timestamp.mTime = mPreviousTimestamp.mTime;
// currentTimeNanos not used below.
@@ -2802,7 +2806,7 @@
// Only report once per position instead of spamming the log.
if (!mRetrogradeMotionReported) {
ALOGW("%s(%d): retrograde timestamp position corrected, %d = %u - %u",
- __func__, mId,
+ __func__, mPortId,
deltaPosition,
timestamp.mPosition,
mPreviousTimestamp.mPosition);
@@ -2823,7 +2827,7 @@
const int64_t computedSampleRate =
deltaPosition * (long long)NANOS_PER_SECOND / deltaTime;
ALOGD("%s(%d): computedSampleRate:%u sampleRate:%u",
- __func__, mId,
+ __func__, mPortId,
(unsigned)computedSampleRate, mSampleRate);
}
#endif
@@ -2870,7 +2874,7 @@
result.append(" AudioTrack::dump\n");
result.appendFormat(" id(%d) status(%d), state(%d), session Id(%d), flags(%#x)\n",
- mId, mStatus, mState, mSessionId, mFlags);
+ mPortId, mStatus, mState, mSessionId, mFlags);
result.appendFormat(" stream type(%d), left - right volume(%f, %f)\n",
(mStreamType == AUDIO_STREAM_DEFAULT) ?
audio_attributes_to_stream_type(&mAttributes) : mStreamType,
@@ -2912,18 +2916,18 @@
status_t AudioTrack::addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback)
{
if (callback == 0) {
- ALOGW("%s(%d): adding NULL callback!", __func__, mId);
+ ALOGW("%s(%d): adding NULL callback!", __func__, mPortId);
return BAD_VALUE;
}
AutoMutex lock(mLock);
if (mDeviceCallback.unsafe_get() == callback.get()) {
- ALOGW("%s(%d): adding same callback!", __func__, mId);
+ ALOGW("%s(%d): adding same callback!", __func__, mPortId);
return INVALID_OPERATION;
}
status_t status = NO_ERROR;
if (mOutput != AUDIO_IO_HANDLE_NONE) {
if (mDeviceCallback != 0) {
- ALOGW("%s(%d): callback already present!", __func__, mId);
+ ALOGW("%s(%d): callback already present!", __func__, mPortId);
AudioSystem::removeAudioDeviceCallback(this, mOutput);
}
status = AudioSystem::addAudioDeviceCallback(this, mOutput);
@@ -2936,12 +2940,12 @@
const sp<AudioSystem::AudioDeviceCallback>& callback)
{
if (callback == 0) {
- ALOGW("%s(%d): removing NULL callback!", __func__, mId);
+ ALOGW("%s(%d): removing NULL callback!", __func__, mPortId);
return BAD_VALUE;
}
AutoMutex lock(mLock);
if (mDeviceCallback.unsafe_get() != callback.get()) {
- ALOGW("%s(%d): removing different callback!", __func__, mId);
+ ALOGW("%s(%d): removing different callback!", __func__, mPortId);
return INVALID_OPERATION;
}
mDeviceCallback.clear();
@@ -3047,7 +3051,7 @@
case STATE_FLUSHED:
return false; // we're not active
default:
- LOG_ALWAYS_FATAL("%s(%d): Invalid mState in hasStarted(): %d", __func__, mId, mState);
+ LOG_ALWAYS_FATAL("%s(%d): Invalid mState in hasStarted(): %d", __func__, mPortId, mState);
break;
}
@@ -3064,7 +3068,7 @@
wait = (ts.mPosition == 0 || ts.mPosition == mStartTs.mPosition);
}
ALOGV("%s(%d): hasStarted wait:%d ts:%u start position:%lld",
- __func__, mId,
+ __func__, mPortId,
(int)wait,
ts.mPosition,
(long long)mStartTs.mPosition);
@@ -3086,7 +3090,7 @@
}
}
ALOGV("%s(%d): hasStarted wait:%d ets:%lld start position:%lld",
- __func__, mId,
+ __func__, mPortId,
(int)wait,
(long long)ets.mPosition[location],
(long long)mStartEts.mPosition[location]);
@@ -3162,7 +3166,7 @@
FALLTHROUGH_INTENDED;
default:
LOG_ALWAYS_FATAL_IF(ns < 0, "%s(%d): processAudioBuffer() returned %lld",
- __func__, mReceiver.mId, (long long)ns);
+ __func__, mReceiver.mPortId, (long long)ns);
pauseInternal(ns);
return true;
}
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index 32a71f3..7f2e5e5 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -85,7 +85,9 @@
ADD_STREAM_DEFAULT_EFFECT,
REMOVE_STREAM_DEFAULT_EFFECT,
ADD_SOURCE_DEFAULT_EFFECT,
- REMOVE_SOURCE_DEFAULT_EFFECT
+ REMOVE_SOURCE_DEFAULT_EFFECT,
+ SET_ASSISTANT_UID,
+ SET_A11Y_SERVICES_UIDS,
};
#define MAX_ITEMS_PER_LIST 1024
@@ -327,16 +329,13 @@
return NO_ERROR;
}
- virtual status_t startInput(audio_port_handle_t portId,
- bool *silenced)
+ virtual status_t startInput(audio_port_handle_t portId)
{
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
data.writeInt32(portId);
- data.writeInt32(*silenced ? 1 : 0);
remote()->transact(START_INPUT, data, &reply);
status_t status = static_cast <status_t> (reply.readInt32());
- *silenced = reply.readInt32() == 1;
return status;
}
@@ -941,6 +940,33 @@
return static_cast <status_t> (reply.readInt32());
}
+ virtual status_t setAssistantUid(uid_t uid)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(uid);
+ status_t status = remote()->transact(SET_ASSISTANT_UID, data, &reply);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ return static_cast <status_t> (reply.readInt32());
+ }
+
+ virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(uids.size());
+ for (auto uid : uids) {
+ data.writeInt32(uid);
+ }
+ status_t status = remote()->transact(SET_A11Y_SERVICES_UIDS, data, &reply);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ return static_cast <status_t> (reply.readInt32());
+ }
+
};
IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
@@ -997,7 +1023,9 @@
case START_AUDIO_SOURCE:
case STOP_AUDIO_SOURCE:
case GET_SURROUND_FORMATS:
- case SET_SURROUND_FORMAT_ENABLED: {
+ case SET_SURROUND_FORMAT_ENABLED:
+ case SET_ASSISTANT_UID:
+ case SET_A11Y_SERVICES_UIDS: {
if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
__func__, code, IPCThreadState::self()->getCallingPid(),
@@ -1188,10 +1216,8 @@
case START_INPUT: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
- bool silenced = data.readInt32() == 1;
- status_t status = startInput(portId, &silenced);
+ status_t status = startInput(portId);
reply->writeInt32(static_cast <uint32_t>(status));
- reply->writeInt32(silenced ? 1 : 0);
return NO_ERROR;
} break;
@@ -1710,6 +1736,42 @@
return NO_ERROR;
}
+ case SET_ASSISTANT_UID: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ int32_t uid;
+ status_t status = data.readInt32(&uid);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ status = setAssistantUid(uid);
+ reply->writeInt32(static_cast <int32_t>(status));
+ return NO_ERROR;
+ }
+
+ case SET_A11Y_SERVICES_UIDS: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ std::vector<uid_t> uids;
+ int32_t size;
+ status_t status = data.readInt32(&size);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ if (size > MAX_ITEMS_PER_LIST) {
+ size = MAX_ITEMS_PER_LIST;
+ }
+ for (int32_t i = 0; i < size; i++) {
+ int32_t uid;
+ status = data.readInt32(&uid);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ uids.push_back(uid);
+ }
+ status = setA11yServicesUids(uids);
+ reply->writeInt32(static_cast <int32_t>(status));
+ return NO_ERROR;
+ }
+
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libaudioclient/IAudioTrack.cpp b/media/libaudioclient/IAudioTrack.cpp
index adff057..83a568a 100644
--- a/media/libaudioclient/IAudioTrack.cpp
+++ b/media/libaudioclient/IAudioTrack.cpp
@@ -39,6 +39,7 @@
PAUSE,
ATTACH_AUX_EFFECT,
SET_PARAMETERS,
+ SELECT_PRESENTATION,
GET_TIMESTAMP,
SIGNAL,
APPLY_VOLUME_SHAPER,
@@ -127,6 +128,19 @@
return status;
}
+ /* Selects the presentation (if available) */
+ virtual status_t selectPresentation(int presentationId, int programId) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
+ data.writeInt32(presentationId);
+ data.writeInt32(programId);
+ status_t status = remote()->transact(SELECT_PRESENTATION, data, &reply);
+ if (status == NO_ERROR) {
+ status = reply.readInt32();
+ }
+ return status;
+ }
+
virtual status_t getTimestamp(AudioTimestamp& timestamp) {
Parcel data, reply;
data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
@@ -239,6 +253,11 @@
reply->writeInt32(setParameters(keyValuePairs));
return NO_ERROR;
} break;
+ case SELECT_PRESENTATION: {
+ CHECK_INTERFACE(IAudioTrack, data, reply);
+ reply->writeInt32(selectPresentation(data.readInt32(), data.readInt32()));
+ return NO_ERROR;
+ } break;
case GET_TIMESTAMP: {
CHECK_INTERFACE(IAudioTrack, data, reply);
AudioTimestamp timestamp;
diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h
index c226557..35a7e05 100644
--- a/media/libaudioclient/include/media/AudioRecord.h
+++ b/media/libaudioclient/include/media/AudioRecord.h
@@ -534,9 +534,15 @@
*/
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
- /*
- * Dumps the state of an audio record.
- */
+ /* Get the unique port ID assigned to this AudioRecord instance by audio policy manager.
+ * The ID is unique across all audioserver clients and can change during the life cycle
+ * of a given AudioRecord instance if the connection to audioserver is restored.
+ */
+ audio_port_handle_t getPortId() const { return mPortId; };
+
+ /*
+ * Dumps the state of an audio record.
+ */
status_t dump(int fd, const Vector<String16>& args) const;
private:
@@ -654,7 +660,7 @@
audio_input_flags_t mOrigFlags; // as specified in constructor or set(), const
audio_session_t mSessionId;
- int mId; // Id from AudioFlinger
+ audio_port_handle_t mPortId; // Id from Audio Policy Manager
transfer_type mTransfer;
// Next 5 fields may be changed if IAudioRecord is re-created, but always != 0
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index adfee8b..ca1879f 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -241,8 +241,7 @@
audio_port_handle_t *selectedDeviceId,
audio_port_handle_t *portId);
- static status_t startInput(audio_port_handle_t portId,
- bool *silenced);
+ static status_t startInput(audio_port_handle_t portId);
static status_t stopInput(audio_port_handle_t portId);
static void releaseInput(audio_port_handle_t portId);
static status_t initStreamVolume(audio_stream_type_t stream,
@@ -343,6 +342,9 @@
bool reported);
static status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);
+ static status_t setAssistantUid(uid_t uid);
+ static status_t setA11yServicesUids(const std::vector<uid_t>& uids);
+
// ----------------------------------------------------------------------------
class AudioPortCallback : public RefBase
diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h
index 4b84fd1..8238ea2 100644
--- a/media/libaudioclient/include/media/AudioTrack.h
+++ b/media/libaudioclient/include/media/AudioTrack.h
@@ -912,7 +912,14 @@
AutoMutex lock(mLock);
return mState == STATE_ACTIVE || mState == STATE_STOPPING;
}
-protected:
+
+ /* Get the unique port ID assigned to this AudioTrack instance by audio policy manager.
+ * The ID is unique across all audioserver clients and can change during the life cycle
+ * of a given AudioTrack instance if the connection to audioserver is restored.
+ */
+ audio_port_handle_t getPortId() const { return mPortId; };
+
+ protected:
/* copying audio tracks is not allowed */
AudioTrack(const AudioTrack& other);
AudioTrack& operator = (const AudioTrack& other);
@@ -1166,7 +1173,7 @@
audio_session_t mSessionId;
int mAuxEffectId;
- int mId; // Id from AudioFlinger.
+ audio_port_handle_t mPortId; // Id from Audio Policy Manager
mutable Mutex mLock;
diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h
index 52cc860..a34b207 100644
--- a/media/libaudioclient/include/media/IAudioFlinger.h
+++ b/media/libaudioclient/include/media/IAudioFlinger.h
@@ -146,7 +146,7 @@
afSampleRate = parcel->readInt64();
afLatencyMs = parcel->readInt32();
(void)parcel->read(&outputId, sizeof(audio_io_handle_t));
- (void)parcel->readInt32(&trackId);
+ (void)parcel->read(&portId, sizeof(audio_port_handle_t));
return NO_ERROR;
}
@@ -164,7 +164,7 @@
(void)parcel->writeInt64(afSampleRate);
(void)parcel->writeInt32(afLatencyMs);
(void)parcel->write(&outputId, sizeof(audio_io_handle_t));
- (void)parcel->writeInt32(trackId);
+ (void)parcel->write(&portId, sizeof(audio_port_handle_t));
return NO_ERROR;
}
@@ -181,7 +181,7 @@
uint32_t afSampleRate;
uint32_t afLatencyMs;
audio_io_handle_t outputId;
- int32_t trackId;
+ audio_port_handle_t portId;
};
/* CreateRecordInput contains all input arguments sent by AudioRecord to AudioFlinger
@@ -274,7 +274,7 @@
return BAD_VALUE;
}
}
- (void)parcel->readInt32(&trackId);
+ (void)parcel->read(&portId, sizeof(audio_port_handle_t));
return NO_ERROR;
}
@@ -301,7 +301,7 @@
} else {
(void)parcel->writeInt32(0);
}
- (void)parcel->writeInt32(trackId);
+ (void)parcel->write(&portId, sizeof(audio_port_handle_t));
return NO_ERROR;
}
@@ -318,7 +318,7 @@
audio_io_handle_t inputId;
sp<IMemory> cblk;
sp<IMemory> buffers;
- int32_t trackId;
+ audio_port_handle_t portId;
};
// invariant on exit for all APIs that return an sp<>:
diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h
index fdd8d57..e5fcfb5 100644
--- a/media/libaudioclient/include/media/IAudioPolicyService.h
+++ b/media/libaudioclient/include/media/IAudioPolicyService.h
@@ -20,15 +20,14 @@
#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>
-
#include <utils/RefBase.h>
#include <utils/Errors.h>
#include <binder/IInterface.h>
#include <media/AudioSystem.h>
#include <media/AudioPolicy.h>
#include <media/IAudioPolicyServiceClient.h>
-
#include <system/audio_policy.h>
+#include <vector>
namespace android {
@@ -79,8 +78,7 @@
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId,
audio_port_handle_t *portId) = 0;
- virtual status_t startInput(audio_port_handle_t portId,
- bool *silenced) = 0;
+ virtual status_t startInput(audio_port_handle_t portId) = 0;
virtual status_t stopInput(audio_port_handle_t portId) = 0;
virtual void releaseInput(audio_port_handle_t portId) = 0;
virtual status_t initStreamVolume(audio_stream_type_t stream,
@@ -180,6 +178,9 @@
bool *surroundFormatsEnabled,
bool reported) = 0;
virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) = 0;
+
+ virtual status_t setAssistantUid(uid_t uid) = 0;
+ virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids) = 0;
};
diff --git a/media/libaudioclient/include/media/IAudioTrack.h b/media/libaudioclient/include/media/IAudioTrack.h
index 94afe3c..06e786d 100644
--- a/media/libaudioclient/include/media/IAudioTrack.h
+++ b/media/libaudioclient/include/media/IAudioTrack.h
@@ -70,6 +70,9 @@
/* Send parameters to the audio hardware */
virtual status_t setParameters(const String8& keyValuePairs) = 0;
+ /* Selects the presentation (if available) */
+ virtual status_t selectPresentation(int presentationId, int programId) = 0;
+
/* Return NO_ERROR if timestamp is valid. timestamp is undefined otherwise. */
virtual status_t getTimestamp(AudioTimestamp& timestamp) = 0;
diff --git a/media/libaudiohal/Android.bp b/media/libaudiohal/Android.bp
index 0ff0d4a..584c2c0 100644
--- a/media/libaudiohal/Android.bp
+++ b/media/libaudiohal/Android.bp
@@ -15,10 +15,13 @@
shared_libs: [
"android.hardware.audio.effect@2.0",
"android.hardware.audio.effect@4.0",
+ "android.hardware.audio.effect@5.0",
"android.hardware.audio@2.0",
"android.hardware.audio@4.0",
+ "android.hardware.audio@5.0",
"libaudiohal@2.0",
"libaudiohal@4.0",
+ "libaudiohal@5.0",
"libutils",
],
diff --git a/media/libaudiohal/DevicesFactoryHalInterface.cpp b/media/libaudiohal/DevicesFactoryHalInterface.cpp
index e631ace..f86009c 100644
--- a/media/libaudiohal/DevicesFactoryHalInterface.cpp
+++ b/media/libaudiohal/DevicesFactoryHalInterface.cpp
@@ -16,6 +16,7 @@
#include <android/hardware/audio/2.0/IDevicesFactory.h>
#include <android/hardware/audio/4.0/IDevicesFactory.h>
+#include <android/hardware/audio/5.0/IDevicesFactory.h>
#include <libaudiohal/FactoryHalHidl.h>
@@ -23,6 +24,9 @@
// static
sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() {
+ if (hardware::audio::V5_0::IDevicesFactory::getService() != nullptr) {
+ return V5_0::createDevicesFactoryHal();
+ }
if (hardware::audio::V4_0::IDevicesFactory::getService() != nullptr) {
return V4_0::createDevicesFactoryHal();
}
diff --git a/media/libaudiohal/EffectsFactoryHalInterface.cpp b/media/libaudiohal/EffectsFactoryHalInterface.cpp
index f7734a8..e21c235 100644
--- a/media/libaudiohal/EffectsFactoryHalInterface.cpp
+++ b/media/libaudiohal/EffectsFactoryHalInterface.cpp
@@ -16,6 +16,7 @@
#include <android/hardware/audio/effect/2.0/IEffectsFactory.h>
#include <android/hardware/audio/effect/4.0/IEffectsFactory.h>
+#include <android/hardware/audio/effect/5.0/IEffectsFactory.h>
#include <libaudiohal/FactoryHalHidl.h>
@@ -23,6 +24,9 @@
// static
sp<EffectsFactoryHalInterface> EffectsFactoryHalInterface::create() {
+ if (hardware::audio::effect::V5_0::IEffectsFactory::getService() != nullptr) {
+ return V5_0::createEffectsFactoryHal();
+ }
if (hardware::audio::effect::V4_0::IEffectsFactory::getService() != nullptr) {
return V4_0::createEffectsFactoryHal();
}
diff --git a/media/libaudiohal/impl/Android.bp b/media/libaudiohal/impl/Android.bp
index 3827336..88533da 100644
--- a/media/libaudiohal/impl/Android.bp
+++ b/media/libaudiohal/impl/Android.bp
@@ -25,12 +25,6 @@
],
shared_libs: [
"android.hardware.audio.common-util",
- "android.hardware.audio.common@2.0",
- "android.hardware.audio.common@4.0",
- "android.hardware.audio.effect@2.0",
- "android.hardware.audio.effect@4.0",
- "android.hardware.audio@2.0",
- "android.hardware.audio@4.0",
"android.hidl.allocator@1.0",
"android.hidl.memory@1.0",
"libaudiohal_deathhandler",
@@ -63,12 +57,15 @@
name: "libaudiohal@2.0",
defaults: ["libaudiohal_default"],
shared_libs: [
+ "android.hardware.audio.common@2.0",
"android.hardware.audio.common@2.0-util",
+ "android.hardware.audio.effect@2.0",
+ "android.hardware.audio@2.0",
],
cflags: [
"-DMAJOR_VERSION=2",
"-DMINOR_VERSION=0",
- "-include VersionMacro.h",
+ "-include common/all-versions/VersionMacro.h",
]
}
@@ -76,11 +73,30 @@
name: "libaudiohal@4.0",
defaults: ["libaudiohal_default"],
shared_libs: [
+ "android.hardware.audio.common@4.0",
"android.hardware.audio.common@4.0-util",
+ "android.hardware.audio.effect@4.0",
+ "android.hardware.audio@4.0",
],
cflags: [
"-DMAJOR_VERSION=4",
"-DMINOR_VERSION=0",
- "-include VersionMacro.h",
+ "-include common/all-versions/VersionMacro.h",
+ ]
+}
+
+cc_library_shared {
+ name: "libaudiohal@5.0",
+ defaults: ["libaudiohal_default"],
+ shared_libs: [
+ "android.hardware.audio.common@5.0",
+ "android.hardware.audio.common@5.0-util",
+ "android.hardware.audio.effect@5.0",
+ "android.hardware.audio@5.0",
+ ],
+ cflags: [
+ "-DMAJOR_VERSION=5",
+ "-DMINOR_VERSION=0",
+ "-include common/all-versions/VersionMacro.h",
]
}
diff --git a/media/libaudiohal/impl/ConversionHelperHidl.cpp b/media/libaudiohal/impl/ConversionHelperHidl.cpp
index 5d12fad..9747859 100644
--- a/media/libaudiohal/impl/ConversionHelperHidl.cpp
+++ b/media/libaudiohal/impl/ConversionHelperHidl.cpp
@@ -24,7 +24,7 @@
using ::android::hardware::audio::CPP_VERSION::Result;
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
using ::android::hardware::audio::CPP_VERSION::AudioMicrophoneChannelMapping;
using ::android::hardware::audio::CPP_VERSION::AudioMicrophoneDirectionality;
using ::android::hardware::audio::CPP_VERSION::AudioMicrophoneLocation;
@@ -109,7 +109,7 @@
ALOGE("%s %p %s: %s (from rpc)", mClassName, this, funcName, description);
}
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
// TODO: Use the same implementation in the hal when it moves to a util library.
static std::string deviceAddressToHal(const DeviceAddress& address) {
// HAL assumes that the address is NUL-terminated.
diff --git a/media/libaudiohal/impl/ConversionHelperHidl.h b/media/libaudiohal/impl/ConversionHelperHidl.h
index 1a9319f..fb3bb9d 100644
--- a/media/libaudiohal/impl/ConversionHelperHidl.h
+++ b/media/libaudiohal/impl/ConversionHelperHidl.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H
#define ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H
-#include <android/hardware/audio/2.0/types.h>
-#include <android/hardware/audio/4.0/types.h>
+#include PATH(android/hardware/audio/FILE_VERSION/types.h)
#include <hidl/HidlSupport.h>
#include <system/audio.h>
#include <utils/String8.h>
@@ -83,7 +82,7 @@
void emitError(const char* funcName, const char* description);
};
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
using ::android::hardware::audio::CPP_VERSION::MicrophoneInfo;
void microphoneInfoToHal(const MicrophoneInfo& src,
audio_microphone_characteristic_t *pDst);
diff --git a/media/libaudiohal/impl/DeviceHalHidl.cpp b/media/libaudiohal/impl/DeviceHalHidl.cpp
index 723e2eb..b3ff757 100644
--- a/media/libaudiohal/impl/DeviceHalHidl.cpp
+++ b/media/libaudiohal/impl/DeviceHalHidl.cpp
@@ -19,8 +19,7 @@
#define LOG_TAG "DeviceHalHidl"
//#define LOG_NDEBUG 0
-#include <android/hardware/audio/2.0/IPrimaryDevice.h>
-#include <android/hardware/audio/4.0/IPrimaryDevice.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IPrimaryDevice.h)
#include <cutils/native_handle.h>
#include <hwbinder/IPCThreadState.h>
#include <utils/Log.h>
@@ -42,7 +41,7 @@
using ::android::hardware::audio::common::CPP_VERSION::AudioMode;
using ::android::hardware::audio::common::CPP_VERSION::AudioSource;
using ::android::hardware::audio::common::CPP_VERSION::HidlUtils;
-using ::android::hardware::audio::common::utils::mkEnumConverter;
+using ::android::hardware::audio::common::utils::EnumBitfield;
using ::android::hardware::audio::CPP_VERSION::DeviceAddress;
using ::android::hardware::audio::CPP_VERSION::IPrimaryDevice;
using ::android::hardware::audio::CPP_VERSION::ParameterValue;
@@ -52,6 +51,8 @@
#if MAJOR_VERSION == 4
using ::android::hardware::audio::CPP_VERSION::SinkMetadata;
+#elif MAJOR_VERSION == 5
+using ::android::hardware::audio::common::CPP_VERSION::SinkMetadata;
#endif
namespace android {
@@ -262,8 +263,8 @@
handle,
hidlDevice,
hidlConfig,
- mkEnumConverter<AudioOutputFlag>(flags),
-#if MAJOR_VERSION == 4
+ EnumBitfield<AudioOutputFlag>(flags),
+#if MAJOR_VERSION >= 4
{} /* metadata */,
#endif
[&](Result r, const sp<IStreamOut>& result, const AudioConfig& suggestedConfig) {
@@ -293,7 +294,7 @@
Result retval = Result::NOT_INITIALIZED;
#if MAJOR_VERSION == 2
auto sourceMetadata = AudioSource(source);
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
// TODO: correctly propagate the tracks sources and volume
// for now, only send the main source at 1dbfs
SinkMetadata sourceMetadata = {{{AudioSource(source), 1}}};
@@ -302,7 +303,7 @@
handle,
hidlDevice,
hidlConfig,
- mkEnumConverter<AudioInputFlag>(flags),
+ EnumBitfield<AudioInputFlag>(flags),
sourceMetadata,
[&](Result r, const sp<IStreamIn>& result, const AudioConfig& suggestedConfig) {
retval = r;
@@ -375,7 +376,7 @@
if (mDevice == 0) return NO_INIT;
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
status_t DeviceHalHidl::getMicrophones(std::vector<media::MicrophoneInfo> *microphonesInfo) {
if (mDevice == 0) return NO_INIT;
Result retval;
diff --git a/media/libaudiohal/impl/DeviceHalHidl.h b/media/libaudiohal/impl/DeviceHalHidl.h
index fb5e7e7..291c88f 100644
--- a/media/libaudiohal/impl/DeviceHalHidl.h
+++ b/media/libaudiohal/impl/DeviceHalHidl.h
@@ -17,10 +17,8 @@
#ifndef ANDROID_HARDWARE_DEVICE_HAL_HIDL_H
#define ANDROID_HARDWARE_DEVICE_HAL_HIDL_H
-#include <android/hardware/audio/2.0/IDevice.h>
-#include <android/hardware/audio/4.0/IDevice.h>
-#include <android/hardware/audio/2.0/IPrimaryDevice.h>
-#include <android/hardware/audio/4.0/IPrimaryDevice.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IDevice.h)
+#include PATH(android/hardware/audio/FILE_VERSION/IPrimaryDevice.h)
#include <media/audiohal/DeviceHalInterface.h>
#include "ConversionHelperHidl.h"
diff --git a/media/libaudiohal/impl/DeviceHalLocal.cpp b/media/libaudiohal/impl/DeviceHalLocal.cpp
index 14e26f5..dffe9da 100644
--- a/media/libaudiohal/impl/DeviceHalLocal.cpp
+++ b/media/libaudiohal/impl/DeviceHalLocal.cpp
@@ -190,7 +190,7 @@
std::vector<media::MicrophoneInfo> *microphones __unused) {
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
status_t DeviceHalLocal::getMicrophones(std::vector<media::MicrophoneInfo> *microphones) {
if (mDev->get_microphones == NULL) return INVALID_OPERATION;
size_t actual_mics = AUDIO_MICROPHONE_MAX_COUNT;
diff --git a/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp b/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp
index 28001da..5e01e42 100644
--- a/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp
+++ b/media/libaudiohal/impl/DevicesFactoryHalHidl.cpp
@@ -20,8 +20,7 @@
#define LOG_TAG "DevicesFactoryHalHidl"
//#define LOG_NDEBUG 0
-#include <android/hardware/audio/2.0/IDevice.h>
-#include <android/hardware/audio/4.0/IDevice.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IDevice.h)
#include <media/audiohal/hidl/HalDeathHandler.h>
#include <utils/Log.h>
@@ -76,7 +75,7 @@
*status = BAD_VALUE;
return {};
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
static const char* idFromHal(const char *name, status_t* status) {
*status = OK;
return name;
diff --git a/media/libaudiohal/impl/DevicesFactoryHalHidl.h b/media/libaudiohal/impl/DevicesFactoryHalHidl.h
index a4282b0..27e0649 100644
--- a/media/libaudiohal/impl/DevicesFactoryHalHidl.h
+++ b/media/libaudiohal/impl/DevicesFactoryHalHidl.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_DEVICES_FACTORY_HAL_HIDL_H
#define ANDROID_HARDWARE_DEVICES_FACTORY_HAL_HIDL_H
-#include <android/hardware/audio/2.0/IDevicesFactory.h>
-#include <android/hardware/audio/4.0/IDevicesFactory.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IDevicesFactory.h)
#include <media/audiohal/DevicesFactoryHalInterface.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
diff --git a/media/libaudiohal/impl/EffectBufferHalHidl.h b/media/libaudiohal/impl/EffectBufferHalHidl.h
index 029d71a..0c99a02 100644
--- a/media/libaudiohal/impl/EffectBufferHalHidl.h
+++ b/media/libaudiohal/impl/EffectBufferHalHidl.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_EFFECT_BUFFER_HAL_HIDL_H
#define ANDROID_HARDWARE_EFFECT_BUFFER_HAL_HIDL_H
-#include <android/hardware/audio/effect/2.0/types.h>
-#include <android/hardware/audio/effect/4.0/types.h>
+#include PATH(android/hardware/audio/effect/FILE_VERSION/types.h)
#include <android/hidl/memory/1.0/IMemory.h>
#include <hidl/HidlSupport.h>
#include <media/audiohal/EffectBufferHalInterface.h>
diff --git a/media/libaudiohal/impl/EffectHalHidl.cpp b/media/libaudiohal/impl/EffectHalHidl.cpp
index 12649a1..7b867b4 100644
--- a/media/libaudiohal/impl/EffectHalHidl.cpp
+++ b/media/libaudiohal/impl/EffectHalHidl.cpp
@@ -34,7 +34,7 @@
using ::android::hardware::audio::common::CPP_VERSION::HidlUtils;
using ::android::hardware::audio::common::CPP_VERSION::AudioChannelMask;
using ::android::hardware::audio::common::CPP_VERSION::AudioFormat;
-using ::android::hardware::audio::common::utils::mkEnumConverter;
+using ::android::hardware::audio::common::utils::EnumBitfield;
using ::android::hardware::hidl_vec;
using ::android::hardware::MQDescriptorSync;
using ::android::hardware::Return;
@@ -77,10 +77,10 @@
void EffectHalHidl::effectBufferConfigFromHal(
const buffer_config_t& halConfig, EffectBufferConfig* config) {
config->samplingRateHz = halConfig.samplingRate;
- config->channels = mkEnumConverter<AudioChannelMask>(halConfig.channels);
+ config->channels = EnumBitfield<AudioChannelMask>(halConfig.channels);
config->format = AudioFormat(halConfig.format);
config->accessMode = EffectBufferAccess(halConfig.accessMode);
- config->mask = mkEnumConverter<EffectConfigParameters>(halConfig.mask);
+ config->mask = EnumBitfield<EffectConfigParameters>(halConfig.mask);
}
// static
diff --git a/media/libaudiohal/impl/EffectHalHidl.h b/media/libaudiohal/impl/EffectHalHidl.h
index 04f40d3..cd447ff 100644
--- a/media/libaudiohal/impl/EffectHalHidl.h
+++ b/media/libaudiohal/impl/EffectHalHidl.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_EFFECT_HAL_HIDL_H
#define ANDROID_HARDWARE_EFFECT_HAL_HIDL_H
-#include <android/hardware/audio/effect/2.0/IEffect.h>
-#include <android/hardware/audio/effect/4.0/IEffect.h>
+#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffect.h)
#include <media/audiohal/EffectHalInterface.h>
#include <fmq/EventFlag.h>
#include <fmq/MessageQueue.h>
diff --git a/media/libaudiohal/impl/EffectsFactoryHalHidl.h b/media/libaudiohal/impl/EffectsFactoryHalHidl.h
index c6fced7..7027153 100644
--- a/media/libaudiohal/impl/EffectsFactoryHalHidl.h
+++ b/media/libaudiohal/impl/EffectsFactoryHalHidl.h
@@ -17,10 +17,8 @@
#ifndef ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
#define ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
-#include <android/hardware/audio/effect/2.0/IEffectsFactory.h>
-#include <android/hardware/audio/effect/4.0/IEffectsFactory.h>
-#include <android/hardware/audio/effect/2.0/types.h>
-#include <android/hardware/audio/effect/4.0/types.h>
+#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
+#include PATH(android/hardware/audio/effect/FILE_VERSION/types.h)
#include <media/audiohal/EffectsFactoryHalInterface.h>
#include "ConversionHelperHidl.h"
diff --git a/media/libaudiohal/impl/StreamHalHidl.cpp b/media/libaudiohal/impl/StreamHalHidl.cpp
index bfa80e8..6b59f5c 100644
--- a/media/libaudiohal/impl/StreamHalHidl.cpp
+++ b/media/libaudiohal/impl/StreamHalHidl.cpp
@@ -17,9 +17,9 @@
#define LOG_TAG "StreamHalHidl"
//#define LOG_NDEBUG 0
-#include <android/hardware/audio/2.0/IStreamOutCallback.h>
-#include <android/hardware/audio/4.0/IStreamOutCallback.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IStreamOutCallback.h)
#include <hwbinder/IPCThreadState.h>
+#include <media/AudioParameter.h>
#include <mediautils/SchedulingPolicyService.h>
#include <utils/Log.h>
@@ -44,13 +44,23 @@
using ::android::hardware::Void;
using ReadCommand = ::android::hardware::audio::CPP_VERSION::IStreamIn::ReadCommand;
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
using ::android::hardware::audio::common::CPP_VERSION::AudioContentType;
using ::android::hardware::audio::common::CPP_VERSION::AudioSource;
using ::android::hardware::audio::common::CPP_VERSION::AudioUsage;
using ::android::hardware::audio::CPP_VERSION::MicrophoneInfo;
+#endif
+
+#if MAJOR_VERSION == 4
using ::android::hardware::audio::CPP_VERSION::PlaybackTrackMetadata;
using ::android::hardware::audio::CPP_VERSION::RecordTrackMetadata;
+using HalSinkMetadata = ::android::hardware::audio::CPP_VERSION::SinkMetadata;
+using HalSourceMetadata = ::android::hardware::audio::CPP_VERSION::SourceMetadata;
+#elif MAJOR_VERSION == 5
+using ::android::hardware::audio::common::CPP_VERSION::PlaybackTrackMetadata;
+using ::android::hardware::audio::common::CPP_VERSION::RecordTrackMetadata;
+using HalSinkMetadata = ::android::hardware::audio::common::CPP_VERSION::SinkMetadata;
+using HalSourceMetadata = ::android::hardware::audio::common::CPP_VERSION::SourceMetadata;
#endif
namespace android {
@@ -192,7 +202,7 @@
const native_handle *handle = hidlInfo.sharedMemory.handle();
if (handle->numFds > 0) {
info->shared_memory_fd = handle->data[0];
-#if MAJOR_VERSION == 4
+#if MAJOR_VERSION >= 4
info->flags = audio_mmap_buffer_flag(hidlInfo.flags);
#endif
info->buffer_size_frames = hidlInfo.bufferSizeFrames;
@@ -347,6 +357,24 @@
return processReturn("setVolume", mStream->setVolume(left, right));
}
+#if MAJOR_VERSION == 2
+status_t StreamOutHalHidl::selectPresentation(int presentationId, int programId) {
+ if (mStream == 0) return NO_INIT;
+ std::vector<ParameterValue> parameters;
+ String8 halParameters;
+ parameters.push_back({AudioParameter::keyPresentationId, std::to_string(presentationId)});
+ parameters.push_back({AudioParameter::keyProgramId, std::to_string(programId)});
+ parametersToHal(hidl_vec<ParameterValue>(parameters), &halParameters);
+ return setParameters(halParameters);
+}
+#elif MAJOR_VERSION >= 4
+status_t StreamOutHalHidl::selectPresentation(int presentationId, int programId) {
+ if (mStream == 0) return NO_INIT;
+ return processReturn("selectPresentation",
+ mStream->selectPresentation(presentationId, programId));
+}
+#endif
+
status_t StreamOutHalHidl::write(const void *buffer, size_t bytes, size_t *written) {
if (mStream == 0) return NO_INIT;
*written = 0;
@@ -585,7 +613,7 @@
// Audio HAL V2.0 does not support propagating source metadata
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
/** Transform a standard collection to an HIDL vector. */
template <class Values, class ElementConverter>
static auto transformToHidlVec(const Values& values, ElementConverter converter) {
@@ -596,7 +624,7 @@
}
status_t StreamOutHalHidl::updateSourceMetadata(const SourceMetadata& sourceMetadata) {
- hardware::audio::CPP_VERSION::SourceMetadata halMetadata = {
+ HalSourceMetadata halMetadata = {
.tracks = transformToHidlVec(sourceMetadata.tracks,
[](const playback_track_metadata& metadata) -> PlaybackTrackMetadata {
return {
@@ -815,7 +843,7 @@
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
status_t StreamInHalHidl::getActiveMicrophones(
std::vector<media::MicrophoneInfo> *microphonesInfo) {
if (!mStream) return NO_INIT;
@@ -835,7 +863,7 @@
}
status_t StreamInHalHidl::updateSinkMetadata(const SinkMetadata& sinkMetadata) {
- hardware::audio::CPP_VERSION::SinkMetadata halMetadata = {
+ HalSinkMetadata halMetadata = {
.tracks = transformToHidlVec(sinkMetadata.tracks,
[](const record_track_metadata& metadata) -> RecordTrackMetadata {
return {
diff --git a/media/libaudiohal/impl/StreamHalHidl.h b/media/libaudiohal/impl/StreamHalHidl.h
index 95ec7f1..f7b507e 100644
--- a/media/libaudiohal/impl/StreamHalHidl.h
+++ b/media/libaudiohal/impl/StreamHalHidl.h
@@ -19,12 +19,9 @@
#include <atomic>
-#include <android/hardware/audio/2.0/IStream.h>
-#include <android/hardware/audio/4.0/IStream.h>
-#include <android/hardware/audio/2.0/IStreamIn.h>
-#include <android/hardware/audio/4.0/IStreamIn.h>
-#include <android/hardware/audio/2.0/IStreamOut.h>
-#include <android/hardware/audio/4.0/IStreamOut.h>
+#include PATH(android/hardware/audio/FILE_VERSION/IStream.h)
+#include PATH(android/hardware/audio/FILE_VERSION/IStreamIn.h)
+#include PATH(android/hardware/audio/FILE_VERSION/IStreamOut.h)
#include <fmq/EventFlag.h>
#include <fmq/MessageQueue.h>
#include <media/audiohal/StreamHalInterface.h>
@@ -131,6 +128,9 @@
// Use this method in situations where audio mixing is done in the hardware.
virtual status_t setVolume(float left, float right);
+ // Selects the audio presentation (if available).
+ virtual status_t selectPresentation(int presentationId, int programId);
+
// Write audio buffer to driver.
virtual status_t write(const void *buffer, size_t bytes, size_t *written);
diff --git a/media/libaudiohal/impl/StreamHalLocal.cpp b/media/libaudiohal/impl/StreamHalLocal.cpp
index b134f57..26d30d4 100644
--- a/media/libaudiohal/impl/StreamHalLocal.cpp
+++ b/media/libaudiohal/impl/StreamHalLocal.cpp
@@ -18,6 +18,7 @@
//#define LOG_NDEBUG 0
#include <hardware/audio.h>
+#include <media/AudioParameter.h>
#include <utils/Log.h>
#include "DeviceHalLocal.h"
@@ -138,6 +139,13 @@
return mStream->set_volume(mStream, left, right);
}
+status_t StreamOutHalLocal::selectPresentation(int presentationId, int programId) {
+ AudioParameter param;
+ param.addInt(String8(AudioParameter::keyPresentationId), presentationId);
+ param.addInt(String8(AudioParameter::keyProgramId), programId);
+ return setParameters(param.toString());
+}
+
status_t StreamOutHalLocal::write(const void *buffer, size_t bytes, size_t *written) {
ssize_t writeResult = mStream->write(mStream, buffer, bytes);
if (writeResult > 0) {
@@ -346,7 +354,7 @@
std::vector<media::MicrophoneInfo> *microphones __unused) {
return INVALID_OPERATION;
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
status_t StreamInHalLocal::getActiveMicrophones(std::vector<media::MicrophoneInfo> *microphones) {
if (mStream->get_active_microphones == NULL) return INVALID_OPERATION;
size_t actual_mics = AUDIO_MICROPHONE_MAX_COUNT;
diff --git a/media/libaudiohal/impl/StreamHalLocal.h b/media/libaudiohal/impl/StreamHalLocal.h
index cea4229..4fd1960 100644
--- a/media/libaudiohal/impl/StreamHalLocal.h
+++ b/media/libaudiohal/impl/StreamHalLocal.h
@@ -103,6 +103,9 @@
// Use this method in situations where audio mixing is done in the hardware.
virtual status_t setVolume(float left, float right);
+ // Selects the audio presentation (if available).
+ virtual status_t selectPresentation(int presentationId, int programId);
+
// Write audio buffer to driver.
virtual status_t write(const void *buffer, size_t bytes, size_t *written);
diff --git a/media/libaudiohal/impl/VersionMacro.h b/media/libaudiohal/impl/VersionMacro.h
deleted file mode 100644
index 98e9c07..0000000
--- a/media/libaudiohal/impl/VersionMacro.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_HARDWARE_VERSION_MACRO_H
-#define ANDROID_HARDWARE_VERSION_MACRO_H
-
-#if !defined(MAJOR_VERSION) || !defined(MINOR_VERSION)
-#error "MAJOR_VERSION and MINOR_VERSION must be defined"
-#endif
-
-#define CONCAT_3(a,b,c) a##b##c
-#define EXPAND_CONCAT_3(a,b,c) CONCAT_3(a,b,c)
-/** The directory name of the version: <major>.<minor> */
-#define FILE_VERSION EXPAND_CONCAT_3(MAJOR_VERSION,.,MINOR_VERSION)
-
-#define CONCAT_4(a,b,c,d) a##b##c##d
-#define EXPAND_CONCAT_4(a,b,c,d) CONCAT_4(a,b,c,d)
-/** The c++ namespace of the version: V<major>_<minor> */
-#define CPP_VERSION EXPAND_CONCAT_4(V,MAJOR_VERSION,_,MINOR_VERSION)
-
-#endif // ANDROID_HARDWARE_VERSION_MACRO_H
diff --git a/media/libaudiohal/impl/VersionUtils.h b/media/libaudiohal/impl/VersionUtils.h
index 5004895..eb0a42a 100644
--- a/media/libaudiohal/impl/VersionUtils.h
+++ b/media/libaudiohal/impl/VersionUtils.h
@@ -17,8 +17,7 @@
#ifndef ANDROID_HARDWARE_VERSION_UTILS_H
#define ANDROID_HARDWARE_VERSION_UTILS_H
-#include <android/hardware/audio/2.0/types.h>
-#include <android/hardware/audio/4.0/types.h>
+#include PATH(android/hardware/audio/FILE_VERSION/types.h)
#include <hidl/HidlSupport.h>
using ::android::hardware::audio::CPP_VERSION::ParameterValue;
@@ -43,7 +42,7 @@
hidl_vec<ParameterValue> keys) {
return object->setParameters(keys);
}
-#elif MAJOR_VERSION == 4
+#elif MAJOR_VERSION >= 4
template <class T, class Callback>
Return<void> getParameters(T& object, hidl_vec<ParameterValue> context,
hidl_vec<hidl_string> keys, Callback callback) {
diff --git a/media/libaudiohal/impl/include/libaudiohal/FactoryHalHidl.h b/media/libaudiohal/impl/include/libaudiohal/FactoryHalHidl.h
index fa0effc..1d912a0 100644
--- a/media/libaudiohal/impl/include/libaudiohal/FactoryHalHidl.h
+++ b/media/libaudiohal/impl/include/libaudiohal/FactoryHalHidl.h
@@ -35,6 +35,11 @@
sp<DevicesFactoryHalInterface> createDevicesFactoryHal();
} // namespace V4_0
+namespace V5_0 {
+sp<EffectsFactoryHalInterface> createEffectsFactoryHal();
+sp<DevicesFactoryHalInterface> createDevicesFactoryHal();
+} // namespace V5_0
+
} // namespace android
#endif // ANDROID_HARDWARE_FACTORY_HAL_HIDL_H
diff --git a/media/libaudiohal/include/media/audiohal/StreamHalInterface.h b/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
index c969e28..bd71dc0 100644
--- a/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
+++ b/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
@@ -109,6 +109,9 @@
// Use this method in situations where audio mixing is done in the hardware.
virtual status_t setVolume(float left, float right) = 0;
+ // Selects the audio presentation (if available).
+ virtual status_t selectPresentation(int presentationId, int programId) = 0;
+
// Write audio buffer to driver.
virtual status_t write(const void *buffer, size_t bytes, size_t *written) = 0;
diff --git a/media/libaudioprocessing/AudioResamplerSinc.cpp b/media/libaudioprocessing/AudioResamplerSinc.cpp
index 320b8cf..5a03a0d 100644
--- a/media/libaudioprocessing/AudioResamplerSinc.cpp
+++ b/media/libaudioprocessing/AudioResamplerSinc.cpp
@@ -19,6 +19,7 @@
#define __STDC_CONSTANT_MACROS
#include <malloc.h>
+#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <dlfcn.h>
diff --git a/media/libeffects/Android.bp b/media/libeffects/Android.bp
deleted file mode 100644
index 0dd3f17..0000000
--- a/media/libeffects/Android.bp
+++ /dev/null
@@ -1 +0,0 @@
-subdirs = ["factory", "config"]
diff --git a/media/libeffects/downmix/Android.bp b/media/libeffects/downmix/Android.bp
new file mode 100644
index 0000000..227f2a1
--- /dev/null
+++ b/media/libeffects/downmix/Android.bp
@@ -0,0 +1,27 @@
+// Multichannel downmix effect library
+cc_library_shared {
+ name: "libdownmix",
+
+ vendor: true,
+ srcs: ["EffectDownmix.c"],
+
+ shared_libs: [
+ "libcutils",
+ "liblog",
+ ],
+
+ relative_install_path: "soundfx",
+
+ cflags: [
+ //"-DBUILD_FLOAT",
+ "-fvisibility=hidden",
+ "-Wall",
+ "-Werror",
+ ],
+
+ header_libs: [
+ "libaudioeffects",
+ "libhardware_headers",
+ ],
+ static_libs: ["libaudioutils" ],
+}
diff --git a/media/libeffects/downmix/Android.mk b/media/libeffects/downmix/Android.mk
deleted file mode 100644
index a5fbf14..0000000
--- a/media/libeffects/downmix/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# Multichannel downmix effect library
-include $(CLEAR_VARS)
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_SRC_FILES:= \
- EffectDownmix.c
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils liblog
-
-LOCAL_MODULE:= libdownmix
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE_RELATIVE_PATH := soundfx
-
-LOCAL_C_INCLUDES := \
- $(call include-path-for, audio-effects) \
- $(call include-path-for, audio-utils)
-
-#-DBUILD_FLOAT
-LOCAL_CFLAGS += -fvisibility=hidden
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_HEADER_LIBRARIES += libhardware_headers
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libeffects/dynamicsproc/Android.bp b/media/libeffects/dynamicsproc/Android.bp
new file mode 100644
index 0000000..eafc483
--- /dev/null
+++ b/media/libeffects/dynamicsproc/Android.bp
@@ -0,0 +1,46 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// DynamicsProcessing library
+cc_library_shared {
+ name: "libdynproc",
+
+ vendor: true,
+
+ srcs: [
+ "EffectDynamicsProcessing.cpp",
+ "dsp/DPBase.cpp",
+ "dsp/DPFrequency.cpp",
+ ],
+
+ cflags: [
+ "-O2",
+ "-fvisibility=hidden",
+
+ "-Wall",
+ "-Werror",
+ ],
+
+ shared_libs: [
+ "libcutils",
+ "liblog",
+ ],
+
+ relative_install_path: "soundfx",
+
+ header_libs: [
+ "libaudioeffects",
+ "libeigen",
+ ],
+}
diff --git a/media/libeffects/dynamicsproc/Android.mk b/media/libeffects/dynamicsproc/Android.mk
deleted file mode 100644
index 7be0c49..0000000
--- a/media/libeffects/dynamicsproc/Android.mk
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (C) 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-# DynamicsProcessing library
-include $(CLEAR_VARS)
-
-LOCAL_VENDOR_MODULE := true
-
-EIGEN_PATH := external/eigen
-LOCAL_C_INCLUDES += $(EIGEN_PATH)
-
-LOCAL_SRC_FILES:= \
- EffectDynamicsProcessing.cpp \
- dsp/DPBase.cpp \
- dsp/DPFrequency.cpp
-
-LOCAL_CFLAGS+= -O2 -fvisibility=hidden
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- liblog \
-
-LOCAL_MODULE_RELATIVE_PATH := soundfx
-LOCAL_MODULE:= libdynproc
-
-LOCAL_HEADER_LIBRARIES := \
- libaudioeffects
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libeffects/loudness/Android.bp b/media/libeffects/loudness/Android.bp
new file mode 100644
index 0000000..5a13af6
--- /dev/null
+++ b/media/libeffects/loudness/Android.bp
@@ -0,0 +1,27 @@
+// LoudnessEnhancer library
+cc_library_shared {
+ name: "libldnhncr",
+
+ vendor: true,
+ srcs: [
+ "EffectLoudnessEnhancer.cpp",
+ "dsp/core/dynamic_range_compression.cpp",
+ ],
+
+ cflags: [
+ "-O2",
+ "-fvisibility=hidden",
+
+ "-Wall",
+ "-Werror",
+ ],
+
+ shared_libs: [
+ "libcutils",
+ "liblog",
+ ],
+
+ relative_install_path: "soundfx",
+
+ header_libs: ["libaudioeffects"],
+}
diff --git a/media/libeffects/loudness/Android.mk b/media/libeffects/loudness/Android.mk
deleted file mode 100644
index 712cbd5..0000000
--- a/media/libeffects/loudness/Android.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# LoudnessEnhancer library
-include $(CLEAR_VARS)
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_SRC_FILES:= \
- EffectLoudnessEnhancer.cpp \
- dsp/core/dynamic_range_compression.cpp
-
-LOCAL_CFLAGS+= -O2 -fvisibility=hidden
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- liblog \
-
-LOCAL_MODULE_RELATIVE_PATH := soundfx
-LOCAL_MODULE:= libldnhncr
-
-LOCAL_HEADER_LIBRARIES := \
- libaudioeffects
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libeffects/lvm/lib/Android.bp b/media/libeffects/lvm/lib/Android.bp
new file mode 100644
index 0000000..5c57c43
--- /dev/null
+++ b/media/libeffects/lvm/lib/Android.bp
@@ -0,0 +1,211 @@
+// Music bundle
+cc_library_static {
+ name: "libmusicbundle",
+
+ arch: {
+ arm: {
+ instruction_set: "arm",
+ },
+ },
+
+ vendor: true,
+ srcs: [
+ "StereoWidening/src/LVCS_BypassMix.c",
+ "StereoWidening/src/LVCS_Control.c",
+ "StereoWidening/src/LVCS_Equaliser.c",
+ "StereoWidening/src/LVCS_Init.c",
+ "StereoWidening/src/LVCS_Process.c",
+ "StereoWidening/src/LVCS_ReverbGenerator.c",
+ "StereoWidening/src/LVCS_StereoEnhancer.c",
+ "StereoWidening/src/LVCS_Tables.c",
+ "Bass/src/LVDBE_Control.c",
+ "Bass/src/LVDBE_Init.c",
+ "Bass/src/LVDBE_Process.c",
+ "Bass/src/LVDBE_Tables.c",
+ "Bundle/src/LVM_API_Specials.c",
+ "Bundle/src/LVM_Buffers.c",
+ "Bundle/src/LVM_Init.c",
+ "Bundle/src/LVM_Process.c",
+ "Bundle/src/LVM_Tables.c",
+ "Bundle/src/LVM_Control.c",
+ "SpectrumAnalyzer/src/LVPSA_Control.c",
+ "SpectrumAnalyzer/src/LVPSA_Init.c",
+ "SpectrumAnalyzer/src/LVPSA_Memory.c",
+ "SpectrumAnalyzer/src/LVPSA_Process.c",
+ "SpectrumAnalyzer/src/LVPSA_QPD_Init.c",
+ "SpectrumAnalyzer/src/LVPSA_QPD_Process.c",
+ "SpectrumAnalyzer/src/LVPSA_Tables.c",
+ "Eq/src/LVEQNB_CalcCoef.c",
+ "Eq/src/LVEQNB_Control.c",
+ "Eq/src/LVEQNB_Init.c",
+ "Eq/src/LVEQNB_Process.c",
+ "Eq/src/LVEQNB_Tables.c",
+ "Common/src/InstAlloc.c",
+ "Common/src/DC_2I_D16_TRC_WRA_01.c",
+ "Common/src/DC_2I_D16_TRC_WRA_01_Init.c",
+ "Common/src/FO_2I_D16F32C15_LShx_TRC_WRA_01.c",
+ "Common/src/FO_2I_D16F32Css_LShx_TRC_WRA_01_Init.c",
+ "Common/src/FO_1I_D16F16C15_TRC_WRA_01.c",
+ "Common/src/FO_1I_D16F16Css_TRC_WRA_01_Init.c",
+ "Common/src/BP_1I_D16F32C30_TRC_WRA_01.c",
+ "Common/src/BP_1I_D16F16C14_TRC_WRA_01.c",
+ "Common/src/BP_1I_D32F32C30_TRC_WRA_02.c",
+ "Common/src/BP_1I_D16F16Css_TRC_WRA_01_Init.c",
+ "Common/src/BP_1I_D16F32Cll_TRC_WRA_01_Init.c",
+ "Common/src/BP_1I_D32F32Cll_TRC_WRA_02_Init.c",
+ "Common/src/BQ_2I_D32F32Cll_TRC_WRA_01_Init.c",
+ "Common/src/BQ_2I_D32F32C30_TRC_WRA_01.c",
+ "Common/src/BQ_2I_D16F32C15_TRC_WRA_01.c",
+ "Common/src/BQ_2I_D16F32C14_TRC_WRA_01.c",
+ "Common/src/BQ_2I_D16F32C13_TRC_WRA_01.c",
+ "Common/src/BQ_2I_D16F32Css_TRC_WRA_01_init.c",
+ "Common/src/BQ_2I_D16F16C15_TRC_WRA_01.c",
+ "Common/src/BQ_2I_D16F16C14_TRC_WRA_01.c",
+ "Common/src/BQ_2I_D16F16Css_TRC_WRA_01_Init.c",
+ "Common/src/BQ_1I_D16F16C15_TRC_WRA_01.c",
+ "Common/src/BQ_1I_D16F16Css_TRC_WRA_01_Init.c",
+ "Common/src/BQ_1I_D16F32C14_TRC_WRA_01.c",
+ "Common/src/BQ_1I_D16F32Css_TRC_WRA_01_init.c",
+ "Common/src/PK_2I_D32F32C30G11_TRC_WRA_01.c",
+ "Common/src/PK_2I_D32F32C14G11_TRC_WRA_01.c",
+ "Common/src/PK_2I_D32F32CssGss_TRC_WRA_01_Init.c",
+ "Common/src/PK_2I_D32F32CllGss_TRC_WRA_01_Init.c",
+ "Common/src/Int16LShiftToInt32_16x32.c",
+ "Common/src/From2iToMono_16.c",
+ "Common/src/Copy_16.c",
+ "Common/src/MonoTo2I_16.c",
+ "Common/src/MonoTo2I_32.c",
+ "Common/src/LoadConst_16.c",
+ "Common/src/LoadConst_32.c",
+ "Common/src/dB_to_Lin32.c",
+ "Common/src/Shift_Sat_v16xv16.c",
+ "Common/src/Shift_Sat_v32xv32.c",
+ "Common/src/Abs_32.c",
+ "Common/src/Int32RShiftToInt16_Sat_32x16.c",
+ "Common/src/From2iToMono_32.c",
+ "Common/src/mult3s_16x16.c",
+ "Common/src/Mult3s_32x16.c",
+ "Common/src/NonLinComp_D16.c",
+ "Common/src/DelayMix_16x16.c",
+ "Common/src/MSTo2i_Sat_16x16.c",
+ "Common/src/From2iToMS_16x16.c",
+ "Common/src/Mac3s_Sat_16x16.c",
+ "Common/src/Mac3s_Sat_32x16.c",
+ "Common/src/Add2_Sat_16x16.c",
+ "Common/src/Add2_Sat_32x32.c",
+ "Common/src/LVC_MixSoft_1St_2i_D16C31_SAT.c",
+ "Common/src/LVC_MixSoft_1St_D16C31_SAT.c",
+ "Common/src/LVC_Mixer_VarSlope_SetTimeConstant.c",
+ "Common/src/LVC_Mixer_SetTimeConstant.c",
+ "Common/src/LVC_Mixer_SetTarget.c",
+ "Common/src/LVC_Mixer_GetTarget.c",
+ "Common/src/LVC_Mixer_Init.c",
+ "Common/src/LVC_Core_MixHard_1St_2i_D16C31_SAT.c",
+ "Common/src/LVC_Core_MixSoft_1St_2i_D16C31_WRA.c",
+ "Common/src/LVC_Core_MixInSoft_D16C31_SAT.c",
+ "Common/src/LVC_Mixer_GetCurrent.c",
+ "Common/src/LVC_MixSoft_2St_D16C31_SAT.c",
+ "Common/src/LVC_Core_MixSoft_1St_D16C31_WRA.c",
+ "Common/src/LVC_Core_MixHard_2St_D16C31_SAT.c",
+ "Common/src/LVC_MixInSoft_D16C31_SAT.c",
+ "Common/src/AGC_MIX_VOL_2St1Mon_D32_WRA.c",
+ "Common/src/LVM_Timer.c",
+ "Common/src/LVM_Timer_Init.c",
+ ],
+
+ local_include_dirs: [
+ "Eq/lib",
+ "Eq/src",
+ "Bass/lib",
+ "Bass/src",
+ "Common/src",
+ "Bundle/src",
+ "SpectrumAnalyzer/lib",
+ "SpectrumAnalyzer/src",
+ "StereoWidening/src",
+ "StereoWidening/lib",
+ ],
+ export_include_dirs: [
+ "Common/lib",
+ "Bundle/lib",
+ ],
+
+ cflags: [
+ "-fvisibility=hidden",
+ "-DBUILD_FLOAT",
+ "-DHIGHER_FS",
+
+ "-Wall",
+ "-Werror",
+ ],
+
+}
+
+// Reverb library
+cc_library_static {
+ name: "libreverb",
+
+ arch: {
+ arm: {
+ instruction_set: "arm",
+ },
+ },
+
+ vendor: true,
+ srcs: [
+ "Reverb/src/LVREV_ApplyNewSettings.c",
+ "Reverb/src/LVREV_ClearAudioBuffers.c",
+ "Reverb/src/LVREV_GetControlParameters.c",
+ "Reverb/src/LVREV_GetInstanceHandle.c",
+ "Reverb/src/LVREV_GetMemoryTable.c",
+ "Reverb/src/LVREV_Process.c",
+ "Reverb/src/LVREV_SetControlParameters.c",
+ "Reverb/src/LVREV_Tables.c",
+ "Common/src/Abs_32.c",
+ "Common/src/InstAlloc.c",
+ "Common/src/LoadConst_16.c",
+ "Common/src/LoadConst_32.c",
+ "Common/src/From2iToMono_32.c",
+ "Common/src/Mult3s_32x16.c",
+ "Common/src/FO_1I_D32F32C31_TRC_WRA_01.c",
+ "Common/src/FO_1I_D32F32Cll_TRC_WRA_01_Init.c",
+ "Common/src/DelayAllPass_Sat_32x16To32.c",
+ "Common/src/Copy_16.c",
+ "Common/src/Mac3s_Sat_32x16.c",
+ "Common/src/DelayWrite_32.c",
+ "Common/src/Shift_Sat_v32xv32.c",
+ "Common/src/Add2_Sat_32x32.c",
+ "Common/src/JoinTo2i_32x32.c",
+ "Common/src/MonoTo2I_32.c",
+ "Common/src/LVM_FO_HPF.c",
+ "Common/src/LVM_FO_LPF.c",
+ "Common/src/LVM_Polynomial.c",
+ "Common/src/LVM_Power10.c",
+ "Common/src/LVM_GetOmega.c",
+ "Common/src/MixSoft_2St_D32C31_SAT.c",
+ "Common/src/MixSoft_1St_D32C31_WRA.c",
+ "Common/src/MixInSoft_D32C31_SAT.c",
+ "Common/src/LVM_Mixer_TimeConstant.c",
+ "Common/src/Core_MixHard_2St_D32C31_SAT.c",
+ "Common/src/Core_MixSoft_1St_D32C31_WRA.c",
+ "Common/src/Core_MixInSoft_D32C31_SAT.c",
+ ],
+
+ local_include_dirs: [
+ "Reverb/src",
+ "Common/src",
+ ],
+ export_include_dirs: [
+ "Reverb/lib",
+ "Common/lib",
+ ],
+
+ cflags: [
+ "-fvisibility=hidden",
+ "-DBUILD_FLOAT",
+ "-DHIGHER_FS",
+
+ "-Wall",
+ "-Werror",
+ ],
+}
diff --git a/media/libeffects/lvm/lib/Android.mk b/media/libeffects/lvm/lib/Android.mk
deleted file mode 100644
index 941eb3e..0000000
--- a/media/libeffects/lvm/lib/Android.mk
+++ /dev/null
@@ -1,191 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# Music bundle
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_SRC_FILES:= \
- StereoWidening/src/LVCS_BypassMix.c \
- StereoWidening/src/LVCS_Control.c \
- StereoWidening/src/LVCS_Equaliser.c \
- StereoWidening/src/LVCS_Init.c \
- StereoWidening/src/LVCS_Process.c \
- StereoWidening/src/LVCS_ReverbGenerator.c \
- StereoWidening/src/LVCS_StereoEnhancer.c \
- StereoWidening/src/LVCS_Tables.c \
- Bass/src/LVDBE_Control.c \
- Bass/src/LVDBE_Init.c \
- Bass/src/LVDBE_Process.c \
- Bass/src/LVDBE_Tables.c \
- Bundle/src/LVM_API_Specials.c \
- Bundle/src/LVM_Buffers.c \
- Bundle/src/LVM_Init.c \
- Bundle/src/LVM_Process.c \
- Bundle/src/LVM_Tables.c \
- Bundle/src/LVM_Control.c \
- SpectrumAnalyzer/src/LVPSA_Control.c \
- SpectrumAnalyzer/src/LVPSA_Init.c \
- SpectrumAnalyzer/src/LVPSA_Memory.c \
- SpectrumAnalyzer/src/LVPSA_Process.c \
- SpectrumAnalyzer/src/LVPSA_QPD_Init.c \
- SpectrumAnalyzer/src/LVPSA_QPD_Process.c \
- SpectrumAnalyzer/src/LVPSA_Tables.c \
- Eq/src/LVEQNB_CalcCoef.c \
- Eq/src/LVEQNB_Control.c \
- Eq/src/LVEQNB_Init.c \
- Eq/src/LVEQNB_Process.c \
- Eq/src/LVEQNB_Tables.c \
- Common/src/InstAlloc.c \
- Common/src/DC_2I_D16_TRC_WRA_01.c \
- Common/src/DC_2I_D16_TRC_WRA_01_Init.c \
- Common/src/FO_2I_D16F32C15_LShx_TRC_WRA_01.c \
- Common/src/FO_2I_D16F32Css_LShx_TRC_WRA_01_Init.c \
- Common/src/FO_1I_D16F16C15_TRC_WRA_01.c \
- Common/src/FO_1I_D16F16Css_TRC_WRA_01_Init.c \
- Common/src/BP_1I_D16F32C30_TRC_WRA_01.c \
- Common/src/BP_1I_D16F16C14_TRC_WRA_01.c \
- Common/src/BP_1I_D32F32C30_TRC_WRA_02.c \
- Common/src/BP_1I_D16F16Css_TRC_WRA_01_Init.c \
- Common/src/BP_1I_D16F32Cll_TRC_WRA_01_Init.c \
- Common/src/BP_1I_D32F32Cll_TRC_WRA_02_Init.c \
- Common/src/BQ_2I_D32F32Cll_TRC_WRA_01_Init.c \
- Common/src/BQ_2I_D32F32C30_TRC_WRA_01.c \
- Common/src/BQ_2I_D16F32C15_TRC_WRA_01.c \
- Common/src/BQ_2I_D16F32C14_TRC_WRA_01.c \
- Common/src/BQ_2I_D16F32C13_TRC_WRA_01.c \
- Common/src/BQ_2I_D16F32Css_TRC_WRA_01_init.c \
- Common/src/BQ_2I_D16F16C15_TRC_WRA_01.c \
- Common/src/BQ_2I_D16F16C14_TRC_WRA_01.c \
- Common/src/BQ_2I_D16F16Css_TRC_WRA_01_Init.c \
- Common/src/BQ_1I_D16F16C15_TRC_WRA_01.c \
- Common/src/BQ_1I_D16F16Css_TRC_WRA_01_Init.c \
- Common/src/BQ_1I_D16F32C14_TRC_WRA_01.c \
- Common/src/BQ_1I_D16F32Css_TRC_WRA_01_init.c \
- Common/src/PK_2I_D32F32C30G11_TRC_WRA_01.c \
- Common/src/PK_2I_D32F32C14G11_TRC_WRA_01.c \
- Common/src/PK_2I_D32F32CssGss_TRC_WRA_01_Init.c \
- Common/src/PK_2I_D32F32CllGss_TRC_WRA_01_Init.c \
- Common/src/Int16LShiftToInt32_16x32.c \
- Common/src/From2iToMono_16.c \
- Common/src/Copy_16.c \
- Common/src/MonoTo2I_16.c \
- Common/src/MonoTo2I_32.c \
- Common/src/LoadConst_16.c \
- Common/src/LoadConst_32.c \
- Common/src/dB_to_Lin32.c \
- Common/src/Shift_Sat_v16xv16.c \
- Common/src/Shift_Sat_v32xv32.c \
- Common/src/Abs_32.c \
- Common/src/Int32RShiftToInt16_Sat_32x16.c \
- Common/src/From2iToMono_32.c \
- Common/src/mult3s_16x16.c \
- Common/src/Mult3s_32x16.c \
- Common/src/NonLinComp_D16.c \
- Common/src/DelayMix_16x16.c \
- Common/src/MSTo2i_Sat_16x16.c \
- Common/src/From2iToMS_16x16.c \
- Common/src/Mac3s_Sat_16x16.c \
- Common/src/Mac3s_Sat_32x16.c \
- Common/src/Add2_Sat_16x16.c \
- Common/src/Add2_Sat_32x32.c \
- Common/src/LVC_MixSoft_1St_2i_D16C31_SAT.c \
- Common/src/LVC_MixSoft_1St_D16C31_SAT.c \
- Common/src/LVC_Mixer_VarSlope_SetTimeConstant.c \
- Common/src/LVC_Mixer_SetTimeConstant.c \
- Common/src/LVC_Mixer_SetTarget.c \
- Common/src/LVC_Mixer_GetTarget.c \
- Common/src/LVC_Mixer_Init.c \
- Common/src/LVC_Core_MixHard_1St_2i_D16C31_SAT.c \
- Common/src/LVC_Core_MixSoft_1St_2i_D16C31_WRA.c \
- Common/src/LVC_Core_MixInSoft_D16C31_SAT.c \
- Common/src/LVC_Mixer_GetCurrent.c \
- Common/src/LVC_MixSoft_2St_D16C31_SAT.c \
- Common/src/LVC_Core_MixSoft_1St_D16C31_WRA.c \
- Common/src/LVC_Core_MixHard_2St_D16C31_SAT.c \
- Common/src/LVC_MixInSoft_D16C31_SAT.c \
- Common/src/AGC_MIX_VOL_2St1Mon_D32_WRA.c \
- Common/src/LVM_Timer.c \
- Common/src/LVM_Timer_Init.c
-
-LOCAL_MODULE:= libmusicbundle
-
-LOCAL_C_INCLUDES += \
- $(LOCAL_PATH)/Eq/lib \
- $(LOCAL_PATH)/Eq/src \
- $(LOCAL_PATH)/Bass/lib \
- $(LOCAL_PATH)/Bass/src \
- $(LOCAL_PATH)/Common/lib \
- $(LOCAL_PATH)/Common/src \
- $(LOCAL_PATH)/Bundle/lib \
- $(LOCAL_PATH)/Bundle/src \
- $(LOCAL_PATH)/SpectrumAnalyzer/lib \
- $(LOCAL_PATH)/SpectrumAnalyzer/src \
- $(LOCAL_PATH)/StereoWidening/src \
- $(LOCAL_PATH)/StereoWidening/lib
-
-LOCAL_CFLAGS += -fvisibility=hidden -DBUILD_FLOAT -DHIGHER_FS
-LOCAL_CFLAGS += -Wall -Werror
-
-include $(BUILD_STATIC_LIBRARY)
-
-
-
-# Reverb library
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_SRC_FILES:= \
- Reverb/src/LVREV_ApplyNewSettings.c \
- Reverb/src/LVREV_ClearAudioBuffers.c \
- Reverb/src/LVREV_GetControlParameters.c \
- Reverb/src/LVREV_GetInstanceHandle.c \
- Reverb/src/LVREV_GetMemoryTable.c \
- Reverb/src/LVREV_Process.c \
- Reverb/src/LVREV_SetControlParameters.c \
- Reverb/src/LVREV_Tables.c \
- Common/src/Abs_32.c \
- Common/src/InstAlloc.c \
- Common/src/LoadConst_16.c \
- Common/src/LoadConst_32.c \
- Common/src/From2iToMono_32.c \
- Common/src/Mult3s_32x16.c \
- Common/src/FO_1I_D32F32C31_TRC_WRA_01.c \
- Common/src/FO_1I_D32F32Cll_TRC_WRA_01_Init.c \
- Common/src/DelayAllPass_Sat_32x16To32.c \
- Common/src/Copy_16.c \
- Common/src/Mac3s_Sat_32x16.c \
- Common/src/DelayWrite_32.c \
- Common/src/Shift_Sat_v32xv32.c \
- Common/src/Add2_Sat_32x32.c \
- Common/src/JoinTo2i_32x32.c \
- Common/src/MonoTo2I_32.c \
- Common/src/LVM_FO_HPF.c \
- Common/src/LVM_FO_LPF.c \
- Common/src/LVM_Polynomial.c \
- Common/src/LVM_Power10.c \
- Common/src/LVM_GetOmega.c \
- Common/src/MixSoft_2St_D32C31_SAT.c \
- Common/src/MixSoft_1St_D32C31_WRA.c \
- Common/src/MixInSoft_D32C31_SAT.c \
- Common/src/LVM_Mixer_TimeConstant.c \
- Common/src/Core_MixHard_2St_D32C31_SAT.c \
- Common/src/Core_MixSoft_1St_D32C31_WRA.c \
- Common/src/Core_MixInSoft_D32C31_SAT.c
-
-LOCAL_MODULE:= libreverb
-
-LOCAL_C_INCLUDES += \
- $(LOCAL_PATH)/Reverb/lib \
- $(LOCAL_PATH)/Reverb/src \
- $(LOCAL_PATH)/Common/lib \
- $(LOCAL_PATH)/Common/src
-
-LOCAL_CFLAGS += -fvisibility=hidden -DBUILD_FLOAT -DHIGHER_FS
-LOCAL_CFLAGS += -Wall -Werror
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libeffects/lvm/wrapper/Android.bp b/media/libeffects/lvm/wrapper/Android.bp
new file mode 100644
index 0000000..10fd970
--- /dev/null
+++ b/media/libeffects/lvm/wrapper/Android.bp
@@ -0,0 +1,88 @@
+// The wrapper -DBUILD_FLOAT needs to match
+// the lvm library -DBUILD_FLOAT.
+
+// music bundle wrapper
+cc_library_shared {
+ name: "libbundlewrapper",
+
+ arch: {
+ arm: {
+ instruction_set: "arm",
+ },
+ },
+
+ vendor: true,
+ srcs: ["Bundle/EffectBundle.cpp"],
+
+ cflags: [
+ "-fvisibility=hidden",
+ "-DBUILD_FLOAT",
+ "-DHIGHER_FS",
+
+ "-Wall",
+ "-Werror",
+ ],
+
+ relative_install_path: "soundfx",
+
+ static_libs: ["libmusicbundle"],
+
+ shared_libs: [
+ "libaudioutils",
+ "libcutils",
+ "libdl",
+ "liblog",
+ ],
+
+ local_include_dirs: ["Bundle"],
+
+ header_libs: [
+ "libhardware_headers",
+ "libaudioeffects",
+ ],
+}
+
+// reverb wrapper
+cc_library_shared {
+ name: "libreverbwrapper",
+
+ arch: {
+ arm: {
+ instruction_set: "arm",
+ },
+ },
+
+ vendor: true,
+ srcs: ["Reverb/EffectReverb.cpp"],
+
+ cflags: [
+ "-fvisibility=hidden",
+ "-DBUILD_FLOAT",
+ "-DHIGHER_FS",
+
+ "-Wall",
+ "-Werror",
+ ],
+
+ relative_install_path: "soundfx",
+
+ static_libs: ["libreverb"],
+
+ shared_libs: [
+ "libaudioutils",
+ "libcutils",
+ "libdl",
+ "liblog",
+ ],
+
+ local_include_dirs: ["Reverb"],
+
+ header_libs: [
+ "libhardware_headers",
+ "libaudioeffects",
+ ],
+
+ sanitize: {
+ integer_overflow: true,
+ },
+}
diff --git a/media/libeffects/lvm/wrapper/Android.mk b/media/libeffects/lvm/wrapper/Android.mk
deleted file mode 100644
index 341dbc2..0000000
--- a/media/libeffects/lvm/wrapper/Android.mk
+++ /dev/null
@@ -1,77 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# The wrapper -DBUILD_FLOAT needs to match
-# the lvm library -DBUILD_FLOAT.
-
-# music bundle wrapper
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_SRC_FILES:= \
- Bundle/EffectBundle.cpp
-
-LOCAL_CFLAGS += -fvisibility=hidden -DBUILD_FLOAT -DHIGHER_FS
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_MODULE:= libbundlewrapper
-
-LOCAL_MODULE_RELATIVE_PATH := soundfx
-
-LOCAL_STATIC_LIBRARIES += libmusicbundle
-
-LOCAL_SHARED_LIBRARIES := \
- libaudioutils \
- libcutils \
- libdl \
- liblog \
-
-LOCAL_C_INCLUDES += \
- $(LOCAL_PATH)/Bundle \
- $(LOCAL_PATH)/../lib/Common/lib/ \
- $(LOCAL_PATH)/../lib/Bundle/lib/ \
- $(call include-path-for, audio-effects) \
- $(call include-path-for, audio-utils) \
-
-LOCAL_HEADER_LIBRARIES += libhardware_headers
-include $(BUILD_SHARED_LIBRARY)
-
-
-# reverb wrapper
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_SRC_FILES:= \
- Reverb/EffectReverb.cpp
-
-LOCAL_CFLAGS += -fvisibility=hidden -DBUILD_FLOAT -DHIGHER_FS
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_MODULE:= libreverbwrapper
-
-LOCAL_MODULE_RELATIVE_PATH := soundfx
-
-LOCAL_STATIC_LIBRARIES += libreverb
-
-LOCAL_SHARED_LIBRARIES := \
- libaudioutils \
- libcutils \
- libdl \
- liblog \
-
-LOCAL_C_INCLUDES += \
- $(LOCAL_PATH)/Reverb \
- $(LOCAL_PATH)/../lib/Common/lib/ \
- $(LOCAL_PATH)/../lib/Reverb/lib/ \
- $(call include-path-for, audio-effects) \
- $(call include-path-for, audio-utils) \
-
-LOCAL_HEADER_LIBRARIES += libhardware_headers
-
-LOCAL_SANITIZE := integer_overflow
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libeffects/preprocessing/Android.bp b/media/libeffects/preprocessing/Android.bp
new file mode 100644
index 0000000..c87635f
--- /dev/null
+++ b/media/libeffects/preprocessing/Android.bp
@@ -0,0 +1,35 @@
+// audio preprocessing wrapper
+cc_library_shared {
+ name: "libaudiopreprocessing",
+
+ vendor: true,
+
+ relative_install_path: "soundfx",
+
+ srcs: ["PreProcessing.cpp"],
+
+ include_dirs: [
+ "external/webrtc",
+ "external/webrtc/webrtc/modules/include",
+ "external/webrtc/webrtc/modules/audio_processing/include",
+ ],
+
+ shared_libs: [
+ "libwebrtc_audio_preprocessing",
+ "libspeexresampler",
+ "libutils",
+ "liblog",
+ ],
+
+ cflags: [
+ "-DWEBRTC_POSIX",
+ "-fvisibility=hidden",
+ "-Wall",
+ "-Werror",
+ ],
+
+ header_libs: [
+ "libaudioeffects",
+ "libhardware_headers",
+ ],
+}
diff --git a/media/libeffects/preprocessing/Android.mk b/media/libeffects/preprocessing/Android.mk
deleted file mode 100644
index 358da8b..0000000
--- a/media/libeffects/preprocessing/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-# audio preprocessing wrapper
-include $(CLEAR_VARS)
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_MODULE:= libaudiopreprocessing
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_RELATIVE_PATH := soundfx
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_SRC_FILES:= \
- PreProcessing.cpp
-
-LOCAL_C_INCLUDES += \
- external/webrtc \
- external/webrtc/webrtc/modules/include \
- external/webrtc/webrtc/modules/audio_processing/include \
- $(call include-path-for, audio-effects)
-
-LOCAL_SHARED_LIBRARIES := \
- libwebrtc_audio_preprocessing \
- libspeexresampler \
- libutils \
- liblog
-
-LOCAL_SHARED_LIBRARIES += libdl
-
-LOCAL_CFLAGS += \
- -DWEBRTC_POSIX
-
-LOCAL_CFLAGS += -fvisibility=hidden
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_HEADER_LIBRARIES += libhardware_headers
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libeffects/proxy/Android.bp b/media/libeffects/proxy/Android.bp
new file mode 100644
index 0000000..c6abb9e
--- /dev/null
+++ b/media/libeffects/proxy/Android.bp
@@ -0,0 +1,38 @@
+// Copyright 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+cc_library_shared {
+ name: "libeffectproxy",
+ relative_install_path: "soundfx",
+
+ vendor: true,
+ srcs: ["EffectProxy.cpp"],
+
+ cflags: [
+ "-fvisibility=hidden",
+ "-Wall",
+ "-Werror",
+ ],
+
+ include_dirs: ["frameworks/av/media/libeffects/factory"],
+
+ header_libs: ["libaudioeffects"],
+ shared_libs: [
+ "liblog",
+ "libcutils",
+ "libutils",
+ "libdl",
+ "libeffects",
+ ],
+}
diff --git a/media/libeffects/proxy/Android.mk b/media/libeffects/proxy/Android.mk
deleted file mode 100644
index c4de30d..0000000
--- a/media/libeffects/proxy/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-LOCAL_MODULE:= libeffectproxy
-LOCAL_MODULE_RELATIVE_PATH := soundfx
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_VENDOR_MODULE := true
-LOCAL_SRC_FILES := \
- EffectProxy.cpp
-
-LOCAL_CFLAGS+= -fvisibility=hidden
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libdl libeffects
-
-LOCAL_C_INCLUDES := \
- system/media/audio_effects/include \
- frameworks/av/media/libeffects/factory
-
-include $(BUILD_SHARED_LIBRARY)
-
diff --git a/media/libmediaextractor/include/media/stagefright/MetaDataBase.h b/media/libmediaextractor/include/media/stagefright/MetaDataBase.h
index eea7cfc..9f2deda 100644
--- a/media/libmediaextractor/include/media/stagefright/MetaDataBase.h
+++ b/media/libmediaextractor/include/media/stagefright/MetaDataBase.h
@@ -179,6 +179,7 @@
kKeyPssh = 'pssh', // raw data
kKeyCASystemID = 'caid', // int32_t
kKeyCASessionID = 'seid', // raw data
+ kKeyCAPrivateData = 'cadc', // raw data
kKeyEncryptedByteBlock = 'cblk', // uint8_t
kKeySkipByteBlock = 'sblk', // uint8_t
@@ -224,6 +225,9 @@
// Key for ALAC Magic Cookie
kKeyAlacMagicCookie = 'almc', // raw data
+
+ // AC-4 AudioPresentationInfo
+ kKeyAudioPresentationInfo = 'audP', // raw data
};
enum {
diff --git a/media/libmediametrics/MediaAnalyticsItem.cpp b/media/libmediametrics/MediaAnalyticsItem.cpp
index 135c9b6..d3de01e 100644
--- a/media/libmediametrics/MediaAnalyticsItem.cpp
+++ b/media/libmediametrics/MediaAnalyticsItem.cpp
@@ -478,7 +478,7 @@
// caller responsible for the returned string
bool MediaAnalyticsItem::getCString(MediaAnalyticsItem::Attr name, char **value) {
Prop *prop = findProp(name);
- if (prop == NULL || prop->mType != kTypeDouble) {
+ if (prop == NULL || prop->mType != kTypeCString) {
return false;
}
if (value != NULL) {
diff --git a/media/libmediaplayer2/JAudioTrack.cpp b/media/libmediaplayer2/JAudioTrack.cpp
index cb139c9..7c2191b 100644
--- a/media/libmediaplayer2/JAudioTrack.cpp
+++ b/media/libmediaplayer2/JAudioTrack.cpp
@@ -34,7 +34,7 @@
callback_t cbf, // Offload
void* user, // Offload
size_t frameCount, // bufferSizeInBytes
- audio_session_t sessionId, // AudioTrack
+ int32_t sessionId, // AudioTrack
const jobject attributes, // AudioAttributes
float maxRequiredSpeed) { // bufferSizeInBytes
@@ -65,18 +65,20 @@
jmethodID jBuilderCtor = env->GetMethodID(jBuilderCls, "<init>", "()V");
jobject jBuilderObj = env->NewObject(jBuilderCls, jBuilderCtor);
- if (attributes != NULL) {
- mAudioAttributesObj = new JObjectHolder(attributes);
- } else {
- mAudioAttributesObj = new JObjectHolder(
- JAudioAttributes::createAudioAttributesObj(env, NULL));
+ {
+ sp<JObjectHolder> audioAttributesObj;
+ if (attributes != NULL) {
+ audioAttributesObj = new JObjectHolder(attributes);
+ } else {
+ audioAttributesObj = new JObjectHolder(
+ JAudioAttributes::createAudioAttributesObj(env, NULL));
+ }
+ jmethodID jSetAudioAttributes = env->GetMethodID(jBuilderCls, "setAudioAttributes",
+ "(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;");
+ jBuilderObj = env->CallObjectMethod(jBuilderObj,
+ jSetAudioAttributes, audioAttributesObj->getJObject());
}
- jmethodID jSetAudioAttributes = env->GetMethodID(jBuilderCls, "setAudioAttributes",
- "(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;");
- jBuilderObj = env->CallObjectMethod(jBuilderObj,
- jSetAudioAttributes, mAudioAttributesObj->getJObject());
-
jmethodID jSetAudioFormat = env->GetMethodID(jBuilderCls, "setAudioFormat",
"(Landroid/media/AudioFormat;)Landroid/media/AudioTrack$Builder;");
jBuilderObj = env->CallObjectMethod(jBuilderObj, jSetAudioFormat,
@@ -100,6 +102,7 @@
jBuilderObj = env->CallObjectMethod(jBuilderObj, jSetSessionId, sessionId);
}
+ mFlags = AUDIO_OUTPUT_FLAG_NONE;
if (cbf != NULL) {
jmethodID jSetOffloadedPlayback = env->GetMethodID(jBuilderCls, "setOffloadedPlayback",
"(Z)Landroid/media/AudioTrack$Builder;");
@@ -496,11 +499,11 @@
return env->CallObjectMethod(mAudioTrackObj, jGetRoutedDevice);
}
-audio_session_t JAudioTrack::getAudioSessionId() {
+int32_t JAudioTrack::getAudioSessionId() {
JNIEnv *env = JavaVMHelper::getJNIEnv();
jmethodID jGetAudioSessionId = env->GetMethodID(mAudioTrackCls, "getAudioSessionId", "()I");
jint sessionId = env->CallIntMethod(mAudioTrackObj, jGetAudioSessionId);
- return (audio_session_t) sessionId;
+ return sessionId;
}
status_t JAudioTrack::setPreferredDevice(jobject device) {
@@ -512,15 +515,14 @@
}
audio_stream_type_t JAudioTrack::getAudioStreamType() {
- if (mAudioAttributesObj == NULL) {
- return AUDIO_STREAM_DEFAULT;
- }
JNIEnv *env = JavaVMHelper::getJNIEnv();
+ jmethodID jGetAudioAttributes = env->GetMethodID(mAudioTrackCls, "getAudioAttributes",
+ "()Landroid/media/AudioAttributes;");
+ jobject jAudioAttributes = env->CallObjectMethod(mAudioTrackObj, jGetAudioAttributes);
jclass jAudioAttributesCls = env->FindClass("android/media/AudioAttributes");
jmethodID jGetVolumeControlStream = env->GetMethodID(jAudioAttributesCls,
"getVolumeControlStream", "()I");
- int javaAudioStreamType = env->CallIntMethod(
- mAudioAttributesObj->getJObject(), jGetVolumeControlStream);
+ int javaAudioStreamType = env->CallIntMethod(jAudioAttributes, jGetVolumeControlStream);
return (audio_stream_type_t)javaAudioStreamType;
}
@@ -754,7 +756,7 @@
jobject JAudioTrack::createStreamEventCallback(callback_t cbf, void* user) {
JNIEnv *env = JavaVMHelper::getJNIEnv();
- jclass jCallbackCls = env->FindClass("android/media/MediaPlayer2Impl$StreamEventCallback");
+ jclass jCallbackCls = env->FindClass("android/media/MediaPlayer2$StreamEventCallback");
jmethodID jCallbackCtor = env->GetMethodID(jCallbackCls, "<init>", "(JJJ)V");
jobject jCallbackObj = env->NewObject(jCallbackCls, jCallbackCtor, this, cbf, user);
return jCallbackObj;
diff --git a/media/libmediaplayer2/MediaPlayer2AudioOutput.cpp b/media/libmediaplayer2/MediaPlayer2AudioOutput.cpp
index 3040c2d..98a3e75 100644
--- a/media/libmediaplayer2/MediaPlayer2AudioOutput.cpp
+++ b/media/libmediaplayer2/MediaPlayer2AudioOutput.cpp
@@ -59,7 +59,7 @@
return NO_ERROR;
}
-MediaPlayer2AudioOutput::MediaPlayer2AudioOutput(audio_session_t sessionId, uid_t uid, int pid,
+MediaPlayer2AudioOutput::MediaPlayer2AudioOutput(int32_t sessionId, uid_t uid, int pid,
const jobject attributes)
: mCallback(nullptr),
mCallbackCookie(nullptr),
@@ -243,9 +243,7 @@
void MediaPlayer2AudioOutput::setAudioAttributes(const jobject attributes) {
Mutex::Autolock lock(mLock);
- if (attributes != nullptr) {
- sp<JObjectHolder> x = new JObjectHolder(attributes);
- }
+ mAttributes = (attributes == nullptr) ? nullptr : new JObjectHolder(attributes);
}
audio_stream_type_t MediaPlayer2AudioOutput::getAudioStreamType() const {
@@ -625,14 +623,14 @@
data->unlock();
}
-audio_session_t MediaPlayer2AudioOutput::getSessionId() const {
+int32_t MediaPlayer2AudioOutput::getSessionId() const {
Mutex::Autolock lock(mLock);
return mSessionId;
}
-void MediaPlayer2AudioOutput::setSessionId(const audio_session_t id) {
+void MediaPlayer2AudioOutput::setSessionId(const int32_t sessionId) {
Mutex::Autolock lock(mLock);
- mSessionId = id;
+ mSessionId = sessionId;
}
uint32_t MediaPlayer2AudioOutput::getSampleRate() const {
diff --git a/media/libmediaplayer2/include/mediaplayer2/JAudioTrack.h b/media/libmediaplayer2/include/mediaplayer2/JAudioTrack.h
index 13cf85a..87dc889 100644
--- a/media/libmediaplayer2/include/mediaplayer2/JAudioTrack.h
+++ b/media/libmediaplayer2/include/mediaplayer2/JAudioTrack.h
@@ -114,7 +114,7 @@
callback_t cbf,
void* user,
size_t frameCount = 0,
- audio_session_t sessionId = AUDIO_SESSION_ALLOCATE,
+ int32_t sessionId = AUDIO_SESSION_ALLOCATE,
const jobject pAttributes = NULL,
float maxRequiredSpeed = 1.0f);
@@ -341,7 +341,7 @@
jobject getRoutedDevice();
/* Returns the ID of the audio session this AudioTrack belongs to. */
- audio_session_t getAudioSessionId();
+ int32_t getAudioSessionId();
/* Sets the preferred audio device to use for output of this AudioTrack.
*
@@ -446,7 +446,6 @@
jclass mAudioTrackCls;
jobject mAudioTrackObj;
- sp<JObjectHolder> mAudioAttributesObj;
/* Creates a Java VolumeShaper.Configuration object from VolumeShaper::Configuration */
jobject createVolumeShaperConfigurationObj(
diff --git a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2AudioOutput.h b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2AudioOutput.h
index fc020ca..bda4f61 100644
--- a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2AudioOutput.h
+++ b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2AudioOutput.h
@@ -38,7 +38,7 @@
class CallbackData;
public:
- MediaPlayer2AudioOutput(audio_session_t sessionId,
+ MediaPlayer2AudioOutput(int32_t sessionId,
uid_t uid,
int pid,
const jobject attributes);
@@ -57,8 +57,8 @@
virtual status_t getTimestamp(AudioTimestamp &ts) const;
virtual int64_t getPlayedOutDurationUs(int64_t nowUs) const;
virtual status_t getFramesWritten(uint32_t *frameswritten) const;
- virtual audio_session_t getSessionId() const;
- virtual void setSessionId(const audio_session_t id);
+ virtual int32_t getSessionId() const;
+ virtual void setSessionId(const int32_t id);
virtual uint32_t getSampleRate() const;
virtual int64_t getBufferDurationInUs() const;
@@ -117,7 +117,7 @@
uint32_t mSampleRateHz; // sample rate of the content, as set in open()
float mMsecsPerFrame;
size_t mFrameSize;
- audio_session_t mSessionId;
+ int32_t mSessionId;
uid_t mUid;
int mPid;
float mSendLevel;
diff --git a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
index 07a7946..5e98589 100644
--- a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
+++ b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
@@ -94,7 +94,7 @@
virtual status_t getTimestamp(AudioTimestamp &ts) const = 0;
virtual int64_t getPlayedOutDurationUs(int64_t nowUs) const = 0;
virtual status_t getFramesWritten(uint32_t *frameswritten) const = 0;
- virtual audio_session_t getSessionId() const = 0;
+ virtual int32_t getSessionId() const = 0;
virtual audio_stream_type_t getAudioStreamType() const = 0;
virtual uint32_t getSampleRate() const = 0;
virtual int64_t getBufferDurationInUs() const = 0;
@@ -260,11 +260,11 @@
virtual void onMessageReceived(const sp<AMessage> & /* msg */) override { }
// Modular DRM
- virtual status_t prepareDrm(const uint8_t /* uuid */[16],
+ virtual status_t prepareDrm(int64_t /*srcId*/, const uint8_t /* uuid */[16],
const Vector<uint8_t>& /* drmSessionId */) {
return INVALID_OPERATION;
}
- virtual status_t releaseDrm() {
+ virtual status_t releaseDrm(int64_t /*srcId*/) {
return INVALID_OPERATION;
}
diff --git a/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h b/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
index d881813..c7cd7d2 100644
--- a/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
+++ b/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
@@ -55,7 +55,7 @@
public:
~MediaPlayer2();
- static sp<MediaPlayer2> Create();
+ static sp<MediaPlayer2> Create(int32_t sessionId);
static status_t DumpAll(int fd, const Vector<String16>& args);
void disconnect();
@@ -96,8 +96,8 @@
void notify(int64_t srcId, int msg, int ext1, int ext2,
const PlayerMessage *obj = NULL);
status_t invoke(const PlayerMessage &request, PlayerMessage *reply);
- status_t setAudioSessionId(audio_session_t sessionId);
- audio_session_t getAudioSessionId();
+ status_t setAudioSessionId(int32_t sessionId);
+ int32_t getAudioSessionId();
status_t setAuxEffectSendLevel(float level);
status_t attachAuxEffect(int effectId);
status_t setAudioAttributes(const jobject attributes);
@@ -105,8 +105,10 @@
status_t getParameter(int key, Parcel* reply);
// Modular DRM
- status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
- status_t releaseDrm();
+ status_t prepareDrm(int64_t srcId,
+ const uint8_t uuid[16],
+ const Vector<uint8_t>& drmSessionId);
+ status_t releaseDrm(int64_t srcId);
// AudioRouting
status_t setPreferredDevice(jobject device);
jobject getRoutedDevice();
@@ -116,7 +118,7 @@
status_t dump(int fd, const Vector<String16>& args);
private:
- MediaPlayer2();
+ MediaPlayer2(int32_t sessionId);
bool init();
// Disconnect from the currently connected ANativeWindow.
@@ -150,7 +152,7 @@
float mVolume;
int mVideoWidth;
int mVideoHeight;
- audio_session_t mAudioSessionId;
+ int32_t mAudioSessionId;
sp<JObjectHolder> mAudioAttributes;
float mSendLevel;
sp<ANativeWindowWrapper> mConnectedWindow;
diff --git a/media/libmediaplayer2/mediaplayer2.cpp b/media/libmediaplayer2/mediaplayer2.cpp
index 04a6f68..2ae5a8c 100644
--- a/media/libmediaplayer2/mediaplayer2.cpp
+++ b/media/libmediaplayer2/mediaplayer2.cpp
@@ -218,8 +218,8 @@
} // anonymous namespace
//static
-sp<MediaPlayer2> MediaPlayer2::Create() {
- sp<MediaPlayer2> player = new MediaPlayer2();
+sp<MediaPlayer2> MediaPlayer2::Create(int32_t sessionId) {
+ sp<MediaPlayer2> player = new MediaPlayer2(sessionId);
if (!player->init()) {
return NULL;
@@ -236,7 +236,7 @@
return dumpPlayers(fd, args);
}
-MediaPlayer2::MediaPlayer2() {
+MediaPlayer2::MediaPlayer2(int32_t sessionId) {
ALOGV("constructor");
mSrcId = 0;
mLockThreadId = 0;
@@ -251,20 +251,17 @@
mLoop = false;
mVolume = 1.0;
mVideoWidth = mVideoHeight = 0;
- mAudioSessionId = (audio_session_t) AudioSystem::newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
- AudioSystem::acquireAudioSessionId(mAudioSessionId, -1);
mSendLevel = 0;
// TODO: get pid and uid from JAVA
mPid = IPCThreadState::self()->getCallingPid();
mUid = IPCThreadState::self()->getCallingUid();
- mAudioOutput = new MediaPlayer2AudioOutput(mAudioSessionId, mUid, mPid, NULL /*attributes*/);
+ mAudioOutput = new MediaPlayer2AudioOutput(sessionId, mUid, mPid, NULL /*attributes*/);
}
MediaPlayer2::~MediaPlayer2() {
ALOGV("destructor");
- AudioSystem::releaseAudioSessionId(mAudioSessionId, -1);
disconnect();
removePlayer(this);
}
@@ -891,7 +888,7 @@
return OK;
}
-status_t MediaPlayer2::setAudioSessionId(audio_session_t sessionId) {
+status_t MediaPlayer2::setAudioSessionId(int32_t sessionId) {
ALOGV("MediaPlayer2::setAudioSessionId(%d)", sessionId);
Mutex::Autolock _l(mLock);
if (!(mCurrentState & MEDIA_PLAYER2_IDLE)) {
@@ -901,20 +898,18 @@
if (sessionId < 0) {
return BAD_VALUE;
}
- if (sessionId != mAudioSessionId) {
- AudioSystem::acquireAudioSessionId(sessionId, -1);
- AudioSystem::releaseAudioSessionId(mAudioSessionId, -1);
- mAudioSessionId = sessionId;
- }
- if (mAudioOutput != NULL && mAudioSessionId != mAudioOutput->getSessionId()) {
+ if (mAudioOutput != NULL && sessionId != mAudioOutput->getSessionId()) {
mAudioOutput->setSessionId(sessionId);
}
return NO_ERROR;
}
-audio_session_t MediaPlayer2::getAudioSessionId() {
+int32_t MediaPlayer2::getAudioSessionId() {
Mutex::Autolock _l(mLock);
- return mAudioSessionId;
+ if (mAudioOutput != NULL) {
+ return mAudioOutput->getSessionId();
+ }
+ return 0;
}
status_t MediaPlayer2::setAuxEffectSendLevel(float level) {
@@ -1099,7 +1094,8 @@
}
// Modular DRM
-status_t MediaPlayer2::prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId) {
+status_t MediaPlayer2::prepareDrm(
+ int64_t srcId, const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId) {
// TODO change to ALOGV
ALOGD("prepareDrm: uuid: %p drmSessionId: %p(%zu)", uuid,
drmSessionId.array(), drmSessionId.size());
@@ -1123,7 +1119,7 @@
}
// Passing down to mediaserver mainly for creating the crypto
- status_t status = mPlayer->prepareDrm(uuid, drmSessionId);
+ status_t status = mPlayer->prepareDrm(srcId, uuid, drmSessionId);
ALOGE_IF(status != OK, "prepareDrm: Failed at mediaserver with ret: %d", status);
// TODO change to ALOGV
@@ -1132,7 +1128,7 @@
return status;
}
-status_t MediaPlayer2::releaseDrm() {
+status_t MediaPlayer2::releaseDrm(int64_t srcId) {
Mutex::Autolock _l(mLock);
if (mPlayer == NULL) {
return NO_INIT;
@@ -1147,7 +1143,7 @@
return INVALID_OPERATION;
}
- status_t status = mPlayer->releaseDrm();
+ status_t status = mPlayer->releaseDrm(srcId);
// TODO change to ALOGV
ALOGD("releaseDrm: mediaserver::releaseDrm ret: %d", status);
if (status != OK) {
diff --git a/media/libmediaplayer2/nuplayer2/Android.bp b/media/libmediaplayer2/nuplayer2/Android.bp
index c3c94b6..93c218e 100644
--- a/media/libmediaplayer2/nuplayer2/Android.bp
+++ b/media/libmediaplayer2/nuplayer2/Android.bp
@@ -1,6 +1,7 @@
cc_library_static {
srcs: [
+ "JMediaPlayer2Utils.cpp",
"JWakeLock.cpp",
"GenericSource2.cpp",
"HTTPLiveSource2.cpp",
@@ -29,6 +30,7 @@
"frameworks/av/media/libstagefright/rtsp",
"frameworks/av/media/libstagefright/timedtext",
"frameworks/av/media/ndk",
+ "frameworks/base/core/jni",
],
cflags: [
@@ -57,6 +59,7 @@
static_libs: [
"libmedia_helper",
"libmediaplayer2-protos",
+ "libmedia2_jni_core",
],
name: "libstagefright_nuplayer2",
diff --git a/media/libmediaplayer2/nuplayer2/GenericSource2.cpp b/media/libmediaplayer2/nuplayer2/GenericSource2.cpp
index 1860b0c..f01361b 100644
--- a/media/libmediaplayer2/nuplayer2/GenericSource2.cpp
+++ b/media/libmediaplayer2/nuplayer2/GenericSource2.cpp
@@ -322,7 +322,7 @@
if (mLooper == NULL) {
mLooper = new ALooper;
- mLooper->setName("generic");
+ mLooper->setName("generic2");
mLooper->start(false, /* runOnCallingThread */
true, /* canCallJava */
PRIORITY_DEFAULT);
diff --git a/media/libmediaplayer2/nuplayer2/HTTPLiveSource2.cpp b/media/libmediaplayer2/nuplayer2/HTTPLiveSource2.cpp
index 175be53..2ea55f6 100644
--- a/media/libmediaplayer2/nuplayer2/HTTPLiveSource2.cpp
+++ b/media/libmediaplayer2/nuplayer2/HTTPLiveSource2.cpp
@@ -103,7 +103,7 @@
void NuPlayer2::HTTPLiveSource2::prepareAsync(int64_t /* startTimeUs */) {
if (mLiveLooper == NULL) {
mLiveLooper = new ALooper;
- mLiveLooper->setName("http live");
+ mLiveLooper->setName("http live2");
mLiveLooper->start(false, /* runOnCallingThread */
true /* canCallJava */);
diff --git a/media/libmediaplayer2/nuplayer2/JMediaPlayer2Utils.cpp b/media/libmediaplayer2/nuplayer2/JMediaPlayer2Utils.cpp
new file mode 100644
index 0000000..bbd22bc
--- /dev/null
+++ b/media/libmediaplayer2/nuplayer2/JMediaPlayer2Utils.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "JMediaPlayer2Utils"
+
+#include "JMediaPlayer2Utils.h"
+#include <mediaplayer2/JavaVMHelper.h>
+
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/Utils.h>
+#include <nativehelper/JNIHelp.h>
+#include <utils/Log.h>
+
+#include "log/log.h"
+
+namespace android {
+
+static const int64_t kOffloadMinDurationSec = 60;
+
+// static
+bool JMediaPlayer2Utils::isOffloadedAudioPlaybackSupported(
+ const sp<MetaData>& meta, bool hasVideo, bool isStreaming, audio_stream_type_t streamType)
+{
+ if (hasVideo || streamType != AUDIO_STREAM_MUSIC) {
+ return false;
+ }
+
+ audio_offload_info_t info = AUDIO_INFO_INITIALIZER;
+ if (OK != getAudioOffloadInfo(meta, hasVideo, isStreaming, streamType, &info)) {
+ return false;
+ }
+
+ if (info.duration_us < kOffloadMinDurationSec * 1000000) {
+ return false;
+ }
+
+ int32_t audioFormat = audioFormatFromNative(info.format);
+ int32_t channelMask = outChannelMaskFromNative(info.channel_mask);
+ if (audioFormat == ENCODING_INVALID || channelMask == CHANNEL_INVALID) {
+ return false;
+ }
+
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
+ jclass jMP2UtilsCls = env->FindClass("android/media/MediaPlayer2Utils");
+ jmethodID jSetAudioOutputDeviceById = env->GetStaticMethodID(
+ jMP2UtilsCls, "isOffloadedAudioPlaybackSupported", "(III)Z");
+ jboolean result = env->CallStaticBooleanMethod(
+ jMP2UtilsCls, jSetAudioOutputDeviceById, audioFormat, info.sample_rate, channelMask);
+ return result;
+}
+
+} // namespace android
diff --git a/media/libmediaplayer2/nuplayer2/JMediaPlayer2Utils.h b/media/libmediaplayer2/nuplayer2/JMediaPlayer2Utils.h
new file mode 100644
index 0000000..fcbd43c
--- /dev/null
+++ b/media/libmediaplayer2/nuplayer2/JMediaPlayer2Utils.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _J_MEDIAPLAYER2_UTILS2_H_
+#define _J_MEDIAPLAYER2_UTILS2_H_
+
+#include <media/stagefright/MetaData.h>
+
+#include "jni.h"
+#include "android_media_AudioFormat.h"
+
+namespace android {
+
+struct JMediaPlayer2Utils {
+ static bool isOffloadedAudioPlaybackSupported(
+ const sp<MetaData>& meta, bool hasVideo, bool isStreaming,
+ audio_stream_type_t streamType);
+};
+
+} // namespace android
+
+#endif // _J_MEDIAPLAYER2_UTILS2_H_
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
index c37460b..d4ffdfe 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
@@ -24,6 +24,7 @@
#include "NuPlayer2.h"
#include "HTTPLiveSource2.h"
+#include "JMediaPlayer2Utils.h"
#include "NuPlayer2CCDecoder.h"
#include "NuPlayer2Decoder.h"
#include "NuPlayer2DecoderBase.h"
@@ -824,20 +825,31 @@
case kWhatGetSelectedTrack:
{
+ int32_t type32;
+ CHECK(msg->findInt32("type", (int32_t*)&type32));
+ media_track_type type = (media_track_type)type32;
+
+ size_t inbandTracks = 0;
status_t err = INVALID_OPERATION;
+ ssize_t selectedTrack = -1;
if (mCurrentSourceInfo.mSource != NULL) {
err = OK;
-
- int32_t type32;
- CHECK(msg->findInt32("type", (int32_t*)&type32));
- media_track_type type = (media_track_type)type32;
- ssize_t selectedTrack = mCurrentSourceInfo.mSource->getSelectedTrack(type);
-
- PlayerMessage* reply;
- CHECK(msg->findPointer("reply", (void**)&reply));
- reply->add_values()->set_int32_value(selectedTrack);
+ inbandTracks = mCurrentSourceInfo.mSource->getTrackCount();
+ selectedTrack = mCurrentSourceInfo.mSource->getSelectedTrack(type);
}
+ if (selectedTrack == -1 && mCCDecoder != NULL) {
+ err = OK;
+ selectedTrack = mCCDecoder->getSelectedTrack(type);
+ if (selectedTrack != -1) {
+ selectedTrack += inbandTracks;
+ }
+ }
+
+ PlayerMessage* reply;
+ CHECK(msg->findPointer("reply", (void**)&reply));
+ reply->add_values()->set_int32_value(selectedTrack);
+
sp<AMessage> response = new AMessage;
response->setInt32("err", err);
@@ -1699,7 +1711,8 @@
}
mOffloadAudio =
- canOffloadStream(audioMeta, hasVideo, mCurrentSourceInfo.mSource->isStreaming(), streamType)
+ JMediaPlayer2Utils::isOffloadedAudioPlaybackSupported(
+ audioMeta, hasVideo, mCurrentSourceInfo.mSource->isStreaming(), streamType)
&& (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f);
// Modular DRM: Disabling audio offload if the source is protected
@@ -1717,7 +1730,7 @@
notify->setInt32("generation", mRendererGeneration);
mRenderer = new Renderer(mAudioSink, mMediaClock, notify, flags);
mRendererLooper = new ALooper;
- mRendererLooper->setName("NuPlayerRenderer");
+ mRendererLooper->setName("NuPlayer2Renderer");
mRendererLooper->start(false, true, ANDROID_PRIORITY_AUDIO);
mRendererLooper->registerHandler(mRenderer);
@@ -1992,7 +2005,7 @@
sp<AMessage> videoFormat = mCurrentSourceInfo.mSource->getFormat(false /* audio */);
audio_stream_type_t streamType = mAudioSink->getAudioStreamType();
const bool hasVideo = (videoFormat != NULL);
- bool canOffload = canOffloadStream(
+ bool canOffload = JMediaPlayer2Utils::isOffloadedAudioPlaybackSupported(
audioMeta, hasVideo, mCurrentSourceInfo.mSource->isStreaming(), streamType)
&& (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f);
@@ -3033,7 +3046,8 @@
}
// Modular DRM begin
-status_t NuPlayer2::prepareDrm(const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId)
+status_t NuPlayer2::prepareDrm(
+ int64_t srcId, const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId)
{
ALOGV("prepareDrm ");
@@ -3043,6 +3057,7 @@
uint8_t UUID[16];
memcpy(UUID, uuid, sizeof(UUID));
Vector<uint8_t> sessionId = drmSessionId;
+ msg->setInt64("srcId", srcId);
msg->setPointer("uuid", (void*)UUID);
msg->setPointer("drmSessionId", (void*)&sessionId);
@@ -3059,11 +3074,12 @@
return status;
}
-status_t NuPlayer2::releaseDrm()
+status_t NuPlayer2::releaseDrm(int64_t srcId)
{
ALOGV("releaseDrm ");
sp<AMessage> msg = new AMessage(kWhatReleaseDrm, this);
+ msg->setInt64("srcId", srcId);
sp<AMessage> response;
status_t status = msg->postAndAwaitResponse(&response);
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.h b/media/libmediaplayer2/nuplayer2/NuPlayer2.h
index 3ecdb01..93f9f00 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.h
@@ -92,8 +92,8 @@
float getFrameRate();
// Modular DRM
- status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId);
- status_t releaseDrm();
+ status_t prepareDrm(int64_t srcId, const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId);
+ status_t releaseDrm(int64_t srcId);
const char *getDataSourceType();
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.cpp
index e215965..a9f2104 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.cpp
@@ -199,6 +199,18 @@
return OK;
}
+ssize_t NuPlayer2::CCDecoder::getSelectedTrack(media_track_type type) const {
+ if (mSelectedTrack != -1) {
+ CCTrack track = mTracks[mSelectedTrack];
+ if (track.mTrackType == kTrackTypeCEA608 || track.mTrackType == kTrackTypeCEA708) {
+ return (type == MEDIA_TRACK_TYPE_SUBTITLE ? mSelectedTrack : -1);
+ }
+ return (type == MEDIA_TRACK_TYPE_UNKNOWN ? mSelectedTrack : -1);
+ }
+
+ return -1;
+}
+
bool NuPlayer2::CCDecoder::isSelected() const {
return mSelectedTrack >= 0 && mSelectedTrack < (int32_t)getTrackCount();
}
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.h b/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.h
index 57d5ea2..97834d1 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2CCDecoder.h
@@ -38,6 +38,7 @@
size_t getTrackCount() const;
sp<AMessage> getTrackInfo(size_t index) const;
status_t selectTrack(size_t index, bool select);
+ ssize_t getSelectedTrack(media_track_type type) const;
bool isSelected() const;
void decode(const sp<ABuffer> &accessUnit);
void display(int64_t timeUs);
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2DecoderBase.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2DecoderBase.cpp
index 9c1988f..1f1b69e 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2DecoderBase.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2DecoderBase.cpp
@@ -38,7 +38,7 @@
// Every decoder has its own looper because MediaCodec operations
// are blocking, but NuPlayer2 needs asynchronous operations.
mDecoderLooper = new ALooper;
- mDecoderLooper->setName("NPDecoder");
+ mDecoderLooper->setName("NP2Decoder");
mDecoderLooper->start(false, /* runOnCallingThread */
true, /* canCallJava */
ANDROID_PRIORITY_AUDIO);
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
index 821dc9f..eff8866 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
@@ -976,24 +976,25 @@
}
// Modular DRM
-status_t NuPlayer2Driver::prepareDrm(const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId)
+status_t NuPlayer2Driver::prepareDrm(
+ int64_t srcId, const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId)
{
ALOGV("prepareDrm(%p) state: %d", this, mState);
// leaving the state verification for mediaplayer.cpp
- status_t ret = mPlayer->prepareDrm(uuid, drmSessionId);
+ status_t ret = mPlayer->prepareDrm(srcId, uuid, drmSessionId);
ALOGV("prepareDrm ret: %d", ret);
return ret;
}
-status_t NuPlayer2Driver::releaseDrm()
+status_t NuPlayer2Driver::releaseDrm(int64_t srcId)
{
ALOGV("releaseDrm(%p) state: %d", this, mState);
// leaving the state verification for mediaplayer.cpp
- status_t ret = mPlayer->releaseDrm();
+ status_t ret = mPlayer->releaseDrm(srcId);
ALOGV("releaseDrm ret: %d", ret);
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
index 50ee173..bb30c76 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
@@ -82,8 +82,9 @@
void notifyFlagsChanged(int64_t srcId, uint32_t flags);
// Modular DRM
- virtual status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId);
- virtual status_t releaseDrm();
+ virtual status_t prepareDrm(
+ int64_t srcId, const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId);
+ virtual status_t releaseDrm(int64_t srcId);
protected:
virtual ~NuPlayer2Driver();
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.cpp
index 7db78c1..d800412 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.cpp
@@ -224,7 +224,8 @@
status_t err = mAudioSink->getPlaybackRate(rate);
if (err == OK) {
if (!isAudioPlaybackRateEqual(*rate, mPlaybackSettings)) {
- ALOGW("correcting mismatch in internal/external playback rate");
+ ALOGW("correcting mismatch in internal/external playback rate, %f vs %f",
+ rate->mSpeed, mPlaybackSettings.mSpeed);
}
// get playback settings used by audiosink, as it may be
// slightly off due to audiosink not taking small changes.
diff --git a/media/libmediaplayer2/nuplayer2/RTSPSource2.cpp b/media/libmediaplayer2/nuplayer2/RTSPSource2.cpp
index 53c66c0..aed925b 100644
--- a/media/libmediaplayer2/nuplayer2/RTSPSource2.cpp
+++ b/media/libmediaplayer2/nuplayer2/RTSPSource2.cpp
@@ -105,7 +105,7 @@
if (mLooper == NULL) {
mLooper = new ALooper;
- mLooper->setName("rtsp");
+ mLooper->setName("rtsp2");
mLooper->start();
mLooper->registerHandler(this);
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 30c0b1c..e3ae02e 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -1996,7 +1996,7 @@
mTotalPausedDurationUs += resumeStartTimeUs - mPauseStartTimeUs - 30000;
}
double timeOffset = -mTotalPausedDurationUs;
- if (mCaptureFpsEnable) {
+ if (mCaptureFpsEnable && (mVideoSource == VIDEO_SOURCE_CAMERA)) {
timeOffset *= mCaptureFps / mFrameRate;
}
sp<MetaData> meta = new MetaData;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 0784939..3922767 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -659,20 +659,31 @@
case kWhatGetSelectedTrack:
{
+ int32_t type32;
+ CHECK(msg->findInt32("type", (int32_t*)&type32));
+ media_track_type type = (media_track_type)type32;
+
+ size_t inbandTracks = 0;
status_t err = INVALID_OPERATION;
+ ssize_t selectedTrack = -1;
if (mSource != NULL) {
err = OK;
-
- int32_t type32;
- CHECK(msg->findInt32("type", (int32_t*)&type32));
- media_track_type type = (media_track_type)type32;
- ssize_t selectedTrack = mSource->getSelectedTrack(type);
-
- Parcel* reply;
- CHECK(msg->findPointer("reply", (void**)&reply));
- reply->writeInt32(selectedTrack);
+ inbandTracks = mSource->getTrackCount();
+ selectedTrack = mSource->getSelectedTrack(type);
}
+ if (selectedTrack == -1 && mCCDecoder != NULL) {
+ err = OK;
+ selectedTrack = mCCDecoder->getSelectedTrack(type);
+ if (selectedTrack != -1) {
+ selectedTrack += inbandTracks;
+ }
+ }
+
+ Parcel* reply;
+ CHECK(msg->findPointer("reply", (void**)&reply));
+ reply->writeInt32(selectedTrack);
+
sp<AMessage> response = new AMessage;
response->setInt32("err", err);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerCCDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerCCDecoder.cpp
index fb12360..ec30d0c 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerCCDecoder.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerCCDecoder.cpp
@@ -200,6 +200,18 @@
return OK;
}
+ssize_t NuPlayer::CCDecoder::getSelectedTrack(media_track_type type) const {
+ if (mSelectedTrack != -1) {
+ CCTrack track = mTracks[mSelectedTrack];
+ if (track.mTrackType == kTrackTypeCEA608 || track.mTrackType == kTrackTypeCEA708) {
+ return (type == MEDIA_TRACK_TYPE_SUBTITLE ? mSelectedTrack : -1);
+ }
+ return (type == MEDIA_TRACK_TYPE_UNKNOWN ? mSelectedTrack : -1);
+ }
+
+ return -1;
+}
+
bool NuPlayer::CCDecoder::isSelected() const {
return mSelectedTrack >= 0 && mSelectedTrack < (int32_t)getTrackCount();
}
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerCCDecoder.h b/media/libmediaplayerservice/nuplayer/NuPlayerCCDecoder.h
index f310f37..37b8230 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerCCDecoder.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerCCDecoder.h
@@ -38,6 +38,7 @@
size_t getTrackCount() const;
sp<AMessage> getTrackInfo(size_t index) const;
status_t selectTrack(size_t index, bool select);
+ ssize_t getSelectedTrack(media_track_type type) const;
bool isSelected() const;
void decode(const sp<ABuffer> &accessUnit);
void display(int64_t timeUs);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
index 050e4fb..a2ec699 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
@@ -110,6 +110,7 @@
mStats->setInt64("frames-total", mNumFramesTotal);
mStats->setInt64("frames-dropped-input", mNumInputFramesDropped);
mStats->setInt64("frames-dropped-output", mNumOutputFramesDropped);
+ mStats->setFloat("frame-rate-total", mFrameRateTotal);
return mStats;
}
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index f2c8f64..44f223d 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -53,6 +53,7 @@
static const char *kPlayerHeight = "android.media.mediaplayer.height";
static const char *kPlayerFrames = "android.media.mediaplayer.frames";
static const char *kPlayerFramesDropped = "android.media.mediaplayer.dropped";
+static const char *kPlayerFrameRate = "android.media.mediaplayer.fps";
static const char *kPlayerAMime = "android.media.mediaplayer.audio.mime";
static const char *kPlayerACodec = "android.media.mediaplayer.audio.codec";
static const char *kPlayerDuration = "android.media.mediaplayer.durationMs";
@@ -577,6 +578,10 @@
mAnalyticsItem->setInt64(kPlayerFrames, numFramesTotal);
mAnalyticsItem->setInt64(kPlayerFramesDropped, numFramesDropped);
+ float frameRate = 0;
+ if (stats->findFloat("frame-rate-total", &frameRate)) {
+ mAnalyticsItem->setDouble(kPlayerFrameRate, (double) frameRate);
+ }
} else if (mime.startsWith("audio/")) {
mAnalyticsItem->setCString(kPlayerAMime, mime.c_str());
@@ -602,6 +607,7 @@
mAnalyticsItem->setInt64(kPlayerRebuffering, (mRebufferingTimeUs+500)/1000 );
mAnalyticsItem->setInt32(kPlayerRebufferingCount, mRebufferingEvents);
mAnalyticsItem->setInt32(kPlayerRebufferingAtExit, mRebufferingAtExit);
+
}
mAnalyticsItem->setCString(kPlayerDataSourceType, mPlayer->getDataSourceType());
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 57a0198..b258332 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -26,6 +26,8 @@
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/foundation/AUtils.h>
#include <media/stagefright/MediaClock.h>
+#include <media/stagefright/MediaCodecConstants.h>
+#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/Utils.h>
@@ -87,6 +89,20 @@
// static
const int64_t NuPlayer::Renderer::kMinPositionUpdateDelayUs = 100000ll;
+static audio_format_t constexpr audioFormatFromEncoding(int32_t pcmEncoding) {
+ switch (pcmEncoding) {
+ case kAudioEncodingPcmFloat:
+ return AUDIO_FORMAT_PCM_FLOAT;
+ case kAudioEncodingPcm16bit:
+ return AUDIO_FORMAT_PCM_16_BIT;
+ case kAudioEncodingPcm8bit:
+ return AUDIO_FORMAT_PCM_8_BIT; // TODO: do we want to support this?
+ default:
+ ALOGE("%s: Invalid encoding: %d", __func__, pcmEncoding);
+ return AUDIO_FORMAT_INVALID;
+ }
+}
+
NuPlayer::Renderer::Renderer(
const sp<MediaPlayerBase::AudioSink> &sink,
const sp<MediaClock> &mediaClock,
@@ -1877,8 +1893,13 @@
int32_t sampleRate;
CHECK(format->findInt32("sample-rate", &sampleRate));
+ // read pcm encoding from MediaCodec output format, if available
+ int32_t pcmEncoding;
+ audio_format_t audioFormat =
+ format->findInt32(KEY_PCM_ENCODING, &pcmEncoding) ?
+ audioFormatFromEncoding(pcmEncoding) : AUDIO_FORMAT_PCM_16_BIT;
+
if (offloadingAudio()) {
- audio_format_t audioFormat = AUDIO_FORMAT_PCM_16_BIT;
AString mime;
CHECK(format->findString("mime", &mime));
status_t err = mapMimeToAudioFormat(audioFormat, mime.c_str());
@@ -1980,7 +2001,7 @@
const PcmInfo info = {
(audio_channel_mask_t)channelMask,
(audio_output_flags_t)pcmFlags,
- AUDIO_FORMAT_PCM_16_BIT, // TODO: change to audioFormat
+ audioFormat,
numChannels,
sampleRate
};
@@ -2019,7 +2040,7 @@
sampleRate,
numChannels,
(audio_channel_mask_t)channelMask,
- AUDIO_FORMAT_PCM_16_BIT,
+ audioFormat,
0 /* bufferCount - unused */,
mUseAudioCallback ? &NuPlayer::Renderer::AudioSinkCallback : NULL,
mUseAudioCallback ? this : NULL,
@@ -2077,4 +2098,3 @@
}
} // namespace android
-
diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp
index d96d358..cc5b7da 100644
--- a/media/libstagefright/Android.bp
+++ b/media/libstagefright/Android.bp
@@ -96,7 +96,6 @@
"AHierarchicalStateMachine.cpp",
"AMRWriter.cpp",
"AudioPlayer.cpp",
- "AudioPresentationInfo.cpp",
"AudioSource.cpp",
"BufferImpl.cpp",
"CallbackDataSource.cpp",
@@ -207,6 +206,12 @@
"include",
],
+ // This is needed to make sure libcodec2 exists in all devices.
+ // TODO: Remove this once the public CCodec is enabled.
+ required: [
+ "libcodec2",
+ ],
+
cflags: [
"-Wno-multichar",
"-Werror",
diff --git a/media/libstagefright/AudioPresentationInfo.cpp b/media/libstagefright/AudioPresentationInfo.cpp
deleted file mode 100644
index 86e1859..0000000
--- a/media/libstagefright/AudioPresentationInfo.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// #define LOG_NDEBUG 0
-#define LOG_TAG "AudioPresentationInfo"
-
-#include <media/AudioPresentationInfo.h>
-
-namespace android {
-
-AudioPresentationInfo::AudioPresentationInfo() {
-}
-
-AudioPresentationInfo::~AudioPresentationInfo() {
- mPresentations.clear();
-}
-
-void AudioPresentationInfo::addPresentation(sp<AudioPresentation> presentation) {
- mPresentations.push(presentation);
-}
-
-size_t AudioPresentationInfo::countPresentations() const {
- return mPresentations.size();
-}
-
-// Returns an AudioPresentation for the given valid index
-// index must be >=0 and < countPresentations()
-const sp<AudioPresentation> AudioPresentationInfo::getPresentation(size_t index) const {
- return mPresentations[index];
-}
-
-} // namespace android
diff --git a/media/libstagefright/MediaExtractorFactory.cpp b/media/libstagefright/MediaExtractorFactory.cpp
index 8f1dd36..318c1eb 100644
--- a/media/libstagefright/MediaExtractorFactory.cpp
+++ b/media/libstagefright/MediaExtractorFactory.cpp
@@ -18,6 +18,8 @@
#define LOG_TAG "MediaExtractorFactory"
#include <utils/Log.h>
+#include <binder/IPCThreadState.h>
+#include <binder/PermissionCache.h>
#include <binder/IServiceManager.h>
#include <media/DataSource.h>
#include <media/MediaAnalyticsItem.h>
@@ -353,18 +355,29 @@
status_t MediaExtractorFactory::dump(int fd, const Vector<String16>&) {
Mutex::Autolock autoLock(gPluginMutex);
String8 out;
- out.append("Available extractors:\n");
- if (gPluginsRegistered) {
- for (auto it = gPlugins->begin(); it != gPlugins->end(); ++it) {
- out.appendFormat(" %25s: plugin_version(%d), uuid(%s), version(%u), path(%s)\n",
- (*it)->def.extractor_name,
- (*it)->def.def_version,
- (*it)->uuidString.c_str(),
- (*it)->def.extractor_version,
- (*it)->libPath.c_str());
- }
+
+ const IPCThreadState* ipc = IPCThreadState::self();
+ const int pid = ipc->getCallingPid();
+ const int uid = ipc->getCallingUid();
+ if (!PermissionCache::checkPermission(String16("android.permission.DUMP"), pid, uid)) {
+ // dumpExtractors() will append the following string.
+ // out.appendFormat("Permission Denial: "
+ // "can't dump MediaExtractor from pid=%d, uid=%d\n", pid, uid);
+ ALOGE("Permission Denial: can't dump MediaExtractor from pid=%d, uid=%d", pid, uid);
} else {
- out.append(" (no plugins registered)\n");
+ out.append("Available extractors:\n");
+ if (gPluginsRegistered) {
+ for (auto it = gPlugins->begin(); it != gPlugins->end(); ++it) {
+ out.appendFormat(" %25s: plugin_version(%d), uuid(%s), version(%u), path(%s)\n",
+ (*it)->def.extractor_name,
+ (*it)->def.def_version,
+ (*it)->uuidString.c_str(),
+ (*it)->def.extractor_version,
+ (*it)->libPath.c_str());
+ }
+ } else {
+ out.append(" (no plugins registered)\n");
+ }
}
write(fd, out.string(), out.size());
return OK;
diff --git a/media/libstagefright/MediaTrack.cpp b/media/libstagefright/MediaTrack.cpp
index 9fbb20e..821605d 100644
--- a/media/libstagefright/MediaTrack.cpp
+++ b/media/libstagefright/MediaTrack.cpp
@@ -110,6 +110,8 @@
}
MediaTrackCUnwrapperV2::~MediaTrackCUnwrapperV2() {
+ wrapper->free(wrapper->data);
+ free(wrapper);
}
status_t MediaTrackCUnwrapperV2::start() {
diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp
index f94648c..f5178dd 100644
--- a/media/libstagefright/NuMediaExtractor.cpp
+++ b/media/libstagefright/NuMediaExtractor.cpp
@@ -794,4 +794,32 @@
return false;
}
+// Return OK if we have received an audio presentation info.
+// Return ERROR_UNSUPPORTED if the track has no audio presentation.
+// Return INVALID_OPERATION if audio presentation metadata version does not match.
+status_t NuMediaExtractor::getAudioPresentations(
+ size_t trackIndex, AudioPresentationCollection *presentations) const {
+ Mutex::Autolock autoLock(mLock);
+
+ if (mImpl == NULL) {
+ return -EINVAL;
+ }
+
+ if (trackIndex >= mImpl->countTracks()) {
+ return -ERANGE;
+ }
+
+ sp<MetaData> meta = mImpl->getTrackMetaData(trackIndex);
+
+ uint32_t type;
+ const void *data;
+ size_t size;
+ if (meta != NULL && meta->findData(kKeyAudioPresentationInfo, &type, &data, &size)) {
+ std::istringstream inStream(std::string(static_cast<const char*>(data), size));
+ return deserializeAudioPresentations(&inStream, presentations);
+ }
+ ALOGE("Source does not contain any audio presentation");
+ return ERROR_UNSUPPORTED;
+}
+
} // namespace android
diff --git a/media/libstagefright/SimpleDecodingSource.cpp b/media/libstagefright/SimpleDecodingSource.cpp
index 404c537..babdc7a 100644
--- a/media/libstagefright/SimpleDecodingSource.cpp
+++ b/media/libstagefright/SimpleDecodingSource.cpp
@@ -37,6 +37,7 @@
const int64_t kTimeoutWaitForOutputUs = 500000; // 0.5 seconds
const int64_t kTimeoutWaitForInputUs = 5000; // 5 milliseconds
+const int kTimeoutMaxRetries = 20;
//static
sp<SimpleDecodingSource> SimpleDecodingSource::Create(
@@ -242,7 +243,7 @@
return ERROR_END_OF_STREAM;
}
- for (int retries = 0; ++retries; ) {
+ for (int retries = 0; retries < kTimeoutMaxRetries; ++retries) {
// If we fill all available input buffers, we should expect that
// the codec produces at least one output buffer. Also, the codec
// should produce an output buffer in at most 1 seconds. Retry a
diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp
index 610b961..17187a8 100644
--- a/media/libstagefright/StagefrightMediaScanner.cpp
+++ b/media/libstagefright/StagefrightMediaScanner.cpp
@@ -41,7 +41,7 @@
".wav", ".amr", ".midi", ".xmf", ".rtttl", ".rtx", ".ota",
".mkv", ".mka", ".webm", ".ts", ".fl", ".flac", ".mxmf",
".avi", ".mpeg", ".mpg", ".awb", ".mpga", ".mov",
- ".m4v", ".oga"
+ ".m4v", ".oga", ".m4r"
};
static const size_t kNumValidExtensions =
sizeof(kValidExtensions) / sizeof(kValidExtensions[0]);
diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp
index 2ee5ab0..df929ae 100644
--- a/media/libstagefright/Utils.cpp
+++ b/media/libstagefright/Utils.cpp
@@ -588,10 +588,17 @@
}
};
+static std::vector<std::pair<const char *, uint32_t>> floatMappings {
+ {
+ { "capture-rate", kKeyCaptureFramerate },
+ }
+};
+
static std::vector<std::pair<const char *, uint32_t>> int64Mappings {
{
{ "exif-offset", kKeyExifOffset },
{ "exif-size", kKeyExifSize },
+ { "thumbnail-time", kKeyThumbnailTime },
}
};
@@ -608,12 +615,14 @@
{ "temporal-layer-count", kKeyTemporalLayerCount },
{ "thumbnail-width", kKeyThumbnailWidth },
{ "thumbnail-height", kKeyThumbnailHeight },
+ { "frame-count", kKeyFrameCount },
}
};
static std::vector<std::pair<const char *, uint32_t>> bufferMappings {
{
{ "albumart", kKeyAlbumArt },
+ { "audio-presentation-info", kKeyAudioPresentationInfo },
{ "pssh", kKeyPssh },
{ "crypto-iv", kKeyCryptoIV },
{ "crypto-key", kKeyCryptoKey },
@@ -630,6 +639,13 @@
}
}
+ for (auto elem : floatMappings) {
+ float value;
+ if (msg->findFloat(elem.first, &value)) {
+ meta->setFloat(elem.second, value);
+ }
+ }
+
for (auto elem : int64Mappings) {
int64_t value;
if (msg->findInt64(elem.first, &value)) {
@@ -661,6 +677,13 @@
}
}
+ for (auto elem : floatMappings) {
+ float value;
+ if (meta->findFloat(elem.second, &value)) {
+ format->setFloat(elem.first, value);
+ }
+ }
+
for (auto elem : int64Mappings) {
int64_t value;
if (meta->findInt64(elem.second, &value)) {
@@ -724,6 +747,16 @@
memcpy(buffer->data(), data, size);
}
+ if (meta->findData(kKeyCAPrivateData, &type, &data, &size)) {
+ sp<ABuffer> buffer = new (std::nothrow) ABuffer(size);
+ if (buffer.get() == NULL || buffer->base() == NULL) {
+ return NO_MEMORY;
+ }
+
+ msg->setBuffer("ca-private-data", buffer);
+ memcpy(buffer->data(), data, size);
+ }
+
int32_t systemId;
if (meta->findInt32(kKeyCASystemID, &systemId)) {
msg->setInt32("ca-system-id", systemId);
@@ -1478,6 +1511,19 @@
convertMessageToMetaDataFromMappings(msg, meta);
+ int32_t systemId;
+ if (msg->findInt32("ca-system-id", &systemId)) {
+ meta->setInt32(kKeyCASystemID, systemId);
+
+ sp<ABuffer> caSessionId, caPvtData;
+ if (msg->findBuffer("ca-session-id", &caSessionId)) {
+ meta->setData(kKeyCASessionID, 0, caSessionId->data(), caSessionId->size());
+ }
+ if (msg->findBuffer("ca-private-data", &caPvtData)) {
+ meta->setData(kKeyCAPrivateData, 0, caPvtData->data(), caPvtData->size());
+ }
+ }
+
int64_t durationUs;
if (msg->findInt64("durationUs", &durationUs)) {
meta->setInt64(kKeyDuration, durationUs);
@@ -1830,43 +1876,43 @@
return;
}
-bool canOffloadStream(const sp<MetaData>& meta, bool hasVideo,
- bool isStreaming, audio_stream_type_t streamType)
+status_t getAudioOffloadInfo(const sp<MetaData>& meta, bool hasVideo,
+ bool isStreaming, audio_stream_type_t streamType, audio_offload_info_t *info)
{
const char *mime;
if (meta == NULL) {
- return false;
+ return BAD_VALUE;
}
CHECK(meta->findCString(kKeyMIMEType, &mime));
- audio_offload_info_t info = AUDIO_INFO_INITIALIZER;
+ (*info) = AUDIO_INFO_INITIALIZER;
- info.format = AUDIO_FORMAT_INVALID;
- if (mapMimeToAudioFormat(info.format, mime) != OK) {
+ info->format = AUDIO_FORMAT_INVALID;
+ if (mapMimeToAudioFormat(info->format, mime) != OK) {
ALOGE(" Couldn't map mime type \"%s\" to a valid AudioSystem::audio_format !", mime);
- return false;
+ return BAD_VALUE;
} else {
- ALOGV("Mime type \"%s\" mapped to audio_format %d", mime, info.format);
+ ALOGV("Mime type \"%s\" mapped to audio_format %d", mime, info->format);
}
- if (AUDIO_FORMAT_INVALID == info.format) {
+ if (AUDIO_FORMAT_INVALID == info->format) {
// can't offload if we don't know what the source format is
ALOGE("mime type \"%s\" not a known audio format", mime);
- return false;
+ return BAD_VALUE;
}
// Redefine aac format according to its profile
// Offloading depends on audio DSP capabilities.
int32_t aacaot = -1;
if (meta->findInt32(kKeyAACAOT, &aacaot)) {
- mapAACProfileToAudioFormat(info.format,(OMX_AUDIO_AACPROFILETYPE) aacaot);
+ mapAACProfileToAudioFormat(info->format,(OMX_AUDIO_AACPROFILETYPE) aacaot);
}
int32_t srate = -1;
if (!meta->findInt32(kKeySampleRate, &srate)) {
ALOGV("track of type '%s' does not publish sample rate", mime);
}
- info.sample_rate = srate;
+ info->sample_rate = srate;
int32_t cmask = 0;
if (!meta->findInt32(kKeyChannelMask, &cmask) || cmask == CHANNEL_MASK_USE_CHANNEL_ORDER) {
@@ -1880,25 +1926,34 @@
cmask = audio_channel_out_mask_from_count(channelCount);
}
}
- info.channel_mask = cmask;
+ info->channel_mask = cmask;
int64_t duration = 0;
if (!meta->findInt64(kKeyDuration, &duration)) {
ALOGV("track of type '%s' does not publish duration", mime);
}
- info.duration_us = duration;
+ info->duration_us = duration;
int32_t brate = -1;
if (!meta->findInt32(kKeyBitRate, &brate)) {
ALOGV("track of type '%s' does not publish bitrate", mime);
}
- info.bit_rate = brate;
+ info->bit_rate = brate;
- info.stream_type = streamType;
- info.has_video = hasVideo;
- info.is_streaming = isStreaming;
+ info->stream_type = streamType;
+ info->has_video = hasVideo;
+ info->is_streaming = isStreaming;
+ return OK;
+}
+bool canOffloadStream(const sp<MetaData>& meta, bool hasVideo,
+ bool isStreaming, audio_stream_type_t streamType)
+{
+ audio_offload_info_t info = AUDIO_INFO_INITIALIZER;
+ if (OK != getAudioOffloadInfo(meta, hasVideo, isStreaming, streamType, &info)) {
+ return false;
+ }
// Check if offload is possible for given format, stream type, sample rate,
// bit rate, duration, video and streaming
return AudioSystem::isOffloadSupported(info);
diff --git a/media/libstagefright/codecs/m4v_h263/dec/src/block_idct.cpp b/media/libstagefright/codecs/m4v_h263/dec/src/block_idct.cpp
index a75483a..3d10086 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/src/block_idct.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/src/block_idct.cpp
@@ -617,6 +617,7 @@
return;
}
+__attribute__((no_sanitize("signed-integer-overflow")))
void idctrow_intra(
int16 *blk, PIXEL *comp, int width
)
diff --git a/media/libstagefright/foundation/Android.bp b/media/libstagefright/foundation/Android.bp
index 5b7961d..861528e 100644
--- a/media/libstagefright/foundation/Android.bp
+++ b/media/libstagefright/foundation/Android.bp
@@ -61,6 +61,7 @@
"AMessage.cpp",
"AString.cpp",
"AStringUtils.cpp",
+ "AudioPresentationInfo.cpp",
"ByteUtils.cpp",
"ColorUtils.cpp",
"MediaDefs.cpp",
diff --git a/media/libstagefright/foundation/AudioPresentationInfo.cpp b/media/libstagefright/foundation/AudioPresentationInfo.cpp
new file mode 100644
index 0000000..4b8e969
--- /dev/null
+++ b/media/libstagefright/foundation/AudioPresentationInfo.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// #define LOG_NDEBUG 0
+#define LOG_TAG "AudioPresentationInfo"
+
+#include <vector>
+
+#include "AudioPresentationInfo.h"
+
+#include <utils/Log.h>
+
+namespace android {
+
+void serializeAudioPresentations(const AudioPresentationCollection& presentations,
+ std::ostream* serializedOutput) {
+ uint32_t numPresentations = presentations.size();
+ serializedOutput->write(reinterpret_cast<char*>(&numPresentations), sizeof(numPresentations));
+ for (const auto& ap : presentations) {
+ if (ap.mVersion == PRESENTATION_VERSION_1) {
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&ap.mVersion)),
+ sizeof(ap.mVersion));
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&ap.mPresentationId)),
+ sizeof(ap.mPresentationId));
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&ap.mProgramId)),
+ sizeof(ap.mProgramId));
+
+ uint32_t numLabels = ap.mLabels.size();
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&numLabels)),
+ sizeof(numLabels));
+ for (const auto& label : ap.mLabels) {
+ uint32_t labelKeySize = label.first.size();
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&labelKeySize)),
+ sizeof(labelKeySize));
+ serializedOutput->write(label.first.c_str(), labelKeySize);
+
+ uint32_t labelValSize = label.second.size();
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&labelValSize)),
+ sizeof(labelValSize));
+ serializedOutput->write(label.second.c_str(), labelValSize);
+ }
+
+ uint32_t langSize = ap.mLanguage.size();
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&langSize)),
+ sizeof(langSize));
+ serializedOutput->write(ap.mLanguage.c_str(), langSize);
+
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&ap.mMasteringIndication)),
+ sizeof(ap.mMasteringIndication));
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&ap.mAudioDescriptionAvailable)),
+ sizeof(ap.mAudioDescriptionAvailable));
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&ap.mSpokenSubtitlesAvailable)),
+ sizeof(ap.mSpokenSubtitlesAvailable));
+ serializedOutput->write(
+ const_cast<char*>(reinterpret_cast<const char*>(&ap.mDialogueEnhancementAvailable)),
+ sizeof(ap.mDialogueEnhancementAvailable));
+ }
+ }
+}
+
+status_t deserializeAudioPresentations(std::istream* serializedInput,
+ AudioPresentationCollection *presentations) {
+ uint32_t numPresentations;
+ serializedInput->read(reinterpret_cast<char*>(&numPresentations), sizeof(numPresentations));
+ for (uint32_t i = 0; i < numPresentations; ++i) {
+ uint32_t version;
+ serializedInput->read(reinterpret_cast<char*>(&version), sizeof(version));
+ if (version == PRESENTATION_VERSION_1) {
+ AudioPresentationV1 ap;
+ serializedInput->read(
+ reinterpret_cast<char*>(&ap.mPresentationId),
+ sizeof(ap.mPresentationId));
+ serializedInput->read(reinterpret_cast<char*>(&ap.mProgramId), sizeof(ap.mProgramId));
+
+ uint32_t numLabels;
+ serializedInput->read(reinterpret_cast<char*>(&numLabels), sizeof(numLabels));
+ for (uint32_t j = 0; j < numLabels; ++j) {
+ uint32_t labelKeySize;
+ serializedInput->read(reinterpret_cast<char*>(&labelKeySize), sizeof(labelKeySize));
+ std::vector<char> labelKey(labelKeySize);
+ serializedInput->read(labelKey.data(), labelKeySize);
+
+ uint32_t labelValSize;
+ serializedInput->read(reinterpret_cast<char*>(&labelValSize), sizeof(labelValSize));
+ std::vector<char> labelVal(labelValSize);
+ serializedInput->read(labelVal.data(), labelValSize);
+ ap.mLabels.emplace(
+ std::string(reinterpret_cast<char*>(labelKey.data()), labelKeySize),
+ std::string(reinterpret_cast<char*>(labelVal.data()), labelValSize));
+ }
+ uint32_t languageSize;
+ serializedInput->read(reinterpret_cast<char*>(&languageSize), sizeof(languageSize));
+ std::vector<char> language(languageSize);
+ serializedInput->read(language.data(), languageSize);
+ ap.mLanguage = std::string(reinterpret_cast<char*>(language.data()), languageSize);
+ serializedInput->read(reinterpret_cast<char*>(&ap.mMasteringIndication),
+ sizeof(ap.mMasteringIndication));
+ serializedInput->read(reinterpret_cast<char*>(&ap.mAudioDescriptionAvailable),
+ sizeof(ap.mAudioDescriptionAvailable));
+ serializedInput->read(reinterpret_cast<char*>(&ap.mSpokenSubtitlesAvailable),
+ sizeof(ap.mSpokenSubtitlesAvailable));
+ serializedInput->read(reinterpret_cast<char*>(&ap.mDialogueEnhancementAvailable),
+ sizeof(ap.mDialogueEnhancementAvailable));
+ presentations->push_back(std::move(ap));
+ } else {
+ ALOGE("Audio presentation info version is not supported");
+ return INVALID_OPERATION;
+ }
+ }
+ return OK;
+}
+
+} // namespace android
diff --git a/media/libstagefright/foundation/include/media/stagefright/foundation/AudioPresentationInfo.h b/media/libstagefright/foundation/include/media/stagefright/foundation/AudioPresentationInfo.h
new file mode 100644
index 0000000..4bd4d9f
--- /dev/null
+++ b/media/libstagefright/foundation/include/media/stagefright/foundation/AudioPresentationInfo.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AUDIO_PRESENTATION_INFO_H_
+#define AUDIO_PRESENTATION_INFO_H_
+
+#include <map>
+#include <sstream>
+#include <stdint.h>
+#include <vector>
+
+#include <utils/Errors.h>
+
+namespace android {
+
+enum AudioPresentationVersion {
+ PRESENTATION_VERSION_UNDEFINED = 0,
+ PRESENTATION_VERSION_1,
+};
+
+enum MasteringIndication {
+ MASTERING_NOT_INDICATED,
+ MASTERED_FOR_STEREO,
+ MASTERED_FOR_SURROUND,
+ MASTERED_FOR_3D,
+ MASTERED_FOR_HEADPHONE,
+};
+
+struct AudioPresentation {
+ uint32_t mVersion = PRESENTATION_VERSION_UNDEFINED;
+ int32_t mPresentationId = -1;
+ int32_t mProgramId = -1;
+ std::map<std::string, std::string> mLabels;
+ std::string mLanguage;
+ MasteringIndication mMasteringIndication = MASTERING_NOT_INDICATED;
+ bool mAudioDescriptionAvailable = false;
+ bool mSpokenSubtitlesAvailable = false;
+ bool mDialogueEnhancementAvailable = false;
+};
+
+struct AudioPresentationV1 : public AudioPresentation {
+ AudioPresentationV1() {
+ mVersion = PRESENTATION_VERSION_1;
+ }
+};
+
+typedef std::vector<AudioPresentation> AudioPresentationCollection;
+
+void serializeAudioPresentations(const AudioPresentationCollection& presentations,
+ std::ostream* serializedOutput);
+status_t deserializeAudioPresentations(std::istream* serializedInput,
+ AudioPresentationCollection *presentations);
+} // namespace android
+
+#endif // AUDIO_PRESENTATION_INFO_H_
diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp
index 8ab33f7..d06d9f2 100644
--- a/media/libstagefright/httplive/M3UParser.cpp
+++ b/media/libstagefright/httplive/M3UParser.cpp
@@ -1391,6 +1391,7 @@
case 'QDMC':
case 'ulaw':
case 'vdva':
+ case 'ac-4':
return !strcmp("audio", type);
case 'avc1':
diff --git a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
index 3ef4c0e..a462ae7 100644
--- a/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
+++ b/media/libstagefright/include/media/stagefright/MediaCodecConstants.h
@@ -327,6 +327,7 @@
constexpr char KEY_BITRATE_MODE[] = "bitrate-mode";
constexpr char KEY_CA_SESSION_ID[] = "ca-session-id";
constexpr char KEY_CA_SYSTEM_ID[] = "ca-system-id";
+constexpr char KEY_CA_PRIVATE_DATA[] = "ca-private-data";
constexpr char KEY_CAPTURE_RATE[] = "capture-rate";
constexpr char KEY_CHANNEL_COUNT[] = "channel-count";
constexpr char KEY_CHANNEL_MASK[] = "channel-mask";
diff --git a/media/libstagefright/include/media/stagefright/NuMediaExtractor.h b/media/libstagefright/include/media/stagefright/NuMediaExtractor.h
index 641ccfa..8dc8d38 100644
--- a/media/libstagefright/include/media/stagefright/NuMediaExtractor.h
+++ b/media/libstagefright/include/media/stagefright/NuMediaExtractor.h
@@ -20,6 +20,7 @@
#include <list>
#include <media/mediaplayer.h>
#include <media/stagefright/foundation/ABase.h>
+#include <media/stagefright/foundation/AudioPresentationInfo.h>
#include <media/IMediaExtractor.h>
#include <media/MediaSource.h>
#include <utils/Errors.h>
@@ -95,6 +96,9 @@
bool getCachedDuration(int64_t *durationUs, bool *eos) const;
+ status_t getAudioPresentations(size_t trackIdx,
+ AudioPresentationCollection *presentations) const;
+
protected:
virtual ~NuMediaExtractor();
diff --git a/media/libstagefright/include/media/stagefright/Utils.h b/media/libstagefright/include/media/stagefright/Utils.h
index 46a419d..e8e0a11 100644
--- a/media/libstagefright/include/media/stagefright/Utils.h
+++ b/media/libstagefright/include/media/stagefright/Utils.h
@@ -52,6 +52,10 @@
// Send information from MetaData to the HAL via AudioSink
status_t sendMetaDataToHal(sp<MediaPlayerBase::AudioSink>& sink, const sp<MetaData>& meta);
+// Return |audio_offload_info_t| filled from given metadata
+status_t getAudioOffloadInfo(const sp<MetaData>& meta, bool hasVideo,
+ bool isStreaming, audio_stream_type_t streamType, audio_offload_info_t *info);
+
// Check whether the stream defined by meta can be offloaded to hardware
bool canOffloadStream(const sp<MetaData>& meta, bool hasVideo,
bool isStreaming, audio_stream_type_t streamType);
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp
index 3debe34..cf93fcf 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -117,12 +117,6 @@
void signalNewSampleAesKey(const sp<AMessage> &keyItem);
private:
- struct StreamInfo {
- unsigned mType;
- unsigned mTypeExt;
- unsigned mPID;
- int32_t mCASystemId;
- };
ATSParser *mParser;
unsigned mProgramNumber;
@@ -143,12 +137,7 @@
};
struct ATSParser::Stream : public RefBase {
- Stream(Program *program,
- unsigned elementaryPID,
- unsigned streamType,
- unsigned streamTypeExt,
- unsigned PCR_PID,
- int32_t CA_system_ID);
+ Stream(Program *program, unsigned PCR_PID, const StreamInfo &info);
unsigned type() const { return mStreamType; }
unsigned typeExt() const { return mStreamTypeExt; }
@@ -221,6 +210,7 @@
sp<ABuffer> mDescrambledBuffer;
List<SubSampleInfo> mSubSamples;
sp<IDescrambler> mDescrambler;
+ AudioPresentationCollection mAudioPresentations;
// Flush accumulated payload if necessary --- i.e. at EOS or at the start of
// another payload. event is set if the flushed payload is PES with a sync
@@ -536,6 +526,8 @@
CADescriptor streamCA;
info.mTypeExt = EXT_DESCRIPTOR_DVB_RESERVED_MAX;
+
+ info.mAudioPresentations.clear();
bool hasStreamCA = false;
while (ES_info_length > 2 && infoBytesRemaining >= 0) {
unsigned descriptor_tag = br->getBits(8);
@@ -560,12 +552,94 @@
descriptor_tag == DESCRIPTOR_DVB_EXTENSION && descriptor_length >= 1) {
unsigned descTagExt = br->getBits(8);
ALOGV(" tag_ext = 0x%02x", descTagExt);
- if (descTagExt == EXT_DESCRIPTOR_DVB_AC4) {
- info.mTypeExt = EXT_DESCRIPTOR_DVB_AC4;
- }
ES_info_length -= descriptor_length;
descriptor_length--;
- br->skipBits(descriptor_length * 8);
+ // The AC4 descriptor is used in the PSI PMT to identify streams which carry AC4
+ // audio.
+ if (descTagExt == EXT_DESCRIPTOR_DVB_AC4) {
+ info.mTypeExt = EXT_DESCRIPTOR_DVB_AC4;
+ br->skipBits(descriptor_length * 8);
+ } else if (descTagExt == EXT_DESCRIPTOR_DVB_AUDIO_PRESELECTION &&
+ descriptor_length >= 1) {
+ // DVB BlueBook A038 Table 110
+ unsigned num_preselections = br->getBits(5);
+ br->skipBits(3); // reserved
+ for (unsigned i = 0; i < num_preselections; ++i) {
+ if (br->numBitsLeft() < 16) {
+ ALOGE("Not enough data left in bitreader!");
+ return ERROR_MALFORMED;
+ }
+ AudioPresentationV1 ap;
+ ap.mPresentationId = br->getBits(5); // preselection_id
+
+ // audio_rendering_indication
+ ap.mMasteringIndication = static_cast<MasteringIndication>(br->getBits(3));
+ ap.mAudioDescriptionAvailable = (br->getBits(1) == 1);
+ ap.mSpokenSubtitlesAvailable = (br->getBits(1) == 1);
+ ap.mDialogueEnhancementAvailable = (br->getBits(1) == 1);
+
+ bool interactivity_enabled = (br->getBits(1) == 1);
+ MY_LOGV(" interactivity_enabled = %d", interactivity_enabled);
+
+ bool language_code_present = (br->getBits(1) == 1);
+ bool text_label_present = (br->getBits(1) == 1);
+
+ bool multi_stream_info_present = (br->getBits(1) == 1);
+ bool future_extension = (br->getBits(1) == 1);
+ if (language_code_present) {
+ if (br->numBitsLeft() < 24) {
+ ALOGE("Not enough data left in bitreader!");
+ return ERROR_MALFORMED;
+ }
+ char language[4];
+ language[0] = br->getBits(8);
+ language[1] = br->getBits(8);
+ language[2] = br->getBits(8);
+ language[3] = 0;
+ ap.mLanguage = String8(language);
+ }
+
+ // This maps the presentation id to the message id in the
+ // EXT_DESCRIPTOR_DVB_MESSAGE so that we can get the presentation label.
+ if (text_label_present) {
+ if (br->numBitsLeft() < 8) {
+ ALOGE("Not enough data left in bitreader!");
+ return ERROR_MALFORMED;
+ }
+ unsigned message_id = br->getBits(8);
+ MY_LOGV(" message_id = %u", message_id);
+ }
+
+ if (multi_stream_info_present) {
+ if (br->numBitsLeft() < 8) {
+ ALOGE("Not enough data left in bitreader!");
+ return ERROR_MALFORMED;
+ }
+ unsigned num_aux_components = br->getBits(3);
+ br->skipBits(5); // reserved
+ if (br->numBitsLeft() < (num_aux_components * 8)) {
+ ALOGE("Not enough data left in bitreader!");
+ return ERROR_MALFORMED;
+ }
+ br->skipBits(num_aux_components * 8); // component_tag
+ }
+ if (future_extension) {
+ if (br->numBitsLeft() < 8) {
+ return ERROR_MALFORMED;
+ }
+ br->skipBits(3); // reserved
+ unsigned future_extension_length = br->getBits(5);
+ if (br->numBitsLeft() < (future_extension_length * 8)) {
+ ALOGE("Not enough data left in bitreader!");
+ return ERROR_MALFORMED;
+ }
+ br->skipBits(future_extension_length * 8); // future_extension_byte
+ }
+ info.mAudioPresentations.push_back(std::move(ap));
+ }
+ } else {
+ br->skipBits(descriptor_length * 8);
+ }
} else {
ES_info_length -= descriptor_length;
br->skipBits(descriptor_length * 8);
@@ -575,8 +649,12 @@
mProgramNumber, info.mPID, streamCA)) {
return ERROR_MALFORMED;
}
- info.mCASystemId = hasProgramCA ? programCA.mSystemID :
- hasStreamCA ? streamCA.mSystemID : -1;
+ if (hasProgramCA) {
+ info.mCADescriptor = programCA;
+ } else if (hasStreamCA) {
+ info.mCADescriptor = streamCA;
+ }
+
infos.push(info);
}
@@ -635,14 +713,13 @@
ssize_t index = mStreams.indexOfKey(info.mPID);
if (index < 0) {
- sp<Stream> stream = new Stream(
- this, info.mPID, info.mType, info.mTypeExt, PCR_PID, info.mCASystemId);
+ sp<Stream> stream = new Stream(this, PCR_PID, info);
if (mSampleAesKeyItem != NULL) {
stream->signalNewSampleAesKey(mSampleAesKeyItem);
}
- isAddingScrambledStream |= info.mCASystemId >= 0;
+ isAddingScrambledStream |= info.mCADescriptor.mSystemID >= 0;
mStreams.add(info.mPID, stream);
}
}
@@ -751,31 +828,26 @@
static const size_t kInitialStreamBufferSize = 192 * 1024;
ATSParser::Stream::Stream(
- Program *program,
- unsigned elementaryPID,
- unsigned streamType,
- unsigned streamTypeExt,
- unsigned PCR_PID,
- int32_t CA_system_ID)
+ Program *program, unsigned PCR_PID, const StreamInfo &info)
: mProgram(program),
- mElementaryPID(elementaryPID),
- mStreamType(streamType),
- mStreamTypeExt(streamTypeExt),
+ mElementaryPID(info.mPID),
+ mStreamType(info.mType),
+ mStreamTypeExt(info.mTypeExt),
mPCR_PID(PCR_PID),
mExpectedContinuityCounter(-1),
mPayloadStarted(false),
mEOSReached(false),
mPrevPTS(0),
mQueue(NULL),
- mScrambled(CA_system_ID >= 0) {
-
+ mScrambled(info.mCADescriptor.mSystemID >= 0),
+ mAudioPresentations(info.mAudioPresentations) {
mSampleEncrypted =
mStreamType == STREAMTYPE_H264_ENCRYPTED ||
mStreamType == STREAMTYPE_AAC_ENCRYPTED ||
mStreamType == STREAMTYPE_AC3_ENCRYPTED;
ALOGV("new stream PID 0x%02x, type 0x%02x, scrambled %d, SampleEncrypted: %d",
- elementaryPID, streamType, mScrambled, mSampleEncrypted);
+ info.mPID, info.mType, mScrambled, mSampleEncrypted);
uint32_t flags = 0;
if (((isVideo() || isAudio()) && mScrambled)) {
@@ -835,7 +907,7 @@
default:
ALOGE("stream PID 0x%02x has invalid stream type 0x%02x",
- elementaryPID, streamType);
+ info.mPID, info.mType);
return;
}
@@ -855,7 +927,13 @@
isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED
: MEDIA_MIMETYPE_VIDEO_SCRAMBLED);
// for MediaExtractor.CasInfo
- meta->setInt32(kKeyCASystemID, CA_system_ID);
+ const CADescriptor &descriptor = info.mCADescriptor;
+ meta->setInt32(kKeyCASystemID, descriptor.mSystemID);
+
+ meta->setData(kKeyCAPrivateData, 0,
+ descriptor.mPrivateData.data(),
+ descriptor.mPrivateData.size());
+
mSource = new AnotherPacketSource(meta);
}
}
@@ -1641,6 +1719,7 @@
}
mSource = new AnotherPacketSource(meta);
mSource->queueAccessUnit(accessUnit);
+ mSource->convertAudioPresentationInfoToMetadata(mAudioPresentations);
ALOGV("onPayloadData: created AnotherPacketSource PID 0x%08x of type 0x%02x",
mElementaryPID, mStreamType);
}
diff --git a/media/libstagefright/mpeg2ts/ATSParser.h b/media/libstagefright/mpeg2ts/ATSParser.h
index a31dc46..0ff2d7e 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.h
+++ b/media/libstagefright/mpeg2ts/ATSParser.h
@@ -23,6 +23,7 @@
#include <media/MediaSource.h>
#include <media/stagefright/foundation/ABase.h>
#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/foundation/AudioPresentationInfo.h>
#include <utils/KeyedVector.h>
#include <utils/Vector.h>
#include <utils/RefBase.h>
@@ -163,7 +164,7 @@
};
enum {
- // From ISO/IEC 13818-1: 2007 (E), Table 2-29
+ // From ISO/IEC 13818-1: 2007 (E), Table 2-45
DESCRIPTOR_CA = 0x09,
// DVB BlueBook A038 Table 12
@@ -172,8 +173,9 @@
// DVB BlueBook A038 Table 109
enum {
- EXT_DESCRIPTOR_DVB_AC4 = 0x15,
- EXT_DESCRIPTOR_DVB_RESERVED_MAX = 0x7F,
+ EXT_DESCRIPTOR_DVB_AC4 = 0x15,
+ EXT_DESCRIPTOR_DVB_AUDIO_PRESELECTION = 0x19,
+ EXT_DESCRIPTOR_DVB_RESERVED_MAX = 0x7F,
};
protected:
@@ -185,11 +187,20 @@
struct PSISection;
struct CasManager;
struct CADescriptor {
- int32_t mSystemID;
+ CADescriptor() : mPID(0), mSystemID(-1) {}
unsigned mPID;
+ int32_t mSystemID;
std::vector<uint8_t> mPrivateData;
};
+ struct StreamInfo {
+ unsigned mType;
+ unsigned mTypeExt;
+ unsigned mPID;
+ CADescriptor mCADescriptor;
+ AudioPresentationCollection mAudioPresentations;
+ };
+
sp<CasManager> mCasManager;
uint32_t mFlags;
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
index 9e154a3..e2c5031 100644
--- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
+++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
@@ -697,4 +697,23 @@
return firstMeta;
}
+void AnotherPacketSource::convertAudioPresentationInfoToMetadata(
+ const AudioPresentationCollection& presentations) {
+ sp<MetaData> meta = getFormat();
+ if (meta == NULL) {
+ return;
+ }
+ if (presentations.empty()) {
+ // Clear audio presentation info in metadata.
+ Mutex::Autolock autoLock(mLock);
+ meta->remove(kKeyAudioPresentationInfo);
+ } else {
+ std::ostringstream outStream(std::ios::out);
+ serializeAudioPresentations(presentations, &outStream);
+ Mutex::Autolock autoLock(mLock);
+ meta->setData(kKeyAudioPresentationInfo, MetaData::TYPE_NONE,
+ outStream.str().data(), outStream.str().size());
+ }
+}
+
} // namespace android
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.h b/media/libstagefright/mpeg2ts/AnotherPacketSource.h
index f4a6acb..57a6c33 100644
--- a/media/libstagefright/mpeg2ts/AnotherPacketSource.h
+++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.h
@@ -85,6 +85,8 @@
void trimBuffersAfterMeta(const sp<AMessage> &meta);
sp<AMessage> trimBuffersBeforeMeta(const sp<AMessage> &meta);
+ void convertAudioPresentationInfoToMetadata(const AudioPresentationCollection &presentations);
+
protected:
virtual ~AnotherPacketSource();
diff --git a/media/libstagefright/omx/OMXUtils.cpp b/media/libstagefright/omx/OMXUtils.cpp
index 9ed4a99..c499c77 100644
--- a/media/libstagefright/omx/OMXUtils.cpp
+++ b/media/libstagefright/omx/OMXUtils.cpp
@@ -164,6 +164,8 @@
"audio_decoder.ac3", "audio_encoder.ac3" },
{ MEDIA_MIMETYPE_AUDIO_EAC3,
"audio_decoder.eac3", "audio_encoder.eac3" },
+ { MEDIA_MIMETYPE_AUDIO_AC4,
+ "audio_decoder.ac4", "audio_encoder.ac4" },
{ MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC,
"image_decoder.heic", "image_encoder.heic" },
};
diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp
index 992dc9a..5dbcd08 100644
--- a/media/mtp/MtpDataPacket.cpp
+++ b/media/mtp/MtpDataPacket.cpp
@@ -561,7 +561,7 @@
return processedBytes == mPacketSize ? processedBytes : -1;
}
-int MtpDataPacket::write(struct usb_request *request,
+int64_t MtpDataPacket::write(struct usb_request *request,
UrbPacketDivisionMode divisionMode,
int fd,
size_t payloadSize) {
diff --git a/media/mtp/MtpDataPacket.h b/media/mtp/MtpDataPacket.h
index 1ddb821..138f7b0 100644
--- a/media/mtp/MtpDataPacket.h
+++ b/media/mtp/MtpDataPacket.h
@@ -117,7 +117,8 @@
int write(struct usb_request *request, UrbPacketDivisionMode divisionMode);
// Similar to previous write method but it reads the payload from |fd|. If |size| is larger than
// MTP_BUFFER_SIZE, the data will be sent by multiple bulk transfer requests.
- int write(struct usb_request *request, UrbPacketDivisionMode divisionMode,
+ // Return type (int64_t) is used to handle the case that the size can be larger than 2GB.
+ int64_t write(struct usb_request *request, UrbPacketDivisionMode divisionMode,
int fd, size_t size);
#endif
diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp
index 993797a..9665c58 100644
--- a/media/mtp/MtpDevice.cpp
+++ b/media/mtp/MtpDevice.cpp
@@ -516,7 +516,7 @@
return (MtpObjectHandle)-1;
}
-bool MtpDevice::sendObject(MtpObjectHandle handle, int size, int srcFD) {
+bool MtpDevice::sendObject(MtpObjectHandle handle, uint32_t size, int srcFD) {
std::lock_guard<std::mutex> lg(mMutex);
if (mLastSendObjectInfoTransactionID + 1 != mTransactionID ||
@@ -529,7 +529,7 @@
if (sendRequest(MTP_OPERATION_SEND_OBJECT)) {
mData.setOperationCode(mRequest.getOperationCode());
mData.setTransactionID(mRequest.getTransactionID());
- const int writeResult = mData.write(mRequestOut, mPacketDivisionMode, srcFD, size);
+ const int64_t writeResult = mData.write(mRequestOut, mPacketDivisionMode, srcFD, size);
const MtpResponseCode ret = readResponse();
return ret == MTP_RESPONSE_OK && writeResult > 0;
}
diff --git a/media/mtp/MtpDevice.h b/media/mtp/MtpDevice.h
index 8cf9e5e..01bc3db 100644
--- a/media/mtp/MtpDevice.h
+++ b/media/mtp/MtpDevice.h
@@ -104,7 +104,7 @@
MtpObjectInfo* getObjectInfo(MtpObjectHandle handle);
void* getThumbnail(MtpObjectHandle handle, int& outLength);
MtpObjectHandle sendObjectInfo(MtpObjectInfo* info);
- bool sendObject(MtpObjectHandle handle, int size, int srcFD);
+ bool sendObject(MtpObjectHandle handle, uint32_t size, int srcFD);
bool deleteObject(MtpObjectHandle handle);
MtpObjectHandle getParent(MtpObjectHandle handle);
MtpStorageID getStorageID(MtpObjectHandle handle);
diff --git a/media/ndk/Android.bp b/media/ndk/Android.bp
index b21a1bb..541ba3e 100644
--- a/media/ndk/Android.bp
+++ b/media/ndk/Android.bp
@@ -161,6 +161,7 @@
shared_libs: [
"libbinder",
"libmediandk",
+ "libmediautils",
"libnativewindow",
"libgui",
"libutils",
diff --git a/media/ndk/NdkImageReader.cpp b/media/ndk/NdkImageReader.cpp
index 1adecb9..b86ab42 100644
--- a/media/ndk/NdkImageReader.cpp
+++ b/media/ndk/NdkImageReader.cpp
@@ -647,31 +647,6 @@
return nh;
}
-static sp<HGraphicBufferProducer> convertNativeHandleToHGBP (
- const native_handle_t *handle) {
- // Read the size of the halToken vec<uint8_t>
- hidl_vec<uint8_t> halToken;
- halToken.setToExternal(
- reinterpret_cast<uint8_t *>(const_cast<int *>(&(handle->data[1]))),
- handle->data[0]);
- sp<HGraphicBufferProducer> hgbp =
- HGraphicBufferProducer::castFrom(retrieveHalInterface(halToken));
- return hgbp;
-}
-
-EXPORT
-sp<HGraphicBufferProducer> AImageReader_getHGBPFromHandle(
- const native_handle_t *handle) {
- if (handle == nullptr) {
- return nullptr;
- }
- if (handle->numFds != 0 ||
- handle->numInts < ceil(sizeof(size_t) / sizeof(int))) {
- return nullptr;
- }
- return convertNativeHandleToHGBP(handle);
-}
-
EXPORT
media_status_t AImageReader_new(
int32_t width, int32_t height, int32_t format, int32_t maxImages,
diff --git a/media/ndk/NdkImageReaderPriv.h b/media/ndk/NdkImageReaderPriv.h
index d9ddfd9..78152d2 100644
--- a/media/ndk/NdkImageReaderPriv.h
+++ b/media/ndk/NdkImageReaderPriv.h
@@ -169,8 +169,4 @@
Mutex mLock;
};
-// Retrieves HGraphicBufferProducer corresponding to the native_handle_t
-// provided (this native handle MUST have been obtained by AImageReader_getWindowNativeHandle()).
-sp<HGraphicBufferProducer> AImageReader_getHGBPFromHandle(const native_handle_t *handle);
-
#endif // _NDK_IMAGE_READER_PRIV_H
diff --git a/media/ndk/NdkMediaDataSource.cpp b/media/ndk/NdkMediaDataSource.cpp
index 3c10024..1abee93 100644
--- a/media/ndk/NdkMediaDataSource.cpp
+++ b/media/ndk/NdkMediaDataSource.cpp
@@ -59,6 +59,7 @@
AMediaDataSource_setGetSize(mDataSource, dataSource->getSize);
AMediaDataSource_setClose(mDataSource, dataSource->close);
AMediaDataSource_setUserdata(mDataSource, dataSource->userdata);
+ AMediaDataSource_setGetAvailableSize(mDataSource, dataSource->getAvailableSize);
mDataSource->mImpl = dataSource->mImpl;
mDataSource->mFlags = dataSource->mFlags;
}
diff --git a/media/ndk/NdkMediaDataSourceCallbacks.cpp b/media/ndk/NdkMediaDataSourceCallbacks.cpp
index f40387f..86a57da 100644
--- a/media/ndk/NdkMediaDataSourceCallbacks.cpp
+++ b/media/ndk/NdkMediaDataSourceCallbacks.cpp
@@ -43,8 +43,8 @@
ssize_t DataSource_getAvailableSize(void *userdata, off64_t offset) {
off64_t size = -1;
DataSource *source = static_cast<DataSource *>(userdata);
- status_t err = source->getAvailableSize(offset, &size);
- return err == OK ? size : -1;
+ source->getAvailableSize(offset, &size);
+ return size;
}
} // namespace android
diff --git a/media/ndk/NdkMediaFormat.cpp b/media/ndk/NdkMediaFormat.cpp
index b282ed8..bf9725c 100644
--- a/media/ndk/NdkMediaFormat.cpp
+++ b/media/ndk/NdkMediaFormat.cpp
@@ -272,6 +272,7 @@
EXPORT const char* AMEDIAFORMAT_KEY_ALBUMART = "albumart";
EXPORT const char* AMEDIAFORMAT_KEY_ALBUMARTIST = "albumartist";
EXPORT const char* AMEDIAFORMAT_KEY_ARTIST = "artist";
+EXPORT const char* AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_INFO = "audio-presentation-info";
EXPORT const char* AMEDIAFORMAT_KEY_AUDIO_SESSION_ID = "audio-session-id";
EXPORT const char* AMEDIAFORMAT_KEY_AUTHOR = "author";
EXPORT const char* AMEDIAFORMAT_KEY_BITRATE_MODE = "bitrate-mode";
diff --git a/media/ndk/include/media/NdkMediaFormat.h b/media/ndk/include/media/NdkMediaFormat.h
index 89cfd5e..658cbac 100644
--- a/media/ndk/include/media/NdkMediaFormat.h
+++ b/media/ndk/include/media/NdkMediaFormat.h
@@ -180,6 +180,7 @@
extern const char* AMEDIAFORMAT_KEY_ALBUMART __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_ALBUMARTIST __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_ARTIST __INTRODUCED_IN(29);
+extern const char* AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_INFO __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_AUTHOR __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_BITS_PER_SAMPLE __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CDTRACKNUMBER __INTRODUCED_IN(29);
diff --git a/media/ndk/tests/AImageReaderWindowHandleTest.cpp b/media/ndk/tests/AImageReaderWindowHandleTest.cpp
index 3b5e358..ef0ff67 100644
--- a/media/ndk/tests/AImageReaderWindowHandleTest.cpp
+++ b/media/ndk/tests/AImageReaderWindowHandleTest.cpp
@@ -17,6 +17,7 @@
#include <gtest/gtest.h>
#include <media/NdkImageReader.h>
#include <media/NdkImage.h>
+#include <mediautils/AImageReaderUtils.h>
#include <gui/IGraphicBufferProducer.h>
#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
#include <NdkImageReaderPriv.h>
@@ -26,6 +27,8 @@
namespace android {
using hardware::graphics::bufferqueue::V1_0::utils::H2BGraphicBufferProducer;
+using aimg::AImageReader_getHGBPFromHandle;
+
typedef IGraphicBufferProducer::QueueBufferInput QueueBufferInput;
typedef IGraphicBufferProducer::QueueBufferOutput QueueBufferOutput;
diff --git a/media/utils/AImageReaderUtils.cpp b/media/utils/AImageReaderUtils.cpp
new file mode 100644
index 0000000..d97c340
--- /dev/null
+++ b/media/utils/AImageReaderUtils.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <cmath>
+
+#include <mediautils/AImageReaderUtils.h>
+#include <hidl/HybridInterface.h>
+
+namespace android {
+namespace aimg {
+
+using hardware::hidl_vec;
+
+static sp<HGraphicBufferProducer> convertNativeHandleToHGBP (
+ const native_handle_t *handle) {
+ // Read the size of the halToken vec<uint8_t>
+ hidl_vec<uint8_t> halToken;
+ halToken.setToExternal(
+ reinterpret_cast<uint8_t *>(const_cast<int *>(&(handle->data[1]))),
+ handle->data[0]);
+ sp<HGraphicBufferProducer> hgbp =
+ HGraphicBufferProducer::castFrom(retrieveHalInterface(halToken));
+ return hgbp;
+}
+
+sp<HGraphicBufferProducer> AImageReader_getHGBPFromHandle(
+ const native_handle_t *handle) {
+ if (handle == nullptr) {
+ return nullptr;
+ }
+ if (handle->numFds != 0 ||
+ handle->numInts < std::ceil(sizeof(size_t) / sizeof(int))) {
+ return nullptr;
+ }
+ return convertNativeHandleToHGBP(handle);
+}
+
+} //namespace aimg
+} //namespace android
diff --git a/media/utils/Android.bp b/media/utils/Android.bp
index f5b3f92..b05e022 100644
--- a/media/utils/Android.bp
+++ b/media/utils/Android.bp
@@ -16,6 +16,7 @@
name: "libmediautils",
srcs: [
+ "AImageReaderUtils.cpp",
"BatteryNotifier.cpp",
"ISchedulingPolicyService.cpp",
"MemoryLeakTrackUtil.cpp",
@@ -30,6 +31,9 @@
"liblog",
"libutils",
"libmemunreachable",
+ "libhidlbase",
+ "android.hardware.graphics.bufferqueue@1.0",
+ "android.hidl.token@1.0-utils",
],
logtags: ["EventLogTags.logtags"],
diff --git a/media/utils/include/mediautils/AImageReaderUtils.h b/media/utils/include/mediautils/AImageReaderUtils.h
new file mode 100644
index 0000000..c9bde1f
--- /dev/null
+++ b/media/utils/include/mediautils/AImageReaderUtils.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AIMAGE_READER_UTILS_H
+#define AIMAGE_READER_UTILS_H
+
+#include <cutils/native_handle.h>
+#include <android/hardware/graphics/bufferqueue/1.0/IGraphicBufferProducer.h>
+
+namespace android {
+namespace aimg {
+
+using HGraphicBufferProducer = hardware::graphics::bufferqueue::V1_0::IGraphicBufferProducer;
+
+// Retrieves HGraphicBufferProducer corresponding to the native_handle_t
+// provided (this native handle MUST have been obtained by AImageReader_getWindowNativeHandle()).
+sp<HGraphicBufferProducer> AImageReader_getHGBPFromHandle(const native_handle_t *handle);
+
+}// namespace aimg
+}// namespace android
+
+#endif //AIMAGE_READER_UTILS_H
diff --git a/packages/MediaComponents/Android.mk b/packages/MediaComponents/Android.mk
deleted file mode 100644
index fff3a62..0000000
--- a/packages/MediaComponents/Android.mk
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# Copyright 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-ifneq ($(TARGET_BUILD_PDK),true) # Build MediaComponents only if this is not a PDK build. MediaComponents won't
-# build in PDK builds because frameworks/base/core/java is not available but
-# IMediaSession2.aidl and IMediaController2.aidl are using classes from
-# frameworks/base/core/java.
-
-include $(CLEAR_VARS)
-
-LOCAL_PACKAGE_NAME := MediaComponents
-LOCAL_MODULE_OWNER := google
-
-# TODO: create a separate key for this package.
-LOCAL_CERTIFICATE := platform
-
-# TODO: Use System SDK once public APIs are approved
-# LOCAL_SDK_VERSION := system_current
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, src) \
- $(call all-Iaidl-files-under, src)
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.cfg
-
-LOCAL_MULTILIB := first
-
-LOCAL_JAVA_LIBRARIES += androidx.annotation_annotation
-
-# To embed native libraries in package, uncomment the lines below.
-#LOCAL_MODULE_TAGS := samples
-#LOCAL_JNI_SHARED_LIBRARIES := \
-# libaacextractor \
-# libamrextractor \
-# libflacextractor \
-# libmidiextractor \
-# libmkvextractor \
-# libmp3extractor \
-# libmp4extractor \
-# libmpeg2extractor \
-# liboggextractor \
-# libwavextractor \
-
-# TODO: Remove dependency with other support libraries.
-LOCAL_STATIC_ANDROID_LIBRARIES += \
- androidx.legacy_legacy-support-v4 \
- androidx.appcompat_appcompat \
- androidx.palette_palette
-LOCAL_USE_AAPT2 := true
-
-include $(BUILD_PACKAGE)
-
-endif # ifneq ($(TARGET_BUILD_PDK),true)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/packages/MediaComponents/AndroidManifest.xml b/packages/MediaComponents/AndroidManifest.xml
deleted file mode 100644
index 50fdca1..0000000
--- a/packages/MediaComponents/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.media.update"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <application
- android:label="Media Components Update"
- android:multiArch="true"
- android:allowBackup="false"
- android:hasCode="false"
- android:extractNativeLibs="false">
- </application>
-
-</manifest>
diff --git a/packages/MediaComponents/apex/Android.bp b/packages/MediaComponents/apex/Android.bp
new file mode 100644
index 0000000..e797e14
--- /dev/null
+++ b/packages/MediaComponents/apex/Android.bp
@@ -0,0 +1,39 @@
+filegroup {
+ name: "media_aidl",
+ srcs: [
+ "java/android/media/**/*.aidl",
+ "java/android/service/**/*.aidl",
+ ],
+ exclude_srcs: [
+ // Exclude these aidls to avoid errors such as
+ // "Refusing to generate code with unstructured parcelables."
+ "java/android/media/MediaDescription.aidl",
+ "java/android/media/MediaMetadata.aidl",
+ "java/android/media/Rating.aidl",
+ "java/android/media/browse/MediaBrowser.aidl",
+ "java/android/media/session/MediaSession.aidl",
+ "java/android/media/session/ParcelableVolumeInfo.aidl",
+ "java/android/media/session/PlaybackState.aidl",
+ ],
+}
+
+java_library {
+ name: "media",
+ installable: true,
+ sdk_version: "system_current",
+ srcs: [
+ "java/android/media/**/*.java",
+ "java/android/service/**/*.java",
+ ":media_aidl",
+ ":framework-media-annotation-srcs",
+ ],
+ aidl: {
+ local_include_dirs: ["java"],
+ include_dirs: [
+ "frameworks/base/core/java",
+ // for android.graphics.Bitmap
+ // from IMediaBrowserServiceCallback
+ "frameworks/base/graphics/java",
+ ],
+ },
+}
diff --git a/packages/MediaComponents/apex/java/android/media/IRemoteVolumeController.aidl b/packages/MediaComponents/apex/java/android/media/IRemoteVolumeController.aidl
new file mode 100644
index 0000000..e4a4a42
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/IRemoteVolumeController.aidl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.media.session.ISessionController;
+
+/**
+ * AIDL for the MediaSessionService to report interesting events on remote playback
+ * to a volume control dialog. See also IVolumeController for the AudioService half.
+ * TODO add in better support for multiple remote sessions.
+ * @hide
+ */
+oneway interface IRemoteVolumeController {
+ void remoteVolumeChanged(ISessionController session, int flags);
+ // sets the default session to use with the slider, replaces remoteSliderVisibility
+ // on IVolumeController
+ void updateRemoteController(ISessionController session);
+}
diff --git a/packages/MediaComponents/apex/java/android/media/ISessionTokensListener.aidl b/packages/MediaComponents/apex/java/android/media/ISessionTokensListener.aidl
new file mode 100644
index 0000000..c83a19e
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/ISessionTokensListener.aidl
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.os.Bundle;
+
+/**
+ * Listens for changes to the list of session tokens.
+ * @hide
+ */
+oneway interface ISessionTokensListener {
+ void onSessionTokensChanged(in List<Bundle> tokens);
+}
diff --git a/packages/MediaComponents/apex/java/android/media/MediaDescription.aidl b/packages/MediaComponents/apex/java/android/media/MediaDescription.aidl
new file mode 100644
index 0000000..6f934f7
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/MediaDescription.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media;
+
+parcelable MediaDescription;
diff --git a/packages/MediaComponents/apex/java/android/media/MediaDescription.java b/packages/MediaComponents/apex/java/android/media/MediaDescription.java
new file mode 100644
index 0000000..31079e5
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/MediaDescription.java
@@ -0,0 +1,383 @@
+package android.media;
+
+import android.annotation.Nullable;
+import android.graphics.Bitmap;
+import android.media.browse.MediaBrowser;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.TextUtils;
+
+/**
+ * A simple set of metadata for a media item suitable for display. This can be
+ * created using the Builder or retrieved from existing metadata using
+ * {@link MediaMetadata#getDescription()}.
+ */
+public class MediaDescription implements Parcelable {
+ /**
+ * A unique persistent id for the content or null.
+ */
+ private final String mMediaId;
+ /**
+ * A primary title suitable for display or null.
+ */
+ private final CharSequence mTitle;
+ /**
+ * A subtitle suitable for display or null.
+ */
+ private final CharSequence mSubtitle;
+ /**
+ * A description suitable for display or null.
+ */
+ private final CharSequence mDescription;
+ /**
+ * A bitmap icon suitable for display or null.
+ */
+ private final Bitmap mIcon;
+ /**
+ * A Uri for an icon suitable for display or null.
+ */
+ private final Uri mIconUri;
+ /**
+ * Extras for opaque use by apps/system.
+ */
+ private final Bundle mExtras;
+ /**
+ * A Uri to identify this content.
+ */
+ private final Uri mMediaUri;
+
+ /**
+ * Used as a long extra field to indicate the bluetooth folder type of the media item as
+ * specified in the section 6.10.2.2 of the Bluetooth AVRCP 1.5. This is valid only for
+ * {@link MediaBrowser.MediaItem} with {@link MediaBrowser.MediaItem#FLAG_BROWSABLE}. The value
+ * should be one of the following:
+ * <ul>
+ * <li>{@link #BT_FOLDER_TYPE_MIXED}</li>
+ * <li>{@link #BT_FOLDER_TYPE_TITLES}</li>
+ * <li>{@link #BT_FOLDER_TYPE_ALBUMS}</li>
+ * <li>{@link #BT_FOLDER_TYPE_ARTISTS}</li>
+ * <li>{@link #BT_FOLDER_TYPE_GENRES}</li>
+ * <li>{@link #BT_FOLDER_TYPE_PLAYLISTS}</li>
+ * <li>{@link #BT_FOLDER_TYPE_YEARS}</li>
+ * </ul>
+ *
+ * @see #getExtras()
+ */
+ public static final String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
+
+ /**
+ * The type of folder that is unknown or contains media elements of mixed types as specified in
+ * the section 6.10.2.2 of the Bluetooth AVRCP 1.5.
+ */
+ public static final long BT_FOLDER_TYPE_MIXED = 0;
+
+ /**
+ * The type of folder that contains media elements only as specified in the section 6.10.2.2 of
+ * the Bluetooth AVRCP 1.5.
+ */
+ public static final long BT_FOLDER_TYPE_TITLES = 1;
+
+ /**
+ * The type of folder that contains folders categorized by album as specified in the section
+ * 6.10.2.2 of the Bluetooth AVRCP 1.5.
+ */
+ public static final long BT_FOLDER_TYPE_ALBUMS = 2;
+
+ /**
+ * The type of folder that contains folders categorized by artist as specified in the section
+ * 6.10.2.2 of the Bluetooth AVRCP 1.5.
+ */
+ public static final long BT_FOLDER_TYPE_ARTISTS = 3;
+
+ /**
+ * The type of folder that contains folders categorized by genre as specified in the section
+ * 6.10.2.2 of the Bluetooth AVRCP 1.5.
+ */
+ public static final long BT_FOLDER_TYPE_GENRES = 4;
+
+ /**
+ * The type of folder that contains folders categorized by playlist as specified in the section
+ * 6.10.2.2 of the Bluetooth AVRCP 1.5.
+ */
+ public static final long BT_FOLDER_TYPE_PLAYLISTS = 5;
+
+ /**
+ * The type of folder that contains folders categorized by year as specified in the section
+ * 6.10.2.2 of the Bluetooth AVRCP 1.5.
+ */
+ public static final long BT_FOLDER_TYPE_YEARS = 6;
+
+ private MediaDescription(String mediaId, CharSequence title, CharSequence subtitle,
+ CharSequence description, Bitmap icon, Uri iconUri, Bundle extras, Uri mediaUri) {
+ mMediaId = mediaId;
+ mTitle = title;
+ mSubtitle = subtitle;
+ mDescription = description;
+ mIcon = icon;
+ mIconUri = iconUri;
+ mExtras = extras;
+ mMediaUri = mediaUri;
+ }
+
+ private MediaDescription(Parcel in) {
+ mMediaId = in.readString();
+ mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+ mSubtitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+ mDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+ mIcon = in.readParcelable(null);
+ mIconUri = in.readParcelable(null);
+ mExtras = in.readBundle();
+ mMediaUri = in.readParcelable(null);
+ }
+
+ /**
+ * Returns the media id or null. See
+ * {@link MediaMetadata#METADATA_KEY_MEDIA_ID}.
+ */
+ public @Nullable String getMediaId() {
+ return mMediaId;
+ }
+
+ /**
+ * Returns a title suitable for display or null.
+ *
+ * @return A title or null.
+ */
+ public @Nullable CharSequence getTitle() {
+ return mTitle;
+ }
+
+ /**
+ * Returns a subtitle suitable for display or null.
+ *
+ * @return A subtitle or null.
+ */
+ public @Nullable CharSequence getSubtitle() {
+ return mSubtitle;
+ }
+
+ /**
+ * Returns a description suitable for display or null.
+ *
+ * @return A description or null.
+ */
+ public @Nullable CharSequence getDescription() {
+ return mDescription;
+ }
+
+ /**
+ * Returns a bitmap icon suitable for display or null.
+ *
+ * @return An icon or null.
+ */
+ public @Nullable Bitmap getIconBitmap() {
+ return mIcon;
+ }
+
+ /**
+ * Returns a Uri for an icon suitable for display or null.
+ *
+ * @return An icon uri or null.
+ */
+ public @Nullable Uri getIconUri() {
+ return mIconUri;
+ }
+
+ /**
+ * Returns any extras that were added to the description.
+ *
+ * @return A bundle of extras or null.
+ */
+ public @Nullable Bundle getExtras() {
+ return mExtras;
+ }
+
+ /**
+ * Returns a Uri representing this content or null.
+ *
+ * @return A media Uri or null.
+ */
+ public @Nullable Uri getMediaUri() {
+ return mMediaUri;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mMediaId);
+ TextUtils.writeToParcel(mTitle, dest, 0);
+ TextUtils.writeToParcel(mSubtitle, dest, 0);
+ TextUtils.writeToParcel(mDescription, dest, 0);
+ dest.writeParcelable(mIcon, flags);
+ dest.writeParcelable(mIconUri, flags);
+ dest.writeBundle(mExtras);
+ dest.writeParcelable(mMediaUri, flags);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null) {
+ return false;
+ }
+
+ if (!(o instanceof MediaDescription)){
+ return false;
+ }
+
+ final MediaDescription d = (MediaDescription) o;
+
+ if (!String.valueOf(mTitle).equals(String.valueOf(d.mTitle))) {
+ return false;
+ }
+
+ if (!String.valueOf(mSubtitle).equals(String.valueOf(d.mSubtitle))) {
+ return false;
+ }
+
+ if (!String.valueOf(mDescription).equals(String.valueOf(d.mDescription))) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return mTitle + ", " + mSubtitle + ", " + mDescription;
+ }
+
+ public static final Parcelable.Creator<MediaDescription> CREATOR =
+ new Parcelable.Creator<MediaDescription>() {
+ @Override
+ public MediaDescription createFromParcel(Parcel in) {
+ return new MediaDescription(in);
+ }
+
+ @Override
+ public MediaDescription[] newArray(int size) {
+ return new MediaDescription[size];
+ }
+ };
+
+ /**
+ * Builder for {@link MediaDescription} objects.
+ */
+ public static class Builder {
+ private String mMediaId;
+ private CharSequence mTitle;
+ private CharSequence mSubtitle;
+ private CharSequence mDescription;
+ private Bitmap mIcon;
+ private Uri mIconUri;
+ private Bundle mExtras;
+ private Uri mMediaUri;
+
+ /**
+ * Creates an initially empty builder.
+ */
+ public Builder() {
+ }
+
+ /**
+ * Sets the media id.
+ *
+ * @param mediaId The unique id for the item or null.
+ * @return this
+ */
+ public Builder setMediaId(@Nullable String mediaId) {
+ mMediaId = mediaId;
+ return this;
+ }
+
+ /**
+ * Sets the title.
+ *
+ * @param title A title suitable for display to the user or null.
+ * @return this
+ */
+ public Builder setTitle(@Nullable CharSequence title) {
+ mTitle = title;
+ return this;
+ }
+
+ /**
+ * Sets the subtitle.
+ *
+ * @param subtitle A subtitle suitable for display to the user or null.
+ * @return this
+ */
+ public Builder setSubtitle(@Nullable CharSequence subtitle) {
+ mSubtitle = subtitle;
+ return this;
+ }
+
+ /**
+ * Sets the description.
+ *
+ * @param description A description suitable for display to the user or
+ * null.
+ * @return this
+ */
+ public Builder setDescription(@Nullable CharSequence description) {
+ mDescription = description;
+ return this;
+ }
+
+ /**
+ * Sets the icon.
+ *
+ * @param icon A {@link Bitmap} icon suitable for display to the user or
+ * null.
+ * @return this
+ */
+ public Builder setIconBitmap(@Nullable Bitmap icon) {
+ mIcon = icon;
+ return this;
+ }
+
+ /**
+ * Sets the icon uri.
+ *
+ * @param iconUri A {@link Uri} for an icon suitable for display to the
+ * user or null.
+ * @return this
+ */
+ public Builder setIconUri(@Nullable Uri iconUri) {
+ mIconUri = iconUri;
+ return this;
+ }
+
+ /**
+ * Sets a bundle of extras.
+ *
+ * @param extras The extras to include with this description or null.
+ * @return this
+ */
+ public Builder setExtras(@Nullable Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /**
+ * Sets the media uri.
+ *
+ * @param mediaUri The content's {@link Uri} for the item or null.
+ * @return this
+ */
+ public Builder setMediaUri(@Nullable Uri mediaUri) {
+ mMediaUri = mediaUri;
+ return this;
+ }
+
+ public MediaDescription build() {
+ return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon, mIconUri,
+ mExtras, mMediaUri);
+ }
+ }
+}
diff --git a/packages/MediaComponents/apex/java/android/media/MediaMetadata.aidl b/packages/MediaComponents/apex/java/android/media/MediaMetadata.aidl
new file mode 100644
index 0000000..66ee483
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/MediaMetadata.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media;
+
+parcelable MediaMetadata;
diff --git a/packages/MediaComponents/apex/java/android/media/MediaMetadata.java b/packages/MediaComponents/apex/java/android/media/MediaMetadata.java
new file mode 100644
index 0000000..33e6916
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/MediaMetadata.java
@@ -0,0 +1,943 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media;
+
+import android.annotation.NonNull;
+import android.annotation.StringDef;
+import android.annotation.UnsupportedAppUsage;
+import android.content.ContentResolver;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.media.browse.MediaBrowser;
+import android.media.session.MediaController;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.util.SparseArray;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Set;
+import java.util.Objects;
+
+/**
+ * Contains metadata about an item, such as the title, artist, etc.
+ */
+public final class MediaMetadata implements Parcelable {
+ private static final String TAG = "MediaMetadata";
+
+ /**
+ * @hide
+ */
+ @StringDef(prefix = { "METADATA_KEY_" }, value = {
+ METADATA_KEY_TITLE,
+ METADATA_KEY_ARTIST,
+ METADATA_KEY_ALBUM,
+ METADATA_KEY_AUTHOR,
+ METADATA_KEY_WRITER,
+ METADATA_KEY_COMPOSER,
+ METADATA_KEY_COMPILATION,
+ METADATA_KEY_DATE,
+ METADATA_KEY_GENRE,
+ METADATA_KEY_ALBUM_ARTIST,
+ METADATA_KEY_ART_URI,
+ METADATA_KEY_ALBUM_ART_URI,
+ METADATA_KEY_DISPLAY_TITLE,
+ METADATA_KEY_DISPLAY_SUBTITLE,
+ METADATA_KEY_DISPLAY_DESCRIPTION,
+ METADATA_KEY_DISPLAY_ICON_URI,
+ METADATA_KEY_MEDIA_ID,
+ METADATA_KEY_MEDIA_URI,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface TextKey {}
+
+ /**
+ * @hide
+ */
+ @StringDef(prefix = { "METADATA_KEY_" }, value = {
+ METADATA_KEY_DURATION,
+ METADATA_KEY_YEAR,
+ METADATA_KEY_TRACK_NUMBER,
+ METADATA_KEY_NUM_TRACKS,
+ METADATA_KEY_DISC_NUMBER,
+ METADATA_KEY_BT_FOLDER_TYPE,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface LongKey {}
+
+ /**
+ * @hide
+ */
+ @StringDef(prefix = { "METADATA_KEY_" }, value = {
+ METADATA_KEY_ART,
+ METADATA_KEY_ALBUM_ART,
+ METADATA_KEY_DISPLAY_ICON,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface BitmapKey {}
+
+ /**
+ * @hide
+ */
+ @StringDef(prefix = { "METADATA_KEY_" }, value = {
+ METADATA_KEY_USER_RATING,
+ METADATA_KEY_RATING,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface RatingKey {}
+
+ /**
+ * The title of the media.
+ */
+ public static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
+
+ /**
+ * The artist of the media.
+ */
+ public static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
+
+ /**
+ * The duration of the media in ms. A negative duration indicates that the
+ * duration is unknown (or infinite).
+ */
+ public static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
+
+ /**
+ * The album title for the media.
+ */
+ public static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
+
+ /**
+ * The author of the media.
+ */
+ public static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
+
+ /**
+ * The writer of the media.
+ */
+ public static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
+
+ /**
+ * The composer of the media.
+ */
+ public static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
+
+ /**
+ * The compilation status of the media.
+ */
+ public static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
+
+ /**
+ * The date the media was created or published. The format is unspecified
+ * but RFC 3339 is recommended.
+ */
+ public static final String METADATA_KEY_DATE = "android.media.metadata.DATE";
+
+ /**
+ * The year the media was created or published as a long.
+ */
+ public static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
+
+ /**
+ * The genre of the media.
+ */
+ public static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
+
+ /**
+ * The track number for the media.
+ */
+ public static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+
+ /**
+ * The number of tracks in the media's original source.
+ */
+ public static final String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
+
+ /**
+ * The disc number for the media's original source.
+ */
+ public static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+
+ /**
+ * The artist for the album of the media's original source.
+ */
+ public static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+
+ /**
+ * The artwork for the media as a {@link Bitmap}.
+ * <p>
+ * The artwork should be relatively small and may be scaled down by the
+ * system if it is too large. For higher resolution artwork
+ * {@link #METADATA_KEY_ART_URI} should be used instead.
+ */
+ public static final String METADATA_KEY_ART = "android.media.metadata.ART";
+
+ /**
+ * The artwork for the media as a Uri formatted String. The artwork can be
+ * loaded using a combination of {@link ContentResolver#openInputStream} and
+ * {@link BitmapFactory#decodeStream}.
+ * <p>
+ * For the best results, Uris should use the content:// style and support
+ * {@link ContentResolver#EXTRA_SIZE} for retrieving scaled artwork through
+ * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}.
+ */
+ public static final String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
+
+ /**
+ * The artwork for the album of the media's original source as a
+ * {@link Bitmap}.
+ * <p>
+ * The artwork should be relatively small and may be scaled down by the
+ * system if it is too large. For higher resolution artwork
+ * {@link #METADATA_KEY_ALBUM_ART_URI} should be used instead.
+ */
+ public static final String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
+
+ /**
+ * The artwork for the album of the media's original source as a Uri
+ * formatted String. The artwork can be loaded using a combination of
+ * {@link ContentResolver#openInputStream} and
+ * {@link BitmapFactory#decodeStream}.
+ * <p>
+ * For the best results, Uris should use the content:// style and support
+ * {@link ContentResolver#EXTRA_SIZE} for retrieving scaled artwork through
+ * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}.
+ */
+ public static final String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
+
+ /**
+ * The user's rating for the media.
+ *
+ * @see Rating
+ */
+ public static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
+
+ /**
+ * The overall rating for the media.
+ *
+ * @see Rating
+ */
+ public static final String METADATA_KEY_RATING = "android.media.metadata.RATING";
+
+ /**
+ * A title that is suitable for display to the user. This will generally be
+ * the same as {@link #METADATA_KEY_TITLE} but may differ for some formats.
+ * When displaying media described by this metadata this should be preferred
+ * if present.
+ */
+ public static final String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
+
+ /**
+ * A subtitle that is suitable for display to the user. When displaying a
+ * second line for media described by this metadata this should be preferred
+ * to other fields if present.
+ */
+ public static final String METADATA_KEY_DISPLAY_SUBTITLE
+ = "android.media.metadata.DISPLAY_SUBTITLE";
+
+ /**
+ * A description that is suitable for display to the user. When displaying
+ * more information for media described by this metadata this should be
+ * preferred to other fields if present.
+ */
+ public static final String METADATA_KEY_DISPLAY_DESCRIPTION
+ = "android.media.metadata.DISPLAY_DESCRIPTION";
+
+ /**
+ * An icon or thumbnail that is suitable for display to the user. When
+ * displaying an icon for media described by this metadata this should be
+ * preferred to other fields if present. This must be a {@link Bitmap}.
+ * <p>
+ * The icon should be relatively small and may be scaled down by the system
+ * if it is too large. For higher resolution artwork
+ * {@link #METADATA_KEY_DISPLAY_ICON_URI} should be used instead.
+ */
+ public static final String METADATA_KEY_DISPLAY_ICON
+ = "android.media.metadata.DISPLAY_ICON";
+
+ /**
+ * A Uri formatted String for an icon or thumbnail that is suitable for
+ * display to the user. When displaying more information for media described
+ * by this metadata the display description should be preferred to other
+ * fields when present. The icon can be loaded using a combination of
+ * {@link ContentResolver#openInputStream} and
+ * {@link BitmapFactory#decodeStream}.
+ * <p>
+ * For the best results, Uris should use the content:// style and support
+ * {@link ContentResolver#EXTRA_SIZE} for retrieving scaled artwork through
+ * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}.
+ */
+ public static final String METADATA_KEY_DISPLAY_ICON_URI
+ = "android.media.metadata.DISPLAY_ICON_URI";
+
+ /**
+ * A String key for identifying the content. This value is specific to the
+ * service providing the content. If used, this should be a persistent
+ * unique key for the underlying content. It may be used with
+ * {@link MediaController.TransportControls#playFromMediaId(String, Bundle)}
+ * to initiate playback when provided by a {@link MediaBrowser} connected to
+ * the same app.
+ */
+ public static final String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
+
+ /**
+ * A Uri formatted String representing the content. This value is specific to the
+ * service providing the content. It may be used with
+ * {@link MediaController.TransportControls#playFromUri(Uri, Bundle)}
+ * to initiate playback when provided by a {@link MediaBrowser} connected to
+ * the same app.
+ */
+ public static final String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI";
+
+ /**
+ * The bluetooth folder type of the media specified in the section 6.10.2.2 of the Bluetooth
+ * AVRCP 1.5. It should be one of the following:
+ * <ul>
+ * <li>{@link MediaDescription#BT_FOLDER_TYPE_MIXED}</li>
+ * <li>{@link MediaDescription#BT_FOLDER_TYPE_TITLES}</li>
+ * <li>{@link MediaDescription#BT_FOLDER_TYPE_ALBUMS}</li>
+ * <li>{@link MediaDescription#BT_FOLDER_TYPE_ARTISTS}</li>
+ * <li>{@link MediaDescription#BT_FOLDER_TYPE_GENRES}</li>
+ * <li>{@link MediaDescription#BT_FOLDER_TYPE_PLAYLISTS}</li>
+ * <li>{@link MediaDescription#BT_FOLDER_TYPE_YEARS}</li>
+ * </ul>
+ */
+ public static final String METADATA_KEY_BT_FOLDER_TYPE
+ = "android.media.metadata.BT_FOLDER_TYPE";
+
+ private static final @TextKey String[] PREFERRED_DESCRIPTION_ORDER = {
+ METADATA_KEY_TITLE,
+ METADATA_KEY_ARTIST,
+ METADATA_KEY_ALBUM,
+ METADATA_KEY_ALBUM_ARTIST,
+ METADATA_KEY_WRITER,
+ METADATA_KEY_AUTHOR,
+ METADATA_KEY_COMPOSER
+ };
+
+ private static final @BitmapKey String[] PREFERRED_BITMAP_ORDER = {
+ METADATA_KEY_DISPLAY_ICON,
+ METADATA_KEY_ART,
+ METADATA_KEY_ALBUM_ART
+ };
+
+ private static final @TextKey String[] PREFERRED_URI_ORDER = {
+ METADATA_KEY_DISPLAY_ICON_URI,
+ METADATA_KEY_ART_URI,
+ METADATA_KEY_ALBUM_ART_URI
+ };
+
+ private static final int METADATA_TYPE_INVALID = -1;
+ private static final int METADATA_TYPE_LONG = 0;
+ private static final int METADATA_TYPE_TEXT = 1;
+ private static final int METADATA_TYPE_BITMAP = 2;
+ private static final int METADATA_TYPE_RATING = 3;
+ private static final ArrayMap<String, Integer> METADATA_KEYS_TYPE;
+
+ static {
+ METADATA_KEYS_TYPE = new ArrayMap<String, Integer>();
+ METADATA_KEYS_TYPE.put(METADATA_KEY_TITLE, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_ARTIST, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_DURATION, METADATA_TYPE_LONG);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_AUTHOR, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_WRITER, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_COMPOSER, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_COMPILATION, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_DATE, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_YEAR, METADATA_TYPE_LONG);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_GENRE, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_TRACK_NUMBER, METADATA_TYPE_LONG);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_NUM_TRACKS, METADATA_TYPE_LONG);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_DISC_NUMBER, METADATA_TYPE_LONG);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ARTIST, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_ART, METADATA_TYPE_BITMAP);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_ART_URI, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ART, METADATA_TYPE_BITMAP);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ART_URI, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_USER_RATING, METADATA_TYPE_RATING);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_RATING, METADATA_TYPE_RATING);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_TITLE, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_SUBTITLE, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_DESCRIPTION, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_ICON, METADATA_TYPE_BITMAP);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_ICON_URI, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_BT_FOLDER_TYPE, METADATA_TYPE_LONG);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_MEDIA_ID, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_MEDIA_URI, METADATA_TYPE_TEXT);
+ }
+
+ private static final SparseArray<String> EDITOR_KEY_MAPPING;
+
+ static {
+ EDITOR_KEY_MAPPING = new SparseArray<String>();
+ EDITOR_KEY_MAPPING.put(MediaMetadataEditor.BITMAP_KEY_ARTWORK, METADATA_KEY_ART);
+ EDITOR_KEY_MAPPING.put(MediaMetadataEditor.RATING_KEY_BY_OTHERS, METADATA_KEY_RATING);
+ EDITOR_KEY_MAPPING.put(MediaMetadataEditor.RATING_KEY_BY_USER, METADATA_KEY_USER_RATING);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_ALBUM, METADATA_KEY_ALBUM);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST,
+ METADATA_KEY_ALBUM_ARTIST);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_ARTIST, METADATA_KEY_ARTIST);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_AUTHOR, METADATA_KEY_AUTHOR);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER,
+ METADATA_KEY_TRACK_NUMBER);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_COMPOSER, METADATA_KEY_COMPOSER);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_COMPILATION,
+ METADATA_KEY_COMPILATION);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_DATE, METADATA_KEY_DATE);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_DISC_NUMBER,
+ METADATA_KEY_DISC_NUMBER);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_DURATION, METADATA_KEY_DURATION);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_GENRE, METADATA_KEY_GENRE);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS,
+ METADATA_KEY_NUM_TRACKS);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_TITLE, METADATA_KEY_TITLE);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_WRITER, METADATA_KEY_WRITER);
+ EDITOR_KEY_MAPPING.put(MediaMetadataRetriever.METADATA_KEY_YEAR, METADATA_KEY_YEAR);
+ }
+
+ private final Bundle mBundle;
+ private MediaDescription mDescription;
+
+ private MediaMetadata(Bundle bundle) {
+ mBundle = new Bundle(bundle);
+ }
+
+ private MediaMetadata(Parcel in) {
+ //TODO(b/119789387): Resolve hidden API usage: Bundle#setDefusable
+ //mBundle = Bundle.setDefusable(in.readBundle(), true);
+ mBundle = new Bundle(); //TODO:remove this.
+ }
+
+ /**
+ * Returns true if the given key is contained in the metadata
+ *
+ * @param key a String key
+ * @return true if the key exists in this metadata, false otherwise
+ */
+ public boolean containsKey(String key) {
+ return mBundle.containsKey(key);
+ }
+
+ /**
+ * Returns the value associated with the given key, or null if no mapping of
+ * the desired type exists for the given key or a null value is explicitly
+ * associated with the key.
+ *
+ * @param key The key the value is stored under
+ * @return a CharSequence value, or null
+ */
+ public CharSequence getText(@TextKey String key) {
+ return mBundle.getCharSequence(key);
+ }
+
+ /**
+ * Returns the text value associated with the given key as a String, or null
+ * if no mapping of the desired type exists for the given key or a null
+ * value is explicitly associated with the key. This is equivalent to
+ * calling {@link #getText getText().toString()} if the value is not null.
+ *
+ * @param key The key the value is stored under
+ * @return a String value, or null
+ */
+ public String getString(@TextKey String key) {
+ CharSequence text = getText(key);
+ if (text != null) {
+ return text.toString();
+ }
+ return null;
+ }
+
+ /**
+ * Returns the value associated with the given key, or 0L if no long exists
+ * for the given key.
+ *
+ * @param key The key the value is stored under
+ * @return a long value
+ */
+ public long getLong(@LongKey String key) {
+ return mBundle.getLong(key, 0);
+ }
+
+ /**
+ * Returns a {@link Rating} for the given key or null if no rating exists
+ * for the given key.
+ *
+ * @param key The key the value is stored under
+ * @return A {@link Rating} or null
+ */
+ public Rating getRating(@RatingKey String key) {
+ Rating rating = null;
+ try {
+ rating = mBundle.getParcelable(key);
+ } catch (Exception e) {
+ // ignore, value was not a bitmap
+ Log.w(TAG, "Failed to retrieve a key as Rating.", e);
+ }
+ return rating;
+ }
+
+ /**
+ * Returns a {@link Bitmap} for the given key or null if no bitmap exists
+ * for the given key.
+ *
+ * @param key The key the value is stored under
+ * @return A {@link Bitmap} or null
+ */
+ public Bitmap getBitmap(@BitmapKey String key) {
+ Bitmap bmp = null;
+ try {
+ bmp = mBundle.getParcelable(key);
+ } catch (Exception e) {
+ // ignore, value was not a bitmap
+ Log.w(TAG, "Failed to retrieve a key as Bitmap.", e);
+ }
+ return bmp;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeBundle(mBundle);
+ }
+
+ /**
+ * Returns the number of fields in this metadata.
+ *
+ * @return The number of fields in the metadata.
+ */
+ public int size() {
+ return mBundle.size();
+ }
+
+ /**
+ * Returns a Set containing the Strings used as keys in this metadata.
+ *
+ * @return a Set of String keys
+ */
+ public Set<String> keySet() {
+ return mBundle.keySet();
+ }
+
+ /**
+ * Returns a simple description of this metadata for display purposes.
+ *
+ * @return A simple description of this metadata.
+ */
+ public @NonNull MediaDescription getDescription() {
+ if (mDescription != null) {
+ return mDescription;
+ }
+
+ String mediaId = getString(METADATA_KEY_MEDIA_ID);
+
+ CharSequence[] text = new CharSequence[3];
+ Bitmap icon = null;
+ Uri iconUri = null;
+
+ // First handle the case where display data is set already
+ CharSequence displayText = getText(METADATA_KEY_DISPLAY_TITLE);
+ if (!TextUtils.isEmpty(displayText)) {
+ // If they have a display title use only display data, otherwise use
+ // our best bets
+ text[0] = displayText;
+ text[1] = getText(METADATA_KEY_DISPLAY_SUBTITLE);
+ text[2] = getText(METADATA_KEY_DISPLAY_DESCRIPTION);
+ } else {
+ // Use whatever fields we can
+ int textIndex = 0;
+ int keyIndex = 0;
+ while (textIndex < text.length && keyIndex < PREFERRED_DESCRIPTION_ORDER.length) {
+ CharSequence next = getText(PREFERRED_DESCRIPTION_ORDER[keyIndex++]);
+ if (!TextUtils.isEmpty(next)) {
+ // Fill in the next empty bit of text
+ text[textIndex++] = next;
+ }
+ }
+ }
+
+ // Get the best art bitmap we can find
+ for (int i = 0; i < PREFERRED_BITMAP_ORDER.length; i++) {
+ Bitmap next = getBitmap(PREFERRED_BITMAP_ORDER[i]);
+ if (next != null) {
+ icon = next;
+ break;
+ }
+ }
+
+ // Get the best Uri we can find
+ for (int i = 0; i < PREFERRED_URI_ORDER.length; i++) {
+ String next = getString(PREFERRED_URI_ORDER[i]);
+ if (!TextUtils.isEmpty(next)) {
+ iconUri = Uri.parse(next);
+ break;
+ }
+ }
+
+ Uri mediaUri = null;
+ String mediaUriStr = getString(METADATA_KEY_MEDIA_URI);
+ if (!TextUtils.isEmpty(mediaUriStr)) {
+ mediaUri = Uri.parse(mediaUriStr);
+ }
+
+ MediaDescription.Builder bob = new MediaDescription.Builder();
+ bob.setMediaId(mediaId);
+ bob.setTitle(text[0]);
+ bob.setSubtitle(text[1]);
+ bob.setDescription(text[2]);
+ bob.setIconBitmap(icon);
+ bob.setIconUri(iconUri);
+ bob.setMediaUri(mediaUri);
+ if (mBundle.containsKey(METADATA_KEY_BT_FOLDER_TYPE)) {
+ Bundle bundle = new Bundle();
+ bundle.putLong(MediaDescription.EXTRA_BT_FOLDER_TYPE,
+ getLong(METADATA_KEY_BT_FOLDER_TYPE));
+ bob.setExtras(bundle);
+ }
+ mDescription = bob.build();
+
+ return mDescription;
+ }
+
+ /**
+ * Helper for getting the String key used by {@link MediaMetadata} from the
+ * integer key that {@link MediaMetadataEditor} uses.
+ *
+ * @param editorKey The key used by the editor
+ * @return The key used by this class or null if no mapping exists
+ * @hide
+ */
+ @UnsupportedAppUsage
+ public static String getKeyFromMetadataEditorKey(int editorKey) {
+ return EDITOR_KEY_MAPPING.get(editorKey, null);
+ }
+
+ public static final Parcelable.Creator<MediaMetadata> CREATOR =
+ new Parcelable.Creator<MediaMetadata>() {
+ @Override
+ public MediaMetadata createFromParcel(Parcel in) {
+ return new MediaMetadata(in);
+ }
+
+ @Override
+ public MediaMetadata[] newArray(int size) {
+ return new MediaMetadata[size];
+ }
+ };
+
+ /**
+ * Compares the contents of this object to another MediaMetadata object. It
+ * does not compare Bitmaps and Ratings as the media player can choose to
+ * forgo these fields depending on how you retrieve the MediaMetadata.
+ *
+ * @param o The Metadata object to compare this object against
+ * @return Whether or not the two objects have matching fields (excluding
+ * Bitmaps and Ratings)
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+
+ if (!(o instanceof MediaMetadata)) {
+ return false;
+ }
+
+ final MediaMetadata m = (MediaMetadata) o;
+
+ for (int i = 0; i < METADATA_KEYS_TYPE.size(); i++) {
+ String key = METADATA_KEYS_TYPE.keyAt(i);
+ switch (METADATA_KEYS_TYPE.valueAt(i)) {
+ case METADATA_TYPE_TEXT:
+ if (!Objects.equals(getString(key), m.getString(key))) {
+ return false;
+ }
+ break;
+ case METADATA_TYPE_LONG:
+ if (getLong(key) != m.getLong(key)) {
+ return false;
+ }
+ break;
+ default:
+ // Ignore ratings and bitmaps when comparing
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int hashCode = 17;
+
+ for (int i = 0; i < METADATA_KEYS_TYPE.size(); i++) {
+ String key = METADATA_KEYS_TYPE.keyAt(i);
+ switch (METADATA_KEYS_TYPE.valueAt(i)) {
+ case METADATA_TYPE_TEXT:
+ hashCode = 31 * hashCode + Objects.hash(getString(key));
+ break;
+ case METADATA_TYPE_LONG:
+ hashCode = 31 * hashCode + Long.hashCode(getLong(key));
+ break;
+ default:
+ // Ignore ratings and bitmaps when comparing
+ break;
+ }
+ }
+
+ return hashCode;
+ }
+
+ /**
+ * Use to build MediaMetadata objects. The system defined metadata keys must
+ * use the appropriate data type.
+ */
+ public static final class Builder {
+ private final Bundle mBundle;
+
+ /**
+ * Create an empty Builder. Any field that should be included in the
+ * {@link MediaMetadata} must be added.
+ */
+ public Builder() {
+ mBundle = new Bundle();
+ }
+
+ /**
+ * Create a Builder using a {@link MediaMetadata} instance to set the
+ * initial values. All fields in the source metadata will be included in
+ * the new metadata. Fields can be overwritten by adding the same key.
+ *
+ * @param source
+ */
+ public Builder(MediaMetadata source) {
+ mBundle = new Bundle(source.mBundle);
+ }
+
+ /**
+ * Create a Builder using a {@link MediaMetadata} instance to set
+ * initial values, but replace bitmaps with a scaled down copy if they
+ * are larger than maxBitmapSize.
+ *
+ * @param source The original metadata to copy.
+ * @param maxBitmapSize The maximum height/width for bitmaps contained
+ * in the metadata.
+ * @hide
+ */
+ public Builder(MediaMetadata source, int maxBitmapSize) {
+ this(source);
+ for (String key : mBundle.keySet()) {
+ Object value = mBundle.get(key);
+ if (value != null && value instanceof Bitmap) {
+ Bitmap bmp = (Bitmap) value;
+ if (bmp.getHeight() > maxBitmapSize || bmp.getWidth() > maxBitmapSize) {
+ putBitmap(key, scaleBitmap(bmp, maxBitmapSize));
+ }
+ }
+ }
+ }
+
+ /**
+ * Put a CharSequence value into the metadata. Custom keys may be used,
+ * but if the METADATA_KEYs defined in this class are used they may only
+ * be one of the following:
+ * <ul>
+ * <li>{@link #METADATA_KEY_TITLE}</li>
+ * <li>{@link #METADATA_KEY_ARTIST}</li>
+ * <li>{@link #METADATA_KEY_ALBUM}</li>
+ * <li>{@link #METADATA_KEY_AUTHOR}</li>
+ * <li>{@link #METADATA_KEY_WRITER}</li>
+ * <li>{@link #METADATA_KEY_COMPOSER}</li>
+ * <li>{@link #METADATA_KEY_DATE}</li>
+ * <li>{@link #METADATA_KEY_GENRE}</li>
+ * <li>{@link #METADATA_KEY_ALBUM_ARTIST}</li>
+ * <li>{@link #METADATA_KEY_ART_URI}</li>
+ * <li>{@link #METADATA_KEY_ALBUM_ART_URI}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_TITLE}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_SUBTITLE}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_DESCRIPTION}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_ICON_URI}</li>
+ * </ul>
+ *
+ * @param key The key for referencing this value
+ * @param value The CharSequence value to store
+ * @return The Builder to allow chaining
+ */
+ public Builder putText(@TextKey String key, CharSequence value) {
+ if (METADATA_KEYS_TYPE.containsKey(key)) {
+ if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_TEXT) {
+ throw new IllegalArgumentException("The " + key
+ + " key cannot be used to put a CharSequence");
+ }
+ }
+ mBundle.putCharSequence(key, value);
+ return this;
+ }
+
+ /**
+ * Put a String value into the metadata. Custom keys may be used, but if
+ * the METADATA_KEYs defined in this class are used they may only be one
+ * of the following:
+ * <ul>
+ * <li>{@link #METADATA_KEY_TITLE}</li>
+ * <li>{@link #METADATA_KEY_ARTIST}</li>
+ * <li>{@link #METADATA_KEY_ALBUM}</li>
+ * <li>{@link #METADATA_KEY_AUTHOR}</li>
+ * <li>{@link #METADATA_KEY_WRITER}</li>
+ * <li>{@link #METADATA_KEY_COMPOSER}</li>
+ * <li>{@link #METADATA_KEY_DATE}</li>
+ * <li>{@link #METADATA_KEY_GENRE}</li>
+ * <li>{@link #METADATA_KEY_ALBUM_ARTIST}</li>
+ * <li>{@link #METADATA_KEY_ART_URI}</li>
+ * <li>{@link #METADATA_KEY_ALBUM_ART_URI}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_TITLE}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_SUBTITLE}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_DESCRIPTION}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_ICON_URI}</li>
+ * </ul>
+ * <p>
+ * Uris for artwork should use the content:// style and support
+ * {@link ContentResolver#EXTRA_SIZE} for retrieving scaled artwork
+ * through {@link ContentResolver#openTypedAssetFileDescriptor(Uri,
+ * String, Bundle)}.
+ *
+ * @param key The key for referencing this value
+ * @param value The String value to store
+ * @return The Builder to allow chaining
+ */
+ public Builder putString(@TextKey String key, String value) {
+ if (METADATA_KEYS_TYPE.containsKey(key)) {
+ if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_TEXT) {
+ throw new IllegalArgumentException("The " + key
+ + " key cannot be used to put a String");
+ }
+ }
+ mBundle.putCharSequence(key, value);
+ return this;
+ }
+
+ /**
+ * Put a long value into the metadata. Custom keys may be used, but if
+ * the METADATA_KEYs defined in this class are used they may only be one
+ * of the following:
+ * <ul>
+ * <li>{@link #METADATA_KEY_DURATION}</li>
+ * <li>{@link #METADATA_KEY_TRACK_NUMBER}</li>
+ * <li>{@link #METADATA_KEY_NUM_TRACKS}</li>
+ * <li>{@link #METADATA_KEY_DISC_NUMBER}</li>
+ * <li>{@link #METADATA_KEY_YEAR}</li>
+ * </ul>
+ *
+ * @param key The key for referencing this value
+ * @param value The long value to store
+ * @return The Builder to allow chaining
+ */
+ public Builder putLong(@LongKey String key, long value) {
+ if (METADATA_KEYS_TYPE.containsKey(key)) {
+ if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_LONG) {
+ throw new IllegalArgumentException("The " + key
+ + " key cannot be used to put a long");
+ }
+ }
+ mBundle.putLong(key, value);
+ return this;
+ }
+
+ /**
+ * Put a {@link Rating} into the metadata. Custom keys may be used, but
+ * if the METADATA_KEYs defined in this class are used they may only be
+ * one of the following:
+ * <ul>
+ * <li>{@link #METADATA_KEY_RATING}</li>
+ * <li>{@link #METADATA_KEY_USER_RATING}</li>
+ * </ul>
+ *
+ * @param key The key for referencing this value
+ * @param value The Rating value to store
+ * @return The Builder to allow chaining
+ */
+ public Builder putRating(@RatingKey String key, Rating value) {
+ if (METADATA_KEYS_TYPE.containsKey(key)) {
+ if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_RATING) {
+ throw new IllegalArgumentException("The " + key
+ + " key cannot be used to put a Rating");
+ }
+ }
+ mBundle.putParcelable(key, value);
+ return this;
+ }
+
+ /**
+ * Put a {@link Bitmap} into the metadata. Custom keys may be used, but
+ * if the METADATA_KEYs defined in this class are used they may only be
+ * one of the following:
+ * <ul>
+ * <li>{@link #METADATA_KEY_ART}</li>
+ * <li>{@link #METADATA_KEY_ALBUM_ART}</li>
+ * <li>{@link #METADATA_KEY_DISPLAY_ICON}</li>
+ * </ul>
+ * <p>
+ * Large bitmaps may be scaled down by the system when
+ * {@link android.media.session.MediaSession#setMetadata} is called.
+ * To pass full resolution images {@link Uri Uris} should be used with
+ * {@link #putString}.
+ *
+ * @param key The key for referencing this value
+ * @param value The Bitmap to store
+ * @return The Builder to allow chaining
+ */
+ public Builder putBitmap(@BitmapKey String key, Bitmap value) {
+ if (METADATA_KEYS_TYPE.containsKey(key)) {
+ if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_BITMAP) {
+ throw new IllegalArgumentException("The " + key
+ + " key cannot be used to put a Bitmap");
+ }
+ }
+ mBundle.putParcelable(key, value);
+ return this;
+ }
+
+ /**
+ * Creates a {@link MediaMetadata} instance with the specified fields.
+ *
+ * @return The new MediaMetadata instance
+ */
+ public MediaMetadata build() {
+ return new MediaMetadata(mBundle);
+ }
+
+ private Bitmap scaleBitmap(Bitmap bmp, int maxSize) {
+ float maxSizeF = maxSize;
+ float widthScale = maxSizeF / bmp.getWidth();
+ float heightScale = maxSizeF / bmp.getHeight();
+ float scale = Math.min(widthScale, heightScale);
+ int height = (int) (bmp.getHeight() * scale);
+ int width = (int) (bmp.getWidth() * scale);
+ return Bitmap.createScaledBitmap(bmp, width, height, true);
+ }
+ }
+}
diff --git a/packages/MediaComponents/apex/java/android/media/Rating.aidl b/packages/MediaComponents/apex/java/android/media/Rating.aidl
new file mode 100644
index 0000000..1dc336a
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/Rating.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+parcelable Rating;
diff --git a/packages/MediaComponents/apex/java/android/media/Rating.java b/packages/MediaComponents/apex/java/android/media/Rating.java
new file mode 100644
index 0000000..04d5364
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/Rating.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media;
+
+import android.annotation.IntDef;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * A class to encapsulate rating information used as content metadata.
+ * A rating is defined by its rating style (see {@link #RATING_HEART},
+ * {@link #RATING_THUMB_UP_DOWN}, {@link #RATING_3_STARS}, {@link #RATING_4_STARS},
+ * {@link #RATING_5_STARS} or {@link #RATING_PERCENTAGE}) and the actual rating value (which may
+ * be defined as "unrated"), both of which are defined when the rating instance is constructed
+ * through one of the factory methods.
+ */
+public final class Rating implements Parcelable {
+ private final static String TAG = "Rating";
+
+ /**
+ * @hide
+ */
+ @IntDef({RATING_NONE, RATING_HEART, RATING_THUMB_UP_DOWN, RATING_3_STARS, RATING_4_STARS,
+ RATING_5_STARS, RATING_PERCENTAGE})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Style {}
+
+ /**
+ * @hide
+ */
+ @IntDef({RATING_3_STARS, RATING_4_STARS, RATING_5_STARS})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface StarStyle {}
+
+ /**
+ * Indicates a rating style is not supported. A Rating will never have this
+ * type, but can be used by other classes to indicate they do not support
+ * Rating.
+ */
+ public final static int RATING_NONE = 0;
+
+ /**
+ * A rating style with a single degree of rating, "heart" vs "no heart". Can be used to
+ * indicate the content referred to is a favorite (or not).
+ */
+ public final static int RATING_HEART = 1;
+
+ /**
+ * A rating style for "thumb up" vs "thumb down".
+ */
+ public final static int RATING_THUMB_UP_DOWN = 2;
+
+ /**
+ * A rating style with 0 to 3 stars.
+ */
+ public final static int RATING_3_STARS = 3;
+
+ /**
+ * A rating style with 0 to 4 stars.
+ */
+ public final static int RATING_4_STARS = 4;
+
+ /**
+ * A rating style with 0 to 5 stars.
+ */
+ public final static int RATING_5_STARS = 5;
+
+ /**
+ * A rating style expressed as a percentage.
+ */
+ public final static int RATING_PERCENTAGE = 6;
+
+ private final static float RATING_NOT_RATED = -1.0f;
+
+ private final int mRatingStyle;
+
+ private final float mRatingValue;
+
+ private Rating(@Style int ratingStyle, float rating) {
+ mRatingStyle = ratingStyle;
+ mRatingValue = rating;
+ }
+
+ @Override
+ public String toString() {
+ return "Rating:style=" + mRatingStyle + " rating="
+ + (mRatingValue < 0.0f ? "unrated" : String.valueOf(mRatingValue));
+ }
+
+ @Override
+ public int describeContents() {
+ return mRatingStyle;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mRatingStyle);
+ dest.writeFloat(mRatingValue);
+ }
+
+ public static final Parcelable.Creator<Rating> CREATOR
+ = new Parcelable.Creator<Rating>() {
+ /**
+ * Rebuilds a Rating previously stored with writeToParcel().
+ * @param p Parcel object to read the Rating from
+ * @return a new Rating created from the data in the parcel
+ */
+ @Override
+ public Rating createFromParcel(Parcel p) {
+ return new Rating(p.readInt(), p.readFloat());
+ }
+
+ @Override
+ public Rating[] newArray(int size) {
+ return new Rating[size];
+ }
+ };
+
+ /**
+ * Return a Rating instance with no rating.
+ * Create and return a new Rating instance with no rating known for the given
+ * rating style.
+ * @param ratingStyle one of {@link #RATING_HEART}, {@link #RATING_THUMB_UP_DOWN},
+ * {@link #RATING_3_STARS}, {@link #RATING_4_STARS}, {@link #RATING_5_STARS},
+ * or {@link #RATING_PERCENTAGE}.
+ * @return null if an invalid rating style is passed, a new Rating instance otherwise.
+ */
+ public static Rating newUnratedRating(@Style int ratingStyle) {
+ switch(ratingStyle) {
+ case RATING_HEART:
+ case RATING_THUMB_UP_DOWN:
+ case RATING_3_STARS:
+ case RATING_4_STARS:
+ case RATING_5_STARS:
+ case RATING_PERCENTAGE:
+ return new Rating(ratingStyle, RATING_NOT_RATED);
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Return a Rating instance with a heart-based rating.
+ * Create and return a new Rating instance with a rating style of {@link #RATING_HEART},
+ * and a heart-based rating.
+ * @param hasHeart true for a "heart selected" rating, false for "heart unselected".
+ * @return a new Rating instance.
+ */
+ public static Rating newHeartRating(boolean hasHeart) {
+ return new Rating(RATING_HEART, hasHeart ? 1.0f : 0.0f);
+ }
+
+ /**
+ * Return a Rating instance with a thumb-based rating.
+ * Create and return a new Rating instance with a {@link #RATING_THUMB_UP_DOWN}
+ * rating style, and a "thumb up" or "thumb down" rating.
+ * @param thumbIsUp true for a "thumb up" rating, false for "thumb down".
+ * @return a new Rating instance.
+ */
+ public static Rating newThumbRating(boolean thumbIsUp) {
+ return new Rating(RATING_THUMB_UP_DOWN, thumbIsUp ? 1.0f : 0.0f);
+ }
+
+ /**
+ * Return a Rating instance with a star-based rating.
+ * Create and return a new Rating instance with one of the star-base rating styles
+ * and the given integer or fractional number of stars. Non integer values can for instance
+ * be used to represent an average rating value, which might not be an integer number of stars.
+ * @param starRatingStyle one of {@link #RATING_3_STARS}, {@link #RATING_4_STARS},
+ * {@link #RATING_5_STARS}.
+ * @param starRating a number ranging from 0.0f to 3.0f, 4.0f or 5.0f according to
+ * the rating style.
+ * @return null if the rating style is invalid, or the rating is out of range,
+ * a new Rating instance otherwise.
+ */
+ public static Rating newStarRating(@StarStyle int starRatingStyle, float starRating) {
+ float maxRating = -1.0f;
+ switch(starRatingStyle) {
+ case RATING_3_STARS:
+ maxRating = 3.0f;
+ break;
+ case RATING_4_STARS:
+ maxRating = 4.0f;
+ break;
+ case RATING_5_STARS:
+ maxRating = 5.0f;
+ break;
+ default:
+ Log.e(TAG, "Invalid rating style (" + starRatingStyle + ") for a star rating");
+ return null;
+ }
+ if ((starRating < 0.0f) || (starRating > maxRating)) {
+ Log.e(TAG, "Trying to set out of range star-based rating");
+ return null;
+ }
+ return new Rating(starRatingStyle, starRating);
+ }
+
+ /**
+ * Return a Rating instance with a percentage-based rating.
+ * Create and return a new Rating instance with a {@link #RATING_PERCENTAGE}
+ * rating style, and a rating of the given percentage.
+ * @param percent the value of the rating
+ * @return null if the rating is out of range, a new Rating instance otherwise.
+ */
+ public static Rating newPercentageRating(float percent) {
+ if ((percent < 0.0f) || (percent > 100.0f)) {
+ Log.e(TAG, "Invalid percentage-based rating value");
+ return null;
+ } else {
+ return new Rating(RATING_PERCENTAGE, percent);
+ }
+ }
+
+ /**
+ * Return whether there is a rating value available.
+ * @return true if the instance was not created with {@link #newUnratedRating(int)}.
+ */
+ public boolean isRated() {
+ return mRatingValue >= 0.0f;
+ }
+
+ /**
+ * Return the rating style.
+ * @return one of {@link #RATING_HEART}, {@link #RATING_THUMB_UP_DOWN},
+ * {@link #RATING_3_STARS}, {@link #RATING_4_STARS}, {@link #RATING_5_STARS},
+ * or {@link #RATING_PERCENTAGE}.
+ */
+ @Style
+ public int getRatingStyle() {
+ return mRatingStyle;
+ }
+
+ /**
+ * Return whether the rating is "heart selected".
+ * @return true if the rating is "heart selected", false if the rating is "heart unselected",
+ * if the rating style is not {@link #RATING_HEART} or if it is unrated.
+ */
+ public boolean hasHeart() {
+ if (mRatingStyle != RATING_HEART) {
+ return false;
+ } else {
+ return (mRatingValue == 1.0f);
+ }
+ }
+
+ /**
+ * Return whether the rating is "thumb up".
+ * @return true if the rating is "thumb up", false if the rating is "thumb down",
+ * if the rating style is not {@link #RATING_THUMB_UP_DOWN} or if it is unrated.
+ */
+ public boolean isThumbUp() {
+ if (mRatingStyle != RATING_THUMB_UP_DOWN) {
+ return false;
+ } else {
+ return (mRatingValue == 1.0f);
+ }
+ }
+
+ /**
+ * Return the star-based rating value.
+ * @return a rating value greater or equal to 0.0f, or a negative value if the rating style is
+ * not star-based, or if it is unrated.
+ */
+ public float getStarRating() {
+ switch (mRatingStyle) {
+ case RATING_3_STARS:
+ case RATING_4_STARS:
+ case RATING_5_STARS:
+ if (isRated()) {
+ return mRatingValue;
+ }
+ default:
+ return -1.0f;
+ }
+ }
+
+ /**
+ * Return the percentage-based rating value.
+ * @return a rating value greater or equal to 0.0f, or a negative value if the rating style is
+ * not percentage-based, or if it is unrated.
+ */
+ public float getPercentRating() {
+ if ((mRatingStyle != RATING_PERCENTAGE) || !isRated()) {
+ return -1.0f;
+ } else {
+ return mRatingValue;
+ }
+ }
+}
diff --git a/packages/MediaComponents/apex/java/android/media/VolumeProvider.java b/packages/MediaComponents/apex/java/android/media/VolumeProvider.java
new file mode 100644
index 0000000..1c017c5
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/VolumeProvider.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media;
+
+import android.annotation.IntDef;
+import android.media.session.MediaSession;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Handles requests to adjust or set the volume on a session. This is also used
+ * to push volume updates back to the session. The provider must call
+ * {@link #setCurrentVolume(int)} each time the volume being provided changes.
+ * <p>
+ * You can set a volume provider on a session by calling
+ * {@link MediaSession#setPlaybackToRemote}.
+ */
+public abstract class VolumeProvider {
+
+ /**
+ * @hide
+ */
+ @IntDef({VOLUME_CONTROL_FIXED, VOLUME_CONTROL_RELATIVE, VOLUME_CONTROL_ABSOLUTE})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ControlType {}
+
+ /**
+ * The volume is fixed and can not be modified. Requests to change volume
+ * should be ignored.
+ */
+ public static final int VOLUME_CONTROL_FIXED = 0;
+
+ /**
+ * The volume control uses relative adjustment via
+ * {@link #onAdjustVolume(int)}. Attempts to set the volume to a specific
+ * value should be ignored.
+ */
+ public static final int VOLUME_CONTROL_RELATIVE = 1;
+
+ /**
+ * The volume control uses an absolute value. It may be adjusted using
+ * {@link #onAdjustVolume(int)} or set directly using
+ * {@link #onSetVolumeTo(int)}.
+ */
+ public static final int VOLUME_CONTROL_ABSOLUTE = 2;
+
+ private final int mControlType;
+ private final int mMaxVolume;
+ private int mCurrentVolume;
+ private Callback mCallback;
+
+ /**
+ * Create a new volume provider for handling volume events. You must specify
+ * the type of volume control, the maximum volume that can be used, and the
+ * current volume on the output.
+ *
+ * @param volumeControl The method for controlling volume that is used by
+ * this provider.
+ * @param maxVolume The maximum allowed volume.
+ * @param currentVolume The current volume on the output.
+ */
+ public VolumeProvider(@ControlType int volumeControl, int maxVolume, int currentVolume) {
+ mControlType = volumeControl;
+ mMaxVolume = maxVolume;
+ mCurrentVolume = currentVolume;
+ }
+
+ /**
+ * Get the volume control type that this volume provider uses.
+ *
+ * @return The volume control type for this volume provider
+ */
+ @ControlType
+ public final int getVolumeControl() {
+ return mControlType;
+ }
+
+ /**
+ * Get the maximum volume this provider allows.
+ *
+ * @return The max allowed volume.
+ */
+ public final int getMaxVolume() {
+ return mMaxVolume;
+ }
+
+ /**
+ * Gets the current volume. This will be the last value set by
+ * {@link #setCurrentVolume(int)}.
+ *
+ * @return The current volume.
+ */
+ public final int getCurrentVolume() {
+ return mCurrentVolume;
+ }
+
+ /**
+ * Notify the system that the current volume has been changed. This must be
+ * called every time the volume changes to ensure it is displayed properly.
+ *
+ * @param currentVolume The current volume on the output.
+ */
+ public final void setCurrentVolume(int currentVolume) {
+ mCurrentVolume = currentVolume;
+ if (mCallback != null) {
+ mCallback.onVolumeChanged(this);
+ }
+ }
+
+ /**
+ * Override to handle requests to set the volume of the current output.
+ * After the volume has been modified {@link #setCurrentVolume} must be
+ * called to notify the system.
+ *
+ * @param volume The volume to set the output to.
+ */
+ public void onSetVolumeTo(int volume) {
+ }
+
+ /**
+ * Override to handle requests to adjust the volume of the current output.
+ * Direction will be one of {@link AudioManager#ADJUST_LOWER},
+ * {@link AudioManager#ADJUST_RAISE}, {@link AudioManager#ADJUST_SAME}.
+ * After the volume has been modified {@link #setCurrentVolume} must be
+ * called to notify the system.
+ *
+ * @param direction The direction to change the volume in.
+ */
+ public void onAdjustVolume(int direction) {
+ }
+
+ /**
+ * Sets a callback to receive volume changes.
+ * @hide
+ */
+ public void setCallback(Callback callback) {
+ mCallback = callback;
+ }
+
+ /**
+ * Listens for changes to the volume.
+ * @hide
+ */
+ public static abstract class Callback {
+ public abstract void onVolumeChanged(VolumeProvider volumeProvider);
+ }
+}
diff --git a/packages/MediaComponents/apex/java/android/media/browse/MediaBrowser.aidl b/packages/MediaComponents/apex/java/android/media/browse/MediaBrowser.aidl
new file mode 100644
index 0000000..782e094
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/browse/MediaBrowser.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media.browse;
+
+parcelable MediaBrowser.MediaItem;
\ No newline at end of file
diff --git a/packages/MediaComponents/apex/java/android/media/browse/MediaBrowser.java b/packages/MediaComponents/apex/java/android/media/browse/MediaBrowser.java
new file mode 100644
index 0000000..4e091ad
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/browse/MediaBrowser.java
@@ -0,0 +1,1177 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.browse;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+//import android.content.pm.ParceledListSlice;
+import android.media.MediaDescription;
+import android.media.session.MediaController;
+import android.media.session.MediaSession;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.service.media.IMediaBrowserService;
+import android.service.media.IMediaBrowserServiceCallbacks;
+import android.service.media.MediaBrowserService;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map.Entry;
+
+/**
+ * Browses media content offered by a link MediaBrowserService.
+ * <p>
+ * This object is not thread-safe. All calls should happen on the thread on which the browser
+ * was constructed.
+ * </p>
+ * <h3>Standard Extra Data</h3>
+ *
+ * <p>These are the current standard fields that can be used as extra data via
+ * {@link #subscribe(String, Bundle, SubscriptionCallback)},
+ * {@link #unsubscribe(String, SubscriptionCallback)}, and
+ * {@link SubscriptionCallback#onChildrenLoaded(String, List, Bundle)}.
+ *
+ * <ul>
+ * <li> {@link #EXTRA_PAGE}
+ * <li> {@link #EXTRA_PAGE_SIZE}
+ * </ul>
+ */
+public final class MediaBrowser {
+ private static final String TAG = "MediaBrowser";
+ private static final boolean DBG = false;
+
+ /**
+ * Used as an int extra field to denote the page number to subscribe.
+ * The value of {@code EXTRA_PAGE} should be greater than or equal to 0.
+ *
+ * @see #EXTRA_PAGE_SIZE
+ */
+ public static final String EXTRA_PAGE = "android.media.browse.extra.PAGE";
+
+ /**
+ * Used as an int extra field to denote the number of media items in a page.
+ * The value of {@code EXTRA_PAGE_SIZE} should be greater than or equal to 1.
+ *
+ * @see #EXTRA_PAGE
+ */
+ public static final String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
+
+ private static final int CONNECT_STATE_DISCONNECTING = 0;
+ private static final int CONNECT_STATE_DISCONNECTED = 1;
+ private static final int CONNECT_STATE_CONNECTING = 2;
+ private static final int CONNECT_STATE_CONNECTED = 3;
+ private static final int CONNECT_STATE_SUSPENDED = 4;
+
+ private final Context mContext;
+ private final ComponentName mServiceComponent;
+ private final ConnectionCallback mCallback;
+ private final Bundle mRootHints;
+ private final Handler mHandler = new Handler();
+ private final ArrayMap<String, Subscription> mSubscriptions = new ArrayMap<>();
+
+ private volatile int mState = CONNECT_STATE_DISCONNECTED;
+ private volatile String mRootId;
+ private volatile MediaSession.Token mMediaSessionToken;
+ private volatile Bundle mExtras;
+
+ private MediaServiceConnection mServiceConnection;
+ private IMediaBrowserService mServiceBinder;
+ private IMediaBrowserServiceCallbacks mServiceCallbacks;
+
+ /**
+ * Creates a media browser for the specified media browser service.
+ *
+ * @param context The context.
+ * @param serviceComponent The component name of the media browser service.
+ * @param callback The connection callback.
+ * @param rootHints An optional bundle of service-specific arguments to send
+ * to the media browser service when connecting and retrieving the root id
+ * for browsing, or null if none. The contents of this bundle may affect
+ * the information returned when browsing.
+ * @see android.service.media.MediaBrowserService.BrowserRoot#EXTRA_RECENT
+ * @see android.service.media.MediaBrowserService.BrowserRoot#EXTRA_OFFLINE
+ * @see android.service.media.MediaBrowserService.BrowserRoot#EXTRA_SUGGESTED
+ */
+ public MediaBrowser(Context context, ComponentName serviceComponent,
+ ConnectionCallback callback, Bundle rootHints) {
+ if (context == null) {
+ throw new IllegalArgumentException("context must not be null");
+ }
+ if (serviceComponent == null) {
+ throw new IllegalArgumentException("service component must not be null");
+ }
+ if (callback == null) {
+ throw new IllegalArgumentException("connection callback must not be null");
+ }
+ mContext = context;
+ mServiceComponent = serviceComponent;
+ mCallback = callback;
+ mRootHints = rootHints == null ? null : new Bundle(rootHints);
+ }
+
+ /**
+ * Connects to the media browser service.
+ * <p>
+ * The connection callback specified in the constructor will be invoked
+ * when the connection completes or fails.
+ * </p>
+ */
+ public void connect() {
+ if (mState != CONNECT_STATE_DISCONNECTING && mState != CONNECT_STATE_DISCONNECTED) {
+ throw new IllegalStateException("connect() called while neither disconnecting nor "
+ + "disconnected (state=" + getStateLabel(mState) + ")");
+ }
+
+ mState = CONNECT_STATE_CONNECTING;
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mState == CONNECT_STATE_DISCONNECTING) {
+ return;
+ }
+ mState = CONNECT_STATE_CONNECTING;
+ // TODO: remove this extra check.
+ if (DBG) {
+ if (mServiceConnection != null) {
+ throw new RuntimeException("mServiceConnection should be null. Instead it"
+ + " is " + mServiceConnection);
+ }
+ }
+ if (mServiceBinder != null) {
+ throw new RuntimeException("mServiceBinder should be null. Instead it is "
+ + mServiceBinder);
+ }
+ if (mServiceCallbacks != null) {
+ throw new RuntimeException("mServiceCallbacks should be null. Instead it is "
+ + mServiceCallbacks);
+ }
+
+ final Intent intent = new Intent(MediaBrowserService.SERVICE_INTERFACE);
+ intent.setComponent(mServiceComponent);
+
+ mServiceConnection = new MediaServiceConnection();
+
+ boolean bound = false;
+ try {
+ bound = mContext.bindService(intent, mServiceConnection,
+ Context.BIND_AUTO_CREATE);
+ } catch (Exception ex) {
+ Log.e(TAG, "Failed binding to service " + mServiceComponent);
+ }
+
+ if (!bound) {
+ // Tell them that it didn't work.
+ forceCloseConnection();
+ mCallback.onConnectionFailed();
+ }
+
+ if (DBG) {
+ Log.d(TAG, "connect...");
+ dump();
+ }
+ }
+ });
+ }
+
+ /**
+ * Disconnects from the media browser service.
+ * After this, no more callbacks will be received.
+ */
+ public void disconnect() {
+ // It's ok to call this any state, because allowing this lets apps not have
+ // to check isConnected() unnecessarily. They won't appreciate the extra
+ // assertions for this. We do everything we can here to go back to a sane state.
+ mState = CONNECT_STATE_DISCONNECTING;
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ // connect() could be called before this. Then we will disconnect and reconnect.
+ if (mServiceCallbacks != null) {
+ try {
+ mServiceBinder.disconnect(mServiceCallbacks);
+ } catch (RemoteException ex) {
+ // We are disconnecting anyway. Log, just for posterity but it's not
+ // a big problem.
+ Log.w(TAG, "RemoteException during connect for " + mServiceComponent);
+ }
+ }
+ int state = mState;
+ forceCloseConnection();
+ // If the state was not CONNECT_STATE_DISCONNECTING, keep the state so that
+ // the operation came after disconnect() can be handled properly.
+ if (state != CONNECT_STATE_DISCONNECTING) {
+ mState = state;
+ }
+ if (DBG) {
+ Log.d(TAG, "disconnect...");
+ dump();
+ }
+ }
+ });
+ }
+
+ /**
+ * Null out the variables and unbind from the service. This doesn't include
+ * calling disconnect on the service, because we only try to do that in the
+ * clean shutdown cases.
+ * <p>
+ * Everywhere that calls this EXCEPT for disconnect() should follow it with
+ * a call to mCallback.onConnectionFailed(). Disconnect doesn't do that callback
+ * for a clean shutdown, but everywhere else is a dirty shutdown and should
+ * notify the app.
+ * <p>
+ * Also, mState should be updated properly. Mostly it should be CONNECT_STATE_DIACONNECTED
+ * except for disconnect().
+ */
+ private void forceCloseConnection() {
+ if (mServiceConnection != null) {
+ try {
+ mContext.unbindService(mServiceConnection);
+ } catch (IllegalArgumentException e) {
+ if (DBG) {
+ Log.d(TAG, "unbindService failed", e);
+ }
+ }
+ }
+ mState = CONNECT_STATE_DISCONNECTED;
+ mServiceConnection = null;
+ mServiceBinder = null;
+ mServiceCallbacks = null;
+ mRootId = null;
+ mMediaSessionToken = null;
+ }
+
+ /**
+ * Returns whether the browser is connected to the service.
+ */
+ public boolean isConnected() {
+ return mState == CONNECT_STATE_CONNECTED;
+ }
+
+ /**
+ * Gets the service component that the media browser is connected to.
+ */
+ public @NonNull ComponentName getServiceComponent() {
+ if (!isConnected()) {
+ throw new IllegalStateException("getServiceComponent() called while not connected" +
+ " (state=" + mState + ")");
+ }
+ return mServiceComponent;
+ }
+
+ /**
+ * Gets the root id.
+ * <p>
+ * Note that the root id may become invalid or change when the
+ * browser is disconnected.
+ * </p>
+ *
+ * @throws IllegalStateException if not connected.
+ */
+ public @NonNull String getRoot() {
+ if (!isConnected()) {
+ throw new IllegalStateException("getRoot() called while not connected (state="
+ + getStateLabel(mState) + ")");
+ }
+ return mRootId;
+ }
+
+ /**
+ * Gets any extras for the media service.
+ *
+ * @throws IllegalStateException if not connected.
+ */
+ public @Nullable Bundle getExtras() {
+ if (!isConnected()) {
+ throw new IllegalStateException("getExtras() called while not connected (state="
+ + getStateLabel(mState) + ")");
+ }
+ return mExtras;
+ }
+
+ /**
+ * Gets the media session token associated with the media browser.
+ * <p>
+ * Note that the session token may become invalid or change when the
+ * browser is disconnected.
+ * </p>
+ *
+ * @return The session token for the browser, never null.
+ *
+ * @throws IllegalStateException if not connected.
+ */
+ public @NonNull MediaSession.Token getSessionToken() {
+ if (!isConnected()) {
+ throw new IllegalStateException("getSessionToken() called while not connected (state="
+ + mState + ")");
+ }
+ return mMediaSessionToken;
+ }
+
+ /**
+ * Queries for information about the media items that are contained within
+ * the specified id and subscribes to receive updates when they change.
+ * <p>
+ * The list of subscriptions is maintained even when not connected and is
+ * restored after the reconnection. It is ok to subscribe while not connected
+ * but the results will not be returned until the connection completes.
+ * </p>
+ * <p>
+ * If the id is already subscribed with a different callback then the new
+ * callback will replace the previous one and the child data will be
+ * reloaded.
+ * </p>
+ *
+ * @param parentId The id of the parent media item whose list of children
+ * will be subscribed.
+ * @param callback The callback to receive the list of children.
+ */
+ public void subscribe(@NonNull String parentId, @NonNull SubscriptionCallback callback) {
+ subscribeInternal(parentId, null, callback);
+ }
+
+ /**
+ * Queries with service-specific arguments for information about the media items
+ * that are contained within the specified id and subscribes to receive updates
+ * when they change.
+ * <p>
+ * The list of subscriptions is maintained even when not connected and is
+ * restored after the reconnection. It is ok to subscribe while not connected
+ * but the results will not be returned until the connection completes.
+ * </p>
+ * <p>
+ * If the id is already subscribed with a different callback then the new
+ * callback will replace the previous one and the child data will be
+ * reloaded.
+ * </p>
+ *
+ * @param parentId The id of the parent media item whose list of children
+ * will be subscribed.
+ * @param options The bundle of service-specific arguments to send to the media
+ * browser service. The contents of this bundle may affect the
+ * information returned when browsing.
+ * @param callback The callback to receive the list of children.
+ */
+ public void subscribe(@NonNull String parentId, @NonNull Bundle options,
+ @NonNull SubscriptionCallback callback) {
+ if (options == null) {
+ throw new IllegalArgumentException("options cannot be null");
+ }
+ subscribeInternal(parentId, new Bundle(options), callback);
+ }
+
+ /**
+ * Unsubscribes for changes to the children of the specified media id.
+ * <p>
+ * The query callback will no longer be invoked for results associated with
+ * this id once this method returns.
+ * </p>
+ *
+ * @param parentId The id of the parent media item whose list of children
+ * will be unsubscribed.
+ */
+ public void unsubscribe(@NonNull String parentId) {
+ unsubscribeInternal(parentId, null);
+ }
+
+ /**
+ * Unsubscribes for changes to the children of the specified media id through a callback.
+ * <p>
+ * The query callback will no longer be invoked for results associated with
+ * this id once this method returns.
+ * </p>
+ *
+ * @param parentId The id of the parent media item whose list of children
+ * will be unsubscribed.
+ * @param callback A callback sent to the media browser service to subscribe.
+ */
+ public void unsubscribe(@NonNull String parentId, @NonNull SubscriptionCallback callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("callback cannot be null");
+ }
+ unsubscribeInternal(parentId, callback);
+ }
+
+ /**
+ * Retrieves a specific {@link MediaItem} from the connected service. Not
+ * all services may support this, so falling back to subscribing to the
+ * parent's id should be used when unavailable.
+ *
+ * @param mediaId The id of the item to retrieve.
+ * @param cb The callback to receive the result on.
+ */
+ public void getItem(final @NonNull String mediaId, @NonNull final ItemCallback cb) {
+ if (TextUtils.isEmpty(mediaId)) {
+ throw new IllegalArgumentException("mediaId cannot be empty.");
+ }
+ if (cb == null) {
+ throw new IllegalArgumentException("cb cannot be null.");
+ }
+ if (mState != CONNECT_STATE_CONNECTED) {
+ Log.i(TAG, "Not connected, unable to retrieve the MediaItem.");
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ cb.onError(mediaId);
+ }
+ });
+ return;
+ }
+ ResultReceiver receiver = new ResultReceiver(mHandler) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ if (!isConnected()) {
+ return;
+ }
+ if (resultCode != 0 || resultData == null
+ || !resultData.containsKey(MediaBrowserService.KEY_MEDIA_ITEM)) {
+ cb.onError(mediaId);
+ return;
+ }
+ Parcelable item = resultData.getParcelable(MediaBrowserService.KEY_MEDIA_ITEM);
+ if (item != null && !(item instanceof MediaItem)) {
+ cb.onError(mediaId);
+ return;
+ }
+ cb.onItemLoaded((MediaItem)item);
+ }
+ };
+ try {
+ mServiceBinder.getMediaItem(mediaId, receiver, mServiceCallbacks);
+ } catch (RemoteException e) {
+ Log.i(TAG, "Remote error getting media item.");
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ cb.onError(mediaId);
+ }
+ });
+ }
+ }
+
+ private void subscribeInternal(String parentId, Bundle options, SubscriptionCallback callback) {
+ // Check arguments.
+ if (TextUtils.isEmpty(parentId)) {
+ throw new IllegalArgumentException("parentId cannot be empty.");
+ }
+ if (callback == null) {
+ throw new IllegalArgumentException("callback cannot be null");
+ }
+ // Update or create the subscription.
+ Subscription sub = mSubscriptions.get(parentId);
+ if (sub == null) {
+ sub = new Subscription();
+ mSubscriptions.put(parentId, sub);
+ }
+ sub.putCallback(mContext, options, callback);
+
+ // If we are connected, tell the service that we are watching. If we aren't connected,
+ // the service will be told when we connect.
+ if (isConnected()) {
+ try {
+ if (options == null) {
+ mServiceBinder.addSubscriptionDeprecated(parentId, mServiceCallbacks);
+ }
+ mServiceBinder.addSubscription(parentId, callback.mToken, options,
+ mServiceCallbacks);
+ } catch (RemoteException ex) {
+ // Process is crashing. We will disconnect, and upon reconnect we will
+ // automatically reregister. So nothing to do here.
+ Log.d(TAG, "addSubscription failed with RemoteException parentId=" + parentId);
+ }
+ }
+ }
+
+ private void unsubscribeInternal(String parentId, SubscriptionCallback callback) {
+ // Check arguments.
+ if (TextUtils.isEmpty(parentId)) {
+ throw new IllegalArgumentException("parentId cannot be empty.");
+ }
+
+ Subscription sub = mSubscriptions.get(parentId);
+ if (sub == null) {
+ return;
+ }
+ // Tell the service if necessary.
+ try {
+ if (callback == null) {
+ if (isConnected()) {
+ mServiceBinder.removeSubscriptionDeprecated(parentId, mServiceCallbacks);
+ mServiceBinder.removeSubscription(parentId, null, mServiceCallbacks);
+ }
+ } else {
+ final List<SubscriptionCallback> callbacks = sub.getCallbacks();
+ final List<Bundle> optionsList = sub.getOptionsList();
+ for (int i = callbacks.size() - 1; i >= 0; --i) {
+ if (callbacks.get(i) == callback) {
+ if (isConnected()) {
+ mServiceBinder.removeSubscription(
+ parentId, callback.mToken, mServiceCallbacks);
+ }
+ callbacks.remove(i);
+ optionsList.remove(i);
+ }
+ }
+ }
+ } catch (RemoteException ex) {
+ // Process is crashing. We will disconnect, and upon reconnect we will
+ // automatically reregister. So nothing to do here.
+ Log.d(TAG, "removeSubscription failed with RemoteException parentId=" + parentId);
+ }
+
+ if (sub.isEmpty() || callback == null) {
+ mSubscriptions.remove(parentId);
+ }
+ }
+
+ /**
+ * For debugging.
+ */
+ private static String getStateLabel(int state) {
+ switch (state) {
+ case CONNECT_STATE_DISCONNECTING:
+ return "CONNECT_STATE_DISCONNECTING";
+ case CONNECT_STATE_DISCONNECTED:
+ return "CONNECT_STATE_DISCONNECTED";
+ case CONNECT_STATE_CONNECTING:
+ return "CONNECT_STATE_CONNECTING";
+ case CONNECT_STATE_CONNECTED:
+ return "CONNECT_STATE_CONNECTED";
+ case CONNECT_STATE_SUSPENDED:
+ return "CONNECT_STATE_SUSPENDED";
+ default:
+ return "UNKNOWN/" + state;
+ }
+ }
+
+ private final void onServiceConnected(final IMediaBrowserServiceCallbacks callback,
+ final String root, final MediaSession.Token session, final Bundle extra) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ // Check to make sure there hasn't been a disconnect or a different
+ // ServiceConnection.
+ if (!isCurrent(callback, "onConnect")) {
+ return;
+ }
+ // Don't allow them to call us twice.
+ if (mState != CONNECT_STATE_CONNECTING) {
+ Log.w(TAG, "onConnect from service while mState="
+ + getStateLabel(mState) + "... ignoring");
+ return;
+ }
+ mRootId = root;
+ mMediaSessionToken = session;
+ mExtras = extra;
+ mState = CONNECT_STATE_CONNECTED;
+
+ if (DBG) {
+ Log.d(TAG, "ServiceCallbacks.onConnect...");
+ dump();
+ }
+ mCallback.onConnected();
+
+ // we may receive some subscriptions before we are connected, so re-subscribe
+ // everything now
+ for (Entry<String, Subscription> subscriptionEntry : mSubscriptions.entrySet()) {
+ String id = subscriptionEntry.getKey();
+ Subscription sub = subscriptionEntry.getValue();
+ List<SubscriptionCallback> callbackList = sub.getCallbacks();
+ List<Bundle> optionsList = sub.getOptionsList();
+ for (int i = 0; i < callbackList.size(); ++i) {
+ try {
+ mServiceBinder.addSubscription(id, callbackList.get(i).mToken,
+ optionsList.get(i), mServiceCallbacks);
+ } catch (RemoteException ex) {
+ // Process is crashing. We will disconnect, and upon reconnect we will
+ // automatically reregister. So nothing to do here.
+ Log.d(TAG, "addSubscription failed with RemoteException parentId="
+ + id);
+ }
+ }
+ }
+ }
+ });
+ }
+
+ private final void onConnectionFailed(final IMediaBrowserServiceCallbacks callback) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ Log.e(TAG, "onConnectFailed for " + mServiceComponent);
+
+ // Check to make sure there hasn't been a disconnect or a different
+ // ServiceConnection.
+ if (!isCurrent(callback, "onConnectFailed")) {
+ return;
+ }
+ // Don't allow them to call us twice.
+ if (mState != CONNECT_STATE_CONNECTING) {
+ Log.w(TAG, "onConnect from service while mState="
+ + getStateLabel(mState) + "... ignoring");
+ return;
+ }
+
+ // Clean up
+ forceCloseConnection();
+
+ // Tell the app.
+ mCallback.onConnectionFailed();
+ }
+ });
+ }
+
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ /*
+ private final void onLoadChildren(final IMediaBrowserServiceCallbacks callback,
+ final String parentId, final ParceledListSlice list, final Bundle options) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ // Check that there hasn't been a disconnect or a different
+ // ServiceConnection.
+ if (!isCurrent(callback, "onLoadChildren")) {
+ return;
+ }
+
+ if (DBG) {
+ Log.d(TAG, "onLoadChildren for " + mServiceComponent + " id=" + parentId);
+ }
+
+ // Check that the subscription is still subscribed.
+ final Subscription subscription = mSubscriptions.get(parentId);
+ if (subscription != null) {
+ // Tell the app.
+ SubscriptionCallback subscriptionCallback =
+ subscription.getCallback(mContext, options);
+ if (subscriptionCallback != null) {
+ List<MediaItem> data = list == null ? null : list.getList();
+ if (options == null) {
+ if (data == null) {
+ subscriptionCallback.onError(parentId);
+ } else {
+ subscriptionCallback.onChildrenLoaded(parentId, data);
+ }
+ } else {
+ if (data == null) {
+ subscriptionCallback.onError(parentId, options);
+ } else {
+ subscriptionCallback.onChildrenLoaded(parentId, data, options);
+ }
+ }
+ return;
+ }
+ }
+ if (DBG) {
+ Log.d(TAG, "onLoadChildren for id that isn't subscribed id=" + parentId);
+ }
+ }
+ });
+ }
+ */
+
+ /**
+ * Return true if {@code callback} is the current ServiceCallbacks. Also logs if it's not.
+ */
+ private boolean isCurrent(IMediaBrowserServiceCallbacks callback, String funcName) {
+ if (mServiceCallbacks != callback || mState == CONNECT_STATE_DISCONNECTING
+ || mState == CONNECT_STATE_DISCONNECTED) {
+ if (mState != CONNECT_STATE_DISCONNECTING && mState != CONNECT_STATE_DISCONNECTED) {
+ Log.i(TAG, funcName + " for " + mServiceComponent + " with mServiceConnection="
+ + mServiceCallbacks + " this=" + this);
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private ServiceCallbacks getNewServiceCallbacks() {
+ return new ServiceCallbacks(this);
+ }
+
+ /**
+ * Log internal state.
+ * @hide
+ */
+ void dump() {
+ Log.d(TAG, "MediaBrowser...");
+ Log.d(TAG, " mServiceComponent=" + mServiceComponent);
+ Log.d(TAG, " mCallback=" + mCallback);
+ Log.d(TAG, " mRootHints=" + mRootHints);
+ Log.d(TAG, " mState=" + getStateLabel(mState));
+ Log.d(TAG, " mServiceConnection=" + mServiceConnection);
+ Log.d(TAG, " mServiceBinder=" + mServiceBinder);
+ Log.d(TAG, " mServiceCallbacks=" + mServiceCallbacks);
+ Log.d(TAG, " mRootId=" + mRootId);
+ Log.d(TAG, " mMediaSessionToken=" + mMediaSessionToken);
+ }
+
+ /**
+ * A class with information on a single media item for use in browsing/searching media.
+ * MediaItems are application dependent so we cannot guarantee that they contain the
+ * right values.
+ */
+ public static class MediaItem implements Parcelable {
+ private final int mFlags;
+ private final MediaDescription mDescription;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag=true, value = { FLAG_BROWSABLE, FLAG_PLAYABLE })
+ public @interface Flags { }
+
+ /**
+ * Flag: Indicates that the item has children of its own.
+ */
+ public static final int FLAG_BROWSABLE = 1 << 0;
+
+ /**
+ * Flag: Indicates that the item is playable.
+ * <p>
+ * The id of this item may be passed to
+ * {@link MediaController.TransportControls#playFromMediaId(String, Bundle)}
+ * to start playing it.
+ * </p>
+ */
+ public static final int FLAG_PLAYABLE = 1 << 1;
+
+ /**
+ * Create a new MediaItem for use in browsing media.
+ * @param description The description of the media, which must include a
+ * media id.
+ * @param flags The flags for this item.
+ */
+ public MediaItem(@NonNull MediaDescription description, @Flags int flags) {
+ if (description == null) {
+ throw new IllegalArgumentException("description cannot be null");
+ }
+ if (TextUtils.isEmpty(description.getMediaId())) {
+ throw new IllegalArgumentException("description must have a non-empty media id");
+ }
+ mFlags = flags;
+ mDescription = description;
+ }
+
+ /**
+ * Private constructor.
+ */
+ private MediaItem(Parcel in) {
+ mFlags = in.readInt();
+ mDescription = MediaDescription.CREATOR.createFromParcel(in);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mFlags);
+ mDescription.writeToParcel(out, flags);
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("MediaItem{");
+ sb.append("mFlags=").append(mFlags);
+ sb.append(", mDescription=").append(mDescription);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ public static final Parcelable.Creator<MediaItem> CREATOR =
+ new Parcelable.Creator<MediaItem>() {
+ @Override
+ public MediaItem createFromParcel(Parcel in) {
+ return new MediaItem(in);
+ }
+
+ @Override
+ public MediaItem[] newArray(int size) {
+ return new MediaItem[size];
+ }
+ };
+
+ /**
+ * Gets the flags of the item.
+ */
+ public @Flags int getFlags() {
+ return mFlags;
+ }
+
+ /**
+ * Returns whether this item is browsable.
+ * @see #FLAG_BROWSABLE
+ */
+ public boolean isBrowsable() {
+ return (mFlags & FLAG_BROWSABLE) != 0;
+ }
+
+ /**
+ * Returns whether this item is playable.
+ * @see #FLAG_PLAYABLE
+ */
+ public boolean isPlayable() {
+ return (mFlags & FLAG_PLAYABLE) != 0;
+ }
+
+ /**
+ * Returns the description of the media.
+ */
+ public @NonNull MediaDescription getDescription() {
+ return mDescription;
+ }
+
+ /**
+ * Returns the media id in the {@link MediaDescription} for this item.
+ * @see android.media.MediaMetadata#METADATA_KEY_MEDIA_ID
+ */
+ public @Nullable String getMediaId() {
+ return mDescription.getMediaId();
+ }
+ }
+
+ /**
+ * Callbacks for connection related events.
+ */
+ public static class ConnectionCallback {
+ /**
+ * Invoked after {@link MediaBrowser#connect()} when the request has successfully completed.
+ */
+ public void onConnected() {
+ }
+
+ /**
+ * Invoked when the client is disconnected from the media browser.
+ */
+ public void onConnectionSuspended() {
+ }
+
+ /**
+ * Invoked when the connection to the media browser failed.
+ */
+ public void onConnectionFailed() {
+ }
+ }
+
+ /**
+ * Callbacks for subscription related events.
+ */
+ public static abstract class SubscriptionCallback {
+ Binder mToken;
+
+ public SubscriptionCallback() {
+ mToken = new Binder();
+ }
+
+ /**
+ * Called when the list of children is loaded or updated.
+ *
+ * @param parentId The media id of the parent media item.
+ * @param children The children which were loaded.
+ */
+ public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaItem> children) {
+ }
+
+ /**
+ * Called when the list of children is loaded or updated.
+ *
+ * @param parentId The media id of the parent media item.
+ * @param children The children which were loaded.
+ * @param options The bundle of service-specific arguments sent to the media
+ * browser service. The contents of this bundle may affect the
+ * information returned when browsing.
+ */
+ public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaItem> children,
+ @NonNull Bundle options) {
+ }
+
+ /**
+ * Called when the id doesn't exist or other errors in subscribing.
+ * <p>
+ * If this is called, the subscription remains until {@link MediaBrowser#unsubscribe}
+ * called, because some errors may heal themselves.
+ * </p>
+ *
+ * @param parentId The media id of the parent media item whose children could
+ * not be loaded.
+ */
+ public void onError(@NonNull String parentId) {
+ }
+
+ /**
+ * Called when the id doesn't exist or other errors in subscribing.
+ * <p>
+ * If this is called, the subscription remains until {@link MediaBrowser#unsubscribe}
+ * called, because some errors may heal themselves.
+ * </p>
+ *
+ * @param parentId The media id of the parent media item whose children could
+ * not be loaded.
+ * @param options The bundle of service-specific arguments sent to the media
+ * browser service.
+ */
+ public void onError(@NonNull String parentId, @NonNull Bundle options) {
+ }
+ }
+
+ /**
+ * Callback for receiving the result of {@link #getItem}.
+ */
+ public static abstract class ItemCallback {
+ /**
+ * Called when the item has been returned by the connected service.
+ *
+ * @param item The item that was returned or null if it doesn't exist.
+ */
+ public void onItemLoaded(MediaItem item) {
+ }
+
+ /**
+ * Called there was an error retrieving it or the connected service doesn't support
+ * {@link #getItem}.
+ *
+ * @param mediaId The media id of the media item which could not be loaded.
+ */
+ public void onError(@NonNull String mediaId) {
+ }
+ }
+
+ /**
+ * ServiceConnection to the other app.
+ */
+ private class MediaServiceConnection implements ServiceConnection {
+ @Override
+ public void onServiceConnected(final ComponentName name, final IBinder binder) {
+ postOrRun(new Runnable() {
+ @Override
+ public void run() {
+ if (DBG) {
+ Log.d(TAG, "MediaServiceConnection.onServiceConnected name=" + name
+ + " binder=" + binder);
+ dump();
+ }
+
+ // Make sure we are still the current connection, and that they haven't called
+ // disconnect().
+ if (!isCurrent("onServiceConnected")) {
+ return;
+ }
+
+ // Save their binder
+ mServiceBinder = IMediaBrowserService.Stub.asInterface(binder);
+
+ // We make a new mServiceCallbacks each time we connect so that we can drop
+ // responses from previous connections.
+ mServiceCallbacks = getNewServiceCallbacks();
+ mState = CONNECT_STATE_CONNECTING;
+
+ // Call connect, which is async. When we get a response from that we will
+ // say that we're connected.
+ try {
+ if (DBG) {
+ Log.d(TAG, "ServiceCallbacks.onConnect...");
+ dump();
+ }
+ mServiceBinder.connect(mContext.getPackageName(), mRootHints,
+ mServiceCallbacks);
+ } catch (RemoteException ex) {
+ // Connect failed, which isn't good. But the auto-reconnect on the service
+ // will take over and we will come back. We will also get the
+ // onServiceDisconnected, which has all the cleanup code. So let that do
+ // it.
+ Log.w(TAG, "RemoteException during connect for " + mServiceComponent);
+ if (DBG) {
+ Log.d(TAG, "ServiceCallbacks.onConnect...");
+ dump();
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onServiceDisconnected(final ComponentName name) {
+ postOrRun(new Runnable() {
+ @Override
+ public void run() {
+ if (DBG) {
+ Log.d(TAG, "MediaServiceConnection.onServiceDisconnected name=" + name
+ + " this=" + this + " mServiceConnection=" + mServiceConnection);
+ dump();
+ }
+
+ // Make sure we are still the current connection, and that they haven't called
+ // disconnect().
+ if (!isCurrent("onServiceDisconnected")) {
+ return;
+ }
+
+ // Clear out what we set in onServiceConnected
+ mServiceBinder = null;
+ mServiceCallbacks = null;
+
+ // And tell the app that it's suspended.
+ mState = CONNECT_STATE_SUSPENDED;
+ mCallback.onConnectionSuspended();
+ }
+ });
+ }
+
+ private void postOrRun(Runnable r) {
+ if (Thread.currentThread() == mHandler.getLooper().getThread()) {
+ r.run();
+ } else {
+ mHandler.post(r);
+ }
+ }
+
+ /**
+ * Return true if this is the current ServiceConnection. Also logs if it's not.
+ */
+ private boolean isCurrent(String funcName) {
+ if (mServiceConnection != this || mState == CONNECT_STATE_DISCONNECTING
+ || mState == CONNECT_STATE_DISCONNECTED) {
+ if (mState != CONNECT_STATE_DISCONNECTING && mState != CONNECT_STATE_DISCONNECTED) {
+ // Check mState, because otherwise this log is noisy.
+ Log.i(TAG, funcName + " for " + mServiceComponent + " with mServiceConnection="
+ + mServiceConnection + " this=" + this);
+ }
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Callbacks from the service.
+ */
+ private static class ServiceCallbacks extends IMediaBrowserServiceCallbacks.Stub {
+ private WeakReference<MediaBrowser> mMediaBrowser;
+
+ public ServiceCallbacks(MediaBrowser mediaBrowser) {
+ mMediaBrowser = new WeakReference<MediaBrowser>(mediaBrowser);
+ }
+
+ /**
+ * The other side has acknowledged our connection. The parameters to this function
+ * are the initial data as requested.
+ */
+ @Override
+ public void onConnect(String root, MediaSession.Token session,
+ final Bundle extras) {
+ MediaBrowser mediaBrowser = mMediaBrowser.get();
+ if (mediaBrowser != null) {
+ mediaBrowser.onServiceConnected(this, root, session, extras);
+ }
+ }
+
+ /**
+ * The other side does not like us. Tell the app via onConnectionFailed.
+ */
+ @Override
+ public void onConnectFailed() {
+ MediaBrowser mediaBrowser = mMediaBrowser.get();
+ if (mediaBrowser != null) {
+ mediaBrowser.onConnectionFailed(this);
+ }
+ }
+
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ /*
+ @Override
+ public void onLoadChildren(String parentId, ParceledListSlice list) {
+ onLoadChildrenWithOptions(parentId, list, null);
+ }
+
+ @Override
+ public void onLoadChildrenWithOptions(String parentId, ParceledListSlice list,
+ final Bundle options) {
+ MediaBrowser mediaBrowser = mMediaBrowser.get();
+ if (mediaBrowser != null) {
+ mediaBrowser.onLoadChildren(this, parentId, list, options);
+ }
+ }
+ */
+ }
+
+ private static class Subscription {
+ private final List<SubscriptionCallback> mCallbacks;
+ private final List<Bundle> mOptionsList;
+
+ public Subscription() {
+ mCallbacks = new ArrayList<>();
+ mOptionsList = new ArrayList<>();
+ }
+
+ public boolean isEmpty() {
+ return mCallbacks.isEmpty();
+ }
+
+ public List<Bundle> getOptionsList() {
+ return mOptionsList;
+ }
+
+ public List<SubscriptionCallback> getCallbacks() {
+ return mCallbacks;
+ }
+
+ public SubscriptionCallback getCallback(Context context, Bundle options) {
+ if (options != null) {
+ options.setClassLoader(context.getClassLoader());
+ }
+ for (int i = 0; i < mOptionsList.size(); ++i) {
+ if (MediaBrowserUtils.areSameOptions(mOptionsList.get(i), options)) {
+ return mCallbacks.get(i);
+ }
+ }
+ return null;
+ }
+
+ public void putCallback(Context context, Bundle options, SubscriptionCallback callback) {
+ if (options != null) {
+ options.setClassLoader(context.getClassLoader());
+ }
+ for (int i = 0; i < mOptionsList.size(); ++i) {
+ if (MediaBrowserUtils.areSameOptions(mOptionsList.get(i), options)) {
+ mCallbacks.set(i, callback);
+ return;
+ }
+ }
+ mCallbacks.add(callback);
+ mOptionsList.add(options);
+ }
+ }
+}
diff --git a/packages/MediaComponents/apex/java/android/media/browse/MediaBrowserUtils.java b/packages/MediaComponents/apex/java/android/media/browse/MediaBrowserUtils.java
new file mode 100644
index 0000000..2943e60
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/browse/MediaBrowserUtils.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.browse;
+
+import android.os.Bundle;
+
+/**
+ * @hide
+ */
+public class MediaBrowserUtils {
+ public static boolean areSameOptions(Bundle options1, Bundle options2) {
+ if (options1 == options2) {
+ return true;
+ } else if (options1 == null) {
+ return options2.getInt(MediaBrowser.EXTRA_PAGE, -1) == -1
+ && options2.getInt(MediaBrowser.EXTRA_PAGE_SIZE, -1) == -1;
+ } else if (options2 == null) {
+ return options1.getInt(MediaBrowser.EXTRA_PAGE, -1) == -1
+ && options1.getInt(MediaBrowser.EXTRA_PAGE_SIZE, -1) == -1;
+ } else {
+ return options1.getInt(MediaBrowser.EXTRA_PAGE, -1)
+ == options2.getInt(MediaBrowser.EXTRA_PAGE, -1)
+ && options1.getInt(MediaBrowser.EXTRA_PAGE_SIZE, -1)
+ == options2.getInt(MediaBrowser.EXTRA_PAGE_SIZE, -1);
+ }
+ }
+
+ public static boolean hasDuplicatedItems(Bundle options1, Bundle options2) {
+ int page1 = options1 == null ? -1 : options1.getInt(MediaBrowser.EXTRA_PAGE, -1);
+ int page2 = options2 == null ? -1 : options2.getInt(MediaBrowser.EXTRA_PAGE, -1);
+ int pageSize1 = options1 == null ? -1 : options1.getInt(MediaBrowser.EXTRA_PAGE_SIZE, -1);
+ int pageSize2 = options2 == null ? -1 : options2.getInt(MediaBrowser.EXTRA_PAGE_SIZE, -1);
+
+ int startIndex1, startIndex2, endIndex1, endIndex2;
+ if (page1 == -1 || pageSize1 == -1) {
+ startIndex1 = 0;
+ endIndex1 = Integer.MAX_VALUE;
+ } else {
+ startIndex1 = pageSize1 * page1;
+ endIndex1 = startIndex1 + pageSize1 - 1;
+ }
+
+ if (page2 == -1 || pageSize2 == -1) {
+ startIndex2 = 0;
+ endIndex2 = Integer.MAX_VALUE;
+ } else {
+ startIndex2 = pageSize2 * page2;
+ endIndex2 = startIndex2 + pageSize2 - 1;
+ }
+
+ if (startIndex1 <= startIndex2 && startIndex2 <= endIndex1) {
+ return true;
+ } else if (startIndex1 <= endIndex2 && endIndex2 <= endIndex1) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/IActiveSessionsListener.aidl b/packages/MediaComponents/apex/java/android/media/session/IActiveSessionsListener.aidl
new file mode 100644
index 0000000..4b9e4bd
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/IActiveSessionsListener.aidl
@@ -0,0 +1,26 @@
+/* Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.media.session.MediaSession;
+
+/**
+ * Listens for changes to the list of active sessions.
+ * @hide
+ */
+oneway interface IActiveSessionsListener {
+ void onActiveSessionsChanged(in List<MediaSession.Token> sessions);
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/ICallback.aidl b/packages/MediaComponents/apex/java/android/media/session/ICallback.aidl
new file mode 100644
index 0000000..322bffa
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/ICallback.aidl
@@ -0,0 +1,35 @@
+/* Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.media.session.MediaSession;
+import android.view.KeyEvent;
+
+/**
+ * @hide
+ */
+oneway interface ICallback {
+ void onMediaKeyEventDispatchedToMediaSession(in KeyEvent event,
+ in MediaSession.Token sessionToken);
+ void onMediaKeyEventDispatchedToMediaButtonReceiver(in KeyEvent event,
+ in ComponentName mediaButtonReceiver);
+
+ void onAddressedPlayerChangedToMediaSession(in MediaSession.Token sessionToken);
+ void onAddressedPlayerChangedToMediaButtonReceiver(in ComponentName mediaButtonReceiver);
+}
+
diff --git a/packages/MediaComponents/apex/java/android/media/session/IOnMediaKeyListener.aidl b/packages/MediaComponents/apex/java/android/media/session/IOnMediaKeyListener.aidl
new file mode 100644
index 0000000..aa98ea3
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/IOnMediaKeyListener.aidl
@@ -0,0 +1,28 @@
+/* Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.os.ResultReceiver;
+import android.view.KeyEvent;
+
+/**
+ * Listener to handle media key.
+ * @hide
+ */
+oneway interface IOnMediaKeyListener {
+ void onMediaKey(in KeyEvent event, in ResultReceiver result);
+}
+
diff --git a/packages/MediaComponents/apex/java/android/media/session/IOnVolumeKeyLongPressListener.aidl b/packages/MediaComponents/apex/java/android/media/session/IOnVolumeKeyLongPressListener.aidl
new file mode 100644
index 0000000..07b8347
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/IOnVolumeKeyLongPressListener.aidl
@@ -0,0 +1,27 @@
+/* Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.view.KeyEvent;
+
+/**
+ * Listener to handle volume key long-press.
+ * @hide
+ */
+oneway interface IOnVolumeKeyLongPressListener {
+ void onVolumeKeyLongPress(in KeyEvent event);
+}
+
diff --git a/packages/MediaComponents/apex/java/android/media/session/ISession.aidl b/packages/MediaComponents/apex/java/android/media/session/ISession.aidl
new file mode 100644
index 0000000..cbd93cb
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/ISession.aidl
@@ -0,0 +1,55 @@
+/* Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.app.PendingIntent;
+import android.content.pm.ParceledListSlice;
+//import android.media.AudioAttributes;
+import android.media.MediaMetadata;
+import android.media.session.ISessionController;
+import android.media.session.PlaybackState;
+import android.media.session.MediaSession;
+import android.os.Bundle;
+import android.os.ResultReceiver;
+
+/**
+ * Interface to a MediaSession in the system.
+ * @hide
+ */
+interface ISession {
+ void sendEvent(String event, in Bundle data);
+ ISessionController getController();
+ void setFlags(int flags);
+ void setActive(boolean active);
+ void setMediaButtonReceiver(in PendingIntent mbr);
+ void setLaunchPendingIntent(in PendingIntent pi);
+ void destroy();
+
+ // These commands are for the TransportPerformer
+ void setMetadata(in MediaMetadata metadata);
+ void setPlaybackState(in PlaybackState state);
+ //TODO(b/119750807): Resolve hidden API usage ParceledListSlice.
+ //void setQueue(in ParceledListSlice queue);
+ void setQueueTitle(CharSequence title);
+ void setExtras(in Bundle extras);
+ void setRatingType(int type);
+
+ // These commands relate to volume handling
+ //TODO(b/119751592): Decide if AudioAttributes should be updated.
+ //void setPlaybackToLocal(in AudioAttributes attributes);
+ void setPlaybackToRemote(int control, int max);
+ void setCurrentVolume(int currentVolume);
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/ISessionCallback.aidl b/packages/MediaComponents/apex/java/android/media/session/ISessionCallback.aidl
new file mode 100644
index 0000000..626338d
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/ISessionCallback.aidl
@@ -0,0 +1,71 @@
+/* Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.content.Intent;
+import android.media.Rating;
+import android.media.session.ISessionControllerCallback;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.ResultReceiver;
+
+/**
+ * @hide
+ */
+oneway interface ISessionCallback {
+ void onCommand(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ String command, in Bundle args, in ResultReceiver cb);
+ void onMediaButton(String packageName, int pid, int uid, in Intent mediaButtonIntent,
+ int sequenceNumber, in ResultReceiver cb);
+ void onMediaButtonFromController(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, in Intent mediaButtonIntent);
+
+ // These callbacks are for the TransportPerformer
+ void onPrepare(String packageName, int pid, int uid, ISessionControllerCallback caller);
+ void onPrepareFromMediaId(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, String mediaId, in Bundle extras);
+ void onPrepareFromSearch(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, String query, in Bundle extras);
+ void onPrepareFromUri(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ in Uri uri, in Bundle extras);
+ void onPlay(String packageName, int pid, int uid, ISessionControllerCallback caller);
+ void onPlayFromMediaId(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ String mediaId, in Bundle extras);
+ void onPlayFromSearch(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ String query, in Bundle extras);
+ void onPlayFromUri(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ in Uri uri, in Bundle extras);
+ void onSkipToTrack(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ long id);
+ void onPause(String packageName, int pid, int uid, ISessionControllerCallback caller);
+ void onStop(String packageName, int pid, int uid, ISessionControllerCallback caller);
+ void onNext(String packageName, int pid, int uid, ISessionControllerCallback caller);
+ void onPrevious(String packageName, int pid, int uid, ISessionControllerCallback caller);
+ void onFastForward(String packageName, int pid, int uid, ISessionControllerCallback caller);
+ void onRewind(String packageName, int pid, int uid, ISessionControllerCallback caller);
+ void onSeekTo(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ long pos);
+ void onRate(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ in Rating rating);
+ void onCustomAction(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ String action, in Bundle args);
+
+ // These callbacks are for volume handling
+ void onAdjustVolume(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ int direction);
+ void onSetVolumeTo(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, int value);
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/ISessionController.aidl b/packages/MediaComponents/apex/java/android/media/session/ISessionController.aidl
new file mode 100644
index 0000000..031a388
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/ISessionController.aidl
@@ -0,0 +1,89 @@
+/* Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.app.PendingIntent;
+import android.content.Intent;
+//import android.content.pm.ParceledListSlice;
+import android.media.MediaMetadata;
+import android.media.Rating;
+import android.media.session.ISessionControllerCallback;
+import android.media.session.MediaSession;
+import android.media.session.ParcelableVolumeInfo;
+import android.media.session.PlaybackState;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.ResultReceiver;
+import android.view.KeyEvent;
+
+import java.util.List;
+
+/**
+ * Interface to MediaSessionRecord in the system.
+ * @hide
+ */
+interface ISessionController {
+ void sendCommand(String packageName, ISessionControllerCallback caller,
+ String command, in Bundle args, in ResultReceiver cb);
+ boolean sendMediaButton(String packageName, ISessionControllerCallback caller,
+ boolean asSystemService, in KeyEvent mediaButton);
+ void registerCallbackListener(String packageName, ISessionControllerCallback cb);
+ void unregisterCallbackListener(ISessionControllerCallback cb);
+ boolean isTransportControlEnabled();
+ String getPackageName();
+ String getTag();
+ PendingIntent getLaunchPendingIntent();
+ long getFlags();
+ ParcelableVolumeInfo getVolumeAttributes();
+ void adjustVolume(String packageName, ISessionControllerCallback caller,
+ boolean asSystemService, int direction, int flags);
+ void setVolumeTo(String packageName, ISessionControllerCallback caller,
+ int value, int flags);
+
+ // These commands are for the TransportControls
+ void prepare(String packageName, ISessionControllerCallback caller);
+ void prepareFromMediaId(String packageName, ISessionControllerCallback caller,
+ String mediaId, in Bundle extras);
+ void prepareFromSearch(String packageName, ISessionControllerCallback caller,
+ String string, in Bundle extras);
+ void prepareFromUri(String packageName, ISessionControllerCallback caller,
+ in Uri uri, in Bundle extras);
+ void play(String packageName, ISessionControllerCallback caller);
+ void playFromMediaId(String packageName, ISessionControllerCallback caller,
+ String mediaId, in Bundle extras);
+ void playFromSearch(String packageName, ISessionControllerCallback caller,
+ String string, in Bundle extras);
+ void playFromUri(String packageName, ISessionControllerCallback caller,
+ in Uri uri, in Bundle extras);
+ void skipToQueueItem(String packageName, ISessionControllerCallback caller, long id);
+ void pause(String packageName, ISessionControllerCallback caller);
+ void stop(String packageName, ISessionControllerCallback caller);
+ void next(String packageName, ISessionControllerCallback caller);
+ void previous(String packageName, ISessionControllerCallback caller);
+ void fastForward(String packageName, ISessionControllerCallback caller);
+ void rewind(String packageName, ISessionControllerCallback caller);
+ void seekTo(String packageName, ISessionControllerCallback caller, long pos);
+ void rate(String packageName, ISessionControllerCallback caller, in Rating rating);
+ void sendCustomAction(String packageName, ISessionControllerCallback caller,
+ String action, in Bundle args);
+ MediaMetadata getMetadata();
+ PlaybackState getPlaybackState();
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ //ParceledListSlice getQueue();
+ CharSequence getQueueTitle();
+ Bundle getExtras();
+ int getRatingType();
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/ISessionControllerCallback.aidl b/packages/MediaComponents/apex/java/android/media/session/ISessionControllerCallback.aidl
new file mode 100644
index 0000000..173504b
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/ISessionControllerCallback.aidl
@@ -0,0 +1,40 @@
+/* Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+//import android.content.pm.ParceledListSlice;
+import android.media.MediaMetadata;
+import android.media.session.ParcelableVolumeInfo;
+import android.media.session.PlaybackState;
+import android.media.session.MediaSession;
+import android.os.Bundle;
+
+/**
+ * @hide
+ */
+oneway interface ISessionControllerCallback {
+ void onEvent(String event, in Bundle extras);
+ void onSessionDestroyed();
+
+ // These callbacks are for the TransportController
+ void onPlaybackStateChanged(in PlaybackState state);
+ void onMetadataChanged(in MediaMetadata metadata);
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ //void onQueueChanged(in ParceledListSlice queue);
+ void onQueueTitleChanged(CharSequence title);
+ void onExtrasChanged(in Bundle extras);
+ void onVolumeInfoChanged(in ParcelableVolumeInfo info);
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/ISessionManager.aidl b/packages/MediaComponents/apex/java/android/media/session/ISessionManager.aidl
new file mode 100644
index 0000000..3578c16
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/ISessionManager.aidl
@@ -0,0 +1,66 @@
+/* Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.content.ComponentName;
+import android.media.IRemoteVolumeController;
+import android.media.ISessionTokensListener;
+import android.media.session.IActiveSessionsListener;
+import android.media.session.ICallback;
+import android.media.session.IOnMediaKeyListener;
+import android.media.session.IOnVolumeKeyLongPressListener;
+import android.media.session.ISession;
+import android.media.session.ISessionCallback;
+import android.os.Bundle;
+import android.view.KeyEvent;
+
+/**
+ * Interface to the MediaSessionManagerService
+ * @hide
+ */
+interface ISessionManager {
+ ISession createSession(String packageName, in ISessionCallback cb, String tag, int userId);
+ List<IBinder> getSessions(in ComponentName compName, int userId);
+ void dispatchMediaKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent,
+ boolean needWakeLock);
+ void dispatchVolumeKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent,
+ int stream, boolean musicOnly);
+ void dispatchAdjustVolume(String packageName, int suggestedStream, int delta, int flags);
+ void addSessionsListener(in IActiveSessionsListener listener, in ComponentName compName,
+ int userId);
+ void removeSessionsListener(in IActiveSessionsListener listener);
+
+ // This is for the system volume UI only
+ void setRemoteVolumeController(in IRemoteVolumeController rvc);
+
+ // For PhoneWindowManager to precheck media keys
+ boolean isGlobalPriorityActive();
+
+ void setCallback(in ICallback callback);
+ void setOnVolumeKeyLongPressListener(in IOnVolumeKeyLongPressListener listener);
+ void setOnMediaKeyListener(in IOnMediaKeyListener listener);
+
+ // MediaSession2
+ boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid);
+ boolean createSession2(in Bundle sessionToken);
+ void destroySession2(in Bundle sessionToken);
+ List<Bundle> getSessionTokens(boolean activeSessionOnly, boolean sessionServiceOnly,
+ String packageName);
+
+ void addSessionTokensListener(in ISessionTokensListener listener, int userId,
+ String packageName);
+ void removeSessionTokensListener(in ISessionTokensListener listener, String packageName);
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/MediaController.java b/packages/MediaComponents/apex/java/android/media/session/MediaController.java
new file mode 100644
index 0000000..60f74ab
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/MediaController.java
@@ -0,0 +1,1196 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
+import android.app.PendingIntent;
+import android.content.Context;
+//import android.content.pm.ParceledListSlice;
+import android.media.AudioAttributes;
+import android.media.AudioManager;
+import android.media.MediaMetadata;
+import android.media.Rating;
+import android.media.VolumeProvider;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Allows an app to interact with an ongoing media session. Media buttons and
+ * other commands can be sent to the session. A callback may be registered to
+ * receive updates from the session, such as metadata and play state changes.
+ * <p>
+ * A MediaController can be created through {@link MediaSessionManager} if you
+ * hold the "android.permission.MEDIA_CONTENT_CONTROL" permission or are an
+ * enabled notification listener or by getting a {@link MediaSession.Token}
+ * directly from the session owner.
+ * <p>
+ * MediaController objects are thread-safe.
+ */
+public final class MediaController {
+ private static final String TAG = "MediaController";
+
+ private static final int MSG_EVENT = 1;
+ private static final int MSG_UPDATE_PLAYBACK_STATE = 2;
+ private static final int MSG_UPDATE_METADATA = 3;
+ private static final int MSG_UPDATE_VOLUME = 4;
+ private static final int MSG_UPDATE_QUEUE = 5;
+ private static final int MSG_UPDATE_QUEUE_TITLE = 6;
+ private static final int MSG_UPDATE_EXTRAS = 7;
+ private static final int MSG_DESTROYED = 8;
+
+ private final ISessionController mSessionBinder;
+
+ private final MediaSession.Token mToken;
+ private final Context mContext;
+ private final CallbackStub mCbStub = new CallbackStub(this);
+ private final ArrayList<MessageHandler> mCallbacks = new ArrayList<MessageHandler>();
+ private final Object mLock = new Object();
+
+ private boolean mCbRegistered = false;
+ private String mPackageName;
+ private String mTag;
+
+ private final TransportControls mTransportControls;
+
+ /**
+ * Call for creating a MediaController directly from a binder. Should only
+ * be used by framework code.
+ *
+ * @hide
+ */
+ public MediaController(Context context, ISessionController sessionBinder) {
+ if (sessionBinder == null) {
+ throw new IllegalArgumentException("Session token cannot be null");
+ }
+ if (context == null) {
+ throw new IllegalArgumentException("Context cannot be null");
+ }
+ mSessionBinder = sessionBinder;
+ mTransportControls = new TransportControls();
+ mToken = new MediaSession.Token(sessionBinder);
+ mContext = context;
+ }
+
+ /**
+ * Create a new MediaController from a session's token.
+ *
+ * @param context The caller's context.
+ * @param token The token for the session.
+ */
+ public MediaController(@NonNull Context context, @NonNull MediaSession.Token token) {
+ this(context, token.getBinder());
+ }
+
+ /**
+ * Get a {@link TransportControls} instance to send transport actions to
+ * the associated session.
+ *
+ * @return A transport controls instance.
+ */
+ public @NonNull TransportControls getTransportControls() {
+ return mTransportControls;
+ }
+
+ /**
+ * Send the specified media button event to the session. Only media keys can
+ * be sent by this method, other keys will be ignored.
+ *
+ * @param keyEvent The media button event to dispatch.
+ * @return true if the event was sent to the session, false otherwise.
+ */
+ public boolean dispatchMediaButtonEvent(@NonNull KeyEvent keyEvent) {
+ return dispatchMediaButtonEventInternal(false, keyEvent);
+ }
+
+ /**
+ * Dispatches the media button event as system service to the session.
+ * <p>
+ * Should be only called by the {@link com.android.internal.policy.PhoneWindow} when the
+ * foreground activity didn't consume the key from the hardware devices.
+ *
+ * @param keyEvent media key event
+ * @return {@code true} if the event was sent to the session, {@code false} otherwise
+ * @hide
+ */
+ public boolean dispatchMediaButtonEventAsSystemService(@NonNull KeyEvent keyEvent) {
+ return dispatchMediaButtonEventInternal(true, keyEvent);
+ }
+
+ private boolean dispatchMediaButtonEventInternal(boolean asSystemService,
+ @NonNull KeyEvent keyEvent) {
+ if (keyEvent == null) {
+ throw new IllegalArgumentException("KeyEvent may not be null");
+ }
+ if (!KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) {
+ return false;
+ }
+ try {
+ //TODO(b/119748678): Resolve mContext.getOpPackageName() through this file.
+ // Temporarilly it's replaced with "mContext.getOpPackageName()" for compiling.
+ return mSessionBinder.sendMediaButton("mContext.getOpPackageName()", mCbStub,
+ asSystemService, keyEvent);
+ } catch (RemoteException e) {
+ // System is dead. =(
+ }
+ return false;
+ }
+
+ /**
+ * Dispatches the volume button event as system service to the session.
+ * <p>
+ * Should be only called by the {@link com.android.internal.policy.PhoneWindow} when the
+ * foreground activity didn't consume the key from the hardware devices.
+ *
+ * @param keyEvent volume key event
+ * @hide
+ */
+ public void dispatchVolumeButtonEventAsSystemService(@NonNull KeyEvent keyEvent) {
+ switch (keyEvent.getAction()) {
+ case KeyEvent.ACTION_DOWN: {
+ int direction = 0;
+ switch (keyEvent.getKeyCode()) {
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ direction = AudioManager.ADJUST_RAISE;
+ break;
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ direction = AudioManager.ADJUST_LOWER;
+ break;
+ case KeyEvent.KEYCODE_VOLUME_MUTE:
+ direction = AudioManager.ADJUST_TOGGLE_MUTE;
+ break;
+ }
+ try {
+ mSessionBinder.adjustVolume("mContext.getOpPackageName()", mCbStub, true,
+ direction, AudioManager.FLAG_SHOW_UI);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling adjustVolumeBy", e);
+ }
+ }
+
+ case KeyEvent.ACTION_UP: {
+ final int flags = AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE
+ | AudioManager.FLAG_FROM_KEY;
+ try {
+ mSessionBinder.adjustVolume("mContext.getOpPackageName()", mCbStub, true, 0,
+ flags);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling adjustVolumeBy", e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the current playback state for this session.
+ *
+ * @return The current PlaybackState or null
+ */
+ public @Nullable PlaybackState getPlaybackState() {
+ try {
+ return mSessionBinder.getPlaybackState();
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getPlaybackState.", e);
+ return null;
+ }
+ }
+
+ /**
+ * Get the current metadata for this session.
+ *
+ * @return The current MediaMetadata or null.
+ */
+ public @Nullable MediaMetadata getMetadata() {
+ try {
+ return mSessionBinder.getMetadata();
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getMetadata.", e);
+ return null;
+ }
+ }
+
+ /**
+ * Get the current play queue for this session if one is set. If you only
+ * care about the current item {@link #getMetadata()} should be used.
+ *
+ * @return The current play queue or null.
+ */
+ public @Nullable List<MediaSession.QueueItem> getQueue() {
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ /*
+ try {
+ ParceledListSlice queue = mSessionBinder.getQueue();
+ if (queue != null) {
+ return queue.getList();
+ }
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getQueue.", e);
+ }
+ */
+ return null;
+ }
+
+ /**
+ * Get the queue title for this session.
+ */
+ public @Nullable CharSequence getQueueTitle() {
+ try {
+ return mSessionBinder.getQueueTitle();
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getQueueTitle", e);
+ }
+ return null;
+ }
+
+ /**
+ * Get the extras for this session.
+ */
+ public @Nullable Bundle getExtras() {
+ try {
+ return mSessionBinder.getExtras();
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getExtras", e);
+ }
+ return null;
+ }
+
+ /**
+ * Get the rating type supported by the session. One of:
+ * <ul>
+ * <li>{@link Rating#RATING_NONE}</li>
+ * <li>{@link Rating#RATING_HEART}</li>
+ * <li>{@link Rating#RATING_THUMB_UP_DOWN}</li>
+ * <li>{@link Rating#RATING_3_STARS}</li>
+ * <li>{@link Rating#RATING_4_STARS}</li>
+ * <li>{@link Rating#RATING_5_STARS}</li>
+ * <li>{@link Rating#RATING_PERCENTAGE}</li>
+ * </ul>
+ *
+ * @return The supported rating type
+ */
+ public int getRatingType() {
+ try {
+ return mSessionBinder.getRatingType();
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getRatingType.", e);
+ return Rating.RATING_NONE;
+ }
+ }
+
+ /**
+ * Get the flags for this session. Flags are defined in {@link MediaSession}.
+ *
+ * @return The current set of flags for the session.
+ */
+ public @MediaSession.SessionFlags long getFlags() {
+ try {
+ return mSessionBinder.getFlags();
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getFlags.", e);
+ }
+ return 0;
+ }
+
+ /**
+ * Get the current playback info for this session.
+ *
+ * @return The current playback info or null.
+ */
+ public @Nullable PlaybackInfo getPlaybackInfo() {
+ try {
+ ParcelableVolumeInfo result = mSessionBinder.getVolumeAttributes();
+ return new PlaybackInfo(result.volumeType, result.audioAttrs, result.controlType,
+ result.maxVolume, result.currentVolume);
+
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getAudioInfo.", e);
+ }
+ return null;
+ }
+
+ /**
+ * Get an intent for launching UI associated with this session if one
+ * exists.
+ *
+ * @return A {@link PendingIntent} to launch UI or null.
+ */
+ public @Nullable PendingIntent getSessionActivity() {
+ try {
+ return mSessionBinder.getLaunchPendingIntent();
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling getPendingIntent.", e);
+ }
+ return null;
+ }
+
+ /**
+ * Get the token for the session this is connected to.
+ *
+ * @return The token for the connected session.
+ */
+ public @NonNull MediaSession.Token getSessionToken() {
+ return mToken;
+ }
+
+ /**
+ * Set the volume of the output this session is playing on. The command will
+ * be ignored if it does not support
+ * {@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}. The flags in
+ * {@link AudioManager} may be used to affect the handling.
+ *
+ * @see #getPlaybackInfo()
+ * @param value The value to set it to, between 0 and the reported max.
+ * @param flags Flags from {@link AudioManager} to include with the volume
+ * request.
+ */
+ public void setVolumeTo(int value, int flags) {
+ try {
+ mSessionBinder.setVolumeTo("mContext.getOpPackageName()", mCbStub, value, flags);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling setVolumeTo.", e);
+ }
+ }
+
+ /**
+ * Adjust the volume of the output this session is playing on. The direction
+ * must be one of {@link AudioManager#ADJUST_LOWER},
+ * {@link AudioManager#ADJUST_RAISE}, or {@link AudioManager#ADJUST_SAME}.
+ * The command will be ignored if the session does not support
+ * {@link VolumeProvider#VOLUME_CONTROL_RELATIVE} or
+ * {@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}. The flags in
+ * {@link AudioManager} may be used to affect the handling.
+ *
+ * @see #getPlaybackInfo()
+ * @param direction The direction to adjust the volume in.
+ * @param flags Any flags to pass with the command.
+ */
+ public void adjustVolume(int direction, int flags) {
+ try {
+ mSessionBinder.adjustVolume("mContext.getOpPackageName()", mCbStub, false, direction,
+ flags);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling adjustVolumeBy.", e);
+ }
+ }
+
+ /**
+ * Registers a callback to receive updates from the Session. Updates will be
+ * posted on the caller's thread.
+ *
+ * @param callback The callback object, must not be null.
+ */
+ public void registerCallback(@NonNull Callback callback) {
+ registerCallback(callback, null);
+ }
+
+ /**
+ * Registers a callback to receive updates from the session. Updates will be
+ * posted on the specified handler's thread.
+ *
+ * @param callback The callback object, must not be null.
+ * @param handler The handler to post updates on. If null the callers thread
+ * will be used.
+ */
+ public void registerCallback(@NonNull Callback callback, @Nullable Handler handler) {
+ if (callback == null) {
+ throw new IllegalArgumentException("callback must not be null");
+ }
+ if (handler == null) {
+ handler = new Handler();
+ }
+ synchronized (mLock) {
+ addCallbackLocked(callback, handler);
+ }
+ }
+
+ /**
+ * Unregisters the specified callback. If an update has already been posted
+ * you may still receive it after calling this method.
+ *
+ * @param callback The callback to remove.
+ */
+ public void unregisterCallback(@NonNull Callback callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("callback must not be null");
+ }
+ synchronized (mLock) {
+ removeCallbackLocked(callback);
+ }
+ }
+
+ /**
+ * Sends a generic command to the session. It is up to the session creator
+ * to decide what commands and parameters they will support. As such,
+ * commands should only be sent to sessions that the controller owns.
+ *
+ * @param command The command to send
+ * @param args Any parameters to include with the command
+ * @param cb The callback to receive the result on
+ */
+ public void sendCommand(@NonNull String command, @Nullable Bundle args,
+ @Nullable ResultReceiver cb) {
+ if (TextUtils.isEmpty(command)) {
+ throw new IllegalArgumentException("command cannot be null or empty");
+ }
+ try {
+ mSessionBinder.sendCommand("mContext.getOpPackageName()", mCbStub, command, args, cb);
+ } catch (RemoteException e) {
+ Log.d(TAG, "Dead object in sendCommand.", e);
+ }
+ }
+
+ /**
+ * Get the session owner's package name.
+ *
+ * @return The package name of of the session owner.
+ */
+ public String getPackageName() {
+ if (mPackageName == null) {
+ try {
+ mPackageName = mSessionBinder.getPackageName();
+ } catch (RemoteException e) {
+ Log.d(TAG, "Dead object in getPackageName.", e);
+ }
+ }
+ return mPackageName;
+ }
+
+ /**
+ * Get the session's tag for debugging purposes.
+ *
+ * @return The session's tag.
+ * @hide
+ */
+ public String getTag() {
+ if (mTag == null) {
+ try {
+ mTag = mSessionBinder.getTag();
+ } catch (RemoteException e) {
+ Log.d(TAG, "Dead object in getTag.", e);
+ }
+ }
+ return mTag;
+ }
+
+ /*
+ * @hide
+ */
+ ISessionController getSessionBinder() {
+ return mSessionBinder;
+ }
+
+ /**
+ * @hide
+ */
+ @UnsupportedAppUsage
+ public boolean controlsSameSession(MediaController other) {
+ if (other == null) return false;
+ return mSessionBinder.asBinder() == other.getSessionBinder().asBinder();
+ }
+
+ private void addCallbackLocked(Callback cb, Handler handler) {
+ if (getHandlerForCallbackLocked(cb) != null) {
+ Log.w(TAG, "Callback is already added, ignoring");
+ return;
+ }
+ MessageHandler holder = new MessageHandler(handler.getLooper(), cb);
+ mCallbacks.add(holder);
+ holder.mRegistered = true;
+
+ if (!mCbRegistered) {
+ try {
+ mSessionBinder.registerCallbackListener("mContext.getOpPackageName()", mCbStub);
+ mCbRegistered = true;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Dead object in registerCallback", e);
+ }
+ }
+ }
+
+ private boolean removeCallbackLocked(Callback cb) {
+ boolean success = false;
+ for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+ MessageHandler handler = mCallbacks.get(i);
+ if (cb == handler.mCallback) {
+ mCallbacks.remove(i);
+ success = true;
+ handler.mRegistered = false;
+ }
+ }
+ if (mCbRegistered && mCallbacks.size() == 0) {
+ try {
+ mSessionBinder.unregisterCallbackListener(mCbStub);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Dead object in removeCallbackLocked");
+ }
+ mCbRegistered = false;
+ }
+ return success;
+ }
+
+ private MessageHandler getHandlerForCallbackLocked(Callback cb) {
+ if (cb == null) {
+ throw new IllegalArgumentException("Callback cannot be null");
+ }
+ for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+ MessageHandler handler = mCallbacks.get(i);
+ if (cb == handler.mCallback) {
+ return handler;
+ }
+ }
+ return null;
+ }
+
+ private final void postMessage(int what, Object obj, Bundle data) {
+ synchronized (mLock) {
+ for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+ mCallbacks.get(i).post(what, obj, data);
+ }
+ }
+ }
+
+ /**
+ * Callback for receiving updates from the session. A Callback can be
+ * registered using {@link #registerCallback}.
+ */
+ public static abstract class Callback {
+ /**
+ * Override to handle the session being destroyed. The session is no
+ * longer valid after this call and calls to it will be ignored.
+ */
+ public void onSessionDestroyed() {
+ }
+
+ /**
+ * Override to handle custom events sent by the session owner without a
+ * specified interface. Controllers should only handle these for
+ * sessions they own.
+ *
+ * @param event The event from the session.
+ * @param extras Optional parameters for the event, may be null.
+ */
+ public void onSessionEvent(@NonNull String event, @Nullable Bundle extras) {
+ }
+
+ /**
+ * Override to handle changes in playback state.
+ *
+ * @param state The new playback state of the session
+ */
+ public void onPlaybackStateChanged(@Nullable PlaybackState state) {
+ }
+
+ /**
+ * Override to handle changes to the current metadata.
+ *
+ * @param metadata The current metadata for the session or null if none.
+ * @see MediaMetadata
+ */
+ public void onMetadataChanged(@Nullable MediaMetadata metadata) {
+ }
+
+ /**
+ * Override to handle changes to items in the queue.
+ *
+ * @param queue A list of items in the current play queue. It should
+ * include the currently playing item as well as previous and
+ * upcoming items if applicable.
+ * @see MediaSession.QueueItem
+ */
+ public void onQueueChanged(@Nullable List<MediaSession.QueueItem> queue) {
+ }
+
+ /**
+ * Override to handle changes to the queue title.
+ *
+ * @param title The title that should be displayed along with the play queue such as
+ * "Now Playing". May be null if there is no such title.
+ */
+ public void onQueueTitleChanged(@Nullable CharSequence title) {
+ }
+
+ /**
+ * Override to handle changes to the {@link MediaSession} extras.
+ *
+ * @param extras The extras that can include other information associated with the
+ * {@link MediaSession}.
+ */
+ public void onExtrasChanged(@Nullable Bundle extras) {
+ }
+
+ /**
+ * Override to handle changes to the audio info.
+ *
+ * @param info The current audio info for this session.
+ */
+ public void onAudioInfoChanged(PlaybackInfo info) {
+ }
+ }
+
+ /**
+ * Interface for controlling media playback on a session. This allows an app
+ * to send media transport commands to the session.
+ */
+ public final class TransportControls {
+ private static final String TAG = "TransportController";
+
+ private TransportControls() {
+ }
+
+ /**
+ * Request that the player prepare its playback. In other words, other sessions can continue
+ * to play during the preparation of this session. This method can be used to speed up the
+ * start of the playback. Once the preparation is done, the session will change its playback
+ * state to {@link PlaybackState#STATE_PAUSED}. Afterwards, {@link #play} can be called to
+ * start playback.
+ */
+ public void prepare() {
+ try {
+ mSessionBinder.prepare("mContext.getOpPackageName()", mCbStub);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling prepare.", e);
+ }
+ }
+
+ /**
+ * Request that the player prepare playback for a specific media id. In other words, other
+ * sessions can continue to play during the preparation of this session. This method can be
+ * used to speed up the start of the playback. Once the preparation is done, the session
+ * will change its playback state to {@link PlaybackState#STATE_PAUSED}. Afterwards,
+ * {@link #play} can be called to start playback. If the preparation is not needed,
+ * {@link #playFromMediaId} can be directly called without this method.
+ *
+ * @param mediaId The id of the requested media.
+ * @param extras Optional extras that can include extra information about the media item
+ * to be prepared.
+ */
+ public void prepareFromMediaId(String mediaId, Bundle extras) {
+ if (TextUtils.isEmpty(mediaId)) {
+ throw new IllegalArgumentException(
+ "You must specify a non-empty String for prepareFromMediaId.");
+ }
+ try {
+ mSessionBinder.prepareFromMediaId("mContext.getOpPackageName()", mCbStub, mediaId,
+ extras);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling prepare(" + mediaId + ").", e);
+ }
+ }
+
+ /**
+ * Request that the player prepare playback for a specific search query. An empty or null
+ * query should be treated as a request to prepare any music. In other words, other sessions
+ * can continue to play during the preparation of this session. This method can be used to
+ * speed up the start of the playback. Once the preparation is done, the session will
+ * change its playback state to {@link PlaybackState#STATE_PAUSED}. Afterwards,
+ * {@link #play} can be called to start playback. If the preparation is not needed,
+ * {@link #playFromSearch} can be directly called without this method.
+ *
+ * @param query The search query.
+ * @param extras Optional extras that can include extra information
+ * about the query.
+ */
+ public void prepareFromSearch(String query, Bundle extras) {
+ if (query == null) {
+ // This is to remain compatible with
+ // INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
+ query = "";
+ }
+ try {
+ mSessionBinder.prepareFromSearch("mContext.getOpPackageName()", mCbStub, query,
+ extras);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling prepare(" + query + ").", e);
+ }
+ }
+
+ /**
+ * Request that the player prepare playback for a specific {@link Uri}. In other words,
+ * other sessions can continue to play during the preparation of this session. This method
+ * can be used to speed up the start of the playback. Once the preparation is done, the
+ * session will change its playback state to {@link PlaybackState#STATE_PAUSED}. Afterwards,
+ * {@link #play} can be called to start playback. If the preparation is not needed,
+ * {@link #playFromUri} can be directly called without this method.
+ *
+ * @param uri The URI of the requested media.
+ * @param extras Optional extras that can include extra information about the media item
+ * to be prepared.
+ */
+ public void prepareFromUri(Uri uri, Bundle extras) {
+ if (uri == null || Uri.EMPTY.equals(uri)) {
+ throw new IllegalArgumentException(
+ "You must specify a non-empty Uri for prepareFromUri.");
+ }
+ try {
+ mSessionBinder.prepareFromUri("mContext.getOpPackageName()", mCbStub, uri, extras);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling prepare(" + uri + ").", e);
+ }
+ }
+
+ /**
+ * Request that the player start its playback at its current position.
+ */
+ public void play() {
+ try {
+ mSessionBinder.play("mContext.getOpPackageName()", mCbStub);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling play.", e);
+ }
+ }
+
+ /**
+ * Request that the player start playback for a specific media id.
+ *
+ * @param mediaId The id of the requested media.
+ * @param extras Optional extras that can include extra information about the media item
+ * to be played.
+ */
+ public void playFromMediaId(String mediaId, Bundle extras) {
+ if (TextUtils.isEmpty(mediaId)) {
+ throw new IllegalArgumentException(
+ "You must specify a non-empty String for playFromMediaId.");
+ }
+ try {
+ mSessionBinder.playFromMediaId("mContext.getOpPackageName()", mCbStub, mediaId,
+ extras);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling play(" + mediaId + ").", e);
+ }
+ }
+
+ /**
+ * Request that the player start playback for a specific search query.
+ * An empty or null query should be treated as a request to play any
+ * music.
+ *
+ * @param query The search query.
+ * @param extras Optional extras that can include extra information
+ * about the query.
+ */
+ public void playFromSearch(String query, Bundle extras) {
+ if (query == null) {
+ // This is to remain compatible with
+ // INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
+ query = "";
+ }
+ try {
+ mSessionBinder.playFromSearch("mContext.getOpPackageName()", mCbStub, query, extras);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling play(" + query + ").", e);
+ }
+ }
+
+ /**
+ * Request that the player start playback for a specific {@link Uri}.
+ *
+ * @param uri The URI of the requested media.
+ * @param extras Optional extras that can include extra information about the media item
+ * to be played.
+ */
+ public void playFromUri(Uri uri, Bundle extras) {
+ if (uri == null || Uri.EMPTY.equals(uri)) {
+ throw new IllegalArgumentException(
+ "You must specify a non-empty Uri for playFromUri.");
+ }
+ try {
+ mSessionBinder.playFromUri("mContext.getOpPackageName()", mCbStub, uri, extras);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling play(" + uri + ").", e);
+ }
+ }
+
+ /**
+ * Play an item with a specific id in the play queue. If you specify an
+ * id that is not in the play queue, the behavior is undefined.
+ */
+ public void skipToQueueItem(long id) {
+ try {
+ mSessionBinder.skipToQueueItem("mContext.getOpPackageName()", mCbStub, id);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling skipToItem(" + id + ").", e);
+ }
+ }
+
+ /**
+ * Request that the player pause its playback and stay at its current
+ * position.
+ */
+ public void pause() {
+ try {
+ mSessionBinder.pause("mContext.getOpPackageName()", mCbStub);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling pause.", e);
+ }
+ }
+
+ /**
+ * Request that the player stop its playback; it may clear its state in
+ * whatever way is appropriate.
+ */
+ public void stop() {
+ try {
+ mSessionBinder.stop("mContext.getOpPackageName()", mCbStub);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling stop.", e);
+ }
+ }
+
+ /**
+ * Move to a new location in the media stream.
+ *
+ * @param pos Position to move to, in milliseconds.
+ */
+ public void seekTo(long pos) {
+ try {
+ mSessionBinder.seekTo("mContext.getOpPackageName()", mCbStub, pos);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling seekTo.", e);
+ }
+ }
+
+ /**
+ * Start fast forwarding. If playback is already fast forwarding this
+ * may increase the rate.
+ */
+ public void fastForward() {
+ try {
+ mSessionBinder.fastForward("mContext.getOpPackageName()", mCbStub);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling fastForward.", e);
+ }
+ }
+
+ /**
+ * Skip to the next item.
+ */
+ public void skipToNext() {
+ try {
+ mSessionBinder.next("mContext.getOpPackageName()", mCbStub);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling next.", e);
+ }
+ }
+
+ /**
+ * Start rewinding. If playback is already rewinding this may increase
+ * the rate.
+ */
+ public void rewind() {
+ try {
+ mSessionBinder.rewind("mContext.getOpPackageName()", mCbStub);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling rewind.", e);
+ }
+ }
+
+ /**
+ * Skip to the previous item.
+ */
+ public void skipToPrevious() {
+ try {
+ mSessionBinder.previous("mContext.getOpPackageName()", mCbStub);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling previous.", e);
+ }
+ }
+
+ /**
+ * Rate the current content. This will cause the rating to be set for
+ * the current user. The Rating type must match the type returned by
+ * {@link #getRatingType()}.
+ *
+ * @param rating The rating to set for the current content
+ */
+ public void setRating(Rating rating) {
+ try {
+ mSessionBinder.rate("mContext.getOpPackageName()", mCbStub, rating);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error calling rate.", e);
+ }
+ }
+
+ /**
+ * Send a custom action back for the {@link MediaSession} to perform.
+ *
+ * @param customAction The action to perform.
+ * @param args Optional arguments to supply to the {@link MediaSession} for this
+ * custom action.
+ */
+ public void sendCustomAction(@NonNull PlaybackState.CustomAction customAction,
+ @Nullable Bundle args) {
+ if (customAction == null) {
+ throw new IllegalArgumentException("CustomAction cannot be null.");
+ }
+ sendCustomAction(customAction.getAction(), args);
+ }
+
+ /**
+ * Send the id and args from a custom action back for the {@link MediaSession} to perform.
+ *
+ * @see #sendCustomAction(PlaybackState.CustomAction action, Bundle args)
+ * @param action The action identifier of the {@link PlaybackState.CustomAction} as
+ * specified by the {@link MediaSession}.
+ * @param args Optional arguments to supply to the {@link MediaSession} for this
+ * custom action.
+ */
+ public void sendCustomAction(@NonNull String action, @Nullable Bundle args) {
+ if (TextUtils.isEmpty(action)) {
+ throw new IllegalArgumentException("CustomAction cannot be null.");
+ }
+ try {
+ mSessionBinder.sendCustomAction("mContext.getOpPackageName()", mCbStub, action, args);
+ } catch (RemoteException e) {
+ Log.d(TAG, "Dead object in sendCustomAction.", e);
+ }
+ }
+ }
+
+ /**
+ * Holds information about the current playback and how audio is handled for
+ * this session.
+ */
+ public static final class PlaybackInfo {
+ /**
+ * The session uses remote playback.
+ */
+ public static final int PLAYBACK_TYPE_REMOTE = 2;
+ /**
+ * The session uses local playback.
+ */
+ public static final int PLAYBACK_TYPE_LOCAL = 1;
+
+ private final int mVolumeType;
+ private final int mVolumeControl;
+ private final int mMaxVolume;
+ private final int mCurrentVolume;
+ private final AudioAttributes mAudioAttrs;
+
+ /**
+ * @hide
+ */
+ public PlaybackInfo(int type, AudioAttributes attrs, int control, int max, int current) {
+ mVolumeType = type;
+ mAudioAttrs = attrs;
+ mVolumeControl = control;
+ mMaxVolume = max;
+ mCurrentVolume = current;
+ }
+
+ /**
+ * Get the type of playback which affects volume handling. One of:
+ * <ul>
+ * <li>{@link #PLAYBACK_TYPE_LOCAL}</li>
+ * <li>{@link #PLAYBACK_TYPE_REMOTE}</li>
+ * </ul>
+ *
+ * @return The type of playback this session is using.
+ */
+ public int getPlaybackType() {
+ return mVolumeType;
+ }
+
+ /**
+ * Get the audio attributes for this session. The attributes will affect
+ * volume handling for the session. When the volume type is
+ * {@link PlaybackInfo#PLAYBACK_TYPE_REMOTE} these may be ignored by the
+ * remote volume handler.
+ *
+ * @return The attributes for this session.
+ */
+ public AudioAttributes getAudioAttributes() {
+ return mAudioAttrs;
+ }
+
+ /**
+ * Get the type of volume control that can be used. One of:
+ * <ul>
+ * <li>{@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}</li>
+ * <li>{@link VolumeProvider#VOLUME_CONTROL_RELATIVE}</li>
+ * <li>{@link VolumeProvider#VOLUME_CONTROL_FIXED}</li>
+ * </ul>
+ *
+ * @return The type of volume control that may be used with this
+ * session.
+ */
+ public int getVolumeControl() {
+ return mVolumeControl;
+ }
+
+ /**
+ * Get the maximum volume that may be set for this session.
+ *
+ * @return The maximum allowed volume where this session is playing.
+ */
+ public int getMaxVolume() {
+ return mMaxVolume;
+ }
+
+ /**
+ * Get the current volume for this session.
+ *
+ * @return The current volume where this session is playing.
+ */
+ public int getCurrentVolume() {
+ return mCurrentVolume;
+ }
+ }
+
+ private final static class CallbackStub extends ISessionControllerCallback.Stub {
+ private final WeakReference<MediaController> mController;
+
+ public CallbackStub(MediaController controller) {
+ mController = new WeakReference<MediaController>(controller);
+ }
+
+ @Override
+ public void onSessionDestroyed() {
+ MediaController controller = mController.get();
+ if (controller != null) {
+ controller.postMessage(MSG_DESTROYED, null, null);
+ }
+ }
+
+ @Override
+ public void onEvent(String event, Bundle extras) {
+ MediaController controller = mController.get();
+ if (controller != null) {
+ controller.postMessage(MSG_EVENT, event, extras);
+ }
+ }
+
+ @Override
+ public void onPlaybackStateChanged(PlaybackState state) {
+ MediaController controller = mController.get();
+ if (controller != null) {
+ controller.postMessage(MSG_UPDATE_PLAYBACK_STATE, state, null);
+ }
+ }
+
+ @Override
+ public void onMetadataChanged(MediaMetadata metadata) {
+ MediaController controller = mController.get();
+ if (controller != null) {
+ controller.postMessage(MSG_UPDATE_METADATA, metadata, null);
+ }
+ }
+
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ /*
+ @Override
+ public void onQueueChanged(ParceledListSlice parceledQueue) {
+ List<MediaSession.QueueItem> queue = parceledQueue == null ? null : parceledQueue
+ .getList();
+ MediaController controller = mController.get();
+ if (controller != null) {
+ controller.postMessage(MSG_UPDATE_QUEUE, queue, null);
+ }
+ }
+ */
+
+ @Override
+ public void onQueueTitleChanged(CharSequence title) {
+ MediaController controller = mController.get();
+ if (controller != null) {
+ controller.postMessage(MSG_UPDATE_QUEUE_TITLE, title, null);
+ }
+ }
+
+ @Override
+ public void onExtrasChanged(Bundle extras) {
+ MediaController controller = mController.get();
+ if (controller != null) {
+ controller.postMessage(MSG_UPDATE_EXTRAS, extras, null);
+ }
+ }
+
+ @Override
+ public void onVolumeInfoChanged(ParcelableVolumeInfo pvi) {
+ MediaController controller = mController.get();
+ if (controller != null) {
+ PlaybackInfo info = new PlaybackInfo(pvi.volumeType, pvi.audioAttrs,
+ pvi.controlType, pvi.maxVolume, pvi.currentVolume);
+ controller.postMessage(MSG_UPDATE_VOLUME, info, null);
+ }
+ }
+
+ }
+
+ private final static class MessageHandler extends Handler {
+ private final MediaController.Callback mCallback;
+ private boolean mRegistered = false;
+
+ public MessageHandler(Looper looper, MediaController.Callback cb) {
+ //TODO:(b/119539849) Uncomment below line and resolve the error.
+ // super(looper, null, true);
+ mCallback = cb;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (!mRegistered) {
+ return;
+ }
+ switch (msg.what) {
+ case MSG_EVENT:
+ mCallback.onSessionEvent((String) msg.obj, msg.getData());
+ break;
+ case MSG_UPDATE_PLAYBACK_STATE:
+ mCallback.onPlaybackStateChanged((PlaybackState) msg.obj);
+ break;
+ case MSG_UPDATE_METADATA:
+ mCallback.onMetadataChanged((MediaMetadata) msg.obj);
+ break;
+ case MSG_UPDATE_QUEUE:
+ mCallback.onQueueChanged((List<MediaSession.QueueItem>) msg.obj);
+ break;
+ case MSG_UPDATE_QUEUE_TITLE:
+ mCallback.onQueueTitleChanged((CharSequence) msg.obj);
+ break;
+ case MSG_UPDATE_EXTRAS:
+ mCallback.onExtrasChanged((Bundle) msg.obj);
+ break;
+ case MSG_UPDATE_VOLUME:
+ mCallback.onAudioInfoChanged((PlaybackInfo) msg.obj);
+ break;
+ case MSG_DESTROYED:
+ mCallback.onSessionDestroyed();
+ break;
+ }
+ }
+
+ public void post(int what, Object obj, Bundle data) {
+ Message msg = obtainMessage(what, obj);
+ msg.setData(data);
+ msg.sendToTarget();
+ }
+ }
+
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/MediaSession.aidl b/packages/MediaComponents/apex/java/android/media/session/MediaSession.aidl
new file mode 100644
index 0000000..f657cef
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/MediaSession.aidl
@@ -0,0 +1,19 @@
+/* Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media.session;
+
+parcelable MediaSession.Token;
+parcelable MediaSession.QueueItem;
\ No newline at end of file
diff --git a/packages/MediaComponents/apex/java/android/media/session/MediaSession.java b/packages/MediaComponents/apex/java/android/media/session/MediaSession.java
new file mode 100644
index 0000000..42d92d1
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/MediaSession.java
@@ -0,0 +1,1567 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.session;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+//import android.content.pm.ParceledListSlice;
+import android.media.AudioAttributes;
+import android.media.MediaDescription;
+import android.media.MediaMetadata;
+import android.media.Rating;
+import android.media.VolumeProvider;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.UserHandle;
+import android.media.session.MediaSessionManager.RemoteUserInfo;
+import android.service.media.MediaBrowserService;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Pair;
+import android.view.KeyEvent;
+import android.view.ViewConfiguration;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Allows interaction with media controllers, volume keys, media buttons, and
+ * transport controls.
+ * <p>
+ * A MediaSession should be created when an app wants to publish media playback
+ * information or handle media keys. In general an app only needs one session
+ * for all playback, though multiple sessions can be created to provide finer
+ * grain controls of media.
+ * <p>
+ * Once a session is created the owner of the session may pass its
+ * {@link #getSessionToken() session token} to other processes to allow them to
+ * create a {@link MediaController} to interact with the session.
+ * <p>
+ * To receive commands, media keys, and other events a {@link Callback} must be
+ * set with {@link #setCallback(Callback)} and {@link #setActive(boolean)
+ * setActive(true)} must be called.
+ * <p>
+ * When an app is finished performing playback it must call {@link #release()}
+ * to clean up the session and notify any controllers.
+ * <p>
+ * MediaSession objects are thread safe.
+ */
+public final class MediaSession {
+ private static final String TAG = "MediaSession";
+
+ /**
+ * Set this flag on the session to indicate that it can handle media button
+ * events.
+ * @deprecated This flag is no longer used. All media sessions are expected to handle media
+ * button events now.
+ */
+ @Deprecated
+ public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1 << 0;
+
+ /**
+ * Set this flag on the session to indicate that it handles transport
+ * control commands through its {@link Callback}.
+ * @deprecated This flag is no longer used. All media sessions are expected to handle transport
+ * controls now.
+ */
+ @Deprecated
+ public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 1 << 1;
+
+ /**
+ * System only flag for a session that needs to have priority over all other
+ * sessions. This flag ensures this session will receive media button events
+ * regardless of the current ordering in the system.
+ *
+ * @hide
+ */
+ public static final int FLAG_EXCLUSIVE_GLOBAL_PRIORITY = 1 << 16;
+
+ /**
+ * @hide
+ */
+ public static final int INVALID_UID = -1;
+
+ /**
+ * @hide
+ */
+ public static final int INVALID_PID = -1;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true, value = {
+ FLAG_HANDLES_MEDIA_BUTTONS,
+ FLAG_HANDLES_TRANSPORT_CONTROLS,
+ FLAG_EXCLUSIVE_GLOBAL_PRIORITY })
+ public @interface SessionFlags { }
+
+ private final Object mLock = new Object();
+ private final int mMaxBitmapSize;
+
+ private final MediaSession.Token mSessionToken;
+ private final MediaController mController;
+ private final ISession mBinder;
+ private final CallbackStub mCbStub;
+
+ // Do not change the name of mCallback. Support lib accesses this by using reflection.
+ @UnsupportedAppUsage
+ private CallbackMessageHandler mCallback;
+ private VolumeProvider mVolumeProvider;
+ private PlaybackState mPlaybackState;
+
+ private boolean mActive = false;
+
+ /**
+ * Creates a new session. The session will automatically be registered with
+ * the system but will not be published until {@link #setActive(boolean)
+ * setActive(true)} is called. You must call {@link #release()} when
+ * finished with the session.
+ *
+ * @param context The context to use to create the session.
+ * @param tag A short name for debugging purposes.
+ */
+ public MediaSession(@NonNull Context context, @NonNull String tag) {
+ this(context, tag, UserHandle.myUserId());
+ }
+
+ /**
+ * Creates a new session as the specified user. To create a session as a
+ * user other than your own you must hold the
+ * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL}
+ * permission.
+ *
+ * @param context The context to use to create the session.
+ * @param tag A short name for debugging purposes.
+ * @param userId The user id to create the session as.
+ * @hide
+ */
+ public MediaSession(@NonNull Context context, @NonNull String tag, int userId) {
+ if (context == null) {
+ throw new IllegalArgumentException("context cannot be null.");
+ }
+ if (TextUtils.isEmpty(tag)) {
+ throw new IllegalArgumentException("tag cannot be null or empty");
+ }
+ //TODO(b/119749798): Resolve hidden API usage. com.android.internal.R
+ //mMaxBitmapSize = context.getResources().getDimensionPixelSize(
+ //com.android.internal.R.dimen.config_mediaMetadataBitmapMaxSize);
+ mMaxBitmapSize = 1024; //TODO: remove this.
+ mCbStub = new CallbackStub(this);
+ MediaSessionManager manager = (MediaSessionManager) context
+ .getSystemService(Context.MEDIA_SESSION_SERVICE);
+ try {
+ mBinder = manager.createSession(mCbStub, tag, userId);
+ mSessionToken = new Token(mBinder.getController());
+ mController = new MediaController(context, mSessionToken);
+ } catch (RemoteException e) {
+ throw new RuntimeException("Remote error creating session.", e);
+ }
+ }
+
+ /**
+ * Set the callback to receive updates for the MediaSession. This includes
+ * media button events and transport controls. The caller's thread will be
+ * used to post updates.
+ * <p>
+ * Set the callback to null to stop receiving updates.
+ *
+ * @param callback The callback object
+ */
+ public void setCallback(@Nullable Callback callback) {
+ setCallback(callback, null);
+ }
+
+ /**
+ * Set the callback to receive updates for the MediaSession. This includes
+ * media button events and transport controls.
+ * <p>
+ * Set the callback to null to stop receiving updates.
+ *
+ * @param callback The callback to receive updates on.
+ * @param handler The handler that events should be posted on.
+ */
+ public void setCallback(@Nullable Callback callback, @Nullable Handler handler) {
+ synchronized (mLock) {
+ if (mCallback != null) {
+ // We're updating the callback, clear the session from the old one.
+ mCallback.mCallback.mSession = null;
+ mCallback.removeCallbacksAndMessages(null);
+ }
+ if (callback == null) {
+ mCallback = null;
+ return;
+ }
+ if (handler == null) {
+ handler = new Handler();
+ }
+ callback.mSession = this;
+ CallbackMessageHandler msgHandler = new CallbackMessageHandler(handler.getLooper(),
+ callback);
+ mCallback = msgHandler;
+ }
+ }
+
+ /**
+ * Set an intent for launching UI for this Session. This can be used as a
+ * quick link to an ongoing media screen. The intent should be for an
+ * activity that may be started using {@link Activity#startActivity(Intent)}.
+ *
+ * @param pi The intent to launch to show UI for this Session.
+ */
+ public void setSessionActivity(@Nullable PendingIntent pi) {
+ try {
+ mBinder.setLaunchPendingIntent(pi);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Failure in setLaunchPendingIntent.", e);
+ }
+ }
+
+ /**
+ * Set a pending intent for your media button receiver to allow restarting
+ * playback after the session has been stopped. If your app is started in
+ * this way an {@link Intent#ACTION_MEDIA_BUTTON} intent will be sent via
+ * the pending intent.
+ *
+ * @param mbr The {@link PendingIntent} to send the media button event to.
+ */
+ public void setMediaButtonReceiver(@Nullable PendingIntent mbr) {
+ try {
+ mBinder.setMediaButtonReceiver(mbr);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Failure in setMediaButtonReceiver.", e);
+ }
+ }
+
+ /**
+ * Set any flags for the session.
+ *
+ * @param flags The flags to set for this session.
+ */
+ public void setFlags(@SessionFlags int flags) {
+ try {
+ mBinder.setFlags(flags);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Failure in setFlags.", e);
+ }
+ }
+
+ /**
+ * Set the attributes for this session's audio. This will affect the
+ * system's volume handling for this session. If
+ * {@link #setPlaybackToRemote} was previously called it will stop receiving
+ * volume commands and the system will begin sending volume changes to the
+ * appropriate stream.
+ * <p>
+ * By default sessions use attributes for media.
+ *
+ * @param attributes The {@link AudioAttributes} for this session's audio.
+ */
+ public void setPlaybackToLocal(AudioAttributes attributes) {
+ if (attributes == null) {
+ throw new IllegalArgumentException("Attributes cannot be null for local playback.");
+ }
+ //TODO(b/119751592): Decide if AudioAttributes should be updated.
+ /*
+ try {
+ mBinder.setPlaybackToLocal(attributes);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Failure in setPlaybackToLocal.", e);
+ }
+ */
+ }
+
+ /**
+ * Configure this session to use remote volume handling. This must be called
+ * to receive volume button events, otherwise the system will adjust the
+ * appropriate stream volume for this session. If
+ * {@link #setPlaybackToLocal} was previously called the system will stop
+ * handling volume changes for this session and pass them to the volume
+ * provider instead.
+ *
+ * @param volumeProvider The provider that will handle volume changes. May
+ * not be null.
+ */
+ public void setPlaybackToRemote(@NonNull VolumeProvider volumeProvider) {
+ if (volumeProvider == null) {
+ throw new IllegalArgumentException("volumeProvider may not be null!");
+ }
+ synchronized (mLock) {
+ mVolumeProvider = volumeProvider;
+ }
+ volumeProvider.setCallback(new VolumeProvider.Callback() {
+ @Override
+ public void onVolumeChanged(VolumeProvider volumeProvider) {
+ notifyRemoteVolumeChanged(volumeProvider);
+ }
+ });
+
+ try {
+ mBinder.setPlaybackToRemote(volumeProvider.getVolumeControl(),
+ volumeProvider.getMaxVolume());
+ mBinder.setCurrentVolume(volumeProvider.getCurrentVolume());
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Failure in setPlaybackToRemote.", e);
+ }
+ }
+
+ /**
+ * Set if this session is currently active and ready to receive commands. If
+ * set to false your session's controller may not be discoverable. You must
+ * set the session to active before it can start receiving media button
+ * events or transport commands.
+ *
+ * @param active Whether this session is active or not.
+ */
+ public void setActive(boolean active) {
+ if (mActive == active) {
+ return;
+ }
+ try {
+ mBinder.setActive(active);
+ mActive = active;
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Failure in setActive.", e);
+ }
+ }
+
+ /**
+ * Get the current active state of this session.
+ *
+ * @return True if the session is active, false otherwise.
+ */
+ public boolean isActive() {
+ return mActive;
+ }
+
+ /**
+ * Send a proprietary event to all MediaControllers listening to this
+ * Session. It's up to the Controller/Session owner to determine the meaning
+ * of any events.
+ *
+ * @param event The name of the event to send
+ * @param extras Any extras included with the event
+ */
+ public void sendSessionEvent(@NonNull String event, @Nullable Bundle extras) {
+ if (TextUtils.isEmpty(event)) {
+ throw new IllegalArgumentException("event cannot be null or empty");
+ }
+ try {
+ mBinder.sendEvent(event, extras);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error sending event", e);
+ }
+ }
+
+ /**
+ * This must be called when an app has finished performing playback. If
+ * playback is expected to start again shortly the session can be left open,
+ * but it must be released if your activity or service is being destroyed.
+ */
+ public void release() {
+ try {
+ mBinder.destroy();
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Error releasing session: ", e);
+ }
+ }
+
+ /**
+ * Retrieve a token object that can be used by apps to create a
+ * {@link MediaController} for interacting with this session. The owner of
+ * the session is responsible for deciding how to distribute these tokens.
+ *
+ * @return A token that can be used to create a MediaController for this
+ * session
+ */
+ public @NonNull Token getSessionToken() {
+ return mSessionToken;
+ }
+
+ /**
+ * Get a controller for this session. This is a convenience method to avoid
+ * having to cache your own controller in process.
+ *
+ * @return A controller for this session.
+ */
+ public @NonNull MediaController getController() {
+ return mController;
+ }
+
+ /**
+ * Update the current playback state.
+ *
+ * @param state The current state of playback
+ */
+ public void setPlaybackState(@Nullable PlaybackState state) {
+ mPlaybackState = state;
+ try {
+ mBinder.setPlaybackState(state);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Dead object in setPlaybackState.", e);
+ }
+ }
+
+ /**
+ * Update the current metadata. New metadata can be created using
+ * {@link android.media.MediaMetadata.Builder}. This operation may take time proportional to
+ * the size of the bitmap to replace large bitmaps with a scaled down copy.
+ *
+ * @param metadata The new metadata
+ * @see android.media.MediaMetadata.Builder#putBitmap
+ */
+ public void setMetadata(@Nullable MediaMetadata metadata) {
+ if (metadata != null) {
+ metadata = (new MediaMetadata.Builder(metadata, mMaxBitmapSize)).build();
+ }
+ try {
+ mBinder.setMetadata(metadata);
+ } catch (RemoteException e) {
+ Log.wtf(TAG, "Dead object in setPlaybackState.", e);
+ }
+ }
+
+ /**
+ * Update the list of items in the play queue. It is an ordered list and
+ * should contain the current item, and previous or upcoming items if they
+ * exist. Specify null if there is no current play queue.
+ * <p>
+ * The queue should be of reasonable size. If the play queue is unbounded
+ * within your app, it is better to send a reasonable amount in a sliding
+ * window instead.
+ *
+ * @param queue A list of items in the play queue.
+ */
+ public void setQueue(@Nullable List<QueueItem> queue) {
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ /*
+ try {
+ mBinder.setQueue(queue == null ? null : new ParceledListSlice<QueueItem>(queue));
+ } catch (RemoteException e) {
+ Log.wtf("Dead object in setQueue.", e);
+ }
+ */
+ }
+
+ /**
+ * Set the title of the play queue. The UI should display this title along
+ * with the play queue itself.
+ * e.g. "Play Queue", "Now Playing", or an album name.
+ *
+ * @param title The title of the play queue.
+ */
+ public void setQueueTitle(@Nullable CharSequence title) {
+ try {
+ mBinder.setQueueTitle(title);
+ } catch (RemoteException e) {
+ Log.wtf("Dead object in setQueueTitle.", e);
+ }
+ }
+
+ /**
+ * Set the style of rating used by this session. Apps trying to set the
+ * rating should use this style. Must be one of the following:
+ * <ul>
+ * <li>{@link Rating#RATING_NONE}</li>
+ * <li>{@link Rating#RATING_3_STARS}</li>
+ * <li>{@link Rating#RATING_4_STARS}</li>
+ * <li>{@link Rating#RATING_5_STARS}</li>
+ * <li>{@link Rating#RATING_HEART}</li>
+ * <li>{@link Rating#RATING_PERCENTAGE}</li>
+ * <li>{@link Rating#RATING_THUMB_UP_DOWN}</li>
+ * </ul>
+ */
+ public void setRatingType(@Rating.Style int type) {
+ try {
+ mBinder.setRatingType(type);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error in setRatingType.", e);
+ }
+ }
+
+ /**
+ * Set some extras that can be associated with the {@link MediaSession}. No assumptions should
+ * be made as to how a {@link MediaController} will handle these extras.
+ * Keys should be fully qualified (e.g. com.example.MY_EXTRA) to avoid conflicts.
+ *
+ * @param extras The extras associated with the {@link MediaSession}.
+ */
+ public void setExtras(@Nullable Bundle extras) {
+ try {
+ mBinder.setExtras(extras);
+ } catch (RemoteException e) {
+ Log.wtf("Dead object in setExtras.", e);
+ }
+ }
+
+ /**
+ * Gets the controller information who sent the current request.
+ * <p>
+ * Note: This is only valid while in a request callback, such as {@link Callback#onPlay}.
+ *
+ * @throws IllegalStateException If this method is called outside of {@link Callback} methods.
+ * @see MediaSessionManager#isTrustedForMediaControl(RemoteUserInfo)
+ */
+ public final @NonNull RemoteUserInfo getCurrentControllerInfo() {
+ if (mCallback == null || mCallback.mCurrentControllerInfo == null) {
+ throw new IllegalStateException(
+ "This should be called inside of MediaSession.Callback methods");
+ }
+ return mCallback.mCurrentControllerInfo;
+ }
+
+ /**
+ * Notify the system that the remote volume changed.
+ *
+ * @param provider The provider that is handling volume changes.
+ * @hide
+ */
+ public void notifyRemoteVolumeChanged(VolumeProvider provider) {
+ synchronized (mLock) {
+ if (provider == null || provider != mVolumeProvider) {
+ Log.w(TAG, "Received update from stale volume provider");
+ return;
+ }
+ }
+ try {
+ mBinder.setCurrentVolume(provider.getCurrentVolume());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error in notifyVolumeChanged", e);
+ }
+ }
+
+ /**
+ * Returns the name of the package that sent the last media button, transport control, or
+ * command from controllers and the system. This is only valid while in a request callback, such
+ * as {@link Callback#onPlay}.
+ *
+ * @hide
+ */
+ @UnsupportedAppUsage
+ public String getCallingPackage() {
+ if (mCallback != null && mCallback.mCurrentControllerInfo != null) {
+ return mCallback.mCurrentControllerInfo.getPackageName();
+ }
+ return null;
+ }
+
+ private void dispatchPrepare(RemoteUserInfo caller) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PREPARE, null, null);
+ }
+
+ private void dispatchPrepareFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_MEDIA_ID, mediaId, extras);
+ }
+
+ private void dispatchPrepareFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_SEARCH, query, extras);
+ }
+
+ private void dispatchPrepareFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_URI, uri, extras);
+ }
+
+ private void dispatchPlay(RemoteUserInfo caller) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PLAY, null, null);
+ }
+
+ private void dispatchPlayFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PLAY_MEDIA_ID, mediaId, extras);
+ }
+
+ private void dispatchPlayFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PLAY_SEARCH, query, extras);
+ }
+
+ private void dispatchPlayFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PLAY_URI, uri, extras);
+ }
+
+ private void dispatchSkipToItem(RemoteUserInfo caller, long id) {
+ postToCallback(caller, CallbackMessageHandler.MSG_SKIP_TO_ITEM, id, null);
+ }
+
+ private void dispatchPause(RemoteUserInfo caller) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PAUSE, null, null);
+ }
+
+ private void dispatchStop(RemoteUserInfo caller) {
+ postToCallback(caller, CallbackMessageHandler.MSG_STOP, null, null);
+ }
+
+ private void dispatchNext(RemoteUserInfo caller) {
+ postToCallback(caller, CallbackMessageHandler.MSG_NEXT, null, null);
+ }
+
+ private void dispatchPrevious(RemoteUserInfo caller) {
+ postToCallback(caller, CallbackMessageHandler.MSG_PREVIOUS, null, null);
+ }
+
+ private void dispatchFastForward(RemoteUserInfo caller) {
+ postToCallback(caller, CallbackMessageHandler.MSG_FAST_FORWARD, null, null);
+ }
+
+ private void dispatchRewind(RemoteUserInfo caller) {
+ postToCallback(caller, CallbackMessageHandler.MSG_REWIND, null, null);
+ }
+
+ private void dispatchSeekTo(RemoteUserInfo caller, long pos) {
+ postToCallback(caller, CallbackMessageHandler.MSG_SEEK_TO, pos, null);
+ }
+
+ private void dispatchRate(RemoteUserInfo caller, Rating rating) {
+ postToCallback(caller, CallbackMessageHandler.MSG_RATE, rating, null);
+ }
+
+ private void dispatchCustomAction(RemoteUserInfo caller, String action, Bundle args) {
+ postToCallback(caller, CallbackMessageHandler.MSG_CUSTOM_ACTION, action, args);
+ }
+
+ private void dispatchMediaButton(RemoteUserInfo caller, Intent mediaButtonIntent) {
+ postToCallback(caller, CallbackMessageHandler.MSG_MEDIA_BUTTON, mediaButtonIntent, null);
+ }
+
+ private void dispatchMediaButtonDelayed(RemoteUserInfo info, Intent mediaButtonIntent,
+ long delay) {
+ postToCallbackDelayed(info, CallbackMessageHandler.MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT,
+ mediaButtonIntent, null, delay);
+ }
+
+ private void dispatchAdjustVolume(RemoteUserInfo caller, int direction) {
+ postToCallback(caller, CallbackMessageHandler.MSG_ADJUST_VOLUME, direction, null);
+ }
+
+ private void dispatchSetVolumeTo(RemoteUserInfo caller, int volume) {
+ postToCallback(caller, CallbackMessageHandler.MSG_SET_VOLUME, volume, null);
+ }
+
+ private void dispatchCommand(RemoteUserInfo caller, String command, Bundle args,
+ ResultReceiver resultCb) {
+ Command cmd = new Command(command, args, resultCb);
+ postToCallback(caller, CallbackMessageHandler.MSG_COMMAND, cmd, null);
+ }
+
+ private void postToCallback(RemoteUserInfo caller, int what, Object obj, Bundle data) {
+ postToCallbackDelayed(caller, what, obj, data, 0);
+ }
+
+ private void postToCallbackDelayed(RemoteUserInfo caller, int what, Object obj, Bundle data,
+ long delay) {
+ synchronized (mLock) {
+ if (mCallback != null) {
+ mCallback.post(caller, what, obj, data, delay);
+ }
+ }
+ }
+
+ /**
+ * Return true if this is considered an active playback state.
+ *
+ * @hide
+ */
+ public static boolean isActiveState(int state) {
+ switch (state) {
+ case PlaybackState.STATE_FAST_FORWARDING:
+ case PlaybackState.STATE_REWINDING:
+ case PlaybackState.STATE_SKIPPING_TO_PREVIOUS:
+ case PlaybackState.STATE_SKIPPING_TO_NEXT:
+ case PlaybackState.STATE_BUFFERING:
+ case PlaybackState.STATE_CONNECTING:
+ case PlaybackState.STATE_PLAYING:
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Represents an ongoing session. This may be passed to apps by the session
+ * owner to allow them to create a {@link MediaController} to communicate with
+ * the session.
+ */
+ public static final class Token implements Parcelable {
+
+ private ISessionController mBinder;
+
+ /**
+ * @hide
+ */
+ public Token(ISessionController binder) {
+ mBinder = binder;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeStrongBinder(mBinder.asBinder());
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((mBinder == null) ? 0 : mBinder.asBinder().hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Token other = (Token) obj;
+ if (mBinder == null) {
+ if (other.mBinder != null)
+ return false;
+ } else if (!mBinder.asBinder().equals(other.mBinder.asBinder()))
+ return false;
+ return true;
+ }
+
+ ISessionController getBinder() {
+ return mBinder;
+ }
+
+ public static final Parcelable.Creator<Token> CREATOR
+ = new Parcelable.Creator<Token>() {
+ @Override
+ public Token createFromParcel(Parcel in) {
+ return new Token(ISessionController.Stub.asInterface(in.readStrongBinder()));
+ }
+
+ @Override
+ public Token[] newArray(int size) {
+ return new Token[size];
+ }
+ };
+ }
+
+ /**
+ * Receives media buttons, transport controls, and commands from controllers
+ * and the system. A callback may be set using {@link #setCallback}.
+ */
+ public abstract static class Callback {
+
+ private MediaSession mSession;
+ private CallbackMessageHandler mHandler;
+ private boolean mMediaPlayPauseKeyPending;
+
+ public Callback() {
+ }
+
+ /**
+ * Called when a controller has sent a command to this session.
+ * The owner of the session may handle custom commands but is not
+ * required to.
+ *
+ * @param command The command name.
+ * @param args Optional parameters for the command, may be null.
+ * @param cb A result receiver to which a result may be sent by the command, may be null.
+ */
+ public void onCommand(@NonNull String command, @Nullable Bundle args,
+ @Nullable ResultReceiver cb) {
+ }
+
+ /**
+ * Called when a media button is pressed and this session has the
+ * highest priority or a controller sends a media button event to the
+ * session. The default behavior will call the relevant method if the
+ * action for it was set.
+ * <p>
+ * The intent will be of type {@link Intent#ACTION_MEDIA_BUTTON} with a
+ * KeyEvent in {@link Intent#EXTRA_KEY_EVENT}
+ *
+ * @param mediaButtonIntent an intent containing the KeyEvent as an
+ * extra
+ * @return True if the event was handled, false otherwise.
+ */
+ public boolean onMediaButtonEvent(@NonNull Intent mediaButtonIntent) {
+ if (mSession != null && mHandler != null
+ && Intent.ACTION_MEDIA_BUTTON.equals(mediaButtonIntent.getAction())) {
+ KeyEvent ke = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
+ if (ke != null && ke.getAction() == KeyEvent.ACTION_DOWN) {
+ PlaybackState state = mSession.mPlaybackState;
+ long validActions = state == null ? 0 : state.getActions();
+ switch (ke.getKeyCode()) {
+ case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+ case KeyEvent.KEYCODE_HEADSETHOOK:
+ if (ke.getRepeatCount() > 0) {
+ // Consider long-press as a single tap.
+ handleMediaPlayPauseKeySingleTapIfPending();
+ } else if (mMediaPlayPauseKeyPending) {
+ // Consider double tap as the next.
+ mHandler.removeMessages(CallbackMessageHandler
+ .MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT);
+ mMediaPlayPauseKeyPending = false;
+ if ((validActions & PlaybackState.ACTION_SKIP_TO_NEXT) != 0) {
+ onSkipToNext();
+ }
+ } else {
+ mMediaPlayPauseKeyPending = true;
+ mSession.dispatchMediaButtonDelayed(
+ mSession.getCurrentControllerInfo(),
+ mediaButtonIntent, ViewConfiguration.getDoubleTapTimeout());
+ }
+ return true;
+ default:
+ // If another key is pressed within double tap timeout, consider the
+ // pending play/pause as a single tap to handle media keys in order.
+ handleMediaPlayPauseKeySingleTapIfPending();
+ break;
+ }
+
+ switch (ke.getKeyCode()) {
+ case KeyEvent.KEYCODE_MEDIA_PLAY:
+ if ((validActions & PlaybackState.ACTION_PLAY) != 0) {
+ onPlay();
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_MEDIA_PAUSE:
+ if ((validActions & PlaybackState.ACTION_PAUSE) != 0) {
+ onPause();
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_MEDIA_NEXT:
+ if ((validActions & PlaybackState.ACTION_SKIP_TO_NEXT) != 0) {
+ onSkipToNext();
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+ if ((validActions & PlaybackState.ACTION_SKIP_TO_PREVIOUS) != 0) {
+ onSkipToPrevious();
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_MEDIA_STOP:
+ if ((validActions & PlaybackState.ACTION_STOP) != 0) {
+ onStop();
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+ if ((validActions & PlaybackState.ACTION_FAST_FORWARD) != 0) {
+ onFastForward();
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_MEDIA_REWIND:
+ if ((validActions & PlaybackState.ACTION_REWIND) != 0) {
+ onRewind();
+ return true;
+ }
+ break;
+ }
+ }
+ }
+ return false;
+ }
+
+ private void handleMediaPlayPauseKeySingleTapIfPending() {
+ if (!mMediaPlayPauseKeyPending) {
+ return;
+ }
+ mMediaPlayPauseKeyPending = false;
+ mHandler.removeMessages(CallbackMessageHandler.MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT);
+ PlaybackState state = mSession.mPlaybackState;
+ long validActions = state == null ? 0 : state.getActions();
+ boolean isPlaying = state != null
+ && state.getState() == PlaybackState.STATE_PLAYING;
+ boolean canPlay = (validActions & (PlaybackState.ACTION_PLAY_PAUSE
+ | PlaybackState.ACTION_PLAY)) != 0;
+ boolean canPause = (validActions & (PlaybackState.ACTION_PLAY_PAUSE
+ | PlaybackState.ACTION_PAUSE)) != 0;
+ if (isPlaying && canPause) {
+ onPause();
+ } else if (!isPlaying && canPlay) {
+ onPlay();
+ }
+ }
+
+ /**
+ * Override to handle requests to prepare playback. During the preparation, a session should
+ * not hold audio focus in order to allow other sessions play seamlessly. The state of
+ * playback should be updated to {@link PlaybackState#STATE_PAUSED} after the preparation is
+ * done.
+ */
+ public void onPrepare() {
+ }
+
+ /**
+ * Override to handle requests to prepare for playing a specific mediaId that was provided
+ * by your app's {@link MediaBrowserService}. During the preparation, a session should not
+ * hold audio focus in order to allow other sessions play seamlessly. The state of playback
+ * should be updated to {@link PlaybackState#STATE_PAUSED} after the preparation is done.
+ * The playback of the prepared content should start in the implementation of
+ * {@link #onPlay}. Override {@link #onPlayFromMediaId} to handle requests for starting
+ * playback without preparation.
+ */
+ public void onPrepareFromMediaId(String mediaId, Bundle extras) {
+ }
+
+ /**
+ * Override to handle requests to prepare playback from a search query. An empty query
+ * indicates that the app may prepare any music. The implementation should attempt to make a
+ * smart choice about what to play. During the preparation, a session should not hold audio
+ * focus in order to allow other sessions play seamlessly. The state of playback should be
+ * updated to {@link PlaybackState#STATE_PAUSED} after the preparation is done. The playback
+ * of the prepared content should start in the implementation of {@link #onPlay}. Override
+ * {@link #onPlayFromSearch} to handle requests for starting playback without preparation.
+ */
+ public void onPrepareFromSearch(String query, Bundle extras) {
+ }
+
+ /**
+ * Override to handle requests to prepare a specific media item represented by a URI.
+ * During the preparation, a session should not hold audio focus in order to allow
+ * other sessions play seamlessly. The state of playback should be updated to
+ * {@link PlaybackState#STATE_PAUSED} after the preparation is done.
+ * The playback of the prepared content should start in the implementation of
+ * {@link #onPlay}. Override {@link #onPlayFromUri} to handle requests
+ * for starting playback without preparation.
+ */
+ public void onPrepareFromUri(Uri uri, Bundle extras) {
+ }
+
+ /**
+ * Override to handle requests to begin playback.
+ */
+ public void onPlay() {
+ }
+
+ /**
+ * Override to handle requests to begin playback from a search query. An
+ * empty query indicates that the app may play any music. The
+ * implementation should attempt to make a smart choice about what to
+ * play.
+ */
+ public void onPlayFromSearch(String query, Bundle extras) {
+ }
+
+ /**
+ * Override to handle requests to play a specific mediaId that was
+ * provided by your app's {@link MediaBrowserService}.
+ */
+ public void onPlayFromMediaId(String mediaId, Bundle extras) {
+ }
+
+ /**
+ * Override to handle requests to play a specific media item represented by a URI.
+ */
+ public void onPlayFromUri(Uri uri, Bundle extras) {
+ }
+
+ /**
+ * Override to handle requests to play an item with a given id from the
+ * play queue.
+ */
+ public void onSkipToQueueItem(long id) {
+ }
+
+ /**
+ * Override to handle requests to pause playback.
+ */
+ public void onPause() {
+ }
+
+ /**
+ * Override to handle requests to skip to the next media item.
+ */
+ public void onSkipToNext() {
+ }
+
+ /**
+ * Override to handle requests to skip to the previous media item.
+ */
+ public void onSkipToPrevious() {
+ }
+
+ /**
+ * Override to handle requests to fast forward.
+ */
+ public void onFastForward() {
+ }
+
+ /**
+ * Override to handle requests to rewind.
+ */
+ public void onRewind() {
+ }
+
+ /**
+ * Override to handle requests to stop playback.
+ */
+ public void onStop() {
+ }
+
+ /**
+ * Override to handle requests to seek to a specific position in ms.
+ *
+ * @param pos New position to move to, in milliseconds.
+ */
+ public void onSeekTo(long pos) {
+ }
+
+ /**
+ * Override to handle the item being rated.
+ *
+ * @param rating
+ */
+ public void onSetRating(@NonNull Rating rating) {
+ }
+
+ /**
+ * Called when a {@link MediaController} wants a {@link PlaybackState.CustomAction} to be
+ * performed.
+ *
+ * @param action The action that was originally sent in the
+ * {@link PlaybackState.CustomAction}.
+ * @param extras Optional extras specified by the {@link MediaController}.
+ */
+ public void onCustomAction(@NonNull String action, @Nullable Bundle extras) {
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public static class CallbackStub extends ISessionCallback.Stub {
+ private WeakReference<MediaSession> mMediaSession;
+
+ public CallbackStub(MediaSession session) {
+ mMediaSession = new WeakReference<>(session);
+ }
+
+ private static RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ //TODO(b/119752205): Resolve hidden API usage. 4-param constructor of RemoteUserInfo
+ /*
+ return new RemoteUserInfo(packageName, pid, uid,
+ caller != null ? caller.asBinder() : null);
+ */
+ return new RemoteUserInfo(packageName, pid, uid);
+ }
+
+ @Override
+ public void onCommand(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, String command, Bundle args, ResultReceiver cb) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchCommand(createRemoteUserInfo(packageName, pid, uid, caller),
+ command, args, cb);
+ }
+ }
+
+ @Override
+ public void onMediaButton(String packageName, int pid, int uid, Intent mediaButtonIntent,
+ int sequenceNumber, ResultReceiver cb) {
+ MediaSession session = mMediaSession.get();
+ try {
+ if (session != null) {
+ session.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid, null),
+ mediaButtonIntent);
+ }
+ } finally {
+ if (cb != null) {
+ cb.send(sequenceNumber, null);
+ }
+ }
+ }
+
+ @Override
+ public void onMediaButtonFromController(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, Intent mediaButtonIntent) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid, caller),
+ mediaButtonIntent);
+ }
+ }
+
+ @Override
+ public void onPrepare(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid, caller));
+ }
+ }
+
+ @Override
+ public void onPrepareFromMediaId(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, String mediaId,
+ Bundle extras) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPrepareFromMediaId(
+ createRemoteUserInfo(packageName, pid, uid, caller), mediaId, extras);
+ }
+ }
+
+ @Override
+ public void onPrepareFromSearch(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, String query,
+ Bundle extras) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPrepareFromSearch(
+ createRemoteUserInfo(packageName, pid, uid, caller), query, extras);
+ }
+ }
+
+ @Override
+ public void onPrepareFromUri(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, Uri uri, Bundle extras) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPrepareFromUri(createRemoteUserInfo(packageName, pid, uid, caller),
+ uri, extras);
+ }
+ }
+
+ @Override
+ public void onPlay(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPlay(createRemoteUserInfo(packageName, pid, uid, caller));
+ }
+ }
+
+ @Override
+ public void onPlayFromMediaId(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, String mediaId,
+ Bundle extras) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPlayFromMediaId(createRemoteUserInfo(packageName, pid, uid, caller),
+ mediaId, extras);
+ }
+ }
+
+ @Override
+ public void onPlayFromSearch(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, String query,
+ Bundle extras) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPlayFromSearch(createRemoteUserInfo(packageName, pid, uid, caller),
+ query, extras);
+ }
+ }
+
+ @Override
+ public void onPlayFromUri(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, Uri uri, Bundle extras) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPlayFromUri(createRemoteUserInfo(packageName, pid, uid, caller),
+ uri, extras);
+ }
+ }
+
+ @Override
+ public void onSkipToTrack(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, long id) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchSkipToItem(createRemoteUserInfo(packageName, pid, uid, caller), id);
+ }
+ }
+
+ @Override
+ public void onPause(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPause(createRemoteUserInfo(packageName, pid, uid, caller));
+ }
+ }
+
+ @Override
+ public void onStop(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchStop(createRemoteUserInfo(packageName, pid, uid, caller));
+ }
+ }
+
+ @Override
+ public void onNext(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchNext(createRemoteUserInfo(packageName, pid, uid, caller));
+ }
+ }
+
+ @Override
+ public void onPrevious(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid, caller));
+ }
+ }
+
+ @Override
+ public void onFastForward(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchFastForward(createRemoteUserInfo(packageName, pid, uid, caller));
+ }
+ }
+
+ @Override
+ public void onRewind(String packageName, int pid, int uid,
+ ISessionControllerCallback caller) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchRewind(createRemoteUserInfo(packageName, pid, uid, caller));
+ }
+ }
+
+ @Override
+ public void onSeekTo(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, long pos) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchSeekTo(createRemoteUserInfo(packageName, pid, uid, caller), pos);
+ }
+ }
+
+ @Override
+ public void onRate(String packageName, int pid, int uid, ISessionControllerCallback caller,
+ Rating rating) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchRate(createRemoteUserInfo(packageName, pid, uid, caller), rating);
+ }
+ }
+
+ @Override
+ public void onCustomAction(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, String action, Bundle args) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchCustomAction(createRemoteUserInfo(packageName, pid, uid, caller),
+ action, args);
+ }
+ }
+
+ @Override
+ public void onAdjustVolume(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, int direction) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchAdjustVolume(createRemoteUserInfo(packageName, pid, uid, caller),
+ direction);
+ }
+ }
+
+ @Override
+ public void onSetVolumeTo(String packageName, int pid, int uid,
+ ISessionControllerCallback caller, int value) {
+ MediaSession session = mMediaSession.get();
+ if (session != null) {
+ session.dispatchSetVolumeTo(createRemoteUserInfo(packageName, pid, uid, caller),
+ value);
+ }
+ }
+ }
+
+ /**
+ * A single item that is part of the play queue. It contains a description
+ * of the item and its id in the queue.
+ */
+ public static final class QueueItem implements Parcelable {
+ /**
+ * This id is reserved. No items can be explicitly assigned this id.
+ */
+ public static final int UNKNOWN_ID = -1;
+
+ private final MediaDescription mDescription;
+ @UnsupportedAppUsage
+ private final long mId;
+
+ /**
+ * Create a new {@link MediaSession.QueueItem}.
+ *
+ * @param description The {@link MediaDescription} for this item.
+ * @param id An identifier for this item. It must be unique within the
+ * play queue and cannot be {@link #UNKNOWN_ID}.
+ */
+ public QueueItem(MediaDescription description, long id) {
+ if (description == null) {
+ throw new IllegalArgumentException("Description cannot be null.");
+ }
+ if (id == UNKNOWN_ID) {
+ throw new IllegalArgumentException("Id cannot be QueueItem.UNKNOWN_ID");
+ }
+ mDescription = description;
+ mId = id;
+ }
+
+ private QueueItem(Parcel in) {
+ mDescription = MediaDescription.CREATOR.createFromParcel(in);
+ mId = in.readLong();
+ }
+
+ /**
+ * Get the description for this item.
+ */
+ public MediaDescription getDescription() {
+ return mDescription;
+ }
+
+ /**
+ * Get the queue id for this item.
+ */
+ public long getQueueId() {
+ return mId;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ mDescription.writeToParcel(dest, flags);
+ dest.writeLong(mId);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<MediaSession.QueueItem> CREATOR =
+ new Creator<MediaSession.QueueItem>() {
+
+ @Override
+ public MediaSession.QueueItem createFromParcel(Parcel p) {
+ return new MediaSession.QueueItem(p);
+ }
+
+ @Override
+ public MediaSession.QueueItem[] newArray(int size) {
+ return new MediaSession.QueueItem[size];
+ }
+ };
+
+ @Override
+ public String toString() {
+ return "MediaSession.QueueItem {" +
+ "Description=" + mDescription +
+ ", Id=" + mId + " }";
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null) {
+ return false;
+ }
+
+ if (!(o instanceof QueueItem)) {
+ return false;
+ }
+
+ final QueueItem item = (QueueItem) o;
+ if (mId != item.mId) {
+ return false;
+ }
+
+ if (!Objects.equals(mDescription, item.mDescription)) {
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ private static final class Command {
+ public final String command;
+ public final Bundle extras;
+ public final ResultReceiver stub;
+
+ public Command(String command, Bundle extras, ResultReceiver stub) {
+ this.command = command;
+ this.extras = extras;
+ this.stub = stub;
+ }
+ }
+
+ private class CallbackMessageHandler extends Handler {
+ private static final int MSG_COMMAND = 1;
+ private static final int MSG_MEDIA_BUTTON = 2;
+ private static final int MSG_PREPARE = 3;
+ private static final int MSG_PREPARE_MEDIA_ID = 4;
+ private static final int MSG_PREPARE_SEARCH = 5;
+ private static final int MSG_PREPARE_URI = 6;
+ private static final int MSG_PLAY = 7;
+ private static final int MSG_PLAY_MEDIA_ID = 8;
+ private static final int MSG_PLAY_SEARCH = 9;
+ private static final int MSG_PLAY_URI = 10;
+ private static final int MSG_SKIP_TO_ITEM = 11;
+ private static final int MSG_PAUSE = 12;
+ private static final int MSG_STOP = 13;
+ private static final int MSG_NEXT = 14;
+ private static final int MSG_PREVIOUS = 15;
+ private static final int MSG_FAST_FORWARD = 16;
+ private static final int MSG_REWIND = 17;
+ private static final int MSG_SEEK_TO = 18;
+ private static final int MSG_RATE = 19;
+ private static final int MSG_CUSTOM_ACTION = 20;
+ private static final int MSG_ADJUST_VOLUME = 21;
+ private static final int MSG_SET_VOLUME = 22;
+ private static final int MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT = 23;
+
+ private MediaSession.Callback mCallback;
+ private RemoteUserInfo mCurrentControllerInfo;
+
+ public CallbackMessageHandler(Looper looper, MediaSession.Callback callback) {
+ //TODO:(b/119539849) Uncomment below line and resolve the error.
+ //super(looper, null, true);
+ mCallback = callback;
+ mCallback.mHandler = this;
+ }
+
+ public void post(RemoteUserInfo caller, int what, Object obj, Bundle data, long delayMs) {
+ Pair<RemoteUserInfo, Object> objWithCaller = Pair.create(caller, obj);
+ Message msg = obtainMessage(what, objWithCaller);
+ msg.setData(data);
+ if (delayMs > 0) {
+ sendMessageDelayed(msg, delayMs);
+ } else {
+ sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ mCurrentControllerInfo = ((Pair<RemoteUserInfo, Object>) msg.obj).first;
+
+ VolumeProvider vp;
+ Object obj = ((Pair<RemoteUserInfo, Object>) msg.obj).second;
+
+ switch (msg.what) {
+ case MSG_COMMAND:
+ Command cmd = (Command) obj;
+ mCallback.onCommand(cmd.command, cmd.extras, cmd.stub);
+ break;
+ case MSG_MEDIA_BUTTON:
+ mCallback.onMediaButtonEvent((Intent) obj);
+ break;
+ case MSG_PREPARE:
+ mCallback.onPrepare();
+ break;
+ case MSG_PREPARE_MEDIA_ID:
+ mCallback.onPrepareFromMediaId((String) obj, msg.getData());
+ break;
+ case MSG_PREPARE_SEARCH:
+ mCallback.onPrepareFromSearch((String) obj, msg.getData());
+ break;
+ case MSG_PREPARE_URI:
+ mCallback.onPrepareFromUri((Uri) obj, msg.getData());
+ break;
+ case MSG_PLAY:
+ mCallback.onPlay();
+ break;
+ case MSG_PLAY_MEDIA_ID:
+ mCallback.onPlayFromMediaId((String) obj, msg.getData());
+ break;
+ case MSG_PLAY_SEARCH:
+ mCallback.onPlayFromSearch((String) obj, msg.getData());
+ break;
+ case MSG_PLAY_URI:
+ mCallback.onPlayFromUri((Uri) obj, msg.getData());
+ break;
+ case MSG_SKIP_TO_ITEM:
+ mCallback.onSkipToQueueItem((Long) obj);
+ break;
+ case MSG_PAUSE:
+ mCallback.onPause();
+ break;
+ case MSG_STOP:
+ mCallback.onStop();
+ break;
+ case MSG_NEXT:
+ mCallback.onSkipToNext();
+ break;
+ case MSG_PREVIOUS:
+ mCallback.onSkipToPrevious();
+ break;
+ case MSG_FAST_FORWARD:
+ mCallback.onFastForward();
+ break;
+ case MSG_REWIND:
+ mCallback.onRewind();
+ break;
+ case MSG_SEEK_TO:
+ mCallback.onSeekTo((Long) obj);
+ break;
+ case MSG_RATE:
+ mCallback.onSetRating((Rating) obj);
+ break;
+ case MSG_CUSTOM_ACTION:
+ mCallback.onCustomAction((String) obj, msg.getData());
+ break;
+ case MSG_ADJUST_VOLUME:
+ synchronized (mLock) {
+ vp = mVolumeProvider;
+ }
+ if (vp != null) {
+ vp.onAdjustVolume((int) obj);
+ }
+ break;
+ case MSG_SET_VOLUME:
+ synchronized (mLock) {
+ vp = mVolumeProvider;
+ }
+ if (vp != null) {
+ vp.onSetVolumeTo((int) obj);
+ }
+ break;
+ case MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT:
+ mCallback.handleMediaPlayPauseKeySingleTapIfPending();
+ break;
+ }
+ mCurrentControllerInfo = null;
+ }
+ }
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/ParcelableVolumeInfo.aidl b/packages/MediaComponents/apex/java/android/media/session/ParcelableVolumeInfo.aidl
new file mode 100644
index 0000000..c4250f0
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/ParcelableVolumeInfo.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media.session;
+
+parcelable ParcelableVolumeInfo;
diff --git a/packages/MediaComponents/apex/java/android/media/session/ParcelableVolumeInfo.java b/packages/MediaComponents/apex/java/android/media/session/ParcelableVolumeInfo.java
new file mode 100644
index 0000000..f59c975
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/ParcelableVolumeInfo.java
@@ -0,0 +1,80 @@
+/* Copyright 2014, The Android Open Source Project
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+package android.media.session;
+
+import android.media.AudioAttributes;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Convenience class for passing information about the audio configuration of a
+ * session. The public implementation is {@link MediaController.PlaybackInfo}.
+ *
+ * @hide
+ */
+public class ParcelableVolumeInfo implements Parcelable {
+ public int volumeType;
+ public AudioAttributes audioAttrs;
+ public int controlType;
+ public int maxVolume;
+ public int currentVolume;
+
+ public ParcelableVolumeInfo(int volumeType, AudioAttributes audioAttrs, int controlType,
+ int maxVolume,
+ int currentVolume) {
+ this.volumeType = volumeType;
+ this.audioAttrs = audioAttrs;
+ this.controlType = controlType;
+ this.maxVolume = maxVolume;
+ this.currentVolume = currentVolume;
+ }
+
+ public ParcelableVolumeInfo(Parcel from) {
+ volumeType = from.readInt();
+ controlType = from.readInt();
+ maxVolume = from.readInt();
+ currentVolume = from.readInt();
+ audioAttrs = AudioAttributes.CREATOR.createFromParcel(from);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(volumeType);
+ dest.writeInt(controlType);
+ dest.writeInt(maxVolume);
+ dest.writeInt(currentVolume);
+ audioAttrs.writeToParcel(dest, flags);
+ }
+
+
+ public static final Parcelable.Creator<ParcelableVolumeInfo> CREATOR
+ = new Parcelable.Creator<ParcelableVolumeInfo>() {
+ @Override
+ public ParcelableVolumeInfo createFromParcel(Parcel in) {
+ return new ParcelableVolumeInfo(in);
+ }
+
+ @Override
+ public ParcelableVolumeInfo[] newArray(int size) {
+ return new ParcelableVolumeInfo[size];
+ }
+ };
+}
diff --git a/packages/MediaComponents/apex/java/android/media/session/PlaybackState.aidl b/packages/MediaComponents/apex/java/android/media/session/PlaybackState.aidl
new file mode 100644
index 0000000..0876ebd
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/PlaybackState.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media.session;
+
+parcelable PlaybackState;
diff --git a/packages/MediaComponents/apex/java/android/media/session/PlaybackState.java b/packages/MediaComponents/apex/java/android/media/session/PlaybackState.java
new file mode 100644
index 0000000..ed4f9af
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/media/session/PlaybackState.java
@@ -0,0 +1,1081 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media.session;
+
+import android.annotation.DrawableRes;
+import android.annotation.IntDef;
+import android.annotation.LongDef;
+import android.annotation.Nullable;
+import android.media.RemoteControlClient;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.SystemClock;
+import android.text.TextUtils;
+import java.util.ArrayList;
+import java.util.List;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Playback state for a {@link MediaSession}. This includes a state like
+ * {@link PlaybackState#STATE_PLAYING}, the current playback position,
+ * and the current control capabilities.
+ */
+public final class PlaybackState implements Parcelable {
+ private static final String TAG = "PlaybackState";
+
+ /**
+ * @hide
+ */
+ @LongDef(flag=true, value={ACTION_STOP, ACTION_PAUSE, ACTION_PLAY, ACTION_REWIND,
+ ACTION_SKIP_TO_PREVIOUS, ACTION_SKIP_TO_NEXT, ACTION_FAST_FORWARD, ACTION_SET_RATING,
+ ACTION_SEEK_TO, ACTION_PLAY_PAUSE, ACTION_PLAY_FROM_MEDIA_ID, ACTION_PLAY_FROM_SEARCH,
+ ACTION_SKIP_TO_QUEUE_ITEM, ACTION_PLAY_FROM_URI, ACTION_PREPARE,
+ ACTION_PREPARE_FROM_MEDIA_ID, ACTION_PREPARE_FROM_SEARCH, ACTION_PREPARE_FROM_URI})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Actions {}
+
+ /**
+ * Indicates this session supports the stop command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_STOP = 1 << 0;
+
+ /**
+ * Indicates this session supports the pause command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PAUSE = 1 << 1;
+
+ /**
+ * Indicates this session supports the play command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PLAY = 1 << 2;
+
+ /**
+ * Indicates this session supports the rewind command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_REWIND = 1 << 3;
+
+ /**
+ * Indicates this session supports the previous command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_SKIP_TO_PREVIOUS = 1 << 4;
+
+ /**
+ * Indicates this session supports the next command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_SKIP_TO_NEXT = 1 << 5;
+
+ /**
+ * Indicates this session supports the fast forward command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_FAST_FORWARD = 1 << 6;
+
+ /**
+ * Indicates this session supports the set rating command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_SET_RATING = 1 << 7;
+
+ /**
+ * Indicates this session supports the seek to command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_SEEK_TO = 1 << 8;
+
+ /**
+ * Indicates this session supports the play/pause toggle command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PLAY_PAUSE = 1 << 9;
+
+ /**
+ * Indicates this session supports the play from media id command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PLAY_FROM_MEDIA_ID = 1 << 10;
+
+ /**
+ * Indicates this session supports the play from search command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PLAY_FROM_SEARCH = 1 << 11;
+
+ /**
+ * Indicates this session supports the skip to queue item command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_SKIP_TO_QUEUE_ITEM = 1 << 12;
+
+ /**
+ * Indicates this session supports the play from URI command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PLAY_FROM_URI = 1 << 13;
+
+ /**
+ * Indicates this session supports the prepare command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PREPARE = 1 << 14;
+
+ /**
+ * Indicates this session supports the prepare from media id command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PREPARE_FROM_MEDIA_ID = 1 << 15;
+
+ /**
+ * Indicates this session supports the prepare from search command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PREPARE_FROM_SEARCH = 1 << 16;
+
+ /**
+ * Indicates this session supports the prepare from URI command.
+ *
+ * @see Builder#setActions(long)
+ */
+ public static final long ACTION_PREPARE_FROM_URI = 1 << 17;
+
+ /**
+ * @hide
+ */
+ @IntDef({STATE_NONE, STATE_STOPPED, STATE_PAUSED, STATE_PLAYING, STATE_FAST_FORWARDING,
+ STATE_REWINDING, STATE_BUFFERING, STATE_ERROR, STATE_CONNECTING,
+ STATE_SKIPPING_TO_PREVIOUS, STATE_SKIPPING_TO_NEXT, STATE_SKIPPING_TO_QUEUE_ITEM})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface State {}
+
+ /**
+ * This is the default playback state and indicates that no media has been
+ * added yet, or the performer has been reset and has no content to play.
+ *
+ * @see Builder#setState(int, long, float)
+ * @see Builder#setState(int, long, float, long)
+ */
+ public final static int STATE_NONE = 0;
+
+ /**
+ * State indicating this item is currently stopped.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_STOPPED = 1;
+
+ /**
+ * State indicating this item is currently paused.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_PAUSED = 2;
+
+ /**
+ * State indicating this item is currently playing.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_PLAYING = 3;
+
+ /**
+ * State indicating this item is currently fast forwarding.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_FAST_FORWARDING = 4;
+
+ /**
+ * State indicating this item is currently rewinding.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_REWINDING = 5;
+
+ /**
+ * State indicating this item is currently buffering and will begin playing
+ * when enough data has buffered.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_BUFFERING = 6;
+
+ /**
+ * State indicating this item is currently in an error state. The error
+ * message should also be set when entering this state.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_ERROR = 7;
+
+ /**
+ * State indicating the class doing playback is currently connecting to a
+ * new destination. Depending on the implementation you may return to the previous
+ * state when the connection finishes or enter {@link #STATE_NONE}.
+ * If the connection failed {@link #STATE_ERROR} should be used.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_CONNECTING = 8;
+
+ /**
+ * State indicating the player is currently skipping to the previous item.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_SKIPPING_TO_PREVIOUS = 9;
+
+ /**
+ * State indicating the player is currently skipping to the next item.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_SKIPPING_TO_NEXT = 10;
+
+ /**
+ * State indicating the player is currently skipping to a specific item in
+ * the queue.
+ *
+ * @see Builder#setState
+ */
+ public final static int STATE_SKIPPING_TO_QUEUE_ITEM = 11;
+
+ /**
+ * Use this value for the position to indicate the position is not known.
+ */
+ public final static long PLAYBACK_POSITION_UNKNOWN = -1;
+
+ private final int mState;
+ private final long mPosition;
+ private final long mBufferedPosition;
+ private final float mSpeed;
+ private final long mActions;
+ private List<PlaybackState.CustomAction> mCustomActions;
+ private final CharSequence mErrorMessage;
+ private final long mUpdateTime;
+ private final long mActiveItemId;
+ private final Bundle mExtras;
+
+ private PlaybackState(int state, long position, long updateTime, float speed,
+ long bufferedPosition, long transportControls,
+ List<PlaybackState.CustomAction> customActions, long activeItemId,
+ CharSequence error, Bundle extras) {
+ mState = state;
+ mPosition = position;
+ mSpeed = speed;
+ mUpdateTime = updateTime;
+ mBufferedPosition = bufferedPosition;
+ mActions = transportControls;
+ mCustomActions = new ArrayList<>(customActions);
+ mActiveItemId = activeItemId;
+ mErrorMessage = error;
+ mExtras = extras;
+ }
+
+ private PlaybackState(Parcel in) {
+ mState = in.readInt();
+ mPosition = in.readLong();
+ mSpeed = in.readFloat();
+ mUpdateTime = in.readLong();
+ mBufferedPosition = in.readLong();
+ mActions = in.readLong();
+ mCustomActions = in.createTypedArrayList(CustomAction.CREATOR);
+ mActiveItemId = in.readLong();
+ mErrorMessage = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+ mExtras = in.readBundle();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder bob = new StringBuilder("PlaybackState {");
+ bob.append("state=").append(mState);
+ bob.append(", position=").append(mPosition);
+ bob.append(", buffered position=").append(mBufferedPosition);
+ bob.append(", speed=").append(mSpeed);
+ bob.append(", updated=").append(mUpdateTime);
+ bob.append(", actions=").append(mActions);
+ bob.append(", custom actions=").append(mCustomActions);
+ bob.append(", active item id=").append(mActiveItemId);
+ bob.append(", error=").append(mErrorMessage);
+ bob.append("}");
+ return bob.toString();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mState);
+ dest.writeLong(mPosition);
+ dest.writeFloat(mSpeed);
+ dest.writeLong(mUpdateTime);
+ dest.writeLong(mBufferedPosition);
+ dest.writeLong(mActions);
+ dest.writeTypedList(mCustomActions);
+ dest.writeLong(mActiveItemId);
+ TextUtils.writeToParcel(mErrorMessage, dest, 0);
+ dest.writeBundle(mExtras);
+ }
+
+ /**
+ * Get the current state of playback. One of the following:
+ * <ul>
+ * <li> {@link PlaybackState#STATE_NONE}</li>
+ * <li> {@link PlaybackState#STATE_STOPPED}</li>
+ * <li> {@link PlaybackState#STATE_PLAYING}</li>
+ * <li> {@link PlaybackState#STATE_PAUSED}</li>
+ * <li> {@link PlaybackState#STATE_FAST_FORWARDING}</li>
+ * <li> {@link PlaybackState#STATE_REWINDING}</li>
+ * <li> {@link PlaybackState#STATE_BUFFERING}</li>
+ * <li> {@link PlaybackState#STATE_ERROR}</li>
+ * <li> {@link PlaybackState#STATE_CONNECTING}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_PREVIOUS}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_NEXT}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_QUEUE_ITEM}</li>
+ * </ul>
+ */
+ @State
+ public int getState() {
+ return mState;
+ }
+
+ /**
+ * Get the current playback position in ms.
+ */
+ public long getPosition() {
+ return mPosition;
+ }
+
+ /**
+ * Get the current buffered position in ms. This is the farthest playback
+ * point that can be reached from the current position using only buffered
+ * content.
+ */
+ public long getBufferedPosition() {
+ return mBufferedPosition;
+ }
+
+ /**
+ * Get the current playback speed as a multiple of normal playback. This
+ * should be negative when rewinding. A value of 1 means normal playback and
+ * 0 means paused.
+ *
+ * @return The current speed of playback.
+ */
+ public float getPlaybackSpeed() {
+ return mSpeed;
+ }
+
+ /**
+ * Get the current actions available on this session. This should use a
+ * bitmask of the available actions.
+ * <ul>
+ * <li> {@link PlaybackState#ACTION_SKIP_TO_PREVIOUS}</li>
+ * <li> {@link PlaybackState#ACTION_REWIND}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY}</li>
+ * <li> {@link PlaybackState#ACTION_PAUSE}</li>
+ * <li> {@link PlaybackState#ACTION_STOP}</li>
+ * <li> {@link PlaybackState#ACTION_FAST_FORWARD}</li>
+ * <li> {@link PlaybackState#ACTION_SKIP_TO_NEXT}</li>
+ * <li> {@link PlaybackState#ACTION_SEEK_TO}</li>
+ * <li> {@link PlaybackState#ACTION_SET_RATING}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY_PAUSE}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY_FROM_MEDIA_ID}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY_FROM_SEARCH}</li>
+ * <li> {@link PlaybackState#ACTION_SKIP_TO_QUEUE_ITEM}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY_FROM_URI}</li>
+ * <li> {@link PlaybackState#ACTION_PREPARE}</li>
+ * <li> {@link PlaybackState#ACTION_PREPARE_FROM_MEDIA_ID}</li>
+ * <li> {@link PlaybackState#ACTION_PREPARE_FROM_SEARCH}</li>
+ * <li> {@link PlaybackState#ACTION_PREPARE_FROM_URI}</li>
+ * </ul>
+ */
+ @Actions
+ public long getActions() {
+ return mActions;
+ }
+
+ /**
+ * Get the list of custom actions.
+ */
+ public List<PlaybackState.CustomAction> getCustomActions() {
+ return mCustomActions;
+ }
+
+ /**
+ * Get a user readable error message. This should be set when the state is
+ * {@link PlaybackState#STATE_ERROR}.
+ */
+ public CharSequence getErrorMessage() {
+ return mErrorMessage;
+ }
+
+ /**
+ * Get the elapsed real time at which position was last updated. If the
+ * position has never been set this will return 0;
+ *
+ * @return The last time the position was updated.
+ */
+ public long getLastPositionUpdateTime() {
+ return mUpdateTime;
+ }
+
+ /**
+ * Get the id of the currently active item in the queue. If there is no
+ * queue or a queue is not supported by the session this will be
+ * {@link MediaSession.QueueItem#UNKNOWN_ID}.
+ *
+ * @return The id of the currently active item in the queue or
+ * {@link MediaSession.QueueItem#UNKNOWN_ID}.
+ */
+ public long getActiveQueueItemId() {
+ return mActiveItemId;
+ }
+
+ /**
+ * Get any custom extras that were set on this playback state.
+ *
+ * @return The extras for this state or null.
+ */
+ public @Nullable Bundle getExtras() {
+ return mExtras;
+ }
+
+ /**
+ * Get the {@link PlaybackState} state for the given
+ * {@link RemoteControlClient} state.
+ *
+ * @param rccState The state used by {@link RemoteControlClient}.
+ * @return The equivalent state used by {@link PlaybackState}.
+ * @hide
+ */
+ public static int getStateFromRccState(int rccState) {
+ switch (rccState) {
+ case RemoteControlClient.PLAYSTATE_BUFFERING:
+ return STATE_BUFFERING;
+ case RemoteControlClient.PLAYSTATE_ERROR:
+ return STATE_ERROR;
+ case RemoteControlClient.PLAYSTATE_FAST_FORWARDING:
+ return STATE_FAST_FORWARDING;
+ //RemoteControlClient.PLAYSTATE_NONE is hidden
+ case 0: //RemoteControlClient.PLAYSTATE_NONE:
+ return STATE_NONE;
+ case RemoteControlClient.PLAYSTATE_PAUSED:
+ return STATE_PAUSED;
+ case RemoteControlClient.PLAYSTATE_PLAYING:
+ return STATE_PLAYING;
+ case RemoteControlClient.PLAYSTATE_REWINDING:
+ return STATE_REWINDING;
+ case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS:
+ return STATE_SKIPPING_TO_PREVIOUS;
+ case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS:
+ return STATE_SKIPPING_TO_NEXT;
+ case RemoteControlClient.PLAYSTATE_STOPPED:
+ return STATE_STOPPED;
+ default:
+ return -1;
+ }
+ }
+
+ /**
+ * Get the {@link RemoteControlClient} state for the given
+ * {@link PlaybackState} state.
+ *
+ * @param state The state used by {@link PlaybackState}.
+ * @return The equivalent state used by {@link RemoteControlClient}.
+ * @hide
+ */
+ public static int getRccStateFromState(int state) {
+ switch (state) {
+ case STATE_BUFFERING:
+ return RemoteControlClient.PLAYSTATE_BUFFERING;
+ case STATE_ERROR:
+ return RemoteControlClient.PLAYSTATE_ERROR;
+ case STATE_FAST_FORWARDING:
+ return RemoteControlClient.PLAYSTATE_FAST_FORWARDING;
+ case STATE_NONE:
+ //RemoteControlClient.PLAYSTATE_NONE is hidden
+ return 0; //RemoteControlClient.PLAYSTATE_NONE;
+ case STATE_PAUSED:
+ return RemoteControlClient.PLAYSTATE_PAUSED;
+ case STATE_PLAYING:
+ return RemoteControlClient.PLAYSTATE_PLAYING;
+ case STATE_REWINDING:
+ return RemoteControlClient.PLAYSTATE_REWINDING;
+ case STATE_SKIPPING_TO_PREVIOUS:
+ return RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS;
+ case STATE_SKIPPING_TO_NEXT:
+ return RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS;
+ case STATE_STOPPED:
+ return RemoteControlClient.PLAYSTATE_STOPPED;
+ default:
+ return -1;
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public static long getActionsFromRccControlFlags(int rccFlags) {
+ long actions = 0;
+ long flag = 1;
+ while (flag <= rccFlags) {
+ if ((flag & rccFlags) != 0) {
+ actions |= getActionForRccFlag((int) flag);
+ }
+ flag = flag << 1;
+ }
+ return actions;
+ }
+
+ /**
+ * @hide
+ */
+ public static int getRccControlFlagsFromActions(long actions) {
+ int rccFlags = 0;
+ long action = 1;
+ while (action <= actions && action < Integer.MAX_VALUE) {
+ if ((action & actions) != 0) {
+ rccFlags |= getRccFlagForAction(action);
+ }
+ action = action << 1;
+ }
+ return rccFlags;
+ }
+
+ private static long getActionForRccFlag(int flag) {
+ switch (flag) {
+ case RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS:
+ return ACTION_SKIP_TO_PREVIOUS;
+ case RemoteControlClient.FLAG_KEY_MEDIA_REWIND:
+ return ACTION_REWIND;
+ case RemoteControlClient.FLAG_KEY_MEDIA_PLAY:
+ return ACTION_PLAY;
+ case RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE:
+ return ACTION_PLAY_PAUSE;
+ case RemoteControlClient.FLAG_KEY_MEDIA_PAUSE:
+ return ACTION_PAUSE;
+ case RemoteControlClient.FLAG_KEY_MEDIA_STOP:
+ return ACTION_STOP;
+ case RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD:
+ return ACTION_FAST_FORWARD;
+ case RemoteControlClient.FLAG_KEY_MEDIA_NEXT:
+ return ACTION_SKIP_TO_NEXT;
+ case RemoteControlClient.FLAG_KEY_MEDIA_POSITION_UPDATE:
+ return ACTION_SEEK_TO;
+ case RemoteControlClient.FLAG_KEY_MEDIA_RATING:
+ return ACTION_SET_RATING;
+ }
+ return 0;
+ }
+
+ private static int getRccFlagForAction(long action) {
+ // We only care about the lower set of actions that can map to rcc
+ // flags.
+ int testAction = action < Integer.MAX_VALUE ? (int) action : 0;
+ switch (testAction) {
+ case (int) ACTION_SKIP_TO_PREVIOUS:
+ return RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS;
+ case (int) ACTION_REWIND:
+ return RemoteControlClient.FLAG_KEY_MEDIA_REWIND;
+ case (int) ACTION_PLAY:
+ return RemoteControlClient.FLAG_KEY_MEDIA_PLAY;
+ case (int) ACTION_PLAY_PAUSE:
+ return RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE;
+ case (int) ACTION_PAUSE:
+ return RemoteControlClient.FLAG_KEY_MEDIA_PAUSE;
+ case (int) ACTION_STOP:
+ return RemoteControlClient.FLAG_KEY_MEDIA_STOP;
+ case (int) ACTION_FAST_FORWARD:
+ return RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD;
+ case (int) ACTION_SKIP_TO_NEXT:
+ return RemoteControlClient.FLAG_KEY_MEDIA_NEXT;
+ case (int) ACTION_SEEK_TO:
+ return RemoteControlClient.FLAG_KEY_MEDIA_POSITION_UPDATE;
+ case (int) ACTION_SET_RATING:
+ return RemoteControlClient.FLAG_KEY_MEDIA_RATING;
+ }
+ return 0;
+ }
+
+ public static final Parcelable.Creator<PlaybackState> CREATOR =
+ new Parcelable.Creator<PlaybackState>() {
+ @Override
+ public PlaybackState createFromParcel(Parcel in) {
+ return new PlaybackState(in);
+ }
+
+ @Override
+ public PlaybackState[] newArray(int size) {
+ return new PlaybackState[size];
+ }
+ };
+
+ /**
+ * {@link PlaybackState.CustomAction CustomActions} can be used to extend the capabilities of
+ * the standard transport controls by exposing app specific actions to
+ * {@link MediaController MediaControllers}.
+ */
+ public static final class CustomAction implements Parcelable {
+ private final String mAction;
+ private final CharSequence mName;
+ private final int mIcon;
+ private final Bundle mExtras;
+
+ /**
+ * Use {@link PlaybackState.CustomAction.Builder#build()}.
+ */
+ private CustomAction(String action, CharSequence name, int icon, Bundle extras) {
+ mAction = action;
+ mName = name;
+ mIcon = icon;
+ mExtras = extras;
+ }
+
+ private CustomAction(Parcel in) {
+ mAction = in.readString();
+ mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+ mIcon = in.readInt();
+ mExtras = in.readBundle();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mAction);
+ TextUtils.writeToParcel(mName, dest, flags);
+ dest.writeInt(mIcon);
+ dest.writeBundle(mExtras);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Parcelable.Creator<PlaybackState.CustomAction> CREATOR
+ = new Parcelable.Creator<PlaybackState.CustomAction>() {
+
+ @Override
+ public PlaybackState.CustomAction createFromParcel(Parcel p) {
+ return new PlaybackState.CustomAction(p);
+ }
+
+ @Override
+ public PlaybackState.CustomAction[] newArray(int size) {
+ return new PlaybackState.CustomAction[size];
+ }
+ };
+
+ /**
+ * Returns the action of the {@link CustomAction}.
+ *
+ * @return The action of the {@link CustomAction}.
+ */
+ public String getAction() {
+ return mAction;
+ }
+
+ /**
+ * Returns the display name of this action. e.g. "Favorite"
+ *
+ * @return The display name of this {@link CustomAction}.
+ */
+ public CharSequence getName() {
+ return mName;
+ }
+
+ /**
+ * Returns the resource id of the icon in the {@link MediaSession MediaSession's} package.
+ *
+ * @return The resource id of the icon in the {@link MediaSession MediaSession's} package.
+ */
+ public int getIcon() {
+ return mIcon;
+ }
+
+ /**
+ * Returns extras which provide additional application-specific information about the
+ * action, or null if none. These arguments are meant to be consumed by a
+ * {@link MediaController} if it knows how to handle them.
+ *
+ * @return Optional arguments for the {@link CustomAction}.
+ */
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public String toString() {
+ return "Action:" +
+ "mName='" + mName +
+ ", mIcon=" + mIcon +
+ ", mExtras=" + mExtras;
+ }
+
+ /**
+ * Builder for {@link CustomAction} objects.
+ */
+ public static final class Builder {
+ private final String mAction;
+ private final CharSequence mName;
+ private final int mIcon;
+ private Bundle mExtras;
+
+ /**
+ * Creates a {@link CustomAction} builder with the id, name, and icon set.
+ *
+ * @param action The action of the {@link CustomAction}.
+ * @param name The display name of the {@link CustomAction}. This name will be displayed
+ * along side the action if the UI supports it.
+ * @param icon The icon resource id of the {@link CustomAction}. This resource id
+ * must be in the same package as the {@link MediaSession}. It will be
+ * displayed with the custom action if the UI supports it.
+ */
+ public Builder(String action, CharSequence name, @DrawableRes int icon) {
+ if (TextUtils.isEmpty(action)) {
+ throw new IllegalArgumentException(
+ "You must specify an action to build a CustomAction.");
+ }
+ if (TextUtils.isEmpty(name)) {
+ throw new IllegalArgumentException(
+ "You must specify a name to build a CustomAction.");
+ }
+ if (icon == 0) {
+ throw new IllegalArgumentException(
+ "You must specify an icon resource id to build a CustomAction.");
+ }
+ mAction = action;
+ mName = name;
+ mIcon = icon;
+ }
+
+ /**
+ * Set optional extras for the {@link CustomAction}. These extras are meant to be
+ * consumed by a {@link MediaController} if it knows how to handle them.
+ * Keys should be fully qualified (e.g. "com.example.MY_ARG") to avoid collisions.
+ *
+ * @param extras Optional extras for the {@link CustomAction}.
+ * @return this.
+ */
+ public Builder setExtras(Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /**
+ * Build and return the {@link CustomAction} instance with the specified values.
+ *
+ * @return A new {@link CustomAction} instance.
+ */
+ public CustomAction build() {
+ return new CustomAction(mAction, mName, mIcon, mExtras);
+ }
+ }
+ }
+
+ /**
+ * Builder for {@link PlaybackState} objects.
+ */
+ public static final class Builder {
+ private final List<PlaybackState.CustomAction> mCustomActions = new ArrayList<>();
+
+ private int mState;
+ private long mPosition;
+ private long mBufferedPosition;
+ private float mSpeed;
+ private long mActions;
+ private CharSequence mErrorMessage;
+ private long mUpdateTime;
+ private long mActiveItemId = MediaSession.QueueItem.UNKNOWN_ID;
+ private Bundle mExtras;
+
+ /**
+ * Creates an initially empty state builder.
+ */
+ public Builder() {
+ }
+
+ /**
+ * Creates a builder with the same initial values as those in the from
+ * state.
+ *
+ * @param from The state to use for initializing the builder.
+ */
+ public Builder(PlaybackState from) {
+ if (from == null) {
+ return;
+ }
+ mState = from.mState;
+ mPosition = from.mPosition;
+ mBufferedPosition = from.mBufferedPosition;
+ mSpeed = from.mSpeed;
+ mActions = from.mActions;
+ if (from.mCustomActions != null) {
+ mCustomActions.addAll(from.mCustomActions);
+ }
+ mErrorMessage = from.mErrorMessage;
+ mUpdateTime = from.mUpdateTime;
+ mActiveItemId = from.mActiveItemId;
+ mExtras = from.mExtras;
+ }
+
+ /**
+ * Set the current state of playback.
+ * <p>
+ * The position must be in ms and indicates the current playback
+ * position within the item. If the position is unknown use
+ * {@link #PLAYBACK_POSITION_UNKNOWN}. When not using an unknown
+ * position the time at which the position was updated must be provided.
+ * It is okay to use {@link SystemClock#elapsedRealtime()} if the
+ * current position was just retrieved.
+ * <p>
+ * The speed is a multiple of normal playback and should be 0 when
+ * paused and negative when rewinding. Normal playback speed is 1.0.
+ * <p>
+ * The state must be one of the following:
+ * <ul>
+ * <li> {@link PlaybackState#STATE_NONE}</li>
+ * <li> {@link PlaybackState#STATE_STOPPED}</li>
+ * <li> {@link PlaybackState#STATE_PLAYING}</li>
+ * <li> {@link PlaybackState#STATE_PAUSED}</li>
+ * <li> {@link PlaybackState#STATE_FAST_FORWARDING}</li>
+ * <li> {@link PlaybackState#STATE_REWINDING}</li>
+ * <li> {@link PlaybackState#STATE_BUFFERING}</li>
+ * <li> {@link PlaybackState#STATE_ERROR}</li>
+ * <li> {@link PlaybackState#STATE_CONNECTING}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_PREVIOUS}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_NEXT}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_QUEUE_ITEM}</li>
+ * </ul>
+ *
+ * @param state The current state of playback.
+ * @param position The position in the current item in ms.
+ * @param playbackSpeed The current speed of playback as a multiple of
+ * normal playback.
+ * @param updateTime The time in the {@link SystemClock#elapsedRealtime}
+ * timebase that the position was updated at.
+ * @return this
+ */
+ public Builder setState(@State int state, long position, float playbackSpeed,
+ long updateTime) {
+ mState = state;
+ mPosition = position;
+ mUpdateTime = updateTime;
+ mSpeed = playbackSpeed;
+ return this;
+ }
+
+ /**
+ * Set the current state of playback.
+ * <p>
+ * The position must be in ms and indicates the current playback
+ * position within the item. If the position is unknown use
+ * {@link #PLAYBACK_POSITION_UNKNOWN}. The update time will be set to
+ * the current {@link SystemClock#elapsedRealtime()}.
+ * <p>
+ * The speed is a multiple of normal playback and should be 0 when
+ * paused and negative when rewinding. Normal playback speed is 1.0.
+ * <p>
+ * The state must be one of the following:
+ * <ul>
+ * <li> {@link PlaybackState#STATE_NONE}</li>
+ * <li> {@link PlaybackState#STATE_STOPPED}</li>
+ * <li> {@link PlaybackState#STATE_PLAYING}</li>
+ * <li> {@link PlaybackState#STATE_PAUSED}</li>
+ * <li> {@link PlaybackState#STATE_FAST_FORWARDING}</li>
+ * <li> {@link PlaybackState#STATE_REWINDING}</li>
+ * <li> {@link PlaybackState#STATE_BUFFERING}</li>
+ * <li> {@link PlaybackState#STATE_ERROR}</li>
+ * <li> {@link PlaybackState#STATE_CONNECTING}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_PREVIOUS}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_NEXT}</li>
+ * <li> {@link PlaybackState#STATE_SKIPPING_TO_QUEUE_ITEM}</li>
+ * </ul>
+ *
+ * @param state The current state of playback.
+ * @param position The position in the current item in ms.
+ * @param playbackSpeed The current speed of playback as a multiple of
+ * normal playback.
+ * @return this
+ */
+ public Builder setState(@State int state, long position, float playbackSpeed) {
+ return setState(state, position, playbackSpeed, SystemClock.elapsedRealtime());
+ }
+
+ /**
+ * Set the current actions available on this session. This should use a
+ * bitmask of possible actions.
+ * <ul>
+ * <li> {@link PlaybackState#ACTION_SKIP_TO_PREVIOUS}</li>
+ * <li> {@link PlaybackState#ACTION_REWIND}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY}</li>
+ * <li> {@link PlaybackState#ACTION_PAUSE}</li>
+ * <li> {@link PlaybackState#ACTION_STOP}</li>
+ * <li> {@link PlaybackState#ACTION_FAST_FORWARD}</li>
+ * <li> {@link PlaybackState#ACTION_SKIP_TO_NEXT}</li>
+ * <li> {@link PlaybackState#ACTION_SEEK_TO}</li>
+ * <li> {@link PlaybackState#ACTION_SET_RATING}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY_PAUSE}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY_FROM_MEDIA_ID}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY_FROM_SEARCH}</li>
+ * <li> {@link PlaybackState#ACTION_SKIP_TO_QUEUE_ITEM}</li>
+ * <li> {@link PlaybackState#ACTION_PLAY_FROM_URI}</li>
+ * <li> {@link PlaybackState#ACTION_PREPARE}</li>
+ * <li> {@link PlaybackState#ACTION_PREPARE_FROM_MEDIA_ID}</li>
+ * <li> {@link PlaybackState#ACTION_PREPARE_FROM_SEARCH}</li>
+ * <li> {@link PlaybackState#ACTION_PREPARE_FROM_URI}</li>
+ * </ul>
+ *
+ * @param actions The set of actions allowed.
+ * @return this
+ */
+ public Builder setActions(@Actions long actions) {
+ mActions = actions;
+ return this;
+ }
+
+ /**
+ * Add a custom action to the playback state. Actions can be used to
+ * expose additional functionality to {@link MediaController
+ * MediaControllers} beyond what is offered by the standard transport
+ * controls.
+ * <p>
+ * e.g. start a radio station based on the current item or skip ahead by
+ * 30 seconds.
+ *
+ * @param action An identifier for this action. It can be sent back to
+ * the {@link MediaSession} through
+ * {@link MediaController.TransportControls#sendCustomAction(String, Bundle)}.
+ * @param name The display name for the action. If text is shown with
+ * the action or used for accessibility, this is what should
+ * be used.
+ * @param icon The resource action of the icon that should be displayed
+ * for the action. The resource should be in the package of
+ * the {@link MediaSession}.
+ * @return this
+ */
+ public Builder addCustomAction(String action, String name, int icon) {
+ return addCustomAction(new PlaybackState.CustomAction(action, name, icon, null));
+ }
+
+ /**
+ * Add a custom action to the playback state. Actions can be used to expose additional
+ * functionality to {@link MediaController MediaControllers} beyond what is offered by the
+ * standard transport controls.
+ * <p>
+ * An example of an action would be to start a radio station based on the current item
+ * or to skip ahead by 30 seconds.
+ *
+ * @param customAction The custom action to add to the {@link PlaybackState}.
+ * @return this
+ */
+ public Builder addCustomAction(PlaybackState.CustomAction customAction) {
+ if (customAction == null) {
+ throw new IllegalArgumentException(
+ "You may not add a null CustomAction to PlaybackState.");
+ }
+ mCustomActions.add(customAction);
+ return this;
+ }
+
+ /**
+ * Set the current buffered position in ms. This is the farthest
+ * playback point that can be reached from the current position using
+ * only buffered content.
+ *
+ * @param bufferedPosition The position in ms that playback is buffered
+ * to.
+ * @return this
+ */
+ public Builder setBufferedPosition(long bufferedPosition) {
+ mBufferedPosition = bufferedPosition;
+ return this;
+ }
+
+ /**
+ * Set the active item in the play queue by specifying its id. The
+ * default value is {@link MediaSession.QueueItem#UNKNOWN_ID}
+ *
+ * @param id The id of the active item.
+ * @return this
+ */
+ public Builder setActiveQueueItemId(long id) {
+ mActiveItemId = id;
+ return this;
+ }
+
+ /**
+ * Set a user readable error message. This should be set when the state
+ * is {@link PlaybackState#STATE_ERROR}.
+ *
+ * @param error The error message for display to the user.
+ * @return this
+ */
+ public Builder setErrorMessage(CharSequence error) {
+ mErrorMessage = error;
+ return this;
+ }
+
+ /**
+ * Set any custom extras to be included with the playback state.
+ *
+ * @param extras The extras to include.
+ * @return this
+ */
+ public Builder setExtras(Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /**
+ * Build and return the {@link PlaybackState} instance with these
+ * values.
+ *
+ * @return A new state instance.
+ */
+ public PlaybackState build() {
+ return new PlaybackState(mState, mPosition, mUpdateTime, mSpeed, mBufferedPosition,
+ mActions, mCustomActions, mActiveItemId, mErrorMessage, mExtras);
+ }
+ }
+}
diff --git a/packages/MediaComponents/apex/java/android/service/media/IMediaBrowserService.aidl b/packages/MediaComponents/apex/java/android/service/media/IMediaBrowserService.aidl
new file mode 100644
index 0000000..84f41f6
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/service/media/IMediaBrowserService.aidl
@@ -0,0 +1,27 @@
+// Copyright 2014 Google Inc. All Rights Reserved.
+
+package android.service.media;
+
+import android.content.res.Configuration;
+import android.service.media.IMediaBrowserServiceCallbacks;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.ResultReceiver;
+
+/**
+ * Media API allows clients to browse through hierarchy of a user’s media collection,
+ * playback a specific media entry and interact with the now playing queue.
+ * @hide
+ */
+oneway interface IMediaBrowserService {
+ void connect(String pkg, in Bundle rootHints, IMediaBrowserServiceCallbacks callbacks);
+ void disconnect(IMediaBrowserServiceCallbacks callbacks);
+
+ void addSubscriptionDeprecated(String uri, IMediaBrowserServiceCallbacks callbacks);
+ void removeSubscriptionDeprecated(String uri, IMediaBrowserServiceCallbacks callbacks);
+
+ void getMediaItem(String uri, in ResultReceiver cb, IMediaBrowserServiceCallbacks callbacks);
+ void addSubscription(String uri, in IBinder token, in Bundle options,
+ IMediaBrowserServiceCallbacks callbacks);
+ void removeSubscription(String uri, in IBinder token, IMediaBrowserServiceCallbacks callbacks);
+}
diff --git a/packages/MediaComponents/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl b/packages/MediaComponents/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl
new file mode 100644
index 0000000..bcc2826
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl
@@ -0,0 +1,28 @@
+// Copyright 2014 Google Inc. All Rights Reserved.
+
+package android.service.media;
+
+//import android.content.pm.ParceledListSlice;
+import android.graphics.Bitmap;
+import android.media.session.MediaSession;
+import android.os.Bundle;
+
+/**
+ * Media API allows clients to browse through hierarchy of a user’s media collection,
+ * playback a specific media entry and interact with the now playing queue.
+ * @hide
+ */
+oneway interface IMediaBrowserServiceCallbacks {
+ /**
+ * Invoked when the connected has been established.
+ * @param root The root media id for browsing.
+ * @param session The {@link MediaSession.Token media session token} that can be used to control
+ * the playback of the media app.
+ * @param extra Extras returned by the media service.
+ */
+ void onConnect(String root, in MediaSession.Token session, in Bundle extras);
+ void onConnectFailed();
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ //void onLoadChildren(String mediaId, in ParceledListSlice list);
+ //void onLoadChildrenWithOptions(String mediaId, in ParceledListSlice list, in Bundle options);
+}
diff --git a/packages/MediaComponents/apex/java/android/service/media/MediaBrowserService.java b/packages/MediaComponents/apex/java/android/service/media/MediaBrowserService.java
new file mode 100644
index 0000000..2f2fbaf
--- /dev/null
+++ b/packages/MediaComponents/apex/java/android/service/media/MediaBrowserService.java
@@ -0,0 +1,864 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.media;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.UnsupportedAppUsage;
+import android.app.Service;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+//import android.content.pm.ParceledListSlice;
+import android.media.browse.MediaBrowser;
+import android.media.browse.MediaBrowserUtils;
+import android.media.session.MediaSession;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.media.session.MediaSessionManager;
+import android.media.session.MediaSessionManager.RemoteUserInfo;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.service.media.IMediaBrowserService;
+import android.service.media.IMediaBrowserServiceCallbacks;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.util.Pair;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Base class for media browser services.
+ * <p>
+ * Media browser services enable applications to browse media content provided by an application
+ * and ask the application to start playing it. They may also be used to control content that
+ * is already playing by way of a {@link MediaSession}.
+ * </p>
+ *
+ * To extend this class, you must declare the service in your manifest file with
+ * an intent filter with the {@link #SERVICE_INTERFACE} action.
+ *
+ * For example:
+ * </p><pre>
+ * <service android:name=".MyMediaBrowserService"
+ * android:label="@string/service_name" >
+ * <intent-filter>
+ * <action android:name="android.media.browse.MediaBrowserService" />
+ * </intent-filter>
+ * </service>
+ * </pre>
+ *
+ */
+public abstract class MediaBrowserService extends Service {
+ private static final String TAG = "MediaBrowserService";
+ private static final boolean DBG = false;
+
+ /**
+ * The {@link Intent} that must be declared as handled by the service.
+ */
+ @SdkConstant(SdkConstantType.SERVICE_ACTION)
+ public static final String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+
+ /**
+ * A key for passing the MediaItem to the ResultReceiver in getItem.
+ * @hide
+ */
+ @UnsupportedAppUsage
+ public static final String KEY_MEDIA_ITEM = "media_item";
+
+ private static final int RESULT_FLAG_OPTION_NOT_HANDLED = 1 << 0;
+ private static final int RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED = 1 << 1;
+
+ private static final int RESULT_ERROR = -1;
+ private static final int RESULT_OK = 0;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag=true, value = { RESULT_FLAG_OPTION_NOT_HANDLED,
+ RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED })
+ private @interface ResultFlags { }
+
+ private final ArrayMap<IBinder, ConnectionRecord> mConnections = new ArrayMap<>();
+ private ConnectionRecord mCurConnection;
+ private final Handler mHandler = new Handler();
+ private ServiceBinder mBinder;
+ MediaSession.Token mSession;
+
+ /**
+ * All the info about a connection.
+ */
+ private class ConnectionRecord implements IBinder.DeathRecipient {
+ String pkg;
+ int uid;
+ int pid;
+ Bundle rootHints;
+ IMediaBrowserServiceCallbacks callbacks;
+ BrowserRoot root;
+ HashMap<String, List<Pair<IBinder, Bundle>>> subscriptions = new HashMap<>();
+
+ @Override
+ public void binderDied() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mConnections.remove(callbacks.asBinder());
+ }
+ });
+ }
+ }
+
+ /**
+ * Completion handler for asynchronous callback methods in {@link MediaBrowserService}.
+ * <p>
+ * Each of the methods that takes one of these to send the result must call
+ * {@link #sendResult} to respond to the caller with the given results. If those
+ * functions return without calling {@link #sendResult}, they must instead call
+ * {@link #detach} before returning, and then may call {@link #sendResult} when
+ * they are done. If more than one of those methods is called, an exception will
+ * be thrown.
+ *
+ * @see #onLoadChildren
+ * @see #onLoadItem
+ */
+ public class Result<T> {
+ private Object mDebug;
+ private boolean mDetachCalled;
+ private boolean mSendResultCalled;
+ @UnsupportedAppUsage
+ private int mFlags;
+
+ Result(Object debug) {
+ mDebug = debug;
+ }
+
+ /**
+ * Send the result back to the caller.
+ */
+ public void sendResult(T result) {
+ if (mSendResultCalled) {
+ throw new IllegalStateException("sendResult() called twice for: " + mDebug);
+ }
+ mSendResultCalled = true;
+ onResultSent(result, mFlags);
+ }
+
+ /**
+ * Detach this message from the current thread and allow the {@link #sendResult}
+ * call to happen later.
+ */
+ public void detach() {
+ if (mDetachCalled) {
+ throw new IllegalStateException("detach() called when detach() had already"
+ + " been called for: " + mDebug);
+ }
+ if (mSendResultCalled) {
+ throw new IllegalStateException("detach() called when sendResult() had already"
+ + " been called for: " + mDebug);
+ }
+ mDetachCalled = true;
+ }
+
+ boolean isDone() {
+ return mDetachCalled || mSendResultCalled;
+ }
+
+ void setFlags(@ResultFlags int flags) {
+ mFlags = flags;
+ }
+
+ /**
+ * Called when the result is sent, after assertions about not being called twice
+ * have happened.
+ */
+ void onResultSent(T result, @ResultFlags int flags) {
+ }
+ }
+
+ private class ServiceBinder extends IMediaBrowserService.Stub {
+ @Override
+ public void connect(final String pkg, final Bundle rootHints,
+ final IMediaBrowserServiceCallbacks callbacks) {
+
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ if (!isValidPackage(pkg, uid)) {
+ throw new IllegalArgumentException("Package/uid mismatch: uid=" + uid
+ + " package=" + pkg);
+ }
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ final IBinder b = callbacks.asBinder();
+
+ // Clear out the old subscriptions. We are getting new ones.
+ mConnections.remove(b);
+
+ final ConnectionRecord connection = new ConnectionRecord();
+ connection.pkg = pkg;
+ connection.pid = pid;
+ connection.uid = uid;
+ connection.rootHints = rootHints;
+ connection.callbacks = callbacks;
+
+ mCurConnection = connection;
+ connection.root = MediaBrowserService.this.onGetRoot(pkg, uid, rootHints);
+ mCurConnection = null;
+
+ // If they didn't return something, don't allow this client.
+ if (connection.root == null) {
+ Log.i(TAG, "No root for client " + pkg + " from service "
+ + getClass().getName());
+ try {
+ callbacks.onConnectFailed();
+ } catch (RemoteException ex) {
+ Log.w(TAG, "Calling onConnectFailed() failed. Ignoring. "
+ + "pkg=" + pkg);
+ }
+ } else {
+ try {
+ mConnections.put(b, connection);
+ b.linkToDeath(connection, 0);
+ if (mSession != null) {
+ callbacks.onConnect(connection.root.getRootId(),
+ mSession, connection.root.getExtras());
+ }
+ } catch (RemoteException ex) {
+ Log.w(TAG, "Calling onConnect() failed. Dropping client. "
+ + "pkg=" + pkg);
+ mConnections.remove(b);
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ public void disconnect(final IMediaBrowserServiceCallbacks callbacks) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ final IBinder b = callbacks.asBinder();
+
+ // Clear out the old subscriptions. We are getting new ones.
+ final ConnectionRecord old = mConnections.remove(b);
+ if (old != null) {
+ // TODO
+ old.callbacks.asBinder().unlinkToDeath(old, 0);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void addSubscriptionDeprecated(String id, IMediaBrowserServiceCallbacks callbacks) {
+ // do-nothing
+ }
+
+ @Override
+ public void addSubscription(final String id, final IBinder token, final Bundle options,
+ final IMediaBrowserServiceCallbacks callbacks) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ final IBinder b = callbacks.asBinder();
+
+ // Get the record for the connection
+ final ConnectionRecord connection = mConnections.get(b);
+ if (connection == null) {
+ Log.w(TAG, "addSubscription for callback that isn't registered id="
+ + id);
+ return;
+ }
+
+ MediaBrowserService.this.addSubscription(id, connection, token, options);
+ }
+ });
+ }
+
+ @Override
+ public void removeSubscriptionDeprecated(String id, IMediaBrowserServiceCallbacks callbacks) {
+ // do-nothing
+ }
+
+ @Override
+ public void removeSubscription(final String id, final IBinder token,
+ final IMediaBrowserServiceCallbacks callbacks) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ final IBinder b = callbacks.asBinder();
+
+ ConnectionRecord connection = mConnections.get(b);
+ if (connection == null) {
+ Log.w(TAG, "removeSubscription for callback that isn't registered id="
+ + id);
+ return;
+ }
+ if (!MediaBrowserService.this.removeSubscription(id, connection, token)) {
+ Log.w(TAG, "removeSubscription called for " + id
+ + " which is not subscribed");
+ }
+ }
+ });
+ }
+
+ @Override
+ public void getMediaItem(final String mediaId, final ResultReceiver receiver,
+ final IMediaBrowserServiceCallbacks callbacks) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ final IBinder b = callbacks.asBinder();
+ ConnectionRecord connection = mConnections.get(b);
+ if (connection == null) {
+ Log.w(TAG, "getMediaItem for callback that isn't registered id=" + mediaId);
+ return;
+ }
+ performLoadItem(mediaId, connection, receiver);
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mBinder = new ServiceBinder();
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ if (SERVICE_INTERFACE.equals(intent.getAction())) {
+ return mBinder;
+ }
+ return null;
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ }
+
+ /**
+ * Called to get the root information for browsing by a particular client.
+ * <p>
+ * The implementation should verify that the client package has permission
+ * to access browse media information before returning the root id; it
+ * should return null if the client is not allowed to access this
+ * information.
+ * </p>
+ *
+ * @param clientPackageName The package name of the application which is
+ * requesting access to browse media.
+ * @param clientUid The uid of the application which is requesting access to
+ * browse media.
+ * @param rootHints An optional bundle of service-specific arguments to send
+ * to the media browser service when connecting and retrieving the
+ * root id for browsing, or null if none. The contents of this
+ * bundle may affect the information returned when browsing.
+ * @return The {@link BrowserRoot} for accessing this app's content or null.
+ * @see BrowserRoot#EXTRA_RECENT
+ * @see BrowserRoot#EXTRA_OFFLINE
+ * @see BrowserRoot#EXTRA_SUGGESTED
+ */
+ public abstract @Nullable BrowserRoot onGetRoot(@NonNull String clientPackageName,
+ int clientUid, @Nullable Bundle rootHints);
+
+ /**
+ * Called to get information about the children of a media item.
+ * <p>
+ * Implementations must call {@link Result#sendResult result.sendResult}
+ * with the list of children. If loading the children will be an expensive
+ * operation that should be performed on another thread,
+ * {@link Result#detach result.detach} may be called before returning from
+ * this function, and then {@link Result#sendResult result.sendResult}
+ * called when the loading is complete.
+ * </p><p>
+ * In case the media item does not have any children, call {@link Result#sendResult}
+ * with an empty list. When the given {@code parentId} is invalid, implementations must
+ * call {@link Result#sendResult result.sendResult} with {@code null}, which will invoke
+ * {@link MediaBrowser.SubscriptionCallback#onError}.
+ * </p>
+ *
+ * @param parentId The id of the parent media item whose children are to be
+ * queried.
+ * @param result The Result to send the list of children to.
+ */
+ public abstract void onLoadChildren(@NonNull String parentId,
+ @NonNull Result<List<MediaBrowser.MediaItem>> result);
+
+ /**
+ * Called to get information about the children of a media item.
+ * <p>
+ * Implementations must call {@link Result#sendResult result.sendResult}
+ * with the list of children. If loading the children will be an expensive
+ * operation that should be performed on another thread,
+ * {@link Result#detach result.detach} may be called before returning from
+ * this function, and then {@link Result#sendResult result.sendResult}
+ * called when the loading is complete.
+ * </p><p>
+ * In case the media item does not have any children, call {@link Result#sendResult}
+ * with an empty list. When the given {@code parentId} is invalid, implementations must
+ * call {@link Result#sendResult result.sendResult} with {@code null}, which will invoke
+ * {@link MediaBrowser.SubscriptionCallback#onError}.
+ * </p>
+ *
+ * @param parentId The id of the parent media item whose children are to be
+ * queried.
+ * @param result The Result to send the list of children to.
+ * @param options The bundle of service-specific arguments sent from the media
+ * browser. The information returned through the result should be
+ * affected by the contents of this bundle.
+ */
+ public void onLoadChildren(@NonNull String parentId,
+ @NonNull Result<List<MediaBrowser.MediaItem>> result, @NonNull Bundle options) {
+ // To support backward compatibility, when the implementation of MediaBrowserService doesn't
+ // override onLoadChildren() with options, onLoadChildren() without options will be used
+ // instead, and the options will be applied in the implementation of result.onResultSent().
+ result.setFlags(RESULT_FLAG_OPTION_NOT_HANDLED);
+ onLoadChildren(parentId, result);
+ }
+
+ /**
+ * Called to get information about a specific media item.
+ * <p>
+ * Implementations must call {@link Result#sendResult result.sendResult}. If
+ * loading the item will be an expensive operation {@link Result#detach
+ * result.detach} may be called before returning from this function, and
+ * then {@link Result#sendResult result.sendResult} called when the item has
+ * been loaded.
+ * </p><p>
+ * When the given {@code itemId} is invalid, implementations must call
+ * {@link Result#sendResult result.sendResult} with {@code null}.
+ * </p><p>
+ * The default implementation will invoke {@link MediaBrowser.ItemCallback#onError}.
+ * </p>
+ *
+ * @param itemId The id for the specific
+ * {@link android.media.browse.MediaBrowser.MediaItem}.
+ * @param result The Result to send the item to.
+ */
+ public void onLoadItem(String itemId, Result<MediaBrowser.MediaItem> result) {
+ result.setFlags(RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED);
+ result.sendResult(null);
+ }
+
+ /**
+ * Call to set the media session.
+ * <p>
+ * This should be called as soon as possible during the service's startup.
+ * It may only be called once.
+ *
+ * @param token The token for the service's {@link MediaSession}.
+ */
+ public void setSessionToken(final MediaSession.Token token) {
+ if (token == null) {
+ throw new IllegalArgumentException("Session token may not be null.");
+ }
+ if (mSession != null) {
+ throw new IllegalStateException("The session token has already been set.");
+ }
+ mSession = token;
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ Iterator<ConnectionRecord> iter = mConnections.values().iterator();
+ while (iter.hasNext()){
+ ConnectionRecord connection = iter.next();
+ try {
+ connection.callbacks.onConnect(connection.root.getRootId(), token,
+ connection.root.getExtras());
+ } catch (RemoteException e) {
+ Log.w(TAG, "Connection for " + connection.pkg + " is no longer valid.");
+ iter.remove();
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Gets the session token, or null if it has not yet been created
+ * or if it has been destroyed.
+ */
+ public @Nullable MediaSession.Token getSessionToken() {
+ return mSession;
+ }
+
+ /**
+ * Gets the root hints sent from the currently connected {@link MediaBrowser}.
+ * The root hints are service-specific arguments included in an optional bundle sent to the
+ * media browser service when connecting and retrieving the root id for browsing, or null if
+ * none. The contents of this bundle may affect the information returned when browsing.
+ *
+ * @throws IllegalStateException If this method is called outside of {@link #onGetRoot} or
+ * {@link #onLoadChildren} or {@link #onLoadItem}.
+ * @see MediaBrowserService.BrowserRoot#EXTRA_RECENT
+ * @see MediaBrowserService.BrowserRoot#EXTRA_OFFLINE
+ * @see MediaBrowserService.BrowserRoot#EXTRA_SUGGESTED
+ */
+ public final Bundle getBrowserRootHints() {
+ if (mCurConnection == null) {
+ throw new IllegalStateException("This should be called inside of onGetRoot or"
+ + " onLoadChildren or onLoadItem methods");
+ }
+ return mCurConnection.rootHints == null ? null : new Bundle(mCurConnection.rootHints);
+ }
+
+ /**
+ * Gets the browser information who sent the current request.
+ *
+ * @throws IllegalStateException If this method is called outside of {@link #onGetRoot} or
+ * {@link #onLoadChildren} or {@link #onLoadItem}.
+ * @see MediaSessionManager#isTrustedForMediaControl(RemoteUserInfo)
+ */
+ public final RemoteUserInfo getCurrentBrowserInfo() {
+ if (mCurConnection == null) {
+ throw new IllegalStateException("This should be called inside of onGetRoot or"
+ + " onLoadChildren or onLoadItem methods");
+ }
+ //TODO(b/119752205): Resolve hidden API usage. 4-param constructor of RemoteUserInfo
+ /*
+ return new RemoteUserInfo(mCurConnection.pkg, mCurConnection.pid, mCurConnection.uid,
+ mCurConnection.callbacks.asBinder());
+ */
+ return new RemoteUserInfo(mCurConnection.pkg, mCurConnection.pid, mCurConnection.uid);
+ }
+
+ /**
+ * Notifies all connected media browsers that the children of
+ * the specified parent id have changed in some way.
+ * This will cause browsers to fetch subscribed content again.
+ *
+ * @param parentId The id of the parent media item whose
+ * children changed.
+ */
+ public void notifyChildrenChanged(@NonNull String parentId) {
+ notifyChildrenChangedInternal(parentId, null);
+ }
+
+ /**
+ * Notifies all connected media browsers that the children of
+ * the specified parent id have changed in some way.
+ * This will cause browsers to fetch subscribed content again.
+ *
+ * @param parentId The id of the parent media item whose
+ * children changed.
+ * @param options The bundle of service-specific arguments to send
+ * to the media browser. The contents of this bundle may
+ * contain the information about the change.
+ */
+ public void notifyChildrenChanged(@NonNull String parentId, @NonNull Bundle options) {
+ if (options == null) {
+ throw new IllegalArgumentException("options cannot be null in notifyChildrenChanged");
+ }
+ notifyChildrenChangedInternal(parentId, options);
+ }
+
+ private void notifyChildrenChangedInternal(final String parentId, final Bundle options) {
+ if (parentId == null) {
+ throw new IllegalArgumentException("parentId cannot be null in notifyChildrenChanged");
+ }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ for (IBinder binder : mConnections.keySet()) {
+ ConnectionRecord connection = mConnections.get(binder);
+ List<Pair<IBinder, Bundle>> callbackList =
+ connection.subscriptions.get(parentId);
+ if (callbackList != null) {
+ for (Pair<IBinder, Bundle> callback : callbackList) {
+ if (MediaBrowserUtils.hasDuplicatedItems(options, callback.second)) {
+ performLoadChildren(parentId, connection, callback.second);
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Return whether the given package is one of the ones that is owned by the uid.
+ */
+ private boolean isValidPackage(String pkg, int uid) {
+ if (pkg == null) {
+ return false;
+ }
+ final PackageManager pm = getPackageManager();
+ final String[] packages = pm.getPackagesForUid(uid);
+ final int N = packages.length;
+ for (int i=0; i<N; i++) {
+ if (packages[i].equals(pkg)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Save the subscription and if it is a new subscription send the results.
+ */
+ private void addSubscription(String id, ConnectionRecord connection, IBinder token,
+ Bundle options) {
+ // Save the subscription
+ List<Pair<IBinder, Bundle>> callbackList = connection.subscriptions.get(id);
+ if (callbackList == null) {
+ callbackList = new ArrayList<>();
+ }
+ for (Pair<IBinder, Bundle> callback : callbackList) {
+ if (token == callback.first
+ && MediaBrowserUtils.areSameOptions(options, callback.second)) {
+ return;
+ }
+ }
+ callbackList.add(new Pair<>(token, options));
+ connection.subscriptions.put(id, callbackList);
+ // send the results
+ performLoadChildren(id, connection, options);
+ }
+
+ /**
+ * Remove the subscription.
+ */
+ private boolean removeSubscription(String id, ConnectionRecord connection, IBinder token) {
+ if (token == null) {
+ return connection.subscriptions.remove(id) != null;
+ }
+ boolean removed = false;
+ List<Pair<IBinder, Bundle>> callbackList = connection.subscriptions.get(id);
+ if (callbackList != null) {
+ Iterator<Pair<IBinder, Bundle>> iter = callbackList.iterator();
+ while (iter.hasNext()){
+ if (token == iter.next().first) {
+ removed = true;
+ iter.remove();
+ }
+ }
+ if (callbackList.size() == 0) {
+ connection.subscriptions.remove(id);
+ }
+ }
+ return removed;
+ }
+
+ /**
+ * Call onLoadChildren and then send the results back to the connection.
+ * <p>
+ * Callers must make sure that this connection is still connected.
+ */
+ private void performLoadChildren(final String parentId, final ConnectionRecord connection,
+ final Bundle options) {
+ final Result<List<MediaBrowser.MediaItem>> result
+ = new Result<List<MediaBrowser.MediaItem>>(parentId) {
+ @Override
+ void onResultSent(List<MediaBrowser.MediaItem> list, @ResultFlags int flag) {
+ if (mConnections.get(connection.callbacks.asBinder()) != connection) {
+ if (DBG) {
+ Log.d(TAG, "Not sending onLoadChildren result for connection that has"
+ + " been disconnected. pkg=" + connection.pkg + " id=" + parentId);
+ }
+ return;
+ }
+
+ List<MediaBrowser.MediaItem> filteredList =
+ (flag & RESULT_FLAG_OPTION_NOT_HANDLED) != 0
+ ? applyOptions(list, options) : list;
+ //TODO:(b/119750807) Resolve hidden API usage ParceledListSlice.
+ /*
+ final ParceledListSlice<MediaBrowser.MediaItem> pls =
+ filteredList == null ? null : new ParceledListSlice<>(filteredList);
+ try {
+ connection.callbacks.onLoadChildrenWithOptions(parentId, pls, options);
+ } catch (RemoteException ex) {
+ // The other side is in the process of crashing.
+ Log.w(TAG, "Calling onLoadChildren() failed for id=" + parentId
+ + " package=" + connection.pkg);
+ }
+ */
+ }
+ };
+
+ mCurConnection = connection;
+ if (options == null) {
+ onLoadChildren(parentId, result);
+ } else {
+ onLoadChildren(parentId, result, options);
+ }
+ mCurConnection = null;
+
+ if (!result.isDone()) {
+ throw new IllegalStateException("onLoadChildren must call detach() or sendResult()"
+ + " before returning for package=" + connection.pkg + " id=" + parentId);
+ }
+ }
+
+ private List<MediaBrowser.MediaItem> applyOptions(List<MediaBrowser.MediaItem> list,
+ final Bundle options) {
+ if (list == null) {
+ return null;
+ }
+ int page = options.getInt(MediaBrowser.EXTRA_PAGE, -1);
+ int pageSize = options.getInt(MediaBrowser.EXTRA_PAGE_SIZE, -1);
+ if (page == -1 && pageSize == -1) {
+ return list;
+ }
+ int fromIndex = pageSize * page;
+ int toIndex = fromIndex + pageSize;
+ if (page < 0 || pageSize < 1 || fromIndex >= list.size()) {
+ return Collections.EMPTY_LIST;
+ }
+ if (toIndex > list.size()) {
+ toIndex = list.size();
+ }
+ return list.subList(fromIndex, toIndex);
+ }
+
+ private void performLoadItem(String itemId, final ConnectionRecord connection,
+ final ResultReceiver receiver) {
+ final Result<MediaBrowser.MediaItem> result =
+ new Result<MediaBrowser.MediaItem>(itemId) {
+ @Override
+ void onResultSent(MediaBrowser.MediaItem item, @ResultFlags int flag) {
+ if (mConnections.get(connection.callbacks.asBinder()) != connection) {
+ if (DBG) {
+ Log.d(TAG, "Not sending onLoadItem result for connection that has"
+ + " been disconnected. pkg=" + connection.pkg + " id=" + itemId);
+ }
+ return;
+ }
+ if ((flag & RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED) != 0) {
+ receiver.send(RESULT_ERROR, null);
+ return;
+ }
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(KEY_MEDIA_ITEM, item);
+ receiver.send(RESULT_OK, bundle);
+ }
+ };
+
+ mCurConnection = connection;
+ onLoadItem(itemId, result);
+ mCurConnection = null;
+
+ if (!result.isDone()) {
+ throw new IllegalStateException("onLoadItem must call detach() or sendResult()"
+ + " before returning for id=" + itemId);
+ }
+ }
+
+ /**
+ * Contains information that the browser service needs to send to the client
+ * when first connected.
+ */
+ public static final class BrowserRoot {
+ /**
+ * The lookup key for a boolean that indicates whether the browser service should return a
+ * browser root for recently played media items.
+ *
+ * <p>When creating a media browser for a given media browser service, this key can be
+ * supplied as a root hint for retrieving media items that are recently played.
+ * If the media browser service can provide such media items, the implementation must return
+ * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
+ *
+ * <p>The root hint may contain multiple keys.
+ *
+ * @see #EXTRA_OFFLINE
+ * @see #EXTRA_SUGGESTED
+ */
+ public static final String EXTRA_RECENT = "android.service.media.extra.RECENT";
+
+ /**
+ * The lookup key for a boolean that indicates whether the browser service should return a
+ * browser root for offline media items.
+ *
+ * <p>When creating a media browser for a given media browser service, this key can be
+ * supplied as a root hint for retrieving media items that are can be played without an
+ * internet connection.
+ * If the media browser service can provide such media items, the implementation must return
+ * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
+ *
+ * <p>The root hint may contain multiple keys.
+ *
+ * @see #EXTRA_RECENT
+ * @see #EXTRA_SUGGESTED
+ */
+ public static final String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
+
+ /**
+ * The lookup key for a boolean that indicates whether the browser service should return a
+ * browser root for suggested media items.
+ *
+ * <p>When creating a media browser for a given media browser service, this key can be
+ * supplied as a root hint for retrieving the media items suggested by the media browser
+ * service. The list of media items passed in {@link android.media.browse.MediaBrowser.SubscriptionCallback#onChildrenLoaded(String, List)}
+ * is considered ordered by relevance, first being the top suggestion.
+ * If the media browser service can provide such media items, the implementation must return
+ * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
+ *
+ * <p>The root hint may contain multiple keys.
+ *
+ * @see #EXTRA_RECENT
+ * @see #EXTRA_OFFLINE
+ */
+ public static final String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
+
+ final private String mRootId;
+ final private Bundle mExtras;
+
+ /**
+ * Constructs a browser root.
+ * @param rootId The root id for browsing.
+ * @param extras Any extras about the browser service.
+ */
+ public BrowserRoot(@NonNull String rootId, @Nullable Bundle extras) {
+ if (rootId == null) {
+ throw new IllegalArgumentException("The root id in BrowserRoot cannot be null. " +
+ "Use null for BrowserRoot instead.");
+ }
+ mRootId = rootId;
+ mExtras = extras;
+ }
+
+ /**
+ * Gets the root id for browsing.
+ */
+ public String getRootId() {
+ return mRootId;
+ }
+
+ /**
+ * Gets any extras about the browser service.
+ */
+ public Bundle getExtras() {
+ return mExtras;
+ }
+ }
+}
diff --git a/packages/MediaComponents/proguard.cfg b/packages/MediaComponents/proguard.cfg
deleted file mode 100644
index d7bf730..0000000
--- a/packages/MediaComponents/proguard.cfg
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Copyright 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# Keep entry point for updatable Java classes
--keep public class com.android.media.update.ApiFactory {
- public static com.android.media.update.ApiFactory initialize(android.content.pm.ApplicationInfo);
-}
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_dark.png
deleted file mode 100644
index 17fd51f..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_light.png
deleted file mode 100644
index d7c8252..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_dark.png
deleted file mode 100644
index 928ddea..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_light.png
deleted file mode 100644
index 1a9cd75..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_dark.png
deleted file mode 100644
index 7192ad4..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_light.png
deleted file mode 100644
index bb707ea..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_play_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_play_dark.png
deleted file mode 100644
index 0c32d00..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_play_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_play_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_play_light.png
deleted file mode 100644
index 5345ee3..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_play_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_dark.png
deleted file mode 100644
index 801d341..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_light.png
deleted file mode 100644
index 9d6b65d..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_disabled.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_disabled.png
deleted file mode 100644
index 0354f61..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_disabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_enabled.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_enabled.png
deleted file mode 100644
index 5f8febe..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_enabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_dark.png
deleted file mode 100644
index 8ad305d..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_light.png
deleted file mode 100644
index 887fde4..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_dark.png
deleted file mode 100644
index 5739df7..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_light.png
deleted file mode 100644
index 58c344a..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_grey.png
deleted file mode 100644
index 1a03420..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_dark.png
deleted file mode 100755
index 723e455..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_dark.png
deleted file mode 100755
index 40c25a3..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_light.png
deleted file mode 100755
index afdb9c1..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_light.png
deleted file mode 100755
index 846c109..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_dark.png
deleted file mode 100755
index 33bf484..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_light.png
deleted file mode 100755
index c911b5c..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_dark.png
deleted file mode 100644
index e94ed50..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_light.png
deleted file mode 100644
index 2cf7e0c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_dark.png
deleted file mode 100644
index 66558a8..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_light.png
deleted file mode 100644
index 40a1a84..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_dark.png
deleted file mode 100644
index f49aed7..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_light.png
deleted file mode 100644
index 74068ea..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_play_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_play_dark.png
deleted file mode 100644
index 9cc777c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_play_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_play_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_play_light.png
deleted file mode 100644
index f208795..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_play_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_dark.png
deleted file mode 100644
index 3ad2c9c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_light.png
deleted file mode 100644
index b002ab7..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_disabled.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_disabled.png
deleted file mode 100644
index 0354f61..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_disabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_enabled.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_enabled.png
deleted file mode 100644
index 5f8febe..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_enabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_dark.png
deleted file mode 100644
index 4446ea4..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_light.png
deleted file mode 100644
index 4d790c6..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_dark.png
deleted file mode 100644
index c401dc0..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_light.png
deleted file mode 100644
index e24d586..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_grey.png
deleted file mode 100644
index ccbb772..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_dark.png
deleted file mode 100755
index 7cc9845..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_dark.png
deleted file mode 100755
index 22617e1..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_light.png
deleted file mode 100755
index cefef3c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_light.png
deleted file mode 100755
index 9a0047c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_dark.png
deleted file mode 100755
index ca5d6a2..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_light.png
deleted file mode 100755
index 8134310..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_dark.png
deleted file mode 100644
index b5c899f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_light.png
deleted file mode 100644
index 4778e00..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_dark.png
deleted file mode 100644
index f992fc5..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_light.png
deleted file mode 100644
index d3884e6..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_dark.png
deleted file mode 100644
index 660ac65..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_light.png
deleted file mode 100644
index 792104f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_dark.png
deleted file mode 100644
index be5c062..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_light.png
deleted file mode 100644
index d12d495..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_dark.png
deleted file mode 100644
index 5239336..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_light.png
deleted file mode 100644
index 5bc5a6c..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png
deleted file mode 100644
index f6dd214..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_light.png
deleted file mode 100644
index 6b7bdcd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png
deleted file mode 100644
index c7fe576..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_light.png
deleted file mode 100644
index 0a5d6aa..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png
deleted file mode 100644
index 0aadfa3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_light.png
deleted file mode 100644
index 125fe0b..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png
deleted file mode 100644
index 05c48a7..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_light.png
deleted file mode 100644
index 741e911..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png
deleted file mode 100644
index ae4218a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_light.png
deleted file mode 100644
index 8b30fab..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png
deleted file mode 100644
index d7aa903..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_light.png
deleted file mode 100644
index f7e2f29..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png
deleted file mode 100644
index e7871e2..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_light.png
deleted file mode 100644
index 8c57f63..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png
deleted file mode 100644
index 0041b01..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_light.png
deleted file mode 100644
index 6dbb694..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png
deleted file mode 100644
index 08e1013..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_light.png
deleted file mode 100644
index 5c352c3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png
deleted file mode 100644
index 70532e9..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_light.png
deleted file mode 100644
index 9c6ba30..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png
deleted file mode 100644
index 9ba3b5f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_light.png
deleted file mode 100644
index bd4bb22..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png
deleted file mode 100644
index 2156127..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_light.png
deleted file mode 100644
index b417a9f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png
deleted file mode 100644
index 9bf633e..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_light.png
deleted file mode 100644
index ba51811..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png
deleted file mode 100644
index 756a53c..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_light.png
deleted file mode 100644
index 4705dca..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png
deleted file mode 100644
index 50e4ea3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_light.png
deleted file mode 100644
index bc6724f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png
deleted file mode 100644
index 9e3b410..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_light.png
deleted file mode 100644
index 2f18abd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png
deleted file mode 100644
index de81133..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_light.png
deleted file mode 100644
index b80b191..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png
deleted file mode 100644
index 48aba3d..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_light.png
deleted file mode 100644
index ca34d5b..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png
deleted file mode 100644
index e9957b3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_light.png
deleted file mode 100644
index a5d384f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png
deleted file mode 100644
index ddc6297..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_light.png
deleted file mode 100644
index 28ab684..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png
deleted file mode 100644
index 51e7f75..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_light.png
deleted file mode 100644
index 4aa3ca3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png
deleted file mode 100644
index 9caecde..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_light.png
deleted file mode 100644
index 1b8d0b6..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png
deleted file mode 100644
index 400be3c..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_light.png
deleted file mode 100644
index c14f1bf..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png
deleted file mode 100644
index 4e18b46..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_light.png
deleted file mode 100644
index c4c2c00..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png
deleted file mode 100644
index 98fae44..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_light.png
deleted file mode 100644
index d64c289..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png
deleted file mode 100644
index 91f9327..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_light.png
deleted file mode 100644
index f5e1f69..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png
deleted file mode 100644
index 3e6fafd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_light.png
deleted file mode 100644
index ae2bd87..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png
deleted file mode 100644
index f73a1f8..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_light.png
deleted file mode 100644
index 78c1069..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png
deleted file mode 100644
index 562b803..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_light.png
deleted file mode 100644
index ddfba02..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png
deleted file mode 100644
index 257f2d2..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_light.png
deleted file mode 100644
index 38f5478..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png
deleted file mode 100644
index f995af0..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_light.png
deleted file mode 100644
index c50b7f0..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png
deleted file mode 100644
index f6dd214..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png
deleted file mode 100644
index 6b7bdcd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png
deleted file mode 100644
index c7fe576..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png
deleted file mode 100644
index 0a5d6aa..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png
deleted file mode 100644
index 0aadfa3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png
deleted file mode 100644
index 125fe0b..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png
deleted file mode 100644
index 05c48a7..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png
deleted file mode 100644
index 741e911..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png
deleted file mode 100644
index ae4218a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png
deleted file mode 100644
index 8b30fab..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png
deleted file mode 100644
index d7aa903..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png
deleted file mode 100644
index f7e2f29..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png
deleted file mode 100644
index e7871e2..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png
deleted file mode 100644
index 8c57f63..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png
deleted file mode 100644
index 0041b01..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png
deleted file mode 100644
index 6dbb694..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png
deleted file mode 100644
index 08e1013..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png
deleted file mode 100644
index 5c352c3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png
deleted file mode 100644
index 70532e9..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png
deleted file mode 100644
index 9c6ba30..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png
deleted file mode 100644
index 9ba3b5f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png
deleted file mode 100644
index bd4bb22..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png
deleted file mode 100644
index f3570f4..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png
deleted file mode 100644
index 65a403e..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png
deleted file mode 100644
index f644bfd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png
deleted file mode 100644
index c7d6048..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png
deleted file mode 100644
index 6e0d558..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png
deleted file mode 100644
index f3bc48d..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png
deleted file mode 100644
index 14d8f8e..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png
deleted file mode 100644
index 98b90e5..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png
deleted file mode 100644
index 83234a7..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png
deleted file mode 100644
index 47d452f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png
deleted file mode 100644
index b81cf5a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png
deleted file mode 100644
index 20d08b4..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png
deleted file mode 100644
index 6feb3f1..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png
deleted file mode 100644
index e6ae8b3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png
deleted file mode 100644
index 0b0fc08..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png
deleted file mode 100644
index c2a16ac..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png
deleted file mode 100644
index a3598cc..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png
deleted file mode 100644
index 846d16d..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png
deleted file mode 100644
index 2070455..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png
deleted file mode 100644
index ae6db13..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png
deleted file mode 100644
index 7f3828a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png
deleted file mode 100644
index aaccc73..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png
deleted file mode 100644
index 5c8ced9..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png
deleted file mode 100644
index ad01b9e..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png
deleted file mode 100644
index ce31dd3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png
deleted file mode 100644
index 9ef78e4..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png
deleted file mode 100644
index a7c2cdb..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png
deleted file mode 100644
index e7c5bea..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png
deleted file mode 100644
index ecad0d4..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png
deleted file mode 100644
index 5fa5923..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png
deleted file mode 100644
index f687e25..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png
deleted file mode 100644
index 9c06db8..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png
deleted file mode 100644
index 90225ba..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png
deleted file mode 100644
index 19697de..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png
deleted file mode 100644
index d37ec21..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png
deleted file mode 100644
index 21840bf..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png
deleted file mode 100644
index 5445e3a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png
deleted file mode 100644
index 2337c65..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png
deleted file mode 100644
index f6dd214..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png
deleted file mode 100644
index 6b7bdcd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_dark.png
deleted file mode 100644
index c4dc132..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_light.png
deleted file mode 100644
index b14617c..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_dark.png
deleted file mode 100644
index bb30773..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_light.png
deleted file mode 100644
index a05d7d7..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_grey.png
deleted file mode 100644
index 2238d58..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_dark.png
deleted file mode 100755
index e40349d..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_dark.png
deleted file mode 100755
index f67c463..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_light.png
deleted file mode 100755
index 7fcebf5..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_light.png
deleted file mode 100755
index ea32a7a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_dark.png
deleted file mode 100755
index d62ca37..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_light.png
deleted file mode 100755
index 3131256..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_dark.png
deleted file mode 100644
index f131e1b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_light.png
deleted file mode 100644
index e5946a2..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_dark.png
deleted file mode 100644
index b85e87f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_light.png
deleted file mode 100644
index 51b4401..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_dark.png
deleted file mode 100644
index 3ea7e03..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_light.png
deleted file mode 100644
index dc63538..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_dark.png
deleted file mode 100644
index 2745c3a..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_light.png
deleted file mode 100644
index eda3ba5..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_dark.png
deleted file mode 100644
index 035ca18..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_light.png
deleted file mode 100644
index eac183d..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png
deleted file mode 100644
index 0db679e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png
deleted file mode 100644
index 51c6051..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png
deleted file mode 100644
index c083914..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png
deleted file mode 100644
index c3c3caf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png
deleted file mode 100644
index fc444cf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png
deleted file mode 100644
index abd6377..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png
deleted file mode 100644
index 6dbd1da..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png
deleted file mode 100644
index d2e7108..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png
deleted file mode 100644
index d9f596b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png
deleted file mode 100644
index 4f32e1a..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png
deleted file mode 100644
index c568e04..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png
deleted file mode 100644
index ed20dd9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png
deleted file mode 100644
index bbe39e7..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png
deleted file mode 100644
index 1edc15f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png
deleted file mode 100644
index 78aebaf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png
deleted file mode 100644
index b5a6a4f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png
deleted file mode 100644
index 44b91ce..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png
deleted file mode 100644
index 85f66f9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png
deleted file mode 100644
index 51ea34b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png
deleted file mode 100644
index 952de04..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png
deleted file mode 100644
index 8b1aa21..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png
deleted file mode 100644
index 534bcc0..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png
deleted file mode 100644
index f666b35..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png
deleted file mode 100644
index 145a8fb..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png
deleted file mode 100644
index edeb132..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png
deleted file mode 100644
index 9da2b60..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png
deleted file mode 100644
index ab80aa9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png
deleted file mode 100644
index 115efe4..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png
deleted file mode 100644
index 8c0cc31..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png
deleted file mode 100644
index e6ae6fc..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png
deleted file mode 100644
index b8816c9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png
deleted file mode 100644
index bd42931..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png
deleted file mode 100644
index 10d5b7f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png
deleted file mode 100644
index 303a0fe..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png
deleted file mode 100644
index 3c2a655..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png
deleted file mode 100644
index 90debc2..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png
deleted file mode 100644
index d3e78a7..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png
deleted file mode 100644
index 3a3f991..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png
deleted file mode 100644
index 63fad9e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png
deleted file mode 100644
index d6dd8d4..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png
deleted file mode 100644
index 890fd5f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png
deleted file mode 100644
index 6b0b5c1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png
deleted file mode 100644
index 9ce1ef1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png
deleted file mode 100644
index 81710d4..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png
deleted file mode 100644
index 861c080..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png
deleted file mode 100644
index 1c4aa21..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png
deleted file mode 100644
index 59a6b30..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png
deleted file mode 100644
index c6e8fe0..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png
deleted file mode 100644
index 57b840e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png
deleted file mode 100644
index bf24050..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png
deleted file mode 100644
index 01c18c1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png
deleted file mode 100644
index be9753e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png
deleted file mode 100644
index 3f291b1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png
deleted file mode 100644
index dc1c619..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png
deleted file mode 100644
index 6504a70..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png
deleted file mode 100644
index a7e0a60..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png
deleted file mode 100644
index 57b1f3e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png
deleted file mode 100644
index 5c551ec..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png
deleted file mode 100644
index 238667e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png
deleted file mode 100644
index ffb8183..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png
deleted file mode 100644
index 4893f18..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png
deleted file mode 100644
index ac5e156..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png
deleted file mode 100644
index 0db679e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png
deleted file mode 100644
index 51c6051..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png
deleted file mode 100644
index c083914..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png
deleted file mode 100644
index c3c3caf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png
deleted file mode 100644
index fc444cf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png
deleted file mode 100644
index abd6377..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png
deleted file mode 100644
index 6dbd1da..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png
deleted file mode 100644
index d2e7108..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png
deleted file mode 100644
index d9f596b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png
deleted file mode 100644
index 4f32e1a..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png
deleted file mode 100644
index c568e04..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png
deleted file mode 100644
index ed20dd9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png
deleted file mode 100644
index bbe39e7..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png
deleted file mode 100644
index 1edc15f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png
deleted file mode 100644
index 78aebaf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png
deleted file mode 100644
index b5a6a4f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png
deleted file mode 100644
index 44b91ce..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png
deleted file mode 100644
index 85f66f9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png
deleted file mode 100644
index 51ea34b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png
deleted file mode 100644
index 952de04..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png
deleted file mode 100644
index 8b1aa21..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png
deleted file mode 100644
index 534bcc0..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png
deleted file mode 100644
index 1fffa01..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png
deleted file mode 100644
index 0ff7e57..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png
deleted file mode 100644
index 06ac4dc..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png
deleted file mode 100644
index 42a86f5..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png
deleted file mode 100644
index 0301090..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png
deleted file mode 100644
index 4396f0e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png
deleted file mode 100644
index e19001b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png
deleted file mode 100644
index 2271581..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png
deleted file mode 100644
index 5e96208..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png
deleted file mode 100644
index 0f69500..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png
deleted file mode 100644
index 07e1bd6..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png
deleted file mode 100644
index cde8f19..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png
deleted file mode 100644
index b632e95..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png
deleted file mode 100644
index 11d5d2e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png
deleted file mode 100644
index 660d527..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png
deleted file mode 100644
index 2761ae1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png
deleted file mode 100644
index 0aa3f84..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png
deleted file mode 100644
index 27d166f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png
deleted file mode 100644
index ebe527e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png
deleted file mode 100644
index aeb2a8e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png
deleted file mode 100644
index 7337af5..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png
deleted file mode 100644
index f3f31ef..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png
deleted file mode 100644
index 20d9f57..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png
deleted file mode 100644
index bf8eb77..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png
deleted file mode 100644
index 56a0e14..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png
deleted file mode 100644
index 67425e1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png
deleted file mode 100644
index 7c76e19..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png
deleted file mode 100644
index e02f1ed..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png
deleted file mode 100644
index f5fdcdd..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png
deleted file mode 100644
index 8ce9b819..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png
deleted file mode 100644
index a29e443..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png
deleted file mode 100644
index 349ca89..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png
deleted file mode 100644
index 0fc75d5..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png
deleted file mode 100644
index 5cbd27c..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png
deleted file mode 100644
index 0ebb0ac..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png
deleted file mode 100644
index 5b514aa..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png
deleted file mode 100644
index 8e7fe5c..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png
deleted file mode 100644
index efb2c10..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png
deleted file mode 100644
index 0db679e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png
deleted file mode 100644
index 51c6051..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_dark.png
deleted file mode 100644
index fdb2121..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_light.png
deleted file mode 100644
index 9ce7e3a..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_dark.png
deleted file mode 100644
index e8601ce..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_light.png
deleted file mode 100644
index 34928d7..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_grey.png
deleted file mode 100644
index 792fd77..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_dark.png
deleted file mode 100755
index f171a8c..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_dark.png
deleted file mode 100755
index c8cb6ca..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_light.png
deleted file mode 100755
index 9c8863d..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_light.png
deleted file mode 100755
index 9335038..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_dark.png
deleted file mode 100755
index a6a4858..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_light.png
deleted file mode 100755
index 4ca6787..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_00.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_00.png
deleted file mode 100644
index b2305d2..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_00.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_01.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_01.png
deleted file mode 100644
index 59395d4..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_01.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_02.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_02.png
deleted file mode 100644
index 70a7282..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_02.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_03.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_03.png
deleted file mode 100644
index b3f0f53..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_03.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_04.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_04.png
deleted file mode 100644
index 66a80d9..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_04.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_05.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_05.png
deleted file mode 100644
index 8ec3939..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_05.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_06.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_06.png
deleted file mode 100644
index 0f02536..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_06.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_07.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_07.png
deleted file mode 100644
index ba228f4..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_07.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_08.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_08.png
deleted file mode 100644
index 304277e..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_08.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_09.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_09.png
deleted file mode 100644
index f865bfb..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_09.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_10.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_10.png
deleted file mode 100644
index 17c5d6b..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_10.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_11.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_11.png
deleted file mode 100644
index a2f4ad5..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_11.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_12.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_12.png
deleted file mode 100644
index c230648..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_12.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_13.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_13.png
deleted file mode 100644
index b99324e..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_13.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_14.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_14.png
deleted file mode 100644
index c8618f0..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_14.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_15.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_15.png
deleted file mode 100644
index 4a0d770..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_15.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_00.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_00.png
deleted file mode 100644
index 4a0d770..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_00.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_01.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_01.png
deleted file mode 100644
index 4db4e50..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_01.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_02.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_02.png
deleted file mode 100644
index 82b5f03..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_02.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_03.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_03.png
deleted file mode 100644
index b05c758..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_03.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_04.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_04.png
deleted file mode 100644
index fa5c7fa..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_04.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_05.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_05.png
deleted file mode 100644
index 2c287e4..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_05.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_06.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_06.png
deleted file mode 100644
index eb7d0cf..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_06.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_07.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_07.png
deleted file mode 100644
index 95fa72b..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_07.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_08.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_08.png
deleted file mode 100644
index 5650eea..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_08.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_09.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_09.png
deleted file mode 100644
index 6f44355..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_09.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_10.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_10.png
deleted file mode 100644
index 4e877c3..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_10.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_11.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_11.png
deleted file mode 100644
index 7927f0a..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_11.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_12.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_12.png
deleted file mode 100644
index 71b19bb..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_12.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_13.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_13.png
deleted file mode 100644
index bf5921e..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_13.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_14.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_14.png
deleted file mode 100644
index 14b76b1..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_14.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_15.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_15.png
deleted file mode 100644
index b2305d2..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_15.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_mr_button_grey.png
deleted file mode 100644
index 04a9525..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable/custom_progress.xml b/packages/MediaComponents/res/drawable/custom_progress.xml
deleted file mode 100644
index 9731a6e..0000000
--- a/packages/MediaComponents/res/drawable/custom_progress.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:id="@android:id/background">
- <shape android:shape="rectangle" >
- <solid android:color="#26000000" />
- </shape>
- </item>
- <item android:id="@android:id/secondaryProgress">
- <clip>
- <shape android:shape="rectangle" >
- <solid android:color="#5Cffffff" />
- </shape>
- </clip>
- </item>
- <item android:id="@android:id/progress">
- <clip>
- <shape android:shape="rectangle" >
- <solid android:color="#ffffff" />
- </shape>
- </clip>
- </item>
-</layer-list>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/custom_progress_thumb.xml b/packages/MediaComponents/res/drawable/custom_progress_thumb.xml
deleted file mode 100644
index 1a35970..0000000
--- a/packages/MediaComponents/res/drawable/custom_progress_thumb.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="oval" >
- <solid android:color="#ffffff" />
- <size
- android:height="@dimen/mcv2_custom_progress_thumb_size"
- android:width="@dimen/mcv2_custom_progress_thumb_size" />
-</shape>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_arrow_back.xml b/packages/MediaComponents/res/drawable/ic_arrow_back.xml
deleted file mode 100644
index 2b5f71e..0000000
--- a/packages/MediaComponents/res/drawable/ic_arrow_back.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_aspect_ratio.xml b/packages/MediaComponents/res/drawable/ic_aspect_ratio.xml
deleted file mode 100644
index c6228e6..0000000
--- a/packages/MediaComponents/res/drawable/ic_aspect_ratio.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M19,12h-2v3h-3v2h5v-5zM7,9h3L10,7L5,7v5h2L7,9zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.99h18v14.02z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_audiotrack.xml b/packages/MediaComponents/res/drawable/ic_audiotrack.xml
deleted file mode 100644
index 27c12b5..0000000
--- a/packages/MediaComponents/res/drawable/ic_audiotrack.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M12,3v9.28c-0.47,-0.17 -0.97,-0.28 -1.5,-0.28C8.01,12 6,14.01 6,16.5S8.01,21 10.5,21c2.31,0 4.2,-1.75 4.45,-4H15V6h4V3h-7z"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_check.xml b/packages/MediaComponents/res/drawable/ic_check.xml
deleted file mode 100644
index 32f720b..0000000
--- a/packages/MediaComponents/res/drawable/ic_check.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0 0h24v24H0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_chevron_left.xml b/packages/MediaComponents/res/drawable/ic_chevron_left.xml
deleted file mode 100644
index 8336d17..0000000
--- a/packages/MediaComponents/res/drawable/ic_chevron_left.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_chevron_right.xml b/packages/MediaComponents/res/drawable/ic_chevron_right.xml
deleted file mode 100644
index fb2ce09..0000000
--- a/packages/MediaComponents/res/drawable/ic_chevron_right.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_default_album_image.xml b/packages/MediaComponents/res/drawable/ic_default_album_image.xml
deleted file mode 100644
index 1cee643..0000000
--- a/packages/MediaComponents/res/drawable/ic_default_album_image.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="512dp"
- android:height="512dp"
- android:viewportWidth="512"
- android:viewportHeight="512">
-
- <path
- android:fillColor="#616161"
- android:pathData="M 0 0 H 512 V 512 H 0 V 0 Z" />
- <path
- android:fillColor="#525252"
- android:pathData="M256,151v123.14c-6.88-4.02-14.82-6.48-23.33-6.48 c-25.78,0-46.67,20.88-46.67,46.67c0,25.78,20.88,46.67,46.67,46.67s46.67-20.88,46.67-46.67V197.67H326V151H256z" />
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_forward_30.xml b/packages/MediaComponents/res/drawable/ic_forward_30.xml
deleted file mode 100644
index 7efdf16..0000000
--- a/packages/MediaComponents/res/drawable/ic_forward_30.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <group>
- <clip-path android:pathData="M24,24H0V0h24v24z M 0,0" />
- <path
- android:pathData="M9.6 13.5h.4c.2 0 .4,-.1.5,-.2s.2,-.2.2,-.4v-.2s-.1,-.1,-.1,-.2,-.1,-.1,-.2,-.1h-.5s-.1.1,-.2.1,-.1.1,-.1.2v.2h-1c0,-.2 0,-.3.1,-.5s.2,-.3.3,-.4.3,-.2.4,-.2.4,-.1.5,-.1c.2 0 .4 0 .6.1s.3.1.5.2.2.2.3.4.1.3.1.5v.3s-.1.2,-.1.3,-.1.2,-.2.2,-.2.1,-.3.2c.2.1.4.2.5.4s.2.4.2.6c0 .2 0 .4,-.1.5s-.2.3,-.3.4,-.3.2,-.5.2,-.4.1,-.6.1c-.2 0,-.4 0,-.5,-.1s-.3,-.1,-.5,-.2,-.2,-.2,-.3,-.4,-.1,-.4,-.1,-.6h.8v.2s.1.1.1.2.1.1.2.1h.5s.1,-.1.2,-.1.1,-.1.1,-.2v-.5s-.1,-.1,-.1,-.2,-.1,-.1,-.2,-.1h-.6v-.7zm5.7.7c0 .3 0 .6,-.1.8l-.3.6s-.3.3,-.5.3,-.4.1,-.6.1,-.4 0,-.6,-.1,-.3,-.2,-.5,-.3,-.2,-.3,-.3,-.6,-.1,-.5,-.1,-.8v-.7c0,-.3 0,-.6.1,-.8l.3,-.6s.3,-.3.5,-.3.4,-.1.6,-.1.4 0 .6.1.3.2.5.3.2.3.3.6.1.5.1.8v.7zm-.9,-.8v-.5s-.1,-.2,-.1,-.3,-.1,-.1,-.2,-.2,-.2,-.1,-.3,-.1,-.2 0,-.3.1l-.2.2s-.1.2,-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3,-.1l.2,-.2s.1,-.2.1,-.3v-1.5zM4 13c0 4.4 3.6 8 8 8s8,-3.6 8,-8h-2c0 3.3,-2.7 6,-6 6s-6,-2.7,-6,-6 2.7,-6 6,-6v4l5,-5,-5,-5v4c-4.4 0,-8 3.6,-8 8z"
- android:fillColor="#FFFFFF"/>
- </group>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_fullscreen.xml b/packages/MediaComponents/res/drawable/ic_fullscreen.xml
deleted file mode 100644
index 4b4f6bc..0000000
--- a/packages/MediaComponents/res/drawable/ic_fullscreen.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M7,14L5,14v5h5v-2L7,17v-3zM5,10h2L7,7h3L10,5L5,5v5zM17,17h-3v2h5v-5h-2v3zM14,5v2h3v3h2L19,5h-5z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_fullscreen_exit.xml b/packages/MediaComponents/res/drawable/ic_fullscreen_exit.xml
deleted file mode 100644
index bc204e2..0000000
--- a/packages/MediaComponents/res/drawable/ic_fullscreen_exit.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M5,16h3v3h2v-5L5,14v2zM8,8L5,8v2h5L10,5L8,5v3zM14,19h2v-3h3v-2h-5v5zM16,8L16,5h-2v5h5L19,8h-3z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_help.xml b/packages/MediaComponents/res/drawable/ic_help.xml
deleted file mode 100644
index 4d1d75d..0000000
--- a/packages/MediaComponents/res/drawable/ic_help.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0 0h24v24H0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1
-17h-2v-2h2v2zm2.07-7.75l-.9 .92 C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1 .45 -2.1
-1.17-2.83l1.24-1.26c.37-.36 .59 -.86 .59 -1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21
-1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_high_quality.xml b/packages/MediaComponents/res/drawable/ic_high_quality.xml
deleted file mode 100644
index f76e22f..0000000
--- a/packages/MediaComponents/res/drawable/ic_high_quality.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="34dp"
- android:height="34dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0 0h24v24H0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19 4H5c-1.11 0-2 0.9-2 2v12c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2V6c0-1.1-0.9-2-2-2zm-8 11H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm7-1c0 0.55-0.45 1-1 1h-0.75v1.5h-1.5V15H14c-0.55 0-1-0.45-1-1v-4c0-0.55 0.45 -1 1-1h3c0.55 0 1 0.45 1 1v4zm-3.5-0.5h2v-3h-2v3z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_launch.xml b/packages/MediaComponents/res/drawable/ic_launch.xml
deleted file mode 100644
index f7af6aa..0000000
--- a/packages/MediaComponents/res/drawable/ic_launch.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z"/>
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_mute.xml b/packages/MediaComponents/res/drawable/ic_mute.xml
deleted file mode 100644
index 560aaec..0000000
--- a/packages/MediaComponents/res/drawable/ic_mute.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_pause_circle_filled.xml b/packages/MediaComponents/res/drawable/ic_pause_circle_filled.xml
deleted file mode 100644
index 73be228..0000000
--- a/packages/MediaComponents/res/drawable/ic_pause_circle_filled.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,16L9,16L9,8h2v8zM15,16h-2L13,8h2v8z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_play_circle_filled.xml b/packages/MediaComponents/res/drawable/ic_play_circle_filled.xml
deleted file mode 100644
index 9d39def..0000000
--- a/packages/MediaComponents/res/drawable/ic_play_circle_filled.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,16.5v-9l6,4.5 -6,4.5z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_replay_circle_filled.xml b/packages/MediaComponents/res/drawable/ic_replay_circle_filled.xml
deleted file mode 100644
index a56d5d9..0000000
--- a/packages/MediaComponents/res/drawable/ic_replay_circle_filled.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0,0h24v24H0V0z" />
- <path
- android:fillColor="#FFFFFF"
- android:fillType="evenOdd"
- android:pathData="M12,2C6.48,2,2,6.48,2,12c0,5.52,4.48,10,10,10c5.52,0,10-4.48,10-10
-C22,6.48,17.52,2,12,2z
-M18,12c0,3.31-2.69,6-6,6c-3.31,0-6-2.69-6-6h2c0,2.21,1.79,4,4,4s4-1.79,4-4s-1.79-4-4-4v3L8,7l4-4v3
-C15.31,6,18,8.69,18,12z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_rewind_10.xml b/packages/MediaComponents/res/drawable/ic_rewind_10.xml
deleted file mode 100644
index ae586b4..0000000
--- a/packages/MediaComponents/res/drawable/ic_rewind_10.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <group>
- <clip-path android:pathData="M0,0h24v24H0V0z M 0,0" />
- <path
- android:pathData="M12 5V1L7 6l5 5V7c3.3 0 6 2.7 6 6s-2.7 6,-6 6,-6,-2.7,-6,-6H4c0 4.4 3.6 8 8 8s8,-3.6 8,-8,-3.6,-8,-8,-8zm-1.1 11H10v-3.3L9 13v-.7l1.8,-.6h.1V16zm4.3,-1.8c0 .3 0 .6,-.1.8l-.3.6s-.3.3,-.5.3,-.4.1,-.6.1,-.4 0,-.6,-.1,-.3,-.2,-.5,-.3,-.2,-.3,-.3,-.6,-.1,-.5,-.1,-.8v-.7c0,-.3 0,-.6.1,-.8l.3,-.6s.3,-.3.5,-.3.4,-.1.6,-.1.4 0 .6.1c.2.1.3.2.5.3s.2.3.3.6.1.5.1.8v.7zm-.9,-.8v-.5s-.1,-.2,-.1,-.3,-.1,-.1,-.2,-.2,-.2,-.1,-.3,-.1,-.2 0,-.3.1l-.2.2s-.1.2,-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3,-.1l.2,-.2s.1,-.2.1,-.3v-1.5z"
- android:fillColor="#FFFFFF"/>
- </group>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_sd.xml b/packages/MediaComponents/res/drawable/ic_sd.xml
deleted file mode 100644
index decb6d2..0000000
--- a/packages/MediaComponents/res/drawable/ic_sd.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0,0h24v24H0V0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19,3H5C3.89,3,3,3.9,3,5v14c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V5C21,3.9,20.1,3,19,3z
-M13,9h4c0.55,0,1,0.45,1,1v4 c0,0.55-0.45,1-1,1h-4V9z
-M9.5,13.5v-1H7c-0.55,0-1-0.45-1-1V10c0-0.55,0.45-1,1-1h3c0.55,0,1,0.45,1,1v1H9.5v-0.5h-2v1H10
-c0.55,0,1,0.45,1,1V14c0,0.55-0.45,1-1,1H7c-0.55,0-1-0.45-1-1v-1h1.5v0.5H9.5z
-M14.5,13.5h2v-3h-2V13.5z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_settings.xml b/packages/MediaComponents/res/drawable/ic_settings.xml
deleted file mode 100644
index a59ecc1..0000000
--- a/packages/MediaComponents/res/drawable/ic_settings.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_skip_next.xml b/packages/MediaComponents/res/drawable/ic_skip_next.xml
deleted file mode 100644
index b1f2812..0000000
--- a/packages/MediaComponents/res/drawable/ic_skip_next.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_skip_previous.xml b/packages/MediaComponents/res/drawable/ic_skip_previous.xml
deleted file mode 100644
index 81da314..0000000
--- a/packages/MediaComponents/res/drawable/ic_skip_previous.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_subtitle_off.xml b/packages/MediaComponents/res/drawable/ic_subtitle_off.xml
deleted file mode 100644
index c0a727a..0000000
--- a/packages/MediaComponents/res/drawable/ic_subtitle_off.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0,0h24v24H0V0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19.5,5.5v13h-15v-13H19.5z M19,4H5C3.89,4,3,4.9,3,6v12c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V6C21,4.9,20.1,4,19,4L19,4z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M11,11H9.5v-0.5h-2v3h2V13H11v1c0,0.55-0.45,1-1,1H7c-0.55,0-1-0.45-1-1v-4c0-0.55,0.45-1,1-1h3c0.55,0,1,0.45,1,1V11z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M18,11h-1.5v-0.5h-2v3h2V13H18v1c0,0.55-0.45,1-1,1h-3c-0.55,0-1-0.45-1-1v-4c0-0.55,0.45-1,1-1h3c0.55,0,1,0.45,1,1V11z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_subtitle_on.xml b/packages/MediaComponents/res/drawable/ic_subtitle_on.xml
deleted file mode 100644
index 7c91c06..0000000
--- a/packages/MediaComponents/res/drawable/ic_subtitle_on.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0 0h24v24H0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19 4H5c-1.11 0-2 0.9-2 2v12c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2V6c0-1.1-0.9-2-2-2zm-8 7H9.5v-0.5h-2v3h2V13H11v1c0 0.55-0.45 1-1 1H7c-0.55 0-1-0.45-1-1v-4c0-0.55 0.45 -1 1-1h3c0.55 0 1 0.45 1 1v1zm7 0h-1.5v-0.5h-2v3h2V13H18v1c0 0.55-0.45 1-1 1h-3c-0.55 0-1-0.45-1-1v-4c0-0.55 0.45 -1 1-1h3c0.55 0 1 0.45 1 1v1z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_unmute.xml b/packages/MediaComponents/res/drawable/ic_unmute.xml
deleted file mode 100644
index 9dfb2b9..0000000
--- a/packages/MediaComponents/res/drawable/ic_unmute.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/mr_button_connected_dark.xml b/packages/MediaComponents/res/drawable/mr_button_connected_dark.xml
deleted file mode 100644
index 110ff13..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_connected_dark.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="true">
- <item android:drawable="@drawable/ic_mr_button_connected_00_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_01_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_02_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_03_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_04_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_05_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_06_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_07_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_08_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_09_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_10_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_11_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_12_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_13_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_14_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_15_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_16_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_17_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_18_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_19_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_20_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_21_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_22_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_23_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_24_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_25_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_26_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_27_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_28_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_29_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_30_dark" android:duration="42" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_button_connected_light.xml b/packages/MediaComponents/res/drawable/mr_button_connected_light.xml
deleted file mode 100644
index bcfc7fe..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_connected_light.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="true">
- <item android:drawable="@drawable/ic_mr_button_connected_00_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_01_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_02_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_03_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_04_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_05_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_06_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_07_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_08_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_09_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_10_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_11_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_12_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_13_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_14_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_15_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_16_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_17_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_18_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_19_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_20_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_21_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_22_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_23_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_24_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_25_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_26_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_27_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_28_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_29_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_30_light" android:duration="42" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_button_connecting_dark.xml b/packages/MediaComponents/res/drawable/mr_button_connecting_dark.xml
deleted file mode 100644
index 55af7b3..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_connecting_dark.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/ic_mr_button_connecting_00_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_01_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_02_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_03_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_04_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_05_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_06_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_07_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_08_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_09_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_10_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_11_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_12_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_13_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_14_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_15_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_16_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_17_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_18_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_19_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_20_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_21_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_22_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_23_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_24_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_25_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_26_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_27_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_28_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_29_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_30_dark" android:duration="42" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_button_connecting_light.xml b/packages/MediaComponents/res/drawable/mr_button_connecting_light.xml
deleted file mode 100644
index 93b4170..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_connecting_light.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/ic_mr_button_connecting_00_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_01_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_02_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_03_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_04_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_05_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_06_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_07_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_08_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_09_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_10_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_11_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_12_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_13_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_14_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_15_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_16_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_17_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_18_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_19_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_20_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_21_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_22_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_23_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_24_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_25_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_26_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_27_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_28_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_29_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_30_light" android:duration="42" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_button_dark.xml b/packages/MediaComponents/res/drawable/mr_button_dark.xml
deleted file mode 100644
index 8f1dfaa..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_dark.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="true" android:state_enabled="true"
- android:drawable="@drawable/mr_button_connected_dark" />
- <item android:state_checkable="true" android:state_enabled="true"
- android:drawable="@drawable/mr_button_connecting_dark" />
- <item android:state_enabled="true"
- android:drawable="@drawable/ic_mr_button_disconnected_dark" />
- <item android:drawable="@drawable/ic_mr_button_disabled_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_button_light.xml b/packages/MediaComponents/res/drawable/mr_button_light.xml
deleted file mode 100644
index 1d3d84e..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_light.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="true" android:state_enabled="true"
- android:drawable="@drawable/mr_button_connected_light" />
- <item android:state_checkable="true" android:state_enabled="true"
- android:drawable="@drawable/mr_button_connecting_light" />
- <item android:state_enabled="true"
- android:drawable="@drawable/ic_mr_button_disconnected_light" />
- <item android:drawable="@drawable/ic_mr_button_disabled_light" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_dialog_close_dark.xml b/packages/MediaComponents/res/drawable/mr_dialog_close_dark.xml
deleted file mode 100644
index 288c8c7..0000000
--- a/packages/MediaComponents/res/drawable/mr_dialog_close_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_dialog_close_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_dialog_close_light.xml b/packages/MediaComponents/res/drawable/mr_dialog_close_light.xml
deleted file mode 100644
index cd50e0f..0000000
--- a/packages/MediaComponents/res/drawable/mr_dialog_close_light.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_dialog_close_light"
- android:alpha="0.87" />
- </item>
-
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_dialog_material_background_dark.xml b/packages/MediaComponents/res/drawable/mr_dialog_material_background_dark.xml
deleted file mode 100644
index ebc7eca..0000000
--- a/packages/MediaComponents/res/drawable/mr_dialog_material_background_dark.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- This is the copy of @drawable/abc_dialog_material_background_dark except for inset
- which includes unnecessary padding. -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="2dp" />
- <solid android:color="@color/background_floating_material_dark" />
-</shape>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/mr_dialog_material_background_light.xml b/packages/MediaComponents/res/drawable/mr_dialog_material_background_light.xml
deleted file mode 100644
index c1b235a..0000000
--- a/packages/MediaComponents/res/drawable/mr_dialog_material_background_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- This is the copy of @drawable/abc_dialog_material_background_light except for inset
- which includes unnecessary padding. -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="2dp" />
- <solid android:color="@color/background_floating_material_light" />
-</shape>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/mr_group_collapse.xml b/packages/MediaComponents/res/drawable/mr_group_collapse.xml
deleted file mode 100644
index 8f72bc8..0000000
--- a/packages/MediaComponents/res/drawable/mr_group_collapse.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="true">
- <item android:drawable="@drawable/ic_group_collapse_00" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_01" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_02" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_03" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_04" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_05" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_06" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_07" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_08" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_09" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_10" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_11" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_12" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_13" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_14" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_15" android:duration="13" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_group_expand.xml b/packages/MediaComponents/res/drawable/mr_group_expand.xml
deleted file mode 100644
index 6b3fdb6..0000000
--- a/packages/MediaComponents/res/drawable/mr_group_expand.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="true">
- <item android:drawable="@drawable/ic_group_expand_00" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_01" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_02" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_03" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_04" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_05" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_06" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_07" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_08" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_09" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_10" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_11" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_12" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_13" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_14" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_15" android:duration="13" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_media_pause_dark.xml b/packages/MediaComponents/res/drawable/mr_media_pause_dark.xml
deleted file mode 100644
index 86218a7..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_pause_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_media_pause_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_pause_light.xml b/packages/MediaComponents/res/drawable/mr_media_pause_light.xml
deleted file mode 100644
index 2dd1f02..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_pause_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_media_pause_light"
- android:alpha="0.87" />
- </item>
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_play_dark.xml b/packages/MediaComponents/res/drawable/mr_media_play_dark.xml
deleted file mode 100644
index 9d45a33..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_play_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_media_play_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_play_light.xml b/packages/MediaComponents/res/drawable/mr_media_play_light.xml
deleted file mode 100644
index f1fb7a6..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_play_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_media_play_light"
- android:alpha="0.87" />
- </item>
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_stop_dark.xml b/packages/MediaComponents/res/drawable/mr_media_stop_dark.xml
deleted file mode 100644
index 3e108a9..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_stop_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_media_stop_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_stop_light.xml b/packages/MediaComponents/res/drawable/mr_media_stop_light.xml
deleted file mode 100644
index b2c6ce8..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_stop_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_media_stop_light"
- android:alpha="0.87" />
- </item>
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_dark.xml b/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_dark.xml
deleted file mode 100644
index 44f4fd6..0000000
--- a/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_audiotrack_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_light.xml b/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_light.xml
deleted file mode 100644
index 5c9dbc0..0000000
--- a/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_audiotrack_light"
- android:alpha="0.87" />
- </item>
-</selector>
diff --git a/packages/MediaComponents/res/interpolator/mr_fast_out_slow_in.xml b/packages/MediaComponents/res/interpolator/mr_fast_out_slow_in.xml
deleted file mode 100644
index 6b6a171..0000000
--- a/packages/MediaComponents/res/interpolator/mr_fast_out_slow_in.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 2018 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:controlX1="0.4"
- android:controlY1="0"
- android:controlX2="0.2"
- android:controlY2="1"/>
diff --git a/packages/MediaComponents/res/interpolator/mr_linear_out_slow_in.xml b/packages/MediaComponents/res/interpolator/mr_linear_out_slow_in.xml
deleted file mode 100644
index 20bf298..0000000
--- a/packages/MediaComponents/res/interpolator/mr_linear_out_slow_in.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 2018 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:controlX1="0"
- android:controlY1="0"
- android:controlX2="0.2"
- android:controlY2="1"/>
diff --git a/packages/MediaComponents/res/layout/embedded_music.xml b/packages/MediaComponents/res/layout/embedded_music.xml
deleted file mode 100644
index 3e4d365..0000000
--- a/packages/MediaComponents/res/layout/embedded_music.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <View
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.25"/>
-
- <ImageView
- android:id="@+id/album"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.5"
- android:scaleType="fitCenter"
- android:src="@drawable/ic_default_album_image" />
-
- <View
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.25"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/embedded_settings_list_item.xml b/packages/MediaComponents/res/layout/embedded_settings_list_item.xml
deleted file mode 100644
index 1156dca..0000000
--- a/packages/MediaComponents/res/layout/embedded_settings_list_item.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/icon"
- android:layout_width="@dimen/mcv2_embedded_settings_icon_size"
- android:layout_height="@dimen/mcv2_embedded_settings_icon_size"
- android:layout_margin="8dp"
- android:gravity="center" />
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/main_text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_text_height"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_embedded_settings_main_text_size"/>
-
- <TextView
- android:id="@+id/sub_text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_text_height"
- android:layout_below="@id/main_text"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white_opacity_70"
- android:textSize="@dimen/mcv2_embedded_settings_sub_text_size"/>
- </RelativeLayout>
-</LinearLayout>
-
diff --git a/packages/MediaComponents/res/layout/embedded_sub_settings_list_item.xml b/packages/MediaComponents/res/layout/embedded_sub_settings_list_item.xml
deleted file mode 100644
index 5947a72..0000000
--- a/packages/MediaComponents/res/layout/embedded_sub_settings_list_item.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/check"
- android:layout_width="@dimen/mcv2_embedded_settings_icon_size"
- android:layout_height="@dimen/mcv2_embedded_settings_icon_size"
- android:layout_margin="8dp"
- android:gravity="center"
- android:src="@drawable/ic_check"/>
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_text_height"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_embedded_settings_main_text_size"/>
- </RelativeLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/embedded_transport_controls.xml b/packages/MediaComponents/res/layout/embedded_transport_controls.xml
deleted file mode 100644
index a3a5957..0000000
--- a/packages/MediaComponents/res/layout/embedded_transport_controls.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="horizontal"
- android:paddingLeft="@dimen/mcv2_transport_controls_padding"
- android:paddingRight="@dimen/mcv2_transport_controls_padding"
- android:visibility="visible">
-
- <ImageButton android:id="@+id/prev" style="@style/EmbeddedTransportControlsButton.Previous" />
- <ImageButton android:id="@+id/rew" style="@style/EmbeddedTransportControlsButton.Rew" />
- <ImageButton android:id="@+id/pause" style="@style/EmbeddedTransportControlsButton.Pause" />
- <ImageButton android:id="@+id/ffwd" style="@style/EmbeddedTransportControlsButton.Ffwd" />
- <ImageButton android:id="@+id/next" style="@style/EmbeddedTransportControlsButton.Next" />
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/full_landscape_music.xml b/packages/MediaComponents/res/layout/full_landscape_music.xml
deleted file mode 100644
index 8ce7058..0000000
--- a/packages/MediaComponents/res/layout/full_landscape_music.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#B300FF00"
- android:orientation="horizontal">
-
- <LinearLayout
- android:id="@+id/music_image"
- style="@style/FullMusicLandscape.Image">
-
- <ImageView
- android:id="@+id/album"
- android:layout_width="@dimen/mcv2_full_album_image_landscape_size"
- android:layout_height="@dimen/mcv2_full_album_image_landscape_size"
- android:src="@drawable/ic_default_album_image"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/music_text"
- style="@style/FullMusicLandscape.Text">
-
- <TextView
- android:id="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/mcv2_music_title_unknown_text"
- android:textSize="20sp"
- android:textStyle="bold"
- android:textColor="#FFFFFF" />
- <TextView
- android:id="@+id/artist"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/mcv2_music_artist_unknown_text"
- android:textSize="16sp"
- android:textColor="#BBBBBB" />
- </LinearLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/full_portrait_music.xml b/packages/MediaComponents/res/layout/full_portrait_music.xml
deleted file mode 100644
index 75f1bb3..0000000
--- a/packages/MediaComponents/res/layout/full_portrait_music.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <LinearLayout
- android:id="@+id/music_image"
- style="@style/FullMusicPortrait.Image">
-
- <ImageView
- android:id="@+id/album"
- android:layout_width="@dimen/mcv2_full_album_image_portrait_size"
- android:layout_height="@dimen/mcv2_full_album_image_portrait_size"
- android:src="@drawable/ic_default_album_image"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/music_text"
- style="@style/FullMusicPortrait.Text">
-
- <TextView
- android:id="@+id/title"
- android:layout_width="@dimen/mcv2_full_album_image_portrait_size"
- android:layout_height="wrap_content"
- android:text="@string/mcv2_music_title_unknown_text"
- android:textSize="20sp"
- android:textStyle="bold"
- android:textColor="#FFFFFF" />
- <TextView
- android:id="@+id/artist"
- android:layout_width="@dimen/mcv2_full_album_image_portrait_size"
- android:layout_height="wrap_content"
- android:text="@string/mcv2_music_artist_unknown_text"
- android:textSize="16sp"
- android:textColor="#BBBBBB" />
- </LinearLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/full_settings_list_item.xml b/packages/MediaComponents/res/layout/full_settings_list_item.xml
deleted file mode 100644
index f92ea5e..0000000
--- a/packages/MediaComponents/res/layout/full_settings_list_item.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/icon"
- android:layout_width="@dimen/mcv2_full_settings_icon_size"
- android:layout_height="@dimen/mcv2_full_settings_icon_size"
- android:layout_margin="8dp"
- android:gravity="center"/>
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/main_text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_text_height"
- android:paddingLeft="2dp"
- android:gravity="center"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_full_settings_main_text_size"/>
-
- <TextView
- android:id="@+id/sub_text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_text_height"
- android:layout_below="@id/main_text"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white_opacity_70"
- android:textSize="@dimen/mcv2_full_settings_sub_text_size"/>
- </RelativeLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/full_sub_settings_list_item.xml b/packages/MediaComponents/res/layout/full_sub_settings_list_item.xml
deleted file mode 100644
index 49128d0..0000000
--- a/packages/MediaComponents/res/layout/full_sub_settings_list_item.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/check"
- android:layout_width="@dimen/mcv2_full_settings_icon_size"
- android:layout_height="@dimen/mcv2_full_settings_icon_size"
- android:layout_margin="8dp"
- android:gravity="center"
- android:src="@drawable/ic_check"/>
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_text_height"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_full_settings_main_text_size"/>
- </RelativeLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/full_transport_controls.xml b/packages/MediaComponents/res/layout/full_transport_controls.xml
deleted file mode 100644
index 0914785..0000000
--- a/packages/MediaComponents/res/layout/full_transport_controls.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="horizontal"
- android:paddingLeft="@dimen/mcv2_transport_controls_padding"
- android:paddingRight="@dimen/mcv2_transport_controls_padding"
- android:visibility="visible">
-
- <ImageButton android:id="@+id/prev" style="@style/FullTransportControlsButton.Previous" />
- <ImageButton android:id="@+id/rew" style="@style/FullTransportControlsButton.Rew" />
- <ImageButton android:id="@+id/pause" style="@style/FullTransportControlsButton.Pause" />
- <ImageButton android:id="@+id/ffwd" style="@style/FullTransportControlsButton.Ffwd" />
- <ImageButton android:id="@+id/next" style="@style/FullTransportControlsButton.Next" />
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/media_controller.xml b/packages/MediaComponents/res/layout/media_controller.xml
deleted file mode 100644
index 4658f04..0000000
--- a/packages/MediaComponents/res/layout/media_controller.xml
+++ /dev/null
@@ -1,265 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:layoutDirection="ltr">
-
- <RelativeLayout
- android:id="@+id/title_bar"
- android:background="@layout/title_bar_gradient"
- style="@style/TitleBar">
-
- <LinearLayout
- android:id="@+id/title_bar_left"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:orientation="horizontal">
-
- <ImageButton
- android:id="@+id/back"
- android:clickable="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true"
- android:paddingLeft="5dip"
- android:visibility="visible"
- style="@style/TitleBarButton.Back"/>
-
- <TextView
- android:id="@+id/title_text"
- android:ellipsize="end"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/back"
- android:layout_centerVertical="true"
- android:maxLines="1"
- android:paddingLeft="5dip"
- android:paddingRight="5dip"
- android:textSize="15sp"
- android:textColor="#FFFFFFFF"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/title_bar_right"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:orientation="horizontal">
-
- <LinearLayout
- android:id="@+id/ad_external_link"
- android:clickable="true"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:paddingLeft="5dip"
- android:paddingRight="10dip"
- android:orientation="horizontal"
- android:visibility="gone">
-
- <TextView
- android:id="@+id/ad_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:paddingRight="5dip"
- android:text="@string/MediaControlView2_ad_text"
- android:textSize="10sp"
- android:textColor="#FFFFFFFF" />
-
- <ImageButton
- android:id="@+id/ad_launch"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- style="@style/TitleBarButton.Launch" />
- </LinearLayout>
-
- <view class="com.android.support.mediarouter.app.MediaRouteButton"
- android:id="@+id/cast"
- android:layout_centerVertical="true"
- android:visibility="gone"
- android:contentDescription="@string/mr_button_content_description"
- style="@style/TitleBarButton" />
- </LinearLayout>
-
- </RelativeLayout>
-
- <LinearLayout
- android:id="@+id/center_view"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:gravity="center"
- android:orientation="vertical">
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/minimal_extra_view"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="right">
-
- <ImageButton
- android:id="@+id/fullscreen"
- android:gravity="right"
- style="@style/BottomBarButton.FullScreen" />
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="@dimen/mcv2_custom_progress_thumb_size">
-
- <SeekBar
- android:id="@+id/progress"
- android:layout_width="match_parent"
- android:layout_height="@dimen/mcv2_custom_progress_thumb_size"
- android:contentDescription="@string/mcv2_seek_bar_desc"
- android:padding="0dp"
- android:maxHeight="@dimen/mcv2_custom_progress_max_size"
- android:minHeight="@dimen/mcv2_custom_progress_max_size"
- android:elevation="10dp"/>
-
- <View
- android:id="@+id/progress_buffer"
- android:layout_width="match_parent"
- android:layout_height="@dimen/mcv2_buffer_view_height"
- android:layout_alignParentBottom="true"
- android:background="@color/bottom_bar_background"
- android:elevation="0dp"/>
- </RelativeLayout>
-
- <RelativeLayout
- android:id="@+id/bottom_bar"
- android:layout_width="match_parent"
- android:layout_height="44dp"
- android:orientation="horizontal"
- android:background="@color/bottom_bar_background">
-
- <LinearLayout
- android:id="@+id/bottom_bar_left"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true">
-
- <TextView
- android:id="@+id/ad_skip_time"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_marginLeft="4dp"
- android:textSize="12sp"
- android:textColor="#FFFFFF"
- android:visibility="gone" />
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/time"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_toRightOf="@id/bottom_bar_left"
- android:paddingLeft="10dp"
- android:paddingRight="10dp"
- android:gravity="center" >
-
- <TextView
- android:id="@+id/time_current"
- style="@style/TimeText.Current"/>
- <TextView
- android:id="@+id/time_interpunct"
- style="@style/TimeText.Interpunct"/>
- <TextView
- android:id="@+id/time_end"
- style="@style/TimeText.End"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/bottom_bar_right"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:gravity="right">
-
- <LinearLayout
- android:id="@+id/basic_controls"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:orientation="horizontal" >
-
- <TextView
- android:id="@+id/ad_remaining"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:textSize="12sp"
- android:textColor="#FFFFFF"
- android:visibility="gone" />
-
- <ImageButton
- android:id="@+id/mute"
- style="@style/BottomBarButton.Mute" />
- <ImageButton
- android:id="@+id/subtitle"
- android:scaleType="fitCenter"
- android:visibility="gone"
- style="@style/BottomBarButton.CC" />
- <ImageButton
- android:id="@+id/fullscreen"
- style="@style/BottomBarButton.FullScreen"/>
- <ImageButton
- android:id="@+id/overflow_right"
- style="@style/BottomBarButton.OverflowRight"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/extra_controls"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:visibility="gone"
- android:orientation="horizontal"
- android:gravity="center_vertical">
-
- <LinearLayout
- android:id="@+id/custom_buttons"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <ImageButton
- android:id="@+id/video_quality"
- style="@style/BottomBarButton.VideoQuality" />
- <ImageButton
- android:id="@+id/settings"
- style="@style/BottomBarButton.Settings" />
- <ImageButton
- android:id="@+id/overflow_left"
- style="@style/BottomBarButton.OverflowLeft"/>
- </LinearLayout>
- </LinearLayout>
- </RelativeLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/minimal_transport_controls.xml b/packages/MediaComponents/res/layout/minimal_transport_controls.xml
deleted file mode 100644
index 800c80b..0000000
--- a/packages/MediaComponents/res/layout/minimal_transport_controls.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageButton android:id="@+id/pause" style="@style/MinimalTransportControlsButton" />
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/mr_chooser_dialog.xml b/packages/MediaComponents/res/layout/mr_chooser_dialog.xml
deleted file mode 100644
index ee89e16..0000000
--- a/packages/MediaComponents/res/layout/mr_chooser_dialog.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <TextView android:id="@+id/mr_chooser_title"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="24dp"
- android:paddingRight="24dp"
- android:paddingTop="24dp"
- android:text="@string/mr_chooser_title"
- android:singleLine="true"
- android:ellipsize="end"
- android:textAppearance="@style/TextAppearance.MediaRouter.Title" />
- <ListView android:id="@+id/mr_chooser_list"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:divider="@android:color/transparent"
- android:dividerHeight="0dp" />
- <LinearLayout android:id="@android:id/empty"
- android:layout_width="fill_parent"
- android:layout_height="240dp"
- android:orientation="vertical"
- android:paddingTop="90dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:visibility="gone">
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:text="@string/mr_chooser_searching"
- android:textAppearance="@style/TextAppearance.MediaRouter.SecondaryText" />
- <ProgressBar android:layout_width="150dp"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:indeterminate="true"
- style="?android:attr/progressBarStyleHorizontal" />
- </LinearLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/mr_chooser_list_item.xml b/packages/MediaComponents/res/layout/mr_chooser_list_item.xml
deleted file mode 100644
index 958879b..0000000
--- a/packages/MediaComponents/res/layout/mr_chooser_list_item.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:minHeight="56dp"
- android:paddingLeft="24dp"
- android:paddingRight="24dp"
- android:orientation="horizontal"
- android:gravity="center_vertical" >
-
- <ImageView android:id="@+id/mr_chooser_route_icon"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_marginRight="24dp" />
-
- <LinearLayout android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="1dp"
- android:orientation="vertical" >
-
- <TextView android:id="@+id/mr_chooser_route_name"
- android:layout_width="fill_parent"
- android:layout_height="32dp"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="@style/TextAppearance.MediaRouter.PrimaryText" />
-
- <TextView android:id="@+id/mr_chooser_route_desc"
- android:layout_width="fill_parent"
- android:layout_height="24dp"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="@style/TextAppearance.MediaRouter.SecondaryText" />
- </LinearLayout>
-
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/mr_controller_material_dialog_b.xml b/packages/MediaComponents/res/layout/mr_controller_material_dialog_b.xml
deleted file mode 100644
index f6f7be5..0000000
--- a/packages/MediaComponents/res/layout/mr_controller_material_dialog_b.xml
+++ /dev/null
@@ -1,206 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/mr_expandable_area"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <LinearLayout android:id="@+id/mr_dialog_area"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:orientation="vertical"
- android:background="?android:attr/colorBackgroundFloating">
- <LinearLayout android:id="@+id/mr_title_bar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="24dp"
- android:paddingRight="12dp"
- android:orientation="horizontal" >
- <TextView android:id="@+id/mr_name"
- android:layout_width="0dp"
- android:layout_height="72dp"
- android:layout_weight="1"
- android:gravity="center_vertical"
- android:singleLine="true"
- android:ellipsize="end"
- android:textAppearance="@style/TextAppearance.MediaRouter.Title" />
- <ImageButton android:id="@+id/mr_close"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_gravity="center_vertical"
- android:contentDescription="@string/mr_controller_close_description"
- android:src="?attr/mediaRouteCloseDrawable"
- android:background="?android:attr/selectableItemBackgroundBorderless" />
- </LinearLayout>
- <FrameLayout android:id="@+id/mr_custom_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:visibility="gone" />
- <FrameLayout android:id="@+id/mr_default_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <ImageView android:id="@+id/mr_art"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:scaleType="fitXY"
- android:background="?android:attr/colorPrimary"
- android:layout_gravity="top"
- android:contentDescription="@string/mr_controller_album_art"
- android:visibility="gone" />
- <LinearLayout android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_gravity="bottom"
- android:splitMotionEvents="false">
- <LinearLayout android:id="@+id/mr_media_main_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:layout_gravity="bottom"
- android:theme="?attr/mediaRouteControlPanelThemeOverlay">
- <RelativeLayout
- android:id="@+id/mr_playback_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingLeft="24dp"
- android:paddingRight="12dp" >
- <ImageButton android:id="@+id/mr_control_playback_ctrl"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="12dp"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:contentDescription="@string/mr_controller_play"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:visibility="gone" />
- <LinearLayout android:id="@+id/mr_control_title_container"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/mr_control_playback_ctrl"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true">
- <TextView android:id="@+id/mr_control_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.MediaRouter.PrimaryText"
- android:singleLine="true" />
- <TextView android:id="@+id/mr_control_subtitle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.MediaRouter.SecondaryText"
- android:singleLine="true" />
- </LinearLayout>
- </RelativeLayout>
- <View android:id="@+id/mr_control_divider"
- android:layout_width="fill_parent"
- android:layout_height="8dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/mr_volume_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:minHeight="48dp"
- android:gravity="center_vertical"
- android:paddingLeft="24dp"
- android:paddingRight="12dp"
- android:splitMotionEvents="false">
- <ImageView
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:src="?attr/mediaRouteAudioTrackDrawable"
- android:gravity="center"
- android:scaleType="center"/>
- <!-- Since dialog's top layout mr_expandable_area is clickable, it propagates pressed state
- to its non-clickable children. Specify android:clickable="true" to prevent volume slider
- from having false pressed state. -->
- <com.android.support.mediarouter.app.MediaRouteVolumeSlider
- android:id="@+id/mr_volume_slider"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:minHeight="48dp"
- android:maxHeight="48dp"
- android:layout_weight="1"
- android:clickable="true"
- android:contentDescription="@string/mr_controller_volume_slider" />
- <com.android.support.mediarouter.app.MediaRouteExpandCollapseButton
- android:id="@+id/mr_group_expand_collapse"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:padding="12dp"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:visibility="gone"/>
- </LinearLayout>
- </LinearLayout>
- <com.android.support.mediarouter.app.OverlayListView
- android:id="@+id/mr_volume_group_list"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/mr_controller_volume_group_list_padding_top"
- android:scrollbarStyle="outsideOverlay"
- android:clipToPadding="false"
- android:visibility="gone"
- android:splitMotionEvents="false"
- android:theme="?attr/mediaRouteControlPanelThemeOverlay" />
- </LinearLayout>
- </FrameLayout>
- <ScrollView
- android:id="@+id/buttonPanel"
- style="?attr/buttonBarStyle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:fillViewport="true"
- android:scrollIndicators="top|bottom">
- <androidx.appcompat.widget.ButtonBarLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="bottom"
- android:layoutDirection="locale"
- android:orientation="horizontal"
- android:paddingBottom="4dp"
- android:paddingLeft="12dp"
- android:paddingRight="12dp"
- android:paddingTop="4dp">
- <Button
- android:id="@android:id/button3"
- style="?android:attr/buttonBarNeutralButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <androidx.legacy.widget.Space
- android:id="@+id/spacer"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:visibility="invisible"/>
- <Button
- android:id="@android:id/button2"
- style="?android:attr/buttonBarNegativeButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <Button
- android:id="@android:id/button1"
- style="?android:attr/buttonBarPositiveButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </androidx.appcompat.widget.ButtonBarLayout>
- </ScrollView>
- </LinearLayout>
-</FrameLayout>
diff --git a/packages/MediaComponents/res/layout/mr_controller_volume_item.xml b/packages/MediaComponents/res/layout/mr_controller_volume_item.xml
deleted file mode 100644
index 12d85ae..0000000
--- a/packages/MediaComponents/res/layout/mr_controller_volume_item.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <LinearLayout android:id="@+id/volume_item_container"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/mr_controller_volume_group_list_item_height"
- android:paddingLeft="24dp"
- android:paddingRight="60dp"
- android:paddingBottom="8dp"
- android:orientation="vertical" >
- <TextView android:id="@+id/mr_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.MediaRouter.SecondaryText"
- android:singleLine="true" />
- <LinearLayout android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_vertical">
- <ImageView android:id="@+id/mr_volume_item_icon"
- android:layout_width="@dimen/mr_controller_volume_group_list_item_icon_size"
- android:layout_height="@dimen/mr_controller_volume_group_list_item_icon_size"
- android:layout_marginTop="8dp"
- android:layout_marginBottom="8dp"
- android:scaleType="fitCenter"
- android:src="?attr/mediaRouteAudioTrackDrawable" />
- <androidx.mediarouter.app.MediaRouteVolumeSlider
- android:id="@+id/mr_volume_slider"
- android:layout_width="fill_parent"
- android:layout_height="40dp"
- android:minHeight="40dp"
- android:maxHeight="40dp"
- android:contentDescription="@string/mr_controller_volume_slider" />
- </LinearLayout>
- </LinearLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/settings_list.xml b/packages/MediaComponents/res/layout/settings_list.xml
deleted file mode 100644
index ea30538..0000000
--- a/packages/MediaComponents/res/layout/settings_list.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="@dimen/mcv2_embedded_settings_width"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:divider="@null"
- android:dividerHeight="0dp">
-</ListView>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/title_bar_gradient.xml b/packages/MediaComponents/res/layout/title_bar_gradient.xml
deleted file mode 100644
index ab1fc6e..0000000
--- a/packages/MediaComponents/res/layout/title_bar_gradient.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <gradient
- android:startColor="@color/title_bar_gradient_start"
- android:endColor="@color/title_bar_gradient_end"
- android:angle="-270" />
-</shape>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/values-af/strings.xml b/packages/MediaComponents/res/values-af/strings.xml
deleted file mode 100644
index 47230ad..0000000
--- a/packages/MediaComponents/res/values-af/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Stelsel"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Toestelle"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knoppie"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Uitsaai-knoppie. Ontkoppel"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Uitsaai-knoppie. Koppel tans"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Uitsaai-knoppie. Gekoppel"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Saai uit na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Vind tans toestelle"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ontkoppel"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Hou op uitsaai"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Maak toe"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Speel"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Laat wag"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Vou uit"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Vou in"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumkunswerk"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volumeglyer"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media is gekies nie"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen inligting beskikbaar nie"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Saai tans skerm uit"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-am/strings.xml b/packages/MediaComponents/res/values-am/strings.xml
deleted file mode 100644
index 39a1903..0000000
--- a/packages/MediaComponents/res/values-am/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ስርዓት"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"መሣሪያዎች"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"የCast አዝራር"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast አዝራር። ግንኙነት ተቋርጧል"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast አዝራር በማገናኘት ላይ"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast አዝራር። ተገናኝቷል"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast አድርግ ወደ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"መሣሪያዎችን በማግኘት ላይ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ግንኙነት አቋርጥ"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Cast ማድረግ አቁም"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ዝጋ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"አጫውት"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ለአፍታ አቁም"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"አቁም"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"አስፋ"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ሰብስብ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"የአልበም ስነ-ጥበብ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ተንሸራታች የድምፅ መቆጣጠሪያ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ምንም ማህደረመረጃ አልተመረጠም"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ምንም መረጃ አይገኝም"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ማያ ገጽን በመውሰድ ላይ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ar/strings.xml b/packages/MediaComponents/res/values-ar/strings.xml
deleted file mode 100644
index f8fb97d..0000000
--- a/packages/MediaComponents/res/values-ar/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"النظام"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"الأجهزة"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"زر الإرسال"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"زر الإرسال. تم قطع الاتصال"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"زر الإرسال. جارٍ الاتصال"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"زر الإرسال. تم الاتصال"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"إرسال إلى"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"جارٍ البحث عن أجهزة"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع الاتصال"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"إيقاف الإرسال"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"إغلاق"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"تشغيل"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"إيقاف مؤقت"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"إيقاف"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"توسيع"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"تصغير"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"صورة الألبوم"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"شريط تمرير مستوى الصوت"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"لم يتم اختيار أي وسائط"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"لا تتوفر أي معلومات"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"جارٍ إرسال الشاشة"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-az/strings.xml b/packages/MediaComponents/res/values-az/strings.xml
deleted file mode 100644
index a3c60ab..0000000
--- a/packages/MediaComponents/res/values-az/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Yayım düyməsi"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Yayım düyməsi. Bağlantı kəsildi"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Yayım düyməsi. Qoşulur"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Yayım düyməsi. Qoşuldu"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Bura yayımlayın"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar axtarılır"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantını kəsin"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Yayımı dayandırın"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Qapadın"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Oynadın"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Durdurun"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Dayandırın"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişləndirin"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yığcamlaşdırın"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albom incəsənəti"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Səs hərmi diyircəyi"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Heç bir media seçilməyib"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Əlçatan məlumat yoxdur"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayımlanır"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-b+sr+Latn/strings.xml b/packages/MediaComponents/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index e25bd6e..0000000
--- a/packages/MediaComponents/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme Prebaci"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme Prebaci. Veza je prekinuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme Prebaci. Povezuje se"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme Prebaci. Povezan je"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Prebacuj na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Pronalaženje uređaja"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zaustavi prebacivanje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvori"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Pusti"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziraj"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zaustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skupi"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Omot albuma"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za jačinu zvuka"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nema izabranih medija"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nisu dostupne nikakve informacije"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prebacuje se ekran"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-be/strings.xml b/packages/MediaComponents/res/values-be/strings.xml
deleted file mode 100644
index ac391c1..0000000
--- a/packages/MediaComponents/res/values-be/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Сістэма"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Прылады"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляцыі"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляцыі. Адключана"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляцыі. Ідзе падключэнне"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляцыі. Падключана"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Трансліраваць на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук прылад"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Адлучыць"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Спыніць трансляцыю"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыць"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Прайграць"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Прыпыніць"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Спыніць"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгарнуць"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згарнуць"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Вокладка альбома"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Паўзунок гучнасці"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медыяфайл не выбраны"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Інфармацыя адсутнічае"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экран трансляцыі"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-bg/strings.xml b/packages/MediaComponents/res/values-bg/strings.xml
deleted file mode 100644
index 76712d4..0000000
--- a/packages/MediaComponents/res/values-bg/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Бутон за предаване"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Бутон за предаване. Връзката е прекратена"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Бутон за предаване. Свързва се"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Бутон за предаване. Установена е връзка"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Предаване към"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Търсят се устройства"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекратяване на връзката"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Спиране на предаването"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затваряне"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Пускане"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Поставяне на пауза"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Спиране"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгъване"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свиване"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Обложка на албума"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Плъзгач за силата на звука"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Няма избрана мултимедия"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Няма налична информация"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранът се предава"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-bn/strings.xml b/packages/MediaComponents/res/values-bn/strings.xml
deleted file mode 100644
index 1bf5932..0000000
--- a/packages/MediaComponents/res/values-bn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"সিস্টেম"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ডিভাইসগুলি"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"কাস্ট করার বোতাম"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"কাস্ট করার বোতাম৷ সংযোগ বিচ্ছিন্ন হয়েছে"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"কাস্ট করার বোতাম৷ সংযোগ করা হচ্ছে"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"কাস্ট করার বোতাম৷ সংযুক্ত হয়েছে"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"এতে কাস্ট করুন"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ডিভাইসগুলিকে খোঁজা হচ্ছে"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"সংযোগ বিচ্ছিন্ন করুন"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"কাস্ট করা বন্ধ করুন"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"বন্ধ করুন"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"চালান"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"বিরাম দিন"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"থামান"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"বড় করুন"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"সঙ্কুচিত করুন"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"অ্যালবাম শৈলি"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ভলিউম স্লাইডার"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"কোনো মিডিয়া নির্বাচন করা হয়নি"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"কোনো তথ্য উপলব্ধ নেই"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"স্ক্রীন কাস্ট করা হচ্ছে"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-bs/strings.xml b/packages/MediaComponents/res/values-bs/strings.xml
deleted file mode 100644
index 711c742..0000000
--- a/packages/MediaComponents/res/values-bs/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme za emitiranje"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme za emitiranje. Veza je prekinuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme za emitiranje. Povezivanje"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme za emitiranje. Povezano"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zaustavi prebacivanje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvori"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduciraj"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziraj"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zaustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skupi"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Omot albuma"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za jačinu zvuka"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nijedan medij nije odabran"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nema dostupnih informacija"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prebacuje se ekran"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ca/strings.xml b/packages/MediaComponents/res/values-ca/strings.xml
deleted file mode 100644
index bf85acf..0000000
--- a/packages/MediaComponents/res/values-ca/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositius"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botó d\'emetre"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botó Emet. Desconnectat."</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botó Emet. S\'està connectant."</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botó Emet. Connectat."</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emet a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"S\'estan cercant dispositius"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconnecta"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Atura l\'emissió"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tanca"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reprodueix"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Posa en pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Atura"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Desplega"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Replega"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Imatge de l\'àlbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control lliscant de volum"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No s\'ha seleccionat cap fitxer multimèdia"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hi ha informació disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emissió de pantalla"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-cs/strings.xml b/packages/MediaComponents/res/values-cs/strings.xml
deleted file mode 100644
index 09a8920..0000000
--- a/packages/MediaComponents/res/values-cs/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Zařízení"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tlačítko odesílání"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tlačítko odesílání. Odpojeno"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tlačítko odesílání. Připojování"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tlačítko odesílání. Připojeno"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Odesílat do"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Hledání zařízení"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojit"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zastavit odesílání"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavřít"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Přehrát"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastavit"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zastavit"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbalit"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sbalit"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Obal alba"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Posuvník hlasitosti"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nebyla vybrána žádná média"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nejsou k dispozici žádné informace"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Odesílání obsahu obrazovky"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-da/strings.xml b/packages/MediaComponents/res/values-da/strings.xml
deleted file mode 100644
index 8e7a790..0000000
--- a/packages/MediaComponents/res/values-da/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheder"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knap"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knap. Forbindelsen er afbrudt"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knap. Opretter forbindelse"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knap. Tilsluttet"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finder enheder"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Afbryd"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop med at caste"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Luk"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Afspil"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sæt på pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Udvid"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafik"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Lydstyrkeskyder"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ingen medier er markeret"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Der er ingen tilgængelige oplysninger"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skærmen castes"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-de/strings.xml b/packages/MediaComponents/res/values-de/strings.xml
deleted file mode 100644
index 26bf57c..0000000
--- a/packages/MediaComponents/res/values-de/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Geräte"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-Symbol"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Streaming-Schaltfläche. Nicht verbunden"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Streaming-Schaltfläche. Verbindung wird hergestellt"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Streaming-Schaltfläche. Verbunden"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Streamen auf"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Geräte werden gesucht."</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Verbindung trennen"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Streaming beenden"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Schließen"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Wiedergeben"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausieren"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Beenden"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Maximieren"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minimieren"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumcover"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Schieberegler für die Lautstärke"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Keine Medien ausgewählt"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Keine Informationen verfügbar"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Bildschirm wird gestreamt."</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-el/strings.xml b/packages/MediaComponents/res/values-el/strings.xml
deleted file mode 100644
index d82f69b..0000000
--- a/packages/MediaComponents/res/values-el/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Σύστημα"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Συσκευές"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Κουμπί Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Κουμπί μετάδοσης. Αποσυνδέθηκε"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Κουμπί μετάδοση. Σύνδεση σε εξέλιξη"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Κουμπί μετάδοσης. Συνδέθηκε"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Μετάδοση σε"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Εύρεση συσκευών"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Αποσύνδεση"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Διακοπή μετάδοσης"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Κλείσιμο"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Αναπαραγωγή"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Παύση"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Διακοπή"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ανάπτυξη"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Σύμπτυξη"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Εξώφυλλο άλμπουμ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ρυθμιστικό έντασης ήχου"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Δεν έχουν επιλεγεί μέσα"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Δεν υπάρχουν διαθέσιμες πληροφορίες"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Μετάδοση οθόνης"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rAU/strings.xml b/packages/MediaComponents/res/values-en-rAU/strings.xml
deleted file mode 100644
index dd3f219..0000000
--- a/packages/MediaComponents/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rCA/strings.xml b/packages/MediaComponents/res/values-en-rCA/strings.xml
deleted file mode 100644
index dd3f219..0000000
--- a/packages/MediaComponents/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rGB/strings.xml b/packages/MediaComponents/res/values-en-rGB/strings.xml
deleted file mode 100644
index dd3f219..0000000
--- a/packages/MediaComponents/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rIN/strings.xml b/packages/MediaComponents/res/values-en-rIN/strings.xml
deleted file mode 100644
index dd3f219..0000000
--- a/packages/MediaComponents/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rXC/strings.xml b/packages/MediaComponents/res/values-en-rXC/strings.xml
deleted file mode 100644
index a87007e..0000000
--- a/packages/MediaComponents/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-es-rUS/strings.xml b/packages/MediaComponents/res/values-es-rUS/strings.xml
deleted file mode 100644
index 441ead1..0000000
--- a/packages/MediaComponents/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón para transmitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón para transmitir (desconectado)"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón para transmitir (conectando)"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón para transmitir (conectado)"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Detener la transmisión"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Detener"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Imagen del álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control deslizante del volumen"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se seleccionó ningún contenido multimedia"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Sin información disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitiendo pantalla"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-es/strings.xml b/packages/MediaComponents/res/values-es/strings.xml
deleted file mode 100644
index ff43008..0000000
--- a/packages/MediaComponents/res/values-es/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón de enviar"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón de enviar. Desconectado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón de enviar. Conectando"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón de enviar. Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Enviar a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Detener envío de contenido"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Detener"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Portada del álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control deslizante de volumen"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se ha seleccionado ningún medio"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hay información disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Enviando pantalla"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-et/strings.xml b/packages/MediaComponents/res/values-et/strings.xml
deleted file mode 100644
index 453235b..0000000
--- a/packages/MediaComponents/res/values-et/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Süsteem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Seadmed"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Ülekandenupp"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Ülekandenupp. Ühendus on katkestatud"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Ülekandenupp. Ühendamine"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Ülekandenupp. Ühendatud"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Ülekandmine seadmesse"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Seadmete otsimine"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkesta ühendus"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Peata ülekandmine"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulgemine"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Esitamine"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Peatamine"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Peata"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laiendamine"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ahendamine"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumi kujundus"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Helitugevuse liugur"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Meediat pole valitud"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Teave puudub"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekraanikuva ülekandmine"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-eu/strings.xml b/packages/MediaComponents/res/values-eu/strings.xml
deleted file mode 100644
index dba19e4..0000000
--- a/packages/MediaComponents/res/values-eu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Gailuak"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Igorri botoia"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Igortzeko botoia. Deskonektatuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Igortzeko botoia. Konektatzen"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Igortzeko botoia. Konektatuta"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Igorri hona:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Gailuak bilatzen"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deskonektatu"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Utzi igortzeari"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Itxi"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Erreproduzitu"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausatu"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Gelditu"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zabaldu"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tolestu"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumaren azala"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Bolumenaren graduatzailea"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ez da hautatu multimedia-edukirik"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ez dago informaziorik"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Pantaila igortzen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-fa/strings.xml b/packages/MediaComponents/res/values-fa/strings.xml
deleted file mode 100644
index 4c6c779..0000000
--- a/packages/MediaComponents/res/values-fa/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"سیستم"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"دستگاهها"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"دکمه ارسال محتوا"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"دکمه فرستادن. ارتباط قطع شد"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"دکمه فرستادن. درحال مرتبطسازی"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"دکمه فرستادن. مرتبط شد"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ارسال محتوا به"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"پیدا کردن دستگاهها"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع ارتباط"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"توقف ارسال محتوا"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"بستن"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"پخش"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"مکث"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"توقف"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"بزرگ کردن"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"کوچک کردن"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"عکس روی جلد آلبوم"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"لغزنده میزان صدا"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"رسانه انتخاب نشده است"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"اطلاعات در دسترس نیست"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"درحال فرستادن صفحه"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-fi/strings.xml b/packages/MediaComponents/res/values-fi/strings.xml
deleted file mode 100644
index d683435..0000000
--- a/packages/MediaComponents/res/values-fi/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Järjestelmä"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Laitteet"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-painike"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-painike. Yhteys katkaistu"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-painike. Yhdistetään"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-painike. Yhdistetty"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Suoratoiston kohde"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Etsitään laitteita"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkaise yhteys"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Lopeta suoratoisto"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulje"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Toista"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Keskeytä"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Pysäytä"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laajenna"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tiivistä"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumin kansikuva"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Äänenvoimakkuuden liukusäädin"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ei valittua mediaa."</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tietoja ei ole saatavilla"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Suoratoistetaan näyttöä"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-fr-rCA/strings.xml b/packages/MediaComponents/res/values-fr-rCA/strings.xml
deleted file mode 100644
index c4f984b..0000000
--- a/packages/MediaComponents/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Bouton Diffuser"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Bouton Diffuser. Déconnecté"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Bouton Diffuser. Connexion en cours…"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Bouton Diffuser. Connecté"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Diffuser sur"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Se déconnecter"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Arrêter la diffusion"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lire"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Interrompre"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Arrêter"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Image de l\'album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Curseur de réglage du volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-fr/strings.xml b/packages/MediaComponents/res/values-fr/strings.xml
deleted file mode 100644
index 12c312f..0000000
--- a/packages/MediaComponents/res/values-fr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Icône Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Icône Cast. Déconnecté"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Icône Cast. Connexion…"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Icône Cast. Connecté"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Caster sur"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils…"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Déconnecter"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Arrêter la diffusion"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lecture"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Arrêter"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Image de l\'album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Curseur de volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours…"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-gl/strings.xml b/packages/MediaComponents/res/values-gl/strings.xml
deleted file mode 100644
index 1b2c354..0000000
--- a/packages/MediaComponents/res/values-gl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón de emitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón de emitir. Desconectado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón de emitir. Conectando"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón de emitir. Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitir a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Deter emisión"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Pechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduce"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Deter"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ampliar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Contraer"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Portada do álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control desprazable do volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Non se seleccionaron recursos"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Non hai información dispoñible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emisión de pantalla"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-gu/strings.xml b/packages/MediaComponents/res/values-gu/strings.xml
deleted file mode 100644
index 2cd5f3f..0000000
--- a/packages/MediaComponents/res/values-gu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"સિસ્ટમ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ઉપકરણો"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"કાસ્ટ કરો બટન"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"કાસ્ટ કરો બટન. ડિસ્કનેક્ટ કર્યું"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"કાસ્ટ કરો બટન. કનેક્ટ થઈ રહ્યું છે"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"કાસ્ટ કરો બટન. કનેક્ટ થયું"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"આના પર કાસ્ટ કરો"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ઉપકરણો શોધી રહ્યાં છીએ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ડિસ્કનેક્ટ કરો"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"કાસ્ટ કરવાનું રોકો"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"બંધ કરો"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ચલાવો"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"થોભાવો"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"રોકો"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"વિસ્તૃત કરો"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"સંકુચિત કરો"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"આલ્બમ કલા"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"વૉલ્યુમ સ્લાઇડર"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"કોઈ મીડિયા પસંદ કરેલ નથી"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"કોઈ માહિતી ઉપલબ્ધ નથી"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"સ્ક્રીનને કાસ્ટ કરી રહ્યાં છે"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-hi/strings.xml b/packages/MediaComponents/res/values-hi/strings.xml
deleted file mode 100644
index 9552a59..0000000
--- a/packages/MediaComponents/res/values-hi/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिवाइस"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट करें बटन"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"कास्ट करें बटन. डिसकनेक्ट है"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"कास्ट करें बटन. कनेक्ट हो रहा है"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"कास्ट करें बटन. कनेक्ट है"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"इस पर कास्ट करें"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"डिवाइस ढूंढ रहा है"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिसकनेक्ट करें"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"कास्ट करना बंद करें"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करें"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"चलाएं"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"रोकें"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"बंद करें"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तार करें"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"छोटा करें"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"एल्बम आर्ट"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"वॉल्यूम स्लाइडर"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कोई मीडिया चयनित नहीं है"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोई जानकारी मौजूद नहीं है"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट हो रही है"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-hr/strings.xml b/packages/MediaComponents/res/values-hr/strings.xml
deleted file mode 100644
index 3c43ee7..0000000
--- a/packages/MediaComponents/res/values-hr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sustav"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za emitiranje"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Gumb za emitiranje. Veza prekinuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Gumb za emitiranje. Povezivanje"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Gumb za emitiranje. Povezan"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zaustavi emitiranje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvaranje"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reprodukcija"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziranje"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zaustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširivanje"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sažimanje"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Naslovnica albuma"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za glasnoću"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nije odabran nijedan medij"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacije nisu dostupne"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emitiranje zaslona"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-hu/strings.xml b/packages/MediaComponents/res/values-hu/strings.xml
deleted file mode 100644
index a36bdfe..0000000
--- a/packages/MediaComponents/res/values-hu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Rendszer"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Eszközök"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Átküldés gomb"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Átküldés gomb. Kapcsolat bontva"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Átküldés gomb. Csatlakozás"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Átküldés gomb. Csatlakoztatva"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Átküldés ide"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Eszközök keresése"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Leválasztás"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Átküldés leállítása"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Bezárás"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lejátszás"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Szüneteltetés"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Leállítás"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kibontás"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Összecsukás"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Lemezborító"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Hangerőszabályzó"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nincs média kiválasztva"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nincs információ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Képernyőtartalom átküldése"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-hy/strings.xml b/packages/MediaComponents/res/values-hy/strings.xml
deleted file mode 100644
index 8ec82b7..0000000
--- a/packages/MediaComponents/res/values-hy/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Համակարգ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Սարքեր"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Հեռարձակման կոճակ"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Հեռարձակման կոճակ: Սարքն անջատված է"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Հեռարձակման կոճակ: Սարքը կապակցվում է"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Հեռարձակման կոճակ: Սարքը կապակցված է"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Ընտրեք սարքը"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Սարքերի որոնում"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Անջատել"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Դադարեցնել հեռարձակումը"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Փակել"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Նվագարկել"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Դադար"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Դադարեցնել"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ընդարձակել"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Կոծկել"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Ալբոմի շապիկ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ձայնի ուժգնության կարգավորիչ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Մեդիա ֆայլեր չեն ընտրվել"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Տեղեկությունները հասանելի չեն"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Էկրանը հեռարձակվում է"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-in/strings.xml b/packages/MediaComponents/res/values-in/strings.xml
deleted file mode 100644
index 6b2752e..0000000
--- a/packages/MediaComponents/res/values-in/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Perangkat"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tombol Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tombol Cast. Terputus"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tombol Cast. Menghubungkan"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tombol Cast. Terhubung"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmisikan ke"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari perangkat"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Hentikan cast"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Putar"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Berhenti"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Luaskan"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ciutkan"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Sampul album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Bilah geser volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tidak ada media yang dipilih"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tidak ada info yang tersedia"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmisi layar"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-is/strings.xml b/packages/MediaComponents/res/values-is/strings.xml
deleted file mode 100644
index 6a35ea6..0000000
--- a/packages/MediaComponents/res/values-is/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Kerfi"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Tæki"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Útsendingarhnappur"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Útsendingarhnappur. Aftengt"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Útsendingarhnappur. Tengist"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Útsendingarhnappur. Tengt"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Senda út í"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Leitað að tækjum"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Aftengjast"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stöðva útsendingu"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Loka"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spila"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Hlé"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stöðva"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Stækka"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minnka"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Plötuumslag"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Hljóðstyrkssleði"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Enginn miðill valinn"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Engar upplýsingar í boði"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skjár sendur út"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-it/strings.xml b/packages/MediaComponents/res/values-it/strings.xml
deleted file mode 100644
index 716e3ac..0000000
--- a/packages/MediaComponents/res/values-it/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivi"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Pulsante Trasmetti"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Pulsante Trasmetti. Disconnesso"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Pulsante Trasmetti. Connessione in corso"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Pulsante Trasmetti. Connesso"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Trasmetti a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Ricerca di dispositivi in corso"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Scollega"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Interrompi trasmissione"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Chiudi"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Riproduci"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Interrompi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Espandi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Comprimi"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Copertina"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Dispositivo di scorrimento del volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nessun contenuto multimediale selezionato"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nessuna informazione disponibile"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Trasmissione dello schermo in corso"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-iw/strings.xml b/packages/MediaComponents/res/values-iw/strings.xml
deleted file mode 100644
index 252b0ce..0000000
--- a/packages/MediaComponents/res/values-iw/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"מערכת"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"מכשירים"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"לחצן הפעלת Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"לחצן הפעלת Cast. מנותק"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"לחצן הפעלת Cast. מתחבר"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"לחצן הפעלת Cast. מחובר"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"העברה אל"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"מחפש מכשירים"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"נתק"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"הפסק את ההעברה"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"סגור"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"הפעל"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"השהה"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"הפסק"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"הרחב"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"כווץ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"עטיפת אלבום"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"מחוון עוצמה"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"לא נבחרה מדיה"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"אין מידע זמין"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"העברת מסך מתבצעת"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ja/strings.xml b/packages/MediaComponents/res/values-ja/strings.xml
deleted file mode 100644
index a149727..0000000
--- a/packages/MediaComponents/res/values-ja/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"システム"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"端末"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"キャストアイコン"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"キャスト アイコン。接続解除済み"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"キャスト アイコン。接続中"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"キャスト アイコン。接続済み"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"キャストするデバイス"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"端末を検索しています"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"接続を解除"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"キャストを停止"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"閉じる"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"再生"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"一時停止"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"折りたたむ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"アルバムアート"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量スライダー"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"メディアが選択されていません"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"情報がありません"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"画面をキャストしています"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ka/strings.xml b/packages/MediaComponents/res/values-ka/strings.xml
deleted file mode 100644
index 3da081a..0000000
--- a/packages/MediaComponents/res/values-ka/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"სისტემა"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"მოწყობილობები"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ტრანსლირების ღილაკი"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ტრანსლირების ღილაკი. გათიშული"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ტრანსლირების ღილაკი. მიმდინარეობს დაკავშირება"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ტრანსლირების ღილაკი. დაკავშირებული"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირება:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"მოწყობილობების მოძიება..."</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"კავშირის გაწყვეტა"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ტრანსლირების შეწყვეტა"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"დახურვა"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"დაკვრა"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"პაუზა"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"შეწყვეტა"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"გაშლა"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ჩაკეცვა"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ალბომის გარეკანი"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ხმის სლაიდერი"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"მედია არჩეული არ არის"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"მიმდინარეობს ეკრანის გადაცემა"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-kk/strings.xml b/packages/MediaComponents/res/values-kk/strings.xml
deleted file mode 100644
index 94dcbb3..0000000
--- a/packages/MediaComponents/res/values-kk/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Жүйе"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Құрылғылар"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Трансляциялау түймесі"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"\"Трансляциялау\" түймесі. Ажыратулы"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"\"Трансляциялау\" түймесі. Қосылуда"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"\"Трансляциялау\" түймесі. Қосылды"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Келесіге трансляциялау"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Құрылғыларды табу"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажырату"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Трансляциялауды тоқтату"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабу"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Ойнату"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Кідірту"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Тоқтату"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жаю"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жию"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Альбом шебері"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Дыбыс деңгейінің жүгірткісі"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ешбір тасушы таңдалмаған"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Қол жетімді ақпарат жоқ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экранды трансляциялау"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-km/strings.xml b/packages/MediaComponents/res/values-km/strings.xml
deleted file mode 100644
index e44780e..0000000
--- a/packages/MediaComponents/res/values-km/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ប្រព័ន្ធ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ឧបករណ៍"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ប៊ូតុងខាស"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ខាសប៊ូតុង៖ បានកាត់ផ្តាច់"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ខាសប៊ូតុង៖ កំពុងភ្ជាប់"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ខាសប៊ូតុង៖ បានភ្ជាប់ហើយ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"បញ្ជូនទៅ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"កំពុងស្វែងរកឧបករណ៍"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ផ្ដាច់"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ឈប់ភ្ជាប់"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"បិទ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ចាក់"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ផ្អាក"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ឈប់"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ពង្រីក"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"បង្រួម"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ស្នាដៃសិល្បៈអាល់ប៊ុម"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"របារកម្រិតសំឡេង"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"គ្មានការជ្រើសមេឌៀទេ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"មិនមានព័ត៌មានទេ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"កំពុងខាសអេក្រង់"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-kn/strings.xml b/packages/MediaComponents/res/values-kn/strings.xml
deleted file mode 100644
index 4237fdd..0000000
--- a/packages/MediaComponents/res/values-kn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ಸಿಸ್ಟಂ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ಸಾಧನಗಳು"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ಬಿತ್ತರಿಸು ಬಟನ್"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ಇದಕ್ಕೆ ಬಿತ್ತರಿಸಿ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸಿ"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ಮುಚ್ಚು"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ಪ್ಲೇ ಮಾಡಿ"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ವಿರಾಮ"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ನಿಲ್ಲಿಸಿ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ವಿಸ್ತರಿಸು"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ಸಂಕುಚಿಸು"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ಆಲ್ಬಮ್ ಕಲೆ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ವಾಲ್ಯೂಮ್ ಸ್ಲೈಡರ್"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ಯಾವುದೇ ಮಾಧ್ಯಮ ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ಯಾವುದೇ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ಪರದೆಯನ್ನು ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ko/strings.xml b/packages/MediaComponents/res/values-ko/strings.xml
deleted file mode 100644
index be893a9..0000000
--- a/packages/MediaComponents/res/values-ko/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"시스템"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"기기"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"전송 버튼"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"전송 버튼. 연결 해제됨"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"전송 버튼. 연결 중"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"전송 버튼. 연결됨"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"전송할 기기"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"기기를 찾는 중"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"연결 해제"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"전송 중지"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"닫기"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"재생"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"일시중지"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"중지"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"펼치기"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"접기"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"앨범아트"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"볼륨 슬라이더"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"선택한 미디어 없음"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"정보가 없습니다."</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"화면 전송 중"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ky/strings.xml b/packages/MediaComponents/res/values-ky/strings.xml
deleted file mode 100644
index 57813af..0000000
--- a/packages/MediaComponents/res/values-ky/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Тутум"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Түзмөктөр"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Тышкы экранга чыгаруу баскычы"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Тышкы экранга чыгаруу баскычы. Түзмөк ажырап турат."</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Тышкы экранга чыгаруу баскычы. Түзмөк туташууда"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Тышкы экранга чыгаруу баскычы. Түзмөк туташып турат"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Төмөнкүгө чыгаруу"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Түзмөктөр изделүүдө"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажыратуу"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Тышк экранга чыгарну токтотуу"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабуу"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Ойнотуу"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Тындыруу"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Токтотуу"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жайып көрсөтүү"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жыйыштыруу"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Альбом мукабасы"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Үндү катуулатуучу сыдырма"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Бир да медиа файл тандалган жок"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Эч маалымат жок"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Тышкы экранга чыгарылууда"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-land/dimens.xml b/packages/MediaComponents/res/values-land/dimens.xml
deleted file mode 100644
index 29f1e1d..0000000
--- a/packages/MediaComponents/res/values-land/dimens.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <!-- MediaRouteController's volume group list -->
- <eat-comment />
- <!-- Maximum height of volume group list. -->
- <dimen name="mr_controller_volume_group_list_max_height">132dp</dimen>
- <!-- Height of volume group item. -->
- <dimen name="mr_controller_volume_group_list_item_height">61dp</dimen>
- <!-- Size of an item's icon. -->
- <dimen name="mr_controller_volume_group_list_item_icon_size">18dp</dimen>
-</resources>
diff --git a/packages/MediaComponents/res/values-lo/strings.xml b/packages/MediaComponents/res/values-lo/strings.xml
deleted file mode 100644
index 91737db..0000000
--- a/packages/MediaComponents/res/values-lo/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ລະບົບ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ອຸປະກອນ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ປຸ່ມຄາສທ໌"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ປຸ່ມສົ່ງສັນຍານ. ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ປຸ່ມສົ່ງສັນຍານ. ກຳລັງເຊື່ອມຕໍ່"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ປຸ່ມສົ່ງສັນຍານ. ເຊື່ອມຕໍ່ແລ້ວ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ສົ່ງສັນຍານຫາ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ກຳລັງຊອກຫາອຸປະກອນ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ຕັດການເຊື່ອມຕໍ່"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ຢຸດການສົ່ງສັນຍານ"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ປິດ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ຫຼິ້ນ"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ຢຸດຊົ່ວຄາວ"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ຢຸດ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ຂະຫຍາຍ"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ຫຍໍ້ລົງ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ໜ້າປົກອະລະບໍ້າ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ຕົວປັບລະດັບສຽງ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ບໍ່ໄດ້ເລືອກມີເດຍໃດໄວ້"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ບໍ່ມີຂໍ້ມູນ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ການສົ່ງພາບໜ້າຈໍ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-lt/strings.xml b/packages/MediaComponents/res/values-lt/strings.xml
deleted file mode 100644
index ff036d1..0000000
--- a/packages/MediaComponents/res/values-lt/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Įrenginiai"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Perdavimo mygtukas"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Perdavimo mygtukas. Atsijungta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Perdavimo mygtukas. Prisijungiama"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Perdavimo mygtukas. Prisijungta"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Perduoti į"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Randami įrenginiai"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atjungti"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Sustabdyti perdavimą"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Uždaryti"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Leisti"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pristabdyti"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Sustabdyti"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Išskleisti"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sutraukti"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumo viršelis"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Garsumo šliaužiklis"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nepasirinkta jokia medija"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacija nepasiekiama"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Perduodamas ekranas"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-lv/strings.xml b/packages/MediaComponents/res/values-lv/strings.xml
deleted file mode 100644
index 454063e..0000000
--- a/packages/MediaComponents/res/values-lv/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistēma"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Ierīces"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Apraides poga"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Apraides poga. Savienojums pārtraukts"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Apraides poga. Notiek savienojuma izveide"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Apraides poga. Savienojums izveidots"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Apraidīšana uz ierīci"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Notiek ierīču meklēšana"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atvienot"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Apturēt apraidi"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Aizvērt"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Atskaņot"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Apturēt"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Apturēt"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Izvērst"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sakļaut"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albuma vāciņš"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Skaļuma slīdnis"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nav atlasīti multivides faili"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nav pieejama informācija"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Notiek ekrāna apraide"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-mk/strings.xml b/packages/MediaComponents/res/values-mk/strings.xml
deleted file mode 100644
index 12dee36..0000000
--- a/packages/MediaComponents/res/values-mk/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Уреди"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Копчето за Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Копче за Cast. Исклучено"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Копче за Cast. Се поврзува"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Копче за Cast. Поврзано"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Емитувај на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Се бараат уреди"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Исклучи"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Сопри го емитувањето"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Репродуцирај"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Сопри"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Собери"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Корица на албум"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Лизгач за јачина на звук"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Не се избрани медиуми"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нема достапни информации"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранот се емитува"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ml/strings.xml b/packages/MediaComponents/res/values-ml/strings.xml
deleted file mode 100644
index 2d914b9..0000000
--- a/packages/MediaComponents/res/values-ml/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"സിസ്റ്റം"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ഉപകരണങ്ങൾ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ടാപ്പുചെയ്യുക"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"കാസ്റ്റ് ബട്ടൺ. വിച്ഛേദിച്ചു"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"കാസ്റ്റ് ബട്ടൺ. കണക്റ്റുചെയ്യുന്നു"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"കാസ്റ്റ് ബട്ടൺ. കണക്റ്റുചെയ്തു"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ഇതിലേക്ക് കാസ്റ്റുചെയ്യുക"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"വിച്ഛേദിക്കുക"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"അവസാനിപ്പിക്കുക"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"പ്ലേ ചെയ്യുക"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"തൽക്കാലം നിർത്തൂ"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"നിര്ത്തുക"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"വികസിപ്പിക്കുക"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ചുരുക്കുക"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ആൽബം ആർട്ട്"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"വോളിയം സ്ലൈഡർ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"മീഡിയയൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"വിവരങ്ങളൊന്നും ലഭ്യമല്ല"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"സ്ക്രീൻ കാസ്റ്റുചെയ്യുന്നു"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-mn/strings.xml b/packages/MediaComponents/res/values-mn/strings.xml
deleted file mode 100644
index ef87c92..0000000
--- a/packages/MediaComponents/res/values-mn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Төхөөрөмжүүд"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Дамжуулах товчлуур"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Дамжуулах товчлуур. Салсан"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Дамжуулах товчлуур. Холбож байна"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Дамжуулах товчлуур. Холбогдсон"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Дамжуулах"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Төхөөрөмж хайж байна"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Салгах"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Дамжуулахыг зогсоох"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Хаах"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Тоглуулах"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Түр зогсоох"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Зогсоох"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Дэлгэх"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Хураах"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Цомгийн зураг"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Дууны түвшин тааруулагч"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ямар ч медиа сонгоогүй"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Мэдээлэл байхгүй байна"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Дэлгэцийг дамжуулж байна"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-mr/strings.xml b/packages/MediaComponents/res/values-mr/strings.xml
deleted file mode 100644
index 2ffbebb..0000000
--- a/packages/MediaComponents/res/values-mr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिव्हाइसेस"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट बटण"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"कास्ट बटण. डिस्कनेक्ट केले"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"कास्ट बटण. कनेक्ट करत आहे"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"कास्ट बटण. कनेक्ट केले"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"यावर कास्ट करा"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"डिव्हाइसेस शोधत आहे"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्कनेक्ट करा"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"कास्ट करणे थांबवा"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करा"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"प्ले करा"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"विराम"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"थांबा"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करा"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संकुचित करा"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"अल्बम कला"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"व्हॉल्यूम स्लायडर"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"मीडिया निवडला नाही"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोणतीही माहिती उपलब्ध नाही"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट करत आहे"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ms/strings.xml b/packages/MediaComponents/res/values-ms/strings.xml
deleted file mode 100644
index 085e480..0000000
--- a/packages/MediaComponents/res/values-ms/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Peranti"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Butang Hantar"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butang hantar. Sambungan diputuskan"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butang hantar. Menyambung"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butang hantar. Disambungkan"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Hantar ke"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari peranti"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Berhenti menghantar"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Main"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Berhenti"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kembangkan"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Runtuhkan"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Seni album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Peluncur kelantangan"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tiada media dipilih"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Maklumat tidak tersedia"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Menghantar skrin"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-my/strings.xml b/packages/MediaComponents/res/values-my/strings.xml
deleted file mode 100644
index 083d805..0000000
--- a/packages/MediaComponents/res/values-my/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"စနစ်"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"စက်ပစ္စည်းများ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ကာစ်တ်လုပ်ရန် ခလုတ်"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ကာစ်ခလုတ်။ ချိတ်ဆက်မထားပါ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ကာစ်ခလုတ်။ ချိတ်ဆက်နေသည်"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ကာစ်ခလုတ်။ ချိတ်ဆက်ထားသည်"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ကာစ်လုပ်ရန် စက်"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"စက်ပစ္စည်းများ ရှာဖွေခြင်း"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ကာစ်လုပ်ခြင်း ရပ်ရန်"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ပိတ်ရန်"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ဖွင့်ရန်"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ခဏရပ်ရန်"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ရပ်ရန်"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ဖြန့်ချရန်၃"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ခေါက်သိမ်းရန်..."</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"အယ်လ်ဘမ်ပုံ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"အသံအတိုးအကျယ်ချိန်သည့် ဆလိုက်ဒါ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"မည်သည့်မီဒီမှ မရွေးချယ်ထားပါ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"အချက်အလက် မရရှိနိုင်ပါ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"တည်းဖြတ်ရေး မျက်နှာပြင်"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-nb/strings.xml b/packages/MediaComponents/res/values-nb/strings.xml
deleted file mode 100644
index 4f764c9..0000000
--- a/packages/MediaComponents/res/values-nb/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-ikonet"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knappen. Frakoblet"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knappen. Kobler til"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knappen. Tilkoblet"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Søker etter enheter"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koble fra"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stopp castingen"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Lukk"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spill av"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sett på pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stopp"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utvid"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafikk"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Glidebryter for volum"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Du har ikke valgt noen medier"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ingen informasjon er tilgjengelig"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Caster skjermen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ne/strings.xml b/packages/MediaComponents/res/values-ne/strings.xml
deleted file mode 100644
index d6c2e1a..0000000
--- a/packages/MediaComponents/res/values-ne/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"प्रणाली"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"उपकरणहरू"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast बटन"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast बटन। जडान विच्छेद भयो"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast बटन। जडान हुँदै"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast बटन। जडान भयो"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"यसमा Cast गर्नुहोस्"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"यन्त्रहरू पत्ता लगाउँदै"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"विच्छेद गर्नुहोस्"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"casting रोक्नुहोस्"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बन्द गर्नुहोस्"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"बजाउनुहोस्"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"रोक्नुहोस्"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"रोक्नुहोस्"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तार गर्नुहोस्"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त पार्नुहोस्"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"एल्बम आर्ट"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"भोल्युमको स्लाइडर"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कुनै मिडिया चयन भएको छैन"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"जानकारी उपलब्ध छैन"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रिन cast गर्दै"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-nl/strings.xml b/packages/MediaComponents/res/values-nl/strings.xml
deleted file mode 100644
index 05df62d..0000000
--- a/packages/MediaComponents/res/values-nl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Systeem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Apparaten"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-icoon"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-icoon. Verbinding verbroken"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-icoon. Verbinding maken"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-icoon. Verbonden"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Casten naar"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Apparaten zoeken"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Loskoppelen"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Casten stoppen"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sluiten"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Afspelen"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Onderbreken"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stoppen"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Uitvouwen"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Samenvouwen"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumhoes"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volumeschuifregelaar"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media geselecteerd"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen informatie beschikbaar"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Scherm casten"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pa/strings.xml b/packages/MediaComponents/res/values-pa/strings.xml
deleted file mode 100644
index 1b5df71..0000000
--- a/packages/MediaComponents/res/values-pa/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ਸਿਸਟਮ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ਡਿਵਾਈਸਾਂ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ਕਾਸਟ ਬਟਨ"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ਕਾਸਟ ਬਟਨ। ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ਏਥੇ ਕਾਸਟ ਕਰੋ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ਡੀਵਾਈਸਾਂ ਨੂੰ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ਕਾਸਟ ਕਰਨਾ ਬੰਦ ਕਰੋ"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ਬੰਦ ਕਰੋ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ਪਲੇ ਕਰੋ"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ਰੋਕੋ"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ਬੰਦ ਕਰੋ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ਵਿਸਤਾਰ ਕਰੋ"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ਬੰਦ ਕਰੋ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ਐਲਬਮ ਆਰਟ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ਵੌਲਯੂਮ ਸਲਾਈਡਰ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ਕੋਈ ਵੀ ਮੀਡੀਆ ਨਹੀਂ ਚੁਣਿਆ ਗਿਆ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ਕੋਈ ਜਾਣਕਾਰੀ ਉਪਲਬਧ ਨਹੀਂ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ਸਕ੍ਰੀਨ ਜੋੜ ਰਿਹਾ ਹੈ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pl/strings.xml b/packages/MediaComponents/res/values-pl/strings.xml
deleted file mode 100644
index c792a6d..0000000
--- a/packages/MediaComponents/res/values-pl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Urządzenia"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Przycisk Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Przycisk Prześlij ekran. Rozłączono"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Przycisk Prześlij ekran. Łączę"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Przycisk Prześlij ekran. Połączono"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Przesyłaj na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Znajdowanie urządzeń"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odłącz"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zatrzymaj przesyłanie"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zamknij"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Odtwórz"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Wstrzymaj"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zatrzymaj"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozwiń"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zwiń"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Okładka albumu"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Suwak głośności"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie wybrano multimediów"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Brak informacji"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Przesyłam ekran"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pt-rBR/strings.xml b/packages/MediaComponents/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 43c619d..0000000
--- a/packages/MediaComponents/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão \"Transmitir\". Desconectado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão \"Transmitir\". Conectando"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão \"Transmitir\". Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Interromper transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Parar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Arte do álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controle deslizante de volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pt-rPT/strings.xml b/packages/MediaComponents/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 3f0a61d..0000000
--- a/packages/MediaComponents/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão Transmitir. Desligado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão Transmitir. A ligar..."</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão Transmitir. Ligado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"A localizar dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desassociar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Parar a transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Interromper"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Parar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Reduzir"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Imagem do álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controlo de deslize do volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhum suporte multimédia selecionado"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"A transmitir o ecrã"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pt/strings.xml b/packages/MediaComponents/res/values-pt/strings.xml
deleted file mode 100644
index 43c619d..0000000
--- a/packages/MediaComponents/res/values-pt/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão \"Transmitir\". Desconectado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão \"Transmitir\". Conectando"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão \"Transmitir\". Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Interromper transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Parar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Arte do álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controle deslizante de volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ro/strings.xml b/packages/MediaComponents/res/values-ro/strings.xml
deleted file mode 100644
index 6ebb2f6..0000000
--- a/packages/MediaComponents/res/values-ro/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispozitive"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Butonul de proiecție"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butonul de proiecție. Deconectat"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butonul de proiecție. Se conectează"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butonul de proiecție. Conectat"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Proiectați pe"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Se caută dispozitive"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deconectați-vă"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Nu mai proiectați"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Închideți"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Redați"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Întrerupeți"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Opriți"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Extindeți"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Restrângeți"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Grafica albumului"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Glisor pentru volum"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Niciun fișier media selectat"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nu sunt disponibile informații"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Se proiectează ecranul"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ru/strings.xml b/packages/MediaComponents/res/values-ru/strings.xml
deleted file mode 100644
index 7c462d2..0000000
--- a/packages/MediaComponents/res/values-ru/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляции"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляции. Устройство отключено."</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляции. Устройство подключается."</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляции. Устройство подключено."</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Выберите устройство"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Поиск устройств…"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Отключить"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Прекратить трансляцию"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыть"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Воспроизвести"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Приостановить"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Остановить"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Развернуть"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свернуть"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Обложка"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Регулятор громкости"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медиафайл не выбран"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Данных нет"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Подключение к удаленному монитору"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-si/strings.xml b/packages/MediaComponents/res/values-si/strings.xml
deleted file mode 100644
index a55ce50..0000000
--- a/packages/MediaComponents/res/values-si/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"පද්ධතිය"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"උපාංග"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"විකාශ බොත්තම"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"විකාශ බොත්තම. විසන්ධි කරන ලදී"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"විකාශ බොත්තම සම්බන්ධ කරමින්"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"විකාශ බොත්තම සම්බන්ධ කරන ලදී"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"විකාශය"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"උපාංග සෙවීම"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"විසන්ධි කරන්න"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"විකාශ කිරීම නතර කරන්න"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"වසන්න"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ධාවනය කරන්න"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"විරාම ගන්වන්න"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"නතර කරන්න"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"දිග හරින්න"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"හකුළන්න"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ඇල්බම කලාව"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"හඬ පරිමා ස්ලයිඩරය"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"මාධ්යය තෝරා නැත"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ලබා ගත හැකි තොරතුරු නොමැත"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"විකාශ තිරය"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sk/strings.xml b/packages/MediaComponents/res/values-sk/strings.xml
deleted file mode 100644
index a58aa11..0000000
--- a/packages/MediaComponents/res/values-sk/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Zariadenia"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tlačidlo prenosu"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tlačidlo prenosu. Odpojené"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tlačidlo prenosu. Pripája sa"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tlačidlo prenosu. Pripojené"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Prenos do"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Hľadajú sa zariadenia"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojiť"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zastaviť prenášanie"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavrieť"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Prehrať"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastaviť"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zastaviť"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbaliť"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zbaliť"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Obrázok albumu"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Posúvač hlasitosti"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie sú vybrané žiadne médiá"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nie sú k dispozícii žiadne informácie"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prenáša sa obrazovka"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sl/strings.xml b/packages/MediaComponents/res/values-sl/strings.xml
deleted file mode 100644
index 8ca4ce4..0000000
--- a/packages/MediaComponents/res/values-sl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Naprave"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za predvajanje"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Gumb za predvajanje. Povezava je prekinjena."</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Gumb za predvajanje. Vzpostavljanje povezave."</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Gumb za predvajanje. Povezava je vzpostavljena."</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Predvajanje prek:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Iskanje naprav"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini povezavo"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Ustavi predvajanje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zapri"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Predvajanje"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Zaustavi"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Ustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Razširi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Strni"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Naslovnica albuma"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Drsnik za glasnost"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ni izbrane predstavnosti"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Podatki niso na voljo"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Predvajanje zaslona"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sq/strings.xml b/packages/MediaComponents/res/values-sq/strings.xml
deleted file mode 100644
index 816e110..0000000
--- a/packages/MediaComponents/res/values-sq/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistemi"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Pajisjet"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Butoni i transmetimit"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butoni i transmetimit. Je i shkëputur"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butoni i transmetimit. Po lidhet"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butoni i transmetimit. Je i lidhur"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmeto te"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Po kërkon pajisje"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Shkëpute"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Ndalo transmetimin"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Mbyll"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Luaj"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauzë"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Ndalo"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zgjeroje"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Palose"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Kopertina e albumit"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Rrëshqitësi i volumit"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nuk u zgjodh asnjë media"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nuk jepet asnjë informacion"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Po transmeton ekranin"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sr/strings.xml b/packages/MediaComponents/res/values-sr/strings.xml
deleted file mode 100644
index caabad5..0000000
--- a/packages/MediaComponents/res/values-sr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Уређаји"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Дугме Пребаци"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Дугме Пребаци. Веза је прекинута"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Дугме Пребаци. Повезује се"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Дугме Пребаци. Повезан је"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Пребацуј на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Проналажење уређаја"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекини везу"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Заустави пребацивање"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Пусти"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Заустави"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Скупи"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Омот албума"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Клизач за јачину звука"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Нема изабраних медија"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нису доступне никакве информације"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Пребацује се екран"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sv/strings.xml b/packages/MediaComponents/res/values-sv/strings.xml
deleted file mode 100644
index ca7d3e0..0000000
--- a/packages/MediaComponents/res/values-sv/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knappen"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knappen. Frånkopplad"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knappen. Ansluter"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knappen. Ansluten"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Casta till"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Letar efter enheter"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koppla från"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Sluta casta"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Stäng"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spela upp"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Avbryt"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utöka"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Komprimera"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Skivomslag"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volymreglage"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Inga media har valts"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Det finns ingen information"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skärmen castas"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sw/strings.xml b/packages/MediaComponents/res/values-sw/strings.xml
deleted file mode 100644
index 9562cb1..0000000
--- a/packages/MediaComponents/res/values-sw/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Mfumo"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Vifaa"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Kitufe cha kutuma"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Kitufe cha kutuma. Kimeondolewa"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Kitufe cha kutuma. Kinaunganisha"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Kitufe cha kutuma. Kimeunganishwa"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Tuma kwenye"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Inatafuta vifaa"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ondoa"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Acha kutuma"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Funga"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Cheza"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sitisha"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Simamisha"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Panua"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Kunja"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Sanaa ya albamu"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Kitelezi cha sauti"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Hakuna maudhui yaliyochaguliwa"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hakuna maelezo yaliyopatikana"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Inatuma skrini"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sw600dp/dimens.xml b/packages/MediaComponents/res/values-sw600dp/dimens.xml
deleted file mode 100644
index 4042348..0000000
--- a/packages/MediaComponents/res/values-sw600dp/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <!-- The platform's desired fixed width for a dialog along the major axis
- (the screen is in landscape). This may be either a fraction or a dimension.-->
- <item type="dimen" name="mr_dialog_fixed_width_major">60%</item>
- <!-- The platform's desired fixed width for a dialog along the minor axis
- (the screen is in portrait). This may be either a fraction or a dimension.-->
- <item type="dimen" name="mr_dialog_fixed_width_minor">90%</item>
-</resources>
diff --git a/packages/MediaComponents/res/values-sw720dp/dimens.xml b/packages/MediaComponents/res/values-sw720dp/dimens.xml
deleted file mode 100644
index 634ab8d..0000000
--- a/packages/MediaComponents/res/values-sw720dp/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <!-- The platform's desired fixed width for a dialog along the major axis
- (the screen is in landscape). This may be either a fraction or a dimension.-->
- <item type="dimen" name="mr_dialog_fixed_width_major">50%</item>
- <!-- The platform's desired fixed width for a dialog along the minor axis
- (the screen is in portrait). This may be either a fraction or a dimension.-->
- <item type="dimen" name="mr_dialog_fixed_width_minor">70%</item>
-</resources>
diff --git a/packages/MediaComponents/res/values-ta/strings.xml b/packages/MediaComponents/res/values-ta/strings.xml
deleted file mode 100644
index e1978f3..0000000
--- a/packages/MediaComponents/res/values-ta/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"சிஸ்டம்"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"சாதனங்கள்"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"திரையிடு பட்டன்"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"அனுப்புதல் பொத்தான். துண்டிக்கப்பட்டது"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"அனுப்புதல் பொத்தான். இணைக்கிறது"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"அனுப்புதல் பொத்தான். இணைக்கப்பட்டது"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"இதற்கு அனுப்பு"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"சாதனங்களைத் தேடுகிறது"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"தொடர்பைத் துண்டி"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"அனுப்புவதை நிறுத்து"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"மூடும்"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"இயக்கும்"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"இடைநிறுத்தும்"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"நிறுத்துவதற்கான பொத்தான்"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"விரிவாக்கு"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"சுருக்கு"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ஆல்பம் ஆர்ட்"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ஒலியளவு ஸ்லைடர்"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"மீடியா எதுவும் தேர்ந்தெடுக்கப்படவில்லை"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"தகவல் எதுவுமில்லை"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"திரையை அனுப்புகிறீர்கள்"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-te/strings.xml b/packages/MediaComponents/res/values-te/strings.xml
deleted file mode 100644
index 7d312e3..0000000
--- a/packages/MediaComponents/res/values-te/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"సిస్టమ్"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"పరికరాలు"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ప్రసారం చేయి బటన్"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ప్రసార బటన్. డిస్కనెక్ట్ చేయబడింది"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ప్రసార బటన్. కనెక్ట్ చేస్తోంది"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ప్రసార బటన్. కనెక్ట్ చేయబడింది"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"దీనికి ప్రసారం చేయండి"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"పరికరాలను కనుగొంటోంది"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"డిస్కనెక్ట్ చేయి"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ప్రసారాన్ని ఆపివేయి"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"మూసివేస్తుంది"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ప్లే చేస్తుంది"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"పాజ్ చేస్తుంది"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ఆపివేయి"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"విస్తరింపజేస్తుంది"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"కుదిస్తుంది"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ఆల్బమ్ ఆర్ట్"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"వాల్యూమ్ స్లయిడర్"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"మీడియా ఏదీ ఎంచుకోబడలేదు"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"సమాచారం అందుబాటులో లేదు"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"స్క్రీన్ను ప్రసారం చేస్తోంది"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-th/strings.xml b/packages/MediaComponents/res/values-th/strings.xml
deleted file mode 100644
index cfa8ae5..0000000
--- a/packages/MediaComponents/res/values-th/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ระบบ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"อุปกรณ์"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ปุ่ม \"แคสต์\""</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ปุ่ม \"แคสต์\" ยกเลิกการเชื่อมต่อ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ปุ่ม \"แคสต์\" กำลังเชื่อมต่อ"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ปุ่ม \"แคสต์\" เชื่อมต่อแล้ว"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"แคสต์ไปยัง"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"กำลังค้นหาอุปกรณ์"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ยกเลิกการเชื่อมต่อ"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"หยุดแคสต์"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ปิด"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"เล่น"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"หยุดชั่วคราว"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"หยุด"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ขยาย"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ยุบ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ปกอัลบั้ม"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"แถบเลื่อนปรับระดับเสียง"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ไม่ได้เลือกสื่อไว้"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ไม่มีข้อมูล"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"กำลังแคสต์หน้าจอ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-tl/strings.xml b/packages/MediaComponents/res/values-tl/strings.xml
deleted file mode 100644
index a8be3d0..0000000
--- a/packages/MediaComponents/res/values-tl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Mga Device"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Button na I-cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Button na I-cast. Nadiskonekta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Button na I-cast. Kumokonekta"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Button na I-cast. Nakakonekta"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"I-cast sa"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Naghahanap ng mga device"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Idiskonekta"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Ihinto ang pag-cast"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Isara"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"I-play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"I-pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Ihinto"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Palawakin"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"I-collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Slider ng volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Walang piniling media"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Walang available na impormasyon"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Kina-cast ang screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-tr/strings.xml b/packages/MediaComponents/res/values-tr/strings.xml
deleted file mode 100644
index 05f6392..0000000
--- a/packages/MediaComponents/res/values-tr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Yayınla düğmesi"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Yayınla düğmesi. Bağlantı kesildi"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Yayınla düğmesi. Bağlanıyor"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Yayınla düğmesi. Bağlandı"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Şuraya yayınla:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar bulunuyor"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantıyı kes"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Yayını durdur"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Kapat"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Oynat"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Duraklat"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Durdur"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişlet"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Daralt"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albüm kapağı"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ses düzeyi kaydırma çubuğu"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Medya seçilmedi"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Bilgi yok"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayınlanıyor"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-uk/strings.xml b/packages/MediaComponents/res/values-uk/strings.xml
deleted file mode 100644
index 33d365e..0000000
--- a/packages/MediaComponents/res/values-uk/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Пристрої"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляції"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляції. Від’єднано"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляції. Під’єднання"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляції. Під’єднано"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Транслювати на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук пристроїв"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Відключити"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Припинити трансляцію"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрити"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Відтворити"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Призупинити"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Припинити"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Розгорнути"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згорнути"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Обкладинка альбому"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Повзунок гучності"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медіа-файл не вибрано"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Немає даних"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Трансляція екрана"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ur/strings.xml b/packages/MediaComponents/res/values-ur/strings.xml
deleted file mode 100644
index 632c598..0000000
--- a/packages/MediaComponents/res/values-ur/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"سسٹم"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"آلات"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"کاسٹ کرنے کا بٹن"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"کاسٹ کرنے کا بٹن۔ غیر منسلک ہے"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"کاسٹ کرنے کا بٹن۔ منسلک ہو رہا ہے"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"کاسٹ کرنے کا بٹن۔ منسلک ہے"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"اس میں کاسٹ کریں"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"آلات تلاش ہو رہے ہیں"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"غیر منسلک کریں"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"کاسٹ کرنا بند کریں"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"بند کریں"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"چلائیں"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"موقوف کریں"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"روکیں"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"پھیلائیں"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"سکیڑیں"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"البم آرٹ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"والیوم سلائیڈر"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"کوئی میڈیا منتخب نہیں ہے"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"کوئی معلومات دستیاب نہیں"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"سکرین کاسٹ ہو رہی ہے"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-uz/strings.xml b/packages/MediaComponents/res/values-uz/strings.xml
deleted file mode 100644
index 10a0817..0000000
--- a/packages/MediaComponents/res/values-uz/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Tizim"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Qurilmalar"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Translatsiya tugmasi"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Translatsiya tugmasi. Uzildi"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Translatsiya tugmasi. Ulanmoqda"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Translatsiya tugmasi. Ulandi"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Quyidagiga translatsiya qilish:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Qurilmalarni topish"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ulanishni uzish"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Translatsiyani to‘xtatish"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Yopish"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Boshlash"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"To‘xtatib turish"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"To‘xtatish"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Yoyish"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yig‘ish"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albom muqovasi"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Tovush balandligi slayderi"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Multimedia tanlamagan"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hech qanday ma’lumot yo‘q"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekranni translatsiya qilish"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-vi/strings.xml b/packages/MediaComponents/res/values-vi/strings.xml
deleted file mode 100644
index 7098cca..0000000
--- a/packages/MediaComponents/res/values-vi/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Hệ thống"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Thiết bị"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Nút truyền"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Nút truyền. Đã ngắt kết nối"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Nút truyền. Đang kết nối"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Nút truyền. Đã kết nối"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Truyền tới"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Đang tìm thiết bị"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ngắt kết nối"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Dừng truyền"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Đóng"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Phát"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Tạm dừng"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Dừng"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mở rộng"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Thu gọn"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Ảnh bìa album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Thanh trượt âm lượng"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Không có phương tiện nào được chọn"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Không có thông tin nào"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Đang truyền màn hình"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-zh-rCN/strings.xml b/packages/MediaComponents/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 1e22d01..0000000
--- a/packages/MediaComponents/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"系统"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"设备"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投射按钮"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投射按钮。已断开连接"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投射按钮。正在连接"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"投射按钮。已连接"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投射到"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在查找设备"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"断开连接"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"停止投射"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"关闭"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暂停"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展开"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收起"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"专辑封面"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑块"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未选择任何媒体"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"没有任何相关信息"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投射屏幕"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-zh-rHK/strings.xml b/packages/MediaComponents/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 156e5c2..0000000
--- a/packages/MediaComponents/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投放按鈕。已解除連接"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投放按鈕。正在連接"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"投放按鈕。已連接"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投放至"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"停止投放"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"專輯封面"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑桿"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"尚未選擇媒體"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有詳細資料"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-zh-rTW/strings.xml b/packages/MediaComponents/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 6cafde1..0000000
--- a/packages/MediaComponents/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投放按鈕;已中斷連線"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投放按鈕;連線中"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"投放按鈕;已連線"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投放到"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"停止投放"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"專輯封面"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑桿"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未選取任何媒體"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有可用的資訊"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-zu/strings.xml b/packages/MediaComponents/res/values-zu/strings.xml
deleted file mode 100644
index e107c43..0000000
--- a/packages/MediaComponents/res/values-zu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Isistimu"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Amadivayisi"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Inkinobho ye-Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Inkinobho yokusakaza. Kunqanyuliwe"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Inkinobho yokusakaza. Kuyaxhunywa"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Inkinobho yokusakaza. Kuxhunyiwe"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Sakaza ku-"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Ithola amadivayisi"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Nqamula"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Misa ukusakaza"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Vala"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Dlala"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Misa isikhashana"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Misa"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Nweba"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Goqa"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Ubuciko be-albhamu"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Isilayida sevolumu"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ayikho imidiya ekhethiwe"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Alukho ulwazi olutholakalayo"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Isikrini sokusakaza"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values/arrays.xml b/packages/MediaComponents/res/values/arrays.xml
deleted file mode 100644
index 1187320..0000000
--- a/packages/MediaComponents/res/values/arrays.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <integer-array name="speed_multiplied_by_100">
- <item>25</item>
- <item>50</item>
- <item>75</item>
- <item>100</item>
- <item>125</item>
- <item>150</item>
- <item>200</item>
- </integer-array>
-</resources>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/values/attrs.xml b/packages/MediaComponents/res/values/attrs.xml
deleted file mode 100644
index e37285b..0000000
--- a/packages/MediaComponents/res/values/attrs.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <declare-styleable name="MediaRouteButton">
- <!-- This drawable is a state list where the "checked" state
- indicates active media routing. Checkable indicates connecting
- and non-checked / non-checkable indicates
- that media is playing to the local device only. -->
- <attr name="externalRouteEnabledDrawable" format="reference" />
- <!-- Tint to apply to the media route button -->
- <attr name="mediaRouteButtonTint" format="color" />
-
- <attr name="android:minWidth" />
- <attr name="android:minHeight" />
- </declare-styleable>
-
- <attr name="mediaRouteButtonStyle" format="reference" />
- <attr name="mediaRouteCloseDrawable" format="reference" />
- <attr name="mediaRoutePlayDrawable" format="reference" />
- <attr name="mediaRoutePauseDrawable" format="reference" />
- <attr name="mediaRouteStopDrawable" format="reference" />
- <attr name="mediaRouteAudioTrackDrawable" format="reference" />
- <attr name="mediaRouteDefaultIconDrawable" format="reference" />
- <attr name="mediaRouteTvIconDrawable" format="reference" />
- <attr name="mediaRouteSpeakerIconDrawable" format="reference" />
- <attr name="mediaRouteSpeakerGroupIconDrawable" format="reference" />
- <attr name="mediaRouteControlPanelThemeOverlay" format="reference" />
-
- <attr name="mediaRouteTheme" format="reference" />
-</resources>
diff --git a/packages/MediaComponents/res/values/colors.xml b/packages/MediaComponents/res/values/colors.xml
deleted file mode 100644
index e7bc299..0000000
--- a/packages/MediaComponents/res/values/colors.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <color name="gray">#808080</color>
- <color name="white">#ffffff</color>
- <color name="white_opacity_70">#B3ffffff</color>
- <color name="black_opacity_70">#B3000000</color>
- <color name="title_bar_gradient_start">#50000000</color>
- <color name="title_bar_gradient_end">#00000000</color>
- <color name="bottom_bar_background">#40202020</color>
-</resources>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/values/dimens.xml b/packages/MediaComponents/res/values/dimens.xml
deleted file mode 100644
index 2d7b022..0000000
--- a/packages/MediaComponents/res/values/dimens.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <!-- Dialog size -->
- <eat-comment />
- <!-- The platform's desired fixed width for a dialog along the major axis
- (the screen is in landscape). This may be either a fraction or a dimension.-->
- <dimen name="mr_dialog_fixed_width_major">320dp</dimen>
- <!-- The platform's desired fixed width for a dialog along the minor axis
- (the screen is in portrait). This may be either a fraction or a dimension.-->
- <dimen name="mr_dialog_fixed_width_minor">320dp</dimen>
-
- <!-- MediaRouteController's volume group list -->
- <eat-comment />
- <!-- Maximum height of volume group list. -->
- <dimen name="mr_controller_volume_group_list_max_height">288dp</dimen>
- <!-- Height of volume group item. -->
- <dimen name="mr_controller_volume_group_list_item_height">68dp</dimen>
- <!-- Size of an item's icon. -->
- <dimen name="mr_controller_volume_group_list_item_icon_size">24dp</dimen>
-
- <dimen name="mr_controller_volume_group_list_padding_top">16dp</dimen>
- <!-- Group list expand/collapse animation duration. -->
- <integer name="mr_controller_volume_group_list_animation_duration_ms">400</integer>
- <!-- Group list fade in animation duration. -->
- <integer name="mr_controller_volume_group_list_fade_in_duration_ms">400</integer>
- <!-- Group list fade out animation duration. -->
- <integer name="mr_controller_volume_group_list_fade_out_duration_ms">200</integer>
-
- <dimen name="mcv2_embedded_settings_width">150dp</dimen>
- <dimen name="mcv2_embedded_settings_height">36dp</dimen>
- <dimen name="mcv2_embedded_settings_icon_size">20dp</dimen>
- <dimen name="mcv2_embedded_settings_text_height">18dp</dimen>
- <dimen name="mcv2_embedded_settings_main_text_size">12sp</dimen>
- <dimen name="mcv2_embedded_settings_sub_text_size">10sp</dimen>
- <dimen name="mcv2_full_settings_width">225dp</dimen>
- <dimen name="mcv2_full_settings_height">54dp</dimen>
- <dimen name="mcv2_full_settings_icon_size">30dp</dimen>
- <dimen name="mcv2_full_settings_text_height">27dp</dimen>
- <dimen name="mcv2_full_settings_main_text_size">16sp</dimen>
- <dimen name="mcv2_full_settings_sub_text_size">13sp</dimen>
- <dimen name="mcv2_settings_offset">8dp</dimen>
-
- <dimen name="mcv2_transport_controls_padding">4dp</dimen>
- <dimen name="mcv2_pause_icon_size">36dp</dimen>
- <dimen name="mcv2_full_icon_size">28dp</dimen>
- <dimen name="mcv2_embedded_icon_size">24dp</dimen>
- <dimen name="mcv2_minimal_icon_size">24dp</dimen>
- <dimen name="mcv2_icon_margin">10dp</dimen>
-
- <dimen name="mcv2_full_album_image_portrait_size">232dp</dimen>
- <dimen name="mcv2_full_album_image_landscape_size">176dp</dimen>
-
- <dimen name="mcv2_custom_progress_max_size">2dp</dimen>
- <dimen name="mcv2_custom_progress_thumb_size">12dp</dimen>
- <dimen name="mcv2_buffer_view_height">5dp</dimen>
- <!-- TODO: adjust bottom bar view -->
-</resources>
diff --git a/packages/MediaComponents/res/values/strings.xml b/packages/MediaComponents/res/values/strings.xml
deleted file mode 100644
index 2597a3b..0000000
--- a/packages/MediaComponents/res/values/strings.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- Name for the default system route prior to Jellybean. [CHAR LIMIT=30] -->
- <string name="mr_system_route_name">System</string>
-
- <!-- Name for the user route category created when publishing routes to the system in Jellybean and above. [CHAR LIMIT=30] -->
- <string name="mr_user_route_category_name">Devices</string>
-
- <!-- String to be shown as a tooltip of MediaRouteButton
- Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=50] -->
- <string name="mr_button_content_description">Cast button</string>
-
- <!-- Content description of a MediaRouteButton for accessibility support when no remote device is connected.
- Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=NONE] -->
- <string name="mr_cast_button_disconnected">Cast button. Disconnected</string>
-
- <!-- Content description of a MediaRouteButton for accessibility support while connecting to a remote device.
- Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=NONE] -->
- <string name="mr_cast_button_connecting">Cast button. Connecting</string>
-
- <!-- Content description of a MediaRouteButton for accessibility support when a remote device is connected.
- Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=NONE] -->
- <string name="mr_cast_button_connected">Cast button. Connected</string>
-
- <!-- Title of the media route chooser dialog. [CHAR LIMIT=30] -->
- <string name="mr_chooser_title">Cast to</string>
-
- <!-- Placeholder text to show when no devices have been found. [CHAR LIMIT=50] -->
- <string name="mr_chooser_searching">Finding devices</string>
-
- <!-- Button to disconnect from a media route. [CHAR LIMIT=30] -->
- <string name="mr_controller_disconnect">Disconnect</string>
-
- <!-- Button to stop playback and disconnect from a media route. [CHAR LIMIT=30] -->
- <string name="mr_controller_stop_casting">Stop casting</string>
-
- <!-- Content description for accessibility (not shown on the screen): dialog close button. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_close_description">Close</string>
-
- <!-- Content description for accessibility (not shown on the screen): media play button. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_play">Play</string>
-
- <!-- Content description for accessibility (not shown on the screen): media pause button. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_pause">Pause</string>
-
- <!-- Content description for accessibility (not shown on the screen): media stop button. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_stop">Stop</string>
-
- <!-- Content description for accessibility (not shown on the screen): group expand button. Pressing button shows group members of a selected route group. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_expand_group">Expand</string>
-
- <!-- Content description for accessibility (not shown on the screen): group collapse button. Pressing button hides group members of a selected route group. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_collapse_group">Collapse</string>
-
- <!-- Content description for accessibility (not shown on the screen): album art button. Clicking on the album art takes user to a predefined activity per media app. [CHAR LIMIT=50] -->
- <string name="mr_controller_album_art">Album art</string>
-
- <!-- Content description for accessibility (not shown on the screen): volume slider. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_volume_slider">Volume slider</string>
-
- <!-- Placeholder text to show when no media have been selected for playback. [CHAR LIMIT=50] -->
- <string name="mr_controller_no_media_selected">No media selected</string>
-
- <!-- Placeholder text to show when no title/description have been found for a given song/video. [CHAR LIMIT=50] -->
- <string name="mr_controller_no_info_available">No info available</string>
-
- <!-- Placeholder text indicating that the user is currently casting screen. [CHAR LIMIT=50] -->
- <string name="mr_controller_casting_screen">Casting screen</string>
-
- <!-- Text for error alert when a video container is not valid for progressive download/playback. -->
- <string name="VideoView2_error_text_invalid_progressive_playback">This video isn\'t valid for streaming to this device.</string>
- <!-- Text for error alert when a video cannot be played. It can be used by any app. -->
- <string name="VideoView2_error_text_unknown">Can\'t play this video.</string>
- <!-- Button to close error alert when a video cannot be played. -->
- <string name="VideoView2_error_button">OK</string>
-
- <!-- Text for displaying ad skip wait time. -->
- <string name="MediaControlView2_ad_skip_wait_time">
- You can skip Ad in <xliff:g id="wait_time" example="5">%1$d</xliff:g>s
- </string>
- <!-- Text for displaying ad total remaining time. -->
- <string name="MediaControlView2_ad_remaining_time">
- Ad · <xliff:g id="remaining_time" example="1:15">%1$s</xliff:g> remaining
- </string>
- <!-- Placeholder text indicating that the user can press the button to go to an external website. -->
- <string name="MediaControlView2_ad_text">Visit Advertiser</string>
- <string name="MediaControlView2_subtitle_text">Closed caption</string>
- <string name="MediaControlView2_subtitle_off_text">Off</string>
- <string name="MediaControlView2_audio_track_text">Audio track</string>
- <string name="MediaControlView2_audio_track_none_text">None</string>
- <string name="MediaControlView2_video_quality_text">Video quality</string>
- <string name="MediaControlView2_video_quality_auto_text">Auto</string>
- <string name="MediaControlView2_help_text">Help & feedback</string>
- <string name="MediaControlView2_playback_speed_text">Playback speed</string>
- <string-array name="MediaControlView2_playback_speeds">
- <item>0.25x</item>
- <item>0.5x</item>
- <item>0.75x</item>
- <item>Normal</item>
- <item>1.25x</item>
- <item>1.5x</item>
- <item>2x</item>
- </string-array>
- <!-- Placeholder text for displaying time. Used to calculate which size layout to use. -->
- <string name="MediaControlView2_time_placeholder">00:00:00</string>
-
- <!-- Text for displaying subtitle track number. -->
- <string name="MediaControlView2_subtitle_track_number_text">
- Track <xliff:g id="track_number" example="1">%1$s</xliff:g>
- </string>
- <!-- Text for displaying audio track number. -->
- <string name="MediaControlView2_audio_track_number_text">
- Track <xliff:g id="audio_number" example="1">%1$s</xliff:g>
- </string>
- <!-- Text for displaying unknown song title. -->
- <string name="mcv2_music_title_unknown_text">Song title unknown</string>
- <!-- Text for displaying unknown artist name. -->
- <string name="mcv2_music_artist_unknown_text">Artist unknown</string>
-
- <!--Content Descriptions -->
- <string name="mcv2_back_button_desc">Back</string>
- <string name="mcv2_overflow_left_button_desc">See more buttons</string>
- <string name="mcv2_overflow_right_button_desc">Back to previous button list</string>
- <string name="mcv2_seek_bar_desc">Playback progress</string>
- <string name="mcv2_settings_button_desc">Settings</string>
- <string name="mcv2_video_quality_button_desc">Video Quality Selection</string>
- <string name="mcv2_cc_is_on">Subtitle is on. Click to hide it.</string>
- <string name="mcv2_cc_is_off">Subtitle is off. Click to show it.</string>
- <string name="mcv2_replay_button_desc">Replay</string>
- <string name="mcv2_play_button_desc">Play</string>
- <string name="mcv2_pause_button_desc">Pause</string>
- <string name="mcv2_previous_button_desc">Previous media</string>
- <string name="mcv2_next_button_desc">Next media</string>
- <string name="mcv2_rewind_button_desc">Rewind by 10 seconds</string>
- <string name="mcv2_ffwd_button_desc">Go forward by 30 seconds</string>
- <string name="mcv2_launch_button_desc">Launch Link</string>
- <string name="mcv2_muted_button_desc">Muted. Click to unmute</string>
- <string name="mcv2_unmuted_button_desc">Click to Mute</string>
- <string name="mcv2_full_screen_button_desc">Full screen</string>
-</resources>
diff --git a/packages/MediaComponents/res/values/style.xml b/packages/MediaComponents/res/values/style.xml
deleted file mode 100644
index 5b9a8ee..0000000
--- a/packages/MediaComponents/res/values/style.xml
+++ /dev/null
@@ -1,221 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <style name="FullTransportControlsButton">
- <item name="android:background">@null</item>
- <item name="android:layout_margin">@dimen/mcv2_icon_margin</item>
- <item name="android:scaleType">fitXY</item>
- </style>
-
- <style name="FullTransportControlsButton.Previous">
- <item name="android:src">@drawable/ic_skip_previous</item>
- <item name="android:layout_width">@dimen/mcv2_full_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_full_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_previous_button_desc</item>
- </style>
-
- <style name="FullTransportControlsButton.Next">
- <item name="android:src">@drawable/ic_skip_next</item>
- <item name="android:layout_width">@dimen/mcv2_full_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_full_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_next_button_desc</item>
- </style>
-
- <style name="FullTransportControlsButton.Pause">
- <item name="android:src">@drawable/ic_pause_circle_filled</item>
- <item name="android:layout_width">@dimen/mcv2_pause_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_pause_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_pause_button_desc</item>
- </style>
-
- <style name="FullTransportControlsButton.Ffwd">
- <item name="android:src">@drawable/ic_forward_30</item>
- <item name="android:layout_width">@dimen/mcv2_full_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_full_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_ffwd_button_desc</item>
- </style>
-
- <style name="FullTransportControlsButton.Rew">
- <item name="android:src">@drawable/ic_rewind_10</item>
- <item name="android:layout_width">@dimen/mcv2_full_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_full_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_rewind_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton">
- <item name="android:background">@null</item>
- <item name="android:layout_margin">@dimen/mcv2_icon_margin</item>
- <item name="android:scaleType">fitXY</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Previous">
- <item name="android:src">@drawable/ic_skip_previous</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_previous_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Next">
- <item name="android:src">@drawable/ic_skip_next</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_next_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Pause">
- <item name="android:src">@drawable/ic_pause_circle_filled</item>
- <item name="android:layout_width">@dimen/mcv2_pause_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_pause_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_pause_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Ffwd">
- <item name="android:src">@drawable/ic_forward_30</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_ffwd_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Rew">
- <item name="android:src">@drawable/ic_rewind_10</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_rewind_button_desc</item>
- </style>
-
- <style name="MinimalTransportControlsButton">
- <item name="android:background">@null</item>
- <item name="android:layout_width">@dimen/mcv2_pause_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_pause_icon_size</item>
- <item name="android:layout_margin">@dimen/mcv2_icon_margin</item>
- <item name="android:scaleType">fitXY</item>
- <item name="android:src">@drawable/ic_pause_circle_filled</item>
- <item name="android:contentDescription">@string/mcv2_pause_button_desc</item>
- </style>
-
- <style name="TitleBar">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">46dp</item>
- <item name="android:paddingStart">5dp</item>
- <item name="android:paddingEnd">5dp</item>
- </style>
-
- <style name="TitleBarButton">
- <item name="android:background">@null</item>
- <item name="android:layout_width">36dp</item>
- <item name="android:layout_height">36dp</item>
- </style>
-
- <style name="TitleBarButton.Back">
- <item name="android:src">@drawable/ic_arrow_back</item>
- <item name="android:contentDescription">@string/mcv2_back_button_desc</item>
- </style>
-
- <style name="TitleBarButton.Launch">
- <item name="android:src">@drawable/ic_launch</item>
- <item name="android:contentDescription">@string/mcv2_launch_button_desc</item>
- </style>
-
- <style name="TimeText">
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:paddingStart">4dp</item>
- <item name="android:paddingEnd">4dp</item>
- <item name="android:textStyle">bold</item>
- <item name="android:textSize">14sp</item>
- <item name="android:gravity">center</item>
- </style>
-
- <style name="TimeText.Current">
- <item name="android:textColor">@color/white</item>
- <item name="android:text">@string/MediaControlView2_time_placeholder</item>
- </style>
-
- <style name="TimeText.Interpunct">
- <item name="android:textColor">@color/white_opacity_70</item>
- <item name="android:text">·</item>
- </style>
-
- <style name="TimeText.End">
- <item name="android:textColor">@color/white_opacity_70</item>
- <item name="android:text">@string/MediaControlView2_time_placeholder</item>
- </style>
-
- <style name="BottomBarButton">
- <item name="android:background">@null</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_margin">@dimen/mcv2_icon_margin</item>
- <item name="android:gravity">center_horizontal</item>
- <item name="android:scaleType">fitXY</item>
- </style>
-
- <style name="BottomBarButton.CC">
- <item name="android:src">@drawable/ic_subtitle_off</item>
- <item name="android:contentDescription">@string/mcv2_cc_is_off</item>
- </style>
-
- <style name="BottomBarButton.FullScreen">
- <item name="android:src">@drawable/ic_fullscreen</item>
- <item name="android:contentDescription">@string/mcv2_full_screen_button_desc</item>
- </style>
-
- <style name="BottomBarButton.OverflowRight">
- <item name="android:src">@drawable/ic_chevron_right</item>
- <item name="android:contentDescription">@string/mcv2_overflow_right_button_desc</item>
- </style>
-
- <style name="BottomBarButton.OverflowLeft">
- <item name="android:src">@drawable/ic_chevron_left</item>
- <item name="android:contentDescription">@string/mcv2_overflow_left_button_desc</item>
- </style>
-
- <style name="BottomBarButton.Settings">
- <item name="android:src">@drawable/ic_settings</item>
- <item name="android:contentDescription">@string/mcv2_settings_button_desc</item>
- </style>
-
- <style name="BottomBarButton.Mute">
- <item name="android:src">@drawable/ic_unmute</item>
- <item name="android:contentDescription">@string/mcv2_unmuted_button_desc</item>
- </style>
-
- <style name="BottomBarButton.VideoQuality">
- <item name="android:src">@drawable/ic_high_quality</item>
- <item name="android:contentDescription">@string/mcv2_video_quality_button_desc</item>
- </style>
-
- <style name="FullMusicPortrait">
- <item name="android:layout_height">0dp</item>
- </style>
-
- <style name="FullMusicPortrait.Image">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_weight">0.6</item>
- <item name="android:gravity">center</item>
- </style>
-
- <style name="FullMusicPortrait.Text">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_weight">0.4</item>
- <item name="android:gravity">top|center</item>
- <item name="android:orientation">vertical</item>
- </style>
-
- <style name="FullMusicLandscape">
- <item name="android:layout_width">0dp</item>
- </style>
-
- <style name="FullMusicLandscape.Image">
- <item name="android:layout_height">match_parent</item>
- <item name="android:layout_weight">0.35</item>
- <item name="android:gravity">center|right</item>
- </style>
-
- <style name="FullMusicLandscape.Text">
- <item name="android:layout_height">match_parent</item>
- <item name="android:layout_weight">0.65</item>
- <item name="android:layout_marginLeft">24dp</item>
- <item name="android:gravity">center|left</item>
- <item name="android:orientation">vertical</item>
- </style>
-</resources>
diff --git a/packages/MediaComponents/res/values/styles.xml b/packages/MediaComponents/res/values/styles.xml
deleted file mode 100644
index bde6900..0000000
--- a/packages/MediaComponents/res/values/styles.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <style name="Widget.MediaRouter.MediaRouteButton"
- parent="Widget.AppCompat.ActionButton">
- <item name="externalRouteEnabledDrawable">@drawable/mr_button_dark</item>
- </style>
-
- <style name="Widget.MediaRouter.Light.MediaRouteButton"
- parent="Widget.AppCompat.Light.ActionButton">
- <item name="externalRouteEnabledDrawable">@drawable/mr_button_light</item>
- </style>
-
- <style name="TextAppearance.MediaRouter.Title" parent="TextAppearance.AppCompat.Title" />
-
- <style name="TextAppearance.MediaRouter.PrimaryText" parent="TextAppearance.AppCompat.Subhead" />
-
- <style name="TextAppearance.MediaRouter.SecondaryText" parent="TextAppearance.AppCompat.Body1" />
-</resources>
diff --git a/packages/MediaComponents/res/values/symbols.xml b/packages/MediaComponents/res/values/symbols.xml
deleted file mode 100644
index ee0e8c6..0000000
--- a/packages/MediaComponents/res/values/symbols.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* Copyright 2017, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <!--java-symbol type="id" name="cc" />
- <java-symbol type="id" name="ffwd" />
- <java-symbol type="id" name="mediacontroller_progress" />
- <java-symbol type="id" name="next" />
- <java-symbol type="id" name="pause" />
- <java-symbol type="id" name="prev" />
- <java-symbol type="id" name="rew" />
- <java-symbol type="id" name="time" />
- <java-symbol type="id" name="time_current" /-->
-</resources>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/values/themes.xml b/packages/MediaComponents/res/values/themes.xml
deleted file mode 100644
index d9a754b..0000000
--- a/packages/MediaComponents/res/values/themes.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
-
- <style name="Theme.MediaRouter" parent="android:Theme.Material">
- <item name="android:windowNoTitle">true</item>
- <item name="mediaRouteButtonStyle">@style/Widget.MediaRouter.MediaRouteButton</item>
-
- <item name="mediaRouteCloseDrawable">@drawable/mr_dialog_close_dark</item>
- <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_dark</item>
- <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_dark</item>
- <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_dark</item>
- <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_dark</item>
- <item name="mediaRouteDefaultIconDrawable">@drawable/ic_mr_button_disconnected_dark</item>
- <item name="mediaRouteTvIconDrawable">@drawable/ic_vol_type_tv_dark</item>
- <item name="mediaRouteSpeakerIconDrawable">@drawable/ic_vol_type_speaker_dark</item>
- <item name="mediaRouteSpeakerGroupIconDrawable">@drawable/ic_vol_type_speaker_group_dark</item>
-
- <item name="mediaRouteControlPanelThemeOverlay">@null</item>
- </style>
-
- <style name="Theme.MediaRouter.LightControlPanel">
- <item name="mediaRouteControlPanelThemeOverlay">@style/ThemeOverlay.MediaRouter.Light</item>
- </style>
-
- <style name="Theme.MediaRouter.Light" parent="android:Theme.Material.Light">
- <item name="android:windowNoTitle">true</item>
- <item name="mediaRouteButtonStyle">@style/Widget.MediaRouter.Light.MediaRouteButton</item>
-
- <item name="mediaRouteCloseDrawable">@drawable/mr_dialog_close_light</item>
- <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_light</item>
- <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_light</item>
- <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_light</item>
- <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_light</item>
- <item name="mediaRouteDefaultIconDrawable">@drawable/ic_mr_button_grey</item>
- <item name="mediaRouteTvIconDrawable">@drawable/ic_vol_type_tv_light</item>
- <item name="mediaRouteSpeakerIconDrawable">@drawable/ic_vol_type_speaker_light</item>
- <item name="mediaRouteSpeakerGroupIconDrawable">@drawable/ic_vol_type_speaker_group_light</item>
-
- <item name="mediaRouteControlPanelThemeOverlay">@null</item>
- </style>
-
- <style name="Theme.MediaRouter.Light.DarkControlPanel">
- <item name="mediaRouteControlPanelThemeOverlay">@style/ThemeOverlay.MediaRouter.Dark</item>
- </style>
-
- <style name="ThemeOverlay.MediaRouter.Dark" parent="android:Theme.Material">
- <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_dark</item>
- <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_dark</item>
- <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_dark</item>
- <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_dark</item>
-
- </style>
- <style name="ThemeOverlay.MediaRouter.Light" parent="android:Theme.Material.Light">
- <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_light</item>
- <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_light</item>
- <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_light</item>
- <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_light</item>
- </style>
-
-</resources>
diff --git a/packages/MediaComponents/runcts.sh b/packages/MediaComponents/runcts.sh
deleted file mode 100644
index 61b1a1e..0000000
--- a/packages/MediaComponents/runcts.sh
+++ /dev/null
@@ -1,224 +0,0 @@
-#!/bin/bash
-# Copyright 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Usage '. runcts.sh'
-
-function _runtest_cts_mediacomponent_usage() {
- echo 'runtest-cts-MediaComponents [option]: Build, flash device,'
- echo ' and run subset of CtsMediaTestCases that MediaComponents covers.'
- echo ' *Warning* This bypasses CTS setup (e.g. download media contents from server)'
- echo ' For running CTS in official way, use atest or cts-tradefed '
- echo ' -h|--help: This help'
- echo ' --skip: Skip build and flash. Just rerun-tests'
- echo ' --min: Only rebuild tests and updatable library.'
- echo ' --test: Only rebuild tests'
- echo ' -s [device_id]: Specify a device name to run test against.'
- echo ' You can define ${ADBHOST} instead.'
- echo ' -r [count]: Repeat tests for given count. It will stop when fails.'
- echo ' --ignore: Keep repeating tests even when it fails.'
- echo ' -t [test]: Only run the specific test. Can be either a class or a method.'
-}
-
-function runtest-cts-MediaComponents() {
- # Edit here if you want to support other tests.
- # List up libs and apks in the media_api needed for tests, and place test target at the last.
- local TEST_PACKAGE_DIR=("frameworks/av/packages/MediaComponents/test")
- local TEST_PACKAGE=("android.media.cts")
- local BUILD_TARGETS=("MediaComponents" "CtsMediaTestCases")
- # Don't include MediaComponents -- if we simply install it, system server
- # wouldn't use the installed one.
- local INSTALL_TARGETS=("CtsMediaTestCases")
- local TEST_RUNNER="android.support.test.runner.AndroidJUnitRunner"
- local DEPENDENCIES=("mockito-target-minus-junit4" "android-support-test" "compatibility-device-util")
- local DEFAULT_TEST_TARGET=""
- DEFAULT_TEST_TARGET+="android.media.cts.MediaBrowser2Test"
- DEFAULT_TEST_TARGET+=",android.media.cts.MediaController2Test"
- DEFAULT_TEST_TARGET+=",android.media.cts.MediaMetadata2Test"
- DEFAULT_TEST_TARGET+=",android.media.cts.MediaSession2Test"
- DEFAULT_TEST_TARGET+=",android.media.cts.MediaSession2_PermissionTest"
- DEFAULT_TEST_TARGET+=",android.media.cts.MediaSessionManager_MediaSession2Test"
- DEFAULT_TEST_TARGET+=",android.media.cts.SessionToken2Test"
- if [[ -z "${ANDROID_BUILD_TOP}" ]]; then
- echo "Needs to lunch a target first"
- return
- fi
-
- local old_path=${OLDPWD}
- while true; do
- local OPTION_SKIP="false"
- local OPTION_MIN="false"
- local OPTION_TEST="false"
- local OPTION_REPEAT_COUNT="1"
- local OPTION_IGNORE="false"
- local OPTION_TEST_TARGET="${DEFAULT_TEST_TARGET}"
- local adbhost_local
- while (( "$#" )); do
- case "${1}" in
- -h|--help)
- _runtest_cts_mediacomponent_usage
- return
- ;;
- --skip)
- OPTION_SKIP="true"
- ;;
- --min)
- OPTION_MIN="true"
- ;;
- --test)
- OPTION_TEST="true"
- ;;
- -s)
- shift
- adbhost_local=${1}
- ;;
- -r)
- shift
- OPTION_REPEAT_COUNT="${1}"
- ;;
- --ignore)
- OPTION_IGNORE="true"
- ;;
- -t)
- shift
- OPTION_TEST_TARGET="${1}"
- esac
- shift
- done
-
- # Build adb command.
- local adb
- if [[ -z "${adbhost_local}" ]]; then
- adbhost_local=${ADBHOST}
- fi
- if [[ -z "${adbhost_local}" ]]; then
- local device_count=$(adb devices | sed '/^[[:space:]]*$/d' | wc -l)
- if [[ "${device_count}" != "2" ]]; then
- echo "Too many devices. Specify a device." && break
- fi
- adb="adb"
- else
- adb="adb -s ${adbhost_local}"
- fi
-
- local target_dir="${ANDROID_BUILD_TOP}/${TEST_PACKAGE_DIR}"
- #local TEST_PACKAGE=$(sed -n 's/^.*\bpackage\b="\([a-z0-9\.]*\)".*$/\1/p' ${target_dir}/AndroidManifest.xml)
-
- if [[ "${OPTION_SKIP}" != "true" ]]; then
- # Build dependencies if needed.
- local dependency
- local build_dependency=""
- for dependency in ${DEPENDENCIES[@]}; do
- if [[ "${dependency}" == "out/"* ]]; then
- if [[ ! -f ${ANDROID_BUILD_TOP}/${dependency} ]]; then
- build_dependency="true"
- break
- fi
- else
- if [[ "$(find ${OUT} -name ${dependency}_intermediates | wc -l)" == "0" ]]; then
- build_dependency="true"
- break
- fi
- fi
- done
- if [[ "${build_dependency}" == "true" ]]; then
- echo "Building dependencies. Will only print stderr."
- m ${DEPENDENCIES[@]} -j > /dev/null
- fi
-
- # Build test apk and required apk.
- local build_targets
- if [[ "${OPTION_TEST}" == "true" ]]; then
- build_targets="${INSTALL_TARGETS[@]}"
- elif [[ "${OPTION_MIN}" == "true" ]]; then
- build_targets="${BUILD_TARGETS[@]}"
- else
- build_targets="${BUILD_TARGETS[@]} droid"
- fi
- m ${build_targets} -j || break
-
- if [[ "${OPTION_TEST}" != "true" ]]; then
- # Flash only when needed
- local device_build_type="$(${adb} shell getprop ro.build.type)"
- if [[ "${device_build_type}" == "user" ]]; then
- # User build. Cannot adb sync
- ${adb} reboot bootloader
- fastboot flashall
- else
- ${adb} root
- local device_verity_mode="$(${adb} shell getprop ro.boot.veritymode)"
- if [[ "${device_verity_mode}" != "disabled" ]]; then
- ${adb} disable-verity
- ${adb} reboot
- ${adb} wait-for-device || break
- ${adb} root
- fi
- ${adb} remount
- ${adb} shell stop
- ${adb} shell setprop log.tag.MediaSessionService DEBUG
- ${adb} sync
- ${adb} shell start
- fi
- ${adb} wait-for-device || break
- # Ensure package manager is loaded.
- # TODO(jaewan): Find better way to wait
- sleep 15
- fi
-
- # Install apks
- local install_failed="false"
- for target in ${INSTALL_TARGETS[@]}; do
- local apk_path=$(find ${OUT}/system ${OUT}/data -name ${target}.apk)
- local apk_num=$(find ${OUT}/system ${OUT}/data -name ${target}.apk | wc -l)
- if [[ "${apk_num}" != "1" ]]; then
- echo "Cannot locate a ${target}.apk. Found ${apk_num} apks" && break
- fi
- echo "Installing ${target}.apk. path=${apk_path}"
- ${adb} install -r ${apk_path}
- if [[ "${?}" != "0" ]]; then
- install_failed="true"
- break
- fi
- done
- if [[ "${install_failed}" == "true" ]]; then
- echo "Failed to install. Test wouldn't run."
- break
- fi
- fi
-
- local test_target=""
- if [[ -n "${OPTION_TEST_TARGET}" ]]; then
- test_target="-e class ${OPTION_TEST_TARGET}"
- fi
-
- local i
- local tmpfile=$(tempfile)
- for ((i=1; i <= ${OPTION_REPEAT_COUNT}; i++)); do
- echo "Run test ${i}/${OPTION_REPEAT_COUNT}"
- ${adb} shell am instrument ${test_target} -w ${TEST_PACKAGE}/${TEST_RUNNER} >& ${tmpfile}
- cat ${tmpfile}
- if [[ "${OPTION_IGNORE}" != "true" ]]; then
- if [[ -n "$(grep ${tmpfile} -e 'FAILURE\|crashed')" ]]; then
- # am instrument doesn't return error code so need to grep result message instead
- break
- fi
- fi
- done
- rm ${tmpfile}
- break
- done
-}
-
-echo "Following functions are added to your environment:"
-_runtest_cts_mediacomponent_usage
diff --git a/packages/MediaComponents/src/com/android/media/IMediaController2.aidl b/packages/MediaComponents/src/com/android/media/IMediaController2.aidl
deleted file mode 100644
index 0488b70..0000000
--- a/packages/MediaComponents/src/com/android/media/IMediaController2.aidl
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.app.PendingIntent;
-import android.os.Bundle;
-import android.os.ResultReceiver;
-
-import com.android.media.IMediaSession2;
-
-/**
- * Interface from MediaSession2 to MediaController2.
- * <p>
- * Keep this interface oneway. Otherwise a malicious app may implement fake version of this,
- * and holds calls from session to make session owner(s) frozen.
- */
-// TODO(jaewan): (Post P) Handle when the playlist becomes too huge.
-// Note that ParcelledSliceList isn't a good idea for the purpose. (see: b/37493677)
-oneway interface IMediaController2 {
- void onPlayerStateChanged(int state);
- void onPositionChanged(long eventTimeMs, long positionMs);
- void onPlaybackSpeedChanged(float speed);
- void onBufferedPositionChanged(long bufferedPositionMs);
- void onPlaylistChanged(in List<Bundle> playlist, in Bundle metadata);
- void onPlaylistMetadataChanged(in Bundle metadata);
- void onPlaybackInfoChanged(in Bundle playbackInfo);
- void onRepeatModeChanged(int repeatMode);
- void onShuffleModeChanged(int shuffleMode);
- void onError(int errorCode, in Bundle extras);
-
- void onConnected(IMediaSession2 sessionBinder, in Bundle commandGroup,
- int playerState, long positionEventTimeMs, long positionMs, float playbackSpeed,
- long bufferedPositionMs, in Bundle playbackInfo, int repeatMode, int shuffleMode,
- in List<Bundle> playlist, in PendingIntent sessionActivity);
- void onDisconnected();
-
- void onCustomLayoutChanged(in List<Bundle> commandButtonlist);
- void onAllowedCommandsChanged(in Bundle commands);
-
- void onCustomCommand(in Bundle command, in Bundle args, in ResultReceiver receiver);
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // Browser sepcific
- //////////////////////////////////////////////////////////////////////////////////////////////
- void onGetLibraryRootDone(in Bundle rootHints, String rootMediaId, in Bundle rootExtra);
- void onGetItemDone(String mediaId, in Bundle result);
- void onChildrenChanged(String rootMediaId, int itemCount, in Bundle extras);
- void onGetChildrenDone(String parentId, int page, int pageSize, in List<Bundle> result,
- in Bundle extras);
- void onSearchResultChanged(String query, int itemCount, in Bundle extras);
- void onGetSearchResultDone(String query, int page, int pageSize, in List<Bundle> result,
- in Bundle extras);
-}
diff --git a/packages/MediaComponents/src/com/android/media/IMediaSession2.aidl b/packages/MediaComponents/src/com/android/media/IMediaSession2.aidl
deleted file mode 100644
index 664467d..0000000
--- a/packages/MediaComponents/src/com/android/media/IMediaSession2.aidl
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.os.Bundle;
-import android.os.ResultReceiver;
-import android.net.Uri;
-
-import com.android.media.IMediaController2;
-
-/**
- * Interface from MediaController2 to MediaSession2.
- * <p>
- * Keep this interface oneway. Otherwise a malicious app may implement fake version of this,
- * and holds calls from session to make session owner(s) frozen.
- */
- // TODO(jaewan): (Post P) Handle when the playlist becomes too huge.
- // Note that ParcelledSliceList isn't a good idea for the purpose. (see: b/37493677)
-oneway interface IMediaSession2 {
- // TODO(jaewan): add onCommand() to send private command
-
- // TODO(jaewan): (Post P) We may consider to add another binder just for the connection
- // not to expose other methods to the controller whose connection wasn't accepted.
- // But this would be enough for now because it's the same as existing
- // MediaBrowser and MediaBrowserService.
- void connect(IMediaController2 caller, String callingPackage);
- void release(IMediaController2 caller);
-
- void setVolumeTo(IMediaController2 caller, int value, int flags);
- void adjustVolume(IMediaController2 caller, int direction, int flags);
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // send command
- //////////////////////////////////////////////////////////////////////////////////////////////
- void sendTransportControlCommand(IMediaController2 caller,
- int commandCode, in Bundle args);
- void sendCustomCommand(IMediaController2 caller, in Bundle command, in Bundle args,
- in ResultReceiver receiver);
-
- void prepareFromUri(IMediaController2 caller, in Uri uri, in Bundle extras);
- void prepareFromSearch(IMediaController2 caller, String query, in Bundle extras);
- void prepareFromMediaId(IMediaController2 caller, String mediaId, in Bundle extras);
- void playFromUri(IMediaController2 caller, in Uri uri, in Bundle extras);
- void playFromSearch(IMediaController2 caller, String query, in Bundle extras);
- void playFromMediaId(IMediaController2 caller, String mediaId, in Bundle extras);
- void setRating(IMediaController2 caller, String mediaId, in Bundle rating);
-
- void setPlaylist(IMediaController2 caller, in List<Bundle> playlist, in Bundle metadata);
- void updatePlaylistMetadata(IMediaController2 caller, in Bundle metadata);
- void addPlaylistItem(IMediaController2 caller, int index, in Bundle mediaItem);
- void removePlaylistItem(IMediaController2 caller, in Bundle mediaItem);
- void replacePlaylistItem(IMediaController2 caller, int index, in Bundle mediaItem);
- void skipToPlaylistItem(IMediaController2 caller, in Bundle mediaItem);
- void skipToPreviousItem(IMediaController2 caller);
- void skipToNextItem(IMediaController2 caller);
- void setRepeatMode(IMediaController2 caller, int repeatMode);
- void setShuffleMode(IMediaController2 caller, int shuffleMode);
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // library service specific
- //////////////////////////////////////////////////////////////////////////////////////////////
- void getLibraryRoot(IMediaController2 caller, in Bundle rootHints);
- void getItem(IMediaController2 caller, String mediaId);
- void getChildren(IMediaController2 caller, String parentId, int page, int pageSize,
- in Bundle extras);
- void search(IMediaController2 caller, String query, in Bundle extras);
- void getSearchResult(IMediaController2 caller, String query, int page, int pageSize,
- in Bundle extras);
- void subscribe(IMediaController2 caller, String parentId, in Bundle extras);
- void unsubscribe(IMediaController2 caller, String parentId);
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaBrowser2Impl.java b/packages/MediaComponents/src/com/android/media/MediaBrowser2Impl.java
deleted file mode 100644
index 0327beb..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaBrowser2Impl.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.content.Context;
-import android.media.MediaBrowser2;
-import android.media.MediaBrowser2.BrowserCallback;
-import android.media.MediaItem2;
-import android.media.SessionToken2;
-import android.media.update.MediaBrowser2Provider;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.util.List;
-import java.util.concurrent.Executor;
-
-public class MediaBrowser2Impl extends MediaController2Impl implements MediaBrowser2Provider {
- private final String TAG = "MediaBrowser2";
- private final boolean DEBUG = true; // TODO(jaewan): change.
-
- private final MediaBrowser2 mInstance;
- private final MediaBrowser2.BrowserCallback mCallback;
-
- public MediaBrowser2Impl(Context context, MediaBrowser2 instance, SessionToken2 token,
- Executor executor, BrowserCallback callback) {
- super(context, instance, token, executor, callback);
- mInstance = instance;
- mCallback = callback;
- }
-
- @Override MediaBrowser2 getInstance() {
- return (MediaBrowser2) super.getInstance();
- }
-
- @Override
- public void getLibraryRoot_impl(Bundle rootHints) {
- final IMediaSession2 binder = getSessionBinder();
- if (binder != null) {
- try {
- binder.getLibraryRoot(getControllerStub(), rootHints);
- } catch (RemoteException e) {
- // TODO(jaewan): Handle disconnect.
- if (DEBUG) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void subscribe_impl(String parentId, Bundle extras) {
- if (parentId == null) {
- throw new IllegalArgumentException("parentId shouldn't be null");
- }
-
- final IMediaSession2 binder = getSessionBinder();
- if (binder != null) {
- try {
- binder.subscribe(getControllerStub(), parentId, extras);
- } catch (RemoteException e) {
- // TODO(jaewan): Handle disconnect.
- if (DEBUG) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void unsubscribe_impl(String parentId) {
- if (parentId == null) {
- throw new IllegalArgumentException("parentId shouldn't be null");
- }
-
- final IMediaSession2 binder = getSessionBinder();
- if (binder != null) {
- try {
- binder.unsubscribe(getControllerStub(), parentId);
- } catch (RemoteException e) {
- // TODO(jaewan): Handle disconnect.
- if (DEBUG) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void getItem_impl(String mediaId) {
- if (mediaId == null) {
- throw new IllegalArgumentException("mediaId shouldn't be null");
- }
-
- final IMediaSession2 binder = getSessionBinder();
- if (binder != null) {
- try {
- binder.getItem(getControllerStub(), mediaId);
- } catch (RemoteException e) {
- // TODO(jaewan): Handle disconnect.
- if (DEBUG) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void getChildren_impl(String parentId, int page, int pageSize, Bundle extras) {
- if (parentId == null) {
- throw new IllegalArgumentException("parentId shouldn't be null");
- }
- if (page < 1 || pageSize < 1) {
- throw new IllegalArgumentException("Neither page nor pageSize should be less than 1");
- }
-
- final IMediaSession2 binder = getSessionBinder();
- if (binder != null) {
- try {
- binder.getChildren(getControllerStub(), parentId, page, pageSize, extras);
- } catch (RemoteException e) {
- // TODO(jaewan): Handle disconnect.
- if (DEBUG) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void search_impl(String query, Bundle extras) {
- if (TextUtils.isEmpty(query)) {
- throw new IllegalArgumentException("query shouldn't be empty");
- }
- final IMediaSession2 binder = getSessionBinder();
- if (binder != null) {
- try {
- binder.search(getControllerStub(), query, extras);
- } catch (RemoteException e) {
- // TODO(jaewan): Handle disconnect.
- if (DEBUG) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void getSearchResult_impl(String query, int page, int pageSize, Bundle extras) {
- if (TextUtils.isEmpty(query)) {
- throw new IllegalArgumentException("query shouldn't be empty");
- }
- if (page < 1 || pageSize < 1) {
- throw new IllegalArgumentException("Neither page nor pageSize should be less than 1");
- }
- final IMediaSession2 binder = getSessionBinder();
- if (binder != null) {
- try {
- binder.getSearchResult(getControllerStub(), query, page, pageSize, extras);
- } catch (RemoteException e) {
- // TODO(jaewan): Handle disconnect.
- if (DEBUG) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- public void onGetLibraryRootDone(
- final Bundle rootHints, final String rootMediaId, final Bundle rootExtra) {
- getCallbackExecutor().execute(() -> {
- mCallback.onGetLibraryRootDone(getInstance(), rootHints, rootMediaId, rootExtra);
- });
- }
-
- public void onGetItemDone(String mediaId, MediaItem2 item) {
- getCallbackExecutor().execute(() -> {
- mCallback.onGetItemDone(getInstance(), mediaId, item);
- });
- }
-
- public void onGetChildrenDone(String parentId, int page, int pageSize, List<MediaItem2> result,
- Bundle extras) {
- getCallbackExecutor().execute(() -> {
- mCallback.onGetChildrenDone(getInstance(), parentId, page, pageSize, result, extras);
- });
- }
-
- public void onSearchResultChanged(String query, int itemCount, Bundle extras) {
- getCallbackExecutor().execute(() -> {
- mCallback.onSearchResultChanged(getInstance(), query, itemCount, extras);
- });
- }
-
- public void onGetSearchResultDone(String query, int page, int pageSize, List<MediaItem2> result,
- Bundle extras) {
- getCallbackExecutor().execute(() -> {
- mCallback.onGetSearchResultDone(getInstance(), query, page, pageSize, result, extras);
- });
- }
-
- public void onChildrenChanged(final String parentId, int itemCount, final Bundle extras) {
- getCallbackExecutor().execute(() -> {
- mCallback.onChildrenChanged(getInstance(), parentId, itemCount, extras);
- });
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaController2Impl.java b/packages/MediaComponents/src/com/android/media/MediaController2Impl.java
deleted file mode 100644
index 2883087..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaController2Impl.java
+++ /dev/null
@@ -1,1144 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import static android.media.SessionCommand2.COMMAND_CODE_PLAYLIST_ADD_ITEM;
-import static android.media.SessionCommand2.COMMAND_CODE_PLAYLIST_REMOVE_ITEM;
-import static android.media.SessionCommand2.COMMAND_CODE_PLAYLIST_REPLACE_ITEM;
-import static android.media.SessionCommand2.COMMAND_CODE_PLAYLIST_SET_LIST;
-import static android.media.SessionCommand2.COMMAND_CODE_PLAYLIST_SET_LIST_METADATA;
-import static android.media.SessionCommand2.COMMAND_CODE_PLAYLIST_SET_REPEAT_MODE;
-import static android.media.SessionCommand2.COMMAND_CODE_PLAYLIST_SET_SHUFFLE_MODE;
-import static android.media.SessionCommand2.COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID;
-import static android.media.SessionCommand2.COMMAND_CODE_SESSION_PLAY_FROM_SEARCH;
-import static android.media.SessionCommand2.COMMAND_CODE_SESSION_PLAY_FROM_URI;
-import static android.media.SessionCommand2.COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID;
-import static android.media.SessionCommand2.COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH;
-import static android.media.SessionCommand2.COMMAND_CODE_SESSION_PREPARE_FROM_URI;
-import static android.media.SessionCommand2.COMMAND_CODE_SET_VOLUME;
-
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.media.AudioAttributes;
-import android.media.MediaController2;
-import android.media.MediaController2.ControllerCallback;
-import android.media.MediaController2.PlaybackInfo;
-import android.media.MediaItem2;
-import android.media.MediaMetadata2;
-import android.media.MediaPlaylistAgent.RepeatMode;
-import android.media.MediaPlaylistAgent.ShuffleMode;
-import android.media.MediaSession2.CommandButton;
-import android.media.MediaSessionService2;
-import android.media.Rating2;
-import android.media.SessionCommand2;
-import android.media.SessionCommandGroup2;
-import android.media.SessionToken2;
-import android.media.update.MediaController2Provider;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.os.UserHandle;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.GuardedBy;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-public class MediaController2Impl implements MediaController2Provider {
- private static final String TAG = "MediaController2";
- private static final boolean DEBUG = true; // TODO(jaewan): Change
-
- private final MediaController2 mInstance;
- private final Context mContext;
- private final Object mLock = new Object();
-
- private final MediaController2Stub mControllerStub;
- private final SessionToken2 mToken;
- private final ControllerCallback mCallback;
- private final Executor mCallbackExecutor;
- private final IBinder.DeathRecipient mDeathRecipient;
-
- @GuardedBy("mLock")
- private SessionServiceConnection mServiceConnection;
- @GuardedBy("mLock")
- private boolean mIsReleased;
- @GuardedBy("mLock")
- private List<MediaItem2> mPlaylist;
- @GuardedBy("mLock")
- private MediaMetadata2 mPlaylistMetadata;
- @GuardedBy("mLock")
- private @RepeatMode int mRepeatMode;
- @GuardedBy("mLock")
- private @ShuffleMode int mShuffleMode;
- @GuardedBy("mLock")
- private int mPlayerState;
- @GuardedBy("mLock")
- private long mPositionEventTimeMs;
- @GuardedBy("mLock")
- private long mPositionMs;
- @GuardedBy("mLock")
- private float mPlaybackSpeed;
- @GuardedBy("mLock")
- private long mBufferedPositionMs;
- @GuardedBy("mLock")
- private PlaybackInfo mPlaybackInfo;
- @GuardedBy("mLock")
- private PendingIntent mSessionActivity;
- @GuardedBy("mLock")
- private SessionCommandGroup2 mAllowedCommands;
-
- // Assignment should be used with the lock hold, but should be used without a lock to prevent
- // potential deadlock.
- // Postfix -Binder is added to explicitly show that it's potentially remote process call.
- // Technically -Interface is more correct, but it may misread that it's interface (vs class)
- // so let's keep this postfix until we find better postfix.
- @GuardedBy("mLock")
- private volatile IMediaSession2 mSessionBinder;
-
- // TODO(jaewan): Require session activeness changed listener, because controller can be
- // available when the session's player is null.
- public MediaController2Impl(Context context, MediaController2 instance, SessionToken2 token,
- Executor executor, ControllerCallback callback) {
- mInstance = instance;
- if (context == null) {
- throw new IllegalArgumentException("context shouldn't be null");
- }
- if (token == null) {
- throw new IllegalArgumentException("token shouldn't be null");
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback shouldn't be null");
- }
- if (executor == null) {
- throw new IllegalArgumentException("executor shouldn't be null");
- }
- mContext = context;
- mControllerStub = new MediaController2Stub(this);
- mToken = token;
- mCallback = callback;
- mCallbackExecutor = executor;
- mDeathRecipient = () -> {
- mInstance.close();
- };
-
- mSessionBinder = null;
- }
-
- @Override
- public void initialize() {
- // TODO(jaewan): More sanity checks.
- if (mToken.getType() == SessionToken2.TYPE_SESSION) {
- // Session
- mServiceConnection = null;
- connectToSession(SessionToken2Impl.from(mToken).getSessionBinder());
- } else {
- // Session service
- if (Process.myUid() == Process.SYSTEM_UID) {
- // It's system server (MediaSessionService) that wants to monitor session.
- // Don't bind if able..
- IMediaSession2 binder = SessionToken2Impl.from(mToken).getSessionBinder();
- if (binder != null) {
- // Use binder in the session token instead of bind by its own.
- // Otherwise server will holds the binding to the service *forever* and service
- // will never stop.
- mServiceConnection = null;
- connectToSession(SessionToken2Impl.from(mToken).getSessionBinder());
- return;
- } else if (DEBUG) {
- // Should happen only when system server wants to dispatch media key events to
- // a dead service.
- Log.d(TAG, "System server binds to a session service. Should unbind"
- + " immediately after the use.");
- }
- }
- mServiceConnection = new SessionServiceConnection();
- connectToService();
- }
- }
-
- private void connectToService() {
- // Service. Needs to get fresh binder whenever connection is needed.
- SessionToken2Impl impl = SessionToken2Impl.from(mToken);
- final Intent intent = new Intent(MediaSessionService2.SERVICE_INTERFACE);
- intent.setClassName(mToken.getPackageName(), impl.getServiceName());
-
- // Use bindService() instead of startForegroundService() to start session service for three
- // reasons.
- // 1. Prevent session service owner's stopSelf() from destroying service.
- // With the startForegroundService(), service's call of stopSelf() will trigger immediate
- // onDestroy() calls on the main thread even when onConnect() is running in another
- // thread.
- // 2. Minimize APIs for developers to take care about.
- // With bindService(), developers only need to take care about Service.onBind()
- // but Service.onStartCommand() should be also taken care about with the
- // startForegroundService().
- // 3. Future support for UI-less playback
- // If a service wants to keep running, it should be either foreground service or
- // bounded service. But there had been request for the feature for system apps
- // and using bindService() will be better fit with it.
- boolean result;
- if (Process.myUid() == Process.SYSTEM_UID) {
- // Use bindServiceAsUser() for binding from system service to avoid following warning.
- // ContextImpl: Calling a method in the system process without a qualified user
- result = mContext.bindServiceAsUser(intent, mServiceConnection, Context.BIND_AUTO_CREATE,
- UserHandle.getUserHandleForUid(mToken.getUid()));
- } else {
- result = mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
- }
- if (!result) {
- Log.w(TAG, "bind to " + mToken + " failed");
- } else if (DEBUG) {
- Log.d(TAG, "bind to " + mToken + " success");
- }
- }
-
- private void connectToSession(IMediaSession2 sessionBinder) {
- try {
- sessionBinder.connect(mControllerStub, mContext.getPackageName());
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to call connection request. Framework will retry"
- + " automatically");
- }
- }
-
- @Override
- public void close_impl() {
- if (DEBUG) {
- Log.d(TAG, "release from " + mToken);
- }
- final IMediaSession2 binder;
- synchronized (mLock) {
- if (mIsReleased) {
- // Prevent re-enterance from the ControllerCallback.onDisconnected()
- return;
- }
- mIsReleased = true;
- if (mServiceConnection != null) {
- mContext.unbindService(mServiceConnection);
- mServiceConnection = null;
- }
- binder = mSessionBinder;
- mSessionBinder = null;
- mControllerStub.destroy();
- }
- if (binder != null) {
- try {
- binder.asBinder().unlinkToDeath(mDeathRecipient, 0);
- binder.release(mControllerStub);
- } catch (RemoteException e) {
- // No-op.
- }
- }
- mCallbackExecutor.execute(() -> {
- mCallback.onDisconnected(mInstance);
- });
- }
-
- IMediaSession2 getSessionBinder() {
- return mSessionBinder;
- }
-
- MediaController2Stub getControllerStub() {
- return mControllerStub;
- }
-
- Executor getCallbackExecutor() {
- return mCallbackExecutor;
- }
-
- Context getContext() {
- return mContext;
- }
-
- MediaController2 getInstance() {
- return mInstance;
- }
-
- // Returns session binder if the controller can send the command.
- IMediaSession2 getSessionBinderIfAble(int commandCode) {
- synchronized (mLock) {
- if (!mAllowedCommands.hasCommand(commandCode)) {
- // Cannot send because isn't allowed to.
- Log.w(TAG, "Controller isn't allowed to call command, commandCode="
- + commandCode);
- return null;
- }
- }
- // TODO(jaewan): Should we do this with the lock hold?
- final IMediaSession2 binder = mSessionBinder;
- if (binder == null) {
- // Cannot send because disconnected.
- Log.w(TAG, "Session is disconnected");
- }
- return binder;
- }
-
- // Returns session binder if the controller can send the command.
- IMediaSession2 getSessionBinderIfAble(SessionCommand2 command) {
- synchronized (mLock) {
- if (!mAllowedCommands.hasCommand(command)) {
- Log.w(TAG, "Controller isn't allowed to call command, command=" + command);
- return null;
- }
- }
- // TODO(jaewan): Should we do this with the lock hold?
- final IMediaSession2 binder = mSessionBinder;
- if (binder == null) {
- // Cannot send because disconnected.
- Log.w(TAG, "Session is disconnected");
- }
- return binder;
- }
-
- @Override
- public SessionToken2 getSessionToken_impl() {
- return mToken;
- }
-
- @Override
- public boolean isConnected_impl() {
- final IMediaSession2 binder = mSessionBinder;
- return binder != null;
- }
-
- @Override
- public void play_impl() {
- sendTransportControlCommand(SessionCommand2.COMMAND_CODE_PLAYBACK_PLAY);
- }
-
- @Override
- public void pause_impl() {
- sendTransportControlCommand(SessionCommand2.COMMAND_CODE_PLAYBACK_PAUSE);
- }
-
- @Override
- public void stop_impl() {
- sendTransportControlCommand(SessionCommand2.COMMAND_CODE_PLAYBACK_STOP);
- }
-
- @Override
- public void skipToPlaylistItem_impl(MediaItem2 item) {
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- final IMediaSession2 binder = mSessionBinder;
- if (binder != null) {
- try {
- binder.skipToPlaylistItem(mControllerStub, item.toBundle());
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void skipToPreviousItem_impl() {
- final IMediaSession2 binder = mSessionBinder;
- if (binder != null) {
- try {
- binder.skipToPreviousItem(mControllerStub);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void skipToNextItem_impl() {
- final IMediaSession2 binder = mSessionBinder;
- if (binder != null) {
- try {
- binder.skipToNextItem(mControllerStub);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- private void sendTransportControlCommand(int commandCode) {
- sendTransportControlCommand(commandCode, null);
- }
-
- private void sendTransportControlCommand(int commandCode, Bundle args) {
- final IMediaSession2 binder = mSessionBinder;
- if (binder != null) {
- try {
- binder.sendTransportControlCommand(mControllerStub, commandCode, args);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public PendingIntent getSessionActivity_impl() {
- return mSessionActivity;
- }
-
- @Override
- public void setVolumeTo_impl(int value, int flags) {
- // TODO(hdmoon): sanity check
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_SET_VOLUME);
- if (binder != null) {
- try {
- binder.setVolumeTo(mControllerStub, value, flags);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void adjustVolume_impl(int direction, int flags) {
- // TODO(hdmoon): sanity check
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_SET_VOLUME);
- if (binder != null) {
- try {
- binder.adjustVolume(mControllerStub, direction, flags);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void prepareFromUri_impl(Uri uri, Bundle extras) {
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_SESSION_PREPARE_FROM_URI);
- if (uri == null) {
- throw new IllegalArgumentException("uri shouldn't be null");
- }
- if (binder != null) {
- try {
- binder.prepareFromUri(mControllerStub, uri, extras);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- // TODO(jaewan): Handle.
- }
- }
-
- @Override
- public void prepareFromSearch_impl(String query, Bundle extras) {
- final IMediaSession2 binder = getSessionBinderIfAble(
- COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH);
- if (TextUtils.isEmpty(query)) {
- throw new IllegalArgumentException("query shouldn't be empty");
- }
- if (binder != null) {
- try {
- binder.prepareFromSearch(mControllerStub, query, extras);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- // TODO(jaewan): Handle.
- }
- }
-
- @Override
- public void prepareFromMediaId_impl(String mediaId, Bundle extras) {
- final IMediaSession2 binder = getSessionBinderIfAble(
- COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID);
- if (mediaId == null) {
- throw new IllegalArgumentException("mediaId shouldn't be null");
- }
- if (binder != null) {
- try {
- binder.prepareFromMediaId(mControllerStub, mediaId, extras);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- // TODO(jaewan): Handle.
- }
- }
-
- @Override
- public void playFromUri_impl(Uri uri, Bundle extras) {
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_SESSION_PLAY_FROM_URI);
- if (uri == null) {
- throw new IllegalArgumentException("uri shouldn't be null");
- }
- if (binder != null) {
- try {
- binder.playFromUri(mControllerStub, uri, extras);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- // TODO(jaewan): Handle.
- }
- }
-
- @Override
- public void playFromSearch_impl(String query, Bundle extras) {
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_SESSION_PLAY_FROM_SEARCH);
- if (TextUtils.isEmpty(query)) {
- throw new IllegalArgumentException("query shouldn't be empty");
- }
- if (binder != null) {
- try {
- binder.playFromSearch(mControllerStub, query, extras);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- // TODO(jaewan): Handle.
- }
- }
-
- @Override
- public void playFromMediaId_impl(String mediaId, Bundle extras) {
- final IMediaSession2 binder = getSessionBinderIfAble(
- COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID);
- if (mediaId == null) {
- throw new IllegalArgumentException("mediaId shouldn't be null");
- }
- if (binder != null) {
- try {
- binder.playFromMediaId(mControllerStub, mediaId, extras);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- // TODO(jaewan): Handle.
- }
- }
-
- @Override
- public void setRating_impl(String mediaId, Rating2 rating) {
- if (mediaId == null) {
- throw new IllegalArgumentException("mediaId shouldn't be null");
- }
- if (rating == null) {
- throw new IllegalArgumentException("rating shouldn't be null");
- }
-
- final IMediaSession2 binder = mSessionBinder;
- if (binder != null) {
- try {
- binder.setRating(mControllerStub, mediaId, rating.toBundle());
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- // TODO(jaewan): Handle.
- }
- }
-
- @Override
- public void sendCustomCommand_impl(SessionCommand2 command, Bundle args, ResultReceiver cb) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- final IMediaSession2 binder = getSessionBinderIfAble(command);
- if (binder != null) {
- try {
- binder.sendCustomCommand(mControllerStub, command.toBundle(), args, cb);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public List<MediaItem2> getPlaylist_impl() {
- synchronized (mLock) {
- return mPlaylist;
- }
- }
-
- @Override
- public void setPlaylist_impl(List<MediaItem2> list, MediaMetadata2 metadata) {
- if (list == null) {
- throw new IllegalArgumentException("list shouldn't be null");
- }
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_PLAYLIST_SET_LIST);
- if (binder != null) {
- List<Bundle> bundleList = new ArrayList<>();
- for (int i = 0; i < list.size(); i++) {
- bundleList.add(list.get(i).toBundle());
- }
- Bundle metadataBundle = (metadata == null) ? null : metadata.toBundle();
- try {
- binder.setPlaylist(mControllerStub, bundleList, metadataBundle);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public MediaMetadata2 getPlaylistMetadata_impl() {
- synchronized (mLock) {
- return mPlaylistMetadata;
- }
- }
-
- @Override
- public void updatePlaylistMetadata_impl(MediaMetadata2 metadata) {
- final IMediaSession2 binder = getSessionBinderIfAble(
- COMMAND_CODE_PLAYLIST_SET_LIST_METADATA);
- if (binder != null) {
- Bundle metadataBundle = (metadata == null) ? null : metadata.toBundle();
- try {
- binder.updatePlaylistMetadata(mControllerStub, metadataBundle);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void prepare_impl() {
- sendTransportControlCommand(SessionCommand2.COMMAND_CODE_PLAYBACK_PREPARE);
- }
-
- @Override
- public void fastForward_impl() {
- // TODO(jaewan): Implement this. Note that fast forward isn't a transport command anymore
- //sendTransportControlCommand(MediaSession2.COMMAND_CODE_SESSION_FAST_FORWARD);
- }
-
- @Override
- public void rewind_impl() {
- // TODO(jaewan): Implement this. Note that rewind isn't a transport command anymore
- //sendTransportControlCommand(MediaSession2.COMMAND_CODE_SESSION_REWIND);
- }
-
- @Override
- public void seekTo_impl(long pos) {
- if (pos < 0) {
- throw new IllegalArgumentException("position shouldn't be negative");
- }
- Bundle args = new Bundle();
- args.putLong(MediaSession2Stub.ARGUMENT_KEY_POSITION, pos);
- sendTransportControlCommand(SessionCommand2.COMMAND_CODE_PLAYBACK_SEEK_TO, args);
- }
-
- @Override
- public void addPlaylistItem_impl(int index, MediaItem2 item) {
- if (index < 0) {
- throw new IllegalArgumentException("index shouldn't be negative");
- }
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_PLAYLIST_ADD_ITEM);
- if (binder != null) {
- try {
- binder.addPlaylistItem(mControllerStub, index, item.toBundle());
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void removePlaylistItem_impl(MediaItem2 item) {
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_PLAYLIST_REMOVE_ITEM);
- if (binder != null) {
- try {
- binder.removePlaylistItem(mControllerStub, item.toBundle());
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public void replacePlaylistItem_impl(int index, MediaItem2 item) {
- if (index < 0) {
- throw new IllegalArgumentException("index shouldn't be negative");
- }
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_PLAYLIST_REPLACE_ITEM);
- if (binder != null) {
- try {
- binder.replacePlaylistItem(mControllerStub, index, item.toBundle());
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public int getShuffleMode_impl() {
- return mShuffleMode;
- }
-
- @Override
- public void setShuffleMode_impl(int shuffleMode) {
- final IMediaSession2 binder = getSessionBinderIfAble(
- COMMAND_CODE_PLAYLIST_SET_SHUFFLE_MODE);
- if (binder != null) {
- try {
- binder.setShuffleMode(mControllerStub, shuffleMode);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public int getRepeatMode_impl() {
- return mRepeatMode;
- }
-
- @Override
- public void setRepeatMode_impl(int repeatMode) {
- final IMediaSession2 binder = getSessionBinderIfAble(COMMAND_CODE_PLAYLIST_SET_REPEAT_MODE);
- if (binder != null) {
- try {
- binder.setRepeatMode(mControllerStub, repeatMode);
- } catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to the service or the session is gone", e);
- }
- } else {
- Log.w(TAG, "Session isn't active", new IllegalStateException());
- }
- }
-
- @Override
- public PlaybackInfo getPlaybackInfo_impl() {
- synchronized (mLock) {
- return mPlaybackInfo;
- }
- }
-
- @Override
- public int getPlayerState_impl() {
- synchronized (mLock) {
- return mPlayerState;
- }
- }
-
- @Override
- public long getCurrentPosition_impl() {
- synchronized (mLock) {
- long timeDiff = System.currentTimeMillis() - mPositionEventTimeMs;
- long expectedPosition = mPositionMs + (long) (mPlaybackSpeed * timeDiff);
- return Math.max(0, expectedPosition);
- }
- }
-
- @Override
- public float getPlaybackSpeed_impl() {
- synchronized (mLock) {
- return mPlaybackSpeed;
- }
- }
-
- @Override
- public long getBufferedPosition_impl() {
- synchronized (mLock) {
- return mBufferedPositionMs;
- }
- }
-
- @Override
- public MediaItem2 getCurrentMediaItem_impl() {
- // TODO(jaewan): Implement
- return null;
- }
-
- void pushPlayerStateChanges(final int state) {
- synchronized (mLock) {
- mPlayerState = state;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onPlayerStateChanged(mInstance, state);
- });
- }
-
- // TODO(jaewan): Rename to seek completed
- void pushPositionChanges(final long eventTimeMs, final long positionMs) {
- synchronized (mLock) {
- mPositionEventTimeMs = eventTimeMs;
- mPositionMs = positionMs;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onSeekCompleted(mInstance, positionMs);
- });
- }
-
- void pushPlaybackSpeedChanges(final float speed) {
- synchronized (mLock) {
- mPlaybackSpeed = speed;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onPlaybackSpeedChanged(mInstance, speed);
- });
- }
-
- void pushBufferedPositionChanges(final long bufferedPositionMs) {
- synchronized (mLock) {
- mBufferedPositionMs = bufferedPositionMs;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- // TODO(jaewan): Fix this -- it's now buffered state
- //mCallback.onBufferedPositionChanged(mInstance, bufferedPositionMs);
- });
- }
-
- void pushPlaybackInfoChanges(final PlaybackInfo info) {
- synchronized (mLock) {
- mPlaybackInfo = info;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onPlaybackInfoChanged(mInstance, info);
- });
- }
-
- void pushPlaylistChanges(final List<MediaItem2> playlist, final MediaMetadata2 metadata) {
- synchronized (mLock) {
- mPlaylist = playlist;
- mPlaylistMetadata = metadata;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onPlaylistChanged(mInstance, playlist, metadata);
- });
- }
-
- void pushPlaylistMetadataChanges(MediaMetadata2 metadata) {
- synchronized (mLock) {
- mPlaylistMetadata = metadata;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onPlaylistMetadataChanged(mInstance, metadata);
- });
- }
-
- void pushShuffleModeChanges(int shuffleMode) {
- synchronized (mLock) {
- mShuffleMode = shuffleMode;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onShuffleModeChanged(mInstance, shuffleMode);
- });
- }
-
- void pushRepeatModeChanges(int repeatMode) {
- synchronized (mLock) {
- mRepeatMode = repeatMode;
- }
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onRepeatModeChanged(mInstance, repeatMode);
- });
- }
-
- void pushError(int errorCode, Bundle extras) {
- mCallbackExecutor.execute(() -> {
- if (!mInstance.isConnected()) {
- return;
- }
- mCallback.onError(mInstance, errorCode, extras);
- });
- }
-
- // Should be used without a lock to prevent potential deadlock.
- void onConnectedNotLocked(IMediaSession2 sessionBinder,
- final SessionCommandGroup2 allowedCommands,
- final int playerState,
- final long positionEventTimeMs,
- final long positionMs,
- final float playbackSpeed,
- final long bufferedPositionMs,
- final PlaybackInfo info,
- final int repeatMode,
- final int shuffleMode,
- final List<MediaItem2> playlist,
- final PendingIntent sessionActivity) {
- if (DEBUG) {
- Log.d(TAG, "onConnectedNotLocked sessionBinder=" + sessionBinder
- + ", allowedCommands=" + allowedCommands);
- }
- boolean close = false;
- try {
- if (sessionBinder == null || allowedCommands == null) {
- // Connection rejected.
- close = true;
- return;
- }
- synchronized (mLock) {
- if (mIsReleased) {
- return;
- }
- if (mSessionBinder != null) {
- Log.e(TAG, "Cannot be notified about the connection result many times."
- + " Probably a bug or malicious app.");
- close = true;
- return;
- }
- mAllowedCommands = allowedCommands;
- mPlayerState = playerState;
- mPositionEventTimeMs = positionEventTimeMs;
- mPositionMs = positionMs;
- mPlaybackSpeed = playbackSpeed;
- mBufferedPositionMs = bufferedPositionMs;
- mPlaybackInfo = info;
- mRepeatMode = repeatMode;
- mShuffleMode = shuffleMode;
- mPlaylist = playlist;
- mSessionActivity = sessionActivity;
- mSessionBinder = sessionBinder;
- try {
- // Implementation for the local binder is no-op,
- // so can be used without worrying about deadlock.
- mSessionBinder.asBinder().linkToDeath(mDeathRecipient, 0);
- } catch (RemoteException e) {
- if (DEBUG) {
- Log.d(TAG, "Session died too early.", e);
- }
- close = true;
- return;
- }
- }
- // TODO(jaewan): Keep commands to prevents illegal API calls.
- mCallbackExecutor.execute(() -> {
- // Note: We may trigger ControllerCallbacks with the initial values
- // But it's hard to define the order of the controller callbacks
- // Only notify about the
- mCallback.onConnected(mInstance, allowedCommands);
- });
- } finally {
- if (close) {
- // Trick to call release() without holding the lock, to prevent potential deadlock
- // with the developer's custom lock within the ControllerCallback.onDisconnected().
- mInstance.close();
- }
- }
- }
-
- void onCustomCommand(final SessionCommand2 command, final Bundle args,
- final ResultReceiver receiver) {
- if (DEBUG) {
- Log.d(TAG, "onCustomCommand cmd=" + command);
- }
- mCallbackExecutor.execute(() -> {
- // TODO(jaewan): Double check if the controller exists.
- mCallback.onCustomCommand(mInstance, command, args, receiver);
- });
- }
-
- void onAllowedCommandsChanged(final SessionCommandGroup2 commands) {
- mCallbackExecutor.execute(() -> {
- mCallback.onAllowedCommandsChanged(mInstance, commands);
- });
- }
-
- void onCustomLayoutChanged(final List<CommandButton> layout) {
- mCallbackExecutor.execute(() -> {
- mCallback.onCustomLayoutChanged(mInstance, layout);
- });
- }
-
- // This will be called on the main thread.
- private class SessionServiceConnection implements ServiceConnection {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- // Note that it's always main-thread.
- if (DEBUG) {
- Log.d(TAG, "onServiceConnected " + name + " " + this);
- }
- // Sanity check
- if (!mToken.getPackageName().equals(name.getPackageName())) {
- Log.wtf(TAG, name + " was connected, but expected pkg="
- + mToken.getPackageName() + " with id=" + mToken.getId());
- return;
- }
- final IMediaSession2 sessionBinder = IMediaSession2.Stub.asInterface(service);
- connectToSession(sessionBinder);
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- // Temporal lose of the binding because of the service crash. System will automatically
- // rebind, so just no-op.
- // TODO(jaewan): Really? Either disconnect cleanly or
- if (DEBUG) {
- Log.w(TAG, "Session service " + name + " is disconnected.");
- }
- }
-
- @Override
- public void onBindingDied(ComponentName name) {
- // Permanent lose of the binding because of the service package update or removed.
- // This SessionServiceRecord will be removed accordingly, but forget session binder here
- // for sure.
- mInstance.close();
- }
- }
-
- public static final class PlaybackInfoImpl implements PlaybackInfoProvider {
-
- private static final String KEY_PLAYBACK_TYPE =
- "android.media.playbackinfo_impl.playback_type";
- private static final String KEY_CONTROL_TYPE =
- "android.media.playbackinfo_impl.control_type";
- private static final String KEY_MAX_VOLUME =
- "android.media.playbackinfo_impl.max_volume";
- private static final String KEY_CURRENT_VOLUME =
- "android.media.playbackinfo_impl.current_volume";
- private static final String KEY_AUDIO_ATTRIBUTES =
- "android.media.playbackinfo_impl.audio_attrs";
-
- private final PlaybackInfo mInstance;
-
- private final int mPlaybackType;
- private final int mControlType;
- private final int mMaxVolume;
- private final int mCurrentVolume;
- private final AudioAttributes mAudioAttrs;
-
- private PlaybackInfoImpl(int playbackType, AudioAttributes attrs, int controlType,
- int max, int current) {
- mPlaybackType = playbackType;
- mAudioAttrs = attrs;
- mControlType = controlType;
- mMaxVolume = max;
- mCurrentVolume = current;
- mInstance = new PlaybackInfo(this);
- }
-
- @Override
- public int getPlaybackType_impl() {
- return mPlaybackType;
- }
-
- @Override
- public AudioAttributes getAudioAttributes_impl() {
- return mAudioAttrs;
- }
-
- @Override
- public int getControlType_impl() {
- return mControlType;
- }
-
- @Override
- public int getMaxVolume_impl() {
- return mMaxVolume;
- }
-
- @Override
- public int getCurrentVolume_impl() {
- return mCurrentVolume;
- }
-
- PlaybackInfo getInstance() {
- return mInstance;
- }
-
- Bundle toBundle() {
- Bundle bundle = new Bundle();
- bundle.putInt(KEY_PLAYBACK_TYPE, mPlaybackType);
- bundle.putInt(KEY_CONTROL_TYPE, mControlType);
- bundle.putInt(KEY_MAX_VOLUME, mMaxVolume);
- bundle.putInt(KEY_CURRENT_VOLUME, mCurrentVolume);
- bundle.putParcelable(KEY_AUDIO_ATTRIBUTES, mAudioAttrs);
- return bundle;
- }
-
- static PlaybackInfo createPlaybackInfo(int playbackType, AudioAttributes attrs,
- int controlType, int max, int current) {
- return new PlaybackInfoImpl(playbackType, attrs, controlType, max, current)
- .getInstance();
- }
-
- static PlaybackInfo fromBundle(Bundle bundle) {
- if (bundle == null) {
- return null;
- }
- final int volumeType = bundle.getInt(KEY_PLAYBACK_TYPE);
- final int volumeControl = bundle.getInt(KEY_CONTROL_TYPE);
- final int maxVolume = bundle.getInt(KEY_MAX_VOLUME);
- final int currentVolume = bundle.getInt(KEY_CURRENT_VOLUME);
- final AudioAttributes attrs = bundle.getParcelable(KEY_AUDIO_ATTRIBUTES);
-
- return createPlaybackInfo(volumeType, attrs, volumeControl, maxVolume, currentVolume);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaController2Stub.java b/packages/MediaComponents/src/com/android/media/MediaController2Stub.java
deleted file mode 100644
index ece4a00..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaController2Stub.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.media.MediaController2;
-import android.media.MediaItem2;
-import android.media.MediaMetadata2;
-import android.media.MediaSession2.CommandButton;
-import android.media.SessionCommand2;
-import android.media.SessionCommandGroup2;
-import android.os.Bundle;
-import android.os.ResultReceiver;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.media.MediaController2Impl.PlaybackInfoImpl;
-import com.android.media.MediaSession2Impl.CommandButtonImpl;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-public class MediaController2Stub extends IMediaController2.Stub {
- private static final String TAG = "MediaController2Stub";
- private static final boolean DEBUG = true; // TODO(jaewan): Change
-
- private final WeakReference<MediaController2Impl> mController;
-
- MediaController2Stub(MediaController2Impl controller) {
- mController = new WeakReference<>(controller);
- }
-
- private MediaController2Impl getController() throws IllegalStateException {
- final MediaController2Impl controller = mController.get();
- if (controller == null) {
- throw new IllegalStateException("Controller is released");
- }
- return controller;
- }
-
- private MediaBrowser2Impl getBrowser() throws IllegalStateException {
- final MediaController2Impl controller = getController();
- if (controller instanceof MediaBrowser2Impl) {
- return (MediaBrowser2Impl) controller;
- }
- return null;
- }
-
- public void destroy() {
- mController.clear();
- }
-
- @Override
- public void onPlayerStateChanged(int state) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- controller.pushPlayerStateChanges(state);
- }
-
- @Override
- public void onPositionChanged(long eventTimeMs, long positionMs) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (eventTimeMs < 0) {
- Log.w(TAG, "onPositionChanged(): Ignoring negative eventTimeMs");
- return;
- }
- if (positionMs < 0) {
- Log.w(TAG, "onPositionChanged(): Ignoring negative positionMs");
- return;
- }
- controller.pushPositionChanges(eventTimeMs, positionMs);
- }
-
- @Override
- public void onPlaybackSpeedChanged(float speed) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- controller.pushPlaybackSpeedChanges(speed);
- }
-
- @Override
- public void onBufferedPositionChanged(long bufferedPositionMs) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (bufferedPositionMs < 0) {
- Log.w(TAG, "onBufferedPositionChanged(): Ignoring negative bufferedPositionMs");
- return;
- }
- controller.pushBufferedPositionChanges(bufferedPositionMs);
- }
-
- @Override
- public void onPlaylistChanged(List<Bundle> playlistBundle, Bundle metadataBundle) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (playlistBundle == null) {
- Log.w(TAG, "onPlaylistChanged(): Ignoring null playlist from " + controller);
- return;
- }
- List<MediaItem2> playlist = new ArrayList<>();
- for (Bundle bundle : playlistBundle) {
- MediaItem2 item = MediaItem2.fromBundle(bundle);
- if (item == null) {
- Log.w(TAG, "onPlaylistChanged(): Ignoring null item in playlist");
- } else {
- playlist.add(item);
- }
- }
- MediaMetadata2 metadata = MediaMetadata2.fromBundle(metadataBundle);
- controller.pushPlaylistChanges(playlist, metadata);
- }
-
- @Override
- public void onPlaylistMetadataChanged(Bundle metadataBundle) throws RuntimeException {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- MediaMetadata2 metadata = MediaMetadata2.fromBundle(metadataBundle);
- controller.pushPlaylistMetadataChanges(metadata);
- }
-
- @Override
- public void onRepeatModeChanged(int repeatMode) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- controller.pushRepeatModeChanges(repeatMode);
- }
-
- @Override
- public void onPlaybackInfoChanged(Bundle playbackInfo) throws RuntimeException {
- if (DEBUG) {
- Log.d(TAG, "onPlaybackInfoChanged");
- }
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- MediaController2.PlaybackInfo info = PlaybackInfoImpl.fromBundle(playbackInfo);
- if (info == null) {
- Log.w(TAG, "onPlaybackInfoChanged(): Ignoring null playbackInfo");
- return;
- }
- controller.pushPlaybackInfoChanges(info);
- }
-
- @Override
- public void onShuffleModeChanged(int shuffleMode) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- controller.pushShuffleModeChanges(shuffleMode);
- }
-
- @Override
- public void onError(int errorCode, Bundle extras) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- controller.pushError(errorCode, extras);
- }
-
- @Override
- public void onConnected(IMediaSession2 sessionBinder, Bundle commandGroup,
- int playerState, long positionEventTimeMs, long positionMs, float playbackSpeed,
- long bufferedPositionMs, Bundle playbackInfo, int shuffleMode, int repeatMode,
- List<Bundle> itemBundleList, PendingIntent sessionActivity) {
- final MediaController2Impl controller = mController.get();
- if (controller == null) {
- if (DEBUG) {
- Log.d(TAG, "onConnected after MediaController2.close()");
- }
- return;
- }
- final Context context = controller.getContext();
- List<MediaItem2> itemList = null;
- if (itemBundleList != null) {
- itemList = new ArrayList<>();
- for (int i = 0; i < itemBundleList.size(); i++) {
- MediaItem2 item = MediaItem2.fromBundle(itemBundleList.get(i));
- if (item != null) {
- itemList.add(item);
- }
- }
- }
- controller.onConnectedNotLocked(sessionBinder,
- SessionCommandGroup2.fromBundle(commandGroup),
- playerState, positionEventTimeMs, positionMs, playbackSpeed, bufferedPositionMs,
- PlaybackInfoImpl.fromBundle(playbackInfo), repeatMode, shuffleMode,
- itemList, sessionActivity);
- }
-
- @Override
- public void onDisconnected() {
- final MediaController2Impl controller = mController.get();
- if (controller == null) {
- if (DEBUG) {
- Log.d(TAG, "onDisconnected after MediaController2.close()");
- }
- return;
- }
- controller.getInstance().close();
- }
-
- @Override
- public void onCustomLayoutChanged(List<Bundle> commandButtonlist) {
- if (commandButtonlist == null) {
- Log.w(TAG, "onCustomLayoutChanged(): Ignoring null commandButtonlist");
- return;
- }
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (controller == null) {
- // TODO(jaewan): Revisit here. Could be a bug
- return;
- }
- List<CommandButton> layout = new ArrayList<>();
- for (int i = 0; i < commandButtonlist.size(); i++) {
- CommandButton button = CommandButtonImpl.fromBundle(commandButtonlist.get(i));
- if (button != null) {
- layout.add(button);
- }
- }
- controller.onCustomLayoutChanged(layout);
- }
-
- @Override
- public void onAllowedCommandsChanged(Bundle commandsBundle) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (controller == null) {
- // TODO(jaewan): Revisit here. Could be a bug
- return;
- }
- SessionCommandGroup2 commands = SessionCommandGroup2.fromBundle(commandsBundle);
- if (commands == null) {
- Log.w(TAG, "onAllowedCommandsChanged(): Ignoring null commands");
- return;
- }
- controller.onAllowedCommandsChanged(commands);
- }
-
- @Override
- public void onCustomCommand(Bundle commandBundle, Bundle args, ResultReceiver receiver) {
- final MediaController2Impl controller;
- try {
- controller = getController();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- SessionCommand2 command = SessionCommand2.fromBundle(commandBundle);
- if (command == null) {
- Log.w(TAG, "onCustomCommand(): Ignoring null command");
- return;
- }
- controller.onCustomCommand(command, args, receiver);
- }
-
- ////////////////////////////////////////////////////////////////////////////////////////////
- // MediaBrowser specific
- ////////////////////////////////////////////////////////////////////////////////////////////
- @Override
- public void onGetLibraryRootDone(Bundle rootHints, String rootMediaId, Bundle rootExtra)
- throws RuntimeException {
- final MediaBrowser2Impl browser;
- try {
- browser = getBrowser();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (browser == null) {
- // TODO(jaewan): Revisit here. Could be a bug
- return;
- }
- browser.onGetLibraryRootDone(rootHints, rootMediaId, rootExtra);
- }
-
-
- @Override
- public void onGetItemDone(String mediaId, Bundle itemBundle) throws RuntimeException {
- if (mediaId == null) {
- Log.w(TAG, "onGetItemDone(): Ignoring null mediaId");
- return;
- }
- final MediaBrowser2Impl browser;
- try {
- browser = getBrowser();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (browser == null) {
- // TODO(jaewan): Revisit here. Could be a bug
- return;
- }
- browser.onGetItemDone(mediaId, MediaItem2.fromBundle(itemBundle));
- }
-
- @Override
- public void onGetChildrenDone(String parentId, int page, int pageSize,
- List<Bundle> itemBundleList, Bundle extras) throws RuntimeException {
- if (parentId == null) {
- Log.w(TAG, "onGetChildrenDone(): Ignoring null parentId");
- return;
- }
- final MediaBrowser2Impl browser;
- try {
- browser = getBrowser();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (browser == null) {
- // TODO(jaewan): Revisit here. Could be a bug
- return;
- }
-
- List<MediaItem2> result = null;
- if (itemBundleList != null) {
- result = new ArrayList<>();
- for (Bundle bundle : itemBundleList) {
- result.add(MediaItem2.fromBundle(bundle));
- }
- }
- browser.onGetChildrenDone(parentId, page, pageSize, result, extras);
- }
-
- @Override
- public void onSearchResultChanged(String query, int itemCount, Bundle extras)
- throws RuntimeException {
- if (TextUtils.isEmpty(query)) {
- Log.w(TAG, "onSearchResultChanged(): Ignoring empty query");
- return;
- }
- final MediaBrowser2Impl browser;
- try {
- browser = getBrowser();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (browser == null) {
- // TODO(jaewan): Revisit here. Could be a bug
- return;
- }
- browser.onSearchResultChanged(query, itemCount, extras);
- }
-
- @Override
- public void onGetSearchResultDone(String query, int page, int pageSize,
- List<Bundle> itemBundleList, Bundle extras) throws RuntimeException {
- if (TextUtils.isEmpty(query)) {
- Log.w(TAG, "onGetSearchResultDone(): Ignoring empty query");
- return;
- }
- final MediaBrowser2Impl browser;
- try {
- browser = getBrowser();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (browser == null) {
- // TODO(jaewan): Revisit here. Could be a bug
- return;
- }
-
- List<MediaItem2> result = null;
- if (itemBundleList != null) {
- result = new ArrayList<>();
- for (Bundle bundle : itemBundleList) {
- result.add(MediaItem2.fromBundle(bundle));
- }
- }
- browser.onGetSearchResultDone(query, page, pageSize, result, extras);
- }
-
- @Override
- public void onChildrenChanged(String parentId, int itemCount, Bundle extras) {
- if (parentId == null) {
- Log.w(TAG, "onChildrenChanged(): Ignoring null parentId");
- return;
- }
- final MediaBrowser2Impl browser;
- try {
- browser = getBrowser();
- } catch (IllegalStateException e) {
- Log.w(TAG, "Don't fail silently here. Highly likely a bug");
- return;
- }
- if (browser == null) {
- // TODO(jaewan): Revisit here. Could be a bug
- return;
- }
- browser.onChildrenChanged(parentId, itemCount, extras);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaItem2Impl.java b/packages/MediaComponents/src/com/android/media/MediaItem2Impl.java
deleted file mode 100644
index 910a0f1..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaItem2Impl.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import static android.media.MediaItem2.FLAG_BROWSABLE;
-import static android.media.MediaItem2.FLAG_PLAYABLE;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.media.DataSourceDesc;
-import android.media.MediaItem2;
-import android.media.MediaItem2.Builder;
-import android.media.MediaItem2.Flags;
-import android.media.MediaMetadata2;
-import android.media.update.MediaItem2Provider;
-import android.os.Bundle;
-import android.text.TextUtils;
-
-import java.util.UUID;
-
-public class MediaItem2Impl implements MediaItem2Provider {
- private static final String KEY_ID = "android.media.mediaitem2.id";
- private static final String KEY_FLAGS = "android.media.mediaitem2.flags";
- private static final String KEY_METADATA = "android.media.mediaitem2.metadata";
- private static final String KEY_UUID = "android.media.mediaitem2.uuid";
-
- private final MediaItem2 mInstance;
- private final String mId;
- private final int mFlags;
- private final UUID mUUID;
- private MediaMetadata2 mMetadata;
- private DataSourceDesc mDataSourceDesc;
-
- // From the public API
- public MediaItem2Impl(@NonNull String mediaId, @Nullable DataSourceDesc dsd,
- @Nullable MediaMetadata2 metadata, @Flags int flags) {
- this(mediaId, dsd, metadata, flags, null);
- }
-
- private MediaItem2Impl(@NonNull String mediaId, @Nullable DataSourceDesc dsd,
- @Nullable MediaMetadata2 metadata, @Flags int flags, @Nullable UUID uuid) {
- if (mediaId == null) {
- throw new IllegalArgumentException("mediaId shouldn't be null");
- }
- if (metadata != null && !TextUtils.equals(mediaId, metadata.getMediaId())) {
- throw new IllegalArgumentException("metadata's id should be matched with the mediaid");
- }
-
- mId = mediaId;
- mDataSourceDesc = dsd;
- mMetadata = metadata;
- mFlags = flags;
- mUUID = (uuid == null) ? UUID.randomUUID() : uuid;
-
- mInstance = new MediaItem2(this);
- }
-
- @Override
- public boolean equals_impl(Object obj) {
- if (!(obj instanceof MediaItem2)) {
- return false;
- }
- MediaItem2 other = (MediaItem2) obj;
- return mUUID.equals(((MediaItem2Impl) other.getProvider()).mUUID);
- }
-
- /**
- * Return this object as a bundle to share between processes.
- *
- * @return a new bundle instance
- */
- public Bundle toBundle_impl() {
- Bundle bundle = new Bundle();
- bundle.putString(KEY_ID, mId);
- bundle.putInt(KEY_FLAGS, mFlags);
- if (mMetadata != null) {
- bundle.putBundle(KEY_METADATA, mMetadata.toBundle());
- }
- bundle.putString(KEY_UUID, mUUID.toString());
- return bundle;
- }
-
- /**
- * Create a MediaItem2 from the {@link Bundle}.
- *
- * @param bundle The bundle which was published by {@link MediaItem2#toBundle()}.
- * @return The newly created MediaItem2
- */
- public static MediaItem2 fromBundle_impl(@NonNull Bundle bundle) {
- if (bundle == null) {
- return null;
- }
- final String uuidString = bundle.getString(KEY_UUID);
- return fromBundle(bundle, UUID.fromString(uuidString));
- }
-
- /**
- * Create a MediaItem2 from the {@link Bundle} with the specified {@link UUID}.
- * If {@link UUID}
- * can be null for creating new.
- *
- * @param bundle The bundle which was published by {@link MediaItem2#toBundle()}.
- * @param uuid A {@link UUID} to override. Can be {@link null} for override.
- * @return The newly created MediaItem2
- */
- static MediaItem2 fromBundle(@NonNull Bundle bundle, @Nullable UUID uuid) {
- if (bundle == null) {
- return null;
- }
- final String id = bundle.getString(KEY_ID);
- final Bundle metadataBundle = bundle.getBundle(KEY_METADATA);
- final MediaMetadata2 metadata = MediaMetadata2.fromBundle(metadataBundle);
- final int flags = bundle.getInt(KEY_FLAGS);
- return new MediaItem2Impl(id, null, metadata, flags, uuid).getInstance();
- }
-
- private MediaItem2 getInstance() {
- return mInstance;
- }
-
- @Override
- public String toString_impl() {
- final StringBuilder sb = new StringBuilder("MediaItem2{");
- sb.append("mFlags=").append(mFlags);
- sb.append(", mMetadata=").append(mMetadata);
- sb.append('}');
- return sb.toString();
- }
-
- @Override
- public @Flags int getFlags_impl() {
- return mFlags;
- }
-
- @Override
- public boolean isBrowsable_impl() {
- return (mFlags & FLAG_BROWSABLE) != 0;
- }
-
- @Override
- public boolean isPlayable_impl() {
- return (mFlags & FLAG_PLAYABLE) != 0;
- }
-
- @Override
- public void setMetadata_impl(@Nullable MediaMetadata2 metadata) {
- if (metadata != null && !TextUtils.equals(mId, metadata.getMediaId())) {
- throw new IllegalArgumentException("metadata's id should be matched with the mediaId");
- }
- mMetadata = metadata;
- }
-
- @Override
- public @Nullable MediaMetadata2 getMetadata_impl() {
- return mMetadata;
- }
-
- @Override
- public @NonNull String getMediaId_impl() {
- return mId;
- }
-
- @Override
- public @Nullable DataSourceDesc getDataSourceDesc_impl() {
- return mDataSourceDesc;
- }
-
- public static class BuilderImpl implements MediaItem2Provider.BuilderProvider {
- private Builder mInstance;
- private @Flags int mFlags;
- private String mMediaId;
- private MediaMetadata2 mMetadata;
- private DataSourceDesc mDataSourceDesc;
-
- public BuilderImpl(Builder instance, int flags) {
- mInstance = instance;
- mFlags = flags;
- }
-
- @Override
- public Builder setMediaId_impl(@Nullable String mediaId) {
- mMediaId = mediaId;
- return mInstance;
- }
-
- @Override
- public Builder setMetadata_impl(@Nullable MediaMetadata2 metadata) {
- mMetadata = metadata;
- return mInstance;
- }
-
- @Override
- public Builder setDataSourceDesc_impl(@Nullable DataSourceDesc dataSourceDesc) {
- mDataSourceDesc = dataSourceDesc;
- return mInstance;
- }
-
- @Override
- public MediaItem2 build_impl() {
- String id = (mMetadata != null)
- ? mMetadata.getString(MediaMetadata2.METADATA_KEY_MEDIA_ID) : null;
- if (id == null) {
- // TODO(jaewan): Double check if its sufficient (e.g. Use UUID instead?)
- id = (mMediaId != null) ? mMediaId : toString();
- }
- return new MediaItem2Impl(id, mDataSourceDesc, mMetadata, mFlags).getInstance();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaLibraryService2Impl.java b/packages/MediaComponents/src/com/android/media/MediaLibraryService2Impl.java
deleted file mode 100644
index cf34cd4..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaLibraryService2Impl.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.media.MediaLibraryService2;
-import android.media.MediaLibraryService2.LibraryRoot;
-import android.media.MediaLibraryService2.MediaLibrarySession;
-import android.media.MediaLibraryService2.MediaLibrarySession.Builder;
-import android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback;
-import android.media.MediaPlayerBase;
-import android.media.MediaPlaylistAgent;
-import android.media.MediaSession2;
-import android.media.MediaSession2.ControllerInfo;
-import android.media.MediaSessionService2;
-import android.media.SessionToken2;
-import android.media.VolumeProvider2;
-import android.media.update.MediaLibraryService2Provider;
-import android.os.Bundle;
-import android.text.TextUtils;
-
-import com.android.media.MediaSession2Impl.BuilderBaseImpl;
-
-import java.util.concurrent.Executor;
-
-public class MediaLibraryService2Impl extends MediaSessionService2Impl implements
- MediaLibraryService2Provider {
- private final MediaSessionService2 mInstance;
- private MediaLibrarySession mLibrarySession;
-
- public MediaLibraryService2Impl(MediaLibraryService2 instance) {
- super(instance);
- mInstance = instance;
- }
-
- @Override
- public void onCreate_impl() {
- super.onCreate_impl();
-
- // Effectively final
- MediaSession2 session = getSession();
- if (!(session instanceof MediaLibrarySession)) {
- throw new RuntimeException("Expected MediaLibrarySession, but returned MediaSession2");
- }
- mLibrarySession = (MediaLibrarySession) getSession();
- }
-
- @Override
- int getSessionType() {
- return SessionToken2.TYPE_LIBRARY_SERVICE;
- }
-
- public static class MediaLibrarySessionImpl extends MediaSession2Impl
- implements MediaLibrarySessionProvider {
- public MediaLibrarySessionImpl(Context context,
- MediaPlayerBase player, String id, MediaPlaylistAgent playlistAgent,
- VolumeProvider2 volumeProvider,
- PendingIntent sessionActivity, Executor callbackExecutor,
- MediaLibrarySessionCallback callback) {
- super(context, player, id, playlistAgent, volumeProvider, sessionActivity,
- callbackExecutor, callback);
- // Don't put any extra initialization here. Here's the reason.
- // System service will recognize this session inside of the super constructor and would
- // connect to this session assuming that initialization is finished. However, if any
- // initialization logic is here, calls from the server would fail.
- // see: MediaSession2Stub#connect()
- }
-
- @Override
- MediaLibrarySession createInstance() {
- return new MediaLibrarySession(this);
- }
-
- @Override
- MediaLibrarySession getInstance() {
- return (MediaLibrarySession) super.getInstance();
- }
-
- @Override
- MediaLibrarySessionCallback getCallback() {
- return (MediaLibrarySessionCallback) super.getCallback();
- }
-
- @Override
- public void notifyChildrenChanged_impl(ControllerInfo controller, String parentId,
- int itemCount, Bundle extras) {
- if (controller == null) {
- throw new IllegalArgumentException("controller shouldn't be null");
- }
- if (parentId == null) {
- throw new IllegalArgumentException("parentId shouldn't be null");
- }
- getSessionStub().notifyChildrenChangedNotLocked(controller, parentId, itemCount,
- extras);
- }
-
- @Override
- public void notifyChildrenChanged_impl(String parentId, int itemCount, Bundle extras) {
- if (parentId == null) {
- throw new IllegalArgumentException("parentId shouldn't be null");
- }
- getSessionStub().notifyChildrenChangedNotLocked(parentId, itemCount, extras);
- }
-
- @Override
- public void notifySearchResultChanged_impl(ControllerInfo controller, String query,
- int itemCount, Bundle extras) {
- ensureCallingThread();
- if (controller == null) {
- throw new IllegalArgumentException("controller shouldn't be null");
- }
- if (TextUtils.isEmpty(query)) {
- throw new IllegalArgumentException("query shouldn't be empty");
- }
- getSessionStub().notifySearchResultChanged(controller, query, itemCount, extras);
- }
- }
-
- public static class BuilderImpl
- extends BuilderBaseImpl<MediaLibrarySession, MediaLibrarySessionCallback> {
- public BuilderImpl(MediaLibraryService2 service, Builder instance,
- Executor callbackExecutor, MediaLibrarySessionCallback callback) {
- super(service);
- setSessionCallback_impl(callbackExecutor, callback);
- }
-
- @Override
- public MediaLibrarySession build_impl() {
- return new MediaLibrarySessionImpl(mContext, mPlayer, mId, mPlaylistAgent,
- mVolumeProvider, mSessionActivity, mCallbackExecutor, mCallback).getInstance();
- }
- }
-
- public static final class LibraryRootImpl implements LibraryRootProvider {
- private final LibraryRoot mInstance;
- private final String mRootId;
- private final Bundle mExtras;
-
- public LibraryRootImpl(LibraryRoot instance, String rootId, Bundle extras) {
- if (rootId == null) {
- throw new IllegalArgumentException("rootId shouldn't be null.");
- }
- mInstance = instance;
- mRootId = rootId;
- mExtras = extras;
- }
-
- @Override
- public String getRootId_impl() {
- return mRootId;
- }
-
- @Override
- public Bundle getExtras_impl() {
- return mExtras;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaMetadata2Impl.java b/packages/MediaComponents/src/com/android/media/MediaMetadata2Impl.java
deleted file mode 100644
index cf1c532..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaMetadata2Impl.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import static android.media.MediaMetadata2.*;
-
-import android.annotation.Nullable;
-import android.graphics.Bitmap;
-import android.media.MediaMetadata2;
-import android.media.MediaMetadata2.BitmapKey;
-import android.media.MediaMetadata2.Builder;
-import android.media.MediaMetadata2.LongKey;
-import android.media.MediaMetadata2.RatingKey;
-import android.media.MediaMetadata2.TextKey;
-import android.media.Rating2;
-import android.media.update.MediaMetadata2Provider;
-import android.os.Bundle;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import java.util.Set;
-
-public class MediaMetadata2Impl implements MediaMetadata2Provider {
- private static final String TAG = "MediaMetadata2";
-
- static final int METADATA_TYPE_LONG = 0;
- static final int METADATA_TYPE_TEXT = 1;
- static final int METADATA_TYPE_BITMAP = 2;
- static final int METADATA_TYPE_RATING = 3;
- static final int METADATA_TYPE_FLOAT = 4;
- static final ArrayMap<String, Integer> METADATA_KEYS_TYPE;
-
- static {
- METADATA_KEYS_TYPE = new ArrayMap<String, Integer>();
- METADATA_KEYS_TYPE.put(METADATA_KEY_TITLE, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_ARTIST, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DURATION, METADATA_TYPE_LONG);
- METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_AUTHOR, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_WRITER, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_COMPOSER, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_COMPILATION, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DATE, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_YEAR, METADATA_TYPE_LONG);
- METADATA_KEYS_TYPE.put(METADATA_KEY_GENRE, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_TRACK_NUMBER, METADATA_TYPE_LONG);
- METADATA_KEYS_TYPE.put(METADATA_KEY_NUM_TRACKS, METADATA_TYPE_LONG);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DISC_NUMBER, METADATA_TYPE_LONG);
- METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ARTIST, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_ART, METADATA_TYPE_BITMAP);
- METADATA_KEYS_TYPE.put(METADATA_KEY_ART_URI, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ART, METADATA_TYPE_BITMAP);
- METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ART_URI, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_USER_RATING, METADATA_TYPE_RATING);
- METADATA_KEYS_TYPE.put(METADATA_KEY_RATING, METADATA_TYPE_RATING);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_TITLE, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_SUBTITLE, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_DESCRIPTION, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_ICON, METADATA_TYPE_BITMAP);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_ICON_URI, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_MEDIA_ID, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_BT_FOLDER_TYPE, METADATA_TYPE_LONG);
- METADATA_KEYS_TYPE.put(METADATA_KEY_MEDIA_URI, METADATA_TYPE_TEXT);
- METADATA_KEYS_TYPE.put(METADATA_KEY_ADVERTISEMENT, METADATA_TYPE_LONG);
- METADATA_KEYS_TYPE.put(METADATA_KEY_DOWNLOAD_STATUS, METADATA_TYPE_LONG);
- }
-
- private static final @TextKey
- String[] PREFERRED_DESCRIPTION_ORDER = {
- METADATA_KEY_TITLE,
- METADATA_KEY_ARTIST,
- METADATA_KEY_ALBUM,
- METADATA_KEY_ALBUM_ARTIST,
- METADATA_KEY_WRITER,
- METADATA_KEY_AUTHOR,
- METADATA_KEY_COMPOSER
- };
-
- private static final @BitmapKey
- String[] PREFERRED_BITMAP_ORDER = {
- METADATA_KEY_DISPLAY_ICON,
- METADATA_KEY_ART,
- METADATA_KEY_ALBUM_ART
- };
-
- private static final @TextKey
- String[] PREFERRED_URI_ORDER = {
- METADATA_KEY_DISPLAY_ICON_URI,
- METADATA_KEY_ART_URI,
- METADATA_KEY_ALBUM_ART_URI
- };
-
- private final MediaMetadata2 mInstance;
- private final Bundle mBundle;
-
- public MediaMetadata2Impl(Bundle bundle) {
- mInstance = new MediaMetadata2(this);
- mBundle = bundle;
- }
-
- public MediaMetadata2 getInstance() {
- return mInstance;
- }
-
- @Override
- public boolean containsKey_impl(String key) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- return mBundle.containsKey(key);
- }
-
- @Override
- public CharSequence getText_impl(@TextKey String key) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- return mBundle.getCharSequence(key);
- }
-
- @Override
- public @Nullable String getMediaId_impl() {
- return mInstance.getString(METADATA_KEY_MEDIA_ID);
- }
-
- @Override
- public String getString_impl(@TextKey String key) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- CharSequence text = mBundle.getCharSequence(key);
- if (text != null) {
- return text.toString();
- }
- return null;
- }
-
- @Override
- public long getLong_impl(@LongKey String key) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- return mBundle.getLong(key, 0);
- }
-
- @Override
- public Rating2 getRating_impl(@RatingKey String key) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- // TODO(jaewan): Add backward compatibility
- Rating2 rating = null;
- try {
- rating = Rating2.fromBundle(mBundle.getBundle(key));
- } catch (Exception e) {
- // ignore, value was not a rating
- Log.w(TAG, "Failed to retrieve a key as Rating.", e);
- }
- return rating;
- }
-
- @Override
- public float getFloat_impl(@FloatKey String key) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- return mBundle.getFloat(key);
- }
-
- @Override
- public Bitmap getBitmap_impl(@BitmapKey String key) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- Bitmap bmp = null;
- try {
- bmp = mBundle.getParcelable(key);
- } catch (Exception e) {
- // ignore, value was not a bitmap
- Log.w(TAG, "Failed to retrieve a key as Bitmap.", e);
- }
- return bmp;
- }
-
- @Override
- public Bundle getExtras_impl() {
- try {
- return mBundle.getBundle(METADATA_KEY_EXTRAS);
- } catch (Exception e) {
- // ignore, value was not an bundle
- Log.w(TAG, "Failed to retrieve an extra");
- }
- return null;
- }
-
- @Override
- public int size_impl() {
- return mBundle.size();
- }
-
- @Override
- public Set<String> keySet_impl() {
- return mBundle.keySet();
- }
-
- @Override
- public Bundle toBundle_impl() {
- return mBundle;
- }
-
- public static MediaMetadata2 fromBundle_impl(Bundle bundle) {
- return (bundle == null) ? null : new MediaMetadata2Impl(bundle).getInstance();
- }
-
- public static final class BuilderImpl implements MediaMetadata2Provider.BuilderProvider {
- private final MediaMetadata2.Builder mInstance;
- private final Bundle mBundle;
-
- public BuilderImpl(MediaMetadata2.Builder instance) {
- mInstance = instance;
- mBundle = new Bundle();
- }
-
- public BuilderImpl(MediaMetadata2.Builder instance, MediaMetadata2 source) {
- if (source == null) {
- throw new IllegalArgumentException("source shouldn't be null");
- }
- mInstance = instance;
- mBundle = new Bundle(source.toBundle());
- }
-
- public BuilderImpl(int maxBitmapSize) {
- mInstance = new MediaMetadata2.Builder(this);
- mBundle = new Bundle();
-
- for (String key : mBundle.keySet()) {
- Object value = mBundle.get(key);
- if (value instanceof Bitmap) {
- Bitmap bmp = (Bitmap) value;
- if (bmp.getHeight() > maxBitmapSize || bmp.getWidth() > maxBitmapSize) {
- mInstance.putBitmap(key, scaleBitmap(bmp, maxBitmapSize));
- }
- }
- }
- }
-
- @Override
- public Builder putText_impl(@TextKey String key, CharSequence value) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- if (METADATA_KEYS_TYPE.containsKey(key)) {
- if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_TEXT) {
- throw new IllegalArgumentException("The " + key
- + " key cannot be used to put a CharSequence");
- }
- }
- mBundle.putCharSequence(key, value);
- return mInstance;
- }
-
- @Override
- public Builder putString_impl(@TextKey String key, String value) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- if (METADATA_KEYS_TYPE.containsKey(key)) {
- if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_TEXT) {
- throw new IllegalArgumentException("The " + key
- + " key cannot be used to put a String");
- }
- }
- mBundle.putCharSequence(key, value);
- return mInstance;
- }
-
- @Override
- public Builder putLong_impl(@LongKey String key, long value) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- if (METADATA_KEYS_TYPE.containsKey(key)) {
- if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_LONG) {
- throw new IllegalArgumentException("The " + key
- + " key cannot be used to put a long");
- }
- }
- mBundle.putLong(key, value);
- return mInstance;
- }
-
- @Override
- public Builder putRating_impl(@RatingKey String key, Rating2 value) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- if (METADATA_KEYS_TYPE.containsKey(key)) {
- if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_RATING) {
- throw new IllegalArgumentException("The " + key
- + " key cannot be used to put a Rating");
- }
- }
- mBundle.putBundle(key, value.toBundle());
- return mInstance;
- }
-
- @Override
- public Builder putBitmap_impl(@BitmapKey String key, Bitmap value) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- if (METADATA_KEYS_TYPE.containsKey(key)) {
- if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_BITMAP) {
- throw new IllegalArgumentException("The " + key
- + " key cannot be used to put a Bitmap");
- }
- }
- mBundle.putParcelable(key, value);
- return mInstance;
- }
-
- @Override
- public Builder putFloat_impl(@FloatKey String key, float value) {
- if (key == null) {
- throw new IllegalArgumentException("key shouldn't be null");
- }
- if (METADATA_KEYS_TYPE.containsKey(key)) {
- if (METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_FLOAT) {
- throw new IllegalArgumentException("The " + key
- + " key cannot be used to put a float");
- }
- }
- mBundle.putFloat(key, value);
- return mInstance;
- }
-
- @Override
- public Builder setExtras_impl(Bundle bundle) {
- mBundle.putBundle(METADATA_KEY_EXTRAS, bundle);
- return mInstance;
- }
-
- @Override
- public MediaMetadata2 build_impl() {
- return new MediaMetadata2Impl(mBundle).getInstance();
- }
-
- private Bitmap scaleBitmap(Bitmap bmp, int maxSize) {
- float maxSizeF = maxSize;
- float widthScale = maxSizeF / bmp.getWidth();
- float heightScale = maxSizeF / bmp.getHeight();
- float scale = Math.min(widthScale, heightScale);
- int height = (int) (bmp.getHeight() * scale);
- int width = (int) (bmp.getWidth() * scale);
- return Bitmap.createScaledBitmap(bmp, width, height, true);
- }
- }
-}
-
diff --git a/packages/MediaComponents/src/com/android/media/MediaPlaylistAgentImpl.java b/packages/MediaComponents/src/com/android/media/MediaPlaylistAgentImpl.java
deleted file mode 100644
index dfd4e1a..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaPlaylistAgentImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.annotation.CallbackExecutor;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.media.DataSourceDesc;
-import android.media.MediaItem2;
-import android.media.MediaMetadata2;
-import android.media.MediaPlaylistAgent;
-import android.media.MediaPlaylistAgent.PlaylistEventCallback;
-import android.media.update.MediaPlaylistAgentProvider;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import com.android.internal.annotations.GuardedBy;
-
-import java.util.List;
-import java.util.concurrent.Executor;
-
-public class MediaPlaylistAgentImpl implements MediaPlaylistAgentProvider {
- private static final String TAG = "MediaPlaylistAgent";
-
- private final MediaPlaylistAgent mInstance;
-
- private final Object mLock = new Object();
- @GuardedBy("mLock")
- private final ArrayMap<PlaylistEventCallback, Executor> mCallbacks = new ArrayMap<>();
-
- public MediaPlaylistAgentImpl(MediaPlaylistAgent instance) {
- mInstance = instance;
- }
-
- @Override
- final public void registerPlaylistEventCallback_impl(
- @NonNull @CallbackExecutor Executor executor, @NonNull PlaylistEventCallback callback) {
- if (executor == null) {
- throw new IllegalArgumentException("executor shouldn't be null");
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback shouldn't be null");
- }
-
- synchronized (mLock) {
- if (mCallbacks.get(callback) != null) {
- Log.w(TAG, "callback is already added. Ignoring.");
- return;
- }
- mCallbacks.put(callback, executor);
- }
- }
-
- @Override
- final public void unregisterPlaylistEventCallback_impl(
- @NonNull PlaylistEventCallback callback) {
- if (callback == null) {
- throw new IllegalArgumentException("callback shouldn't be null");
- }
- synchronized (mLock) {
- mCallbacks.remove(callback);
- }
- }
-
- @Override
- final public void notifyPlaylistChanged_impl() {
- ArrayMap<PlaylistEventCallback, Executor> callbacks = getCallbacks();
- List<MediaItem2> playlist= mInstance.getPlaylist();
- MediaMetadata2 metadata = mInstance.getPlaylistMetadata();
- for (int i = 0; i < callbacks.size(); i++) {
- final PlaylistEventCallback callback = callbacks.keyAt(i);
- final Executor executor = callbacks.valueAt(i);
- executor.execute(() -> callback.onPlaylistChanged(
- mInstance, playlist, metadata));
- }
- }
-
- @Override
- final public void notifyPlaylistMetadataChanged_impl() {
- ArrayMap<PlaylistEventCallback, Executor> callbacks = getCallbacks();
- for (int i = 0; i < callbacks.size(); i++) {
- final PlaylistEventCallback callback = callbacks.keyAt(i);
- final Executor executor = callbacks.valueAt(i);
- executor.execute(() -> callback.onPlaylistMetadataChanged(
- mInstance, mInstance.getPlaylistMetadata()));
- }
- }
-
- @Override
- final public void notifyShuffleModeChanged_impl() {
- ArrayMap<PlaylistEventCallback, Executor> callbacks = getCallbacks();
- for (int i = 0; i < callbacks.size(); i++) {
- final PlaylistEventCallback callback = callbacks.keyAt(i);
- final Executor executor = callbacks.valueAt(i);
- executor.execute(() -> callback.onShuffleModeChanged(
- mInstance, mInstance.getShuffleMode()));
- }
- }
-
- @Override
- final public void notifyRepeatModeChanged_impl() {
- ArrayMap<PlaylistEventCallback, Executor> callbacks = getCallbacks();
- for (int i = 0; i < callbacks.size(); i++) {
- final PlaylistEventCallback callback = callbacks.keyAt(i);
- final Executor executor = callbacks.valueAt(i);
- executor.execute(() -> callback.onRepeatModeChanged(
- mInstance, mInstance.getRepeatMode()));
- }
- }
-
- @Override
- public @Nullable List<MediaItem2> getPlaylist_impl() {
- // empty implementation
- return null;
- }
-
- @Override
- public void setPlaylist_impl(@NonNull List<MediaItem2> list,
- @Nullable MediaMetadata2 metadata) {
- // empty implementation
- }
-
- @Override
- public @Nullable MediaMetadata2 getPlaylistMetadata_impl() {
- // empty implementation
- return null;
- }
-
- @Override
- public void updatePlaylistMetadata_impl(@Nullable MediaMetadata2 metadata) {
- // empty implementation
- }
-
- @Override
- public void addPlaylistItem_impl(int index, @NonNull MediaItem2 item) {
- // empty implementation
- }
-
- @Override
- public void removePlaylistItem_impl(@NonNull MediaItem2 item) {
- // empty implementation
- }
-
- @Override
- public void replacePlaylistItem_impl(int index, @NonNull MediaItem2 item) {
- // empty implementation
- }
-
- @Override
- public void skipToPlaylistItem_impl(@NonNull MediaItem2 item) {
- // empty implementation
- }
-
- @Override
- public void skipToPreviousItem_impl() {
- // empty implementation
- }
-
- @Override
- public void skipToNextItem_impl() {
- // empty implementation
- }
-
- @Override
- public int getRepeatMode_impl() {
- return MediaPlaylistAgent.REPEAT_MODE_NONE;
- }
-
- @Override
- public void setRepeatMode_impl(int repeatMode) {
- // empty implementation
- }
-
- @Override
- public int getShuffleMode_impl() {
- // empty implementation
- return MediaPlaylistAgent.SHUFFLE_MODE_NONE;
- }
-
- @Override
- public void setShuffleMode_impl(int shuffleMode) {
- // empty implementation
- }
-
- @Override
- public @Nullable MediaItem2 getMediaItem_impl(@NonNull DataSourceDesc dsd) {
- if (dsd == null) {
- throw new IllegalArgumentException("dsd shouldn't be null");
- }
- List<MediaItem2> itemList = mInstance.getPlaylist();
- if (itemList == null) {
- return null;
- }
- for (int i = 0; i < itemList.size(); i++) {
- MediaItem2 item = itemList.get(i);
- if (item != null && item.getDataSourceDesc() == dsd) {
- return item;
- }
- }
- return null;
- }
-
- private ArrayMap<PlaylistEventCallback, Executor> getCallbacks() {
- ArrayMap<PlaylistEventCallback, Executor> callbacks = new ArrayMap<>();
- synchronized (mLock) {
- callbacks.putAll(mCallbacks);
- }
- return callbacks;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaSession2Impl.java b/packages/MediaComponents/src/com/android/media/MediaSession2Impl.java
deleted file mode 100644
index 72ecf54..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaSession2Impl.java
+++ /dev/null
@@ -1,1556 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import static android.media.SessionCommand2.COMMAND_CODE_CUSTOM;
-import static android.media.SessionToken2.TYPE_LIBRARY_SERVICE;
-import static android.media.SessionToken2.TYPE_SESSION;
-import static android.media.SessionToken2.TYPE_SESSION_SERVICE;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.media.AudioAttributes;
-import android.media.AudioFocusRequest;
-import android.media.AudioManager;
-import android.media.DataSourceDesc;
-import android.media.MediaController2;
-import android.media.MediaController2.PlaybackInfo;
-import android.media.MediaItem2;
-import android.media.MediaLibraryService2;
-import android.media.MediaMetadata2;
-import android.media.MediaPlayerBase;
-import android.media.MediaPlayerBase.PlayerEventCallback;
-import android.media.MediaPlayerBase.PlayerState;
-import android.media.MediaPlaylistAgent;
-import android.media.MediaPlaylistAgent.PlaylistEventCallback;
-import android.media.MediaSession2;
-import android.media.MediaSession2.Builder;
-import android.media.MediaSession2.CommandButton;
-import android.media.MediaSession2.ControllerInfo;
-import android.media.MediaSession2.OnDataSourceMissingHelper;
-import android.media.MediaSession2.SessionCallback;
-import android.media.MediaSessionService2;
-import android.media.SessionCommand2;
-import android.media.SessionCommandGroup2;
-import android.media.SessionToken2;
-import android.media.VolumeProvider2;
-import android.media.session.MediaSessionManager;
-import android.media.update.MediaSession2Provider;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.Parcelable;
-import android.os.Process;
-import android.os.ResultReceiver;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.GuardedBy;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.concurrent.Executor;
-
-public class MediaSession2Impl implements MediaSession2Provider {
- private static final String TAG = "MediaSession2";
- private static final boolean DEBUG = true;//Log.isLoggable(TAG, Log.DEBUG);
-
- private final Object mLock = new Object();
-
- private final MediaSession2 mInstance;
- private final Context mContext;
- private final String mId;
- private final Executor mCallbackExecutor;
- private final SessionCallback mCallback;
- private final MediaSession2Stub mSessionStub;
- private final SessionToken2 mSessionToken;
- private final AudioManager mAudioManager;
- private final PendingIntent mSessionActivity;
- private final PlayerEventCallback mPlayerEventCallback;
- private final PlaylistEventCallback mPlaylistEventCallback;
-
- // mPlayer is set to null when the session is closed, and we shouldn't throw an exception
- // nor leave log always for using mPlayer when it's null. Here's the reason.
- // When a MediaSession2 is closed, there could be a pended operation in the session callback
- // executor that may want to access the player. Here's the sample code snippet for that.
- //
- // public void onFoo() {
- // if (mPlayer == null) return; // first check
- // mSessionCallbackExecutor.executor(() -> {
- // // Error. Session may be closed and mPlayer can be null here.
- // mPlayer.foo();
- // });
- // }
- //
- // By adding protective code, we can also protect APIs from being called after the close()
- //
- // TODO(jaewan): Should we put volatile here?
- @GuardedBy("mLock")
- private MediaPlayerBase mPlayer;
- @GuardedBy("mLock")
- private MediaPlaylistAgent mPlaylistAgent;
- @GuardedBy("mLock")
- private SessionPlaylistAgent mSessionPlaylistAgent;
- @GuardedBy("mLock")
- private VolumeProvider2 mVolumeProvider;
- @GuardedBy("mLock")
- private PlaybackInfo mPlaybackInfo;
- @GuardedBy("mLock")
- private OnDataSourceMissingHelper mDsmHelper;
-
- /**
- * Can be only called by the {@link Builder#build()}.
- * @param context
- * @param player
- * @param id
- * @param playlistAgent
- * @param volumeProvider
- * @param sessionActivity
- * @param callbackExecutor
- * @param callback
- */
- public MediaSession2Impl(Context context, MediaPlayerBase player, String id,
- MediaPlaylistAgent playlistAgent, VolumeProvider2 volumeProvider,
- PendingIntent sessionActivity,
- Executor callbackExecutor, SessionCallback callback) {
- // TODO(jaewan): Keep other params.
- mInstance = createInstance();
-
- // Argument checks are done by builder already.
- // Initialize finals first.
- mContext = context;
- mId = id;
- mCallback = callback;
- mCallbackExecutor = callbackExecutor;
- mSessionActivity = sessionActivity;
- mSessionStub = new MediaSession2Stub(this);
- mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
- mPlayerEventCallback = new MyPlayerEventCallback(this);
- mPlaylistEventCallback = new MyPlaylistEventCallback(this);
-
- // Infer type from the id and package name.
- String libraryService = getServiceName(context, MediaLibraryService2.SERVICE_INTERFACE, id);
- String sessionService = getServiceName(context, MediaSessionService2.SERVICE_INTERFACE, id);
- if (sessionService != null && libraryService != null) {
- throw new IllegalArgumentException("Ambiguous session type. Multiple"
- + " session services define the same id=" + id);
- } else if (libraryService != null) {
- mSessionToken = new SessionToken2Impl(Process.myUid(), TYPE_LIBRARY_SERVICE,
- mContext.getPackageName(), libraryService, id, mSessionStub).getInstance();
- } else if (sessionService != null) {
- mSessionToken = new SessionToken2Impl(Process.myUid(), TYPE_SESSION_SERVICE,
- mContext.getPackageName(), sessionService, id, mSessionStub).getInstance();
- } else {
- mSessionToken = new SessionToken2Impl(Process.myUid(), TYPE_SESSION,
- mContext.getPackageName(), null, id, mSessionStub).getInstance();
- }
-
- updatePlayer(player, playlistAgent, volumeProvider);
-
- // Ask server for the sanity check, and starts
- // Sanity check for making session ID unique 'per package' cannot be done in here.
- // Server can only know if the package has another process and has another session with the
- // same id. Note that 'ID is unique per package' is important for controller to distinguish
- // a session in another package.
- MediaSessionManager manager =
- (MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE);
- if (!manager.createSession2(mSessionToken)) {
- throw new IllegalStateException("Session with the same id is already used by"
- + " another process. Use MediaController2 instead.");
- }
- }
-
- MediaSession2 createInstance() {
- return new MediaSession2(this);
- }
-
- private static String getServiceName(Context context, String serviceAction, String id) {
- PackageManager manager = context.getPackageManager();
- Intent serviceIntent = new Intent(serviceAction);
- serviceIntent.setPackage(context.getPackageName());
- List<ResolveInfo> services = manager.queryIntentServices(serviceIntent,
- PackageManager.GET_META_DATA);
- String serviceName = null;
- if (services != null) {
- for (int i = 0; i < services.size(); i++) {
- String serviceId = SessionToken2Impl.getSessionId(services.get(i));
- if (serviceId != null && TextUtils.equals(id, serviceId)) {
- if (services.get(i).serviceInfo == null) {
- continue;
- }
- if (serviceName != null) {
- throw new IllegalArgumentException("Ambiguous session type. Multiple"
- + " session services define the same id=" + id);
- }
- serviceName = services.get(i).serviceInfo.name;
- }
- }
- }
- return serviceName;
- }
-
- @Override
- public void updatePlayer_impl(@NonNull MediaPlayerBase player, MediaPlaylistAgent playlistAgent,
- VolumeProvider2 volumeProvider) throws IllegalArgumentException {
- ensureCallingThread();
- if (player == null) {
- throw new IllegalArgumentException("player shouldn't be null");
- }
- updatePlayer(player, playlistAgent, volumeProvider);
- }
-
- private void updatePlayer(MediaPlayerBase player, MediaPlaylistAgent agent,
- VolumeProvider2 volumeProvider) {
- final MediaPlayerBase oldPlayer;
- final MediaPlaylistAgent oldAgent;
- final PlaybackInfo info = createPlaybackInfo(volumeProvider, player.getAudioAttributes());
- synchronized (mLock) {
- oldPlayer = mPlayer;
- oldAgent = mPlaylistAgent;
- mPlayer = player;
- if (agent == null) {
- mSessionPlaylistAgent = new SessionPlaylistAgent(this, mPlayer);
- if (mDsmHelper != null) {
- mSessionPlaylistAgent.setOnDataSourceMissingHelper(mDsmHelper);
- }
- agent = mSessionPlaylistAgent;
- }
- mPlaylistAgent = agent;
- mVolumeProvider = volumeProvider;
- mPlaybackInfo = info;
- }
- if (player != oldPlayer) {
- player.registerPlayerEventCallback(mCallbackExecutor, mPlayerEventCallback);
- if (oldPlayer != null) {
- // Warning: Poorly implement player may ignore this
- oldPlayer.unregisterPlayerEventCallback(mPlayerEventCallback);
- }
- }
- if (agent != oldAgent) {
- agent.registerPlaylistEventCallback(mCallbackExecutor, mPlaylistEventCallback);
- if (oldAgent != null) {
- // Warning: Poorly implement player may ignore this
- oldAgent.unregisterPlaylistEventCallback(mPlaylistEventCallback);
- }
- }
-
- if (oldPlayer != null) {
- mSessionStub.notifyPlaybackInfoChanged(info);
- notifyPlayerUpdatedNotLocked(oldPlayer);
- }
- // TODO(jaewan): Repeat the same thing for the playlist agent.
- }
-
- private PlaybackInfo createPlaybackInfo(VolumeProvider2 volumeProvider, AudioAttributes attrs) {
- PlaybackInfo info;
- if (volumeProvider == null) {
- int stream;
- if (attrs == null) {
- stream = AudioManager.STREAM_MUSIC;
- } else {
- stream = attrs.getVolumeControlStream();
- if (stream == AudioManager.USE_DEFAULT_STREAM_TYPE) {
- // It may happen if the AudioAttributes doesn't have usage.
- // Change it to the STREAM_MUSIC because it's not supported by audio manager
- // for querying volume level.
- stream = AudioManager.STREAM_MUSIC;
- }
- }
- info = MediaController2Impl.PlaybackInfoImpl.createPlaybackInfo(
- PlaybackInfo.PLAYBACK_TYPE_LOCAL,
- attrs,
- mAudioManager.isVolumeFixed()
- ? VolumeProvider2.VOLUME_CONTROL_FIXED
- : VolumeProvider2.VOLUME_CONTROL_ABSOLUTE,
- mAudioManager.getStreamMaxVolume(stream),
- mAudioManager.getStreamVolume(stream));
- } else {
- info = MediaController2Impl.PlaybackInfoImpl.createPlaybackInfo(
- PlaybackInfo.PLAYBACK_TYPE_REMOTE /* ControlType */,
- attrs,
- volumeProvider.getControlType(),
- volumeProvider.getMaxVolume(),
- volumeProvider.getCurrentVolume());
- }
- return info;
- }
-
- @Override
- public void close_impl() {
- // Stop system service from listening this session first.
- MediaSessionManager manager =
- (MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE);
- manager.destroySession2(mSessionToken);
-
- if (mSessionStub != null) {
- if (DEBUG) {
- Log.d(TAG, "session is now unavailable, id=" + mId);
- }
- // Invalidate previously published session stub.
- mSessionStub.destroyNotLocked();
- }
- final MediaPlayerBase player;
- final MediaPlaylistAgent agent;
- synchronized (mLock) {
- player = mPlayer;
- mPlayer = null;
- agent = mPlaylistAgent;
- mPlaylistAgent = null;
- mSessionPlaylistAgent = null;
- }
- if (player != null) {
- player.unregisterPlayerEventCallback(mPlayerEventCallback);
- }
- if (agent != null) {
- agent.unregisterPlaylistEventCallback(mPlaylistEventCallback);
- }
- }
-
- @Override
- public MediaPlayerBase getPlayer_impl() {
- return getPlayer();
- }
-
- @Override
- public MediaPlaylistAgent getPlaylistAgent_impl() {
- return mPlaylistAgent;
- }
-
- @Override
- public VolumeProvider2 getVolumeProvider_impl() {
- return mVolumeProvider;
- }
-
- @Override
- public SessionToken2 getToken_impl() {
- return mSessionToken;
- }
-
- @Override
- public List<ControllerInfo> getConnectedControllers_impl() {
- return mSessionStub.getControllers();
- }
-
- @Override
- public void setAudioFocusRequest_impl(AudioFocusRequest afr) {
- // implement
- }
-
- @Override
- public void play_impl() {
- ensureCallingThread();
- final MediaPlayerBase player = mPlayer;
- if (player != null) {
- player.play();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void pause_impl() {
- ensureCallingThread();
- final MediaPlayerBase player = mPlayer;
- if (player != null) {
- player.pause();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void stop_impl() {
- ensureCallingThread();
- final MediaPlayerBase player = mPlayer;
- if (player != null) {
- player.reset();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void skipToPlaylistItem_impl(@NonNull MediaItem2 item) {
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.skipToPlaylistItem(item);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void skipToPreviousItem_impl() {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.skipToPreviousItem();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void skipToNextItem_impl() {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.skipToNextItem();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void setCustomLayout_impl(@NonNull ControllerInfo controller,
- @NonNull List<CommandButton> layout) {
- ensureCallingThread();
- if (controller == null) {
- throw new IllegalArgumentException("controller shouldn't be null");
- }
- if (layout == null) {
- throw new IllegalArgumentException("layout shouldn't be null");
- }
- mSessionStub.notifyCustomLayoutNotLocked(controller, layout);
- }
-
- //////////////////////////////////////////////////////////////////////////////////////
- // TODO(jaewan): Implement follows
- //////////////////////////////////////////////////////////////////////////////////////
-
- @Override
- public void setAllowedCommands_impl(@NonNull ControllerInfo controller,
- @NonNull SessionCommandGroup2 commands) {
- if (controller == null) {
- throw new IllegalArgumentException("controller shouldn't be null");
- }
- if (commands == null) {
- throw new IllegalArgumentException("commands shouldn't be null");
- }
- mSessionStub.setAllowedCommands(controller, commands);
- }
-
- @Override
- public void sendCustomCommand_impl(@NonNull ControllerInfo controller,
- @NonNull SessionCommand2 command, Bundle args, ResultReceiver receiver) {
- if (controller == null) {
- throw new IllegalArgumentException("controller shouldn't be null");
- }
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- mSessionStub.sendCustomCommand(controller, command, args, receiver);
- }
-
- @Override
- public void sendCustomCommand_impl(@NonNull SessionCommand2 command, Bundle args) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- mSessionStub.sendCustomCommand(command, args);
- }
-
- @Override
- public void setPlaylist_impl(@NonNull List<MediaItem2> list, MediaMetadata2 metadata) {
- if (list == null) {
- throw new IllegalArgumentException("list shouldn't be null");
- }
- ensureCallingThread();
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.setPlaylist(list, metadata);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void updatePlaylistMetadata_impl(MediaMetadata2 metadata) {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.updatePlaylistMetadata(metadata);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void addPlaylistItem_impl(int index, @NonNull MediaItem2 item) {
- if (index < 0) {
- throw new IllegalArgumentException("index shouldn't be negative");
- }
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.addPlaylistItem(index, item);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void removePlaylistItem_impl(@NonNull MediaItem2 item) {
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.removePlaylistItem(item);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void replacePlaylistItem_impl(int index, @NonNull MediaItem2 item) {
- if (index < 0) {
- throw new IllegalArgumentException("index shouldn't be negative");
- }
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.replacePlaylistItem(index, item);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public List<MediaItem2> getPlaylist_impl() {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- return agent.getPlaylist();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- return null;
- }
-
- @Override
- public MediaMetadata2 getPlaylistMetadata_impl() {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- return agent.getPlaylistMetadata();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- return null;
- }
-
- @Override
- public MediaItem2 getCurrentPlaylistItem_impl() {
- // TODO(jaewan): Implement
- return null;
- }
-
- @Override
- public int getRepeatMode_impl() {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- return agent.getRepeatMode();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- return MediaPlaylistAgent.REPEAT_MODE_NONE;
- }
-
- @Override
- public void setRepeatMode_impl(int repeatMode) {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.setRepeatMode(repeatMode);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public int getShuffleMode_impl() {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- return agent.getShuffleMode();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- return MediaPlaylistAgent.SHUFFLE_MODE_NONE;
- }
-
- @Override
- public void setShuffleMode_impl(int shuffleMode) {
- final MediaPlaylistAgent agent = mPlaylistAgent;
- if (agent != null) {
- agent.setShuffleMode(shuffleMode);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void prepare_impl() {
- ensureCallingThread();
- final MediaPlayerBase player = mPlayer;
- if (player != null) {
- player.prepare();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public void seekTo_impl(long pos) {
- ensureCallingThread();
- final MediaPlayerBase player = mPlayer;
- if (player != null) {
- player.seekTo(pos);
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- }
-
- @Override
- public @PlayerState int getPlayerState_impl() {
- final MediaPlayerBase player = mPlayer;
- if (player != null) {
- return mPlayer.getPlayerState();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- return MediaPlayerBase.PLAYER_STATE_ERROR;
- }
-
- @Override
- public long getCurrentPosition_impl() {
- final MediaPlayerBase player = mPlayer;
- if (player != null) {
- return mPlayer.getCurrentPosition();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- return MediaPlayerBase.UNKNOWN_TIME;
- }
-
- @Override
- public long getBufferedPosition_impl() {
- final MediaPlayerBase player = mPlayer;
- if (player != null) {
- return mPlayer.getBufferedPosition();
- } else if (DEBUG) {
- Log.d(TAG, "API calls after the close()", new IllegalStateException());
- }
- return MediaPlayerBase.UNKNOWN_TIME;
- }
-
- @Override
- public void notifyError_impl(int errorCode, Bundle extras) {
- mSessionStub.notifyError(errorCode, extras);
- }
-
- @Override
- public void setOnDataSourceMissingHelper_impl(@NonNull OnDataSourceMissingHelper helper) {
- if (helper == null) {
- throw new IllegalArgumentException("helper shouldn't be null");
- }
- synchronized (mLock) {
- mDsmHelper = helper;
- if (mSessionPlaylistAgent != null) {
- mSessionPlaylistAgent.setOnDataSourceMissingHelper(helper);
- }
- }
- }
-
- @Override
- public void clearOnDataSourceMissingHelper_impl() {
- synchronized (mLock) {
- mDsmHelper = null;
- if (mSessionPlaylistAgent != null) {
- mSessionPlaylistAgent.clearOnDataSourceMissingHelper();
- }
- }
- }
-
- ///////////////////////////////////////////////////
- // Protected or private methods
- ///////////////////////////////////////////////////
-
- // Enforces developers to call all the methods on the initially given thread
- // because calls from the MediaController2 will be run on the thread.
- // TODO(jaewan): Should we allow calls from the multiple thread?
- // I prefer this way because allowing multiple thread may case tricky issue like
- // b/63446360. If the {@link #setPlayer()} with {@code null} can be called from
- // another thread, transport controls can be called after that.
- // That's basically the developer's mistake, but they cannot understand what's
- // happening behind until we tell them so.
- // If enforcing callling thread doesn't look good, we can alternatively pick
- // 1. Allow calls from random threads for all methods.
- // 2. Allow calls from random threads for all methods, except for the
- // {@link #setPlayer()}.
- void ensureCallingThread() {
- // TODO(jaewan): Uncomment or remove
- /*
- if (mHandler.getLooper() != Looper.myLooper()) {
- throw new IllegalStateException("Run this on the given thread");
- }*/
- }
-
- private void notifyPlaylistChangedOnExecutor(MediaPlaylistAgent playlistAgent,
- List<MediaItem2> list, MediaMetadata2 metadata) {
- if (playlistAgent != mPlaylistAgent) {
- // Ignore calls from the old agent.
- return;
- }
- mCallback.onPlaylistChanged(mInstance, playlistAgent, list, metadata);
- mSessionStub.notifyPlaylistChangedNotLocked(list, metadata);
- }
-
- private void notifyPlaylistMetadataChangedOnExecutor(MediaPlaylistAgent playlistAgent,
- MediaMetadata2 metadata) {
- if (playlistAgent != mPlaylistAgent) {
- // Ignore calls from the old agent.
- return;
- }
- mCallback.onPlaylistMetadataChanged(mInstance, playlistAgent, metadata);
- mSessionStub.notifyPlaylistMetadataChangedNotLocked(metadata);
- }
-
- private void notifyRepeatModeChangedOnExecutor(MediaPlaylistAgent playlistAgent,
- int repeatMode) {
- if (playlistAgent != mPlaylistAgent) {
- // Ignore calls from the old agent.
- return;
- }
- mCallback.onRepeatModeChanged(mInstance, playlistAgent, repeatMode);
- mSessionStub.notifyRepeatModeChangedNotLocked(repeatMode);
- }
-
- private void notifyShuffleModeChangedOnExecutor(MediaPlaylistAgent playlistAgent,
- int shuffleMode) {
- if (playlistAgent != mPlaylistAgent) {
- // Ignore calls from the old agent.
- return;
- }
- mCallback.onShuffleModeChanged(mInstance, playlistAgent, shuffleMode);
- mSessionStub.notifyShuffleModeChangedNotLocked(shuffleMode);
- }
-
- private void notifyPlayerUpdatedNotLocked(MediaPlayerBase oldPlayer) {
- final MediaPlayerBase player = mPlayer;
- // TODO(jaewan): (Can be post-P) Find better way for player.getPlayerState() //
- // In theory, Session.getXXX() may not be the same as Player.getXXX()
- // and we should notify information of the session.getXXX() instead of
- // player.getXXX()
- // Notify to controllers as well.
- final int state = player.getPlayerState();
- if (state != oldPlayer.getPlayerState()) {
- mSessionStub.notifyPlayerStateChangedNotLocked(state);
- }
-
- final long currentTimeMs = System.currentTimeMillis();
- final long position = player.getCurrentPosition();
- if (position != oldPlayer.getCurrentPosition()) {
- mSessionStub.notifyPositionChangedNotLocked(currentTimeMs, position);
- }
-
- final float speed = player.getPlaybackSpeed();
- if (speed != oldPlayer.getPlaybackSpeed()) {
- mSessionStub.notifyPlaybackSpeedChangedNotLocked(speed);
- }
-
- final long bufferedPosition = player.getBufferedPosition();
- if (bufferedPosition != oldPlayer.getBufferedPosition()) {
- mSessionStub.notifyBufferedPositionChangedNotLocked(bufferedPosition);
- }
- }
-
- Context getContext() {
- return mContext;
- }
-
- MediaSession2 getInstance() {
- return mInstance;
- }
-
- MediaPlayerBase getPlayer() {
- return mPlayer;
- }
-
- MediaPlaylistAgent getPlaylistAgent() {
- return mPlaylistAgent;
- }
-
- Executor getCallbackExecutor() {
- return mCallbackExecutor;
- }
-
- SessionCallback getCallback() {
- return mCallback;
- }
-
- MediaSession2Stub getSessionStub() {
- return mSessionStub;
- }
-
- VolumeProvider2 getVolumeProvider() {
- return mVolumeProvider;
- }
-
- PlaybackInfo getPlaybackInfo() {
- synchronized (mLock) {
- return mPlaybackInfo;
- }
- }
-
- PendingIntent getSessionActivity() {
- return mSessionActivity;
- }
-
- private static class MyPlayerEventCallback extends PlayerEventCallback {
- private final WeakReference<MediaSession2Impl> mSession;
-
- private MyPlayerEventCallback(MediaSession2Impl session) {
- mSession = new WeakReference<>(session);
- }
-
- @Override
- public void onCurrentDataSourceChanged(MediaPlayerBase mpb, DataSourceDesc dsd) {
- MediaSession2Impl session = getSession();
- if (session == null || dsd == null) {
- return;
- }
- session.getCallbackExecutor().execute(() -> {
- MediaItem2 item = getMediaItem(session, dsd);
- if (item == null) {
- return;
- }
- session.getCallback().onCurrentMediaItemChanged(session.getInstance(), mpb, item);
- // TODO (jaewan): Notify controllers through appropriate callback. (b/74505936)
- });
- }
-
- @Override
- public void onMediaPrepared(MediaPlayerBase mpb, DataSourceDesc dsd) {
- MediaSession2Impl session = getSession();
- if (session == null || dsd == null) {
- return;
- }
- session.getCallbackExecutor().execute(() -> {
- MediaItem2 item = getMediaItem(session, dsd);
- if (item == null) {
- return;
- }
- session.getCallback().onMediaPrepared(session.getInstance(), mpb, item);
- // TODO (jaewan): Notify controllers through appropriate callback. (b/74505936)
- });
- }
-
- @Override
- public void onPlayerStateChanged(MediaPlayerBase mpb, int state) {
- MediaSession2Impl session = getSession();
- if (session == null) {
- return;
- }
- session.getCallbackExecutor().execute(() -> {
- session.getCallback().onPlayerStateChanged(session.getInstance(), mpb, state);
- session.getSessionStub().notifyPlayerStateChangedNotLocked(state);
- });
- }
-
- @Override
- public void onBufferingStateChanged(MediaPlayerBase mpb, DataSourceDesc dsd, int state) {
- MediaSession2Impl session = getSession();
- if (session == null || dsd == null) {
- return;
- }
- session.getCallbackExecutor().execute(() -> {
- MediaItem2 item = getMediaItem(session, dsd);
- if (item == null) {
- return;
- }
- session.getCallback().onBufferingStateChanged(
- session.getInstance(), mpb, item, state);
- // TODO (jaewan): Notify controllers through appropriate callback. (b/74505936)
- });
- }
-
- private MediaSession2Impl getSession() {
- final MediaSession2Impl session = mSession.get();
- if (session == null && DEBUG) {
- Log.d(TAG, "Session is closed", new IllegalStateException());
- }
- return session;
- }
-
- private MediaItem2 getMediaItem(MediaSession2Impl session, DataSourceDesc dsd) {
- MediaPlaylistAgent agent = session.getPlaylistAgent();
- if (agent == null) {
- if (DEBUG) {
- Log.d(TAG, "Session is closed", new IllegalStateException());
- }
- return null;
- }
- MediaItem2 item = agent.getMediaItem(dsd);
- if (item == null) {
- if (DEBUG) {
- Log.d(TAG, "Could not find matching item for dsd=" + dsd,
- new NoSuchElementException());
- }
- }
- return item;
- }
- }
-
- private static class MyPlaylistEventCallback extends PlaylistEventCallback {
- private final WeakReference<MediaSession2Impl> mSession;
-
- private MyPlaylistEventCallback(MediaSession2Impl session) {
- mSession = new WeakReference<>(session);
- }
-
- @Override
- public void onPlaylistChanged(MediaPlaylistAgent playlistAgent, List<MediaItem2> list,
- MediaMetadata2 metadata) {
- final MediaSession2Impl session = mSession.get();
- if (session == null) {
- return;
- }
- session.notifyPlaylistChangedOnExecutor(playlistAgent, list, metadata);
- }
-
- @Override
- public void onPlaylistMetadataChanged(MediaPlaylistAgent playlistAgent,
- MediaMetadata2 metadata) {
- final MediaSession2Impl session = mSession.get();
- if (session == null) {
- return;
- }
- session.notifyPlaylistMetadataChangedOnExecutor(playlistAgent, metadata);
- }
-
- @Override
- public void onRepeatModeChanged(MediaPlaylistAgent playlistAgent, int repeatMode) {
- final MediaSession2Impl session = mSession.get();
- if (session == null) {
- return;
- }
- session.notifyRepeatModeChangedOnExecutor(playlistAgent, repeatMode);
- }
-
- @Override
- public void onShuffleModeChanged(MediaPlaylistAgent playlistAgent, int shuffleMode) {
- final MediaSession2Impl session = mSession.get();
- if (session == null) {
- return;
- }
- session.notifyShuffleModeChangedOnExecutor(playlistAgent, shuffleMode);
- }
- }
-
- public static final class CommandImpl implements CommandProvider {
- private static final String KEY_COMMAND_CODE
- = "android.media.media_session2.command.command_code";
- private static final String KEY_COMMAND_CUSTOM_COMMAND
- = "android.media.media_session2.command.custom_command";
- private static final String KEY_COMMAND_EXTRAS
- = "android.media.media_session2.command.extras";
-
- private final SessionCommand2 mInstance;
- private final int mCommandCode;
- // Nonnull if it's custom command
- private final String mCustomCommand;
- private final Bundle mExtras;
-
- public CommandImpl(SessionCommand2 instance, int commandCode) {
- mInstance = instance;
- mCommandCode = commandCode;
- mCustomCommand = null;
- mExtras = null;
- }
-
- public CommandImpl(SessionCommand2 instance, @NonNull String action,
- @Nullable Bundle extras) {
- if (action == null) {
- throw new IllegalArgumentException("action shouldn't be null");
- }
- mInstance = instance;
- mCommandCode = COMMAND_CODE_CUSTOM;
- mCustomCommand = action;
- mExtras = extras;
- }
-
- @Override
- public int getCommandCode_impl() {
- return mCommandCode;
- }
-
- @Override
- public @Nullable String getCustomCommand_impl() {
- return mCustomCommand;
- }
-
- @Override
- public @Nullable Bundle getExtras_impl() {
- return mExtras;
- }
-
- /**
- * @return a new Bundle instance from the Command
- */
- @Override
- public Bundle toBundle_impl() {
- Bundle bundle = new Bundle();
- bundle.putInt(KEY_COMMAND_CODE, mCommandCode);
- bundle.putString(KEY_COMMAND_CUSTOM_COMMAND, mCustomCommand);
- bundle.putBundle(KEY_COMMAND_EXTRAS, mExtras);
- return bundle;
- }
-
- /**
- * @return a new Command instance from the Bundle
- */
- public static SessionCommand2 fromBundle_impl(@NonNull Bundle command) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- int code = command.getInt(KEY_COMMAND_CODE);
- if (code != COMMAND_CODE_CUSTOM) {
- return new SessionCommand2(code);
- } else {
- String customCommand = command.getString(KEY_COMMAND_CUSTOM_COMMAND);
- if (customCommand == null) {
- return null;
- }
- return new SessionCommand2(customCommand, command.getBundle(KEY_COMMAND_EXTRAS));
- }
- }
-
- @Override
- public boolean equals_impl(Object obj) {
- if (!(obj instanceof CommandImpl)) {
- return false;
- }
- CommandImpl other = (CommandImpl) obj;
- // TODO(jaewan): Compare Commands with the generated UUID, as we're doing for the MI2.
- return mCommandCode == other.mCommandCode
- && TextUtils.equals(mCustomCommand, other.mCustomCommand);
- }
-
- @Override
- public int hashCode_impl() {
- final int prime = 31;
- return ((mCustomCommand != null)
- ? mCustomCommand.hashCode() : 0) * prime + mCommandCode;
- }
- }
-
- /**
- * Represent set of {@link SessionCommand2}.
- */
- public static class CommandGroupImpl implements CommandGroupProvider {
- private static final String KEY_COMMANDS =
- "android.media.mediasession2.commandgroup.commands";
-
- // Prefix for all command codes
- private static final String PREFIX_COMMAND_CODE = "COMMAND_CODE_";
-
- // Prefix for command codes that will be sent directly to the MediaPlayerBase
- private static final String PREFIX_COMMAND_CODE_PLAYBACK = "COMMAND_CODE_PLAYBACK_";
-
- // Prefix for command codes that will be sent directly to the MediaPlaylistAgent
- private static final String PREFIX_COMMAND_CODE_PLAYLIST = "COMMAND_CODE_PLAYLIST_";
-
- private Set<SessionCommand2> mCommands = new HashSet<>();
- private final SessionCommandGroup2 mInstance;
-
- public CommandGroupImpl(SessionCommandGroup2 instance, Object other) {
- mInstance = instance;
- if (other != null && other instanceof CommandGroupImpl) {
- mCommands.addAll(((CommandGroupImpl) other).mCommands);
- }
- }
-
- public CommandGroupImpl() {
- mInstance = new SessionCommandGroup2(this);
- }
-
- @Override
- public void addCommand_impl(@NonNull SessionCommand2 command) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- mCommands.add(command);
- }
-
- @Override
- public void addAllPredefinedCommands_impl() {
- addCommandsWithPrefix(PREFIX_COMMAND_CODE);
- }
-
- void addAllPlaybackCommands() {
- addCommandsWithPrefix(PREFIX_COMMAND_CODE_PLAYBACK);
- }
-
- void addAllPlaylistCommands() {
- addCommandsWithPrefix(PREFIX_COMMAND_CODE_PLAYLIST);
- }
-
- private void addCommandsWithPrefix(String prefix) {
- // TODO(jaewan): (Can be post-P): Don't use reflection for this purpose.
- final Field[] fields = MediaSession2.class.getFields();
- if (fields != null) {
- for (int i = 0; i < fields.length; i++) {
- if (fields[i].getName().startsWith(prefix)) {
- try {
- mCommands.add(new SessionCommand2(fields[i].getInt(null)));
- } catch (IllegalAccessException e) {
- Log.w(TAG, "Unexpected " + fields[i] + " in MediaSession2");
- }
- }
- }
- }
- }
-
- @Override
- public void removeCommand_impl(@NonNull SessionCommand2 command) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- mCommands.remove(command);
- }
-
- @Override
- public boolean hasCommand_impl(@NonNull SessionCommand2 command) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- return mCommands.contains(command);
- }
-
- @Override
- public boolean hasCommand_impl(int code) {
- if (code == COMMAND_CODE_CUSTOM) {
- throw new IllegalArgumentException("Use hasCommand(Command) for custom command");
- }
- for (SessionCommand2 command : mCommands) {
- if (command.getCommandCode() == code) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public Set<SessionCommand2> getCommands_impl() {
- return getCommands();
- }
-
- public Set<SessionCommand2> getCommands() {
- return Collections.unmodifiableSet(mCommands);
- }
-
- /**
- * @return new bundle from the CommandGroup
- * @hide
- */
- @Override
- public Bundle toBundle_impl() {
- ArrayList<Bundle> list = new ArrayList<>();
- for (SessionCommand2 command : mCommands) {
- list.add(command.toBundle());
- }
- Bundle bundle = new Bundle();
- bundle.putParcelableArrayList(KEY_COMMANDS, list);
- return bundle;
- }
-
- /**
- * @return new instance of CommandGroup from the bundle
- * @hide
- */
- public static @Nullable SessionCommandGroup2 fromBundle_impl(Bundle commands) {
- if (commands == null) {
- return null;
- }
- List<Parcelable> list = commands.getParcelableArrayList(KEY_COMMANDS);
- if (list == null) {
- return null;
- }
- SessionCommandGroup2 commandGroup = new SessionCommandGroup2();
- for (int i = 0; i < list.size(); i++) {
- Parcelable parcelable = list.get(i);
- if (!(parcelable instanceof Bundle)) {
- continue;
- }
- Bundle commandBundle = (Bundle) parcelable;
- SessionCommand2 command = SessionCommand2.fromBundle(commandBundle);
- if (command != null) {
- commandGroup.addCommand(command);
- }
- }
- return commandGroup;
- }
- }
-
- public static class ControllerInfoImpl implements ControllerInfoProvider {
- private final ControllerInfo mInstance;
- private final int mUid;
- private final String mPackageName;
- private final boolean mIsTrusted;
- private final IMediaController2 mControllerBinder;
-
- public ControllerInfoImpl(Context context, ControllerInfo instance, int uid,
- int pid, @NonNull String packageName, @NonNull IMediaController2 callback) {
- if (TextUtils.isEmpty(packageName)) {
- throw new IllegalArgumentException("packageName shouldn't be empty");
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback shouldn't be null");
- }
-
- mInstance = instance;
- mUid = uid;
- mPackageName = packageName;
- mControllerBinder = callback;
- MediaSessionManager manager =
- (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);
- // Ask server whether the controller is trusted.
- // App cannot know this because apps cannot query enabled notification listener for
- // another package, but system server can do.
- mIsTrusted = manager.isTrustedForMediaControl(
- new MediaSessionManager.RemoteUserInfo(packageName, pid, uid));
- }
-
- @Override
- public String getPackageName_impl() {
- return mPackageName;
- }
-
- @Override
- public int getUid_impl() {
- return mUid;
- }
-
- @Override
- public boolean isTrusted_impl() {
- return mIsTrusted;
- }
-
- @Override
- public int hashCode_impl() {
- return mControllerBinder.hashCode();
- }
-
- @Override
- public boolean equals_impl(Object obj) {
- if (!(obj instanceof ControllerInfo)) {
- return false;
- }
- return equals(((ControllerInfo) obj).getProvider());
- }
-
- @Override
- public String toString_impl() {
- return "ControllerInfo {pkg=" + mPackageName + ", uid=" + mUid + ", trusted="
- + mIsTrusted + "}";
- }
-
- @Override
- public int hashCode() {
- return mControllerBinder.hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof ControllerInfoImpl)) {
- return false;
- }
- ControllerInfoImpl other = (ControllerInfoImpl) obj;
- return mControllerBinder.asBinder().equals(other.mControllerBinder.asBinder());
- }
-
- ControllerInfo getInstance() {
- return mInstance;
- }
-
- IBinder getId() {
- return mControllerBinder.asBinder();
- }
-
- IMediaController2 getControllerBinder() {
- return mControllerBinder;
- }
-
- static ControllerInfoImpl from(ControllerInfo controller) {
- return (ControllerInfoImpl) controller.getProvider();
- }
- }
-
- public static class CommandButtonImpl implements CommandButtonProvider {
- private static final String KEY_COMMAND
- = "android.media.media_session2.command_button.command";
- private static final String KEY_ICON_RES_ID
- = "android.media.media_session2.command_button.icon_res_id";
- private static final String KEY_DISPLAY_NAME
- = "android.media.media_session2.command_button.display_name";
- private static final String KEY_EXTRAS
- = "android.media.media_session2.command_button.extras";
- private static final String KEY_ENABLED
- = "android.media.media_session2.command_button.enabled";
-
- private final CommandButton mInstance;
- private SessionCommand2 mCommand;
- private int mIconResId;
- private String mDisplayName;
- private Bundle mExtras;
- private boolean mEnabled;
-
- public CommandButtonImpl(@Nullable SessionCommand2 command, int iconResId,
- @Nullable String displayName, Bundle extras, boolean enabled) {
- mCommand = command;
- mIconResId = iconResId;
- mDisplayName = displayName;
- mExtras = extras;
- mEnabled = enabled;
- mInstance = new CommandButton(this);
- }
-
- @Override
- public @Nullable
- SessionCommand2 getCommand_impl() {
- return mCommand;
- }
-
- @Override
- public int getIconResId_impl() {
- return mIconResId;
- }
-
- @Override
- public @Nullable String getDisplayName_impl() {
- return mDisplayName;
- }
-
- @Override
- public @Nullable Bundle getExtras_impl() {
- return mExtras;
- }
-
- @Override
- public boolean isEnabled_impl() {
- return mEnabled;
- }
-
- @NonNull Bundle toBundle() {
- Bundle bundle = new Bundle();
- bundle.putBundle(KEY_COMMAND, mCommand.toBundle());
- bundle.putInt(KEY_ICON_RES_ID, mIconResId);
- bundle.putString(KEY_DISPLAY_NAME, mDisplayName);
- bundle.putBundle(KEY_EXTRAS, mExtras);
- bundle.putBoolean(KEY_ENABLED, mEnabled);
- return bundle;
- }
-
- static @Nullable CommandButton fromBundle(Bundle bundle) {
- if (bundle == null) {
- return null;
- }
- CommandButton.Builder builder = new CommandButton.Builder();
- builder.setCommand(SessionCommand2.fromBundle(bundle.getBundle(KEY_COMMAND)));
- builder.setIconResId(bundle.getInt(KEY_ICON_RES_ID, 0));
- builder.setDisplayName(bundle.getString(KEY_DISPLAY_NAME));
- builder.setExtras(bundle.getBundle(KEY_EXTRAS));
- builder.setEnabled(bundle.getBoolean(KEY_ENABLED));
- try {
- return builder.build();
- } catch (IllegalStateException e) {
- // Malformed or version mismatch. Return null for now.
- return null;
- }
- }
-
- /**
- * Builder for {@link CommandButton}.
- */
- public static class BuilderImpl implements CommandButtonProvider.BuilderProvider {
- private final CommandButton.Builder mInstance;
- private SessionCommand2 mCommand;
- private int mIconResId;
- private String mDisplayName;
- private Bundle mExtras;
- private boolean mEnabled;
-
- public BuilderImpl(CommandButton.Builder instance) {
- mInstance = instance;
- mEnabled = true;
- }
-
- @Override
- public CommandButton.Builder setCommand_impl(SessionCommand2 command) {
- mCommand = command;
- return mInstance;
- }
-
- @Override
- public CommandButton.Builder setIconResId_impl(int resId) {
- mIconResId = resId;
- return mInstance;
- }
-
- @Override
- public CommandButton.Builder setDisplayName_impl(String displayName) {
- mDisplayName = displayName;
- return mInstance;
- }
-
- @Override
- public CommandButton.Builder setEnabled_impl(boolean enabled) {
- mEnabled = enabled;
- return mInstance;
- }
-
- @Override
- public CommandButton.Builder setExtras_impl(Bundle extras) {
- mExtras = extras;
- return mInstance;
- }
-
- @Override
- public CommandButton build_impl() {
- if (mEnabled && mCommand == null) {
- throw new IllegalStateException("Enabled button needs Command"
- + " for controller to invoke the command");
- }
- if (mCommand != null && mCommand.getCommandCode() == COMMAND_CODE_CUSTOM
- && (mIconResId == 0 || TextUtils.isEmpty(mDisplayName))) {
- throw new IllegalStateException("Custom commands needs icon and"
- + " and name to display");
- }
- return new CommandButtonImpl(mCommand, mIconResId, mDisplayName, mExtras, mEnabled)
- .mInstance;
- }
- }
- }
-
- public static abstract class BuilderBaseImpl<T extends MediaSession2, C extends SessionCallback>
- implements BuilderBaseProvider<T, C> {
- final Context mContext;
- MediaPlayerBase mPlayer;
- String mId;
- Executor mCallbackExecutor;
- C mCallback;
- MediaPlaylistAgent mPlaylistAgent;
- VolumeProvider2 mVolumeProvider;
- PendingIntent mSessionActivity;
-
- /**
- * Constructor.
- *
- * @param context a context
- * @throws IllegalArgumentException if any parameter is null, or the player is a
- * {@link MediaSession2} or {@link MediaController2}.
- */
- // TODO(jaewan): Also need executor
- public BuilderBaseImpl(@NonNull Context context) {
- if (context == null) {
- throw new IllegalArgumentException("context shouldn't be null");
- }
- mContext = context;
- // Ensure non-null
- mId = "";
- }
-
- @Override
- public void setPlayer_impl(@NonNull MediaPlayerBase player) {
- if (player == null) {
- throw new IllegalArgumentException("player shouldn't be null");
- }
- mPlayer = player;
- }
-
- @Override
- public void setPlaylistAgent_impl(@NonNull MediaPlaylistAgent playlistAgent) {
- if (playlistAgent == null) {
- throw new IllegalArgumentException("playlistAgent shouldn't be null");
- }
- mPlaylistAgent = playlistAgent;
- }
-
- @Override
- public void setVolumeProvider_impl(VolumeProvider2 volumeProvider) {
- mVolumeProvider = volumeProvider;
- }
-
- @Override
- public void setSessionActivity_impl(PendingIntent pi) {
- mSessionActivity = pi;
- }
-
- @Override
- public void setId_impl(@NonNull String id) {
- if (id == null) {
- throw new IllegalArgumentException("id shouldn't be null");
- }
- mId = id;
- }
-
- @Override
- public void setSessionCallback_impl(@NonNull Executor executor, @NonNull C callback) {
- if (executor == null) {
- throw new IllegalArgumentException("executor shouldn't be null");
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback shouldn't be null");
- }
- mCallbackExecutor = executor;
- mCallback = callback;
- }
-
- @Override
- public abstract T build_impl();
- }
-
- public static class BuilderImpl extends BuilderBaseImpl<MediaSession2, SessionCallback> {
- public BuilderImpl(Context context, Builder instance) {
- super(context);
- }
-
- @Override
- public MediaSession2 build_impl() {
- if (mCallbackExecutor == null) {
- mCallbackExecutor = mContext.getMainExecutor();
- }
- if (mCallback == null) {
- mCallback = new SessionCallback() {};
- }
- return new MediaSession2Impl(mContext, mPlayer, mId, mPlaylistAgent,
- mVolumeProvider, mSessionActivity, mCallbackExecutor, mCallback).getInstance();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaSession2Stub.java b/packages/MediaComponents/src/com/android/media/MediaSession2Stub.java
deleted file mode 100644
index 11ccd9f..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaSession2Stub.java
+++ /dev/null
@@ -1,1114 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.media.MediaController2;
-import android.media.MediaItem2;
-import android.media.MediaLibraryService2.LibraryRoot;
-import android.media.MediaMetadata2;
-import android.media.MediaSession2.CommandButton;
-import android.media.MediaSession2.ControllerInfo;
-import android.media.Rating2;
-import android.media.SessionCommand2;
-import android.media.SessionCommandGroup2;
-import android.media.VolumeProvider2;
-import android.net.Uri;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.DeadObjectException;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.util.SparseArray;
-
-import androidx.annotation.GuardedBy;
-import androidx.annotation.NonNull;
-
-import com.android.media.MediaLibraryService2Impl.MediaLibrarySessionImpl;
-import com.android.media.MediaSession2Impl.CommandButtonImpl;
-import com.android.media.MediaSession2Impl.CommandGroupImpl;
-import com.android.media.MediaSession2Impl.ControllerInfoImpl;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class MediaSession2Stub extends IMediaSession2.Stub {
-
- static final String ARGUMENT_KEY_POSITION = "android.media.media_session2.key_position";
- static final String ARGUMENT_KEY_ITEM_INDEX = "android.media.media_session2.key_item_index";
- static final String ARGUMENT_KEY_PLAYLIST_PARAMS =
- "android.media.media_session2.key_playlist_params";
-
- private static final String TAG = "MediaSession2Stub";
- private static final boolean DEBUG = true; // TODO(jaewan): Rename.
-
- private static final SparseArray<SessionCommand2> sCommandsForOnCommandRequest =
- new SparseArray<>();
-
- private final Object mLock = new Object();
- private final WeakReference<MediaSession2Impl> mSession;
-
- @GuardedBy("mLock")
- private final ArrayMap<IBinder, ControllerInfo> mControllers = new ArrayMap<>();
- @GuardedBy("mLock")
- private final Set<IBinder> mConnectingControllers = new HashSet<>();
- @GuardedBy("mLock")
- private final ArrayMap<ControllerInfo, SessionCommandGroup2> mAllowedCommandGroupMap =
- new ArrayMap<>();
- @GuardedBy("mLock")
- private final ArrayMap<ControllerInfo, Set<String>> mSubscriptions = new ArrayMap<>();
-
- public MediaSession2Stub(MediaSession2Impl session) {
- mSession = new WeakReference<>(session);
-
- synchronized (sCommandsForOnCommandRequest) {
- if (sCommandsForOnCommandRequest.size() == 0) {
- CommandGroupImpl group = new CommandGroupImpl();
- group.addAllPlaybackCommands();
- group.addAllPlaylistCommands();
- Set<SessionCommand2> commands = group.getCommands();
- for (SessionCommand2 command : commands) {
- sCommandsForOnCommandRequest.append(command.getCommandCode(), command);
- }
- }
- }
- }
-
- public void destroyNotLocked() {
- final List<ControllerInfo> list;
- synchronized (mLock) {
- mSession.clear();
- list = getControllers();
- mControllers.clear();
- }
- for (int i = 0; i < list.size(); i++) {
- IMediaController2 controllerBinder =
- ((ControllerInfoImpl) list.get(i).getProvider()).getControllerBinder();
- try {
- // Should be used without a lock hold to prevent potential deadlock.
- controllerBinder.onDisconnected();
- } catch (RemoteException e) {
- // Controller is gone. Should be fine because we're destroying.
- }
- }
- }
-
- private MediaSession2Impl getSession() {
- final MediaSession2Impl session = mSession.get();
- if (session == null && DEBUG) {
- Log.d(TAG, "Session is closed", new IllegalStateException());
- }
- return session;
- }
-
- private MediaLibrarySessionImpl getLibrarySession() throws IllegalStateException {
- final MediaSession2Impl session = getSession();
- if (!(session instanceof MediaLibrarySessionImpl)) {
- throw new RuntimeException("Session isn't a library session");
- }
- return (MediaLibrarySessionImpl) session;
- }
-
- // Get controller if the command from caller to session is able to be handled.
- private ControllerInfo getControllerIfAble(IMediaController2 caller) {
- synchronized (mLock) {
- final ControllerInfo controllerInfo = mControllers.get(caller.asBinder());
- if (controllerInfo == null && DEBUG) {
- Log.d(TAG, "Controller is disconnected", new IllegalStateException());
- }
- return controllerInfo;
- }
- }
-
- // Get controller if the command from caller to session is able to be handled.
- private ControllerInfo getControllerIfAble(IMediaController2 caller, int commandCode) {
- synchronized (mLock) {
- final ControllerInfo controllerInfo = getControllerIfAble(caller);
- if (controllerInfo == null) {
- return null;
- }
- SessionCommandGroup2 allowedCommands = mAllowedCommandGroupMap.get(controllerInfo);
- if (allowedCommands == null) {
- Log.w(TAG, "Controller with null allowed commands. Ignoring",
- new IllegalStateException());
- return null;
- }
- if (!allowedCommands.hasCommand(commandCode)) {
- if (DEBUG) {
- Log.d(TAG, "Controller isn't allowed for command " + commandCode);
- }
- return null;
- }
- return controllerInfo;
- }
- }
-
- // Get controller if the command from caller to session is able to be handled.
- private ControllerInfo getControllerIfAble(IMediaController2 caller, SessionCommand2 command) {
- synchronized (mLock) {
- final ControllerInfo controllerInfo = getControllerIfAble(caller);
- if (controllerInfo == null) {
- return null;
- }
- SessionCommandGroup2 allowedCommands = mAllowedCommandGroupMap.get(controllerInfo);
- if (allowedCommands == null) {
- Log.w(TAG, "Controller with null allowed commands. Ignoring",
- new IllegalStateException());
- return null;
- }
- if (!allowedCommands.hasCommand(command)) {
- if (DEBUG) {
- Log.d(TAG, "Controller isn't allowed for command " + command);
- }
- return null;
- }
- return controllerInfo;
- }
- }
-
- // Return binder if the session is able to send a command to the controller.
- private IMediaController2 getControllerBinderIfAble(ControllerInfo controller) {
- if (getSession() == null) {
- // getSession() already logged if session is closed.
- return null;
- }
- final ControllerInfoImpl impl = ControllerInfoImpl.from(controller);
- synchronized (mLock) {
- if (mControllers.get(impl.getId()) != null
- || mConnectingControllers.contains(impl.getId())) {
- return impl.getControllerBinder();
- }
- if (DEBUG) {
- Log.d(TAG, controller + " isn't connected nor connecting",
- new IllegalArgumentException());
- }
- return null;
- }
- }
-
- // Return binder if the session is able to send a command to the controller.
- private IMediaController2 getControllerBinderIfAble(ControllerInfo controller,
- int commandCode) {
- synchronized (mLock) {
- SessionCommandGroup2 allowedCommands = mAllowedCommandGroupMap.get(controller);
- if (allowedCommands == null) {
- Log.w(TAG, "Controller with null allowed commands. Ignoring");
- return null;
- }
- if (!allowedCommands.hasCommand(commandCode)) {
- if (DEBUG) {
- Log.d(TAG, "Controller isn't allowed for command " + commandCode);
- }
- return null;
- }
- return getControllerBinderIfAble(controller);
- }
- }
-
- private void onCommand(@NonNull IMediaController2 caller, int commandCode,
- @NonNull SessionRunnable runnable) {
- final MediaSession2Impl session = getSession();
- final ControllerInfo controller = getControllerIfAble(caller, commandCode);
- if (session == null || controller == null) {
- return;
- }
- session.getCallbackExecutor().execute(() -> {
- if (getControllerIfAble(caller, commandCode) == null) {
- return;
- }
- SessionCommand2 command = sCommandsForOnCommandRequest.get(commandCode);
- if (command != null) {
- boolean accepted = session.getCallback().onCommandRequest(session.getInstance(),
- controller, command);
- if (!accepted) {
- // Don't run rejected command.
- if (DEBUG) {
- Log.d(TAG, "Command (code=" + commandCode + ") from "
- + controller + " was rejected by " + session);
- }
- return;
- }
- }
- runnable.run(session, controller);
- });
- }
-
- private void onBrowserCommand(@NonNull IMediaController2 caller,
- @NonNull LibrarySessionRunnable runnable) {
- final MediaLibrarySessionImpl session = getLibrarySession();
- // TODO(jaewan): Consider command code
- final ControllerInfo controller = getControllerIfAble(caller);
- if (session == null || controller == null) {
- return;
- }
- session.getCallbackExecutor().execute(() -> {
- // TODO(jaewan): Consider command code
- if (getControllerIfAble(caller) == null) {
- return;
- }
- runnable.run(session, controller);
- });
- }
-
-
- private void notifyAll(int commandCode, @NonNull NotifyRunnable runnable) {
- List<ControllerInfo> controllers = getControllers();
- for (int i = 0; i < controllers.size(); i++) {
- notifyInternal(controllers.get(i),
- getControllerBinderIfAble(controllers.get(i), commandCode), runnable);
- }
- }
-
- private void notifyAll(@NonNull NotifyRunnable runnable) {
- List<ControllerInfo> controllers = getControllers();
- for (int i = 0; i < controllers.size(); i++) {
- notifyInternal(controllers.get(i),
- getControllerBinderIfAble(controllers.get(i)), runnable);
- }
- }
-
- private void notify(@NonNull ControllerInfo controller, @NonNull NotifyRunnable runnable) {
- notifyInternal(controller, getControllerBinderIfAble(controller), runnable);
- }
-
- private void notify(@NonNull ControllerInfo controller, int commandCode,
- @NonNull NotifyRunnable runnable) {
- notifyInternal(controller, getControllerBinderIfAble(controller, commandCode), runnable);
- }
-
- // Do not call this API directly. Use notify() instead.
- private void notifyInternal(@NonNull ControllerInfo controller,
- @NonNull IMediaController2 iController, @NonNull NotifyRunnable runnable) {
- if (controller == null || iController == null) {
- return;
- }
- try {
- runnable.run(controller, iController);
- } catch (DeadObjectException e) {
- if (DEBUG) {
- Log.d(TAG, controller.toString() + " is gone", e);
- }
- onControllerClosed(iController);
- } catch (RemoteException e) {
- // Currently it's TransactionTooLargeException or DeadSystemException.
- // We'd better to leave log for those cases because
- // - TransactionTooLargeException means that we may need to fix our code.
- // (e.g. add pagination or special way to deliver Bitmap)
- // - DeadSystemException means that errors around it can be ignored.
- Log.w(TAG, "Exception in " + controller.toString(), e);
- }
- }
-
- private void onControllerClosed(IMediaController2 iController) {
- ControllerInfo controller;
- synchronized (mLock) {
- controller = mControllers.remove(iController.asBinder());
- if (DEBUG) {
- Log.d(TAG, "releasing " + controller);
- }
- mSubscriptions.remove(controller);
- }
- final MediaSession2Impl session = getSession();
- if (session == null || controller == null) {
- return;
- }
- session.getCallbackExecutor().execute(() -> {
- session.getCallback().onDisconnected(session.getInstance(), controller);
- });
- }
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // AIDL methods for session overrides
- //////////////////////////////////////////////////////////////////////////////////////////////
- @Override
- public void connect(final IMediaController2 caller, final String callingPackage)
- throws RuntimeException {
- final MediaSession2Impl session = getSession();
- if (session == null) {
- return;
- }
- final Context context = session.getContext();
- final ControllerInfo controllerInfo = new ControllerInfo(context,
- Binder.getCallingUid(), Binder.getCallingPid(), callingPackage, caller);
- session.getCallbackExecutor().execute(() -> {
- if (getSession() == null) {
- return;
- }
- synchronized (mLock) {
- // Keep connecting controllers.
- // This helps sessions to call APIs in the onConnect() (e.g. setCustomLayout())
- // instead of pending them.
- mConnectingControllers.add(ControllerInfoImpl.from(controllerInfo).getId());
- }
- SessionCommandGroup2 allowedCommands = session.getCallback().onConnect(
- session.getInstance(), controllerInfo);
- // Don't reject connection for the request from trusted app.
- // Otherwise server will fail to retrieve session's information to dispatch
- // media keys to.
- boolean accept = allowedCommands != null || controllerInfo.isTrusted();
- if (accept) {
- ControllerInfoImpl controllerImpl = ControllerInfoImpl.from(controllerInfo);
- if (DEBUG) {
- Log.d(TAG, "Accepting connection, controllerInfo=" + controllerInfo
- + " allowedCommands=" + allowedCommands);
- }
- if (allowedCommands == null) {
- // For trusted apps, send non-null allowed commands to keep connection.
- allowedCommands = new SessionCommandGroup2();
- }
- synchronized (mLock) {
- mConnectingControllers.remove(controllerImpl.getId());
- mControllers.put(controllerImpl.getId(), controllerInfo);
- mAllowedCommandGroupMap.put(controllerInfo, allowedCommands);
- }
- // If connection is accepted, notify the current state to the controller.
- // It's needed because we cannot call synchronous calls between session/controller.
- // Note: We're doing this after the onConnectionChanged(), but there's no guarantee
- // that events here are notified after the onConnected() because
- // IMediaController2 is oneway (i.e. async call) and Stub will
- // use thread poll for incoming calls.
- final int playerState = session.getInstance().getPlayerState();
- final long positionEventTimeMs = System.currentTimeMillis();
- final long positionMs = session.getInstance().getCurrentPosition();
- final float playbackSpeed = session.getInstance().getPlaybackSpeed();
- final long bufferedPositionMs = session.getInstance().getBufferedPosition();
- final Bundle playbackInfoBundle = ((MediaController2Impl.PlaybackInfoImpl)
- session.getPlaybackInfo().getProvider()).toBundle();
- final int repeatMode = session.getInstance().getRepeatMode();
- final int shuffleMode = session.getInstance().getShuffleMode();
- final PendingIntent sessionActivity = session.getSessionActivity();
- final List<MediaItem2> playlist =
- allowedCommands.hasCommand(SessionCommand2.COMMAND_CODE_PLAYLIST_GET_LIST)
- ? session.getInstance().getPlaylist() : null;
- final List<Bundle> playlistBundle;
- if (playlist != null) {
- playlistBundle = new ArrayList<>();
- // TODO(jaewan): Find a way to avoid concurrent modification exception.
- for (int i = 0; i < playlist.size(); i++) {
- final MediaItem2 item = playlist.get(i);
- if (item != null) {
- final Bundle itemBundle = item.toBundle();
- if (itemBundle != null) {
- playlistBundle.add(itemBundle);
- }
- }
- }
- } else {
- playlistBundle = null;
- }
-
- // Double check if session is still there, because close() can be called in another
- // thread.
- if (getSession() == null) {
- return;
- }
- try {
- caller.onConnected(MediaSession2Stub.this, allowedCommands.toBundle(),
- playerState, positionEventTimeMs, positionMs, playbackSpeed,
- bufferedPositionMs, playbackInfoBundle, repeatMode, shuffleMode,
- playlistBundle, sessionActivity);
- } catch (RemoteException e) {
- // Controller may be died prematurely.
- // TODO(jaewan): Handle here.
- }
- } else {
- synchronized (mLock) {
- mConnectingControllers.remove(ControllerInfoImpl.from(controllerInfo).getId());
- }
- if (DEBUG) {
- Log.d(TAG, "Rejecting connection, controllerInfo=" + controllerInfo);
- }
- try {
- caller.onDisconnected();
- } catch (RemoteException e) {
- // Controller may be died prematurely.
- // Not an issue because we'll ignore it anyway.
- }
- }
- });
- }
-
- @Override
- public void release(final IMediaController2 caller) throws RemoteException {
- onControllerClosed(caller);
- }
-
- @Override
- public void setVolumeTo(final IMediaController2 caller, final int value, final int flags)
- throws RuntimeException {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SET_VOLUME,
- (session, controller) -> {
- VolumeProvider2 volumeProvider = session.getVolumeProvider();
- if (volumeProvider == null) {
- // TODO(jaewan): Set local stream volume
- } else {
- volumeProvider.onSetVolumeTo(value);
- }
- });
- }
-
- @Override
- public void adjustVolume(IMediaController2 caller, int direction, int flags)
- throws RuntimeException {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SET_VOLUME,
- (session, controller) -> {
- VolumeProvider2 volumeProvider = session.getVolumeProvider();
- if (volumeProvider == null) {
- // TODO(jaewan): Adjust local stream volume
- } else {
- volumeProvider.onAdjustVolume(direction);
- }
- });
- }
-
- @Override
- public void sendTransportControlCommand(IMediaController2 caller,
- int commandCode, Bundle args) throws RuntimeException {
- onCommand(caller, commandCode, (session, controller) -> {
- switch (commandCode) {
- case SessionCommand2.COMMAND_CODE_PLAYBACK_PLAY:
- session.getInstance().play();
- break;
- case SessionCommand2.COMMAND_CODE_PLAYBACK_PAUSE:
- session.getInstance().pause();
- break;
- case SessionCommand2.COMMAND_CODE_PLAYBACK_STOP:
- session.getInstance().stop();
- break;
- case SessionCommand2.COMMAND_CODE_PLAYBACK_PREPARE:
- session.getInstance().prepare();
- break;
- case SessionCommand2.COMMAND_CODE_PLAYBACK_SEEK_TO:
- session.getInstance().seekTo(args.getLong(ARGUMENT_KEY_POSITION));
- break;
- default:
- // TODO(jaewan): Resend unknown (new) commands through the custom command.
- }
- });
- }
-
- @Override
- public void sendCustomCommand(final IMediaController2 caller, final Bundle commandBundle,
- final Bundle args, final ResultReceiver receiver) {
- final MediaSession2Impl session = getSession();
- if (session == null) {
- return;
- }
- final SessionCommand2 command = SessionCommand2.fromBundle(commandBundle);
- if (command == null) {
- Log.w(TAG, "sendCustomCommand(): Ignoring null command from "
- + getControllerIfAble(caller));
- return;
- }
- final ControllerInfo controller = getControllerIfAble(caller, command);
- if (controller == null) {
- return;
- }
- session.getCallbackExecutor().execute(() -> {
- if (getControllerIfAble(caller, command) == null) {
- return;
- }
- session.getCallback().onCustomCommand(session.getInstance(),
- controller, command, args, receiver);
- });
- }
-
- @Override
- public void prepareFromUri(final IMediaController2 caller, final Uri uri,
- final Bundle extras) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SESSION_PREPARE_FROM_URI,
- (session, controller) -> {
- if (uri == null) {
- Log.w(TAG, "prepareFromUri(): Ignoring null uri from " + controller);
- return;
- }
- session.getCallback().onPrepareFromUri(session.getInstance(), controller, uri,
- extras);
- });
- }
-
- @Override
- public void prepareFromSearch(final IMediaController2 caller, final String query,
- final Bundle extras) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH,
- (session, controller) -> {
- if (TextUtils.isEmpty(query)) {
- Log.w(TAG, "prepareFromSearch(): Ignoring empty query from " + controller);
- return;
- }
- session.getCallback().onPrepareFromSearch(session.getInstance(),
- controller, query, extras);
- });
- }
-
- @Override
- public void prepareFromMediaId(final IMediaController2 caller, final String mediaId,
- final Bundle extras) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID,
- (session, controller) -> {
- if (mediaId == null) {
- Log.w(TAG, "prepareFromMediaId(): Ignoring null mediaId from " + controller);
- return;
- }
- session.getCallback().onPrepareFromMediaId(session.getInstance(),
- controller, mediaId, extras);
- });
- }
-
- @Override
- public void playFromUri(final IMediaController2 caller, final Uri uri,
- final Bundle extras) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SESSION_PLAY_FROM_URI,
- (session, controller) -> {
- if (uri == null) {
- Log.w(TAG, "playFromUri(): Ignoring null uri from " + controller);
- return;
- }
- session.getCallback().onPlayFromUri(session.getInstance(), controller, uri,
- extras);
- });
- }
-
- @Override
- public void playFromSearch(final IMediaController2 caller, final String query,
- final Bundle extras) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SESSION_PLAY_FROM_SEARCH,
- (session, controller) -> {
- if (TextUtils.isEmpty(query)) {
- Log.w(TAG, "playFromSearch(): Ignoring empty query from " + controller);
- return;
- }
- session.getCallback().onPlayFromSearch(session.getInstance(),
- controller, query, extras);
- });
- }
-
- @Override
- public void playFromMediaId(final IMediaController2 caller, final String mediaId,
- final Bundle extras) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID,
- (session, controller) -> {
- if (mediaId == null) {
- Log.w(TAG, "playFromMediaId(): Ignoring null mediaId from " + controller);
- return;
- }
- session.getCallback().onPlayFromMediaId(session.getInstance(), controller,
- mediaId, extras);
- });
- }
-
- @Override
- public void setRating(final IMediaController2 caller, final String mediaId,
- final Bundle ratingBundle) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_SESSION_SET_RATING,
- (session, controller) -> {
- if (mediaId == null) {
- Log.w(TAG, "setRating(): Ignoring null mediaId from " + controller);
- return;
- }
- if (ratingBundle == null) {
- Log.w(TAG, "setRating(): Ignoring null ratingBundle from " + controller);
- return;
- }
- Rating2 rating = Rating2.fromBundle(ratingBundle);
- if (rating == null) {
- if (ratingBundle == null) {
- Log.w(TAG, "setRating(): Ignoring null rating from " + controller);
- return;
- }
- return;
- }
- session.getCallback().onSetRating(session.getInstance(), controller, mediaId,
- rating);
- });
- }
-
- @Override
- public void setPlaylist(final IMediaController2 caller, final List<Bundle> playlist,
- final Bundle metadata) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_SET_LIST, (session, controller) -> {
- if (playlist == null) {
- Log.w(TAG, "setPlaylist(): Ignoring null playlist from " + controller);
- return;
- }
- List<MediaItem2> list = new ArrayList<>();
- for (int i = 0; i < playlist.size(); i++) {
- // Recreates UUID in the playlist
- MediaItem2 item = MediaItem2Impl.fromBundle(playlist.get(i), null);
- if (item != null) {
- list.add(item);
- }
- }
- session.getInstance().setPlaylist(list, MediaMetadata2.fromBundle(metadata));
- });
- }
-
- @Override
- public void updatePlaylistMetadata(final IMediaController2 caller, final Bundle metadata) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_SET_LIST_METADATA,
- (session, controller) -> {
- session.getInstance().updatePlaylistMetadata(MediaMetadata2.fromBundle(metadata));
- });
- }
-
- @Override
- public void addPlaylistItem(IMediaController2 caller, int index, Bundle mediaItem) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_ADD_ITEM,
- (session, controller) -> {
- // Resets the UUID from the incoming media id, so controller may reuse a media
- // item multiple times for addPlaylistItem.
- session.getInstance().addPlaylistItem(index,
- MediaItem2Impl.fromBundle(mediaItem, null));
- });
- }
-
- @Override
- public void removePlaylistItem(IMediaController2 caller, Bundle mediaItem) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_REMOVE_ITEM,
- (session, controller) -> {
- MediaItem2 item = MediaItem2.fromBundle(mediaItem);
- // Note: MediaItem2 has hidden UUID to identify it across the processes.
- session.getInstance().removePlaylistItem(item);
- });
- }
-
- @Override
- public void replacePlaylistItem(IMediaController2 caller, int index, Bundle mediaItem) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_REPLACE_ITEM,
- (session, controller) -> {
- // Resets the UUID from the incoming media id, so controller may reuse a media
- // item multiple times for replacePlaylistItem.
- session.getInstance().replacePlaylistItem(index,
- MediaItem2Impl.fromBundle(mediaItem, null));
- });
- }
-
- @Override
- public void skipToPlaylistItem(IMediaController2 caller, Bundle mediaItem) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM,
- (session, controller) -> {
- if (mediaItem == null) {
- Log.w(TAG, "skipToPlaylistItem(): Ignoring null mediaItem from "
- + controller);
- }
- // Note: MediaItem2 has hidden UUID to identify it across the processes.
- session.getInstance().skipToPlaylistItem(MediaItem2.fromBundle(mediaItem));
- });
- }
-
- @Override
- public void skipToPreviousItem(IMediaController2 caller) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_SKIP_PREV_ITEM,
- (session, controller) -> {
- session.getInstance().skipToPreviousItem();
- });
- }
-
- @Override
- public void skipToNextItem(IMediaController2 caller) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_SKIP_NEXT_ITEM,
- (session, controller) -> {
- session.getInstance().skipToNextItem();
- });
- }
-
- @Override
- public void setRepeatMode(IMediaController2 caller, int repeatMode) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_SET_REPEAT_MODE,
- (session, controller) -> {
- session.getInstance().setRepeatMode(repeatMode);
- });
- }
-
- @Override
- public void setShuffleMode(IMediaController2 caller, int shuffleMode) {
- onCommand(caller, SessionCommand2.COMMAND_CODE_PLAYLIST_SET_SHUFFLE_MODE,
- (session, controller) -> {
- session.getInstance().setShuffleMode(shuffleMode);
- });
- }
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // AIDL methods for LibrarySession overrides
- //////////////////////////////////////////////////////////////////////////////////////////////
-
- @Override
- public void getLibraryRoot(final IMediaController2 caller, final Bundle rootHints)
- throws RuntimeException {
- onBrowserCommand(caller, (session, controller) -> {
- final LibraryRoot root = session.getCallback().onGetLibraryRoot(session.getInstance(),
- controller, rootHints);
- notify(controller, (unused, iController) -> {
- iController.onGetLibraryRootDone(rootHints,
- root == null ? null : root.getRootId(),
- root == null ? null : root.getExtras());
- });
- });
- }
-
- @Override
- public void getItem(final IMediaController2 caller, final String mediaId)
- throws RuntimeException {
- onBrowserCommand(caller, (session, controller) -> {
- if (mediaId == null) {
- if (DEBUG) {
- Log.d(TAG, "mediaId shouldn't be null");
- }
- return;
- }
- final MediaItem2 result = session.getCallback().onGetItem(session.getInstance(),
- controller, mediaId);
- notify(controller, (unused, iController) -> {
- iController.onGetItemDone(mediaId, result == null ? null : result.toBundle());
- });
- });
- }
-
- @Override
- public void getChildren(final IMediaController2 caller, final String parentId,
- final int page, final int pageSize, final Bundle extras) throws RuntimeException {
- onBrowserCommand(caller, (session, controller) -> {
- if (parentId == null) {
- if (DEBUG) {
- Log.d(TAG, "parentId shouldn't be null");
- }
- return;
- }
- if (page < 1 || pageSize < 1) {
- if (DEBUG) {
- Log.d(TAG, "Neither page nor pageSize should be less than 1");
- }
- return;
- }
- List<MediaItem2> result = session.getCallback().onGetChildren(session.getInstance(),
- controller, parentId, page, pageSize, extras);
- if (result != null && result.size() > pageSize) {
- throw new IllegalArgumentException("onGetChildren() shouldn't return media items "
- + "more than pageSize. result.size()=" + result.size() + " pageSize="
- + pageSize);
- }
- final List<Bundle> bundleList;
- if (result != null) {
- bundleList = new ArrayList<>();
- for (MediaItem2 item : result) {
- bundleList.add(item == null ? null : item.toBundle());
- }
- } else {
- bundleList = null;
- }
- notify(controller, (unused, iController) -> {
- iController.onGetChildrenDone(parentId, page, pageSize, bundleList, extras);
- });
- });
- }
-
- @Override
- public void search(IMediaController2 caller, String query, Bundle extras) {
- onBrowserCommand(caller, (session, controller) -> {
- if (TextUtils.isEmpty(query)) {
- Log.w(TAG, "search(): Ignoring empty query from " + controller);
- return;
- }
- session.getCallback().onSearch(session.getInstance(), controller, query, extras);
- });
- }
-
- @Override
- public void getSearchResult(final IMediaController2 caller, final String query,
- final int page, final int pageSize, final Bundle extras) {
- onBrowserCommand(caller, (session, controller) -> {
- if (TextUtils.isEmpty(query)) {
- Log.w(TAG, "getSearchResult(): Ignoring empty query from " + controller);
- return;
- }
- if (page < 1 || pageSize < 1) {
- Log.w(TAG, "getSearchResult(): Ignoring negative page / pageSize."
- + " page=" + page + " pageSize=" + pageSize + " from " + controller);
- return;
- }
- List<MediaItem2> result = session.getCallback().onGetSearchResult(session.getInstance(),
- controller, query, page, pageSize, extras);
- if (result != null && result.size() > pageSize) {
- throw new IllegalArgumentException("onGetSearchResult() shouldn't return media "
- + "items more than pageSize. result.size()=" + result.size() + " pageSize="
- + pageSize);
- }
- final List<Bundle> bundleList;
- if (result != null) {
- bundleList = new ArrayList<>();
- for (MediaItem2 item : result) {
- bundleList.add(item == null ? null : item.toBundle());
- }
- } else {
- bundleList = null;
- }
- notify(controller, (unused, iController) -> {
- iController.onGetSearchResultDone(query, page, pageSize, bundleList, extras);
- });
- });
- }
-
- @Override
- public void subscribe(final IMediaController2 caller, final String parentId,
- final Bundle option) {
- onBrowserCommand(caller, (session, controller) -> {
- if (parentId == null) {
- Log.w(TAG, "subscribe(): Ignoring null parentId from " + controller);
- return;
- }
- session.getCallback().onSubscribe(session.getInstance(),
- controller, parentId, option);
- synchronized (mLock) {
- Set<String> subscription = mSubscriptions.get(controller);
- if (subscription == null) {
- subscription = new HashSet<>();
- mSubscriptions.put(controller, subscription);
- }
- subscription.add(parentId);
- }
- });
- }
-
- @Override
- public void unsubscribe(final IMediaController2 caller, final String parentId) {
- onBrowserCommand(caller, (session, controller) -> {
- if (parentId == null) {
- Log.w(TAG, "unsubscribe(): Ignoring null parentId from " + controller);
- return;
- }
- session.getCallback().onUnsubscribe(session.getInstance(), controller, parentId);
- synchronized (mLock) {
- mSubscriptions.remove(controller);
- }
- });
- }
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // APIs for MediaSession2Impl
- //////////////////////////////////////////////////////////////////////////////////////////////
-
- // TODO(jaewan): (Can be Post-P) Need a way to get controller with permissions
- public List<ControllerInfo> getControllers() {
- ArrayList<ControllerInfo> controllers = new ArrayList<>();
- synchronized (mLock) {
- for (int i = 0; i < mControllers.size(); i++) {
- controllers.add(mControllers.valueAt(i));
- }
- }
- return controllers;
- }
-
- // Should be used without a lock to prevent potential deadlock.
- public void notifyPlayerStateChangedNotLocked(int state) {
- notifyAll((controller, iController) -> {
- iController.onPlayerStateChanged(state);
- });
- }
-
- // TODO(jaewan): Rename
- public void notifyPositionChangedNotLocked(long eventTimeMs, long positionMs) {
- notifyAll((controller, iController) -> {
- iController.onPositionChanged(eventTimeMs, positionMs);
- });
- }
-
- public void notifyPlaybackSpeedChangedNotLocked(float speed) {
- notifyAll((controller, iController) -> {
- iController.onPlaybackSpeedChanged(speed);
- });
- }
-
- public void notifyBufferedPositionChangedNotLocked(long bufferedPositionMs) {
- notifyAll((controller, iController) -> {
- iController.onBufferedPositionChanged(bufferedPositionMs);
- });
- }
-
- public void notifyCustomLayoutNotLocked(ControllerInfo controller, List<CommandButton> layout) {
- notify(controller, (unused, iController) -> {
- List<Bundle> layoutBundles = new ArrayList<>();
- for (int i = 0; i < layout.size(); i++) {
- Bundle bundle = ((CommandButtonImpl) layout.get(i).getProvider()).toBundle();
- if (bundle != null) {
- layoutBundles.add(bundle);
- }
- }
- iController.onCustomLayoutChanged(layoutBundles);
- });
- }
-
- public void notifyPlaylistChangedNotLocked(List<MediaItem2> playlist, MediaMetadata2 metadata) {
- final List<Bundle> bundleList;
- if (playlist != null) {
- bundleList = new ArrayList<>();
- for (int i = 0; i < playlist.size(); i++) {
- if (playlist.get(i) != null) {
- Bundle bundle = playlist.get(i).toBundle();
- if (bundle != null) {
- bundleList.add(bundle);
- }
- }
- }
- } else {
- bundleList = null;
- }
- final Bundle metadataBundle = (metadata == null) ? null : metadata.toBundle();
- notifyAll((controller, iController) -> {
- if (getControllerBinderIfAble(controller,
- SessionCommand2.COMMAND_CODE_PLAYLIST_GET_LIST) != null) {
- iController.onPlaylistChanged(bundleList, metadataBundle);
- } else if (getControllerBinderIfAble(controller,
- SessionCommand2.COMMAND_CODE_PLAYLIST_GET_LIST_METADATA) != null) {
- iController.onPlaylistMetadataChanged(metadataBundle);
- }
- });
- }
-
- public void notifyPlaylistMetadataChangedNotLocked(MediaMetadata2 metadata) {
- final Bundle metadataBundle = (metadata == null) ? null : metadata.toBundle();
- notifyAll(SessionCommand2.COMMAND_CODE_PLAYLIST_GET_LIST_METADATA,
- (unused, iController) -> {
- iController.onPlaylistMetadataChanged(metadataBundle);
- });
- }
-
- public void notifyRepeatModeChangedNotLocked(int repeatMode) {
- notifyAll((unused, iController) -> {
- iController.onRepeatModeChanged(repeatMode);
- });
- }
-
- public void notifyShuffleModeChangedNotLocked(int shuffleMode) {
- notifyAll((unused, iController) -> {
- iController.onShuffleModeChanged(shuffleMode);
- });
- }
-
- public void notifyPlaybackInfoChanged(MediaController2.PlaybackInfo playbackInfo) {
- final Bundle playbackInfoBundle =
- ((MediaController2Impl.PlaybackInfoImpl) playbackInfo.getProvider()).toBundle();
- notifyAll((unused, iController) -> {
- iController.onPlaybackInfoChanged(playbackInfoBundle);
- });
- }
-
- public void setAllowedCommands(ControllerInfo controller, SessionCommandGroup2 commands) {
- synchronized (mLock) {
- mAllowedCommandGroupMap.put(controller, commands);
- }
- notify(controller, (unused, iController) -> {
- iController.onAllowedCommandsChanged(commands.toBundle());
- });
- }
-
- public void sendCustomCommand(ControllerInfo controller, SessionCommand2 command, Bundle args,
- ResultReceiver receiver) {
- if (receiver != null && controller == null) {
- throw new IllegalArgumentException("Controller shouldn't be null if result receiver is"
- + " specified");
- }
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- notify(controller, (unused, iController) -> {
- Bundle commandBundle = command.toBundle();
- iController.onCustomCommand(commandBundle, args, null);
- });
- }
-
- public void sendCustomCommand(SessionCommand2 command, Bundle args) {
- if (command == null) {
- throw new IllegalArgumentException("command shouldn't be null");
- }
- Bundle commandBundle = command.toBundle();
- notifyAll((unused, iController) -> {
- iController.onCustomCommand(commandBundle, args, null);
- });
- }
-
- public void notifyError(int errorCode, Bundle extras) {
- notifyAll((unused, iController) -> {
- iController.onError(errorCode, extras);
- });
- }
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // APIs for MediaLibrarySessionImpl
- //////////////////////////////////////////////////////////////////////////////////////////////
-
- public void notifySearchResultChanged(ControllerInfo controller, String query, int itemCount,
- Bundle extras) {
- notify(controller, (unused, iController) -> {
- iController.onSearchResultChanged(query, itemCount, extras);
- });
- }
-
- public void notifyChildrenChangedNotLocked(ControllerInfo controller, String parentId,
- int itemCount, Bundle extras) {
- notify(controller, (unused, iController) -> {
- if (isSubscribed(controller, parentId)) {
- iController.onChildrenChanged(parentId, itemCount, extras);
- }
- });
- }
-
- public void notifyChildrenChangedNotLocked(String parentId, int itemCount, Bundle extras) {
- notifyAll((controller, iController) -> {
- if (isSubscribed(controller, parentId)) {
- iController.onChildrenChanged(parentId, itemCount, extras);
- }
- });
- }
-
- private boolean isSubscribed(ControllerInfo controller, String parentId) {
- synchronized (mLock) {
- Set<String> subscriptions = mSubscriptions.get(controller);
- if (subscriptions == null || !subscriptions.contains(parentId)) {
- return false;
- }
- }
- return true;
- }
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // Misc
- //////////////////////////////////////////////////////////////////////////////////////////////
-
- @FunctionalInterface
- private interface SessionRunnable {
- void run(final MediaSession2Impl session, final ControllerInfo controller);
- }
-
- @FunctionalInterface
- private interface LibrarySessionRunnable {
- void run(final MediaLibrarySessionImpl session, final ControllerInfo controller);
- }
-
- @FunctionalInterface
- private interface NotifyRunnable {
- void run(final ControllerInfo controller,
- final IMediaController2 iController) throws RemoteException;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/MediaSessionService2Impl.java b/packages/MediaComponents/src/com/android/media/MediaSessionService2Impl.java
deleted file mode 100644
index d975839..0000000
--- a/packages/MediaComponents/src/com/android/media/MediaSessionService2Impl.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import static android.content.Context.NOTIFICATION_SERVICE;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.content.Intent;
-import android.media.MediaPlayerBase;
-import android.media.MediaPlayerBase.PlayerEventCallback;
-import android.media.MediaSession2;
-import android.media.MediaSessionService2;
-import android.media.MediaSessionService2.MediaNotification;
-import android.media.SessionToken2;
-import android.media.SessionToken2.TokenType;
-import android.media.update.MediaSessionService2Provider;
-import android.os.IBinder;
-import android.util.Log;
-
-import androidx.annotation.GuardedBy;
-
-// TODO(jaewan): Need a test for session service itself.
-public class MediaSessionService2Impl implements MediaSessionService2Provider {
-
- private static final String TAG = "MPSessionService"; // to meet 23 char limit in Log tag
- private static final boolean DEBUG = true; // TODO(jaewan): Change this. (b/74094611)
-
- private final MediaSessionService2 mInstance;
- private final PlayerEventCallback mCallback = new SessionServiceEventCallback();
-
- private final Object mLock = new Object();
- @GuardedBy("mLock")
- private NotificationManager mNotificationManager;
- @GuardedBy("mLock")
- private Intent mStartSelfIntent;
-
- private boolean mIsRunningForeground;
- private MediaSession2 mSession;
-
- public MediaSessionService2Impl(MediaSessionService2 instance) {
- if (DEBUG) {
- Log.d(TAG, "MediaSessionService2Impl(" + instance + ")");
- }
- mInstance = instance;
- }
-
- @Override
- public MediaSession2 getSession_impl() {
- return getSession();
- }
-
- MediaSession2 getSession() {
- synchronized (mLock) {
- return mSession;
- }
- }
-
- @Override
- public MediaNotification onUpdateNotification_impl() {
- // Provide default notification UI later.
- return null;
- }
-
- @Override
- public void onCreate_impl() {
- mNotificationManager = (NotificationManager) mInstance.getSystemService(
- NOTIFICATION_SERVICE);
- mStartSelfIntent = new Intent(mInstance, mInstance.getClass());
-
- SessionToken2 token = new SessionToken2(mInstance, mInstance.getPackageName(),
- mInstance.getClass().getName());
- if (token.getType() != getSessionType()) {
- throw new RuntimeException("Expected session service, but was " + token.getType());
- }
- mSession = mInstance.onCreateSession(token.getId());
- if (mSession == null || !token.getId().equals(mSession.getToken().getId())) {
- throw new RuntimeException("Expected session with id " + token.getId()
- + ", but got " + mSession);
- }
- // TODO(jaewan): Uncomment here.
- // mSession.registerPlayerEventCallback(mCallback, mSession.getExecutor());
- }
-
- @TokenType int getSessionType() {
- return SessionToken2.TYPE_SESSION_SERVICE;
- }
-
- public IBinder onBind_impl(Intent intent) {
- if (MediaSessionService2.SERVICE_INTERFACE.equals(intent.getAction())) {
- return ((MediaSession2Impl) mSession.getProvider()).getSessionStub().asBinder();
- }
- return null;
- }
-
- private void updateNotification(int playerState) {
- MediaNotification mediaNotification = mInstance.onUpdateNotification();
- if (mediaNotification == null) {
- return;
- }
- switch(playerState) {
- case MediaPlayerBase.PLAYER_STATE_PLAYING:
- if (!mIsRunningForeground) {
- mIsRunningForeground = true;
- mInstance.startForegroundService(mStartSelfIntent);
- mInstance.startForeground(mediaNotification.getNotificationId(),
- mediaNotification.getNotification());
- return;
- }
- break;
- case MediaPlayerBase.PLAYER_STATE_IDLE:
- case MediaPlayerBase.PLAYER_STATE_ERROR:
- if (mIsRunningForeground) {
- mIsRunningForeground = false;
- mInstance.stopForeground(true);
- return;
- }
- break;
- }
- mNotificationManager.notify(mediaNotification.getNotificationId(),
- mediaNotification.getNotification());
- }
-
- private class SessionServiceEventCallback extends PlayerEventCallback {
- @Override
- public void onPlayerStateChanged(MediaPlayerBase player, int state) {
- // TODO: Implement this
- return;
- }
- }
-
- public static class MediaNotificationImpl implements MediaNotificationProvider {
- private int mNotificationId;
- private Notification mNotification;
-
- public MediaNotificationImpl(MediaNotification instance, int notificationId,
- Notification notification) {
- if (notification == null) {
- throw new IllegalArgumentException("notification shouldn't be null");
- }
- mNotificationId = notificationId;
- mNotification = notification;
- }
-
- @Override
- public int getNotificationId_impl() {
- return mNotificationId;
- }
-
- @Override
- public Notification getNotification_impl() {
- return mNotification;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/Rating2Impl.java b/packages/MediaComponents/src/com/android/media/Rating2Impl.java
deleted file mode 100644
index e2b9f0a..0000000
--- a/packages/MediaComponents/src/com/android/media/Rating2Impl.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import static android.media.Rating2.*;
-
-import android.media.Rating2;
-import android.media.Rating2.Style;
-import android.media.update.Rating2Provider;
-import android.os.Bundle;
-import android.util.Log;
-
-import java.util.Objects;
-
-public final class Rating2Impl implements Rating2Provider {
- private static final String TAG = "Rating2";
-
- private static final String KEY_STYLE = "android.media.rating2.style";
- private static final String KEY_VALUE = "android.media.rating2.value";
-
- private final static float RATING_NOT_RATED = -1.0f;
-
- private final Rating2 mInstance;
- private final int mRatingStyle;
- private final float mRatingValue;
-
- private Rating2Impl(@Style int ratingStyle, float rating) {
- mRatingStyle = ratingStyle;
- mRatingValue = rating;
- mInstance = new Rating2(this);
- }
-
- @Override
- public String toString_impl() {
- return "Rating2:style=" + mRatingStyle + " rating="
- + (mRatingValue < 0.0f ? "unrated" : String.valueOf(mRatingValue));
- }
-
- @Override
- public boolean equals_impl(Object obj) {
- if (!(obj instanceof Rating2)) {
- return false;
- }
- Rating2Impl other = (Rating2Impl) ((Rating2) obj).getProvider();
- return mRatingStyle == other.mRatingStyle
- && mRatingValue == other.mRatingValue;
- }
-
- @Override
- public int hashCode_impl() {
- return Objects.hash(mRatingStyle, mRatingValue);
- }
-
- Rating2 getInstance() {
- return mInstance;
- }
-
- public static Rating2 fromBundle_impl(Bundle bundle) {
- if (bundle == null) {
- return null;
- }
- return new Rating2Impl(bundle.getInt(KEY_STYLE), bundle.getFloat(KEY_VALUE)).getInstance();
- }
-
- public Bundle toBundle_impl() {
- Bundle bundle = new Bundle();
- bundle.putInt(KEY_STYLE, mRatingStyle);
- bundle.putFloat(KEY_VALUE, mRatingValue);
- return bundle;
- }
-
- public static Rating2 newUnratedRating_impl(@Style int ratingStyle) {
- switch(ratingStyle) {
- case RATING_HEART:
- case RATING_THUMB_UP_DOWN:
- case RATING_3_STARS:
- case RATING_4_STARS:
- case RATING_5_STARS:
- case RATING_PERCENTAGE:
- return new Rating2Impl(ratingStyle, RATING_NOT_RATED).getInstance();
- default:
- return null;
- }
- }
-
- public static Rating2 newHeartRating_impl(boolean hasHeart) {
- return new Rating2Impl(RATING_HEART, hasHeart ? 1.0f : 0.0f).getInstance();
- }
-
- public static Rating2 newThumbRating_impl(boolean thumbIsUp) {
- return new Rating2Impl(RATING_THUMB_UP_DOWN, thumbIsUp ? 1.0f : 0.0f).getInstance();
- }
-
- public static Rating2 newStarRating_impl(int starRatingStyle, float starRating) {
- float maxRating = RATING_NOT_RATED;
- switch(starRatingStyle) {
- case RATING_3_STARS:
- maxRating = 3.0f;
- break;
- case RATING_4_STARS:
- maxRating = 4.0f;
- break;
- case RATING_5_STARS:
- maxRating = 5.0f;
- break;
- default:
- Log.e(TAG, "Invalid rating style (" + starRatingStyle + ") for a star rating");
- return null;
- }
- if ((starRating < 0.0f) || (starRating > maxRating)) {
- Log.e(TAG, "Trying to set out of range star-based rating");
- return null;
- }
- return new Rating2Impl(starRatingStyle, starRating).getInstance();
- }
-
- public static Rating2 newPercentageRating_impl(float percent) {
- if ((percent < 0.0f) || (percent > 100.0f)) {
- Log.e(TAG, "Invalid percentage-based rating value");
- return null;
- } else {
- return new Rating2Impl(RATING_PERCENTAGE, percent).getInstance();
- }
- }
-
- @Override
- public boolean isRated_impl() {
- return mRatingValue >= 0.0f;
- }
-
- @Override
- public int getRatingStyle_impl() {
- return mRatingStyle;
- }
-
- @Override
- public boolean hasHeart_impl() {
- if (mRatingStyle != RATING_HEART) {
- return false;
- } else {
- return (mRatingValue == 1.0f);
- }
- }
-
- @Override
- public boolean isThumbUp_impl() {
- if (mRatingStyle != RATING_THUMB_UP_DOWN) {
- return false;
- } else {
- return (mRatingValue == 1.0f);
- }
- }
-
- @Override
- public float getStarRating_impl() {
- switch (mRatingStyle) {
- case RATING_3_STARS:
- case RATING_4_STARS:
- case RATING_5_STARS:
- if (mInstance.isRated()) {
- return mRatingValue;
- }
- default:
- return -1.0f;
- }
- }
-
- @Override
- public float getPercentRating_impl() {
- if ((mRatingStyle != RATING_PERCENTAGE) || !mInstance.isRated()) {
- return -1.0f;
- } else {
- return mRatingValue;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/RoutePlayer.java b/packages/MediaComponents/src/com/android/media/RoutePlayer.java
deleted file mode 100644
index ebff0e2..0000000
--- a/packages/MediaComponents/src/com/android/media/RoutePlayer.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.content.Context;
-import android.media.DataSourceDesc;
-import android.media.session.MediaSession;
-import android.media.session.PlaybackState;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.support.mediarouter.media.MediaItemStatus;
-import com.android.support.mediarouter.media.MediaRouter;
-import com.android.support.mediarouter.media.MediaSessionStatus;
-import com.android.support.mediarouter.media.RemotePlaybackClient;
-import com.android.support.mediarouter.media.RemotePlaybackClient.ItemActionCallback;
-import com.android.support.mediarouter.media.RemotePlaybackClient.SessionActionCallback;
-import com.android.support.mediarouter.media.RemotePlaybackClient.StatusCallback;
-
-@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-public class RoutePlayer extends MediaSession.Callback {
- public static final long PLAYBACK_ACTIONS = PlaybackState.ACTION_PAUSE
- | PlaybackState.ACTION_PLAY | PlaybackState.ACTION_SEEK_TO
- | PlaybackState.ACTION_FAST_FORWARD | PlaybackState.ACTION_REWIND;
-
- private RemotePlaybackClient mClient;
- private String mSessionId;
- private String mItemId;
- private PlayerEventCallback mCallback;
-
- private StatusCallback mStatusCallback = new StatusCallback() {
- @Override
- public void onItemStatusChanged(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- updateItemStatus(itemId, itemStatus);
- }
- };
-
- public RoutePlayer(Context context, MediaRouter.RouteInfo route) {
- mClient = new RemotePlaybackClient(context, route);
- mClient.setStatusCallback(mStatusCallback);
- mClient.startSession(null, new SessionActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- }
- });
- }
-
- @Override
- public void onPlay() {
- mClient.resume(null, new SessionActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- }
- });
- }
-
- @Override
- public void onPause() {
- mClient.pause(null, new SessionActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- }
- });
- }
-
- @Override
- public void onSeekTo(long pos) {
- mClient.seek(mItemId, pos, null, new ItemActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- updateItemStatus(itemId, itemStatus);
- }
- });
- }
-
- @Override
- public void onStop() {
- mClient.stop(null, new SessionActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- }
- });
- }
-
- public void setPlayerEventCallback(PlayerEventCallback callback) {
- mCallback = callback;
- }
-
- public void openVideo(DataSourceDesc dsd) {
- mClient.play(dsd.getUri(), "video/mp4", null, 0, null, new ItemActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- updateItemStatus(itemId, itemStatus);
- playInternal(dsd.getUri());
- }
- });
- }
-
- public void release() {
- if (mClient != null) {
- mClient.release();
- mClient = null;
- }
- if (mCallback != null) {
- mCallback = null;
- }
- }
-
- private void playInternal(Uri uri) {
- mClient.play(uri, "video/mp4", null, 0, null, new ItemActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- updateItemStatus(itemId, itemStatus);
- }
- });
- }
-
- private void updateSessionStatus(String sessionId, MediaSessionStatus sessionStatus) {
- mSessionId = sessionId;
- }
-
- private void updateItemStatus(String itemId, MediaItemStatus itemStatus) {
- mItemId = itemId;
- if (itemStatus == null || mCallback == null) return;
- mCallback.onPlayerStateChanged(itemStatus);
- }
-
- public static abstract class PlayerEventCallback {
- public void onPlayerStateChanged(MediaItemStatus itemStatus) { }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/SessionPlaylistAgent.java b/packages/MediaComponents/src/com/android/media/SessionPlaylistAgent.java
deleted file mode 100644
index 1c570aa..0000000
--- a/packages/MediaComponents/src/com/android/media/SessionPlaylistAgent.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.media.DataSourceDesc;
-import android.media.MediaItem2;
-import android.media.MediaMetadata2;
-import android.media.MediaPlayerBase;
-import android.media.MediaPlayerBase.PlayerEventCallback;
-import android.media.MediaPlaylistAgent;
-import android.media.MediaSession2.OnDataSourceMissingHelper;
-import android.util.ArrayMap;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ThreadLocalRandom;
-
-public class SessionPlaylistAgent extends MediaPlaylistAgent {
- private static final String TAG = "SessionPlaylistAgent";
- @VisibleForTesting
- static final int END_OF_PLAYLIST = -1;
- @VisibleForTesting
- static final int NO_VALID_ITEMS = -2;
-
- private final PlayItem mEopPlayItem = new PlayItem(END_OF_PLAYLIST, null);
-
- private final Object mLock = new Object();
- private final MediaSession2Impl mSessionImpl;
- private final MyPlayerEventCallback mPlayerCallback;
-
- @GuardedBy("mLock")
- private MediaPlayerBase mPlayer;
- @GuardedBy("mLock")
- private OnDataSourceMissingHelper mDsmHelper;
- // TODO: Check if having the same item is okay (b/74090741)
- @GuardedBy("mLock")
- private ArrayList<MediaItem2> mPlaylist = new ArrayList<>();
- @GuardedBy("mLock")
- private ArrayList<MediaItem2> mShuffledList = new ArrayList<>();
- @GuardedBy("mLock")
- private Map<MediaItem2, DataSourceDesc> mItemDsdMap = new ArrayMap<>();
- @GuardedBy("mLock")
- private MediaMetadata2 mMetadata;
- @GuardedBy("mLock")
- private int mRepeatMode;
- @GuardedBy("mLock")
- private int mShuffleMode;
- @GuardedBy("mLock")
- private PlayItem mCurrent;
-
- // Called on session callback executor.
- private class MyPlayerEventCallback extends PlayerEventCallback {
- public void onCurrentDataSourceChanged(@NonNull MediaPlayerBase mpb,
- @Nullable DataSourceDesc dsd) {
- if (mPlayer != mpb) {
- return;
- }
- synchronized (mLock) {
- if (dsd == null && mCurrent != null) {
- mCurrent = getNextValidPlayItemLocked(mCurrent.shuffledIdx, 1);
- updateCurrentIfNeededLocked();
- }
- }
- }
- }
-
- private class PlayItem {
- int shuffledIdx;
- DataSourceDesc dsd;
- MediaItem2 mediaItem;
-
- PlayItem(int shuffledIdx) {
- this(shuffledIdx, null);
- }
-
- PlayItem(int shuffledIdx, DataSourceDesc dsd) {
- this.shuffledIdx = shuffledIdx;
- if (shuffledIdx >= 0) {
- this.mediaItem = mShuffledList.get(shuffledIdx);
- if (dsd == null) {
- synchronized (mLock) {
- this.dsd = retrieveDataSourceDescLocked(this.mediaItem);
- }
- } else {
- this.dsd = dsd;
- }
- }
- }
-
- boolean isValid() {
- if (this == mEopPlayItem) {
- return true;
- }
- if (mediaItem == null) {
- return false;
- }
- if (dsd == null) {
- return false;
- }
- if (shuffledIdx >= mShuffledList.size()) {
- return false;
- }
- if (mediaItem != mShuffledList.get(shuffledIdx)) {
- return false;
- }
- if (mediaItem.getDataSourceDesc() != null
- && !mediaItem.getDataSourceDesc().equals(dsd)) {
- return false;
- }
- return true;
- }
- }
-
- public SessionPlaylistAgent(@NonNull MediaSession2Impl sessionImpl,
- @NonNull MediaPlayerBase player) {
- if (sessionImpl == null) {
- throw new IllegalArgumentException("sessionImpl shouldn't be null");
- }
- if (player == null) {
- throw new IllegalArgumentException("player shouldn't be null");
- }
- mSessionImpl = sessionImpl;
- mPlayer = player;
- mPlayerCallback = new MyPlayerEventCallback();
- mPlayer.registerPlayerEventCallback(mSessionImpl.getCallbackExecutor(), mPlayerCallback);
- }
-
- public void setPlayer(@NonNull MediaPlayerBase player) {
- if (player == null) {
- throw new IllegalArgumentException("player shouldn't be null");
- }
- synchronized (mLock) {
- if (player == mPlayer) {
- return;
- }
- mPlayer.unregisterPlayerEventCallback(mPlayerCallback);
- mPlayer = player;
- mPlayer.registerPlayerEventCallback(
- mSessionImpl.getCallbackExecutor(), mPlayerCallback);
- updatePlayerDataSourceLocked();
- }
- }
-
- public void setOnDataSourceMissingHelper(OnDataSourceMissingHelper helper) {
- synchronized (mLock) {
- mDsmHelper = helper;
- }
- }
-
- public void clearOnDataSourceMissingHelper() {
- synchronized (mLock) {
- mDsmHelper = null;
- }
- }
-
- @Override
- public @Nullable List<MediaItem2> getPlaylist() {
- synchronized (mLock) {
- return Collections.unmodifiableList(mPlaylist);
- }
- }
-
- @Override
- public void setPlaylist(@NonNull List<MediaItem2> list, @Nullable MediaMetadata2 metadata) {
- if (list == null) {
- throw new IllegalArgumentException("list shouldn't be null");
- }
-
- synchronized (mLock) {
- mItemDsdMap.clear();
-
- mPlaylist.clear();
- mPlaylist.addAll(list);
- applyShuffleModeLocked();
-
- mMetadata = metadata;
- mCurrent = getNextValidPlayItemLocked(END_OF_PLAYLIST, 1);
- updatePlayerDataSourceLocked();
- }
- notifyPlaylistChanged();
- }
-
- @Override
- public @Nullable MediaMetadata2 getPlaylistMetadata() {
- return mMetadata;
- }
-
- @Override
- public void updatePlaylistMetadata(@Nullable MediaMetadata2 metadata) {
- synchronized (mLock) {
- if (metadata == mMetadata) {
- return;
- }
- mMetadata = metadata;
- }
- notifyPlaylistMetadataChanged();
- }
-
- @Override
- public void addPlaylistItem(int index, @NonNull MediaItem2 item) {
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- synchronized (mLock) {
- index = clamp(index, mPlaylist.size());
- int shuffledIdx = index;
- mPlaylist.add(index, item);
- if (mShuffleMode == MediaPlaylistAgent.SHUFFLE_MODE_NONE) {
- mShuffledList.add(index, item);
- } else {
- // Add the item in random position of mShuffledList.
- shuffledIdx = ThreadLocalRandom.current().nextInt(mShuffledList.size() + 1);
- mShuffledList.add(shuffledIdx, item);
- }
- if (!hasValidItem()) {
- mCurrent = getNextValidPlayItemLocked(END_OF_PLAYLIST, 1);
- updatePlayerDataSourceLocked();
- } else {
- updateCurrentIfNeededLocked();
- }
- }
- notifyPlaylistChanged();
- }
-
- @Override
- public void removePlaylistItem(@NonNull MediaItem2 item) {
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- synchronized (mLock) {
- if (!mPlaylist.remove(item)) {
- return;
- }
- mShuffledList.remove(item);
- mItemDsdMap.remove(item);
- updateCurrentIfNeededLocked();
- }
- notifyPlaylistChanged();
- }
-
- @Override
- public void replacePlaylistItem(int index, @NonNull MediaItem2 item) {
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- synchronized (mLock) {
- if (mPlaylist.size() <= 0) {
- return;
- }
- index = clamp(index, mPlaylist.size() - 1);
- int shuffledIdx = mShuffledList.indexOf(mPlaylist.get(index));
- mItemDsdMap.remove(mShuffledList.get(shuffledIdx));
- mShuffledList.set(shuffledIdx, item);
- mPlaylist.set(index, item);
- if (!hasValidItem()) {
- mCurrent = getNextValidPlayItemLocked(END_OF_PLAYLIST, 1);
- updatePlayerDataSourceLocked();
- } else {
- updateCurrentIfNeededLocked();
- }
- }
- notifyPlaylistChanged();
- }
-
- @Override
- public void skipToPlaylistItem(@NonNull MediaItem2 item) {
- if (item == null) {
- throw new IllegalArgumentException("item shouldn't be null");
- }
- synchronized (mLock) {
- if (!hasValidItem() || item.equals(mCurrent.mediaItem)) {
- return;
- }
- int shuffledIdx = mShuffledList.indexOf(item);
- if (shuffledIdx < 0) {
- return;
- }
- mCurrent = new PlayItem(shuffledIdx);
- updateCurrentIfNeededLocked();
- }
- }
-
- @Override
- public void skipToPreviousItem() {
- synchronized (mLock) {
- if (!hasValidItem()) {
- return;
- }
- PlayItem prev = getNextValidPlayItemLocked(mCurrent.shuffledIdx, -1);
- if (prev != mEopPlayItem) {
- mCurrent = prev;
- }
- updateCurrentIfNeededLocked();
- }
- }
-
- @Override
- public void skipToNextItem() {
- synchronized (mLock) {
- if (!hasValidItem() || mCurrent == mEopPlayItem) {
- return;
- }
- PlayItem next = getNextValidPlayItemLocked(mCurrent.shuffledIdx, 1);
- if (next != mEopPlayItem) {
- mCurrent = next;
- }
- updateCurrentIfNeededLocked();
- }
- }
-
- @Override
- public int getRepeatMode() {
- return mRepeatMode;
- }
-
- @Override
- public void setRepeatMode(int repeatMode) {
- if (repeatMode < MediaPlaylistAgent.REPEAT_MODE_NONE
- || repeatMode > MediaPlaylistAgent.REPEAT_MODE_GROUP) {
- return;
- }
- synchronized (mLock) {
- if (mRepeatMode == repeatMode) {
- return;
- }
- mRepeatMode = repeatMode;
- switch (repeatMode) {
- case MediaPlaylistAgent.REPEAT_MODE_ONE:
- if (mCurrent != null && mCurrent != mEopPlayItem) {
- mPlayer.loopCurrent(true);
- }
- break;
- case MediaPlaylistAgent.REPEAT_MODE_ALL:
- case MediaPlaylistAgent.REPEAT_MODE_GROUP:
- if (mCurrent == mEopPlayItem) {
- mCurrent = getNextValidPlayItemLocked(END_OF_PLAYLIST, 1);
- updatePlayerDataSourceLocked();
- }
- // pass through
- case MediaPlaylistAgent.REPEAT_MODE_NONE:
- mPlayer.loopCurrent(false);
- break;
- }
- }
- notifyRepeatModeChanged();
- }
-
- @Override
- public int getShuffleMode() {
- return mShuffleMode;
- }
-
- @Override
- public void setShuffleMode(int shuffleMode) {
- if (shuffleMode < MediaPlaylistAgent.SHUFFLE_MODE_NONE
- || shuffleMode > MediaPlaylistAgent.SHUFFLE_MODE_GROUP) {
- return;
- }
- synchronized (mLock) {
- if (mShuffleMode == shuffleMode) {
- return;
- }
- mShuffleMode = shuffleMode;
- applyShuffleModeLocked();
- updateCurrentIfNeededLocked();
- }
- notifyShuffleModeChanged();
- }
-
- @VisibleForTesting
- int getCurShuffledIndex() {
- return hasValidItem() ? mCurrent.shuffledIdx : NO_VALID_ITEMS;
- }
-
- private boolean hasValidItem() {
- return mCurrent != null;
- }
-
- private DataSourceDesc retrieveDataSourceDescLocked(MediaItem2 item) {
- DataSourceDesc dsd = item.getDataSourceDesc();
- if (dsd != null) {
- mItemDsdMap.put(item, dsd);
- return dsd;
- }
- dsd = mItemDsdMap.get(item);
- if (dsd != null) {
- return dsd;
- }
- OnDataSourceMissingHelper helper = mDsmHelper;
- if (helper != null) {
- // TODO: Do not call onDataSourceMissing with the lock (b/74090741).
- dsd = helper.onDataSourceMissing(mSessionImpl.getInstance(), item);
- if (dsd != null) {
- mItemDsdMap.put(item, dsd);
- }
- }
- return dsd;
- }
-
- // TODO: consider to call updateCurrentIfNeededLocked inside (b/74090741)
- private PlayItem getNextValidPlayItemLocked(int curShuffledIdx, int direction) {
- int size = mPlaylist.size();
- if (curShuffledIdx == END_OF_PLAYLIST) {
- curShuffledIdx = (direction > 0) ? -1 : size;
- }
- for (int i = 0; i < size; i++) {
- curShuffledIdx += direction;
- if (curShuffledIdx < 0 || curShuffledIdx >= mPlaylist.size()) {
- if (mRepeatMode == REPEAT_MODE_NONE) {
- return (i == size - 1) ? null : mEopPlayItem;
- } else {
- curShuffledIdx = curShuffledIdx < 0 ? mPlaylist.size() - 1 : 0;
- }
- }
- DataSourceDesc dsd = retrieveDataSourceDescLocked(mShuffledList.get(curShuffledIdx));
- if (dsd != null) {
- return new PlayItem(curShuffledIdx, dsd);
- }
- }
- return null;
- }
-
- private void updateCurrentIfNeededLocked() {
- if (!hasValidItem() || mCurrent.isValid()) {
- return;
- }
- int shuffledIdx = mShuffledList.indexOf(mCurrent.mediaItem);
- if (shuffledIdx >= 0) {
- // Added an item.
- mCurrent.shuffledIdx = shuffledIdx;
- return;
- }
-
- if (mCurrent.shuffledIdx >= mShuffledList.size()) {
- mCurrent = getNextValidPlayItemLocked(mShuffledList.size() - 1, 1);
- } else {
- mCurrent.mediaItem = mShuffledList.get(mCurrent.shuffledIdx);
- if (retrieveDataSourceDescLocked(mCurrent.mediaItem) == null) {
- mCurrent = getNextValidPlayItemLocked(mCurrent.shuffledIdx, 1);
- }
- }
- updatePlayerDataSourceLocked();
- return;
- }
-
- private void updatePlayerDataSourceLocked() {
- if (mCurrent == null || mCurrent == mEopPlayItem) {
- return;
- }
- if (mPlayer.getCurrentDataSource() != mCurrent.dsd) {
- mPlayer.setDataSource(mCurrent.dsd);
- mPlayer.loopCurrent(mRepeatMode == MediaPlaylistAgent.REPEAT_MODE_ONE);
- }
- // TODO: Call setNextDataSource (b/74090741)
- }
-
- private void applyShuffleModeLocked() {
- mShuffledList.clear();
- mShuffledList.addAll(mPlaylist);
- if (mShuffleMode == MediaPlaylistAgent.SHUFFLE_MODE_ALL
- || mShuffleMode == MediaPlaylistAgent.SHUFFLE_MODE_GROUP) {
- Collections.shuffle(mShuffledList);
- }
- }
-
- // Clamps value to [0, size]
- private static int clamp(int value, int size) {
- if (value < 0) {
- return 0;
- }
- return (value > size) ? size : value;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/SessionToken2Impl.java b/packages/MediaComponents/src/com/android/media/SessionToken2Impl.java
deleted file mode 100644
index f792712..0000000
--- a/packages/MediaComponents/src/com/android/media/SessionToken2Impl.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import static android.media.SessionToken2.TYPE_LIBRARY_SERVICE;
-import static android.media.SessionToken2.TYPE_SESSION;
-import static android.media.SessionToken2.TYPE_SESSION_SERVICE;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ResolveInfo;
-import android.media.MediaLibraryService2;
-import android.media.MediaSessionService2;
-import android.media.SessionToken2;
-import android.media.SessionToken2.TokenType;
-import android.media.update.SessionToken2Provider;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.text.TextUtils;
-
-import java.util.List;
-
-public class SessionToken2Impl implements SessionToken2Provider {
- private static final String KEY_UID = "android.media.token.uid";
- private static final String KEY_TYPE = "android.media.token.type";
- private static final String KEY_PACKAGE_NAME = "android.media.token.package_name";
- private static final String KEY_SERVICE_NAME = "android.media.token.service_name";
- private static final String KEY_ID = "android.media.token.id";
- private static final String KEY_SESSION_BINDER = "android.media.token.session_binder";
-
- private final SessionToken2 mInstance;
- private final int mUid;
- private final @TokenType int mType;
- private final String mPackageName;
- private final String mServiceName;
- private final String mId;
- private final IMediaSession2 mSessionBinder;
-
- /**
- * Public constructor for the legacy support (i.e. browser can try connecting to any browser
- * service if it knows the service name)
- */
- public SessionToken2Impl(Context context, SessionToken2 instance,
- String packageName, String serviceName, int uid) {
- if (TextUtils.isEmpty(packageName)) {
- throw new IllegalArgumentException("packageName shouldn't be empty");
- }
- if (TextUtils.isEmpty(serviceName)) {
- throw new IllegalArgumentException("serviceName shouldn't be empty");
- }
- mInstance = instance;
- // Calculate uid if it's not specified.
- final PackageManager manager = context.getPackageManager();
- if (uid < 0) {
- try {
- uid = manager.getPackageUid(packageName, 0);
- } catch (NameNotFoundException e) {
- throw new IllegalArgumentException("Cannot find package " + packageName);
- }
- }
- mUid = uid;
-
- // Infer id and type from package name and service name
- // TODO(jaewan): Handle multi-user.
- String id = getSessionIdFromService(manager, MediaLibraryService2.SERVICE_INTERFACE,
- packageName, serviceName);
- if (id != null) {
- mId = id;
- mType = TYPE_LIBRARY_SERVICE;
- } else {
- // retry with session service
- mId = getSessionIdFromService(manager, MediaSessionService2.SERVICE_INTERFACE,
- packageName, serviceName);
- mType = TYPE_SESSION_SERVICE;
- }
- if (mId == null) {
- throw new IllegalArgumentException("service " + serviceName + " doesn't implement"
- + " session service nor library service. Use service's full name.");
- }
- mPackageName = packageName;
- mServiceName = serviceName;
- mSessionBinder = null;
- }
-
- SessionToken2Impl(int uid, int type, String packageName, String serviceName, String id,
- IMediaSession2 sessionBinder) {
- // TODO(jaewan): Add sanity check (b/73863865)
- mUid = uid;
- mType = type;
- mPackageName = packageName;
- mServiceName = serviceName;
- mId = id;
- mSessionBinder = sessionBinder;
- mInstance = new SessionToken2(this);
- }
-
- private static String getSessionIdFromService(PackageManager manager, String serviceInterface,
- String packageName, String serviceName) {
- Intent serviceIntent = new Intent(serviceInterface);
- serviceIntent.setPackage(packageName);
- // Use queryIntentServices to find services with MediaLibraryService2.SERVICE_INTERFACE.
- // We cannot use resolveService with intent specified class name, because resolveService
- // ignores actions if Intent.setClassName() is specified.
- List<ResolveInfo> list = manager.queryIntentServices(
- serviceIntent, PackageManager.GET_META_DATA);
- if (list != null) {
- for (int i = 0; i < list.size(); i++) {
- ResolveInfo resolveInfo = list.get(i);
- if (resolveInfo == null || resolveInfo.serviceInfo == null) {
- continue;
- }
- if (TextUtils.equals(resolveInfo.serviceInfo.name, serviceName)) {
- return getSessionId(resolveInfo);
- }
- }
- }
- return null;
- }
-
- public static String getSessionId(ResolveInfo resolveInfo) {
- if (resolveInfo == null || resolveInfo.serviceInfo == null) {
- return null;
- } else if (resolveInfo.serviceInfo.metaData == null) {
- return "";
- } else {
- return resolveInfo.serviceInfo.metaData.getString(
- MediaSessionService2.SERVICE_META_DATA, "");
- }
- }
-
- public SessionToken2 getInstance() {
- return mInstance;
- }
-
- @Override
- public String getPackageName_impl() {
- return mPackageName;
- }
-
- @Override
- public int getUid_impl() {
- return mUid;
- }
-
- @Override
- public String getId_imp() {
- return mId;
- }
-
- @Override
- public int getType_impl() {
- return mType;
- }
-
- String getServiceName() {
- return mServiceName;
- }
-
- IMediaSession2 getSessionBinder() {
- return mSessionBinder;
- }
-
- public static SessionToken2 fromBundle_impl(Bundle bundle) {
- if (bundle == null) {
- return null;
- }
- final int uid = bundle.getInt(KEY_UID);
- final @TokenType int type = bundle.getInt(KEY_TYPE, -1);
- final String packageName = bundle.getString(KEY_PACKAGE_NAME);
- final String serviceName = bundle.getString(KEY_SERVICE_NAME);
- final String id = bundle.getString(KEY_ID);
- final IBinder sessionBinder = bundle.getBinder(KEY_SESSION_BINDER);
-
- // Sanity check.
- switch (type) {
- case TYPE_SESSION:
- if (sessionBinder == null) {
- throw new IllegalArgumentException("Unexpected sessionBinder for session,"
- + " binder=" + sessionBinder);
- }
- break;
- case TYPE_SESSION_SERVICE:
- case TYPE_LIBRARY_SERVICE:
- if (TextUtils.isEmpty(serviceName)) {
- throw new IllegalArgumentException("Session service needs service name");
- }
- break;
- default:
- throw new IllegalArgumentException("Invalid type");
- }
- if (TextUtils.isEmpty(packageName) || id == null) {
- throw new IllegalArgumentException("Package name nor ID cannot be null.");
- }
- return new SessionToken2Impl(uid, type, packageName, serviceName, id,
- sessionBinder != null ? IMediaSession2.Stub.asInterface(sessionBinder) : null)
- .getInstance();
- }
-
- @Override
- public Bundle toBundle_impl() {
- Bundle bundle = new Bundle();
- bundle.putInt(KEY_UID, mUid);
- bundle.putString(KEY_PACKAGE_NAME, mPackageName);
- bundle.putString(KEY_SERVICE_NAME, mServiceName);
- bundle.putString(KEY_ID, mId);
- bundle.putInt(KEY_TYPE, mType);
- bundle.putBinder(KEY_SESSION_BINDER,
- mSessionBinder != null ? mSessionBinder.asBinder() : null);
- return bundle;
- }
-
- @Override
- public int hashCode_impl() {
- final int prime = 31;
- return mType
- + prime * (mUid
- + prime * (mPackageName.hashCode()
- + prime * (mId.hashCode()
- + prime * (mServiceName != null ? mServiceName.hashCode() : 0))));
- }
-
- @Override
- public boolean equals_impl(Object obj) {
- if (!(obj instanceof SessionToken2)) {
- return false;
- }
- SessionToken2Impl other = from((SessionToken2) obj);
- return mUid == other.mUid
- && TextUtils.equals(mPackageName, other.mPackageName)
- && TextUtils.equals(mServiceName, other.mServiceName)
- && TextUtils.equals(mId, other.mId)
- && mType == other.mType;
- }
-
- @Override
- public String toString_impl() {
- return "SessionToken {pkg=" + mPackageName + " id=" + mId + " type=" + mType
- + " service=" + mServiceName + " binder=" + mSessionBinder + "}";
- }
-
- static SessionToken2Impl from(SessionToken2 token) {
- return ((SessionToken2Impl) token.getProvider());
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/VolumeProvider2Impl.java b/packages/MediaComponents/src/com/android/media/VolumeProvider2Impl.java
deleted file mode 100644
index bf22e1b..0000000
--- a/packages/MediaComponents/src/com/android/media/VolumeProvider2Impl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.media;
-
-import static android.media.VolumeProvider2.VOLUME_CONTROL_ABSOLUTE;
-import static android.media.VolumeProvider2.VOLUME_CONTROL_FIXED;
-import static android.media.VolumeProvider2.VOLUME_CONTROL_RELATIVE;
-
-import android.media.VolumeProvider2;
-import android.media.update.VolumeProvider2Provider;
-
-public class VolumeProvider2Impl implements VolumeProvider2Provider {
- private final VolumeProvider2 mInstance;
- private final int mControlType;
- private final int mMaxVolume;
-
- private int mCurrentVolume;
- private Callback mCallback;
-
- public VolumeProvider2Impl(VolumeProvider2 instance,
- @VolumeProvider2.ControlType int controlType, int maxVolume, int currentVolume) {
- if (controlType != VOLUME_CONTROL_FIXED && controlType != VOLUME_CONTROL_RELATIVE
- && controlType != VOLUME_CONTROL_ABSOLUTE) {
- throw new IllegalArgumentException("wrong controlType " + controlType);
- }
- if (maxVolume < 0 || currentVolume < 0) {
- throw new IllegalArgumentException("volume shouldn't be negative"
- + ", maxVolume=" + maxVolume + ", currentVolume=" + currentVolume);
- }
- if (currentVolume > maxVolume) {
- throw new IllegalArgumentException("currentVolume shouldn't be greater than maxVolume"
- + ", maxVolume=" + maxVolume + ", currentVolume=" + currentVolume);
- }
- mInstance = instance;
- mControlType = controlType;
- mMaxVolume = maxVolume;
- mCurrentVolume = currentVolume;
- }
-
- @Override
- public int getControlType_impl() {
- return mControlType;
- }
-
- @Override
- public int getMaxVolume_impl() {
- return mMaxVolume;
- }
-
- @Override
- public int getCurrentVolume_impl() {
- return mCurrentVolume;
- }
-
- @Override
- public void setCurrentVolume_impl(int currentVolume) {
- if (currentVolume < 0) {
- throw new IllegalArgumentException("currentVolume shouldn't be negative"
- + ", currentVolume=" + currentVolume);
- }
- mCurrentVolume = currentVolume;
- if (mCallback != null) {
- mCallback.onVolumeChanged(mInstance);
- }
- }
-
- /**
- * Sets a callback to receive volume changes.
- */
- public void setCallback(Callback callback) {
- mCallback = callback;
- }
-
- /**
- * Listens for changes to the volume.
- */
- public static abstract class Callback {
- public abstract void onVolumeChanged(VolumeProvider2 volumeProvider);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/subtitle/ClosedCaptionRenderer.java b/packages/MediaComponents/src/com/android/media/subtitle/ClosedCaptionRenderer.java
deleted file mode 100644
index ff7eec9..0000000
--- a/packages/MediaComponents/src/com/android/media/subtitle/ClosedCaptionRenderer.java
+++ /dev/null
@@ -1,1501 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media.subtitle;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.media.MediaFormat;
-import android.text.Spannable;
-import android.text.SpannableStringBuilder;
-import android.text.TextPaint;
-import android.text.style.CharacterStyle;
-import android.text.style.StyleSpan;
-import android.text.style.UnderlineSpan;
-import android.text.style.UpdateAppearance;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.CaptioningManager;
-import android.view.accessibility.CaptioningManager.CaptionStyle;
-import android.view.accessibility.CaptioningManager.CaptioningChangeListener;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Vector;
-
-// Note: This is forked from android.media.ClosedCaptionRenderer since P
-public class ClosedCaptionRenderer extends SubtitleController.Renderer {
- private final Context mContext;
- private Cea608CCWidget mCCWidget;
-
- public ClosedCaptionRenderer(Context context) {
- mContext = context;
- }
-
- @Override
- public boolean supports(MediaFormat format) {
- if (format.containsKey(MediaFormat.KEY_MIME)) {
- String mimeType = format.getString(MediaFormat.KEY_MIME);
- return MediaFormat.MIMETYPE_TEXT_CEA_608.equals(mimeType);
- }
- return false;
- }
-
- @Override
- public SubtitleTrack createTrack(MediaFormat format) {
- String mimeType = format.getString(MediaFormat.KEY_MIME);
- if (MediaFormat.MIMETYPE_TEXT_CEA_608.equals(mimeType)) {
- if (mCCWidget == null) {
- mCCWidget = new Cea608CCWidget(mContext);
- }
- return new Cea608CaptionTrack(mCCWidget, format);
- }
- throw new RuntimeException("No matching format: " + format.toString());
- }
-}
-
-class Cea608CaptionTrack extends SubtitleTrack {
- private final Cea608CCParser mCCParser;
- private final Cea608CCWidget mRenderingWidget;
-
- Cea608CaptionTrack(Cea608CCWidget renderingWidget, MediaFormat format) {
- super(format);
-
- mRenderingWidget = renderingWidget;
- mCCParser = new Cea608CCParser(mRenderingWidget);
- }
-
- @Override
- public void onData(byte[] data, boolean eos, long runID) {
- mCCParser.parse(data);
- }
-
- @Override
- public RenderingWidget getRenderingWidget() {
- return mRenderingWidget;
- }
-
- @Override
- public void updateView(Vector<Cue> activeCues) {
- // Overriding with NO-OP, CC rendering by-passes this
- }
-}
-
-/**
- * Abstract widget class to render a closed caption track.
- */
-abstract class ClosedCaptionWidget extends ViewGroup implements SubtitleTrack.RenderingWidget {
-
- interface ClosedCaptionLayout {
- void setCaptionStyle(CaptionStyle captionStyle);
- void setFontScale(float scale);
- }
-
- private static final CaptionStyle DEFAULT_CAPTION_STYLE = CaptionStyle.DEFAULT;
-
- /** Captioning manager, used to obtain and track caption properties. */
- private final CaptioningManager mManager;
-
- /** Current caption style. */
- protected CaptionStyle mCaptionStyle;
-
- /** Callback for rendering changes. */
- protected OnChangedListener mListener;
-
- /** Concrete layout of CC. */
- protected ClosedCaptionLayout mClosedCaptionLayout;
-
- /** Whether a caption style change listener is registered. */
- private boolean mHasChangeListener;
-
- public ClosedCaptionWidget(Context context) {
- this(context, null);
- }
-
- public ClosedCaptionWidget(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public ClosedCaptionWidget(Context context, AttributeSet attrs, int defStyle) {
- this(context, attrs, defStyle, 0);
- }
-
- public ClosedCaptionWidget(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
-
- // Cannot render text over video when layer type is hardware.
- setLayerType(View.LAYER_TYPE_SOFTWARE, null);
-
- mManager = (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);
- mCaptionStyle = DEFAULT_CAPTION_STYLE.applyStyle(mManager.getUserStyle());
-
- mClosedCaptionLayout = createCaptionLayout(context);
- mClosedCaptionLayout.setCaptionStyle(mCaptionStyle);
- mClosedCaptionLayout.setFontScale(mManager.getFontScale());
- addView((ViewGroup) mClosedCaptionLayout, LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT);
-
- requestLayout();
- }
-
- public abstract ClosedCaptionLayout createCaptionLayout(Context context);
-
- @Override
- public void setOnChangedListener(OnChangedListener listener) {
- mListener = listener;
- }
-
- @Override
- public void setSize(int width, int height) {
- final int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
- final int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
-
- measure(widthSpec, heightSpec);
- layout(0, 0, width, height);
- }
-
- @Override
- public void setVisible(boolean visible) {
- if (visible) {
- setVisibility(View.VISIBLE);
- } else {
- setVisibility(View.GONE);
- }
-
- manageChangeListener();
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- manageChangeListener();
- }
-
- @Override
- public void onDetachedFromWindow() {
- super.onDetachedFromWindow();
-
- manageChangeListener();
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- ((ViewGroup) mClosedCaptionLayout).measure(widthMeasureSpec, heightMeasureSpec);
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- ((ViewGroup) mClosedCaptionLayout).layout(l, t, r, b);
- }
-
- /**
- * Manages whether this renderer is listening for caption style changes.
- */
- private final CaptioningChangeListener mCaptioningListener = new CaptioningChangeListener() {
- @Override
- public void onUserStyleChanged(CaptionStyle userStyle) {
- mCaptionStyle = DEFAULT_CAPTION_STYLE.applyStyle(userStyle);
- mClosedCaptionLayout.setCaptionStyle(mCaptionStyle);
- }
-
- @Override
- public void onFontScaleChanged(float fontScale) {
- mClosedCaptionLayout.setFontScale(fontScale);
- }
- };
-
- private void manageChangeListener() {
- final boolean needsListener = isAttachedToWindow() && getVisibility() == View.VISIBLE;
- if (mHasChangeListener != needsListener) {
- mHasChangeListener = needsListener;
-
- if (needsListener) {
- mManager.addCaptioningChangeListener(mCaptioningListener);
- } else {
- mManager.removeCaptioningChangeListener(mCaptioningListener);
- }
- }
- }
-}
-
-/**
- * CCParser processes CEA-608 closed caption data.
- *
- * It calls back into OnDisplayChangedListener upon
- * display change with styled text for rendering.
- *
- */
-class Cea608CCParser {
- public static final int MAX_ROWS = 15;
- public static final int MAX_COLS = 32;
-
- private static final String TAG = "Cea608CCParser";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private static final int INVALID = -1;
-
- // EIA-CEA-608: Table 70 - Control Codes
- private static final int RCL = 0x20;
- private static final int BS = 0x21;
- private static final int AOF = 0x22;
- private static final int AON = 0x23;
- private static final int DER = 0x24;
- private static final int RU2 = 0x25;
- private static final int RU3 = 0x26;
- private static final int RU4 = 0x27;
- private static final int FON = 0x28;
- private static final int RDC = 0x29;
- private static final int TR = 0x2a;
- private static final int RTD = 0x2b;
- private static final int EDM = 0x2c;
- private static final int CR = 0x2d;
- private static final int ENM = 0x2e;
- private static final int EOC = 0x2f;
-
- // Transparent Space
- private static final char TS = '\u00A0';
-
- // Captioning Modes
- private static final int MODE_UNKNOWN = 0;
- private static final int MODE_PAINT_ON = 1;
- private static final int MODE_ROLL_UP = 2;
- private static final int MODE_POP_ON = 3;
- private static final int MODE_TEXT = 4;
-
- private final DisplayListener mListener;
-
- private int mMode = MODE_PAINT_ON;
- private int mRollUpSize = 4;
- private int mPrevCtrlCode = INVALID;
-
- private CCMemory mDisplay = new CCMemory();
- private CCMemory mNonDisplay = new CCMemory();
- private CCMemory mTextMem = new CCMemory();
-
- Cea608CCParser(DisplayListener listener) {
- mListener = listener;
- }
-
- public void parse(byte[] data) {
- CCData[] ccData = CCData.fromByteArray(data);
-
- for (int i = 0; i < ccData.length; i++) {
- if (DEBUG) {
- Log.d(TAG, ccData[i].toString());
- }
-
- if (handleCtrlCode(ccData[i])
- || handleTabOffsets(ccData[i])
- || handlePACCode(ccData[i])
- || handleMidRowCode(ccData[i])) {
- continue;
- }
-
- handleDisplayableChars(ccData[i]);
- }
- }
-
- interface DisplayListener {
- void onDisplayChanged(SpannableStringBuilder[] styledTexts);
- CaptionStyle getCaptionStyle();
- }
-
- private CCMemory getMemory() {
- // get the CC memory to operate on for current mode
- switch (mMode) {
- case MODE_POP_ON:
- return mNonDisplay;
- case MODE_TEXT:
- // TODO(chz): support only caption mode for now,
- // in text mode, dump everything to text mem.
- return mTextMem;
- case MODE_PAINT_ON:
- case MODE_ROLL_UP:
- return mDisplay;
- default:
- Log.w(TAG, "unrecoginized mode: " + mMode);
- }
- return mDisplay;
- }
-
- private boolean handleDisplayableChars(CCData ccData) {
- if (!ccData.isDisplayableChar()) {
- return false;
- }
-
- // Extended char includes 1 automatic backspace
- if (ccData.isExtendedChar()) {
- getMemory().bs();
- }
-
- getMemory().writeText(ccData.getDisplayText());
-
- if (mMode == MODE_PAINT_ON || mMode == MODE_ROLL_UP) {
- updateDisplay();
- }
-
- return true;
- }
-
- private boolean handleMidRowCode(CCData ccData) {
- StyleCode m = ccData.getMidRow();
- if (m != null) {
- getMemory().writeMidRowCode(m);
- return true;
- }
- return false;
- }
-
- private boolean handlePACCode(CCData ccData) {
- PAC pac = ccData.getPAC();
-
- if (pac != null) {
- if (mMode == MODE_ROLL_UP) {
- getMemory().moveBaselineTo(pac.getRow(), mRollUpSize);
- }
- getMemory().writePAC(pac);
- return true;
- }
-
- return false;
- }
-
- private boolean handleTabOffsets(CCData ccData) {
- int tabs = ccData.getTabOffset();
-
- if (tabs > 0) {
- getMemory().tab(tabs);
- return true;
- }
-
- return false;
- }
-
- private boolean handleCtrlCode(CCData ccData) {
- int ctrlCode = ccData.getCtrlCode();
-
- if (mPrevCtrlCode != INVALID && mPrevCtrlCode == ctrlCode) {
- // discard double ctrl codes (but if there's a 3rd one, we still take that)
- mPrevCtrlCode = INVALID;
- return true;
- }
-
- switch(ctrlCode) {
- case RCL:
- // select pop-on style
- mMode = MODE_POP_ON;
- break;
- case BS:
- getMemory().bs();
- break;
- case DER:
- getMemory().der();
- break;
- case RU2:
- case RU3:
- case RU4:
- mRollUpSize = (ctrlCode - 0x23);
- // erase memory if currently in other style
- if (mMode != MODE_ROLL_UP) {
- mDisplay.erase();
- mNonDisplay.erase();
- }
- // select roll-up style
- mMode = MODE_ROLL_UP;
- break;
- case FON:
- Log.i(TAG, "Flash On");
- break;
- case RDC:
- // select paint-on style
- mMode = MODE_PAINT_ON;
- break;
- case TR:
- mMode = MODE_TEXT;
- mTextMem.erase();
- break;
- case RTD:
- mMode = MODE_TEXT;
- break;
- case EDM:
- // erase display memory
- mDisplay.erase();
- updateDisplay();
- break;
- case CR:
- if (mMode == MODE_ROLL_UP) {
- getMemory().rollUp(mRollUpSize);
- } else {
- getMemory().cr();
- }
- if (mMode == MODE_ROLL_UP) {
- updateDisplay();
- }
- break;
- case ENM:
- // erase non-display memory
- mNonDisplay.erase();
- break;
- case EOC:
- // swap display/non-display memory
- swapMemory();
- // switch to pop-on style
- mMode = MODE_POP_ON;
- updateDisplay();
- break;
- case INVALID:
- default:
- mPrevCtrlCode = INVALID;
- return false;
- }
-
- mPrevCtrlCode = ctrlCode;
-
- // handled
- return true;
- }
-
- private void updateDisplay() {
- if (mListener != null) {
- CaptionStyle captionStyle = mListener.getCaptionStyle();
- mListener.onDisplayChanged(mDisplay.getStyledText(captionStyle));
- }
- }
-
- private void swapMemory() {
- CCMemory temp = mDisplay;
- mDisplay = mNonDisplay;
- mNonDisplay = temp;
- }
-
- private static class StyleCode {
- static final int COLOR_WHITE = 0;
- static final int COLOR_GREEN = 1;
- static final int COLOR_BLUE = 2;
- static final int COLOR_CYAN = 3;
- static final int COLOR_RED = 4;
- static final int COLOR_YELLOW = 5;
- static final int COLOR_MAGENTA = 6;
- static final int COLOR_INVALID = 7;
-
- static final int STYLE_ITALICS = 0x00000001;
- static final int STYLE_UNDERLINE = 0x00000002;
-
- static final String[] mColorMap = {
- "WHITE", "GREEN", "BLUE", "CYAN", "RED", "YELLOW", "MAGENTA", "INVALID"
- };
-
- final int mStyle;
- final int mColor;
-
- static StyleCode fromByte(byte data2) {
- int style = 0;
- int color = (data2 >> 1) & 0x7;
-
- if ((data2 & 0x1) != 0) {
- style |= STYLE_UNDERLINE;
- }
-
- if (color == COLOR_INVALID) {
- // WHITE ITALICS
- color = COLOR_WHITE;
- style |= STYLE_ITALICS;
- }
-
- return new StyleCode(style, color);
- }
-
- StyleCode(int style, int color) {
- mStyle = style;
- mColor = color;
- }
-
- boolean isItalics() {
- return (mStyle & STYLE_ITALICS) != 0;
- }
-
- boolean isUnderline() {
- return (mStyle & STYLE_UNDERLINE) != 0;
- }
-
- int getColor() {
- return mColor;
- }
-
- @Override
- public String toString() {
- StringBuilder str = new StringBuilder();
- str.append("{");
- str.append(mColorMap[mColor]);
- if ((mStyle & STYLE_ITALICS) != 0) {
- str.append(", ITALICS");
- }
- if ((mStyle & STYLE_UNDERLINE) != 0) {
- str.append(", UNDERLINE");
- }
- str.append("}");
-
- return str.toString();
- }
- }
-
- private static class PAC extends StyleCode {
- final int mRow;
- final int mCol;
-
- static PAC fromBytes(byte data1, byte data2) {
- int[] rowTable = {11, 1, 3, 12, 14, 5, 7, 9};
- int row = rowTable[data1 & 0x07] + ((data2 & 0x20) >> 5);
- int style = 0;
- if ((data2 & 1) != 0) {
- style |= STYLE_UNDERLINE;
- }
- if ((data2 & 0x10) != 0) {
- // indent code
- int indent = (data2 >> 1) & 0x7;
- return new PAC(row, indent * 4, style, COLOR_WHITE);
- } else {
- // style code
- int color = (data2 >> 1) & 0x7;
-
- if (color == COLOR_INVALID) {
- // WHITE ITALICS
- color = COLOR_WHITE;
- style |= STYLE_ITALICS;
- }
- return new PAC(row, -1, style, color);
- }
- }
-
- PAC(int row, int col, int style, int color) {
- super(style, color);
- mRow = row;
- mCol = col;
- }
-
- boolean isIndentPAC() {
- return (mCol >= 0);
- }
-
- int getRow() {
- return mRow;
- }
-
- int getCol() {
- return mCol;
- }
-
- @Override
- public String toString() {
- return String.format("{%d, %d}, %s",
- mRow, mCol, super.toString());
- }
- }
-
- /**
- * Mutable version of BackgroundSpan to facilitate text rendering with edge styles.
- */
- public static class MutableBackgroundColorSpan extends CharacterStyle
- implements UpdateAppearance {
- private int mColor;
-
- public MutableBackgroundColorSpan(int color) {
- mColor = color;
- }
-
- public void setBackgroundColor(int color) {
- mColor = color;
- }
-
- public int getBackgroundColor() {
- return mColor;
- }
-
- @Override
- public void updateDrawState(TextPaint ds) {
- ds.bgColor = mColor;
- }
- }
-
- /* CCLineBuilder keeps track of displayable chars, as well as
- * MidRow styles and PACs, for a single line of CC memory.
- *
- * It generates styled text via getStyledText() method.
- */
- private static class CCLineBuilder {
- private final StringBuilder mDisplayChars;
- private final StyleCode[] mMidRowStyles;
- private final StyleCode[] mPACStyles;
-
- CCLineBuilder(String str) {
- mDisplayChars = new StringBuilder(str);
- mMidRowStyles = new StyleCode[mDisplayChars.length()];
- mPACStyles = new StyleCode[mDisplayChars.length()];
- }
-
- void setCharAt(int index, char ch) {
- mDisplayChars.setCharAt(index, ch);
- mMidRowStyles[index] = null;
- }
-
- void setMidRowAt(int index, StyleCode m) {
- mDisplayChars.setCharAt(index, ' ');
- mMidRowStyles[index] = m;
- }
-
- void setPACAt(int index, PAC pac) {
- mPACStyles[index] = pac;
- }
-
- char charAt(int index) {
- return mDisplayChars.charAt(index);
- }
-
- int length() {
- return mDisplayChars.length();
- }
-
- void applyStyleSpan(
- SpannableStringBuilder styledText,
- StyleCode s, int start, int end) {
- if (s.isItalics()) {
- styledText.setSpan(
- new StyleSpan(android.graphics.Typeface.ITALIC),
- start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- if (s.isUnderline()) {
- styledText.setSpan(
- new UnderlineSpan(),
- start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- }
-
- SpannableStringBuilder getStyledText(CaptionStyle captionStyle) {
- SpannableStringBuilder styledText = new SpannableStringBuilder(mDisplayChars);
- int start = -1, next = 0;
- int styleStart = -1;
- StyleCode curStyle = null;
- while (next < mDisplayChars.length()) {
- StyleCode newStyle = null;
- if (mMidRowStyles[next] != null) {
- // apply mid-row style change
- newStyle = mMidRowStyles[next];
- } else if (mPACStyles[next] != null
- && (styleStart < 0 || start < 0)) {
- // apply PAC style change, only if:
- // 1. no style set, or
- // 2. style set, but prev char is none-displayable
- newStyle = mPACStyles[next];
- }
- if (newStyle != null) {
- curStyle = newStyle;
- if (styleStart >= 0 && start >= 0) {
- applyStyleSpan(styledText, newStyle, styleStart, next);
- }
- styleStart = next;
- }
-
- if (mDisplayChars.charAt(next) != TS) {
- if (start < 0) {
- start = next;
- }
- } else if (start >= 0) {
- int expandedStart = mDisplayChars.charAt(start) == ' ' ? start : start - 1;
- int expandedEnd = mDisplayChars.charAt(next - 1) == ' ' ? next : next + 1;
- styledText.setSpan(
- new MutableBackgroundColorSpan(captionStyle.backgroundColor),
- expandedStart, expandedEnd,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- if (styleStart >= 0) {
- applyStyleSpan(styledText, curStyle, styleStart, expandedEnd);
- }
- start = -1;
- }
- next++;
- }
-
- return styledText;
- }
- }
-
- /*
- * CCMemory models a console-style display.
- */
- private static class CCMemory {
- private final String mBlankLine;
- private final CCLineBuilder[] mLines = new CCLineBuilder[MAX_ROWS + 2];
- private int mRow;
- private int mCol;
-
- CCMemory() {
- char[] blank = new char[MAX_COLS + 2];
- Arrays.fill(blank, TS);
- mBlankLine = new String(blank);
- }
-
- void erase() {
- // erase all lines
- for (int i = 0; i < mLines.length; i++) {
- mLines[i] = null;
- }
- mRow = MAX_ROWS;
- mCol = 1;
- }
-
- void der() {
- if (mLines[mRow] != null) {
- for (int i = 0; i < mCol; i++) {
- if (mLines[mRow].charAt(i) != TS) {
- for (int j = mCol; j < mLines[mRow].length(); j++) {
- mLines[j].setCharAt(j, TS);
- }
- return;
- }
- }
- mLines[mRow] = null;
- }
- }
-
- void tab(int tabs) {
- moveCursorByCol(tabs);
- }
-
- void bs() {
- moveCursorByCol(-1);
- if (mLines[mRow] != null) {
- mLines[mRow].setCharAt(mCol, TS);
- if (mCol == MAX_COLS - 1) {
- // Spec recommendation:
- // if cursor was at col 32, move cursor
- // back to col 31 and erase both col 31&32
- mLines[mRow].setCharAt(MAX_COLS, TS);
- }
- }
- }
-
- void cr() {
- moveCursorTo(mRow + 1, 1);
- }
-
- void rollUp(int windowSize) {
- int i;
- for (i = 0; i <= mRow - windowSize; i++) {
- mLines[i] = null;
- }
- int startRow = mRow - windowSize + 1;
- if (startRow < 1) {
- startRow = 1;
- }
- for (i = startRow; i < mRow; i++) {
- mLines[i] = mLines[i + 1];
- }
- for (i = mRow; i < mLines.length; i++) {
- // clear base row
- mLines[i] = null;
- }
- // default to col 1, in case PAC is not sent
- mCol = 1;
- }
-
- void writeText(String text) {
- for (int i = 0; i < text.length(); i++) {
- getLineBuffer(mRow).setCharAt(mCol, text.charAt(i));
- moveCursorByCol(1);
- }
- }
-
- void writeMidRowCode(StyleCode m) {
- getLineBuffer(mRow).setMidRowAt(mCol, m);
- moveCursorByCol(1);
- }
-
- void writePAC(PAC pac) {
- if (pac.isIndentPAC()) {
- moveCursorTo(pac.getRow(), pac.getCol());
- } else {
- moveCursorTo(pac.getRow(), 1);
- }
- getLineBuffer(mRow).setPACAt(mCol, pac);
- }
-
- SpannableStringBuilder[] getStyledText(CaptionStyle captionStyle) {
- ArrayList<SpannableStringBuilder> rows = new ArrayList<>(MAX_ROWS);
- for (int i = 1; i <= MAX_ROWS; i++) {
- rows.add(mLines[i] != null ?
- mLines[i].getStyledText(captionStyle) : null);
- }
- return rows.toArray(new SpannableStringBuilder[MAX_ROWS]);
- }
-
- private static int clamp(int x, int min, int max) {
- return x < min ? min : (x > max ? max : x);
- }
-
- private void moveCursorTo(int row, int col) {
- mRow = clamp(row, 1, MAX_ROWS);
- mCol = clamp(col, 1, MAX_COLS);
- }
-
- private void moveCursorToRow(int row) {
- mRow = clamp(row, 1, MAX_ROWS);
- }
-
- private void moveCursorByCol(int col) {
- mCol = clamp(mCol + col, 1, MAX_COLS);
- }
-
- private void moveBaselineTo(int baseRow, int windowSize) {
- if (mRow == baseRow) {
- return;
- }
- int actualWindowSize = windowSize;
- if (baseRow < actualWindowSize) {
- actualWindowSize = baseRow;
- }
- if (mRow < actualWindowSize) {
- actualWindowSize = mRow;
- }
-
- int i;
- if (baseRow < mRow) {
- // copy from bottom to top row
- for (i = actualWindowSize - 1; i >= 0; i--) {
- mLines[baseRow - i] = mLines[mRow - i];
- }
- } else {
- // copy from top to bottom row
- for (i = 0; i < actualWindowSize; i++) {
- mLines[baseRow - i] = mLines[mRow - i];
- }
- }
- // clear rest of the rows
- for (i = 0; i <= baseRow - windowSize; i++) {
- mLines[i] = null;
- }
- for (i = baseRow + 1; i < mLines.length; i++) {
- mLines[i] = null;
- }
- }
-
- private CCLineBuilder getLineBuffer(int row) {
- if (mLines[row] == null) {
- mLines[row] = new CCLineBuilder(mBlankLine);
- }
- return mLines[row];
- }
- }
-
- /*
- * CCData parses the raw CC byte pair into displayable chars,
- * misc control codes, Mid-Row or Preamble Address Codes.
- */
- private static class CCData {
- private final byte mType;
- private final byte mData1;
- private final byte mData2;
-
- private static final String[] mCtrlCodeMap = {
- "RCL", "BS" , "AOF", "AON",
- "DER", "RU2", "RU3", "RU4",
- "FON", "RDC", "TR" , "RTD",
- "EDM", "CR" , "ENM", "EOC",
- };
-
- private static final String[] mSpecialCharMap = {
- "\u00AE",
- "\u00B0",
- "\u00BD",
- "\u00BF",
- "\u2122",
- "\u00A2",
- "\u00A3",
- "\u266A", // Eighth note
- "\u00E0",
- "\u00A0", // Transparent space
- "\u00E8",
- "\u00E2",
- "\u00EA",
- "\u00EE",
- "\u00F4",
- "\u00FB",
- };
-
- private static final String[] mSpanishCharMap = {
- // Spanish and misc chars
- "\u00C1", // A
- "\u00C9", // E
- "\u00D3", // I
- "\u00DA", // O
- "\u00DC", // U
- "\u00FC", // u
- "\u2018", // opening single quote
- "\u00A1", // inverted exclamation mark
- "*",
- "'",
- "\u2014", // em dash
- "\u00A9", // Copyright
- "\u2120", // Servicemark
- "\u2022", // round bullet
- "\u201C", // opening double quote
- "\u201D", // closing double quote
- // French
- "\u00C0",
- "\u00C2",
- "\u00C7",
- "\u00C8",
- "\u00CA",
- "\u00CB",
- "\u00EB",
- "\u00CE",
- "\u00CF",
- "\u00EF",
- "\u00D4",
- "\u00D9",
- "\u00F9",
- "\u00DB",
- "\u00AB",
- "\u00BB"
- };
-
- private static final String[] mProtugueseCharMap = {
- // Portuguese
- "\u00C3",
- "\u00E3",
- "\u00CD",
- "\u00CC",
- "\u00EC",
- "\u00D2",
- "\u00F2",
- "\u00D5",
- "\u00F5",
- "{",
- "}",
- "\\",
- "^",
- "_",
- "|",
- "~",
- // German and misc chars
- "\u00C4",
- "\u00E4",
- "\u00D6",
- "\u00F6",
- "\u00DF",
- "\u00A5",
- "\u00A4",
- "\u2502", // vertical bar
- "\u00C5",
- "\u00E5",
- "\u00D8",
- "\u00F8",
- "\u250C", // top-left corner
- "\u2510", // top-right corner
- "\u2514", // lower-left corner
- "\u2518", // lower-right corner
- };
-
- static CCData[] fromByteArray(byte[] data) {
- CCData[] ccData = new CCData[data.length / 3];
-
- for (int i = 0; i < ccData.length; i++) {
- ccData[i] = new CCData(
- data[i * 3],
- data[i * 3 + 1],
- data[i * 3 + 2]);
- }
-
- return ccData;
- }
-
- CCData(byte type, byte data1, byte data2) {
- mType = type;
- mData1 = data1;
- mData2 = data2;
- }
-
- int getCtrlCode() {
- if ((mData1 == 0x14 || mData1 == 0x1c)
- && mData2 >= 0x20 && mData2 <= 0x2f) {
- return mData2;
- }
- return INVALID;
- }
-
- StyleCode getMidRow() {
- // only support standard Mid-row codes, ignore
- // optional background/foreground mid-row codes
- if ((mData1 == 0x11 || mData1 == 0x19)
- && mData2 >= 0x20 && mData2 <= 0x2f) {
- return StyleCode.fromByte(mData2);
- }
- return null;
- }
-
- PAC getPAC() {
- if ((mData1 & 0x70) == 0x10
- && (mData2 & 0x40) == 0x40
- && ((mData1 & 0x07) != 0 || (mData2 & 0x20) == 0)) {
- return PAC.fromBytes(mData1, mData2);
- }
- return null;
- }
-
- int getTabOffset() {
- if ((mData1 == 0x17 || mData1 == 0x1f)
- && mData2 >= 0x21 && mData2 <= 0x23) {
- return mData2 & 0x3;
- }
- return 0;
- }
-
- boolean isDisplayableChar() {
- return isBasicChar() || isSpecialChar() || isExtendedChar();
- }
-
- String getDisplayText() {
- String str = getBasicChars();
-
- if (str == null) {
- str = getSpecialChar();
-
- if (str == null) {
- str = getExtendedChar();
- }
- }
-
- return str;
- }
-
- private String ctrlCodeToString(int ctrlCode) {
- return mCtrlCodeMap[ctrlCode - 0x20];
- }
-
- private boolean isBasicChar() {
- return mData1 >= 0x20 && mData1 <= 0x7f;
- }
-
- private boolean isSpecialChar() {
- return ((mData1 == 0x11 || mData1 == 0x19)
- && mData2 >= 0x30 && mData2 <= 0x3f);
- }
-
- private boolean isExtendedChar() {
- return ((mData1 == 0x12 || mData1 == 0x1A
- || mData1 == 0x13 || mData1 == 0x1B)
- && mData2 >= 0x20 && mData2 <= 0x3f);
- }
-
- private char getBasicChar(byte data) {
- char c;
- // replace the non-ASCII ones
- switch (data) {
- case 0x2A: c = '\u00E1'; break;
- case 0x5C: c = '\u00E9'; break;
- case 0x5E: c = '\u00ED'; break;
- case 0x5F: c = '\u00F3'; break;
- case 0x60: c = '\u00FA'; break;
- case 0x7B: c = '\u00E7'; break;
- case 0x7C: c = '\u00F7'; break;
- case 0x7D: c = '\u00D1'; break;
- case 0x7E: c = '\u00F1'; break;
- case 0x7F: c = '\u2588'; break; // Full block
- default: c = (char) data; break;
- }
- return c;
- }
-
- private String getBasicChars() {
- if (mData1 >= 0x20 && mData1 <= 0x7f) {
- StringBuilder builder = new StringBuilder(2);
- builder.append(getBasicChar(mData1));
- if (mData2 >= 0x20 && mData2 <= 0x7f) {
- builder.append(getBasicChar(mData2));
- }
- return builder.toString();
- }
-
- return null;
- }
-
- private String getSpecialChar() {
- if ((mData1 == 0x11 || mData1 == 0x19)
- && mData2 >= 0x30 && mData2 <= 0x3f) {
- return mSpecialCharMap[mData2 - 0x30];
- }
-
- return null;
- }
-
- private String getExtendedChar() {
- if ((mData1 == 0x12 || mData1 == 0x1A)
- && mData2 >= 0x20 && mData2 <= 0x3f){
- // 1 Spanish/French char
- return mSpanishCharMap[mData2 - 0x20];
- } else if ((mData1 == 0x13 || mData1 == 0x1B)
- && mData2 >= 0x20 && mData2 <= 0x3f){
- // 1 Portuguese/German/Danish char
- return mProtugueseCharMap[mData2 - 0x20];
- }
-
- return null;
- }
-
- @Override
- public String toString() {
- String str;
-
- if (mData1 < 0x10 && mData2 < 0x10) {
- // Null Pad, ignore
- return String.format("[%d]Null: %02x %02x", mType, mData1, mData2);
- }
-
- int ctrlCode = getCtrlCode();
- if (ctrlCode != INVALID) {
- return String.format("[%d]%s", mType, ctrlCodeToString(ctrlCode));
- }
-
- int tabOffset = getTabOffset();
- if (tabOffset > 0) {
- return String.format("[%d]Tab%d", mType, tabOffset);
- }
-
- PAC pac = getPAC();
- if (pac != null) {
- return String.format("[%d]PAC: %s", mType, pac.toString());
- }
-
- StyleCode m = getMidRow();
- if (m != null) {
- return String.format("[%d]Mid-row: %s", mType, m.toString());
- }
-
- if (isDisplayableChar()) {
- return String.format("[%d]Displayable: %s (%02x %02x)",
- mType, getDisplayText(), mData1, mData2);
- }
-
- return String.format("[%d]Invalid: %02x %02x", mType, mData1, mData2);
- }
- }
-}
-
-/**
- * Widget capable of rendering CEA-608 closed captions.
- */
-class Cea608CCWidget extends ClosedCaptionWidget implements Cea608CCParser.DisplayListener {
- private static final Rect mTextBounds = new Rect();
- private static final String mDummyText = "1234567890123456789012345678901234";
-
- public Cea608CCWidget(Context context) {
- this(context, null);
- }
-
- public Cea608CCWidget(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public Cea608CCWidget(Context context, AttributeSet attrs, int defStyle) {
- this(context, attrs, defStyle, 0);
- }
-
- public Cea608CCWidget(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- public ClosedCaptionLayout createCaptionLayout(Context context) {
- return new CCLayout(context);
- }
-
- @Override
- public void onDisplayChanged(SpannableStringBuilder[] styledTexts) {
- ((CCLayout) mClosedCaptionLayout).update(styledTexts);
-
- if (mListener != null) {
- mListener.onChanged(this);
- }
- }
-
- @Override
- public CaptionStyle getCaptionStyle() {
- return mCaptionStyle;
- }
-
- private static class CCLineBox extends TextView {
- private static final float FONT_PADDING_RATIO = 0.75f;
- private static final float EDGE_OUTLINE_RATIO = 0.1f;
- private static final float EDGE_SHADOW_RATIO = 0.05f;
- private float mOutlineWidth;
- private float mShadowRadius;
- private float mShadowOffset;
-
- private int mTextColor = Color.WHITE;
- private int mBgColor = Color.BLACK;
- private int mEdgeType = CaptionStyle.EDGE_TYPE_NONE;
- private int mEdgeColor = Color.TRANSPARENT;
-
- CCLineBox(Context context) {
- super(context);
- setGravity(Gravity.CENTER);
- setBackgroundColor(Color.TRANSPARENT);
- setTextColor(Color.WHITE);
- setTypeface(Typeface.MONOSPACE);
- setVisibility(View.INVISIBLE);
-
- final Resources res = getContext().getResources();
-
- // get the default (will be updated later during measure)
- mOutlineWidth = res.getDimensionPixelSize(
- com.android.internal.R.dimen.subtitle_outline_width);
- mShadowRadius = res.getDimensionPixelSize(
- com.android.internal.R.dimen.subtitle_shadow_radius);
- mShadowOffset = res.getDimensionPixelSize(
- com.android.internal.R.dimen.subtitle_shadow_offset);
- }
-
- void setCaptionStyle(CaptionStyle captionStyle) {
- mTextColor = captionStyle.foregroundColor;
- mBgColor = captionStyle.backgroundColor;
- mEdgeType = captionStyle.edgeType;
- mEdgeColor = captionStyle.edgeColor;
-
- setTextColor(mTextColor);
- if (mEdgeType == CaptionStyle.EDGE_TYPE_DROP_SHADOW) {
- setShadowLayer(mShadowRadius, mShadowOffset, mShadowOffset, mEdgeColor);
- } else {
- setShadowLayer(0, 0, 0, 0);
- }
- invalidate();
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- float fontSize = MeasureSpec.getSize(heightMeasureSpec) * FONT_PADDING_RATIO;
- setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);
-
- mOutlineWidth = EDGE_OUTLINE_RATIO * fontSize + 1.0f;
- mShadowRadius = EDGE_SHADOW_RATIO * fontSize + 1.0f;;
- mShadowOffset = mShadowRadius;
-
- // set font scale in the X direction to match the required width
- setScaleX(1.0f);
- getPaint().getTextBounds(mDummyText, 0, mDummyText.length(), mTextBounds);
- float actualTextWidth = mTextBounds.width();
- float requiredTextWidth = MeasureSpec.getSize(widthMeasureSpec);
- setScaleX(requiredTextWidth / actualTextWidth);
-
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
-
- @Override
- protected void onDraw(Canvas c) {
- if (mEdgeType == CaptionStyle.EDGE_TYPE_UNSPECIFIED
- || mEdgeType == CaptionStyle.EDGE_TYPE_NONE
- || mEdgeType == CaptionStyle.EDGE_TYPE_DROP_SHADOW) {
- // these edge styles don't require a second pass
- super.onDraw(c);
- return;
- }
-
- if (mEdgeType == CaptionStyle.EDGE_TYPE_OUTLINE) {
- drawEdgeOutline(c);
- } else {
- // Raised or depressed
- drawEdgeRaisedOrDepressed(c);
- }
- }
-
- private void drawEdgeOutline(Canvas c) {
- TextPaint textPaint = getPaint();
-
- Paint.Style previousStyle = textPaint.getStyle();
- Paint.Join previousJoin = textPaint.getStrokeJoin();
- float previousWidth = textPaint.getStrokeWidth();
-
- setTextColor(mEdgeColor);
- textPaint.setStyle(Paint.Style.FILL_AND_STROKE);
- textPaint.setStrokeJoin(Paint.Join.ROUND);
- textPaint.setStrokeWidth(mOutlineWidth);
-
- // Draw outline and background only.
- super.onDraw(c);
-
- // Restore original settings.
- setTextColor(mTextColor);
- textPaint.setStyle(previousStyle);
- textPaint.setStrokeJoin(previousJoin);
- textPaint.setStrokeWidth(previousWidth);
-
- // Remove the background.
- setBackgroundSpans(Color.TRANSPARENT);
- // Draw foreground only.
- super.onDraw(c);
- // Restore the background.
- setBackgroundSpans(mBgColor);
- }
-
- private void drawEdgeRaisedOrDepressed(Canvas c) {
- TextPaint textPaint = getPaint();
-
- Paint.Style previousStyle = textPaint.getStyle();
- textPaint.setStyle(Paint.Style.FILL);
-
- final boolean raised = mEdgeType == CaptionStyle.EDGE_TYPE_RAISED;
- final int colorUp = raised ? Color.WHITE : mEdgeColor;
- final int colorDown = raised ? mEdgeColor : Color.WHITE;
- final float offset = mShadowRadius / 2f;
-
- // Draw background and text with shadow up
- setShadowLayer(mShadowRadius, -offset, -offset, colorUp);
- super.onDraw(c);
-
- // Remove the background.
- setBackgroundSpans(Color.TRANSPARENT);
-
- // Draw text with shadow down
- setShadowLayer(mShadowRadius, +offset, +offset, colorDown);
- super.onDraw(c);
-
- // Restore settings
- textPaint.setStyle(previousStyle);
-
- // Restore the background.
- setBackgroundSpans(mBgColor);
- }
-
- private void setBackgroundSpans(int color) {
- CharSequence text = getText();
- if (text instanceof Spannable) {
- Spannable spannable = (Spannable) text;
- Cea608CCParser.MutableBackgroundColorSpan[] bgSpans = spannable.getSpans(
- 0, spannable.length(), Cea608CCParser.MutableBackgroundColorSpan.class);
- for (int i = 0; i < bgSpans.length; i++) {
- bgSpans[i].setBackgroundColor(color);
- }
- }
- }
- }
-
- private static class CCLayout extends LinearLayout implements ClosedCaptionLayout {
- private static final int MAX_ROWS = Cea608CCParser.MAX_ROWS;
- private static final float SAFE_AREA_RATIO = 0.9f;
-
- private final CCLineBox[] mLineBoxes = new CCLineBox[MAX_ROWS];
-
- CCLayout(Context context) {
- super(context);
- setGravity(Gravity.START);
- setOrientation(LinearLayout.VERTICAL);
- for (int i = 0; i < MAX_ROWS; i++) {
- mLineBoxes[i] = new CCLineBox(getContext());
- addView(mLineBoxes[i], LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- }
- }
-
- @Override
- public void setCaptionStyle(CaptionStyle captionStyle) {
- for (int i = 0; i < MAX_ROWS; i++) {
- mLineBoxes[i].setCaptionStyle(captionStyle);
- }
- }
-
- @Override
- public void setFontScale(float fontScale) {
- // Ignores the font scale changes of the system wide CC preference.
- }
-
- void update(SpannableStringBuilder[] textBuffer) {
- for (int i = 0; i < MAX_ROWS; i++) {
- if (textBuffer[i] != null) {
- mLineBoxes[i].setText(textBuffer[i], TextView.BufferType.SPANNABLE);
- mLineBoxes[i].setVisibility(View.VISIBLE);
- } else {
- mLineBoxes[i].setVisibility(View.INVISIBLE);
- }
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- int safeWidth = getMeasuredWidth();
- int safeHeight = getMeasuredHeight();
-
- // CEA-608 assumes 4:3 video
- if (safeWidth * 3 >= safeHeight * 4) {
- safeWidth = safeHeight * 4 / 3;
- } else {
- safeHeight = safeWidth * 3 / 4;
- }
- safeWidth *= SAFE_AREA_RATIO;
- safeHeight *= SAFE_AREA_RATIO;
-
- int lineHeight = safeHeight / MAX_ROWS;
- int lineHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
- lineHeight, MeasureSpec.EXACTLY);
- int lineWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
- safeWidth, MeasureSpec.EXACTLY);
-
- for (int i = 0; i < MAX_ROWS; i++) {
- mLineBoxes[i].measure(lineWidthMeasureSpec, lineHeightMeasureSpec);
- }
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- // safe caption area
- int viewPortWidth = r - l;
- int viewPortHeight = b - t;
- int safeWidth, safeHeight;
- // CEA-608 assumes 4:3 video
- if (viewPortWidth * 3 >= viewPortHeight * 4) {
- safeWidth = viewPortHeight * 4 / 3;
- safeHeight = viewPortHeight;
- } else {
- safeWidth = viewPortWidth;
- safeHeight = viewPortWidth * 3 / 4;
- }
- safeWidth *= SAFE_AREA_RATIO;
- safeHeight *= SAFE_AREA_RATIO;
- int left = (viewPortWidth - safeWidth) / 2;
- int top = (viewPortHeight - safeHeight) / 2;
-
- for (int i = 0; i < MAX_ROWS; i++) {
- mLineBoxes[i].layout(
- left,
- top + safeHeight * i / MAX_ROWS,
- left + safeWidth,
- top + safeHeight * (i + 1) / MAX_ROWS);
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/subtitle/MediaTimeProvider.java b/packages/MediaComponents/src/com/android/media/subtitle/MediaTimeProvider.java
deleted file mode 100644
index af36d7f..0000000
--- a/packages/MediaComponents/src/com/android/media/subtitle/MediaTimeProvider.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media.subtitle;
-
-// Note: This is just copied from android.media.MediaTimeProvider.
-public interface MediaTimeProvider {
- // we do not allow negative media time
- /**
- * Presentation time value if no timed event notification is requested.
- */
- public final static long NO_TIME = -1;
-
- /**
- * Cancels all previous notification request from this listener if any. It
- * registers the listener to get seek and stop notifications. If timeUs is
- * not negative, it also registers the listener for a timed event
- * notification when the presentation time reaches (becomes greater) than
- * the value specified. This happens immediately if the current media time
- * is larger than or equal to timeUs.
- *
- * @param timeUs presentation time to get timed event callback at (or
- * {@link #NO_TIME})
- */
- public void notifyAt(long timeUs, OnMediaTimeListener listener);
-
- /**
- * Cancels all previous notification request from this listener if any. It
- * registers the listener to get seek and stop notifications. If the media
- * is stopped, the listener will immediately receive a stop notification.
- * Otherwise, it will receive a timed event notificaton.
- */
- public void scheduleUpdate(OnMediaTimeListener listener);
-
- /**
- * Cancels all previous notification request from this listener if any.
- */
- public void cancelNotifications(OnMediaTimeListener listener);
-
- /**
- * Get the current presentation time.
- *
- * @param precise Whether getting a precise time is important. This is
- * more costly.
- * @param monotonic Whether returned time should be monotonic: that is,
- * greater than or equal to the last returned time. Don't
- * always set this to true. E.g. this has undesired
- * consequences if the media is seeked between calls.
- * @throws IllegalStateException if the media is not initialized
- */
- public long getCurrentTimeUs(boolean precise, boolean monotonic)
- throws IllegalStateException;
-
- public static interface OnMediaTimeListener {
- /**
- * Called when the registered time was reached naturally.
- *
- * @param timeUs current media time
- */
- void onTimedEvent(long timeUs);
-
- /**
- * Called when the media time changed due to seeking.
- *
- * @param timeUs current media time
- */
- void onSeek(long timeUs);
-
- /**
- * Called when the playback stopped. This is not called on pause, only
- * on full stop, at which point there is no further current media time.
- */
- void onStop();
- }
-}
-
diff --git a/packages/MediaComponents/src/com/android/media/subtitle/SubtitleController.java b/packages/MediaComponents/src/com/android/media/subtitle/SubtitleController.java
deleted file mode 100644
index 97d3927..0000000
--- a/packages/MediaComponents/src/com/android/media/subtitle/SubtitleController.java
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media.subtitle;
-
-import android.content.Context;
-import android.media.MediaFormat;
-import android.media.MediaPlayer2.TrackInfo;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.view.accessibility.CaptioningManager;
-
-import com.android.media.subtitle.SubtitleTrack.RenderingWidget;
-
-import java.util.Locale;
-import java.util.Vector;
-
-// Note: This is forked from android.media.SubtitleController since P
-/**
- * The subtitle controller provides the architecture to display subtitles for a
- * media source. It allows specifying which tracks to display, on which anchor
- * to display them, and also allows adding external, out-of-band subtitle tracks.
- */
-public class SubtitleController {
- private MediaTimeProvider mTimeProvider;
- private Vector<Renderer> mRenderers;
- private Vector<SubtitleTrack> mTracks;
- private SubtitleTrack mSelectedTrack;
- private boolean mShowing;
- private CaptioningManager mCaptioningManager;
- private Handler mHandler;
-
- private static final int WHAT_SHOW = 1;
- private static final int WHAT_HIDE = 2;
- private static final int WHAT_SELECT_TRACK = 3;
- private static final int WHAT_SELECT_DEFAULT_TRACK = 4;
-
- private final Handler.Callback mCallback = new Handler.Callback() {
- @Override
- public boolean handleMessage(Message msg) {
- switch (msg.what) {
- case WHAT_SHOW:
- doShow();
- return true;
- case WHAT_HIDE:
- doHide();
- return true;
- case WHAT_SELECT_TRACK:
- doSelectTrack((SubtitleTrack)msg.obj);
- return true;
- case WHAT_SELECT_DEFAULT_TRACK:
- doSelectDefaultTrack();
- return true;
- default:
- return false;
- }
- }
- };
-
- private CaptioningManager.CaptioningChangeListener mCaptioningChangeListener =
- new CaptioningManager.CaptioningChangeListener() {
- @Override
- public void onEnabledChanged(boolean enabled) {
- selectDefaultTrack();
- }
-
- @Override
- public void onLocaleChanged(Locale locale) {
- selectDefaultTrack();
- }
- };
-
- public SubtitleController(Context context) {
- this(context, null, null);
- }
-
- /**
- * Creates a subtitle controller for a media playback object that implements
- * the MediaTimeProvider interface.
- *
- * @param timeProvider
- */
- public SubtitleController(
- Context context,
- MediaTimeProvider timeProvider,
- Listener listener) {
- mTimeProvider = timeProvider;
- mListener = listener;
-
- mRenderers = new Vector<Renderer>();
- mShowing = false;
- mTracks = new Vector<SubtitleTrack>();
- mCaptioningManager =
- (CaptioningManager)context.getSystemService(Context.CAPTIONING_SERVICE);
- }
-
- @Override
- protected void finalize() throws Throwable {
- mCaptioningManager.removeCaptioningChangeListener(
- mCaptioningChangeListener);
- super.finalize();
- }
-
- /**
- * @return the available subtitle tracks for this media. These include
- * the tracks found by {@link MediaPlayer} as well as any tracks added
- * manually via {@link #addTrack}.
- */
- public SubtitleTrack[] getTracks() {
- synchronized(mTracks) {
- SubtitleTrack[] tracks = new SubtitleTrack[mTracks.size()];
- mTracks.toArray(tracks);
- return tracks;
- }
- }
-
- /**
- * @return the currently selected subtitle track
- */
- public SubtitleTrack getSelectedTrack() {
- return mSelectedTrack;
- }
-
- private RenderingWidget getRenderingWidget() {
- if (mSelectedTrack == null) {
- return null;
- }
- return mSelectedTrack.getRenderingWidget();
- }
-
- /**
- * Selects a subtitle track. As a result, this track will receive
- * in-band data from the {@link MediaPlayer}. However, this does
- * not change the subtitle visibility.
- *
- * Should be called from the anchor's (UI) thread. {@see #Anchor.getSubtitleLooper}
- *
- * @param track The subtitle track to select. This must be one of the
- * tracks in {@link #getTracks}.
- * @return true if the track was successfully selected.
- */
- public boolean selectTrack(SubtitleTrack track) {
- if (track != null && !mTracks.contains(track)) {
- return false;
- }
-
- processOnAnchor(mHandler.obtainMessage(WHAT_SELECT_TRACK, track));
- return true;
- }
-
- private void doSelectTrack(SubtitleTrack track) {
- mTrackIsExplicit = true;
- if (mSelectedTrack == track) {
- return;
- }
-
- if (mSelectedTrack != null) {
- mSelectedTrack.hide();
- mSelectedTrack.setTimeProvider(null);
- }
-
- mSelectedTrack = track;
- if (mAnchor != null) {
- mAnchor.setSubtitleWidget(getRenderingWidget());
- }
-
- if (mSelectedTrack != null) {
- mSelectedTrack.setTimeProvider(mTimeProvider);
- mSelectedTrack.show();
- }
-
- if (mListener != null) {
- mListener.onSubtitleTrackSelected(track);
- }
- }
-
- /**
- * @return the default subtitle track based on system preferences, or null,
- * if no such track exists in this manager.
- *
- * Supports HLS-flags: AUTOSELECT, FORCED & DEFAULT.
- *
- * 1. If captioning is disabled, only consider FORCED tracks. Otherwise,
- * consider all tracks, but prefer non-FORCED ones.
- * 2. If user selected "Default" caption language:
- * a. If there is a considered track with DEFAULT=yes, returns that track
- * (favor the first one in the current language if there are more than
- * one default tracks, or the first in general if none of them are in
- * the current language).
- * b. Otherwise, if there is a track with AUTOSELECT=yes in the current
- * language, return that one.
- * c. If there are no default tracks, and no autoselectable tracks in the
- * current language, return null.
- * 3. If there is a track with the caption language, select that one. Prefer
- * the one with AUTOSELECT=no.
- *
- * The default values for these flags are DEFAULT=no, AUTOSELECT=yes
- * and FORCED=no.
- */
- public SubtitleTrack getDefaultTrack() {
- SubtitleTrack bestTrack = null;
- int bestScore = -1;
-
- Locale selectedLocale = mCaptioningManager.getLocale();
- Locale locale = selectedLocale;
- if (locale == null) {
- locale = Locale.getDefault();
- }
- boolean selectForced = !mCaptioningManager.isEnabled();
-
- synchronized(mTracks) {
- for (SubtitleTrack track: mTracks) {
- MediaFormat format = track.getFormat();
- String language = format.getString(MediaFormat.KEY_LANGUAGE);
- boolean forced =
- format.getInteger(MediaFormat.KEY_IS_FORCED_SUBTITLE, 0) != 0;
- boolean autoselect =
- format.getInteger(MediaFormat.KEY_IS_AUTOSELECT, 1) != 0;
- boolean is_default =
- format.getInteger(MediaFormat.KEY_IS_DEFAULT, 0) != 0;
-
- boolean languageMatches =
- (locale == null ||
- locale.getLanguage().equals("") ||
- locale.getISO3Language().equals(language) ||
- locale.getLanguage().equals(language));
- // is_default is meaningless unless caption language is 'default'
- int score = (forced ? 0 : 8) +
- (((selectedLocale == null) && is_default) ? 4 : 0) +
- (autoselect ? 0 : 2) + (languageMatches ? 1 : 0);
-
- if (selectForced && !forced) {
- continue;
- }
-
- // we treat null locale/language as matching any language
- if ((selectedLocale == null && is_default) ||
- (languageMatches &&
- (autoselect || forced || selectedLocale != null))) {
- if (score > bestScore) {
- bestScore = score;
- bestTrack = track;
- }
- }
- }
- }
- return bestTrack;
- }
-
- private boolean mTrackIsExplicit = false;
- private boolean mVisibilityIsExplicit = false;
-
- /** should be called from anchor thread */
- public void selectDefaultTrack() {
- processOnAnchor(mHandler.obtainMessage(WHAT_SELECT_DEFAULT_TRACK));
- }
-
- private void doSelectDefaultTrack() {
- if (mTrackIsExplicit) {
- // If track selection is explicit, but visibility
- // is not, it falls back to the captioning setting
- if (!mVisibilityIsExplicit) {
- if (mCaptioningManager.isEnabled() ||
- (mSelectedTrack != null &&
- mSelectedTrack.getFormat().getInteger(
- MediaFormat.KEY_IS_FORCED_SUBTITLE, 0) != 0)) {
- show();
- } else if (mSelectedTrack != null
- && mSelectedTrack.getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
- hide();
- }
- mVisibilityIsExplicit = false;
- }
- return;
- }
-
- // We can have a default (forced) track even if captioning
- // is not enabled. This is handled by getDefaultTrack().
- // Show this track unless subtitles were explicitly hidden.
- SubtitleTrack track = getDefaultTrack();
- if (track != null) {
- selectTrack(track);
- mTrackIsExplicit = false;
- if (!mVisibilityIsExplicit) {
- show();
- mVisibilityIsExplicit = false;
- }
- }
- }
-
- /** must be called from anchor thread */
- public void reset() {
- checkAnchorLooper();
- hide();
- selectTrack(null);
- mTracks.clear();
- mTrackIsExplicit = false;
- mVisibilityIsExplicit = false;
- mCaptioningManager.removeCaptioningChangeListener(
- mCaptioningChangeListener);
- }
-
- /**
- * Adds a new, external subtitle track to the manager.
- *
- * @param format the format of the track that will include at least
- * the MIME type {@link MediaFormat@KEY_MIME}.
- * @return the created {@link SubtitleTrack} object
- */
- public SubtitleTrack addTrack(MediaFormat format) {
- synchronized(mRenderers) {
- for (Renderer renderer: mRenderers) {
- if (renderer.supports(format)) {
- SubtitleTrack track = renderer.createTrack(format);
- if (track != null) {
- synchronized(mTracks) {
- if (mTracks.size() == 0) {
- mCaptioningManager.addCaptioningChangeListener(
- mCaptioningChangeListener);
- }
- mTracks.add(track);
- }
- return track;
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Show the selected (or default) subtitle track.
- *
- * Should be called from the anchor's (UI) thread. {@see #Anchor.getSubtitleLooper}
- */
- public void show() {
- processOnAnchor(mHandler.obtainMessage(WHAT_SHOW));
- }
-
- private void doShow() {
- mShowing = true;
- mVisibilityIsExplicit = true;
- if (mSelectedTrack != null) {
- mSelectedTrack.show();
- }
- }
-
- /**
- * Hide the selected (or default) subtitle track.
- *
- * Should be called from the anchor's (UI) thread. {@see #Anchor.getSubtitleLooper}
- */
- public void hide() {
- processOnAnchor(mHandler.obtainMessage(WHAT_HIDE));
- }
-
- private void doHide() {
- mVisibilityIsExplicit = true;
- if (mSelectedTrack != null) {
- mSelectedTrack.hide();
- }
- mShowing = false;
- }
-
- /**
- * Interface for supporting a single or multiple subtitle types in {@link
- * MediaPlayer}.
- */
- public abstract static class Renderer {
- /**
- * Called by {@link MediaPlayer}'s {@link SubtitleController} when a new
- * subtitle track is detected, to see if it should use this object to
- * parse and display this subtitle track.
- *
- * @param format the format of the track that will include at least
- * the MIME type {@link MediaFormat@KEY_MIME}.
- *
- * @return true if and only if the track format is supported by this
- * renderer
- */
- public abstract boolean supports(MediaFormat format);
-
- /**
- * Called by {@link MediaPlayer}'s {@link SubtitleController} for each
- * subtitle track that was detected and is supported by this object to
- * create a {@link SubtitleTrack} object. This object will be created
- * for each track that was found. If the track is selected for display,
- * this object will be used to parse and display the track data.
- *
- * @param format the format of the track that will include at least
- * the MIME type {@link MediaFormat@KEY_MIME}.
- * @return a {@link SubtitleTrack} object that will be used to parse
- * and render the subtitle track.
- */
- public abstract SubtitleTrack createTrack(MediaFormat format);
- }
-
- /**
- * Add support for a subtitle format in {@link MediaPlayer}.
- *
- * @param renderer a {@link SubtitleController.Renderer} object that adds
- * support for a subtitle format.
- */
- public void registerRenderer(Renderer renderer) {
- synchronized(mRenderers) {
- // TODO how to get available renderers in the system
- if (!mRenderers.contains(renderer)) {
- // TODO should added renderers override existing ones (to allow replacing?)
- mRenderers.add(renderer);
- }
- }
- }
-
- public boolean hasRendererFor(MediaFormat format) {
- synchronized(mRenderers) {
- // TODO how to get available renderers in the system
- for (Renderer renderer: mRenderers) {
- if (renderer.supports(format)) {
- return true;
- }
- }
- return false;
- }
- }
-
- /**
- * Subtitle anchor, an object that is able to display a subtitle renderer,
- * e.g. a VideoView.
- */
- public interface Anchor {
- /**
- * Anchor should use the supplied subtitle rendering widget, or
- * none if it is null.
- */
- public void setSubtitleWidget(RenderingWidget subtitleWidget);
-
- /**
- * Anchors provide the looper on which all track visibility changes
- * (track.show/hide, setSubtitleWidget) will take place.
- */
- public Looper getSubtitleLooper();
- }
-
- private Anchor mAnchor;
-
- /**
- * called from anchor's looper (if any, both when unsetting and
- * setting)
- */
- public void setAnchor(Anchor anchor) {
- if (mAnchor == anchor) {
- return;
- }
-
- if (mAnchor != null) {
- checkAnchorLooper();
- mAnchor.setSubtitleWidget(null);
- }
- mAnchor = anchor;
- mHandler = null;
- if (mAnchor != null) {
- mHandler = new Handler(mAnchor.getSubtitleLooper(), mCallback);
- checkAnchorLooper();
- mAnchor.setSubtitleWidget(getRenderingWidget());
- }
- }
-
- private void checkAnchorLooper() {
- assert mHandler != null : "Should have a looper already";
- assert Looper.myLooper() == mHandler.getLooper()
- : "Must be called from the anchor's looper";
- }
-
- private void processOnAnchor(Message m) {
- assert mHandler != null : "Should have a looper already";
- if (Looper.myLooper() == mHandler.getLooper()) {
- mHandler.dispatchMessage(m);
- } else {
- mHandler.sendMessage(m);
- }
- }
-
- public interface Listener {
- /**
- * Called when a subtitle track has been selected.
- *
- * @param track selected subtitle track or null
- */
- public void onSubtitleTrackSelected(SubtitleTrack track);
- }
-
- private Listener mListener;
-}
diff --git a/packages/MediaComponents/src/com/android/media/subtitle/SubtitleTrack.java b/packages/MediaComponents/src/com/android/media/subtitle/SubtitleTrack.java
deleted file mode 100644
index 6b9064a..0000000
--- a/packages/MediaComponents/src/com/android/media/subtitle/SubtitleTrack.java
+++ /dev/null
@@ -1,696 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media.subtitle;
-
-import android.graphics.Canvas;
-import android.media.MediaFormat;
-import android.media.MediaPlayer2.TrackInfo;
-import android.media.SubtitleData;
-import android.os.Handler;
-import android.util.Log;
-import android.util.LongSparseArray;
-import android.util.Pair;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.Vector;
-
-// Note: This is forked from android.media.SubtitleTrack since P
-/**
- * A subtitle track abstract base class that is responsible for parsing and displaying
- * an instance of a particular type of subtitle.
- */
-public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeListener {
- private static final String TAG = "SubtitleTrack";
- private long mLastUpdateTimeMs;
- private long mLastTimeMs;
-
- private Runnable mRunnable;
-
- final private LongSparseArray<Run> mRunsByEndTime = new LongSparseArray<Run>();
- final private LongSparseArray<Run> mRunsByID = new LongSparseArray<Run>();
-
- private CueList mCues;
- final private Vector<Cue> mActiveCues = new Vector<Cue>();
- protected boolean mVisible;
-
- public boolean DEBUG = false;
-
- protected Handler mHandler = new Handler();
-
- private MediaFormat mFormat;
-
- public SubtitleTrack(MediaFormat format) {
- mFormat = format;
- mCues = new CueList();
- clearActiveCues();
- mLastTimeMs = -1;
- }
-
- public final MediaFormat getFormat() {
- return mFormat;
- }
-
- private long mNextScheduledTimeMs = -1;
-
- public void onData(SubtitleData data) {
- long runID = data.getStartTimeUs() + 1;
- onData(data.getData(), true /* eos */, runID);
- setRunDiscardTimeMs(
- runID,
- (data.getStartTimeUs() + data.getDurationUs()) / 1000);
- }
-
- /**
- * Called when there is input data for the subtitle track. The
- * complete subtitle for a track can include multiple whole units
- * (runs). Each of these units can have multiple sections. The
- * contents of a run are submitted in sequential order, with eos
- * indicating the last section of the run. Calls from different
- * runs must not be intermixed.
- *
- * @param data subtitle data byte buffer
- * @param eos true if this is the last section of the run.
- * @param runID mostly-unique ID for this run of data. Subtitle cues
- * with runID of 0 are discarded immediately after
- * display. Cues with runID of ~0 are discarded
- * only at the deletion of the track object. Cues
- * with other runID-s are discarded at the end of the
- * run, which defaults to the latest timestamp of
- * any of its cues (with this runID).
- */
- protected abstract void onData(byte[] data, boolean eos, long runID);
-
- /**
- * Called when adding the subtitle rendering widget to the view hierarchy,
- * as well as when showing or hiding the subtitle track, or when the video
- * surface position has changed.
- *
- * @return the widget that renders this subtitle track. For most renderers
- * there should be a single shared instance that is used for all
- * tracks supported by that renderer, as at most one subtitle track
- * is visible at one time.
- */
- public abstract RenderingWidget getRenderingWidget();
-
- /**
- * Called when the active cues have changed, and the contents of the subtitle
- * view should be updated.
- */
- public abstract void updateView(Vector<Cue> activeCues);
-
- protected synchronized void updateActiveCues(boolean rebuild, long timeMs) {
- // out-of-order times mean seeking or new active cues being added
- // (during their own timespan)
- if (rebuild || mLastUpdateTimeMs > timeMs) {
- clearActiveCues();
- }
-
- for(Iterator<Pair<Long, Cue> > it =
- mCues.entriesBetween(mLastUpdateTimeMs, timeMs).iterator(); it.hasNext(); ) {
- Pair<Long, Cue> event = it.next();
- Cue cue = event.second;
-
- if (cue.mEndTimeMs == event.first) {
- // remove past cues
- if (DEBUG) Log.v(TAG, "Removing " + cue);
- mActiveCues.remove(cue);
- if (cue.mRunID == 0) {
- it.remove();
- }
- } else if (cue.mStartTimeMs == event.first) {
- // add new cues
- // TRICKY: this will happen in start order
- if (DEBUG) Log.v(TAG, "Adding " + cue);
- if (cue.mInnerTimesMs != null) {
- cue.onTime(timeMs);
- }
- mActiveCues.add(cue);
- } else if (cue.mInnerTimesMs != null) {
- // cue is modified
- cue.onTime(timeMs);
- }
- }
-
- /* complete any runs */
- while (mRunsByEndTime.size() > 0 &&
- mRunsByEndTime.keyAt(0) <= timeMs) {
- removeRunsByEndTimeIndex(0); // removes element
- }
- mLastUpdateTimeMs = timeMs;
- }
-
- private void removeRunsByEndTimeIndex(int ix) {
- Run run = mRunsByEndTime.valueAt(ix);
- while (run != null) {
- Cue cue = run.mFirstCue;
- while (cue != null) {
- mCues.remove(cue);
- Cue nextCue = cue.mNextInRun;
- cue.mNextInRun = null;
- cue = nextCue;
- }
- mRunsByID.remove(run.mRunID);
- Run nextRun = run.mNextRunAtEndTimeMs;
- run.mPrevRunAtEndTimeMs = null;
- run.mNextRunAtEndTimeMs = null;
- run = nextRun;
- }
- mRunsByEndTime.removeAt(ix);
- }
-
- @Override
- protected void finalize() throws Throwable {
- /* remove all cues (untangle all cross-links) */
- int size = mRunsByEndTime.size();
- for(int ix = size - 1; ix >= 0; ix--) {
- removeRunsByEndTimeIndex(ix);
- }
-
- super.finalize();
- }
-
- private synchronized void takeTime(long timeMs) {
- mLastTimeMs = timeMs;
- }
-
- protected synchronized void clearActiveCues() {
- if (DEBUG) Log.v(TAG, "Clearing " + mActiveCues.size() + " active cues");
- mActiveCues.clear();
- mLastUpdateTimeMs = -1;
- }
-
- protected void scheduleTimedEvents() {
- /* get times for the next event */
- if (mTimeProvider != null) {
- mNextScheduledTimeMs = mCues.nextTimeAfter(mLastTimeMs);
- if (DEBUG) Log.d(TAG, "sched @" + mNextScheduledTimeMs + " after " + mLastTimeMs);
- mTimeProvider.notifyAt(
- mNextScheduledTimeMs >= 0 ?
- (mNextScheduledTimeMs * 1000) : MediaTimeProvider.NO_TIME,
- this);
- }
- }
-
- @Override
- public void onTimedEvent(long timeUs) {
- if (DEBUG) Log.d(TAG, "onTimedEvent " + timeUs);
- synchronized (this) {
- long timeMs = timeUs / 1000;
- updateActiveCues(false, timeMs);
- takeTime(timeMs);
- }
- updateView(mActiveCues);
- scheduleTimedEvents();
- }
-
- @Override
- public void onSeek(long timeUs) {
- if (DEBUG) Log.d(TAG, "onSeek " + timeUs);
- synchronized (this) {
- long timeMs = timeUs / 1000;
- updateActiveCues(true, timeMs);
- takeTime(timeMs);
- }
- updateView(mActiveCues);
- scheduleTimedEvents();
- }
-
- @Override
- public void onStop() {
- synchronized (this) {
- if (DEBUG) Log.d(TAG, "onStop");
- clearActiveCues();
- mLastTimeMs = -1;
- }
- updateView(mActiveCues);
- mNextScheduledTimeMs = -1;
- mTimeProvider.notifyAt(MediaTimeProvider.NO_TIME, this);
- }
-
- protected MediaTimeProvider mTimeProvider;
-
- public void show() {
- if (mVisible) {
- return;
- }
-
- mVisible = true;
- RenderingWidget renderingWidget = getRenderingWidget();
- if (renderingWidget != null) {
- renderingWidget.setVisible(true);
- }
- if (mTimeProvider != null) {
- mTimeProvider.scheduleUpdate(this);
- }
- }
-
- public void hide() {
- if (!mVisible) {
- return;
- }
-
- if (mTimeProvider != null) {
- mTimeProvider.cancelNotifications(this);
- }
- RenderingWidget renderingWidget = getRenderingWidget();
- if (renderingWidget != null) {
- renderingWidget.setVisible(false);
- }
- mVisible = false;
- }
-
- protected synchronized boolean addCue(Cue cue) {
- mCues.add(cue);
-
- if (cue.mRunID != 0) {
- Run run = mRunsByID.get(cue.mRunID);
- if (run == null) {
- run = new Run();
- mRunsByID.put(cue.mRunID, run);
- run.mEndTimeMs = cue.mEndTimeMs;
- } else if (run.mEndTimeMs < cue.mEndTimeMs) {
- run.mEndTimeMs = cue.mEndTimeMs;
- }
-
- // link-up cues in the same run
- cue.mNextInRun = run.mFirstCue;
- run.mFirstCue = cue;
- }
-
- // if a cue is added that should be visible, need to refresh view
- long nowMs = -1;
- if (mTimeProvider != null) {
- try {
- nowMs = mTimeProvider.getCurrentTimeUs(
- false /* precise */, true /* monotonic */) / 1000;
- } catch (IllegalStateException e) {
- // handle as it we are not playing
- }
- }
-
- if (DEBUG) Log.v(TAG, "mVisible=" + mVisible + ", " +
- cue.mStartTimeMs + " <= " + nowMs + ", " +
- cue.mEndTimeMs + " >= " + mLastTimeMs);
-
- if (mVisible &&
- cue.mStartTimeMs <= nowMs &&
- // we don't trust nowMs, so check any cue since last callback
- cue.mEndTimeMs >= mLastTimeMs) {
- if (mRunnable != null) {
- mHandler.removeCallbacks(mRunnable);
- }
- final SubtitleTrack track = this;
- final long thenMs = nowMs;
- mRunnable = new Runnable() {
- @Override
- public void run() {
- // even with synchronized, it is possible that we are going
- // to do multiple updates as the runnable could be already
- // running.
- synchronized (track) {
- mRunnable = null;
- updateActiveCues(true, thenMs);
- updateView(mActiveCues);
- }
- }
- };
- // delay update so we don't update view on every cue. TODO why 10?
- if (mHandler.postDelayed(mRunnable, 10 /* delay */)) {
- if (DEBUG) Log.v(TAG, "scheduling update");
- } else {
- if (DEBUG) Log.w(TAG, "failed to schedule subtitle view update");
- }
- return true;
- }
-
- if (mVisible &&
- cue.mEndTimeMs >= mLastTimeMs &&
- (cue.mStartTimeMs < mNextScheduledTimeMs ||
- mNextScheduledTimeMs < 0)) {
- scheduleTimedEvents();
- }
-
- return false;
- }
-
- public synchronized void setTimeProvider(MediaTimeProvider timeProvider) {
- if (mTimeProvider == timeProvider) {
- return;
- }
- if (mTimeProvider != null) {
- mTimeProvider.cancelNotifications(this);
- }
- mTimeProvider = timeProvider;
- if (mTimeProvider != null) {
- mTimeProvider.scheduleUpdate(this);
- }
- }
-
-
- static class CueList {
- private static final String TAG = "CueList";
- // simplistic, inefficient implementation
- private SortedMap<Long, Vector<Cue> > mCues;
- public boolean DEBUG = false;
-
- private boolean addEvent(Cue cue, long timeMs) {
- Vector<Cue> cues = mCues.get(timeMs);
- if (cues == null) {
- cues = new Vector<Cue>(2);
- mCues.put(timeMs, cues);
- } else if (cues.contains(cue)) {
- // do not duplicate cues
- return false;
- }
-
- cues.add(cue);
- return true;
- }
-
- private void removeEvent(Cue cue, long timeMs) {
- Vector<Cue> cues = mCues.get(timeMs);
- if (cues != null) {
- cues.remove(cue);
- if (cues.size() == 0) {
- mCues.remove(timeMs);
- }
- }
- }
-
- public void add(Cue cue) {
- // ignore non-positive-duration cues
- if (cue.mStartTimeMs >= cue.mEndTimeMs)
- return;
-
- if (!addEvent(cue, cue.mStartTimeMs)) {
- return;
- }
-
- long lastTimeMs = cue.mStartTimeMs;
- if (cue.mInnerTimesMs != null) {
- for (long timeMs: cue.mInnerTimesMs) {
- if (timeMs > lastTimeMs && timeMs < cue.mEndTimeMs) {
- addEvent(cue, timeMs);
- lastTimeMs = timeMs;
- }
- }
- }
-
- addEvent(cue, cue.mEndTimeMs);
- }
-
- public void remove(Cue cue) {
- removeEvent(cue, cue.mStartTimeMs);
- if (cue.mInnerTimesMs != null) {
- for (long timeMs: cue.mInnerTimesMs) {
- removeEvent(cue, timeMs);
- }
- }
- removeEvent(cue, cue.mEndTimeMs);
- }
-
- public Iterable<Pair<Long, Cue>> entriesBetween(
- final long lastTimeMs, final long timeMs) {
- return new Iterable<Pair<Long, Cue> >() {
- @Override
- public Iterator<Pair<Long, Cue> > iterator() {
- if (DEBUG) Log.d(TAG, "slice (" + lastTimeMs + ", " + timeMs + "]=");
- try {
- return new EntryIterator(
- mCues.subMap(lastTimeMs + 1, timeMs + 1));
- } catch(IllegalArgumentException e) {
- return new EntryIterator(null);
- }
- }
- };
- }
-
- public long nextTimeAfter(long timeMs) {
- SortedMap<Long, Vector<Cue>> tail = null;
- try {
- tail = mCues.tailMap(timeMs + 1);
- if (tail != null) {
- return tail.firstKey();
- } else {
- return -1;
- }
- } catch(IllegalArgumentException e) {
- return -1;
- } catch(NoSuchElementException e) {
- return -1;
- }
- }
-
- class EntryIterator implements Iterator<Pair<Long, Cue> > {
- @Override
- public boolean hasNext() {
- return !mDone;
- }
-
- @Override
- public Pair<Long, Cue> next() {
- if (mDone) {
- throw new NoSuchElementException("");
- }
- mLastEntry = new Pair<Long, Cue>(
- mCurrentTimeMs, mListIterator.next());
- mLastListIterator = mListIterator;
- if (!mListIterator.hasNext()) {
- nextKey();
- }
- return mLastEntry;
- }
-
- @Override
- public void remove() {
- // only allow removing end tags
- if (mLastListIterator == null ||
- mLastEntry.second.mEndTimeMs != mLastEntry.first) {
- throw new IllegalStateException("");
- }
-
- // remove end-cue
- mLastListIterator.remove();
- mLastListIterator = null;
- if (mCues.get(mLastEntry.first).size() == 0) {
- mCues.remove(mLastEntry.first);
- }
-
- // remove rest of the cues
- Cue cue = mLastEntry.second;
- removeEvent(cue, cue.mStartTimeMs);
- if (cue.mInnerTimesMs != null) {
- for (long timeMs: cue.mInnerTimesMs) {
- removeEvent(cue, timeMs);
- }
- }
- }
-
- public EntryIterator(SortedMap<Long, Vector<Cue> > cues) {
- if (DEBUG) Log.v(TAG, cues + "");
- mRemainingCues = cues;
- mLastListIterator = null;
- nextKey();
- }
-
- private void nextKey() {
- do {
- try {
- if (mRemainingCues == null) {
- throw new NoSuchElementException("");
- }
- mCurrentTimeMs = mRemainingCues.firstKey();
- mListIterator =
- mRemainingCues.get(mCurrentTimeMs).iterator();
- try {
- mRemainingCues =
- mRemainingCues.tailMap(mCurrentTimeMs + 1);
- } catch (IllegalArgumentException e) {
- mRemainingCues = null;
- }
- mDone = false;
- } catch (NoSuchElementException e) {
- mDone = true;
- mRemainingCues = null;
- mListIterator = null;
- return;
- }
- } while (!mListIterator.hasNext());
- }
-
- private long mCurrentTimeMs;
- private Iterator<Cue> mListIterator;
- private boolean mDone;
- private SortedMap<Long, Vector<Cue> > mRemainingCues;
- private Iterator<Cue> mLastListIterator;
- private Pair<Long,Cue> mLastEntry;
- }
-
- CueList() {
- mCues = new TreeMap<Long, Vector<Cue>>();
- }
- }
-
- public static class Cue {
- public long mStartTimeMs;
- public long mEndTimeMs;
- public long[] mInnerTimesMs;
- public long mRunID;
-
- public Cue mNextInRun;
-
- public void onTime(long timeMs) { }
- }
-
- /** update mRunsByEndTime (with default end time) */
- protected void finishedRun(long runID) {
- if (runID != 0 && runID != ~0) {
- Run run = mRunsByID.get(runID);
- if (run != null) {
- run.storeByEndTimeMs(mRunsByEndTime);
- }
- }
- }
-
- /** update mRunsByEndTime with given end time */
- public void setRunDiscardTimeMs(long runID, long timeMs) {
- if (runID != 0 && runID != ~0) {
- Run run = mRunsByID.get(runID);
- if (run != null) {
- run.mEndTimeMs = timeMs;
- run.storeByEndTimeMs(mRunsByEndTime);
- }
- }
- }
-
- /** whether this is a text track who fires events instead getting rendered */
- public int getTrackType() {
- return getRenderingWidget() == null
- ? TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT
- : TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE;
- }
-
-
- private static class Run {
- public Cue mFirstCue;
- public Run mNextRunAtEndTimeMs;
- public Run mPrevRunAtEndTimeMs;
- public long mEndTimeMs = -1;
- public long mRunID = 0;
- private long mStoredEndTimeMs = -1;
-
- public void storeByEndTimeMs(LongSparseArray<Run> runsByEndTime) {
- // remove old value if any
- int ix = runsByEndTime.indexOfKey(mStoredEndTimeMs);
- if (ix >= 0) {
- if (mPrevRunAtEndTimeMs == null) {
- assert(this == runsByEndTime.valueAt(ix));
- if (mNextRunAtEndTimeMs == null) {
- runsByEndTime.removeAt(ix);
- } else {
- runsByEndTime.setValueAt(ix, mNextRunAtEndTimeMs);
- }
- }
- removeAtEndTimeMs();
- }
-
- // add new value
- if (mEndTimeMs >= 0) {
- mPrevRunAtEndTimeMs = null;
- mNextRunAtEndTimeMs = runsByEndTime.get(mEndTimeMs);
- if (mNextRunAtEndTimeMs != null) {
- mNextRunAtEndTimeMs.mPrevRunAtEndTimeMs = this;
- }
- runsByEndTime.put(mEndTimeMs, this);
- mStoredEndTimeMs = mEndTimeMs;
- }
- }
-
- public void removeAtEndTimeMs() {
- Run prev = mPrevRunAtEndTimeMs;
-
- if (mPrevRunAtEndTimeMs != null) {
- mPrevRunAtEndTimeMs.mNextRunAtEndTimeMs = mNextRunAtEndTimeMs;
- mPrevRunAtEndTimeMs = null;
- }
- if (mNextRunAtEndTimeMs != null) {
- mNextRunAtEndTimeMs.mPrevRunAtEndTimeMs = prev;
- mNextRunAtEndTimeMs = null;
- }
- }
- }
-
- /**
- * Interface for rendering subtitles onto a Canvas.
- */
- public interface RenderingWidget {
- /**
- * Sets the widget's callback, which is used to send updates when the
- * rendered data has changed.
- *
- * @param callback update callback
- */
- public void setOnChangedListener(OnChangedListener callback);
-
- /**
- * Sets the widget's size.
- *
- * @param width width in pixels
- * @param height height in pixels
- */
- public void setSize(int width, int height);
-
- /**
- * Sets whether the widget should draw subtitles.
- *
- * @param visible true if subtitles should be drawn, false otherwise
- */
- public void setVisible(boolean visible);
-
- /**
- * Renders subtitles onto a {@link Canvas}.
- *
- * @param c canvas on which to render subtitles
- */
- public void draw(Canvas c);
-
- /**
- * Called when the widget is attached to a window.
- */
- public void onAttachedToWindow();
-
- /**
- * Called when the widget is detached from a window.
- */
- public void onDetachedFromWindow();
-
- /**
- * Callback used to send updates about changes to rendering data.
- */
- public interface OnChangedListener {
- /**
- * Called when the rendering data has changed.
- *
- * @param renderingWidget the widget whose data has changed
- */
- public void onChanged(RenderingWidget renderingWidget);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/update/ApiFactory.java b/packages/MediaComponents/src/com/android/media/update/ApiFactory.java
deleted file mode 100644
index f75b75e..0000000
--- a/packages/MediaComponents/src/com/android/media/update/ApiFactory.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media.update;
-
-import android.app.Notification;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.media.MediaBrowser2;
-import android.media.MediaBrowser2.BrowserCallback;
-import android.media.MediaController2;
-import android.media.MediaController2.ControllerCallback;
-import android.media.MediaItem2;
-import android.media.MediaLibraryService2;
-import android.media.MediaLibraryService2.LibraryRoot;
-import android.media.MediaLibraryService2.MediaLibrarySession;
-import android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback;
-import android.media.MediaMetadata2;
-import android.media.MediaPlaylistAgent;
-import android.media.MediaSession2;
-import android.media.MediaSession2.ControllerInfo;
-import android.media.MediaSession2.SessionCallback;
-import android.media.MediaSessionService2;
-import android.media.MediaSessionService2.MediaNotification;
-import android.media.Rating2;
-import android.media.SessionCommand2;
-import android.media.SessionCommandGroup2;
-import android.media.SessionToken2;
-import android.media.VolumeProvider2;
-import android.media.update.MediaBrowser2Provider;
-import android.media.update.MediaControlView2Provider;
-import android.media.update.MediaController2Provider;
-import android.media.update.MediaItem2Provider;
-import android.media.update.MediaLibraryService2Provider.LibraryRootProvider;
-import android.media.update.MediaMetadata2Provider;
-import android.media.update.MediaPlaylistAgentProvider;
-import android.media.update.MediaSession2Provider;
-import android.media.update.MediaSession2Provider.BuilderBaseProvider;
-import android.media.update.MediaSession2Provider.CommandButtonProvider.BuilderProvider;
-import android.media.update.MediaSessionService2Provider;
-import android.media.update.MediaSessionService2Provider.MediaNotificationProvider;
-import android.media.update.SessionToken2Provider;
-import android.media.update.StaticProvider;
-import android.media.update.VideoView2Provider;
-import android.media.update.ViewGroupProvider;
-import android.media.update.VolumeProvider2Provider;
-import android.os.Bundle;
-import android.os.IInterface;
-import android.util.AttributeSet;
-import android.widget.MediaControlView2;
-import android.widget.VideoView2;
-
-import androidx.annotation.Nullable;
-
-import com.android.media.IMediaController2;
-import com.android.media.MediaBrowser2Impl;
-import com.android.media.MediaController2Impl;
-import com.android.media.MediaItem2Impl;
-import com.android.media.MediaLibraryService2Impl;
-import com.android.media.MediaLibraryService2Impl.LibraryRootImpl;
-import com.android.media.MediaMetadata2Impl;
-import com.android.media.MediaPlaylistAgentImpl;
-import com.android.media.MediaSession2Impl;
-import com.android.media.MediaSessionService2Impl;
-import com.android.media.Rating2Impl;
-import com.android.media.SessionToken2Impl;
-import com.android.media.VolumeProvider2Impl;
-import com.android.widget.MediaControlView2Impl;
-import com.android.widget.VideoView2Impl;
-
-import java.util.concurrent.Executor;
-
-public final class ApiFactory implements StaticProvider {
- private ApiFactory() { }
-
- public static StaticProvider initialize(ApplicationInfo updatableInfo) {
- ApiHelper.initialize(updatableInfo);
- return new ApiFactory();
- }
-
- @Override
- public MediaController2Provider createMediaController2(
- Context context, MediaController2 instance, SessionToken2 token,
- Executor executor, ControllerCallback callback) {
- return new MediaController2Impl(context, instance, token, executor, callback);
- }
-
- @Override
- public MediaBrowser2Provider createMediaBrowser2(Context context, MediaBrowser2 instance,
- SessionToken2 token, Executor executor, BrowserCallback callback) {
- return new MediaBrowser2Impl(context, instance, token, executor, callback);
- }
-
- @Override
- public MediaSession2Provider.CommandProvider createMediaSession2Command(
- SessionCommand2 instance, int commandCode, String action, Bundle extra) {
- if (action == null && extra == null) {
- return new MediaSession2Impl.CommandImpl(instance, commandCode);
- }
- return new MediaSession2Impl.CommandImpl(instance, action, extra);
- }
-
- @Override
- public SessionCommand2 fromBundle_MediaSession2Command(Bundle command) {
- return MediaSession2Impl.CommandImpl.fromBundle_impl(command);
- }
-
- @Override
- public MediaSession2Provider.CommandGroupProvider createMediaSession2CommandGroup(
- SessionCommandGroup2 instance, SessionCommandGroup2 other) {
- return new MediaSession2Impl.CommandGroupImpl(instance,
- (other == null) ? null : other.getProvider());
- }
-
- @Override
- public SessionCommandGroup2 fromBundle_MediaSession2CommandGroup(Bundle commands) {
- return MediaSession2Impl.CommandGroupImpl.fromBundle_impl(commands);
- }
-
- @Override
- public MediaSession2Provider.ControllerInfoProvider createMediaSession2ControllerInfo(
- Context context, ControllerInfo instance, int uid, int pid, String packageName,
- IInterface callback) {
- return new MediaSession2Impl.ControllerInfoImpl(context,
- instance, uid, pid, packageName, (IMediaController2) callback);
- }
-
- @Override
- public BuilderProvider createMediaSession2CommandButtonBuilder(
- MediaSession2.CommandButton.Builder instance) {
- return new MediaSession2Impl.CommandButtonImpl.BuilderImpl(instance);
- }
-
- public BuilderBaseProvider<MediaSession2, SessionCallback> createMediaSession2Builder(
- Context context, MediaSession2.Builder instance) {
- return new MediaSession2Impl.BuilderImpl(context, instance);
- }
-
- @Override
- public MediaSessionService2Provider createMediaSessionService2(MediaSessionService2 instance) {
- return new MediaSessionService2Impl(instance);
- }
-
- @Override
- public MediaNotificationProvider createMediaSessionService2MediaNotification(
- MediaNotification instance, int notificationId, Notification notification) {
- return new MediaSessionService2Impl.MediaNotificationImpl(
- instance, notificationId, notification);
- }
-
- @Override
- public MediaSessionService2Provider createMediaLibraryService2(MediaLibraryService2 instance) {
- return new MediaLibraryService2Impl(instance);
- }
-
- @Override
- public BuilderBaseProvider<MediaLibrarySession, MediaLibrarySessionCallback>
- createMediaLibraryService2Builder(MediaLibraryService2 service,
- MediaLibrarySession.Builder instance, Executor callbackExecutor,
- MediaLibrarySessionCallback callback) {
- return new MediaLibraryService2Impl.BuilderImpl(service, instance, callbackExecutor,
- callback);
- }
-
- @Override
- public LibraryRootProvider createMediaLibraryService2LibraryRoot(
- LibraryRoot instance, String rootId, Bundle extras) {
- return new LibraryRootImpl(instance, rootId, extras);
- }
-
- @Override
- public MediaControlView2Provider createMediaControlView2(MediaControlView2 instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider,
- @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- return new MediaControlView2Impl(instance, superProvider, privateProvider);
- }
-
- @Override
- public VideoView2Provider createVideoView2(
- VideoView2 instance, ViewGroupProvider superProvider, ViewGroupProvider privateProvider,
- @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- return new VideoView2Impl(instance, superProvider, privateProvider);
- }
-
- @Override
- public SessionToken2Provider createSessionToken2(Context context, SessionToken2 instance,
- String packageName, String serviceName, int uid) {
- return new SessionToken2Impl(context, instance, packageName, serviceName, uid);
- }
-
- @Override
- public SessionToken2 fromBundle_SessionToken2(Bundle bundle) {
- return SessionToken2Impl.fromBundle_impl(bundle);
- }
-
- @Override
- public MediaItem2Provider.BuilderProvider createMediaItem2Builder(MediaItem2.Builder instance,
- int flags) {
- return new MediaItem2Impl.BuilderImpl(instance, flags);
- }
-
- @Override
- public MediaItem2 fromBundle_MediaItem2(Bundle bundle) {
- return MediaItem2Impl.fromBundle_impl(bundle);
- }
-
- @Override
- public VolumeProvider2Provider createVolumeProvider2(VolumeProvider2 instance, int controlType,
- int maxVolume, int currentVolume) {
- return new VolumeProvider2Impl(instance, controlType, maxVolume, currentVolume);
- }
-
- @Override
- public MediaMetadata2 fromBundle_MediaMetadata2(Bundle bundle) {
- return MediaMetadata2Impl.fromBundle_impl(bundle);
- }
-
- @Override
- public MediaMetadata2Provider.BuilderProvider createMediaMetadata2Builder(
- MediaMetadata2.Builder instance) {
- return new MediaMetadata2Impl.BuilderImpl(instance);
- }
-
- @Override
- public MediaMetadata2Provider.BuilderProvider createMediaMetadata2Builder(
- MediaMetadata2.Builder instance, MediaMetadata2 source) {
- return new MediaMetadata2Impl.BuilderImpl(instance, source);
- }
-
- @Override
- public Rating2 fromBundle_Rating2(Bundle bundle) {
- return Rating2Impl.fromBundle_impl(bundle);
- }
-
- @Override
- public Rating2 newUnratedRating_Rating2(int ratingStyle) {
- return Rating2Impl.newUnratedRating_impl(ratingStyle);
- }
-
- @Override
- public Rating2 newHeartRating_Rating2(boolean hasHeart) {
- return Rating2Impl.newHeartRating_impl(hasHeart);
- }
-
- @Override
- public Rating2 newThumbRating_Rating2(boolean thumbIsUp) {
- return Rating2Impl.newThumbRating_impl(thumbIsUp);
- }
-
- @Override
- public Rating2 newStarRating_Rating2(int starRatingStyle, float starRating) {
- return Rating2Impl.newStarRating_impl(starRatingStyle, starRating);
- }
-
- @Override
- public Rating2 newPercentageRating_Rating2(float percent) {
- return Rating2Impl.newPercentageRating_impl(percent);
- }
-
- @Override
- public MediaPlaylistAgentProvider createMediaPlaylistAgent(MediaPlaylistAgent instance) {
- return new MediaPlaylistAgentImpl(instance);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/update/ApiHelper.java b/packages/MediaComponents/src/com/android/media/update/ApiHelper.java
deleted file mode 100644
index dc5e5e2..0000000
--- a/packages/MediaComponents/src/com/android/media/update/ApiHelper.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media.update;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources;
-import android.content.res.Resources.Theme;
-import android.content.res.XmlResourceParser;
-import android.util.AttributeSet;
-import android.view.ContextThemeWrapper;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.GuardedBy;
-import androidx.appcompat.widget.ButtonBarLayout;
-import androidx.legacy.widget.Space;
-
-import com.android.support.mediarouter.app.MediaRouteButton;
-import com.android.support.mediarouter.app.MediaRouteExpandCollapseButton;
-import com.android.support.mediarouter.app.MediaRouteVolumeSlider;
-import com.android.support.mediarouter.app.OverlayListView;
-
-public final class ApiHelper {
- private static ApplicationInfo sUpdatableInfo;
-
- @GuardedBy("this")
- private static Theme sLibTheme;
-
- private ApiHelper() { }
-
- static void initialize(ApplicationInfo updatableInfo) {
- if (sUpdatableInfo != null) {
- throw new IllegalStateException("initialize should only be called once");
- }
-
- sUpdatableInfo = updatableInfo;
- }
-
- public static Resources getLibResources(Context context) {
- return getLibTheme(context).getResources();
- }
-
- public static Theme getLibTheme(Context context) {
- if (sLibTheme != null) return sLibTheme;
-
- return getLibThemeSynchronized(context);
- }
-
- public static Theme getLibTheme(Context context, int themeId) {
- Theme theme = getLibResources(context).newTheme();
- theme.applyStyle(themeId, true);
- return theme;
- }
-
- public static LayoutInflater getLayoutInflater(Context context) {
- return getLayoutInflater(context, null);
- }
-
- public static LayoutInflater getLayoutInflater(Context context, Theme theme) {
- if (theme == null) {
- theme = getLibTheme(context);
- }
-
- // TODO (b/72975976): Avoid to use ContextThemeWrapper with app context and lib theme.
- LayoutInflater layoutInflater = LayoutInflater.from(context).cloneInContext(
- new ContextThemeWrapper(context, theme));
- layoutInflater.setFactory2(new LayoutInflater.Factory2() {
- @Override
- public View onCreateView(
- View parent, String name, Context context, AttributeSet attrs) {
- if (MediaRouteButton.class.getCanonicalName().equals(name)) {
- return new MediaRouteButton(context, attrs);
- } else if (MediaRouteVolumeSlider.class.getCanonicalName().equals(name)) {
- return new MediaRouteVolumeSlider(context, attrs);
- } else if (MediaRouteExpandCollapseButton.class.getCanonicalName().equals(name)) {
- return new MediaRouteExpandCollapseButton(context, attrs);
- } else if (OverlayListView.class.getCanonicalName().equals(name)) {
- return new OverlayListView(context, attrs);
- } else if (ButtonBarLayout.class.getCanonicalName().equals(name)) {
- return new ButtonBarLayout(context, attrs);
- } else if (Space.class.getCanonicalName().equals(name)) {
- return new Space(context, attrs);
- }
- return null;
- }
-
- @Override
- public View onCreateView(String name, Context context, AttributeSet attrs) {
- return onCreateView(null, name, context, attrs);
- }
- });
- return layoutInflater;
- }
-
- public static View inflateLibLayout(Context context, int libResId) {
- return inflateLibLayout(context, getLibTheme(context), libResId, null, false);
- }
-
- public static View inflateLibLayout(Context context, Theme theme, int libResId) {
- return inflateLibLayout(context, theme, libResId, null, false);
- }
-
- public static View inflateLibLayout(Context context, Theme theme, int libResId,
- @Nullable ViewGroup root, boolean attachToRoot) {
- try (XmlResourceParser parser = getLibResources(context).getLayout(libResId)) {
- return getLayoutInflater(context, theme).inflate(parser, root, attachToRoot);
- }
- }
-
- private static synchronized Theme getLibThemeSynchronized(Context context) {
- if (sLibTheme != null) return sLibTheme;
-
- if (sUpdatableInfo == null) {
- throw new IllegalStateException("initialize hasn't been called yet");
- }
-
- try {
- return sLibTheme = context.getPackageManager()
- .getResourcesForApplication(sUpdatableInfo).newTheme();
- } catch (NameNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/api24/media/MediaRouterApi24.java b/packages/MediaComponents/src/com/android/support/mediarouter/api24/media/MediaRouterApi24.java
deleted file mode 100644
index 1146af6..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/api24/media/MediaRouterApi24.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-// @@RequiresApi(24)
-final class MediaRouterApi24 {
- public static final class RouteInfo {
- public static int getDeviceType(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getDeviceType();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteActionProvider.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteActionProvider.java
deleted file mode 100644
index 98c0d17..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteActionProvider.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.core.view.ActionProvider;
-
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.lang.ref.WeakReference;
-
-/**
- * The media route action provider displays a {@link MediaRouteButton media route button}
- * in the application's {@link ActionBar} to allow the user to select routes and
- * to control the currently selected route.
- * <p>
- * The application must specify the kinds of routes that the user should be allowed
- * to select by specifying a {@link MediaRouteSelector selector} with the
- * {@link #setRouteSelector} method.
- * </p><p>
- * Refer to {@link MediaRouteButton} for a description of the button that will
- * appear in the action bar menu. Note that instead of disabling the button
- * when no routes are available, the action provider will instead make the
- * menu item invisible. In this way, the button will only be visible when it
- * is possible for the user to discover and select a matching route.
- * </p>
- *
- * <h3>Prerequisites</h3>
- * <p>
- * To use the media route action provider, the activity must be a subclass of
- * {@link AppCompatActivity} from the <code>androidx.appcompat.appcompat</code>
- * support library. Refer to support library documentation for details.
- * </p>
- *
- * <h3>Example</h3>
- * <p>
- * </p><p>
- * The application should define a menu resource to include the provider in the
- * action bar options menu. Note that the support library action bar uses attributes
- * that are defined in the application's resource namespace rather than the framework's
- * resource namespace to configure each item.
- * </p><pre>
- * <menu xmlns:android="http://schemas.android.com/apk/res/android"
- * xmlns:app="http://schemas.android.com/apk/res-auto">
- * <item android:id="@+id/media_route_menu_item"
- * android:title="@string/media_route_menu_title"
- * app:showAsAction="always"
- * app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"/>
- * </menu>
- * </pre><p>
- * Then configure the menu and set the route selector for the chooser.
- * </p><pre>
- * public class MyActivity extends AppCompatActivity {
- * private MediaRouter mRouter;
- * private MediaRouter.Callback mCallback;
- * private MediaRouteSelector mSelector;
- *
- * protected void onCreate(Bundle savedInstanceState) {
- * super.onCreate(savedInstanceState);
- *
- * mRouter = Mediarouter.getInstance(this);
- * mSelector = new MediaRouteSelector.Builder()
- * .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- * .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
- * .build();
- * mCallback = new MyCallback();
- * }
- *
- * // Add the callback on start to tell the media router what kinds of routes
- * // the application is interested in so that it can try to discover suitable ones.
- * public void onStart() {
- * super.onStart();
- *
- * mediaRouter.addCallback(mSelector, mCallback,
- * MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
- *
- * MediaRouter.RouteInfo route = mediaRouter.updateSelectedRoute(mSelector);
- * // do something with the route...
- * }
- *
- * // Remove the selector on stop to tell the media router that it no longer
- * // needs to invest effort trying to discover routes of these kinds for now.
- * public void onStop() {
- * super.onStop();
- *
- * mediaRouter.removeCallback(mCallback);
- * }
- *
- * public boolean onCreateOptionsMenu(Menu menu) {
- * super.onCreateOptionsMenu(menu);
- *
- * getMenuInflater().inflate(R.menu.sample_media_router_menu, menu);
- *
- * MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
- * MediaRouteActionProvider mediaRouteActionProvider =
- * (MediaRouteActionProvider)MenuItemCompat.getActionProvider(mediaRouteMenuItem);
- * mediaRouteActionProvider.setRouteSelector(mSelector);
- * return true;
- * }
- *
- * private final class MyCallback extends MediaRouter.Callback {
- * // Implement callback methods as needed.
- * }
- * }
- * </pre>
- *
- * @see #setRouteSelector
- */
-public class MediaRouteActionProvider extends ActionProvider {
- private static final String TAG = "MediaRouteActionProvider";
-
- private final MediaRouter mRouter;
- private final MediaRouterCallback mCallback;
-
- private MediaRouteSelector mSelector = MediaRouteSelector.EMPTY;
- private MediaRouteDialogFactory mDialogFactory = MediaRouteDialogFactory.getDefault();
- private MediaRouteButton mButton;
-
- /**
- * Creates the action provider.
- *
- * @param context The context.
- */
- public MediaRouteActionProvider(Context context) {
- super(context);
-
- mRouter = MediaRouter.getInstance(context);
- mCallback = new MediaRouterCallback(this);
- }
-
- /**
- * Gets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @return The selector, never null.
- */
- @NonNull
- public MediaRouteSelector getRouteSelector() {
- return mSelector;
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @param selector The selector, must not be null.
- */
- public void setRouteSelector(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- if (!mSelector.equals(selector)) {
- // FIXME: We currently have no way of knowing whether the action provider
- // is still needed by the UI. Unfortunately this means the action provider
- // may leak callbacks until garbage collection occurs. This may result in
- // media route providers doing more work than necessary in the short term
- // while trying to discover routes that are no longer of interest to the
- // application. To solve this problem, the action provider will need some
- // indication from the framework that it is being destroyed.
- if (!mSelector.isEmpty()) {
- mRouter.removeCallback(mCallback);
- }
- if (!selector.isEmpty()) {
- mRouter.addCallback(selector, mCallback);
- }
- mSelector = selector;
- refreshRoute();
-
- if (mButton != null) {
- mButton.setRouteSelector(selector);
- }
- }
- }
-
- /**
- * Gets the media route dialog factory to use when showing the route chooser
- * or controller dialog.
- *
- * @return The dialog factory, never null.
- */
- @NonNull
- public MediaRouteDialogFactory getDialogFactory() {
- return mDialogFactory;
- }
-
- /**
- * Sets the media route dialog factory to use when showing the route chooser
- * or controller dialog.
- *
- * @param factory The dialog factory, must not be null.
- */
- public void setDialogFactory(@NonNull MediaRouteDialogFactory factory) {
- if (factory == null) {
- throw new IllegalArgumentException("factory must not be null");
- }
-
- if (mDialogFactory != factory) {
- mDialogFactory = factory;
-
- if (mButton != null) {
- mButton.setDialogFactory(factory);
- }
- }
- }
-
- /**
- * Gets the associated media route button, or null if it has not yet been created.
- */
- @Nullable
- public MediaRouteButton getMediaRouteButton() {
- return mButton;
- }
-
- /**
- * Called when the media route button is being created.
- * <p>
- * Subclasses may override this method to customize the button.
- * </p>
- */
- public MediaRouteButton onCreateMediaRouteButton() {
- return new MediaRouteButton(getContext());
- }
-
- @Override
- @SuppressWarnings("deprecation")
- public View onCreateActionView() {
- if (mButton != null) {
- Log.e(TAG, "onCreateActionView: this ActionProvider is already associated " +
- "with a menu item. Don't reuse MediaRouteActionProvider instances! " +
- "Abandoning the old menu item...");
- }
-
- mButton = onCreateMediaRouteButton();
- mButton.setCheatSheetEnabled(true);
- mButton.setRouteSelector(mSelector);
- mButton.setDialogFactory(mDialogFactory);
- mButton.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
- return mButton;
- }
-
- @Override
- public boolean onPerformDefaultAction() {
- if (mButton != null) {
- return mButton.showDialog();
- }
- return false;
- }
-
- @Override
- public boolean overridesItemVisibility() {
- return true;
- }
-
- @Override
- public boolean isVisible() {
- return mRouter.isRouteAvailable(mSelector,
- MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE);
- }
-
- void refreshRoute() {
- refreshVisibility();
- }
-
- private static final class MediaRouterCallback extends MediaRouter.Callback {
- private final WeakReference<MediaRouteActionProvider> mProviderWeak;
-
- public MediaRouterCallback(MediaRouteActionProvider provider) {
- mProviderWeak = new WeakReference<MediaRouteActionProvider>(provider);
- }
-
- @Override
- public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute(router);
- }
-
- @Override
- public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute(router);
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute(router);
- }
-
- @Override
- public void onProviderAdded(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute(router);
- }
-
- @Override
- public void onProviderRemoved(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute(router);
- }
-
- @Override
- public void onProviderChanged(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute(router);
- }
-
- private void refreshRoute(MediaRouter router) {
- MediaRouteActionProvider provider = mProviderWeak.get();
- if (provider != null) {
- provider.refreshRoute();
- } else {
- router.removeCallback(this);
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteButton.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteButton.java
deleted file mode 100644
index e82fcb9..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteButton.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.annotation.NonNull;
-import android.app.Activity;
-import android.app.FragmentManager;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.drawable.AnimationDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.AsyncTask;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.SoundEffectConstants;
-import android.view.View;
-
-import androidx.appcompat.widget.TooltipCompat;
-import androidx.core.graphics.drawable.DrawableCompat;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-/**
- * The media route button allows the user to select routes and to control the
- * currently selected route.
- * <p>
- * The application must specify the kinds of routes that the user should be allowed
- * to select by specifying a {@link MediaRouteSelector selector} with the
- * {@link #setRouteSelector} method.
- * </p><p>
- * When the default route is selected or when the currently selected route does not
- * match the {@link #getRouteSelector() selector}, the button will appear in
- * an inactive state indicating that the application is not connected to a
- * route of the kind that it wants to use. Clicking on the button opens
- * a {@link MediaRouteChooserDialog} to allow the user to select a route.
- * If no non-default routes match the selector and it is not possible for an active
- * scan to discover any matching routes, then the button is disabled and cannot
- * be clicked.
- * </p><p>
- * When a non-default route is selected that matches the selector, the button will
- * appear in an active state indicating that the application is connected
- * to a route of the kind that it wants to use. The button may also appear
- * in an intermediary connecting state if the route is in the process of connecting
- * to the destination but has not yet completed doing so. In either case, clicking
- * on the button opens a {@link MediaRouteControllerDialog} to allow the user
- * to control or disconnect from the current route.
- * </p>
- *
- * <h3>Prerequisites</h3>
- * <p>
- * To use the media route button, the activity must be a subclass of
- * {@link FragmentActivity} from the <code>androidx.core./code>
- * support library. Refer to support library documentation for details.
- * </p>
- *
- * @see MediaRouteActionProvider
- * @see #setRouteSelector
- */
-public class MediaRouteButton extends View {
- private static final String TAG = "MediaRouteButton";
-
- private static final String CHOOSER_FRAGMENT_TAG =
- "androidx.mediarouter.media.outer:MediaRouteChooserDialogFragment";
- private static final String CONTROLLER_FRAGMENT_TAG =
- "androidx.mediarouter.media.outer:MediaRouteControllerDialogFragment";
-
- private final MediaRouter mRouter;
- private final MediaRouterCallback mCallback;
-
- private MediaRouteSelector mSelector = MediaRouteSelector.EMPTY;
- private int mRouteCallbackFlags;
- private MediaRouteDialogFactory mDialogFactory = MediaRouteDialogFactory.getDefault();
-
- private boolean mAttachedToWindow;
-
- private static final SparseArray<Drawable.ConstantState> sRemoteIndicatorCache =
- new SparseArray<>(2);
- private RemoteIndicatorLoader mRemoteIndicatorLoader;
- private Drawable mRemoteIndicator;
- private boolean mRemoteActive;
- private boolean mIsConnecting;
-
- private ColorStateList mButtonTint;
- private int mMinWidth;
- private int mMinHeight;
-
- // The checked state is used when connected to a remote route.
- private static final int[] CHECKED_STATE_SET = {
- android.R.attr.state_checked
- };
-
- // The checkable state is used while connecting to a remote route.
- private static final int[] CHECKABLE_STATE_SET = {
- android.R.attr.state_checkable
- };
-
- public MediaRouteButton(Context context) {
- this(context, null);
- }
-
- public MediaRouteButton(Context context, AttributeSet attrs) {
- this(context, attrs, R.attr.mediaRouteButtonStyle);
- }
-
- public MediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
- super(MediaRouterThemeHelper.createThemedButtonContext(context), attrs, defStyleAttr);
- context = getContext();
-
- mRouter = MediaRouter.getInstance(context);
- mCallback = new MediaRouterCallback();
-
- Resources.Theme theme = ApiHelper.getLibResources(context).newTheme();
- theme.applyStyle(MediaRouterThemeHelper.getRouterThemeId(context), true);
- TypedArray a = theme.obtainStyledAttributes(attrs,
- R.styleable.MediaRouteButton, defStyleAttr, 0);
-
- mButtonTint = a.getColorStateList(R.styleable.MediaRouteButton_mediaRouteButtonTint);
- mMinWidth = a.getDimensionPixelSize(
- R.styleable.MediaRouteButton_android_minWidth, 0);
- mMinHeight = a.getDimensionPixelSize(
- R.styleable.MediaRouteButton_android_minHeight, 0);
- int remoteIndicatorResId = a.getResourceId(
- R.styleable.MediaRouteButton_externalRouteEnabledDrawable, 0);
- a.recycle();
-
- if (remoteIndicatorResId != 0) {
- Drawable.ConstantState remoteIndicatorState =
- sRemoteIndicatorCache.get(remoteIndicatorResId);
- if (remoteIndicatorState != null) {
- setRemoteIndicatorDrawable(remoteIndicatorState.newDrawable());
- } else {
- mRemoteIndicatorLoader = new RemoteIndicatorLoader(remoteIndicatorResId);
- mRemoteIndicatorLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- }
-
- updateContentDescription();
- setClickable(true);
- }
-
- /**
- * Gets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @return The selector, never null.
- */
- @NonNull
- public MediaRouteSelector getRouteSelector() {
- return mSelector;
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @param selector The selector.
- */
- public void setRouteSelector(MediaRouteSelector selector) {
- setRouteSelector(selector, 0);
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @param selector The selector.
- * @param flags Flags to control the behavior of the callback. May be zero or a combination of
- * {@link #MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN} and
- * {@link #MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS}.
- */
- public void setRouteSelector(MediaRouteSelector selector, int flags) {
- if (mSelector.equals(selector) && mRouteCallbackFlags == flags) {
- return;
- }
- if (!mSelector.isEmpty()) {
- mRouter.removeCallback(mCallback);
- }
- if (selector == null || selector.isEmpty()) {
- mSelector = MediaRouteSelector.EMPTY;
- return;
- }
-
- mSelector = selector;
- mRouteCallbackFlags = flags;
-
- if (mAttachedToWindow) {
- mRouter.addCallback(selector, mCallback, flags);
- refreshRoute();
- }
- }
-
- /**
- * Gets the media route dialog factory to use when showing the route chooser
- * or controller dialog.
- *
- * @return The dialog factory, never null.
- */
- @NonNull
- public MediaRouteDialogFactory getDialogFactory() {
- return mDialogFactory;
- }
-
- /**
- * Sets the media route dialog factory to use when showing the route chooser
- * or controller dialog.
- *
- * @param factory The dialog factory, must not be null.
- */
- public void setDialogFactory(@NonNull MediaRouteDialogFactory factory) {
- if (factory == null) {
- throw new IllegalArgumentException("factory must not be null");
- }
-
- mDialogFactory = factory;
- }
-
- /**
- * Show the route chooser or controller dialog.
- * <p>
- * If the default route is selected or if the currently selected route does
- * not match the {@link #getRouteSelector selector}, then shows the route chooser dialog.
- * Otherwise, shows the route controller dialog to offer the user
- * a choice to disconnect from the route or perform other control actions
- * such as setting the route's volume.
- * </p><p>
- * The application can customize the dialogs by calling {@link #setDialogFactory}
- * to provide a customized dialog factory.
- * </p>
- *
- * @return True if the dialog was actually shown.
- *
- * @throws IllegalStateException if the activity is not a subclass of
- * {@link FragmentActivity}.
- */
- public boolean showDialog() {
- if (!mAttachedToWindow) {
- return false;
- }
-
- final FragmentManager fm = getActivity().getFragmentManager();
- if (fm == null) {
- throw new IllegalStateException("The activity must be a subclass of FragmentActivity");
- }
-
- MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
- if (route.isDefaultOrBluetooth() || !route.matchesSelector(mSelector)) {
- if (fm.findFragmentByTag(CHOOSER_FRAGMENT_TAG) != null) {
- Log.w(TAG, "showDialog(): Route chooser dialog already showing!");
- return false;
- }
- MediaRouteChooserDialogFragment f =
- mDialogFactory.onCreateChooserDialogFragment();
- f.setRouteSelector(mSelector);
- f.show(fm, CHOOSER_FRAGMENT_TAG);
- } else {
- if (fm.findFragmentByTag(CONTROLLER_FRAGMENT_TAG) != null) {
- Log.w(TAG, "showDialog(): Route controller dialog already showing!");
- return false;
- }
- MediaRouteControllerDialogFragment f =
- mDialogFactory.onCreateControllerDialogFragment();
- f.show(fm, CONTROLLER_FRAGMENT_TAG);
- }
- return true;
- }
-
-
- private Activity getActivity() {
- // Gross way of unwrapping the Activity so we can get the FragmentManager
- Context context = getContext();
- while (context instanceof ContextWrapper) {
- if (context instanceof Activity) {
- return (Activity)context;
- }
- context = ((ContextWrapper)context).getBaseContext();
- }
- return null;
- }
-
- /**
- * Sets whether to enable showing a toast with the content descriptor of the
- * button when the button is long pressed.
- */
- void setCheatSheetEnabled(boolean enable) {
- TooltipCompat.setTooltipText(this, enable
- ? ApiHelper.getLibResources(getContext())
- .getString(R.string.mr_button_content_description)
- : null);
- }
-
- @Override
- public boolean performClick() {
- // Send the appropriate accessibility events and call listeners
- boolean handled = super.performClick();
- if (!handled) {
- playSoundEffect(SoundEffectConstants.CLICK);
- }
- return showDialog() || handled;
- }
-
- @Override
- protected int[] onCreateDrawableState(int extraSpace) {
- final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
-
- // Technically we should be handling this more completely, but these
- // are implementation details here. Checkable is used to express the connecting
- // drawable state and it's mutually exclusive with check for the purposes
- // of state selection here.
- if (mIsConnecting) {
- mergeDrawableStates(drawableState, CHECKABLE_STATE_SET);
- } else if (mRemoteActive) {
- mergeDrawableStates(drawableState, CHECKED_STATE_SET);
- }
- return drawableState;
- }
-
- @Override
- protected void drawableStateChanged() {
- super.drawableStateChanged();
-
- if (mRemoteIndicator != null) {
- int[] myDrawableState = getDrawableState();
- mRemoteIndicator.setState(myDrawableState);
- invalidate();
- }
- }
-
- /**
- * Sets a drawable to use as the remote route indicator.
- */
- public void setRemoteIndicatorDrawable(Drawable d) {
- if (mRemoteIndicatorLoader != null) {
- mRemoteIndicatorLoader.cancel(false);
- }
-
- if (mRemoteIndicator != null) {
- mRemoteIndicator.setCallback(null);
- unscheduleDrawable(mRemoteIndicator);
- }
- if (d != null) {
- if (mButtonTint != null) {
- d = DrawableCompat.wrap(d.mutate());
- DrawableCompat.setTintList(d, mButtonTint);
- }
- d.setCallback(this);
- d.setState(getDrawableState());
- d.setVisible(getVisibility() == VISIBLE, false);
- }
- mRemoteIndicator = d;
-
- refreshDrawableState();
- if (mAttachedToWindow && mRemoteIndicator != null
- && mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
- AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
- if (mIsConnecting) {
- if (!curDrawable.isRunning()) {
- curDrawable.start();
- }
- } else if (mRemoteActive) {
- if (curDrawable.isRunning()) {
- curDrawable.stop();
- }
- curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
- }
- }
- }
-
- @Override
- protected boolean verifyDrawable(Drawable who) {
- return super.verifyDrawable(who) || who == mRemoteIndicator;
- }
-
- @Override
- public void jumpDrawablesToCurrentState() {
- // We can't call super to handle the background so we do it ourselves.
- //super.jumpDrawablesToCurrentState();
- if (getBackground() != null) {
- DrawableCompat.jumpToCurrentState(getBackground());
- }
-
- // Handle our own remote indicator.
- if (mRemoteIndicator != null) {
- DrawableCompat.jumpToCurrentState(mRemoteIndicator);
- }
- }
-
- @Override
- public void setVisibility(int visibility) {
- super.setVisibility(visibility);
-
- if (mRemoteIndicator != null) {
- mRemoteIndicator.setVisible(getVisibility() == VISIBLE, false);
- }
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- mAttachedToWindow = true;
- if (!mSelector.isEmpty()) {
- mRouter.addCallback(mSelector, mCallback, mRouteCallbackFlags);
- }
- refreshRoute();
- }
-
- @Override
- public void onDetachedFromWindow() {
- mAttachedToWindow = false;
- if (!mSelector.isEmpty()) {
- mRouter.removeCallback(mCallback);
- }
-
- super.onDetachedFromWindow();
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
- final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
- final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-
- final int width = Math.max(mMinWidth, mRemoteIndicator != null ?
- mRemoteIndicator.getIntrinsicWidth() + getPaddingLeft() + getPaddingRight() : 0);
- final int height = Math.max(mMinHeight, mRemoteIndicator != null ?
- mRemoteIndicator.getIntrinsicHeight() + getPaddingTop() + getPaddingBottom() : 0);
-
- int measuredWidth;
- switch (widthMode) {
- case MeasureSpec.EXACTLY:
- measuredWidth = widthSize;
- break;
- case MeasureSpec.AT_MOST:
- measuredWidth = Math.min(widthSize, width);
- break;
- default:
- case MeasureSpec.UNSPECIFIED:
- measuredWidth = width;
- break;
- }
-
- int measuredHeight;
- switch (heightMode) {
- case MeasureSpec.EXACTLY:
- measuredHeight = heightSize;
- break;
- case MeasureSpec.AT_MOST:
- measuredHeight = Math.min(heightSize, height);
- break;
- default:
- case MeasureSpec.UNSPECIFIED:
- measuredHeight = height;
- break;
- }
-
- setMeasuredDimension(measuredWidth, measuredHeight);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- if (mRemoteIndicator != null) {
- final int left = getPaddingLeft();
- final int right = getWidth() - getPaddingRight();
- final int top = getPaddingTop();
- final int bottom = getHeight() - getPaddingBottom();
-
- final int drawWidth = mRemoteIndicator.getIntrinsicWidth();
- final int drawHeight = mRemoteIndicator.getIntrinsicHeight();
- final int drawLeft = left + (right - left - drawWidth) / 2;
- final int drawTop = top + (bottom - top - drawHeight) / 2;
-
- mRemoteIndicator.setBounds(drawLeft, drawTop,
- drawLeft + drawWidth, drawTop + drawHeight);
- mRemoteIndicator.draw(canvas);
- }
- }
-
- void refreshRoute() {
- final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
- final boolean isRemote = !route.isDefaultOrBluetooth() && route.matchesSelector(mSelector);
- final boolean isConnecting = isRemote && route.isConnecting();
- boolean needsRefresh = false;
- if (mRemoteActive != isRemote) {
- mRemoteActive = isRemote;
- needsRefresh = true;
- }
- if (mIsConnecting != isConnecting) {
- mIsConnecting = isConnecting;
- needsRefresh = true;
- }
-
- if (needsRefresh) {
- updateContentDescription();
- refreshDrawableState();
- }
- if (mAttachedToWindow) {
- setEnabled(mRouter.isRouteAvailable(mSelector,
- MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE));
- }
- if (mRemoteIndicator != null
- && mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
- AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
- if (mAttachedToWindow) {
- if ((needsRefresh || isConnecting) && !curDrawable.isRunning()) {
- curDrawable.start();
- }
- } else if (isRemote && !isConnecting) {
- // When the route is already connected before the view is attached, show the last
- // frame of the connected animation immediately.
- if (curDrawable.isRunning()) {
- curDrawable.stop();
- }
- curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
- }
- }
- }
-
- private void updateContentDescription() {
- int resId;
- if (mIsConnecting) {
- resId = R.string.mr_cast_button_connecting;
- } else if (mRemoteActive) {
- resId = R.string.mr_cast_button_connected;
- } else {
- resId = R.string.mr_cast_button_disconnected;
- }
- setContentDescription(ApiHelper.getLibResources(getContext()).getString(resId));
- }
-
- private final class MediaRouterCallback extends MediaRouter.Callback {
- MediaRouterCallback() {
- }
-
- @Override
- public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onProviderAdded(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute();
- }
-
- @Override
- public void onProviderRemoved(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute();
- }
-
- @Override
- public void onProviderChanged(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute();
- }
- }
-
- private final class RemoteIndicatorLoader extends AsyncTask<Void, Void, Drawable> {
- private final int mResId;
-
- RemoteIndicatorLoader(int resId) {
- mResId = resId;
- }
-
- @Override
- protected Drawable doInBackground(Void... params) {
- return ApiHelper.getLibResources(getContext()).getDrawable(mResId);
- }
-
- @Override
- protected void onPostExecute(Drawable remoteIndicator) {
- cacheAndReset(remoteIndicator);
- setRemoteIndicatorDrawable(remoteIndicator);
- }
-
- @Override
- protected void onCancelled(Drawable remoteIndicator) {
- cacheAndReset(remoteIndicator);
- }
-
- private void cacheAndReset(Drawable remoteIndicator) {
- if (remoteIndicator != null) {
- sRemoteIndicatorCache.put(mResId, remoteIndicator.getConstantState());
- }
- mRemoteIndicatorLoader = null;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialog.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialog.java
deleted file mode 100644
index f24028a..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialog.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import static com.android.support.mediarouter.media.MediaRouter.RouteInfo
- .CONNECTION_STATE_CONNECTED;
-import static com.android.support.mediarouter.media.MediaRouter.RouteInfo
- .CONNECTION_STATE_CONNECTING;
-
-import android.annotation.NonNull;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.ContextThemeWrapper;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * This class implements the route chooser dialog for {@link MediaRouter}.
- * <p>
- * This dialog allows the user to choose a route that matches a given selector.
- * </p>
- *
- * @see MediaRouteButton
- * @see MediaRouteActionProvider
- */
-public class MediaRouteChooserDialog extends Dialog {
- static final String TAG = "MediaRouteChooserDialog";
-
- // Do not update the route list immediately to avoid unnatural dialog change.
- private static final long UPDATE_ROUTES_DELAY_MS = 300L;
- static final int MSG_UPDATE_ROUTES = 1;
-
- private final MediaRouter mRouter;
- private final MediaRouterCallback mCallback;
-
- private TextView mTitleView;
- private MediaRouteSelector mSelector = MediaRouteSelector.EMPTY;
- private ArrayList<MediaRouter.RouteInfo> mRoutes;
- private RouteAdapter mAdapter;
- private ListView mListView;
- private boolean mAttachedToWindow;
- private long mLastUpdateTime;
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message message) {
- switch (message.what) {
- case MSG_UPDATE_ROUTES:
- updateRoutes((List<MediaRouter.RouteInfo>) message.obj);
- break;
- }
- }
- };
-
- public MediaRouteChooserDialog(Context context) {
- this(context, 0);
- }
-
- public MediaRouteChooserDialog(Context context, int theme) {
- // TODO (b/72975976): Avoid to use ContextThemeWrapper with app context and lib theme.
- super(new ContextThemeWrapper(context, ApiHelper.getLibTheme(context,
- MediaRouterThemeHelper.getRouterThemeId(context))), theme);
- context = getContext();
-
- mRouter = MediaRouter.getInstance(context);
- mCallback = new MediaRouterCallback();
- }
-
- /**
- * Gets the media route selector for filtering the routes that the user can select.
- *
- * @return The selector, never null.
- */
- @NonNull
- public MediaRouteSelector getRouteSelector() {
- return mSelector;
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can select.
- *
- * @param selector The selector, must not be null.
- */
- public void setRouteSelector(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- if (!mSelector.equals(selector)) {
- mSelector = selector;
-
- if (mAttachedToWindow) {
- mRouter.removeCallback(mCallback);
- mRouter.addCallback(selector, mCallback,
- MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- }
-
- refreshRoutes();
- }
- }
-
- /**
- * Called to filter the set of routes that should be included in the list.
- * <p>
- * The default implementation iterates over all routes in the provided list and
- * removes those for which {@link #onFilterRoute} returns false.
- * </p>
- *
- * @param routes The list of routes to filter in-place, never null.
- */
- public void onFilterRoutes(@NonNull List<MediaRouter.RouteInfo> routes) {
- for (int i = routes.size(); i-- > 0; ) {
- if (!onFilterRoute(routes.get(i))) {
- routes.remove(i);
- }
- }
- }
-
- /**
- * Returns true if the route should be included in the list.
- * <p>
- * The default implementation returns true for enabled non-default routes that
- * match the selector. Subclasses can override this method to filter routes
- * differently.
- * </p>
- *
- * @param route The route to consider, never null.
- * @return True if the route should be included in the chooser dialog.
- */
- public boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
- return !route.isDefaultOrBluetooth() && route.isEnabled()
- && route.matchesSelector(mSelector);
- }
-
- @Override
- public void setTitle(CharSequence title) {
- mTitleView.setText(title);
- }
-
- @Override
- public void setTitle(int titleId) {
- mTitleView.setText(titleId);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(ApiHelper.inflateLibLayout(getContext(), ApiHelper.getLibTheme(getContext(),
- MediaRouterThemeHelper.getRouterThemeId(getContext())),
- R.layout.mr_chooser_dialog));
-
- mRoutes = new ArrayList<>();
- mAdapter = new RouteAdapter(getContext(), mRoutes);
- mListView = (ListView)findViewById(R.id.mr_chooser_list);
- mListView.setAdapter(mAdapter);
- mListView.setOnItemClickListener(mAdapter);
- mListView.setEmptyView(findViewById(android.R.id.empty));
- mTitleView = findViewById(R.id.mr_chooser_title);
-
- updateLayout();
- }
-
- /**
- * Sets the width of the dialog. Also called when configuration changes.
- */
- void updateLayout() {
- getWindow().setLayout(MediaRouteDialogHelper.getDialogWidth(getContext()),
- ViewGroup.LayoutParams.WRAP_CONTENT);
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- mAttachedToWindow = true;
- mRouter.addCallback(mSelector, mCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- refreshRoutes();
- }
-
- @Override
- public void onDetachedFromWindow() {
- mAttachedToWindow = false;
- mRouter.removeCallback(mCallback);
- mHandler.removeMessages(MSG_UPDATE_ROUTES);
-
- super.onDetachedFromWindow();
- }
-
- /**
- * Refreshes the list of routes that are shown in the chooser dialog.
- */
- public void refreshRoutes() {
- if (mAttachedToWindow) {
- ArrayList<MediaRouter.RouteInfo> routes = new ArrayList<>(mRouter.getRoutes());
- onFilterRoutes(routes);
- Collections.sort(routes, RouteComparator.sInstance);
- if (SystemClock.uptimeMillis() - mLastUpdateTime >= UPDATE_ROUTES_DELAY_MS) {
- updateRoutes(routes);
- } else {
- mHandler.removeMessages(MSG_UPDATE_ROUTES);
- mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_UPDATE_ROUTES, routes),
- mLastUpdateTime + UPDATE_ROUTES_DELAY_MS);
- }
- }
- }
-
- void updateRoutes(List<MediaRouter.RouteInfo> routes) {
- mLastUpdateTime = SystemClock.uptimeMillis();
- mRoutes.clear();
- mRoutes.addAll(routes);
- mAdapter.notifyDataSetChanged();
- }
-
- private final class RouteAdapter extends ArrayAdapter<MediaRouter.RouteInfo>
- implements ListView.OnItemClickListener {
- private final Drawable mDefaultIcon;
- private final Drawable mTvIcon;
- private final Drawable mSpeakerIcon;
- private final Drawable mSpeakerGroupIcon;
-
- public RouteAdapter(Context context, List<MediaRouter.RouteInfo> routes) {
- super(context, 0, routes);
-
- TypedArray styledAttributes = ApiHelper.getLibTheme(context,
- MediaRouterThemeHelper.getRouterThemeId(context)).obtainStyledAttributes(
- new int[] {
- R.attr.mediaRouteDefaultIconDrawable,
- R.attr.mediaRouteTvIconDrawable,
- R.attr.mediaRouteSpeakerIconDrawable,
- R.attr.mediaRouteSpeakerGroupIconDrawable
- });
-
- mDefaultIcon = styledAttributes.getDrawable(0);
- mTvIcon = styledAttributes.getDrawable(1);
- mSpeakerIcon = styledAttributes.getDrawable(2);
- mSpeakerGroupIcon = styledAttributes.getDrawable(3);
- styledAttributes.recycle();
- }
-
- @Override
- public boolean areAllItemsEnabled() {
- return false;
- }
-
- @Override
- public boolean isEnabled(int position) {
- return getItem(position).isEnabled();
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View view = convertView;
- if (view == null) {
- view = ApiHelper.inflateLibLayout(getContext(),
- ApiHelper.getLibTheme(getContext(),
- MediaRouterThemeHelper.getRouterThemeId(getContext())),
- R.layout.mr_chooser_list_item, parent, false);
- }
-
- MediaRouter.RouteInfo route = getItem(position);
- TextView text1 = (TextView) view.findViewById(R.id.mr_chooser_route_name);
- TextView text2 = (TextView) view.findViewById(R.id.mr_chooser_route_desc);
- text1.setText(route.getName());
- String description = route.getDescription();
- boolean isConnectedOrConnecting =
- route.getConnectionState() == CONNECTION_STATE_CONNECTED
- || route.getConnectionState() == CONNECTION_STATE_CONNECTING;
- if (isConnectedOrConnecting && !TextUtils.isEmpty(description)) {
- text1.setGravity(Gravity.BOTTOM);
- text2.setVisibility(View.VISIBLE);
- text2.setText(description);
- } else {
- text1.setGravity(Gravity.CENTER_VERTICAL);
- text2.setVisibility(View.GONE);
- text2.setText("");
- }
- view.setEnabled(route.isEnabled());
-
- ImageView iconView = (ImageView) view.findViewById(R.id.mr_chooser_route_icon);
- if (iconView != null) {
- iconView.setImageDrawable(getIconDrawable(route));
- }
- return view;
- }
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- MediaRouter.RouteInfo route = getItem(position);
- if (route.isEnabled()) {
- route.select();
- dismiss();
- }
- }
-
- private Drawable getIconDrawable(MediaRouter.RouteInfo route) {
- Uri iconUri = route.getIconUri();
- if (iconUri != null) {
- try {
- InputStream is = getContext().getContentResolver().openInputStream(iconUri);
- Drawable drawable = Drawable.createFromStream(is, null);
- if (drawable != null) {
- return drawable;
- }
- } catch (IOException e) {
- Log.w(TAG, "Failed to load " + iconUri, e);
- // Falls back.
- }
- }
- return getDefaultIconDrawable(route);
- }
-
- private Drawable getDefaultIconDrawable(MediaRouter.RouteInfo route) {
- // If the type of the receiver device is specified, use it.
- switch (route.getDeviceType()) {
- case MediaRouter.RouteInfo.DEVICE_TYPE_TV:
- return mTvIcon;
- case MediaRouter.RouteInfo.DEVICE_TYPE_SPEAKER:
- return mSpeakerIcon;
- }
-
- // Otherwise, make the best guess based on other route information.
- if (route instanceof MediaRouter.RouteGroup) {
- // Only speakers can be grouped for now.
- return mSpeakerGroupIcon;
- }
- return mDefaultIcon;
- }
- }
-
- private final class MediaRouterCallback extends MediaRouter.Callback {
- MediaRouterCallback() {
- }
-
- @Override
- public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoutes();
- }
-
- @Override
- public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoutes();
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoutes();
- }
-
- @Override
- public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
- dismiss();
- }
- }
-
- static final class RouteComparator implements Comparator<MediaRouter.RouteInfo> {
- public static final RouteComparator sInstance = new RouteComparator();
-
- @Override
- public int compare(MediaRouter.RouteInfo lhs, MediaRouter.RouteInfo rhs) {
- return lhs.getName().compareToIgnoreCase(rhs.getName());
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialogFragment.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialogFragment.java
deleted file mode 100644
index 65e6b29..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialogFragment.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.os.Bundle;
-
-import com.android.support.mediarouter.media.MediaRouteSelector;
-
-/**
- * Media route chooser dialog fragment.
- * <p>
- * Creates a {@link MediaRouteChooserDialog}. The application may subclass
- * this dialog fragment to customize the media route chooser dialog.
- * </p>
- */
-public class MediaRouteChooserDialogFragment extends DialogFragment {
- private final String ARGUMENT_SELECTOR = "selector";
-
- private MediaRouteChooserDialog mDialog;
- private MediaRouteSelector mSelector;
-
- /**
- * Creates a media route chooser dialog fragment.
- * <p>
- * All subclasses of this class must also possess a default constructor.
- * </p>
- */
- public MediaRouteChooserDialogFragment() {
- setCancelable(true);
- }
-
- /**
- * Gets the media route selector for filtering the routes that the user can select.
- *
- * @return The selector, never null.
- */
- public MediaRouteSelector getRouteSelector() {
- ensureRouteSelector();
- return mSelector;
- }
-
- private void ensureRouteSelector() {
- if (mSelector == null) {
- Bundle args = getArguments();
- if (args != null) {
- mSelector = MediaRouteSelector.fromBundle(args.getBundle(ARGUMENT_SELECTOR));
- }
- if (mSelector == null) {
- mSelector = MediaRouteSelector.EMPTY;
- }
- }
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can select.
- * This method must be called before the fragment is added.
- *
- * @param selector The selector to set.
- */
- public void setRouteSelector(MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- ensureRouteSelector();
- if (!mSelector.equals(selector)) {
- mSelector = selector;
-
- Bundle args = getArguments();
- if (args == null) {
- args = new Bundle();
- }
- args.putBundle(ARGUMENT_SELECTOR, selector.asBundle());
- setArguments(args);
-
- MediaRouteChooserDialog dialog = (MediaRouteChooserDialog)getDialog();
- if (dialog != null) {
- dialog.setRouteSelector(selector);
- }
- }
- }
-
- /**
- * Called when the chooser dialog is being created.
- * <p>
- * Subclasses may override this method to customize the dialog.
- * </p>
- */
- public MediaRouteChooserDialog onCreateChooserDialog(
- Context context, Bundle savedInstanceState) {
- return new MediaRouteChooserDialog(context);
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- mDialog = onCreateChooserDialog(getContext(), savedInstanceState);
- mDialog.setRouteSelector(getRouteSelector());
- return mDialog;
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- if (mDialog != null) {
- mDialog.updateLayout();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialog.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialog.java
deleted file mode 100644
index f6c1d2f..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialog.java
+++ /dev/null
@@ -1,1487 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PAUSE;
-import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY;
-import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY_PAUSE;
-import static android.support.v4.media.session.PlaybackStateCompat.ACTION_STOP;
-
-import android.app.AlertDialog;
-import android.app.PendingIntent;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.support.v4.media.MediaDescriptionCompat;
-import android.support.v4.media.MediaMetadataCompat;
-import android.support.v4.media.session.MediaControllerCompat;
-import android.support.v4.media.session.MediaSessionCompat;
-import android.support.v4.media.session.PlaybackStateCompat;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.ContextThemeWrapper;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.MeasureSpec;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
-import android.view.animation.AnimationUtils;
-import android.view.animation.Interpolator;
-import android.view.animation.Transformation;
-import android.view.animation.TranslateAnimation;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import androidx.core.util.ObjectsCompat;
-import androidx.core.view.accessibility.AccessibilityEventCompat;
-import androidx.palette.graphics.Palette;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.app.OverlayListView.OverlayObject;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-/**
- * This class implements the route controller dialog for {@link MediaRouter}.
- * <p>
- * This dialog allows the user to control or disconnect from the currently selected route.
- * </p>
- *
- * @see MediaRouteButton
- * @see MediaRouteActionProvider
- */
-public class MediaRouteControllerDialog extends AlertDialog {
- // Tags should be less than 24 characters long (see docs for android.util.Log.isLoggable())
- static final String TAG = "MediaRouteCtrlDialog";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- // Time to wait before updating the volume when the user lets go of the seek bar
- // to allow the route provider time to propagate the change and publish a new
- // route descriptor.
- static final int VOLUME_UPDATE_DELAY_MILLIS = 500;
- static final int CONNECTION_TIMEOUT_MILLIS = (int) TimeUnit.SECONDS.toMillis(30L);
-
- private static final int BUTTON_NEUTRAL_RES_ID = android.R.id.button3;
- static final int BUTTON_DISCONNECT_RES_ID = android.R.id.button2;
- static final int BUTTON_STOP_RES_ID = android.R.id.button1;
-
- final MediaRouter mRouter;
- private final MediaRouterCallback mCallback;
- final MediaRouter.RouteInfo mRoute;
-
- Context mContext;
- private boolean mCreated;
- private boolean mAttachedToWindow;
-
- private int mDialogContentWidth;
-
- private View mCustomControlView;
-
- private Button mDisconnectButton;
- private Button mStopCastingButton;
- private ImageButton mPlaybackControlButton;
- private ImageButton mCloseButton;
- private MediaRouteExpandCollapseButton mGroupExpandCollapseButton;
-
- private FrameLayout mExpandableAreaLayout;
- private LinearLayout mDialogAreaLayout;
- FrameLayout mDefaultControlLayout;
- private FrameLayout mCustomControlLayout;
- private ImageView mArtView;
- private TextView mTitleView;
- private TextView mSubtitleView;
- private TextView mRouteNameTextView;
-
- private boolean mVolumeControlEnabled = true;
- // Layout for media controllers including play/pause button and the main volume slider.
- private LinearLayout mMediaMainControlLayout;
- private RelativeLayout mPlaybackControlLayout;
- private LinearLayout mVolumeControlLayout;
- private View mDividerView;
-
- OverlayListView mVolumeGroupList;
- VolumeGroupAdapter mVolumeGroupAdapter;
- private List<MediaRouter.RouteInfo> mGroupMemberRoutes;
- Set<MediaRouter.RouteInfo> mGroupMemberRoutesAdded;
- private Set<MediaRouter.RouteInfo> mGroupMemberRoutesRemoved;
- Set<MediaRouter.RouteInfo> mGroupMemberRoutesAnimatingWithBitmap;
- SeekBar mVolumeSlider;
- VolumeChangeListener mVolumeChangeListener;
- MediaRouter.RouteInfo mRouteInVolumeSliderTouched;
- private int mVolumeGroupListItemIconSize;
- private int mVolumeGroupListItemHeight;
- private int mVolumeGroupListMaxHeight;
- private final int mVolumeGroupListPaddingTop;
- Map<MediaRouter.RouteInfo, SeekBar> mVolumeSliderMap;
-
- MediaControllerCompat mMediaController;
- MediaControllerCallback mControllerCallback;
- PlaybackStateCompat mState;
- MediaDescriptionCompat mDescription;
-
- FetchArtTask mFetchArtTask;
- Bitmap mArtIconBitmap;
- Uri mArtIconUri;
- boolean mArtIconIsLoaded;
- Bitmap mArtIconLoadedBitmap;
- int mArtIconBackgroundColor;
-
- boolean mHasPendingUpdate;
- boolean mPendingUpdateAnimationNeeded;
-
- boolean mIsGroupExpanded;
- boolean mIsGroupListAnimating;
- boolean mIsGroupListAnimationPending;
- int mGroupListAnimationDurationMs;
- private int mGroupListFadeInDurationMs;
- private int mGroupListFadeOutDurationMs;
-
- private Interpolator mInterpolator;
- private Interpolator mLinearOutSlowInInterpolator;
- private Interpolator mFastOutSlowInInterpolator;
- private Interpolator mAccelerateDecelerateInterpolator;
-
- final AccessibilityManager mAccessibilityManager;
-
- Runnable mGroupListFadeInAnimation = new Runnable() {
- @Override
- public void run() {
- startGroupListFadeInAnimation();
- }
- };
-
- public MediaRouteControllerDialog(Context context) {
- this(context, 0);
- }
-
- public MediaRouteControllerDialog(Context context, int theme) {
- // TODO (b/72975976): Avoid to use ContextThemeWrapper with app context and lib theme.
- super(new ContextThemeWrapper(context, ApiHelper.getLibTheme(context,
- MediaRouterThemeHelper.getRouterThemeId(context))), theme);
- mContext = getContext();
-
- mControllerCallback = new MediaControllerCallback();
- mRouter = MediaRouter.getInstance(mContext);
- mCallback = new MediaRouterCallback();
- mRoute = mRouter.getSelectedRoute();
- setMediaSession(mRouter.getMediaSessionToken());
- mVolumeGroupListPaddingTop = ApiHelper.getLibResources(context).getDimensionPixelSize(
- R.dimen.mr_controller_volume_group_list_padding_top);
- mAccessibilityManager =
- (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
- mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(
- mContext, android.R.interpolator.linear_out_slow_in);
- mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(
- mContext, android.R.interpolator.fast_out_slow_in);
- mAccelerateDecelerateInterpolator = new AccelerateDecelerateInterpolator();
- }
-
- /**
- * Gets the route that this dialog is controlling.
- */
- public MediaRouter.RouteInfo getRoute() {
- return mRoute;
- }
-
- private MediaRouter.RouteGroup getGroup() {
- if (mRoute instanceof MediaRouter.RouteGroup) {
- return (MediaRouter.RouteGroup) mRoute;
- }
- return null;
- }
-
- /**
- * Provides the subclass an opportunity to create a view that will replace the default media
- * controls for the currently playing content.
- *
- * @param savedInstanceState The dialog's saved instance state.
- * @return The media control view, or null if none.
- */
- public View onCreateMediaControlView(Bundle savedInstanceState) {
- return null;
- }
-
- /**
- * Gets the media control view that was created by {@link #onCreateMediaControlView(Bundle)}.
- *
- * @return The media control view, or null if none.
- */
- public View getMediaControlView() {
- return mCustomControlView;
- }
-
- /**
- * Sets whether to enable the volume slider and volume control using the volume keys
- * when the route supports it.
- * <p>
- * The default value is true.
- * </p>
- */
- public void setVolumeControlEnabled(boolean enable) {
- if (mVolumeControlEnabled != enable) {
- mVolumeControlEnabled = enable;
- if (mCreated) {
- update(false);
- }
- }
- }
-
- /**
- * Returns whether to enable the volume slider and volume control using the volume keys
- * when the route supports it.
- */
- public boolean isVolumeControlEnabled() {
- return mVolumeControlEnabled;
- }
-
- /**
- * Set the session to use for metadata and transport controls. The dialog
- * will listen to changes on this session and update the UI automatically in
- * response to changes.
- *
- * @param sessionToken The token for the session to use.
- */
- private void setMediaSession(MediaSessionCompat.Token sessionToken) {
- if (mMediaController != null) {
- mMediaController.unregisterCallback(mControllerCallback);
- mMediaController = null;
- }
- if (sessionToken == null) {
- return;
- }
- if (!mAttachedToWindow) {
- return;
- }
- try {
- mMediaController = new MediaControllerCompat(mContext, sessionToken);
- } catch (RemoteException e) {
- Log.e(TAG, "Error creating media controller in setMediaSession.", e);
- }
- if (mMediaController != null) {
- mMediaController.registerCallback(mControllerCallback);
- }
- MediaMetadataCompat metadata = mMediaController == null ? null
- : mMediaController.getMetadata();
- mDescription = metadata == null ? null : metadata.getDescription();
- mState = mMediaController == null ? null : mMediaController.getPlaybackState();
- updateArtIconIfNeeded();
- update(false);
- }
-
- /**
- * Gets the session to use for metadata and transport controls.
- *
- * @return The token for the session to use or null if none.
- */
- public MediaSessionCompat.Token getMediaSession() {
- return mMediaController == null ? null : mMediaController.getSessionToken();
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- getWindow().setBackgroundDrawableResource(android.R.color.transparent);
-
- setContentView(ApiHelper.inflateLibLayout(mContext,
- ApiHelper.getLibTheme(mContext, MediaRouterThemeHelper.getRouterThemeId(mContext)),
- R.layout.mr_controller_material_dialog_b));
-
- // Remove the neutral button.
- findViewById(BUTTON_NEUTRAL_RES_ID).setVisibility(View.GONE);
-
- ClickListener listener = new ClickListener();
-
- mExpandableAreaLayout = findViewById(R.id.mr_expandable_area);
- mExpandableAreaLayout.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- dismiss();
- }
- });
- mDialogAreaLayout = findViewById(R.id.mr_dialog_area);
- mDialogAreaLayout.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // Eat unhandled touch events.
- }
- });
- int color = MediaRouterThemeHelper.getButtonTextColor(mContext);
- mDisconnectButton = findViewById(BUTTON_DISCONNECT_RES_ID);
- mDisconnectButton.setText(
- ApiHelper.getLibResources(mContext).getString(R.string.mr_controller_disconnect));
- mDisconnectButton.setTextColor(color);
- mDisconnectButton.setOnClickListener(listener);
-
- mStopCastingButton = findViewById(BUTTON_STOP_RES_ID);
- mStopCastingButton.setText(
- ApiHelper.getLibResources(mContext).getString(R.string.mr_controller_stop_casting));
- mStopCastingButton.setTextColor(color);
- mStopCastingButton.setOnClickListener(listener);
-
- mRouteNameTextView = findViewById(R.id.mr_name);
- mCloseButton = findViewById(R.id.mr_close);
- mCloseButton.setOnClickListener(listener);
- mCustomControlLayout = findViewById(R.id.mr_custom_control);
- mDefaultControlLayout = findViewById(R.id.mr_default_control);
-
- // Start the session activity when a content item (album art, title or subtitle) is clicked.
- View.OnClickListener onClickListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mMediaController != null) {
- PendingIntent pi = mMediaController.getSessionActivity();
- if (pi != null) {
- try {
- pi.send();
- dismiss();
- } catch (PendingIntent.CanceledException e) {
- Log.e(TAG, pi + " was not sent, it had been canceled.");
- }
- }
- }
- }
- };
- mArtView = findViewById(R.id.mr_art);
- mArtView.setOnClickListener(onClickListener);
- findViewById(R.id.mr_control_title_container).setOnClickListener(onClickListener);
-
- mMediaMainControlLayout = findViewById(R.id.mr_media_main_control);
- mDividerView = findViewById(R.id.mr_control_divider);
-
- mPlaybackControlLayout = findViewById(R.id.mr_playback_control);
- mTitleView = findViewById(R.id.mr_control_title);
- mSubtitleView = findViewById(R.id.mr_control_subtitle);
- mPlaybackControlButton = findViewById(R.id.mr_control_playback_ctrl);
- mPlaybackControlButton.setOnClickListener(listener);
-
- mVolumeControlLayout = findViewById(R.id.mr_volume_control);
- mVolumeControlLayout.setVisibility(View.GONE);
- mVolumeSlider = findViewById(R.id.mr_volume_slider);
- mVolumeSlider.setTag(mRoute);
- mVolumeChangeListener = new VolumeChangeListener();
- mVolumeSlider.setOnSeekBarChangeListener(mVolumeChangeListener);
-
- mVolumeGroupList = findViewById(R.id.mr_volume_group_list);
- mGroupMemberRoutes = new ArrayList<MediaRouter.RouteInfo>();
- mVolumeGroupAdapter = new VolumeGroupAdapter(mVolumeGroupList.getContext(),
- mGroupMemberRoutes);
- mVolumeGroupList.setAdapter(mVolumeGroupAdapter);
- mGroupMemberRoutesAnimatingWithBitmap = new HashSet<>();
-
- MediaRouterThemeHelper.setMediaControlsBackgroundColor(mContext,
- mMediaMainControlLayout, mVolumeGroupList, getGroup() != null);
- MediaRouterThemeHelper.setVolumeSliderColor(mContext,
- (MediaRouteVolumeSlider) mVolumeSlider, mMediaMainControlLayout);
- mVolumeSliderMap = new HashMap<>();
- mVolumeSliderMap.put(mRoute, mVolumeSlider);
-
- mGroupExpandCollapseButton =
- findViewById(R.id.mr_group_expand_collapse);
- mGroupExpandCollapseButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mIsGroupExpanded = !mIsGroupExpanded;
- if (mIsGroupExpanded) {
- mVolumeGroupList.setVisibility(View.VISIBLE);
- }
- loadInterpolator();
- updateLayoutHeight(true);
- }
- });
- loadInterpolator();
- mGroupListAnimationDurationMs = ApiHelper.getLibResources(mContext).getInteger(
- R.integer.mr_controller_volume_group_list_animation_duration_ms);
- mGroupListFadeInDurationMs = ApiHelper.getLibResources(mContext).getInteger(
- R.integer.mr_controller_volume_group_list_fade_in_duration_ms);
- mGroupListFadeOutDurationMs = ApiHelper.getLibResources(mContext).getInteger(
- R.integer.mr_controller_volume_group_list_fade_out_duration_ms);
-
- mCustomControlView = onCreateMediaControlView(savedInstanceState);
- if (mCustomControlView != null) {
- mCustomControlLayout.addView(mCustomControlView);
- mCustomControlLayout.setVisibility(View.VISIBLE);
- }
- mCreated = true;
- updateLayout();
- }
-
- /**
- * Sets the width of the dialog. Also called when configuration changes.
- */
- void updateLayout() {
- int width = MediaRouteDialogHelper.getDialogWidth(mContext);
- getWindow().setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT);
-
- View decorView = getWindow().getDecorView();
- mDialogContentWidth = width - decorView.getPaddingLeft() - decorView.getPaddingRight();
-
- Resources res = ApiHelper.getLibResources(mContext);
- mVolumeGroupListItemIconSize = res.getDimensionPixelSize(
- R.dimen.mr_controller_volume_group_list_item_icon_size);
- mVolumeGroupListItemHeight = res.getDimensionPixelSize(
- R.dimen.mr_controller_volume_group_list_item_height);
- mVolumeGroupListMaxHeight = res.getDimensionPixelSize(
- R.dimen.mr_controller_volume_group_list_max_height);
-
- // Fetch art icons again for layout changes to resize it accordingly
- mArtIconBitmap = null;
- mArtIconUri = null;
- updateArtIconIfNeeded();
- update(false);
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
- mAttachedToWindow = true;
-
- mRouter.addCallback(MediaRouteSelector.EMPTY, mCallback,
- MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS);
- setMediaSession(mRouter.getMediaSessionToken());
- }
-
- @Override
- public void onDetachedFromWindow() {
- mRouter.removeCallback(mCallback);
- setMediaSession(null);
- mAttachedToWindow = false;
- super.onDetachedFromWindow();
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
- || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
- mRoute.requestUpdateVolume(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ? -1 : 1);
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
- || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
- return true;
- }
- return super.onKeyUp(keyCode, event);
- }
-
- void update(boolean animate) {
- // Defer dialog updates if a user is adjusting a volume in the list
- if (mRouteInVolumeSliderTouched != null) {
- mHasPendingUpdate = true;
- mPendingUpdateAnimationNeeded |= animate;
- return;
- }
- mHasPendingUpdate = false;
- mPendingUpdateAnimationNeeded = false;
- if (!mRoute.isSelected() || mRoute.isDefaultOrBluetooth()) {
- dismiss();
- return;
- }
- if (!mCreated) {
- return;
- }
-
- mRouteNameTextView.setText(mRoute.getName());
- mDisconnectButton.setVisibility(mRoute.canDisconnect() ? View.VISIBLE : View.GONE);
- if (mCustomControlView == null && mArtIconIsLoaded) {
- if (isBitmapRecycled(mArtIconLoadedBitmap)) {
- Log.w(TAG, "Can't set artwork image with recycled bitmap: " + mArtIconLoadedBitmap);
- } else {
- mArtView.setImageBitmap(mArtIconLoadedBitmap);
- mArtView.setBackgroundColor(mArtIconBackgroundColor);
- }
- clearLoadedBitmap();
- }
- updateVolumeControlLayout();
- updatePlaybackControlLayout();
- updateLayoutHeight(animate);
- }
-
- private boolean isBitmapRecycled(Bitmap bitmap) {
- return bitmap != null && bitmap.isRecycled();
- }
-
- private boolean canShowPlaybackControlLayout() {
- return mCustomControlView == null && (mDescription != null || mState != null);
- }
-
- /**
- * Returns the height of main media controller which includes playback control and master
- * volume control.
- */
- private int getMainControllerHeight(boolean showPlaybackControl) {
- int height = 0;
- if (showPlaybackControl || mVolumeControlLayout.getVisibility() == View.VISIBLE) {
- height += mMediaMainControlLayout.getPaddingTop()
- + mMediaMainControlLayout.getPaddingBottom();
- if (showPlaybackControl) {
- height += mPlaybackControlLayout.getMeasuredHeight();
- }
- if (mVolumeControlLayout.getVisibility() == View.VISIBLE) {
- height += mVolumeControlLayout.getMeasuredHeight();
- }
- if (showPlaybackControl && mVolumeControlLayout.getVisibility() == View.VISIBLE) {
- height += mDividerView.getMeasuredHeight();
- }
- }
- return height;
- }
-
- private void updateMediaControlVisibility(boolean canShowPlaybackControlLayout) {
- // TODO: Update the top and bottom padding of the control layout according to the display
- // height.
- mDividerView.setVisibility((mVolumeControlLayout.getVisibility() == View.VISIBLE
- && canShowPlaybackControlLayout) ? View.VISIBLE : View.GONE);
- mMediaMainControlLayout.setVisibility((mVolumeControlLayout.getVisibility() == View.GONE
- && !canShowPlaybackControlLayout) ? View.GONE : View.VISIBLE);
- }
-
- void updateLayoutHeight(final boolean animate) {
- // We need to defer the update until the first layout has occurred, as we don't yet know the
- // overall visible display size in which the window this view is attached to has been
- // positioned in.
- mDefaultControlLayout.requestLayout();
- ViewTreeObserver observer = mDefaultControlLayout.getViewTreeObserver();
- observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mDefaultControlLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
- if (mIsGroupListAnimating) {
- mIsGroupListAnimationPending = true;
- } else {
- updateLayoutHeightInternal(animate);
- }
- }
- });
- }
-
- /**
- * Updates the height of views and hide artwork or metadata if space is limited.
- */
- void updateLayoutHeightInternal(boolean animate) {
- // Measure the size of widgets and get the height of main components.
- int oldHeight = getLayoutHeight(mMediaMainControlLayout);
- setLayoutHeight(mMediaMainControlLayout, ViewGroup.LayoutParams.MATCH_PARENT);
- updateMediaControlVisibility(canShowPlaybackControlLayout());
- View decorView = getWindow().getDecorView();
- decorView.measure(
- MeasureSpec.makeMeasureSpec(getWindow().getAttributes().width, MeasureSpec.EXACTLY),
- MeasureSpec.UNSPECIFIED);
- setLayoutHeight(mMediaMainControlLayout, oldHeight);
- int artViewHeight = 0;
- if (mCustomControlView == null && mArtView.getDrawable() instanceof BitmapDrawable) {
- Bitmap art = ((BitmapDrawable) mArtView.getDrawable()).getBitmap();
- if (art != null) {
- artViewHeight = getDesiredArtHeight(art.getWidth(), art.getHeight());
- mArtView.setScaleType(art.getWidth() >= art.getHeight()
- ? ImageView.ScaleType.FIT_XY : ImageView.ScaleType.FIT_CENTER);
- }
- }
- int mainControllerHeight = getMainControllerHeight(canShowPlaybackControlLayout());
- int volumeGroupListCount = mGroupMemberRoutes.size();
- // Scale down volume group list items in landscape mode.
- int expandedGroupListHeight = getGroup() == null ? 0 :
- mVolumeGroupListItemHeight * getGroup().getRoutes().size();
- if (volumeGroupListCount > 0) {
- expandedGroupListHeight += mVolumeGroupListPaddingTop;
- }
- expandedGroupListHeight = Math.min(expandedGroupListHeight, mVolumeGroupListMaxHeight);
- int visibleGroupListHeight = mIsGroupExpanded ? expandedGroupListHeight : 0;
-
- int desiredControlLayoutHeight =
- Math.max(artViewHeight, visibleGroupListHeight) + mainControllerHeight;
- Rect visibleRect = new Rect();
- decorView.getWindowVisibleDisplayFrame(visibleRect);
- // Height of non-control views in decor view.
- // This includes title bar, button bar, and dialog's vertical padding which should be
- // always shown.
- int nonControlViewHeight = mDialogAreaLayout.getMeasuredHeight()
- - mDefaultControlLayout.getMeasuredHeight();
- // Maximum allowed height for controls to fit screen.
- int maximumControlViewHeight = visibleRect.height() - nonControlViewHeight;
-
- // Show artwork if it fits the screen.
- if (mCustomControlView == null && artViewHeight > 0
- && desiredControlLayoutHeight <= maximumControlViewHeight) {
- mArtView.setVisibility(View.VISIBLE);
- setLayoutHeight(mArtView, artViewHeight);
- } else {
- if (getLayoutHeight(mVolumeGroupList) + mMediaMainControlLayout.getMeasuredHeight()
- >= mDefaultControlLayout.getMeasuredHeight()) {
- mArtView.setVisibility(View.GONE);
- }
- artViewHeight = 0;
- desiredControlLayoutHeight = visibleGroupListHeight + mainControllerHeight;
- }
- // Show the playback control if it fits the screen.
- if (canShowPlaybackControlLayout()
- && desiredControlLayoutHeight <= maximumControlViewHeight) {
- mPlaybackControlLayout.setVisibility(View.VISIBLE);
- } else {
- mPlaybackControlLayout.setVisibility(View.GONE);
- }
- updateMediaControlVisibility(mPlaybackControlLayout.getVisibility() == View.VISIBLE);
- mainControllerHeight = getMainControllerHeight(
- mPlaybackControlLayout.getVisibility() == View.VISIBLE);
- desiredControlLayoutHeight =
- Math.max(artViewHeight, visibleGroupListHeight) + mainControllerHeight;
-
- // Limit the volume group list height to fit the screen.
- if (desiredControlLayoutHeight > maximumControlViewHeight) {
- visibleGroupListHeight -= (desiredControlLayoutHeight - maximumControlViewHeight);
- desiredControlLayoutHeight = maximumControlViewHeight;
- }
- // Update the layouts with the computed heights.
- mMediaMainControlLayout.clearAnimation();
- mVolumeGroupList.clearAnimation();
- mDefaultControlLayout.clearAnimation();
- if (animate) {
- animateLayoutHeight(mMediaMainControlLayout, mainControllerHeight);
- animateLayoutHeight(mVolumeGroupList, visibleGroupListHeight);
- animateLayoutHeight(mDefaultControlLayout, desiredControlLayoutHeight);
- } else {
- setLayoutHeight(mMediaMainControlLayout, mainControllerHeight);
- setLayoutHeight(mVolumeGroupList, visibleGroupListHeight);
- setLayoutHeight(mDefaultControlLayout, desiredControlLayoutHeight);
- }
- // Maximize the window size with a transparent layout in advance for smooth animation.
- setLayoutHeight(mExpandableAreaLayout, visibleRect.height());
- rebuildVolumeGroupList(animate);
- }
-
- void updateVolumeGroupItemHeight(View item) {
- LinearLayout container = (LinearLayout) item.findViewById(R.id.volume_item_container);
- setLayoutHeight(container, mVolumeGroupListItemHeight);
- View icon = item.findViewById(R.id.mr_volume_item_icon);
- ViewGroup.LayoutParams lp = icon.getLayoutParams();
- lp.width = mVolumeGroupListItemIconSize;
- lp.height = mVolumeGroupListItemIconSize;
- icon.setLayoutParams(lp);
- }
-
- private void animateLayoutHeight(final View view, int targetHeight) {
- final int startValue = getLayoutHeight(view);
- final int endValue = targetHeight;
- Animation anim = new Animation() {
- @Override
- protected void applyTransformation(float interpolatedTime, Transformation t) {
- int height = startValue - (int) ((startValue - endValue) * interpolatedTime);
- setLayoutHeight(view, height);
- }
- };
- anim.setDuration(mGroupListAnimationDurationMs);
- if (android.os.Build.VERSION.SDK_INT >= 21) {
- anim.setInterpolator(mInterpolator);
- }
- view.startAnimation(anim);
- }
-
- void loadInterpolator() {
- mInterpolator =
- mIsGroupExpanded ? mLinearOutSlowInInterpolator : mFastOutSlowInInterpolator;
- }
-
- private void updateVolumeControlLayout() {
- if (isVolumeControlAvailable(mRoute)) {
- if (mVolumeControlLayout.getVisibility() == View.GONE) {
- mVolumeControlLayout.setVisibility(View.VISIBLE);
- mVolumeSlider.setMax(mRoute.getVolumeMax());
- mVolumeSlider.setProgress(mRoute.getVolume());
- mGroupExpandCollapseButton.setVisibility(getGroup() == null ? View.GONE
- : View.VISIBLE);
- }
- } else {
- mVolumeControlLayout.setVisibility(View.GONE);
- }
- }
-
- private void rebuildVolumeGroupList(boolean animate) {
- List<MediaRouter.RouteInfo> routes = getGroup() == null ? null : getGroup().getRoutes();
- if (routes == null) {
- mGroupMemberRoutes.clear();
- mVolumeGroupAdapter.notifyDataSetChanged();
- } else if (MediaRouteDialogHelper.listUnorderedEquals(mGroupMemberRoutes, routes)) {
- mVolumeGroupAdapter.notifyDataSetChanged();
- } else {
- HashMap<MediaRouter.RouteInfo, Rect> previousRouteBoundMap = animate
- ? MediaRouteDialogHelper.getItemBoundMap(mVolumeGroupList, mVolumeGroupAdapter)
- : null;
- HashMap<MediaRouter.RouteInfo, BitmapDrawable> previousRouteBitmapMap = animate
- ? MediaRouteDialogHelper.getItemBitmapMap(mContext, mVolumeGroupList,
- mVolumeGroupAdapter) : null;
- mGroupMemberRoutesAdded =
- MediaRouteDialogHelper.getItemsAdded(mGroupMemberRoutes, routes);
- mGroupMemberRoutesRemoved = MediaRouteDialogHelper.getItemsRemoved(mGroupMemberRoutes,
- routes);
- mGroupMemberRoutes.addAll(0, mGroupMemberRoutesAdded);
- mGroupMemberRoutes.removeAll(mGroupMemberRoutesRemoved);
- mVolumeGroupAdapter.notifyDataSetChanged();
- if (animate && mIsGroupExpanded
- && mGroupMemberRoutesAdded.size() + mGroupMemberRoutesRemoved.size() > 0) {
- animateGroupListItems(previousRouteBoundMap, previousRouteBitmapMap);
- } else {
- mGroupMemberRoutesAdded = null;
- mGroupMemberRoutesRemoved = null;
- }
- }
- }
-
- private void animateGroupListItems(final Map<MediaRouter.RouteInfo, Rect> previousRouteBoundMap,
- final Map<MediaRouter.RouteInfo, BitmapDrawable> previousRouteBitmapMap) {
- mVolumeGroupList.setEnabled(false);
- mVolumeGroupList.requestLayout();
- mIsGroupListAnimating = true;
- ViewTreeObserver observer = mVolumeGroupList.getViewTreeObserver();
- observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mVolumeGroupList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
- animateGroupListItemsInternal(previousRouteBoundMap, previousRouteBitmapMap);
- }
- });
- }
-
- void animateGroupListItemsInternal(
- Map<MediaRouter.RouteInfo, Rect> previousRouteBoundMap,
- Map<MediaRouter.RouteInfo, BitmapDrawable> previousRouteBitmapMap) {
- if (mGroupMemberRoutesAdded == null || mGroupMemberRoutesRemoved == null) {
- return;
- }
- int groupSizeDelta = mGroupMemberRoutesAdded.size() - mGroupMemberRoutesRemoved.size();
- boolean listenerRegistered = false;
- Animation.AnimationListener listener = new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- mVolumeGroupList.startAnimationAll();
- mVolumeGroupList.postDelayed(mGroupListFadeInAnimation,
- mGroupListAnimationDurationMs);
- }
-
- @Override
- public void onAnimationEnd(Animation animation) { }
-
- @Override
- public void onAnimationRepeat(Animation animation) { }
- };
-
- // Animate visible items from previous positions to current positions except routes added
- // just before. Added routes will remain hidden until translate animation finishes.
- int first = mVolumeGroupList.getFirstVisiblePosition();
- for (int i = 0; i < mVolumeGroupList.getChildCount(); ++i) {
- View view = mVolumeGroupList.getChildAt(i);
- int position = first + i;
- MediaRouter.RouteInfo route = mVolumeGroupAdapter.getItem(position);
- Rect previousBounds = previousRouteBoundMap.get(route);
- int currentTop = view.getTop();
- int previousTop = previousBounds != null ? previousBounds.top
- : (currentTop + mVolumeGroupListItemHeight * groupSizeDelta);
- AnimationSet animSet = new AnimationSet(true);
- if (mGroupMemberRoutesAdded != null && mGroupMemberRoutesAdded.contains(route)) {
- previousTop = currentTop;
- Animation alphaAnim = new AlphaAnimation(0.0f, 0.0f);
- alphaAnim.setDuration(mGroupListFadeInDurationMs);
- animSet.addAnimation(alphaAnim);
- }
- Animation translationAnim = new TranslateAnimation(0, 0, previousTop - currentTop, 0);
- translationAnim.setDuration(mGroupListAnimationDurationMs);
- animSet.addAnimation(translationAnim);
- animSet.setFillAfter(true);
- animSet.setFillEnabled(true);
- animSet.setInterpolator(mInterpolator);
- if (!listenerRegistered) {
- listenerRegistered = true;
- animSet.setAnimationListener(listener);
- }
- view.clearAnimation();
- view.startAnimation(animSet);
- previousRouteBoundMap.remove(route);
- previousRouteBitmapMap.remove(route);
- }
-
- // If a member route doesn't exist any longer, it can be either removed or moved out of the
- // ListView layout boundary. In this case, use the previously captured bitmaps for
- // animation.
- for (Map.Entry<MediaRouter.RouteInfo, BitmapDrawable> item
- : previousRouteBitmapMap.entrySet()) {
- final MediaRouter.RouteInfo route = item.getKey();
- final BitmapDrawable bitmap = item.getValue();
- final Rect bounds = previousRouteBoundMap.get(route);
- OverlayObject object = null;
- if (mGroupMemberRoutesRemoved.contains(route)) {
- object = new OverlayObject(bitmap, bounds).setAlphaAnimation(1.0f, 0.0f)
- .setDuration(mGroupListFadeOutDurationMs)
- .setInterpolator(mInterpolator);
- } else {
- int deltaY = groupSizeDelta * mVolumeGroupListItemHeight;
- object = new OverlayObject(bitmap, bounds).setTranslateYAnimation(deltaY)
- .setDuration(mGroupListAnimationDurationMs)
- .setInterpolator(mInterpolator)
- .setAnimationEndListener(new OverlayObject.OnAnimationEndListener() {
- @Override
- public void onAnimationEnd() {
- mGroupMemberRoutesAnimatingWithBitmap.remove(route);
- mVolumeGroupAdapter.notifyDataSetChanged();
- }
- });
- mGroupMemberRoutesAnimatingWithBitmap.add(route);
- }
- mVolumeGroupList.addOverlayObject(object);
- }
- }
-
- void startGroupListFadeInAnimation() {
- clearGroupListAnimation(true);
- mVolumeGroupList.requestLayout();
- ViewTreeObserver observer = mVolumeGroupList.getViewTreeObserver();
- observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mVolumeGroupList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
- startGroupListFadeInAnimationInternal();
- }
- });
- }
-
- void startGroupListFadeInAnimationInternal() {
- if (mGroupMemberRoutesAdded != null && mGroupMemberRoutesAdded.size() != 0) {
- fadeInAddedRoutes();
- } else {
- finishAnimation(true);
- }
- }
-
- void finishAnimation(boolean animate) {
- mGroupMemberRoutesAdded = null;
- mGroupMemberRoutesRemoved = null;
- mIsGroupListAnimating = false;
- if (mIsGroupListAnimationPending) {
- mIsGroupListAnimationPending = false;
- updateLayoutHeight(animate);
- }
- mVolumeGroupList.setEnabled(true);
- }
-
- private void fadeInAddedRoutes() {
- Animation.AnimationListener listener = new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) { }
-
- @Override
- public void onAnimationEnd(Animation animation) {
- finishAnimation(true);
- }
-
- @Override
- public void onAnimationRepeat(Animation animation) { }
- };
- boolean listenerRegistered = false;
- int first = mVolumeGroupList.getFirstVisiblePosition();
- for (int i = 0; i < mVolumeGroupList.getChildCount(); ++i) {
- View view = mVolumeGroupList.getChildAt(i);
- int position = first + i;
- MediaRouter.RouteInfo route = mVolumeGroupAdapter.getItem(position);
- if (mGroupMemberRoutesAdded.contains(route)) {
- Animation alphaAnim = new AlphaAnimation(0.0f, 1.0f);
- alphaAnim.setDuration(mGroupListFadeInDurationMs);
- alphaAnim.setFillEnabled(true);
- alphaAnim.setFillAfter(true);
- if (!listenerRegistered) {
- listenerRegistered = true;
- alphaAnim.setAnimationListener(listener);
- }
- view.clearAnimation();
- view.startAnimation(alphaAnim);
- }
- }
- }
-
- void clearGroupListAnimation(boolean exceptAddedRoutes) {
- int first = mVolumeGroupList.getFirstVisiblePosition();
- for (int i = 0; i < mVolumeGroupList.getChildCount(); ++i) {
- View view = mVolumeGroupList.getChildAt(i);
- int position = first + i;
- MediaRouter.RouteInfo route = mVolumeGroupAdapter.getItem(position);
- if (exceptAddedRoutes && mGroupMemberRoutesAdded != null
- && mGroupMemberRoutesAdded.contains(route)) {
- continue;
- }
- LinearLayout container = (LinearLayout) view.findViewById(R.id.volume_item_container);
- container.setVisibility(View.VISIBLE);
- AnimationSet animSet = new AnimationSet(true);
- Animation alphaAnim = new AlphaAnimation(1.0f, 1.0f);
- alphaAnim.setDuration(0);
- animSet.addAnimation(alphaAnim);
- Animation translationAnim = new TranslateAnimation(0, 0, 0, 0);
- translationAnim.setDuration(0);
- animSet.setFillAfter(true);
- animSet.setFillEnabled(true);
- view.clearAnimation();
- view.startAnimation(animSet);
- }
- mVolumeGroupList.stopAnimationAll();
- if (!exceptAddedRoutes) {
- finishAnimation(false);
- }
- }
-
- private void updatePlaybackControlLayout() {
- if (canShowPlaybackControlLayout()) {
- CharSequence title = mDescription == null ? null : mDescription.getTitle();
- boolean hasTitle = !TextUtils.isEmpty(title);
-
- CharSequence subtitle = mDescription == null ? null : mDescription.getSubtitle();
- boolean hasSubtitle = !TextUtils.isEmpty(subtitle);
-
- boolean showTitle = false;
- boolean showSubtitle = false;
- if (mRoute.getPresentationDisplayId()
- != MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE) {
- // The user is currently casting screen.
- mTitleView.setText(ApiHelper.getLibResources(mContext).getString(
- R.string.mr_controller_casting_screen));
- showTitle = true;
- } else if (mState == null || mState.getState() == PlaybackStateCompat.STATE_NONE) {
- // Show "No media selected" as we don't yet know the playback state.
- mTitleView.setText(ApiHelper.getLibResources(mContext).getString(
- R.string.mr_controller_no_media_selected));
- showTitle = true;
- } else if (!hasTitle && !hasSubtitle) {
- mTitleView.setText(ApiHelper.getLibResources(mContext).getString(
- R.string.mr_controller_no_info_available));
- showTitle = true;
- } else {
- if (hasTitle) {
- mTitleView.setText(title);
- showTitle = true;
- }
- if (hasSubtitle) {
- mSubtitleView.setText(subtitle);
- showSubtitle = true;
- }
- }
- mTitleView.setVisibility(showTitle ? View.VISIBLE : View.GONE);
- mSubtitleView.setVisibility(showSubtitle ? View.VISIBLE : View.GONE);
-
- if (mState != null) {
- boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_BUFFERING
- || mState.getState() == PlaybackStateCompat.STATE_PLAYING;
- Context playbackControlButtonContext = mPlaybackControlButton.getContext();
- boolean visible = true;
- int iconDrawableAttr = 0;
- int iconDescResId = 0;
- if (isPlaying && isPauseActionSupported()) {
- iconDrawableAttr = R.attr.mediaRoutePauseDrawable;
- iconDescResId = R.string.mr_controller_pause;
- } else if (isPlaying && isStopActionSupported()) {
- iconDrawableAttr = R.attr.mediaRouteStopDrawable;
- iconDescResId = R.string.mr_controller_stop;
- } else if (!isPlaying && isPlayActionSupported()) {
- iconDrawableAttr = R.attr.mediaRoutePlayDrawable;
- iconDescResId = R.string.mr_controller_play;
- } else {
- visible = false;
- }
- mPlaybackControlButton.setVisibility(visible ? View.VISIBLE : View.GONE);
- if (visible) {
- mPlaybackControlButton.setImageResource(
- MediaRouterThemeHelper.getThemeResource(
- playbackControlButtonContext, iconDrawableAttr));
- mPlaybackControlButton.setContentDescription(
- playbackControlButtonContext.getResources()
- .getText(iconDescResId));
- }
- }
- }
- }
-
- private boolean isPlayActionSupported() {
- return (mState.getActions() & (ACTION_PLAY | ACTION_PLAY_PAUSE)) != 0;
- }
-
- private boolean isPauseActionSupported() {
- return (mState.getActions() & (ACTION_PAUSE | ACTION_PLAY_PAUSE)) != 0;
- }
-
- private boolean isStopActionSupported() {
- return (mState.getActions() & ACTION_STOP) != 0;
- }
-
- boolean isVolumeControlAvailable(MediaRouter.RouteInfo route) {
- return mVolumeControlEnabled && route.getVolumeHandling()
- == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE;
- }
-
- private static int getLayoutHeight(View view) {
- return view.getLayoutParams().height;
- }
-
- static void setLayoutHeight(View view, int height) {
- ViewGroup.LayoutParams lp = view.getLayoutParams();
- lp.height = height;
- view.setLayoutParams(lp);
- }
-
- private static boolean uriEquals(Uri uri1, Uri uri2) {
- if (uri1 != null && uri1.equals(uri2)) {
- return true;
- } else if (uri1 == null && uri2 == null) {
- return true;
- }
- return false;
- }
-
- /**
- * Returns desired art height to fit into controller dialog.
- */
- int getDesiredArtHeight(int originalWidth, int originalHeight) {
- if (originalWidth >= originalHeight) {
- // For landscape art, fit width to dialog width.
- return (int) ((float) mDialogContentWidth * originalHeight / originalWidth + 0.5f);
- }
- // For portrait art, fit height to 16:9 ratio case's height.
- return (int) ((float) mDialogContentWidth * 9 / 16 + 0.5f);
- }
-
- void updateArtIconIfNeeded() {
- if (mCustomControlView != null || !isIconChanged()) {
- return;
- }
- if (mFetchArtTask != null) {
- mFetchArtTask.cancel(true);
- }
- mFetchArtTask = new FetchArtTask();
- mFetchArtTask.execute();
- }
-
- /**
- * Clear the bitmap loaded by FetchArtTask. Will be called after the loaded bitmaps are applied
- * to artwork, or no longer valid.
- */
- void clearLoadedBitmap() {
- mArtIconIsLoaded = false;
- mArtIconLoadedBitmap = null;
- mArtIconBackgroundColor = 0;
- }
-
- /**
- * Returns whether a new art image is different from an original art image. Compares
- * Bitmap objects first, and then compares URIs only if bitmap is unchanged with
- * a null value.
- */
- private boolean isIconChanged() {
- Bitmap newBitmap = mDescription == null ? null : mDescription.getIconBitmap();
- Uri newUri = mDescription == null ? null : mDescription.getIconUri();
- Bitmap oldBitmap = mFetchArtTask == null ? mArtIconBitmap : mFetchArtTask.getIconBitmap();
- Uri oldUri = mFetchArtTask == null ? mArtIconUri : mFetchArtTask.getIconUri();
- if (oldBitmap != newBitmap) {
- return true;
- } else if (oldBitmap == null && !uriEquals(oldUri, newUri)) {
- return true;
- }
- return false;
- }
-
- private final class MediaRouterCallback extends MediaRouter.Callback {
- MediaRouterCallback() {
- }
-
- @Override
- public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
- update(false);
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) {
- update(true);
- }
-
- @Override
- public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) {
- SeekBar volumeSlider = mVolumeSliderMap.get(route);
- int volume = route.getVolume();
- if (DEBUG) {
- Log.d(TAG, "onRouteVolumeChanged(), route.getVolume:" + volume);
- }
- if (volumeSlider != null && mRouteInVolumeSliderTouched != route) {
- volumeSlider.setProgress(volume);
- }
- }
- }
-
- private final class MediaControllerCallback extends MediaControllerCompat.Callback {
- MediaControllerCallback() {
- }
-
- @Override
- public void onSessionDestroyed() {
- if (mMediaController != null) {
- mMediaController.unregisterCallback(mControllerCallback);
- mMediaController = null;
- }
- }
-
- @Override
- public void onPlaybackStateChanged(PlaybackStateCompat state) {
- mState = state;
- update(false);
- }
-
- @Override
- public void onMetadataChanged(MediaMetadataCompat metadata) {
- mDescription = metadata == null ? null : metadata.getDescription();
- updateArtIconIfNeeded();
- update(false);
- }
- }
-
- private final class ClickListener implements View.OnClickListener {
- ClickListener() {
- }
-
- @Override
- public void onClick(View v) {
- int id = v.getId();
- if (id == BUTTON_STOP_RES_ID || id == BUTTON_DISCONNECT_RES_ID) {
- if (mRoute.isSelected()) {
- mRouter.unselect(id == BUTTON_STOP_RES_ID ?
- MediaRouter.UNSELECT_REASON_STOPPED :
- MediaRouter.UNSELECT_REASON_DISCONNECTED);
- }
- dismiss();
- } else if (id == R.id.mr_control_playback_ctrl) {
- if (mMediaController != null && mState != null) {
- boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_PLAYING;
- int actionDescResId = 0;
- if (isPlaying && isPauseActionSupported()) {
- mMediaController.getTransportControls().pause();
- actionDescResId = R.string.mr_controller_pause;
- } else if (isPlaying && isStopActionSupported()) {
- mMediaController.getTransportControls().stop();
- actionDescResId = R.string.mr_controller_stop;
- } else if (!isPlaying && isPlayActionSupported()){
- mMediaController.getTransportControls().play();
- actionDescResId = R.string.mr_controller_play;
- }
- // Announce the action for accessibility.
- if (mAccessibilityManager != null && mAccessibilityManager.isEnabled()
- && actionDescResId != 0) {
- AccessibilityEvent event = AccessibilityEvent.obtain(
- AccessibilityEventCompat.TYPE_ANNOUNCEMENT);
- event.setPackageName(mContext.getPackageName());
- event.setClassName(getClass().getName());
- event.getText().add(
- ApiHelper.getLibResources(mContext).getString(actionDescResId));
- mAccessibilityManager.sendAccessibilityEvent(event);
- }
- }
- } else if (id == R.id.mr_close) {
- dismiss();
- }
- }
- }
-
- private class VolumeChangeListener implements SeekBar.OnSeekBarChangeListener {
- private final Runnable mStopTrackingTouch = new Runnable() {
- @Override
- public void run() {
- if (mRouteInVolumeSliderTouched != null) {
- mRouteInVolumeSliderTouched = null;
- if (mHasPendingUpdate) {
- update(mPendingUpdateAnimationNeeded);
- }
- }
- }
- };
-
- VolumeChangeListener() {
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- if (mRouteInVolumeSliderTouched != null) {
- mVolumeSlider.removeCallbacks(mStopTrackingTouch);
- }
- mRouteInVolumeSliderTouched = (MediaRouter.RouteInfo) seekBar.getTag();
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- // Defer resetting mVolumeSliderTouched to allow the media route provider
- // a little time to settle into its new state and publish the final
- // volume update.
- mVolumeSlider.postDelayed(mStopTrackingTouch, VOLUME_UPDATE_DELAY_MILLIS);
- }
-
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if (fromUser) {
- MediaRouter.RouteInfo route = (MediaRouter.RouteInfo) seekBar.getTag();
- if (DEBUG) {
- Log.d(TAG, "onProgressChanged(): calling "
- + "MediaRouter.RouteInfo.requestSetVolume(" + progress + ")");
- }
- route.requestSetVolume(progress);
- }
- }
- }
-
- private class VolumeGroupAdapter extends ArrayAdapter<MediaRouter.RouteInfo> {
- final float mDisabledAlpha;
-
- public VolumeGroupAdapter(Context context, List<MediaRouter.RouteInfo> objects) {
- super(context, 0, objects);
- mDisabledAlpha = MediaRouterThemeHelper.getDisabledAlpha(context);
- }
-
- @Override
- public boolean isEnabled(int position) {
- return false;
- }
-
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- View v = convertView;
- if (v == null) {
- v = LayoutInflater.from(parent.getContext()).inflate(
- R.layout.mr_controller_volume_item, parent, false);
- } else {
- updateVolumeGroupItemHeight(v);
- }
-
- MediaRouter.RouteInfo route = getItem(position);
- if (route != null) {
- boolean isEnabled = route.isEnabled();
-
- TextView routeName = (TextView) v.findViewById(R.id.mr_name);
- routeName.setEnabled(isEnabled);
- routeName.setText(route.getName());
-
- MediaRouteVolumeSlider volumeSlider =
- (MediaRouteVolumeSlider) v.findViewById(R.id.mr_volume_slider);
- MediaRouterThemeHelper.setVolumeSliderColor(
- parent.getContext(), volumeSlider, mVolumeGroupList);
- volumeSlider.setTag(route);
- mVolumeSliderMap.put(route, volumeSlider);
- volumeSlider.setHideThumb(!isEnabled);
- volumeSlider.setEnabled(isEnabled);
- if (isEnabled) {
- if (isVolumeControlAvailable(route)) {
- volumeSlider.setMax(route.getVolumeMax());
- volumeSlider.setProgress(route.getVolume());
- volumeSlider.setOnSeekBarChangeListener(mVolumeChangeListener);
- } else {
- volumeSlider.setMax(100);
- volumeSlider.setProgress(100);
- volumeSlider.setEnabled(false);
- }
- }
-
- ImageView volumeItemIcon =
- (ImageView) v.findViewById(R.id.mr_volume_item_icon);
- volumeItemIcon.setAlpha(isEnabled ? 0xFF : (int) (0xFF * mDisabledAlpha));
-
- // If overlay bitmap exists, real view should remain hidden until
- // the animation ends.
- LinearLayout container = (LinearLayout) v.findViewById(R.id.volume_item_container);
- container.setVisibility(mGroupMemberRoutesAnimatingWithBitmap.contains(route)
- ? View.INVISIBLE : View.VISIBLE);
-
- // Routes which are being added will be invisible until animation ends.
- if (mGroupMemberRoutesAdded != null && mGroupMemberRoutesAdded.contains(route)) {
- Animation alphaAnim = new AlphaAnimation(0.0f, 0.0f);
- alphaAnim.setDuration(0);
- alphaAnim.setFillEnabled(true);
- alphaAnim.setFillAfter(true);
- v.clearAnimation();
- v.startAnimation(alphaAnim);
- }
- }
- return v;
- }
- }
-
- private class FetchArtTask extends AsyncTask<Void, Void, Bitmap> {
- // Show animation only when fetching takes a long time.
- private static final long SHOW_ANIM_TIME_THRESHOLD_MILLIS = 120L;
-
- private final Bitmap mIconBitmap;
- private final Uri mIconUri;
- private int mBackgroundColor;
- private long mStartTimeMillis;
-
- FetchArtTask() {
- Bitmap bitmap = mDescription == null ? null : mDescription.getIconBitmap();
- if (isBitmapRecycled(bitmap)) {
- Log.w(TAG, "Can't fetch the given art bitmap because it's already recycled.");
- bitmap = null;
- }
- mIconBitmap = bitmap;
- mIconUri = mDescription == null ? null : mDescription.getIconUri();
- }
-
- public Bitmap getIconBitmap() {
- return mIconBitmap;
- }
-
- public Uri getIconUri() {
- return mIconUri;
- }
-
- @Override
- protected void onPreExecute() {
- mStartTimeMillis = SystemClock.uptimeMillis();
- clearLoadedBitmap();
- }
-
- @Override
- protected Bitmap doInBackground(Void... arg) {
- Bitmap art = null;
- if (mIconBitmap != null) {
- art = mIconBitmap;
- } else if (mIconUri != null) {
- InputStream stream = null;
- try {
- if ((stream = openInputStreamByScheme(mIconUri)) == null) {
- Log.w(TAG, "Unable to open: " + mIconUri);
- return null;
- }
- // Query art size.
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- BitmapFactory.decodeStream(stream, null, options);
- if (options.outWidth == 0 || options.outHeight == 0) {
- return null;
- }
- // Rewind the stream in order to restart art decoding.
- try {
- stream.reset();
- } catch (IOException e) {
- // Failed to rewind the stream, try to reopen it.
- stream.close();
- if ((stream = openInputStreamByScheme(mIconUri)) == null) {
- Log.w(TAG, "Unable to open: " + mIconUri);
- return null;
- }
- }
- // Calculate required size to decode the art and possibly resize it.
- options.inJustDecodeBounds = false;
- int reqHeight = getDesiredArtHeight(options.outWidth, options.outHeight);
- int ratio = options.outHeight / reqHeight;
- options.inSampleSize = Math.max(1, Integer.highestOneBit(ratio));
- if (isCancelled()) {
- return null;
- }
- art = BitmapFactory.decodeStream(stream, null, options);
- } catch (IOException e){
- Log.w(TAG, "Unable to open: " + mIconUri, e);
- } finally {
- if (stream != null) {
- try {
- stream.close();
- } catch (IOException e) {
- }
- }
- }
- }
- if (isBitmapRecycled(art)) {
- Log.w(TAG, "Can't use recycled bitmap: " + art);
- return null;
- }
- if (art != null && art.getWidth() < art.getHeight()) {
- // Portrait art requires dominant color as background color.
- Palette palette = new Palette.Builder(art).maximumColorCount(1).generate();
- mBackgroundColor = palette.getSwatches().isEmpty()
- ? 0 : palette.getSwatches().get(0).getRgb();
- }
- return art;
- }
-
- @Override
- protected void onPostExecute(Bitmap art) {
- mFetchArtTask = null;
- if (!ObjectsCompat.equals(mArtIconBitmap, mIconBitmap)
- || !ObjectsCompat.equals(mArtIconUri, mIconUri)) {
- mArtIconBitmap = mIconBitmap;
- mArtIconLoadedBitmap = art;
- mArtIconUri = mIconUri;
- mArtIconBackgroundColor = mBackgroundColor;
- mArtIconIsLoaded = true;
- long elapsedTimeMillis = SystemClock.uptimeMillis() - mStartTimeMillis;
- // Loaded bitmap will be applied on the next update
- update(elapsedTimeMillis > SHOW_ANIM_TIME_THRESHOLD_MILLIS);
- }
- }
-
- private InputStream openInputStreamByScheme(Uri uri) throws IOException {
- String scheme = uri.getScheme().toLowerCase();
- InputStream stream = null;
- if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)
- || ContentResolver.SCHEME_CONTENT.equals(scheme)
- || ContentResolver.SCHEME_FILE.equals(scheme)) {
- stream = mContext.getContentResolver().openInputStream(uri);
- } else {
- URL url = new URL(uri.toString());
- URLConnection conn = url.openConnection();
- conn.setConnectTimeout(CONNECTION_TIMEOUT_MILLIS);
- conn.setReadTimeout(CONNECTION_TIMEOUT_MILLIS);
- stream = conn.getInputStream();
- }
- return (stream == null) ? null : new BufferedInputStream(stream);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialogFragment.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialogFragment.java
deleted file mode 100644
index 215d74f..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialogFragment.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.os.Bundle;
-
-/**
- * Media route controller dialog fragment.
- * <p>
- * Creates a {@link MediaRouteControllerDialog}. The application may subclass
- * this dialog fragment to customize the media route controller dialog.
- * </p>
- */
-public class MediaRouteControllerDialogFragment extends DialogFragment {
- private MediaRouteControllerDialog mDialog;
- /**
- * Creates a media route controller dialog fragment.
- * <p>
- * All subclasses of this class must also possess a default constructor.
- * </p>
- */
- public MediaRouteControllerDialogFragment() {
- setCancelable(true);
- }
-
- /**
- * Called when the controller dialog is being created.
- * <p>
- * Subclasses may override this method to customize the dialog.
- * </p>
- */
- public MediaRouteControllerDialog onCreateControllerDialog(
- Context context, Bundle savedInstanceState) {
- return new MediaRouteControllerDialog(context);
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- mDialog = onCreateControllerDialog(getContext(), savedInstanceState);
- return mDialog;
- }
-
- @Override
- public void onStop() {
- super.onStop();
- if (mDialog != null) {
- mDialog.clearGroupListAnimation(false);
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- if (mDialog != null) {
- mDialog.updateLayout();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogFactory.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogFactory.java
deleted file mode 100644
index b5ee63e..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogFactory.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import androidx.annotation.NonNull;
-
-/**
- * The media route dialog factory is responsible for creating the media route
- * chooser and controller dialogs as needed.
- * <p>
- * The application can customize the dialogs by providing a subclass of the
- * dialog factory to the {@link MediaRouteButton} using the
- * {@link MediaRouteButton#setDialogFactory setDialogFactory} method.
- * </p>
- */
-public class MediaRouteDialogFactory {
- private static final MediaRouteDialogFactory sDefault = new MediaRouteDialogFactory();
-
- /**
- * Creates a default media route dialog factory.
- */
- public MediaRouteDialogFactory() {
- }
-
- /**
- * Gets the default factory instance.
- *
- * @return The default media route dialog factory, never null.
- */
- @NonNull
- public static MediaRouteDialogFactory getDefault() {
- return sDefault;
- }
-
- /**
- * Called when the chooser dialog is being opened and it is time to create the fragment.
- * <p>
- * Subclasses may override this method to create a customized fragment.
- * </p>
- *
- * @return The media route chooser dialog fragment, must not be null.
- */
- @NonNull
- public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
- return new MediaRouteChooserDialogFragment();
- }
-
- /**
- * Called when the controller dialog is being opened and it is time to create the fragment.
- * <p>
- * Subclasses may override this method to create a customized fragment.
- * </p>
- *
- * @return The media route controller dialog fragment, must not be null.
- */
- @NonNull
- public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
- return new MediaRouteControllerDialogFragment();
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogHelper.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogHelper.java
deleted file mode 100644
index 9aabf7b..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogHelper.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-final class MediaRouteDialogHelper {
- /**
- * The framework should set the dialog width properly, but somehow it doesn't work, hence
- * duplicating a similar logic here to determine the appropriate dialog width.
- */
- public static int getDialogWidth(Context context) {
- DisplayMetrics metrics = ApiHelper.getLibResources(context).getDisplayMetrics();
- boolean isPortrait = metrics.widthPixels < metrics.heightPixels;
-
- TypedValue value = new TypedValue();
- ApiHelper.getLibResources(context).getValue(isPortrait
- ? R.dimen.mr_dialog_fixed_width_minor
- : R.dimen.mr_dialog_fixed_width_major, value, true);
- if (value.type == TypedValue.TYPE_DIMENSION) {
- return (int) value.getDimension(metrics);
- } else if (value.type == TypedValue.TYPE_FRACTION) {
- return (int) value.getFraction(metrics.widthPixels, metrics.widthPixels);
- }
- return ViewGroup.LayoutParams.WRAP_CONTENT;
- }
-
- /**
- * Compares two lists regardless of order.
- *
- * @param list1 A list
- * @param list2 A list to be compared with {@code list1}
- * @return True if two lists have exactly same items regardless of order, false otherwise.
- */
- public static <E> boolean listUnorderedEquals(List<E> list1, List<E> list2) {
- HashSet<E> set1 = new HashSet<>(list1);
- HashSet<E> set2 = new HashSet<>(list2);
- return set1.equals(set2);
- }
-
- /**
- * Compares two lists and returns a set of items which exist
- * after-list but before-list, which means newly added items.
- *
- * @param before A list
- * @param after A list to be compared with {@code before}
- * @return A set of items which contains newly added items while
- * comparing {@code after} to {@code before}.
- */
- public static <E> Set<E> getItemsAdded(List<E> before, List<E> after) {
- HashSet<E> set = new HashSet<>(after);
- set.removeAll(before);
- return set;
- }
-
- /**
- * Compares two lists and returns a set of items which exist
- * before-list but after-list, which means removed items.
- *
- * @param before A list
- * @param after A list to be compared with {@code before}
- * @return A set of items which contains removed items while
- * comparing {@code after} to {@code before}.
- */
- public static <E> Set<E> getItemsRemoved(List<E> before, List<E> after) {
- HashSet<E> set = new HashSet<>(before);
- set.removeAll(after);
- return set;
- }
-
- /**
- * Generates an item-Rect map which indicates where member
- * items are located in the given ListView.
- *
- * @param listView A list view
- * @param adapter An array adapter which contains an array of items.
- * @return A map of items and bounds of their views located in the given list view.
- */
- public static <E> HashMap<E, Rect> getItemBoundMap(ListView listView,
- ArrayAdapter<E> adapter) {
- HashMap<E, Rect> itemBoundMap = new HashMap<>();
- int firstVisiblePosition = listView.getFirstVisiblePosition();
- for (int i = 0; i < listView.getChildCount(); ++i) {
- int position = firstVisiblePosition + i;
- E item = adapter.getItem(position);
- View view = listView.getChildAt(i);
- itemBoundMap.put(item,
- new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()));
- }
- return itemBoundMap;
- }
-
- /**
- * Generates an item-BitmapDrawable map which stores snapshots
- * of member items in the given ListView.
- *
- * @param context A context
- * @param listView A list view
- * @param adapter An array adapter which contains an array of items.
- * @return A map of items and snapshots of their views in the given list view.
- */
- public static <E> HashMap<E, BitmapDrawable> getItemBitmapMap(Context context,
- ListView listView, ArrayAdapter<E> adapter) {
- HashMap<E, BitmapDrawable> itemBitmapMap = new HashMap<>();
- int firstVisiblePosition = listView.getFirstVisiblePosition();
- for (int i = 0; i < listView.getChildCount(); ++i) {
- int position = firstVisiblePosition + i;
- E item = adapter.getItem(position);
- View view = listView.getChildAt(i);
- itemBitmapMap.put(item, getViewBitmap(context, view));
- }
- return itemBitmapMap;
- }
-
- private static BitmapDrawable getViewBitmap(Context context, View view) {
- Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
- Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- view.draw(canvas);
- return new BitmapDrawable(context.getResources(), bitmap);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDiscoveryFragment.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDiscoveryFragment.java
deleted file mode 100644
index 52aecd88..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDiscoveryFragment.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.os.Bundle;
-
-import androidx.fragment.app.Fragment;
-
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-/**
- * Media route discovery fragment.
- * <p>
- * This fragment takes care of registering a callback for media route discovery
- * during the {@link Fragment#onStart onStart()} phase
- * and removing it during the {@link Fragment#onStop onStop()} phase.
- * </p><p>
- * The application must supply a route selector to specify the kinds of routes
- * to discover. The application may also override {@link #onCreateCallback} to
- * provide the {@link MediaRouter} callback to register.
- * </p><p>
- * Note that the discovery callback makes the application be connected with all the
- * {@link androidx.mediarouter.media.MediaRouteProviderService media route provider services}
- * while it is registered.
- * </p>
- */
-public class MediaRouteDiscoveryFragment extends Fragment {
- private final String ARGUMENT_SELECTOR = "selector";
-
- private MediaRouter mRouter;
- private MediaRouteSelector mSelector;
- private MediaRouter.Callback mCallback;
-
- public MediaRouteDiscoveryFragment() {
- }
-
- /**
- * Gets the media router instance.
- */
- public MediaRouter getMediaRouter() {
- ensureRouter();
- return mRouter;
- }
-
- private void ensureRouter() {
- if (mRouter == null) {
- mRouter = MediaRouter.getInstance(getContext());
- }
- }
-
- /**
- * Gets the media route selector for filtering the routes to be discovered.
- *
- * @return The selector, never null.
- */
- public MediaRouteSelector getRouteSelector() {
- ensureRouteSelector();
- return mSelector;
- }
-
- /**
- * Sets the media route selector for filtering the routes to be discovered.
- * This method must be called before the fragment is added.
- *
- * @param selector The selector to set.
- */
- public void setRouteSelector(MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- ensureRouteSelector();
- if (!mSelector.equals(selector)) {
- mSelector = selector;
-
- Bundle args = getArguments();
- if (args == null) {
- args = new Bundle();
- }
- args.putBundle(ARGUMENT_SELECTOR, selector.asBundle());
- setArguments(args);
-
- if (mCallback != null) {
- mRouter.removeCallback(mCallback);
- mRouter.addCallback(mSelector, mCallback, onPrepareCallbackFlags());
- }
- }
- }
-
- private void ensureRouteSelector() {
- if (mSelector == null) {
- Bundle args = getArguments();
- if (args != null) {
- mSelector = MediaRouteSelector.fromBundle(args.getBundle(ARGUMENT_SELECTOR));
- }
- if (mSelector == null) {
- mSelector = MediaRouteSelector.EMPTY;
- }
- }
- }
-
- /**
- * Called to create the {@link androidx.mediarouter.media.MediaRouter.Callback callback}
- * that will be registered.
- * <p>
- * The default callback does nothing. The application may override this method to
- * supply its own callback.
- * </p>
- *
- * @return The new callback, or null if no callback should be registered.
- */
- public MediaRouter.Callback onCreateCallback() {
- return new MediaRouter.Callback() { };
- }
-
- /**
- * Called to prepare the callback flags that will be used when the
- * {@link androidx.mediarouter.media.MediaRouter.Callback callback} is registered.
- * <p>
- * The default implementation returns {@link MediaRouter#CALLBACK_FLAG_REQUEST_DISCOVERY}.
- * </p>
- *
- * @return The desired callback flags.
- */
- public int onPrepareCallbackFlags() {
- return MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY;
- }
-
- @Override
- public void onStart() {
- super.onStart();
-
- ensureRouteSelector();
- ensureRouter();
- mCallback = onCreateCallback();
- if (mCallback != null) {
- mRouter.addCallback(mSelector, mCallback, onPrepareCallbackFlags());
- }
- }
-
- @Override
- public void onStop() {
- if (mCallback != null) {
- mRouter.removeCallback(mCallback);
- mCallback = null;
- }
-
- super.onStop();
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteExpandCollapseButton.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteExpandCollapseButton.java
deleted file mode 100644
index dcca6a0..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteExpandCollapseButton.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.graphics.ColorFilter;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.AnimationDrawable;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ImageButton;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-
-/**
- * Chevron/Caret button to expand/collapse group volume list with animation.
- */
-public class MediaRouteExpandCollapseButton extends ImageButton {
- final AnimationDrawable mExpandAnimationDrawable;
- final AnimationDrawable mCollapseAnimationDrawable;
- final String mExpandGroupDescription;
- final String mCollapseGroupDescription;
- boolean mIsGroupExpanded;
- OnClickListener mListener;
-
- public MediaRouteExpandCollapseButton(Context context) {
- this(context, null);
- }
-
- public MediaRouteExpandCollapseButton(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public MediaRouteExpandCollapseButton(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mExpandAnimationDrawable = (AnimationDrawable)
- ApiHelper.getLibResources(context).getDrawable(R.drawable.mr_group_expand);
- mCollapseAnimationDrawable = (AnimationDrawable)
- ApiHelper.getLibResources(context).getDrawable(R.drawable.mr_group_collapse);
-
- ColorFilter filter = new PorterDuffColorFilter(
- MediaRouterThemeHelper.getControllerColor(context, defStyleAttr),
- PorterDuff.Mode.SRC_IN);
- mExpandAnimationDrawable.setColorFilter(filter);
- mCollapseAnimationDrawable.setColorFilter(filter);
-
- mExpandGroupDescription =
- ApiHelper.getLibResources(context).getString(R.string.mr_controller_expand_group);
- mCollapseGroupDescription =
- ApiHelper.getLibResources(context).getString(R.string.mr_controller_collapse_group);
-
- setImageDrawable(mExpandAnimationDrawable.getFrame(0));
- setContentDescription(mExpandGroupDescription);
-
- super.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- mIsGroupExpanded = !mIsGroupExpanded;
- if (mIsGroupExpanded) {
- setImageDrawable(mExpandAnimationDrawable);
- mExpandAnimationDrawable.start();
- setContentDescription(mCollapseGroupDescription);
- } else {
- setImageDrawable(mCollapseAnimationDrawable);
- mCollapseAnimationDrawable.start();
- setContentDescription(mExpandGroupDescription);
- }
- if (mListener != null) {
- mListener.onClick(view);
- }
- }
- });
- }
-
- @Override
- public void setOnClickListener(OnClickListener listener) {
- mListener = listener;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteVolumeSlider.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteVolumeSlider.java
deleted file mode 100644
index d05d20e..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteVolumeSlider.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.SeekBar;
-
-/**
- * Volume slider with showing, hiding, and applying alpha supports to the thumb.
- */
-public class MediaRouteVolumeSlider extends SeekBar {
- private static final String TAG = "MediaRouteVolumeSlider";
-
- private final float mDisabledAlpha;
-
- private boolean mHideThumb;
- private Drawable mThumb;
- private int mColor;
-
- public MediaRouteVolumeSlider(Context context) {
- this(context, null);
- }
-
- public MediaRouteVolumeSlider(Context context, AttributeSet attrs) {
- super(context, attrs);
- mDisabledAlpha = MediaRouterThemeHelper.getDisabledAlpha(context);
- }
-
- public MediaRouteVolumeSlider(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mDisabledAlpha = MediaRouterThemeHelper.getDisabledAlpha(context);
- }
-
- @Override
- protected void drawableStateChanged() {
- super.drawableStateChanged();
- int alpha = isEnabled() ? 0xFF : (int) (0xFF * mDisabledAlpha);
-
- // The thumb drawable is a collection of drawables and its current drawables are changed per
- // state. Apply the color filter and alpha on every state change.
- if (mThumb != null) {
- mThumb.setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
- mThumb.setAlpha(alpha);
- }
-
- getProgressDrawable().setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
- getProgressDrawable().setAlpha(alpha);
- }
-
- @Override
- public void setThumb(Drawable thumb) {
- mThumb = thumb;
- super.setThumb(mHideThumb ? null : mThumb);
- }
-
- /**
- * Sets whether to show or hide thumb.
- */
- public void setHideThumb(boolean hideThumb) {
- if (mHideThumb == hideThumb) {
- return;
- }
- mHideThumb = hideThumb;
- super.setThumb(mHideThumb ? null : mThumb);
- }
-
- /**
- * Sets the volume slider color. The change takes effect next time drawable state is changed.
- * <p>
- * The color cannot be translucent, otherwise the underlying progress bar will be seen through
- * the thumb.
- * </p>
- */
- public void setColor(int color) {
- if (mColor == color) {
- return;
- }
- if (Color.alpha(color) != 0xFF) {
- Log.e(TAG, "Volume slider color cannot be translucent: #" + Integer.toHexString(color));
- }
- mColor = color;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouterThemeHelper.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouterThemeHelper.java
deleted file mode 100644
index b4bf8d1..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouterThemeHelper.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Color;
-import android.util.TypedValue;
-import android.view.ContextThemeWrapper;
-import android.view.View;
-
-import androidx.annotation.IntDef;
-import androidx.core.graphics.ColorUtils;
-
-import com.android.media.update.R;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-final class MediaRouterThemeHelper {
- private static final float MIN_CONTRAST = 3.0f;
-
- @IntDef({COLOR_DARK_ON_LIGHT_BACKGROUND, COLOR_WHITE_ON_DARK_BACKGROUND})
- @Retention(RetentionPolicy.SOURCE)
- private @interface ControllerColorType {}
-
- static final int COLOR_DARK_ON_LIGHT_BACKGROUND = 0xDE000000; /* Opacity of 87% */
- static final int COLOR_WHITE_ON_DARK_BACKGROUND = Color.WHITE;
-
- private MediaRouterThemeHelper() {
- }
-
- static Context createThemedButtonContext(Context context) {
- // Apply base Media Router theme.
- context = new ContextThemeWrapper(context, getRouterThemeId(context));
-
- // Apply custom Media Router theme.
- int style = getThemeResource(context, R.attr.mediaRouteTheme);
- if (style != 0) {
- context = new ContextThemeWrapper(context, style);
- }
-
- return context;
- }
-
- /*
- * The following two methods are to be used in conjunction. They should be used to prepare
- * the context and theme for a super class constructor (the latter method relies on the
- * former method to properly prepare the context):
- * super(context = createThemedDialogContext(context, theme),
- * createThemedDialogStyle(context));
- *
- * It will apply theme in the following order (style lookups will be done in reverse):
- * 1) Current theme
- * 2) Supplied theme
- * 3) Base Media Router theme
- * 4) Custom Media Router theme, if provided
- */
- static Context createThemedDialogContext(Context context, int theme, boolean alertDialog) {
- // 1) Current theme is already applied to the context
-
- // 2) If no theme is supplied, look it up from the context (dialogTheme/alertDialogTheme)
- if (theme == 0) {
- theme = getThemeResource(context,
- !alertDialog ? android.R.attr.dialogTheme : android.R.attr.alertDialogTheme);
- }
- // Apply it
- context = new ContextThemeWrapper(context, theme);
-
- // 3) If a custom Media Router theme is provided then apply the base theme
- if (getThemeResource(context, R.attr.mediaRouteTheme) != 0) {
- context = new ContextThemeWrapper(context, getRouterThemeId(context));
- }
-
- return context;
- }
- // This method should be used in conjunction with the previous method.
- static int createThemedDialogStyle(Context context) {
- // 4) Apply the custom Media Router theme
- int theme = getThemeResource(context, R.attr.mediaRouteTheme);
- if (theme == 0) {
- // 3) No custom MediaRouter theme was provided so apply the base theme instead
- theme = getRouterThemeId(context);
- }
-
- return theme;
- }
- // END. Previous two methods should be used in conjunction.
-
- static int getThemeResource(Context context, int attr) {
- TypedValue value = new TypedValue();
- return context.getTheme().resolveAttribute(attr, value, true) ? value.resourceId : 0;
- }
-
- static float getDisabledAlpha(Context context) {
- TypedValue value = new TypedValue();
- return context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, value, true)
- ? value.getFloat() : 0.5f;
- }
-
- static @ControllerColorType int getControllerColor(Context context, int style) {
- int primaryColor = getThemeColor(context, style, android.R.attr.colorPrimary);
- if (primaryColor == 0) {
- primaryColor = getThemeColor(context, style, android.R.attr.colorPrimary);
- if (primaryColor == 0) {
- primaryColor = 0xFF000000;
- }
- }
- if (ColorUtils.calculateContrast(COLOR_WHITE_ON_DARK_BACKGROUND, primaryColor)
- >= MIN_CONTRAST) {
- return COLOR_WHITE_ON_DARK_BACKGROUND;
- }
- return COLOR_DARK_ON_LIGHT_BACKGROUND;
- }
-
- static int getButtonTextColor(Context context) {
- int primaryColor = getThemeColor(context, 0, android.R.attr.colorPrimary);
- int backgroundColor = getThemeColor(context, 0, android.R.attr.colorBackground);
-
- if (ColorUtils.calculateContrast(primaryColor, backgroundColor) < MIN_CONTRAST) {
- // Default to colorAccent if the contrast ratio is low.
- return getThemeColor(context, 0, android.R.attr.colorAccent);
- }
- return primaryColor;
- }
-
- static void setMediaControlsBackgroundColor(
- Context context, View mainControls, View groupControls, boolean hasGroup) {
- int primaryColor = getThemeColor(context, 0, android.R.attr.colorPrimary);
- int primaryDarkColor = getThemeColor(context, 0, android.R.attr.colorPrimaryDark);
- if (hasGroup && getControllerColor(context, 0) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
- // Instead of showing dark controls in a possibly dark (i.e. the primary dark), model
- // the white dialog and use the primary color for the group controls.
- primaryDarkColor = primaryColor;
- primaryColor = Color.WHITE;
- }
- mainControls.setBackgroundColor(primaryColor);
- groupControls.setBackgroundColor(primaryDarkColor);
- // Also store the background colors to the view tags. They are used in
- // setVolumeSliderColor() below.
- mainControls.setTag(primaryColor);
- groupControls.setTag(primaryDarkColor);
- }
-
- static void setVolumeSliderColor(
- Context context, MediaRouteVolumeSlider volumeSlider, View backgroundView) {
- int controllerColor = getControllerColor(context, 0);
- if (Color.alpha(controllerColor) != 0xFF) {
- // Composite with the background in order not to show the underlying progress bar
- // through the thumb.
- int backgroundColor = (int) backgroundView.getTag();
- controllerColor = ColorUtils.compositeColors(controllerColor, backgroundColor);
- }
- volumeSlider.setColor(controllerColor);
- }
-
- private static boolean isLightTheme(Context context) {
- TypedValue value = new TypedValue();
- // TODO(sungsoo): Switch to com.android.internal.R.attr.isLightTheme
- return context.getTheme().resolveAttribute(androidx.appcompat.R.attr.isLightTheme,
- value, true) && value.data != 0;
- }
-
- private static int getThemeColor(Context context, int style, int attr) {
- if (style != 0) {
- int[] attrs = { attr };
- TypedArray ta = context.obtainStyledAttributes(style, attrs);
- int color = ta.getColor(0, 0);
- ta.recycle();
- if (color != 0) {
- return color;
- }
- }
- TypedValue value = new TypedValue();
- context.getTheme().resolveAttribute(attr, value, true);
- if (value.resourceId != 0) {
- return context.getResources().getColor(value.resourceId);
- }
- return value.data;
- }
-
- static int getRouterThemeId(Context context) {
- int themeId;
- if (isLightTheme(context)) {
- if (getControllerColor(context, 0) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
- themeId = R.style.Theme_MediaRouter_Light;
- } else {
- themeId = R.style.Theme_MediaRouter_Light_DarkControlPanel;
- }
- } else {
- if (getControllerColor(context, 0) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
- themeId = R.style.Theme_MediaRouter_LightControlPanel;
- } else {
- themeId = R.style.Theme_MediaRouter;
- }
- }
- return themeId;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/OverlayListView.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/OverlayListView.java
deleted file mode 100644
index b00dee2..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/OverlayListView.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.util.AttributeSet;
-import android.view.animation.Interpolator;
-import android.widget.ListView;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A ListView which has an additional overlay layer. {@link BitmapDrawable}
- * can be added to the layer and can be animated.
- */
-public final class OverlayListView extends ListView {
- private final List<OverlayObject> mOverlayObjects = new ArrayList<>();
-
- public OverlayListView(Context context) {
- super(context);
- }
-
- public OverlayListView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public OverlayListView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- /**
- * Adds an object to the overlay layer.
- *
- * @param object An object to be added.
- */
- public void addOverlayObject(OverlayObject object) {
- mOverlayObjects.add(object);
- }
-
- /**
- * Starts all animations of objects in the overlay layer.
- */
- public void startAnimationAll() {
- for (OverlayObject object : mOverlayObjects) {
- if (!object.isAnimationStarted()) {
- object.startAnimation(getDrawingTime());
- }
- }
- }
-
- /**
- * Stops all animations of objects in the overlay layer.
- */
- public void stopAnimationAll() {
- for (OverlayObject object : mOverlayObjects) {
- object.stopAnimation();
- }
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- if (mOverlayObjects.size() > 0) {
- Iterator<OverlayObject> it = mOverlayObjects.iterator();
- while (it.hasNext()) {
- OverlayObject object = it.next();
- BitmapDrawable bitmap = object.getBitmapDrawable();
- if (bitmap != null) {
- bitmap.draw(canvas);
- }
- if (!object.update(getDrawingTime())) {
- it.remove();
- }
- }
- }
- }
-
- /**
- * A class that represents an object to be shown in the overlay layer.
- */
- public static class OverlayObject {
- private BitmapDrawable mBitmap;
- private float mCurrentAlpha = 1.0f;
- private Rect mCurrentBounds;
- private Interpolator mInterpolator;
- private long mDuration;
- private Rect mStartRect;
- private int mDeltaY;
- private float mStartAlpha = 1.0f;
- private float mEndAlpha = 1.0f;
- private long mStartTime;
- private boolean mIsAnimationStarted;
- private boolean mIsAnimationEnded;
- private OnAnimationEndListener mListener;
-
- public OverlayObject(BitmapDrawable bitmap, Rect startRect) {
- mBitmap = bitmap;
- mStartRect = startRect;
- mCurrentBounds = new Rect(startRect);
- if (mBitmap != null && mCurrentBounds != null) {
- mBitmap.setAlpha((int) (mCurrentAlpha * 255));
- mBitmap.setBounds(mCurrentBounds);
- }
- }
-
- /**
- * Returns the bitmap that this object represents.
- *
- * @return BitmapDrawable that this object has.
- */
- public BitmapDrawable getBitmapDrawable() {
- return mBitmap;
- }
-
- /**
- * Returns the started status of the animation.
- *
- * @return True if the animation has started, false otherwise.
- */
- public boolean isAnimationStarted() {
- return mIsAnimationStarted;
- }
-
- /**
- * Sets animation for varying alpha.
- *
- * @param startAlpha Starting alpha value for the animation, where 1.0 means
- * fully opaque and 0.0 means fully transparent.
- * @param endAlpha Ending alpha value for the animation.
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setAlphaAnimation(float startAlpha, float endAlpha) {
- mStartAlpha = startAlpha;
- mEndAlpha = endAlpha;
- return this;
- }
-
- /**
- * Sets animation for moving objects vertically.
- *
- * @param deltaY Distance to move in pixels.
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setTranslateYAnimation(int deltaY) {
- mDeltaY = deltaY;
- return this;
- }
-
- /**
- * Sets how long the animation will last.
- *
- * @param duration Duration in milliseconds
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setDuration(long duration) {
- mDuration = duration;
- return this;
- }
-
- /**
- * Sets the acceleration curve for this animation.
- *
- * @param interpolator The interpolator which defines the acceleration curve
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setInterpolator(Interpolator interpolator) {
- mInterpolator = interpolator;
- return this;
- }
-
- /**
- * Binds an animation end listener to the animation.
- *
- * @param listener the animation end listener to be notified.
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setAnimationEndListener(OnAnimationEndListener listener) {
- mListener = listener;
- return this;
- }
-
- /**
- * Starts the animation and sets the start time.
- *
- * @param startTime Start time to be set in Millis
- */
- public void startAnimation(long startTime) {
- mStartTime = startTime;
- mIsAnimationStarted = true;
- }
-
- /**
- * Stops the animation.
- */
- public void stopAnimation() {
- mIsAnimationStarted = true;
- mIsAnimationEnded = true;
- if (mListener != null) {
- mListener.onAnimationEnd();
- }
- }
-
- /**
- * Calculates and updates current bounds and alpha value.
- *
- * @param currentTime Current time.in millis
- */
- public boolean update(long currentTime) {
- if (mIsAnimationEnded) {
- return false;
- }
- float normalizedTime = (currentTime - mStartTime) / (float) mDuration;
- normalizedTime = Math.max(0.0f, Math.min(1.0f, normalizedTime));
- if (!mIsAnimationStarted) {
- normalizedTime = 0.0f;
- }
- float interpolatedTime = (mInterpolator == null) ? normalizedTime
- : mInterpolator.getInterpolation(normalizedTime);
- int deltaY = (int) (mDeltaY * interpolatedTime);
- mCurrentBounds.top = mStartRect.top + deltaY;
- mCurrentBounds.bottom = mStartRect.bottom + deltaY;
- mCurrentAlpha = mStartAlpha + (mEndAlpha - mStartAlpha) * interpolatedTime;
- if (mBitmap != null && mCurrentBounds != null) {
- mBitmap.setAlpha((int) (mCurrentAlpha * 255));
- mBitmap.setBounds(mCurrentBounds);
- }
- if (mIsAnimationStarted && normalizedTime >= 1.0f) {
- mIsAnimationEnded = true;
- if (mListener != null) {
- mListener.onAnimationEnd();
- }
- }
- return !mIsAnimationEnded;
- }
-
- /**
- * An animation listener that receives notifications when the animation ends.
- */
- public interface OnAnimationEndListener {
- /**
- * Notifies the end of the animation.
- */
- public void onAnimationEnd();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr1/MediaRouterJellybeanMr1.java b/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr1/MediaRouterJellybeanMr1.java
deleted file mode 100644
index 5a0bc95..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr1/MediaRouterJellybeanMr1.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.os.Build;
-import android.os.Handler;
-import android.util.Log;
-import android.view.Display;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-// @@RequiresApi(17)
-final class MediaRouterJellybeanMr1 {
- private static final String TAG = "MediaRouterJellybeanMr1";
-
- public static Object createCallback(Callback callback) {
- return new CallbackProxy<Callback>(callback);
- }
-
- public static final class RouteInfo {
- public static boolean isEnabled(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).isEnabled();
- }
-
- public static Display getPresentationDisplay(Object routeObj) {
- // android.media.MediaRouter.RouteInfo.getPresentationDisplay() was
- // added in API 17. However, some factory releases of JB MR1 missed it.
- try {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getPresentationDisplay();
- } catch (NoSuchMethodError ex) {
- Log.w(TAG, "Cannot get presentation display for the route.", ex);
- }
- return null;
- }
- }
-
- public static interface Callback extends MediaRouterJellybean.Callback {
- public void onRoutePresentationDisplayChanged(Object routeObj);
- }
-
- /**
- * Workaround the fact that the version of MediaRouter.addCallback() that accepts a
- * flag to perform an active scan does not exist in JB MR1 so we need to force
- * wifi display scans directly through the DisplayManager.
- * Do not use on JB MR2 and above.
- */
- public static final class ActiveScanWorkaround implements Runnable {
- // Time between wifi display scans when actively scanning in milliseconds.
- private static final int WIFI_DISPLAY_SCAN_INTERVAL = 15000;
-
- private final DisplayManager mDisplayManager;
- private final Handler mHandler;
- private Method mScanWifiDisplaysMethod;
-
- private boolean mActivelyScanningWifiDisplays;
-
- public ActiveScanWorkaround(Context context, Handler handler) {
- if (Build.VERSION.SDK_INT != 17) {
- throw new UnsupportedOperationException();
- }
-
- mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
- mHandler = handler;
- try {
- mScanWifiDisplaysMethod = DisplayManager.class.getMethod("scanWifiDisplays");
- } catch (NoSuchMethodException ex) {
- }
- }
-
- public void setActiveScanRouteTypes(int routeTypes) {
- // On JB MR1, there is no API to scan wifi display routes.
- // Instead we must make a direct call into the DisplayManager to scan
- // wifi displays on this version but only when live video routes are requested.
- // See also the JellybeanMr2Impl implementation of this method.
- // This was fixed in JB MR2 by adding a new overload of addCallback() to
- // enable active scanning on request.
- if ((routeTypes & MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO) != 0) {
- if (!mActivelyScanningWifiDisplays) {
- if (mScanWifiDisplaysMethod != null) {
- mActivelyScanningWifiDisplays = true;
- mHandler.post(this);
- } else {
- Log.w(TAG, "Cannot scan for wifi displays because the "
- + "DisplayManager.scanWifiDisplays() method is "
- + "not available on this device.");
- }
- }
- } else {
- if (mActivelyScanningWifiDisplays) {
- mActivelyScanningWifiDisplays = false;
- mHandler.removeCallbacks(this);
- }
- }
- }
-
- @Override
- public void run() {
- if (mActivelyScanningWifiDisplays) {
- try {
- mScanWifiDisplaysMethod.invoke(mDisplayManager);
- } catch (IllegalAccessException ex) {
- Log.w(TAG, "Cannot scan for wifi displays.", ex);
- } catch (InvocationTargetException ex) {
- Log.w(TAG, "Cannot scan for wifi displays.", ex);
- }
- mHandler.postDelayed(this, WIFI_DISPLAY_SCAN_INTERVAL);
- }
- }
- }
-
- /**
- * Workaround the fact that the isConnecting() method does not exist in JB MR1.
- * Do not use on JB MR2 and above.
- */
- public static final class IsConnectingWorkaround {
- private Method mGetStatusCodeMethod;
- private int mStatusConnecting;
-
- public IsConnectingWorkaround() {
- if (Build.VERSION.SDK_INT != 17) {
- throw new UnsupportedOperationException();
- }
-
- try {
- Field statusConnectingField =
- android.media.MediaRouter.RouteInfo.class.getField("STATUS_CONNECTING");
- mStatusConnecting = statusConnectingField.getInt(null);
- mGetStatusCodeMethod =
- android.media.MediaRouter.RouteInfo.class.getMethod("getStatusCode");
- } catch (NoSuchFieldException ex) {
- } catch (NoSuchMethodException ex) {
- } catch (IllegalAccessException ex) {
- }
- }
-
- public boolean isConnecting(Object routeObj) {
- android.media.MediaRouter.RouteInfo route =
- (android.media.MediaRouter.RouteInfo)routeObj;
-
- if (mGetStatusCodeMethod != null) {
- try {
- int statusCode = (Integer)mGetStatusCodeMethod.invoke(route);
- return statusCode == mStatusConnecting;
- } catch (IllegalAccessException ex) {
- } catch (InvocationTargetException ex) {
- }
- }
-
- // Assume not connecting.
- return false;
- }
- }
-
- static class CallbackProxy<T extends Callback>
- extends MediaRouterJellybean.CallbackProxy<T> {
- public CallbackProxy(T callback) {
- super(callback);
- }
-
- @Override
- public void onRoutePresentationDisplayChanged(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRoutePresentationDisplayChanged(route);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr2/MediaRouterJellybeanMr2.java b/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr2/MediaRouterJellybeanMr2.java
deleted file mode 100644
index 1103549..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr2/MediaRouterJellybeanMr2.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-// @@RequiresApi(18)
-final class MediaRouterJellybeanMr2 {
- public static Object getDefaultRoute(Object routerObj) {
- return ((android.media.MediaRouter)routerObj).getDefaultRoute();
- }
-
- public static void addCallback(Object routerObj, int types, Object callbackObj, int flags) {
- ((android.media.MediaRouter)routerObj).addCallback(types,
- (android.media.MediaRouter.Callback)callbackObj, flags);
- }
-
- public static final class RouteInfo {
- public static CharSequence getDescription(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getDescription();
- }
-
- public static boolean isConnecting(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).isConnecting();
- }
- }
-
- public static final class UserRouteInfo {
- public static void setDescription(Object routeObj, CharSequence description) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setDescription(description);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean/MediaRouterJellybean.java b/packages/MediaComponents/src/com/android/support/mediarouter/jellybean/MediaRouterJellybean.java
deleted file mode 100644
index 0bb59b8..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean/MediaRouterJellybean.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.os.Build;
-import android.util.Log;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-// @@RequiresApi(16)
-final class MediaRouterJellybean {
- private static final String TAG = "MediaRouterJellybean";
-
- // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP = 0x80;
- // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100;
- // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200;
- public static final int DEVICE_OUT_BLUETOOTH = 0x80 | 0x100 | 0x200;
-
- public static final int ROUTE_TYPE_LIVE_AUDIO = 0x1;
- public static final int ROUTE_TYPE_LIVE_VIDEO = 0x2;
- public static final int ROUTE_TYPE_USER = 0x00800000;
-
- public static final int ALL_ROUTE_TYPES =
- MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO
- | MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO
- | MediaRouterJellybean.ROUTE_TYPE_USER;
-
- public static Object getMediaRouter(Context context) {
- return context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List getRoutes(Object routerObj) {
- final android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
- final int count = router.getRouteCount();
- List out = new ArrayList(count);
- for (int i = 0; i < count; i++) {
- out.add(router.getRouteAt(i));
- }
- return out;
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List getCategories(Object routerObj) {
- final android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
- final int count = router.getCategoryCount();
- List out = new ArrayList(count);
- for (int i = 0; i < count; i++) {
- out.add(router.getCategoryAt(i));
- }
- return out;
- }
-
- public static Object getSelectedRoute(Object routerObj, int type) {
- return ((android.media.MediaRouter)routerObj).getSelectedRoute(type);
- }
-
- public static void selectRoute(Object routerObj, int types, Object routeObj) {
- ((android.media.MediaRouter)routerObj).selectRoute(types,
- (android.media.MediaRouter.RouteInfo)routeObj);
- }
-
- public static void addCallback(Object routerObj, int types, Object callbackObj) {
- ((android.media.MediaRouter)routerObj).addCallback(types,
- (android.media.MediaRouter.Callback)callbackObj);
- }
-
- public static void removeCallback(Object routerObj, Object callbackObj) {
- ((android.media.MediaRouter)routerObj).removeCallback(
- (android.media.MediaRouter.Callback)callbackObj);
- }
-
- public static Object createRouteCategory(Object routerObj,
- String name, boolean isGroupable) {
- return ((android.media.MediaRouter)routerObj).createRouteCategory(name, isGroupable);
- }
-
- public static Object createUserRoute(Object routerObj, Object categoryObj) {
- return ((android.media.MediaRouter)routerObj).createUserRoute(
- (android.media.MediaRouter.RouteCategory)categoryObj);
- }
-
- public static void addUserRoute(Object routerObj, Object routeObj) {
- ((android.media.MediaRouter)routerObj).addUserRoute(
- (android.media.MediaRouter.UserRouteInfo)routeObj);
- }
-
- public static void removeUserRoute(Object routerObj, Object routeObj) {
- ((android.media.MediaRouter)routerObj).removeUserRoute(
- (android.media.MediaRouter.UserRouteInfo)routeObj);
- }
-
- public static Object createCallback(Callback callback) {
- return new CallbackProxy<Callback>(callback);
- }
-
- public static Object createVolumeCallback(VolumeCallback callback) {
- return new VolumeCallbackProxy<VolumeCallback>(callback);
- }
-
- static boolean checkRoutedToBluetooth(Context context) {
- try {
- AudioManager audioManager = (AudioManager) context.getSystemService(
- Context.AUDIO_SERVICE);
- Method method = audioManager.getClass().getDeclaredMethod(
- "getDevicesForStream", int.class);
- int device = (Integer) method.invoke(audioManager, AudioManager.STREAM_MUSIC);
- return (device & DEVICE_OUT_BLUETOOTH) != 0;
- } catch (Exception e) {
- return false;
- }
- }
-
- public static final class RouteInfo {
- public static CharSequence getName(Object routeObj, Context context) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getName(context);
- }
-
- public static CharSequence getStatus(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getStatus();
- }
-
- public static int getSupportedTypes(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getSupportedTypes();
- }
-
- public static Object getCategory(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getCategory();
- }
-
- public static Drawable getIconDrawable(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getIconDrawable();
- }
-
- public static int getPlaybackType(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackType();
- }
-
- public static int getPlaybackStream(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackStream();
- }
-
- public static int getVolume(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getVolume();
- }
-
- public static int getVolumeMax(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeMax();
- }
-
- public static int getVolumeHandling(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeHandling();
- }
-
- public static Object getTag(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getTag();
- }
-
- public static void setTag(Object routeObj, Object tag) {
- ((android.media.MediaRouter.RouteInfo)routeObj).setTag(tag);
- }
-
- public static void requestSetVolume(Object routeObj, int volume) {
- ((android.media.MediaRouter.RouteInfo)routeObj).requestSetVolume(volume);
- }
-
- public static void requestUpdateVolume(Object routeObj, int direction) {
- ((android.media.MediaRouter.RouteInfo)routeObj).requestUpdateVolume(direction);
- }
-
- public static Object getGroup(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getGroup();
- }
-
- public static boolean isGroup(Object routeObj) {
- return routeObj instanceof android.media.MediaRouter.RouteGroup;
- }
- }
-
- public static final class RouteGroup {
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List getGroupedRoutes(Object groupObj) {
- final android.media.MediaRouter.RouteGroup group =
- (android.media.MediaRouter.RouteGroup)groupObj;
- final int count = group.getRouteCount();
- List out = new ArrayList(count);
- for (int i = 0; i < count; i++) {
- out.add(group.getRouteAt(i));
- }
- return out;
- }
- }
-
- public static final class UserRouteInfo {
- public static void setName(Object routeObj, CharSequence name) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setName(name);
- }
-
- public static void setStatus(Object routeObj, CharSequence status) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setStatus(status);
- }
-
- public static void setIconDrawable(Object routeObj, Drawable icon) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setIconDrawable(icon);
- }
-
- public static void setPlaybackType(Object routeObj, int type) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackType(type);
- }
-
- public static void setPlaybackStream(Object routeObj, int stream) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackStream(stream);
- }
-
- public static void setVolume(Object routeObj, int volume) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolume(volume);
- }
-
- public static void setVolumeMax(Object routeObj, int volumeMax) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeMax(volumeMax);
- }
-
- public static void setVolumeHandling(Object routeObj, int volumeHandling) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeHandling(volumeHandling);
- }
-
- public static void setVolumeCallback(Object routeObj, Object volumeCallbackObj) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeCallback(
- (android.media.MediaRouter.VolumeCallback)volumeCallbackObj);
- }
-
- public static void setRemoteControlClient(Object routeObj, Object rccObj) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setRemoteControlClient(
- (android.media.RemoteControlClient)rccObj);
- }
- }
-
- public static final class RouteCategory {
- public static CharSequence getName(Object categoryObj, Context context) {
- return ((android.media.MediaRouter.RouteCategory)categoryObj).getName(context);
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List getRoutes(Object categoryObj) {
- ArrayList out = new ArrayList();
- ((android.media.MediaRouter.RouteCategory)categoryObj).getRoutes(out);
- return out;
- }
-
- public static int getSupportedTypes(Object categoryObj) {
- return ((android.media.MediaRouter.RouteCategory)categoryObj).getSupportedTypes();
- }
-
- public static boolean isGroupable(Object categoryObj) {
- return ((android.media.MediaRouter.RouteCategory)categoryObj).isGroupable();
- }
- }
-
- public static interface Callback {
- public void onRouteSelected(int type, Object routeObj);
- public void onRouteUnselected(int type, Object routeObj);
- public void onRouteAdded(Object routeObj);
- public void onRouteRemoved(Object routeObj);
- public void onRouteChanged(Object routeObj);
- public void onRouteGrouped(Object routeObj, Object groupObj, int index);
- public void onRouteUngrouped(Object routeObj, Object groupObj);
- public void onRouteVolumeChanged(Object routeObj);
- }
-
- public static interface VolumeCallback {
- public void onVolumeSetRequest(Object routeObj, int volume);
- public void onVolumeUpdateRequest(Object routeObj, int direction);
- }
-
- /**
- * Workaround for limitations of selectRoute() on JB and JB MR1.
- * Do not use on JB MR2 and above.
- */
- public static final class SelectRouteWorkaround {
- private Method mSelectRouteIntMethod;
-
- public SelectRouteWorkaround() {
- if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) {
- throw new UnsupportedOperationException();
- }
- try {
- mSelectRouteIntMethod = android.media.MediaRouter.class.getMethod(
- "selectRouteInt", int.class, android.media.MediaRouter.RouteInfo.class);
- } catch (NoSuchMethodException ex) {
- }
- }
-
- public void selectRoute(Object routerObj, int types, Object routeObj) {
- android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
- android.media.MediaRouter.RouteInfo route =
- (android.media.MediaRouter.RouteInfo)routeObj;
-
- int routeTypes = route.getSupportedTypes();
- if ((routeTypes & ROUTE_TYPE_USER) == 0) {
- // Handle non-user routes.
- // On JB and JB MR1, the selectRoute() API only supports programmatically
- // selecting user routes. So instead we rely on the hidden selectRouteInt()
- // method on these versions of the platform.
- // This limitation was removed in JB MR2.
- if (mSelectRouteIntMethod != null) {
- try {
- mSelectRouteIntMethod.invoke(router, types, route);
- return; // success!
- } catch (IllegalAccessException ex) {
- Log.w(TAG, "Cannot programmatically select non-user route. "
- + "Media routing may not work.", ex);
- } catch (InvocationTargetException ex) {
- Log.w(TAG, "Cannot programmatically select non-user route. "
- + "Media routing may not work.", ex);
- }
- } else {
- Log.w(TAG, "Cannot programmatically select non-user route "
- + "because the platform is missing the selectRouteInt() "
- + "method. Media routing may not work.");
- }
- }
-
- // Default handling.
- router.selectRoute(types, route);
- }
- }
-
- /**
- * Workaround the fact that the getDefaultRoute() method does not exist in JB and JB MR1.
- * Do not use on JB MR2 and above.
- */
- public static final class GetDefaultRouteWorkaround {
- private Method mGetSystemAudioRouteMethod;
-
- public GetDefaultRouteWorkaround() {
- if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) {
- throw new UnsupportedOperationException();
- }
- try {
- mGetSystemAudioRouteMethod =
- android.media.MediaRouter.class.getMethod("getSystemAudioRoute");
- } catch (NoSuchMethodException ex) {
- }
- }
-
- public Object getDefaultRoute(Object routerObj) {
- android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
-
- if (mGetSystemAudioRouteMethod != null) {
- try {
- return mGetSystemAudioRouteMethod.invoke(router);
- } catch (IllegalAccessException ex) {
- } catch (InvocationTargetException ex) {
- }
- }
-
- // Could not find the method or it does not work.
- // Return the first route and hope for the best.
- return router.getRouteAt(0);
- }
- }
-
- static class CallbackProxy<T extends Callback>
- extends android.media.MediaRouter.Callback {
- protected final T mCallback;
-
- public CallbackProxy(T callback) {
- mCallback = callback;
- }
-
- @Override
- public void onRouteSelected(android.media.MediaRouter router,
- int type, android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteSelected(type, route);
- }
-
- @Override
- public void onRouteUnselected(android.media.MediaRouter router,
- int type, android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteUnselected(type, route);
- }
-
- @Override
- public void onRouteAdded(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteAdded(route);
- }
-
- @Override
- public void onRouteRemoved(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteRemoved(route);
- }
-
- @Override
- public void onRouteChanged(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteChanged(route);
- }
-
- @Override
- public void onRouteGrouped(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route,
- android.media.MediaRouter.RouteGroup group, int index) {
- mCallback.onRouteGrouped(route, group, index);
- }
-
- @Override
- public void onRouteUngrouped(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route,
- android.media.MediaRouter.RouteGroup group) {
- mCallback.onRouteUngrouped(route, group);
- }
-
- @Override
- public void onRouteVolumeChanged(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteVolumeChanged(route);
- }
- }
-
- static class VolumeCallbackProxy<T extends VolumeCallback>
- extends android.media.MediaRouter.VolumeCallback {
- protected final T mCallback;
-
- public VolumeCallbackProxy(T callback) {
- mCallback = callback;
- }
-
- @Override
- public void onVolumeSetRequest(android.media.MediaRouter.RouteInfo route,
- int volume) {
- mCallback.onVolumeSetRequest(route, volume);
- }
-
- @Override
- public void onVolumeUpdateRequest(android.media.MediaRouter.RouteInfo route,
- int direction) {
- mCallback.onVolumeUpdateRequest(route, direction);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaControlIntent.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaControlIntent.java
deleted file mode 100644
index 1d9e777..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaControlIntent.java
+++ /dev/null
@@ -1,1228 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.app.PendingIntent;
-import android.content.Intent;
-import android.net.Uri;
-
-/**
- * Constants for media control intents.
- * <p>
- * This class declares a set of standard media control intent categories and actions that
- * applications can use to identify the capabilities of media routes and control them.
- * </p>
- *
- * <h3>Media control intent categories</h3>
- * <p>
- * Media control intent categories specify means by which applications can
- * send media to the destination of a media route. Categories are sometimes referred
- * to as describing "types" or "kinds" of routes.
- * </p><p>
- * For example, if a route supports the {@link #CATEGORY_REMOTE_PLAYBACK remote playback category},
- * then an application can ask it to play media remotely by sending a
- * {@link #ACTION_PLAY play} or {@link #ACTION_ENQUEUE enqueue} intent with the Uri of the
- * media content to play. Such a route may then be referred to as
- * a "remote playback route" because it supports remote playback requests. It is common
- * for a route to support multiple categories of requests at the same time, such as
- * live audio and live video.
- * </p><p>
- * The following standard route categories are defined.
- * </p><ul>
- * <li>{@link #CATEGORY_LIVE_AUDIO Live audio}: The route supports streaming live audio
- * from the device to the destination. Live audio routes include local speakers
- * and Bluetooth headsets.
- * <li>{@link #CATEGORY_LIVE_VIDEO Live video}: The route supports streaming live video
- * from the device to the destination. Live video routes include local displays
- * and wireless displays that support mirroring and
- * {@link android.app.Presentation presentations}. Live video routes typically also
- * support live audio capabilities.
- * <li>{@link #CATEGORY_REMOTE_PLAYBACK Remote playback}: The route supports sending
- * remote playback requests for media content to the destination. The content to be
- * played is identified by a Uri and mime-type.
- * </ul><p>
- * Media route providers may define custom media control intent categories of their own in
- * addition to the standard ones. Custom categories can be used to provide a variety
- * of features to applications that recognize and know how to use them. For example,
- * a media route provider might define a custom category to indicate that its routes
- * support a special device-specific control interface in addition to other
- * standard features.
- * </p><p>
- * Applications can determine which categories a route supports by using the
- * {@link MediaRouter.RouteInfo#supportsControlCategory MediaRouter.RouteInfo.supportsControlCategory}
- * or {@link MediaRouter.RouteInfo#getControlFilters MediaRouter.RouteInfo.getControlFilters}
- * methods. Applications can also specify the types of routes that they want to use by
- * creating {@link MediaRouteSelector media route selectors} that contain the desired
- * categories and are used to filter routes in several parts of the media router API.
- * </p>
- *
- * <h3>Media control intent actions</h3>
- * <p>
- * Media control intent actions specify particular functions that applications
- * can ask the destination of a media route to perform. Media route control requests
- * take the form of intents in a similar manner to other intents used to start activities
- * or send broadcasts. The difference is that media control intents are directed to
- * routes rather than activity or broadcast receiver components.
- * </p><p>
- * Each media route control intent specifies an action, a category and some number of parameters
- * that are supplied as extras. Applications send media control requests to routes using the
- * {@link MediaRouter.RouteInfo#sendControlRequest MediaRouter.RouteInfo.sendControlRequest}
- * method and receive results via a callback.
- * </p><p>
- * All media control intent actions are associated with the media control intent categories
- * that support them. Thus only remote playback routes may perform remote playback actions.
- * The documentation of each action specifies the category to which the action belongs,
- * the parameters it requires, and the results it returns.
- * </p>
- *
- * <h3>Live audio and live video routes</h3>
- * <p>
- * {@link #CATEGORY_LIVE_AUDIO Live audio} and {@link #CATEGORY_LIVE_VIDEO live video}
- * routes present media using standard system interfaces such as audio streams,
- * {@link android.app.Presentation presentations} or display mirroring. These routes are
- * the easiest to use because applications simply render content locally on the device
- * and the system streams it to the route destination automatically.
- * </p><p>
- * In most cases, applications can stream content to live audio and live video routes in
- * the same way they would play the content locally without any modification. However,
- * applications may also be able to take advantage of more sophisticated features such
- * as second-screen presentation APIs that are particular to these routes.
- * </p>
- *
- * <h3>Remote playback routes</h3>
- * <p>
- * {@link #CATEGORY_REMOTE_PLAYBACK Remote playback} routes present media remotely
- * by playing content from a Uri.
- * These routes destinations take responsibility for fetching and rendering content
- * on their own. Applications do not render the content themselves; instead, applications
- * send control requests to initiate play, pause, resume, or stop media items and receive
- * status updates as they change state.
- * </p>
- *
- * <h4>Sessions</h4>
- * <p>
- * Each remote media playback action is conducted within the scope of a session.
- * Sessions are used to prevent applications from accidentally interfering with one
- * another because at most one session can be valid at a time.
- * </p><p>
- * A session can be created using the {@link #ACTION_START_SESSION start session action}
- * and terminated using the {@link #ACTION_END_SESSION end session action} when the
- * route provides explicit session management features.
- * </p><p>
- * Explicit session management was added in a later revision of the protocol so not
- * all routes support it. If the route does not support explicit session management
- * then implicit session management may still be used. Implicit session management
- * relies on the use of the {@link #ACTION_PLAY play} and {@link #ACTION_ENQUEUE enqueue}
- * actions which have the side-effect of creating a new session if none is provided
- * as argument.
- * </p><p>
- * When a new session is created, the previous session is invalidated and any ongoing
- * media playback is stopped before the requested action is performed. Any attempt
- * to use an invalidated session will result in an error. (Protocol implementations
- * are encouraged to aggressively discard information associated with invalidated sessions
- * since it is no longer of use.)
- * </p><p>
- * Each session is identified by a unique session id that may be used to control
- * the session using actions such as pause, resume, stop and end session.
- * </p>
- *
- * <h4>Media items</h4>
- * <p>
- * Each successful {@link #ACTION_PLAY play} or {@link #ACTION_ENQUEUE enqueue} action
- * returns a unique media item id that an application can use to monitor and control
- * playback. The media item id may be passed to other actions such as
- * {@link #ACTION_SEEK seek} or {@link #ACTION_GET_STATUS get status}. It will also appear
- * as a parameter in status update broadcasts to identify the associated playback request.
- * </p><p>
- * Each media item is scoped to the session in which it was created. Therefore media item
- * ids are only ever used together with session ids. Media item ids are meaningless
- * on their own. When the session is invalidated, all of its media items are also
- * invalidated.
- * </p>
- *
- * <h4>The playback queue</h4>
- * <p>
- * Each session has its own playback queue that consists of the media items that
- * are pending, playing, buffering or paused. Items are added to the queue when
- * a playback request is issued. Items are removed from the queue when they are no
- * longer eligible for playback (enter terminal states).
- * </p><p>
- * As described in the {@link MediaItemStatus} class, media items initially
- * start in a pending state, transition to the playing (or buffering or paused) state
- * during playback, and end in a finished, canceled, invalidated or error state.
- * Once the current item enters a terminal state, playback proceeds on to the
- * next item.
- * </p><p>
- * The application should determine whether the route supports queuing by checking
- * whether the {@link #ACTION_ENQUEUE} action is declared in the route's control filter
- * using {@link MediaRouter.RouteInfo#supportsControlRequest RouteInfo.supportsControlRequest}.
- * </p><p>
- * If the {@link #ACTION_ENQUEUE} action is supported by the route, then the route promises
- * to allow at least two items (possibly more) to be enqueued at a time. Enqueued items play
- * back to back one after the other as the previous item completes. Ideally there should
- * be no audible pause between items for standard audio content types.
- * </p><p>
- * If the {@link #ACTION_ENQUEUE} action is not supported by the route, then the queue
- * effectively contains at most one item at a time. Each play action has the effect of
- * clearing the queue and resetting its state before the next item is played.
- * </p>
- *
- * <h4>Impact of pause, resume, stop and play actions on the playback queue</h4>
- * <p>
- * The pause, resume and stop actions affect the session's whole queue. Pause causes
- * the playback queue to be suspended no matter which item is currently playing.
- * Resume reverses the effects of pause. Stop clears the queue and also resets
- * the pause flag just like resume.
- * </p><p>
- * As described earlier, the play action has the effect of clearing the queue
- * and completely resetting its state (like the stop action) then enqueuing a
- * new media item to be played immediately. Play is therefore equivalent
- * to stop followed by an action to enqueue an item.
- * </p><p>
- * The play action is also special in that it can be used to create new sessions.
- * An application with simple needs may find that it only needs to use play
- * (and occasionally stop) to control playback.
- * </p>
- *
- * <h4>Resolving conflicts between applications</h4>
- * <p>
- * When an application has a valid session, it is essentially in control of remote playback
- * on the route. No other application can view or modify the remote playback state
- * of that application's session without knowing its id.
- * </p><p>
- * However, other applications can perform actions that have the effect of stopping
- * playback and invalidating the current session. When this occurs, the former application
- * will be informed that it has lost control by way of individual media item status
- * update broadcasts that indicate that its queued media items have become
- * {@link MediaItemStatus#PLAYBACK_STATE_INVALIDATED invalidated}. This broadcast
- * implies that playback was terminated abnormally by an external cause.
- * </p><p>
- * Applications should handle conflicts conservatively to allow other applications to
- * smoothly assume control over the route. When a conflict occurs, the currently playing
- * application should release its session and allow the new application to use the
- * route until such time as the user intervenes to take over the route again and begin
- * a new playback session.
- * </p>
- *
- * <h4>Basic actions</h4>
- * <p>
- * The following basic actions must be supported (all or nothing) by all remote
- * playback routes. These actions form the basis of the remote playback protocol
- * and are required in all implementations.
- * </p><ul>
- * <li>{@link #ACTION_PLAY Play}: Starts playing content specified by a given Uri
- * and returns a new media item id to describe the request. Implicitly creates a new
- * session if no session id was specified as a parameter.
- * <li>{@link #ACTION_SEEK Seek}: Sets the content playback position of a specific media item.
- * <li>{@link #ACTION_GET_STATUS Get status}: Gets the status of a media item
- * including the item's current playback position and progress.
- * <li>{@link #ACTION_PAUSE Pause}: Pauses playback of the queue.
- * <li>{@link #ACTION_RESUME Resume}: Resumes playback of the queue.
- * <li>{@link #ACTION_STOP Stop}: Stops playback, clears the queue, and resets the
- * pause state.
- * </ul>
- *
- * <h4>Queue actions</h4>
- * <p>
- * The following queue actions must be supported (all or nothing) by remote
- * playback routes that offer optional queuing capabilities.
- * </p><ul>
- * <li>{@link #ACTION_ENQUEUE Enqueue}: Enqueues content specified by a given Uri
- * and returns a new media item id to describe the request. Implicitly creates a new
- * session if no session id was specified as a parameter.
- * <li>{@link #ACTION_REMOVE Remove}: Removes a specified media item from the queue.
- * </ul>
- *
- * <h4>Session actions</h4>
- * <p>
- * The following session actions must be supported (all or nothing) by remote
- * playback routes that offer optional session management capabilities.
- * </p><ul>
- * <li>{@link #ACTION_START_SESSION Start session}: Starts a new session explicitly.
- * <li>{@link #ACTION_GET_SESSION_STATUS Get session status}: Gets the status of a session.
- * <li>{@link #ACTION_END_SESSION End session}: Ends a session explicitly.
- * </ul>
- *
- * <h4>Implementation note</h4>
- * <p>
- * Implementations of the remote playback protocol must implement <em>all</em> of the
- * documented actions, parameters and results. Note that the documentation is written from
- * the perspective of a client of the protocol. In particular, whenever a parameter
- * is described as being "optional", it is only from the perspective of the client.
- * Compliant media route provider implementations of this protocol must support all
- * of the features described herein.
- * </p>
- */
-public final class MediaControlIntent {
- /* Route categories. */
-
- /**
- * Media control category: Live audio.
- * <p>
- * A route that supports live audio routing will allow the media audio stream
- * to be sent to supported destinations. This can include internal speakers or
- * audio jacks on the device itself, A2DP devices, and more.
- * </p><p>
- * When a live audio route is selected, audio routing is transparent to the application.
- * All audio played on the media stream will be routed to the selected destination.
- * </p><p>
- * Refer to the class documentation for details about live audio routes.
- * </p>
- */
- public static final String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-
- /**
- * Media control category: Live video.
- * <p>
- * A route that supports live video routing will allow a mirrored version
- * of the device's primary display or a customized
- * {@link android.app.Presentation Presentation} to be sent to supported
- * destinations.
- * </p><p>
- * When a live video route is selected, audio and video routing is transparent
- * to the application. By default, audio and video is routed to the selected
- * destination. For certain live video routes, the application may also use a
- * {@link android.app.Presentation Presentation} to replace the mirrored view
- * on the external display with different content.
- * </p><p>
- * Refer to the class documentation for details about live video routes.
- * </p>
- *
- * @see MediaRouter.RouteInfo#getPresentationDisplay()
- * @see android.app.Presentation
- */
- public static final String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-
- /**
- * Media control category: Remote playback.
- * <p>
- * A route that supports remote playback routing will allow an application to send
- * requests to play content remotely to supported destinations.
- * </p><p>
- * Remote playback routes destinations operate independently of the local device.
- * When a remote playback route is selected, the application can control the content
- * playing on the destination by sending media control actions to the route.
- * The application may also receive status updates from the route regarding
- * remote playback.
- * </p><p>
- * Refer to the class documentation for details about remote playback routes.
- * </p>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- */
- public static final String CATEGORY_REMOTE_PLAYBACK =
- "android.media.intent.category.REMOTE_PLAYBACK";
-
- /* Remote playback actions that affect individual items. */
-
- /**
- * Remote playback media control action: Play media item.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to start playing content with
- * the {@link Uri} specified in the {@link Intent}'s {@link Intent#getData() data uri}.
- * The action returns a media session id and media item id which can be used
- * to control playback using other remote playback actions.
- * </p><p>
- * Once initiated, playback of the specified content will be managed independently
- * by the destination. The application will receive status updates as the state
- * of the media item changes.
- * </p><p>
- * If the data uri specifies an HTTP or HTTPS scheme, then the destination is
- * responsible for following HTTP redirects to a reasonable depth of at least 3
- * levels as might typically be handled by a web browser. If an HTTP error
- * occurs, then the destination should send a {@link MediaItemStatus status update}
- * back to the client indicating the {@link MediaItemStatus#PLAYBACK_STATE_ERROR error}
- * {@link MediaItemStatus#getPlaybackState() playback state}.
- * </p>
- *
- * <h3>One item at a time</h3>
- * <p>
- * Each successful play action <em>replaces</em> the previous play action.
- * If an item is already playing, then it is canceled, the session's playback queue
- * is cleared and the new item begins playing immediately (regardless of
- * whether the previously playing item had been paused).
- * </p><p>
- * Play is therefore equivalent to {@link #ACTION_STOP stop} followed by an action
- * to enqueue a new media item to be played immediately.
- * </p>
- *
- * <h3>Sessions</h3>
- * <p>
- * This request has the effect of implicitly creating a media session whenever the
- * application does not specify the {@link #EXTRA_SESSION_ID session id} parameter.
- * Because there can only be at most one valid session at a time, creating a new session
- * has the side-effect of invalidating any existing sessions and their media items,
- * then handling the playback request with a new session.
- * </p><p>
- * If the application specifies an invalid session id, then an error is returned.
- * When this happens, the application should assume that its session
- * is no longer valid. To obtain a new session, the application may try again
- * and omit the session id parameter. However, the application should
- * only retry requests due to an explicit action performed by the user,
- * such as the user clicking on a "play" button in the UI, since another
- * application may be trying to take control of the route and the former
- * application should try to stay out of its way.
- * </p><p>
- * For more information on sessions, queues and media items, please refer to the
- * class documentation.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(optional)</em>: Specifies the session id of the
- * session to which the playback request belongs. If omitted, a new session
- * is created implicitly.
- * <li>{@link #EXTRA_ITEM_CONTENT_POSITION} <em>(optional)</em>: Specifies the initial
- * content playback position as a long integer number of milliseconds from
- * the beginning of the content.
- * <li>{@link #EXTRA_ITEM_METADATA} <em>(optional)</em>: Specifies metadata associated
- * with the content such as the title of a song.
- * <li>{@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER} <em>(optional)</em>: Specifies a
- * {@link PendingIntent} for a broadcast receiver that will receive status updates
- * about the media item.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(always returned)</em>: Specifies the session id of the
- * session that was affected by the request. This will be a new session in
- * the case where no session id was supplied as a parameter.
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_ID} <em>(always returned)</em>: Specifies an opaque string identifier
- * to use to refer to the media item in subsequent requests such as
- * {@link #ACTION_GET_STATUS}.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(always returned)</em>: Specifies the initial status of
- * the new media item.
- * </ul>
- *
- * <h3>Status updates</h3>
- * <p>
- * If the client supplies an
- * {@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER item status update receiver}
- * then the media route provider is responsible for sending status updates to the receiver
- * when significant media item state changes occur such as when playback starts or
- * stops. The receiver will not be invoked for content playback position changes.
- * The application may retrieve the current playback position when necessary
- * using the {@link #ACTION_GET_STATUS} request.
- * </p><p>
- * Refer to {@link MediaItemStatus} for details.
- * </p>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if a session id was provided but is unknown or
- * no longer valid, if the item Uri or content type is not supported, or if
- * any other arguments are invalid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * <h3>Example</h3>
- * <pre>
- * MediaRouter mediaRouter = MediaRouter.getInstance(context);
- * MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute();
- * Intent intent = new Intent(MediaControlIntent.ACTION_PLAY);
- * intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- * intent.setDataAndType("http://example.com/videos/movie.mp4", "video/mp4");
- * if (route.supportsControlRequest(intent)) {
- * MediaRouter.ControlRequestCallback callback = new MediaRouter.ControlRequestCallback() {
- * public void onResult(Bundle data) {
- * // The request succeeded.
- * // Playback may be controlled using the returned session and item id.
- * String sessionId = data.getString(MediaControlIntent.EXTRA_SESSION_ID);
- * String itemId = data.getString(MediaControlIntent.EXTRA_ITEM_ID);
- * MediaItemStatus status = MediaItemStatus.fromBundle(data.getBundle(
- * MediaControlIntent.EXTRA_ITEM_STATUS));
- * // ...
- * }
- *
- * public void onError(String message, Bundle data) {
- * // An error occurred!
- * }
- * };
- * route.sendControlRequest(intent, callback);
- * }</pre>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- * @see #ACTION_PAUSE
- * @see #ACTION_RESUME
- * @see #ACTION_STOP
- */
- public static final String ACTION_PLAY = "android.media.intent.action.PLAY";
-
- /**
- * Remote playback media control action: Enqueue media item.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action works just like {@link #ACTION_PLAY play} except that it does
- * not clear the queue or reset the pause state when it enqueues the
- * new media item into the session's playback queue. This action only
- * enqueues a media item with no other side-effects on the queue.
- * </p><p>
- * If the queue is currently empty and then the item will play immediately
- * (assuming the queue is not paused). Otherwise, the item will play
- * after all earlier items in the queue have finished or been removed.
- * </p><p>
- * The enqueue action can be used to create new sessions just like play.
- * Its parameters and results are also the same. Only the queuing behavior
- * is different.
- * </p>
- *
- * @see #ACTION_PLAY
- */
- public static final String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-
- /**
- * Remote playback media control action: Seek media item to a new playback position.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to modify the current playback position
- * of the specified media item.
- * </p><p>
- * This action only affects the playback position of the media item; not its playback state.
- * If the playback queue is paused, then seeking sets the position but the item
- * remains paused. Likewise if the item is playing, then seeking will cause playback
- * to jump to the new position and continue playing from that point. If the item has
- * not yet started playing, then the new playback position is remembered by the
- * queue and used as the item's initial content position when playback eventually begins.
- * </p><p>
- * If successful, the media item's playback position is changed.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * to which the media item belongs.
- * <li>{@link #EXTRA_ITEM_ID} <em>(required)</em>: Specifies the media item id of
- * the media item to seek.
- * <li>{@link #EXTRA_ITEM_CONTENT_POSITION} <em>(required)</em>: Specifies the new
- * content position for playback as a long integer number of milliseconds from
- * the beginning of the content.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(always returned)</em>: Specifies the new status of
- * the media item.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id or media item id are unknown
- * or no longer valid, if the content position is invalid, or if the media item
- * is in a terminal state.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_SEEK = "android.media.intent.action.SEEK";
-
- /**
- * Remote playback media control action: Get media item playback status
- * and progress information.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action asks a remote playback route to provide updated playback status and progress
- * information about the specified media item.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * to which the media item belongs.
- * <li>{@link #EXTRA_ITEM_ID} <em>(required)</em>: Specifies the media item id of
- * the media item to query.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(always returned)</em>: Specifies the current status of
- * the media item.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id or media item id are unknown
- * or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #EXTRA_ITEM_STATUS_UPDATE_RECEIVER
- */
- public static final String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-
- /**
- * Remote playback media control action: Remove media item from session's queue.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action asks a remote playback route to remove the specified media item
- * from the session's playback queue. If the current item is removed, then
- * playback will proceed to the next media item (assuming the queue has not been
- * paused).
- * </p><p>
- * This action does not affect the pause state of the queue. If the queue was paused
- * then it remains paused (even if it is now empty) until a resume, stop or play
- * action is issued that causes the pause state to be cleared.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * to which the media item belongs.
- * <li>{@link #EXTRA_ITEM_ID} <em>(required)</em>: Specifies the media item id of
- * the media item to remove.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(always returned)</em>: Specifies the new status of
- * the media item.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id or media item id are unknown
- * or no longer valid, or if the media item is in a terminal state (and therefore
- * no longer in the queue).
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-
- /* Remote playback actions that affect the whole playback queue. */
-
- /**
- * Remote playback media control action: Pause media playback.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes the playback queue of the specified session to be paused.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * whose playback queue is to be paused.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #ACTION_RESUME
- */
- public static final String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-
- /**
- * Remote playback media control action: Resume media playback (unpause).
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes the playback queue of the specified session to be resumed.
- * Reverses the effects of {@link #ACTION_PAUSE}.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * whose playback queue is to be resumed.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #ACTION_PAUSE
- */
- public static final String ACTION_RESUME = "android.media.intent.action.RESUME";
-
- /**
- * Remote playback media control action: Stop media playback (clear queue and unpause).
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to stop playback, cancel and remove
- * all media items from the session's media item queue and, reset the queue's
- * pause state.
- * </p><p>
- * If successful, the status of all media items in the queue is set to
- * {@link MediaItemStatus#PLAYBACK_STATE_CANCELED canceled} and a status update is sent
- * to the appropriate status update receivers indicating the new status of each item.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session whose playback queue is to be stopped (cleared and unpaused).
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_STOP = "android.media.intent.action.STOP";
-
- /**
- * Remote playback media control action: Start session.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to invalidate the current session
- * and start a new session. The new session initially has an empty queue.
- * </p><p>
- * If successful, the status of all media items in the previous session's queue is set to
- * {@link MediaItemStatus#PLAYBACK_STATE_INVALIDATED invalidated} and a status update
- * is sent to the appropriate status update receivers indicating the new status
- * of each item. The previous session becomes no longer valid and the new session
- * takes control of the route.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS_UPDATE_RECEIVER} <em>(optional)</em>: Specifies a
- * {@link PendingIntent} for a broadcast receiver that will receive status updates
- * about the media session.
- * <li>{@link #EXTRA_MESSAGE_RECEIVER} <em>(optional)</em>: Specifies a
- * {@link PendingIntent} for a broadcast receiver that will receive messages from
- * the media session.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(always returned)</em>: Specifies the session id of the
- * session that was started by the request. This will always be a brand new session
- * distinct from any other previously created sessions.
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(always returned)</em>: Specifies the
- * status of the media session.
- * </ul>
- *
- * <h3>Status updates</h3>
- * <p>
- * If the client supplies a
- * {@link #EXTRA_SESSION_STATUS_UPDATE_RECEIVER status update receiver}
- * then the media route provider is responsible for sending status updates to the receiver
- * when significant media session state changes occur such as when the session's
- * queue is paused or resumed or when the session is terminated or invalidated.
- * </p><p>
- * Refer to {@link MediaSessionStatus} for details.
- * </p>
- *
- * <h3>Custom messages</h3>
- * <p>
- * If the client supplies a {@link #EXTRA_MESSAGE_RECEIVER message receiver}
- * then the media route provider is responsible for sending messages to the receiver
- * when the session has any messages to send.
- * </p><p>
- * Refer to {@link #EXTRA_MESSAGE} for details.
- * </p>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session could not be created.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-
- /**
- * Remote playback media control action: Get media session status information.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action asks a remote playback route to provide updated status information
- * about the specified media session.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the
- * session whose status is to be retrieved.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(always returned)</em>: Specifies the
- * current status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #EXTRA_SESSION_STATUS_UPDATE_RECEIVER
- */
- public static final String ACTION_GET_SESSION_STATUS =
- "android.media.intent.action.GET_SESSION_STATUS";
-
- /**
- * Remote playback media control action: End session.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to end the specified session.
- * The session becomes no longer valid and the route ceases to be under control
- * of the session.
- * </p><p>
- * If successful, the status of the session is set to
- * {@link MediaSessionStatus#SESSION_STATE_ENDED} and a status update is sent to
- * the session's status update receiver.
- * </p><p>
- * Additionally, the status of all media items in the queue is set to
- * {@link MediaItemStatus#PLAYBACK_STATE_CANCELED canceled} and a status update is sent
- * to the appropriate status update receivers indicating the new status of each item.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session to end.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(always returned)</em>: Specifies the
- * status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * In other words, it is an error to attempt to end a session other than the
- * current session.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-
- /**
- * Custom media control action: Send {@link #EXTRA_MESSAGE}.
- * <p>
- * This action asks a route to handle a message described by EXTRA_MESSAGE.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * to which will handle this message.
- * <li>{@link #EXTRA_MESSAGE} <em>(required)</em>: Specifies the message to send.
- * </ul>
- *
- * <h3>Result data</h3>
- * Any messages defined by each media route provider.
- *
- * <h3>Errors</h3>
- * Any error messages defined by each media route provider.
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- */
- public static final String ACTION_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
-
- /* Extras and related constants. */
-
- /**
- * Bundle extra: Media session id.
- * <p>
- * An opaque unique identifier that identifies the remote playback media session.
- * </p><p>
- * Used with various actions to specify the id of the media session to be controlled.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER item status update receivers} to identify
- * the session to which the item in question belongs.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_SESSION_STATUS_UPDATE_RECEIVER session status update receivers} to identify
- * the session.
- * </p><p>
- * The value is a unique string value generated by the media route provider
- * to represent one particular media session.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- * @see #ACTION_PAUSE
- * @see #ACTION_RESUME
- * @see #ACTION_STOP
- * @see #ACTION_START_SESSION
- * @see #ACTION_GET_SESSION_STATUS
- * @see #ACTION_END_SESSION
- */
- public static final String EXTRA_SESSION_ID =
- "android.media.intent.extra.SESSION_ID";
-
- /**
- * Bundle extra: Media session status.
- * <p>
- * Returned as a result from media session actions such as {@link #ACTION_START_SESSION},
- * {@link #ACTION_PAUSE}, and {@link #ACTION_GET_SESSION_STATUS}
- * to describe the status of the specified media session.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_SESSION_STATUS_UPDATE_RECEIVER session status update receivers} to provide
- * updated status information.
- * </p><p>
- * The value is a {@link android.os.Bundle} of data that can be converted into
- * a {@link MediaSessionStatus} object using
- * {@link MediaSessionStatus#fromBundle MediaSessionStatus.fromBundle}.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- * @see #ACTION_PAUSE
- * @see #ACTION_RESUME
- * @see #ACTION_STOP
- * @see #ACTION_START_SESSION
- * @see #ACTION_GET_SESSION_STATUS
- * @see #ACTION_END_SESSION
- */
- public static final String EXTRA_SESSION_STATUS =
- "android.media.intent.extra.SESSION_STATUS";
-
- /**
- * Bundle extra: Media session status update receiver.
- * <p>
- * Used with {@link #ACTION_START_SESSION} to specify a {@link PendingIntent} for a
- * broadcast receiver that will receive status updates about the media session.
- * </p><p>
- * Whenever the status of the media session changes, the media route provider will
- * send a broadcast to the pending intent with extras that identify the session
- * id and its updated status.
- * </p><p>
- * The value is a {@link PendingIntent}.
- * </p>
- *
- * <h3>Broadcast extras</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session.
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(required)</em>: Specifies the status of the
- * session as a bundle that can be decoded into a {@link MediaSessionStatus} object.
- * </ul>
- *
- * @see #ACTION_START_SESSION
- */
- public static final String EXTRA_SESSION_STATUS_UPDATE_RECEIVER =
- "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-
- /**
- * Bundle extra: Media message receiver.
- * <p>
- * Used with {@link #ACTION_START_SESSION} to specify a {@link PendingIntent} for a
- * broadcast receiver that will receive messages from the media session.
- * </p><p>
- * When the media session has a message to send, the media route provider will
- * send a broadcast to the pending intent with extras that identify the session
- * id and its message.
- * </p><p>
- * The value is a {@link PendingIntent}.
- * </p>
- *
- * <h3>Broadcast extras</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session.
- * <li>{@link #EXTRA_MESSAGE} <em>(required)</em>: Specifies the message from
- * the session as a bundle object.
- * </ul>
- *
- * @see #ACTION_START_SESSION
- */
- public static final String EXTRA_MESSAGE_RECEIVER =
- "android.media.intent.extra.MESSAGE_RECEIVER";
-
- /**
- * Bundle extra: Media item id.
- * <p>
- * An opaque unique identifier returned as a result from {@link #ACTION_PLAY} or
- * {@link #ACTION_ENQUEUE} that represents the media item that was created by the
- * playback request.
- * </p><p>
- * Used with various actions to specify the id of the media item to be controlled.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER status update receivers} to identify
- * the item in question.
- * </p><p>
- * The value is a unique string value generated by the media route provider
- * to represent one particular media item.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- */
- public static final String EXTRA_ITEM_ID =
- "android.media.intent.extra.ITEM_ID";
-
- /**
- * Bundle extra: Media item status.
- * <p>
- * Returned as a result from media item actions such as {@link #ACTION_PLAY},
- * {@link #ACTION_ENQUEUE}, {@link #ACTION_SEEK}, and {@link #ACTION_GET_STATUS}
- * to describe the status of the specified media item.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER item status update receivers} to provide
- * updated status information.
- * </p><p>
- * The value is a {@link android.os.Bundle} of data that can be converted into
- * a {@link MediaItemStatus} object using
- * {@link MediaItemStatus#fromBundle MediaItemStatus.fromBundle}.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- */
- public static final String EXTRA_ITEM_STATUS =
- "android.media.intent.extra.ITEM_STATUS";
-
- /**
- * Long extra: Media item content position.
- * <p>
- * Used with {@link #ACTION_PLAY} or {@link #ACTION_ENQUEUE} to specify the
- * starting playback position.
- * </p><p>
- * Used with {@link #ACTION_SEEK} to set a new playback position.
- * </p><p>
- * The value is a long integer number of milliseconds from the beginning of the content.
- * <p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- * @see #ACTION_SEEK
- */
- public static final String EXTRA_ITEM_CONTENT_POSITION =
- "android.media.intent.extra.ITEM_POSITION";
-
- /**
- * Bundle extra: Media item metadata.
- * <p>
- * Used with {@link #ACTION_PLAY} or {@link #ACTION_ENQUEUE} to specify metadata
- * associated with the content of a media item.
- * </p><p>
- * The value is a {@link android.os.Bundle} of metadata key-value pairs as defined
- * in {@link MediaItemMetadata}.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- */
- public static final String EXTRA_ITEM_METADATA =
- "android.media.intent.extra.ITEM_METADATA";
-
- /**
- * Bundle extra: HTTP request headers.
- * <p>
- * Used with {@link #ACTION_PLAY} or {@link #ACTION_ENQUEUE} to specify HTTP request
- * headers to be included when fetching to the content indicated by the media
- * item's data Uri.
- * </p><p>
- * This extra may be used to provide authentication tokens and other
- * parameters to the server separately from the media item's data Uri.
- * </p><p>
- * The value is a {@link android.os.Bundle} of string based key-value pairs
- * that describe the HTTP request headers.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- */
- public static final String EXTRA_ITEM_HTTP_HEADERS =
- "android.media.intent.extra.HTTP_HEADERS";
-
- /**
- * Bundle extra: Media item status update receiver.
- * <p>
- * Used with {@link #ACTION_PLAY} or {@link #ACTION_ENQUEUE} to specify
- * a {@link PendingIntent} for a
- * broadcast receiver that will receive status updates about a particular
- * media item.
- * </p><p>
- * Whenever the status of the media item changes, the media route provider will
- * send a broadcast to the pending intent with extras that identify the session
- * to which the item belongs, the session status, the item's id
- * and the item's updated status.
- * </p><p>
- * The same pending intent and broadcast receiver may be shared by any number of
- * media items since the broadcast intent includes the media session id
- * and media item id.
- * </p><p>
- * The value is a {@link PendingIntent}.
- * </p>
- *
- * <h3>Broadcast extras</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session to which the item in question belongs.
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_ID} <em>(required)</em>: Specifies the media item id of the
- * media item in question.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(required)</em>: Specifies the status of the
- * item as a bundle that can be decoded into a {@link MediaItemStatus} object.
- * </ul>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- */
- public static final String EXTRA_ITEM_STATUS_UPDATE_RECEIVER =
- "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-
- /**
- * Bundle extra: Message.
- * <p>
- * Used with {@link #ACTION_SEND_MESSAGE}, and included in broadcast intents sent to
- * {@link #EXTRA_MESSAGE_RECEIVER message receivers} to describe a message between a
- * session and a media route provider.
- * </p><p>
- * The value is a {@link android.os.Bundle}.
- * </p>
- */
- public static final String EXTRA_MESSAGE = "android.media.intent.extra.MESSAGE";
-
- /**
- * Integer extra: Error code.
- * <p>
- * Used with all media control requests to describe the cause of an error.
- * This extra may be omitted when the error is unknown.
- * </p><p>
- * The value is one of: {@link #ERROR_UNKNOWN}, {@link #ERROR_UNSUPPORTED_OPERATION},
- * {@link #ERROR_INVALID_SESSION_ID}, {@link #ERROR_INVALID_ITEM_ID}.
- * </p>
- */
- public static final String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-
- /**
- * Error code: An unknown error occurred.
- *
- * @see #EXTRA_ERROR_CODE
- */
- public static final int ERROR_UNKNOWN = 0;
-
- /**
- * Error code: The operation is not supported.
- *
- * @see #EXTRA_ERROR_CODE
- */
- public static final int ERROR_UNSUPPORTED_OPERATION = 1;
-
- /**
- * Error code: The session id specified in the request was invalid.
- *
- * @see #EXTRA_ERROR_CODE
- */
- public static final int ERROR_INVALID_SESSION_ID = 2;
-
- /**
- * Error code: The item id specified in the request was invalid.
- *
- * @see #EXTRA_ERROR_CODE
- */
- public static final int ERROR_INVALID_ITEM_ID = 3;
-
- private MediaControlIntent() {
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemMetadata.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemMetadata.java
deleted file mode 100644
index d52ddb6..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemMetadata.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.os.Bundle;
-
-/**
- * Constants for specifying metadata about a media item as a {@link Bundle}.
- * <p>
- * This class is part of the remote playback protocol described by the
- * {@link MediaControlIntent MediaControlIntent} class.
- * </p><p>
- * Media item metadata is described as a bundle of key/value pairs as defined
- * in this class. The documentation specifies the type of value associated
- * with each key.
- * </p><p>
- * An application may specify additional custom metadata keys but there is no guarantee
- * that they will be recognized by the destination.
- * </p>
- */
-public final class MediaItemMetadata {
- /*
- * Note: MediaMetadataRetriever also defines a collection of metadata keys that can be
- * retrieved from a content stream although the representation is somewhat different here
- * since we are sending the data to a remote endpoint.
- */
-
- private MediaItemMetadata() {
- }
-
- /**
- * String key: Album artist name.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-
- /**
- * String key: Album title.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-
- /**
- * String key: Artwork Uri.
- * <p>
- * The value is a string URI for an image file associated with the media item,
- * such as album or cover art.
- * </p>
- */
- public static final String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-
- /**
- * String key: Artist name.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_ARTIST = "android.media.metadata.ARTIST";
-
- /**
- * String key: Author name.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-
- /**
- * String key: Composer name.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-
- /**
- * String key: Track title.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_TITLE = "android.media.metadata.TITLE";
-
- /**
- * Integer key: Year of publication.
- * <p>
- * The value is an integer year number.
- * </p>
- */
- public static final String KEY_YEAR = "android.media.metadata.YEAR";
-
- /**
- * Integer key: Track number (such as a track on a CD).
- * <p>
- * The value is a one-based integer track number.
- * </p>
- */
- public static final String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-
- /**
- * Integer key: Disc number within a collection.
- * <p>
- * The value is a one-based integer disc number.
- * </p>
- */
- public static final String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-
- /**
- * Long key: Item playback duration in milliseconds.
- * <p>
- * The value is a <code>long</code> number of milliseconds.
- * </p><p>
- * The duration metadata is only a hint to enable a remote media player to
- * guess the duration of the content before it actually opens the media stream.
- * The remote media player should still determine the actual content duration from
- * the media stream itself independent of the value that may be specified by this key.
- * </p>
- */
- public static final String KEY_DURATION = "android.media.metadata.DURATION";
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemStatus.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemStatus.java
deleted file mode 100644
index 92f608b..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemStatus.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.app.PendingIntent;
-import android.os.Bundle;
-import android.os.SystemClock;
-
-import androidx.core.util.TimeUtils;
-
-/**
- * Describes the playback status of a media item.
- * <p>
- * This class is part of the remote playback protocol described by the
- * {@link MediaControlIntent MediaControlIntent} class.
- * </p><p>
- * As a media item is played, it transitions through a sequence of states including:
- * {@link #PLAYBACK_STATE_PENDING pending}, {@link #PLAYBACK_STATE_BUFFERING buffering},
- * {@link #PLAYBACK_STATE_PLAYING playing}, {@link #PLAYBACK_STATE_PAUSED paused},
- * {@link #PLAYBACK_STATE_FINISHED finished}, {@link #PLAYBACK_STATE_CANCELED canceled},
- * {@link #PLAYBACK_STATE_INVALIDATED invalidated}, and
- * {@link #PLAYBACK_STATE_ERROR error}. Refer to the documentation of each state
- * for an explanation of its meaning.
- * </p><p>
- * While the item is playing, the playback status may also include progress information
- * about the {@link #getContentPosition content position} and
- * {@link #getContentDuration content duration} although not all route destinations
- * will report it.
- * </p><p>
- * To monitor playback status, the application should supply a {@link PendingIntent} to use as the
- * {@link MediaControlIntent#EXTRA_ITEM_STATUS_UPDATE_RECEIVER item status update receiver}
- * for a given {@link MediaControlIntent#ACTION_PLAY playback request}. Note that
- * the status update receiver will only be invoked for major status changes such as a
- * transition from playing to finished.
- * </p><p class="note">
- * The status update receiver will not be invoked for minor progress updates such as
- * changes to playback position or duration. If the application wants to monitor
- * playback progress, then it must use the
- * {@link MediaControlIntent#ACTION_GET_STATUS get status request} to poll for changes
- * periodically and estimate the playback position while playing. Note that there may
- * be a significant power impact to polling so the application is advised only
- * to poll when the screen is on and never more than about once every 5 seconds or so.
- * </p><p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- */
-public final class MediaItemStatus {
- static final String KEY_TIMESTAMP = "timestamp";
- static final String KEY_PLAYBACK_STATE = "playbackState";
- static final String KEY_CONTENT_POSITION = "contentPosition";
- static final String KEY_CONTENT_DURATION = "contentDuration";
- static final String KEY_EXTRAS = "extras";
-
- final Bundle mBundle;
-
- /**
- * Playback state: Pending.
- * <p>
- * Indicates that the media item has not yet started playback but will be played eventually.
- * </p>
- */
- public static final int PLAYBACK_STATE_PENDING = 0;
-
- /**
- * Playback state: Playing.
- * <p>
- * Indicates that the media item is currently playing.
- * </p>
- */
- public static final int PLAYBACK_STATE_PLAYING = 1;
-
- /**
- * Playback state: Paused.
- * <p>
- * Indicates that playback of the media item has been paused. Playback can be
- * resumed using the {@link MediaControlIntent#ACTION_RESUME resume} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_PAUSED = 2;
-
- /**
- * Playback state: Buffering or seeking to a new position.
- * <p>
- * Indicates that the media item has been temporarily interrupted
- * to fetch more content. Playback will continue automatically
- * when enough content has been buffered.
- * </p>
- */
- public static final int PLAYBACK_STATE_BUFFERING = 3;
-
- /**
- * Playback state: Finished.
- * <p>
- * Indicates that the media item played to the end of the content and finished normally.
- * </p><p>
- * A finished media item cannot be resumed. To play the content again, the application
- * must send a new {@link MediaControlIntent#ACTION_PLAY play} or
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_FINISHED = 4;
-
- /**
- * Playback state: Canceled.
- * <p>
- * Indicates that the media item was explicitly removed from the queue by the
- * application. Items may be canceled and removed from the queue using
- * the {@link MediaControlIntent#ACTION_REMOVE remove} or
- * {@link MediaControlIntent#ACTION_STOP stop} action or by issuing
- * another {@link MediaControlIntent#ACTION_PLAY play} action that has the
- * side-effect of clearing the queue.
- * </p><p>
- * A canceled media item cannot be resumed. To play the content again, the
- * application must send a new {@link MediaControlIntent#ACTION_PLAY play} or
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_CANCELED = 5;
-
- /**
- * Playback state: Invalidated.
- * <p>
- * Indicates that the media item was invalidated permanently and involuntarily.
- * This state is used to indicate that the media item was invalidated and removed
- * from the queue because the session to which it belongs was invalidated
- * (typically by another application taking control of the route).
- * </p><p>
- * When invalidation occurs, the application should generally wait for the user
- * to perform an explicit action, such as clicking on a play button in the UI,
- * before creating a new media session to avoid unnecessarily interrupting
- * another application that may have just started using the route.
- * </p><p>
- * An invalidated media item cannot be resumed. To play the content again, the application
- * must send a new {@link MediaControlIntent#ACTION_PLAY play} or
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_INVALIDATED = 6;
-
- /**
- * Playback state: Playback halted or aborted due to an error.
- * <p>
- * Examples of errors are no network connectivity when attempting to retrieve content
- * from a server, or expired user credentials when trying to play subscription-based
- * content.
- * </p><p>
- * A media item in the error state cannot be resumed. To play the content again,
- * the application must send a new {@link MediaControlIntent#ACTION_PLAY play} or
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_ERROR = 7;
-
- /**
- * Integer extra: HTTP status code.
- * <p>
- * Specifies the HTTP status code that was encountered when the content
- * was requested after all redirects were followed. This key only needs to
- * specified when the content uri uses the HTTP or HTTPS scheme and an error
- * occurred. This key may be omitted if the content was able to be played
- * successfully; there is no need to report a 200 (OK) status code.
- * </p><p>
- * The value is an integer HTTP status code, such as 401 (Unauthorized),
- * 404 (Not Found), or 500 (Server Error), or 0 if none.
- * </p>
- */
- public static final String EXTRA_HTTP_STATUS_CODE =
- "android.media.status.extra.HTTP_STATUS_CODE";
-
- /**
- * Bundle extra: HTTP response headers.
- * <p>
- * Specifies the HTTP response headers that were returned when the content was
- * requested from the network. The headers may include additional information
- * about the content or any errors conditions that were encountered while
- * trying to fetch the content.
- * </p><p>
- * The value is a {@link android.os.Bundle} of string based key-value pairs
- * that describe the HTTP response headers.
- * </p>
- */
- public static final String EXTRA_HTTP_RESPONSE_HEADERS =
- "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-
- MediaItemStatus(Bundle bundle) {
- mBundle = bundle;
- }
-
- /**
- * Gets the timestamp associated with the status information in
- * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
- *
- * @return The status timestamp in the {@link SystemClock#elapsedRealtime()} time base.
- */
- public long getTimestamp() {
- return mBundle.getLong(KEY_TIMESTAMP);
- }
-
- /**
- * Gets the playback state of the media item.
- *
- * @return The playback state. One of {@link #PLAYBACK_STATE_PENDING},
- * {@link #PLAYBACK_STATE_PLAYING}, {@link #PLAYBACK_STATE_PAUSED},
- * {@link #PLAYBACK_STATE_BUFFERING}, {@link #PLAYBACK_STATE_FINISHED},
- * {@link #PLAYBACK_STATE_CANCELED}, {@link #PLAYBACK_STATE_INVALIDATED},
- * or {@link #PLAYBACK_STATE_ERROR}.
- */
- public int getPlaybackState() {
- return mBundle.getInt(KEY_PLAYBACK_STATE, PLAYBACK_STATE_ERROR);
- }
-
- /**
- * Gets the content playback position as a long integer number of milliseconds
- * from the beginning of the content.
- *
- * @return The content playback position in milliseconds, or -1 if unknown.
- */
- public long getContentPosition() {
- return mBundle.getLong(KEY_CONTENT_POSITION, -1);
- }
-
- /**
- * Gets the total duration of the content to be played as a long integer number of
- * milliseconds.
- *
- * @return The content duration in milliseconds, or -1 if unknown.
- */
- public long getContentDuration() {
- return mBundle.getLong(KEY_CONTENT_DURATION, -1);
- }
-
- /**
- * Gets a bundle of extras for this status object.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Bundle getExtras() {
- return mBundle.getBundle(KEY_EXTRAS);
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaItemStatus{ ");
- result.append("timestamp=");
- TimeUtils.formatDuration(SystemClock.elapsedRealtime() - getTimestamp(), result);
- result.append(" ms ago");
- result.append(", playbackState=").append(playbackStateToString(getPlaybackState()));
- result.append(", contentPosition=").append(getContentPosition());
- result.append(", contentDuration=").append(getContentDuration());
- result.append(", extras=").append(getExtras());
- result.append(" }");
- return result.toString();
- }
-
- private static String playbackStateToString(int playbackState) {
- switch (playbackState) {
- case PLAYBACK_STATE_PENDING:
- return "pending";
- case PLAYBACK_STATE_BUFFERING:
- return "buffering";
- case PLAYBACK_STATE_PLAYING:
- return "playing";
- case PLAYBACK_STATE_PAUSED:
- return "paused";
- case PLAYBACK_STATE_FINISHED:
- return "finished";
- case PLAYBACK_STATE_CANCELED:
- return "canceled";
- case PLAYBACK_STATE_INVALIDATED:
- return "invalidated";
- case PLAYBACK_STATE_ERROR:
- return "error";
- }
- return Integer.toString(playbackState);
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaItemStatus fromBundle(Bundle bundle) {
- return bundle != null ? new MediaItemStatus(bundle) : null;
- }
-
- /**
- * Builder for {@link MediaItemStatus media item status objects}.
- */
- public static final class Builder {
- private final Bundle mBundle;
-
- /**
- * Creates a media item status builder using the current time as the
- * reference timestamp.
- *
- * @param playbackState The item playback state.
- */
- public Builder(int playbackState) {
- mBundle = new Bundle();
- setTimestamp(SystemClock.elapsedRealtime());
- setPlaybackState(playbackState);
- }
-
- /**
- * Creates a media item status builder whose initial contents are
- * copied from an existing status.
- */
- public Builder(MediaItemStatus status) {
- if (status == null) {
- throw new IllegalArgumentException("status must not be null");
- }
-
- mBundle = new Bundle(status.mBundle);
- }
-
- /**
- * Sets the timestamp associated with the status information in
- * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
- */
- public Builder setTimestamp(long elapsedRealtimeTimestamp) {
- mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp);
- return this;
- }
-
- /**
- * Sets the playback state of the media item.
- */
- public Builder setPlaybackState(int playbackState) {
- mBundle.putInt(KEY_PLAYBACK_STATE, playbackState);
- return this;
- }
-
- /**
- * Sets the content playback position as a long integer number of milliseconds
- * from the beginning of the content.
- */
- public Builder setContentPosition(long positionMilliseconds) {
- mBundle.putLong(KEY_CONTENT_POSITION, positionMilliseconds);
- return this;
- }
-
- /**
- * Sets the total duration of the content to be played as a long integer number
- * of milliseconds.
- */
- public Builder setContentDuration(long durationMilliseconds) {
- mBundle.putLong(KEY_CONTENT_DURATION, durationMilliseconds);
- return this;
- }
-
- /**
- * Sets a bundle of extras for this status object.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Builder setExtras(Bundle extras) {
- mBundle.putBundle(KEY_EXTRAS, extras);
- return this;
- }
-
- /**
- * Builds the {@link MediaItemStatus media item status object}.
- */
- public MediaItemStatus build() {
- return new MediaItemStatus(mBundle);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDescriptor.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDescriptor.java
deleted file mode 100644
index 6bc84fc..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDescriptor.java
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.content.IntentFilter;
-import android.content.IntentSender;
-import android.net.Uri;
-import android.os.Bundle;
-import android.text.TextUtils;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Describes the properties of a route.
- * <p>
- * Each route is uniquely identified by an opaque id string. This token
- * may take any form as long as it is unique within the media route provider.
- * </p><p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- */
-public final class MediaRouteDescriptor {
- static final String KEY_ID = "id";
- static final String KEY_GROUP_MEMBER_IDS = "groupMemberIds";
- static final String KEY_NAME = "name";
- static final String KEY_DESCRIPTION = "status";
- static final String KEY_ICON_URI = "iconUri";
- static final String KEY_ENABLED = "enabled";
- static final String KEY_CONNECTING = "connecting";
- static final String KEY_CONNECTION_STATE = "connectionState";
- static final String KEY_CONTROL_FILTERS = "controlFilters";
- static final String KEY_PLAYBACK_TYPE = "playbackType";
- static final String KEY_PLAYBACK_STREAM = "playbackStream";
- static final String KEY_DEVICE_TYPE = "deviceType";
- static final String KEY_VOLUME = "volume";
- static final String KEY_VOLUME_MAX = "volumeMax";
- static final String KEY_VOLUME_HANDLING = "volumeHandling";
- static final String KEY_PRESENTATION_DISPLAY_ID = "presentationDisplayId";
- static final String KEY_EXTRAS = "extras";
- static final String KEY_CAN_DISCONNECT = "canDisconnect";
- static final String KEY_SETTINGS_INTENT = "settingsIntent";
- static final String KEY_MIN_CLIENT_VERSION = "minClientVersion";
- static final String KEY_MAX_CLIENT_VERSION = "maxClientVersion";
-
- final Bundle mBundle;
- List<IntentFilter> mControlFilters;
-
- MediaRouteDescriptor(Bundle bundle, List<IntentFilter> controlFilters) {
- mBundle = bundle;
- mControlFilters = controlFilters;
- }
-
- /**
- * Gets the unique id of the route.
- * <p>
- * The route id associated with a route descriptor functions as a stable
- * identifier for the route and must be unique among all routes offered
- * by the provider.
- * </p>
- */
- public String getId() {
- return mBundle.getString(KEY_ID);
- }
-
- /**
- * Gets the group member ids of the route.
- * <p>
- * A route descriptor that has one or more group member route ids
- * represents a route group. A member route may belong to another group.
- * </p>
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public List<String> getGroupMemberIds() {
- return mBundle.getStringArrayList(KEY_GROUP_MEMBER_IDS);
- }
-
- /**
- * Gets the user-visible name of the route.
- * <p>
- * The route name identifies the destination represented by the route.
- * It may be a user-supplied name, an alias, or device serial number.
- * </p>
- */
- public String getName() {
- return mBundle.getString(KEY_NAME);
- }
-
- /**
- * Gets the user-visible description of the route.
- * <p>
- * The route description describes the kind of destination represented by the route.
- * It may be a user-supplied string, a model number or brand of device.
- * </p>
- */
- public String getDescription() {
- return mBundle.getString(KEY_DESCRIPTION);
- }
-
- /**
- * Gets the URI of the icon representing this route.
- * <p>
- * This icon will be used in picker UIs if available.
- * </p>
- */
- public Uri getIconUri() {
- String iconUri = mBundle.getString(KEY_ICON_URI);
- return iconUri == null ? null : Uri.parse(iconUri);
- }
-
- /**
- * Gets whether the route is enabled.
- */
- public boolean isEnabled() {
- return mBundle.getBoolean(KEY_ENABLED, true);
- }
-
- /**
- * Gets whether the route is connecting.
- * @deprecated Use {@link #getConnectionState} instead
- */
- @Deprecated
- public boolean isConnecting() {
- return mBundle.getBoolean(KEY_CONNECTING, false);
- }
-
- /**
- * Gets the connection state of the route.
- *
- * @return The connection state of this route:
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_DISCONNECTED},
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTING}, or
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTED}.
- */
- public int getConnectionState() {
- return mBundle.getInt(KEY_CONNECTION_STATE,
- MediaRouter.RouteInfo.CONNECTION_STATE_DISCONNECTED);
- }
-
- /**
- * Gets whether the route can be disconnected without stopping playback.
- * <p>
- * The route can normally be disconnected without stopping playback when
- * the destination device on the route is connected to two or more source
- * devices. The route provider should update the route immediately when the
- * number of connected devices changes.
- * </p><p>
- * To specify that the route should disconnect without stopping use
- * {@link MediaRouter#unselect(int)} with
- * {@link MediaRouter#UNSELECT_REASON_DISCONNECTED}.
- * </p>
- */
- public boolean canDisconnectAndKeepPlaying() {
- return mBundle.getBoolean(KEY_CAN_DISCONNECT, false);
- }
-
- /**
- * Gets an {@link IntentSender} for starting a settings activity for this
- * route. The activity may have specific route settings or general settings
- * for the connected device or route provider.
- *
- * @return An {@link IntentSender} to start a settings activity.
- */
- public IntentSender getSettingsActivity() {
- return mBundle.getParcelable(KEY_SETTINGS_INTENT);
- }
-
- /**
- * Gets the route's {@link MediaControlIntent media control intent} filters.
- */
- public List<IntentFilter> getControlFilters() {
- ensureControlFilters();
- return mControlFilters;
- }
-
- void ensureControlFilters() {
- if (mControlFilters == null) {
- mControlFilters = mBundle.<IntentFilter>getParcelableArrayList(KEY_CONTROL_FILTERS);
- if (mControlFilters == null) {
- mControlFilters = Collections.<IntentFilter>emptyList();
- }
- }
- }
-
- /**
- * Gets the type of playback associated with this route.
- *
- * @return The type of playback associated with this route:
- * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_LOCAL} or
- * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_REMOTE}.
- */
- public int getPlaybackType() {
- return mBundle.getInt(KEY_PLAYBACK_TYPE, MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE);
- }
-
- /**
- * Gets the route's playback stream.
- */
- public int getPlaybackStream() {
- return mBundle.getInt(KEY_PLAYBACK_STREAM, -1);
- }
-
- /**
- * Gets the type of the receiver device associated with this route.
- *
- * @return The type of the receiver device associated with this route:
- * {@link MediaRouter.RouteInfo#DEVICE_TYPE_TV} or
- * {@link MediaRouter.RouteInfo#DEVICE_TYPE_SPEAKER}.
- */
- public int getDeviceType() {
- return mBundle.getInt(KEY_DEVICE_TYPE);
- }
-
- /**
- * Gets the route's current volume, or 0 if unknown.
- */
- public int getVolume() {
- return mBundle.getInt(KEY_VOLUME);
- }
-
- /**
- * Gets the route's maximum volume, or 0 if unknown.
- */
- public int getVolumeMax() {
- return mBundle.getInt(KEY_VOLUME_MAX);
- }
-
- /**
- * Gets information about how volume is handled on the route.
- *
- * @return How volume is handled on the route:
- * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_FIXED} or
- * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_VARIABLE}.
- */
- public int getVolumeHandling() {
- return mBundle.getInt(KEY_VOLUME_HANDLING,
- MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED);
- }
-
- /**
- * Gets the route's presentation display id, or -1 if none.
- */
- public int getPresentationDisplayId() {
- return mBundle.getInt(
- KEY_PRESENTATION_DISPLAY_ID, MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE);
- }
-
- /**
- * Gets a bundle of extras for this route descriptor.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Bundle getExtras() {
- return mBundle.getBundle(KEY_EXTRAS);
- }
-
- /**
- * Gets the minimum client version required for this route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public int getMinClientVersion() {
- return mBundle.getInt(KEY_MIN_CLIENT_VERSION,
- MediaRouteProviderProtocol.CLIENT_VERSION_START);
- }
-
- /**
- * Gets the maximum client version required for this route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public int getMaxClientVersion() {
- return mBundle.getInt(KEY_MAX_CLIENT_VERSION, Integer.MAX_VALUE);
- }
-
- /**
- * Returns true if the route descriptor has all of the required fields.
- */
- public boolean isValid() {
- ensureControlFilters();
- if (TextUtils.isEmpty(getId())
- || TextUtils.isEmpty(getName())
- || mControlFilters.contains(null)) {
- return false;
- }
- return true;
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaRouteDescriptor{ ");
- result.append("id=").append(getId());
- result.append(", groupMemberIds=").append(getGroupMemberIds());
- result.append(", name=").append(getName());
- result.append(", description=").append(getDescription());
- result.append(", iconUri=").append(getIconUri());
- result.append(", isEnabled=").append(isEnabled());
- result.append(", isConnecting=").append(isConnecting());
- result.append(", connectionState=").append(getConnectionState());
- result.append(", controlFilters=").append(Arrays.toString(getControlFilters().toArray()));
- result.append(", playbackType=").append(getPlaybackType());
- result.append(", playbackStream=").append(getPlaybackStream());
- result.append(", deviceType=").append(getDeviceType());
- result.append(", volume=").append(getVolume());
- result.append(", volumeMax=").append(getVolumeMax());
- result.append(", volumeHandling=").append(getVolumeHandling());
- result.append(", presentationDisplayId=").append(getPresentationDisplayId());
- result.append(", extras=").append(getExtras());
- result.append(", isValid=").append(isValid());
- result.append(", minClientVersion=").append(getMinClientVersion());
- result.append(", maxClientVersion=").append(getMaxClientVersion());
- result.append(" }");
- return result.toString();
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaRouteDescriptor fromBundle(Bundle bundle) {
- return bundle != null ? new MediaRouteDescriptor(bundle, null) : null;
- }
-
- /**
- * Builder for {@link MediaRouteDescriptor media route descriptors}.
- */
- public static final class Builder {
- private final Bundle mBundle;
- private ArrayList<String> mGroupMemberIds;
- private ArrayList<IntentFilter> mControlFilters;
-
- /**
- * Creates a media route descriptor builder.
- *
- * @param id The unique id of the route.
- * @param name The user-visible name of the route.
- */
- public Builder(String id, String name) {
- mBundle = new Bundle();
- setId(id);
- setName(name);
- }
-
- /**
- * Creates a media route descriptor builder whose initial contents are
- * copied from an existing descriptor.
- */
- public Builder(MediaRouteDescriptor descriptor) {
- if (descriptor == null) {
- throw new IllegalArgumentException("descriptor must not be null");
- }
-
- mBundle = new Bundle(descriptor.mBundle);
-
- descriptor.ensureControlFilters();
- if (!descriptor.mControlFilters.isEmpty()) {
- mControlFilters = new ArrayList<IntentFilter>(descriptor.mControlFilters);
- }
- }
-
- /**
- * Sets the unique id of the route.
- * <p>
- * The route id associated with a route descriptor functions as a stable
- * identifier for the route and must be unique among all routes offered
- * by the provider.
- * </p>
- */
- public Builder setId(String id) {
- mBundle.putString(KEY_ID, id);
- return this;
- }
-
- /**
- * Adds a group member id of the route.
- * <p>
- * A route descriptor that has one or more group member route ids
- * represents a route group. A member route may belong to another group.
- * </p>
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public Builder addGroupMemberId(String groupMemberId) {
- if (TextUtils.isEmpty(groupMemberId)) {
- throw new IllegalArgumentException("groupMemberId must not be empty");
- }
-
- if (mGroupMemberIds == null) {
- mGroupMemberIds = new ArrayList<>();
- }
- if (!mGroupMemberIds.contains(groupMemberId)) {
- mGroupMemberIds.add(groupMemberId);
- }
- return this;
- }
-
- /**
- * Adds a list of group member ids of the route.
- * <p>
- * A route descriptor that has one or more group member route ids
- * represents a route group. A member route may belong to another group.
- * </p>
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public Builder addGroupMemberIds(Collection<String> groupMemberIds) {
- if (groupMemberIds == null) {
- throw new IllegalArgumentException("groupMemberIds must not be null");
- }
-
- if (!groupMemberIds.isEmpty()) {
- for (String groupMemberId : groupMemberIds) {
- addGroupMemberId(groupMemberId);
- }
- }
- return this;
- }
-
- /**
- * Sets the user-visible name of the route.
- * <p>
- * The route name identifies the destination represented by the route.
- * It may be a user-supplied name, an alias, or device serial number.
- * </p>
- */
- public Builder setName(String name) {
- mBundle.putString(KEY_NAME, name);
- return this;
- }
-
- /**
- * Sets the user-visible description of the route.
- * <p>
- * The route description describes the kind of destination represented by the route.
- * It may be a user-supplied string, a model number or brand of device.
- * </p>
- */
- public Builder setDescription(String description) {
- mBundle.putString(KEY_DESCRIPTION, description);
- return this;
- }
-
- /**
- * Sets the URI of the icon representing this route.
- * <p>
- * This icon will be used in picker UIs if available.
- * </p><p>
- * The URI must be one of the following formats:
- * <ul>
- * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
- * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})
- * </li>
- * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
- * </ul>
- * </p>
- */
- public Builder setIconUri(Uri iconUri) {
- if (iconUri == null) {
- throw new IllegalArgumentException("iconUri must not be null");
- }
- mBundle.putString(KEY_ICON_URI, iconUri.toString());
- return this;
- }
-
- /**
- * Sets whether the route is enabled.
- * <p>
- * Disabled routes represent routes that a route provider knows about, such as paired
- * Wifi Display receivers, but that are not currently available for use.
- * </p>
- */
- public Builder setEnabled(boolean enabled) {
- mBundle.putBoolean(KEY_ENABLED, enabled);
- return this;
- }
-
- /**
- * Sets whether the route is in the process of connecting and is not yet
- * ready for use.
- * @deprecated Use {@link #setConnectionState} instead.
- */
- @Deprecated
- public Builder setConnecting(boolean connecting) {
- mBundle.putBoolean(KEY_CONNECTING, connecting);
- return this;
- }
-
- /**
- * Sets the route's connection state.
- *
- * @param connectionState The connection state of the route:
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_DISCONNECTED},
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTING}, or
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTED}.
- */
- public Builder setConnectionState(int connectionState) {
- mBundle.putInt(KEY_CONNECTION_STATE, connectionState);
- return this;
- }
-
- /**
- * Sets whether the route can be disconnected without stopping playback.
- */
- public Builder setCanDisconnect(boolean canDisconnect) {
- mBundle.putBoolean(KEY_CAN_DISCONNECT, canDisconnect);
- return this;
- }
-
- /**
- * Sets an intent sender for launching the settings activity for this
- * route.
- */
- public Builder setSettingsActivity(IntentSender is) {
- mBundle.putParcelable(KEY_SETTINGS_INTENT, is);
- return this;
- }
-
- /**
- * Adds a {@link MediaControlIntent media control intent} filter for the route.
- */
- public Builder addControlFilter(IntentFilter filter) {
- if (filter == null) {
- throw new IllegalArgumentException("filter must not be null");
- }
-
- if (mControlFilters == null) {
- mControlFilters = new ArrayList<IntentFilter>();
- }
- if (!mControlFilters.contains(filter)) {
- mControlFilters.add(filter);
- }
- return this;
- }
-
- /**
- * Adds a list of {@link MediaControlIntent media control intent} filters for the route.
- */
- public Builder addControlFilters(Collection<IntentFilter> filters) {
- if (filters == null) {
- throw new IllegalArgumentException("filters must not be null");
- }
-
- if (!filters.isEmpty()) {
- for (IntentFilter filter : filters) {
- addControlFilter(filter);
- }
- }
- return this;
- }
-
- /**
- * Sets the route's playback type.
- *
- * @param playbackType The playback type of the route:
- * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_LOCAL} or
- * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_REMOTE}.
- */
- public Builder setPlaybackType(int playbackType) {
- mBundle.putInt(KEY_PLAYBACK_TYPE, playbackType);
- return this;
- }
-
- /**
- * Sets the route's playback stream.
- */
- public Builder setPlaybackStream(int playbackStream) {
- mBundle.putInt(KEY_PLAYBACK_STREAM, playbackStream);
- return this;
- }
-
- /**
- * Sets the route's receiver device type.
- *
- * @param deviceType The receive device type of the route:
- * {@link MediaRouter.RouteInfo#DEVICE_TYPE_TV} or
- * {@link MediaRouter.RouteInfo#DEVICE_TYPE_SPEAKER}.
- */
- public Builder setDeviceType(int deviceType) {
- mBundle.putInt(KEY_DEVICE_TYPE, deviceType);
- return this;
- }
-
- /**
- * Sets the route's current volume, or 0 if unknown.
- */
- public Builder setVolume(int volume) {
- mBundle.putInt(KEY_VOLUME, volume);
- return this;
- }
-
- /**
- * Sets the route's maximum volume, or 0 if unknown.
- */
- public Builder setVolumeMax(int volumeMax) {
- mBundle.putInt(KEY_VOLUME_MAX, volumeMax);
- return this;
- }
-
- /**
- * Sets the route's volume handling.
- *
- * @param volumeHandling how volume is handled on the route:
- * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_FIXED} or
- * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_VARIABLE}.
- */
- public Builder setVolumeHandling(int volumeHandling) {
- mBundle.putInt(KEY_VOLUME_HANDLING, volumeHandling);
- return this;
- }
-
- /**
- * Sets the route's presentation display id, or -1 if none.
- */
- public Builder setPresentationDisplayId(int presentationDisplayId) {
- mBundle.putInt(KEY_PRESENTATION_DISPLAY_ID, presentationDisplayId);
- return this;
- }
-
- /**
- * Sets a bundle of extras for this route descriptor.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Builder setExtras(Bundle extras) {
- mBundle.putBundle(KEY_EXTRAS, extras);
- return this;
- }
-
- /**
- * Sets the route's minimum client version.
- * A router whose version is lower than this will not be able to connect to this route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public Builder setMinClientVersion(int minVersion) {
- mBundle.putInt(KEY_MIN_CLIENT_VERSION, minVersion);
- return this;
- }
-
- /**
- * Sets the route's maximum client version.
- * A router whose version is higher than this will not be able to connect to this route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public Builder setMaxClientVersion(int maxVersion) {
- mBundle.putInt(KEY_MAX_CLIENT_VERSION, maxVersion);
- return this;
- }
-
- /**
- * Builds the {@link MediaRouteDescriptor media route descriptor}.
- */
- public MediaRouteDescriptor build() {
- if (mControlFilters != null) {
- mBundle.putParcelableArrayList(KEY_CONTROL_FILTERS, mControlFilters);
- }
- if (mGroupMemberIds != null) {
- mBundle.putStringArrayList(KEY_GROUP_MEMBER_IDS, mGroupMemberIds);
- }
- return new MediaRouteDescriptor(mBundle, mControlFilters);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDiscoveryRequest.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDiscoveryRequest.java
deleted file mode 100644
index 039627f..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDiscoveryRequest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.os.Bundle;
-
-/**
- * Describes the kinds of routes that the media router would like to discover
- * and whether to perform active scanning.
- * <p>
- * This object is immutable once created.
- * </p>
- */
-public final class MediaRouteDiscoveryRequest {
- private static final String KEY_SELECTOR = "selector";
- private static final String KEY_ACTIVE_SCAN = "activeScan";
-
- private final Bundle mBundle;
- private MediaRouteSelector mSelector;
-
- /**
- * Creates a media route discovery request.
- *
- * @param selector The route selector that specifies the kinds of routes to discover.
- * @param activeScan True if active scanning should be performed.
- */
- public MediaRouteDiscoveryRequest(MediaRouteSelector selector, boolean activeScan) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- mBundle = new Bundle();
- mSelector = selector;
- mBundle.putBundle(KEY_SELECTOR, selector.asBundle());
- mBundle.putBoolean(KEY_ACTIVE_SCAN, activeScan);
- }
-
- private MediaRouteDiscoveryRequest(Bundle bundle) {
- mBundle = bundle;
- }
-
- /**
- * Gets the route selector that specifies the kinds of routes to discover.
- */
- public MediaRouteSelector getSelector() {
- ensureSelector();
- return mSelector;
- }
-
- private void ensureSelector() {
- if (mSelector == null) {
- mSelector = MediaRouteSelector.fromBundle(mBundle.getBundle(KEY_SELECTOR));
- if (mSelector == null) {
- mSelector = MediaRouteSelector.EMPTY;
- }
- }
- }
-
- /**
- * Returns true if active scanning should be performed.
- *
- * @see MediaRouter#CALLBACK_FLAG_PERFORM_ACTIVE_SCAN
- */
- public boolean isActiveScan() {
- return mBundle.getBoolean(KEY_ACTIVE_SCAN);
- }
-
- /**
- * Returns true if the discovery request has all of the required fields.
- */
- public boolean isValid() {
- ensureSelector();
- return mSelector.isValid();
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof MediaRouteDiscoveryRequest) {
- MediaRouteDiscoveryRequest other = (MediaRouteDiscoveryRequest)o;
- return getSelector().equals(other.getSelector())
- && isActiveScan() == other.isActiveScan();
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return getSelector().hashCode() ^ (isActiveScan() ? 1 : 0);
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("DiscoveryRequest{ selector=").append(getSelector());
- result.append(", activeScan=").append(isActiveScan());
- result.append(", isValid=").append(isValid());
- result.append(" }");
- return result.toString();
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaRouteDiscoveryRequest fromBundle(Bundle bundle) {
- return bundle != null ? new MediaRouteDiscoveryRequest(bundle) : null;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProvider.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProvider.java
deleted file mode 100644
index 7ea328c..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProvider.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Message;
-
-import androidx.core.util.ObjectsCompat;
-
-import com.android.support.mediarouter.media.MediaRouter.ControlRequestCallback;
-
-/**
- * Media route providers are used to publish additional media routes for
- * use within an application. Media route providers may also be declared
- * as a service to publish additional media routes to all applications
- * in the system.
- * <p>
- * The purpose of a media route provider is to discover media routes that satisfy
- * the criteria specified by the current {@link MediaRouteDiscoveryRequest} and publish a
- * {@link MediaRouteProviderDescriptor} with information about each route by calling
- * {@link #setDescriptor} to notify the currently registered {@link Callback}.
- * </p><p>
- * The provider should watch for changes to the discovery request by implementing
- * {@link #onDiscoveryRequestChanged} and updating the set of routes that it is
- * attempting to discover. It should also handle route control requests such
- * as volume changes or {@link MediaControlIntent media control intents}
- * by implementing {@link #onCreateRouteController} to return a {@link RouteController}
- * for a particular route.
- * </p><p>
- * A media route provider may be used privately within the scope of a single
- * application process by calling {@link MediaRouter#addProvider MediaRouter.addProvider}
- * to add it to the local {@link MediaRouter}. A media route provider may also be made
- * available globally to all applications by registering a {@link MediaRouteProviderService}
- * in the provider's manifest. When the media route provider is registered
- * as a service, all applications that use the media router API will be able to
- * discover and used the provider's routes without having to install anything else.
- * </p><p>
- * This object must only be accessed on the main thread.
- * </p>
- */
-public abstract class MediaRouteProvider {
- static final int MSG_DELIVER_DESCRIPTOR_CHANGED = 1;
- static final int MSG_DELIVER_DISCOVERY_REQUEST_CHANGED = 2;
-
- private final Context mContext;
- private final ProviderMetadata mMetadata;
- private final ProviderHandler mHandler = new ProviderHandler();
-
- private Callback mCallback;
-
- private MediaRouteDiscoveryRequest mDiscoveryRequest;
- private boolean mPendingDiscoveryRequestChange;
-
- private MediaRouteProviderDescriptor mDescriptor;
- private boolean mPendingDescriptorChange;
-
- /**
- * Creates a media route provider.
- *
- * @param context The context.
- */
- public MediaRouteProvider(@NonNull Context context) {
- this(context, null);
- }
-
- MediaRouteProvider(Context context, ProviderMetadata metadata) {
- if (context == null) {
- throw new IllegalArgumentException("context must not be null");
- }
-
- mContext = context;
- if (metadata == null) {
- mMetadata = new ProviderMetadata(new ComponentName(context, getClass()));
- } else {
- mMetadata = metadata;
- }
- }
-
- /**
- * Gets the context of the media route provider.
- */
- public final Context getContext() {
- return mContext;
- }
-
- /**
- * Gets the provider's handler which is associated with the main thread.
- */
- public final Handler getHandler() {
- return mHandler;
- }
-
- /**
- * Gets some metadata about the provider's implementation.
- */
- public final ProviderMetadata getMetadata() {
- return mMetadata;
- }
-
- /**
- * Sets a callback to invoke when the provider's descriptor changes.
- *
- * @param callback The callback to use, or null if none.
- */
- public final void setCallback(@Nullable Callback callback) {
- MediaRouter.checkCallingThread();
- mCallback = callback;
- }
-
- /**
- * Gets the current discovery request which informs the provider about the
- * kinds of routes to discover and whether to perform active scanning.
- *
- * @return The current discovery request, or null if no discovery is needed at this time.
- *
- * @see #onDiscoveryRequestChanged
- */
- @Nullable
- public final MediaRouteDiscoveryRequest getDiscoveryRequest() {
- return mDiscoveryRequest;
- }
-
- /**
- * Sets a discovery request to inform the provider about the kinds of
- * routes that its clients would like to discover and whether to perform active scanning.
- *
- * @param request The discovery request, or null if no discovery is needed at this time.
- *
- * @see #onDiscoveryRequestChanged
- */
- public final void setDiscoveryRequest(MediaRouteDiscoveryRequest request) {
- MediaRouter.checkCallingThread();
-
- if (ObjectsCompat.equals(mDiscoveryRequest, request)) {
- return;
- }
-
- mDiscoveryRequest = request;
- if (!mPendingDiscoveryRequestChange) {
- mPendingDiscoveryRequestChange = true;
- mHandler.sendEmptyMessage(MSG_DELIVER_DISCOVERY_REQUEST_CHANGED);
- }
- }
-
- void deliverDiscoveryRequestChanged() {
- mPendingDiscoveryRequestChange = false;
- onDiscoveryRequestChanged(mDiscoveryRequest);
- }
-
- /**
- * Called by the media router when the {@link MediaRouteDiscoveryRequest discovery request}
- * has changed.
- * <p>
- * Whenever an applications calls {@link MediaRouter#addCallback} to register
- * a callback, it also provides a selector to specify the kinds of routes that
- * it is interested in. The media router combines all of these selectors together
- * to generate a {@link MediaRouteDiscoveryRequest} and notifies each provider when a change
- * occurs by calling {@link #setDiscoveryRequest} which posts a message to invoke
- * this method asynchronously.
- * </p><p>
- * The provider should examine the {@link MediaControlIntent media control categories}
- * in the discovery request's {@link MediaRouteSelector selector} to determine what
- * kinds of routes it should try to discover and whether it should perform active
- * or passive scans. In many cases, the provider may be able to save power by
- * determining that the selector does not contain any categories that it supports
- * and it can therefore avoid performing any scans at all.
- * </p>
- *
- * @param request The new discovery request, or null if no discovery is needed at this time.
- *
- * @see MediaRouter#addCallback
- */
- public void onDiscoveryRequestChanged(@Nullable MediaRouteDiscoveryRequest request) {
- }
-
- /**
- * Gets the provider's descriptor.
- * <p>
- * The descriptor describes the state of the media route provider and
- * the routes that it publishes. Watch for changes to the descriptor
- * by registering a {@link Callback callback} with {@link #setCallback}.
- * </p>
- *
- * @return The media route provider descriptor, or null if none.
- *
- * @see Callback#onDescriptorChanged
- */
- @Nullable
- public final MediaRouteProviderDescriptor getDescriptor() {
- return mDescriptor;
- }
-
- /**
- * Sets the provider's descriptor.
- * <p>
- * The provider must call this method to notify the currently registered
- * {@link Callback callback} about the change to the provider's descriptor.
- * </p>
- *
- * @param descriptor The updated route provider descriptor, or null if none.
- *
- * @see Callback#onDescriptorChanged
- */
- public final void setDescriptor(@Nullable MediaRouteProviderDescriptor descriptor) {
- MediaRouter.checkCallingThread();
-
- if (mDescriptor != descriptor) {
- mDescriptor = descriptor;
- if (!mPendingDescriptorChange) {
- mPendingDescriptorChange = true;
- mHandler.sendEmptyMessage(MSG_DELIVER_DESCRIPTOR_CHANGED);
- }
- }
- }
-
- void deliverDescriptorChanged() {
- mPendingDescriptorChange = false;
-
- if (mCallback != null) {
- mCallback.onDescriptorChanged(this, mDescriptor);
- }
- }
-
- /**
- * Called by the media router to obtain a route controller for a particular route.
- * <p>
- * The media router will invoke the {@link RouteController#onRelease} method of the route
- * controller when it is no longer needed to allow it to free its resources.
- * </p>
- *
- * @param routeId The unique id of the route.
- * @return The route controller. Returns null if there is no such route or if the route
- * cannot be controlled using the route controller interface.
- */
- @Nullable
- public RouteController onCreateRouteController(@NonNull String routeId) {
- if (routeId == null) {
- throw new IllegalArgumentException("routeId cannot be null");
- }
- return null;
- }
-
- /**
- * Called by the media router to obtain a route controller for a particular route which is a
- * member of {@link MediaRouter.RouteGroup}.
- * <p>
- * The media router will invoke the {@link RouteController#onRelease} method of the route
- * controller when it is no longer needed to allow it to free its resources.
- * </p>
- *
- * @param routeId The unique id of the member route.
- * @param routeGroupId The unique id of the route group.
- * @return The route controller. Returns null if there is no such route or if the route
- * cannot be controlled using the route controller interface.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- @Nullable
- public RouteController onCreateRouteController(@NonNull String routeId,
- @NonNull String routeGroupId) {
- if (routeId == null) {
- throw new IllegalArgumentException("routeId cannot be null");
- }
- if (routeGroupId == null) {
- throw new IllegalArgumentException("routeGroupId cannot be null");
- }
- return onCreateRouteController(routeId);
- }
-
- /**
- * Describes properties of the route provider's implementation.
- * <p>
- * This object is immutable once created.
- * </p>
- */
- public static final class ProviderMetadata {
- private final ComponentName mComponentName;
-
- ProviderMetadata(ComponentName componentName) {
- if (componentName == null) {
- throw new IllegalArgumentException("componentName must not be null");
- }
- mComponentName = componentName;
- }
-
- /**
- * Gets the provider's package name.
- */
- public String getPackageName() {
- return mComponentName.getPackageName();
- }
-
- /**
- * Gets the provider's component name.
- */
- public ComponentName getComponentName() {
- return mComponentName;
- }
-
- @Override
- public String toString() {
- return "ProviderMetadata{ componentName="
- + mComponentName.flattenToShortString() + " }";
- }
- }
-
- /**
- * Provides control over a particular route.
- * <p>
- * The media router obtains a route controller for a route whenever it needs
- * to control a route. When a route is selected, the media router invokes
- * the {@link #onSelect} method of its route controller. While selected,
- * the media router may call other methods of the route controller to
- * request that it perform certain actions to the route. When a route is
- * unselected, the media router invokes the {@link #onUnselect} method of its
- * route controller. When the media route no longer needs the route controller
- * it will invoke the {@link #onRelease} method to allow the route controller
- * to free its resources.
- * </p><p>
- * There may be multiple route controllers simultaneously active for the
- * same route. Each route controller will be released separately.
- * </p><p>
- * All operations on the route controller are asynchronous and
- * results are communicated via callbacks.
- * </p>
- */
- public static abstract class RouteController {
- /**
- * Releases the route controller, allowing it to free its resources.
- */
- public void onRelease() {
- }
-
- /**
- * Selects the route.
- */
- public void onSelect() {
- }
-
- /**
- * Unselects the route.
- */
- public void onUnselect() {
- }
-
- /**
- * Unselects the route and provides a reason. The default implementation
- * calls {@link #onUnselect()}.
- * <p>
- * The reason provided will be one of the following:
- * <ul>
- * <li>{@link MediaRouter#UNSELECT_REASON_UNKNOWN}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_DISCONNECTED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_STOPPED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_ROUTE_CHANGED}</li>
- * </ul>
- *
- * @param reason The reason for unselecting the route.
- */
- public void onUnselect(int reason) {
- onUnselect();
- }
-
- /**
- * Requests to set the volume of the route.
- *
- * @param volume The new volume value between 0 and {@link MediaRouteDescriptor#getVolumeMax}.
- */
- public void onSetVolume(int volume) {
- }
-
- /**
- * Requests an incremental volume update for the route.
- *
- * @param delta The delta to add to the current volume.
- */
- public void onUpdateVolume(int delta) {
- }
-
- /**
- * Performs a {@link MediaControlIntent media control} request
- * asynchronously on behalf of the route.
- *
- * @param intent A {@link MediaControlIntent media control intent}.
- * @param callback A {@link ControlRequestCallback} to invoke with the result
- * of the request, or null if no result is required.
- * @return True if the controller intends to handle the request and will
- * invoke the callback when finished. False if the controller will not
- * handle the request and will not invoke the callback.
- *
- * @see MediaControlIntent
- */
- public boolean onControlRequest(Intent intent, @Nullable ControlRequestCallback callback) {
- return false;
- }
- }
-
- /**
- * Callback which is invoked when route information becomes available or changes.
- */
- public static abstract class Callback {
- /**
- * Called when information about a route provider and its routes changes.
- *
- * @param provider The media route provider that changed, never null.
- * @param descriptor The new media route provider descriptor, or null if none.
- */
- public void onDescriptorChanged(@NonNull MediaRouteProvider provider,
- @Nullable MediaRouteProviderDescriptor descriptor) {
- }
- }
-
- private final class ProviderHandler extends Handler {
- ProviderHandler() {
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_DELIVER_DESCRIPTOR_CHANGED:
- deliverDescriptorChanged();
- break;
- case MSG_DELIVER_DISCOVERY_REQUEST_CHANGED:
- deliverDiscoveryRequestChanged();
- break;
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderDescriptor.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderDescriptor.java
deleted file mode 100644
index eb1ce09..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderDescriptor.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.os.Bundle;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Describes the state of a media route provider and the routes that it publishes.
- * <p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- */
-public final class MediaRouteProviderDescriptor {
- private static final String KEY_ROUTES = "routes";
-
- private final Bundle mBundle;
- private List<MediaRouteDescriptor> mRoutes;
-
- private MediaRouteProviderDescriptor(Bundle bundle, List<MediaRouteDescriptor> routes) {
- mBundle = bundle;
- mRoutes = routes;
- }
-
- /**
- * Gets the list of all routes that this provider has published.
- */
- public List<MediaRouteDescriptor> getRoutes() {
- ensureRoutes();
- return mRoutes;
- }
-
- private void ensureRoutes() {
- if (mRoutes == null) {
- ArrayList<Bundle> routeBundles = mBundle.<Bundle>getParcelableArrayList(KEY_ROUTES);
- if (routeBundles == null || routeBundles.isEmpty()) {
- mRoutes = Collections.<MediaRouteDescriptor>emptyList();
- } else {
- final int count = routeBundles.size();
- mRoutes = new ArrayList<MediaRouteDescriptor>(count);
- for (int i = 0; i < count; i++) {
- mRoutes.add(MediaRouteDescriptor.fromBundle(routeBundles.get(i)));
- }
- }
- }
- }
-
- /**
- * Returns true if the route provider descriptor and all of the routes that
- * it contains have all of the required fields.
- * <p>
- * This verification is deep. If the provider descriptor is known to be
- * valid then it is not necessary to call {@link #isValid} on each of its routes.
- * </p>
- */
- public boolean isValid() {
- ensureRoutes();
- final int routeCount = mRoutes.size();
- for (int i = 0; i < routeCount; i++) {
- MediaRouteDescriptor route = mRoutes.get(i);
- if (route == null || !route.isValid()) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaRouteProviderDescriptor{ ");
- result.append("routes=").append(
- Arrays.toString(getRoutes().toArray()));
- result.append(", isValid=").append(isValid());
- result.append(" }");
- return result.toString();
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaRouteProviderDescriptor fromBundle(Bundle bundle) {
- return bundle != null ? new MediaRouteProviderDescriptor(bundle, null) : null;
- }
-
- /**
- * Builder for {@link MediaRouteProviderDescriptor media route provider descriptors}.
- */
- public static final class Builder {
- private final Bundle mBundle;
- private ArrayList<MediaRouteDescriptor> mRoutes;
-
- /**
- * Creates an empty media route provider descriptor builder.
- */
- public Builder() {
- mBundle = new Bundle();
- }
-
- /**
- * Creates a media route provider descriptor builder whose initial contents are
- * copied from an existing descriptor.
- */
- public Builder(MediaRouteProviderDescriptor descriptor) {
- if (descriptor == null) {
- throw new IllegalArgumentException("descriptor must not be null");
- }
-
- mBundle = new Bundle(descriptor.mBundle);
-
- descriptor.ensureRoutes();
- if (!descriptor.mRoutes.isEmpty()) {
- mRoutes = new ArrayList<MediaRouteDescriptor>(descriptor.mRoutes);
- }
- }
-
- /**
- * Adds a route.
- */
- public Builder addRoute(MediaRouteDescriptor route) {
- if (route == null) {
- throw new IllegalArgumentException("route must not be null");
- }
-
- if (mRoutes == null) {
- mRoutes = new ArrayList<MediaRouteDescriptor>();
- } else if (mRoutes.contains(route)) {
- throw new IllegalArgumentException("route descriptor already added");
- }
- mRoutes.add(route);
- return this;
- }
-
- /**
- * Adds a list of routes.
- */
- public Builder addRoutes(Collection<MediaRouteDescriptor> routes) {
- if (routes == null) {
- throw new IllegalArgumentException("routes must not be null");
- }
-
- if (!routes.isEmpty()) {
- for (MediaRouteDescriptor route : routes) {
- addRoute(route);
- }
- }
- return this;
- }
-
- /**
- * Sets the list of routes.
- */
- Builder setRoutes(Collection<MediaRouteDescriptor> routes) {
- if (routes == null || routes.isEmpty()) {
- mRoutes = null;
- mBundle.remove(KEY_ROUTES);
- } else {
- mRoutes = new ArrayList<>(routes);
- }
- return this;
- }
-
- /**
- * Builds the {@link MediaRouteProviderDescriptor media route provider descriptor}.
- */
- public MediaRouteProviderDescriptor build() {
- if (mRoutes != null) {
- final int count = mRoutes.size();
- ArrayList<Bundle> routeBundles = new ArrayList<Bundle>(count);
- for (int i = 0; i < count; i++) {
- routeBundles.add(mRoutes.get(i).asBundle());
- }
- mBundle.putParcelableArrayList(KEY_ROUTES, routeBundles);
- }
- return new MediaRouteProviderDescriptor(mBundle, mRoutes);
- }
- }
-}
\ No newline at end of file
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderProtocol.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderProtocol.java
deleted file mode 100644
index 6be9343..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderProtocol.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.Intent;
-import android.os.Messenger;
-
-/**
- * Defines the communication protocol for media route provider services.
- */
-abstract class MediaRouteProviderProtocol {
- /**
- * The {@link Intent} that must be declared as handled by the service.
- * Put this in your manifest.
- */
- public static final String SERVICE_INTERFACE =
- "android.media.MediaRouteProviderService";
-
- /*
- * Messages sent from the client to the service.
- * DO NOT RENUMBER THESE!
- */
-
- /** (client v1)
- * Register client.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : client version
- */
- public static final int CLIENT_MSG_REGISTER = 1;
-
- /** (client v1)
- * Unregister client.
- * - replyTo : client messenger
- * - arg1 : request id
- */
- public static final int CLIENT_MSG_UNREGISTER = 2;
-
- /** (client v1)
- * Create route controller.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- * - CLIENT_DATA_ROUTE_ID : route id string
- */
- public static final int CLIENT_MSG_CREATE_ROUTE_CONTROLLER = 3;
-
- /** (client v1)
- * Release route controller.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- */
- public static final int CLIENT_MSG_RELEASE_ROUTE_CONTROLLER = 4;
-
- /** (client v1)
- * Select route.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- */
- public static final int CLIENT_MSG_SELECT_ROUTE = 5;
-
- /** (client v1)
- * Unselect route.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- */
- public static final int CLIENT_MSG_UNSELECT_ROUTE = 6;
-
- /** (client v1)
- * Set route volume.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- * - CLIENT_DATA_VOLUME : volume integer
- */
- public static final int CLIENT_MSG_SET_ROUTE_VOLUME = 7;
-
- /** (client v1)
- * Update route volume.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- * - CLIENT_DATA_VOLUME : volume delta integer
- */
- public static final int CLIENT_MSG_UPDATE_ROUTE_VOLUME = 8;
-
- /** (client v1)
- * Route control request.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- * - obj : media control intent
- */
- public static final int CLIENT_MSG_ROUTE_CONTROL_REQUEST = 9;
-
- /** (client v1)
- * Sets the discovery request.
- * - replyTo : client messenger
- * - arg1 : request id
- * - obj : discovery request bundle, or null if none
- */
- public static final int CLIENT_MSG_SET_DISCOVERY_REQUEST = 10;
-
- public static final String CLIENT_DATA_ROUTE_ID = "routeId";
- public static final String CLIENT_DATA_ROUTE_LIBRARY_GROUP = "routeGroupId";
- public static final String CLIENT_DATA_VOLUME = "volume";
- public static final String CLIENT_DATA_UNSELECT_REASON = "unselectReason";
-
- /*
- * Messages sent from the service to the client.
- * DO NOT RENUMBER THESE!
- */
-
- /** (service v1)
- * Generic failure sent in response to any unrecognized or malformed request.
- * - arg1 : request id
- */
- public static final int SERVICE_MSG_GENERIC_FAILURE = 0;
-
- /** (service v1)
- * Generic failure sent in response to a successful message.
- * - arg1 : request id
- */
- public static final int SERVICE_MSG_GENERIC_SUCCESS = 1;
-
- /** (service v1)
- * Registration succeeded.
- * - arg1 : request id
- * - arg2 : server version
- * - obj : route provider descriptor bundle, or null
- */
- public static final int SERVICE_MSG_REGISTERED = 2;
-
- /** (service v1)
- * Route control request success result.
- * - arg1 : request id
- * - obj : result data bundle, or null
- */
- public static final int SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED = 3;
-
- /** (service v1)
- * Route control request failure result.
- * - arg1 : request id
- * - obj : result data bundle, or null
- * - SERVICE_DATA_ERROR: error message
- */
- public static final int SERVICE_MSG_CONTROL_REQUEST_FAILED = 4;
-
- /** (service v1)
- * Route provider descriptor changed. (unsolicited event)
- * - arg1 : reserved (0)
- * - obj : route provider descriptor bundle, or null
- */
- public static final int SERVICE_MSG_DESCRIPTOR_CHANGED = 5;
-
- public static final String SERVICE_DATA_ERROR = "error";
-
- /*
- * Recognized client version numbers. (Reserved for future use.)
- * DO NOT RENUMBER THESE!
- */
-
- /**
- * The client version used from the beginning.
- */
- public static final int CLIENT_VERSION_1 = 1;
-
- /**
- * The client version used from support library v24.1.0.
- */
- public static final int CLIENT_VERSION_2 = 2;
-
- /**
- * The current client version.
- */
- public static final int CLIENT_VERSION_CURRENT = CLIENT_VERSION_2;
-
- /*
- * Recognized server version numbers. (Reserved for future use.)
- * DO NOT RENUMBER THESE!
- */
-
- /**
- * The service version used from the beginning.
- */
- public static final int SERVICE_VERSION_1 = 1;
-
- /**
- * The current service version.
- */
- public static final int SERVICE_VERSION_CURRENT = SERVICE_VERSION_1;
-
- static final int CLIENT_VERSION_START = CLIENT_VERSION_1;
-
- /**
- * Returns true if the messenger object is valid.
- * <p>
- * The messenger constructor and unparceling code does not check whether the
- * provided IBinder is a valid IMessenger object. As a result, it's possible
- * for a peer to send an invalid IBinder that will result in crashes downstream.
- * This method checks that the messenger is in a valid state.
- * </p>
- */
- public static boolean isValidRemoteMessenger(Messenger messenger) {
- try {
- return messenger != null && messenger.getBinder() != null;
- } catch (NullPointerException ex) {
- // If the messenger was constructed with a binder interface other than
- // IMessenger then the call to getBinder() will crash with an NPE.
- return false;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderService.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderService.java
deleted file mode 100644
index a186fee..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderService.java
+++ /dev/null
@@ -1,765 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_DATA_ROUTE_ID;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_DATA_ROUTE_LIBRARY_GROUP;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_DATA_UNSELECT_REASON;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_DATA_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_CREATE_ROUTE_CONTROLLER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_MSG_REGISTER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_RELEASE_ROUTE_CONTROLLER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_ROUTE_CONTROL_REQUEST;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SELECT_ROUTE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SET_DISCOVERY_REQUEST;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SET_ROUTE_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UNREGISTER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UNSELECT_ROUTE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UPDATE_ROUTE_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_VERSION_1;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.SERVICE_DATA_ERROR;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_CONTROL_REQUEST_FAILED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_DESCRIPTOR_CHANGED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_GENERIC_FAILURE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_GENERIC_SUCCESS;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_REGISTERED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_VERSION_CURRENT;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .isValidRemoteMessenger;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.DeadObjectException;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.IBinder.DeathRecipient;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.SparseArray;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.core.util.ObjectsCompat;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-
-/**
- * Base class for media route provider services.
- * <p>
- * A media router will bind to media route provider services when a callback is added via
- * {@link MediaRouter#addCallback(MediaRouteSelector, MediaRouter.Callback, int)} with a discovery
- * flag: {@link MediaRouter#CALLBACK_FLAG_REQUEST_DISCOVERY},
- * {@link MediaRouter#CALLBACK_FLAG_FORCE_DISCOVERY}, or
- * {@link MediaRouter#CALLBACK_FLAG_PERFORM_ACTIVE_SCAN}, and will unbind when the callback
- * is removed via {@link MediaRouter#removeCallback(MediaRouter.Callback)}.
- * </p><p>
- * To implement your own media route provider service, extend this class and
- * override the {@link #onCreateMediaRouteProvider} method to return an
- * instance of your {@link MediaRouteProvider}.
- * </p><p>
- * Declare your media route provider service in your application manifest
- * like this:
- * </p>
- * <pre>
- * <service android:name=".MyMediaRouteProviderService"
- * android:label="@string/my_media_route_provider_service">
- * <intent-filter>
- * <action android:name="android.media.MediaRouteProviderService" />
- * </intent-filter>
- * </service>
- * </pre>
- */
-public abstract class MediaRouteProviderService extends Service {
- static final String TAG = "MediaRouteProviderSrv"; // max. 23 chars
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private final ArrayList<ClientRecord> mClients = new ArrayList<ClientRecord>();
- private final ReceiveHandler mReceiveHandler;
- private final Messenger mReceiveMessenger;
- final PrivateHandler mPrivateHandler;
- private final ProviderCallback mProviderCallback;
-
- MediaRouteProvider mProvider;
- private MediaRouteDiscoveryRequest mCompositeDiscoveryRequest;
-
- /**
- * The {@link Intent} that must be declared as handled by the service.
- * Put this in your manifest.
- */
- public static final String SERVICE_INTERFACE = MediaRouteProviderProtocol.SERVICE_INTERFACE;
-
- /*
- * Private messages used internally. (Yes, you can renumber these.)
- */
-
- static final int PRIVATE_MSG_CLIENT_DIED = 1;
-
- /**
- * Creates a media route provider service.
- */
- public MediaRouteProviderService() {
- mReceiveHandler = new ReceiveHandler(this);
- mReceiveMessenger = new Messenger(mReceiveHandler);
- mPrivateHandler = new PrivateHandler();
- mProviderCallback = new ProviderCallback();
- }
-
- /**
- * Called by the system when it is time to create the media route provider.
- *
- * @return The media route provider offered by this service, or null if
- * this service has decided not to offer a media route provider.
- */
- public abstract MediaRouteProvider onCreateMediaRouteProvider();
-
- /**
- * Gets the media route provider offered by this service.
- *
- * @return The media route provider offered by this service, or null if
- * it has not yet been created.
- *
- * @see #onCreateMediaRouteProvider()
- */
- public MediaRouteProvider getMediaRouteProvider() {
- return mProvider;
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- if (intent.getAction().equals(SERVICE_INTERFACE)) {
- if (mProvider == null) {
- MediaRouteProvider provider = onCreateMediaRouteProvider();
- if (provider != null) {
- String providerPackage = provider.getMetadata().getPackageName();
- if (!providerPackage.equals(getPackageName())) {
- throw new IllegalStateException("onCreateMediaRouteProvider() returned "
- + "a provider whose package name does not match the package "
- + "name of the service. A media route provider service can "
- + "only export its own media route providers. "
- + "Provider package name: " + providerPackage
- + ". Service package name: " + getPackageName() + ".");
- }
- mProvider = provider;
- mProvider.setCallback(mProviderCallback);
- }
- }
- if (mProvider != null) {
- return mReceiveMessenger.getBinder();
- }
- }
- return null;
- }
-
- @Override
- public boolean onUnbind(Intent intent) {
- if (mProvider != null) {
- mProvider.setCallback(null);
- }
- return super.onUnbind(intent);
- }
-
- boolean onRegisterClient(Messenger messenger, int requestId, int version) {
- if (version >= CLIENT_VERSION_1) {
- int index = findClient(messenger);
- if (index < 0) {
- ClientRecord client = new ClientRecord(messenger, version);
- if (client.register()) {
- mClients.add(client);
- if (DEBUG) {
- Log.d(TAG, client + ": Registered, version=" + version);
- }
- if (requestId != 0) {
- MediaRouteProviderDescriptor descriptor = mProvider.getDescriptor();
- sendReply(messenger, SERVICE_MSG_REGISTERED,
- requestId, SERVICE_VERSION_CURRENT,
- createDescriptorBundleForClientVersion(descriptor,
- client.mVersion), null);
- }
- return true;
- }
- }
- }
- return false;
- }
-
- boolean onUnregisterClient(Messenger messenger, int requestId) {
- int index = findClient(messenger);
- if (index >= 0) {
- ClientRecord client = mClients.remove(index);
- if (DEBUG) {
- Log.d(TAG, client + ": Unregistered");
- }
- client.dispose();
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- return false;
- }
-
- void onBinderDied(Messenger messenger) {
- int index = findClient(messenger);
- if (index >= 0) {
- ClientRecord client = mClients.remove(index);
- if (DEBUG) {
- Log.d(TAG, client + ": Binder died");
- }
- client.dispose();
- }
- }
-
- boolean onCreateRouteController(Messenger messenger, int requestId,
- int controllerId, String routeId, String routeGroupId) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- if (client.createRouteController(routeId, routeGroupId, controllerId)) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route controller created, controllerId=" + controllerId
- + ", routeId=" + routeId + ", routeGroupId=" + routeGroupId);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onReleaseRouteController(Messenger messenger, int requestId,
- int controllerId) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- if (client.releaseRouteController(controllerId)) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route controller released"
- + ", controllerId=" + controllerId);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onSelectRoute(Messenger messenger, int requestId,
- int controllerId) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- controller.onSelect();
- if (DEBUG) {
- Log.d(TAG, client + ": Route selected"
- + ", controllerId=" + controllerId);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onUnselectRoute(Messenger messenger, int requestId,
- int controllerId, int reason) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- controller.onUnselect(reason);
- if (DEBUG) {
- Log.d(TAG, client + ": Route unselected"
- + ", controllerId=" + controllerId);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onSetRouteVolume(Messenger messenger, int requestId,
- int controllerId, int volume) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- controller.onSetVolume(volume);
- if (DEBUG) {
- Log.d(TAG, client + ": Route volume changed"
- + ", controllerId=" + controllerId + ", volume=" + volume);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onUpdateRouteVolume(Messenger messenger, int requestId,
- int controllerId, int delta) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- controller.onUpdateVolume(delta);
- if (DEBUG) {
- Log.d(TAG, client + ": Route volume updated"
- + ", controllerId=" + controllerId + ", delta=" + delta);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onRouteControlRequest(final Messenger messenger, final int requestId,
- final int controllerId, final Intent intent) {
- final ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- MediaRouter.ControlRequestCallback callback = null;
- if (requestId != 0) {
- callback = new MediaRouter.ControlRequestCallback() {
- @Override
- public void onResult(Bundle data) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route control request succeeded"
- + ", controllerId=" + controllerId
- + ", intent=" + intent
- + ", data=" + data);
- }
- if (findClient(messenger) >= 0) {
- sendReply(messenger, SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED,
- requestId, 0, data, null);
- }
- }
-
- @Override
- public void onError(String error, Bundle data) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route control request failed"
- + ", controllerId=" + controllerId
- + ", intent=" + intent
- + ", error=" + error + ", data=" + data);
- }
- if (findClient(messenger) >= 0) {
- if (error != null) {
- Bundle bundle = new Bundle();
- bundle.putString(SERVICE_DATA_ERROR, error);
- sendReply(messenger, SERVICE_MSG_CONTROL_REQUEST_FAILED,
- requestId, 0, data, bundle);
- } else {
- sendReply(messenger, SERVICE_MSG_CONTROL_REQUEST_FAILED,
- requestId, 0, data, null);
- }
- }
- }
- };
- }
- if (controller.onControlRequest(intent, callback)) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route control request delivered"
- + ", controllerId=" + controllerId + ", intent=" + intent);
- }
- return true;
- }
- }
- }
- return false;
- }
-
- boolean onSetDiscoveryRequest(Messenger messenger, int requestId,
- MediaRouteDiscoveryRequest request) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- boolean actuallyChanged = client.setDiscoveryRequest(request);
- if (DEBUG) {
- Log.d(TAG, client + ": Set discovery request, request=" + request
- + ", actuallyChanged=" + actuallyChanged
- + ", compositeDiscoveryRequest=" + mCompositeDiscoveryRequest);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- return false;
- }
-
- void sendDescriptorChanged(MediaRouteProviderDescriptor descriptor) {
- final int count = mClients.size();
- for (int i = 0; i < count; i++) {
- ClientRecord client = mClients.get(i);
- sendReply(client.mMessenger, SERVICE_MSG_DESCRIPTOR_CHANGED, 0, 0,
- createDescriptorBundleForClientVersion(descriptor, client.mVersion), null);
- if (DEBUG) {
- Log.d(TAG, client + ": Sent descriptor change event, descriptor=" + descriptor);
- }
- }
- }
-
- @VisibleForTesting
- static Bundle createDescriptorBundleForClientVersion(MediaRouteProviderDescriptor descriptor,
- int clientVersion) {
- if (descriptor == null) {
- return null;
- }
- MediaRouteProviderDescriptor.Builder builder =
- new MediaRouteProviderDescriptor.Builder(descriptor);
- builder.setRoutes(null);
- for (MediaRouteDescriptor route : descriptor.getRoutes()) {
- if (clientVersion >= route.getMinClientVersion()
- && clientVersion <= route.getMaxClientVersion()) {
- builder.addRoute(route);
- }
- }
- return builder.build().asBundle();
- }
-
- boolean updateCompositeDiscoveryRequest() {
- MediaRouteDiscoveryRequest composite = null;
- MediaRouteSelector.Builder selectorBuilder = null;
- boolean activeScan = false;
- final int count = mClients.size();
- for (int i = 0; i < count; i++) {
- MediaRouteDiscoveryRequest request = mClients.get(i).mDiscoveryRequest;
- if (request != null
- && (!request.getSelector().isEmpty() || request.isActiveScan())) {
- activeScan |= request.isActiveScan();
- if (composite == null) {
- composite = request;
- } else {
- if (selectorBuilder == null) {
- selectorBuilder = new MediaRouteSelector.Builder(composite.getSelector());
- }
- selectorBuilder.addSelector(request.getSelector());
- }
- }
- }
- if (selectorBuilder != null) {
- composite = new MediaRouteDiscoveryRequest(selectorBuilder.build(), activeScan);
- }
- if (!ObjectsCompat.equals(mCompositeDiscoveryRequest, composite)) {
- mCompositeDiscoveryRequest = composite;
- mProvider.setDiscoveryRequest(composite);
- return true;
- }
- return false;
- }
-
- private ClientRecord getClient(Messenger messenger) {
- int index = findClient(messenger);
- return index >= 0 ? mClients.get(index) : null;
- }
-
- int findClient(Messenger messenger) {
- final int count = mClients.size();
- for (int i = 0; i < count; i++) {
- ClientRecord client = mClients.get(i);
- if (client.hasMessenger(messenger)) {
- return i;
- }
- }
- return -1;
- }
-
- static void sendGenericFailure(Messenger messenger, int requestId) {
- if (requestId != 0) {
- sendReply(messenger, SERVICE_MSG_GENERIC_FAILURE, requestId, 0, null, null);
- }
- }
-
- private static void sendGenericSuccess(Messenger messenger, int requestId) {
- if (requestId != 0) {
- sendReply(messenger, SERVICE_MSG_GENERIC_SUCCESS, requestId, 0, null, null);
- }
- }
-
- static void sendReply(Messenger messenger, int what,
- int requestId, int arg, Object obj, Bundle data) {
- Message msg = Message.obtain();
- msg.what = what;
- msg.arg1 = requestId;
- msg.arg2 = arg;
- msg.obj = obj;
- msg.setData(data);
- try {
- messenger.send(msg);
- } catch (DeadObjectException ex) {
- // The client died.
- } catch (RemoteException ex) {
- Log.e(TAG, "Could not send message to " + getClientId(messenger), ex);
- }
- }
-
- static String getClientId(Messenger messenger) {
- return "Client connection " + messenger.getBinder().toString();
- }
-
- private final class PrivateHandler extends Handler {
- PrivateHandler() {
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case PRIVATE_MSG_CLIENT_DIED:
- onBinderDied((Messenger)msg.obj);
- break;
- }
- }
- }
-
- private final class ProviderCallback extends MediaRouteProvider.Callback {
- ProviderCallback() {
- }
-
- @Override
- public void onDescriptorChanged(MediaRouteProvider provider,
- MediaRouteProviderDescriptor descriptor) {
- sendDescriptorChanged(descriptor);
- }
- }
-
- private final class ClientRecord implements DeathRecipient {
- public final Messenger mMessenger;
- public final int mVersion;
- public MediaRouteDiscoveryRequest mDiscoveryRequest;
-
- private final SparseArray<MediaRouteProvider.RouteController> mControllers =
- new SparseArray<MediaRouteProvider.RouteController>();
-
- public ClientRecord(Messenger messenger, int version) {
- mMessenger = messenger;
- mVersion = version;
- }
-
- public boolean register() {
- try {
- mMessenger.getBinder().linkToDeath(this, 0);
- return true;
- } catch (RemoteException ex) {
- binderDied();
- }
- return false;
- }
-
- public void dispose() {
- int count = mControllers.size();
- for (int i = 0; i < count; i++) {
- mControllers.valueAt(i).onRelease();
- }
- mControllers.clear();
-
- mMessenger.getBinder().unlinkToDeath(this, 0);
-
- setDiscoveryRequest(null);
- }
-
- public boolean hasMessenger(Messenger other) {
- return mMessenger.getBinder() == other.getBinder();
- }
-
- public boolean createRouteController(String routeId, String routeGroupId,
- int controllerId) {
- if (mControllers.indexOfKey(controllerId) < 0) {
- MediaRouteProvider.RouteController controller = routeGroupId == null
- ? mProvider.onCreateRouteController(routeId)
- : mProvider.onCreateRouteController(routeId, routeGroupId);
- if (controller != null) {
- mControllers.put(controllerId, controller);
- return true;
- }
- }
- return false;
- }
-
- public boolean releaseRouteController(int controllerId) {
- MediaRouteProvider.RouteController controller = mControllers.get(controllerId);
- if (controller != null) {
- mControllers.remove(controllerId);
- controller.onRelease();
- return true;
- }
- return false;
- }
-
- public MediaRouteProvider.RouteController getRouteController(int controllerId) {
- return mControllers.get(controllerId);
- }
-
- public boolean setDiscoveryRequest(MediaRouteDiscoveryRequest request) {
- if (!ObjectsCompat.equals(mDiscoveryRequest, request)) {
- mDiscoveryRequest = request;
- return updateCompositeDiscoveryRequest();
- }
- return false;
- }
-
- // Runs on a binder thread.
- @Override
- public void binderDied() {
- mPrivateHandler.obtainMessage(PRIVATE_MSG_CLIENT_DIED, mMessenger).sendToTarget();
- }
-
- @Override
- public String toString() {
- return getClientId(mMessenger);
- }
- }
-
- /**
- * Handler that receives messages from clients.
- * <p>
- * This inner class is static and only retains a weak reference to the service
- * to prevent the service from being leaked in case one of the clients is holding an
- * active reference to the server's messenger.
- * </p><p>
- * This handler should not be used to handle any messages other than those
- * that come from the client.
- * </p>
- */
- private static final class ReceiveHandler extends Handler {
- private final WeakReference<MediaRouteProviderService> mServiceRef;
-
- public ReceiveHandler(MediaRouteProviderService service) {
- mServiceRef = new WeakReference<MediaRouteProviderService>(service);
- }
-
- @Override
- public void handleMessage(Message msg) {
- final Messenger messenger = msg.replyTo;
- if (isValidRemoteMessenger(messenger)) {
- final int what = msg.what;
- final int requestId = msg.arg1;
- final int arg = msg.arg2;
- final Object obj = msg.obj;
- final Bundle data = msg.peekData();
- if (!processMessage(what, messenger, requestId, arg, obj, data)) {
- if (DEBUG) {
- Log.d(TAG, getClientId(messenger) + ": Message failed, what=" + what
- + ", requestId=" + requestId + ", arg=" + arg
- + ", obj=" + obj + ", data=" + data);
- }
- sendGenericFailure(messenger, requestId);
- }
- } else {
- if (DEBUG) {
- Log.d(TAG, "Ignoring message without valid reply messenger.");
- }
- }
- }
-
- private boolean processMessage(int what,
- Messenger messenger, int requestId, int arg, Object obj, Bundle data) {
- MediaRouteProviderService service = mServiceRef.get();
- if (service != null) {
- switch (what) {
- case CLIENT_MSG_REGISTER:
- return service.onRegisterClient(messenger, requestId, arg);
-
- case CLIENT_MSG_UNREGISTER:
- return service.onUnregisterClient(messenger, requestId);
-
- case CLIENT_MSG_CREATE_ROUTE_CONTROLLER: {
- String routeId = data.getString(CLIENT_DATA_ROUTE_ID);
- String routeGroupId = data.getString(CLIENT_DATA_ROUTE_LIBRARY_GROUP);
- if (routeId != null) {
- return service.onCreateRouteController(
- messenger, requestId, arg, routeId, routeGroupId);
- }
- break;
- }
-
- case CLIENT_MSG_RELEASE_ROUTE_CONTROLLER:
- return service.onReleaseRouteController(messenger, requestId, arg);
-
- case CLIENT_MSG_SELECT_ROUTE:
- return service.onSelectRoute(messenger, requestId, arg);
-
- case CLIENT_MSG_UNSELECT_ROUTE:
- int reason = data == null ?
- MediaRouter.UNSELECT_REASON_UNKNOWN
- : data.getInt(CLIENT_DATA_UNSELECT_REASON,
- MediaRouter.UNSELECT_REASON_UNKNOWN);
- return service.onUnselectRoute(messenger, requestId, arg, reason);
-
- case CLIENT_MSG_SET_ROUTE_VOLUME: {
- int volume = data.getInt(CLIENT_DATA_VOLUME, -1);
- if (volume >= 0) {
- return service.onSetRouteVolume(
- messenger, requestId, arg, volume);
- }
- break;
- }
-
- case CLIENT_MSG_UPDATE_ROUTE_VOLUME: {
- int delta = data.getInt(CLIENT_DATA_VOLUME, 0);
- if (delta != 0) {
- return service.onUpdateRouteVolume(
- messenger, requestId, arg, delta);
- }
- break;
- }
-
- case CLIENT_MSG_ROUTE_CONTROL_REQUEST:
- if (obj instanceof Intent) {
- return service.onRouteControlRequest(
- messenger, requestId, arg, (Intent)obj);
- }
- break;
-
- case CLIENT_MSG_SET_DISCOVERY_REQUEST: {
- if (obj == null || obj instanceof Bundle) {
- MediaRouteDiscoveryRequest request =
- MediaRouteDiscoveryRequest.fromBundle((Bundle)obj);
- return service.onSetDiscoveryRequest(
- messenger, requestId,
- request != null && request.isValid() ? request : null);
- }
- }
- }
- }
- return false;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteSelector.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteSelector.java
deleted file mode 100644
index f20dcc0..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteSelector.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.content.IntentFilter;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Describes the capabilities of routes that applications would like to discover and use.
- * <p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- *
- * <h3>Example</h3>
- * <pre>
- * MediaRouteSelector selectorBuilder = new MediaRouteSelector.Builder()
- * .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)
- * .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
- * .build();
- *
- * MediaRouter router = MediaRouter.getInstance(context);
- * router.addCallback(selector, callback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
- * </pre>
- */
-public final class MediaRouteSelector {
- static final String KEY_CONTROL_CATEGORIES = "controlCategories";
-
- private final Bundle mBundle;
- List<String> mControlCategories;
-
- /**
- * An empty media route selector that will not match any routes.
- */
- public static final MediaRouteSelector EMPTY = new MediaRouteSelector(new Bundle(), null);
-
- MediaRouteSelector(Bundle bundle, List<String> controlCategories) {
- mBundle = bundle;
- mControlCategories = controlCategories;
- }
-
- /**
- * Gets the list of {@link MediaControlIntent media control categories} in the selector.
- *
- * @return The list of categories.
- */
- public List<String> getControlCategories() {
- ensureControlCategories();
- return mControlCategories;
- }
-
- void ensureControlCategories() {
- if (mControlCategories == null) {
- mControlCategories = mBundle.getStringArrayList(KEY_CONTROL_CATEGORIES);
- if (mControlCategories == null || mControlCategories.isEmpty()) {
- mControlCategories = Collections.<String>emptyList();
- }
- }
- }
-
- /**
- * Returns true if the selector contains the specified category.
- *
- * @param category The category to check.
- * @return True if the category is present.
- */
- public boolean hasControlCategory(String category) {
- if (category != null) {
- ensureControlCategories();
- final int categoryCount = mControlCategories.size();
- for (int i = 0; i < categoryCount; i++) {
- if (mControlCategories.get(i).equals(category)) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Returns true if the selector matches at least one of the specified control filters.
- *
- * @param filters The list of control filters to consider.
- * @return True if a match is found.
- */
- public boolean matchesControlFilters(List<IntentFilter> filters) {
- if (filters != null) {
- ensureControlCategories();
- final int categoryCount = mControlCategories.size();
- if (categoryCount != 0) {
- final int filterCount = filters.size();
- for (int i = 0; i < filterCount; i++) {
- final IntentFilter filter = filters.get(i);
- if (filter != null) {
- for (int j = 0; j < categoryCount; j++) {
- if (filter.hasCategory(mControlCategories.get(j))) {
- return true;
- }
- }
- }
- }
- }
- }
- return false;
- }
-
- /**
- * Returns true if this selector contains all of the capabilities described
- * by the specified selector.
- *
- * @param selector The selector to be examined.
- * @return True if this selector contains all of the capabilities described
- * by the specified selector.
- */
- public boolean contains(MediaRouteSelector selector) {
- if (selector != null) {
- ensureControlCategories();
- selector.ensureControlCategories();
- return mControlCategories.containsAll(selector.mControlCategories);
- }
- return false;
- }
-
- /**
- * Returns true if the selector does not specify any capabilities.
- */
- public boolean isEmpty() {
- ensureControlCategories();
- return mControlCategories.isEmpty();
- }
-
- /**
- * Returns true if the selector has all of the required fields.
- */
- public boolean isValid() {
- ensureControlCategories();
- if (mControlCategories.contains(null)) {
- return false;
- }
- return true;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof MediaRouteSelector) {
- MediaRouteSelector other = (MediaRouteSelector)o;
- ensureControlCategories();
- other.ensureControlCategories();
- return mControlCategories.equals(other.mControlCategories);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- ensureControlCategories();
- return mControlCategories.hashCode();
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaRouteSelector{ ");
- result.append("controlCategories=").append(
- Arrays.toString(getControlCategories().toArray()));
- result.append(" }");
- return result.toString();
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaRouteSelector fromBundle(@Nullable Bundle bundle) {
- return bundle != null ? new MediaRouteSelector(bundle, null) : null;
- }
-
- /**
- * Builder for {@link MediaRouteSelector media route selectors}.
- */
- public static final class Builder {
- private ArrayList<String> mControlCategories;
-
- /**
- * Creates an empty media route selector builder.
- */
- public Builder() {
- }
-
- /**
- * Creates a media route selector descriptor builder whose initial contents are
- * copied from an existing selector.
- */
- public Builder(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- selector.ensureControlCategories();
- if (!selector.mControlCategories.isEmpty()) {
- mControlCategories = new ArrayList<String>(selector.mControlCategories);
- }
- }
-
- /**
- * Adds a {@link MediaControlIntent media control category} to the builder.
- *
- * @param category The category to add to the set of desired capabilities, such as
- * {@link MediaControlIntent#CATEGORY_LIVE_AUDIO}.
- * @return The builder instance for chaining.
- */
- @NonNull
- public Builder addControlCategory(@NonNull String category) {
- if (category == null) {
- throw new IllegalArgumentException("category must not be null");
- }
-
- if (mControlCategories == null) {
- mControlCategories = new ArrayList<String>();
- }
- if (!mControlCategories.contains(category)) {
- mControlCategories.add(category);
- }
- return this;
- }
-
- /**
- * Adds a list of {@link MediaControlIntent media control categories} to the builder.
- *
- * @param categories The list categories to add to the set of desired capabilities,
- * such as {@link MediaControlIntent#CATEGORY_LIVE_AUDIO}.
- * @return The builder instance for chaining.
- */
- @NonNull
- public Builder addControlCategories(@NonNull Collection<String> categories) {
- if (categories == null) {
- throw new IllegalArgumentException("categories must not be null");
- }
-
- if (!categories.isEmpty()) {
- for (String category : categories) {
- addControlCategory(category);
- }
- }
- return this;
- }
-
- /**
- * Adds the contents of an existing media route selector to the builder.
- *
- * @param selector The media route selector whose contents are to be added.
- * @return The builder instance for chaining.
- */
- @NonNull
- public Builder addSelector(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- addControlCategories(selector.getControlCategories());
- return this;
- }
-
- /**
- * Builds the {@link MediaRouteSelector media route selector}.
- */
- @NonNull
- public MediaRouteSelector build() {
- if (mControlCategories == null) {
- return EMPTY;
- }
- Bundle bundle = new Bundle();
- bundle.putStringArrayList(KEY_CONTROL_CATEGORIES, mControlCategories);
- return new MediaRouteSelector(bundle, mControlCategories);
- }
- }
-}
\ No newline at end of file
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouter.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouter.java
deleted file mode 100644
index 4b56b19..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouter.java
+++ /dev/null
@@ -1,3000 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.IntentSender;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.support.v4.media.session.MediaSessionCompat;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Display;
-
-import androidx.core.app.ActivityManagerCompat;
-import androidx.core.hardware.display.DisplayManagerCompat;
-import androidx.core.util.Pair;
-import androidx.media.VolumeProviderCompat;
-
-import com.android.support.mediarouter.media.MediaRouteProvider.ProviderMetadata;
-import com.android.support.mediarouter.media.MediaRouteProvider.RouteController;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * MediaRouter allows applications to control the routing of media channels
- * and streams from the current device to external speakers and destination devices.
- * <p>
- * A MediaRouter instance is retrieved through {@link #getInstance}. Applications
- * can query the media router about the currently selected route and its capabilities
- * to determine how to send content to the route's destination. Applications can
- * also {@link RouteInfo#sendControlRequest send control requests} to the route
- * to ask the route's destination to perform certain remote control functions
- * such as playing media.
- * </p><p>
- * See also {@link MediaRouteProvider} for information on how an application
- * can publish new media routes to the media router.
- * </p><p>
- * The media router API is not thread-safe; all interactions with it must be
- * done from the main thread of the process.
- * </p>
- */
-public final class MediaRouter {
- static final String TAG = "MediaRouter";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- /**
- * Passed to {@link androidx.mediarouter.media.MediaRouteProvider.RouteController#onUnselect(int)}
- * and {@link Callback#onRouteUnselected(MediaRouter, RouteInfo, int)} when the reason the route
- * was unselected is unknown.
- */
- public static final int UNSELECT_REASON_UNKNOWN = 0;
- /**
- * Passed to {@link androidx.mediarouter.media.MediaRouteProvider.RouteController#onUnselect(int)}
- * and {@link Callback#onRouteUnselected(MediaRouter, RouteInfo, int)} when the user pressed
- * the disconnect button to disconnect and keep playing.
- * <p>
- *
- * @see MediaRouteDescriptor#canDisconnectAndKeepPlaying()
- */
- public static final int UNSELECT_REASON_DISCONNECTED = 1;
- /**
- * Passed to {@link androidx.mediarouter.media.MediaRouteProvider.RouteController#onUnselect(int)}
- * and {@link Callback#onRouteUnselected(MediaRouter, RouteInfo, int)} when the user pressed
- * the stop casting button.
- */
- public static final int UNSELECT_REASON_STOPPED = 2;
- /**
- * Passed to {@link androidx.mediarouter.media.MediaRouteProvider.RouteController#onUnselect(int)}
- * and {@link Callback#onRouteUnselected(MediaRouter, RouteInfo, int)} when the user selected
- * a different route.
- */
- public static final int UNSELECT_REASON_ROUTE_CHANGED = 3;
-
- // Maintains global media router state for the process.
- // This field is initialized in MediaRouter.getInstance() before any
- // MediaRouter objects are instantiated so it is guaranteed to be
- // valid whenever any instance method is invoked.
- static GlobalMediaRouter sGlobal;
-
- // Context-bound state of the media router.
- final Context mContext;
- final ArrayList<CallbackRecord> mCallbackRecords = new ArrayList<CallbackRecord>();
-
- @IntDef(flag = true,
- value = {
- CALLBACK_FLAG_PERFORM_ACTIVE_SCAN,
- CALLBACK_FLAG_REQUEST_DISCOVERY,
- CALLBACK_FLAG_UNFILTERED_EVENTS
- }
- )
- @Retention(RetentionPolicy.SOURCE)
- private @interface CallbackFlags {}
-
- /**
- * Flag for {@link #addCallback}: Actively scan for routes while this callback
- * is registered.
- * <p>
- * When this flag is specified, the media router will actively scan for new
- * routes. Certain routes, such as wifi display routes, may not be discoverable
- * except when actively scanning. This flag is typically used when the route picker
- * dialog has been opened by the user to ensure that the route information is
- * up to date.
- * </p><p>
- * Active scanning may consume a significant amount of power and may have intrusive
- * effects on wireless connectivity. Therefore it is important that active scanning
- * only be requested when it is actually needed to satisfy a user request to
- * discover and select a new route.
- * </p><p>
- * This flag implies {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} but performing
- * active scans is much more expensive than a normal discovery request.
- * </p>
- *
- * @see #CALLBACK_FLAG_REQUEST_DISCOVERY
- */
- public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1 << 0;
-
- /**
- * Flag for {@link #addCallback}: Do not filter route events.
- * <p>
- * When this flag is specified, the callback will be invoked for events that affect any
- * route even if they do not match the callback's filter.
- * </p>
- */
- public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 1 << 1;
-
- /**
- * Flag for {@link #addCallback}: Request passive route discovery while this
- * callback is registered, except on {@link ActivityManager#isLowRamDevice low-RAM devices}.
- * <p>
- * When this flag is specified, the media router will try to discover routes.
- * Although route discovery is intended to be efficient, checking for new routes may
- * result in some network activity and could slowly drain the battery. Therefore
- * applications should only specify {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} when
- * they are running in the foreground and would like to provide the user with the
- * option of connecting to new routes.
- * </p><p>
- * Applications should typically add a callback using this flag in the
- * {@link android.app.Activity activity's} {@link android.app.Activity#onStart onStart}
- * method and remove it in the {@link android.app.Activity#onStop onStop} method.
- * The {@link androidx.mediarouter.app.MediaRouteDiscoveryFragment} fragment may
- * also be used for this purpose.
- * </p><p class="note">
- * On {@link ActivityManager#isLowRamDevice low-RAM devices} this flag
- * will be ignored. Refer to
- * {@link #addCallback(MediaRouteSelector, Callback, int) addCallback} for details.
- * </p>
- *
- * @see androidx.mediarouter.app.MediaRouteDiscoveryFragment
- */
- public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 1 << 2;
-
- /**
- * Flag for {@link #addCallback}: Request passive route discovery while this
- * callback is registered, even on {@link ActivityManager#isLowRamDevice low-RAM devices}.
- * <p class="note">
- * This flag has a significant performance impact on low-RAM devices
- * since it may cause many media route providers to be started simultaneously.
- * It is much better to use {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} instead to avoid
- * performing passive discovery on these devices altogether. Refer to
- * {@link #addCallback(MediaRouteSelector, Callback, int) addCallback} for details.
- * </p>
- *
- * @see androidx.mediarouter.app.MediaRouteDiscoveryFragment
- */
- public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 1 << 3;
-
- /**
- * Flag for {@link #isRouteAvailable}: Ignore the default route.
- * <p>
- * This flag is used to determine whether a matching non-default route is available.
- * This constraint may be used to decide whether to offer the route chooser dialog
- * to the user. There is no point offering the chooser if there are no
- * non-default choices.
- * </p>
- */
- public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1 << 0;
-
- /**
- * Flag for {@link #isRouteAvailable}: Require an actual route to be matched.
- * <p>
- * If this flag is not set, then {@link #isRouteAvailable} will return true
- * if it is possible to discover a matching route even if discovery is not in
- * progress or if no matching route has yet been found. This feature is used to
- * save resources by removing the need to perform passive route discovery on
- * {@link ActivityManager#isLowRamDevice low-RAM devices}.
- * </p><p>
- * If this flag is set, then {@link #isRouteAvailable} will only return true if
- * a matching route has actually been discovered.
- * </p>
- */
- public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 1 << 1;
-
- private MediaRouter(Context context) {
- mContext = context;
- }
-
- /**
- * Gets an instance of the media router service associated with the context.
- * <p>
- * The application is responsible for holding a strong reference to the returned
- * {@link MediaRouter} instance, such as by storing the instance in a field of
- * the {@link android.app.Activity}, to ensure that the media router remains alive
- * as long as the application is using its features.
- * </p><p>
- * In other words, the support library only holds a {@link WeakReference weak reference}
- * to each media router instance. When there are no remaining strong references to the
- * media router instance, all of its callbacks will be removed and route discovery
- * will no longer be performed on its behalf.
- * </p>
- *
- * @return The media router instance for the context. The application must hold
- * a strong reference to this object as long as it is in use.
- */
- public static MediaRouter getInstance(@NonNull Context context) {
- if (context == null) {
- throw new IllegalArgumentException("context must not be null");
- }
- checkCallingThread();
-
- if (sGlobal == null) {
- sGlobal = new GlobalMediaRouter(context.getApplicationContext());
- sGlobal.start();
- }
- return sGlobal.getRouter(context);
- }
-
- /**
- * Gets information about the {@link MediaRouter.RouteInfo routes} currently known to
- * this media router.
- */
- public List<RouteInfo> getRoutes() {
- checkCallingThread();
- return sGlobal.getRoutes();
- }
-
- /**
- * Gets information about the {@link MediaRouter.ProviderInfo route providers}
- * currently known to this media router.
- */
- public List<ProviderInfo> getProviders() {
- checkCallingThread();
- return sGlobal.getProviders();
- }
-
- /**
- * Gets the default route for playing media content on the system.
- * <p>
- * The system always provides a default route.
- * </p>
- *
- * @return The default route, which is guaranteed to never be null.
- */
- @NonNull
- public RouteInfo getDefaultRoute() {
- checkCallingThread();
- return sGlobal.getDefaultRoute();
- }
-
- /**
- * Gets a bluetooth route for playing media content on the system.
- *
- * @return A bluetooth route, if exist, otherwise null.
- */
- public RouteInfo getBluetoothRoute() {
- checkCallingThread();
- return sGlobal.getBluetoothRoute();
- }
-
- /**
- * Gets the currently selected route.
- * <p>
- * The application should examine the route's
- * {@link RouteInfo#getControlFilters media control intent filters} to assess the
- * capabilities of the route before attempting to use it.
- * </p>
- *
- * <h3>Example</h3>
- * <pre>
- * public boolean playMovie() {
- * MediaRouter mediaRouter = MediaRouter.getInstance(context);
- * MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute();
- *
- * // First try using the remote playback interface, if supported.
- * if (route.supportsControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
- * // The route supports remote playback.
- * // Try to send it the Uri of the movie to play.
- * Intent intent = new Intent(MediaControlIntent.ACTION_PLAY);
- * intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- * intent.setDataAndType("http://example.com/videos/movie.mp4", "video/mp4");
- * if (route.supportsControlRequest(intent)) {
- * route.sendControlRequest(intent, null);
- * return true; // sent the request to play the movie
- * }
- * }
- *
- * // If remote playback was not possible, then play locally.
- * if (route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)) {
- * // The route supports live video streaming.
- * // Prepare to play content locally in a window or in a presentation.
- * return playMovieInWindow();
- * }
- *
- * // Neither interface is supported, so we can't play the movie to this route.
- * return false;
- * }
- * </pre>
- *
- * @return The selected route, which is guaranteed to never be null.
- *
- * @see RouteInfo#getControlFilters
- * @see RouteInfo#supportsControlCategory
- * @see RouteInfo#supportsControlRequest
- */
- @NonNull
- public RouteInfo getSelectedRoute() {
- checkCallingThread();
- return sGlobal.getSelectedRoute();
- }
-
- /**
- * Returns the selected route if it matches the specified selector, otherwise
- * selects the default route and returns it. If there is one live audio route
- * (usually Bluetooth A2DP), it will be selected instead of default route.
- *
- * @param selector The selector to match.
- * @return The previously selected route if it matched the selector, otherwise the
- * newly selected default route which is guaranteed to never be null.
- *
- * @see MediaRouteSelector
- * @see RouteInfo#matchesSelector
- */
- @NonNull
- public RouteInfo updateSelectedRoute(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "updateSelectedRoute: " + selector);
- }
- RouteInfo route = sGlobal.getSelectedRoute();
- if (!route.isDefaultOrBluetooth() && !route.matchesSelector(selector)) {
- route = sGlobal.chooseFallbackRoute();
- sGlobal.selectRoute(route);
- }
- return route;
- }
-
- /**
- * Selects the specified route.
- *
- * @param route The route to select.
- */
- public void selectRoute(@NonNull RouteInfo route) {
- if (route == null) {
- throw new IllegalArgumentException("route must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "selectRoute: " + route);
- }
- sGlobal.selectRoute(route);
- }
-
- /**
- * Unselects the current round and selects the default route instead.
- * <p>
- * The reason given must be one of:
- * <ul>
- * <li>{@link MediaRouter#UNSELECT_REASON_UNKNOWN}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_DISCONNECTED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_STOPPED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_ROUTE_CHANGED}</li>
- * </ul>
- *
- * @param reason The reason for disconnecting the current route.
- */
- public void unselect(int reason) {
- if (reason < MediaRouter.UNSELECT_REASON_UNKNOWN ||
- reason > MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) {
- throw new IllegalArgumentException("Unsupported reason to unselect route");
- }
- checkCallingThread();
-
- // Choose the fallback route if it's not already selected.
- // Otherwise, select the default route.
- RouteInfo fallbackRoute = sGlobal.chooseFallbackRoute();
- if (sGlobal.getSelectedRoute() != fallbackRoute) {
- sGlobal.selectRoute(fallbackRoute, reason);
- } else {
- sGlobal.selectRoute(sGlobal.getDefaultRoute(), reason);
- }
- }
-
- /**
- * Returns true if there is a route that matches the specified selector.
- * <p>
- * This method returns true if there are any available routes that match the
- * selector regardless of whether they are enabled or disabled. If the
- * {@link #AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE} flag is specified, then
- * the method will only consider non-default routes.
- * </p>
- * <p class="note">
- * On {@link ActivityManager#isLowRamDevice low-RAM devices} this method
- * will return true if it is possible to discover a matching route even if
- * discovery is not in progress or if no matching route has yet been found.
- * Use {@link #AVAILABILITY_FLAG_REQUIRE_MATCH} to require an actual match.
- * </p>
- *
- * @param selector The selector to match.
- * @param flags Flags to control the determination of whether a route may be
- * available. May be zero or some combination of
- * {@link #AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE} and
- * {@link #AVAILABILITY_FLAG_REQUIRE_MATCH}.
- * @return True if a matching route may be available.
- */
- public boolean isRouteAvailable(@NonNull MediaRouteSelector selector, int flags) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
- checkCallingThread();
-
- return sGlobal.isRouteAvailable(selector, flags);
- }
-
- /**
- * Registers a callback to discover routes that match the selector and to receive
- * events when they change.
- * <p>
- * This is a convenience method that has the same effect as calling
- * {@link #addCallback(MediaRouteSelector, Callback, int)} without flags.
- * </p>
- *
- * @param selector A route selector that indicates the kinds of routes that the
- * callback would like to discover.
- * @param callback The callback to add.
- * @see #removeCallback
- */
- public void addCallback(MediaRouteSelector selector, Callback callback) {
- addCallback(selector, callback, 0);
- }
-
- /**
- * Registers a callback to discover routes that match the selector and to receive
- * events when they change.
- * <p>
- * The selector describes the kinds of routes that the application wants to
- * discover. For example, if the application wants to use
- * live audio routes then it should include the
- * {@link MediaControlIntent#CATEGORY_LIVE_AUDIO live audio media control intent category}
- * in its selector when it adds a callback to the media router.
- * The selector may include any number of categories.
- * </p><p>
- * If the callback has already been registered, then the selector is added to
- * the set of selectors being monitored by the callback.
- * </p><p>
- * By default, the callback will only be invoked for events that affect routes
- * that match the specified selector. Event filtering may be disabled by specifying
- * the {@link #CALLBACK_FLAG_UNFILTERED_EVENTS} flag when the callback is registered.
- * </p><p>
- * Applications should use the {@link #isRouteAvailable} method to determine
- * whether is it possible to discover a route with the desired capabilities
- * and therefore whether the media route button should be shown to the user.
- * </p><p>
- * The {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} flag should be used while the application
- * is in the foreground to request that passive discovery be performed if there are
- * sufficient resources to allow continuous passive discovery.
- * On {@link ActivityManager#isLowRamDevice low-RAM devices} this flag will be
- * ignored to conserve resources.
- * </p><p>
- * The {@link #CALLBACK_FLAG_FORCE_DISCOVERY} flag should be used when
- * passive discovery absolutely must be performed, even on low-RAM devices.
- * This flag has a significant performance impact on low-RAM devices
- * since it may cause many media route providers to be started simultaneously.
- * It is much better to use {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} instead to avoid
- * performing passive discovery on these devices altogether.
- * </p><p>
- * The {@link #CALLBACK_FLAG_PERFORM_ACTIVE_SCAN} flag should be used when the
- * media route chooser dialog is showing to confirm the presence of available
- * routes that the user may connect to. This flag may use substantially more
- * power.
- * </p>
- *
- * <h3>Example</h3>
- * <pre>
- * public class MyActivity extends Activity {
- * private MediaRouter mRouter;
- * private MediaRouter.Callback mCallback;
- * private MediaRouteSelector mSelector;
- *
- * protected void onCreate(Bundle savedInstanceState) {
- * super.onCreate(savedInstanceState);
- *
- * mRouter = Mediarouter.getInstance(this);
- * mCallback = new MyCallback();
- * mSelector = new MediaRouteSelector.Builder()
- * .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- * .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
- * .build();
- * }
- *
- * // Add the callback on start to tell the media router what kinds of routes
- * // the application is interested in so that it can try to discover suitable ones.
- * public void onStart() {
- * super.onStart();
- *
- * mediaRouter.addCallback(mSelector, mCallback,
- * MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
- *
- * MediaRouter.RouteInfo route = mediaRouter.updateSelectedRoute(mSelector);
- * // do something with the route...
- * }
- *
- * // Remove the selector on stop to tell the media router that it no longer
- * // needs to invest effort trying to discover routes of these kinds for now.
- * public void onStop() {
- * super.onStop();
- *
- * mediaRouter.removeCallback(mCallback);
- * }
- *
- * private final class MyCallback extends MediaRouter.Callback {
- * // Implement callback methods as needed.
- * }
- * }
- * </pre>
- *
- * @param selector A route selector that indicates the kinds of routes that the
- * callback would like to discover.
- * @param callback The callback to add.
- * @param flags Flags to control the behavior of the callback.
- * May be zero or a combination of {@link #CALLBACK_FLAG_PERFORM_ACTIVE_SCAN} and
- * {@link #CALLBACK_FLAG_UNFILTERED_EVENTS}.
- * @see #removeCallback
- */
- public void addCallback(@NonNull MediaRouteSelector selector, @NonNull Callback callback,
- @CallbackFlags int flags) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "addCallback: selector=" + selector
- + ", callback=" + callback + ", flags=" + Integer.toHexString(flags));
- }
-
- CallbackRecord record;
- int index = findCallbackRecord(callback);
- if (index < 0) {
- record = new CallbackRecord(this, callback);
- mCallbackRecords.add(record);
- } else {
- record = mCallbackRecords.get(index);
- }
- boolean updateNeeded = false;
- if ((flags & ~record.mFlags) != 0) {
- record.mFlags |= flags;
- updateNeeded = true;
- }
- if (!record.mSelector.contains(selector)) {
- record.mSelector = new MediaRouteSelector.Builder(record.mSelector)
- .addSelector(selector)
- .build();
- updateNeeded = true;
- }
- if (updateNeeded) {
- sGlobal.updateDiscoveryRequest();
- }
- }
-
- /**
- * Removes the specified callback. It will no longer receive events about
- * changes to media routes.
- *
- * @param callback The callback to remove.
- * @see #addCallback
- */
- public void removeCallback(@NonNull Callback callback) {
- if (callback == null) {
- throw new IllegalArgumentException("callback must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "removeCallback: callback=" + callback);
- }
-
- int index = findCallbackRecord(callback);
- if (index >= 0) {
- mCallbackRecords.remove(index);
- sGlobal.updateDiscoveryRequest();
- }
- }
-
- private int findCallbackRecord(Callback callback) {
- final int count = mCallbackRecords.size();
- for (int i = 0; i < count; i++) {
- if (mCallbackRecords.get(i).mCallback == callback) {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * Registers a media route provider within this application process.
- * <p>
- * The provider will be added to the list of providers that all {@link MediaRouter}
- * instances within this process can use to discover routes.
- * </p>
- *
- * @param providerInstance The media route provider instance to add.
- *
- * @see MediaRouteProvider
- * @see #removeCallback
- */
- public void addProvider(@NonNull MediaRouteProvider providerInstance) {
- if (providerInstance == null) {
- throw new IllegalArgumentException("providerInstance must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "addProvider: " + providerInstance);
- }
- sGlobal.addProvider(providerInstance);
- }
-
- /**
- * Unregisters a media route provider within this application process.
- * <p>
- * The provider will be removed from the list of providers that all {@link MediaRouter}
- * instances within this process can use to discover routes.
- * </p>
- *
- * @param providerInstance The media route provider instance to remove.
- *
- * @see MediaRouteProvider
- * @see #addCallback
- */
- public void removeProvider(@NonNull MediaRouteProvider providerInstance) {
- if (providerInstance == null) {
- throw new IllegalArgumentException("providerInstance must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "removeProvider: " + providerInstance);
- }
- sGlobal.removeProvider(providerInstance);
- }
-
- /**
- * Adds a remote control client to enable remote control of the volume
- * of the selected route.
- * <p>
- * The remote control client must have previously been registered with
- * the audio manager using the {@link android.media.AudioManager#registerRemoteControlClient
- * AudioManager.registerRemoteControlClient} method.
- * </p>
- *
- * @param remoteControlClient The {@link android.media.RemoteControlClient} to register.
- */
- public void addRemoteControlClient(@NonNull Object remoteControlClient) {
- if (remoteControlClient == null) {
- throw new IllegalArgumentException("remoteControlClient must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "addRemoteControlClient: " + remoteControlClient);
- }
- sGlobal.addRemoteControlClient(remoteControlClient);
- }
-
- /**
- * Removes a remote control client.
- *
- * @param remoteControlClient The {@link android.media.RemoteControlClient}
- * to unregister.
- */
- public void removeRemoteControlClient(@NonNull Object remoteControlClient) {
- if (remoteControlClient == null) {
- throw new IllegalArgumentException("remoteControlClient must not be null");
- }
-
- if (DEBUG) {
- Log.d(TAG, "removeRemoteControlClient: " + remoteControlClient);
- }
- sGlobal.removeRemoteControlClient(remoteControlClient);
- }
-
- /**
- * Sets the media session to enable remote control of the volume of the
- * selected route. This should be used instead of
- * {@link #addRemoteControlClient} when using media sessions. Set the
- * session to null to clear it.
- *
- * @param mediaSession The {@link android.media.session.MediaSession} to
- * use.
- */
- public void setMediaSession(Object mediaSession) {
- if (DEBUG) {
- Log.d(TAG, "addMediaSession: " + mediaSession);
- }
- sGlobal.setMediaSession(mediaSession);
- }
-
- /**
- * Sets a compat media session to enable remote control of the volume of the
- * selected route. This should be used instead of
- * {@link #addRemoteControlClient} when using {@link MediaSessionCompat}.
- * Set the session to null to clear it.
- *
- * @param mediaSession
- */
- public void setMediaSessionCompat(MediaSessionCompat mediaSession) {
- if (DEBUG) {
- Log.d(TAG, "addMediaSessionCompat: " + mediaSession);
- }
- sGlobal.setMediaSessionCompat(mediaSession);
- }
-
- public MediaSessionCompat.Token getMediaSessionToken() {
- return sGlobal.getMediaSessionToken();
- }
-
- /**
- * Ensures that calls into the media router are on the correct thread.
- * It pays to be a little paranoid when global state invariants are at risk.
- */
- static void checkCallingThread() {
- if (Looper.myLooper() != Looper.getMainLooper()) {
- throw new IllegalStateException("The media router service must only be "
- + "accessed on the application's main thread.");
- }
- }
-
- static <T> boolean equal(T a, T b) {
- return a == b || (a != null && b != null && a.equals(b));
- }
-
- /**
- * Provides information about a media route.
- * <p>
- * Each media route has a list of {@link MediaControlIntent media control}
- * {@link #getControlFilters intent filters} that describe the capabilities of the
- * route and the manner in which it is used and controlled.
- * </p>
- */
- public static class RouteInfo {
- private final ProviderInfo mProvider;
- private final String mDescriptorId;
- private final String mUniqueId;
- private String mName;
- private String mDescription;
- private Uri mIconUri;
- private boolean mEnabled;
- private boolean mConnecting;
- private int mConnectionState;
- private boolean mCanDisconnect;
- private final ArrayList<IntentFilter> mControlFilters = new ArrayList<>();
- private int mPlaybackType;
- private int mPlaybackStream;
- private int mDeviceType;
- private int mVolumeHandling;
- private int mVolume;
- private int mVolumeMax;
- private Display mPresentationDisplay;
- private int mPresentationDisplayId = PRESENTATION_DISPLAY_ID_NONE;
- private Bundle mExtras;
- private IntentSender mSettingsIntent;
- MediaRouteDescriptor mDescriptor;
-
- @IntDef({CONNECTION_STATE_DISCONNECTED, CONNECTION_STATE_CONNECTING,
- CONNECTION_STATE_CONNECTED})
- @Retention(RetentionPolicy.SOURCE)
- private @interface ConnectionState {}
-
- /**
- * The default connection state indicating the route is disconnected.
- *
- * @see #getConnectionState
- */
- public static final int CONNECTION_STATE_DISCONNECTED = 0;
-
- /**
- * A connection state indicating the route is in the process of connecting and is not yet
- * ready for use.
- *
- * @see #getConnectionState
- */
- public static final int CONNECTION_STATE_CONNECTING = 1;
-
- /**
- * A connection state indicating the route is connected.
- *
- * @see #getConnectionState
- */
- public static final int CONNECTION_STATE_CONNECTED = 2;
-
- @IntDef({PLAYBACK_TYPE_LOCAL,PLAYBACK_TYPE_REMOTE})
- @Retention(RetentionPolicy.SOURCE)
- private @interface PlaybackType {}
-
- /**
- * The default playback type, "local", indicating the presentation of the media
- * is happening on the same device (e.g. a phone, a tablet) as where it is
- * controlled from.
- *
- * @see #getPlaybackType
- */
- public static final int PLAYBACK_TYPE_LOCAL = 0;
-
- /**
- * A playback type indicating the presentation of the media is happening on
- * a different device (i.e. the remote device) than where it is controlled from.
- *
- * @see #getPlaybackType
- */
- public static final int PLAYBACK_TYPE_REMOTE = 1;
-
- @IntDef({DEVICE_TYPE_UNKNOWN, DEVICE_TYPE_TV, DEVICE_TYPE_SPEAKER, DEVICE_TYPE_BLUETOOTH})
- @Retention(RetentionPolicy.SOURCE)
- private @interface DeviceType {}
-
- /**
- * The default receiver device type of the route indicating the type is unknown.
- *
- * @see #getDeviceType
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public static final int DEVICE_TYPE_UNKNOWN = 0;
-
- /**
- * A receiver device type of the route indicating the presentation of the media is happening
- * on a TV.
- *
- * @see #getDeviceType
- */
- public static final int DEVICE_TYPE_TV = 1;
-
- /**
- * A receiver device type of the route indicating the presentation of the media is happening
- * on a speaker.
- *
- * @see #getDeviceType
- */
- public static final int DEVICE_TYPE_SPEAKER = 2;
-
- /**
- * A receiver device type of the route indicating the presentation of the media is happening
- * on a bluetooth device such as a bluetooth speaker.
- *
- * @see #getDeviceType
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public static final int DEVICE_TYPE_BLUETOOTH = 3;
-
- @IntDef({PLAYBACK_VOLUME_FIXED,PLAYBACK_VOLUME_VARIABLE})
- @Retention(RetentionPolicy.SOURCE)
- private @interface PlaybackVolume {}
-
- /**
- * Playback information indicating the playback volume is fixed, i.e. it cannot be
- * controlled from this object. An example of fixed playback volume is a remote player,
- * playing over HDMI where the user prefers to control the volume on the HDMI sink, rather
- * than attenuate at the source.
- *
- * @see #getVolumeHandling
- */
- public static final int PLAYBACK_VOLUME_FIXED = 0;
-
- /**
- * Playback information indicating the playback volume is variable and can be controlled
- * from this object.
- *
- * @see #getVolumeHandling
- */
- public static final int PLAYBACK_VOLUME_VARIABLE = 1;
-
- /**
- * The default presentation display id indicating no presentation display is associated
- * with the route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public static final int PRESENTATION_DISPLAY_ID_NONE = -1;
-
- static final int CHANGE_GENERAL = 1 << 0;
- static final int CHANGE_VOLUME = 1 << 1;
- static final int CHANGE_PRESENTATION_DISPLAY = 1 << 2;
-
- // Should match to SystemMediaRouteProvider.PACKAGE_NAME.
- static final String SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME = "android";
-
- RouteInfo(ProviderInfo provider, String descriptorId, String uniqueId) {
- mProvider = provider;
- mDescriptorId = descriptorId;
- mUniqueId = uniqueId;
- }
-
- /**
- * Gets information about the provider of this media route.
- */
- public ProviderInfo getProvider() {
- return mProvider;
- }
-
- /**
- * Gets the unique id of the route.
- * <p>
- * The route unique id functions as a stable identifier by which the route is known.
- * For example, an application can use this id as a token to remember the
- * selected route across restarts or to communicate its identity to a service.
- * </p>
- *
- * @return The unique id of the route, never null.
- */
- @NonNull
- public String getId() {
- return mUniqueId;
- }
-
- /**
- * Gets the user-visible name of the route.
- * <p>
- * The route name identifies the destination represented by the route.
- * It may be a user-supplied name, an alias, or device serial number.
- * </p>
- *
- * @return The user-visible name of a media route. This is the string presented
- * to users who may select this as the active route.
- */
- public String getName() {
- return mName;
- }
-
- /**
- * Gets the user-visible description of the route.
- * <p>
- * The route description describes the kind of destination represented by the route.
- * It may be a user-supplied string, a model number or brand of device.
- * </p>
- *
- * @return The description of the route, or null if none.
- */
- @Nullable
- public String getDescription() {
- return mDescription;
- }
-
- /**
- * Gets the URI of the icon representing this route.
- * <p>
- * This icon will be used in picker UIs if available.
- * </p>
- *
- * @return The URI of the icon representing this route, or null if none.
- */
- public Uri getIconUri() {
- return mIconUri;
- }
-
- /**
- * Returns true if this route is enabled and may be selected.
- *
- * @return True if this route is enabled.
- */
- public boolean isEnabled() {
- return mEnabled;
- }
-
- /**
- * Returns true if the route is in the process of connecting and is not
- * yet ready for use.
- *
- * @return True if this route is in the process of connecting.
- */
- public boolean isConnecting() {
- return mConnecting;
- }
-
- /**
- * Gets the connection state of the route.
- *
- * @return The connection state of this route: {@link #CONNECTION_STATE_DISCONNECTED},
- * {@link #CONNECTION_STATE_CONNECTING}, or {@link #CONNECTION_STATE_CONNECTED}.
- */
- @ConnectionState
- public int getConnectionState() {
- return mConnectionState;
- }
-
- /**
- * Returns true if this route is currently selected.
- *
- * @return True if this route is currently selected.
- *
- * @see MediaRouter#getSelectedRoute
- */
- public boolean isSelected() {
- checkCallingThread();
- return sGlobal.getSelectedRoute() == this;
- }
-
- /**
- * Returns true if this route is the default route.
- *
- * @return True if this route is the default route.
- *
- * @see MediaRouter#getDefaultRoute
- */
- public boolean isDefault() {
- checkCallingThread();
- return sGlobal.getDefaultRoute() == this;
- }
-
- /**
- * Returns true if this route is a bluetooth route.
- *
- * @return True if this route is a bluetooth route.
- *
- * @see MediaRouter#getBluetoothRoute
- */
- public boolean isBluetooth() {
- checkCallingThread();
- return sGlobal.getBluetoothRoute() == this;
- }
-
- /**
- * Returns true if this route is the default route and the device speaker.
- *
- * @return True if this route is the default route and the device speaker.
- */
- public boolean isDeviceSpeaker() {
- int defaultAudioRouteNameResourceId = Resources.getSystem().getIdentifier(
- "default_audio_route_name", "string", "android");
- return isDefault()
- && Resources.getSystem().getText(defaultAudioRouteNameResourceId).equals(mName);
- }
-
- /**
- * Gets a list of {@link MediaControlIntent media control intent} filters that
- * describe the capabilities of this route and the media control actions that
- * it supports.
- *
- * @return A list of intent filters that specifies the media control intents that
- * this route supports.
- *
- * @see MediaControlIntent
- * @see #supportsControlCategory
- * @see #supportsControlRequest
- */
- public List<IntentFilter> getControlFilters() {
- return mControlFilters;
- }
-
- /**
- * Returns true if the route supports at least one of the capabilities
- * described by a media route selector.
- *
- * @param selector The selector that specifies the capabilities to check.
- * @return True if the route supports at least one of the capabilities
- * described in the media route selector.
- */
- public boolean matchesSelector(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
- checkCallingThread();
- return selector.matchesControlFilters(mControlFilters);
- }
-
- /**
- * Returns true if the route supports the specified
- * {@link MediaControlIntent media control} category.
- * <p>
- * Media control categories describe the capabilities of this route
- * such as whether it supports live audio streaming or remote playback.
- * </p>
- *
- * @param category A {@link MediaControlIntent media control} category
- * such as {@link MediaControlIntent#CATEGORY_LIVE_AUDIO},
- * {@link MediaControlIntent#CATEGORY_LIVE_VIDEO},
- * {@link MediaControlIntent#CATEGORY_REMOTE_PLAYBACK}, or a provider-defined
- * media control category.
- * @return True if the route supports the specified intent category.
- *
- * @see MediaControlIntent
- * @see #getControlFilters
- */
- public boolean supportsControlCategory(@NonNull String category) {
- if (category == null) {
- throw new IllegalArgumentException("category must not be null");
- }
- checkCallingThread();
-
- int count = mControlFilters.size();
- for (int i = 0; i < count; i++) {
- if (mControlFilters.get(i).hasCategory(category)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns true if the route supports the specified
- * {@link MediaControlIntent media control} category and action.
- * <p>
- * Media control actions describe specific requests that an application
- * can ask a route to perform.
- * </p>
- *
- * @param category A {@link MediaControlIntent media control} category
- * such as {@link MediaControlIntent#CATEGORY_LIVE_AUDIO},
- * {@link MediaControlIntent#CATEGORY_LIVE_VIDEO},
- * {@link MediaControlIntent#CATEGORY_REMOTE_PLAYBACK}, or a provider-defined
- * media control category.
- * @param action A {@link MediaControlIntent media control} action
- * such as {@link MediaControlIntent#ACTION_PLAY}.
- * @return True if the route supports the specified intent action.
- *
- * @see MediaControlIntent
- * @see #getControlFilters
- */
- public boolean supportsControlAction(@NonNull String category, @NonNull String action) {
- if (category == null) {
- throw new IllegalArgumentException("category must not be null");
- }
- if (action == null) {
- throw new IllegalArgumentException("action must not be null");
- }
- checkCallingThread();
-
- int count = mControlFilters.size();
- for (int i = 0; i < count; i++) {
- IntentFilter filter = mControlFilters.get(i);
- if (filter.hasCategory(category) && filter.hasAction(action)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns true if the route supports the specified
- * {@link MediaControlIntent media control} request.
- * <p>
- * Media control requests are used to request the route to perform
- * actions such as starting remote playback of a media item.
- * </p>
- *
- * @param intent A {@link MediaControlIntent media control intent}.
- * @return True if the route can handle the specified intent.
- *
- * @see MediaControlIntent
- * @see #getControlFilters
- */
- public boolean supportsControlRequest(@NonNull Intent intent) {
- if (intent == null) {
- throw new IllegalArgumentException("intent must not be null");
- }
- checkCallingThread();
-
- ContentResolver contentResolver = sGlobal.getContentResolver();
- int count = mControlFilters.size();
- for (int i = 0; i < count; i++) {
- if (mControlFilters.get(i).match(contentResolver, intent, true, TAG) >= 0) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Sends a {@link MediaControlIntent media control} request to be performed
- * asynchronously by the route's destination.
- * <p>
- * Media control requests are used to request the route to perform
- * actions such as starting remote playback of a media item.
- * </p><p>
- * This function may only be called on a selected route. Control requests
- * sent to unselected routes will fail.
- * </p>
- *
- * @param intent A {@link MediaControlIntent media control intent}.
- * @param callback A {@link ControlRequestCallback} to invoke with the result
- * of the request, or null if no result is required.
- *
- * @see MediaControlIntent
- */
- public void sendControlRequest(@NonNull Intent intent,
- @Nullable ControlRequestCallback callback) {
- if (intent == null) {
- throw new IllegalArgumentException("intent must not be null");
- }
- checkCallingThread();
-
- sGlobal.sendControlRequest(this, intent, callback);
- }
-
- /**
- * Gets the type of playback associated with this route.
- *
- * @return The type of playback associated with this route: {@link #PLAYBACK_TYPE_LOCAL}
- * or {@link #PLAYBACK_TYPE_REMOTE}.
- */
- @PlaybackType
- public int getPlaybackType() {
- return mPlaybackType;
- }
-
- /**
- * Gets the audio stream over which the playback associated with this route is performed.
- *
- * @return The stream over which the playback associated with this route is performed.
- */
- public int getPlaybackStream() {
- return mPlaybackStream;
- }
-
- /**
- * Gets the type of the receiver device associated with this route.
- *
- * @return The type of the receiver device associated with this route:
- * {@link #DEVICE_TYPE_TV} or {@link #DEVICE_TYPE_SPEAKER}.
- */
- public int getDeviceType() {
- return mDeviceType;
- }
-
-
- /**
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public boolean isDefaultOrBluetooth() {
- if (isDefault() || mDeviceType == DEVICE_TYPE_BLUETOOTH) {
- return true;
- }
- // This is a workaround for platform version 23 or below where the system route
- // provider doesn't specify device type for bluetooth media routes.
- return isSystemMediaRouteProvider(this)
- && supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- && !supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
- }
-
- /**
- * Returns {@code true} if the route is selectable.
- */
- boolean isSelectable() {
- // This tests whether the route is still valid and enabled.
- // The route descriptor field is set to null when the route is removed.
- return mDescriptor != null && mEnabled;
- }
-
- private static boolean isSystemMediaRouteProvider(MediaRouter.RouteInfo route) {
- return TextUtils.equals(route.getProviderInstance().getMetadata().getPackageName(),
- SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME);
- }
-
- /**
- * Gets information about how volume is handled on the route.
- *
- * @return How volume is handled on the route: {@link #PLAYBACK_VOLUME_FIXED}
- * or {@link #PLAYBACK_VOLUME_VARIABLE}.
- */
- @PlaybackVolume
- public int getVolumeHandling() {
- return mVolumeHandling;
- }
-
- /**
- * Gets the current volume for this route. Depending on the route, this may only
- * be valid if the route is currently selected.
- *
- * @return The volume at which the playback associated with this route is performed.
- */
- public int getVolume() {
- return mVolume;
- }
-
- /**
- * Gets the maximum volume at which the playback associated with this route is performed.
- *
- * @return The maximum volume at which the playback associated with
- * this route is performed.
- */
- public int getVolumeMax() {
- return mVolumeMax;
- }
-
- /**
- * Gets whether this route supports disconnecting without interrupting
- * playback.
- *
- * @return True if this route can disconnect without stopping playback,
- * false otherwise.
- */
- public boolean canDisconnect() {
- return mCanDisconnect;
- }
-
- /**
- * Requests a volume change for this route asynchronously.
- * <p>
- * This function may only be called on a selected route. It will have
- * no effect if the route is currently unselected.
- * </p>
- *
- * @param volume The new volume value between 0 and {@link #getVolumeMax}.
- */
- public void requestSetVolume(int volume) {
- checkCallingThread();
- sGlobal.requestSetVolume(this, Math.min(mVolumeMax, Math.max(0, volume)));
- }
-
- /**
- * Requests an incremental volume update for this route asynchronously.
- * <p>
- * This function may only be called on a selected route. It will have
- * no effect if the route is currently unselected.
- * </p>
- *
- * @param delta The delta to add to the current volume.
- */
- public void requestUpdateVolume(int delta) {
- checkCallingThread();
- if (delta != 0) {
- sGlobal.requestUpdateVolume(this, delta);
- }
- }
-
- /**
- * Gets the {@link Display} that should be used by the application to show
- * a {@link android.app.Presentation} on an external display when this route is selected.
- * Depending on the route, this may only be valid if the route is currently
- * selected.
- * <p>
- * The preferred presentation display may change independently of the route
- * being selected or unselected. For example, the presentation display
- * of the default system route may change when an external HDMI display is connected
- * or disconnected even though the route itself has not changed.
- * </p><p>
- * This method may return null if there is no external display associated with
- * the route or if the display is not ready to show UI yet.
- * </p><p>
- * The application should listen for changes to the presentation display
- * using the {@link Callback#onRoutePresentationDisplayChanged} callback and
- * show or dismiss its {@link android.app.Presentation} accordingly when the display
- * becomes available or is removed.
- * </p><p>
- * This method only makes sense for
- * {@link MediaControlIntent#CATEGORY_LIVE_VIDEO live video} routes.
- * </p>
- *
- * @return The preferred presentation display to use when this route is
- * selected or null if none.
- *
- * @see MediaControlIntent#CATEGORY_LIVE_VIDEO
- * @see android.app.Presentation
- */
- @Nullable
- public Display getPresentationDisplay() {
- checkCallingThread();
- if (mPresentationDisplayId >= 0 && mPresentationDisplay == null) {
- mPresentationDisplay = sGlobal.getDisplay(mPresentationDisplayId);
- }
- return mPresentationDisplay;
- }
-
- /**
- * Gets the route's presentation display id, or -1 if none.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public int getPresentationDisplayId() {
- return mPresentationDisplayId;
- }
-
- /**
- * Gets a collection of extra properties about this route that were supplied
- * by its media route provider, or null if none.
- */
- @Nullable
- public Bundle getExtras() {
- return mExtras;
- }
-
- /**
- * Gets an intent sender for launching a settings activity for this
- * route.
- */
- @Nullable
- public IntentSender getSettingsIntent() {
- return mSettingsIntent;
- }
-
- /**
- * Selects this media route.
- */
- public void select() {
- checkCallingThread();
- sGlobal.selectRoute(this);
- }
-
- @Override
- public String toString() {
- return "MediaRouter.RouteInfo{ uniqueId=" + mUniqueId
- + ", name=" + mName
- + ", description=" + mDescription
- + ", iconUri=" + mIconUri
- + ", enabled=" + mEnabled
- + ", connecting=" + mConnecting
- + ", connectionState=" + mConnectionState
- + ", canDisconnect=" + mCanDisconnect
- + ", playbackType=" + mPlaybackType
- + ", playbackStream=" + mPlaybackStream
- + ", deviceType=" + mDeviceType
- + ", volumeHandling=" + mVolumeHandling
- + ", volume=" + mVolume
- + ", volumeMax=" + mVolumeMax
- + ", presentationDisplayId=" + mPresentationDisplayId
- + ", extras=" + mExtras
- + ", settingsIntent=" + mSettingsIntent
- + ", providerPackageName=" + mProvider.getPackageName()
- + " }";
- }
-
- int maybeUpdateDescriptor(MediaRouteDescriptor descriptor) {
- int changes = 0;
- if (mDescriptor != descriptor) {
- changes = updateDescriptor(descriptor);
- }
- return changes;
- }
-
- int updateDescriptor(MediaRouteDescriptor descriptor) {
- int changes = 0;
- mDescriptor = descriptor;
- if (descriptor != null) {
- if (!equal(mName, descriptor.getName())) {
- mName = descriptor.getName();
- changes |= CHANGE_GENERAL;
- }
- if (!equal(mDescription, descriptor.getDescription())) {
- mDescription = descriptor.getDescription();
- changes |= CHANGE_GENERAL;
- }
- if (!equal(mIconUri, descriptor.getIconUri())) {
- mIconUri = descriptor.getIconUri();
- changes |= CHANGE_GENERAL;
- }
- if (mEnabled != descriptor.isEnabled()) {
- mEnabled = descriptor.isEnabled();
- changes |= CHANGE_GENERAL;
- }
- if (mConnecting != descriptor.isConnecting()) {
- mConnecting = descriptor.isConnecting();
- changes |= CHANGE_GENERAL;
- }
- if (mConnectionState != descriptor.getConnectionState()) {
- mConnectionState = descriptor.getConnectionState();
- changes |= CHANGE_GENERAL;
- }
- if (!mControlFilters.equals(descriptor.getControlFilters())) {
- mControlFilters.clear();
- mControlFilters.addAll(descriptor.getControlFilters());
- changes |= CHANGE_GENERAL;
- }
- if (mPlaybackType != descriptor.getPlaybackType()) {
- mPlaybackType = descriptor.getPlaybackType();
- changes |= CHANGE_GENERAL;
- }
- if (mPlaybackStream != descriptor.getPlaybackStream()) {
- mPlaybackStream = descriptor.getPlaybackStream();
- changes |= CHANGE_GENERAL;
- }
- if (mDeviceType != descriptor.getDeviceType()) {
- mDeviceType = descriptor.getDeviceType();
- changes |= CHANGE_GENERAL;
- }
- if (mVolumeHandling != descriptor.getVolumeHandling()) {
- mVolumeHandling = descriptor.getVolumeHandling();
- changes |= CHANGE_GENERAL | CHANGE_VOLUME;
- }
- if (mVolume != descriptor.getVolume()) {
- mVolume = descriptor.getVolume();
- changes |= CHANGE_GENERAL | CHANGE_VOLUME;
- }
- if (mVolumeMax != descriptor.getVolumeMax()) {
- mVolumeMax = descriptor.getVolumeMax();
- changes |= CHANGE_GENERAL | CHANGE_VOLUME;
- }
- if (mPresentationDisplayId != descriptor.getPresentationDisplayId()) {
- mPresentationDisplayId = descriptor.getPresentationDisplayId();
- mPresentationDisplay = null;
- changes |= CHANGE_GENERAL | CHANGE_PRESENTATION_DISPLAY;
- }
- if (!equal(mExtras, descriptor.getExtras())) {
- mExtras = descriptor.getExtras();
- changes |= CHANGE_GENERAL;
- }
- if (!equal(mSettingsIntent, descriptor.getSettingsActivity())) {
- mSettingsIntent = descriptor.getSettingsActivity();
- changes |= CHANGE_GENERAL;
- }
- if (mCanDisconnect != descriptor.canDisconnectAndKeepPlaying()) {
- mCanDisconnect = descriptor.canDisconnectAndKeepPlaying();
- changes |= CHANGE_GENERAL | CHANGE_PRESENTATION_DISPLAY;
- }
- }
- return changes;
- }
-
- String getDescriptorId() {
- return mDescriptorId;
- }
-
- /** @hide */
- // @RestrictTo(LIBRARY_GROUP)
- public MediaRouteProvider getProviderInstance() {
- return mProvider.getProviderInstance();
- }
- }
-
- /**
- * Information about a route that consists of multiple other routes in a group.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public static class RouteGroup extends RouteInfo {
- private List<RouteInfo> mRoutes = new ArrayList<>();
-
- RouteGroup(ProviderInfo provider, String descriptorId, String uniqueId) {
- super(provider, descriptorId, uniqueId);
- }
-
- /**
- * @return The number of routes in this group
- */
- public int getRouteCount() {
- return mRoutes.size();
- }
-
- /**
- * Returns the route in this group at the specified index
- *
- * @param index Index to fetch
- * @return The route at index
- */
- public RouteInfo getRouteAt(int index) {
- return mRoutes.get(index);
- }
-
- /**
- * Returns the routes in this group
- *
- * @return The list of the routes in this group
- */
- public List<RouteInfo> getRoutes() {
- return mRoutes;
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder(super.toString());
- sb.append('[');
- final int count = mRoutes.size();
- for (int i = 0; i < count; i++) {
- if (i > 0) sb.append(", ");
- sb.append(mRoutes.get(i));
- }
- sb.append(']');
- return sb.toString();
- }
-
- @Override
- int maybeUpdateDescriptor(MediaRouteDescriptor descriptor) {
- boolean changed = false;
- if (mDescriptor != descriptor) {
- mDescriptor = descriptor;
- if (descriptor != null) {
- List<String> groupMemberIds = descriptor.getGroupMemberIds();
- List<RouteInfo> routes = new ArrayList<>();
- changed = groupMemberIds.size() != mRoutes.size();
- for (String groupMemberId : groupMemberIds) {
- String uniqueId = sGlobal.getUniqueId(getProvider(), groupMemberId);
- RouteInfo groupMember = sGlobal.getRoute(uniqueId);
- if (groupMember != null) {
- routes.add(groupMember);
- if (!changed && !mRoutes.contains(groupMember)) {
- changed = true;
- }
- }
- }
- if (changed) {
- mRoutes = routes;
- }
- }
- }
- return (changed ? CHANGE_GENERAL : 0) | super.updateDescriptor(descriptor);
- }
- }
-
- /**
- * Provides information about a media route provider.
- * <p>
- * This object may be used to determine which media route provider has
- * published a particular route.
- * </p>
- */
- public static final class ProviderInfo {
- private final MediaRouteProvider mProviderInstance;
- private final List<RouteInfo> mRoutes = new ArrayList<>();
-
- private final ProviderMetadata mMetadata;
- private MediaRouteProviderDescriptor mDescriptor;
- private Resources mResources;
- private boolean mResourcesNotAvailable;
-
- ProviderInfo(MediaRouteProvider provider) {
- mProviderInstance = provider;
- mMetadata = provider.getMetadata();
- }
-
- /**
- * Gets the provider's underlying {@link MediaRouteProvider} instance.
- */
- public MediaRouteProvider getProviderInstance() {
- checkCallingThread();
- return mProviderInstance;
- }
-
- /**
- * Gets the package name of the media route provider.
- */
- public String getPackageName() {
- return mMetadata.getPackageName();
- }
-
- /**
- * Gets the component name of the media route provider.
- */
- public ComponentName getComponentName() {
- return mMetadata.getComponentName();
- }
-
- /**
- * Gets the {@link MediaRouter.RouteInfo routes} published by this route provider.
- */
- public List<RouteInfo> getRoutes() {
- checkCallingThread();
- return mRoutes;
- }
-
- Resources getResources() {
- if (mResources == null && !mResourcesNotAvailable) {
- String packageName = getPackageName();
- Context context = sGlobal.getProviderContext(packageName);
- if (context != null) {
- mResources = context.getResources();
- } else {
- Log.w(TAG, "Unable to obtain resources for route provider package: "
- + packageName);
- mResourcesNotAvailable = true;
- }
- }
- return mResources;
- }
-
- boolean updateDescriptor(MediaRouteProviderDescriptor descriptor) {
- if (mDescriptor != descriptor) {
- mDescriptor = descriptor;
- return true;
- }
- return false;
- }
-
- int findRouteByDescriptorId(String id) {
- final int count = mRoutes.size();
- for (int i = 0; i < count; i++) {
- if (mRoutes.get(i).mDescriptorId.equals(id)) {
- return i;
- }
- }
- return -1;
- }
-
- @Override
- public String toString() {
- return "MediaRouter.RouteProviderInfo{ packageName=" + getPackageName()
- + " }";
- }
- }
-
- /**
- * Interface for receiving events about media routing changes.
- * All methods of this interface will be called from the application's main thread.
- * <p>
- * A Callback will only receive events relevant to routes that the callback
- * was registered for unless the {@link MediaRouter#CALLBACK_FLAG_UNFILTERED_EVENTS}
- * flag was specified in {@link MediaRouter#addCallback(MediaRouteSelector, Callback, int)}.
- * </p>
- *
- * @see MediaRouter#addCallback(MediaRouteSelector, Callback, int)
- * @see MediaRouter#removeCallback(Callback)
- */
- public static abstract class Callback {
- /**
- * Called when the supplied media route becomes selected as the active route.
- *
- * @param router The media router reporting the event.
- * @param route The route that has been selected.
- */
- public void onRouteSelected(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when the supplied media route becomes unselected as the active route.
- * For detailed reason, override {@link #onRouteUnselected(MediaRouter, RouteInfo, int)}
- * instead.
- *
- * @param router The media router reporting the event.
- * @param route The route that has been unselected.
- */
- public void onRouteUnselected(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when the supplied media route becomes unselected as the active route.
- * The default implementation calls {@link #onRouteUnselected}.
- * <p>
- * The reason provided will be one of the following:
- * <ul>
- * <li>{@link MediaRouter#UNSELECT_REASON_UNKNOWN}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_DISCONNECTED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_STOPPED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_ROUTE_CHANGED}</li>
- * </ul>
- *
- * @param router The media router reporting the event.
- * @param route The route that has been unselected.
- * @param reason The reason for unselecting the route.
- */
- public void onRouteUnselected(MediaRouter router, RouteInfo route, int reason) {
- onRouteUnselected(router, route);
- }
-
- /**
- * Called when a media route has been added.
- *
- * @param router The media router reporting the event.
- * @param route The route that has become available for use.
- */
- public void onRouteAdded(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a media route has been removed.
- *
- * @param router The media router reporting the event.
- * @param route The route that has been removed from availability.
- */
- public void onRouteRemoved(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a property of the indicated media route has changed.
- *
- * @param router The media router reporting the event.
- * @param route The route that was changed.
- */
- public void onRouteChanged(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a media route's volume changes.
- *
- * @param router The media router reporting the event.
- * @param route The route whose volume changed.
- */
- public void onRouteVolumeChanged(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a media route's presentation display changes.
- * <p>
- * This method is called whenever the route's presentation display becomes
- * available, is removed or has changes to some of its properties (such as its size).
- * </p>
- *
- * @param router The media router reporting the event.
- * @param route The route whose presentation display changed.
- *
- * @see RouteInfo#getPresentationDisplay()
- */
- public void onRoutePresentationDisplayChanged(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a media route provider has been added.
- *
- * @param router The media router reporting the event.
- * @param provider The provider that has become available for use.
- */
- public void onProviderAdded(MediaRouter router, ProviderInfo provider) {
- }
-
- /**
- * Called when a media route provider has been removed.
- *
- * @param router The media router reporting the event.
- * @param provider The provider that has been removed from availability.
- */
- public void onProviderRemoved(MediaRouter router, ProviderInfo provider) {
- }
-
- /**
- * Called when a property of the indicated media route provider has changed.
- *
- * @param router The media router reporting the event.
- * @param provider The provider that was changed.
- */
- public void onProviderChanged(MediaRouter router, ProviderInfo provider) {
- }
- }
-
- /**
- * Callback which is invoked with the result of a media control request.
- *
- * @see RouteInfo#sendControlRequest
- */
- public static abstract class ControlRequestCallback {
- /**
- * Called when a media control request succeeds.
- *
- * @param data Result data, or null if none.
- * Contents depend on the {@link MediaControlIntent media control action}.
- */
- public void onResult(Bundle data) {
- }
-
- /**
- * Called when a media control request fails.
- *
- * @param error A localized error message which may be shown to the user, or null
- * if the cause of the error is unclear.
- * @param data Error data, or null if none.
- * Contents depend on the {@link MediaControlIntent media control action}.
- */
- public void onError(String error, Bundle data) {
- }
- }
-
- private static final class CallbackRecord {
- public final MediaRouter mRouter;
- public final Callback mCallback;
- public MediaRouteSelector mSelector;
- public int mFlags;
-
- public CallbackRecord(MediaRouter router, Callback callback) {
- mRouter = router;
- mCallback = callback;
- mSelector = MediaRouteSelector.EMPTY;
- }
-
- public boolean filterRouteEvent(RouteInfo route) {
- return (mFlags & CALLBACK_FLAG_UNFILTERED_EVENTS) != 0
- || route.matchesSelector(mSelector);
- }
- }
-
- /**
- * Global state for the media router.
- * <p>
- * Media routes and media route providers are global to the process; their
- * state and the bulk of the media router implementation lives here.
- * </p>
- */
- private static final class GlobalMediaRouter
- implements SystemMediaRouteProvider.SyncCallback,
- RegisteredMediaRouteProviderWatcher.Callback {
- final Context mApplicationContext;
- final ArrayList<WeakReference<MediaRouter>> mRouters = new ArrayList<>();
- private final ArrayList<RouteInfo> mRoutes = new ArrayList<>();
- private final Map<Pair<String, String>, String> mUniqueIdMap = new HashMap<>();
- private final ArrayList<ProviderInfo> mProviders = new ArrayList<>();
- private final ArrayList<RemoteControlClientRecord> mRemoteControlClients =
- new ArrayList<>();
- final RemoteControlClientCompat.PlaybackInfo mPlaybackInfo =
- new RemoteControlClientCompat.PlaybackInfo();
- private final ProviderCallback mProviderCallback = new ProviderCallback();
- final CallbackHandler mCallbackHandler = new CallbackHandler();
- private final DisplayManagerCompat mDisplayManager;
- final SystemMediaRouteProvider mSystemProvider;
- private final boolean mLowRam;
-
- private RegisteredMediaRouteProviderWatcher mRegisteredProviderWatcher;
- private RouteInfo mDefaultRoute;
- private RouteInfo mBluetoothRoute;
- RouteInfo mSelectedRoute;
- private RouteController mSelectedRouteController;
- // A map from route descriptor ID to RouteController for the member routes in the currently
- // selected route group.
- private final Map<String, RouteController> mRouteControllerMap = new HashMap<>();
- private MediaRouteDiscoveryRequest mDiscoveryRequest;
- private MediaSessionRecord mMediaSession;
- MediaSessionCompat mRccMediaSession;
- private MediaSessionCompat mCompatSession;
- private MediaSessionCompat.OnActiveChangeListener mSessionActiveListener =
- new MediaSessionCompat.OnActiveChangeListener() {
- @Override
- public void onActiveChanged() {
- if(mRccMediaSession != null) {
- if (mRccMediaSession.isActive()) {
- addRemoteControlClient(mRccMediaSession.getRemoteControlClient());
- } else {
- removeRemoteControlClient(mRccMediaSession.getRemoteControlClient());
- }
- }
- }
- };
-
- GlobalMediaRouter(Context applicationContext) {
- mApplicationContext = applicationContext;
- mDisplayManager = DisplayManagerCompat.getInstance(applicationContext);
- mLowRam = ActivityManagerCompat.isLowRamDevice(
- (ActivityManager)applicationContext.getSystemService(
- Context.ACTIVITY_SERVICE));
-
- // Add the system media route provider for interoperating with
- // the framework media router. This one is special and receives
- // synchronization messages from the media router.
- mSystemProvider = SystemMediaRouteProvider.obtain(applicationContext, this);
- }
-
- public void start() {
- addProvider(mSystemProvider);
-
- // Start watching for routes published by registered media route
- // provider services.
- mRegisteredProviderWatcher = new RegisteredMediaRouteProviderWatcher(
- mApplicationContext, this);
- mRegisteredProviderWatcher.start();
- }
-
- public MediaRouter getRouter(Context context) {
- MediaRouter router;
- for (int i = mRouters.size(); --i >= 0; ) {
- router = mRouters.get(i).get();
- if (router == null) {
- mRouters.remove(i);
- } else if (router.mContext == context) {
- return router;
- }
- }
- router = new MediaRouter(context);
- mRouters.add(new WeakReference<MediaRouter>(router));
- return router;
- }
-
- public ContentResolver getContentResolver() {
- return mApplicationContext.getContentResolver();
- }
-
- public Context getProviderContext(String packageName) {
- if (packageName.equals(SystemMediaRouteProvider.PACKAGE_NAME)) {
- return mApplicationContext;
- }
- try {
- return mApplicationContext.createPackageContext(
- packageName, Context.CONTEXT_RESTRICTED);
- } catch (NameNotFoundException ex) {
- return null;
- }
- }
-
- public Display getDisplay(int displayId) {
- return mDisplayManager.getDisplay(displayId);
- }
-
- public void sendControlRequest(RouteInfo route,
- Intent intent, ControlRequestCallback callback) {
- if (route == mSelectedRoute && mSelectedRouteController != null) {
- if (mSelectedRouteController.onControlRequest(intent, callback)) {
- return;
- }
- }
- if (callback != null) {
- callback.onError(null, null);
- }
- }
-
- public void requestSetVolume(RouteInfo route, int volume) {
- if (route == mSelectedRoute && mSelectedRouteController != null) {
- mSelectedRouteController.onSetVolume(volume);
- } else if (!mRouteControllerMap.isEmpty()) {
- RouteController controller = mRouteControllerMap.get(route.mDescriptorId);
- if (controller != null) {
- controller.onSetVolume(volume);
- }
- }
- }
-
- public void requestUpdateVolume(RouteInfo route, int delta) {
- if (route == mSelectedRoute && mSelectedRouteController != null) {
- mSelectedRouteController.onUpdateVolume(delta);
- }
- }
-
- public RouteInfo getRoute(String uniqueId) {
- for (RouteInfo info : mRoutes) {
- if (info.mUniqueId.equals(uniqueId)) {
- return info;
- }
- }
- return null;
- }
-
- public List<RouteInfo> getRoutes() {
- return mRoutes;
- }
-
- List<ProviderInfo> getProviders() {
- return mProviders;
- }
-
- @NonNull RouteInfo getDefaultRoute() {
- if (mDefaultRoute == null) {
- // This should never happen once the media router has been fully
- // initialized but it is good to check for the error in case there
- // is a bug in provider initialization.
- throw new IllegalStateException("There is no default route. "
- + "The media router has not yet been fully initialized.");
- }
- return mDefaultRoute;
- }
-
- RouteInfo getBluetoothRoute() {
- return mBluetoothRoute;
- }
-
- @NonNull RouteInfo getSelectedRoute() {
- if (mSelectedRoute == null) {
- // This should never happen once the media router has been fully
- // initialized but it is good to check for the error in case there
- // is a bug in provider initialization.
- throw new IllegalStateException("There is no currently selected route. "
- + "The media router has not yet been fully initialized.");
- }
- return mSelectedRoute;
- }
-
- void selectRoute(@NonNull RouteInfo route) {
- selectRoute(route, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
- }
-
- void selectRoute(@NonNull RouteInfo route, int unselectReason) {
- if (!mRoutes.contains(route)) {
- Log.w(TAG, "Ignoring attempt to select removed route: " + route);
- return;
- }
- if (!route.mEnabled) {
- Log.w(TAG, "Ignoring attempt to select disabled route: " + route);
- return;
- }
- setSelectedRouteInternal(route, unselectReason);
- }
-
- public boolean isRouteAvailable(MediaRouteSelector selector, int flags) {
- if (selector.isEmpty()) {
- return false;
- }
-
- // On low-RAM devices, do not rely on actual discovery results unless asked to.
- if ((flags & AVAILABILITY_FLAG_REQUIRE_MATCH) == 0 && mLowRam) {
- return true;
- }
-
- // Check whether any existing routes match the selector.
- final int routeCount = mRoutes.size();
- for (int i = 0; i < routeCount; i++) {
- RouteInfo route = mRoutes.get(i);
- if ((flags & AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE) != 0
- && route.isDefaultOrBluetooth()) {
- continue;
- }
- if (route.matchesSelector(selector)) {
- return true;
- }
- }
-
- // It doesn't look like we can find a matching route right now.
- return false;
- }
-
- public void updateDiscoveryRequest() {
- // Combine all of the callback selectors and active scan flags.
- boolean discover = false;
- boolean activeScan = false;
- MediaRouteSelector.Builder builder = new MediaRouteSelector.Builder();
- for (int i = mRouters.size(); --i >= 0; ) {
- MediaRouter router = mRouters.get(i).get();
- if (router == null) {
- mRouters.remove(i);
- } else {
- final int count = router.mCallbackRecords.size();
- for (int j = 0; j < count; j++) {
- CallbackRecord callback = router.mCallbackRecords.get(j);
- builder.addSelector(callback.mSelector);
- if ((callback.mFlags & CALLBACK_FLAG_PERFORM_ACTIVE_SCAN) != 0) {
- activeScan = true;
- discover = true; // perform active scan implies request discovery
- }
- if ((callback.mFlags & CALLBACK_FLAG_REQUEST_DISCOVERY) != 0) {
- if (!mLowRam) {
- discover = true;
- }
- }
- if ((callback.mFlags & CALLBACK_FLAG_FORCE_DISCOVERY) != 0) {
- discover = true;
- }
- }
- }
- }
- MediaRouteSelector selector = discover ? builder.build() : MediaRouteSelector.EMPTY;
-
- // Create a new discovery request.
- if (mDiscoveryRequest != null
- && mDiscoveryRequest.getSelector().equals(selector)
- && mDiscoveryRequest.isActiveScan() == activeScan) {
- return; // no change
- }
- if (selector.isEmpty() && !activeScan) {
- // Discovery is not needed.
- if (mDiscoveryRequest == null) {
- return; // no change
- }
- mDiscoveryRequest = null;
- } else {
- // Discovery is needed.
- mDiscoveryRequest = new MediaRouteDiscoveryRequest(selector, activeScan);
- }
- if (DEBUG) {
- Log.d(TAG, "Updated discovery request: " + mDiscoveryRequest);
- }
- if (discover && !activeScan && mLowRam) {
- Log.i(TAG, "Forcing passive route discovery on a low-RAM device, "
- + "system performance may be affected. Please consider using "
- + "CALLBACK_FLAG_REQUEST_DISCOVERY instead of "
- + "CALLBACK_FLAG_FORCE_DISCOVERY.");
- }
-
- // Notify providers.
- final int providerCount = mProviders.size();
- for (int i = 0; i < providerCount; i++) {
- mProviders.get(i).mProviderInstance.setDiscoveryRequest(mDiscoveryRequest);
- }
- }
-
- @Override
- public void addProvider(MediaRouteProvider providerInstance) {
- int index = findProviderInfo(providerInstance);
- if (index < 0) {
- // 1. Add the provider to the list.
- ProviderInfo provider = new ProviderInfo(providerInstance);
- mProviders.add(provider);
- if (DEBUG) {
- Log.d(TAG, "Provider added: " + provider);
- }
- mCallbackHandler.post(CallbackHandler.MSG_PROVIDER_ADDED, provider);
- // 2. Create the provider's contents.
- updateProviderContents(provider, providerInstance.getDescriptor());
- // 3. Register the provider callback.
- providerInstance.setCallback(mProviderCallback);
- // 4. Set the discovery request.
- providerInstance.setDiscoveryRequest(mDiscoveryRequest);
- }
- }
-
- @Override
- public void removeProvider(MediaRouteProvider providerInstance) {
- int index = findProviderInfo(providerInstance);
- if (index >= 0) {
- // 1. Unregister the provider callback.
- providerInstance.setCallback(null);
- // 2. Clear the discovery request.
- providerInstance.setDiscoveryRequest(null);
- // 3. Delete the provider's contents.
- ProviderInfo provider = mProviders.get(index);
- updateProviderContents(provider, null);
- // 4. Remove the provider from the list.
- if (DEBUG) {
- Log.d(TAG, "Provider removed: " + provider);
- }
- mCallbackHandler.post(CallbackHandler.MSG_PROVIDER_REMOVED, provider);
- mProviders.remove(index);
- }
- }
-
- void updateProviderDescriptor(MediaRouteProvider providerInstance,
- MediaRouteProviderDescriptor descriptor) {
- int index = findProviderInfo(providerInstance);
- if (index >= 0) {
- // Update the provider's contents.
- ProviderInfo provider = mProviders.get(index);
- updateProviderContents(provider, descriptor);
- }
- }
-
- private int findProviderInfo(MediaRouteProvider providerInstance) {
- final int count = mProviders.size();
- for (int i = 0; i < count; i++) {
- if (mProviders.get(i).mProviderInstance == providerInstance) {
- return i;
- }
- }
- return -1;
- }
-
- private void updateProviderContents(ProviderInfo provider,
- MediaRouteProviderDescriptor providerDescriptor) {
- if (provider.updateDescriptor(providerDescriptor)) {
- // Update all existing routes and reorder them to match
- // the order of their descriptors.
- int targetIndex = 0;
- boolean selectedRouteDescriptorChanged = false;
- if (providerDescriptor != null) {
- if (providerDescriptor.isValid()) {
- final List<MediaRouteDescriptor> routeDescriptors =
- providerDescriptor.getRoutes();
- final int routeCount = routeDescriptors.size();
- // Updating route group's contents requires all member routes' information.
- // Add the groups to the lists and update them later.
- List<Pair<RouteInfo, MediaRouteDescriptor>> addedGroups = new ArrayList<>();
- List<Pair<RouteInfo, MediaRouteDescriptor>> updatedGroups =
- new ArrayList<>();
- for (int i = 0; i < routeCount; i++) {
- final MediaRouteDescriptor routeDescriptor = routeDescriptors.get(i);
- final String id = routeDescriptor.getId();
- final int sourceIndex = provider.findRouteByDescriptorId(id);
- if (sourceIndex < 0) {
- // 1. Add the route to the list.
- String uniqueId = assignRouteUniqueId(provider, id);
- boolean isGroup = routeDescriptor.getGroupMemberIds() != null;
- RouteInfo route = isGroup ? new RouteGroup(provider, id, uniqueId) :
- new RouteInfo(provider, id, uniqueId);
- provider.mRoutes.add(targetIndex++, route);
- mRoutes.add(route);
- // 2. Create the route's contents.
- if (isGroup) {
- addedGroups.add(new Pair<>(route, routeDescriptor));
- } else {
- route.maybeUpdateDescriptor(routeDescriptor);
- // 3. Notify clients about addition.
- if (DEBUG) {
- Log.d(TAG, "Route added: " + route);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_ADDED, route);
- }
-
- } else if (sourceIndex < targetIndex) {
- Log.w(TAG, "Ignoring route descriptor with duplicate id: "
- + routeDescriptor);
- } else {
- // 1. Reorder the route within the list.
- RouteInfo route = provider.mRoutes.get(sourceIndex);
- Collections.swap(provider.mRoutes,
- sourceIndex, targetIndex++);
- // 2. Update the route's contents.
- if (route instanceof RouteGroup) {
- updatedGroups.add(new Pair<>(route, routeDescriptor));
- } else {
- // 3. Notify clients about changes.
- if (updateRouteDescriptorAndNotify(route, routeDescriptor)
- != 0) {
- if (route == mSelectedRoute) {
- selectedRouteDescriptorChanged = true;
- }
- }
- }
- }
- }
- // Update the new and/or existing groups.
- for (Pair<RouteInfo, MediaRouteDescriptor> pair : addedGroups) {
- RouteInfo route = pair.first;
- route.maybeUpdateDescriptor(pair.second);
- if (DEBUG) {
- Log.d(TAG, "Route added: " + route);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_ADDED, route);
- }
- for (Pair<RouteInfo, MediaRouteDescriptor> pair : updatedGroups) {
- RouteInfo route = pair.first;
- if (updateRouteDescriptorAndNotify(route, pair.second) != 0) {
- if (route == mSelectedRoute) {
- selectedRouteDescriptorChanged = true;
- }
- }
- }
- } else {
- Log.w(TAG, "Ignoring invalid provider descriptor: " + providerDescriptor);
- }
- }
-
- // Dispose all remaining routes that do not have matching descriptors.
- for (int i = provider.mRoutes.size() - 1; i >= targetIndex; i--) {
- // 1. Delete the route's contents.
- RouteInfo route = provider.mRoutes.get(i);
- route.maybeUpdateDescriptor(null);
- // 2. Remove the route from the list.
- mRoutes.remove(route);
- }
-
- // Update the selected route if needed.
- updateSelectedRouteIfNeeded(selectedRouteDescriptorChanged);
-
- // Now notify clients about routes that were removed.
- // We do this after updating the selected route to ensure
- // that the framework media router observes the new route
- // selection before the removal since removing the currently
- // selected route may have side-effects.
- for (int i = provider.mRoutes.size() - 1; i >= targetIndex; i--) {
- RouteInfo route = provider.mRoutes.remove(i);
- if (DEBUG) {
- Log.d(TAG, "Route removed: " + route);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_REMOVED, route);
- }
-
- // Notify provider changed.
- if (DEBUG) {
- Log.d(TAG, "Provider changed: " + provider);
- }
- mCallbackHandler.post(CallbackHandler.MSG_PROVIDER_CHANGED, provider);
- }
- }
-
- private int updateRouteDescriptorAndNotify(RouteInfo route,
- MediaRouteDescriptor routeDescriptor) {
- int changes = route.maybeUpdateDescriptor(routeDescriptor);
- if (changes != 0) {
- if ((changes & RouteInfo.CHANGE_GENERAL) != 0) {
- if (DEBUG) {
- Log.d(TAG, "Route changed: " + route);
- }
- mCallbackHandler.post(
- CallbackHandler.MSG_ROUTE_CHANGED, route);
- }
- if ((changes & RouteInfo.CHANGE_VOLUME) != 0) {
- if (DEBUG) {
- Log.d(TAG, "Route volume changed: " + route);
- }
- mCallbackHandler.post(
- CallbackHandler.MSG_ROUTE_VOLUME_CHANGED, route);
- }
- if ((changes & RouteInfo.CHANGE_PRESENTATION_DISPLAY) != 0) {
- if (DEBUG) {
- Log.d(TAG, "Route presentation display changed: "
- + route);
- }
- mCallbackHandler.post(CallbackHandler.
- MSG_ROUTE_PRESENTATION_DISPLAY_CHANGED, route);
- }
- }
- return changes;
- }
-
- private String assignRouteUniqueId(ProviderInfo provider, String routeDescriptorId) {
- // Although route descriptor ids are unique within a provider, it's
- // possible for there to be two providers with the same package name.
- // Therefore we must dedupe the composite id.
- String componentName = provider.getComponentName().flattenToShortString();
- String uniqueId = componentName + ":" + routeDescriptorId;
- if (findRouteByUniqueId(uniqueId) < 0) {
- mUniqueIdMap.put(new Pair<>(componentName, routeDescriptorId), uniqueId);
- return uniqueId;
- }
- Log.w(TAG, "Either " + routeDescriptorId + " isn't unique in " + componentName
- + " or we're trying to assign a unique ID for an already added route");
- for (int i = 2; ; i++) {
- String newUniqueId = String.format(Locale.US, "%s_%d", uniqueId, i);
- if (findRouteByUniqueId(newUniqueId) < 0) {
- mUniqueIdMap.put(new Pair<>(componentName, routeDescriptorId), newUniqueId);
- return newUniqueId;
- }
- }
- }
-
- private int findRouteByUniqueId(String uniqueId) {
- final int count = mRoutes.size();
- for (int i = 0; i < count; i++) {
- if (mRoutes.get(i).mUniqueId.equals(uniqueId)) {
- return i;
- }
- }
- return -1;
- }
-
- private String getUniqueId(ProviderInfo provider, String routeDescriptorId) {
- String componentName = provider.getComponentName().flattenToShortString();
- return mUniqueIdMap.get(new Pair<>(componentName, routeDescriptorId));
- }
-
- private void updateSelectedRouteIfNeeded(boolean selectedRouteDescriptorChanged) {
- // Update default route.
- if (mDefaultRoute != null && !mDefaultRoute.isSelectable()) {
- Log.i(TAG, "Clearing the default route because it "
- + "is no longer selectable: " + mDefaultRoute);
- mDefaultRoute = null;
- }
- if (mDefaultRoute == null && !mRoutes.isEmpty()) {
- for (RouteInfo route : mRoutes) {
- if (isSystemDefaultRoute(route) && route.isSelectable()) {
- mDefaultRoute = route;
- Log.i(TAG, "Found default route: " + mDefaultRoute);
- break;
- }
- }
- }
-
- // Update bluetooth route.
- if (mBluetoothRoute != null && !mBluetoothRoute.isSelectable()) {
- Log.i(TAG, "Clearing the bluetooth route because it "
- + "is no longer selectable: " + mBluetoothRoute);
- mBluetoothRoute = null;
- }
- if (mBluetoothRoute == null && !mRoutes.isEmpty()) {
- for (RouteInfo route : mRoutes) {
- if (isSystemLiveAudioOnlyRoute(route) && route.isSelectable()) {
- mBluetoothRoute = route;
- Log.i(TAG, "Found bluetooth route: " + mBluetoothRoute);
- break;
- }
- }
- }
-
- // Update selected route.
- if (mSelectedRoute == null || !mSelectedRoute.isSelectable()) {
- Log.i(TAG, "Unselecting the current route because it "
- + "is no longer selectable: " + mSelectedRoute);
- setSelectedRouteInternal(chooseFallbackRoute(),
- MediaRouter.UNSELECT_REASON_UNKNOWN);
- } else if (selectedRouteDescriptorChanged) {
- // In case the selected route is a route group, select/unselect route controllers
- // for the added/removed route members.
- if (mSelectedRoute instanceof RouteGroup) {
- List<RouteInfo> routes = ((RouteGroup) mSelectedRoute).getRoutes();
- // Build a set of descriptor IDs for the new route group.
- Set<String> idSet = new HashSet<>();
- for (RouteInfo route : routes) {
- idSet.add(route.mDescriptorId);
- }
- // Unselect route controllers for the removed routes.
- Iterator<Map.Entry<String, RouteController>> iter =
- mRouteControllerMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry<String, RouteController> entry = iter.next();
- if (!idSet.contains(entry.getKey())) {
- RouteController controller = entry.getValue();
- controller.onUnselect();
- controller.onRelease();
- iter.remove();
- }
- }
- // Select route controllers for the added routes.
- for (RouteInfo route : routes) {
- if (!mRouteControllerMap.containsKey(route.mDescriptorId)) {
- RouteController controller = route.getProviderInstance()
- .onCreateRouteController(
- route.mDescriptorId, mSelectedRoute.mDescriptorId);
- controller.onSelect();
- mRouteControllerMap.put(route.mDescriptorId, controller);
- }
- }
- }
- // Update the playback info because the properties of the route have changed.
- updatePlaybackInfoFromSelectedRoute();
- }
- }
-
- RouteInfo chooseFallbackRoute() {
- // When the current route is removed or no longer selectable,
- // we want to revert to a live audio route if there is
- // one (usually Bluetooth A2DP). Failing that, use
- // the default route.
- for (RouteInfo route : mRoutes) {
- if (route != mDefaultRoute
- && isSystemLiveAudioOnlyRoute(route)
- && route.isSelectable()) {
- return route;
- }
- }
- return mDefaultRoute;
- }
-
- private boolean isSystemLiveAudioOnlyRoute(RouteInfo route) {
- return route.getProviderInstance() == mSystemProvider
- && route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- && !route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
- }
-
- private boolean isSystemDefaultRoute(RouteInfo route) {
- return route.getProviderInstance() == mSystemProvider
- && route.mDescriptorId.equals(
- SystemMediaRouteProvider.DEFAULT_ROUTE_ID);
- }
-
- private void setSelectedRouteInternal(@NonNull RouteInfo route, int unselectReason) {
- // TODO: Remove the following logging when no longer needed.
- if (sGlobal == null || (mBluetoothRoute != null && route.isDefault())) {
- final StackTraceElement[] callStack = Thread.currentThread().getStackTrace();
- StringBuilder sb = new StringBuilder();
- // callStack[3] is the caller of this method.
- for (int i = 3; i < callStack.length; i++) {
- StackTraceElement caller = callStack[i];
- sb.append(caller.getClassName())
- .append(".")
- .append(caller.getMethodName())
- .append(":")
- .append(caller.getLineNumber())
- .append(" ");
- }
- if (sGlobal == null) {
- Log.w(TAG, "setSelectedRouteInternal is called while sGlobal is null: pkgName="
- + mApplicationContext.getPackageName() + ", callers=" + sb.toString());
- } else {
- Log.w(TAG, "Default route is selected while a BT route is available: pkgName="
- + mApplicationContext.getPackageName() + ", callers=" + sb.toString());
- }
- }
-
- if (mSelectedRoute != route) {
- if (mSelectedRoute != null) {
- if (DEBUG) {
- Log.d(TAG, "Route unselected: " + mSelectedRoute + " reason: "
- + unselectReason);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_UNSELECTED, mSelectedRoute,
- unselectReason);
- if (mSelectedRouteController != null) {
- mSelectedRouteController.onUnselect(unselectReason);
- mSelectedRouteController.onRelease();
- mSelectedRouteController = null;
- }
- if (!mRouteControllerMap.isEmpty()) {
- for (RouteController controller : mRouteControllerMap.values()) {
- controller.onUnselect(unselectReason);
- controller.onRelease();
- }
- mRouteControllerMap.clear();
- }
- }
-
- mSelectedRoute = route;
- mSelectedRouteController = route.getProviderInstance().onCreateRouteController(
- route.mDescriptorId);
- if (mSelectedRouteController != null) {
- mSelectedRouteController.onSelect();
- }
- if (DEBUG) {
- Log.d(TAG, "Route selected: " + mSelectedRoute);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_SELECTED, mSelectedRoute);
-
- if (mSelectedRoute instanceof RouteGroup) {
- List<RouteInfo> routes = ((RouteGroup) mSelectedRoute).getRoutes();
- mRouteControllerMap.clear();
- for (RouteInfo r : routes) {
- RouteController controller =
- r.getProviderInstance().onCreateRouteController(
- r.mDescriptorId, mSelectedRoute.mDescriptorId);
- controller.onSelect();
- mRouteControllerMap.put(r.mDescriptorId, controller);
- }
- }
-
- updatePlaybackInfoFromSelectedRoute();
- }
- }
-
- @Override
- public void onSystemRouteSelectedByDescriptorId(String id) {
- // System route is selected, do not sync the route we selected before.
- mCallbackHandler.removeMessages(CallbackHandler.MSG_ROUTE_SELECTED);
- int providerIndex = findProviderInfo(mSystemProvider);
- if (providerIndex >= 0) {
- ProviderInfo provider = mProviders.get(providerIndex);
- int routeIndex = provider.findRouteByDescriptorId(id);
- if (routeIndex >= 0) {
- provider.mRoutes.get(routeIndex).select();
- }
- }
- }
-
- public void addRemoteControlClient(Object rcc) {
- int index = findRemoteControlClientRecord(rcc);
- if (index < 0) {
- RemoteControlClientRecord record = new RemoteControlClientRecord(rcc);
- mRemoteControlClients.add(record);
- }
- }
-
- public void removeRemoteControlClient(Object rcc) {
- int index = findRemoteControlClientRecord(rcc);
- if (index >= 0) {
- RemoteControlClientRecord record = mRemoteControlClients.remove(index);
- record.disconnect();
- }
- }
-
- public void setMediaSession(Object session) {
- setMediaSessionRecord(session != null ? new MediaSessionRecord(session) : null);
- }
-
- public void setMediaSessionCompat(final MediaSessionCompat session) {
- mCompatSession = session;
- if (android.os.Build.VERSION.SDK_INT >= 21) {
- setMediaSessionRecord(session != null ? new MediaSessionRecord(session) : null);
- } else if (android.os.Build.VERSION.SDK_INT >= 14) {
- if (mRccMediaSession != null) {
- removeRemoteControlClient(mRccMediaSession.getRemoteControlClient());
- mRccMediaSession.removeOnActiveChangeListener(mSessionActiveListener);
- }
- mRccMediaSession = session;
- if (session != null) {
- session.addOnActiveChangeListener(mSessionActiveListener);
- if (session.isActive()) {
- addRemoteControlClient(session.getRemoteControlClient());
- }
- }
- }
- }
-
- private void setMediaSessionRecord(MediaSessionRecord mediaSessionRecord) {
- if (mMediaSession != null) {
- mMediaSession.clearVolumeHandling();
- }
- mMediaSession = mediaSessionRecord;
- if (mediaSessionRecord != null) {
- updatePlaybackInfoFromSelectedRoute();
- }
- }
-
- public MediaSessionCompat.Token getMediaSessionToken() {
- if (mMediaSession != null) {
- return mMediaSession.getToken();
- } else if (mCompatSession != null) {
- return mCompatSession.getSessionToken();
- }
- return null;
- }
-
- private int findRemoteControlClientRecord(Object rcc) {
- final int count = mRemoteControlClients.size();
- for (int i = 0; i < count; i++) {
- RemoteControlClientRecord record = mRemoteControlClients.get(i);
- if (record.getRemoteControlClient() == rcc) {
- return i;
- }
- }
- return -1;
- }
-
- private void updatePlaybackInfoFromSelectedRoute() {
- if (mSelectedRoute != null) {
- mPlaybackInfo.volume = mSelectedRoute.getVolume();
- mPlaybackInfo.volumeMax = mSelectedRoute.getVolumeMax();
- mPlaybackInfo.volumeHandling = mSelectedRoute.getVolumeHandling();
- mPlaybackInfo.playbackStream = mSelectedRoute.getPlaybackStream();
- mPlaybackInfo.playbackType = mSelectedRoute.getPlaybackType();
-
- final int count = mRemoteControlClients.size();
- for (int i = 0; i < count; i++) {
- RemoteControlClientRecord record = mRemoteControlClients.get(i);
- record.updatePlaybackInfo();
- }
- if (mMediaSession != null) {
- if (mSelectedRoute == getDefaultRoute()
- || mSelectedRoute == getBluetoothRoute()) {
- // Local route
- mMediaSession.clearVolumeHandling();
- } else {
- @VolumeProviderCompat.ControlType int controlType =
- VolumeProviderCompat.VOLUME_CONTROL_FIXED;
- if (mPlaybackInfo.volumeHandling
- == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE) {
- controlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
- }
- mMediaSession.configureVolume(controlType, mPlaybackInfo.volumeMax,
- mPlaybackInfo.volume);
- }
- }
- } else {
- if (mMediaSession != null) {
- mMediaSession.clearVolumeHandling();
- }
- }
- }
-
- private final class ProviderCallback extends MediaRouteProvider.Callback {
- ProviderCallback() {
- }
-
- @Override
- public void onDescriptorChanged(MediaRouteProvider provider,
- MediaRouteProviderDescriptor descriptor) {
- updateProviderDescriptor(provider, descriptor);
- }
- }
-
- private final class MediaSessionRecord {
- private final MediaSessionCompat mMsCompat;
-
- private @VolumeProviderCompat.ControlType int mControlType;
- private int mMaxVolume;
- private VolumeProviderCompat mVpCompat;
-
- public MediaSessionRecord(Object mediaSession) {
- mMsCompat = MediaSessionCompat.fromMediaSession(mApplicationContext, mediaSession);
- }
-
- public MediaSessionRecord(MediaSessionCompat mediaSessionCompat) {
- mMsCompat = mediaSessionCompat;
- }
-
- public void configureVolume(@VolumeProviderCompat.ControlType int controlType,
- int max, int current) {
- if (mVpCompat != null && controlType == mControlType && max == mMaxVolume) {
- // If we haven't changed control type or max just set the
- // new current volume
- mVpCompat.setCurrentVolume(current);
- } else {
- // Otherwise create a new provider and update
- mVpCompat = new VolumeProviderCompat(controlType, max, current) {
- @Override
- public void onSetVolumeTo(final int volume) {
- mCallbackHandler.post(new Runnable() {
- @Override
- public void run() {
- if (mSelectedRoute != null) {
- mSelectedRoute.requestSetVolume(volume);
- }
- }
- });
- }
-
- @Override
- public void onAdjustVolume(final int direction) {
- mCallbackHandler.post(new Runnable() {
- @Override
- public void run() {
- if (mSelectedRoute != null) {
- mSelectedRoute.requestUpdateVolume(direction);
- }
- }
- });
- }
- };
- mMsCompat.setPlaybackToRemote(mVpCompat);
- }
- }
-
- public void clearVolumeHandling() {
- mMsCompat.setPlaybackToLocal(mPlaybackInfo.playbackStream);
- mVpCompat = null;
- }
-
- public MediaSessionCompat.Token getToken() {
- return mMsCompat.getSessionToken();
- }
- }
-
- private final class RemoteControlClientRecord
- implements RemoteControlClientCompat.VolumeCallback {
- private final RemoteControlClientCompat mRccCompat;
- private boolean mDisconnected;
-
- public RemoteControlClientRecord(Object rcc) {
- mRccCompat = RemoteControlClientCompat.obtain(mApplicationContext, rcc);
- mRccCompat.setVolumeCallback(this);
- updatePlaybackInfo();
- }
-
- public Object getRemoteControlClient() {
- return mRccCompat.getRemoteControlClient();
- }
-
- public void disconnect() {
- mDisconnected = true;
- mRccCompat.setVolumeCallback(null);
- }
-
- public void updatePlaybackInfo() {
- mRccCompat.setPlaybackInfo(mPlaybackInfo);
- }
-
- @Override
- public void onVolumeSetRequest(int volume) {
- if (!mDisconnected && mSelectedRoute != null) {
- mSelectedRoute.requestSetVolume(volume);
- }
- }
-
- @Override
- public void onVolumeUpdateRequest(int direction) {
- if (!mDisconnected && mSelectedRoute != null) {
- mSelectedRoute.requestUpdateVolume(direction);
- }
- }
- }
-
- private final class CallbackHandler extends Handler {
- private final ArrayList<CallbackRecord> mTempCallbackRecords =
- new ArrayList<CallbackRecord>();
-
- private static final int MSG_TYPE_MASK = 0xff00;
- private static final int MSG_TYPE_ROUTE = 0x0100;
- private static final int MSG_TYPE_PROVIDER = 0x0200;
-
- public static final int MSG_ROUTE_ADDED = MSG_TYPE_ROUTE | 1;
- public static final int MSG_ROUTE_REMOVED = MSG_TYPE_ROUTE | 2;
- public static final int MSG_ROUTE_CHANGED = MSG_TYPE_ROUTE | 3;
- public static final int MSG_ROUTE_VOLUME_CHANGED = MSG_TYPE_ROUTE | 4;
- public static final int MSG_ROUTE_PRESENTATION_DISPLAY_CHANGED = MSG_TYPE_ROUTE | 5;
- public static final int MSG_ROUTE_SELECTED = MSG_TYPE_ROUTE | 6;
- public static final int MSG_ROUTE_UNSELECTED = MSG_TYPE_ROUTE | 7;
-
- public static final int MSG_PROVIDER_ADDED = MSG_TYPE_PROVIDER | 1;
- public static final int MSG_PROVIDER_REMOVED = MSG_TYPE_PROVIDER | 2;
- public static final int MSG_PROVIDER_CHANGED = MSG_TYPE_PROVIDER | 3;
-
- CallbackHandler() {
- }
-
- public void post(int msg, Object obj) {
- obtainMessage(msg, obj).sendToTarget();
- }
-
- public void post(int msg, Object obj, int arg) {
- Message message = obtainMessage(msg, obj);
- message.arg1 = arg;
- message.sendToTarget();
- }
-
- @Override
- public void handleMessage(Message msg) {
- final int what = msg.what;
- final Object obj = msg.obj;
- final int arg = msg.arg1;
-
- if (what == MSG_ROUTE_CHANGED
- && getSelectedRoute().getId().equals(((RouteInfo) obj).getId())) {
- updateSelectedRouteIfNeeded(true);
- }
-
- // Synchronize state with the system media router.
- syncWithSystemProvider(what, obj);
-
- // Invoke all registered callbacks.
- // Build a list of callbacks before invoking them in case callbacks
- // are added or removed during dispatch.
- try {
- for (int i = mRouters.size(); --i >= 0; ) {
- MediaRouter router = mRouters.get(i).get();
- if (router == null) {
- mRouters.remove(i);
- } else {
- mTempCallbackRecords.addAll(router.mCallbackRecords);
- }
- }
-
- final int callbackCount = mTempCallbackRecords.size();
- for (int i = 0; i < callbackCount; i++) {
- invokeCallback(mTempCallbackRecords.get(i), what, obj, arg);
- }
- } finally {
- mTempCallbackRecords.clear();
- }
- }
-
- private void syncWithSystemProvider(int what, Object obj) {
- switch (what) {
- case MSG_ROUTE_ADDED:
- mSystemProvider.onSyncRouteAdded((RouteInfo) obj);
- break;
- case MSG_ROUTE_REMOVED:
- mSystemProvider.onSyncRouteRemoved((RouteInfo) obj);
- break;
- case MSG_ROUTE_CHANGED:
- mSystemProvider.onSyncRouteChanged((RouteInfo) obj);
- break;
- case MSG_ROUTE_SELECTED:
- mSystemProvider.onSyncRouteSelected((RouteInfo) obj);
- break;
- }
- }
-
- private void invokeCallback(CallbackRecord record, int what, Object obj, int arg) {
- final MediaRouter router = record.mRouter;
- final MediaRouter.Callback callback = record.mCallback;
- switch (what & MSG_TYPE_MASK) {
- case MSG_TYPE_ROUTE: {
- final RouteInfo route = (RouteInfo)obj;
- if (!record.filterRouteEvent(route)) {
- break;
- }
- switch (what) {
- case MSG_ROUTE_ADDED:
- callback.onRouteAdded(router, route);
- break;
- case MSG_ROUTE_REMOVED:
- callback.onRouteRemoved(router, route);
- break;
- case MSG_ROUTE_CHANGED:
- callback.onRouteChanged(router, route);
- break;
- case MSG_ROUTE_VOLUME_CHANGED:
- callback.onRouteVolumeChanged(router, route);
- break;
- case MSG_ROUTE_PRESENTATION_DISPLAY_CHANGED:
- callback.onRoutePresentationDisplayChanged(router, route);
- break;
- case MSG_ROUTE_SELECTED:
- callback.onRouteSelected(router, route);
- break;
- case MSG_ROUTE_UNSELECTED:
- callback.onRouteUnselected(router, route, arg);
- break;
- }
- break;
- }
- case MSG_TYPE_PROVIDER: {
- final ProviderInfo provider = (ProviderInfo)obj;
- switch (what) {
- case MSG_PROVIDER_ADDED:
- callback.onProviderAdded(router, provider);
- break;
- case MSG_PROVIDER_REMOVED:
- callback.onProviderRemoved(router, provider);
- break;
- case MSG_PROVIDER_CHANGED:
- callback.onProviderChanged(router, provider);
- break;
- }
- }
- }
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaSessionStatus.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaSessionStatus.java
deleted file mode 100644
index 0e7514c..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaSessionStatus.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.app.PendingIntent;
-import android.os.Bundle;
-import android.os.SystemClock;
-
-import androidx.core.util.TimeUtils;
-
-/**
- * Describes the playback status of a media session.
- * <p>
- * This class is part of the remote playback protocol described by the
- * {@link MediaControlIntent MediaControlIntent} class.
- * </p><p>
- * When a media session is created, it is initially in the
- * {@link #SESSION_STATE_ACTIVE active} state. When the media session ends
- * normally, it transitions to the {@link #SESSION_STATE_ENDED ended} state.
- * If the media session is invalidated due to another session forcibly taking
- * control of the route, then it transitions to the
- * {@link #SESSION_STATE_INVALIDATED invalidated} state.
- * Refer to the documentation of each state for an explanation of its meaning.
- * </p><p>
- * To monitor session status, the application should supply a {@link PendingIntent} to use as the
- * {@link MediaControlIntent#EXTRA_SESSION_STATUS_UPDATE_RECEIVER session status update receiver}
- * for a given {@link MediaControlIntent#ACTION_START_SESSION session start request}.
- * </p><p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- */
-public final class MediaSessionStatus {
- static final String KEY_TIMESTAMP = "timestamp";
- static final String KEY_SESSION_STATE = "sessionState";
- static final String KEY_QUEUE_PAUSED = "queuePaused";
- static final String KEY_EXTRAS = "extras";
-
- final Bundle mBundle;
-
- /**
- * Session state: Active.
- * <p>
- * Indicates that the media session is active and in control of the route.
- * </p>
- */
- public static final int SESSION_STATE_ACTIVE = 0;
-
- /**
- * Session state: Ended.
- * <p>
- * Indicates that the media session was ended normally using the
- * {@link MediaControlIntent#ACTION_END_SESSION end session} action.
- * </p><p>
- * A terminated media session cannot be used anymore. To play more media, the
- * application must start a new session.
- * </p>
- */
- public static final int SESSION_STATE_ENDED = 1;
-
- /**
- * Session state: Invalidated.
- * <p>
- * Indicates that the media session was invalidated involuntarily due to
- * another session taking control of the route.
- * </p><p>
- * An invalidated media session cannot be used anymore. To play more media, the
- * application must start a new session.
- * </p>
- */
- public static final int SESSION_STATE_INVALIDATED = 2;
-
- MediaSessionStatus(Bundle bundle) {
- mBundle = bundle;
- }
-
- /**
- * Gets the timestamp associated with the status information in
- * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
- *
- * @return The status timestamp in the {@link SystemClock#elapsedRealtime()} time base.
- */
- public long getTimestamp() {
- return mBundle.getLong(KEY_TIMESTAMP);
- }
-
- /**
- * Gets the session state.
- *
- * @return The session state. One of {@link #SESSION_STATE_ACTIVE},
- * {@link #SESSION_STATE_ENDED}, or {@link #SESSION_STATE_INVALIDATED}.
- */
- public int getSessionState() {
- return mBundle.getInt(KEY_SESSION_STATE, SESSION_STATE_INVALIDATED);
- }
-
- /**
- * Returns true if the session's queue is paused.
- *
- * @return True if the session's queue is paused.
- */
- public boolean isQueuePaused() {
- return mBundle.getBoolean(KEY_QUEUE_PAUSED);
- }
-
- /**
- * Gets a bundle of extras for this status object.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Bundle getExtras() {
- return mBundle.getBundle(KEY_EXTRAS);
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaSessionStatus{ ");
- result.append("timestamp=");
- TimeUtils.formatDuration(SystemClock.elapsedRealtime() - getTimestamp(), result);
- result.append(" ms ago");
- result.append(", sessionState=").append(sessionStateToString(getSessionState()));
- result.append(", queuePaused=").append(isQueuePaused());
- result.append(", extras=").append(getExtras());
- result.append(" }");
- return result.toString();
- }
-
- private static String sessionStateToString(int sessionState) {
- switch (sessionState) {
- case SESSION_STATE_ACTIVE:
- return "active";
- case SESSION_STATE_ENDED:
- return "ended";
- case SESSION_STATE_INVALIDATED:
- return "invalidated";
- }
- return Integer.toString(sessionState);
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaSessionStatus fromBundle(Bundle bundle) {
- return bundle != null ? new MediaSessionStatus(bundle) : null;
- }
-
- /**
- * Builder for {@link MediaSessionStatus media session status objects}.
- */
- public static final class Builder {
- private final Bundle mBundle;
-
- /**
- * Creates a media session status builder using the current time as the
- * reference timestamp.
- *
- * @param sessionState The session state.
- */
- public Builder(int sessionState) {
- mBundle = new Bundle();
- setTimestamp(SystemClock.elapsedRealtime());
- setSessionState(sessionState);
- }
-
- /**
- * Creates a media session status builder whose initial contents are
- * copied from an existing status.
- */
- public Builder(MediaSessionStatus status) {
- if (status == null) {
- throw new IllegalArgumentException("status must not be null");
- }
-
- mBundle = new Bundle(status.mBundle);
- }
-
- /**
- * Sets the timestamp associated with the status information in
- * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
- */
- public Builder setTimestamp(long elapsedRealtimeTimestamp) {
- mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp);
- return this;
- }
-
- /**
- * Sets the session state.
- */
- public Builder setSessionState(int sessionState) {
- mBundle.putInt(KEY_SESSION_STATE, sessionState);
- return this;
- }
-
- /**
- * Sets whether the queue is paused.
- */
- public Builder setQueuePaused(boolean queuePaused) {
- mBundle.putBoolean(KEY_QUEUE_PAUSED, queuePaused);
- return this;
- }
-
- /**
- * Sets a bundle of extras for this status object.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Builder setExtras(Bundle extras) {
- mBundle.putBundle(KEY_EXTRAS, extras);
- return this;
- }
-
- /**
- * Builds the {@link MediaSessionStatus media session status object}.
- */
- public MediaSessionStatus build() {
- return new MediaSessionStatus(mBundle);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProvider.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProvider.java
deleted file mode 100644
index eacf1c8..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProvider.java
+++ /dev/null
@@ -1,746 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_DATA_ROUTE_ID;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_DATA_ROUTE_LIBRARY_GROUP;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_DATA_UNSELECT_REASON;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_DATA_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_CREATE_ROUTE_CONTROLLER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_MSG_REGISTER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_RELEASE_ROUTE_CONTROLLER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_ROUTE_CONTROL_REQUEST;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SELECT_ROUTE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SET_DISCOVERY_REQUEST;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SET_ROUTE_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UNREGISTER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UNSELECT_ROUTE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UPDATE_ROUTE_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_VERSION_CURRENT;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.SERVICE_DATA_ERROR;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_CONTROL_REQUEST_FAILED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_DESCRIPTOR_CHANGED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_GENERIC_FAILURE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_GENERIC_SUCCESS;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_REGISTERED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.SERVICE_VERSION_1;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .isValidRemoteMessenger;
-
-import android.annotation.NonNull;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.DeadObjectException;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.IBinder.DeathRecipient;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.SparseArray;
-
-import com.android.support.mediarouter.media.MediaRouter.ControlRequestCallback;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Maintains a connection to a particular media route provider service.
- */
-final class RegisteredMediaRouteProvider extends MediaRouteProvider
- implements ServiceConnection {
- static final String TAG = "MediaRouteProviderProxy"; // max. 23 chars
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private final ComponentName mComponentName;
- final PrivateHandler mPrivateHandler;
- private final ArrayList<Controller> mControllers = new ArrayList<Controller>();
-
- private boolean mStarted;
- private boolean mBound;
- private Connection mActiveConnection;
- private boolean mConnectionReady;
-
- public RegisteredMediaRouteProvider(Context context, ComponentName componentName) {
- super(context, new ProviderMetadata(componentName));
-
- mComponentName = componentName;
- mPrivateHandler = new PrivateHandler();
- }
-
- @Override
- public RouteController onCreateRouteController(@NonNull String routeId) {
- if (routeId == null) {
- throw new IllegalArgumentException("routeId cannot be null");
- }
- return createRouteController(routeId, null);
- }
-
- @Override
- public RouteController onCreateRouteController(
- @NonNull String routeId, @NonNull String routeGroupId) {
- if (routeId == null) {
- throw new IllegalArgumentException("routeId cannot be null");
- }
- if (routeGroupId == null) {
- throw new IllegalArgumentException("routeGroupId cannot be null");
- }
- return createRouteController(routeId, routeGroupId);
- }
-
- @Override
- public void onDiscoveryRequestChanged(MediaRouteDiscoveryRequest request) {
- if (mConnectionReady) {
- mActiveConnection.setDiscoveryRequest(request);
- }
- updateBinding();
- }
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- if (DEBUG) {
- Log.d(TAG, this + ": Connected");
- }
-
- if (mBound) {
- disconnect();
-
- Messenger messenger = (service != null ? new Messenger(service) : null);
- if (isValidRemoteMessenger(messenger)) {
- Connection connection = new Connection(messenger);
- if (connection.register()) {
- mActiveConnection = connection;
- } else {
- if (DEBUG) {
- Log.d(TAG, this + ": Registration failed");
- }
- }
- } else {
- Log.e(TAG, this + ": Service returned invalid messenger binder");
- }
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- if (DEBUG) {
- Log.d(TAG, this + ": Service disconnected");
- }
- disconnect();
- }
-
- @Override
- public String toString() {
- return "Service connection " + mComponentName.flattenToShortString();
- }
-
- public boolean hasComponentName(String packageName, String className) {
- return mComponentName.getPackageName().equals(packageName)
- && mComponentName.getClassName().equals(className);
- }
-
- public void start() {
- if (!mStarted) {
- if (DEBUG) {
- Log.d(TAG, this + ": Starting");
- }
-
- mStarted = true;
- updateBinding();
- }
- }
-
- public void stop() {
- if (mStarted) {
- if (DEBUG) {
- Log.d(TAG, this + ": Stopping");
- }
-
- mStarted = false;
- updateBinding();
- }
- }
-
- public void rebindIfDisconnected() {
- if (mActiveConnection == null && shouldBind()) {
- unbind();
- bind();
- }
- }
-
- private void updateBinding() {
- if (shouldBind()) {
- bind();
- } else {
- unbind();
- }
- }
-
- private boolean shouldBind() {
- if (mStarted) {
- // Bind whenever there is a discovery request.
- if (getDiscoveryRequest() != null) {
- return true;
- }
-
- // Bind whenever the application has an active route controller.
- // This means that one of this provider's routes is selected.
- if (!mControllers.isEmpty()) {
- return true;
- }
- }
- return false;
- }
-
- private void bind() {
- if (!mBound) {
- if (DEBUG) {
- Log.d(TAG, this + ": Binding");
- }
-
- Intent service = new Intent(MediaRouteProviderProtocol.SERVICE_INTERFACE);
- service.setComponent(mComponentName);
- try {
- mBound = getContext().bindService(service, this, Context.BIND_AUTO_CREATE);
- if (!mBound && DEBUG) {
- Log.d(TAG, this + ": Bind failed");
- }
- } catch (SecurityException ex) {
- if (DEBUG) {
- Log.d(TAG, this + ": Bind failed", ex);
- }
- }
- }
- }
-
- private void unbind() {
- if (mBound) {
- if (DEBUG) {
- Log.d(TAG, this + ": Unbinding");
- }
-
- mBound = false;
- disconnect();
- getContext().unbindService(this);
- }
- }
-
- private RouteController createRouteController(String routeId, String routeGroupId) {
- MediaRouteProviderDescriptor descriptor = getDescriptor();
- if (descriptor != null) {
- List<MediaRouteDescriptor> routes = descriptor.getRoutes();
- final int count = routes.size();
- for (int i = 0; i < count; i++) {
- final MediaRouteDescriptor route = routes.get(i);
- if (route.getId().equals(routeId)) {
- Controller controller = new Controller(routeId, routeGroupId);
- mControllers.add(controller);
- if (mConnectionReady) {
- controller.attachConnection(mActiveConnection);
- }
- updateBinding();
- return controller;
- }
- }
- }
- return null;
- }
-
- void onConnectionReady(Connection connection) {
- if (mActiveConnection == connection) {
- mConnectionReady = true;
- attachControllersToConnection();
-
- MediaRouteDiscoveryRequest request = getDiscoveryRequest();
- if (request != null) {
- mActiveConnection.setDiscoveryRequest(request);
- }
- }
- }
-
- void onConnectionDied(Connection connection) {
- if (mActiveConnection == connection) {
- if (DEBUG) {
- Log.d(TAG, this + ": Service connection died");
- }
- disconnect();
- }
- }
-
- void onConnectionError(Connection connection, String error) {
- if (mActiveConnection == connection) {
- if (DEBUG) {
- Log.d(TAG, this + ": Service connection error - " + error);
- }
- unbind();
- }
- }
-
- void onConnectionDescriptorChanged(Connection connection,
- MediaRouteProviderDescriptor descriptor) {
- if (mActiveConnection == connection) {
- if (DEBUG) {
- Log.d(TAG, this + ": Descriptor changed, descriptor=" + descriptor);
- }
- setDescriptor(descriptor);
- }
- }
-
- private void disconnect() {
- if (mActiveConnection != null) {
- setDescriptor(null);
- mConnectionReady = false;
- detachControllersFromConnection();
- mActiveConnection.dispose();
- mActiveConnection = null;
- }
- }
-
- void onControllerReleased(Controller controller) {
- mControllers.remove(controller);
- controller.detachConnection();
- updateBinding();
- }
-
- private void attachControllersToConnection() {
- int count = mControllers.size();
- for (int i = 0; i < count; i++) {
- mControllers.get(i).attachConnection(mActiveConnection);
- }
- }
-
- private void detachControllersFromConnection() {
- int count = mControllers.size();
- for (int i = 0; i < count; i++) {
- mControllers.get(i).detachConnection();
- }
- }
-
- private final class Controller extends RouteController {
- private final String mRouteId;
- private final String mRouteGroupId;
-
- private boolean mSelected;
- private int mPendingSetVolume = -1;
- private int mPendingUpdateVolumeDelta;
-
- private Connection mConnection;
- private int mControllerId;
-
- public Controller(String routeId, String routeGroupId) {
- mRouteId = routeId;
- mRouteGroupId = routeGroupId;
- }
-
- public void attachConnection(Connection connection) {
- mConnection = connection;
- mControllerId = connection.createRouteController(mRouteId, mRouteGroupId);
- if (mSelected) {
- connection.selectRoute(mControllerId);
- if (mPendingSetVolume >= 0) {
- connection.setVolume(mControllerId, mPendingSetVolume);
- mPendingSetVolume = -1;
- }
- if (mPendingUpdateVolumeDelta != 0) {
- connection.updateVolume(mControllerId, mPendingUpdateVolumeDelta);
- mPendingUpdateVolumeDelta = 0;
- }
- }
- }
-
- public void detachConnection() {
- if (mConnection != null) {
- mConnection.releaseRouteController(mControllerId);
- mConnection = null;
- mControllerId = 0;
- }
- }
-
- @Override
- public void onRelease() {
- onControllerReleased(this);
- }
-
- @Override
- public void onSelect() {
- mSelected = true;
- if (mConnection != null) {
- mConnection.selectRoute(mControllerId);
- }
- }
-
- @Override
- public void onUnselect() {
- onUnselect(MediaRouter.UNSELECT_REASON_UNKNOWN);
- }
-
- @Override
- public void onUnselect(int reason) {
- mSelected = false;
- if (mConnection != null) {
- mConnection.unselectRoute(mControllerId, reason);
- }
- }
-
- @Override
- public void onSetVolume(int volume) {
- if (mConnection != null) {
- mConnection.setVolume(mControllerId, volume);
- } else {
- mPendingSetVolume = volume;
- mPendingUpdateVolumeDelta = 0;
- }
- }
-
- @Override
- public void onUpdateVolume(int delta) {
- if (mConnection != null) {
- mConnection.updateVolume(mControllerId, delta);
- } else {
- mPendingUpdateVolumeDelta += delta;
- }
- }
-
- @Override
- public boolean onControlRequest(Intent intent, ControlRequestCallback callback) {
- if (mConnection != null) {
- return mConnection.sendControlRequest(mControllerId, intent, callback);
- }
- return false;
- }
- }
-
- private final class Connection implements DeathRecipient {
- private final Messenger mServiceMessenger;
- private final ReceiveHandler mReceiveHandler;
- private final Messenger mReceiveMessenger;
-
- private int mNextRequestId = 1;
- private int mNextControllerId = 1;
- private int mServiceVersion; // non-zero when registration complete
-
- private int mPendingRegisterRequestId;
- private final SparseArray<ControlRequestCallback> mPendingCallbacks =
- new SparseArray<ControlRequestCallback>();
-
- public Connection(Messenger serviceMessenger) {
- mServiceMessenger = serviceMessenger;
- mReceiveHandler = new ReceiveHandler(this);
- mReceiveMessenger = new Messenger(mReceiveHandler);
- }
-
- public boolean register() {
- mPendingRegisterRequestId = mNextRequestId++;
- if (!sendRequest(CLIENT_MSG_REGISTER,
- mPendingRegisterRequestId,
- CLIENT_VERSION_CURRENT, null, null)) {
- return false;
- }
-
- try {
- mServiceMessenger.getBinder().linkToDeath(this, 0);
- return true;
- } catch (RemoteException ex) {
- binderDied();
- }
- return false;
- }
-
- public void dispose() {
- sendRequest(CLIENT_MSG_UNREGISTER, 0, 0, null, null);
- mReceiveHandler.dispose();
- mServiceMessenger.getBinder().unlinkToDeath(this, 0);
-
- mPrivateHandler.post(new Runnable() {
- @Override
- public void run() {
- failPendingCallbacks();
- }
- });
- }
-
- void failPendingCallbacks() {
- int count = 0;
- for (int i = 0; i < mPendingCallbacks.size(); i++) {
- mPendingCallbacks.valueAt(i).onError(null, null);
- }
- mPendingCallbacks.clear();
- }
-
- public boolean onGenericFailure(int requestId) {
- if (requestId == mPendingRegisterRequestId) {
- mPendingRegisterRequestId = 0;
- onConnectionError(this, "Registration failed");
- }
- ControlRequestCallback callback = mPendingCallbacks.get(requestId);
- if (callback != null) {
- mPendingCallbacks.remove(requestId);
- callback.onError(null, null);
- }
- return true;
- }
-
- public boolean onGenericSuccess(int requestId) {
- return true;
- }
-
- public boolean onRegistered(int requestId, int serviceVersion,
- Bundle descriptorBundle) {
- if (mServiceVersion == 0
- && requestId == mPendingRegisterRequestId
- && serviceVersion >= SERVICE_VERSION_1) {
- mPendingRegisterRequestId = 0;
- mServiceVersion = serviceVersion;
- onConnectionDescriptorChanged(this,
- MediaRouteProviderDescriptor.fromBundle(descriptorBundle));
- onConnectionReady(this);
- return true;
- }
- return false;
- }
-
- public boolean onDescriptorChanged(Bundle descriptorBundle) {
- if (mServiceVersion != 0) {
- onConnectionDescriptorChanged(this,
- MediaRouteProviderDescriptor.fromBundle(descriptorBundle));
- return true;
- }
- return false;
- }
-
- public boolean onControlRequestSucceeded(int requestId, Bundle data) {
- ControlRequestCallback callback = mPendingCallbacks.get(requestId);
- if (callback != null) {
- mPendingCallbacks.remove(requestId);
- callback.onResult(data);
- return true;
- }
- return false;
- }
-
- public boolean onControlRequestFailed(int requestId, String error, Bundle data) {
- ControlRequestCallback callback = mPendingCallbacks.get(requestId);
- if (callback != null) {
- mPendingCallbacks.remove(requestId);
- callback.onError(error, data);
- return true;
- }
- return false;
- }
-
- @Override
- public void binderDied() {
- mPrivateHandler.post(new Runnable() {
- @Override
- public void run() {
- onConnectionDied(Connection.this);
- }
- });
- }
-
- public int createRouteController(String routeId, String routeGroupId) {
- int controllerId = mNextControllerId++;
- Bundle data = new Bundle();
- data.putString(CLIENT_DATA_ROUTE_ID, routeId);
- data.putString(CLIENT_DATA_ROUTE_LIBRARY_GROUP, routeGroupId);
- sendRequest(CLIENT_MSG_CREATE_ROUTE_CONTROLLER,
- mNextRequestId++, controllerId, null, data);
- return controllerId;
- }
-
- public void releaseRouteController(int controllerId) {
- sendRequest(CLIENT_MSG_RELEASE_ROUTE_CONTROLLER,
- mNextRequestId++, controllerId, null, null);
- }
-
- public void selectRoute(int controllerId) {
- sendRequest(CLIENT_MSG_SELECT_ROUTE,
- mNextRequestId++, controllerId, null, null);
- }
-
- public void unselectRoute(int controllerId, int reason) {
- Bundle extras = new Bundle();
- extras.putInt(CLIENT_DATA_UNSELECT_REASON, reason);
- sendRequest(CLIENT_MSG_UNSELECT_ROUTE,
- mNextRequestId++, controllerId, null, extras);
- }
-
- public void setVolume(int controllerId, int volume) {
- Bundle data = new Bundle();
- data.putInt(CLIENT_DATA_VOLUME, volume);
- sendRequest(CLIENT_MSG_SET_ROUTE_VOLUME,
- mNextRequestId++, controllerId, null, data);
- }
-
- public void updateVolume(int controllerId, int delta) {
- Bundle data = new Bundle();
- data.putInt(CLIENT_DATA_VOLUME, delta);
- sendRequest(CLIENT_MSG_UPDATE_ROUTE_VOLUME,
- mNextRequestId++, controllerId, null, data);
- }
-
- public boolean sendControlRequest(int controllerId, Intent intent,
- ControlRequestCallback callback) {
- int requestId = mNextRequestId++;
- if (sendRequest(CLIENT_MSG_ROUTE_CONTROL_REQUEST,
- requestId, controllerId, intent, null)) {
- if (callback != null) {
- mPendingCallbacks.put(requestId, callback);
- }
- return true;
- }
- return false;
- }
-
- public void setDiscoveryRequest(MediaRouteDiscoveryRequest request) {
- sendRequest(CLIENT_MSG_SET_DISCOVERY_REQUEST,
- mNextRequestId++, 0, request != null ? request.asBundle() : null, null);
- }
-
- private boolean sendRequest(int what, int requestId, int arg, Object obj, Bundle data) {
- Message msg = Message.obtain();
- msg.what = what;
- msg.arg1 = requestId;
- msg.arg2 = arg;
- msg.obj = obj;
- msg.setData(data);
- msg.replyTo = mReceiveMessenger;
- try {
- mServiceMessenger.send(msg);
- return true;
- } catch (DeadObjectException ex) {
- // The service died.
- } catch (RemoteException ex) {
- if (what != CLIENT_MSG_UNREGISTER) {
- Log.e(TAG, "Could not send message to service.", ex);
- }
- }
- return false;
- }
- }
-
- private static final class PrivateHandler extends Handler {
- PrivateHandler() {
- }
- }
-
- /**
- * Handler that receives messages from the server.
- * <p>
- * This inner class is static and only retains a weak reference to the connection
- * to prevent the client from being leaked in case the service is holding an
- * active reference to the client's messenger.
- * </p><p>
- * This handler should not be used to handle any messages other than those
- * that come from the service.
- * </p>
- */
- private static final class ReceiveHandler extends Handler {
- private final WeakReference<Connection> mConnectionRef;
-
- public ReceiveHandler(Connection connection) {
- mConnectionRef = new WeakReference<Connection>(connection);
- }
-
- public void dispose() {
- mConnectionRef.clear();
- }
-
- @Override
- public void handleMessage(Message msg) {
- Connection connection = mConnectionRef.get();
- if (connection != null) {
- final int what = msg.what;
- final int requestId = msg.arg1;
- final int arg = msg.arg2;
- final Object obj = msg.obj;
- final Bundle data = msg.peekData();
- if (!processMessage(connection, what, requestId, arg, obj, data)) {
- if (DEBUG) {
- Log.d(TAG, "Unhandled message from server: " + msg);
- }
- }
- }
- }
-
- private boolean processMessage(Connection connection,
- int what, int requestId, int arg, Object obj, Bundle data) {
- switch (what) {
- case SERVICE_MSG_GENERIC_FAILURE:
- connection.onGenericFailure(requestId);
- return true;
-
- case SERVICE_MSG_GENERIC_SUCCESS:
- connection.onGenericSuccess(requestId);
- return true;
-
- case SERVICE_MSG_REGISTERED:
- if (obj == null || obj instanceof Bundle) {
- return connection.onRegistered(requestId, arg, (Bundle)obj);
- }
- break;
-
- case SERVICE_MSG_DESCRIPTOR_CHANGED:
- if (obj == null || obj instanceof Bundle) {
- return connection.onDescriptorChanged((Bundle)obj);
- }
- break;
-
- case SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED:
- if (obj == null || obj instanceof Bundle) {
- return connection.onControlRequestSucceeded(
- requestId, (Bundle)obj);
- }
- break;
-
- case SERVICE_MSG_CONTROL_REQUEST_FAILED:
- if (obj == null || obj instanceof Bundle) {
- String error = (data == null ? null :
- data.getString(SERVICE_DATA_ERROR));
- return connection.onControlRequestFailed(
- requestId, error, (Bundle)obj);
- }
- break;
- }
- return false;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProviderWatcher.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
deleted file mode 100644
index ba1f647..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.os.Handler;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-/**
- * Watches for media route provider services to be installed.
- * Adds a provider to the media router for each registered service.
- *
- * @see RegisteredMediaRouteProvider
- */
-final class RegisteredMediaRouteProviderWatcher {
- private final Context mContext;
- private final Callback mCallback;
- private final Handler mHandler;
- private final PackageManager mPackageManager;
-
- private final ArrayList<RegisteredMediaRouteProvider> mProviders =
- new ArrayList<RegisteredMediaRouteProvider>();
- private boolean mRunning;
-
- public RegisteredMediaRouteProviderWatcher(Context context, Callback callback) {
- mContext = context;
- mCallback = callback;
- mHandler = new Handler();
- mPackageManager = context.getPackageManager();
- }
-
- public void start() {
- if (!mRunning) {
- mRunning = true;
-
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_PACKAGE_ADDED);
- filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
- filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
- filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
- filter.addAction(Intent.ACTION_PACKAGE_RESTARTED);
- filter.addDataScheme("package");
- mContext.registerReceiver(mScanPackagesReceiver, filter, null, mHandler);
-
- // Scan packages.
- // Also has the side-effect of restarting providers if needed.
- mHandler.post(mScanPackagesRunnable);
- }
- }
-
- public void stop() {
- if (mRunning) {
- mRunning = false;
-
- mContext.unregisterReceiver(mScanPackagesReceiver);
- mHandler.removeCallbacks(mScanPackagesRunnable);
-
- // Stop all providers.
- for (int i = mProviders.size() - 1; i >= 0; i--) {
- mProviders.get(i).stop();
- }
- }
- }
-
- void scanPackages() {
- if (!mRunning) {
- return;
- }
-
- // Add providers for all new services.
- // Reorder the list so that providers left at the end will be the ones to remove.
- int targetIndex = 0;
- Intent intent = new Intent(MediaRouteProviderService.SERVICE_INTERFACE);
- for (ResolveInfo resolveInfo : mPackageManager.queryIntentServices(intent, 0)) {
- ServiceInfo serviceInfo = resolveInfo.serviceInfo;
- if (serviceInfo != null) {
- int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name);
- if (sourceIndex < 0) {
- RegisteredMediaRouteProvider provider =
- new RegisteredMediaRouteProvider(mContext,
- new ComponentName(serviceInfo.packageName, serviceInfo.name));
- provider.start();
- mProviders.add(targetIndex++, provider);
- mCallback.addProvider(provider);
- } else if (sourceIndex >= targetIndex) {
- RegisteredMediaRouteProvider provider = mProviders.get(sourceIndex);
- provider.start(); // restart the provider if needed
- provider.rebindIfDisconnected();
- Collections.swap(mProviders, sourceIndex, targetIndex++);
- }
- }
- }
-
- // Remove providers for missing services.
- if (targetIndex < mProviders.size()) {
- for (int i = mProviders.size() - 1; i >= targetIndex; i--) {
- RegisteredMediaRouteProvider provider = mProviders.get(i);
- mCallback.removeProvider(provider);
- mProviders.remove(provider);
- provider.stop();
- }
- }
- }
-
- private int findProvider(String packageName, String className) {
- int count = mProviders.size();
- for (int i = 0; i < count; i++) {
- RegisteredMediaRouteProvider provider = mProviders.get(i);
- if (provider.hasComponentName(packageName, className)) {
- return i;
- }
- }
- return -1;
- }
-
- private final BroadcastReceiver mScanPackagesReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- scanPackages();
- }
- };
-
- private final Runnable mScanPackagesRunnable = new Runnable() {
- @Override
- public void run() {
- scanPackages();
- }
- };
-
- public interface Callback {
- void addProvider(MediaRouteProvider provider);
- void removeProvider(MediaRouteProvider provider);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/RemoteControlClientCompat.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/RemoteControlClientCompat.java
deleted file mode 100644
index 65c5518..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/RemoteControlClientCompat.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.os.Build;
-
-import java.lang.ref.WeakReference;
-
-/**
- * Provides access to features of the remote control client.
- *
- * Hidden for now but we might want to make this available to applications
- * in the future.
- */
-abstract class RemoteControlClientCompat {
- protected final Context mContext;
- protected final Object mRcc;
- protected VolumeCallback mVolumeCallback;
-
- protected RemoteControlClientCompat(Context context, Object rcc) {
- mContext = context;
- mRcc = rcc;
- }
-
- public static RemoteControlClientCompat obtain(Context context, Object rcc) {
- if (Build.VERSION.SDK_INT >= 16) {
- return new JellybeanImpl(context, rcc);
- }
- return new LegacyImpl(context, rcc);
- }
-
- public Object getRemoteControlClient() {
- return mRcc;
- }
-
- /**
- * Sets the current playback information.
- * Must be called at least once to attach to the remote control client.
- *
- * @param info The playback information. Must not be null.
- */
- public void setPlaybackInfo(PlaybackInfo info) {
- }
-
- /**
- * Sets a callback to receive volume change requests from the remote control client.
- *
- * @param callback The volume callback to use or null if none.
- */
- public void setVolumeCallback(VolumeCallback callback) {
- mVolumeCallback = callback;
- }
-
- /**
- * Specifies information about the playback.
- */
- public static final class PlaybackInfo {
- public int volume;
- public int volumeMax;
- public int volumeHandling = MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED;
- public int playbackStream = AudioManager.STREAM_MUSIC;
- public int playbackType = MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE;
- }
-
- /**
- * Called when volume updates are requested by the remote control client.
- */
- public interface VolumeCallback {
- /**
- * Called when the volume should be increased or decreased.
- *
- * @param direction An integer indicating whether the volume is to be increased
- * (positive value) or decreased (negative value).
- * For bundled changes, the absolute value indicates the number of changes
- * in the same direction, e.g. +3 corresponds to three "volume up" changes.
- */
- public void onVolumeUpdateRequest(int direction);
-
- /**
- * Called when the volume for the route should be set to the given value.
- *
- * @param volume An integer indicating the new volume value that should be used,
- * always between 0 and the value set by {@link PlaybackInfo#volumeMax}.
- */
- public void onVolumeSetRequest(int volume);
- }
-
- /**
- * Legacy implementation for platform versions prior to Jellybean.
- * Does nothing.
- */
- static class LegacyImpl extends RemoteControlClientCompat {
- public LegacyImpl(Context context, Object rcc) {
- super(context, rcc);
- }
- }
-
- /**
- * Implementation for Jellybean.
- *
- * The basic idea of this implementation is to attach the RCC to a UserRouteInfo
- * in order to hook up stream metadata and volume callbacks because there is no
- * other API available to do so in this platform version. The UserRouteInfo itself
- * is not attached to the MediaRouter so it is transparent to the user.
- */
- // @@RequiresApi(16)
- static class JellybeanImpl extends RemoteControlClientCompat {
- private final Object mRouterObj;
- private final Object mUserRouteCategoryObj;
- private final Object mUserRouteObj;
- private boolean mRegistered;
-
- public JellybeanImpl(Context context, Object rcc) {
- super(context, rcc);
-
- mRouterObj = MediaRouterJellybean.getMediaRouter(context);
- mUserRouteCategoryObj = MediaRouterJellybean.createRouteCategory(
- mRouterObj, "", false);
- mUserRouteObj = MediaRouterJellybean.createUserRoute(
- mRouterObj, mUserRouteCategoryObj);
- }
-
- @Override
- public void setPlaybackInfo(PlaybackInfo info) {
- MediaRouterJellybean.UserRouteInfo.setVolume(
- mUserRouteObj, info.volume);
- MediaRouterJellybean.UserRouteInfo.setVolumeMax(
- mUserRouteObj, info.volumeMax);
- MediaRouterJellybean.UserRouteInfo.setVolumeHandling(
- mUserRouteObj, info.volumeHandling);
- MediaRouterJellybean.UserRouteInfo.setPlaybackStream(
- mUserRouteObj, info.playbackStream);
- MediaRouterJellybean.UserRouteInfo.setPlaybackType(
- mUserRouteObj, info.playbackType);
-
- if (!mRegistered) {
- mRegistered = true;
- MediaRouterJellybean.UserRouteInfo.setVolumeCallback(mUserRouteObj,
- MediaRouterJellybean.createVolumeCallback(
- new VolumeCallbackWrapper(this)));
- MediaRouterJellybean.UserRouteInfo.setRemoteControlClient(mUserRouteObj, mRcc);
- }
- }
-
- private static final class VolumeCallbackWrapper
- implements MediaRouterJellybean.VolumeCallback {
- // Unfortunately, the framework never unregisters its volume observer from
- // the audio service so the UserRouteInfo object may leak along with
- // any callbacks that we attach to it. Use a weak reference to prevent
- // the volume callback from holding strong references to anything important.
- private final WeakReference<JellybeanImpl> mImplWeak;
-
- public VolumeCallbackWrapper(JellybeanImpl impl) {
- mImplWeak = new WeakReference<JellybeanImpl>(impl);
- }
-
- @Override
- public void onVolumeUpdateRequest(Object routeObj, int direction) {
- JellybeanImpl impl = mImplWeak.get();
- if (impl != null && impl.mVolumeCallback != null) {
- impl.mVolumeCallback.onVolumeUpdateRequest(direction);
- }
- }
-
- @Override
- public void onVolumeSetRequest(Object routeObj, int volume) {
- JellybeanImpl impl = mImplWeak.get();
- if (impl != null && impl.mVolumeCallback != null) {
- impl.mVolumeCallback.onVolumeSetRequest(volume);
- }
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/RemotePlaybackClient.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/RemotePlaybackClient.java
deleted file mode 100644
index e76564e..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/RemotePlaybackClient.java
+++ /dev/null
@@ -1,1045 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-
-import androidx.core.util.ObjectsCompat;
-
-/**
- * A helper class for playing media on remote routes using the remote playback protocol
- * defined by {@link MediaControlIntent}.
- * <p>
- * The client maintains session state and offers a simplified interface for issuing
- * remote playback media control intents to a single route.
- * </p>
- */
-public class RemotePlaybackClient {
- static final String TAG = "RemotePlaybackClient";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private final Context mContext;
- private final MediaRouter.RouteInfo mRoute;
- private final ActionReceiver mActionReceiver;
- private final PendingIntent mItemStatusPendingIntent;
- private final PendingIntent mSessionStatusPendingIntent;
- private final PendingIntent mMessagePendingIntent;
-
- private boolean mRouteSupportsRemotePlayback;
- private boolean mRouteSupportsQueuing;
- private boolean mRouteSupportsSessionManagement;
- private boolean mRouteSupportsMessaging;
-
- String mSessionId;
- StatusCallback mStatusCallback;
- OnMessageReceivedListener mOnMessageReceivedListener;
-
- /**
- * Creates a remote playback client for a route.
- *
- * @param route The media route.
- */
- public RemotePlaybackClient(Context context, MediaRouter.RouteInfo route) {
- if (context == null) {
- throw new IllegalArgumentException("context must not be null");
- }
- if (route == null) {
- throw new IllegalArgumentException("route must not be null");
- }
-
- mContext = context;
- mRoute = route;
-
- IntentFilter actionFilter = new IntentFilter();
- actionFilter.addAction(ActionReceiver.ACTION_ITEM_STATUS_CHANGED);
- actionFilter.addAction(ActionReceiver.ACTION_SESSION_STATUS_CHANGED);
- actionFilter.addAction(ActionReceiver.ACTION_MESSAGE_RECEIVED);
- mActionReceiver = new ActionReceiver();
- context.registerReceiver(mActionReceiver, actionFilter);
-
- Intent itemStatusIntent = new Intent(ActionReceiver.ACTION_ITEM_STATUS_CHANGED);
- itemStatusIntent.setPackage(context.getPackageName());
- mItemStatusPendingIntent = PendingIntent.getBroadcast(
- context, 0, itemStatusIntent, 0);
-
- Intent sessionStatusIntent = new Intent(ActionReceiver.ACTION_SESSION_STATUS_CHANGED);
- sessionStatusIntent.setPackage(context.getPackageName());
- mSessionStatusPendingIntent = PendingIntent.getBroadcast(
- context, 0, sessionStatusIntent, 0);
-
- Intent messageIntent = new Intent(ActionReceiver.ACTION_MESSAGE_RECEIVED);
- messageIntent.setPackage(context.getPackageName());
- mMessagePendingIntent = PendingIntent.getBroadcast(
- context, 0, messageIntent, 0);
- detectFeatures();
- }
-
- /**
- * Releases resources owned by the client.
- */
- public void release() {
- mContext.unregisterReceiver(mActionReceiver);
- }
-
- /**
- * Returns true if the route supports remote playback.
- * <p>
- * If the route does not support remote playback, then none of the functionality
- * offered by the client will be available.
- * </p><p>
- * This method returns true if the route supports all of the following
- * actions: {@link MediaControlIntent#ACTION_PLAY play},
- * {@link MediaControlIntent#ACTION_SEEK seek},
- * {@link MediaControlIntent#ACTION_GET_STATUS get status},
- * {@link MediaControlIntent#ACTION_PAUSE pause},
- * {@link MediaControlIntent#ACTION_RESUME resume},
- * {@link MediaControlIntent#ACTION_STOP stop}.
- * </p>
- *
- * @return True if remote playback is supported.
- */
- public boolean isRemotePlaybackSupported() {
- return mRouteSupportsRemotePlayback;
- }
-
- /**
- * Returns true if the route supports queuing features.
- * <p>
- * If the route does not support queuing, then at most one media item can be played
- * at a time and the {@link #enqueue} method will not be available.
- * </p><p>
- * This method returns true if the route supports all of the basic remote playback
- * actions and all of the following actions:
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue},
- * {@link MediaControlIntent#ACTION_REMOVE remove}.
- * </p>
- *
- * @return True if queuing is supported. Implies {@link #isRemotePlaybackSupported}
- * is also true.
- *
- * @see #isRemotePlaybackSupported
- */
- public boolean isQueuingSupported() {
- return mRouteSupportsQueuing;
- }
-
- /**
- * Returns true if the route supports session management features.
- * <p>
- * If the route does not support session management, then the session will
- * not be created until the first media item is played.
- * </p><p>
- * This method returns true if the route supports all of the basic remote playback
- * actions and all of the following actions:
- * {@link MediaControlIntent#ACTION_START_SESSION start session},
- * {@link MediaControlIntent#ACTION_GET_SESSION_STATUS get session status},
- * {@link MediaControlIntent#ACTION_END_SESSION end session}.
- * </p>
- *
- * @return True if session management is supported.
- * Implies {@link #isRemotePlaybackSupported} is also true.
- *
- * @see #isRemotePlaybackSupported
- */
- public boolean isSessionManagementSupported() {
- return mRouteSupportsSessionManagement;
- }
-
- /**
- * Returns true if the route supports messages.
- * <p>
- * This method returns true if the route supports all of the basic remote playback
- * actions and all of the following actions:
- * {@link MediaControlIntent#ACTION_START_SESSION start session},
- * {@link MediaControlIntent#ACTION_SEND_MESSAGE send message},
- * {@link MediaControlIntent#ACTION_END_SESSION end session}.
- * </p>
- *
- * @return True if session management is supported.
- * Implies {@link #isRemotePlaybackSupported} is also true.
- *
- * @see #isRemotePlaybackSupported
- */
- public boolean isMessagingSupported() {
- return mRouteSupportsMessaging;
- }
-
- /**
- * Gets the current session id if there is one.
- *
- * @return The current session id, or null if none.
- */
- public String getSessionId() {
- return mSessionId;
- }
-
- /**
- * Sets the current session id.
- * <p>
- * It is usually not necessary to set the session id explicitly since
- * it is created as a side-effect of other requests such as
- * {@link #play}, {@link #enqueue}, and {@link #startSession}.
- * </p>
- *
- * @param sessionId The new session id, or null if none.
- */
- public void setSessionId(String sessionId) {
- if (!ObjectsCompat.equals(mSessionId, sessionId)) {
- if (DEBUG) {
- Log.d(TAG, "Session id is now: " + sessionId);
- }
- mSessionId = sessionId;
- if (mStatusCallback != null) {
- mStatusCallback.onSessionChanged(sessionId);
- }
- }
- }
-
- /**
- * Returns true if the client currently has a session.
- * <p>
- * Equivalent to checking whether {@link #getSessionId} returns a non-null result.
- * </p>
- *
- * @return True if there is a current session.
- */
- public boolean hasSession() {
- return mSessionId != null;
- }
-
- /**
- * Sets a callback that should receive status updates when the state of
- * media sessions or media items created by this instance of the remote
- * playback client changes.
- * <p>
- * The callback should be set before the session is created or any play
- * commands are issued.
- * </p>
- *
- * @param callback The callback to set. May be null to remove the previous callback.
- */
- public void setStatusCallback(StatusCallback callback) {
- mStatusCallback = callback;
- }
-
- /**
- * Sets a callback that should receive messages when a message is sent from
- * media sessions created by this instance of the remote playback client changes.
- * <p>
- * The callback should be set before the session is created.
- * </p>
- *
- * @param listener The callback to set. May be null to remove the previous callback.
- */
- public void setOnMessageReceivedListener(OnMessageReceivedListener listener) {
- mOnMessageReceivedListener = listener;
- }
-
- /**
- * Sends a request to play a media item.
- * <p>
- * Clears the queue and starts playing the new item immediately. If the queue
- * was previously paused, then it is resumed as a side-effect of this request.
- * </p><p>
- * The request is issued in the current session. If no session is available, then
- * one is created implicitly.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_PLAY ACTION_PLAY} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param contentUri The content Uri to play.
- * @param mimeType The mime type of the content, or null if unknown.
- * @param positionMillis The initial content position for the item in milliseconds,
- * or <code>0</code> to start at the beginning.
- * @param metadata The media item metadata bundle, or null if none.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_PLAY} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws UnsupportedOperationException if the route does not support remote playback.
- *
- * @see MediaControlIntent#ACTION_PLAY
- * @see #isRemotePlaybackSupported
- */
- public void play(Uri contentUri, String mimeType, Bundle metadata,
- long positionMillis, Bundle extras, ItemActionCallback callback) {
- playOrEnqueue(contentUri, mimeType, metadata, positionMillis,
- extras, callback, MediaControlIntent.ACTION_PLAY);
- }
-
- /**
- * Sends a request to enqueue a media item.
- * <p>
- * Enqueues a new item to play. If the queue was previously paused, then will
- * remain paused.
- * </p><p>
- * The request is issued in the current session. If no session is available, then
- * one is created implicitly.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_ENQUEUE ACTION_ENQUEUE} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param contentUri The content Uri to enqueue.
- * @param mimeType The mime type of the content, or null if unknown.
- * @param positionMillis The initial content position for the item in milliseconds,
- * or <code>0</code> to start at the beginning.
- * @param metadata The media item metadata bundle, or null if none.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_ENQUEUE} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws UnsupportedOperationException if the route does not support queuing.
- *
- * @see MediaControlIntent#ACTION_ENQUEUE
- * @see #isRemotePlaybackSupported
- * @see #isQueuingSupported
- */
- public void enqueue(Uri contentUri, String mimeType, Bundle metadata,
- long positionMillis, Bundle extras, ItemActionCallback callback) {
- playOrEnqueue(contentUri, mimeType, metadata, positionMillis,
- extras, callback, MediaControlIntent.ACTION_ENQUEUE);
- }
-
- private void playOrEnqueue(Uri contentUri, String mimeType, Bundle metadata,
- long positionMillis, Bundle extras,
- final ItemActionCallback callback, String action) {
- if (contentUri == null) {
- throw new IllegalArgumentException("contentUri must not be null");
- }
- throwIfRemotePlaybackNotSupported();
- if (action.equals(MediaControlIntent.ACTION_ENQUEUE)) {
- throwIfQueuingNotSupported();
- }
-
- Intent intent = new Intent(action);
- intent.setDataAndType(contentUri, mimeType);
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_STATUS_UPDATE_RECEIVER,
- mItemStatusPendingIntent);
- if (metadata != null) {
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_METADATA, metadata);
- }
- if (positionMillis != 0) {
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_CONTENT_POSITION, positionMillis);
- }
- performItemAction(intent, mSessionId, null, extras, callback);
- }
-
- /**
- * Sends a request to seek to a new position in a media item.
- * <p>
- * Seeks to a new position. If the queue was previously paused then it
- * remains paused but the item's new position is still remembered.
- * </p><p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_SEEK ACTION_SEEK} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param itemId The item id.
- * @param positionMillis The new content position for the item in milliseconds,
- * or <code>0</code> to start at the beginning.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_SEEK} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_SEEK
- * @see #isRemotePlaybackSupported
- */
- public void seek(String itemId, long positionMillis, Bundle extras,
- ItemActionCallback callback) {
- if (itemId == null) {
- throw new IllegalArgumentException("itemId must not be null");
- }
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_SEEK);
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_CONTENT_POSITION, positionMillis);
- performItemAction(intent, mSessionId, itemId, extras, callback);
- }
-
- /**
- * Sends a request to get the status of a media item.
- * <p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_GET_STATUS ACTION_GET_STATUS} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param itemId The item id.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_GET_STATUS} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_GET_STATUS
- * @see #isRemotePlaybackSupported
- */
- public void getStatus(String itemId, Bundle extras, ItemActionCallback callback) {
- if (itemId == null) {
- throw new IllegalArgumentException("itemId must not be null");
- }
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_GET_STATUS);
- performItemAction(intent, mSessionId, itemId, extras, callback);
- }
-
- /**
- * Sends a request to remove a media item from the queue.
- * <p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_REMOVE ACTION_REMOVE} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param itemId The item id.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_REMOVE} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- * @throws UnsupportedOperationException if the route does not support queuing.
- *
- * @see MediaControlIntent#ACTION_REMOVE
- * @see #isRemotePlaybackSupported
- * @see #isQueuingSupported
- */
- public void remove(String itemId, Bundle extras, ItemActionCallback callback) {
- if (itemId == null) {
- throw new IllegalArgumentException("itemId must not be null");
- }
- throwIfQueuingNotSupported();
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_REMOVE);
- performItemAction(intent, mSessionId, itemId, extras, callback);
- }
-
- /**
- * Sends a request to pause media playback.
- * <p>
- * The request is issued in the current session. If playback is already paused
- * then the request has no effect.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_PAUSE ACTION_PAUSE} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_PAUSE} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_PAUSE
- * @see #isRemotePlaybackSupported
- */
- public void pause(Bundle extras, SessionActionCallback callback) {
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_PAUSE);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- /**
- * Sends a request to resume (unpause) media playback.
- * <p>
- * The request is issued in the current session. If playback is not paused
- * then the request has no effect.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_RESUME ACTION_RESUME} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_RESUME} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_RESUME
- * @see #isRemotePlaybackSupported
- */
- public void resume(Bundle extras, SessionActionCallback callback) {
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_RESUME);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- /**
- * Sends a request to stop media playback and clear the media playback queue.
- * <p>
- * The request is issued in the current session. If the queue is already
- * empty then the request has no effect.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_STOP ACTION_STOP} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_STOP} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_STOP
- * @see #isRemotePlaybackSupported
- */
- public void stop(Bundle extras, SessionActionCallback callback) {
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_STOP);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- /**
- * Sends a request to start a new media playback session.
- * <p>
- * The application must wait for the callback to indicate that this request
- * is complete before issuing other requests that affect the session. If this
- * request is successful then the previous session will be invalidated.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_START_SESSION ACTION_START_SESSION}
- * for more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_START_SESSION} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws UnsupportedOperationException if the route does not support session management.
- *
- * @see MediaControlIntent#ACTION_START_SESSION
- * @see #isRemotePlaybackSupported
- * @see #isSessionManagementSupported
- */
- public void startSession(Bundle extras, SessionActionCallback callback) {
- throwIfSessionManagementNotSupported();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_START_SESSION);
- intent.putExtra(MediaControlIntent.EXTRA_SESSION_STATUS_UPDATE_RECEIVER,
- mSessionStatusPendingIntent);
- if (mRouteSupportsMessaging) {
- intent.putExtra(MediaControlIntent.EXTRA_MESSAGE_RECEIVER, mMessagePendingIntent);
- }
- performSessionAction(intent, null, extras, callback);
- }
-
- /**
- * Sends a message.
- * <p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_SEND_MESSAGE} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param message A bundle message denoting {@link MediaControlIntent#EXTRA_MESSAGE}.
- * @param callback A callback to invoke when the request has been processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- * @throws UnsupportedOperationException if the route does not support messages.
- *
- * @see MediaControlIntent#ACTION_SEND_MESSAGE
- * @see #isMessagingSupported
- */
- public void sendMessage(Bundle message, SessionActionCallback callback) {
- throwIfNoCurrentSession();
- throwIfMessageNotSupported();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_SEND_MESSAGE);
- performSessionAction(intent, mSessionId, message, callback);
- }
-
- /**
- * Sends a request to get the status of the media playback session.
- * <p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_GET_SESSION_STATUS
- * ACTION_GET_SESSION_STATUS} for more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_GET_SESSION_STATUS} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- * @throws UnsupportedOperationException if the route does not support session management.
- *
- * @see MediaControlIntent#ACTION_GET_SESSION_STATUS
- * @see #isRemotePlaybackSupported
- * @see #isSessionManagementSupported
- */
- public void getSessionStatus(Bundle extras, SessionActionCallback callback) {
- throwIfSessionManagementNotSupported();
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_GET_SESSION_STATUS);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- /**
- * Sends a request to end the media playback session.
- * <p>
- * The request is issued in the current session. If this request is successful,
- * the {@link #getSessionId session id property} will be set to null after
- * the callback is invoked.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_END_SESSION ACTION_END_SESSION}
- * for more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_END_SESSION} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- * @throws UnsupportedOperationException if the route does not support session management.
- *
- * @see MediaControlIntent#ACTION_END_SESSION
- * @see #isRemotePlaybackSupported
- * @see #isSessionManagementSupported
- */
- public void endSession(Bundle extras, SessionActionCallback callback) {
- throwIfSessionManagementNotSupported();
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_END_SESSION);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- private void performItemAction(final Intent intent,
- final String sessionId, final String itemId,
- Bundle extras, final ItemActionCallback callback) {
- intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- if (sessionId != null) {
- intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, sessionId);
- }
- if (itemId != null) {
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_ID, itemId);
- }
- if (extras != null) {
- intent.putExtras(extras);
- }
- logRequest(intent);
- mRoute.sendControlRequest(intent, new MediaRouter.ControlRequestCallback() {
- @Override
- public void onResult(Bundle data) {
- if (data != null) {
- String sessionIdResult = inferMissingResult(sessionId,
- data.getString(MediaControlIntent.EXTRA_SESSION_ID));
- MediaSessionStatus sessionStatus = MediaSessionStatus.fromBundle(
- data.getBundle(MediaControlIntent.EXTRA_SESSION_STATUS));
- String itemIdResult = inferMissingResult(itemId,
- data.getString(MediaControlIntent.EXTRA_ITEM_ID));
- MediaItemStatus itemStatus = MediaItemStatus.fromBundle(
- data.getBundle(MediaControlIntent.EXTRA_ITEM_STATUS));
- adoptSession(sessionIdResult);
- if (sessionIdResult != null && itemIdResult != null && itemStatus != null) {
- if (DEBUG) {
- Log.d(TAG, "Received result from " + intent.getAction()
- + ": data=" + bundleToString(data)
- + ", sessionId=" + sessionIdResult
- + ", sessionStatus=" + sessionStatus
- + ", itemId=" + itemIdResult
- + ", itemStatus=" + itemStatus);
- }
- callback.onResult(data, sessionIdResult, sessionStatus,
- itemIdResult, itemStatus);
- return;
- }
- }
- handleInvalidResult(intent, callback, data);
- }
-
- @Override
- public void onError(String error, Bundle data) {
- handleError(intent, callback, error, data);
- }
- });
- }
-
- private void performSessionAction(final Intent intent, final String sessionId,
- Bundle extras, final SessionActionCallback callback) {
- intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- if (sessionId != null) {
- intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, sessionId);
- }
- if (extras != null) {
- intent.putExtras(extras);
- }
- logRequest(intent);
- mRoute.sendControlRequest(intent, new MediaRouter.ControlRequestCallback() {
- @Override
- public void onResult(Bundle data) {
- if (data != null) {
- String sessionIdResult = inferMissingResult(sessionId,
- data.getString(MediaControlIntent.EXTRA_SESSION_ID));
- MediaSessionStatus sessionStatus = MediaSessionStatus.fromBundle(
- data.getBundle(MediaControlIntent.EXTRA_SESSION_STATUS));
- adoptSession(sessionIdResult);
- if (sessionIdResult != null) {
- if (DEBUG) {
- Log.d(TAG, "Received result from " + intent.getAction()
- + ": data=" + bundleToString(data)
- + ", sessionId=" + sessionIdResult
- + ", sessionStatus=" + sessionStatus);
- }
- try {
- callback.onResult(data, sessionIdResult, sessionStatus);
- } finally {
- if (intent.getAction().equals(MediaControlIntent.ACTION_END_SESSION)
- && sessionIdResult.equals(mSessionId)) {
- setSessionId(null);
- }
- }
- return;
- }
- }
- handleInvalidResult(intent, callback, data);
- }
-
- @Override
- public void onError(String error, Bundle data) {
- handleError(intent, callback, error, data);
- }
- });
- }
-
- void adoptSession(String sessionId) {
- if (sessionId != null) {
- setSessionId(sessionId);
- }
- }
-
- void handleInvalidResult(Intent intent, ActionCallback callback,
- Bundle data) {
- Log.w(TAG, "Received invalid result data from " + intent.getAction()
- + ": data=" + bundleToString(data));
- callback.onError(null, MediaControlIntent.ERROR_UNKNOWN, data);
- }
-
- void handleError(Intent intent, ActionCallback callback,
- String error, Bundle data) {
- final int code;
- if (data != null) {
- code = data.getInt(MediaControlIntent.EXTRA_ERROR_CODE,
- MediaControlIntent.ERROR_UNKNOWN);
- } else {
- code = MediaControlIntent.ERROR_UNKNOWN;
- }
- if (DEBUG) {
- Log.w(TAG, "Received error from " + intent.getAction()
- + ": error=" + error
- + ", code=" + code
- + ", data=" + bundleToString(data));
- }
- callback.onError(error, code, data);
- }
-
- private void detectFeatures() {
- mRouteSupportsRemotePlayback = routeSupportsAction(MediaControlIntent.ACTION_PLAY)
- && routeSupportsAction(MediaControlIntent.ACTION_SEEK)
- && routeSupportsAction(MediaControlIntent.ACTION_GET_STATUS)
- && routeSupportsAction(MediaControlIntent.ACTION_PAUSE)
- && routeSupportsAction(MediaControlIntent.ACTION_RESUME)
- && routeSupportsAction(MediaControlIntent.ACTION_STOP);
- mRouteSupportsQueuing = mRouteSupportsRemotePlayback
- && routeSupportsAction(MediaControlIntent.ACTION_ENQUEUE)
- && routeSupportsAction(MediaControlIntent.ACTION_REMOVE);
- mRouteSupportsSessionManagement = mRouteSupportsRemotePlayback
- && routeSupportsAction(MediaControlIntent.ACTION_START_SESSION)
- && routeSupportsAction(MediaControlIntent.ACTION_GET_SESSION_STATUS)
- && routeSupportsAction(MediaControlIntent.ACTION_END_SESSION);
- mRouteSupportsMessaging = doesRouteSupportMessaging();
- }
-
- private boolean routeSupportsAction(String action) {
- return mRoute.supportsControlAction(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK, action);
- }
-
- private boolean doesRouteSupportMessaging() {
- for (IntentFilter filter : mRoute.getControlFilters()) {
- if (filter.hasAction(MediaControlIntent.ACTION_SEND_MESSAGE)) {
- return true;
- }
- }
- return false;
- }
-
- private void throwIfRemotePlaybackNotSupported() {
- if (!mRouteSupportsRemotePlayback) {
- throw new UnsupportedOperationException("The route does not support remote playback.");
- }
- }
-
- private void throwIfQueuingNotSupported() {
- if (!mRouteSupportsQueuing) {
- throw new UnsupportedOperationException("The route does not support queuing.");
- }
- }
-
- private void throwIfSessionManagementNotSupported() {
- if (!mRouteSupportsSessionManagement) {
- throw new UnsupportedOperationException("The route does not support "
- + "session management.");
- }
- }
-
- private void throwIfMessageNotSupported() {
- if (!mRouteSupportsMessaging) {
- throw new UnsupportedOperationException("The route does not support message.");
- }
- }
-
- private void throwIfNoCurrentSession() {
- if (mSessionId == null) {
- throw new IllegalStateException("There is no current session.");
- }
- }
-
- static String inferMissingResult(String request, String result) {
- if (result == null) {
- // Result is missing.
- return request;
- }
- if (request == null || request.equals(result)) {
- // Request didn't specify a value or result matches request.
- return result;
- }
- // Result conflicts with request.
- return null;
- }
-
- private static void logRequest(Intent intent) {
- if (DEBUG) {
- Log.d(TAG, "Sending request: " + intent);
- }
- }
-
- static String bundleToString(Bundle bundle) {
- if (bundle != null) {
- bundle.size(); // force bundle to be unparcelled
- return bundle.toString();
- }
- return "null";
- }
-
- private final class ActionReceiver extends BroadcastReceiver {
- public static final String ACTION_ITEM_STATUS_CHANGED =
- "androidx.mediarouter.media.actions.ACTION_ITEM_STATUS_CHANGED";
- public static final String ACTION_SESSION_STATUS_CHANGED =
- "androidx.mediarouter.media.actions.ACTION_SESSION_STATUS_CHANGED";
- public static final String ACTION_MESSAGE_RECEIVED =
- "androidx.mediarouter.media.actions.ACTION_MESSAGE_RECEIVED";
-
- ActionReceiver() {
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String sessionId = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
- if (sessionId == null || !sessionId.equals(mSessionId)) {
- Log.w(TAG, "Discarding spurious status callback "
- + "with missing or invalid session id: sessionId=" + sessionId);
- return;
- }
-
- MediaSessionStatus sessionStatus = MediaSessionStatus.fromBundle(
- intent.getBundleExtra(MediaControlIntent.EXTRA_SESSION_STATUS));
- String action = intent.getAction();
- if (action.equals(ACTION_ITEM_STATUS_CHANGED)) {
- String itemId = intent.getStringExtra(MediaControlIntent.EXTRA_ITEM_ID);
- if (itemId == null) {
- Log.w(TAG, "Discarding spurious status callback with missing item id.");
- return;
- }
-
- MediaItemStatus itemStatus = MediaItemStatus.fromBundle(
- intent.getBundleExtra(MediaControlIntent.EXTRA_ITEM_STATUS));
- if (itemStatus == null) {
- Log.w(TAG, "Discarding spurious status callback with missing item status.");
- return;
- }
-
- if (DEBUG) {
- Log.d(TAG, "Received item status callback: sessionId=" + sessionId
- + ", sessionStatus=" + sessionStatus
- + ", itemId=" + itemId
- + ", itemStatus=" + itemStatus);
- }
-
- if (mStatusCallback != null) {
- mStatusCallback.onItemStatusChanged(intent.getExtras(),
- sessionId, sessionStatus, itemId, itemStatus);
- }
- } else if (action.equals(ACTION_SESSION_STATUS_CHANGED)) {
- if (sessionStatus == null) {
- Log.w(TAG, "Discarding spurious media status callback with "
- +"missing session status.");
- return;
- }
-
- if (DEBUG) {
- Log.d(TAG, "Received session status callback: sessionId=" + sessionId
- + ", sessionStatus=" + sessionStatus);
- }
-
- if (mStatusCallback != null) {
- mStatusCallback.onSessionStatusChanged(intent.getExtras(),
- sessionId, sessionStatus);
- }
- } else if (action.equals(ACTION_MESSAGE_RECEIVED)) {
- if (DEBUG) {
- Log.d(TAG, "Received message callback: sessionId=" + sessionId);
- }
-
- if (mOnMessageReceivedListener != null) {
- mOnMessageReceivedListener.onMessageReceived(sessionId,
- intent.getBundleExtra(MediaControlIntent.EXTRA_MESSAGE));
- }
- }
- }
- }
-
- /**
- * A callback that will receive media status updates.
- */
- public static abstract class StatusCallback {
- /**
- * Called when the status of a media item changes.
- *
- * @param data The result data bundle.
- * @param sessionId The session id.
- * @param sessionStatus The session status, or null if unknown.
- * @param itemId The item id.
- * @param itemStatus The item status.
- */
- public void onItemStatusChanged(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- }
-
- /**
- * Called when the status of a media session changes.
- *
- * @param data The result data bundle.
- * @param sessionId The session id.
- * @param sessionStatus The session status, or null if unknown.
- */
- public void onSessionStatusChanged(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- }
-
- /**
- * Called when the session of the remote playback client changes.
- *
- * @param sessionId The new session id.
- */
- public void onSessionChanged(String sessionId) {
- }
- }
-
- /**
- * Base callback type for remote playback requests.
- */
- public static abstract class ActionCallback {
- /**
- * Called when a media control request fails.
- *
- * @param error A localized error message which may be shown to the user, or null
- * if the cause of the error is unclear.
- * @param code The error code, or {@link MediaControlIntent#ERROR_UNKNOWN} if unknown.
- * @param data The error data bundle, or null if none.
- */
- public void onError(String error, int code, Bundle data) {
- }
- }
-
- /**
- * Callback for remote playback requests that operate on items.
- */
- public static abstract class ItemActionCallback extends ActionCallback {
- /**
- * Called when the request succeeds.
- *
- * @param data The result data bundle.
- * @param sessionId The session id.
- * @param sessionStatus The session status, or null if unknown.
- * @param itemId The item id.
- * @param itemStatus The item status.
- */
- public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- }
- }
-
- /**
- * Callback for remote playback requests that operate on sessions.
- */
- public static abstract class SessionActionCallback extends ActionCallback {
- /**
- * Called when the request succeeds.
- *
- * @param data The result data bundle.
- * @param sessionId The session id.
- * @param sessionStatus The session status, or null if unknown.
- */
- public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus) {
- }
- }
-
- /**
- * A callback that will receive messages from media sessions.
- */
- public interface OnMessageReceivedListener {
- /**
- * Called when a message received.
- *
- * @param sessionId The session id.
- * @param message A bundle message denoting {@link MediaControlIntent#EXTRA_MESSAGE}.
- */
- void onMessageReceived(String sessionId, Bundle message);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/SystemMediaRouteProvider.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/SystemMediaRouteProvider.java
deleted file mode 100644
index 53901a4..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/SystemMediaRouteProvider.java
+++ /dev/null
@@ -1,882 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.media.AudioManager;
-import android.os.Build;
-import android.view.Display;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Provides routes for built-in system destinations such as the local display
- * and speaker. On Jellybean and newer platform releases, queries the framework
- * MediaRouter for framework-provided routes and registers non-framework-provided
- * routes as user routes.
- */
-abstract class SystemMediaRouteProvider extends MediaRouteProvider {
- private static final String TAG = "SystemMediaRouteProvider";
-
- public static final String PACKAGE_NAME = "android";
- public static final String DEFAULT_ROUTE_ID = "DEFAULT_ROUTE";
-
- protected SystemMediaRouteProvider(Context context) {
- super(context, new ProviderMetadata(new ComponentName(PACKAGE_NAME,
- SystemMediaRouteProvider.class.getName())));
- }
-
- public static SystemMediaRouteProvider obtain(Context context, SyncCallback syncCallback) {
- if (Build.VERSION.SDK_INT >= 24) {
- return new Api24Impl(context, syncCallback);
- }
- if (Build.VERSION.SDK_INT >= 18) {
- return new JellybeanMr2Impl(context, syncCallback);
- }
- if (Build.VERSION.SDK_INT >= 17) {
- return new JellybeanMr1Impl(context, syncCallback);
- }
- if (Build.VERSION.SDK_INT >= 16) {
- return new JellybeanImpl(context, syncCallback);
- }
- return new LegacyImpl(context);
- }
-
- /**
- * Called by the media router when a route is added to synchronize state with
- * the framework media router.
- */
- public void onSyncRouteAdded(MediaRouter.RouteInfo route) {
- }
-
- /**
- * Called by the media router when a route is removed to synchronize state with
- * the framework media router.
- */
- public void onSyncRouteRemoved(MediaRouter.RouteInfo route) {
- }
-
- /**
- * Called by the media router when a route is changed to synchronize state with
- * the framework media router.
- */
- public void onSyncRouteChanged(MediaRouter.RouteInfo route) {
- }
-
- /**
- * Called by the media router when a route is selected to synchronize state with
- * the framework media router.
- */
- public void onSyncRouteSelected(MediaRouter.RouteInfo route) {
- }
-
- /**
- * Callbacks into the media router to synchronize state with the framework media router.
- */
- public interface SyncCallback {
- void onSystemRouteSelectedByDescriptorId(String id);
- }
-
- protected Object getDefaultRoute() {
- return null;
- }
-
- protected Object getSystemRoute(MediaRouter.RouteInfo route) {
- return null;
- }
-
- /**
- * Legacy implementation for platform versions prior to Jellybean.
- */
- static class LegacyImpl extends SystemMediaRouteProvider {
- static final int PLAYBACK_STREAM = AudioManager.STREAM_MUSIC;
-
- private static final ArrayList<IntentFilter> CONTROL_FILTERS;
- static {
- IntentFilter f = new IntentFilter();
- f.addCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO);
- f.addCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
-
- CONTROL_FILTERS = new ArrayList<IntentFilter>();
- CONTROL_FILTERS.add(f);
- }
-
- final AudioManager mAudioManager;
- private final VolumeChangeReceiver mVolumeChangeReceiver;
- int mLastReportedVolume = -1;
-
- public LegacyImpl(Context context) {
- super(context);
- mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
- mVolumeChangeReceiver = new VolumeChangeReceiver();
-
- context.registerReceiver(mVolumeChangeReceiver,
- new IntentFilter(VolumeChangeReceiver.VOLUME_CHANGED_ACTION));
- publishRoutes();
- }
-
- void publishRoutes() {
- Resources r = getContext().getResources();
- int maxVolume = mAudioManager.getStreamMaxVolume(PLAYBACK_STREAM);
- mLastReportedVolume = mAudioManager.getStreamVolume(PLAYBACK_STREAM);
- MediaRouteDescriptor defaultRoute = new MediaRouteDescriptor.Builder(
- DEFAULT_ROUTE_ID, r.getString(R.string.mr_system_route_name))
- .addControlFilters(CONTROL_FILTERS)
- .setPlaybackStream(PLAYBACK_STREAM)
- .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_LOCAL)
- .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
- .setVolumeMax(maxVolume)
- .setVolume(mLastReportedVolume)
- .build();
-
- MediaRouteProviderDescriptor providerDescriptor =
- new MediaRouteProviderDescriptor.Builder()
- .addRoute(defaultRoute)
- .build();
- setDescriptor(providerDescriptor);
- }
-
- @Override
- public RouteController onCreateRouteController(String routeId) {
- if (routeId.equals(DEFAULT_ROUTE_ID)) {
- return new DefaultRouteController();
- }
- return null;
- }
-
- final class DefaultRouteController extends RouteController {
- @Override
- public void onSetVolume(int volume) {
- mAudioManager.setStreamVolume(PLAYBACK_STREAM, volume, 0);
- publishRoutes();
- }
-
- @Override
- public void onUpdateVolume(int delta) {
- int volume = mAudioManager.getStreamVolume(PLAYBACK_STREAM);
- int maxVolume = mAudioManager.getStreamMaxVolume(PLAYBACK_STREAM);
- int newVolume = Math.min(maxVolume, Math.max(0, volume + delta));
- if (newVolume != volume) {
- mAudioManager.setStreamVolume(PLAYBACK_STREAM, volume, 0);
- }
- publishRoutes();
- }
- }
-
- final class VolumeChangeReceiver extends BroadcastReceiver {
- // These constants come from AudioManager.
- public static final String VOLUME_CHANGED_ACTION =
- "android.media.VOLUME_CHANGED_ACTION";
- public static final String EXTRA_VOLUME_STREAM_TYPE =
- "android.media.EXTRA_VOLUME_STREAM_TYPE";
- public static final String EXTRA_VOLUME_STREAM_VALUE =
- "android.media.EXTRA_VOLUME_STREAM_VALUE";
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(VOLUME_CHANGED_ACTION)) {
- final int streamType = intent.getIntExtra(EXTRA_VOLUME_STREAM_TYPE, -1);
- if (streamType == PLAYBACK_STREAM) {
- final int volume = intent.getIntExtra(EXTRA_VOLUME_STREAM_VALUE, -1);
- if (volume >= 0 && volume != mLastReportedVolume) {
- publishRoutes();
- }
- }
- }
- }
- }
- }
-
- /**
- * Jellybean implementation.
- */
- // @@RequiresApi(16)
- static class JellybeanImpl extends SystemMediaRouteProvider
- implements MediaRouterJellybean.Callback, MediaRouterJellybean.VolumeCallback {
- private static final ArrayList<IntentFilter> LIVE_AUDIO_CONTROL_FILTERS;
- static {
- IntentFilter f = new IntentFilter();
- f.addCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO);
-
- LIVE_AUDIO_CONTROL_FILTERS = new ArrayList<IntentFilter>();
- LIVE_AUDIO_CONTROL_FILTERS.add(f);
- }
-
- private static final ArrayList<IntentFilter> LIVE_VIDEO_CONTROL_FILTERS;
- static {
- IntentFilter f = new IntentFilter();
- f.addCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
-
- LIVE_VIDEO_CONTROL_FILTERS = new ArrayList<IntentFilter>();
- LIVE_VIDEO_CONTROL_FILTERS.add(f);
- }
-
- private final SyncCallback mSyncCallback;
-
- protected final Object mRouterObj;
- protected final Object mCallbackObj;
- protected final Object mVolumeCallbackObj;
- protected final Object mUserRouteCategoryObj;
- protected int mRouteTypes;
- protected boolean mActiveScan;
- protected boolean mCallbackRegistered;
-
- // Maintains an association from framework routes to support library routes.
- // Note that we cannot use the tag field for this because an application may
- // have published its own user routes to the framework media router and already
- // used the tag for its own purposes.
- protected final ArrayList<SystemRouteRecord> mSystemRouteRecords =
- new ArrayList<SystemRouteRecord>();
-
- // Maintains an association from support library routes to framework routes.
- protected final ArrayList<UserRouteRecord> mUserRouteRecords =
- new ArrayList<UserRouteRecord>();
-
- private MediaRouterJellybean.SelectRouteWorkaround mSelectRouteWorkaround;
- private MediaRouterJellybean.GetDefaultRouteWorkaround mGetDefaultRouteWorkaround;
-
- public JellybeanImpl(Context context, SyncCallback syncCallback) {
- super(context);
- mSyncCallback = syncCallback;
- mRouterObj = MediaRouterJellybean.getMediaRouter(context);
- mCallbackObj = createCallbackObj();
- mVolumeCallbackObj = createVolumeCallbackObj();
-
- Resources r = ApiHelper.getLibResources(context);
- mUserRouteCategoryObj = MediaRouterJellybean.createRouteCategory(
- mRouterObj, r.getString(R.string.mr_user_route_category_name), false);
-
- updateSystemRoutes();
- }
-
- @Override
- public RouteController onCreateRouteController(String routeId) {
- int index = findSystemRouteRecordByDescriptorId(routeId);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- return new SystemRouteController(record.mRouteObj);
- }
- return null;
- }
-
- @Override
- public void onDiscoveryRequestChanged(MediaRouteDiscoveryRequest request) {
- int newRouteTypes = 0;
- boolean newActiveScan = false;
- if (request != null) {
- final MediaRouteSelector selector = request.getSelector();
- final List<String> categories = selector.getControlCategories();
- final int count = categories.size();
- for (int i = 0; i < count; i++) {
- String category = categories.get(i);
- if (category.equals(MediaControlIntent.CATEGORY_LIVE_AUDIO)) {
- newRouteTypes |= MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO;
- } else if (category.equals(MediaControlIntent.CATEGORY_LIVE_VIDEO)) {
- newRouteTypes |= MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO;
- } else {
- newRouteTypes |= MediaRouterJellybean.ROUTE_TYPE_USER;
- }
- }
- newActiveScan = request.isActiveScan();
- }
-
- if (mRouteTypes != newRouteTypes || mActiveScan != newActiveScan) {
- mRouteTypes = newRouteTypes;
- mActiveScan = newActiveScan;
- updateSystemRoutes();
- }
- }
-
- @Override
- public void onRouteAdded(Object routeObj) {
- if (addSystemRouteNoPublish(routeObj)) {
- publishRoutes();
- }
- }
-
- private void updateSystemRoutes() {
- updateCallback();
- boolean changed = false;
- for (Object routeObj : MediaRouterJellybean.getRoutes(mRouterObj)) {
- changed |= addSystemRouteNoPublish(routeObj);
- }
- if (changed) {
- publishRoutes();
- }
- }
-
- private boolean addSystemRouteNoPublish(Object routeObj) {
- if (getUserRouteRecord(routeObj) == null
- && findSystemRouteRecord(routeObj) < 0) {
- String id = assignRouteId(routeObj);
- SystemRouteRecord record = new SystemRouteRecord(routeObj, id);
- updateSystemRouteDescriptor(record);
- mSystemRouteRecords.add(record);
- return true;
- }
- return false;
- }
-
- private String assignRouteId(Object routeObj) {
- // TODO: The framework media router should supply a unique route id that
- // we can use here. For now we use a hash of the route name and take care
- // to dedupe it.
- boolean isDefault = (getDefaultRoute() == routeObj);
- String id = isDefault ? DEFAULT_ROUTE_ID :
- String.format(Locale.US, "ROUTE_%08x", getRouteName(routeObj).hashCode());
- if (findSystemRouteRecordByDescriptorId(id) < 0) {
- return id;
- }
- for (int i = 2; ; i++) {
- String newId = String.format(Locale.US, "%s_%d", id, i);
- if (findSystemRouteRecordByDescriptorId(newId) < 0) {
- return newId;
- }
- }
- }
-
- @Override
- public void onRouteRemoved(Object routeObj) {
- if (getUserRouteRecord(routeObj) == null) {
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- mSystemRouteRecords.remove(index);
- publishRoutes();
- }
- }
- }
-
- @Override
- public void onRouteChanged(Object routeObj) {
- if (getUserRouteRecord(routeObj) == null) {
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- updateSystemRouteDescriptor(record);
- publishRoutes();
- }
- }
- }
-
- @Override
- public void onRouteVolumeChanged(Object routeObj) {
- if (getUserRouteRecord(routeObj) == null) {
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- int newVolume = MediaRouterJellybean.RouteInfo.getVolume(routeObj);
- if (newVolume != record.mRouteDescriptor.getVolume()) {
- record.mRouteDescriptor =
- new MediaRouteDescriptor.Builder(record.mRouteDescriptor)
- .setVolume(newVolume)
- .build();
- publishRoutes();
- }
- }
- }
- }
-
- @Override
- public void onRouteSelected(int type, Object routeObj) {
- if (routeObj != MediaRouterJellybean.getSelectedRoute(mRouterObj,
- MediaRouterJellybean.ALL_ROUTE_TYPES)) {
- // The currently selected route has already changed so this callback
- // is stale. Drop it to prevent getting into sync loops.
- return;
- }
-
- UserRouteRecord userRouteRecord = getUserRouteRecord(routeObj);
- if (userRouteRecord != null) {
- userRouteRecord.mRoute.select();
- } else {
- // Select the route if it already exists in the compat media router.
- // If not, we will select it instead when the route is added.
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- mSyncCallback.onSystemRouteSelectedByDescriptorId(record.mRouteDescriptorId);
- }
- }
- }
-
- @Override
- public void onRouteUnselected(int type, Object routeObj) {
- // Nothing to do when a route is unselected.
- // We only need to handle when a route is selected.
- }
-
- @Override
- public void onRouteGrouped(Object routeObj, Object groupObj, int index) {
- // Route grouping is deprecated and no longer supported.
- }
-
- @Override
- public void onRouteUngrouped(Object routeObj, Object groupObj) {
- // Route grouping is deprecated and no longer supported.
- }
-
- @Override
- public void onVolumeSetRequest(Object routeObj, int volume) {
- UserRouteRecord record = getUserRouteRecord(routeObj);
- if (record != null) {
- record.mRoute.requestSetVolume(volume);
- }
- }
-
- @Override
- public void onVolumeUpdateRequest(Object routeObj, int direction) {
- UserRouteRecord record = getUserRouteRecord(routeObj);
- if (record != null) {
- record.mRoute.requestUpdateVolume(direction);
- }
- }
-
- @Override
- public void onSyncRouteAdded(MediaRouter.RouteInfo route) {
- if (route.getProviderInstance() != this) {
- Object routeObj = MediaRouterJellybean.createUserRoute(
- mRouterObj, mUserRouteCategoryObj);
- UserRouteRecord record = new UserRouteRecord(route, routeObj);
- MediaRouterJellybean.RouteInfo.setTag(routeObj, record);
- MediaRouterJellybean.UserRouteInfo.setVolumeCallback(routeObj, mVolumeCallbackObj);
- updateUserRouteProperties(record);
- mUserRouteRecords.add(record);
- MediaRouterJellybean.addUserRoute(mRouterObj, routeObj);
- } else {
- // If the newly added route is the counterpart of the currently selected
- // route in the framework media router then ensure it is selected in
- // the compat media router.
- Object routeObj = MediaRouterJellybean.getSelectedRoute(
- mRouterObj, MediaRouterJellybean.ALL_ROUTE_TYPES);
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- if (record.mRouteDescriptorId.equals(route.getDescriptorId())) {
- route.select();
- }
- }
- }
- }
-
- @Override
- public void onSyncRouteRemoved(MediaRouter.RouteInfo route) {
- if (route.getProviderInstance() != this) {
- int index = findUserRouteRecord(route);
- if (index >= 0) {
- UserRouteRecord record = mUserRouteRecords.remove(index);
- MediaRouterJellybean.RouteInfo.setTag(record.mRouteObj, null);
- MediaRouterJellybean.UserRouteInfo.setVolumeCallback(record.mRouteObj, null);
- MediaRouterJellybean.removeUserRoute(mRouterObj, record.mRouteObj);
- }
- }
- }
-
- @Override
- public void onSyncRouteChanged(MediaRouter.RouteInfo route) {
- if (route.getProviderInstance() != this) {
- int index = findUserRouteRecord(route);
- if (index >= 0) {
- UserRouteRecord record = mUserRouteRecords.get(index);
- updateUserRouteProperties(record);
- }
- }
- }
-
- @Override
- public void onSyncRouteSelected(MediaRouter.RouteInfo route) {
- if (!route.isSelected()) {
- // The currently selected route has already changed so this callback
- // is stale. Drop it to prevent getting into sync loops.
- return;
- }
-
- if (route.getProviderInstance() != this) {
- int index = findUserRouteRecord(route);
- if (index >= 0) {
- UserRouteRecord record = mUserRouteRecords.get(index);
- selectRoute(record.mRouteObj);
- }
- } else {
- int index = findSystemRouteRecordByDescriptorId(route.getDescriptorId());
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- selectRoute(record.mRouteObj);
- }
- }
- }
-
- protected void publishRoutes() {
- MediaRouteProviderDescriptor.Builder builder =
- new MediaRouteProviderDescriptor.Builder();
- int count = mSystemRouteRecords.size();
- for (int i = 0; i < count; i++) {
- builder.addRoute(mSystemRouteRecords.get(i).mRouteDescriptor);
- }
-
- setDescriptor(builder.build());
- }
-
- protected int findSystemRouteRecord(Object routeObj) {
- final int count = mSystemRouteRecords.size();
- for (int i = 0; i < count; i++) {
- if (mSystemRouteRecords.get(i).mRouteObj == routeObj) {
- return i;
- }
- }
- return -1;
- }
-
- protected int findSystemRouteRecordByDescriptorId(String id) {
- final int count = mSystemRouteRecords.size();
- for (int i = 0; i < count; i++) {
- if (mSystemRouteRecords.get(i).mRouteDescriptorId.equals(id)) {
- return i;
- }
- }
- return -1;
- }
-
- protected int findUserRouteRecord(MediaRouter.RouteInfo route) {
- final int count = mUserRouteRecords.size();
- for (int i = 0; i < count; i++) {
- if (mUserRouteRecords.get(i).mRoute == route) {
- return i;
- }
- }
- return -1;
- }
-
- protected UserRouteRecord getUserRouteRecord(Object routeObj) {
- Object tag = MediaRouterJellybean.RouteInfo.getTag(routeObj);
- return tag instanceof UserRouteRecord ? (UserRouteRecord)tag : null;
- }
-
- protected void updateSystemRouteDescriptor(SystemRouteRecord record) {
- // We must always recreate the route descriptor when making any changes
- // because they are intended to be immutable once published.
- MediaRouteDescriptor.Builder builder = new MediaRouteDescriptor.Builder(
- record.mRouteDescriptorId, getRouteName(record.mRouteObj));
- onBuildSystemRouteDescriptor(record, builder);
- record.mRouteDescriptor = builder.build();
- }
-
- protected String getRouteName(Object routeObj) {
- // Routes should not have null names but it may happen for badly configured
- // user routes. We tolerate this by using an empty name string here but
- // such unnamed routes will be discarded by the media router upstream
- // (with a log message so we can track down the problem).
- CharSequence name = MediaRouterJellybean.RouteInfo.getName(routeObj, getContext());
- return name != null ? name.toString() : "";
- }
-
- protected void onBuildSystemRouteDescriptor(SystemRouteRecord record,
- MediaRouteDescriptor.Builder builder) {
- int supportedTypes = MediaRouterJellybean.RouteInfo.getSupportedTypes(
- record.mRouteObj);
- if ((supportedTypes & MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO) != 0) {
- builder.addControlFilters(LIVE_AUDIO_CONTROL_FILTERS);
- }
- if ((supportedTypes & MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO) != 0) {
- builder.addControlFilters(LIVE_VIDEO_CONTROL_FILTERS);
- }
-
- builder.setPlaybackType(
- MediaRouterJellybean.RouteInfo.getPlaybackType(record.mRouteObj));
- builder.setPlaybackStream(
- MediaRouterJellybean.RouteInfo.getPlaybackStream(record.mRouteObj));
- builder.setVolume(
- MediaRouterJellybean.RouteInfo.getVolume(record.mRouteObj));
- builder.setVolumeMax(
- MediaRouterJellybean.RouteInfo.getVolumeMax(record.mRouteObj));
- builder.setVolumeHandling(
- MediaRouterJellybean.RouteInfo.getVolumeHandling(record.mRouteObj));
- }
-
- protected void updateUserRouteProperties(UserRouteRecord record) {
- MediaRouterJellybean.UserRouteInfo.setName(
- record.mRouteObj, record.mRoute.getName());
- MediaRouterJellybean.UserRouteInfo.setPlaybackType(
- record.mRouteObj, record.mRoute.getPlaybackType());
- MediaRouterJellybean.UserRouteInfo.setPlaybackStream(
- record.mRouteObj, record.mRoute.getPlaybackStream());
- MediaRouterJellybean.UserRouteInfo.setVolume(
- record.mRouteObj, record.mRoute.getVolume());
- MediaRouterJellybean.UserRouteInfo.setVolumeMax(
- record.mRouteObj, record.mRoute.getVolumeMax());
- MediaRouterJellybean.UserRouteInfo.setVolumeHandling(
- record.mRouteObj, record.mRoute.getVolumeHandling());
- }
-
- protected void updateCallback() {
- if (mCallbackRegistered) {
- mCallbackRegistered = false;
- MediaRouterJellybean.removeCallback(mRouterObj, mCallbackObj);
- }
-
- if (mRouteTypes != 0) {
- mCallbackRegistered = true;
- MediaRouterJellybean.addCallback(mRouterObj, mRouteTypes, mCallbackObj);
- }
- }
-
- protected Object createCallbackObj() {
- return MediaRouterJellybean.createCallback(this);
- }
-
- protected Object createVolumeCallbackObj() {
- return MediaRouterJellybean.createVolumeCallback(this);
- }
-
- protected void selectRoute(Object routeObj) {
- if (mSelectRouteWorkaround == null) {
- mSelectRouteWorkaround = new MediaRouterJellybean.SelectRouteWorkaround();
- }
- mSelectRouteWorkaround.selectRoute(mRouterObj,
- MediaRouterJellybean.ALL_ROUTE_TYPES, routeObj);
- }
-
- @Override
- protected Object getDefaultRoute() {
- if (mGetDefaultRouteWorkaround == null) {
- mGetDefaultRouteWorkaround = new MediaRouterJellybean.GetDefaultRouteWorkaround();
- }
- return mGetDefaultRouteWorkaround.getDefaultRoute(mRouterObj);
- }
-
- @Override
- protected Object getSystemRoute(MediaRouter.RouteInfo route) {
- if (route == null) {
- return null;
- }
- int index = findSystemRouteRecordByDescriptorId(route.getDescriptorId());
- if (index >= 0) {
- return mSystemRouteRecords.get(index).mRouteObj;
- }
- return null;
- }
-
- /**
- * Represents a route that is provided by the framework media router
- * and published by this route provider to the support library media router.
- */
- protected static final class SystemRouteRecord {
- public final Object mRouteObj;
- public final String mRouteDescriptorId;
- public MediaRouteDescriptor mRouteDescriptor; // assigned immediately after creation
-
- public SystemRouteRecord(Object routeObj, String id) {
- mRouteObj = routeObj;
- mRouteDescriptorId = id;
- }
- }
-
- /**
- * Represents a route that is provided by the support library media router
- * and published by this route provider to the framework media router.
- */
- protected static final class UserRouteRecord {
- public final MediaRouter.RouteInfo mRoute;
- public final Object mRouteObj;
-
- public UserRouteRecord(MediaRouter.RouteInfo route, Object routeObj) {
- mRoute = route;
- mRouteObj = routeObj;
- }
- }
-
- protected static final class SystemRouteController extends RouteController {
- private final Object mRouteObj;
-
- public SystemRouteController(Object routeObj) {
- mRouteObj = routeObj;
- }
-
- @Override
- public void onSetVolume(int volume) {
- MediaRouterJellybean.RouteInfo.requestSetVolume(mRouteObj, volume);
- }
-
- @Override
- public void onUpdateVolume(int delta) {
- MediaRouterJellybean.RouteInfo.requestUpdateVolume(mRouteObj, delta);
- }
- }
- }
-
- /**
- * Jellybean MR1 implementation.
- */
- // @@RequiresApi(17)
- private static class JellybeanMr1Impl extends JellybeanImpl
- implements MediaRouterJellybeanMr1.Callback {
- private MediaRouterJellybeanMr1.ActiveScanWorkaround mActiveScanWorkaround;
- private MediaRouterJellybeanMr1.IsConnectingWorkaround mIsConnectingWorkaround;
-
- public JellybeanMr1Impl(Context context, SyncCallback syncCallback) {
- super(context, syncCallback);
- }
-
- @Override
- public void onRoutePresentationDisplayChanged(Object routeObj) {
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- Display newPresentationDisplay =
- MediaRouterJellybeanMr1.RouteInfo.getPresentationDisplay(routeObj);
- int newPresentationDisplayId = (newPresentationDisplay != null
- ? newPresentationDisplay.getDisplayId() : -1);
- if (newPresentationDisplayId
- != record.mRouteDescriptor.getPresentationDisplayId()) {
- record.mRouteDescriptor =
- new MediaRouteDescriptor.Builder(record.mRouteDescriptor)
- .setPresentationDisplayId(newPresentationDisplayId)
- .build();
- publishRoutes();
- }
- }
- }
-
- @Override
- protected void onBuildSystemRouteDescriptor(SystemRouteRecord record,
- MediaRouteDescriptor.Builder builder) {
- super.onBuildSystemRouteDescriptor(record, builder);
-
- if (!MediaRouterJellybeanMr1.RouteInfo.isEnabled(record.mRouteObj)) {
- builder.setEnabled(false);
- }
-
- if (isConnecting(record)) {
- builder.setConnecting(true);
- }
-
- Display presentationDisplay =
- MediaRouterJellybeanMr1.RouteInfo.getPresentationDisplay(record.mRouteObj);
- if (presentationDisplay != null) {
- builder.setPresentationDisplayId(presentationDisplay.getDisplayId());
- }
- }
-
- @Override
- protected void updateCallback() {
- super.updateCallback();
-
- if (mActiveScanWorkaround == null) {
- mActiveScanWorkaround = new MediaRouterJellybeanMr1.ActiveScanWorkaround(
- getContext(), getHandler());
- }
- mActiveScanWorkaround.setActiveScanRouteTypes(mActiveScan ? mRouteTypes : 0);
- }
-
- @Override
- protected Object createCallbackObj() {
- return MediaRouterJellybeanMr1.createCallback(this);
- }
-
- protected boolean isConnecting(SystemRouteRecord record) {
- if (mIsConnectingWorkaround == null) {
- mIsConnectingWorkaround = new MediaRouterJellybeanMr1.IsConnectingWorkaround();
- }
- return mIsConnectingWorkaround.isConnecting(record.mRouteObj);
- }
- }
-
- /**
- * Jellybean MR2 implementation.
- */
- // @@RequiresApi(18)
- private static class JellybeanMr2Impl extends JellybeanMr1Impl {
- public JellybeanMr2Impl(Context context, SyncCallback syncCallback) {
- super(context, syncCallback);
- }
-
- @Override
- protected void onBuildSystemRouteDescriptor(SystemRouteRecord record,
- MediaRouteDescriptor.Builder builder) {
- super.onBuildSystemRouteDescriptor(record, builder);
-
- CharSequence description =
- MediaRouterJellybeanMr2.RouteInfo.getDescription(record.mRouteObj);
- if (description != null) {
- builder.setDescription(description.toString());
- }
- }
-
- @Override
- protected void selectRoute(Object routeObj) {
- MediaRouterJellybean.selectRoute(mRouterObj,
- MediaRouterJellybean.ALL_ROUTE_TYPES, routeObj);
- }
-
- @Override
- protected Object getDefaultRoute() {
- return MediaRouterJellybeanMr2.getDefaultRoute(mRouterObj);
- }
-
- @Override
- protected void updateUserRouteProperties(UserRouteRecord record) {
- super.updateUserRouteProperties(record);
-
- MediaRouterJellybeanMr2.UserRouteInfo.setDescription(
- record.mRouteObj, record.mRoute.getDescription());
- }
-
- @Override
- protected void updateCallback() {
- if (mCallbackRegistered) {
- MediaRouterJellybean.removeCallback(mRouterObj, mCallbackObj);
- }
-
- mCallbackRegistered = true;
- MediaRouterJellybeanMr2.addCallback(mRouterObj, mRouteTypes, mCallbackObj,
- MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS
- | (mActiveScan ? MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN : 0));
- }
-
- @Override
- protected boolean isConnecting(SystemRouteRecord record) {
- return MediaRouterJellybeanMr2.RouteInfo.isConnecting(record.mRouteObj);
- }
- }
-
- /**
- * Api24 implementation.
- */
- // @@RequiresApi(24)
- private static class Api24Impl extends JellybeanMr2Impl {
- public Api24Impl(Context context, SyncCallback syncCallback) {
- super(context, syncCallback);
- }
-
- @Override
- protected void onBuildSystemRouteDescriptor(SystemRouteRecord record,
- MediaRouteDescriptor.Builder builder) {
- super.onBuildSystemRouteDescriptor(record, builder);
-
- builder.setDeviceType(MediaRouterApi24.RouteInfo.getDeviceType(record.mRouteObj));
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/package.html b/packages/MediaComponents/src/com/android/support/mediarouter/media/package.html
deleted file mode 100644
index be2aaf2..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/package.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<html>
-
-<body>
-
-<p>Contains APIs that control the routing of media channels and streams from the current device
- to external speakers and destination devices.</p>
-
-</body>
-</html>
diff --git a/packages/MediaComponents/src/com/android/widget/BaseLayout.java b/packages/MediaComponents/src/com/android/widget/BaseLayout.java
deleted file mode 100644
index fb6471d..0000000
--- a/packages/MediaComponents/src/com/android/widget/BaseLayout.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.graphics.drawable.Drawable;
-import android.media.update.ViewGroupProvider;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewGroup.MarginLayoutParams;
-
-import java.util.ArrayList;
-
-public class BaseLayout extends ViewGroupImpl {
- private final ViewGroup mInstance;
- private final ViewGroupProvider mSuperProvider;
- private final ViewGroupProvider mPrivateProvider;
-
- private final ArrayList<View> mMatchParentChildren = new ArrayList<>(1);
-
- public BaseLayout(ViewGroup instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
- super(instance, superProvider, privateProvider);
- mInstance = instance;
- mSuperProvider = superProvider;
- mPrivateProvider = privateProvider;
- }
-
- @Override
- public boolean checkLayoutParams_impl(LayoutParams p) {
- return p instanceof MarginLayoutParams;
- }
-
- @Override
- public LayoutParams generateDefaultLayoutParams_impl() {
- return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- }
-
- @Override
- public LayoutParams generateLayoutParams_impl(AttributeSet attrs) {
- return new MarginLayoutParams(mInstance.getContext(), attrs);
- }
-
- @Override
- public LayoutParams generateLayoutParams_impl(LayoutParams lp) {
- if (lp instanceof MarginLayoutParams) {
- return lp;
- }
- return new MarginLayoutParams(lp);
- }
-
- @Override
- public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
- int count = mInstance.getChildCount();
-
- final boolean measureMatchParentChildren =
- View.MeasureSpec.getMode(widthMeasureSpec) != View.MeasureSpec.EXACTLY ||
- View.MeasureSpec.getMode(heightMeasureSpec) != View.MeasureSpec.EXACTLY;
- mMatchParentChildren.clear();
-
- int maxHeight = 0;
- int maxWidth = 0;
- int childState = 0;
-
- for (int i = 0; i < count; i++) {
- final View child = mInstance.getChildAt(i);
- if (child.getVisibility() != View.GONE) {
- mPrivateProvider.measureChildWithMargins_impl(
- child, widthMeasureSpec, 0, heightMeasureSpec, 0);
- final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
- maxWidth = Math.max(maxWidth,
- child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
- maxHeight = Math.max(maxHeight,
- child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
- childState = childState | child.getMeasuredState();
- if (measureMatchParentChildren) {
- if (lp.width == LayoutParams.MATCH_PARENT ||
- lp.height == LayoutParams.MATCH_PARENT) {
- mMatchParentChildren.add(child);
- }
- }
- }
- }
-
- // Account for padding too
- maxWidth += getPaddingLeftWithForeground() + getPaddingRightWithForeground();
- maxHeight += getPaddingTopWithForeground() + getPaddingBottomWithForeground();
-
- // Check against our minimum height and width
- maxHeight = Math.max(maxHeight, mPrivateProvider.getSuggestedMinimumHeight_impl());
- maxWidth = Math.max(maxWidth, mPrivateProvider.getSuggestedMinimumWidth_impl());
-
- // Check against our foreground's minimum height and width
- final Drawable drawable = mInstance.getForeground();
- if (drawable != null) {
- maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
- maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
- }
-
- mPrivateProvider.setMeasuredDimension_impl(
- mInstance.resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
- mInstance.resolveSizeAndState(maxHeight, heightMeasureSpec,
- childState << View.MEASURED_HEIGHT_STATE_SHIFT));
-
- count = mMatchParentChildren.size();
- if (count > 1) {
- for (int i = 0; i < count; i++) {
- final View child = mMatchParentChildren.get(i);
- final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
-
- final int childWidthMeasureSpec;
- if (lp.width == LayoutParams.MATCH_PARENT) {
- final int width = Math.max(0, mInstance.getMeasuredWidth()
- - getPaddingLeftWithForeground() - getPaddingRightWithForeground()
- - lp.leftMargin - lp.rightMargin);
- childWidthMeasureSpec = View.MeasureSpec.makeMeasureSpec(
- width, View.MeasureSpec.EXACTLY);
- } else {
- childWidthMeasureSpec = mInstance.getChildMeasureSpec(widthMeasureSpec,
- getPaddingLeftWithForeground() + getPaddingRightWithForeground() +
- lp.leftMargin + lp.rightMargin,
- lp.width);
- }
-
- final int childHeightMeasureSpec;
- if (lp.height == LayoutParams.MATCH_PARENT) {
- final int height = Math.max(0, mInstance.getMeasuredHeight()
- - getPaddingTopWithForeground() - getPaddingBottomWithForeground()
- - lp.topMargin - lp.bottomMargin);
- childHeightMeasureSpec = View.MeasureSpec.makeMeasureSpec(
- height, View.MeasureSpec.EXACTLY);
- } else {
- childHeightMeasureSpec = mInstance.getChildMeasureSpec(heightMeasureSpec,
- getPaddingTopWithForeground() + getPaddingBottomWithForeground() +
- lp.topMargin + lp.bottomMargin,
- lp.height);
- }
-
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
- }
- }
- }
-
- @Override
- public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
- final int count = mInstance.getChildCount();
-
- final int parentLeft = getPaddingLeftWithForeground();
- final int parentRight = right - left - getPaddingRightWithForeground();
-
- final int parentTop = getPaddingTopWithForeground();
- final int parentBottom = bottom - top - getPaddingBottomWithForeground();
-
- for (int i = 0; i < count; i++) {
- final View child = mInstance.getChildAt(i);
- if (child.getVisibility() != View.GONE) {
- final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
-
- final int width = child.getMeasuredWidth();
- final int height = child.getMeasuredHeight();
-
- int childLeft;
- int childTop;
-
- childLeft = parentLeft + (parentRight - parentLeft - width) / 2 +
- lp.leftMargin - lp.rightMargin;
-
- childTop = parentTop + (parentBottom - parentTop - height) / 2 +
- lp.topMargin - lp.bottomMargin;
-
- child.layout(childLeft, childTop, childLeft + width, childTop + height);
- }
- }
- }
-
- @Override
- public boolean shouldDelayChildPressedState_impl() {
- return false;
- }
-
- private int getPaddingLeftWithForeground() {
- return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingLeft(), 0) :
- mInstance.getPaddingLeft() + 0;
- }
-
- private int getPaddingRightWithForeground() {
- return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingRight(), 0) :
- mInstance.getPaddingRight() + 0;
- }
-
- private int getPaddingTopWithForeground() {
- return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingTop(), 0) :
- mInstance.getPaddingTop() + 0;
- }
-
- private int getPaddingBottomWithForeground() {
- return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingBottom(), 0) :
- mInstance.getPaddingBottom() + 0;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java b/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java
deleted file mode 100644
index ad85af4..0000000
--- a/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java
+++ /dev/null
@@ -1,1721 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.media.MediaMetadata;
-import android.media.SessionToken2;
-import android.media.session.MediaController;
-import android.media.session.PlaybackState;
-import android.media.update.MediaControlView2Provider;
-import android.media.update.ViewGroupProvider;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.MediaControlView2;
-import android.widget.PopupWindow;
-import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-
-import androidx.annotation.Nullable;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.app.MediaRouteButton;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Formatter;
-import java.util.List;
-import java.util.Locale;
-
-public class MediaControlView2Impl extends BaseLayout implements MediaControlView2Provider {
- private static final String TAG = "MediaControlView2";
-
- private final MediaControlView2 mInstance;
-
- static final String ARGUMENT_KEY_FULLSCREEN = "fullScreen";
-
- // TODO: Move these constants to public api to support custom video view.
- // TODO: Combine these constants into one regarding TrackInfo.
- static final String KEY_VIDEO_TRACK_COUNT = "VideoTrackCount";
- static final String KEY_AUDIO_TRACK_COUNT = "AudioTrackCount";
- static final String KEY_SUBTITLE_TRACK_COUNT = "SubtitleTrackCount";
- static final String KEY_PLAYBACK_SPEED = "PlaybackSpeed";
- static final String KEY_SELECTED_AUDIO_INDEX = "SelectedAudioIndex";
- static final String KEY_SELECTED_SUBTITLE_INDEX = "SelectedSubtitleIndex";
- static final String EVENT_UPDATE_TRACK_STATUS = "UpdateTrackStatus";
-
- // TODO: Remove this once integrating with MediaSession2 & MediaMetadata2
- static final String KEY_STATE_IS_ADVERTISEMENT = "MediaTypeAdvertisement";
- static final String EVENT_UPDATE_MEDIA_TYPE_STATUS = "UpdateMediaTypeStatus";
-
- // String for sending command to show subtitle to MediaSession.
- static final String COMMAND_SHOW_SUBTITLE = "showSubtitle";
- // String for sending command to hide subtitle to MediaSession.
- static final String COMMAND_HIDE_SUBTITLE = "hideSubtitle";
- // TODO: remove once the implementation is revised
- public static final String COMMAND_SET_FULLSCREEN = "setFullscreen";
- // String for sending command to select audio track to MediaSession.
- static final String COMMAND_SELECT_AUDIO_TRACK = "SelectTrack";
- // String for sending command to set playback speed to MediaSession.
- static final String COMMAND_SET_PLAYBACK_SPEED = "SetPlaybackSpeed";
- // String for sending command to mute audio to MediaSession.
- static final String COMMAND_MUTE= "Mute";
- // String for sending command to unmute audio to MediaSession.
- static final String COMMAND_UNMUTE = "Unmute";
-
- private static final int SETTINGS_MODE_AUDIO_TRACK = 0;
- private static final int SETTINGS_MODE_PLAYBACK_SPEED = 1;
- private static final int SETTINGS_MODE_HELP = 2;
- private static final int SETTINGS_MODE_SUBTITLE_TRACK = 3;
- private static final int SETTINGS_MODE_VIDEO_QUALITY = 4;
- private static final int SETTINGS_MODE_MAIN = 5;
- private static final int PLAYBACK_SPEED_1x_INDEX = 3;
-
- private static final int MEDIA_TYPE_DEFAULT = 0;
- private static final int MEDIA_TYPE_MUSIC = 1;
- private static final int MEDIA_TYPE_ADVERTISEMENT = 2;
-
- private static final int SIZE_TYPE_EMBEDDED = 0;
- private static final int SIZE_TYPE_FULL = 1;
- // TODO: add support for Minimal size type.
- private static final int SIZE_TYPE_MINIMAL = 2;
-
- private static final int MAX_PROGRESS = 1000;
- private static final int DEFAULT_PROGRESS_UPDATE_TIME_MS = 1000;
- private static final int REWIND_TIME_MS = 10000;
- private static final int FORWARD_TIME_MS = 30000;
- private static final int AD_SKIP_WAIT_TIME_MS = 5000;
- private static final int RESOURCE_NON_EXISTENT = -1;
- private static final String RESOURCE_EMPTY = "";
-
- private Resources mResources;
- private MediaController mController;
- private MediaController.TransportControls mControls;
- private PlaybackState mPlaybackState;
- private MediaMetadata mMetadata;
- private int mDuration;
- private int mPrevState;
- private int mPrevWidth;
- private int mPrevHeight;
- private int mOriginalLeftBarWidth;
- private int mVideoTrackCount;
- private int mAudioTrackCount;
- private int mSubtitleTrackCount;
- private int mSettingsMode;
- private int mSelectedSubtitleTrackIndex;
- private int mSelectedAudioTrackIndex;
- private int mSelectedVideoQualityIndex;
- private int mSelectedSpeedIndex;
- private int mEmbeddedSettingsItemWidth;
- private int mFullSettingsItemWidth;
- private int mEmbeddedSettingsItemHeight;
- private int mFullSettingsItemHeight;
- private int mSettingsWindowMargin;
- private int mMediaType;
- private int mSizeType;
- private long mPlaybackActions;
- private boolean mDragging;
- private boolean mIsFullScreen;
- private boolean mOverflowExpanded;
- private boolean mIsStopped;
- private boolean mSubtitleIsEnabled;
- private boolean mSeekAvailable;
- private boolean mIsAdvertisement;
- private boolean mIsMute;
- private boolean mNeedUXUpdate;
-
- // Relating to Title Bar View
- private ViewGroup mRoot;
- private View mTitleBar;
- private TextView mTitleView;
- private View mAdExternalLink;
- private ImageButton mBackButton;
- private MediaRouteButton mRouteButton;
- private MediaRouteSelector mRouteSelector;
-
- // Relating to Center View
- private ViewGroup mCenterView;
- private View mTransportControls;
- private ImageButton mPlayPauseButton;
- private ImageButton mFfwdButton;
- private ImageButton mRewButton;
- private ImageButton mNextButton;
- private ImageButton mPrevButton;
-
- // Relating to Minimal Extra View
- private LinearLayout mMinimalExtraView;
-
- // Relating to Progress Bar View
- private ProgressBar mProgress;
- private View mProgressBuffer;
-
- // Relating to Bottom Bar View
- private ViewGroup mBottomBar;
-
- // Relating to Bottom Bar Left View
- private ViewGroup mBottomBarLeftView;
- private ViewGroup mTimeView;
- private TextView mEndTime;
- private TextView mCurrentTime;
- private TextView mAdSkipView;
- private StringBuilder mFormatBuilder;
- private Formatter mFormatter;
-
- // Relating to Bottom Bar Right View
- private ViewGroup mBottomBarRightView;
- private ViewGroup mBasicControls;
- private ViewGroup mExtraControls;
- private ViewGroup mCustomButtons;
- private ImageButton mSubtitleButton;
- private ImageButton mFullScreenButton;
- private ImageButton mOverflowButtonRight;
- private ImageButton mOverflowButtonLeft;
- private ImageButton mMuteButton;
- private ImageButton mVideoQualityButton;
- private ImageButton mSettingsButton;
- private TextView mAdRemainingView;
-
- // Relating to Settings List View
- private ListView mSettingsListView;
- private PopupWindow mSettingsWindow;
- private SettingsAdapter mSettingsAdapter;
- private SubSettingsAdapter mSubSettingsAdapter;
- private List<String> mSettingsMainTextsList;
- private List<String> mSettingsSubTextsList;
- private List<Integer> mSettingsIconIdsList;
- private List<String> mSubtitleDescriptionsList;
- private List<String> mAudioTrackList;
- private List<String> mVideoQualityList;
- private List<String> mPlaybackSpeedTextList;
- private List<Float> mPlaybackSpeedList;
-
- public MediaControlView2Impl(MediaControlView2 instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
- super(instance, superProvider, privateProvider);
- mInstance = instance;
- }
-
- @Override
- public void initialize(@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- mResources = ApiHelper.getLibResources(mInstance.getContext());
- // Inflate MediaControlView2 from XML
- mRoot = makeControllerView();
- mInstance.addView(mRoot);
- }
-
- @Override
- public void setMediaSessionToken_impl(SessionToken2 token) {
- // TODO: implement this
- }
-
- @Override
- public void setOnFullScreenListener_impl(MediaControlView2.OnFullScreenListener l) {
- // TODO: implement this
- }
-
- @Override
- public void setController_impl(MediaController controller) {
- mController = controller;
- if (controller != null) {
- mControls = controller.getTransportControls();
- // Set mMetadata and mPlaybackState to existing MediaSession variables since they may
- // be called before the callback is called
- mPlaybackState = mController.getPlaybackState();
- mMetadata = mController.getMetadata();
- updateDuration();
- updateTitle();
-
- mController.registerCallback(new MediaControllerCallback());
- }
- }
-
- @Override
- public void setButtonVisibility_impl(int button, int visibility) {
- // TODO: add member variables for Fast-Forward/Prvious/Rewind buttons to save visibility in
- // order to prevent being overriden inside updateLayout().
- switch (button) {
- case MediaControlView2.BUTTON_PLAY_PAUSE:
- if (mPlayPauseButton != null && canPause()) {
- mPlayPauseButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_FFWD:
- if (mFfwdButton != null && canSeekForward()) {
- mFfwdButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_REW:
- if (mRewButton != null && canSeekBackward()) {
- mRewButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_NEXT:
- if (mNextButton != null) {
- mNextButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_PREV:
- if (mPrevButton != null) {
- mPrevButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_SUBTITLE:
- if (mSubtitleButton != null && mSubtitleTrackCount > 0) {
- mSubtitleButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_FULL_SCREEN:
- if (mFullScreenButton != null) {
- mFullScreenButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_OVERFLOW:
- if (mOverflowButtonRight != null) {
- mOverflowButtonRight.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_MUTE:
- if (mMuteButton != null) {
- mMuteButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_SETTINGS:
- if (mSettingsButton != null) {
- mSettingsButton.setVisibility(visibility);
- }
- break;
- default:
- break;
- }
- }
-
- @Override
- public void requestPlayButtonFocus_impl() {
- if (mPlayPauseButton != null) {
- mPlayPauseButton.requestFocus();
- }
- }
-
- @Override
- public CharSequence getAccessibilityClassName_impl() {
- return MediaControlView2.class.getName();
- }
-
- @Override
- public boolean onTouchEvent_impl(MotionEvent ev) {
- return false;
- }
-
- // TODO: Should this function be removed?
- @Override
- public boolean onTrackballEvent_impl(MotionEvent ev) {
- return false;
- }
-
- @Override
- public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure_impl(widthMeasureSpec, heightMeasureSpec);
-
- // Update layout when this view's width changes in order to avoid any UI overlap between
- // transport controls.
- if (mPrevWidth != mInstance.getMeasuredWidth()
- || mPrevHeight != mInstance.getMeasuredHeight() || mNeedUXUpdate) {
- // Dismiss SettingsWindow if it is showing.
- mSettingsWindow.dismiss();
-
- // These views may not have been initialized yet.
- if (mTransportControls.getWidth() == 0 || mTimeView.getWidth() == 0) {
- return;
- }
-
- int currWidth = mInstance.getMeasuredWidth();
- int currHeight = mInstance.getMeasuredHeight();
- WindowManager manager = (WindowManager) mInstance.getContext().getApplicationContext()
- .getSystemService(Context.WINDOW_SERVICE);
- Point screenSize = new Point();
- manager.getDefaultDisplay().getSize(screenSize);
- int screenWidth = screenSize.x;
- int screenHeight = screenSize.y;
- int fullIconSize = mResources.getDimensionPixelSize(R.dimen.mcv2_full_icon_size);
- int embeddedIconSize = mResources.getDimensionPixelSize(
- R.dimen.mcv2_embedded_icon_size);
- int marginSize = mResources.getDimensionPixelSize(R.dimen.mcv2_icon_margin);
-
- // TODO: add support for Advertisement Mode.
- if (mMediaType == MEDIA_TYPE_DEFAULT) {
- // Max number of icons inside BottomBarRightView for Music mode is 4.
- int maxIconCount = 4;
- updateLayout(maxIconCount, fullIconSize, embeddedIconSize, marginSize, currWidth,
- currHeight, screenWidth, screenHeight);
- } else if (mMediaType == MEDIA_TYPE_MUSIC) {
- if (mNeedUXUpdate) {
- // One-time operation for Music media type
- mBasicControls.removeView(mMuteButton);
- mExtraControls.addView(mMuteButton, 0);
- mVideoQualityButton.setVisibility(View.GONE);
- if (mFfwdButton != null) {
- mFfwdButton.setVisibility(View.GONE);
- }
- if (mRewButton != null) {
- mRewButton.setVisibility(View.GONE);
- }
- }
- mNeedUXUpdate = false;
-
- // Max number of icons inside BottomBarRightView for Music mode is 3.
- int maxIconCount = 3;
- updateLayout(maxIconCount, fullIconSize, embeddedIconSize, marginSize, currWidth,
- currHeight, screenWidth, screenHeight);
- }
- mPrevWidth = currWidth;
- mPrevHeight = currHeight;
- }
- // TODO: move this to a different location.
- // Update title bar parameters in order to avoid overlap between title view and the right
- // side of the title bar.
- updateTitleBarLayout();
- }
-
- @Override
- public void setEnabled_impl(boolean enabled) {
- super.setEnabled_impl(enabled);
-
- // TODO: Merge the below code with disableUnsupportedButtons().
- if (mPlayPauseButton != null) {
- mPlayPauseButton.setEnabled(enabled);
- }
- if (mFfwdButton != null) {
- mFfwdButton.setEnabled(enabled);
- }
- if (mRewButton != null) {
- mRewButton.setEnabled(enabled);
- }
- if (mNextButton != null) {
- mNextButton.setEnabled(enabled);
- }
- if (mPrevButton != null) {
- mPrevButton.setEnabled(enabled);
- }
- if (mProgress != null) {
- mProgress.setEnabled(enabled);
- }
- disableUnsupportedButtons();
- }
-
- @Override
- public void onVisibilityAggregated_impl(boolean isVisible) {
- super.onVisibilityAggregated_impl(isVisible);
-
- if (isVisible) {
- disableUnsupportedButtons();
- mInstance.removeCallbacks(mUpdateProgress);
- mInstance.post(mUpdateProgress);
- } else {
- mInstance.removeCallbacks(mUpdateProgress);
- }
- }
-
- public void setRouteSelector(MediaRouteSelector selector) {
- mRouteSelector = selector;
- if (mRouteSelector != null && !mRouteSelector.isEmpty()) {
- mRouteButton.setRouteSelector(selector, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- mRouteButton.setVisibility(View.VISIBLE);
- } else {
- mRouteButton.setRouteSelector(MediaRouteSelector.EMPTY);
- mRouteButton.setVisibility(View.GONE);
- }
- }
-
- ///////////////////////////////////////////////////
- // Protected or private methods
- ///////////////////////////////////////////////////
-
- private boolean isPlaying() {
- if (mPlaybackState != null) {
- return mPlaybackState.getState() == PlaybackState.STATE_PLAYING;
- }
- return false;
- }
-
- private int getCurrentPosition() {
- mPlaybackState = mController.getPlaybackState();
- if (mPlaybackState != null) {
- return (int) mPlaybackState.getPosition();
- }
- return 0;
- }
-
- private int getBufferPercentage() {
- if (mDuration == 0) {
- return 0;
- }
- mPlaybackState = mController.getPlaybackState();
- if (mPlaybackState != null) {
- long bufferedPos = mPlaybackState.getBufferedPosition();
- return (bufferedPos == -1) ? -1 : (int) (bufferedPos * 100 / mDuration);
- }
- return 0;
- }
-
- private boolean canPause() {
- if (mPlaybackState != null) {
- return (mPlaybackState.getActions() & PlaybackState.ACTION_PAUSE) != 0;
- }
- return true;
- }
-
- private boolean canSeekBackward() {
- if (mPlaybackState != null) {
- return (mPlaybackState.getActions() & PlaybackState.ACTION_REWIND) != 0;
- }
- return true;
- }
-
- private boolean canSeekForward() {
- if (mPlaybackState != null) {
- return (mPlaybackState.getActions() & PlaybackState.ACTION_FAST_FORWARD) != 0;
- }
- return true;
- }
-
- /**
- * Create the view that holds the widgets that control playback.
- * Derived classes can override this to create their own.
- *
- * @return The controller view.
- * @hide This doesn't work as advertised
- */
- protected ViewGroup makeControllerView() {
- ViewGroup root = (ViewGroup) ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.media_controller);
- initControllerView(root);
- return root;
- }
-
- private void initControllerView(ViewGroup v) {
- // Relating to Title Bar View
- mTitleBar = v.findViewById(R.id.title_bar);
- mTitleView = v.findViewById(R.id.title_text);
- mAdExternalLink = v.findViewById(R.id.ad_external_link);
- mBackButton = v.findViewById(R.id.back);
- if (mBackButton != null) {
- mBackButton.setOnClickListener(mBackListener);
- mBackButton.setVisibility(View.GONE);
- }
- mRouteButton = v.findViewById(R.id.cast);
-
- // Relating to Center View
- mCenterView = v.findViewById(R.id.center_view);
- mTransportControls = inflateTransportControls(R.layout.embedded_transport_controls);
- mCenterView.addView(mTransportControls);
-
- // Relating to Minimal Extra View
- mMinimalExtraView = (LinearLayout) v.findViewById(R.id.minimal_extra_view);
- LinearLayout.LayoutParams params =
- (LinearLayout.LayoutParams) mMinimalExtraView.getLayoutParams();
- int iconSize = mResources.getDimensionPixelSize(R.dimen.mcv2_embedded_icon_size);
- int marginSize = mResources.getDimensionPixelSize(R.dimen.mcv2_icon_margin);
- params.setMargins(0, (iconSize + marginSize * 2) * (-1), 0, 0);
- mMinimalExtraView.setLayoutParams(params);
- mMinimalExtraView.setVisibility(View.GONE);
-
- // Relating to Progress Bar View
- mProgress = v.findViewById(R.id.progress);
- if (mProgress != null) {
- if (mProgress instanceof SeekBar) {
- SeekBar seeker = (SeekBar) mProgress;
- seeker.setOnSeekBarChangeListener(mSeekListener);
- seeker.setProgressDrawable(mResources.getDrawable(R.drawable.custom_progress));
- seeker.setThumb(mResources.getDrawable(R.drawable.custom_progress_thumb));
- }
- mProgress.setMax(MAX_PROGRESS);
- }
- mProgressBuffer = v.findViewById(R.id.progress_buffer);
-
- // Relating to Bottom Bar View
- mBottomBar = v.findViewById(R.id.bottom_bar);
-
- // Relating to Bottom Bar Left View
- mBottomBarLeftView = v.findViewById(R.id.bottom_bar_left);
- mTimeView = v.findViewById(R.id.time);
- mEndTime = v.findViewById(R.id.time_end);
- mCurrentTime = v.findViewById(R.id.time_current);
- mAdSkipView = v.findViewById(R.id.ad_skip_time);
- mFormatBuilder = new StringBuilder();
- mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
-
- // Relating to Bottom Bar Right View
- mBottomBarRightView = v.findViewById(R.id.bottom_bar_right);
- mBasicControls = v.findViewById(R.id.basic_controls);
- mExtraControls = v.findViewById(R.id.extra_controls);
- mCustomButtons = v.findViewById(R.id.custom_buttons);
- mSubtitleButton = v.findViewById(R.id.subtitle);
- if (mSubtitleButton != null) {
- mSubtitleButton.setOnClickListener(mSubtitleListener);
- }
- mFullScreenButton = v.findViewById(R.id.fullscreen);
- if (mFullScreenButton != null) {
- mFullScreenButton.setOnClickListener(mFullScreenListener);
- // TODO: Show Fullscreen button when only it is possible.
- }
- mOverflowButtonRight = v.findViewById(R.id.overflow_right);
- if (mOverflowButtonRight != null) {
- mOverflowButtonRight.setOnClickListener(mOverflowRightListener);
- }
- mOverflowButtonLeft = v.findViewById(R.id.overflow_left);
- if (mOverflowButtonLeft != null) {
- mOverflowButtonLeft.setOnClickListener(mOverflowLeftListener);
- }
- mMuteButton = v.findViewById(R.id.mute);
- if (mMuteButton != null) {
- mMuteButton.setOnClickListener(mMuteButtonListener);
- }
- mSettingsButton = v.findViewById(R.id.settings);
- if (mSettingsButton != null) {
- mSettingsButton.setOnClickListener(mSettingsButtonListener);
- }
- mVideoQualityButton = v.findViewById(R.id.video_quality);
- if (mVideoQualityButton != null) {
- mVideoQualityButton.setOnClickListener(mVideoQualityListener);
- }
- mAdRemainingView = v.findViewById(R.id.ad_remaining);
-
- // Relating to Settings List View
- initializeSettingsLists();
- mSettingsListView = (ListView) ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.settings_list);
- mSettingsAdapter = new SettingsAdapter(mSettingsMainTextsList, mSettingsSubTextsList,
- mSettingsIconIdsList);
- mSubSettingsAdapter = new SubSettingsAdapter(null, 0);
- mSettingsListView.setAdapter(mSettingsAdapter);
- mSettingsListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
- mSettingsListView.setOnItemClickListener(mSettingsItemClickListener);
-
- mEmbeddedSettingsItemWidth = mResources.getDimensionPixelSize(
- R.dimen.mcv2_embedded_settings_width);
- mFullSettingsItemWidth = mResources.getDimensionPixelSize(R.dimen.mcv2_full_settings_width);
- mEmbeddedSettingsItemHeight = mResources.getDimensionPixelSize(
- R.dimen.mcv2_embedded_settings_height);
- mFullSettingsItemHeight = mResources.getDimensionPixelSize(
- R.dimen.mcv2_full_settings_height);
- mSettingsWindowMargin = (-1) * mResources.getDimensionPixelSize(
- R.dimen.mcv2_settings_offset);
- mSettingsWindow = new PopupWindow(mSettingsListView, mEmbeddedSettingsItemWidth,
- ViewGroup.LayoutParams.WRAP_CONTENT, true);
- }
-
- /**
- * Disable pause or seek buttons if the stream cannot be paused or seeked.
- * This requires the control interface to be a MediaPlayerControlExt
- */
- private void disableUnsupportedButtons() {
- try {
- if (mPlayPauseButton != null && !canPause()) {
- mPlayPauseButton.setEnabled(false);
- }
- if (mRewButton != null && !canSeekBackward()) {
- mRewButton.setEnabled(false);
- }
- if (mFfwdButton != null && !canSeekForward()) {
- mFfwdButton.setEnabled(false);
- }
- // TODO What we really should do is add a canSeek to the MediaPlayerControl interface;
- // this scheme can break the case when applications want to allow seek through the
- // progress bar but disable forward/backward buttons.
- //
- // However, currently the flags SEEK_BACKWARD_AVAILABLE, SEEK_FORWARD_AVAILABLE,
- // and SEEK_AVAILABLE are all (un)set together; as such the aforementioned issue
- // shouldn't arise in existing applications.
- if (mProgress != null && !canSeekBackward() && !canSeekForward()) {
- mProgress.setEnabled(false);
- }
- } catch (IncompatibleClassChangeError ex) {
- // We were given an old version of the interface, that doesn't have
- // the canPause/canSeekXYZ methods. This is OK, it just means we
- // assume the media can be paused and seeked, and so we don't disable
- // the buttons.
- }
- }
-
- private final Runnable mUpdateProgress = new Runnable() {
- @Override
- public void run() {
- int pos = setProgress();
- boolean isShowing = mInstance.getVisibility() == View.VISIBLE;
- if (!mDragging && isShowing && isPlaying()) {
- mInstance.postDelayed(mUpdateProgress,
- DEFAULT_PROGRESS_UPDATE_TIME_MS - (pos % DEFAULT_PROGRESS_UPDATE_TIME_MS));
- }
- }
- };
-
- private String stringForTime(int timeMs) {
- int totalSeconds = timeMs / 1000;
-
- int seconds = totalSeconds % 60;
- int minutes = (totalSeconds / 60) % 60;
- int hours = totalSeconds / 3600;
-
- mFormatBuilder.setLength(0);
- if (hours > 0) {
- return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
- } else {
- return mFormatter.format("%02d:%02d", minutes, seconds).toString();
- }
- }
-
- private int setProgress() {
- if (mController == null || mDragging) {
- return 0;
- }
- int positionOnProgressBar = 0;
- int currentPosition = getCurrentPosition();
- if (mDuration > 0) {
- positionOnProgressBar = (int) (MAX_PROGRESS * (long) currentPosition / mDuration);
- }
- if (mProgress != null && currentPosition != mDuration) {
- mProgress.setProgress(positionOnProgressBar);
- // If the media is a local file, there is no need to set a buffer, so set secondary
- // progress to maximum.
- if (getBufferPercentage() < 0) {
- mProgress.setSecondaryProgress(MAX_PROGRESS);
- } else {
- mProgress.setSecondaryProgress(getBufferPercentage() * 10);
- }
- }
-
- if (mEndTime != null) {
- mEndTime.setText(stringForTime(mDuration));
-
- }
- if (mCurrentTime != null) {
- mCurrentTime.setText(stringForTime(currentPosition));
- }
-
- if (mIsAdvertisement) {
- // Update the remaining number of seconds until the first 5 seconds of the
- // advertisement.
- if (mAdSkipView != null) {
- if (currentPosition <= AD_SKIP_WAIT_TIME_MS) {
- if (mAdSkipView.getVisibility() == View.GONE) {
- mAdSkipView.setVisibility(View.VISIBLE);
- }
- String skipTimeText = mResources.getString(
- R.string.MediaControlView2_ad_skip_wait_time,
- ((AD_SKIP_WAIT_TIME_MS - currentPosition) / 1000 + 1));
- mAdSkipView.setText(skipTimeText);
- } else {
- if (mAdSkipView.getVisibility() == View.VISIBLE) {
- mAdSkipView.setVisibility(View.GONE);
- mNextButton.setEnabled(true);
- mNextButton.clearColorFilter();
- }
- }
- }
- // Update the remaining number of seconds of the advertisement.
- if (mAdRemainingView != null) {
- int remainingTime =
- (mDuration - currentPosition < 0) ? 0 : (mDuration - currentPosition);
- String remainingTimeText = mResources.getString(
- R.string.MediaControlView2_ad_remaining_time,
- stringForTime(remainingTime));
- mAdRemainingView.setText(remainingTimeText);
- }
- }
- return currentPosition;
- }
-
- private void togglePausePlayState() {
- if (isPlaying()) {
- mControls.pause();
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- } else {
- mControls.play();
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_pause_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_pause_button_desc));
- }
- }
-
- // There are two scenarios that can trigger the seekbar listener to trigger:
- //
- // The first is the user using the touchpad to adjust the posititon of the
- // seekbar's thumb. In this case onStartTrackingTouch is called followed by
- // a number of onProgressChanged notifications, concluded by onStopTrackingTouch.
- // We're setting the field "mDragging" to true for the duration of the dragging
- // session to avoid jumps in the position in case of ongoing playback.
- //
- // The second scenario involves the user operating the scroll ball, in this
- // case there WON'T BE onStartTrackingTouch/onStopTrackingTouch notifications,
- // we will simply apply the updated position without suspending regular updates.
- private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
- @Override
- public void onStartTrackingTouch(SeekBar bar) {
- if (!mSeekAvailable) {
- return;
- }
-
- mDragging = true;
-
- // By removing these pending progress messages we make sure
- // that a) we won't update the progress while the user adjusts
- // the seekbar and b) once the user is done dragging the thumb
- // we will post one of these messages to the queue again and
- // this ensures that there will be exactly one message queued up.
- mInstance.removeCallbacks(mUpdateProgress);
-
- // Check if playback is currently stopped. In this case, update the pause button to
- // show the play image instead of the replay image.
- if (mIsStopped) {
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- mIsStopped = false;
- }
- }
-
- @Override
- public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) {
- if (!mSeekAvailable) {
- return;
- }
- if (!fromUser) {
- // We're not interested in programmatically generated changes to
- // the progress bar's position.
- return;
- }
- if (mDuration > 0) {
- int position = (int) (((long) mDuration * progress) / MAX_PROGRESS);
- mControls.seekTo(position);
-
- if (mCurrentTime != null) {
- mCurrentTime.setText(stringForTime(position));
- }
- }
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar bar) {
- if (!mSeekAvailable) {
- return;
- }
- mDragging = false;
-
- setProgress();
-
- // Ensure that progress is properly updated in the future,
- // the call to show() does not guarantee this because it is a
- // no-op if we are already showing.
- mInstance.post(mUpdateProgress);
- }
- };
-
- private final View.OnClickListener mPlayPauseListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- togglePausePlayState();
- }
- };
-
- private final View.OnClickListener mRewListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int pos = getCurrentPosition() - REWIND_TIME_MS;
- mControls.seekTo(pos);
- setProgress();
- }
- };
-
- private final View.OnClickListener mFfwdListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int pos = getCurrentPosition() + FORWARD_TIME_MS;
- mControls.seekTo(pos);
- setProgress();
- }
- };
-
- private final View.OnClickListener mNextListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mControls.skipToNext();
- }
- };
-
- private final View.OnClickListener mPrevListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mControls.skipToPrevious();
- }
- };
-
- private final View.OnClickListener mBackListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO: implement
- }
- };
-
- private final View.OnClickListener mSubtitleListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSettingsMode = SETTINGS_MODE_SUBTITLE_TRACK;
- mSubSettingsAdapter.setTexts(mSubtitleDescriptionsList);
- mSubSettingsAdapter.setCheckPosition(mSelectedSubtitleTrackIndex);
- displaySettingsWindow(mSubSettingsAdapter);
- }
- };
-
- private final View.OnClickListener mVideoQualityListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSettingsMode = SETTINGS_MODE_VIDEO_QUALITY;
- mSubSettingsAdapter.setTexts(mVideoQualityList);
- mSubSettingsAdapter.setCheckPosition(mSelectedVideoQualityIndex);
- displaySettingsWindow(mSubSettingsAdapter);
- }
- };
-
- private final View.OnClickListener mFullScreenListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final boolean isEnteringFullScreen = !mIsFullScreen;
- // TODO: Re-arrange the button layouts according to the UX.
- if (isEnteringFullScreen) {
- mFullScreenButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_fullscreen_exit, null));
- } else {
- mFullScreenButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_fullscreen, null));
- }
- Bundle args = new Bundle();
- args.putBoolean(ARGUMENT_KEY_FULLSCREEN, isEnteringFullScreen);
- mController.sendCommand(COMMAND_SET_FULLSCREEN, args, null);
-
- mIsFullScreen = isEnteringFullScreen;
- }
- };
-
- private final View.OnClickListener mOverflowRightListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mBasicControls.setVisibility(View.GONE);
- mExtraControls.setVisibility(View.VISIBLE);
- }
- };
-
- private final View.OnClickListener mOverflowLeftListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mBasicControls.setVisibility(View.VISIBLE);
- mExtraControls.setVisibility(View.GONE);
- }
- };
-
- private final View.OnClickListener mMuteButtonListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (!mIsMute) {
- mMuteButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_mute, null));
- mMuteButton.setContentDescription(
- mResources.getString(R.string.mcv2_muted_button_desc));
- mIsMute = true;
- mController.sendCommand(COMMAND_MUTE, null, null);
- } else {
- mMuteButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_unmute, null));
- mMuteButton.setContentDescription(
- mResources.getString(R.string.mcv2_unmuted_button_desc));
- mIsMute = false;
- mController.sendCommand(COMMAND_UNMUTE, null, null);
- }
- }
- };
-
- private final View.OnClickListener mSettingsButtonListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSettingsMode = SETTINGS_MODE_MAIN;
- mSettingsAdapter.setSubTexts(mSettingsSubTextsList);
- displaySettingsWindow(mSettingsAdapter);
- }
- };
-
- private final AdapterView.OnItemClickListener mSettingsItemClickListener
- = new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- switch (mSettingsMode) {
- case SETTINGS_MODE_MAIN:
- if (position == SETTINGS_MODE_AUDIO_TRACK) {
- mSubSettingsAdapter.setTexts(mAudioTrackList);
- mSubSettingsAdapter.setCheckPosition(mSelectedAudioTrackIndex);
- mSettingsMode = SETTINGS_MODE_AUDIO_TRACK;
- } else if (position == SETTINGS_MODE_PLAYBACK_SPEED) {
- mSubSettingsAdapter.setTexts(mPlaybackSpeedTextList);
- mSubSettingsAdapter.setCheckPosition(mSelectedSpeedIndex);
- mSettingsMode = SETTINGS_MODE_PLAYBACK_SPEED;
- } else if (position == SETTINGS_MODE_HELP) {
- // TODO: implement this.
- mSettingsWindow.dismiss();
- return;
- }
- displaySettingsWindow(mSubSettingsAdapter);
- break;
- case SETTINGS_MODE_AUDIO_TRACK:
- if (position != mSelectedAudioTrackIndex) {
- mSelectedAudioTrackIndex = position;
- if (mAudioTrackCount > 0) {
- Bundle extra = new Bundle();
- extra.putInt(KEY_SELECTED_AUDIO_INDEX, position);
- mController.sendCommand(COMMAND_SELECT_AUDIO_TRACK, extra, null);
- }
- mSettingsSubTextsList.set(SETTINGS_MODE_AUDIO_TRACK,
- mSubSettingsAdapter.getMainText(position));
- }
- mSettingsWindow.dismiss();
- break;
- case SETTINGS_MODE_PLAYBACK_SPEED:
- if (position != mSelectedSpeedIndex) {
- mSelectedSpeedIndex = position;
- Bundle extra = new Bundle();
- extra.putFloat(KEY_PLAYBACK_SPEED, mPlaybackSpeedList.get(position));
- mController.sendCommand(COMMAND_SET_PLAYBACK_SPEED, extra, null);
- mSettingsSubTextsList.set(SETTINGS_MODE_PLAYBACK_SPEED,
- mSubSettingsAdapter.getMainText(position));
- }
- mSettingsWindow.dismiss();
- break;
- case SETTINGS_MODE_HELP:
- // TODO: implement this.
- break;
- case SETTINGS_MODE_SUBTITLE_TRACK:
- if (position != mSelectedSubtitleTrackIndex) {
- mSelectedSubtitleTrackIndex = position;
- if (position > 0) {
- Bundle extra = new Bundle();
- extra.putInt(KEY_SELECTED_SUBTITLE_INDEX, position - 1);
- mController.sendCommand(
- MediaControlView2Impl.COMMAND_SHOW_SUBTITLE, extra, null);
- mSubtitleButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_subtitle_on, null));
- mSubtitleButton.setContentDescription(
- mResources.getString(R.string.mcv2_cc_is_on));
- mSubtitleIsEnabled = true;
- } else {
- mController.sendCommand(
- MediaControlView2Impl.COMMAND_HIDE_SUBTITLE, null, null);
- mSubtitleButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_subtitle_off, null));
- mSubtitleButton.setContentDescription(
- mResources.getString(R.string.mcv2_cc_is_off));
-
- mSubtitleIsEnabled = false;
- }
- }
- mSettingsWindow.dismiss();
- break;
- case SETTINGS_MODE_VIDEO_QUALITY:
- // TODO: add support for video quality
- mSelectedVideoQualityIndex = position;
- mSettingsWindow.dismiss();
- break;
- }
- }
- };
-
- private void updateDuration() {
- if (mMetadata != null) {
- if (mMetadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) {
- mDuration = (int) mMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
- // update progress bar
- setProgress();
- }
- }
- }
-
- private void updateTitle() {
- if (mMetadata != null) {
- if (mMetadata.containsKey(MediaMetadata.METADATA_KEY_TITLE)) {
- mTitleView.setText(mMetadata.getString(MediaMetadata.METADATA_KEY_TITLE));
- }
- }
- }
-
- // The title bar is made up of two separate LinearLayouts. If the sum of the two bars are
- // greater than the length of the title bar, reduce the size of the left bar (which makes the
- // TextView that contains the title of the media file shrink).
- private void updateTitleBarLayout() {
- if (mTitleBar != null) {
- int titleBarWidth = mTitleBar.getWidth();
-
- View leftBar = mTitleBar.findViewById(R.id.title_bar_left);
- View rightBar = mTitleBar.findViewById(R.id.title_bar_right);
- int leftBarWidth = leftBar.getWidth();
- int rightBarWidth = rightBar.getWidth();
-
- RelativeLayout.LayoutParams params =
- (RelativeLayout.LayoutParams) leftBar.getLayoutParams();
- if (leftBarWidth + rightBarWidth > titleBarWidth) {
- params.width = titleBarWidth - rightBarWidth;
- mOriginalLeftBarWidth = leftBarWidth;
- } else if (leftBarWidth + rightBarWidth < titleBarWidth && mOriginalLeftBarWidth != 0) {
- params.width = mOriginalLeftBarWidth;
- mOriginalLeftBarWidth = 0;
- }
- leftBar.setLayoutParams(params);
- }
- }
-
- private void updateAudioMetadata() {
- if (mMediaType != MEDIA_TYPE_MUSIC) {
- return;
- }
-
- if (mMetadata != null) {
- String titleText = "";
- String artistText = "";
- if (mMetadata.containsKey(MediaMetadata.METADATA_KEY_TITLE)) {
- titleText = mMetadata.getString(MediaMetadata.METADATA_KEY_TITLE);
- } else {
- titleText = mResources.getString(R.string.mcv2_music_title_unknown_text);
- }
-
- if (mMetadata.containsKey(MediaMetadata.METADATA_KEY_ARTIST)) {
- artistText = mMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST);
- } else {
- artistText = mResources.getString(R.string.mcv2_music_artist_unknown_text);
- }
-
- // Update title for Embedded size type
- mTitleView.setText(titleText + " - " + artistText);
-
- // Set to true to update layout inside onMeasure()
- mNeedUXUpdate = true;
- }
- }
-
- private void updateLayout() {
- if (mIsAdvertisement) {
- mRewButton.setVisibility(View.GONE);
- mFfwdButton.setVisibility(View.GONE);
- mPrevButton.setVisibility(View.GONE);
- mTimeView.setVisibility(View.GONE);
-
- mAdSkipView.setVisibility(View.VISIBLE);
- mAdRemainingView.setVisibility(View.VISIBLE);
- mAdExternalLink.setVisibility(View.VISIBLE);
-
- mProgress.setEnabled(false);
- mNextButton.setEnabled(false);
- mNextButton.setColorFilter(R.color.gray);
- } else {
- mRewButton.setVisibility(View.VISIBLE);
- mFfwdButton.setVisibility(View.VISIBLE);
- mPrevButton.setVisibility(View.VISIBLE);
- mTimeView.setVisibility(View.VISIBLE);
-
- mAdSkipView.setVisibility(View.GONE);
- mAdRemainingView.setVisibility(View.GONE);
- mAdExternalLink.setVisibility(View.GONE);
-
- mProgress.setEnabled(true);
- mNextButton.setEnabled(true);
- mNextButton.clearColorFilter();
- disableUnsupportedButtons();
- }
- }
-
- private void updateLayout(int maxIconCount, int fullIconSize, int embeddedIconSize,
- int marginSize, int currWidth, int currHeight, int screenWidth, int screenHeight) {
- int fullBottomBarRightWidthMax = fullIconSize * maxIconCount
- + marginSize * (maxIconCount * 2);
- int embeddedBottomBarRightWidthMax = embeddedIconSize * maxIconCount
- + marginSize * (maxIconCount * 2);
- int fullWidth = mTransportControls.getWidth() + mTimeView.getWidth()
- + fullBottomBarRightWidthMax;
- int embeddedWidth = mTimeView.getWidth() + embeddedBottomBarRightWidthMax;
- int screenMaxLength = Math.max(screenWidth, screenHeight);
-
- if (fullWidth > screenMaxLength) {
- // TODO: screen may be smaller than the length needed for Full size.
- }
-
- boolean isFullSize = (mMediaType == MEDIA_TYPE_DEFAULT) ? (currWidth == screenMaxLength) :
- (currWidth == screenWidth && currHeight == screenHeight);
-
- if (isFullSize) {
- if (mSizeType != SIZE_TYPE_FULL) {
- updateLayoutForSizeChange(SIZE_TYPE_FULL);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mTitleView.setVisibility(View.GONE);
- }
- }
- } else if (embeddedWidth <= currWidth) {
- if (mSizeType != SIZE_TYPE_EMBEDDED) {
- updateLayoutForSizeChange(SIZE_TYPE_EMBEDDED);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mTitleView.setVisibility(View.VISIBLE);
- }
- }
- } else {
- if (mSizeType != SIZE_TYPE_MINIMAL) {
- updateLayoutForSizeChange(SIZE_TYPE_MINIMAL);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mTitleView.setVisibility(View.GONE);
- }
- }
- }
- }
-
- private void updateLayoutForSizeChange(int sizeType) {
- mSizeType = sizeType;
- RelativeLayout.LayoutParams timeViewParams =
- (RelativeLayout.LayoutParams) mTimeView.getLayoutParams();
- SeekBar seeker = (SeekBar) mProgress;
- switch (mSizeType) {
- case SIZE_TYPE_EMBEDDED:
- // Relating to Title Bar
- mTitleBar.setVisibility(View.VISIBLE);
- mBackButton.setVisibility(View.GONE);
-
- // Relating to Full Screen Button
- mMinimalExtraView.setVisibility(View.GONE);
- mFullScreenButton = mBottomBarRightView.findViewById(R.id.fullscreen);
- mFullScreenButton.setOnClickListener(mFullScreenListener);
-
- // Relating to Center View
- mCenterView.removeAllViews();
- mBottomBarLeftView.removeView(mTransportControls);
- mBottomBarLeftView.setVisibility(View.GONE);
- mTransportControls = inflateTransportControls(R.layout.embedded_transport_controls);
- mCenterView.addView(mTransportControls);
-
- // Relating to Progress Bar
- seeker.setThumb(mResources.getDrawable(R.drawable.custom_progress_thumb));
- mProgressBuffer.setVisibility(View.VISIBLE);
-
- // Relating to Bottom Bar
- mBottomBar.setVisibility(View.VISIBLE);
- if (timeViewParams.getRule(RelativeLayout.LEFT_OF) != 0) {
- timeViewParams.removeRule(RelativeLayout.LEFT_OF);
- timeViewParams.addRule(RelativeLayout.RIGHT_OF, R.id.bottom_bar_left);
- }
- break;
- case SIZE_TYPE_FULL:
- // Relating to Title Bar
- mTitleBar.setVisibility(View.VISIBLE);
- mBackButton.setVisibility(View.VISIBLE);
-
- // Relating to Full Screen Button
- mMinimalExtraView.setVisibility(View.GONE);
- mFullScreenButton = mBottomBarRightView.findViewById(R.id.fullscreen);
- mFullScreenButton.setOnClickListener(mFullScreenListener);
-
- // Relating to Center View
- mCenterView.removeAllViews();
- mBottomBarLeftView.removeView(mTransportControls);
- mTransportControls = inflateTransportControls(R.layout.full_transport_controls);
- mBottomBarLeftView.addView(mTransportControls, 0);
- mBottomBarLeftView.setVisibility(View.VISIBLE);
-
- // Relating to Progress Bar
- seeker.setThumb(mResources.getDrawable(R.drawable.custom_progress_thumb));
- mProgressBuffer.setVisibility(View.VISIBLE);
-
- // Relating to Bottom Bar
- mBottomBar.setVisibility(View.VISIBLE);
- if (timeViewParams.getRule(RelativeLayout.RIGHT_OF) != 0) {
- timeViewParams.removeRule(RelativeLayout.RIGHT_OF);
- timeViewParams.addRule(RelativeLayout.LEFT_OF, R.id.bottom_bar_right);
- }
- break;
- case SIZE_TYPE_MINIMAL:
- // Relating to Title Bar
- mTitleBar.setVisibility(View.GONE);
- mBackButton.setVisibility(View.GONE);
-
- // Relating to Full Screen Button
- mMinimalExtraView.setVisibility(View.VISIBLE);
- mFullScreenButton = mMinimalExtraView.findViewById(R.id.fullscreen);
- mFullScreenButton.setOnClickListener(mFullScreenListener);
-
- // Relating to Center View
- mCenterView.removeAllViews();
- mBottomBarLeftView.removeView(mTransportControls);
- mTransportControls = inflateTransportControls(R.layout.minimal_transport_controls);
- mCenterView.addView(mTransportControls);
-
- // Relating to Progress Bar
- seeker.setThumb(null);
- mProgressBuffer.setVisibility(View.GONE);
-
- // Relating to Bottom Bar
- mBottomBar.setVisibility(View.GONE);
- break;
- }
- mTimeView.setLayoutParams(timeViewParams);
-
- if (isPlaying()) {
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_pause_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_pause_button_desc));
- } else {
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- }
-
- if (mIsFullScreen) {
- mFullScreenButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_fullscreen_exit, null));
- } else {
- mFullScreenButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_fullscreen, null));
- }
- }
-
- private View inflateTransportControls(int layoutId) {
- View v = ApiHelper.inflateLibLayout(mInstance.getContext(), layoutId);
- mPlayPauseButton = v.findViewById(R.id.pause);
- if (mPlayPauseButton != null) {
- mPlayPauseButton.requestFocus();
- mPlayPauseButton.setOnClickListener(mPlayPauseListener);
- }
- mFfwdButton = v.findViewById(R.id.ffwd);
- if (mFfwdButton != null) {
- mFfwdButton.setOnClickListener(mFfwdListener);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mFfwdButton.setVisibility(View.GONE);
- }
- }
- mRewButton = v.findViewById(R.id.rew);
- if (mRewButton != null) {
- mRewButton.setOnClickListener(mRewListener);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mRewButton.setVisibility(View.GONE);
- }
- }
- // TODO: Add support for Next and Previous buttons
- mNextButton = v.findViewById(R.id.next);
- if (mNextButton != null) {
- mNextButton.setOnClickListener(mNextListener);
- mNextButton.setVisibility(View.GONE);
- }
- mPrevButton = v.findViewById(R.id.prev);
- if (mPrevButton != null) {
- mPrevButton.setOnClickListener(mPrevListener);
- mPrevButton.setVisibility(View.GONE);
- }
- return v;
- }
-
- private void initializeSettingsLists() {
- mSettingsMainTextsList = new ArrayList<String>();
- mSettingsMainTextsList.add(
- mResources.getString(R.string.MediaControlView2_audio_track_text));
- mSettingsMainTextsList.add(
- mResources.getString(R.string.MediaControlView2_playback_speed_text));
- mSettingsMainTextsList.add(
- mResources.getString(R.string.MediaControlView2_help_text));
-
- mSettingsSubTextsList = new ArrayList<String>();
- mSettingsSubTextsList.add(
- mResources.getString(R.string.MediaControlView2_audio_track_none_text));
- mSettingsSubTextsList.add(
- mResources.getStringArray(
- R.array.MediaControlView2_playback_speeds)[PLAYBACK_SPEED_1x_INDEX]);
- mSettingsSubTextsList.add(RESOURCE_EMPTY);
-
- mSettingsIconIdsList = new ArrayList<Integer>();
- mSettingsIconIdsList.add(R.drawable.ic_audiotrack);
- mSettingsIconIdsList.add(R.drawable.ic_play_circle_filled);
- mSettingsIconIdsList.add(R.drawable.ic_help);
-
- mAudioTrackList = new ArrayList<String>();
- mAudioTrackList.add(
- mResources.getString(R.string.MediaControlView2_audio_track_none_text));
-
- mVideoQualityList = new ArrayList<String>();
- mVideoQualityList.add(
- mResources.getString(R.string.MediaControlView2_video_quality_auto_text));
-
- mPlaybackSpeedTextList = new ArrayList<String>(Arrays.asList(
- mResources.getStringArray(R.array.MediaControlView2_playback_speeds)));
- // Select the "1x" speed as the default value.
- mSelectedSpeedIndex = PLAYBACK_SPEED_1x_INDEX;
-
- mPlaybackSpeedList = new ArrayList<Float>();
- int[] speeds = mResources.getIntArray(R.array.speed_multiplied_by_100);
- for (int i = 0; i < speeds.length; i++) {
- float speed = (float) speeds[i] / 100.0f;
- mPlaybackSpeedList.add(speed);
- }
- }
-
- private void displaySettingsWindow(BaseAdapter adapter) {
- // Set Adapter
- mSettingsListView.setAdapter(adapter);
-
- // Set width of window
- int itemWidth = (mSizeType == SIZE_TYPE_EMBEDDED)
- ? mEmbeddedSettingsItemWidth : mFullSettingsItemWidth;
- mSettingsWindow.setWidth(itemWidth);
-
- // Calculate height of window and show
- int itemHeight = (mSizeType == SIZE_TYPE_EMBEDDED)
- ? mEmbeddedSettingsItemHeight : mFullSettingsItemHeight;
- int totalHeight = adapter.getCount() * itemHeight;
- mSettingsWindow.dismiss();
- mSettingsWindow.showAsDropDown(mInstance, mSettingsWindowMargin,
- mSettingsWindowMargin - totalHeight, Gravity.BOTTOM | Gravity.RIGHT);
- }
-
- private class MediaControllerCallback extends MediaController.Callback {
- @Override
- public void onPlaybackStateChanged(PlaybackState state) {
- mPlaybackState = state;
-
- // Update pause button depending on playback state for the following two reasons:
- // 1) Need to handle case where app customizes playback state behavior when app
- // activity is resumed.
- // 2) Need to handle case where the media file reaches end of duration.
- if (mPlaybackState.getState() != mPrevState) {
- switch (mPlaybackState.getState()) {
- case PlaybackState.STATE_PLAYING:
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_pause_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_pause_button_desc));
- mInstance.removeCallbacks(mUpdateProgress);
- mInstance.post(mUpdateProgress);
- break;
- case PlaybackState.STATE_PAUSED:
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- break;
- case PlaybackState.STATE_STOPPED:
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_replay_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_replay_button_desc));
- mIsStopped = true;
- break;
- default:
- break;
- }
- mPrevState = mPlaybackState.getState();
- }
-
- if (mPlaybackActions != mPlaybackState.getActions()) {
- long newActions = mPlaybackState.getActions();
- if ((newActions & PlaybackState.ACTION_PAUSE) != 0) {
- mPlayPauseButton.setVisibility(View.VISIBLE);
- }
- if ((newActions & PlaybackState.ACTION_REWIND) != 0
- && mMediaType != MEDIA_TYPE_MUSIC) {
- if (mRewButton != null) {
- mRewButton.setVisibility(View.VISIBLE);
- }
- }
- if ((newActions & PlaybackState.ACTION_FAST_FORWARD) != 0
- && mMediaType != MEDIA_TYPE_MUSIC) {
- if (mFfwdButton != null) {
- mFfwdButton.setVisibility(View.VISIBLE);
- }
- }
- if ((newActions & PlaybackState.ACTION_SEEK_TO) != 0) {
- mSeekAvailable = true;
- } else {
- mSeekAvailable = false;
- }
- mPlaybackActions = newActions;
- }
-
- // Add buttons if custom actions are present.
- List<PlaybackState.CustomAction> customActions = mPlaybackState.getCustomActions();
- mCustomButtons.removeAllViews();
- if (customActions.size() > 0) {
- for (PlaybackState.CustomAction action : customActions) {
- ImageButton button = new ImageButton(mInstance.getContext(),
- null /* AttributeSet */, 0 /* Style */);
- // TODO: Apply R.style.BottomBarButton to this button using library context.
- // Refer Constructor with argument (int defStyleRes) of View.java
- button.setImageResource(action.getIcon());
- button.setTooltipText(action.getName());
- final String actionString = action.getAction().toString();
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO: Currently, we are just sending extras that came from session.
- // Is it the right behavior?
- mControls.sendCustomAction(actionString, action.getExtras());
- mInstance.setVisibility(View.VISIBLE);
- }
- });
- mCustomButtons.addView(button);
- }
- }
- }
-
- @Override
- public void onMetadataChanged(MediaMetadata metadata) {
- mMetadata = metadata;
- updateDuration();
- updateTitle();
- updateAudioMetadata();
- }
-
- @Override
- public void onSessionEvent(String event, Bundle extras) {
- switch (event) {
- case EVENT_UPDATE_TRACK_STATUS:
- mVideoTrackCount = extras.getInt(KEY_VIDEO_TRACK_COUNT);
- // If there is one or more audio tracks, and this information has not been
- // reflected into the Settings window yet, automatically check the first track.
- // Otherwise, the Audio Track selection will be defaulted to "None".
- mAudioTrackCount = extras.getInt(KEY_AUDIO_TRACK_COUNT);
- mAudioTrackList = new ArrayList<String>();
- if (mAudioTrackCount > 0) {
- // TODO: add more text about track info.
- for (int i = 0; i < mAudioTrackCount; i++) {
- String track = mResources.getString(
- R.string.MediaControlView2_audio_track_number_text, i + 1);
- mAudioTrackList.add(track);
- }
- // Change sub text inside the Settings window.
- mSettingsSubTextsList.set(SETTINGS_MODE_AUDIO_TRACK,
- mAudioTrackList.get(0));
- } else {
- mAudioTrackList.add(mResources.getString(
- R.string.MediaControlView2_audio_track_none_text));
- }
- if (mVideoTrackCount == 0 && mAudioTrackCount > 0) {
- mMediaType = MEDIA_TYPE_MUSIC;
- }
-
- mSubtitleTrackCount = extras.getInt(KEY_SUBTITLE_TRACK_COUNT);
- mSubtitleDescriptionsList = new ArrayList<String>();
- if (mSubtitleTrackCount > 0) {
- mSubtitleButton.setVisibility(View.VISIBLE);
- mSubtitleButton.setEnabled(true);
- mSubtitleDescriptionsList.add(mResources.getString(
- R.string.MediaControlView2_subtitle_off_text));
- for (int i = 0; i < mSubtitleTrackCount; i++) {
- String track = mResources.getString(
- R.string.MediaControlView2_subtitle_track_number_text, i + 1);
- mSubtitleDescriptionsList.add(track);
- }
- } else {
- mSubtitleButton.setVisibility(View.GONE);
- mSubtitleButton.setEnabled(false);
- }
- break;
- case EVENT_UPDATE_MEDIA_TYPE_STATUS:
- boolean newStatus = extras.getBoolean(KEY_STATE_IS_ADVERTISEMENT);
- if (newStatus != mIsAdvertisement) {
- mIsAdvertisement = newStatus;
- updateLayout();
- }
- break;
- }
- }
- }
-
- private class SettingsAdapter extends BaseAdapter {
- private List<Integer> mIconIds;
- private List<String> mMainTexts;
- private List<String> mSubTexts;
-
- public SettingsAdapter(List<String> mainTexts, @Nullable List<String> subTexts,
- @Nullable List<Integer> iconIds) {
- mMainTexts = mainTexts;
- mSubTexts = subTexts;
- mIconIds = iconIds;
- }
-
- public void updateSubTexts(List<String> subTexts) {
- mSubTexts = subTexts;
- notifyDataSetChanged();
- }
-
- public String getMainText(int position) {
- if (mMainTexts != null) {
- if (position < mMainTexts.size()) {
- return mMainTexts.get(position);
- }
- }
- return RESOURCE_EMPTY;
- }
-
- @Override
- public int getCount() {
- return (mMainTexts == null) ? 0 : mMainTexts.size();
- }
-
- @Override
- public long getItemId(int position) {
- // Auto-generated method stub--does not have any purpose here
- // TODO: implement this.
- return 0;
- }
-
- @Override
- public Object getItem(int position) {
- // Auto-generated method stub--does not have any purpose here
- // TODO: implement this.
- return null;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup container) {
- View row;
- if (mSizeType == SIZE_TYPE_FULL) {
- row = ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.full_settings_list_item);
- } else {
- row = ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.embedded_settings_list_item);
- }
- TextView mainTextView = (TextView) row.findViewById(R.id.main_text);
- TextView subTextView = (TextView) row.findViewById(R.id.sub_text);
- ImageView iconView = (ImageView) row.findViewById(R.id.icon);
-
- // Set main text
- mainTextView.setText(mMainTexts.get(position));
-
- // Remove sub text and center the main text if sub texts do not exist at all or the sub
- // text at this particular position is empty.
- if (mSubTexts == null || mSubTexts.get(position) == RESOURCE_EMPTY) {
- subTextView.setVisibility(View.GONE);
- } else {
- // Otherwise, set sub text.
- subTextView.setText(mSubTexts.get(position));
- }
-
- // Remove main icon and set visibility to gone if icons are set to null or the icon at
- // this particular position is set to RESOURCE_NON_EXISTENT.
- if (mIconIds == null || mIconIds.get(position) == RESOURCE_NON_EXISTENT) {
- iconView.setVisibility(View.GONE);
- } else {
- // Otherwise, set main icon.
- iconView.setImageDrawable(mResources.getDrawable(mIconIds.get(position), null));
- }
- return row;
- }
-
- public void setSubTexts(List<String> subTexts) {
- mSubTexts = subTexts;
- }
- }
-
- // TODO: extend this class from SettingsAdapter
- private class SubSettingsAdapter extends BaseAdapter {
- private List<String> mTexts;
- private int mCheckPosition;
-
- public SubSettingsAdapter(List<String> texts, int checkPosition) {
- mTexts = texts;
- mCheckPosition = checkPosition;
- }
-
- public String getMainText(int position) {
- if (mTexts != null) {
- if (position < mTexts.size()) {
- return mTexts.get(position);
- }
- }
- return RESOURCE_EMPTY;
- }
-
- @Override
- public int getCount() {
- return (mTexts == null) ? 0 : mTexts.size();
- }
-
- @Override
- public long getItemId(int position) {
- // Auto-generated method stub--does not have any purpose here
- // TODO: implement this.
- return 0;
- }
-
- @Override
- public Object getItem(int position) {
- // Auto-generated method stub--does not have any purpose here
- // TODO: implement this.
- return null;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup container) {
- View row;
- if (mSizeType == SIZE_TYPE_FULL) {
- row = ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.full_sub_settings_list_item);
- } else {
- row = ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.embedded_sub_settings_list_item);
- }
- TextView textView = (TextView) row.findViewById(R.id.text);
- ImageView checkView = (ImageView) row.findViewById(R.id.check);
-
- textView.setText(mTexts.get(position));
- if (position != mCheckPosition) {
- checkView.setVisibility(View.INVISIBLE);
- }
- return row;
- }
-
- public void setTexts(List<String> texts) {
- mTexts = texts;
- }
-
- public void setCheckPosition(int checkPosition) {
- mCheckPosition = checkPosition;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/SubtitleView.java b/packages/MediaComponents/src/com/android/widget/SubtitleView.java
deleted file mode 100644
index db0ae33..0000000
--- a/packages/MediaComponents/src/com/android/widget/SubtitleView.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.os.Looper;
-import android.util.AttributeSet;
-import android.widget.FrameLayout;
-
-import androidx.annotation.Nullable;
-
-import com.android.media.subtitle.SubtitleController.Anchor;
-import com.android.media.subtitle.SubtitleTrack.RenderingWidget;
-
-class SubtitleView extends FrameLayout implements Anchor {
- private static final String TAG = "SubtitleView";
-
- private RenderingWidget mSubtitleWidget;
- private RenderingWidget.OnChangedListener mSubtitlesChangedListener;
-
- public SubtitleView(Context context) {
- this(context, null);
- }
-
- public SubtitleView(Context context, @Nullable AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public SubtitleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public SubtitleView(
- Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- public void setSubtitleWidget(RenderingWidget subtitleWidget) {
- if (mSubtitleWidget == subtitleWidget) {
- return;
- }
-
- final boolean attachedToWindow = isAttachedToWindow();
- if (mSubtitleWidget != null) {
- if (attachedToWindow) {
- mSubtitleWidget.onDetachedFromWindow();
- }
-
- mSubtitleWidget.setOnChangedListener(null);
- }
- mSubtitleWidget = subtitleWidget;
-
- if (subtitleWidget != null) {
- if (mSubtitlesChangedListener == null) {
- mSubtitlesChangedListener = new RenderingWidget.OnChangedListener() {
- @Override
- public void onChanged(RenderingWidget renderingWidget) {
- invalidate();
- }
- };
- }
-
- setWillNotDraw(false);
- subtitleWidget.setOnChangedListener(mSubtitlesChangedListener);
-
- if (attachedToWindow) {
- subtitleWidget.onAttachedToWindow();
- requestLayout();
- }
- } else {
- setWillNotDraw(true);
- }
-
- invalidate();
- }
-
- @Override
- public Looper getSubtitleLooper() {
- return Looper.getMainLooper();
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- if (mSubtitleWidget != null) {
- mSubtitleWidget.onAttachedToWindow();
- }
- }
-
- @Override
- public void onDetachedFromWindow() {
- super.onDetachedFromWindow();
-
- if (mSubtitleWidget != null) {
- mSubtitleWidget.onDetachedFromWindow();
- }
- }
-
- @Override
- public void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
-
- if (mSubtitleWidget != null) {
- final int width = getWidth() - getPaddingLeft() - getPaddingRight();
- final int height = getHeight() - getPaddingTop() - getPaddingBottom();
-
- mSubtitleWidget.setSize(width, height);
- }
- }
-
- @Override
- public void draw(Canvas canvas) {
- super.draw(canvas);
-
- if (mSubtitleWidget != null) {
- final int saveCount = canvas.save();
- canvas.translate(getPaddingLeft(), getPaddingTop());
- mSubtitleWidget.draw(canvas);
- canvas.restoreToCount(saveCount);
- }
- }
-
- @Override
- public CharSequence getAccessibilityClassName() {
- return SubtitleView.class.getName();
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/VideoSurfaceView.java b/packages/MediaComponents/src/com/android/widget/VideoSurfaceView.java
deleted file mode 100644
index 061bc5b..0000000
--- a/packages/MediaComponents/src/com/android/widget/VideoSurfaceView.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import static android.widget.VideoView2.VIEW_TYPE_SURFACEVIEW;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.media.MediaPlayer2;
-import android.media.VideoSize;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-
-class VideoSurfaceView extends SurfaceView implements VideoViewInterface, SurfaceHolder.Callback {
- private static final String TAG = "VideoSurfaceView";
- private static final boolean DEBUG = true; // STOPSHIP: Log.isLoggable(TAG, Log.DEBUG);
- private SurfaceHolder mSurfaceHolder = null;
- private SurfaceListener mSurfaceListener = null;
- private MediaPlayer2 mMediaPlayer;
- // A flag to indicate taking over other view should be proceed.
- private boolean mIsTakingOverOldView;
- private VideoViewInterface mOldView;
-
-
- public VideoSurfaceView(Context context) {
- this(context, null);
- }
-
- public VideoSurfaceView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public VideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public VideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- getHolder().addCallback(this);
- }
-
- ////////////////////////////////////////////////////
- // implements VideoViewInterface
- ////////////////////////////////////////////////////
-
- @Override
- public boolean assignSurfaceToMediaPlayer(MediaPlayer2 mp) {
- Log.d(TAG, "assignSurfaceToMediaPlayer(): mSurfaceHolder: " + mSurfaceHolder);
- if (mp == null || !hasAvailableSurface()) {
- return false;
- }
- mp.setDisplay(mSurfaceHolder);
- return true;
- }
-
- @Override
- public void setSurfaceListener(SurfaceListener l) {
- mSurfaceListener = l;
- }
-
- @Override
- public int getViewType() {
- return VIEW_TYPE_SURFACEVIEW;
- }
-
- @Override
- public void setMediaPlayer(MediaPlayer2 mp) {
- mMediaPlayer = mp;
- if (mIsTakingOverOldView) {
- takeOver(mOldView);
- }
- }
-
- @Override
- public void takeOver(@NonNull VideoViewInterface oldView) {
- if (assignSurfaceToMediaPlayer(mMediaPlayer)) {
- ((View) oldView).setVisibility(GONE);
- mIsTakingOverOldView = false;
- mOldView = null;
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceTakeOverDone(this);
- }
- } else {
- mIsTakingOverOldView = true;
- mOldView = oldView;
- }
- }
-
- @Override
- public boolean hasAvailableSurface() {
- return (mSurfaceHolder != null && mSurfaceHolder.getSurface() != null);
- }
-
- ////////////////////////////////////////////////////
- // implements SurfaceHolder.Callback
- ////////////////////////////////////////////////////
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- Log.d(TAG, "surfaceCreated: mSurfaceHolder: " + mSurfaceHolder + ", new holder: " + holder);
- mSurfaceHolder = holder;
- if (mIsTakingOverOldView) {
- takeOver(mOldView);
- } else {
- assignSurfaceToMediaPlayer(mMediaPlayer);
- }
-
- if (mSurfaceListener != null) {
- Rect rect = mSurfaceHolder.getSurfaceFrame();
- mSurfaceListener.onSurfaceCreated(this, rect.width(), rect.height());
- }
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceChanged(this, width, height);
- }
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- // After we return from this we can't use the surface any more
- mSurfaceHolder = null;
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceDestroyed(this);
- }
- }
-
- // TODO: Investigate the way to move onMeasure() code into FrameLayout.
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int videoWidth = (mMediaPlayer == null) ? 0 : mMediaPlayer.getVideoSize().getWidth();
- int videoHeight = (mMediaPlayer == null) ? 0 : mMediaPlayer.getVideoSize().getHeight();
- if (DEBUG) {
- Log.d(TAG, "onMeasure(" + MeasureSpec.toString(widthMeasureSpec) + ", "
- + MeasureSpec.toString(heightMeasureSpec) + ")");
- Log.i(TAG, " measuredSize: " + getMeasuredWidth() + "/" + getMeasuredHeight());
- Log.i(TAG, " viewSize: " + getWidth() + "/" + getHeight());
- Log.i(TAG, " mVideoWidth/height: " + videoWidth + ", " + videoHeight);
- }
-
- int width = getDefaultSize(videoWidth, widthMeasureSpec);
- int height = getDefaultSize(videoHeight, heightMeasureSpec);
-
- if (videoWidth > 0 && videoHeight > 0) {
- int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
-
- width = widthSpecSize;
- height = heightSpecSize;
-
- // for compatibility, we adjust size based on aspect ratio
- if (videoWidth * height < width * videoHeight) {
- width = height * videoWidth / videoHeight;
- if (DEBUG) {
- Log.d(TAG, "image too wide, correcting. width: " + width);
- }
- } else if (videoWidth * height > width * videoHeight) {
- height = width * videoHeight / videoWidth;
- if (DEBUG) {
- Log.d(TAG, "image too tall, correcting. height: " + height);
- }
- }
- } else {
- // no size yet, just adopt the given spec sizes
- }
- setMeasuredDimension(width, height);
- if (DEBUG) {
- Log.i(TAG, "end of onMeasure()");
- Log.i(TAG, " measuredSize: " + getMeasuredWidth() + "/" + getMeasuredHeight());
- }
- }
-
- @Override
- public String toString() {
- return "ViewType: SurfaceView / Visibility: " + getVisibility()
- + " / surfaceHolder: " + mSurfaceHolder;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/VideoTextureView.java b/packages/MediaComponents/src/com/android/widget/VideoTextureView.java
deleted file mode 100644
index c2c1ca6..0000000
--- a/packages/MediaComponents/src/com/android/widget/VideoTextureView.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import static android.widget.VideoView2.VIEW_TYPE_TEXTUREVIEW;
-
-import android.content.Context;
-import android.graphics.SurfaceTexture;
-import android.media.MediaPlayer2;
-import android.media.VideoSize;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Surface;
-import android.view.TextureView;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-
-@RequiresApi(26)
-class VideoTextureView extends TextureView
- implements VideoViewInterface, TextureView.SurfaceTextureListener {
- private static final String TAG = "VideoTextureView";
- private static final boolean DEBUG = true; // STOPSHIP: Log.isLoggable(TAG, Log.DEBUG);
-
- private SurfaceTexture mSurfaceTexture;
- private Surface mSurface;
- private SurfaceListener mSurfaceListener;
- private MediaPlayer2 mMediaPlayer;
- // A flag to indicate taking over other view should be proceed.
- private boolean mIsTakingOverOldView;
- private VideoViewInterface mOldView;
-
- public VideoTextureView(Context context) {
- this(context, null);
- }
-
- public VideoTextureView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public VideoTextureView(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public VideoTextureView(
- Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- setSurfaceTextureListener(this);
- }
-
- ////////////////////////////////////////////////////
- // implements VideoViewInterface
- ////////////////////////////////////////////////////
-
- @Override
- public boolean assignSurfaceToMediaPlayer(MediaPlayer2 mp) {
- Log.d(TAG, "assignSurfaceToMediaPlayer(): mSurfaceTexture: " + mSurfaceTexture);
- if (mp == null || !hasAvailableSurface()) {
- // Surface is not ready.
- return false;
- }
- mp.setSurface(mSurface);
- return true;
- }
-
- @Override
- public void setSurfaceListener(SurfaceListener l) {
- mSurfaceListener = l;
- }
-
- @Override
- public int getViewType() {
- return VIEW_TYPE_TEXTUREVIEW;
- }
-
- @Override
- public void setMediaPlayer(MediaPlayer2 mp) {
- mMediaPlayer = mp;
- if (mIsTakingOverOldView) {
- takeOver(mOldView);
- }
- }
-
- @Override
- public void takeOver(@NonNull VideoViewInterface oldView) {
- if (assignSurfaceToMediaPlayer(mMediaPlayer)) {
- ((View) oldView).setVisibility(GONE);
- mIsTakingOverOldView = false;
- mOldView = null;
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceTakeOverDone(this);
- }
- } else {
- mIsTakingOverOldView = true;
- mOldView = oldView;
- }
- }
-
- @Override
- public boolean hasAvailableSurface() {
- return (mSurfaceTexture != null && !mSurfaceTexture.isReleased() && mSurface != null);
- }
-
- ////////////////////////////////////////////////////
- // implements TextureView.SurfaceTextureListener
- ////////////////////////////////////////////////////
-
- @Override
- public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
- Log.d(TAG, "onSurfaceTextureAvailable: mSurfaceTexture: " + mSurfaceTexture
- + ", new surface: " + surfaceTexture);
- mSurfaceTexture = surfaceTexture;
- mSurface = new Surface(mSurfaceTexture);
- if (mIsTakingOverOldView) {
- takeOver(mOldView);
- } else {
- assignSurfaceToMediaPlayer(mMediaPlayer);
- }
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceCreated(this, width, height);
- }
- }
-
- @Override
- public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceChanged(this, width, height);
- }
- // requestLayout(); // TODO: figure out if it should be called here?
- }
-
- @Override
- public void onSurfaceTextureUpdated(SurfaceTexture surface) {
- // no-op
- }
-
- @Override
- public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceDestroyed(this);
- }
- mSurfaceTexture = null;
- mSurface = null;
- return true;
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int videoWidth = (mMediaPlayer == null) ? 0 : mMediaPlayer.getVideoSize().getWidth();
- int videoHeight = (mMediaPlayer == null) ? 0 : mMediaPlayer.getVideoSize().getHeight();
- if (DEBUG) {
- Log.d(TAG, "onMeasure(" + MeasureSpec.toString(widthMeasureSpec) + ", "
- + MeasureSpec.toString(heightMeasureSpec) + ")");
- Log.i(TAG, " measuredSize: " + getMeasuredWidth() + "/" + getMeasuredHeight());
- Log.i(TAG, " viewSize: " + getWidth() + "/" + getHeight());
- Log.i(TAG, " mVideoWidth/height: " + videoWidth + ", " + videoHeight);
- }
-
- int width = getDefaultSize(videoWidth, widthMeasureSpec);
- int height = getDefaultSize(videoHeight, heightMeasureSpec);
-
- if (videoWidth > 0 && videoHeight > 0) {
- int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
-
- width = widthSpecSize;
- height = heightSpecSize;
-
- // for compatibility, we adjust size based on aspect ratio
- if (videoWidth * height < width * videoHeight) {
- width = height * videoWidth / videoHeight;
- if (DEBUG) {
- Log.d(TAG, "image too wide, correcting. width: " + width);
- }
- } else if (videoWidth * height > width * videoHeight) {
- height = width * videoHeight / videoWidth;
- if (DEBUG) {
- Log.d(TAG, "image too tall, correcting. height: " + height);
- }
- }
- } else {
- // no size yet, just adopt the given spec sizes
- }
- setMeasuredDimension(width, height);
- if (DEBUG) {
- Log.i(TAG, "end of onMeasure()");
- Log.i(TAG, " measuredSize: " + getMeasuredWidth() + "/" + getMeasuredHeight());
- }
- }
-
- @Override
- public String toString() {
- return "ViewType: TextureView / Visibility: " + getVisibility()
- + " / surfaceTexture: " + mSurfaceTexture;
-
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java b/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java
deleted file mode 100644
index 17507cd..0000000
--- a/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java
+++ /dev/null
@@ -1,1383 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Point;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.media.AudioAttributes;
-import android.media.AudioFocusRequest;
-import android.media.AudioManager;
-import android.media.DataSourceDesc;
-import android.media.MediaItem2;
-import android.media.MediaMetadata;
-import android.media.MediaMetadata2;
-import android.media.MediaMetadataRetriever;
-import android.media.MediaPlayer2;
-import android.media.MediaPlayer2.EventCallback;
-import android.media.MediaPlayer2Impl;
-import android.media.PlaybackParams;
-import android.media.SessionToken2;
-import android.media.SubtitleData;
-import android.media.TimedText;
-import android.media.VideoSize;
-import android.media.session.MediaController;
-import android.media.session.MediaController.PlaybackInfo;
-import android.media.session.MediaSession;
-import android.media.session.PlaybackState;
-import android.media.update.VideoView2Provider;
-import android.media.update.ViewGroupProvider;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.ResultReceiver;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.util.Pair;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup.LayoutParams;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityManager;
-import android.widget.ImageView;
-import android.widget.MediaControlView2;
-import android.widget.TextView;
-import android.widget.VideoView2;
-
-import androidx.annotation.Nullable;
-
-import com.android.internal.graphics.palette.Palette;
-import com.android.media.RoutePlayer;
-import com.android.media.subtitle.ClosedCaptionRenderer;
-import com.android.media.subtitle.SubtitleController;
-import com.android.media.subtitle.SubtitleTrack;
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.media.MediaControlIntent;
-import com.android.support.mediarouter.media.MediaItemStatus;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Executor;
-
-public class VideoView2Impl extends BaseLayout
- implements VideoView2Provider, VideoViewInterface.SurfaceListener {
- private static final String TAG = "VideoView2";
- private static final boolean DEBUG = true; // STOPSHIP: Log.isLoggable(TAG, Log.DEBUG);
- private static final long DEFAULT_SHOW_CONTROLLER_INTERVAL_MS = 2000;
-
- private final VideoView2 mInstance;
-
- private static final int STATE_ERROR = -1;
- private static final int STATE_IDLE = 0;
- private static final int STATE_PREPARING = 1;
- private static final int STATE_PREPARED = 2;
- private static final int STATE_PLAYING = 3;
- private static final int STATE_PAUSED = 4;
- private static final int STATE_PLAYBACK_COMPLETED = 5;
-
- private static final int INVALID_TRACK_INDEX = -1;
- private static final float INVALID_SPEED = 0f;
-
- private static final int SIZE_TYPE_EMBEDDED = 0;
- private static final int SIZE_TYPE_FULL = 1;
- // TODO: add support for Minimal size type.
- private static final int SIZE_TYPE_MINIMAL = 2;
-
- private AccessibilityManager mAccessibilityManager;
- private AudioManager mAudioManager;
- private AudioAttributes mAudioAttributes;
- private int mAudioFocusType = AudioManager.AUDIOFOCUS_GAIN; // legacy focus gain
-
- private Pair<Executor, VideoView2.OnCustomActionListener> mCustomActionListenerRecord;
- private VideoView2.OnViewTypeChangedListener mViewTypeChangedListener;
- private VideoView2.OnFullScreenRequestListener mFullScreenRequestListener;
-
- private VideoViewInterface mCurrentView;
- private VideoTextureView mTextureView;
- private VideoSurfaceView mSurfaceView;
-
- private MediaPlayer2 mMediaPlayer;
- private DataSourceDesc mDsd;
- private MediaControlView2 mMediaControlView;
- private MediaSession mMediaSession;
- private MediaController mMediaController;
- private boolean mSeekable;
- private MediaMetadata2 mMediaMetadata;
- private MediaMetadataRetriever mRetriever;
- private boolean mNeedUpdateMediaType;
- private Bundle mMediaTypeData;
- private String mTitle;
-
- // TODO: move music view inside SurfaceView/TextureView or implement VideoViewInterface.
- private WindowManager mManager;
- private Resources mResources;
- private View mMusicView;
- private Drawable mMusicAlbumDrawable;
- private String mMusicTitleText;
- private String mMusicArtistText;
- private boolean mIsMusicMediaType;
- private int mPrevWidth;
- private int mPrevHeight;
- private int mDominantColor;
- private int mSizeType;
-
- private PlaybackState.Builder mStateBuilder;
- private List<PlaybackState.CustomAction> mCustomActionList;
- private int mTargetState = STATE_IDLE;
- private int mCurrentState = STATE_IDLE;
- private int mCurrentBufferPercentage;
- private long mSeekWhenPrepared; // recording the seek position while preparing
-
- private int mVideoWidth;
- private int mVideoHeight;
-
- private ArrayList<Integer> mVideoTrackIndices;
- private ArrayList<Integer> mAudioTrackIndices;
- private ArrayList<Pair<Integer, SubtitleTrack>> mSubtitleTrackIndices;
- private SubtitleController mSubtitleController;
-
- // selected video/audio/subtitle track index as MediaPlayer2 returns
- private int mSelectedVideoTrackIndex;
- private int mSelectedAudioTrackIndex;
- private int mSelectedSubtitleTrackIndex;
-
- private SubtitleView mSubtitleView;
- private boolean mSubtitleEnabled;
-
- private float mSpeed;
- // TODO: Remove mFallbackSpeed when integration with MediaPlayer2's new setPlaybackParams().
- // Refer: https://docs.google.com/document/d/1nzAfns6i2hJ3RkaUre3QMT6wsDedJ5ONLiA_OOBFFX8/edit
- private float mFallbackSpeed; // keep the original speed before 'pause' is called.
- private float mVolumeLevelFloat;
- private int mVolumeLevel;
-
- private long mShowControllerIntervalMs;
-
- private MediaRouter mMediaRouter;
- private MediaRouteSelector mRouteSelector;
- private MediaRouter.RouteInfo mRoute;
- private RoutePlayer mRoutePlayer;
-
- private final MediaRouter.Callback mRouterCallback = new MediaRouter.Callback() {
- @Override
- public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
- if (route.supportsControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
- // Stop local playback (if necessary)
- resetPlayer();
- mRoute = route;
- mRoutePlayer = new RoutePlayer(mInstance.getContext(), route);
- mRoutePlayer.setPlayerEventCallback(new RoutePlayer.PlayerEventCallback() {
- @Override
- public void onPlayerStateChanged(MediaItemStatus itemStatus) {
- PlaybackState.Builder psBuilder = new PlaybackState.Builder();
- psBuilder.setActions(RoutePlayer.PLAYBACK_ACTIONS);
- long position = itemStatus.getContentPosition();
- switch (itemStatus.getPlaybackState()) {
- case MediaItemStatus.PLAYBACK_STATE_PENDING:
- psBuilder.setState(PlaybackState.STATE_NONE, position, 0);
- mCurrentState = STATE_IDLE;
- break;
- case MediaItemStatus.PLAYBACK_STATE_PLAYING:
- psBuilder.setState(PlaybackState.STATE_PLAYING, position, 1);
- mCurrentState = STATE_PLAYING;
- break;
- case MediaItemStatus.PLAYBACK_STATE_PAUSED:
- psBuilder.setState(PlaybackState.STATE_PAUSED, position, 0);
- mCurrentState = STATE_PAUSED;
- break;
- case MediaItemStatus.PLAYBACK_STATE_BUFFERING:
- psBuilder.setState(PlaybackState.STATE_BUFFERING, position, 0);
- mCurrentState = STATE_PAUSED;
- break;
- case MediaItemStatus.PLAYBACK_STATE_FINISHED:
- psBuilder.setState(PlaybackState.STATE_STOPPED, position, 0);
- mCurrentState = STATE_PLAYBACK_COMPLETED;
- break;
- }
-
- PlaybackState pbState = psBuilder.build();
- mMediaSession.setPlaybackState(pbState);
-
- MediaMetadata.Builder mmBuilder = new MediaMetadata.Builder();
- mmBuilder.putLong(MediaMetadata.METADATA_KEY_DURATION,
- itemStatus.getContentDuration());
- mMediaSession.setMetadata(mmBuilder.build());
- }
- });
- // Start remote playback (if necessary)
- mRoutePlayer.openVideo(mDsd);
- }
- }
-
- @Override
- public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route, int reason) {
- if (mRoute != null && mRoutePlayer != null) {
- mRoutePlayer.release();
- mRoutePlayer = null;
- }
- if (mRoute == route) {
- mRoute = null;
- }
- if (reason != MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) {
- // TODO: Resume local playback (if necessary)
- openVideo(mDsd);
- }
- }
- };
-
- public VideoView2Impl(VideoView2 instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
- super(instance, superProvider, privateProvider);
- mInstance = instance;
- }
-
- @Override
- public void initialize(@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- mVideoWidth = 0;
- mVideoHeight = 0;
- mSpeed = 1.0f;
- mFallbackSpeed = mSpeed;
- mSelectedSubtitleTrackIndex = INVALID_TRACK_INDEX;
- mSeekable = true;
- // TODO: add attributes to get this value.
- mShowControllerIntervalMs = DEFAULT_SHOW_CONTROLLER_INTERVAL_MS;
-
- mAccessibilityManager = AccessibilityManager.getInstance(mInstance.getContext());
-
- mAudioManager = (AudioManager) mInstance.getContext()
- .getSystemService(Context.AUDIO_SERVICE);
- mAudioAttributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA)
- .setContentType(AudioAttributes.CONTENT_TYPE_MOVIE).build();
- mInstance.setFocusable(true);
- mInstance.setFocusableInTouchMode(true);
- mInstance.requestFocus();
-
- // TODO: try to keep a single child at a time rather than always having both.
- mTextureView = new VideoTextureView(mInstance.getContext());
- mSurfaceView = new VideoSurfaceView(mInstance.getContext());
- LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT);
- mTextureView.setLayoutParams(params);
- mSurfaceView.setLayoutParams(params);
- mTextureView.setSurfaceListener(this);
- mSurfaceView.setSurfaceListener(this);
- mInstance.addView(mTextureView);
- mInstance.addView(mSurfaceView);
-
- mSubtitleView = new SubtitleView(mInstance.getContext());
- mSubtitleView.setLayoutParams(params);
- mSubtitleView.setBackgroundColor(0);
- mInstance.addView(mSubtitleView);
-
- boolean enableControlView = (attrs == null) || attrs.getAttributeBooleanValue(
- "http://schemas.android.com/apk/res/android",
- "enableControlView", true);
- if (enableControlView) {
- mMediaControlView = new MediaControlView2(mInstance.getContext());
- }
-
- mSubtitleEnabled = (attrs == null) || attrs.getAttributeBooleanValue(
- "http://schemas.android.com/apk/res/android",
- "enableSubtitle", false);
-
- // TODO: Choose TextureView when SurfaceView cannot be created.
- // Choose surface view by default
- int viewType = (attrs == null) ? VideoView2.VIEW_TYPE_SURFACEVIEW
- : attrs.getAttributeIntValue(
- "http://schemas.android.com/apk/res/android",
- "viewType", VideoView2.VIEW_TYPE_SURFACEVIEW);
- if (viewType == VideoView2.VIEW_TYPE_SURFACEVIEW) {
- Log.d(TAG, "viewType attribute is surfaceView.");
- mTextureView.setVisibility(View.GONE);
- mSurfaceView.setVisibility(View.VISIBLE);
- mCurrentView = mSurfaceView;
- } else if (viewType == VideoView2.VIEW_TYPE_TEXTUREVIEW) {
- Log.d(TAG, "viewType attribute is textureView.");
- mTextureView.setVisibility(View.VISIBLE);
- mSurfaceView.setVisibility(View.GONE);
- mCurrentView = mTextureView;
- }
-
- MediaRouteSelector.Builder builder = new MediaRouteSelector.Builder();
- builder.addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- builder.addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO);
- builder.addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
- mRouteSelector = builder.build();
- }
-
- @Override
- public void setMediaControlView2_impl(MediaControlView2 mediaControlView, long intervalMs) {
- mMediaControlView = mediaControlView;
- mShowControllerIntervalMs = intervalMs;
- // TODO: Call MediaControlView2.setRouteSelector only when cast availalbe.
- ((MediaControlView2Impl) mMediaControlView.getProvider()).setRouteSelector(mRouteSelector);
-
- if (mInstance.isAttachedToWindow()) {
- attachMediaControlView();
- }
- }
-
- @Override
- public MediaController getMediaController_impl() {
- if (mMediaSession == null) {
- throw new IllegalStateException("MediaSession instance is not available.");
- }
- return mMediaController;
- }
-
- @Override
- public SessionToken2 getMediaSessionToken_impl() {
- // TODO: implement this
- return null;
- }
-
- @Override
- public MediaControlView2 getMediaControlView2_impl() {
- return mMediaControlView;
- }
-
- @Override
- public MediaMetadata2 getMediaMetadata_impl() {
- return mMediaMetadata;
- }
-
- @Override
- public void setMediaMetadata_impl(MediaMetadata2 metadata) {
- // TODO: integrate this with MediaSession2#MediaItem2
- mMediaMetadata = metadata;
-
- // TODO: add support for handling website link
- mMediaTypeData = new Bundle();
- boolean isAd = metadata == null ?
- false : metadata.getLong(MediaMetadata2.METADATA_KEY_ADVERTISEMENT) != 0;
- mMediaTypeData.putBoolean(
- MediaControlView2Impl.KEY_STATE_IS_ADVERTISEMENT, isAd);
-
- if (mMediaSession != null) {
- mMediaSession.sendSessionEvent(
- MediaControlView2Impl.EVENT_UPDATE_MEDIA_TYPE_STATUS, mMediaTypeData);
- } else {
- // Update later inside OnPreparedListener after MediaSession is initialized.
- mNeedUpdateMediaType = true;
- }
- }
-
- @Override
- public void setSubtitleEnabled_impl(boolean enable) {
- if (enable != mSubtitleEnabled) {
- selectOrDeselectSubtitle(enable);
- }
- mSubtitleEnabled = enable;
- }
-
- @Override
- public boolean isSubtitleEnabled_impl() {
- return mSubtitleEnabled;
- }
-
- // TODO: remove setSpeed_impl once MediaController2 is ready.
- @Override
- public void setSpeed_impl(float speed) {
- if (speed <= 0.0f) {
- Log.e(TAG, "Unsupported speed (" + speed + ") is ignored.");
- return;
- }
- mSpeed = speed;
- if (mMediaPlayer != null && mMediaPlayer.getState() == MediaPlayer2.PLAYER_STATE_PLAYING) {
- applySpeed();
- }
- updatePlaybackState();
- }
-
- @Override
- public void setAudioFocusRequest_impl(int focusGain) {
- if (focusGain != AudioManager.AUDIOFOCUS_NONE
- && focusGain != AudioManager.AUDIOFOCUS_GAIN
- && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT
- && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
- && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) {
- throw new IllegalArgumentException("Illegal audio focus type " + focusGain);
- }
- mAudioFocusType = focusGain;
- }
-
- @Override
- public void setAudioAttributes_impl(AudioAttributes attributes) {
- if (attributes == null) {
- throw new IllegalArgumentException("Illegal null AudioAttributes");
- }
- mAudioAttributes = attributes;
- }
-
- @Override
- public void setVideoPath_impl(String path) {
- mInstance.setVideoUri(Uri.parse(path));
- }
-
- @Override
- public void setVideoUri_impl(Uri uri) {
- mInstance.setVideoUri(uri, null);
- }
-
- @Override
- public void setVideoUri_impl(Uri uri, Map<String, String> headers) {
- DataSourceDesc.Builder builder = new DataSourceDesc.Builder();
- builder.setDataSource(mInstance.getContext(), uri, headers, null);
- mInstance.setDataSource(builder.build());
- }
-
- @Override
- public void setMediaItem_impl(MediaItem2 mediaItem) {
- // TODO: implement this
- }
-
- @Override
- public void setDataSource_impl(DataSourceDesc dsd) {
- mDsd = dsd;
- mSeekWhenPrepared = 0;
- openVideo(dsd);
- }
-
- @Override
- public void setViewType_impl(int viewType) {
- if (viewType == mCurrentView.getViewType()) {
- return;
- }
- VideoViewInterface targetView;
- if (viewType == VideoView2.VIEW_TYPE_TEXTUREVIEW) {
- Log.d(TAG, "switching to TextureView");
- targetView = mTextureView;
- } else if (viewType == VideoView2.VIEW_TYPE_SURFACEVIEW) {
- Log.d(TAG, "switching to SurfaceView");
- targetView = mSurfaceView;
- } else {
- throw new IllegalArgumentException("Unknown view type: " + viewType);
- }
- ((View) targetView).setVisibility(View.VISIBLE);
- targetView.takeOver(mCurrentView);
- mInstance.requestLayout();
- }
-
- @Override
- public int getViewType_impl() {
- return mCurrentView.getViewType();
- }
-
- @Override
- public void setCustomActions_impl(
- List<PlaybackState.CustomAction> actionList,
- Executor executor, VideoView2.OnCustomActionListener listener) {
- mCustomActionList = actionList;
- mCustomActionListenerRecord = new Pair<>(executor, listener);
-
- // Create a new playback builder in order to clear existing the custom actions.
- mStateBuilder = null;
- updatePlaybackState();
- }
-
- @Override
- public void setOnViewTypeChangedListener_impl(VideoView2.OnViewTypeChangedListener l) {
- mViewTypeChangedListener = l;
- }
-
- @Override
- public void setFullScreenRequestListener_impl(VideoView2.OnFullScreenRequestListener l) {
- mFullScreenRequestListener = l;
- }
-
- @Override
- public void onAttachedToWindow_impl() {
- super.onAttachedToWindow_impl();
-
- // Create MediaSession
- mMediaSession = new MediaSession(mInstance.getContext(), "VideoView2MediaSession");
- mMediaSession.setCallback(new MediaSessionCallback());
- mMediaSession.setActive(true);
- mMediaController = mMediaSession.getController();
- mMediaRouter = MediaRouter.getInstance(mInstance.getContext());
- mMediaRouter.setMediaSession(mMediaSession);
- mMediaRouter.addCallback(mRouteSelector, mRouterCallback);
- attachMediaControlView();
- // TODO: remove this after moving MediaSession creating code inside initializing VideoView2
- if (mCurrentState == STATE_PREPARED) {
- extractTracks();
- extractMetadata();
- extractAudioMetadata();
- if (mNeedUpdateMediaType) {
- mMediaSession.sendSessionEvent(
- MediaControlView2Impl.EVENT_UPDATE_MEDIA_TYPE_STATUS,
- mMediaTypeData);
- mNeedUpdateMediaType = false;
- }
- }
- }
-
- @Override
- public void onDetachedFromWindow_impl() {
- super.onDetachedFromWindow_impl();
-
- mMediaSession.release();
- mMediaSession = null;
- mMediaController = null;
- }
-
- @Override
- public CharSequence getAccessibilityClassName_impl() {
- return VideoView2.class.getName();
- }
-
- @Override
- public boolean onTouchEvent_impl(MotionEvent ev) {
- if (DEBUG) {
- Log.d(TAG, "onTouchEvent(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- if (ev.getAction() == MotionEvent.ACTION_UP && mMediaControlView != null) {
- if (!mIsMusicMediaType || mSizeType != SIZE_TYPE_FULL) {
- toggleMediaControlViewVisibility();
- }
- }
-
- return super.onTouchEvent_impl(ev);
- }
-
- @Override
- public boolean onTrackballEvent_impl(MotionEvent ev) {
- if (ev.getAction() == MotionEvent.ACTION_UP && mMediaControlView != null) {
- if (!mIsMusicMediaType || mSizeType != SIZE_TYPE_FULL) {
- toggleMediaControlViewVisibility();
- }
- }
-
- return super.onTrackballEvent_impl(ev);
- }
-
- @Override
- public boolean dispatchTouchEvent_impl(MotionEvent ev) {
- // TODO: Test touch event handling logic thoroughly and simplify the logic.
- return super.dispatchTouchEvent_impl(ev);
- }
-
- @Override
- public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure_impl(widthMeasureSpec, heightMeasureSpec);
-
- if (mIsMusicMediaType) {
- if (mPrevWidth != mInstance.getMeasuredWidth()
- || mPrevHeight != mInstance.getMeasuredHeight()) {
- int currWidth = mInstance.getMeasuredWidth();
- int currHeight = mInstance.getMeasuredHeight();
- Point screenSize = new Point();
- mManager.getDefaultDisplay().getSize(screenSize);
- int screenWidth = screenSize.x;
- int screenHeight = screenSize.y;
-
- if (currWidth == screenWidth && currHeight == screenHeight) {
- int orientation = retrieveOrientation();
- if (orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
- inflateMusicView(R.layout.full_landscape_music);
- } else {
- inflateMusicView(R.layout.full_portrait_music);
- }
-
- if (mSizeType != SIZE_TYPE_FULL) {
- mSizeType = SIZE_TYPE_FULL;
- // Remove existing mFadeOut callback
- mMediaControlView.removeCallbacks(mFadeOut);
- mMediaControlView.setVisibility(View.VISIBLE);
- }
- } else {
- if (mSizeType != SIZE_TYPE_EMBEDDED) {
- mSizeType = SIZE_TYPE_EMBEDDED;
- inflateMusicView(R.layout.embedded_music);
- // Add new mFadeOut callback
- mMediaControlView.postDelayed(mFadeOut, mShowControllerIntervalMs);
- }
- }
- mPrevWidth = currWidth;
- mPrevHeight = currHeight;
- }
- }
- }
-
- ///////////////////////////////////////////////////
- // Implements VideoViewInterface.SurfaceListener
- ///////////////////////////////////////////////////
-
- @Override
- public void onSurfaceCreated(View view, int width, int height) {
- if (DEBUG) {
- Log.d(TAG, "onSurfaceCreated(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState + ", width/height: " + width + "/" + height
- + ", " + view.toString());
- }
- if (needToStart()) {
- mMediaController.getTransportControls().play();
- }
- }
-
- @Override
- public void onSurfaceDestroyed(View view) {
- if (DEBUG) {
- Log.d(TAG, "onSurfaceDestroyed(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState + ", " + view.toString());
- }
- }
-
- @Override
- public void onSurfaceChanged(View view, int width, int height) {
- // TODO: Do we need to call requestLayout here?
- if (DEBUG) {
- Log.d(TAG, "onSurfaceChanged(). width/height: " + width + "/" + height
- + ", " + view.toString());
- }
- }
-
- @Override
- public void onSurfaceTakeOverDone(VideoViewInterface view) {
- if (DEBUG) {
- Log.d(TAG, "onSurfaceTakeOverDone(). Now current view is: " + view);
- }
- mCurrentView = view;
- if (mViewTypeChangedListener != null) {
- mViewTypeChangedListener.onViewTypeChanged(mInstance, view.getViewType());
- }
- if (needToStart()) {
- mMediaController.getTransportControls().play();
- }
- }
-
- ///////////////////////////////////////////////////
- // Protected or private methods
- ///////////////////////////////////////////////////
-
- private void attachMediaControlView() {
- // Get MediaController from MediaSession and set it inside MediaControlView
- mMediaControlView.setController(mMediaSession.getController());
-
- LayoutParams params =
- new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- mInstance.addView(mMediaControlView, params);
- }
-
- private boolean isInPlaybackState() {
- return (mMediaPlayer != null || mRoutePlayer != null)
- && mCurrentState != STATE_ERROR
- && mCurrentState != STATE_IDLE
- && mCurrentState != STATE_PREPARING;
- }
-
- private boolean needToStart() {
- return (mMediaPlayer != null || mRoutePlayer != null)
- && mCurrentState != STATE_PLAYING
- && mTargetState == STATE_PLAYING;
- }
-
- // Creates a MediaPlayer2 instance and prepare playback.
- private void openVideo(DataSourceDesc dsd) {
- Uri uri = dsd.getUri();
- Map<String, String> headers = dsd.getUriHeaders();
- resetPlayer();
- if (isRemotePlayback()) {
- mRoutePlayer.openVideo(dsd);
- return;
- }
- if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
- // TODO this should have a focus listener
- AudioFocusRequest focusRequest;
- focusRequest = new AudioFocusRequest.Builder(mAudioFocusType)
- .setAudioAttributes(mAudioAttributes)
- .build();
- mAudioManager.requestAudioFocus(focusRequest);
- }
-
- try {
- final Context context = mInstance.getContext();
-
- Log.d(TAG, "openVideo(): creating new MediaPlayer2 instance.");
- mMediaPlayer = new MediaPlayer2Impl(context);
- mSurfaceView.setMediaPlayer(mMediaPlayer);
- mTextureView.setMediaPlayer(mMediaPlayer);
- mCurrentView.assignSurfaceToMediaPlayer(mMediaPlayer);
-
- // TODO: Add timely firing logic for more accurate sync between CC and video frame
- mSubtitleController = new SubtitleController(context);
- mSubtitleController.registerRenderer(new ClosedCaptionRenderer(context));
- mSubtitleController.setAnchor((SubtitleController.Anchor) mSubtitleView);
- Executor executor = new Executor() {
- @Override
- public void execute(Runnable runnable) {
- runnable.run();
- }
- };
- mMediaPlayer.registerEventCallback(executor, mMediaPlayer2Callback);
-
- mCurrentBufferPercentage = -1;
- mMediaPlayer.setDataSource(dsd);
- mMediaPlayer.setAudioAttributes(mAudioAttributes);
- // we don't set the target state here either, but preserve the
- // target state that was there before.
- mCurrentState = STATE_PREPARING;
- mMediaPlayer.prepare();
-
- // Save file name as title since the file may not have a title Metadata.
- mTitle = uri.getPath();
- String scheme = uri.getScheme();
- if (scheme != null && scheme.equals("file")) {
- mTitle = uri.getLastPathSegment();
- }
- mRetriever = new MediaMetadataRetriever();
- mRetriever.setDataSource(mInstance.getContext(), uri);
-
- if (DEBUG) {
- Log.d(TAG, "openVideo(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- } catch (IllegalArgumentException ex) {
- Log.w(TAG, "Unable to open content: " + uri, ex);
- mCurrentState = STATE_ERROR;
- mTargetState = STATE_ERROR;
- mMediaPlayer2Callback.onError(mMediaPlayer, dsd,
- MediaPlayer2.MEDIA_ERROR_UNKNOWN, MediaPlayer2.MEDIA_ERROR_IO);
- }
- }
-
- /*
- * Reset the media player in any state
- */
- private void resetPlayer() {
- if (mMediaPlayer != null) {
- final MediaPlayer2 player = mMediaPlayer;
- new AsyncTask<MediaPlayer2, Void, Void>() {
- @Override
- protected Void doInBackground(MediaPlayer2... players) {
- // TODO: Fix NPE while MediaPlayer2.close()
- //players[0].close();
- return null;
- }
- }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, player);
- mMediaPlayer = null;
- mTextureView.setMediaPlayer(null);
- mSurfaceView.setMediaPlayer(null);
- //mPendingSubtitleTracks.clear();
- mCurrentState = STATE_IDLE;
- mTargetState = STATE_IDLE;
- if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
- mAudioManager.abandonAudioFocus(null);
- }
- }
- mVideoWidth = 0;
- mVideoHeight = 0;
- }
-
- private void updatePlaybackState() {
- if (mStateBuilder == null) {
- // Add Play action as default
- long playbackActions = PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE;
- if (mSeekable) {
- playbackActions |= (PlaybackState.ACTION_REWIND |
- PlaybackState.ACTION_FAST_FORWARD | PlaybackState.ACTION_SEEK_TO);
- }
- mStateBuilder = new PlaybackState.Builder();
- mStateBuilder.setActions(playbackActions);
-
- if (mCustomActionList != null) {
- for (PlaybackState.CustomAction action : mCustomActionList) {
- mStateBuilder.addCustomAction(action);
- }
- }
- }
- mStateBuilder.setState(getCorrespondingPlaybackState(),
- mMediaPlayer.getCurrentPosition(), mSpeed);
- if (mCurrentState != STATE_ERROR
- && mCurrentState != STATE_IDLE
- && mCurrentState != STATE_PREPARING) {
- // TODO: this should be replaced with MediaPlayer2.getBufferedPosition() once it is
- // implemented.
- if (mCurrentBufferPercentage == -1) {
- mStateBuilder.setBufferedPosition(-1);
- } else {
- mStateBuilder.setBufferedPosition(
- (long) (mCurrentBufferPercentage / 100.0 * mMediaPlayer.getDuration()));
- }
- }
-
- // Set PlaybackState for MediaSession
- if (mMediaSession != null) {
- PlaybackState state = mStateBuilder.build();
- mMediaSession.setPlaybackState(state);
- }
- }
-
- private int getCorrespondingPlaybackState() {
- switch (mCurrentState) {
- case STATE_ERROR:
- return PlaybackState.STATE_ERROR;
- case STATE_IDLE:
- return PlaybackState.STATE_NONE;
- case STATE_PREPARING:
- return PlaybackState.STATE_CONNECTING;
- case STATE_PREPARED:
- return PlaybackState.STATE_PAUSED;
- case STATE_PLAYING:
- return PlaybackState.STATE_PLAYING;
- case STATE_PAUSED:
- return PlaybackState.STATE_PAUSED;
- case STATE_PLAYBACK_COMPLETED:
- return PlaybackState.STATE_STOPPED;
- default:
- return -1;
- }
- }
-
- private final Runnable mFadeOut = new Runnable() {
- @Override
- public void run() {
- if (mCurrentState == STATE_PLAYING) {
- mMediaControlView.setVisibility(View.GONE);
- }
- }
- };
-
- private void showController() {
- // TODO: Decide what to show when the state is not in playback state
- if (mMediaControlView == null || !isInPlaybackState()
- || (mIsMusicMediaType && mSizeType == SIZE_TYPE_FULL)) {
- return;
- }
- mMediaControlView.removeCallbacks(mFadeOut);
- mMediaControlView.setVisibility(View.VISIBLE);
- if (mShowControllerIntervalMs != 0
- && !mAccessibilityManager.isTouchExplorationEnabled()) {
- mMediaControlView.postDelayed(mFadeOut, mShowControllerIntervalMs);
- }
- }
-
- private void toggleMediaControlViewVisibility() {
- if (mMediaControlView.getVisibility() == View.VISIBLE) {
- mMediaControlView.removeCallbacks(mFadeOut);
- mMediaControlView.setVisibility(View.GONE);
- } else {
- showController();
- }
- }
-
- private void applySpeed() {
- PlaybackParams params = mMediaPlayer.getPlaybackParams().allowDefaults();
- if (mSpeed != params.getSpeed()) {
- try {
- params.setSpeed(mSpeed);
- mMediaPlayer.setPlaybackParams(params);
- mFallbackSpeed = mSpeed;
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "PlaybackParams has unsupported value: " + e);
- // TODO: should revise this part after integrating with MP2.
- // If mSpeed had an illegal value for speed rate, system will determine best
- // handling (see PlaybackParams.AUDIO_FALLBACK_MODE_DEFAULT).
- // Note: The pre-MP2 returns 0.0f when it is paused. In this case, VideoView2 will
- // use mFallbackSpeed instead.
- float fallbackSpeed = mMediaPlayer.getPlaybackParams().allowDefaults().getSpeed();
- if (fallbackSpeed > 0.0f) {
- mFallbackSpeed = fallbackSpeed;
- }
- mSpeed = mFallbackSpeed;
- }
- }
- }
-
- private boolean isRemotePlayback() {
- if (mMediaController == null) {
- return false;
- }
- PlaybackInfo playbackInfo = mMediaController.getPlaybackInfo();
- return playbackInfo != null
- && playbackInfo.getPlaybackType() == PlaybackInfo.PLAYBACK_TYPE_REMOTE;
- }
-
- private void selectOrDeselectSubtitle(boolean select) {
- if (!isInPlaybackState()) {
- return;
- }
- if (select) {
- if (mSubtitleTrackIndices.size() > 0) {
- // TODO: make this selection dynamic
- mSelectedSubtitleTrackIndex = mSubtitleTrackIndices.get(0).first;
- mSubtitleController.selectTrack(mSubtitleTrackIndices.get(0).second);
- mMediaPlayer.selectTrack(mSelectedSubtitleTrackIndex);
- mSubtitleView.setVisibility(View.VISIBLE);
- }
- } else {
- if (mSelectedSubtitleTrackIndex != INVALID_TRACK_INDEX) {
- mMediaPlayer.deselectTrack(mSelectedSubtitleTrackIndex);
- mSelectedSubtitleTrackIndex = INVALID_TRACK_INDEX;
- mSubtitleView.setVisibility(View.GONE);
- }
- }
- }
-
- private void extractTracks() {
- List<MediaPlayer2.TrackInfo> trackInfos = mMediaPlayer.getTrackInfo();
- mVideoTrackIndices = new ArrayList<>();
- mAudioTrackIndices = new ArrayList<>();
- mSubtitleTrackIndices = new ArrayList<>();
- mSubtitleController.reset();
- for (int i = 0; i < trackInfos.size(); ++i) {
- int trackType = trackInfos.get(i).getTrackType();
- if (trackType == MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_VIDEO) {
- mVideoTrackIndices.add(i);
- } else if (trackType == MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_AUDIO) {
- mAudioTrackIndices.add(i);
- } else if (trackType == MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE
- || trackType == MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {
- SubtitleTrack track = mSubtitleController.addTrack(trackInfos.get(i).getFormat());
- if (track != null) {
- mSubtitleTrackIndices.add(new Pair<>(i, track));
- }
- }
- }
- // Select first tracks as default
- if (mVideoTrackIndices.size() > 0) {
- mSelectedVideoTrackIndex = 0;
- }
- if (mAudioTrackIndices.size() > 0) {
- mSelectedAudioTrackIndex = 0;
- }
- if (mVideoTrackIndices.size() == 0 && mAudioTrackIndices.size() > 0) {
- mIsMusicMediaType = true;
- }
-
- Bundle data = new Bundle();
- data.putInt(MediaControlView2Impl.KEY_VIDEO_TRACK_COUNT, mVideoTrackIndices.size());
- data.putInt(MediaControlView2Impl.KEY_AUDIO_TRACK_COUNT, mAudioTrackIndices.size());
- data.putInt(MediaControlView2Impl.KEY_SUBTITLE_TRACK_COUNT, mSubtitleTrackIndices.size());
- if (mSubtitleTrackIndices.size() > 0) {
- selectOrDeselectSubtitle(mSubtitleEnabled);
- }
- mMediaSession.sendSessionEvent(MediaControlView2Impl.EVENT_UPDATE_TRACK_STATUS, data);
- }
-
- private void extractMetadata() {
- // Get and set duration and title values as MediaMetadata for MediaControlView2
- MediaMetadata.Builder builder = new MediaMetadata.Builder();
- builder.putString(MediaMetadata.METADATA_KEY_TITLE, mTitle);
- builder.putLong(
- MediaMetadata.METADATA_KEY_DURATION, mMediaPlayer.getDuration());
-
- if (mMediaSession != null) {
- mMediaSession.setMetadata(builder.build());
- }
- }
-
- private void extractAudioMetadata() {
- if (!mIsMusicMediaType) {
- return;
- }
-
- mResources = ApiHelper.getLibResources(mInstance.getContext());
- mManager = (WindowManager) mInstance.getContext().getApplicationContext()
- .getSystemService(Context.WINDOW_SERVICE);
-
- byte[] album = mRetriever.getEmbeddedPicture();
- if (album != null) {
- Bitmap bitmap = BitmapFactory.decodeByteArray(album, 0, album.length);
- mMusicAlbumDrawable = new BitmapDrawable(bitmap);
-
- // TODO: replace with visualizer
- Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
- public void onGenerated(Palette palette) {
- // TODO: add dominant color for default album image.
- mDominantColor = palette.getDominantColor(0);
- if (mMusicView != null) {
- mMusicView.setBackgroundColor(mDominantColor);
- }
- }
- });
- } else {
- mMusicAlbumDrawable = mResources.getDrawable(R.drawable.ic_default_album_image);
- }
-
- String title = mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
- if (title != null) {
- mMusicTitleText = title;
- } else {
- mMusicTitleText = mResources.getString(R.string.mcv2_music_title_unknown_text);
- }
-
- String artist = mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
- if (artist != null) {
- mMusicArtistText = artist;
- } else {
- mMusicArtistText = mResources.getString(R.string.mcv2_music_artist_unknown_text);
- }
-
- // Send title and artist string to MediaControlView2
- MediaMetadata.Builder builder = new MediaMetadata.Builder();
- builder.putString(MediaMetadata.METADATA_KEY_TITLE, mMusicTitleText);
- builder.putString(MediaMetadata.METADATA_KEY_ARTIST, mMusicArtistText);
- mMediaSession.setMetadata(builder.build());
-
- // Display Embedded mode as default
- mInstance.removeView(mSurfaceView);
- mInstance.removeView(mTextureView);
- inflateMusicView(R.layout.embedded_music);
- }
-
- private int retrieveOrientation() {
- DisplayMetrics dm = Resources.getSystem().getDisplayMetrics();
- int width = dm.widthPixels;
- int height = dm.heightPixels;
-
- return (height > width) ?
- ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
- ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
- }
-
- private void inflateMusicView(int layoutId) {
- mInstance.removeView(mMusicView);
-
- View v = ApiHelper.inflateLibLayout(mInstance.getContext(), layoutId);
- v.setBackgroundColor(mDominantColor);
-
- ImageView albumView = v.findViewById(R.id.album);
- if (albumView != null) {
- albumView.setImageDrawable(mMusicAlbumDrawable);
- }
-
- TextView titleView = v.findViewById(R.id.title);
- if (titleView != null) {
- titleView.setText(mMusicTitleText);
- }
-
- TextView artistView = v.findViewById(R.id.artist);
- if (artistView != null) {
- artistView.setText(mMusicArtistText);
- }
-
- mMusicView = v;
- mInstance.addView(mMusicView, 0);
- }
-
- EventCallback mMediaPlayer2Callback =
- new EventCallback() {
- @Override
- public void onSubtitleData(MediaPlayer2 mp, DataSourceDesc dsd, SubtitleData data) {
- if (DEBUG) {
- Log.d(TAG, "onSubtitleData(): getTrackIndex: " + data.getTrackIndex()
- + ", getCurrentPosition: " + mp.getCurrentPosition()
- + ", getStartTimeUs(): " + data.getStartTimeUs()
- + ", diff: "
- + (data.getStartTimeUs()/1000 - mp.getCurrentPosition())
- + "ms, getDurationUs(): " + data.getDurationUs()
- );
-
- }
- final int index = data.getTrackIndex();
- if (index != mSelectedSubtitleTrackIndex) {
- Log.d(TAG, "onSubtitleData(): getTrackIndex: " + data.getTrackIndex()
- + ", selected track index: " + mSelectedSubtitleTrackIndex);
- return;
- }
- for (Pair<Integer, SubtitleTrack> p : mSubtitleTrackIndices) {
- if (p.first == index) {
- SubtitleTrack track = p.second;
- track.onData(data);
- }
- }
- }
-
- @Override
- public void onVideoSizeChanged(
- MediaPlayer2 mp, DataSourceDesc dsd, VideoSize size) {
- if (DEBUG) {
- Log.d(TAG, "onVideoSizeChanged(): size: " + size.getWidth() + "/"
- + size.getHeight());
- }
- mVideoWidth = mp.getVideoSize().getWidth();
- mVideoHeight = mp.getVideoSize().getHeight();
- if (DEBUG) {
- Log.d(TAG, "onVideoSizeChanged(): mVideoSize:" + mVideoWidth + "/"
- + mVideoHeight);
- }
- if (mVideoWidth != 0 && mVideoHeight != 0) {
- mInstance.requestLayout();
- }
- }
-
- // TODO: Remove timed text related code later once relevant Renderer is defined.
- // This is just for debugging purpose.
- @Override
- public void onTimedText(
- MediaPlayer2 mp, DataSourceDesc dsd, TimedText text) {
- Log.d(TAG, "TimedText: " + text.getText());
- }
-
- @Override
- public void onInfo(
- MediaPlayer2 mp, DataSourceDesc dsd, int what, int extra) {
- if (what == MediaPlayer2.MEDIA_INFO_METADATA_UPDATE) {
- extractTracks();
- } else if (what == MediaPlayer2.MEDIA_INFO_PREPARED) {
- this.onPrepared(mp, dsd);
- } else if (what == MediaPlayer2.MEDIA_INFO_DATA_SOURCE_END) {
- this.onCompletion(mp, dsd);
- } else if (what == MediaPlayer2.MEDIA_INFO_BUFFERING_UPDATE) {
- this.onBufferingUpdate(mp, dsd, extra);
- } else if (what == MediaPlayer2.MEDIA_INFO_NOT_SEEKABLE) {
- mSeekable = false;
- }
- }
-
- @Override
- public void onError(
- MediaPlayer2 mp, DataSourceDesc dsd, int frameworkErr, int implErr) {
- if (DEBUG) {
- Log.d(TAG, "Error: " + frameworkErr + "," + implErr);
- }
- mCurrentState = STATE_ERROR;
- mTargetState = STATE_ERROR;
- mSeekable = true;
- updatePlaybackState();
-
- if (mMediaControlView != null) {
- mMediaControlView.setVisibility(View.GONE);
- }
- }
-
- @Override
- public void onCallCompleted(MediaPlayer2 mp, DataSourceDesc dsd, int what,
- int status) {
- if (what == MediaPlayer2.CALL_COMPLETED_SEEK_TO && status == 0) {
- updatePlaybackState();
- }
- }
-
- private void onPrepared(MediaPlayer2 mp, DataSourceDesc dsd) {
- if (DEBUG) {
- Log.d(TAG, "OnPreparedListener(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- mCurrentState = STATE_PREPARED;
- // Create and set playback state for MediaControlView2
- updatePlaybackState();
-
- // TODO: change this to send TrackInfos to MediaControlView2
- // TODO: create MediaSession when initializing VideoView2
- if (mMediaSession != null) {
- extractTracks();
- extractMetadata();
- extractAudioMetadata();
- }
-
- if (mMediaControlView != null) {
- mMediaControlView.setEnabled(true);
- }
- int videoWidth = mp.getVideoSize().getWidth();
- int videoHeight = mp.getVideoSize().getHeight();
-
- // mSeekWhenPrepared may be changed after seekTo() call
- long seekToPosition = mSeekWhenPrepared;
- if (seekToPosition != 0) {
- mMediaController.getTransportControls().seekTo(seekToPosition);
- }
-
- if (videoWidth != 0 && videoHeight != 0) {
- if (videoWidth != mVideoWidth || videoHeight != mVideoHeight) {
- if (DEBUG) {
- Log.i(TAG, "OnPreparedListener() : ");
- Log.i(TAG, " video size: " + videoWidth + "/" + videoHeight);
- Log.i(TAG, " measuredSize: " + mInstance.getMeasuredWidth() + "/"
- + mInstance.getMeasuredHeight());
- Log.i(TAG, " viewSize: " + mInstance.getWidth() + "/"
- + mInstance.getHeight());
- }
- mVideoWidth = videoWidth;
- mVideoHeight = videoHeight;
- mInstance.requestLayout();
- }
-
- if (needToStart()) {
- mMediaController.getTransportControls().play();
- }
- } else {
- // We don't know the video size yet, but should start anyway.
- // The video size might be reported to us later.
- if (needToStart()) {
- mMediaController.getTransportControls().play();
- }
- }
- }
-
- private void onCompletion(MediaPlayer2 mp, DataSourceDesc dsd) {
- mCurrentState = STATE_PLAYBACK_COMPLETED;
- mTargetState = STATE_PLAYBACK_COMPLETED;
- mSeekable = true;
- updatePlaybackState();
- if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
- mAudioManager.abandonAudioFocus(null);
- }
- }
-
- private void onBufferingUpdate(MediaPlayer2 mp, DataSourceDesc dsd, int percent) {
- mCurrentBufferPercentage = percent;
- updatePlaybackState();
- }
- };
-
- private class MediaSessionCallback extends MediaSession.Callback {
- @Override
- public void onCommand(String command, Bundle args, ResultReceiver receiver) {
- if (isRemotePlayback()) {
- mRoutePlayer.onCommand(command, args, receiver);
- } else {
- switch (command) {
- case MediaControlView2Impl.COMMAND_SHOW_SUBTITLE:
- int subtitleIndex = args.getInt(
- MediaControlView2Impl.KEY_SELECTED_SUBTITLE_INDEX,
- INVALID_TRACK_INDEX);
- if (subtitleIndex != INVALID_TRACK_INDEX) {
- int subtitleTrackIndex = mSubtitleTrackIndices.get(subtitleIndex).first;
- if (subtitleTrackIndex != mSelectedSubtitleTrackIndex) {
- mSelectedSubtitleTrackIndex = subtitleTrackIndex;
- mInstance.setSubtitleEnabled(true);
- }
- }
- break;
- case MediaControlView2Impl.COMMAND_HIDE_SUBTITLE:
- mInstance.setSubtitleEnabled(false);
- break;
- case MediaControlView2Impl.COMMAND_SET_FULLSCREEN:
- if (mFullScreenRequestListener != null) {
- mFullScreenRequestListener.onFullScreenRequest(
- mInstance,
- args.getBoolean(MediaControlView2Impl.ARGUMENT_KEY_FULLSCREEN));
- }
- break;
- case MediaControlView2Impl.COMMAND_SELECT_AUDIO_TRACK:
- int audioIndex = args.getInt(MediaControlView2Impl.KEY_SELECTED_AUDIO_INDEX,
- INVALID_TRACK_INDEX);
- if (audioIndex != INVALID_TRACK_INDEX) {
- int audioTrackIndex = mAudioTrackIndices.get(audioIndex);
- if (audioTrackIndex != mSelectedAudioTrackIndex) {
- mSelectedAudioTrackIndex = audioTrackIndex;
- mMediaPlayer.selectTrack(mSelectedAudioTrackIndex);
- }
- }
- break;
- case MediaControlView2Impl.COMMAND_SET_PLAYBACK_SPEED:
- float speed = args.getFloat(
- MediaControlView2Impl.KEY_PLAYBACK_SPEED, INVALID_SPEED);
- if (speed != INVALID_SPEED && speed != mSpeed) {
- mInstance.setSpeed(speed);
- mSpeed = speed;
- }
- break;
- case MediaControlView2Impl.COMMAND_MUTE:
- mVolumeLevel = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
- mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
- break;
- case MediaControlView2Impl.COMMAND_UNMUTE:
- mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mVolumeLevel, 0);
- break;
- }
- }
- showController();
- }
-
- @Override
- public void onCustomAction(String action, Bundle extras) {
- mCustomActionListenerRecord.first.execute(() ->
- mCustomActionListenerRecord.second.onCustomAction(action, extras));
- showController();
- }
-
- @Override
- public void onPlay() {
- if (isInPlaybackState() && (mCurrentView.hasAvailableSurface() || mIsMusicMediaType)) {
- if (isRemotePlayback()) {
- mRoutePlayer.onPlay();
- } else {
- applySpeed();
- mMediaPlayer.play();
- mCurrentState = STATE_PLAYING;
- updatePlaybackState();
- }
- mCurrentState = STATE_PLAYING;
- }
- mTargetState = STATE_PLAYING;
- if (DEBUG) {
- Log.d(TAG, "onPlay(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- showController();
- }
-
- @Override
- public void onPause() {
- if (isInPlaybackState()) {
- if (isRemotePlayback()) {
- mRoutePlayer.onPause();
- mCurrentState = STATE_PAUSED;
- } else if (mMediaPlayer.getState() == MediaPlayer2.PLAYER_STATE_PLAYING) {
- mMediaPlayer.pause();
- mCurrentState = STATE_PAUSED;
- updatePlaybackState();
- }
- }
- mTargetState = STATE_PAUSED;
- if (DEBUG) {
- Log.d(TAG, "onPause(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- showController();
- }
-
- @Override
- public void onSeekTo(long pos) {
- if (isInPlaybackState()) {
- if (isRemotePlayback()) {
- mRoutePlayer.onSeekTo(pos);
- } else {
- mMediaPlayer.seekTo(pos, MediaPlayer2.SEEK_PREVIOUS_SYNC);
- mSeekWhenPrepared = 0;
- }
- } else {
- mSeekWhenPrepared = pos;
- }
- showController();
- }
-
- @Override
- public void onStop() {
- if (isRemotePlayback()) {
- mRoutePlayer.onStop();
- } else {
- resetPlayer();
- }
- showController();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/VideoViewInterface.java b/packages/MediaComponents/src/com/android/widget/VideoViewInterface.java
deleted file mode 100644
index 854d47e..0000000
--- a/packages/MediaComponents/src/com/android/widget/VideoViewInterface.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.annotation.NonNull;
-import android.media.MediaPlayer2;
-import android.view.View;
-
-interface VideoViewInterface {
- /**
- * Assigns the view's surface to the given MediaPlayer2 instance.
- *
- * @param mp MediaPlayer2
- * @return true if the surface is successfully assigned, false if not. It will fail to assign
- * if any of MediaPlayer2 or surface is unavailable.
- */
- boolean assignSurfaceToMediaPlayer(MediaPlayer2 mp);
- void setSurfaceListener(SurfaceListener l);
- int getViewType();
- void setMediaPlayer(MediaPlayer2 mp);
-
- /**
- * Takes over oldView. It means that the MediaPlayer2 will start rendering on this view.
- * The visibility of oldView will be set as {@link View.GONE}. If the view doesn't have a
- * MediaPlayer2 instance or its surface is not available, the actual execution is deferred until
- * a MediaPlayer2 instance is set by {@link #setMediaPlayer} or its surface becomes available.
- * {@link SurfaceListener.onSurfaceTakeOverDone} will be called when the actual execution is
- * done.
- *
- * @param oldView The view that MediaPlayer2 is currently rendering on.
- */
- void takeOver(@NonNull VideoViewInterface oldView);
-
- /**
- * Indicates if the view's surface is available.
- *
- * @return true if the surface is available.
- */
- boolean hasAvailableSurface();
-
- /**
- * An instance of VideoViewInterface calls these surface notification methods accordingly if
- * a listener has been registered via {@link #setSurfaceListener(SurfaceListener)}.
- */
- interface SurfaceListener {
- void onSurfaceCreated(View view, int width, int height);
- void onSurfaceDestroyed(View view);
- void onSurfaceChanged(View view, int width, int height);
- void onSurfaceTakeOverDone(VideoViewInterface view);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/ViewGroupImpl.java b/packages/MediaComponents/src/com/android/widget/ViewGroupImpl.java
deleted file mode 100644
index 5a06826..0000000
--- a/packages/MediaComponents/src/com/android/widget/ViewGroupImpl.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.media.update.ViewGroupProvider;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-public abstract class ViewGroupImpl implements ViewGroupProvider {
- private final ViewGroupProvider mSuperProvider;
-
- public ViewGroupImpl(ViewGroup instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
- mSuperProvider = superProvider;
- }
-
- @Override
- public void onAttachedToWindow_impl() {
- mSuperProvider.onAttachedToWindow_impl();
- }
-
- @Override
- public void onDetachedFromWindow_impl() {
- mSuperProvider.onDetachedFromWindow_impl();
- }
-
- @Override
- public CharSequence getAccessibilityClassName_impl() {
- return mSuperProvider.getAccessibilityClassName_impl();
- }
-
- @Override
- public boolean onTouchEvent_impl(MotionEvent ev) {
- return mSuperProvider.onTouchEvent_impl(ev);
- }
-
- @Override
- public boolean onTrackballEvent_impl(MotionEvent ev) {
- return mSuperProvider.onTrackballEvent_impl(ev);
- }
-
- @Override
- public void onFinishInflate_impl() {
- mSuperProvider.onFinishInflate_impl();
- }
-
- @Override
- public void setEnabled_impl(boolean enabled) {
- mSuperProvider.setEnabled_impl(enabled);
- }
-
- @Override
- public void onVisibilityAggregated_impl(boolean isVisible) {
- mSuperProvider.onVisibilityAggregated_impl(isVisible);
- }
-
- @Override
- public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
- mSuperProvider.onLayout_impl(changed, left, top, right, bottom);
- }
-
- @Override
- public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
- mSuperProvider.onMeasure_impl(widthMeasureSpec, heightMeasureSpec);
- }
-
- @Override
- public int getSuggestedMinimumWidth_impl() {
- return mSuperProvider.getSuggestedMinimumWidth_impl();
- }
-
- @Override
- public int getSuggestedMinimumHeight_impl() {
- return mSuperProvider.getSuggestedMinimumHeight_impl();
- }
-
- @Override
- public void setMeasuredDimension_impl(int measuredWidth, int measuredHeight) {
- mSuperProvider.setMeasuredDimension_impl(measuredWidth, measuredHeight);
- }
-
- @Override
- public boolean dispatchTouchEvent_impl(MotionEvent ev) {
- return mSuperProvider.dispatchTouchEvent_impl(ev);
- }
-
- @Override
- public boolean checkLayoutParams_impl(ViewGroup.LayoutParams p) {
- return mSuperProvider.checkLayoutParams_impl(p);
- }
-
- @Override
- public ViewGroup.LayoutParams generateDefaultLayoutParams_impl() {
- return mSuperProvider.generateDefaultLayoutParams_impl();
- }
-
- @Override
- public ViewGroup.LayoutParams generateLayoutParams_impl(AttributeSet attrs) {
- return mSuperProvider.generateLayoutParams_impl(attrs);
- }
-
- @Override
- public ViewGroup.LayoutParams generateLayoutParams_impl(ViewGroup.LayoutParams lp) {
- return mSuperProvider.generateLayoutParams_impl(lp);
- }
-
- @Override
- public boolean shouldDelayChildPressedState_impl() {
- return mSuperProvider.shouldDelayChildPressedState_impl();
- }
-
- @Override
- public void measureChildWithMargins_impl(View child,
- int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) {
- mSuperProvider.measureChildWithMargins_impl(child,
- parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
- }
-}
diff --git a/packages/MediaComponents/tests/Android.mk b/packages/MediaComponents/tests/Android.mk
deleted file mode 100644
index dddfd2a..0000000
--- a/packages/MediaComponents/tests/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android.test.runner.stubs \
- android.test.base.stubs \
- mockito-target-minus-junit4 \
- junit
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := MediaComponentsTest
-
-LOCAL_INSTRUMENTATION_FOR := MediaComponents
-
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_CERTIFICATE := platform
-
-include $(BUILD_PACKAGE)
diff --git a/packages/MediaComponents/tests/AndroidManifest.xml b/packages/MediaComponents/tests/AndroidManifest.xml
deleted file mode 100644
index 7255265..0000000
--- a/packages/MediaComponents/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.media.tests">
-
- <application android:label="Media API Test">
- <uses-library android:name="android.test.runner" />
- </application>
-
- <!--
- To run the tests use the command:
- "adb shell am instrument -w com.android.media.tests/android.test.InstrumentationTestRunner"
- -->
- <instrumentation
- android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.android.media.update"
- android:label="Media API test" />
-
-</manifest>
diff --git a/packages/MediaComponents/tests/src/com/android/media/SessionPlaylistAgentTest.java b/packages/MediaComponents/tests/src/com/android/media/SessionPlaylistAgentTest.java
deleted file mode 100644
index beb0848..0000000
--- a/packages/MediaComponents/tests/src/com/android/media/SessionPlaylistAgentTest.java
+++ /dev/null
@@ -1,642 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import static org.mockito.Mockito.*;
-
-import android.content.Context;
-import android.media.AudioAttributes;
-import android.media.DataSourceDesc;
-import android.media.MediaItem2;
-import android.media.MediaMetadata2;
-import android.media.MediaPlayerBase;
-import android.media.MediaPlayerBase.PlayerEventCallback;
-import android.media.MediaPlaylistAgent;
-import android.media.MediaSession2;
-import android.media.MediaSession2.OnDataSourceMissingHelper;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.test.AndroidTestCase;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Matchers;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * Tests {@link SessionPlaylistAgent}.
- */
-public class SessionPlaylistAgentTest extends AndroidTestCase {
- private static final String TAG = "SessionPlaylistAgentTest";
- private static final int WAIT_TIME_MS = 1000;
- private static final int INVALID_REPEAT_MODE = -100;
- private static final int INVALID_SHUFFLE_MODE = -100;
-
- private Handler mHandler;
- private Executor mHandlerExecutor;
-
- private Object mWaitLock = new Object();
- private Context mContext;
- private MediaSession2Impl mSessionImpl;
- private MediaPlayerBase mPlayer;
- private PlayerEventCallback mPlayerEventCallback;
- private SessionPlaylistAgent mAgent;
- private OnDataSourceMissingHelper mDataSourceHelper;
- private MyPlaylistEventCallback mEventCallback;
-
- public class MyPlaylistEventCallback extends MediaPlaylistAgent.PlaylistEventCallback {
- boolean onPlaylistChangedCalled;
- boolean onPlaylistMetadataChangedCalled;
- boolean onRepeatModeChangedCalled;
- boolean onShuffleModeChangedCalled;
-
- private Object mWaitLock;
-
- public MyPlaylistEventCallback(Object waitLock) {
- mWaitLock = waitLock;
- }
-
- public void clear() {
- onPlaylistChangedCalled = false;
- onPlaylistMetadataChangedCalled = false;
- onRepeatModeChangedCalled = false;
- onShuffleModeChangedCalled = false;
- }
-
- public void onPlaylistChanged(MediaPlaylistAgent playlistAgent, List<MediaItem2> list,
- MediaMetadata2 metadata) {
- synchronized (mWaitLock) {
- onPlaylistChangedCalled = true;
- mWaitLock.notify();
- }
- }
-
- public void onPlaylistMetadataChanged(MediaPlaylistAgent playlistAgent,
- MediaMetadata2 metadata) {
- synchronized (mWaitLock) {
- onPlaylistMetadataChangedCalled = true;
- mWaitLock.notify();
- }
- }
-
- public void onRepeatModeChanged(MediaPlaylistAgent playlistAgent, int repeatMode) {
- synchronized (mWaitLock) {
- onRepeatModeChangedCalled = true;
- mWaitLock.notify();
- }
- }
-
- public void onShuffleModeChanged(MediaPlaylistAgent playlistAgent, int shuffleMode) {
- synchronized (mWaitLock) {
- onShuffleModeChangedCalled = true;
- mWaitLock.notify();
- }
- }
- }
-
- public class MyDataSourceHelper implements OnDataSourceMissingHelper {
- @Override
- public DataSourceDesc onDataSourceMissing(MediaSession2 session, MediaItem2 item) {
- if (item.getMediaId().contains("WITHOUT_DSD")) {
- return null;
- }
- return new DataSourceDesc.Builder()
- .setDataSource(getContext(), Uri.parse("dsd://test"))
- .setMediaId(item.getMediaId())
- .build();
- }
- }
-
- public class MockPlayer extends MediaPlayerBase {
- @Override
- public void play() {
- }
-
- @Override
- public void prepare() {
- }
-
- @Override
- public void pause() {
- }
-
- @Override
- public void reset() {
- }
-
- @Override
- public void skipToNext() {
- }
-
- @Override
- public void seekTo(long pos) {
- }
-
- @Override
- public int getPlayerState() {
- return 0;
- }
-
- @Override
- public int getBufferingState() {
- return 0;
- }
-
- @Override
- public void setAudioAttributes(AudioAttributes attributes) {
- }
-
- @Override
- public AudioAttributes getAudioAttributes() {
- return null;
- }
-
- @Override
- public void setDataSource(DataSourceDesc dsd) {
- }
-
- @Override
- public void setNextDataSource(DataSourceDesc dsd) {
- }
-
- @Override
- public void setNextDataSources(List<DataSourceDesc> dsds) {
- }
-
- @Override
- public DataSourceDesc getCurrentDataSource() {
- return null;
- }
-
- @Override
- public void loopCurrent(boolean loop) {
- }
-
- @Override
- public void setPlaybackSpeed(float speed) {
- }
-
- @Override
- public void setPlayerVolume(float volume) {
- }
-
- @Override
- public float getPlayerVolume() {
- return 0;
- }
-
- @Override
- public void registerPlayerEventCallback(Executor e, PlayerEventCallback cb) {
- }
-
- @Override
- public void unregisterPlayerEventCallback(PlayerEventCallback cb) {
- }
-
- @Override
- public void close() throws Exception {
- }
- }
-
- @Before
- public void setUp() throws Exception {
- mContext = getContext();
- // Workaround for dexmaker bug: https://code.google.com/p/dexmaker/issues/detail?id=2
- // Dexmaker is used by mockito.
- System.setProperty("dexmaker.dexcache", mContext.getCacheDir().getPath());
-
- HandlerThread handlerThread = new HandlerThread("SessionPlaylistAgent");
- handlerThread.start();
- mHandler = new Handler(handlerThread.getLooper());
- mHandlerExecutor = (runnable) -> {
- mHandler.post(runnable);
- };
-
- mPlayer = mock(MockPlayer.class);
- doAnswer(invocation -> {
- Object[] args = invocation.getArguments();
- mPlayerEventCallback = (PlayerEventCallback) args[1];
- return null;
- }).when(mPlayer).registerPlayerEventCallback(Matchers.any(), Matchers.any());
-
- mSessionImpl = mock(MediaSession2Impl.class);
- mDataSourceHelper = new MyDataSourceHelper();
- mAgent = new SessionPlaylistAgent(mSessionImpl, mPlayer);
- mAgent.setOnDataSourceMissingHelper(mDataSourceHelper);
- mEventCallback = new MyPlaylistEventCallback(mWaitLock);
- mAgent.registerPlaylistEventCallback(mHandlerExecutor, mEventCallback);
- }
-
- @After
- public void tearDown() throws Exception {
- mHandler.getLooper().quitSafely();
- mHandler = null;
- mHandlerExecutor = null;
- }
-
- @Test
- public void testSetAndGetShuflleMode() throws Exception {
- int shuffleMode = mAgent.getShuffleMode();
- if (shuffleMode != MediaPlaylistAgent.SHUFFLE_MODE_NONE) {
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setShuffleMode(MediaPlaylistAgent.SHUFFLE_MODE_NONE);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onShuffleModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.SHUFFLE_MODE_NONE, mAgent.getShuffleMode());
- }
-
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setShuffleMode(MediaPlaylistAgent.SHUFFLE_MODE_ALL);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onShuffleModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.SHUFFLE_MODE_ALL, mAgent.getShuffleMode());
-
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setShuffleMode(MediaPlaylistAgent.SHUFFLE_MODE_GROUP);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onShuffleModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.SHUFFLE_MODE_GROUP, mAgent.getShuffleMode());
-
- // INVALID_SHUFFLE_MODE will not change the shuffle mode.
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setShuffleMode(INVALID_SHUFFLE_MODE);
- mWaitLock.wait(WAIT_TIME_MS);
- assertFalse(mEventCallback.onShuffleModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.SHUFFLE_MODE_GROUP, mAgent.getShuffleMode());
- }
-
- @Test
- public void testSetAndGetRepeatMode() throws Exception {
- int repeatMode = mAgent.getRepeatMode();
- if (repeatMode != MediaPlaylistAgent.REPEAT_MODE_NONE) {
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_NONE);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onRepeatModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.REPEAT_MODE_NONE, mAgent.getRepeatMode());
- }
-
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_ONE);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onRepeatModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.REPEAT_MODE_ONE, mAgent.getRepeatMode());
-
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_ALL);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onRepeatModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.REPEAT_MODE_ALL, mAgent.getRepeatMode());
-
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_GROUP);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onRepeatModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.REPEAT_MODE_GROUP, mAgent.getRepeatMode());
-
- // INVALID_SHUFFLE_MODE will not change the shuffle mode.
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setRepeatMode(INVALID_REPEAT_MODE);
- mWaitLock.wait(WAIT_TIME_MS);
- assertFalse(mEventCallback.onRepeatModeChangedCalled);
- }
- assertEquals(MediaPlaylistAgent.REPEAT_MODE_GROUP, mAgent.getRepeatMode());
- }
-
- @Test
- public void testSetPlaylist() throws Exception {
- int listSize = 10;
- createAndSetPlaylist(10);
- assertEquals(listSize, mAgent.getPlaylist().size());
- assertEquals(0, mAgent.getCurShuffledIndex());
- }
-
- @Test
- public void testSkipItems() throws Exception {
- int listSize = 5;
- List<MediaItem2> playlist = createAndSetPlaylist(listSize);
-
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_NONE);
- // Test skipToPlaylistItem
- for (int i = listSize - 1; i >= 0; --i) {
- mAgent.skipToPlaylistItem(playlist.get(i));
- assertEquals(i, mAgent.getCurShuffledIndex());
- }
-
- // Test skipToNextItem
- // curPlayPos = 0
- for (int curPlayPos = 0; curPlayPos < listSize - 1; ++curPlayPos) {
- mAgent.skipToNextItem();
- assertEquals(curPlayPos + 1, mAgent.getCurShuffledIndex());
- }
- mAgent.skipToNextItem();
- assertEquals(listSize - 1, mAgent.getCurShuffledIndex());
-
- // Test skipToPrevious
- // curPlayPos = listSize - 1
- for (int curPlayPos = listSize - 1; curPlayPos > 0; --curPlayPos) {
- mAgent.skipToPreviousItem();
- assertEquals(curPlayPos - 1, mAgent.getCurShuffledIndex());
- }
- mAgent.skipToPreviousItem();
- assertEquals(0, mAgent.getCurShuffledIndex());
-
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_ALL);
- // Test skipToPrevious with repeat mode all
- // curPlayPos = 0
- mAgent.skipToPreviousItem();
- assertEquals(listSize - 1, mAgent.getCurShuffledIndex());
-
- // Test skipToNext with repeat mode all
- // curPlayPos = listSize - 1
- mAgent.skipToNextItem();
- assertEquals(0, mAgent.getCurShuffledIndex());
-
- mAgent.skipToPreviousItem();
- // curPlayPos = listSize - 1, nextPlayPos = 0
- // Test next play pos after setting repeat mode none.
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_NONE);
- assertEquals(listSize - 1, mAgent.getCurShuffledIndex());
- }
-
- @Test
- public void testEditPlaylist() throws Exception {
- int listSize = 5;
- List<MediaItem2> playlist = createAndSetPlaylist(listSize);
-
- // Test add item: [0 (cur), 1, 2, 3, 4] -> [0 (cur), 1, 5, 2, 3, 4]
- mEventCallback.clear();
- MediaItem2 item_5 = generateMediaItem(5);
- synchronized (mWaitLock) {
- playlist.add(2, item_5);
- mAgent.addPlaylistItem(2, item_5);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
-
- mEventCallback.clear();
- // Move current: [0 (cur), 1, 5, 2, 3, 4] -> [0, 1, 5 (cur), 2, 3, 4]
- mAgent.skipToPlaylistItem(item_5);
- // Remove current item: [0, 1, 5 (cur), 2, 3, 4] -> [0, 1, 2 (cur), 3, 4]
- synchronized (mWaitLock) {
- playlist.remove(item_5);
- mAgent.removePlaylistItem(item_5);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(2, mAgent.getCurShuffledIndex());
-
- // Remove previous item: [0, 1, 2 (cur), 3, 4] -> [0, 2 (cur), 3, 4]
- mEventCallback.clear();
- MediaItem2 previousItem = playlist.get(1);
- synchronized (mWaitLock) {
- playlist.remove(previousItem);
- mAgent.removePlaylistItem(previousItem);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(1, mAgent.getCurShuffledIndex());
-
- // Remove next item: [0, 2 (cur), 3, 4] -> [0, 2 (cur), 4]
- mEventCallback.clear();
- MediaItem2 nextItem = playlist.get(2);
- synchronized (mWaitLock) {
- playlist.remove(nextItem);
- mAgent.removePlaylistItem(nextItem);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(1, mAgent.getCurShuffledIndex());
-
- // Replace item: [0, 2 (cur), 4] -> [0, 2 (cur), 5]
- mEventCallback.clear();
- synchronized (mWaitLock) {
- playlist.set(2, item_5);
- mAgent.replacePlaylistItem(2, item_5);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(1, mAgent.getCurShuffledIndex());
-
- // Move last and remove the last item: [0, 2 (cur), 5] -> [0, 2, 5 (cur)] -> [0, 2 (cur)]
- MediaItem2 lastItem = playlist.get(1);
- mAgent.skipToPlaylistItem(lastItem);
- mEventCallback.clear();
- synchronized (mWaitLock) {
- playlist.remove(lastItem);
- mAgent.removePlaylistItem(lastItem);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(1, mAgent.getCurShuffledIndex());
-
- // Remove all items
- for (int i = playlist.size() - 1; i >= 0; --i) {
- MediaItem2 item = playlist.get(i);
- mAgent.skipToPlaylistItem(item);
- mEventCallback.clear();
- synchronized (mWaitLock) {
- playlist.remove(item);
- mAgent.removePlaylistItem(item);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- }
- assertEquals(SessionPlaylistAgent.NO_VALID_ITEMS, mAgent.getCurShuffledIndex());
- }
-
-
- @Test
- public void testPlaylistWithInvalidItem() throws Exception {
- int listSize = 2;
- List<MediaItem2> playlist = createAndSetPlaylist(listSize);
-
- // Add item: [0 (cur), 1] -> [0 (cur), 3 (no_dsd), 1]
- mEventCallback.clear();
- MediaItem2 invalidItem2 = generateMediaItemWithoutDataSourceDesc(2);
- synchronized (mWaitLock) {
- playlist.add(1, invalidItem2);
- mAgent.addPlaylistItem(1, invalidItem2);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(0, mAgent.getCurShuffledIndex());
-
- // Test skip to next item: [0 (cur), 2 (no_dsd), 1] -> [0, 2 (no_dsd), 1 (cur)]
- mAgent.skipToNextItem();
- assertEquals(2, mAgent.getCurShuffledIndex());
-
- // Test skip to previous item: [0, 2 (no_dsd), 1 (cur)] -> [0 (cur), 2 (no_dsd), 1]
- mAgent.skipToPreviousItem();
- assertEquals(0, mAgent.getCurShuffledIndex());
-
- // Remove current item: [0 (cur), 2 (no_dsd), 1] -> [2 (no_dsd), 1 (cur)]
- mEventCallback.clear();
- MediaItem2 item = playlist.get(0);
- synchronized (mWaitLock) {
- playlist.remove(item);
- mAgent.removePlaylistItem(item);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(1, mAgent.getCurShuffledIndex());
-
- // Remove current item: [2 (no_dsd), 1 (cur)] -> [2 (no_dsd)]
- mEventCallback.clear();
- item = playlist.get(1);
- synchronized (mWaitLock) {
- playlist.remove(item);
- mAgent.removePlaylistItem(item);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(SessionPlaylistAgent.NO_VALID_ITEMS, mAgent.getCurShuffledIndex());
-
- // Add invalid item: [2 (no_dsd)] -> [0 (no_dsd), 2 (no_dsd)]
- MediaItem2 invalidItem0 = generateMediaItemWithoutDataSourceDesc(0);
- mEventCallback.clear();
- synchronized (mWaitLock) {
- playlist.add(0, invalidItem0);
- mAgent.addPlaylistItem(0, invalidItem0);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(SessionPlaylistAgent.NO_VALID_ITEMS, mAgent.getCurShuffledIndex());
-
- // Add valid item: [0 (no_dsd), 2 (no_dsd)] -> [0 (no_dsd), 1, 2 (no_dsd)]
- MediaItem2 invalidItem1 = generateMediaItem(1);
- mEventCallback.clear();
- synchronized (mWaitLock) {
- playlist.add(1, invalidItem1);
- mAgent.addPlaylistItem(1, invalidItem1);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(1, mAgent.getCurShuffledIndex());
-
- // Replace the valid item with an invalid item:
- // [0 (no_dsd), 1 (cur), 2 (no_dsd)] -> [0 (no_dsd), 3 (no_dsd), 2 (no_dsd)]
- MediaItem2 invalidItem3 = generateMediaItemWithoutDataSourceDesc(3);
- mEventCallback.clear();
- synchronized (mWaitLock) {
- playlist.set(1, invalidItem3);
- mAgent.replacePlaylistItem(1, invalidItem3);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- assertPlaylistEquals(playlist, mAgent.getPlaylist());
- assertEquals(SessionPlaylistAgent.END_OF_PLAYLIST, mAgent.getCurShuffledIndex());
- }
-
- @Test
- public void testPlaylistAfterOnCurrentDataSourceChanged() throws Exception {
- int listSize = 2;
- verify(mPlayer).registerPlayerEventCallback(Matchers.any(), Matchers.any());
-
- createAndSetPlaylist(listSize);
- assertEquals(0, mAgent.getCurShuffledIndex());
-
- mPlayerEventCallback.onCurrentDataSourceChanged(mPlayer, null);
- assertEquals(1, mAgent.getCurShuffledIndex());
- mPlayerEventCallback.onCurrentDataSourceChanged(mPlayer, null);
- assertEquals(SessionPlaylistAgent.END_OF_PLAYLIST, mAgent.getCurShuffledIndex());
-
- mAgent.skipToNextItem();
- assertEquals(SessionPlaylistAgent.END_OF_PLAYLIST, mAgent.getCurShuffledIndex());
-
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_ONE);
- assertEquals(SessionPlaylistAgent.END_OF_PLAYLIST, mAgent.getCurShuffledIndex());
-
- mAgent.setRepeatMode(MediaPlaylistAgent.REPEAT_MODE_ALL);
- assertEquals(0, mAgent.getCurShuffledIndex());
- mPlayerEventCallback.onCurrentDataSourceChanged(mPlayer, null);
- assertEquals(1, mAgent.getCurShuffledIndex());
- mPlayerEventCallback.onCurrentDataSourceChanged(mPlayer, null);
- assertEquals(0, mAgent.getCurShuffledIndex());
- }
-
- private List<MediaItem2> createAndSetPlaylist(int listSize) throws Exception {
- List<MediaItem2> items = new ArrayList<>();
- for (int i = 0; i < listSize; ++i) {
- items.add(generateMediaItem(i));
- }
- mEventCallback.clear();
- synchronized (mWaitLock) {
- mAgent.setPlaylist(items, null);
- mWaitLock.wait(WAIT_TIME_MS);
- assertTrue(mEventCallback.onPlaylistChangedCalled);
- }
- return items;
- }
-
- private void assertPlaylistEquals(List<MediaItem2> expected, List<MediaItem2> actual) {
- if (expected == actual) {
- return;
- }
- assertTrue(expected != null && actual != null);
- assertEquals(expected.size(), actual.size());
- for (int i = 0; i < expected.size(); ++i) {
- assertTrue(expected.get(i).equals(actual.get(i)));
- }
- }
-
- private MediaItem2 generateMediaItemWithoutDataSourceDesc(int key) {
- return new MediaItem2.Builder(0)
- .setMediaId("TEST_MEDIA_ID_WITHOUT_DSD_" + key)
- .build();
- }
-
- private MediaItem2 generateMediaItem(int key) {
- return new MediaItem2.Builder(0)
- .setMediaId("TEST_MEDIA_ID_" + key)
- .build();
- }
-}
diff --git a/packages/OWNERS b/packages/OWNERS
index bbc4cef..3b9fd2b 100644
--- a/packages/OWNERS
+++ b/packages/OWNERS
@@ -1,6 +1,9 @@
akersten@google.com
dwkang@google.com
+hdmoon@google.com
+insun@google.com
jaewan@google.com
+jinpark@google.com
marcone@google.com
sungsoo@google.com
wjia@google.com
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 06975ac..26f76c0 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -746,7 +746,7 @@
output.afFrameCount = thread->frameCount();
output.afSampleRate = thread->sampleRate();
output.afLatencyMs = thread->latency();
- output.trackId = track == nullptr ? -1 : track->id();
+ output.portId = portId;
// move effect chain to this output thread if an effect on same session was waiting
// for a track to be created
@@ -1766,7 +1766,7 @@
output.cblk = recordTrack->getCblk();
output.buffers = recordTrack->getBuffers();
- output.trackId = recordTrack->id();
+ output.portId = portId;
// return handle to client
recordHandle = new RecordHandle(recordTrack);
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index b6b3815..1b20693 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -553,6 +553,7 @@
virtual void pause();
virtual status_t attachAuxEffect(int effectId);
virtual status_t setParameters(const String8& keyValuePairs);
+ virtual status_t selectPresentation(int presentationId, int programId);
virtual media::VolumeShaper::Status applyVolumeShaper(
const sp<media::VolumeShaper::Configuration>& configuration,
const sp<media::VolumeShaper::Operation>& operation) override;
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h
index 53ea9a4..971f6a5 100644
--- a/services/audioflinger/PlaybackTracks.h
+++ b/services/audioflinger/PlaybackTracks.h
@@ -67,6 +67,7 @@
bool isStatic() const { return mSharedBuffer.get() != nullptr; }
status_t setParameters(const String8& keyValuePairs);
+ status_t selectPresentation(int presentationId, int programId);
status_t attachAuxEffect(int EffectId);
void setAuxBuffer(int EffectId, int32_t *buffer);
int32_t *auxBuffer() const { return mAuxBuffer; }
diff --git a/services/audioflinger/RecordTracks.h b/services/audioflinger/RecordTracks.h
index b0c9fda..85f5456 100644
--- a/services/audioflinger/RecordTracks.h
+++ b/services/audioflinger/RecordTracks.h
@@ -71,6 +71,12 @@
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
+ static bool checkServerLatencySupported(
+ audio_format_t format, audio_input_flags_t flags) {
+ return audio_is_linear_pcm(format)
+ && (flags & AUDIO_INPUT_FLAG_HW_AV_SYNC) == 0;
+ }
+
private:
friend class AudioFlinger; // for mState
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 5555acf..e70e567 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -2413,6 +2413,14 @@
return String8();
}
+status_t AudioFlinger::DirectOutputThread::selectPresentation(int presentationId, int programId) {
+ Mutex::Autolock _l(mLock);
+ if (mOutput == nullptr || mOutput->stream == nullptr) {
+ return NO_INIT;
+ }
+ return mOutput->stream->selectPresentation(presentationId, programId);
+}
+
void AudioFlinger::PlaybackThread::ioConfigChanged(audio_io_config_event event, pid_t pid) {
sp<AudioIoDescriptor> desc = new AudioIoDescriptor();
ALOGV("PlaybackThread::ioConfigChanged, thread %p, event %d", this, event);
@@ -3185,7 +3193,6 @@
if (mType == OFFLOAD || mType == DIRECT) {
mTimestampVerifier.setDiscontinuityMode(mTimestampVerifier.DISCONTINUITY_MODE_ZERO);
}
- audio_utils::Statistics<double> downstreamLatencyStatMs(0.999 /* alpha */);
audio_patch_handle_t lastDownstreamPatchHandle = AUDIO_PATCH_HANDLE_NONE;
while (!exitPending())
@@ -3215,7 +3222,7 @@
downstreamPatchHandle = swPatches[0].getPatchHandle();
}
if (downstreamPatchHandle != lastDownstreamPatchHandle) {
- downstreamLatencyStatMs.reset();
+ mDownstreamLatencyStatMs.reset();
lastDownstreamPatchHandle = downstreamPatchHandle;
}
if (status == OK) {
@@ -3229,14 +3236,14 @@
if (latencyMs < minLatency) latencyMs = minLatency;
else if (latencyMs > maxLatency) latencyMs = maxLatency;
}
- downstreamLatencyStatMs.add(latencyMs);
+ mDownstreamLatencyStatMs.add(latencyMs);
}
mAudioFlinger->mLock.unlock();
}
} else {
if (lastDownstreamPatchHandle != AUDIO_PATCH_HANDLE_NONE) {
// our device is no longer AUDIO_DEVICE_OUT_BUS, reset patch handle and stats.
- downstreamLatencyStatMs.reset();
+ mDownstreamLatencyStatMs.reset();
lastDownstreamPatchHandle = AUDIO_PATCH_HANDLE_NONE;
}
}
@@ -3285,10 +3292,10 @@
(long long)timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL]);
// Note: Downstream latency only added if timestamp correction enabled.
- if (downstreamLatencyStatMs.getN() > 0) { // we have latency info.
+ if (mDownstreamLatencyStatMs.getN() > 0) { // we have latency info.
const int64_t newPosition =
timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL]
- - int64_t(downstreamLatencyStatMs.getMean() * mSampleRate * 1e-3);
+ - int64_t(mDownstreamLatencyStatMs.getMean() * mSampleRate * 1e-3);
// prevent retrograde
timestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL] = max(
newPosition,
@@ -3747,6 +3754,15 @@
uint64_t position64;
if (mOutput->getPresentationPosition(&position64, ×tamp.mTime) == OK) {
timestamp.mPosition = (uint32_t)position64;
+ if (mDownstreamLatencyStatMs.getN() > 0) {
+ const uint32_t positionOffset =
+ (uint32_t)(mDownstreamLatencyStatMs.getMean() * mSampleRate * 1e-3);
+ if (positionOffset > timestamp.mPosition) {
+ timestamp.mPosition = 0;
+ } else {
+ timestamp.mPosition -= positionOffset;
+ }
+ }
return NO_ERROR;
}
}
@@ -7351,8 +7367,7 @@
status_t status = NO_ERROR;
if (recordTrack->isExternalTrack()) {
mLock.unlock();
- bool silenced;
- status = AudioSystem::startInput(recordTrack->portId(), &silenced);
+ status = AudioSystem::startInput(recordTrack->portId());
mLock.lock();
if (recordTrack->isInvalid()) {
recordTrack->clearSyncStartEvent();
@@ -7380,7 +7395,6 @@
recordTrack->clearSyncStartEvent();
return status;
}
- recordTrack->setSilenced(silenced);
}
// Catch up with current buffer indices if thread is already running.
// This is what makes a new client discard all buffered data. If the track's mRsmpInFront
@@ -7546,7 +7560,7 @@
(void)input->stream->dump(fd);
}
- const double latencyMs = audio_is_linear_pcm(mFormat)
+ const double latencyMs = RecordTrack::checkServerLatencySupported(mFormat, flags)
? - mTimestamp.getOutputServerLatencyMs(mSampleRate) : 0.;
if (latencyMs != 0.) {
dprintf(fd, " NormalRecord latency ms: %.2lf\n", latencyMs);
@@ -8330,11 +8344,10 @@
return BAD_VALUE;
}
- bool silenced = false;
if (isOutput()) {
ret = AudioSystem::startOutput(portId);
} else {
- ret = AudioSystem::startInput(portId, &silenced);
+ ret = AudioSystem::startInput(portId);
}
Mutex::Autolock _l(mLock);
@@ -8355,21 +8368,21 @@
return PERMISSION_DENIED;
}
- if (isOutput()) {
- // force volume update when a new track is added
- mHalVolFloat = -1.0f;
- } else if (!silenced) {
- for (const sp<MmapTrack> &track : mActiveTracks) {
- if (track->isSilenced_l() && track->uid() != client.clientUid)
- track->invalidate();
- }
- }
-
// Given that MmapThread::mAttr is mutable, should a MmapTrack have attributes ?
sp<MmapTrack> track = new MmapTrack(this, mAttr, mSampleRate, mFormat, mChannelMask, mSessionId,
isOutput(), client.clientUid, client.clientPid, portId);
- track->setSilenced_l(silenced);
+ if (isOutput()) {
+ // force volume update when a new track is added
+ mHalVolFloat = -1.0f;
+ } else if (!track->isSilenced_l()) {
+ for (const sp<MmapTrack> &t : mActiveTracks) {
+ if (t->isSilenced_l() && t->uid() != client.clientUid)
+ t->invalidate();
+ }
+ }
+
+
mActiveTracks.add(track);
sp<EffectChain> chain = getEffectChain_l(mSessionId);
if (chain != 0) {
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 61f7baf..7f3ea0f 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -1082,6 +1082,8 @@
static const size_t kFastMixerLogSize = 8 * 1024;
sp<NBLog::Writer> mFastMixerNBLogWriter;
+ // Downstream patch latency, available if mDownstreamLatencyStatMs.getN() > 0.
+ audio_utils::Statistics<double> mDownstreamLatencyStatMs{0.999};
public:
virtual bool hasFastMixer() const = 0;
@@ -1197,6 +1199,8 @@
audio_io_handle_t id, audio_devices_t device, bool systemReady);
virtual ~DirectOutputThread();
+ status_t selectPresentation(int presentationId, int programId);
+
// Thread virtuals
virtual bool checkForNewParameter_l(const String8& keyValuePair,
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index f2617ae..9a7f1f1 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -326,6 +326,10 @@
return mTrack->setParameters(keyValuePairs);
}
+status_t AudioFlinger::TrackHandle::selectPresentation(int presentationId, int programId) {
+ return mTrack->selectPresentation(presentationId, programId);
+}
+
VolumeShaper::Status AudioFlinger::TrackHandle::applyVolumeShaper(
const sp<VolumeShaper::Configuration>& configuration,
const sp<VolumeShaper::Operation>& operation) {
@@ -498,7 +502,7 @@
void AudioFlinger::PlaybackThread::Track::appendDumpHeader(String8& result)
{
- result.appendFormat("Type Id Active Client Session S Flags "
+ result.appendFormat("Type Id Active Client Session Port Id S Flags "
" Format Chn mask SRate "
"ST Usg CT "
" G db L dB R dB VS dB "
@@ -584,7 +588,7 @@
? 'r' /* buffer reduced */: bufferSizeInFrames > mFrameCount
? 'e' /* error */ : ' ' /* identical */;
- result.appendFormat("%7s %6u %7u %2s 0x%03X "
+ result.appendFormat("%7s %6u %7u %7u %2s 0x%03X "
"%08X %08X %6u "
"%2u %3x %2x "
"%5.2g %5.2g %5.2g %5.2g%c "
@@ -592,6 +596,7 @@
active ? "yes" : "no",
(mClient == 0) ? getpid() : mClient->pid(),
mSessionId,
+ mPortId,
getTrackStateString(),
mCblk->mFlags,
@@ -976,6 +981,19 @@
}
}
+status_t AudioFlinger::PlaybackThread::Track::selectPresentation(int presentationId,
+ int programId) {
+ sp<ThreadBase> thread = mThread.promote();
+ if (thread == 0) {
+ ALOGE("thread is dead");
+ return FAILED_TRANSACTION;
+ } else if ((thread->type() == ThreadBase::DIRECT) || (thread->type() == ThreadBase::OFFLOAD)) {
+ DirectOutputThread *directOutputThread = static_cast<DirectOutputThread*>(thread.get());
+ return directOutputThread->selectPresentation(presentationId, programId);
+ }
+ return INVALID_OPERATION;
+}
+
VolumeShaper::Status AudioFlinger::PlaybackThread::Track::applyVolumeShaper(
const sp<VolumeShaper::Configuration>& configuration,
const sp<VolumeShaper::Operation>& operation)
@@ -1755,7 +1773,7 @@
thread->mFastTrackAvail = false;
} else {
// TODO: only Normal Record has timestamps (Fast Record does not).
- mServerLatencySupported = audio_is_linear_pcm(mFormat);
+ mServerLatencySupported = checkServerLatencySupported(mFormat, flags);
}
#ifdef TEE_SINK
mTee.setId(std::string("_") + std::to_string(mThreadIoHandle)
@@ -1869,7 +1887,7 @@
void AudioFlinger::RecordThread::RecordTrack::appendDumpHeader(String8& result)
{
- result.appendFormat("Active Id Client Session S Flags "
+ result.appendFormat("Active Id Client Session Port Id S Flags "
" Format Chn mask SRate Source "
" Server FrmCnt FrmRdy Sil%s\n",
isServerLatencySupported() ? " Latency" : "");
@@ -1877,7 +1895,7 @@
void AudioFlinger::RecordThread::RecordTrack::appendDump(String8& result, bool active)
{
- result.appendFormat("%c%5s %6d %6u %7u %2s 0x%03X "
+ result.appendFormat("%c%5s %6d %6u %7u %7u %2s 0x%03X "
"%08X %08X %6u %6X "
"%08X %6zu %6zu %3c",
isFastTrack() ? 'F' : ' ',
@@ -1885,6 +1903,7 @@
mId,
(mClient == 0) ? getpid() : mClient->pid(),
mSessionId,
+ mPortId,
getTrackStateString(),
mCblk->mFlags,
@@ -2125,15 +2144,16 @@
void AudioFlinger::MmapThread::MmapTrack::appendDumpHeader(String8& result)
{
- result.appendFormat("Client Session Format Chn mask SRate Flags %s\n",
+ result.appendFormat("Client Session Port Id Format Chn mask SRate Flags %s\n",
isOut() ? "Usg CT": "Source");
}
void AudioFlinger::MmapThread::MmapTrack::appendDump(String8& result, bool active __unused)
{
- result.appendFormat("%6u %7u %08X %08X %6u 0x%03X ",
+ result.appendFormat("%6u %7u %7u %08X %08X %6u 0x%03X ",
mPid,
mSessionId,
+ mPortId,
mFormat,
mChannelMask,
mSampleRate,
diff --git a/services/audiopolicy/Android.mk b/services/audiopolicy/Android.mk
index f23e426..02ab8ad 100644
--- a/services/audiopolicy/Android.mk
+++ b/services/audiopolicy/Android.mk
@@ -81,9 +81,9 @@
LOCAL_SHARED_LIBRARIES += libmedia_helper
LOCAL_SHARED_LIBRARIES += libmediametrics
-ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
LOCAL_SHARED_LIBRARIES += libhidlbase libicuuc libxml2
+ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
LOCAL_CFLAGS += -DUSE_XML_AUDIO_POLICY_CONF
endif #ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index d4c49d9..3fb505d 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -65,20 +65,6 @@
API_INPUT_TELEPHONY_RX, // used for capture from telephony RX path
} input_type_t;
- enum {
- API_INPUT_CONCURRENCY_NONE = 0,
- API_INPUT_CONCURRENCY_CALL = (1 << 0), // Concurrency with a call
- API_INPUT_CONCURRENCY_CAPTURE = (1 << 1), // Concurrency with another capture
- API_INPUT_CONCURRENCY_HOTWORD = (1 << 2), // Concurrency with a hotword
- API_INPUT_CONCURRENCY_PREEMPT = (1 << 3), // pre-empted someone
- // NB: preempt is marked on a successful return, others are on failing calls
- API_INPUT_CONCURRENCY_LAST = (1 << 4),
-
- API_INPUT_CONCURRENCY_ALL = (API_INPUT_CONCURRENCY_LAST - 1),
- };
-
- typedef uint32_t concurrency_type__mask_t;
-
public:
virtual ~AudioPolicyInterface() {}
//
@@ -141,9 +127,7 @@
input_type_t *inputType,
audio_port_handle_t *portId) = 0;
// indicates to the audio policy manager that the input starts being used.
- virtual status_t startInput(audio_port_handle_t portId,
- bool silenced,
- concurrency_type__mask_t *concurrency) = 0;
+ virtual status_t startInput(audio_port_handle_t portId) = 0;
// indicates to the audio policy manager that the input stops being used.
virtual status_t stopInput(audio_port_handle_t portId) = 0;
// releases the input.
@@ -242,7 +226,7 @@
bool reported) = 0;
virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) = 0;
- virtual void setRecordSilenced(uid_t uid, bool silenced);
+ virtual void setAppState(uid_t uid, app_state_t state);
};
diff --git a/services/audiopolicy/common/Android.bp b/services/audiopolicy/common/Android.bp
new file mode 100644
index 0000000..a925b9a
--- /dev/null
+++ b/services/audiopolicy/common/Android.bp
@@ -0,0 +1,4 @@
+cc_library_headers {
+ name: "libaudiopolicycommon",
+ export_include_dirs: ["include"],
+}
diff --git a/services/audiopolicy/common/Android.mk b/services/audiopolicy/common/Android.mk
deleted file mode 100644
index dcce8e3..0000000
--- a/services/audiopolicy/common/Android.mk
+++ /dev/null
@@ -1,9 +0,0 @@
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-#######################################################################
-# Recursive call sub-folder Android.mk
-#
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
diff --git a/services/audiopolicy/common/include/policy.h b/services/audiopolicy/common/include/policy.h
index 9bd68e1..30b0044 100644
--- a/services/audiopolicy/common/include/policy.h
+++ b/services/audiopolicy/common/include/policy.h
@@ -32,14 +32,6 @@
#define MAX_MIXER_CHANNEL_COUNT FCC_8
/**
- * A device mask for all audio input devices that are considered "virtual" when evaluating
- * active inputs in getActiveInputs()
- */
-#define APM_AUDIO_IN_DEVICE_VIRTUAL_ALL (AUDIO_DEVICE_IN_REMOTE_SUBMIX|\
- AUDIO_DEVICE_IN_BUS|AUDIO_DEVICE_IN_FM_TUNER)
-
-
-/**
* A device mask for all audio input and output devices where matching inputs/outputs on device
* type alone is not enough: the address must match too
*/
@@ -68,23 +60,6 @@
}
/**
- * Check if the input device given is considered as a virtual device.
- *
- * @param[in] device to consider
- *
- * @return true if the device is a virtual one, false otherwise.
- */
-static inline bool is_virtual_input_device(audio_devices_t device)
-{
- if ((device & AUDIO_DEVICE_BIT_IN) != 0) {
- device &= ~AUDIO_DEVICE_BIT_IN;
- if ((popcount(device) == 1) && ((device & ~APM_AUDIO_IN_DEVICE_VIRTUAL_ALL) == 0))
- return true;
- }
- return false;
-}
-
-/**
* Check whether the device type is one
* where addresses are used to distinguish between one connected device and another
*
diff --git a/services/audiopolicy/common/managerdefinitions/Android.bp b/services/audiopolicy/common/managerdefinitions/Android.bp
new file mode 100644
index 0000000..d0b4973
--- /dev/null
+++ b/services/audiopolicy/common/managerdefinitions/Android.bp
@@ -0,0 +1,53 @@
+cc_library_static {
+ name: "libaudiopolicycomponents",
+
+ srcs: [
+ "src/AudioCollections.cpp",
+ "src/AudioGain.cpp",
+ "src/AudioInputDescriptor.cpp",
+ "src/AudioOutputDescriptor.cpp",
+ "src/AudioPatch.cpp",
+ "src/AudioPolicyMix.cpp",
+ "src/AudioPort.cpp",
+ "src/AudioProfile.cpp",
+ "src/AudioRoute.cpp",
+ "src/ClientDescriptor.cpp",
+ "src/DeviceDescriptor.cpp",
+ "src/EffectDescriptor.cpp",
+ "src/HwModule.cpp",
+ "src/IOProfile.cpp",
+ "src/Serializer.cpp",
+ "src/SoundTriggerSession.cpp",
+ "src/TypeConverter.cpp",
+ "src/VolumeCurve.cpp",
+ ],
+ shared_libs: [
+ "libcutils",
+ "libhidlbase",
+ "libicuuc",
+ "liblog",
+ "libmedia",
+ "libutils",
+ "libxml2",
+ ],
+ export_shared_lib_headers: ["libmedia"],
+ static_libs: [
+ "libaudioutils",
+ ],
+ header_libs: [
+ "libaudiopolicycommon",
+ ],
+ export_header_lib_headers: ["libaudiopolicycommon"],
+
+ include_dirs: [
+ "frameworks/av/services/audiopolicy",
+ ],
+
+ export_include_dirs: ["include"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+}
diff --git a/services/audiopolicy/common/managerdefinitions/Android.mk b/services/audiopolicy/common/managerdefinitions/Android.mk
deleted file mode 100644
index 3336b79..0000000
--- a/services/audiopolicy/common/managerdefinitions/Android.mk
+++ /dev/null
@@ -1,66 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- src/DeviceDescriptor.cpp \
- src/AudioGain.cpp \
- src/HwModule.cpp \
- src/IOProfile.cpp \
- src/AudioPort.cpp \
- src/AudioProfile.cpp \
- src/AudioRoute.cpp \
- src/AudioPolicyMix.cpp \
- src/AudioPatch.cpp \
- src/AudioInputDescriptor.cpp \
- src/AudioOutputDescriptor.cpp \
- src/AudioCollections.cpp \
- src/EffectDescriptor.cpp \
- src/SoundTriggerSession.cpp \
- src/VolumeCurve.cpp \
- src/TypeConverter.cpp \
- src/ClientDescriptor.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libmedia \
- libutils \
- liblog \
-
-LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libmedia
-
-LOCAL_C_INCLUDES := \
- $(LOCAL_PATH)/include \
- frameworks/av/services/audiopolicy/common/include \
- frameworks/av/services/audiopolicy \
- $(call include-path-for, audio-utils) \
-
-ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
-
-LOCAL_SRC_FILES += src/Serializer.cpp
-
-LOCAL_SHARED_LIBRARIES += libhidlbase libicuuc libxml2
-
-LOCAL_C_INCLUDES += \
- external/libxml2/include \
- external/icu/icu4c/source/common
-
-else
-
-LOCAL_SRC_FILES += \
- src/ConfigParsingUtils.cpp \
- src/StreamDescriptor.cpp \
- src/Gains.cpp
-
-endif #ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
-
-LOCAL_EXPORT_C_INCLUDE_DIRS := \
- $(LOCAL_PATH)/include
-
-LOCAL_MULTILIB := $(AUDIOSERVER_MULTILIB)
-
-LOCAL_CFLAGS := -Wall -Werror
-
-LOCAL_MODULE := libaudiopolicycomponents
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioInputDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/AudioInputDescriptor.h
index 6e4c044..9f8b8c0 100644
--- a/services/audiopolicy/common/managerdefinitions/include/AudioInputDescriptor.h
+++ b/services/audiopolicy/common/managerdefinitions/include/AudioInputDescriptor.h
@@ -58,9 +58,8 @@
void clearPreemptedSessions();
bool isActive() const { return mGlobalActiveCount > 0; }
bool isSourceActive(audio_source_t source) const;
- audio_source_t inputSource(bool activeOnly = false) const;
+ audio_source_t source() const;
bool isSoundTrigger() const;
- audio_source_t getHighestPrioritySource(bool activeOnly) const;
void setClientActive(const sp<RecordClientDescriptor>& client, bool active);
int32_t activeCount() { return mGlobalActiveCount; }
@@ -121,7 +120,7 @@
* Only considers inputs from physical devices (e.g. main mic, headset mic) when
* ignoreVirtualInputs is true.
*/
- Vector<sp <AudioInputDescriptor> > getActiveInputs(bool ignoreVirtualInputs = true);
+ Vector<sp <AudioInputDescriptor> > getActiveInputs();
audio_devices_t getSupportedDevices(audio_io_handle_t handle) const;
diff --git a/services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h
index 030bf4b..986d109 100644
--- a/services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h
+++ b/services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h
@@ -22,6 +22,7 @@
#include <sys/types.h>
#include <system/audio.h>
+#include <system/audio_policy.h>
#include <utils/Errors.h>
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>
@@ -106,7 +107,7 @@
audio_port_handle_t preferredDeviceId,
audio_source_t source, audio_input_flags_t flags, bool isSoundTrigger) :
ClientDescriptor(portId, uid, sessionId, attributes, config, preferredDeviceId),
- mSource(source), mFlags(flags), mIsSoundTrigger(isSoundTrigger), mSilenced(false) {}
+ mSource(source), mFlags(flags), mIsSoundTrigger(isSoundTrigger), mAppState(APP_STATE_IDLE) {}
~RecordClientDescriptor() override = default;
using ClientDescriptor::dump;
@@ -115,14 +116,16 @@
audio_source_t source() const { return mSource; }
audio_input_flags_t flags() const { return mFlags; }
bool isSoundTrigger() const { return mIsSoundTrigger; }
- void setSilenced(bool silenced) { mSilenced = silenced; }
- bool isSilenced() const { return mSilenced; }
+ void setAppState(app_state_t appState) { mAppState = appState; }
+ app_state_t appState() { return mAppState; }
+ bool isSilenced() const { return mAppState == APP_STATE_IDLE; }
private:
const audio_source_t mSource;
const audio_input_flags_t mFlags;
const bool mIsSoundTrigger;
- bool mSilenced;
+ app_state_t mAppState;
+
};
class SourceClientDescriptor: public TrackClientDescriptor
diff --git a/services/audiopolicy/common/managerdefinitions/include/ConfigParsingUtils.h b/services/audiopolicy/common/managerdefinitions/include/ConfigParsingUtils.h
deleted file mode 100644
index a007854..0000000
--- a/services/audiopolicy/common/managerdefinitions/include/ConfigParsingUtils.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "AudioPolicyConfig.h"
-#include "DeviceDescriptor.h"
-#include "HwModule.h"
-#include "audio_policy_conf.h"
-#include <system/audio.h>
-#include <utils/Log.h>
-#include <utils/Vector.h>
-#include <utils/SortedVector.h>
-#include <cutils/config_utils.h>
-#include <utils/RefBase.h>
-#include <system/audio_policy.h>
-
-namespace android {
-
-// ----------------------------------------------------------------------------
-// Definitions for audio_policy.conf file parsing
-// ----------------------------------------------------------------------------
-
-class ConfigParsingUtils
-{
-public:
- static status_t loadConfig(const char *path, AudioPolicyConfig &config);
-
-private:
- static void loadAudioPortGain(cnode *root, AudioPort &audioPort, int index);
- static void loadAudioPortGains(cnode *root, AudioPort &audioPort);
- static void loadDeviceDescriptorGains(cnode *root, sp<DeviceDescriptor> &deviceDesc);
- static status_t loadHwModuleDevice(cnode *root, DeviceVector &devices);
- static status_t loadHwModuleProfile(cnode *root, sp<HwModule> &module, audio_port_role_t role);
- static void loadDevicesFromTag(const char *tag, DeviceVector &devices,
- const DeviceVector &declaredDevices);
- static void loadHwModules(cnode *root, HwModuleCollection &hwModules,
- AudioPolicyConfig &config);
- static void loadGlobalConfig(cnode *root, AudioPolicyConfig &config,
- const sp<HwModule> &primaryModule);
- static void loadModuleGlobalConfig(cnode *root, const sp<HwModule> &module,
- AudioPolicyConfig &config);
- static status_t loadHwModule(cnode *root, sp<HwModule> &module, AudioPolicyConfig &config);
-};
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/include/Gains.h b/services/audiopolicy/common/managerdefinitions/include/Gains.h
deleted file mode 100644
index cb229a4..0000000
--- a/services/audiopolicy/common/managerdefinitions/include/Gains.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <StreamDescriptor.h>
-#include <utils/KeyedVector.h>
-#include <system/audio.h>
-#include <utils/Errors.h>
-#include <utils/RefBase.h>
-
-namespace android {
-
-class StreamDescriptor;
-
-class Gains
-{
-public :
- static float volIndexToDb(const VolumeCurvePoint *point, int indexMin, int indexMax,
- int indexInUi);
-
- // default volume curve
- static const VolumeCurvePoint sDefaultVolumeCurve[Volume::VOLCNT];
- // default volume curve for media strategy
- static const VolumeCurvePoint sDefaultMediaVolumeCurve[Volume::VOLCNT];
- // volume curve for non-media audio on ext media outputs (HDMI, Line, etc)
- static const VolumeCurvePoint sExtMediaSystemVolumeCurve[Volume::VOLCNT];
- // volume curve for media strategy on speakers
- static const VolumeCurvePoint sSpeakerMediaVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sSpeakerMediaVolumeCurveDrc[Volume::VOLCNT];
- // volume curve for sonification strategy on speakers
- static const VolumeCurvePoint sSpeakerSonificationVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sSpeakerSonificationVolumeCurveDrc[Volume::VOLCNT];
- static const VolumeCurvePoint sDefaultSystemVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sDefaultSystemVolumeCurveDrc[Volume::VOLCNT];
- static const VolumeCurvePoint sHeadsetSystemVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sDefaultVoiceVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sSpeakerVoiceVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sLinearVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sSilentVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sFullScaleVolumeCurve[Volume::VOLCNT];
- static const VolumeCurvePoint sHearingAidVolumeCurve[Volume::VOLCNT];
- // default volume curves per stream and device category. See initializeVolumeCurves()
- static const VolumeCurvePoint *sVolumeProfiles[AUDIO_STREAM_CNT][DEVICE_CATEGORY_CNT];
-};
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/include/IOProfile.h b/services/audiopolicy/common/managerdefinitions/include/IOProfile.h
index eb32959..8ff8238 100644
--- a/services/audiopolicy/common/managerdefinitions/include/IOProfile.h
+++ b/services/audiopolicy/common/managerdefinitions/include/IOProfile.h
@@ -35,7 +35,7 @@
public:
IOProfile(const String8 &name, audio_port_role_t role)
: AudioPort(name, AUDIO_PORT_TYPE_MIX, role),
- maxOpenCount((role == AUDIO_PORT_ROLE_SOURCE) ? 1 : 0),
+ maxOpenCount(1),
curOpenCount(0),
maxActiveCount(1),
curActiveCount(0) {}
diff --git a/services/audiopolicy/common/managerdefinitions/include/StreamDescriptor.h b/services/audiopolicy/common/managerdefinitions/include/StreamDescriptor.h
deleted file mode 100644
index 6266313..0000000
--- a/services/audiopolicy/common/managerdefinitions/include/StreamDescriptor.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "IVolumeCurvesCollection.h"
-#include <utils/KeyedVector.h>
-#include <utils/StrongPointer.h>
-#include <utils/SortedVector.h>
-#include <system/audio.h>
-
-namespace android {
-
-// stream descriptor used for volume control
-class StreamDescriptor
-{
-public:
- StreamDescriptor();
-
- int getVolumeIndex(audio_devices_t device) const;
- bool canBeMuted() const { return mCanBeMuted; }
- void clearCurrentVolumeIndex();
- void addCurrentVolumeIndex(audio_devices_t device, int index);
- int getVolumeIndexMin() const { return mIndexMin; }
- int getVolumeIndexMax() const { return mIndexMax; }
- void setVolumeIndexMin(int volIndexMin);
- void setVolumeIndexMax(int volIndexMax);
- bool hasVolumeIndexForDevice(audio_devices_t device) const
- {
- device = Volume::getDeviceForVolume(device);
- return mIndexCur.indexOfKey(device) >= 0;
- }
-
- void dump(String8 *dst) const;
-
- void setVolumeCurvePoint(device_category deviceCategory, const VolumeCurvePoint *point);
- const VolumeCurvePoint *getVolumeCurvePoint(device_category deviceCategory) const
- {
- return mVolumeCurve[deviceCategory];
- }
-
-private:
- const VolumeCurvePoint *mVolumeCurve[DEVICE_CATEGORY_CNT];
- KeyedVector<audio_devices_t, int> mIndexCur; /**< current volume index per device. */
- int mIndexMin; /**< min volume index. */
- int mIndexMax; /**< max volume index. */
- bool mCanBeMuted; /**< true is the stream can be muted. */
-};
-
-/**
- * stream descriptors collection for volume control
- */
-class StreamDescriptorCollection : public DefaultKeyedVector<audio_stream_type_t, StreamDescriptor>,
- public IVolumeCurvesCollection
-{
-public:
- StreamDescriptorCollection();
-
- virtual void clearCurrentVolumeIndex(audio_stream_type_t stream);
- virtual void addCurrentVolumeIndex(audio_stream_type_t stream, audio_devices_t device,
- int index);
- virtual bool canBeMuted(audio_stream_type_t stream);
- virtual int getVolumeIndexMin(audio_stream_type_t stream) const
- {
- return valueFor(stream).getVolumeIndexMin();
- }
- virtual int getVolumeIndex(audio_stream_type_t stream, audio_devices_t device)
- {
- return valueFor(stream).getVolumeIndex(device);
- }
- virtual int getVolumeIndexMax(audio_stream_type_t stream) const
- {
- return valueFor(stream).getVolumeIndexMax();
- }
- virtual float volIndexToDb(audio_stream_type_t stream, device_category device,
- int indexInUi) const;
- virtual status_t initStreamVolume(audio_stream_type_t stream, int indexMin, int indexMax);
- virtual void initializeVolumeCurves(bool isSpeakerDrcEnabled);
- virtual void switchVolumeCurve(audio_stream_type_t streamSrc, audio_stream_type_t streamDst);
- virtual bool hasVolumeIndexForDevice(audio_stream_type_t stream,
- audio_devices_t device) const
- {
- return valueFor(stream).hasVolumeIndexForDevice(device);
- }
-
- void dump(String8 *dst) const override;
-
-private:
- void setVolumeCurvePoint(audio_stream_type_t stream, device_category deviceCategory,
- const VolumeCurvePoint *point);
- const VolumeCurvePoint *getVolumeCurvePoint(audio_stream_type_t stream,
- device_category deviceCategory) const;
- void setVolumeIndexMin(audio_stream_type_t stream,int volIndexMin);
- void setVolumeIndexMax(audio_stream_type_t stream,int volIndexMax);
-};
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
index 1f29874..559274f 100644
--- a/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
@@ -53,9 +53,32 @@
return mId;
}
-audio_source_t AudioInputDescriptor::inputSource(bool activeOnly) const
+audio_source_t AudioInputDescriptor::source() const
{
- return getHighestPrioritySource(activeOnly);
+ audio_source_t source = AUDIO_SOURCE_DEFAULT;
+
+ for (bool activeOnly : { true, false }) {
+ int32_t topPriority = -1;
+ app_state_t topState = APP_STATE_IDLE;
+ for (const auto &client : getClientIterable()) {
+ if (activeOnly && !client->active()) {
+ continue;
+ }
+ app_state_t curState = client->appState();
+ if (curState >= topState) {
+ int32_t curPriority = source_priority(client->source());
+ if (curPriority > topPriority) {
+ source = client->source();
+ topPriority = curPriority;
+ }
+ topState = curState;
+ }
+ }
+ if (source != AUDIO_SOURCE_DEFAULT) {
+ break;
+ }
+ }
+ return source;
}
void AudioInputDescriptor::toAudioPortConfig(struct audio_port_config *dstConfig,
@@ -76,7 +99,7 @@
dstConfig->type = AUDIO_PORT_TYPE_MIX;
dstConfig->ext.mix.hw_module = getModuleHandle();
dstConfig->ext.mix.handle = mIoHandle;
- dstConfig->ext.mix.usecase.source = inputSource();
+ dstConfig->ext.mix.usecase.source = source();
}
void AudioInputDescriptor::toAudioPort(struct audio_port *port) const
@@ -125,24 +148,6 @@
return false;
}
-audio_source_t AudioInputDescriptor::getHighestPrioritySource(bool activeOnly) const
-{
- audio_source_t source = AUDIO_SOURCE_DEFAULT;
- int32_t priority = -1;
-
- for (const auto &client : getClientIterable()) {
- if (activeOnly && !client->active() ) {
- continue;
- }
- int32_t curPriority = source_priority(client->source());
- if (curPriority > priority) {
- priority = curPriority;
- source = client->source();
- }
- }
- return source;
-}
-
bool AudioInputDescriptor::isSoundTrigger() const {
// sound trigger and non sound trigger clients are not mixed on a given input
// so check only first client
@@ -224,7 +229,7 @@
status_t AudioInputDescriptor::start()
{
- if (mGlobalActiveCount == 1) {
+ if (!isActive()) {
if (!mProfile->canStartNewIo()) {
ALOGI("%s mProfile->curActiveCount %d", __func__, mProfile->curActiveCount);
return INVALID_OPERATION;
@@ -388,15 +393,13 @@
return count;
}
-Vector<sp <AudioInputDescriptor> > AudioInputCollection::getActiveInputs(bool ignoreVirtualInputs)
+Vector<sp <AudioInputDescriptor> > AudioInputCollection::getActiveInputs()
{
Vector<sp <AudioInputDescriptor> > activeInputs;
for (size_t i = 0; i < size(); i++) {
const sp<AudioInputDescriptor> inputDescriptor = valueAt(i);
- if ((inputDescriptor->isActive())
- && (!ignoreVirtualInputs ||
- !is_virtual_input_device(inputDescriptor->mDevice))) {
+ if (inputDescriptor->isActive()) {
activeInputs.add(inputDescriptor);
}
}
diff --git a/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp b/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp
deleted file mode 100644
index 59db81c..0000000
--- a/services/audiopolicy/common/managerdefinitions/src/ConfigParsingUtils.cpp
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "APM::ConfigParsingUtils"
-//#define LOG_NDEBUG 0
-
-#include "ConfigParsingUtils.h"
-#include "AudioGain.h"
-#include "IOProfile.h"
-#include <system/audio.h>
-#include <media/AudioParameter.h>
-#include <media/TypeConverter.h>
-#include <utils/Log.h>
-#include <cutils/misc.h>
-
-namespace android {
-
-// --- audio_policy.conf file parsing
-
-//static
-void ConfigParsingUtils::loadAudioPortGain(cnode *root, AudioPort &audioPort, int index)
-{
- cnode *node = root->first_child;
-
- sp<AudioGain> gain = new AudioGain(index, audioPort.useInputChannelMask());
-
- while (node) {
- if (strcmp(node->name, GAIN_MODE) == 0) {
- gain->setMode(GainModeConverter::maskFromString(node->value));
- } else if (strcmp(node->name, GAIN_CHANNELS) == 0) {
- audio_channel_mask_t mask;
- if (audioPort.useInputChannelMask()) {
- if (InputChannelConverter::fromString(node->value, mask)) {
- gain->setChannelMask(mask);
- }
- } else {
- if (OutputChannelConverter::fromString(node->value, mask)) {
- gain->setChannelMask(mask);
- }
- }
- } else if (strcmp(node->name, GAIN_MIN_VALUE) == 0) {
- gain->setMinValueInMb(atoi(node->value));
- } else if (strcmp(node->name, GAIN_MAX_VALUE) == 0) {
- gain->setMaxValueInMb(atoi(node->value));
- } else if (strcmp(node->name, GAIN_DEFAULT_VALUE) == 0) {
- gain->setDefaultValueInMb(atoi(node->value));
- } else if (strcmp(node->name, GAIN_STEP_VALUE) == 0) {
- gain->setStepValueInMb(atoi(node->value));
- } else if (strcmp(node->name, GAIN_MIN_RAMP_MS) == 0) {
- gain->setMinRampInMs(atoi(node->value));
- } else if (strcmp(node->name, GAIN_MAX_RAMP_MS) == 0) {
- gain->setMaxRampInMs(atoi(node->value));
- }
- node = node->next;
- }
-
- ALOGV("loadGain() adding new gain mode %08x channel mask %08x min mB %d max mB %d",
- gain->getMode(), gain->getChannelMask(), gain->getMinValueInMb(),
- gain->getMaxValueInMb());
-
- if (gain->getMode() == 0) {
- return;
- }
- audioPort.mGains.add(gain);
-}
-
-void ConfigParsingUtils::loadAudioPortGains(cnode *root, AudioPort &audioPort)
-{
- cnode *node = root->first_child;
- int index = 0;
- while (node) {
- ALOGV("loadGains() loading gain %s", node->name);
- loadAudioPortGain(node, audioPort, index++);
- node = node->next;
- }
-}
-
-//static
-void ConfigParsingUtils::loadDeviceDescriptorGains(cnode *root, sp<DeviceDescriptor> &deviceDesc)
-{
- loadAudioPortGains(root, *deviceDesc);
- if (deviceDesc->mGains.size() > 0) {
- deviceDesc->mGains[0]->getDefaultConfig(&deviceDesc->mGain);
- }
-}
-
-//static
-status_t ConfigParsingUtils::loadHwModuleDevice(cnode *root, DeviceVector &devices)
-{
- cnode *node = root->first_child;
-
- audio_devices_t type = AUDIO_DEVICE_NONE;
- while (node) {
- if (strcmp(node->name, APM_DEVICE_TYPE) == 0) {
- deviceFromString(node->value, type);
- break;
- }
- node = node->next;
- }
- if (type == AUDIO_DEVICE_NONE ||
- (!audio_is_input_device(type) && !audio_is_output_device(type))) {
- ALOGW("loadDevice() bad type %08x", type);
- return BAD_VALUE;
- }
- sp<DeviceDescriptor> deviceDesc = new DeviceDescriptor(type, String8(root->name));
-
- node = root->first_child;
- while (node) {
- if (strcmp(node->name, APM_DEVICE_ADDRESS) == 0) {
- deviceDesc->mAddress = String8((char *)node->value);
- } else if (strcmp(node->name, CHANNELS_TAG) == 0) {
- if (audio_is_input_device(type)) {
- deviceDesc->addAudioProfile(
- new AudioProfile(gDynamicFormat,
- inputChannelMasksFromString(node->value),
- SampleRateVector()));
- } else {
- deviceDesc->addAudioProfile(
- new AudioProfile(gDynamicFormat,
- outputChannelMasksFromString(node->value),
- SampleRateVector()));
- }
- } else if (strcmp(node->name, GAINS_TAG) == 0) {
- loadDeviceDescriptorGains(node, deviceDesc);
- }
- node = node->next;
- }
-
- ALOGV("loadDevice() adding device tag (literal type) %s type %08x address %s",
- deviceDesc->getTagName().string(), type, deviceDesc->mAddress.string());
-
- devices.add(deviceDesc);
- return NO_ERROR;
-}
-
-//static
-status_t ConfigParsingUtils::loadHwModuleProfile(cnode *root, sp<HwModule> &module,
- audio_port_role_t role)
-{
- cnode *node = root->first_child;
-
- sp<IOProfile> profile = new IOProfile(String8(root->name), role);
-
- AudioProfileVector audioProfiles;
- SampleRateVector sampleRates;
- ChannelsVector channels;
- FormatVector formats;
-
- while (node) {
- if (strcmp(node->name, FORMATS_TAG) == 0 &&
- strcmp(node->value, DYNAMIC_VALUE_TAG) != 0) {
- formats = formatsFromString(node->value);
- } else if (strcmp(node->name, SAMPLING_RATES_TAG) == 0 &&
- strcmp(node->value, DYNAMIC_VALUE_TAG) != 0) {
- collectionFromString<SampleRateTraits>(node->value, sampleRates);
- } else if (strcmp(node->name, CHANNELS_TAG) == 0 &&
- strcmp(node->value, DYNAMIC_VALUE_TAG) != 0) {
- if (role == AUDIO_PORT_ROLE_SINK) {
- channels = inputChannelMasksFromString(node->value);
- } else {
- channels = outputChannelMasksFromString(node->value);
- }
- } else if (strcmp(node->name, DEVICES_TAG) == 0) {
- DeviceVector devices;
- loadDevicesFromTag(node->value, devices, module->getDeclaredDevices());
- profile->setSupportedDevices(devices);
- } else if (strcmp(node->name, FLAGS_TAG) == 0) {
- if (role == AUDIO_PORT_ROLE_SINK) {
- profile->setFlags(InputFlagConverter::maskFromString(node->value));
- } else {
- profile->setFlags(OutputFlagConverter::maskFromString(node->value));
- }
- } else if (strcmp(node->name, GAINS_TAG) == 0) {
- loadAudioPortGains(node, *profile);
- }
- node = node->next;
- }
- if (formats.isEmpty()) {
- sp<AudioProfile> profileToAdd = new AudioProfile(gDynamicFormat, channels, sampleRates);
- profileToAdd->setDynamicFormat(true);
- profileToAdd->setDynamicChannels(channels.isEmpty());
- profileToAdd->setDynamicRate(sampleRates.isEmpty());
- audioProfiles.add(profileToAdd);
- } else {
- for (size_t i = 0; i < formats.size(); i++) {
- // For compatibility reason, for each format, creates a profile with the same
- // collection of rate and channels.
- sp<AudioProfile> profileToAdd = new AudioProfile(formats[i], channels, sampleRates);
- profileToAdd->setDynamicFormat(formats[i] == gDynamicFormat);
- profileToAdd->setDynamicChannels(channels.isEmpty());
- profileToAdd->setDynamicRate(sampleRates.isEmpty());
- audioProfiles.add(profileToAdd);
- }
- }
- profile->setAudioProfiles(audioProfiles);
- ALOGW_IF(!profile->hasSupportedDevices(), "load%s() invalid supported devices",
- role == AUDIO_PORT_ROLE_SINK ? "Input" : "Output");
- if (profile->hasSupportedDevices()) {
- ALOGV("load%s() adding Supported Devices %04x, mFlags %04x",
- role == AUDIO_PORT_ROLE_SINK ? "Input" : "Output",
- profile->getSupportedDevicesType(), profile->getFlags());
- return module->addProfile(profile);
- }
- return BAD_VALUE;
-}
-
-//static
-status_t ConfigParsingUtils::loadHwModule(cnode *root, sp<HwModule> &module,
- AudioPolicyConfig &config)
-{
- status_t status = NAME_NOT_FOUND;
- cnode *node = config_find(root, DEVICES_TAG);
- if (node != NULL) {
- node = node->first_child;
- DeviceVector devices;
- while (node) {
- ALOGV("loadHwModule() loading device %s", node->name);
- status_t tmpStatus = loadHwModuleDevice(node, devices);
- if (status == NAME_NOT_FOUND || status == NO_ERROR) {
- status = tmpStatus;
- }
- node = node->next;
- }
- module->setDeclaredDevices(devices);
- }
- node = config_find(root, OUTPUTS_TAG);
- if (node != NULL) {
- node = node->first_child;
- while (node) {
- ALOGV("loadHwModule() loading output %s", node->name);
- status_t tmpStatus = loadHwModuleProfile(node, module, AUDIO_PORT_ROLE_SOURCE);
- if (status == NAME_NOT_FOUND || status == NO_ERROR) {
- status = tmpStatus;
- }
- node = node->next;
- }
- }
- node = config_find(root, INPUTS_TAG);
- if (node != NULL) {
- node = node->first_child;
- while (node) {
- ALOGV("loadHwModule() loading input %s", node->name);
- status_t tmpStatus = loadHwModuleProfile(node, module, AUDIO_PORT_ROLE_SINK);
- if (status == NAME_NOT_FOUND || status == NO_ERROR) {
- status = tmpStatus;
- }
- node = node->next;
- }
- }
- loadModuleGlobalConfig(root, module, config);
- return status;
-}
-
-//static
-void ConfigParsingUtils::loadHwModules(cnode *root, HwModuleCollection &hwModules,
- AudioPolicyConfig &config)
-{
- cnode *node = config_find(root, AUDIO_HW_MODULE_TAG);
- if (node == NULL) {
- return;
- }
-
- node = node->first_child;
- while (node) {
- ALOGV("loadHwModules() loading module %s", node->name);
- sp<HwModule> module = new HwModule(node->name);
- if (loadHwModule(node, module, config) == NO_ERROR) {
- hwModules.add(module);
- }
- node = node->next;
- }
-}
-
-//static
-void ConfigParsingUtils::loadDevicesFromTag(const char *tag, DeviceVector &devices,
- const DeviceVector &declaredDevices)
-{
- char *tagLiteral = strndup(tag, strlen(tag));
- char *devTag = strtok(tagLiteral, AudioParameter::valueListSeparator);
- while (devTag != NULL) {
- if (strlen(devTag) != 0) {
- audio_devices_t type;
- if (deviceFromString(devTag, type)) {
- uint32_t inBit = type & AUDIO_DEVICE_BIT_IN;
- type &= ~AUDIO_DEVICE_BIT_IN;
- while (type) {
- audio_devices_t singleType =
- inBit | (1 << (31 - __builtin_clz(type)));
- type &= ~singleType;
- sp<DeviceDescriptor> dev = new DeviceDescriptor(singleType);
- devices.add(dev);
- }
- } else {
- sp<DeviceDescriptor> deviceDesc =
- declaredDevices.getDeviceFromTagName(String8(devTag));
- if (deviceDesc != 0) {
- devices.add(deviceDesc);
- }
- }
- }
- devTag = strtok(NULL, AudioParameter::valueListSeparator);
- }
- free(tagLiteral);
-}
-
-//static
-void ConfigParsingUtils::loadModuleGlobalConfig(cnode *root, const sp<HwModule> &module,
- AudioPolicyConfig &config)
-{
- cnode *node = config_find(root, GLOBAL_CONFIG_TAG);
-
- if (node == NULL) {
- return;
- }
- DeviceVector declaredDevices;
- if (module != NULL) {
- declaredDevices = module->getDeclaredDevices();
- }
-
- node = node->first_child;
- while (node) {
- if (strcmp(ATTACHED_OUTPUT_DEVICES_TAG, node->name) == 0) {
- DeviceVector availableOutputDevices;
- loadDevicesFromTag(node->value, availableOutputDevices, declaredDevices);
- ALOGV("loadGlobalConfig() Attached Output Devices %08x",
- availableOutputDevices.types());
- config.addAvailableOutputDevices(availableOutputDevices);
- } else if (strcmp(DEFAULT_OUTPUT_DEVICE_TAG, node->name) == 0) {
- audio_devices_t device = AUDIO_DEVICE_NONE;
- deviceFromString(node->value, device);
- if (device != AUDIO_DEVICE_NONE) {
- sp<DeviceDescriptor> defaultOutputDevice = new DeviceDescriptor(device);
- config.setDefaultOutputDevice(defaultOutputDevice);
- ALOGV("loadGlobalConfig() mDefaultOutputDevice %08x", defaultOutputDevice->type());
- } else {
- ALOGW("loadGlobalConfig() default device not specified");
- }
- } else if (strcmp(ATTACHED_INPUT_DEVICES_TAG, node->name) == 0) {
- DeviceVector availableInputDevices;
- loadDevicesFromTag(node->value, availableInputDevices, declaredDevices);
- ALOGV("loadGlobalConfig() Available InputDevices %08x", availableInputDevices.types());
- config.addAvailableInputDevices(availableInputDevices);
- } else if (strcmp(AUDIO_HAL_VERSION_TAG, node->name) == 0) {
- uint32_t major, minor;
- sscanf((char *)node->value, "%u.%u", &major, &minor);
- module->setHalVersion(major, minor);
- ALOGV("loadGlobalConfig() mHalVersion = major %u minor %u", major, minor);
- }
- node = node->next;
- }
-}
-
-//static
-void ConfigParsingUtils::loadGlobalConfig(cnode *root, AudioPolicyConfig &config,
- const sp<HwModule>& primaryModule)
-{
- cnode *node = config_find(root, GLOBAL_CONFIG_TAG);
-
- if (node == NULL) {
- return;
- }
- node = node->first_child;
- while (node) {
- if (strcmp(SPEAKER_DRC_ENABLED_TAG, node->name) == 0) {
- bool speakerDrcEnabled;
- if (utilities::convertTo<std::string, bool>(node->value, speakerDrcEnabled)) {
- ALOGV("loadGlobalConfig() mSpeakerDrcEnabled = %d", speakerDrcEnabled);
- config.setSpeakerDrcEnabled(speakerDrcEnabled);
- }
- }
- node = node->next;
- }
- loadModuleGlobalConfig(root, primaryModule, config);
-}
-
-//static
-status_t ConfigParsingUtils::loadConfig(const char *path, AudioPolicyConfig &config)
-{
- cnode *root;
- char *data;
-
- data = (char *)load_file(path, NULL);
- if (data == NULL) {
- return -ENODEV;
- }
- root = config_node("", "");
- config_load(root, data);
-
- HwModuleCollection hwModules;
- loadHwModules(root, hwModules, config);
-
- // legacy audio_policy.conf files have one global_configuration section, attached to primary.
- loadGlobalConfig(root, config, hwModules.getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY));
-
- config.setHwModules(hwModules);
-
- config.setDefaultSurroundFormats();
-
- config_free(root);
- free(root);
- free(data);
-
- ALOGI("loadAudioPolicyConfig() loaded %s\n", path);
- config.setSource(path);
-
- return NO_ERROR;
-}
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/src/Gains.cpp b/services/audiopolicy/common/managerdefinitions/src/Gains.cpp
deleted file mode 100644
index 6407a17..0000000
--- a/services/audiopolicy/common/managerdefinitions/src/Gains.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "APM::Gains"
-//#define LOG_NDEBUG 0
-
-//#define VERY_VERBOSE_LOGGING
-#ifdef VERY_VERBOSE_LOGGING
-#define ALOGVV ALOGV
-#else
-#define ALOGVV(a...) do { } while(0)
-#endif
-
-#include "Gains.h"
-#include <Volume.h>
-#include <math.h>
-#include <utils/String8.h>
-
-namespace android {
-
-// Enginedefault
-const VolumeCurvePoint
-Gains::sDefaultVolumeCurve[Volume::VOLCNT] = {
- {1, -49.5f}, {33, -33.5f}, {66, -17.0f}, {100, 0.0f}
-};
-
-
-const VolumeCurvePoint
-Gains::sDefaultMediaVolumeCurve[Volume::VOLCNT] = {
- {1, -58.0f}, {20, -40.0f}, {60, -17.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sExtMediaSystemVolumeCurve[Volume::VOLCNT] = {
- {1, -58.0f}, {20, -40.0f}, {60, -21.0f}, {100, -10.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerMediaVolumeCurve[Volume::VOLCNT] = {
- {1, -56.0f}, {20, -34.0f}, {60, -11.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerMediaVolumeCurveDrc[Volume::VOLCNT] = {
- {1, -55.0f}, {20, -43.0f}, {86, -12.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerSonificationVolumeCurve[Volume::VOLCNT] = {
- {1, -29.7f}, {33, -20.1f}, {66, -10.2f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerSonificationVolumeCurveDrc[Volume::VOLCNT] = {
- {1, -35.7f}, {33, -26.1f}, {66, -13.2f}, {100, 0.0f}
-};
-
-// AUDIO_STREAM_SYSTEM, AUDIO_STREAM_ENFORCED_AUDIBLE and AUDIO_STREAM_DTMF volume tracks
-// AUDIO_STREAM_RING on phones and AUDIO_STREAM_MUSIC on tablets.
-// AUDIO_STREAM_DTMF tracks AUDIO_STREAM_VOICE_CALL while in call (See AudioService.java).
-// The range is constrained between -24dB and -6dB over speaker and -30dB and -18dB over headset.
-
-const VolumeCurvePoint
-Gains::sDefaultSystemVolumeCurve[Volume::VOLCNT] = {
- {1, -24.0f}, {33, -18.0f}, {66, -12.0f}, {100, -6.0f}
-};
-
-const VolumeCurvePoint
-Gains::sDefaultSystemVolumeCurveDrc[Volume::VOLCNT] = {
- {1, -34.0f}, {33, -24.0f}, {66, -15.0f}, {100, -6.0f}
-};
-
-const VolumeCurvePoint
-Gains::sHeadsetSystemVolumeCurve[Volume::VOLCNT] = {
- {1, -30.0f}, {33, -26.0f}, {66, -22.0f}, {100, -18.0f}
-};
-
-const VolumeCurvePoint
-Gains::sDefaultVoiceVolumeCurve[Volume::VOLCNT] = {
- {0, -42.0f}, {33, -28.0f}, {66, -14.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSpeakerVoiceVolumeCurve[Volume::VOLCNT] = {
- {0, -24.0f}, {33, -16.0f}, {66, -8.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sLinearVolumeCurve[Volume::VOLCNT] = {
- {0, -96.0f}, {33, -68.0f}, {66, -34.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sSilentVolumeCurve[Volume::VOLCNT] = {
- {0, -96.0f}, {1, -96.0f}, {2, -96.0f}, {100, -96.0f}
-};
-
-const VolumeCurvePoint
-Gains::sFullScaleVolumeCurve[Volume::VOLCNT] = {
- {0, 0.0f}, {1, 0.0f}, {2, 0.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint
-Gains::sHearingAidVolumeCurve[Volume::VOLCNT] = {
- {1, -128.0f}, {20, -80.0f}, {60, -40.0f}, {100, 0.0f}
-};
-
-const VolumeCurvePoint *Gains::sVolumeProfiles[AUDIO_STREAM_CNT]
- [DEVICE_CATEGORY_CNT] = {
- { // AUDIO_STREAM_VOICE_CALL
- Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_SYSTEM
- Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_RING
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_MUSIC
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerMediaVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_ALARM
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_NOTIFICATION
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_BLUETOOTH_SCO
- Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_ENFORCED_AUDIBLE
- Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_DTMF
- Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sExtMediaSystemVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_TTS
- // "Transmitted Through Speaker": always silent except on DEVICE_CATEGORY_SPEAKER
- Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_ACCESSIBILITY
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sSpeakerMediaVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sHearingAidVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_REROUTING
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sFullScaleVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
- { // AUDIO_STREAM_PATCH
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_HEADSET
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EARPIECE
- Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EXT_MEDIA
- Gains::sFullScaleVolumeCurve // DEVICE_CATEGORY_HEARING_AID
- },
-};
-
-//static
-float Gains::volIndexToDb(const VolumeCurvePoint *curve, int indexMin, int indexMax, int indexInUi)
-{
- // the volume index in the UI is relative to the min and max volume indices for this stream type
- int nbSteps = 1 + curve[Volume::VOLMAX].mIndex - curve[Volume::VOLMIN].mIndex;
- int volIdx = (nbSteps * (indexInUi - indexMin)) / (indexMax - indexMin);
-
- // find what part of the curve this index volume belongs to, or if it's out of bounds
- int segment = 0;
- if (volIdx < curve[Volume::VOLMIN].mIndex) { // out of bounds
- return VOLUME_MIN_DB;
- } else if (volIdx < curve[Volume::VOLKNEE1].mIndex) {
- segment = 0;
- } else if (volIdx < curve[Volume::VOLKNEE2].mIndex) {
- segment = 1;
- } else if (volIdx <= curve[Volume::VOLMAX].mIndex) {
- segment = 2;
- } else { // out of bounds
- return 0.0f;
- }
-
- // linear interpolation in the attenuation table in dB
- float decibels = curve[segment].mDBAttenuation +
- ((float)(volIdx - curve[segment].mIndex)) *
- ( (curve[segment+1].mDBAttenuation -
- curve[segment].mDBAttenuation) /
- ((float)(curve[segment+1].mIndex -
- curve[segment].mIndex)) );
-
- ALOGVV("VOLUME vol index=[%d %d %d], dB=[%.1f %.1f %.1f]",
- curve[segment].mIndex, volIdx,
- curve[segment+1].mIndex,
- curve[segment].mDBAttenuation,
- decibels,
- curve[segment+1].mDBAttenuation);
-
- return decibels;
-}
-
-} // namespace android
diff --git a/services/audiopolicy/common/managerdefinitions/src/IOProfile.cpp b/services/audiopolicy/common/managerdefinitions/src/IOProfile.cpp
index 8660624..3788244 100644
--- a/services/audiopolicy/common/managerdefinitions/src/IOProfile.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/IOProfile.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "APM::IOProfile"
//#define LOG_NDEBUG 0
+#include <system/audio-base.h>
#include "IOProfile.h"
#include "HwModule.h"
#include "AudioGain.h"
@@ -66,19 +67,23 @@
audio_format_t myUpdatedFormat = format;
audio_channel_mask_t myUpdatedChannelMask = channelMask;
uint32_t myUpdatedSamplingRate = samplingRate;
+ const struct audio_port_config config = {
+ .config_mask = AUDIO_PORT_CONFIG_ALL & ~AUDIO_PORT_CONFIG_GAIN,
+ .sample_rate = samplingRate,
+ .channel_mask = channelMask,
+ .format = format,
+ };
if (isRecordThread)
{
- if (checkCompatibleAudioProfile(
+ if ((flags & AUDIO_INPUT_FLAG_MMAP_NOIRQ) != 0) {
+ if (checkExactAudioProfile(&config) != NO_ERROR) {
+ return false;
+ }
+ } else if (checkCompatibleAudioProfile(
myUpdatedSamplingRate, myUpdatedChannelMask, myUpdatedFormat) != NO_ERROR) {
return false;
}
} else {
- const struct audio_port_config config = {
- .config_mask = AUDIO_PORT_CONFIG_ALL & ~AUDIO_PORT_CONFIG_GAIN,
- .sample_rate = samplingRate,
- .channel_mask = channelMask,
- .format = format,
- };
if (checkExactAudioProfile(&config) != NO_ERROR) {
return false;
}
diff --git a/services/audiopolicy/common/managerdefinitions/src/StreamDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/StreamDescriptor.cpp
deleted file mode 100644
index c311a4f..0000000
--- a/services/audiopolicy/common/managerdefinitions/src/StreamDescriptor.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "APM::Volumes"
-//#define LOG_NDEBUG 0
-
-//#define VERY_VERBOSE_LOGGING
-#ifdef VERY_VERBOSE_LOGGING
-#define ALOGVV ALOGV
-#else
-#define ALOGVV(a...) do { } while(0)
-#endif
-
-#include "StreamDescriptor.h"
-#include "Gains.h"
-#include "policy.h"
-#include <utils/Log.h>
-#include <utils/String8.h>
-
-namespace android {
-
-// --- StreamDescriptor class implementation
-
-StreamDescriptor::StreamDescriptor()
- : mIndexMin(0), mIndexMax(1), mCanBeMuted(true)
-{
- // Initialize the current stream's index to mIndexMax so volume isn't 0 in
- // cases where the Java layer doesn't call into the audio policy service to
- // set the default volume.
- mIndexCur.add(AUDIO_DEVICE_OUT_DEFAULT_FOR_VOLUME, mIndexMax);
-}
-
-int StreamDescriptor::getVolumeIndex(audio_devices_t device) const
-{
- device = Volume::getDeviceForVolume(device);
- // there is always a valid entry for AUDIO_DEVICE_OUT_DEFAULT_FOR_VOLUME
- if (mIndexCur.indexOfKey(device) < 0) {
- device = AUDIO_DEVICE_OUT_DEFAULT_FOR_VOLUME;
- }
- return mIndexCur.valueFor(device);
-}
-
-void StreamDescriptor::clearCurrentVolumeIndex()
-{
- mIndexCur.clear();
-}
-
-void StreamDescriptor::addCurrentVolumeIndex(audio_devices_t device, int index)
-{
- mIndexCur.add(device, index);
-}
-
-void StreamDescriptor::setVolumeIndexMin(int volIndexMin)
-{
- mIndexMin = volIndexMin;
-}
-
-void StreamDescriptor::setVolumeIndexMax(int volIndexMax)
-{
- mIndexMax = volIndexMax;
-}
-
-void StreamDescriptor::setVolumeCurvePoint(device_category deviceCategory,
- const VolumeCurvePoint *point)
-{
- mVolumeCurve[deviceCategory] = point;
-}
-
-void StreamDescriptor::dump(String8 *dst) const
-{
- dst->appendFormat("%s %02d %02d ",
- mCanBeMuted ? "true " : "false", mIndexMin, mIndexMax);
- for (size_t i = 0; i < mIndexCur.size(); i++) {
- dst->appendFormat("%04x : %02d, ",
- mIndexCur.keyAt(i),
- mIndexCur.valueAt(i));
- }
- dst->append("\n");
-}
-
-StreamDescriptorCollection::StreamDescriptorCollection()
-{
- for (size_t stream = 0 ; stream < AUDIO_STREAM_CNT; stream++) {
- add(static_cast<audio_stream_type_t>(stream), StreamDescriptor());
- }
-}
-
-bool StreamDescriptorCollection::canBeMuted(audio_stream_type_t stream)
-{
- return valueAt(stream).canBeMuted();
-}
-
-void StreamDescriptorCollection::clearCurrentVolumeIndex(audio_stream_type_t stream)
-{
- editValueAt(stream).clearCurrentVolumeIndex();
-}
-
-void StreamDescriptorCollection::addCurrentVolumeIndex(audio_stream_type_t stream,
- audio_devices_t device, int index)
-{
- editValueAt(stream).addCurrentVolumeIndex(device, index);
-}
-
-void StreamDescriptorCollection::setVolumeCurvePoint(audio_stream_type_t stream,
- device_category deviceCategory,
- const VolumeCurvePoint *point)
-{
- editValueAt(stream).setVolumeCurvePoint(deviceCategory, point);
-}
-
-const VolumeCurvePoint *StreamDescriptorCollection::getVolumeCurvePoint(audio_stream_type_t stream,
- device_category deviceCategory) const
-{
- return valueAt(stream).getVolumeCurvePoint(deviceCategory);
-}
-
-void StreamDescriptorCollection::setVolumeIndexMin(audio_stream_type_t stream,int volIndexMin)
-{
- return editValueAt(stream).setVolumeIndexMin(volIndexMin);
-}
-
-void StreamDescriptorCollection::setVolumeIndexMax(audio_stream_type_t stream,int volIndexMax)
-{
- return editValueAt(stream).setVolumeIndexMax(volIndexMax);
-}
-
-float StreamDescriptorCollection::volIndexToDb(audio_stream_type_t stream, device_category category,
- int indexInUi) const
-{
- const StreamDescriptor &streamDesc = valueAt(stream);
- return Gains::volIndexToDb(streamDesc.getVolumeCurvePoint(category),
- streamDesc.getVolumeIndexMin(), streamDesc.getVolumeIndexMax(),
- indexInUi);
-}
-
-status_t StreamDescriptorCollection::initStreamVolume(audio_stream_type_t stream,
- int indexMin, int indexMax)
-{
- ALOGV("initStreamVolume() stream %d, min %d, max %d", stream , indexMin, indexMax);
- if (indexMin < 0 || indexMin >= indexMax) {
- ALOGW("initStreamVolume() invalid index limits for stream %d, min %d, max %d",
- stream , indexMin, indexMax);
- return BAD_VALUE;
- }
- setVolumeIndexMin(stream, indexMin);
- setVolumeIndexMax(stream, indexMax);
- return NO_ERROR;
-}
-
-void StreamDescriptorCollection::initializeVolumeCurves(bool isSpeakerDrcEnabled)
-{
- for (int i = 0; i < AUDIO_STREAM_CNT; i++) {
- for (int j = 0; j < DEVICE_CATEGORY_CNT; j++) {
- setVolumeCurvePoint(static_cast<audio_stream_type_t>(i),
- static_cast<device_category>(j),
- Gains::sVolumeProfiles[i][j]);
- }
- }
-
- // Check availability of DRC on speaker path: if available, override some of the speaker curves
- if (isSpeakerDrcEnabled) {
- setVolumeCurvePoint(AUDIO_STREAM_SYSTEM, DEVICE_CATEGORY_SPEAKER,
- Gains::sDefaultSystemVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_RING, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerSonificationVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_ALARM, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerSonificationVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_NOTIFICATION, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerSonificationVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_MUSIC, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerMediaVolumeCurveDrc);
- setVolumeCurvePoint(AUDIO_STREAM_ACCESSIBILITY, DEVICE_CATEGORY_SPEAKER,
- Gains::sSpeakerMediaVolumeCurveDrc);
- }
-}
-
-void StreamDescriptorCollection::switchVolumeCurve(audio_stream_type_t streamSrc,
- audio_stream_type_t streamDst)
-{
- for (int j = 0; j < DEVICE_CATEGORY_CNT; j++) {
- setVolumeCurvePoint(streamDst, static_cast<device_category>(j),
- Gains::sVolumeProfiles[streamSrc][j]);
- }
-}
-
-void StreamDescriptorCollection::dump(String8 *dst) const
-{
- dst->append("\nStreams dump:\n");
- dst->append(
- " Stream Can be muted Index Min Index Max Index Cur [device : index]...\n");
- for (size_t i = 0; i < size(); i++) {
- dst->appendFormat(" %02zu ", i);
- valueAt(i).dump(dst);
- }
-}
-
-} // namespace android
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_sonification_respectful.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_sonification_respectful.pfw
index cee7cd1..b673c4f 100644
--- a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_sonification_respectful.pfw
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_sonification_respectful.pfw
@@ -534,3 +534,20 @@
usb_device = 0
hdmi = 0
+ conf: None
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 58acad3..1b088bb 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -15,7 +15,12 @@
*/
#define LOG_TAG "APM_AudioPolicyManager"
-//#define LOG_NDEBUG 0
+
+// Need to keep the log statements even in production builds
+// to enable VERBOSE logging dynamically.
+// You can enable VERBOSE logging as follows:
+// adb shell setprop log.tag.APM_AudioPolicyManager V
+#define LOG_NDEBUG 0
//#define VERY_VERBOSE_LOGGING
#ifdef VERY_VERBOSE_LOGGING
@@ -44,10 +49,6 @@
#include <system/audio.h>
#include <audio_policy_conf.h>
#include "AudioPolicyManager.h"
-#ifndef USE_XML_AUDIO_POLICY_CONF
-#include <ConfigParsingUtils.h>
-#include <StreamDescriptor.h>
-#endif
#include <Serializer.h>
#include "TypeConverter.h"
#include <policy.h>
@@ -840,8 +841,9 @@
// chosen by the engine if not.
// FIXME: provide a more generic approach which is not device specific and move this back
// to getOutputForDevice.
+ // TODO: Remove check of AUDIO_STREAM_MUSIC once migration is completed on the app side.
if (device == AUDIO_DEVICE_OUT_TELEPHONY_TX &&
- *stream == AUDIO_STREAM_MUSIC &&
+ (*stream == AUDIO_STREAM_MUSIC || attributes.usage == AUDIO_USAGE_VOICE_COMMUNICATION) &&
audio_is_linear_pcm(config->format) &&
isInCall()) {
if (requestedDeviceId != AUDIO_PORT_HANDLE_NONE) {
@@ -930,7 +932,8 @@
if (stream == AUDIO_STREAM_TTS) {
*flags = AUDIO_OUTPUT_FLAG_TTS;
} else if (stream == AUDIO_STREAM_VOICE_CALL &&
- audio_is_linear_pcm(config->format)) {
+ audio_is_linear_pcm(config->format) &&
+ (*flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) == 0) {
*flags = (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_VOIP_RX |
AUDIO_OUTPUT_FLAG_DIRECT);
ALOGV("Set VoIP and Direct output flags for PCM format");
@@ -1257,13 +1260,12 @@
for (audio_io_handle_t output : outputs) {
sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueFor(output);
if (!outputDesc->isDuplicated()) {
+ if (outputDesc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) {
+ continue;
+ }
// if a valid format is specified, skip output if not compatible
if (format != AUDIO_FORMAT_INVALID) {
- if (outputDesc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) {
- if (format != outputDesc->mFormat) {
- continue;
- }
- } else if (!audio_is_linear_pcm(format)) {
+ if (!audio_is_linear_pcm(format)) {
continue;
}
if (AudioPort::isBetterFormatMatch(
@@ -1874,7 +1876,38 @@
}
if (!profile->canOpenNewIo()) {
- return AUDIO_IO_HANDLE_NONE;
+ for (size_t i = 0; i < mInputs.size(); ) {
+ sp <AudioInputDescriptor> desc = mInputs.valueAt(i);
+ if (desc->mProfile != profile) {
+ continue;
+ }
+ // if sound trigger, reuse input if used by other sound trigger on same session
+ // else
+ // reuse input if active client app is not in IDLE state
+ //
+ RecordClientVector clients = desc->clientsList();
+ bool doClose = false;
+ for (const auto& client : clients) {
+ if (isSoundTrigger != client->isSoundTrigger()) {
+ continue;
+ }
+ if (client->isSoundTrigger()) {
+ if (session == client->session()) {
+ return desc->mIoHandle;
+ }
+ continue;
+ }
+ if (client->active() && client->appState() != APP_STATE_IDLE) {
+ return desc->mIoHandle;
+ }
+ doClose = true;
+ }
+ if (doClose) {
+ closeInput(desc->mIoHandle);
+ } else {
+ i++;
+ }
+ }
}
sp<AudioInputDescriptor> inputDesc = new AudioInputDescriptor(profile, mpClientInterface);
@@ -1915,55 +1948,8 @@
return input;
}
-//static
-bool AudioPolicyManager::isConcurrentSource(audio_source_t source)
+status_t AudioPolicyManager::startInput(audio_port_handle_t portId)
{
- return (source == AUDIO_SOURCE_HOTWORD) ||
- (source == AUDIO_SOURCE_VOICE_RECOGNITION) ||
- (source == AUDIO_SOURCE_FM_TUNER);
-}
-
-// FIXME: remove when concurrent capture is ready. This is a hack to work around bug b/63083537.
-bool AudioPolicyManager::soundTriggerSupportsConcurrentCapture() {
- if (!mHasComputedSoundTriggerSupportsConcurrentCapture) {
- bool soundTriggerSupportsConcurrentCapture = false;
- unsigned int numModules = 0;
- struct sound_trigger_module_descriptor* nModules = NULL;
-
- status_t status = SoundTrigger::listModules(nModules, &numModules);
- if (status == NO_ERROR && numModules != 0) {
- nModules = (struct sound_trigger_module_descriptor*) calloc(
- numModules, sizeof(struct sound_trigger_module_descriptor));
- if (nModules == NULL) {
- // We failed to malloc the buffer, so just say no for now, and hope that we have more
- // ram the next time this function is called.
- ALOGE("Failed to allocate buffer for module descriptors");
- return false;
- }
-
- status = SoundTrigger::listModules(nModules, &numModules);
- if (status == NO_ERROR) {
- soundTriggerSupportsConcurrentCapture = true;
- for (size_t i = 0; i < numModules; ++i) {
- soundTriggerSupportsConcurrentCapture &=
- nModules[i].properties.concurrent_capture;
- }
- }
- free(nModules);
- }
- mSoundTriggerSupportsConcurrentCapture = soundTriggerSupportsConcurrentCapture;
- mHasComputedSoundTriggerSupportsConcurrentCapture = true;
- }
- return mSoundTriggerSupportsConcurrentCapture;
-}
-
-
-status_t AudioPolicyManager::startInput(audio_port_handle_t portId,
- bool silenced,
- concurrency_type__mask_t *concurrency)
-{
- *concurrency = API_INPUT_CONCURRENCY_NONE;
-
ALOGV("%s portId %d", __FUNCTION__, portId);
sp<AudioInputDescriptor> inputDesc = mInputs.getInputForClient(portId);
@@ -1980,106 +1966,16 @@
audio_session_t session = client->session();
- ALOGV("%s input:%d, session:%d, silenced:%d, concurrency:%d)",
- __FUNCTION__, input, session, silenced, *concurrency);
+ ALOGV("%s input:%d, session:%d)", __FUNCTION__, input, session);
- if (!is_virtual_input_device(inputDesc->mDevice)) {
- if (mCallTxPatch != 0 &&
- inputDesc->getModuleHandle() == mCallTxPatch->mPatch.sources[0].ext.device.hw_module) {
- ALOGW("startInput(%d) failed: call in progress", input);
- *concurrency |= API_INPUT_CONCURRENCY_CALL;
- return INVALID_OPERATION;
- }
+ Vector<sp<AudioInputDescriptor>> activeInputs = mInputs.getActiveInputs();
- Vector<sp<AudioInputDescriptor>> activeInputs = mInputs.getActiveInputs();
-
- // If a UID is idle and records silence and another not silenced recording starts
- // from another UID (idle or active) we stop the current idle UID recording in
- // favor of the new one - "There can be only one" TM
- if (!silenced) {
- for (const auto& activeDesc : activeInputs) {
- if ((activeDesc->getAudioPort()->getFlags() & AUDIO_INPUT_FLAG_MMAP_NOIRQ) != 0 &&
- activeDesc->getId() == inputDesc->getId()) {
- continue;
- }
-
- RecordClientVector activeClients = activeDesc->clientsList(true /*activeOnly*/);
- for (const auto& activeClient : activeClients) {
- if (activeClient->isSilenced()) {
- closeClient(activeClient->portId());
- ALOGV("%s client %d stopping silenced client %d", __FUNCTION__,
- portId, activeClient->portId());
- activeInputs = mInputs.getActiveInputs();
- }
- }
- }
- }
-
- for (const auto& activeDesc : activeInputs) {
- if ((client->flags() & AUDIO_INPUT_FLAG_MMAP_NOIRQ) != 0 &&
- activeDesc->getId() == inputDesc->getId()) {
- continue;
- }
-
- audio_source_t activeSource = activeDesc->inputSource(true);
- if (client->source() == AUDIO_SOURCE_HOTWORD) {
- if (activeSource == AUDIO_SOURCE_HOTWORD) {
- if (activeDesc->hasPreemptedSession(session)) {
- ALOGW("%s input %d failed for HOTWORD: "
- "other input %d already started for HOTWORD", __FUNCTION__,
- input, activeDesc->mIoHandle);
- *concurrency |= API_INPUT_CONCURRENCY_HOTWORD;
- return INVALID_OPERATION;
- }
- } else {
- ALOGV("%s input %d failed for HOTWORD: other input %d already started",
- __FUNCTION__, input, activeDesc->mIoHandle);
- *concurrency |= API_INPUT_CONCURRENCY_CAPTURE;
- return INVALID_OPERATION;
- }
- } else {
- if (activeSource != AUDIO_SOURCE_HOTWORD) {
- ALOGW("%s input %d failed: other input %d already started", __FUNCTION__,
- input, activeDesc->mIoHandle);
- *concurrency |= API_INPUT_CONCURRENCY_CAPTURE;
- return INVALID_OPERATION;
- }
- }
- }
-
- // We only need to check if the sound trigger session supports concurrent capture if the
- // input is also a sound trigger input. Otherwise, we should preempt any hotword stream
- // that's running.
- const bool allowConcurrentWithSoundTrigger =
- inputDesc->isSoundTrigger() ? soundTriggerSupportsConcurrentCapture() : false;
-
- // if capture is allowed, preempt currently active HOTWORD captures
- for (const auto& activeDesc : activeInputs) {
- if (allowConcurrentWithSoundTrigger && activeDesc->isSoundTrigger()) {
- continue;
- }
- RecordClientVector activeHotwordClients =
- activeDesc->clientsList(true, AUDIO_SOURCE_HOTWORD);
- if (activeHotwordClients.size() > 0) {
- SortedVector<audio_session_t> sessions = activeDesc->getPreemptedSessions();
-
- for (const auto& activeClient : activeHotwordClients) {
- *concurrency |= API_INPUT_CONCURRENCY_PREEMPT;
- sessions.add(activeClient->session());
- closeClient(activeClient->portId());
- ALOGV("%s input %d for HOTWORD preempting HOTWORD input %d", __FUNCTION__,
- input, activeDesc->mIoHandle);
- }
-
- inputDesc->setPreemptedSessions(sessions);
- }
- }
+ status_t status = inputDesc->start();
+ if (status != NO_ERROR) {
+ return status;
}
- // Make sure we start with the correct silence state
- client->setSilenced(silenced);
-
- // increment activity count before calling getNewInputDevice() below as only active sessions
+ // increment activity count before calling getNewInputDevice() below as only active sessions
// are considered for device selection
inputDesc->setClientActive(client, true);
@@ -2088,12 +1984,6 @@
audio_devices_t device = getNewInputDevice(inputDesc);
setInputDevice(input, device, true /* force */);
- status_t status = inputDesc->start();
- if (status != NO_ERROR) {
- inputDesc->setClientActive(client, false);
- return status;
- }
-
if (inputDesc->activeCount() == 1) {
// if input maps to a dynamic policy with an activity listener, notify of state change
if ((inputDesc->mPolicyMix != NULL)
@@ -3342,7 +3232,7 @@
SortedVector<audio_io_handle_t> inputsToClose;
for (size_t i = 0; i < mInputs.size(); i++) {
sp<AudioInputDescriptor> inputDesc = mInputs.valueAt(i);
- if (affectedSources.indexOf(inputDesc->inputSource()) >= 0) {
+ if (affectedSources.indexOf(inputDesc->source()) >= 0) {
inputsToClose.add(inputDesc->mIoHandle);
}
}
@@ -3716,17 +3606,18 @@
return profileUpdated ? NO_ERROR : INVALID_OPERATION;
}
-void AudioPolicyManager::setRecordSilenced(uid_t uid, bool silenced)
+void AudioPolicyManager::setAppState(uid_t uid, app_state_t state)
{
- ALOGV("AudioPolicyManager:setRecordSilenced(uid:%d, silenced:%d)", uid, silenced);
-
Vector<sp<AudioInputDescriptor> > activeInputs = mInputs.getActiveInputs();
+
+ ALOGV("%s(uid:%d, state:%d)", __func__, uid, state);
+
for (size_t i = 0; i < activeInputs.size(); i++) {
sp<AudioInputDescriptor> activeDesc = activeInputs[i];
RecordClientVector clients = activeDesc->clientsList(true /*activeOnly*/);
for (const auto& client : clients) {
if (uid == client->uid()) {
- client->setSilenced(silenced);
+ client->setAppState(state);
}
}
}
@@ -3788,7 +3679,6 @@
return mAudioPortGeneration++;
}
-#ifdef USE_XML_AUDIO_POLICY_CONF
// Treblized audio policy xml config will be located in /odm/etc or /vendor/etc.
static const char *kConfigLocationList[] =
{"/odm/etc", "/vendor/etc", "/system/etc"};
@@ -3820,7 +3710,6 @@
}
return ret;
}
-#endif
AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface,
bool /*forTesting*/)
@@ -3829,23 +3718,16 @@
mpClientInterface(clientInterface),
mLimitRingtoneVolume(false), mLastVoiceVolume(-1.0f),
mA2dpSuspended(false),
-#ifdef USE_XML_AUDIO_POLICY_CONF
mVolumeCurves(new VolumeCurvesCollection()),
mConfig(mHwModulesAll, mAvailableOutputDevices, mAvailableInputDevices,
mDefaultOutputDevice, static_cast<VolumeCurvesCollection*>(mVolumeCurves.get())),
-#else
- mVolumeCurves(new StreamDescriptorCollection()),
- mConfig(mHwModulesAll, mAvailableOutputDevices, mAvailableInputDevices,
- mDefaultOutputDevice),
-#endif
mAudioPortGeneration(1),
mBeaconMuteRefCount(0),
mBeaconPlayingRefCount(0),
mBeaconMuted(false),
mTtsOutputAvailable(false),
mMasterMono(false),
- mMusicEffectOutput(AUDIO_IO_HANDLE_NONE),
- mHasComputedSoundTriggerSupportsConcurrentCapture(false)
+ mMusicEffectOutput(AUDIO_IO_HANDLE_NONE)
{
}
@@ -3856,13 +3738,16 @@
initialize();
}
-void AudioPolicyManager::loadConfig() {
-#ifdef USE_XML_AUDIO_POLICY_CONF
- if (deserializeAudioPolicyXmlConfig(getConfig()) != NO_ERROR) {
-#else
- if ((ConfigParsingUtils::loadConfig(AUDIO_POLICY_VENDOR_CONFIG_FILE, getConfig()) != NO_ERROR)
- && (ConfigParsingUtils::loadConfig(AUDIO_POLICY_CONFIG_FILE, getConfig()) != NO_ERROR)) {
+// This check is to catch any legacy platform updating to Q without having
+// switched to XML since its deprecation on O.
+// TODO: after Q release, remove this check and flag as XML is now the only
+// option and all legacy platform should have transitioned to XML.
+#ifndef USE_XML_AUDIO_POLICY_CONF
+#error Audio policy no longer supports legacy .conf configuration format
#endif
+
+void AudioPolicyManager::loadConfig() {
+ if (deserializeAudioPolicyXmlConfig(getConfig()) != NO_ERROR) {
ALOGE("could not load audio policy configuration file, setting defaults");
getConfig().setDefault();
}
@@ -4070,6 +3955,9 @@
status = NO_INIT;
}
+ // Silence ALOGV statements
+ property_set("log.tag." LOG_TAG, "D");
+
updateDevicesAndOutputs();
return status;
}
@@ -4892,7 +4780,7 @@
// If we are not in call and no client is active on this input, this methods returns
// AUDIO_DEVICE_NONE, causing the patch on the input stream to be released.
- audio_source_t source = inputDesc->getHighestPrioritySource(true /*activeOnly*/);
+ audio_source_t source = inputDesc->source();
if (source == AUDIO_SOURCE_DEFAULT && isInCall()) {
source = AUDIO_SOURCE_VOICE_COMMUNICATION;
}
@@ -5231,20 +5119,6 @@
}
installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), delayMs);
}
-
- // inform all input as well
- for (size_t i = 0; i < mInputs.size(); i++) {
- const sp<AudioInputDescriptor> inputDescriptor = mInputs.valueAt(i);
- if (!is_virtual_input_device(inputDescriptor->mDevice)) {
- AudioParameter inputCmd = AudioParameter();
- ALOGV("%s: inform input %d of device:%d", __func__,
- inputDescriptor->mIoHandle, device);
- inputCmd.addInt(String8(AudioParameter::keyRouting),device);
- mpClientInterface->setParameters(inputDescriptor->mIoHandle,
- inputCmd.toString(),
- delayMs);
- }
- }
}
// update stream volumes according to new device
@@ -5888,18 +5762,8 @@
// Add reported surround sound formats to enabled surround formats.
for (size_t formatIndex = 0; formatIndex < formats.size(); formatIndex++) {
audio_format_t format = formats[formatIndex];
- switch(format) {
- case AUDIO_FORMAT_AC3:
- case AUDIO_FORMAT_E_AC3:
- case AUDIO_FORMAT_DTS:
- case AUDIO_FORMAT_DTS_HD:
- case AUDIO_FORMAT_AAC_LC:
- case AUDIO_FORMAT_DOLBY_TRUEHD:
- case AUDIO_FORMAT_E_AC3_JOC:
- mSurroundFormats.insert(format);
- break;
- default:
- break;
+ if (mConfig.getSurroundFormats().count(format) != 0) {
+ mSurroundFormats.insert(format);
}
}
}
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index f559b7f..22bfab0 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -134,9 +134,7 @@
audio_port_handle_t *portId);
// indicates to the audio policy manager that the input starts being used.
- virtual status_t startInput(audio_port_handle_t portId,
- bool silenced,
- concurrency_type__mask_t *concurrency);
+ virtual status_t startInput(audio_port_handle_t portId);
// indicates to the audio policy manager that the input stops being used.
virtual status_t stopInput(audio_port_handle_t portId);
@@ -242,7 +240,7 @@
// return the strategy corresponding to a given stream type
routing_strategy getStrategy(audio_stream_type_t stream) const;
- virtual void setRecordSilenced(uid_t uid, bool silenced);
+ virtual void setAppState(uid_t uid, app_state_t state);
protected:
// A constructor that allows more fine-grained control over initialization process,
@@ -539,8 +537,6 @@
void clearAudioSources(uid_t uid);
- static bool isConcurrentSource(audio_source_t source);
-
static bool streamsMatchForvolume(audio_stream_type_t stream1,
audio_stream_type_t stream2);
@@ -704,10 +700,6 @@
int delayMs,
uid_t uid,
sp<AudioPatch> *patchDescPtr);
-
- bool soundTriggerSupportsConcurrentCapture();
- bool mSoundTriggerSupportsConcurrentCapture;
- bool mHasComputedSoundTriggerSupportsConcurrentCapture;
};
};
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 02ab07f..c2ce754 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -454,23 +454,6 @@
return rawbuffer;
}
-static std::string audioConcurrencyString(
- AudioPolicyInterface::concurrency_type__mask_t concurrency)
-{
- char buffer[64]; // oversized
- if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL) {
- snprintf(buffer, sizeof(buffer), "%s%s%s%s",
- (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CALL)? ",call":"",
- (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CAPTURE)? ",capture":"",
- (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_HOTWORD)? ",hotword":"",
- (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_PREEMPT)? ",preempt":"");
- } else {
- snprintf(buffer, sizeof(buffer), ",none");
- }
-
- return &buffer[1];
-}
-
std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
std::string typeStr;
struct audio_port port = {};
@@ -482,7 +465,7 @@
return typeStr;
}
-status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenced)
+status_t AudioPolicyService::startInput(audio_port_handle_t portId)
{
if (mAudioPolicyManager == NULL) {
return NO_INIT;
@@ -505,17 +488,16 @@
return PERMISSION_DENIED;
}
- // If UID inactive it records silence until becoming active
- *silenced = !mUidPolicy->isUidActive(client->uid) && !client->isVirtualDevice;
-
Mutex::Autolock _l(mLock);
- AudioPolicyInterface::concurrency_type__mask_t concurrency =
- AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE;
+
+ client->active = true;
+ client->startTimeNs = systemTime();
+ updateUidStates_l();
status_t status;
{
AutoCallerClear acc;
- status = mAudioPolicyManager->startInput(portId, *silenced, &concurrency);
+ status = mAudioPolicyManager->startInput(portId);
}
@@ -524,7 +506,6 @@
static constexpr char kAudioPolicy[] = "audiopolicy";
- static constexpr char kAudioPolicyReason[] = "android.media.audiopolicy.reason";
static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
@@ -541,7 +522,6 @@
MediaAnalyticsItem *item = new MediaAnalyticsItem(kAudioPolicy);
if (item != NULL) {
- item->setCString(kAudioPolicyReason, audioConcurrencyString(concurrency).c_str());
item->setInt32(kAudioPolicyStatus, status);
item->setCString(kAudioPolicyRqstSrc,
@@ -556,54 +536,35 @@
item->setCString(
kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
- // figure out who is active
- // NB: might the other party have given up the microphone since then? how sure.
- // perhaps could have given up on it.
- // we hold mLock, so perhaps we're safe for this looping
- if (concurrency != AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE) {
- int count = mAudioRecordClients.size();
- for (int i = 0; i<count ; i++) {
- if (portId == mAudioRecordClients.keyAt(i)) {
- continue;
+ int count = mAudioRecordClients.size();
+ for (int i = 0; i < count ; i++) {
+ if (portId == mAudioRecordClients.keyAt(i)) {
+ continue;
+ }
+ sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
+ if (other->active) {
+ // keeps the last of the clients marked active
+ item->setCString(kAudioPolicyActiveSrc,
+ audioSourceString(other->attributes.source).c_str());
+ item->setInt32(kAudioPolicyActiveSession, other->session);
+ if (other->opPackageName.size() != 0) {
+ item->setCString(kAudioPolicyActivePkg,
+ std::string(String8(other->opPackageName).string()).c_str());
+ } else {
+ item->setCString(kAudioPolicyRqstPkg,
+ std::to_string(other->uid).c_str());
}
- sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
- if (other->active) {
- // keeps the last of the clients marked active
- item->setCString(kAudioPolicyActiveSrc,
- audioSourceString(other->attributes.source).c_str());
- item->setInt32(kAudioPolicyActiveSession, other->session);
- if (other->opPackageName.size() != 0) {
- item->setCString(kAudioPolicyActivePkg,
- std::string(String8(other->opPackageName).string()).c_str());
- } else {
- item->setCString(kAudioPolicyRqstPkg,
- std::to_string(other->uid).c_str());
- }
- item->setCString(kAudioPolicyActiveDevice,
- getDeviceTypeStrForPortId(other->deviceId).c_str());
- }
+ item->setCString(kAudioPolicyActiveDevice,
+ getDeviceTypeStrForPortId(other->deviceId).c_str());
}
}
item->selfrecord();
delete item;
item = NULL;
}
- }
-
- if (status == NO_ERROR) {
- LOG_ALWAYS_FATAL_IF(concurrency & ~AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL,
- "startInput(): invalid concurrency type %d", (int)concurrency);
-
- // enforce permission (if any) required for each type of concurrency
- if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CALL) {
- //TODO: check incall capture permission
- }
- if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CAPTURE) {
- //TODO: check concurrent capture permission
- }
-
- client->active = true;
- } else {
+ client->active = false;
+ client->startTimeNs = 0;
+ updateUidStates_l();
finishRecording(client->opPackageName, client->uid);
}
@@ -615,6 +576,7 @@
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
+
Mutex::Autolock _l(mLock);
ssize_t index = mAudioRecordClients.indexOfKey(portId);
@@ -624,6 +586,9 @@
sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
client->active = false;
+ client->startTimeNs = 0;
+
+ updateUidStates_l();
// finish the recording app op
finishRecording(client->opPackageName, client->uid);
@@ -646,6 +611,14 @@
return;
}
client = mAudioRecordClients.valueAt(index);
+
+ if (client->active) {
+ ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
+ client->active = false;
+ client->startTimeNs = 0;
+ updateUidStates_l();
+ }
+
mAudioRecordClients.removeItem(portId);
}
if (client == 0) {
@@ -1135,4 +1108,18 @@
return mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled);
}
+status_t AudioPolicyService::setAssistantUid(uid_t uid)
+{
+ Mutex::Autolock _l(mLock);
+ mUidPolicy->setAssistantUid(uid);
+ return NO_ERROR;
+}
+
+status_t AudioPolicyService::setA11yServicesUids(const std::vector<uid_t>& uids)
+{
+ Mutex::Autolock _l(mLock);
+ mUidPolicy->setA11yUids(uids);
+ return NO_ERROR;
+}
+
} // namespace android
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index b1ed522..2893872 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -340,17 +340,141 @@
return NO_ERROR;
}
-void AudioPolicyService::setRecordSilenced(uid_t uid, bool silenced)
+void AudioPolicyService::updateUidStates()
{
- {
- Mutex::Autolock _l(mLock);
- if (mAudioPolicyManager) {
- AutoCallerClear acc;
- mAudioPolicyManager->setRecordSilenced(uid, silenced);
+ Mutex::Autolock _l(mLock);
+ updateUidStates_l();
+}
+
+void AudioPolicyService::updateUidStates_l()
+{
+// Go over all active clients and allow capture (does not force silence) in the
+// following cases:
+// - The client is the assistant AND
+// an accessibility service is on TOP AND the source is VOICE_RECOGNITION or HOTWORD
+// OR
+// is on TOP AND uses VOICE_RECOGNITION
+// OR uses HOTWORD AND there is no privacy sensitive active capture
+// - The client is an accessibility service AND
+// is on TOP AND the source is VOICE_RECOGNITION or HOTWORD
+// - Any other client AND
+// The assistant is not on TOP AND
+// is on TOP OR latest started AND
+// there is no privacy sensitive active capture
+//TODO: mamanage pre processing effects according to use case priority
+
+ sp<AudioRecordClient> topActive;
+ sp<AudioRecordClient> latestActive;
+ nsecs_t latestStartNs = 0;
+ sp<AudioRecordClient> latestSensitiveActive;
+ nsecs_t latestSensitiveStartNs = 0;
+ bool isA11yOnTop = mUidPolicy->isA11yOnTop();
+ bool isAssistantOnTop = false;
+ bool isSensitiveActive = false;
+
+ for (size_t i =0; i < mAudioRecordClients.size(); i++) {
+ sp<AudioRecordClient> current = mAudioRecordClients[i];
+ if (!current->active) continue;
+ if (isPrivacySensitive(current->attributes.source)) {
+ if (current->startTimeNs > latestSensitiveStartNs) {
+ latestSensitiveActive = current;
+ latestSensitiveStartNs = current->startTimeNs;
+ }
+ isSensitiveActive = true;
}
+ if (mUidPolicy->getUidState(current->uid) == ActivityManager::PROCESS_STATE_TOP) {
+ topActive = current;
+ latestActive = nullptr;
+ if (mUidPolicy->isAssistantUid(current->uid)) {
+ isAssistantOnTop = true;
+ }
+ }
+ if (current->startTimeNs > latestStartNs) {
+ latestActive = current;
+ latestStartNs = current->startTimeNs;
+ }
+ }
+
+ if (topActive == nullptr && latestActive == nullptr) {
+ return;
+ }
+
+ for (size_t i =0; i < mAudioRecordClients.size(); i++) {
+ sp<AudioRecordClient> current = mAudioRecordClients[i];
+ if (!current->active) continue;
+
+ audio_source_t source = current->attributes.source;
+ bool isOnTop = mUidPolicy->getUidState(current->uid) == ActivityManager::PROCESS_STATE_TOP;
+ bool isLatest = current == latestActive;
+ bool isLatestSensitive = current == latestSensitiveActive;
+ bool forceIdle = true;
+ if (mUidPolicy->isAssistantUid(current->uid)) {
+ if (isA11yOnTop) {
+ if (source == AUDIO_SOURCE_HOTWORD || source == AUDIO_SOURCE_VOICE_RECOGNITION) {
+ forceIdle = false;
+ }
+ } else {
+ if (((isOnTop && source == AUDIO_SOURCE_VOICE_RECOGNITION) ||
+ source == AUDIO_SOURCE_HOTWORD) && !isSensitiveActive) {
+ forceIdle = false;
+ }
+ }
+ } else if (mUidPolicy->isA11yUid(current->uid)) {
+ if (isOnTop &&
+ (source == AUDIO_SOURCE_VOICE_RECOGNITION || source == AUDIO_SOURCE_HOTWORD)) {
+ forceIdle = false;
+ }
+ } else {
+ if (!isAssistantOnTop && (isOnTop || (topActive == nullptr && isLatest)) &&
+ (!isSensitiveActive || isLatestSensitive)) {
+ forceIdle = false;
+ }
+ }
+ setAppState_l(current->uid,
+ forceIdle ? APP_STATE_IDLE :
+ apmStatFromAmState(mUidPolicy->getUidState(current->uid)));
+ }
+}
+
+/* static */
+app_state_t AudioPolicyService::apmStatFromAmState(int amState) {
+ switch (amState) {
+ case ActivityManager::PROCESS_STATE_UNKNOWN:
+ return APP_STATE_IDLE;
+ case ActivityManager::PROCESS_STATE_TOP:
+ return APP_STATE_TOP;
+ default:
+ break;
+ }
+ return APP_STATE_FOREGROUND;
+}
+
+/* static */
+bool AudioPolicyService::isPrivacySensitive(audio_source_t source)
+{
+ switch (source) {
+ case AUDIO_SOURCE_VOICE_UPLINK:
+ case AUDIO_SOURCE_VOICE_DOWNLINK:
+ case AUDIO_SOURCE_VOICE_CALL:
+ case AUDIO_SOURCE_CAMCORDER:
+ case AUDIO_SOURCE_VOICE_COMMUNICATION:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+void AudioPolicyService::setAppState_l(uid_t uid, app_state_t state)
+{
+ AutoCallerClear acc;
+
+ if (mAudioPolicyManager) {
+ mAudioPolicyManager->setAppState(uid, state);
}
sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
if (af) {
+ bool silenced = state == APP_STATE_IDLE;
af->setRecordSilenced(uid, silenced);
}
}
@@ -510,7 +634,8 @@
ActivityManager am;
am.registerUidObserver(this, ActivityManager::UID_OBSERVER_GONE
| ActivityManager::UID_OBSERVER_IDLE
- | ActivityManager::UID_OBSERVER_ACTIVE,
+ | ActivityManager::UID_OBSERVER_ACTIVE
+ | ActivityManager::UID_OBSERVER_PROCSTATE,
ActivityManager::PROCESS_STATE_UNKNOWN,
String16("audioserver"));
status_t res = am.linkToDeath(this);
@@ -519,6 +644,7 @@
mObserverRegistered = true;
} else {
ALOGE("UidPolicy::registerSelf linkToDeath failed: %d", res);
+
am.unregisterUidObserver(this);
}
}
@@ -537,8 +663,7 @@
mObserverRegistered = false;
}
-bool AudioPolicyService::UidPolicy::isUidActive(uid_t uid) {
- if (isServiceUid(uid)) return true;
+void AudioPolicyService::UidPolicy::checkRegistered() {
bool needToReregister = false;
{
Mutex::Autolock _l(mLock);
@@ -548,92 +673,182 @@
// Looks like ActivityManager has died previously, attempt to re-register.
registerSelf();
}
+}
+
+bool AudioPolicyService::UidPolicy::isUidActive(uid_t uid) {
+ if (isServiceUid(uid)) return true;
+ checkRegistered();
{
Mutex::Autolock _l(mLock);
auto overrideIter = mOverrideUids.find(uid);
if (overrideIter != mOverrideUids.end()) {
- return overrideIter->second;
+ return overrideIter->second.first;
}
// In an absense of the ActivityManager, assume everything to be active.
if (!mObserverRegistered) return true;
auto cacheIter = mCachedUids.find(uid);
if (cacheIter != mCachedUids.end()) {
- return cacheIter->second;
+ return cacheIter->second.first;
}
}
ActivityManager am;
bool active = am.isUidActive(uid, String16("audioserver"));
{
Mutex::Autolock _l(mLock);
- mCachedUids.insert(std::pair<uid_t, bool>(uid, active));
+ mCachedUids.insert(std::pair<uid_t,
+ std::pair<bool, int>>(uid, std::pair<bool, int>(active,
+ ActivityManager::PROCESS_STATE_UNKNOWN)));
}
return active;
}
+int AudioPolicyService::UidPolicy::getUidState(uid_t uid) {
+ if (isServiceUid(uid)) {
+ return ActivityManager::PROCESS_STATE_TOP;
+ }
+ checkRegistered();
+ {
+ Mutex::Autolock _l(mLock);
+ auto overrideIter = mOverrideUids.find(uid);
+ if (overrideIter != mOverrideUids.end()) {
+ if (overrideIter->second.first) {
+ if (overrideIter->second.second != ActivityManager::PROCESS_STATE_UNKNOWN) {
+ return overrideIter->second.second;
+ } else {
+ auto cacheIter = mCachedUids.find(uid);
+ if (cacheIter != mCachedUids.end()) {
+ return cacheIter->second.second;
+ }
+ }
+ }
+ return ActivityManager::PROCESS_STATE_UNKNOWN;
+ }
+ // In an absense of the ActivityManager, assume everything to be active.
+ if (!mObserverRegistered) {
+ return ActivityManager::PROCESS_STATE_TOP;
+ }
+ auto cacheIter = mCachedUids.find(uid);
+ if (cacheIter != mCachedUids.end()) {
+ if (cacheIter->second.first) {
+ return cacheIter->second.second;
+ } else {
+ return ActivityManager::PROCESS_STATE_UNKNOWN;
+ }
+ }
+ }
+ ActivityManager am;
+ bool active = am.isUidActive(uid, String16("audioserver"));
+ int state = ActivityManager::PROCESS_STATE_UNKNOWN;
+ if (active) {
+ state = am.getUidProcessState(uid, String16("audioserver"));
+ }
+ {
+ Mutex::Autolock _l(mLock);
+ mCachedUids.insert(std::pair<uid_t,
+ std::pair<bool, int>>(uid, std::pair<bool, int>(active, state)));
+ }
+
+ return state;
+}
+
void AudioPolicyService::UidPolicy::onUidActive(uid_t uid) {
- updateUidCache(uid, true, true);
+ updateUid(&mCachedUids, uid, true, ActivityManager::PROCESS_STATE_UNKNOWN, true);
}
void AudioPolicyService::UidPolicy::onUidGone(uid_t uid, __unused bool disabled) {
- updateUidCache(uid, false, false);
+ updateUid(&mCachedUids, uid, false, ActivityManager::PROCESS_STATE_UNKNOWN, false);
}
void AudioPolicyService::UidPolicy::onUidIdle(uid_t uid, __unused bool disabled) {
- updateUidCache(uid, false, true);
+ updateUid(&mCachedUids, uid, false, ActivityManager::PROCESS_STATE_UNKNOWN, true);
}
-void AudioPolicyService::UidPolicy::notifyService(uid_t uid, bool active) {
- sp<AudioPolicyService> service = mService.promote();
- if (service != nullptr) {
- service->setRecordSilenced(uid, !active);
+void AudioPolicyService::UidPolicy::onUidStateChanged(uid_t uid,
+ int32_t procState,
+ int64_t procStateSeq __unused) {
+ if (procState != ActivityManager::PROCESS_STATE_UNKNOWN) {
+ updateUid(&mCachedUids, uid, true, procState, true);
}
}
void AudioPolicyService::UidPolicy::updateOverrideUid(uid_t uid, bool active, bool insert) {
- if (isServiceUid(uid)) return;
- bool wasOverridden = false, wasActive = false;
- {
- Mutex::Autolock _l(mLock);
- updateUidLocked(&mOverrideUids, uid, active, insert, &wasOverridden, &wasActive);
- }
- if (!wasOverridden && insert) {
- notifyService(uid, active); // Started to override.
- } else if (wasOverridden && !insert) {
- notifyService(uid, isUidActive(uid)); // Override ceased, notify with ground truth.
- } else if (wasActive != active) {
- notifyService(uid, active); // Override updated.
+ updateUid(&mOverrideUids, uid, active, ActivityManager::PROCESS_STATE_UNKNOWN, insert);
+}
+
+void AudioPolicyService::UidPolicy::notifyService() {
+ sp<AudioPolicyService> service = mService.promote();
+ if (service != nullptr) {
+ service->updateUidStates();
}
}
-void AudioPolicyService::UidPolicy::updateUidCache(uid_t uid, bool active, bool insert) {
- if (isServiceUid(uid)) return;
- bool wasActive = false;
+void AudioPolicyService::UidPolicy::updateUid(std::unordered_map<uid_t,
+ std::pair<bool, int>> *uids,
+ uid_t uid,
+ bool active,
+ int state,
+ bool insert) {
+ if (isServiceUid(uid)) {
+ return;
+ }
+ bool wasActive = isUidActive(uid);
+ int previousState = getUidState(uid);
{
Mutex::Autolock _l(mLock);
- updateUidLocked(&mCachedUids, uid, active, insert, nullptr, &wasActive);
- // Do not notify service if currently overridden.
- if (mOverrideUids.find(uid) != mOverrideUids.end()) return;
+ updateUidLocked(uids, uid, active, state, insert);
}
- bool nowActive = active && insert;
- if (wasActive != nowActive) notifyService(uid, nowActive);
+ if (wasActive != isUidActive(uid) || state != previousState) {
+ notifyService();
+ }
}
-void AudioPolicyService::UidPolicy::updateUidLocked(std::unordered_map<uid_t, bool> *uids,
- uid_t uid, bool active, bool insert, bool *wasThere, bool *wasActive) {
+void AudioPolicyService::UidPolicy::updateUidLocked(std::unordered_map<uid_t,
+ std::pair<bool, int>> *uids,
+ uid_t uid,
+ bool active,
+ int state,
+ bool insert) {
auto it = uids->find(uid);
if (it != uids->end()) {
- if (wasThere != nullptr) *wasThere = true;
- if (wasActive != nullptr) *wasActive = it->second;
if (insert) {
- it->second = active;
+ if (state == ActivityManager::PROCESS_STATE_UNKNOWN) {
+ it->second.first = active;
+ }
+ if (it->second.first) {
+ it->second.second = state;
+ } else {
+ it->second.second = ActivityManager::PROCESS_STATE_UNKNOWN;
+ }
} else {
uids->erase(it);
}
- } else if (insert) {
- uids->insert(std::pair<uid_t, bool>(uid, active));
+ } else if (insert && (state == ActivityManager::PROCESS_STATE_UNKNOWN)) {
+ uids->insert(std::pair<uid_t, std::pair<bool, int>>(uid,
+ std::pair<bool, int>(active, state)));
}
}
+bool AudioPolicyService::UidPolicy::isA11yOnTop() {
+ for (const auto &uid : mCachedUids) {
+ std::vector<uid_t>::iterator it = find(mA11yUids.begin(), mA11yUids.end(), uid.first);
+ if (it == mA11yUids.end()) {
+ continue;
+ }
+ if (uid.second.second == ActivityManager::PROCESS_STATE_TOP ||
+ uid.second.second == ActivityManager::PROCESS_STATE_FOREGROUND_SERVICE ||
+ uid.second.second == ActivityManager::PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool AudioPolicyService::UidPolicy::isA11yUid(uid_t uid)
+{
+ std::vector<uid_t>::iterator it = find(mA11yUids.begin(), mA11yUids.end(), uid);
+ return it != mA11yUids.end();
+}
+
// ----------- AudioPolicyService::AudioCommandThread implementation ----------
AudioPolicyService::AudioCommandThread::AudioCommandThread(String8 name,
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 6c55647..dc5a36d 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -94,8 +94,7 @@
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId = NULL,
audio_port_handle_t *portId = NULL);
- virtual status_t startInput(audio_port_handle_t portId,
- bool *silenced);
+ virtual status_t startInput(audio_port_handle_t portId);
virtual status_t stopInput(audio_port_handle_t portId);
virtual void releaseInput(audio_port_handle_t portId);
virtual status_t initStreamVolume(audio_stream_type_t stream,
@@ -214,6 +213,9 @@
bool reported);
virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);
+ virtual status_t setAssistantUid(uid_t uid);
+ virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids);
+
status_t doStopOutput(audio_port_handle_t portId);
void doReleaseOutput(audio_port_handle_t portId);
@@ -250,7 +252,7 @@
virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args);
// Sets whether the given UID records only silence
- virtual void setRecordSilenced(uid_t uid, bool silenced);
+ virtual void setAppState_l(uid_t uid, app_state_t state);
// Overrides the UID state as if it is idle
status_t handleSetUidState(Vector<String16>& args, int err);
@@ -268,6 +270,13 @@
status_t getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects);
+ app_state_t apmStatFromAmState(int amState);
+
+ void updateUidStates();
+ void updateUidStates_l();
+
+ static bool isPrivacySensitive(audio_source_t source);
+
// If recording we need to make sure the UID is allowed to do that. If the UID is idle
// then it cannot record and gets buffers with zeros - silence. As soon as the UID
// transitions to an active state we will start reporting buffers with data. This approach
@@ -277,7 +286,7 @@
class UidPolicy : public BnUidObserver, public virtual IBinder::DeathRecipient {
public:
explicit UidPolicy(wp<AudioPolicyService> service)
- : mService(service), mObserverRegistered(false) {}
+ : mService(service), mObserverRegistered(false), mAssistantUid(0) {}
void registerSelf();
void unregisterSelf();
@@ -286,27 +295,39 @@
void binderDied(const wp<IBinder> &who) override;
bool isUidActive(uid_t uid);
+ int getUidState(uid_t uid);
+ void setAssistantUid(uid_t uid) { mAssistantUid = uid; }
+ bool isAssistantUid(uid_t uid) { return uid == mAssistantUid; }
+ void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
+ bool isA11yUid(uid_t uid);
+ bool isA11yOnTop();
// BnUidObserver implementation
void onUidActive(uid_t uid) override;
void onUidGone(uid_t uid, bool disabled) override;
void onUidIdle(uid_t uid, bool disabled) override;
+ void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq);
void addOverrideUid(uid_t uid, bool active) { updateOverrideUid(uid, active, true); }
void removeOverrideUid(uid_t uid) { updateOverrideUid(uid, false, false); }
- private:
- void notifyService(uid_t uid, bool active);
+ void updateUid(std::unordered_map<uid_t, std::pair<bool, int>> *uids,
+ uid_t uid, bool active, int state, bool insert);
+
+ private:
+ void notifyService();
void updateOverrideUid(uid_t uid, bool active, bool insert);
- void updateUidCache(uid_t uid, bool active, bool insert);
- void updateUidLocked(std::unordered_map<uid_t, bool> *uids,
- uid_t uid, bool active, bool insert, bool *wasThere, bool *wasActive);
+ void updateUidLocked(std::unordered_map<uid_t, std::pair<bool, int>> *uids,
+ uid_t uid, bool active, int state, bool insert);
+ void checkRegistered();
wp<AudioPolicyService> mService;
Mutex mLock;
bool mObserverRegistered;
- std::unordered_map<uid_t, bool> mOverrideUids;
- std::unordered_map<uid_t, bool> mCachedUids;
+ std::unordered_map<uid_t, std::pair<bool, int>> mOverrideUids;
+ std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids;
+ uid_t mAssistantUid;
+ std::vector<uid_t> mA11yUids;
};
// Thread used to send audio config commands to audio flinger
@@ -631,12 +652,11 @@
const audio_session_t session, const audio_port_handle_t deviceId,
const String16& opPackageName) :
AudioClient(attributes, io, uid, pid, session, deviceId),
- opPackageName(opPackageName), isConcurrent(false), isVirtualDevice(false) {}
+ opPackageName(opPackageName), startTimeNs(0) {}
~AudioRecordClient() override = default;
const String16 opPackageName; // client package name
- bool isConcurrent; // is allowed to concurrent capture
- bool isVirtualDevice; // uses virtual device: updated by APM::getInputForAttr()
+ nsecs_t startTimeNs;
};
// --- AudioPlaybackClient ---
diff --git a/services/audiopolicy/tests/Android.mk b/services/audiopolicy/tests/Android.mk
index 513312e..2ccb542 100644
--- a/services/audiopolicy/tests/Android.mk
+++ b/services/audiopolicy/tests/Android.mk
@@ -41,6 +41,9 @@
libmedia_helper \
libutils
+LOCAL_HEADER_LIBRARIES := \
+ libmedia_headers
+
LOCAL_SRC_FILES := \
systemaudio_tests.cpp \
diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index 9f2515e..025f0b2 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -72,7 +72,6 @@
"libbinder",
"libcutils",
"libmedia",
- "libmediandk",
"libmediautils",
"libcamera_client",
"libcamera_metadata",
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 4dacd02..32b07fa 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -190,7 +190,9 @@
for (auto& cameraId : deviceIds) {
String8 id8 = String8(cameraId.c_str());
- onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
+ if (getCameraState(id8) == nullptr) {
+ onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
+ }
}
return OK;
@@ -1579,6 +1581,24 @@
Status CameraService::notifySystemEvent(int32_t eventId,
const std::vector<int32_t>& args) {
+ const int pid = CameraThreadState::getCallingPid();
+ const int selfPid = getpid();
+
+ // Permission checks
+ if (pid != selfPid) {
+ // Ensure we're being called by system_server, or similar process with
+ // permissions to notify the camera service about system events
+ if (!checkCallingPermission(
+ String16("android.permission.CAMERA_SEND_SYSTEM_EVENTS"))) {
+ const int uid = CameraThreadState::getCallingUid();
+ ALOGE("Permission Denial: cannot send updates to camera service about system"
+ " events from pid=%d, uid=%d", pid, uid);
+ return STATUS_ERROR_FMT(ERROR_PERMISSION_DENIED,
+ "No permission to send updates to camera service about system events"
+ " from pid=%d, uid=%d", pid, uid);
+ }
+ }
+
ATRACE_CALL();
switch(eventId) {
@@ -1993,9 +2013,6 @@
status_t CameraService::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
uint32_t flags) {
- const int pid = CameraThreadState::getCallingPid();
- const int selfPid = getpid();
-
// Permission checks
switch (code) {
case SHELL_COMMAND_TRANSACTION: {
@@ -2022,20 +2039,6 @@
}
return NO_ERROR;
}
- case BnCameraService::NOTIFYSYSTEMEVENT: {
- if (pid != selfPid) {
- // Ensure we're being called by system_server, or similar process with
- // permissions to notify the camera service about system events
- if (!checkCallingPermission(
- String16("android.permission.CAMERA_SEND_SYSTEM_EVENTS"))) {
- const int uid = CameraThreadState::getCallingUid();
- ALOGE("Permission Denial: cannot send updates to camera service about system"
- " events from pid=%d, uid=%d", pid, uid);
- return PERMISSION_DENIED;
- }
- }
- break;
- }
}
return BnCameraService::onTransact(code, data, reply, flags);
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 064863f..d332f6e 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -536,6 +536,7 @@
void onUidGone(uid_t uid, bool disabled);
void onUidActive(uid_t uid);
void onUidIdle(uid_t uid, bool disabled);
+ void onUidStateChanged(uid_t uid __unused, int32_t procState __unused, int64_t procStateSeq __unused) {}
void addOverrideUid(uid_t uid, String16 callingPackage, bool active);
void removeOverrideUid(uid_t uid, String16 callingPackage);
diff --git a/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp b/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp
index 97f7fdc..5029d4b 100644
--- a/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp
+++ b/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp
@@ -490,7 +490,6 @@
ATRACE_CALL();
SharedParameters::Lock l(client->getParameters());
Vector<int32_t> outputStreams;
- uint8_t captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
/**
* Set up output streams in the request
@@ -520,7 +519,6 @@
if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
outputStreams.push(client->getRecordingStreamId());
- captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT);
}
res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
@@ -530,10 +528,6 @@
&mCaptureId, 1);
}
if (res == OK) {
- res = mCaptureRequest.update(ANDROID_CONTROL_CAPTURE_INTENT,
- &captureIntent, 1);
- }
- if (res == OK) {
res = mCaptureRequest.sort();
}
@@ -683,6 +677,8 @@
sp<Camera2Client> &client) {
ATRACE_CALL();
status_t res;
+ uint8_t captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
+
if (mCaptureRequest.entryCount() == 0) {
res = client->getCameraDevice()->createDefaultRequest(
CAMERA2_TEMPLATE_STILL_CAPTURE,
@@ -695,6 +691,16 @@
}
}
+ if (params.state == Parameters::VIDEO_SNAPSHOT) {
+ captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT);
+ }
+ res = mCaptureRequest.update(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+ if (res != OK) {
+ ALOGE("%s: Camera %d: Unable to update capture intent: %s (%d)",
+ __FUNCTION__, client->getCameraId(), strerror(-res), res);
+ return res;
+ }
+
res = params.updateRequest(&mCaptureRequest);
if (res != OK) {
ALOGE("%s: Camera %d: Unable to update common entries of capture "
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 58471b9..856af13 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -181,7 +181,14 @@
});
}
- mInterface = new HalInterface(session, queue);
+ camera_metadata_entry bufMgrMode =
+ mDeviceInfo.find(ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION);
+ if (bufMgrMode.count > 0) {
+ mUseHalBufManager = (bufMgrMode.data.u8[0] ==
+ ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5);
+ }
+
+ mInterface = new HalInterface(session, queue, mUseHalBufManager);
std::string providerType;
mVendorTagId = manager->getProviderTagIdLocked(mId.string());
mTagMonitor.initialize(mVendorTagId);
@@ -230,23 +237,6 @@
/** Register in-flight map to the status tracker */
mInFlightStatusId = mStatusTracker->addComponent();
- /** Create buffer manager */
- mBufferManager = new Camera3BufferManager();
-
- Vector<int32_t> sessionParamKeys;
- camera_metadata_entry_t sessionKeysEntry = mDeviceInfo.find(
- ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
- if (sessionKeysEntry.count > 0) {
- sessionParamKeys.insertArrayAt(sessionKeysEntry.data.i32, 0, sessionKeysEntry.count);
- }
-
- camera_metadata_entry bufMgrMode =
- mDeviceInfo.find(ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION);
- if (bufMgrMode.count > 0) {
- mUseHalBufManager = (bufMgrMode.data.u8[0] ==
- ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5);
- }
-
if (mUseHalBufManager) {
res = mRequestBufferSM.initialize(mStatusTracker);
if (res != OK) {
@@ -258,6 +248,16 @@
}
}
+ /** Create buffer manager */
+ mBufferManager = new Camera3BufferManager();
+
+ Vector<int32_t> sessionParamKeys;
+ camera_metadata_entry_t sessionKeysEntry = mDeviceInfo.find(
+ ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
+ if (sessionKeysEntry.count > 0) {
+ sessionParamKeys.insertArrayAt(sessionKeysEntry.data.i32, 0, sessionKeysEntry.count);
+ }
+
/** Start up request queue thread */
mRequestThread = new RequestThread(
this, mStatusTracker, mInterface, sessionParamKeys, mUseHalBufManager);
@@ -1330,14 +1330,24 @@
}
bDst.stream = stream->asHalStream();
- buffer_handle_t *buffer;
+ bool noBufferReturned = false;
+ buffer_handle_t *buffer = nullptr;
if (mUseHalBufManager) {
+ // This is suspicious most of the time but can be correct during flush where HAL
+ // has to return capture result before a buffer is requested
if (bSrc.bufferId == HalInterface::BUFFER_ID_NO_BUFFER) {
- ALOGE("%s: Frame %d: Buffer %zu: No bufferId for stream %d",
- __FUNCTION__, result.frameNumber, i, bSrc.streamId);
- return;
+ if (bSrc.status == BufferStatus::OK) {
+ ALOGE("%s: Frame %d: Buffer %zu: No bufferId for stream %d",
+ __FUNCTION__, result.frameNumber, i, bSrc.streamId);
+ // Still proceeds so other buffers can be returned
+ }
+ noBufferReturned = true;
}
- res = mInterface->popInflightRequestBuffer(bSrc.bufferId, &buffer);
+ if (noBufferReturned) {
+ res = OK;
+ } else {
+ res = mInterface->popInflightRequestBuffer(bSrc.bufferId, &buffer);
+ }
} else {
res = mInterface->popInflightBuffer(result.frameNumber, bSrc.streamId, &buffer);
}
@@ -1354,6 +1364,9 @@
if (bSrc.releaseFence == nullptr) {
bDst.release_fence = -1;
} else if (bSrc.releaseFence->numFds == 1) {
+ if (noBufferReturned) {
+ ALOGE("%s: got releaseFence without output buffer!", __FUNCTION__);
+ }
bDst.release_fence = dup(bSrc.releaseFence->data[0]);
} else {
ALOGE("%s: Frame %d: Invalid release fence for buffer %zu, fd count is %d, not 1",
@@ -3090,6 +3103,16 @@
for (size_t i = 0; i < numBuffers; i++)
{
+ if (outputBuffers[i].buffer == nullptr) {
+ if (!mUseHalBufManager) {
+ // With HAL buffer management API, HAL sometimes will have to return buffers that
+ // has not got a output buffer handle filled yet. This is though illegal if HAL
+ // buffer management API is not being used.
+ ALOGE("%s: cannot return a null buffer!", __FUNCTION__);
+ }
+ continue;
+ }
+
Camera3StreamInterface *stream = Camera3Stream::cast(outputBuffers[i].stream);
int streamId = stream->getId();
const auto& it = outputSurfaces.find(streamId);
@@ -3847,9 +3870,11 @@
Camera3Device::HalInterface::HalInterface(
sp<ICameraDeviceSession> &session,
- std::shared_ptr<RequestMetadataQueue> queue) :
+ std::shared_ptr<RequestMetadataQueue> queue,
+ bool useHalBufManager) :
mHidlSession(session),
- mRequestMetadataQueue(queue) {
+ mRequestMetadataQueue(queue),
+ mUseHalBufManager(useHalBufManager) {
// Check with hardware service manager if we can downcast these interfaces
// Somewhat expensive, so cache the results at startup
auto castResult_3_5 = device::V3_5::ICameraDeviceSession::castFrom(mHidlSession);
@@ -3866,17 +3891,19 @@
}
}
-Camera3Device::HalInterface::HalInterface() {}
+Camera3Device::HalInterface::HalInterface() : mUseHalBufManager(false) {}
Camera3Device::HalInterface::HalInterface(const HalInterface& other) :
mHidlSession(other.mHidlSession),
- mRequestMetadataQueue(other.mRequestMetadataQueue) {}
+ mRequestMetadataQueue(other.mRequestMetadataQueue),
+ mUseHalBufManager(other.mUseHalBufManager) {}
bool Camera3Device::HalInterface::valid() {
return (mHidlSession != nullptr);
}
void Camera3Device::HalInterface::clear() {
+ mHidlSession_3_5.clear();
mHidlSession_3_4.clear();
mHidlSession_3_3.clear();
mHidlSession.clear();
@@ -4186,14 +4213,14 @@
return res;
}
-void Camera3Device::HalInterface::wrapAsHidlRequest(camera3_capture_request_t* request,
+status_t Camera3Device::HalInterface::wrapAsHidlRequest(camera3_capture_request_t* request,
/*out*/device::V3_2::CaptureRequest* captureRequest,
/*out*/std::vector<native_handle_t*>* handlesCreated) {
ATRACE_CALL();
if (captureRequest == nullptr || handlesCreated == nullptr) {
ALOGE("%s: captureRequest (%p) and handlesCreated (%p) must not be null",
__FUNCTION__, captureRequest, handlesCreated);
- return;
+ return BAD_VALUE;
}
captureRequest->frameNumber = request->frame_number;
@@ -4234,26 +4261,37 @@
const camera3_stream_buffer_t *src = request->output_buffers + i;
StreamBuffer &dst = captureRequest->outputBuffers[i];
int32_t streamId = Camera3Stream::cast(src->stream)->getId();
- buffer_handle_t buf = *(src->buffer);
- auto pair = getBufferId(buf, streamId);
- bool isNewBuffer = pair.first;
- dst.streamId = streamId;
- dst.bufferId = pair.second;
- dst.buffer = isNewBuffer ? buf : nullptr;
- dst.status = BufferStatus::OK;
- native_handle_t *acquireFence = nullptr;
- if (src->acquire_fence != -1) {
- acquireFence = native_handle_create(1,0);
- acquireFence->data[0] = src->acquire_fence;
- handlesCreated->push_back(acquireFence);
+ if (src->buffer != nullptr) {
+ buffer_handle_t buf = *(src->buffer);
+ auto pair = getBufferId(buf, streamId);
+ bool isNewBuffer = pair.first;
+ dst.bufferId = pair.second;
+ dst.buffer = isNewBuffer ? buf : nullptr;
+ native_handle_t *acquireFence = nullptr;
+ if (src->acquire_fence != -1) {
+ acquireFence = native_handle_create(1,0);
+ acquireFence->data[0] = src->acquire_fence;
+ handlesCreated->push_back(acquireFence);
+ }
+ dst.acquireFence = acquireFence;
+ } else if (mUseHalBufManager) {
+ // HAL buffer management path
+ dst.bufferId = BUFFER_ID_NO_BUFFER;
+ dst.buffer = nullptr;
+ dst.acquireFence = nullptr;
+ } else {
+ ALOGE("%s: cannot send a null buffer in capture request!", __FUNCTION__);
+ return BAD_VALUE;
}
- dst.acquireFence = acquireFence;
+ dst.streamId = streamId;
+ dst.status = BufferStatus::OK;
dst.releaseFence = nullptr;
pushInflightBufferLocked(captureRequest->frameNumber, streamId,
src->buffer, src->acquire_fence);
}
}
+ return OK;
}
status_t Camera3Device::HalInterface::processBatchCaptureRequests(
@@ -4277,12 +4315,17 @@
}
std::vector<native_handle_t*> handlesCreated;
+ status_t res = OK;
for (size_t i = 0; i < batchSize; i++) {
if (hidlSession_3_4 != nullptr) {
- wrapAsHidlRequest(requests[i], /*out*/&captureRequests_3_4[i].v3_2,
+ res = wrapAsHidlRequest(requests[i], /*out*/&captureRequests_3_4[i].v3_2,
/*out*/&handlesCreated);
} else {
- wrapAsHidlRequest(requests[i], /*out*/&captureRequests[i], /*out*/&handlesCreated);
+ res = wrapAsHidlRequest(requests[i],
+ /*out*/&captureRequests[i], /*out*/&handlesCreated);
+ }
+ if (res != OK) {
+ return res;
}
}
@@ -5401,6 +5444,10 @@
}
if (mUseHalBufManager) {
+ if (outputStream->isAbandoned()) {
+ ALOGE("%s: stream %d is abandoned.", __FUNCTION__, streamId);
+ return TIMED_OUT;
+ }
// HAL will request buffer through requestStreamBuffer API
camera3_stream_buffer_t& buffer = outputBuffers->editItemAt(j);
buffer.stream = outputStream->asHalStream();
@@ -6328,8 +6375,9 @@
bool Camera3Device::RequestBufferStateMachine::startRequestBuffer() {
std::lock_guard<std::mutex> lock(mLock);
- if (mStatus == RB_STATUS_READY) {
+ if (mStatus == RB_STATUS_READY || mStatus == RB_STATUS_PENDING_STOP) {
mRequestBufferOngoing = true;
+ notifyTrackerLocked(/*active*/true);
return true;
}
return false;
@@ -6345,15 +6393,12 @@
if (mStatus == RB_STATUS_PENDING_STOP) {
checkSwitchToStopLocked();
}
+ notifyTrackerLocked(/*active*/false);
}
void Camera3Device::RequestBufferStateMachine::onStreamsConfigured() {
std::lock_guard<std::mutex> lock(mLock);
- RequestBufferState oldStatus = mStatus;
mStatus = RB_STATUS_READY;
- if (oldStatus != RB_STATUS_READY) {
- notifyTrackerLocked(/*active*/true);
- }
return;
}
@@ -6363,7 +6408,6 @@
mInflightMapEmpty = false;
if (mStatus == RB_STATUS_STOPPED) {
mStatus = RB_STATUS_READY;
- notifyTrackerLocked(/*active*/true);
}
return;
}
@@ -6408,7 +6452,6 @@
bool Camera3Device::RequestBufferStateMachine::checkSwitchToStopLocked() {
if (mInflightMapEmpty && mRequestThreadPaused && !mRequestBufferOngoing) {
mStatus = RB_STATUS_STOPPED;
- notifyTrackerLocked(/*active*/false);
return true;
}
return false;
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index c11a6f8..e5a38bb 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -278,7 +278,8 @@
class HalInterface : public camera3::Camera3StreamBufferFreedListener {
public:
HalInterface(sp<hardware::camera::device::V3_2::ICameraDeviceSession> &session,
- std::shared_ptr<RequestMetadataQueue> queue);
+ std::shared_ptr<RequestMetadataQueue> queue,
+ bool useHalBufManager);
HalInterface(const HalInterface &other);
HalInterface();
@@ -344,7 +345,7 @@
// The output HIDL request still depends on input camera3_capture_request_t
// Do not free input camera3_capture_request_t before output HIDL request
- void wrapAsHidlRequest(camera3_capture_request_t* in,
+ status_t wrapAsHidlRequest(camera3_capture_request_t* in,
/*out*/hardware::camera::device::V3_2::CaptureRequest* out,
/*out*/std::vector<native_handle_t*>* handlesCreated);
@@ -398,6 +399,8 @@
std::unordered_map<uint64_t, buffer_handle_t*> mRequestedBuffers;
uint32_t mNextStreamConfigCounter = 1;
+
+ const bool mUseHalBufManager;
};
sp<HalInterface> mInterface;
diff --git a/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp b/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp
index 2b5debf..84c2ec7 100644
--- a/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp
+++ b/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp
@@ -257,6 +257,10 @@
// Add new entry into mOutputs
mOutputs[surfaceId] = gbp;
mConsumerBufferCount[surfaceId] = maxConsumerBuffers;
+ if (mConsumerBufferCount[surfaceId] > mMaxHalBuffers) {
+ SP_LOGW("%s: Consumer buffer count %zu larger than max. Hal buffers: %zu", __FUNCTION__,
+ mConsumerBufferCount[surfaceId], mMaxHalBuffers);
+ }
mNotifiers[gbp] = listener;
mOutputSlots[gbp] = std::make_unique<OutputSlots>(totalBufferCount);
@@ -328,11 +332,7 @@
}
mNotifiers[gbp] = nullptr;
- if (mConsumerBufferCount[surfaceId] < mMaxHalBuffers) {
- mMaxConsumerBuffers -= mConsumerBufferCount[surfaceId];
- } else {
- SP_LOGE("%s: Cached consumer buffer count mismatch!", __FUNCTION__);
- }
+ mMaxConsumerBuffers -= mConsumerBufferCount[surfaceId];
mConsumerBufferCount[surfaceId] = 0;
return res;
diff --git a/services/camera/libcameraservice/hidl/Convert.cpp b/services/camera/libcameraservice/hidl/Convert.cpp
index 22e879e..76ed6f6 100644
--- a/services/camera/libcameraservice/hidl/Convert.cpp
+++ b/services/camera/libcameraservice/hidl/Convert.cpp
@@ -16,7 +16,8 @@
#include <hidl/Convert.h>
#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
-#include <NdkImageReaderPriv.h>
+#include <cutils/native_handle.h>
+#include <mediautils/AImageReaderUtils.h>
namespace android {
namespace hardware {
@@ -25,6 +26,7 @@
namespace conversion {
using hardware::graphics::bufferqueue::V1_0::utils::H2BGraphicBufferProducer;
+using aimg::AImageReader_getHGBPFromHandle;
// Note: existing data in dst will be gone. Caller still owns the memory of src
void convertToHidl(const camera_metadata_t *src, HCameraMetadata* dst) {
@@ -132,6 +134,7 @@
HCaptureResultExtras convertToHidl(const CaptureResultExtras &captureResultExtras) {
HCaptureResultExtras hCaptureResultExtras;
+ hCaptureResultExtras.requestId = captureResultExtras.requestId;
hCaptureResultExtras.burstId = captureResultExtras.burstId;
hCaptureResultExtras.frameNumber = captureResultExtras.frameNumber;
hCaptureResultExtras.partialResultCount = captureResultExtras.partialResultCount;
diff --git a/services/camera/libcameraservice/hidl/HidlCameraService.cpp b/services/camera/libcameraservice/hidl/HidlCameraService.cpp
index 31bdf6d..48f1d37 100644
--- a/services/camera/libcameraservice/hidl/HidlCameraService.cpp
+++ b/services/camera/libcameraservice/hidl/HidlCameraService.cpp
@@ -40,9 +40,11 @@
using device::V2_0::implementation::H2BCameraDeviceCallbacks;
using device::V2_0::implementation::HidlCameraDeviceUser;
using service::V2_0::implementation::H2BCameraServiceListener;
-using HCameraMetadataType = android::frameworks::cameraservice::common::V2_0::CameraMetadataType;
-using HVendorTag = android::frameworks::cameraservice::common::V2_0::VendorTag;
-using HVendorTagSection = android::frameworks::cameraservice::common::V2_0::VendorTagSection;
+using HCameraMetadataType = frameworks::cameraservice::common::V2_0::CameraMetadataType;
+using HVendorTag = frameworks::cameraservice::common::V2_0::VendorTag;
+using HVendorTagSection = frameworks::cameraservice::common::V2_0::VendorTagSection;
+using HProviderIdAndVendorTagSections =
+ frameworks::cameraservice::common::V2_0::ProviderIdAndVendorTagSections;
sp<HidlCameraService> gHidlCameraService;
@@ -215,39 +217,50 @@
}
Return<void> HidlCameraService::getCameraVendorTagSections(getCameraVendorTagSections_cb _hidl_cb) {
- hidl_vec<HVendorTagSection> hVendorTagSections;
- // TODO: Could this be just created on the stack since we don't set it to
- // global cache or anything ?
- HStatus hStatus = HStatus::NO_ERROR;
- sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
- binder::Status serviceRet = mAidlICameraService->getCameraVendorTagDescriptor(desc.get());
-
- if (!serviceRet.isOk()) {
- ALOGE("%s: Failed to get VendorTagDescriptor", __FUNCTION__);
- _hidl_cb(B2HStatus(serviceRet), hVendorTagSections);
+ sp<VendorTagDescriptorCache> gCache = VendorTagDescriptorCache::getGlobalVendorTagCache();
+ if (gCache == nullptr) {
+ _hidl_cb(HStatus::UNKNOWN_ERROR, {});
+ return Void();
+ }
+ const std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>>
+ &vendorIdsAndTagDescs = gCache->getVendorIdsAndTagDescriptors();
+ if (vendorIdsAndTagDescs.size() == 0) {
+ _hidl_cb(HStatus::UNKNOWN_ERROR, {});
return Void();
}
- const SortedVector<String8>* sectionNames = desc->getAllSectionNames();
- size_t numSections = sectionNames->size();
- std::vector<std::vector<HVendorTag>> tagsBySection(numSections);
- int tagCount = desc->getTagCount();
- std::vector<uint32_t> tags(tagCount);
- desc->getTagArray(tags.data());
- for (int i = 0; i < tagCount; i++) {
- HVendorTag vt;
- vt.tagId = tags[i];
- vt.tagName = desc->getTagName(tags[i]);
- vt.tagType = (HCameraMetadataType) desc->getTagType(tags[i]);
- ssize_t sectionIdx = desc->getSectionIndex(tags[i]);
- tagsBySection[sectionIdx].push_back(vt);
+ hidl_vec<HProviderIdAndVendorTagSections> hTagIdsAndVendorTagSections;
+ hTagIdsAndVendorTagSections.resize(vendorIdsAndTagDescs.size());
+ size_t j = 0;
+ for (auto &vendorIdAndTagDescs : vendorIdsAndTagDescs) {
+ hidl_vec<HVendorTagSection> hVendorTagSections;
+ sp<VendorTagDescriptor> desc = vendorIdAndTagDescs.second;
+ const SortedVector<String8>* sectionNames = desc->getAllSectionNames();
+ size_t numSections = sectionNames->size();
+ std::vector<std::vector<HVendorTag>> tagsBySection(numSections);
+ int tagCount = desc->getTagCount();
+ std::vector<uint32_t> tags(tagCount);
+ desc->getTagArray(tags.data());
+ for (int i = 0; i < tagCount; i++) {
+ HVendorTag vt;
+ vt.tagId = tags[i];
+ vt.tagName = desc->getTagName(tags[i]);
+ vt.tagType = (HCameraMetadataType) desc->getTagType(tags[i]);
+ ssize_t sectionIdx = desc->getSectionIndex(tags[i]);
+ tagsBySection[sectionIdx].push_back(vt);
+ }
+ hVendorTagSections.resize(numSections);
+ for (size_t s = 0; s < numSections; s++) {
+ hVendorTagSections[s].sectionName = (*sectionNames)[s].string();
+ hVendorTagSections[s].tags = tagsBySection[s];
+ }
+ HProviderIdAndVendorTagSections &hProviderIdAndVendorTagSections =
+ hTagIdsAndVendorTagSections[j];
+ hProviderIdAndVendorTagSections.providerId = vendorIdAndTagDescs.first;
+ hProviderIdAndVendorTagSections.vendorTagSections = std::move(hVendorTagSections);
+ j++;
}
- hVendorTagSections.resize(numSections);
- for (size_t s = 0; s < numSections; s++) {
- hVendorTagSections[s].sectionName = (*sectionNames)[s].string();
- hVendorTagSections[s].tags = tagsBySection[s];
- }
- _hidl_cb(hStatus, hVendorTagSections);
+ _hidl_cb(HStatus::NO_ERROR, hTagIdsAndVendorTagSections);
return Void();
}
diff --git a/services/soundtrigger/Android.bp b/services/soundtrigger/Android.bp
new file mode 100644
index 0000000..1f2283a
--- /dev/null
+++ b/services/soundtrigger/Android.bp
@@ -0,0 +1,54 @@
+// Copyright 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+cc_library_shared {
+ name: "libsoundtriggerservice",
+
+ srcs: [
+ "SoundTriggerHwService.cpp",
+ "SoundTriggerHalHidl.cpp",
+ ],
+
+ shared_libs: [
+ "liblog",
+ "libutils",
+ "libbinder",
+ "libcutils",
+ "libhardware",
+ "libsoundtrigger",
+ "libaudioclient",
+ "libmediautils",
+
+ "libhwbinder",
+ "libhidlbase",
+ "libhidlmemory",
+ "libhidltransport",
+ "libbase",
+ "libaudiohal",
+ "libaudiohal_deathhandler",
+ "android.hardware.soundtrigger@2.0",
+ "android.hardware.soundtrigger@2.1",
+ "android.hardware.soundtrigger@2.2",
+ "android.hardware.audio.common@2.0",
+ "android.hidl.allocator@1.0",
+ "android.hidl.memory@1.0",
+ ],
+
+ include_dirs: ["frameworks/av/services/audioflinger"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+}
diff --git a/services/soundtrigger/Android.mk b/services/soundtrigger/Android.mk
deleted file mode 100644
index 65f1a44..0000000
--- a/services/soundtrigger/Android.mk
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 2014 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-ifeq ($(SOUND_TRIGGER_USE_STUB_MODULE), 1)
- ifneq ($(USE_LEGACY_LOCAL_AUDIO_HAL), true)
- $(error Requires building with USE_LEGACY_LOCAL_AUDIO_HAL=true)
- endif
- LOCAL_CFLAGS += -DSOUND_TRIGGER_USE_STUB_MODULE
-endif
-
-LOCAL_SRC_FILES:= \
- SoundTriggerHwService.cpp
-
-LOCAL_SHARED_LIBRARIES:= \
- liblog \
- libutils \
- libbinder \
- libcutils \
- libhardware \
- libsoundtrigger \
- libaudioclient \
- libmediautils \
-
-ifeq ($(USE_LEGACY_LOCAL_AUDIO_HAL),true)
-# libhardware configuration
-LOCAL_SRC_FILES += \
- SoundTriggerHalLegacy.cpp
-else
-# Treble configuration
-LOCAL_SRC_FILES += \
- SoundTriggerHalHidl.cpp
-
-LOCAL_SHARED_LIBRARIES += \
- libhwbinder \
- libhidlbase \
- libhidlmemory \
- libhidltransport \
- libbase \
- libaudiohal \
- libaudiohal_deathhandler \
- android.hardware.soundtrigger@2.0 \
- android.hardware.soundtrigger@2.1 \
- android.hardware.soundtrigger@2.2 \
- android.hardware.audio.common@2.0 \
- android.hidl.allocator@1.0 \
- android.hidl.memory@1.0
-endif
-
-
-LOCAL_C_INCLUDES += \
- frameworks/av/services/audioflinger
-
-LOCAL_MULTILIB := $(AUDIOSERVER_MULTILIB)
-
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_MODULE:= libsoundtriggerservice
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/services/soundtrigger/SoundTriggerHalLegacy.cpp b/services/soundtrigger/SoundTriggerHalLegacy.cpp
deleted file mode 100644
index 2b78818..0000000
--- a/services/soundtrigger/SoundTriggerHalLegacy.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <utils/Log.h>
-#include "SoundTriggerHalLegacy.h"
-
-namespace android {
-
-/* static */
-sp<SoundTriggerHalInterface> SoundTriggerHalInterface::connectModule(const char *moduleName)
-{
- return new SoundTriggerHalLegacy(moduleName);
-}
-
-SoundTriggerHalLegacy::SoundTriggerHalLegacy(const char *moduleName)
- : mModuleName(moduleName), mHwDevice(NULL)
-{
-}
-
-void SoundTriggerHalLegacy::onFirstRef()
-{
- const hw_module_t *mod;
- int rc;
-
- if (mModuleName == NULL) {
- mModuleName = "primary";
- }
-
- rc = hw_get_module_by_class(SOUND_TRIGGER_HARDWARE_MODULE_ID, mModuleName, &mod);
- if (rc != 0) {
- ALOGE("couldn't load sound trigger module %s.%s (%s)",
- SOUND_TRIGGER_HARDWARE_MODULE_ID, mModuleName, strerror(-rc));
- return;
- }
- rc = sound_trigger_hw_device_open(mod, &mHwDevice);
- if (rc != 0) {
- ALOGE("couldn't open sound trigger hw device in %s.%s (%s)",
- SOUND_TRIGGER_HARDWARE_MODULE_ID, mModuleName, strerror(-rc));
- mHwDevice = NULL;
- return;
- }
- if (mHwDevice->common.version < SOUND_TRIGGER_DEVICE_API_VERSION_1_0 ||
- mHwDevice->common.version > SOUND_TRIGGER_DEVICE_API_VERSION_CURRENT) {
- ALOGE("wrong sound trigger hw device version %04x", mHwDevice->common.version);
- return;
- }
-}
-
-SoundTriggerHalLegacy::~SoundTriggerHalLegacy()
-{
- if (mHwDevice != NULL) {
- sound_trigger_hw_device_close(mHwDevice);
- }
-}
-
-int SoundTriggerHalLegacy::getProperties(struct sound_trigger_properties *properties)
-{
- if (mHwDevice == NULL) {
- return -ENODEV;
- }
- return mHwDevice->get_properties(mHwDevice, properties);
-}
-
-int SoundTriggerHalLegacy::loadSoundModel(struct sound_trigger_sound_model *sound_model,
- sound_model_callback_t callback,
- void *cookie,
- sound_model_handle_t *handle)
-{
- if (mHwDevice == NULL) {
- return -ENODEV;
- }
- return mHwDevice->load_sound_model(mHwDevice, sound_model, callback, cookie, handle);
-}
-
-int SoundTriggerHalLegacy::unloadSoundModel(sound_model_handle_t handle)
-{
- if (mHwDevice == NULL) {
- return -ENODEV;
- }
- return mHwDevice->unload_sound_model(mHwDevice, handle);
-}
-
-int SoundTriggerHalLegacy::startRecognition(sound_model_handle_t handle,
- const struct sound_trigger_recognition_config *config,
- recognition_callback_t callback,
- void *cookie)
-{
- if (mHwDevice == NULL) {
- return -ENODEV;
- }
- return mHwDevice->start_recognition(mHwDevice, handle, config, callback, cookie);
-}
-
-int SoundTriggerHalLegacy::stopRecognition(sound_model_handle_t handle)
-{
- if (mHwDevice == NULL) {
- return -ENODEV;
- }
- return mHwDevice->stop_recognition(mHwDevice, handle);
-}
-
-int SoundTriggerHalLegacy::stopAllRecognitions()
-{
- if (mHwDevice == NULL) {
- return -ENODEV;
- }
- if (mHwDevice->common.version >= SOUND_TRIGGER_DEVICE_API_VERSION_1_1 &&
- mHwDevice->stop_all_recognitions) {
- return mHwDevice->stop_all_recognitions(mHwDevice);
- }
- return -ENOSYS;
-}
-
-} // namespace android
diff --git a/services/soundtrigger/SoundTriggerHalLegacy.h b/services/soundtrigger/SoundTriggerHalLegacy.h
deleted file mode 100644
index 52488de..0000000
--- a/services/soundtrigger/SoundTriggerHalLegacy.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_HARDWARE_SOUNDTRIGGER_HAL_LEGACY_H
-#define ANDROID_HARDWARE_SOUNDTRIGGER_HAL_LEGACY_H
-
-#include "SoundTriggerHalInterface.h"
-
-namespace android {
-
-class SoundTriggerHalLegacy : public SoundTriggerHalInterface
-
-{
-public:
- virtual ~SoundTriggerHalLegacy();
-
- virtual int getProperties(struct sound_trigger_properties *properties);
-
- /*
- * Load a sound model. Once loaded, recognition of this model can be started and stopped.
- * Only one active recognition per model at a time. The SoundTrigger service will handle
- * concurrent recognition requests by different users/applications on the same model.
- * The implementation returns a unique handle used by other functions (unload_sound_model(),
- * start_recognition(), etc...
- */
- virtual int loadSoundModel(struct sound_trigger_sound_model *sound_model,
- sound_model_callback_t callback,
- void *cookie,
- sound_model_handle_t *handle);
-
- /*
- * Unload a sound model. A sound model can be unloaded to make room for a new one to overcome
- * implementation limitations.
- */
- virtual int unloadSoundModel(sound_model_handle_t handle);
-
- /* Start recognition on a given model. Only one recognition active at a time per model.
- * Once recognition succeeds of fails, the callback is called.
- * TODO: group recognition configuration parameters into one struct and add key phrase options.
- */
- virtual int startRecognition(sound_model_handle_t handle,
- const struct sound_trigger_recognition_config *config,
- recognition_callback_t callback,
- void *cookie);
-
- /* Stop recognition on a given model.
- * The implementation does not have to call the callback when stopped via this method.
- */
- virtual int stopRecognition(sound_model_handle_t handle);
-
- /* Stop recognition on all models.
- * Only supported for device api versions SOUND_TRIGGER_DEVICE_API_VERSION_1_1 or above.
- * If no implementation is provided, stop_recognition will be called for each running model.
- */
- int stopAllRecognitions();
-
- // RefBase
- virtual void onFirstRef();
-
-private:
-
- friend class SoundTriggerHalInterface;
-
- explicit SoundTriggerHalLegacy(const char *moduleName = NULL);
-
- const char *mModuleName;
- struct sound_trigger_hw_device* mHwDevice;
-};
-
-} // namespace android
-
-#endif // ANDROID_HARDWARE_SOUNDTRIGGER_HAL_LEGACY_H
diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp
index 7915068..944abcc 100644
--- a/services/soundtrigger/SoundTriggerHwService.cpp
+++ b/services/soundtrigger/SoundTriggerHwService.cpp
@@ -36,11 +36,7 @@
#include <system/sound_trigger.h>
#include "SoundTriggerHwService.h"
-#ifdef SOUND_TRIGGER_USE_STUB_MODULE
-#define HW_MODULE_PREFIX "stub"
-#else
#define HW_MODULE_PREFIX "primary"
-#endif
namespace android {
SoundTriggerHwService::SoundTriggerHwService()